From 9a4cd8f2cd76bc0eab7a2e7febe2e6ad67b8c6f1 Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 13:57:44 +0200 Subject: [PATCH 01/12] Updated setup. --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index bdc8676..3704790 100644 --- a/setup.py +++ b/setup.py @@ -17,8 +17,9 @@ def read(fname): author = "Tom De Smedt", url = "http://www.cityinabottle.org/nodebox/", packages = find_packages(), - package_data = {"nodebox.gui": ["theme/*"]}, + package_data = {"nodeboxgl.gui": ["theme/*"], "nodeboxgl.font":["glyph.p"]}, install_requires = ["pyglet",], + py_modules = ["nodeboxgl", "nodeboxgl.graphics", "nodeboxgl.gui", "nodeboxgl.sound", "nodeboxgl.font"], classifiers = [ "Development Status :: 4 - Beta", "Environment :: MacOS X", From bc4650f58a2711d3fb42440b2cf5dd7f7f423c52 Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 14:24:48 +0200 Subject: [PATCH 02/12] Removed sys.path insertion --- examples/01-basics/01-rect.py | 7 ++----- examples/01-basics/02-color.py | 7 ++----- examples/01-basics/03-frame.py | 7 ++----- examples/01-basics/04-mouse.py | 7 ++----- examples/02-transform/01-spiral.py | 7 ++----- examples/02-transform/02-push.py | 7 ++----- examples/03-image/01-image.py | 7 ++----- examples/03-image/02-color.py | 9 +++------ examples/03-image/03-filter.py | 7 ++----- examples/03-image/05-pixels.py | 11 ++++------- examples/03-image/06-noise.py | 7 ++----- examples/04-text/01-text.py | 7 ++----- examples/04-text/02-style.py | 7 ++----- examples/05-path/01-curve.py | 7 ++----- examples/05-path/02-clip.py | 7 ++----- examples/05-path/03-tangent.py | 5 +---- examples/05-path/04-text.py | 5 +---- examples/05-path/05-spider.py | 9 +++------ examples/05-path/06-handle.py | 7 ++----- examples/05-path/07-fit.py | 5 +---- examples/05-path/08-drag.py | 5 +---- examples/06-math/01-attractor.py | 7 ++----- examples/07-filter/01-shadow.py | 7 ++----- examples/07-filter/02-bump.py | 7 ++----- examples/07-filter/03-mirror.py | 7 ++----- examples/07-filter/04-twirl.py | 7 ++----- examples/07-filter/05-render.py | 5 +---- examples/07-filter/06-mask.py | 7 ++----- examples/07-filter/07-blend.py | 7 ++----- examples/07-filter/08-bloom.py | 7 ++----- examples/07-filter/09-buffer.py | 9 +++------ examples/08-physics/01-flock.py | 9 +++------ examples/08-physics/02-spring.py | 9 +++------ examples/08-physics/03-force.py | 9 +++------ examples/08-physics/04-animation.py | 7 ++----- examples/08-physics/05-emitter.py | 9 +++------ examples/08-physics/06-pack.py | 10 ++++------ examples/08-physics/07-graph.py | 7 ++----- examples/09-layer/01-drag.py | 7 ++----- examples/09-layer/02-polygon.py | 5 +---- examples/09-layer/03-tween.py | 5 +---- examples/10-gui/01-slider.py | 11 ++++------- examples/10-gui/02-panel.py | 7 ++----- examples/10-gui/03-button.py | 9 +++------ examples/10-gui/04-knob.py | 9 +++------ examples/10-gui/05-layout.py | 9 +++------ examples/11-sound/01-fft.py | 7 ++----- examples/11-sound/02-in-out.py | 7 ++----- examples/11-sound/03-sequencer.py | 7 ++----- examples/11-sound/04-audiosnails.py | 9 +++------ examples/12-experimental/01-isight.py | 5 +---- examples/12-experimental/02-blend.py | 5 +---- examples/12-experimental/03-movie.py | 6 ++---- examples/12-experimental/04-live1.py | 7 +++---- examples/template.py | 7 ++----- examples/test.py | 5 +---- 56 files changed, 120 insertions(+), 284 deletions(-) diff --git a/examples/01-basics/01-rect.py b/examples/01-basics/01-rect.py index ac70ffa..47ed788 100644 --- a/examples/01-basics/01-rect.py +++ b/examples/01-basics/01-rect.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - # Import the drawing commands from the NodeBox module. -from nodebox.graphics import * +from nodeboxgl.graphics import * # This includes: # - drawing primitives such as line(), rect(), ellipse(), triangle(), # - color commands such as fill(), stroke(), strokewidth(), @@ -33,4 +30,4 @@ def draw(canvas): rect(x=100, y=10, width=300, height=max(100, canvas.mouse.y)) canvas.size = 500, 500 # Set the size of the canvas. -canvas.run(draw) # Register the draw function and start the application. \ No newline at end of file +canvas.run(draw) # Register the draw function and start the application. diff --git a/examples/01-basics/02-color.py b/examples/01-basics/02-color.py index cb25d48..1ea15b6 100644 --- a/examples/01-basics/02-color.py +++ b/examples/01-basics/02-color.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # When you run a script, NodeBox reads the code from top to bottom, like a recipe. # When it encounters coloring or transformation commands, it changes the current state. @@ -57,4 +54,4 @@ def draw(canvas): text("%s,%s"%(x,y), x, y) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/01-basics/03-frame.py b/examples/01-basics/03-frame.py index 025d2dd..9296484 100644 --- a/examples/01-basics/03-frame.py +++ b/examples/01-basics/03-frame.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Here is the "Hypnoval", a classic example in NodeBox for Mac OS X. # It uses the canvas.frame counter to create variation in each frame. @@ -38,4 +35,4 @@ def draw(canvas): canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/01-basics/04-mouse.py b/examples/01-basics/04-mouse.py index 851bc57..62ba10e 100644 --- a/examples/01-basics/04-mouse.py +++ b/examples/01-basics/04-mouse.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # A freehand drawing application! @@ -41,4 +38,4 @@ def draw(canvas): line(m.x, m.y, m.x - m.dx, m.y - m.dy) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/02-transform/01-spiral.py b/examples/02-transform/01-spiral.py index a72794b..69a460b 100644 --- a/examples/02-transform/01-spiral.py +++ b/examples/02-transform/01-spiral.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * def draw(canvas): @@ -50,4 +47,4 @@ def draw(canvas): # has a different effect than scaling / rotating first. canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/02-transform/02-push.py b/examples/02-transform/02-push.py index 38a070a..7a9d3db 100644 --- a/examples/02-transform/02-push.py +++ b/examples/02-transform/02-push.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Often, you may need groups of shapes that you can transform as a whole. # For example: a planet that has moons rotating around it. @@ -39,4 +36,4 @@ def draw(canvas): pop() # Move the origin back to the sun. Undo rotation. canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/03-image/01-image.py b/examples/03-image/01-image.py index dfdecfd..4bef640 100644 --- a/examples/03-image/01-image.py +++ b/examples/03-image/01-image.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # The main purpose of NodeBox for OpenGL is drawing images to the canvas. # Typically, an image can be a JPEG or TIFF file, or a PNG if it uses transparency. @@ -29,4 +26,4 @@ def draw(canvas): image(img, x=-img.width/2, y=-img.height/2) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/03-image/02-color.py b/examples/03-image/02-color.py index 4a2f341..9692792 100644 --- a/examples/03-image/02-color.py +++ b/examples/03-image/02-color.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.geometry import smoothstep +from nodeboxgl.graphics import * +from nodeboxgl.graphics.geometry import smoothstep img = Image("creature.png") @@ -32,4 +29,4 @@ def draw(canvas): # or simply a (R,G,B)-tuple, which is faster because no Color needs to be constructed. canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/03-image/03-filter.py b/examples/03-image/03-filter.py index 8576a58..966235f 100644 --- a/examples/03-image/03-filter.py +++ b/examples/03-image/03-filter.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # This example will make more sense after you've seen the examples in /07-filter @@ -33,4 +30,4 @@ def draw(canvas): dy=canvas.mouse.relative_y)) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/03-image/05-pixels.py b/examples/03-image/05-pixels.py index bb69a46..9b60e05 100644 --- a/examples/03-image/05-pixels.py +++ b/examples/03-image/05-pixels.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # The pixels() command yields a list of pixels from a given image. # Since this is a relatively slow operation, this is not useful for dynamic image processing, @@ -25,8 +22,8 @@ def draw(canvas): # Here we simply use pixels from the image as a color palette. for i in range(15): - x = random(p.width) - y = random(p.height) + x = int(random(p.width)) + y = int(random(p.height)) clr = p.get(x, y) clr.alpha *= 0.5 fill(clr) @@ -36,4 +33,4 @@ def draw(canvas): ellipse(random(canvas.width), random(canvas.height), r*2, r*2) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/03-image/06-noise.py b/examples/03-image/06-noise.py index 75dbd13..92daaa9 100644 --- a/examples/03-image/06-noise.py +++ b/examples/03-image/06-noise.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Create a pixels array from a solid white image: p = Pixels(solid(200, 200, Color(1))) @@ -33,4 +30,4 @@ def draw(canvas): image(p, 150, 150) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/04-text/01-text.py b/examples/04-text/01-text.py index 906f91f..0add550 100644 --- a/examples/04-text/01-text.py +++ b/examples/04-text/01-text.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # In the classic NodeBox for Mac OS X, text can easily be drawn with text(), font(), fontsize(). # This is possible here as well, but it is much faster to prepare the text beforehand: @@ -28,4 +25,4 @@ def draw(canvas): text(txt, x, y) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/04-text/02-style.py b/examples/04-text/02-style.py index 38b5ce6..dfb8d69 100644 --- a/examples/04-text/02-style.py +++ b/examples/04-text/02-style.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * txt = Text("So long!\nThanks for all the fish.", font = "Droid Serif", @@ -23,4 +20,4 @@ def draw(canvas): text(txt, x, y) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/05-path/01-curve.py b/examples/05-path/01-curve.py index e356c4d..b33de1c 100644 --- a/examples/05-path/01-curve.py +++ b/examples/05-path/01-curve.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # The BezierPath object handles complex vector shapes made up of curves and lines. # As with images and text, it is a good idea to create the path once, outside the draw loop. @@ -45,4 +42,4 @@ def draw(canvas): drawpath(leaf) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/05-path/02-clip.py b/examples/05-path/02-clip.py index ecf67b4..40a5c44 100644 --- a/examples/05-path/02-clip.py +++ b/examples/05-path/02-clip.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Here, the leaf shape from the previous example is reused, # but instead of simply coloring it with blue, we give it a nice gradient touch. @@ -38,4 +35,4 @@ def draw(canvas): drawpath(leaf, stroke=(0,0,0,0.25), strokewidth=1, fill=None) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/05-path/03-tangent.py b/examples/05-path/03-tangent.py index 929edb7..e7c52d7 100644 --- a/examples/05-path/03-tangent.py +++ b/examples/05-path/03-tangent.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # The classic NodeBox for Mac OS X has interesting path mathematics functionality. # This functionality is also present in NodeBox for OpenGL. diff --git a/examples/05-path/04-text.py b/examples/05-path/04-text.py index ed5d93f..423641c 100644 --- a/examples/05-path/04-text.py +++ b/examples/05-path/04-text.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # The classic NodeBox for Mac OS X has an interesting textpath() function # that transforms a string into a BezierPath. diff --git a/examples/05-path/05-spider.py b/examples/05-path/05-spider.py index a1d7f35..f64590e 100644 --- a/examples/05-path/05-spider.py +++ b/examples/05-path/05-spider.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.geometry import distance +from nodeboxgl.graphics import * +from nodeboxgl.graphics.geometry import distance from math import sqrt def spider(string, x=0, y=0, radius=25, **kwargs): @@ -53,4 +50,4 @@ def draw(canvas): image(img) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/05-path/06-handle.py b/examples/05-path/06-handle.py index 1d4293e..6c8ac91 100644 --- a/examples/05-path/06-handle.py +++ b/examples/05-path/06-handle.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # I always seem to forget how Bezier handles work. # This example clarifies which handles control what part of a curve. @@ -57,4 +54,4 @@ def draw(canvas): text("ptx.ctrtl2", x=pt.ctrl2.x, y=pt.ctrl2.y+5) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/05-path/07-fit.py b/examples/05-path/07-fit.py index b666879..467fe41 100644 --- a/examples/05-path/07-fit.py +++ b/examples/05-path/07-fit.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0,os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # This example demonstrated how to fit text to a path using the directed() command # (thanks to Karsten Wolf). diff --git a/examples/05-path/08-drag.py b/examples/05-path/08-drag.py index c1be0b2..de0933c 100644 --- a/examples/05-path/08-drag.py +++ b/examples/05-path/08-drag.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys;sys.path.insert(0,os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # A classic NodeBox example (http://nodebox.net/code/index.php/Dendrite). # It registers the dragged mouse movements, diff --git a/examples/06-math/01-attractor.py b/examples/06-math/01-attractor.py index 4252b53..d22ef2f 100644 --- a/examples/06-math/01-attractor.py +++ b/examples/06-math/01-attractor.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * from math import sin, cos # The Peter De Jong attractor feeds its previous value back into the equation, @@ -51,4 +48,4 @@ def draw(canvas): pass canvas.size = 700, 700 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/07-filter/01-shadow.py b/examples/07-filter/01-shadow.py index 657d17d..08c2f3b 100644 --- a/examples/07-filter/01-shadow.py +++ b/examples/07-filter/01-shadow.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Load an image from file. # For performance, it's a good idea to create images once, outside the draw() loop. @@ -37,4 +34,4 @@ def draw(canvas): # Start the application: canvas.fps = 60 canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/07-filter/02-bump.py b/examples/07-filter/02-bump.py index dd8b769..7bd52b3 100644 --- a/examples/07-filter/02-bump.py +++ b/examples/07-filter/02-bump.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * img = Image("creature.png") @@ -28,4 +25,4 @@ def draw(canvas): # Start the application: canvas.fps = 60 canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/07-filter/03-mirror.py b/examples/07-filter/03-mirror.py index c5d63bf..5d162d9 100644 --- a/examples/07-filter/03-mirror.py +++ b/examples/07-filter/03-mirror.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * img = Image("dendrite.png") @@ -30,4 +27,4 @@ def draw(canvas): # Open a window that is as big as the image. canvas.fps = 60 canvas.size = img.width, img.height -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/07-filter/04-twirl.py b/examples/07-filter/04-twirl.py index 340742f..bad481c 100644 --- a/examples/07-filter/04-twirl.py +++ b/examples/07-filter/04-twirl.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * img = Image("creature.png") @@ -28,4 +25,4 @@ def draw(canvas): # Start the application: canvas.fps = 60 canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/07-filter/05-render.py b/examples/07-filter/05-render.py index 1d9173d..395e760 100644 --- a/examples/07-filter/05-render.py +++ b/examples/07-filter/05-render.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # The render() command executes a function with drawing commands # in an offscreen (i.e. hidden) canvas and returns an Image object. diff --git a/examples/07-filter/06-mask.py b/examples/07-filter/06-mask.py index ea22c93..a51e728 100644 --- a/examples/07-filter/06-mask.py +++ b/examples/07-filter/06-mask.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Render a radial gradient image. # Without additional parameters, the gradient will be grayscale. @@ -38,4 +35,4 @@ def draw(canvas): # Start the application: canvas.fps = 5 # Slow framerate so we can observe what is happening. canvas.size = 500, 500 # This is a bad idea since keyboard events -canvas.run(draw) # are now logged very slowly. \ No newline at end of file +canvas.run(draw) # are now logged very slowly. diff --git a/examples/07-filter/07-blend.py b/examples/07-filter/07-blend.py index 27d81b6..1385644 100644 --- a/examples/07-filter/07-blend.py +++ b/examples/07-filter/07-blend.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Blend modes are used to combine the pixels of two images, # in different ways than standard transparency. @@ -36,4 +33,4 @@ def draw(canvas): # Start the application: canvas.fps = 30 canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/07-filter/08-bloom.py b/examples/07-filter/08-bloom.py index 59f04f1..b48f1b9 100644 --- a/examples/07-filter/08-bloom.py +++ b/examples/07-filter/08-bloom.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * img = Image("dendrite.png") @@ -17,4 +14,4 @@ def draw(canvas): # Start the application: canvas.fps = 30 canvas.size = 700, 350 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/07-filter/09-buffer.py b/examples/07-filter/09-buffer.py index 7a047a5..45d6d5f 100644 --- a/examples/07-filter/09-buffer.py +++ b/examples/07-filter/09-buffer.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.geometry import coordinates +from nodeboxgl.graphics import * +from nodeboxgl.graphics.geometry import coordinates from time import time flower = Image("cell.png") @@ -144,4 +141,4 @@ def draw(canvas): canvas.fps = 20 canvas.size = 800, 600 canvas.fullscreen = True -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/08-physics/01-flock.py b/examples/08-physics/01-flock.py index 908df95..ceac470 100644 --- a/examples/08-physics/01-flock.py +++ b/examples/08-physics/01-flock.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.physics import Vector, Boid, Flock, Obstacle +from nodeboxgl.graphics import * +from nodeboxgl.graphics.physics import Vector, Boid, Flock, Obstacle # Flocking can be used to simulate birds, herds, or school of fish. # Each "boid" in the flock adheres to a simple set of rules: @@ -77,4 +74,4 @@ def draw(canvas): canvas.fps = 30 canvas.size = 600, 600 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/08-physics/02-spring.py b/examples/08-physics/02-spring.py index a7cc8ca..3fbe126 100644 --- a/examples/08-physics/02-spring.py +++ b/examples/08-physics/02-spring.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.physics import Particle, Spring, System +from nodeboxgl.graphics import * +from nodeboxgl.graphics.physics import Particle, Spring, System # A "particle system" is used to simulate effects such as explosions, smoke, water, ... # It consists of object with a mass (particles) that are subjected to forces @@ -74,4 +71,4 @@ def draw(canvas): dragged = p canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/08-physics/03-force.py b/examples/08-physics/03-force.py index 3bf1329..7fedb6b 100644 --- a/examples/08-physics/03-force.py +++ b/examples/08-physics/03-force.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.physics import Particle, Force, System +from nodeboxgl.graphics import * +from nodeboxgl.graphics.physics import Particle, Force, System # BANG! @@ -46,4 +43,4 @@ def draw(canvas): # Running physics in real-time takes a lot of processing power. # If you are using physics for game effects (e.g. explosions, spells), # it is a good idea to render them offscreen, store them as an Animation, -# and replay the animation when necessary. \ No newline at end of file +# and replay the animation when necessary. diff --git a/examples/08-physics/04-animation.py b/examples/08-physics/04-animation.py index bc82ccc..26edcb1 100644 --- a/examples/08-physics/04-animation.py +++ b/examples/08-physics/04-animation.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.physics import Particle, Force, System +from nodeboxgl.graphics import * +from nodeboxgl.graphics.physics import Particle, Force, System # This example demonstrates the Animation object, # which can be used to store and replay a sequence of image frames. diff --git a/examples/08-physics/05-emitter.py b/examples/08-physics/05-emitter.py index 5905166..29c6a83 100644 --- a/examples/08-physics/05-emitter.py +++ b/examples/08-physics/05-emitter.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.physics import System, Emitter, Particle, MASS +from nodeboxgl.graphics import * +from nodeboxgl.graphics.physics import System, Emitter, Particle, MASS # 1) An emitter will be firing particles with a constant velocity. # 2) Drag in the system slows down the particles. @@ -50,4 +47,4 @@ def draw(canvas): obstacle.y = canvas.mouse.y canvas.size = 400, 700 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/08-physics/06-pack.py b/examples/08-physics/06-pack.py index 14e5b40..a576a12 100644 --- a/examples/08-physics/06-pack.py +++ b/examples/08-physics/06-pack.py @@ -1,8 +1,6 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.geometry import distance, angle, smoothstep +import os +from nodeboxgl.graphics import * +from nodeboxgl.graphics.geometry import distance, angle, smoothstep # Circle-packing algorithm. # This script was used to produce one of the panels in NANOPHYSICAL: @@ -138,4 +136,4 @@ def draw(canvas): pack(circles, 300, 300, exclude=[dragged]) canvas.size = 600, 600 -canvas.run(draw, setup) \ No newline at end of file +canvas.run(draw, setup) diff --git a/examples/08-physics/07-graph.py b/examples/08-physics/07-graph.py index 73c8592..11440c4 100644 --- a/examples/08-physics/07-graph.py +++ b/examples/08-physics/07-graph.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.physics import Node, Edge, Graph +from nodeboxgl.graphics import * +from nodeboxgl.graphics.physics import Node, Edge, Graph # Create a graph with randomly connected nodes. # Nodes and edges can be styled with fill, stroke, strokewidth parameters. diff --git a/examples/09-layer/01-drag.py b/examples/09-layer/01-drag.py index abd9a05..a2ab1ef 100644 --- a/examples/09-layer/01-drag.py +++ b/examples/09-layer/01-drag.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # In the previous examples, drawing occurs directly to the canvas. # It is also possible to draw into different layers, @@ -88,4 +85,4 @@ def draw(canvas): canvas.run(draw) # Note: if you have layers that do not need to receive events, -# set Layer.enabled = False; this saves some time doing expensive matrix operations. \ No newline at end of file +# set Layer.enabled = False; this saves some time doing expensive matrix operations. diff --git a/examples/09-layer/02-polygon.py b/examples/09-layer/02-polygon.py index 267ff6a..7738870 100644 --- a/examples/09-layer/02-polygon.py +++ b/examples/09-layer/02-polygon.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # Since a layer is a rectangular area, all mouse events are also triggered in a rectangle. # This can be a bit clumsy in some situations. diff --git a/examples/09-layer/03-tween.py b/examples/09-layer/03-tween.py index eeaa2e8..53d5f9d 100644 --- a/examples/09-layer/03-tween.py +++ b/examples/09-layer/03-tween.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # This example demonstrates motion tweening and prototype-based inheritance on layers. diff --git a/examples/10-gui/01-slider.py b/examples/10-gui/01-slider.py index 336d029..bb562ce 100644 --- a/examples/10-gui/01-slider.py +++ b/examples/10-gui/01-slider.py @@ -1,9 +1,6 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.graphics.geometry import coordinates -from nodebox.gui import Slider +from nodeboxgl.graphics import * +from nodeboxgl.graphics.geometry import coordinates +from nodeboxgl.gui import Slider # The nodebox.gui module provides simple visual controls, such as Slider, Button, CheckBox and Field. # Each control inherits from a Control class, which in turn inherits from Layer. @@ -74,4 +71,4 @@ def draw(canvas): snake.draw() canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/10-gui/02-panel.py b/examples/10-gui/02-panel.py index 271d5de..151587f 100644 --- a/examples/10-gui/02-panel.py +++ b/examples/10-gui/02-panel.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.gui import * +from nodeboxgl.graphics import * +from nodeboxgl.gui import * # A panel is a container for other GUI controls. # Controls can be added to the panel, diff --git a/examples/10-gui/03-button.py b/examples/10-gui/03-button.py index e37be63..045eee3 100644 --- a/examples/10-gui/03-button.py +++ b/examples/10-gui/03-button.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.gui import * +from nodeboxgl.graphics import * +from nodeboxgl.gui import * # This is the same example as the previous, but with a button added to the panel. # All controls have a Control.on_action() event that fires when the user @@ -40,4 +37,4 @@ def draw(canvas): text(panel.field_text.value, 50, 250) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/10-gui/04-knob.py b/examples/10-gui/04-knob.py index e34df15..6276be0 100644 --- a/examples/10-gui/04-knob.py +++ b/examples/10-gui/04-knob.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.gui import * +from nodeboxgl.graphics import * +from nodeboxgl.gui import * # This example demonstrates the knob GUI control, # and how different layout managers can be nested. @@ -36,4 +33,4 @@ def draw(canvas): text(panel.field_text.value, 20, 200) canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/10-gui/05-layout.py b/examples/10-gui/05-layout.py index 0f84ad9..58ac9ce 100644 --- a/examples/10-gui/05-layout.py +++ b/examples/10-gui/05-layout.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.gui import * +from nodeboxgl.graphics import * +from nodeboxgl.gui import * # Comparison between Rows and Row containers. # Both are subclasses of Layout. @@ -88,4 +85,4 @@ def draw(canvas): canvas.append(panel4) canvas.append(panel5) canvas.size = 800, 600 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/11-sound/01-fft.py b/examples/11-sound/01-fft.py index 05e9996..a24fe57 100644 --- a/examples/11-sound/01-fft.py +++ b/examples/11-sound/01-fft.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.sound import PD, LOCALHOST +from nodeboxgl.graphics import * +from nodeboxgl.sound import PD, LOCALHOST # PureData is a free, real-time graphical programming environment for audio processing. # You can connect building blocks to manipulate audio input, or generate audio output. diff --git a/examples/11-sound/02-in-out.py b/examples/11-sound/02-in-out.py index 730c597..32eaeda 100644 --- a/examples/11-sound/02-in-out.py +++ b/examples/11-sound/02-in-out.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.sound import PD, LOCALHOST, IN, OUT +from nodeboxgl.graphics import * +from nodeboxgl.sound import PD, LOCALHOST, IN, OUT # This script demonstrates how to simultaneously receive from and send to Pd. # We need two communication ports. By default, NodeBox receives on port 44000 (IN), diff --git a/examples/11-sound/03-sequencer.py b/examples/11-sound/03-sequencer.py index 67d52e6..19bab13 100644 --- a/examples/11-sound/03-sequencer.py +++ b/examples/11-sound/03-sequencer.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.sound import PD +from nodeboxgl.graphics import * +from nodeboxgl.sound import PD from math import sin, pow # An evolutionary melody. diff --git a/examples/11-sound/04-audiosnails.py b/examples/11-sound/04-audiosnails.py index b898a38..f4ed426 100644 --- a/examples/11-sound/04-audiosnails.py +++ b/examples/11-sound/04-audiosnails.py @@ -1,8 +1,5 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * -from nodebox.sound import PD +from nodeboxgl.graphics import * +from nodeboxgl.sound import PD from math import sqrt # SCREECHING AUDIO SNAILS! @@ -118,4 +115,4 @@ def stop(canvas): canvas.fps = 30 canvas.size = 600, 400 -canvas.run(draw, stop=stop) \ No newline at end of file +canvas.run(draw, stop=stop) diff --git a/examples/12-experimental/01-isight.py b/examples/12-experimental/01-isight.py index 79cdad8..ea6ef47 100644 --- a/examples/12-experimental/01-isight.py +++ b/examples/12-experimental/01-isight.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * # On Mac OS X, you can access the built-in iSight camera with PySight + CocoaSequenceGrabber: # http://livingcode.blogspot.com/2005/10/pysight-preview.html (Tim Omernick, Dethe Elza) diff --git a/examples/12-experimental/02-blend.py b/examples/12-experimental/02-blend.py index 224997c..7c4ba72 100644 --- a/examples/12-experimental/02-blend.py +++ b/examples/12-experimental/02-blend.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..", "..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * from pyglet.gl import * from random import seed diff --git a/examples/12-experimental/03-movie.py b/examples/12-experimental/03-movie.py index 9d4cfbd..c9987b7 100644 --- a/examples/12-experimental/03-movie.py +++ b/examples/12-experimental/03-movie.py @@ -1,6 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..", "..")) - +import os import tempfile import subprocess import shutil @@ -60,7 +58,7 @@ def __del__(self): except: pass -from nodebox.graphics import * +from nodeboxgl.graphics import * movie = Movie(canvas) diff --git a/examples/12-experimental/04-live1.py b/examples/12-experimental/04-live1.py index ed68dc3..b8ae453 100644 --- a/examples/12-experimental/04-live1.py +++ b/examples/12-experimental/04-live1.py @@ -1,8 +1,7 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..", "..")) +import os import warnings -from nodebox.graphics import * +from nodeboxgl.graphics import * # Live coding example. # The actual drawing code is in 04-live2.py. @@ -27,4 +26,4 @@ def draw(canvas): canvas.size = 500, 500 canvas.fps = 30 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/template.py b/examples/template.py index 8a81ed2..668ed97 100644 --- a/examples/template.py +++ b/examples/template.py @@ -1,10 +1,7 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * def draw(canvas): canvas.clear() canvas.size = 500, 500 -canvas.run(draw) \ No newline at end of file +canvas.run(draw) diff --git a/examples/test.py b/examples/test.py index c6a0fbb..dd94626 100644 --- a/examples/test.py +++ b/examples/test.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * def draw(canvas): background(1) From d0486f17f2cd52244524783e79834d5469658449 Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 14:25:55 +0200 Subject: [PATCH 03/12] Renamed dir nodebox to nodeboxgl. --- nodeboxgl/__init__.py | 21 + nodeboxgl/ext/__init__.py | 0 nodeboxgl/ext/bezier.c | 167 + nodeboxgl/ext/geometry.c | 191 + nodeboxgl/ext/noise.c | 88 + nodeboxgl/ext/psyco/__init__.py | 54 + nodeboxgl/ext/psyco/classes.py | 42 + nodeboxgl/ext/psyco/core.py | 232 + nodeboxgl/ext/psyco/kdictproxy.py | 133 + nodeboxgl/ext/psyco/logger.py | 96 + nodeboxgl/ext/psyco/profiler.py | 388 + nodeboxgl/ext/psyco/src/COPYING.txt | 9 + nodeboxgl/ext/psyco/src/MANIFEST | 171 + nodeboxgl/ext/psyco/src/README.txt | 77 + nodeboxgl/ext/psyco/src/c/Makefile | 108 + nodeboxgl/ext/psyco/src/c/Modules/parray.c | 515 + nodeboxgl/ext/psyco/src/c/Modules/pmath.c | 200 + nodeboxgl/ext/psyco/src/c/Modules/ppsyco.c | 247 + .../ext/psyco/src/c/Objects/compactobject.c | 1033 + .../ext/psyco/src/c/Objects/compactobject.h | 68 + nodeboxgl/ext/psyco/src/c/Objects/pabstract.c | 1092 + nodeboxgl/ext/psyco/src/c/Objects/pabstract.h | 110 + .../ext/psyco/src/c/Objects/pboolobject.c | 110 + .../ext/psyco/src/c/Objects/pboolobject.h | 56 + .../ext/psyco/src/c/Objects/pclassobject.c | 167 + .../ext/psyco/src/c/Objects/pclassobject.h | 40 + .../ext/psyco/src/c/Objects/pcompactobject.c | 653 + .../ext/psyco/src/c/Objects/pcompactobject.h | 18 + .../ext/psyco/src/c/Objects/pdescrobject.c | 58 + .../ext/psyco/src/c/Objects/pdescrobject.h | 13 + .../ext/psyco/src/c/Objects/pdictobject.c | 55 + .../ext/psyco/src/c/Objects/pdictobject.h | 19 + .../ext/psyco/src/c/Objects/pfloatobject.c | 599 + .../ext/psyco/src/c/Objects/pfloatobject.h | 81 + .../ext/psyco/src/c/Objects/pfuncobject.c | 234 + .../ext/psyco/src/c/Objects/pfuncobject.h | 37 + .../ext/psyco/src/c/Objects/pintobject.c | 539 + .../ext/psyco/src/c/Objects/pintobject.h | 74 + .../ext/psyco/src/c/Objects/piterobject.c | 141 + .../ext/psyco/src/c/Objects/piterobject.h | 41 + .../ext/psyco/src/c/Objects/plistobject.c | 340 + .../ext/psyco/src/c/Objects/plistobject.h | 44 + .../ext/psyco/src/c/Objects/plongobject.c | 96 + .../ext/psyco/src/c/Objects/plongobject.h | 19 + .../ext/psyco/src/c/Objects/pmethodobject.c | 141 + .../ext/psyco/src/c/Objects/pmethodobject.h | 47 + nodeboxgl/ext/psyco/src/c/Objects/pobject.c | 699 + nodeboxgl/ext/psyco/src/c/Objects/pobject.h | 182 + .../ext/psyco/src/c/Objects/prangeobject.c | 231 + .../ext/psyco/src/c/Objects/prangeobject.h | 36 + .../ext/psyco/src/c/Objects/pstringobject.c | 1221 + .../ext/psyco/src/c/Objects/pstringobject.h | 69 + .../ext/psyco/src/c/Objects/pstructmember.c | 166 + .../ext/psyco/src/c/Objects/pstructmember.h | 16 + .../ext/psyco/src/c/Objects/ptupleobject.c | 263 + .../ext/psyco/src/c/Objects/ptupleobject.h | 40 + .../ext/psyco/src/c/Objects/ptypeobject.c | 355 + .../ext/psyco/src/c/Objects/ptypeobject.h | 17 + nodeboxgl/ext/psyco/src/c/Python/frames.c | 736 + nodeboxgl/ext/psyco/src/c/Python/frames.h | 82 + .../ext/psyco/src/c/Python/pbltinmodule.c | 281 + .../ext/psyco/src/c/Python/pbltinmodule.h | 10 + nodeboxgl/ext/psyco/src/c/Python/pycheader.h | 116 + .../ext/psyco/src/c/Python/pycinternal.h | 24 + nodeboxgl/ext/psyco/src/c/Python/pycompiler.c | 3237 + nodeboxgl/ext/psyco/src/c/Python/pycompiler.h | 366 + nodeboxgl/ext/psyco/src/c/Python/pyver.h | 81 + nodeboxgl/ext/psyco/src/c/alarm.c | 280 + nodeboxgl/ext/psyco/src/c/alarm.h | 17 + nodeboxgl/ext/psyco/src/c/blockalloc.h | 118 + nodeboxgl/ext/psyco/src/c/codegen.c | 1200 + nodeboxgl/ext/psyco/src/c/codegen.h | 351 + nodeboxgl/ext/psyco/src/c/codemanager.c | 374 + nodeboxgl/ext/psyco/src/c/codemanager.h | 88 + nodeboxgl/ext/psyco/src/c/cstruct.c | 93 + nodeboxgl/ext/psyco/src/c/cstruct.h | 42 + nodeboxgl/ext/psyco/src/c/depend.py | 44 + nodeboxgl/ext/psyco/src/c/dispatcher.c | 2259 + nodeboxgl/ext/psyco/src/c/dispatcher.h | 284 + nodeboxgl/ext/psyco/src/c/files.py | 166 + nodeboxgl/ext/psyco/src/c/i386/idispatcher.c | 367 + nodeboxgl/ext/psyco/src/c/i386/idispatcher.h | 155 + nodeboxgl/ext/psyco/src/c/i386/iencoding.c | 736 + nodeboxgl/ext/psyco/src/c/i386/iencoding.h | 1120 + nodeboxgl/ext/psyco/src/c/i386/iinitialize.h | 21 + nodeboxgl/ext/psyco/src/c/i386/iprocessor.c | 152 + nodeboxgl/ext/psyco/src/c/i386/ipyencoding.c | 104 + nodeboxgl/ext/psyco/src/c/i386/ipyencoding.h | 318 + nodeboxgl/ext/psyco/src/c/initialize.h | 150 + nodeboxgl/ext/psyco/src/c/ivm/idispatcher.c | 272 + nodeboxgl/ext/psyco/src/c/ivm/idispatcher.h | 121 + nodeboxgl/ext/psyco/src/c/ivm/iencoding.c | 487 + nodeboxgl/ext/psyco/src/c/ivm/iencoding.h | 285 + nodeboxgl/ext/psyco/src/c/ivm/iinitialize.h | 20 + nodeboxgl/ext/psyco/src/c/ivm/iprocessor.c | 476 + nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.c | 20 + nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.h | 117 + nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.c | 20 + nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.h | 111 + nodeboxgl/ext/psyco/src/c/ivm/localsetup.py | 20 + nodeboxgl/ext/psyco/src/c/ivm/prolog/Makefile | 57 + nodeboxgl/ext/psyco/src/c/ivm/prolog/ccode.pl | 274 + .../ext/psyco/src/c/ivm/prolog/detcheck.pl | 37 + .../src/c/ivm/prolog/insns-igen-h.i.default | 89 + .../src/c/ivm/prolog/insns-igen.i.default | 377 + .../src/c/ivm/prolog/insns-switch.i.default | 853 + .../src/c/ivm/prolog/insns-table.py.default | 201 + .../src/c/ivm/prolog/insns-threaded.i.default | 1118 + nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.pl | 111 + nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.py | 88 + .../ext/psyco/src/c/ivm/prolog/insnset.py | 81 + .../src/c/ivm/prolog/mode_combine.pl.default | 12 + .../ext/psyco/src/c/ivm/prolog/optimize.pl | 186 + .../ext/psyco/src/c/ivm/prolog/samelines.py | 38 + nodeboxgl/ext/psyco/src/c/ivm/prolog/utils.pl | 110 + nodeboxgl/ext/psyco/src/c/ivm/prolog/vm.pl | 567 + .../ext/psyco/src/c/ivm/prolog/vmwriter.pl | 241 + nodeboxgl/ext/psyco/src/c/linuxmemchk.c | 102 + nodeboxgl/ext/psyco/src/c/linuxmemchk.h | 17 + nodeboxgl/ext/psyco/src/c/mergepoints.c | 947 + nodeboxgl/ext/psyco/src/c/mergepoints.h | 89 + nodeboxgl/ext/psyco/src/c/mkincl.py | 16 + nodeboxgl/ext/psyco/src/c/mychecker.py | 78 + nodeboxgl/ext/psyco/src/c/platform.c | 66 + nodeboxgl/ext/psyco/src/c/platform.h | 9 + nodeboxgl/ext/psyco/src/c/processor.h | 43 + nodeboxgl/ext/psyco/src/c/profile.c | 673 + nodeboxgl/ext/psyco/src/c/profile.h | 37 + nodeboxgl/ext/psyco/src/c/psyco.c | 1054 + nodeboxgl/ext/psyco/src/c/psyco.h | 302 + nodeboxgl/ext/psyco/src/c/psyfunc.c | 890 + nodeboxgl/ext/psyco/src/c/psyfunc.h | 59 + nodeboxgl/ext/psyco/src/c/pycodegen.h | 68 + nodeboxgl/ext/psyco/src/c/stats.c | 387 + nodeboxgl/ext/psyco/src/c/stats.h | 74 + nodeboxgl/ext/psyco/src/c/timing.h | 32 + nodeboxgl/ext/psyco/src/c/vcompiler.c | 1004 + nodeboxgl/ext/psyco/src/c/vcompiler.h | 760 + nodeboxgl/ext/psyco/src/c/versionchecker.py | 46 + nodeboxgl/ext/psyco/src/c/win32/psyco.vcproj | 313 + nodeboxgl/ext/psyco/src/doc/Makefile | 43 + nodeboxgl/ext/psyco/src/doc/README.txt | 21 + nodeboxgl/ext/psyco/src/doc/psycoguide.tex | 1131 + nodeboxgl/ext/psyco/src/psyco-mactel.diff | 210 + .../ext/psyco/src/py-support/__init__.py | 54 + nodeboxgl/ext/psyco/src/py-support/classes.py | 42 + nodeboxgl/ext/psyco/src/py-support/core.py | 232 + .../ext/psyco/src/py-support/kdictproxy.py | 133 + nodeboxgl/ext/psyco/src/py-support/logger.py | 96 + .../ext/psyco/src/py-support/profiler.py | 388 + nodeboxgl/ext/psyco/src/py-support/support.py | 193 + nodeboxgl/ext/psyco/src/py-utils/cvs.py | 116 + nodeboxgl/ext/psyco/src/py-utils/httpxam.py | 448 + nodeboxgl/ext/psyco/src/py-utils/ivmdump.py | 110 + .../ext/psyco/src/py-utils/ivmextract.py | 73 + .../ext/psyco/src/py-utils/ivmoptimize.py | 61 + nodeboxgl/ext/psyco/src/py-utils/manifest.py | 24 + nodeboxgl/ext/psyco/src/py-utils/symbols.py | 38 + .../ext/psyco/src/py-utils/vinfo_dump.py | 56 + .../ext/psyco/src/py-utils/win32/README.TXT | 16 + nodeboxgl/ext/psyco/src/py-utils/xam.py | 570 + nodeboxgl/ext/psyco/src/py-utils/xamsupport.c | 31 + nodeboxgl/ext/psyco/src/setup.py | 180 + nodeboxgl/ext/psyco/src/test/bpnn.py | 192 + nodeboxgl/ext/psyco/src/test/btrun.py | 778 + .../ext/psyco/src/test/classicregrtest.py | 178 + nodeboxgl/ext/psyco/src/test/file1-basetests | 271 + .../ext/psyco/src/test/file2-basetests.uu | 95 + nodeboxgl/ext/psyco/src/test/fulltester.py | 180 + nodeboxgl/ext/psyco/src/test/life-psyco.py | 236 + nodeboxgl/ext/psyco/src/test/life.py | 226 + nodeboxgl/ext/psyco/src/test/pystone-jit.py | 259 + nodeboxgl/ext/psyco/src/test/pystone.py | 307 + nodeboxgl/ext/psyco/src/test/regrtester.py | 76 + nodeboxgl/ext/psyco/src/test/regrtester2.py | 48 + nodeboxgl/ext/psyco/src/test/test1.py | 211 + nodeboxgl/ext/psyco/src/test/test3.py | 424 + nodeboxgl/ext/psyco/src/test/test5.py | 453 + nodeboxgl/ext/psyco/src/test/test_base.py | 92 + .../ext/psyco/src/test/test_compactobject.py | 280 + nodeboxgl/ext/psyco/src/test/test_misc.py | 102 + nodeboxgl/ext/psyco/support.py | 193 + nodeboxgl/ext/setup.py | 13 + nodeboxgl/font/Droid Sans Mono.ttf | Bin 0 -> 117072 bytes nodeboxgl/font/Droid Sans-Bold.ttf | Bin 0 -> 191032 bytes nodeboxgl/font/Droid Sans.ttf | Bin 0 -> 190044 bytes nodeboxgl/font/Droid Serif-Bold.ttf | Bin 0 -> 184836 bytes nodeboxgl/font/Droid Serif-BoldItalic.ttf | Bin 0 -> 189916 bytes nodeboxgl/font/Droid Serif-Italic.ttf | Bin 0 -> 177176 bytes nodeboxgl/font/Droid Serif-Regular.ttf | Bin 0 -> 172532 bytes nodeboxgl/font/glyph.p | 160310 +++++++++++++++ nodeboxgl/font/glyph.py | 108 + nodeboxgl/graphics/__init__.py | 39 + nodeboxgl/graphics/bezier.py | 531 + nodeboxgl/graphics/context.py | 4134 + nodeboxgl/graphics/geometry.py | 600 + nodeboxgl/graphics/noise.py | 72 + nodeboxgl/graphics/physics.py | 1976 + nodeboxgl/graphics/shader.py | 1515 + nodeboxgl/gui/__init__.py | 1 + nodeboxgl/gui/controls.py | 1222 + nodeboxgl/gui/theme/Droid Sans-Bold.ttf | Bin 0 -> 191032 bytes nodeboxgl/gui/theme/Droid Sans.ttf | Bin 0 -> 190044 bytes nodeboxgl/gui/theme/action-close.png | Bin 0 -> 1287 bytes nodeboxgl/gui/theme/action.png | Bin 0 -> 1020 bytes nodeboxgl/gui/theme/button.png | Bin 0 -> 528 bytes nodeboxgl/gui/theme/field.png | Bin 0 -> 1032 bytes nodeboxgl/gui/theme/flag-checked.png | Bin 0 -> 1107 bytes nodeboxgl/gui/theme/flag.png | Bin 0 -> 504 bytes nodeboxgl/gui/theme/flag.psd | Bin 0 -> 35450 bytes nodeboxgl/gui/theme/knob-socket.png | Bin 0 -> 688 bytes nodeboxgl/gui/theme/knob.png | Bin 0 -> 1683 bytes nodeboxgl/gui/theme/panel.png | Bin 0 -> 1407 bytes nodeboxgl/gui/theme/slider-handle.png | Bin 0 -> 464 bytes nodeboxgl/gui/theme/slider.png | Bin 0 -> 418 bytes nodeboxgl/sound/__init__.py | 1 + nodeboxgl/sound/osc.py | 517 + nodeboxgl/sound/process.py | 291 + 218 files changed, 218983 insertions(+) create mode 100644 nodeboxgl/__init__.py create mode 100644 nodeboxgl/ext/__init__.py create mode 100644 nodeboxgl/ext/bezier.c create mode 100644 nodeboxgl/ext/geometry.c create mode 100644 nodeboxgl/ext/noise.c create mode 100644 nodeboxgl/ext/psyco/__init__.py create mode 100644 nodeboxgl/ext/psyco/classes.py create mode 100644 nodeboxgl/ext/psyco/core.py create mode 100644 nodeboxgl/ext/psyco/kdictproxy.py create mode 100644 nodeboxgl/ext/psyco/logger.py create mode 100644 nodeboxgl/ext/psyco/profiler.py create mode 100644 nodeboxgl/ext/psyco/src/COPYING.txt create mode 100644 nodeboxgl/ext/psyco/src/MANIFEST create mode 100644 nodeboxgl/ext/psyco/src/README.txt create mode 100644 nodeboxgl/ext/psyco/src/c/Makefile create mode 100644 nodeboxgl/ext/psyco/src/c/Modules/parray.c create mode 100644 nodeboxgl/ext/psyco/src/c/Modules/pmath.c create mode 100644 nodeboxgl/ext/psyco/src/c/Modules/ppsyco.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/compactobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/compactobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pabstract.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pabstract.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pboolobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pboolobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pclassobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pclassobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pdictobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pdictobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pintobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pintobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/piterobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/piterobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/plistobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/plistobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/plongobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/plongobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/prangeobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/prangeobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pstringobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pstringobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pstructmember.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/pstructmember.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.c create mode 100644 nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.h create mode 100644 nodeboxgl/ext/psyco/src/c/Python/frames.c create mode 100644 nodeboxgl/ext/psyco/src/c/Python/frames.h create mode 100644 nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.c create mode 100644 nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.h create mode 100644 nodeboxgl/ext/psyco/src/c/Python/pycheader.h create mode 100644 nodeboxgl/ext/psyco/src/c/Python/pycinternal.h create mode 100644 nodeboxgl/ext/psyco/src/c/Python/pycompiler.c create mode 100644 nodeboxgl/ext/psyco/src/c/Python/pycompiler.h create mode 100644 nodeboxgl/ext/psyco/src/c/Python/pyver.h create mode 100644 nodeboxgl/ext/psyco/src/c/alarm.c create mode 100644 nodeboxgl/ext/psyco/src/c/alarm.h create mode 100644 nodeboxgl/ext/psyco/src/c/blockalloc.h create mode 100644 nodeboxgl/ext/psyco/src/c/codegen.c create mode 100644 nodeboxgl/ext/psyco/src/c/codegen.h create mode 100644 nodeboxgl/ext/psyco/src/c/codemanager.c create mode 100644 nodeboxgl/ext/psyco/src/c/codemanager.h create mode 100644 nodeboxgl/ext/psyco/src/c/cstruct.c create mode 100644 nodeboxgl/ext/psyco/src/c/cstruct.h create mode 100644 nodeboxgl/ext/psyco/src/c/depend.py create mode 100644 nodeboxgl/ext/psyco/src/c/dispatcher.c create mode 100644 nodeboxgl/ext/psyco/src/c/dispatcher.h create mode 100644 nodeboxgl/ext/psyco/src/c/files.py create mode 100644 nodeboxgl/ext/psyco/src/c/i386/idispatcher.c create mode 100644 nodeboxgl/ext/psyco/src/c/i386/idispatcher.h create mode 100644 nodeboxgl/ext/psyco/src/c/i386/iencoding.c create mode 100644 nodeboxgl/ext/psyco/src/c/i386/iencoding.h create mode 100644 nodeboxgl/ext/psyco/src/c/i386/iinitialize.h create mode 100644 nodeboxgl/ext/psyco/src/c/i386/iprocessor.c create mode 100644 nodeboxgl/ext/psyco/src/c/i386/ipyencoding.c create mode 100644 nodeboxgl/ext/psyco/src/c/i386/ipyencoding.h create mode 100644 nodeboxgl/ext/psyco/src/c/initialize.h create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/idispatcher.c create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/idispatcher.h create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/iencoding.c create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/iencoding.h create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/iinitialize.h create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/iprocessor.c create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.c create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.h create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.c create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.h create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/localsetup.py create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/Makefile create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/ccode.pl create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/detcheck.pl create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen.i.default create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-switch.i.default create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-table.py.default create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.pl create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.py create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/insnset.py create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/optimize.pl create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/samelines.py create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/utils.pl create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/vm.pl create mode 100644 nodeboxgl/ext/psyco/src/c/ivm/prolog/vmwriter.pl create mode 100644 nodeboxgl/ext/psyco/src/c/linuxmemchk.c create mode 100644 nodeboxgl/ext/psyco/src/c/linuxmemchk.h create mode 100644 nodeboxgl/ext/psyco/src/c/mergepoints.c create mode 100644 nodeboxgl/ext/psyco/src/c/mergepoints.h create mode 100644 nodeboxgl/ext/psyco/src/c/mkincl.py create mode 100644 nodeboxgl/ext/psyco/src/c/mychecker.py create mode 100644 nodeboxgl/ext/psyco/src/c/platform.c create mode 100644 nodeboxgl/ext/psyco/src/c/platform.h create mode 100644 nodeboxgl/ext/psyco/src/c/processor.h create mode 100644 nodeboxgl/ext/psyco/src/c/profile.c create mode 100644 nodeboxgl/ext/psyco/src/c/profile.h create mode 100644 nodeboxgl/ext/psyco/src/c/psyco.c create mode 100644 nodeboxgl/ext/psyco/src/c/psyco.h create mode 100644 nodeboxgl/ext/psyco/src/c/psyfunc.c create mode 100644 nodeboxgl/ext/psyco/src/c/psyfunc.h create mode 100644 nodeboxgl/ext/psyco/src/c/pycodegen.h create mode 100644 nodeboxgl/ext/psyco/src/c/stats.c create mode 100644 nodeboxgl/ext/psyco/src/c/stats.h create mode 100644 nodeboxgl/ext/psyco/src/c/timing.h create mode 100644 nodeboxgl/ext/psyco/src/c/vcompiler.c create mode 100644 nodeboxgl/ext/psyco/src/c/vcompiler.h create mode 100644 nodeboxgl/ext/psyco/src/c/versionchecker.py create mode 100644 nodeboxgl/ext/psyco/src/c/win32/psyco.vcproj create mode 100644 nodeboxgl/ext/psyco/src/doc/Makefile create mode 100644 nodeboxgl/ext/psyco/src/doc/README.txt create mode 100644 nodeboxgl/ext/psyco/src/doc/psycoguide.tex create mode 100644 nodeboxgl/ext/psyco/src/psyco-mactel.diff create mode 100644 nodeboxgl/ext/psyco/src/py-support/__init__.py create mode 100644 nodeboxgl/ext/psyco/src/py-support/classes.py create mode 100644 nodeboxgl/ext/psyco/src/py-support/core.py create mode 100644 nodeboxgl/ext/psyco/src/py-support/kdictproxy.py create mode 100644 nodeboxgl/ext/psyco/src/py-support/logger.py create mode 100644 nodeboxgl/ext/psyco/src/py-support/profiler.py create mode 100644 nodeboxgl/ext/psyco/src/py-support/support.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/cvs.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/httpxam.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/ivmdump.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/ivmextract.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/ivmoptimize.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/manifest.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/symbols.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/vinfo_dump.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/win32/README.TXT create mode 100644 nodeboxgl/ext/psyco/src/py-utils/xam.py create mode 100644 nodeboxgl/ext/psyco/src/py-utils/xamsupport.c create mode 100644 nodeboxgl/ext/psyco/src/setup.py create mode 100755 nodeboxgl/ext/psyco/src/test/bpnn.py create mode 100644 nodeboxgl/ext/psyco/src/test/btrun.py create mode 100644 nodeboxgl/ext/psyco/src/test/classicregrtest.py create mode 100644 nodeboxgl/ext/psyco/src/test/file1-basetests create mode 100644 nodeboxgl/ext/psyco/src/test/file2-basetests.uu create mode 100644 nodeboxgl/ext/psyco/src/test/fulltester.py create mode 100755 nodeboxgl/ext/psyco/src/test/life-psyco.py create mode 100755 nodeboxgl/ext/psyco/src/test/life.py create mode 100644 nodeboxgl/ext/psyco/src/test/pystone-jit.py create mode 100644 nodeboxgl/ext/psyco/src/test/pystone.py create mode 100644 nodeboxgl/ext/psyco/src/test/regrtester.py create mode 100644 nodeboxgl/ext/psyco/src/test/regrtester2.py create mode 100644 nodeboxgl/ext/psyco/src/test/test1.py create mode 100644 nodeboxgl/ext/psyco/src/test/test3.py create mode 100644 nodeboxgl/ext/psyco/src/test/test5.py create mode 100755 nodeboxgl/ext/psyco/src/test/test_base.py create mode 100644 nodeboxgl/ext/psyco/src/test/test_compactobject.py create mode 100644 nodeboxgl/ext/psyco/src/test/test_misc.py create mode 100644 nodeboxgl/ext/psyco/support.py create mode 100644 nodeboxgl/ext/setup.py create mode 100644 nodeboxgl/font/Droid Sans Mono.ttf create mode 100644 nodeboxgl/font/Droid Sans-Bold.ttf create mode 100644 nodeboxgl/font/Droid Sans.ttf create mode 100644 nodeboxgl/font/Droid Serif-Bold.ttf create mode 100644 nodeboxgl/font/Droid Serif-BoldItalic.ttf create mode 100644 nodeboxgl/font/Droid Serif-Italic.ttf create mode 100644 nodeboxgl/font/Droid Serif-Regular.ttf create mode 100644 nodeboxgl/font/glyph.p create mode 100644 nodeboxgl/font/glyph.py create mode 100644 nodeboxgl/graphics/__init__.py create mode 100644 nodeboxgl/graphics/bezier.py create mode 100644 nodeboxgl/graphics/context.py create mode 100644 nodeboxgl/graphics/geometry.py create mode 100644 nodeboxgl/graphics/noise.py create mode 100644 nodeboxgl/graphics/physics.py create mode 100644 nodeboxgl/graphics/shader.py create mode 100644 nodeboxgl/gui/__init__.py create mode 100644 nodeboxgl/gui/controls.py create mode 100644 nodeboxgl/gui/theme/Droid Sans-Bold.ttf create mode 100644 nodeboxgl/gui/theme/Droid Sans.ttf create mode 100644 nodeboxgl/gui/theme/action-close.png create mode 100644 nodeboxgl/gui/theme/action.png create mode 100644 nodeboxgl/gui/theme/button.png create mode 100644 nodeboxgl/gui/theme/field.png create mode 100644 nodeboxgl/gui/theme/flag-checked.png create mode 100644 nodeboxgl/gui/theme/flag.png create mode 100644 nodeboxgl/gui/theme/flag.psd create mode 100644 nodeboxgl/gui/theme/knob-socket.png create mode 100644 nodeboxgl/gui/theme/knob.png create mode 100644 nodeboxgl/gui/theme/panel.png create mode 100644 nodeboxgl/gui/theme/slider-handle.png create mode 100644 nodeboxgl/gui/theme/slider.png create mode 100644 nodeboxgl/sound/__init__.py create mode 100755 nodeboxgl/sound/osc.py create mode 100644 nodeboxgl/sound/process.py diff --git a/nodeboxgl/__init__.py b/nodeboxgl/__init__.py new file mode 100644 index 0000000..ff08cb5 --- /dev/null +++ b/nodeboxgl/__init__.py @@ -0,0 +1,21 @@ +#=== NODEBOX FOR OPENGL ============================================================================== + +# NodeBox for OpenGL is a Python module for creating 2D interactive visuals using OpenGL. +# It is based on the command set of the classic NodeBox for Mac OS X (http://nodebox.net). +# It has support for Bezier paths, text, image filters (blur, bloom, ...), offscreen rendering, +# animation & motion tweening, and simple 2D physics. + +__author__ = "Tom De Smedt, Frederik De Bleser" +__version__ = "1.7" +__copyright__ = "Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org)" +__license__ = "BSD" + +import sys +if sys.version_info < (2,7): + try: import psyco; psyco.profile() + except: + try: from ext import psyco; psyco.profile() + except: + pass + +import nodebox \ No newline at end of file diff --git a/nodeboxgl/ext/__init__.py b/nodeboxgl/ext/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/nodeboxgl/ext/bezier.c b/nodeboxgl/ext/bezier.c new file mode 100644 index 0000000..48f6e4b --- /dev/null +++ b/nodeboxgl/ext/bezier.c @@ -0,0 +1,167 @@ +#include +#include + +// --- LINEPOINT ---------------------------------------------------------------- +void _linepoint(double t, double x0, double y0, double x1, double y1, + double *out_x, double *out_y) { + *out_x = x0 + t * (x1-x0); + *out_y = y0 + t * (y1-y0); +} + +// ---- LINELENGTH -------------------------------------------------------------- +void _linelength(double x0, double y0, double x1, double y1, + double *out_length) { + double a, b; + a = pow(fabs(x0 - x1), 2); + b = pow(fabs(y0 - y1), 2); + *out_length = sqrt(a + b); +} + +// --- CURVEPOINT --------------------------------------------------------------- +void _curvepoint(double t, double x0, double y0, double x1, double y1, + double x2, double y2, double x3, double y3, + double *out_x, double *out_y, + double *out_c1x, double *out_c1y, double *out_c2x, double *out_c2y) { + double mint, x01, y01, x12, y12, x23, y23; + mint = 1 - t; + x01 = x0 * mint + x1 * t; + y01 = y0 * mint + y1 * t; + x12 = x1 * mint + x2 * t; + y12 = y1 * mint + y2 * t; + x23 = x2 * mint + x3 * t; + y23 = y2 * mint + y3 * t; + *out_c1x = x01 * mint + x12 * t; + *out_c1y = y01 * mint + y12 * t; + *out_c2x = x12 * mint + x23 * t; + *out_c2y = y12 * mint + y23 * t; + *out_x = *out_c1x * mint + *out_c2x * t; + *out_y = *out_c1y * mint + *out_c2y * t; +} + +// --- CURVEPOINT HANDLES ------------------------------------------------------- +void _curvepoint_handles(double t, double x0, double y0, double x1, double y1, + double x2, double y2, double x3, double y3, + double *out_x, double *out_y, + double *out_c1x, double *out_c1y, double *out_c2x, double *out_c2y, + double *out_h1x, double *out_h1y, double *out_h2x, double *out_h2y) { + double mint, x01, y01, x12, y12, x23, y23; + mint = 1 - t; + x01 = x0 * mint + x1 * t; + y01 = y0 * mint + y1 * t; + x12 = x1 * mint + x2 * t; + y12 = y1 * mint + y2 * t; + x23 = x2 * mint + x3 * t; + y23 = y2 * mint + y3 * t; + *out_c1x = x01 * mint + x12 * t; + *out_c1y = y01 * mint + y12 * t; + *out_c2x = x12 * mint + x23 * t; + *out_c2y = y12 * mint + y23 * t; + *out_x = *out_c1x * mint + *out_c2x * t; + *out_y = *out_c1y * mint + *out_c2y * t; + *out_h1x = x01; + *out_h1y = y01; + *out_h2x = x23; + *out_h2y = y23; +} + +// --- CURVELENGTH -------------------------------------------------------------- +void _curvelength(double x0, double y0, double x1, double y1, + double x2, double y2, double x3, double y3, int n, + double *out_length) { + double length = 0; + double xi, yi, t, c; + double pt_x, pt_y, pt_c1x, pt_c1y, pt_c2x, pt_c2y; + int i; + xi = x0; + yi = y0; + for (i=0; i +#include + +// --- FAST INVERSE SQRT -------------------------------------------------------- +// Chris Lomont, http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf +float _fast_inverse_sqrt(float x) { + float xhalf = 0.5f*x; + int i = *(int*)&x; + i = 0x5f3759df - (i>>1); + x = *(float*)&i; + x = x*(1.5f-xhalf*x*x); + return x; +} + +// --- ANGLE -------------------------------------------------------------------- +void _angle(double x0, double y0, double x1, double y1, double *a) { + *a = atan2(y1-y0, x1-x0) / M_PI * 180; +} + +// --- DISTANCE ----------------------------------------------------------------- +void _distance(double x0, double y0, double x1, double y1, double *d) { + *d = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); +} + +// --- COORDINATES -------------------------------------------------------------- +void _coordinates(double x0, double y0, double d, double a, double *x1, double *y1) { + *x1 = x0 + cos(a/180*M_PI) * d; + *y1 = y0 + sin(a/180*M_PI) * d; +} + +// --- ROTATE ------------------------------------------------------------------- +void _rotate(double x, double y, double x0, double y0, double a, double *x1, double *y1) { + x = x-x0; + y = y-y0; + double u = cos(a/180*M_PI); + double v = sin(a/180*M_PI); + *x1 = x*u-y*v+x0; + *y1 = y*u+x*v+y0; +} + +// --- SMOOTHSTEP --------------------------------------------------------------- +void _smoothstep(double a, double b, double x, double *t) { + if (x < a) { + *t = 0.0; + } else if (x >= b) { + *t = 1.0; + } else { + x = (x-a) / (b-a); + *t = x*x * (3-2*x); + } +} + +// --- SUPERFORMULA ------------------------------------------------------------- + +void _superformula(double m, double n1, double n2, double n3, double phi, double *x, double *y) { + double a=1.0, b=1.0, r; + if (n1 != 0) { + r = pow(pow(fabs(cos(m*phi/4.0)/a), n2) + + pow(fabs(sin(m*phi/4.0)/b), n3), 1.0/n1); + } + if (n1 == 0 || fabs(r) == 0) { + *x = 0; + *y = 0; + } else { + r = 1.0 / r; + *x = r*cos(phi); + *y = r*sin(phi); + } +} + +// --- MATRIX MULTIPLY ---------------------------------------------------------- + +void _mmult(double a0, double a1, double a2, double a3, double a4, double a5, double a6, double a7, double a8, + double b0, double b1, double b2, double b3, double b4, double b5, double b6, double b7, double b8, + double *c0, double *c1, double *c2, double *c3, double *c4, double *c5, double *c6, double *c7, double *c8) { + *c0 = a0*b0 + a1*b3; + *c1 = a0*b1 + a1*b4; + *c2 = 0; + *c3 = a3*b0 + a4*b3; + *c4 = a3*b1 + a4*b4; + *c5 = 0; + *c6 = a6*b0 + a7*b3 + b6; + *c7 = a6*b1 + a7*b4 + b7; + *c8 = 1; +} + +// ------------------------------------------------------------------------------ + +static PyObject * +fast_inverse_sqrt(PyObject *self, PyObject *args) { + double x; + if (!PyArg_ParseTuple(args, "d", &x)) + return NULL; + x = _fast_inverse_sqrt(x); + return Py_BuildValue("d", x); +} + +static PyObject * +angle(PyObject *self, PyObject *args) { + double x0, y0, x1, y1, a; + if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &x1, &y1)) + return NULL; + _angle(x0, y0, x1, y1, &a); + return Py_BuildValue("d", a); +} + +static PyObject * +distance(PyObject *self, PyObject *args) { + double x0, y0, x1, y1, d; + if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &x1, &y1)) + return NULL; + _distance(x0, y0, x1, y1, &d); + return Py_BuildValue("d", d); +} + +static PyObject * +coordinates(PyObject *self, PyObject *args) { + double x0, y0, d, a, x1, y1; + if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &d, &a)) + return NULL; + _coordinates(x0, y0, d, a, &x1, &y1); + return Py_BuildValue("dd", x1, y1); +} + +static PyObject * +rotate(PyObject *self, PyObject *args) { + double x, y, x0, y0, a, x1, y1; + if (!PyArg_ParseTuple(args, "ddddd", &x, &y, &x0, &y0, &a)) + return NULL; + _rotate(x, y, x0, y0, a, &x1, &y1); + return Py_BuildValue("dd", x1, y1); +} + +static PyObject * +smoothstep(PyObject *self, PyObject *args) { + double a, b, x, t; + if (!PyArg_ParseTuple(args, "ddd", &a, &b, &x)) + return NULL; + _smoothstep(a, b, x, &t); + return Py_BuildValue("d", t); +} + +static PyObject * +superformula(PyObject *self, PyObject *args) { + double m, n1, n2, n3, phi, x, y; + if (!PyArg_ParseTuple(args, "ddddd", &m, &n1, &n2, &n3, &phi)) + return NULL; + _superformula(m, n1, n2, n3, phi, &x, &y); + return Py_BuildValue("dd", x, y); +} + +static PyObject * +mmult(PyObject *self, PyObject *args) { + double a0, a1, a2, a3, a4, a5, a6, a7, a8; + double b0, b1, b2, b3, b4, b5, b6, b7, b8; + double c0, c1, c2, c3, c4, c5, c6, c7, c8; + if (!PyArg_ParseTuple(args, "dddddddddddddddddd", + &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, + &b0, &b1, &b2, &b3, &b4, &b5, &b6, &b7, &b8)) + return NULL; + _mmult( a0, a1, a2, a3, a4, a5, a6, a7, a8, + b0, b1, b2, b3, b4, b5, b6, b7, b8, + &c0, &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8); + return Py_BuildValue("ddddddddd", c0, c1, c2, c3, c4, c5, c6, c7, c8); +} + +// ------------------------------------------------------------------------------ + +static PyMethodDef geometry_methods[]={ + { "fast_inverse_sqrt", fast_inverse_sqrt, METH_VARARGS }, + { "angle", angle, METH_VARARGS }, + { "distance", distance, METH_VARARGS }, + { "coordinates", coordinates, METH_VARARGS }, + { "rotate", rotate, METH_VARARGS }, + { "smoothstep", smoothstep, METH_VARARGS }, + { "superformula", superformula, METH_VARARGS }, + { "mmult", mmult, METH_VARARGS }, + { NULL, NULL } +}; + +PyMODINIT_FUNC initgeometry(void){ + PyObject *m; + m = Py_InitModule("geometry", geometry_methods); +} + +int main(int argc, char *argv[]) { + Py_SetProgramName(argv[0]); + Py_Initialize(); + initgeometry(); + return 0; +} \ No newline at end of file diff --git a/nodeboxgl/ext/noise.c b/nodeboxgl/ext/noise.c new file mode 100644 index 0000000..e5a4423 --- /dev/null +++ b/nodeboxgl/ext/noise.c @@ -0,0 +1,88 @@ +// --- PERLIN NOISE -------------------------------------------------------------------- +// Based on: Malcolm Kesson, http://www.fundza.com/c4serious/noise/perlin/perlin.html +// © 2002-4 Malcolm Kesson. All rights reserved. + +#include + +#include +#include + +static int p[512]; + +double fade(double t) { return t * t * t * (t * (t * 6 - 15) + 10); } +double lerp(double t, double a, double b) { return a + t * (b - a); } +double grad(int hash, double x, double y, double z) { + int h = hash & 15; + double u = h < 8 ? x : y, + v = h < 4 ? y : h==12 || h==14 ? x : z; + return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v); +} + +double _generate(double x, double y, double z) { + // Find unit cuve that contains point. + int X = (int)floor(x) & 255, + Y = (int)floor(y) & 255, + Z = (int)floor(z) & 255; + // Find relative x, y, z of point in cube. + x -= floor(x); + y -= floor(y); + z -= floor(z); + // Compute fade curves for each of x, y, z. + double u=fade(x), v=fade(y), w=fade(z); + // Hash coordinates of the 8 cube corners. + int A = p[X ] + Y, + AA = p[A ] + Z, + AB = p[A+1] + Z, + B = p[X+1] + Y, + BA = p[B ] + Z, + BB = p[B+1] + Z; + // Add blended results from 8 corners of cube. + return lerp(w, + lerp(v, lerp(u, grad(p[AA ], x , y , z ), + grad(p[BA ], x-1, y , z )), + lerp(u, grad(p[AB ], x , y-1, z ), + grad(p[BB ], x-1, y-1, z ))), + lerp(v, lerp(u, grad(p[AA+1], x , y , z-1), + grad(p[BA+1], x-1, y , z-1)), + lerp(u, grad(p[AB+1], x , y-1, z-1), + grad(p[BB+1], x-1, y-1, z-1)))); +} + +// ------------------------------------------------------------------------------------- + +static PyObject * +generate(PyObject *self, PyObject *args) { + double x, y, z, d; + if (!PyArg_ParseTuple(args, "ddd", &x, &y, &z)) return NULL; + d = _generate(x, y, z); + return Py_BuildValue("d", d); +} + +static PyObject * +init(PyObject *self, PyObject *args) { + PyObject * a; + if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &a)) return NULL; + int i; + for(i=0; i<512; i++) + p[i] = (int)PyInt_AsLong(PyList_GetItem(a, i)); + return Py_BuildValue(""); +} + +static PyMethodDef methods[]={ + { "generate", generate, METH_VARARGS }, + { "init", init, METH_VARARGS }, + { NULL, NULL } +}; + +PyMODINIT_FUNC initnoise(void) { + PyObject *m; + m = Py_InitModule("noise", methods); +} + +int main(int argc, char *argv[]) { + Py_SetProgramName(argv[0]); + Py_Initialize(); + initnoise(); + return 0; +} + diff --git a/nodeboxgl/ext/psyco/__init__.py b/nodeboxgl/ext/psyco/__init__.py new file mode 100644 index 0000000..d25e197 --- /dev/null +++ b/nodeboxgl/ext/psyco/__init__.py @@ -0,0 +1,54 @@ +########################################################################### +# +# Psyco top-level file of the Psyco package. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco -- the Python Specializing Compiler. + +Typical usage: add the following lines to your application's main module, +preferably after the other imports: + +try: + import psyco + psyco.full() +except ImportError: + print 'Psyco not installed, the program will just run slower' +""" +########################################################################### + + +# +# This module is present to make 'psyco' a package and to +# publish the main functions and variables. +# +# More documentation can be found in core.py. +# + + +# Try to import the dynamic-loading _psyco and report errors +try: + import _psyco +except ImportError, e: + extramsg = '' + import sys, imp + try: + file, filename, (suffix, mode, type) = imp.find_module('_psyco', __path__) + except ImportError: + ext = [suffix for suffix, mode, type in imp.get_suffixes() + if type == imp.C_EXTENSION] + if ext: + extramsg = (" (cannot locate the compiled extension '_psyco%s' " + "in the package path '%s')" % (ext[0], '; '.join(__path__))) + else: + extramsg = (" (check that the compiled extension '%s' is for " + "the correct Python version; this is Python %s)" % + (filename, sys.version.split()[0])) + raise ImportError, str(e) + extramsg + +# Publish important data by importing them in the package +from support import __version__, error, warning, _getrealframe, _getemulframe +from support import version_info, __version__ as hexversion +from core import full, profile, background, runonly, stop, cannotcompile +from core import log, bind, unbind, proxy, unproxy, dumpcodebuf +from _psyco import setfilter +from _psyco import compact, compacttype diff --git a/nodeboxgl/ext/psyco/classes.py b/nodeboxgl/ext/psyco/classes.py new file mode 100644 index 0000000..0563f84 --- /dev/null +++ b/nodeboxgl/ext/psyco/classes.py @@ -0,0 +1,42 @@ +########################################################################### +# +# Psyco class support module. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco class support module. + +'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes. +Any class inheriting from it or using the metaclass '__metaclass__' might +get optimized specifically for Psyco. It is equivalent to call +psyco.bind() on the class object after its creation. + +Importing everything from psyco.classes in a module will import the +'__metaclass__' name, so all classes defined after a + + from psyco.classes import * + +will automatically use the Psyco-optimized metaclass. +""" +########################################################################### + +__all__ = ['psyobj', 'psymetaclass', '__metaclass__'] + + +from _psyco import compacttype +import core +from types import FunctionType + +class psymetaclass(compacttype): + "Psyco-optimized meta-class. Turns all methods into Psyco proxies." + + def __new__(cls, name, bases, dict): + bindlist = dict.get('__psyco__bind__') + if bindlist is None: + bindlist = [key for key, value in dict.items() + if isinstance(value, FunctionType)] + for attr in bindlist: + dict[attr] = core.proxy(dict[attr]) + return super(psymetaclass, cls).__new__(cls, name, bases, dict) + +psyobj = psymetaclass("psyobj", (), {}) +__metaclass__ = psymetaclass diff --git a/nodeboxgl/ext/psyco/core.py b/nodeboxgl/ext/psyco/core.py new file mode 100644 index 0000000..42a6c2f --- /dev/null +++ b/nodeboxgl/ext/psyco/core.py @@ -0,0 +1,232 @@ +########################################################################### +# +# Psyco main functions. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco main functions. + +Here are the routines that you can use from your applications. +These are mostly interfaces to the C core, but they depend on +the Python version. + +You can use these functions from the 'psyco' module instead of +'psyco.core', e.g. + + import psyco + psyco.log('/tmp/psyco.log') + psyco.profile() +""" +########################################################################### + +import _psyco +import types, new +from support import * + + +# Default charge profiler values +default_watermark = 0.09 # between 0.0 (0%) and 1.0 (100%) +default_halflife = 0.5 # seconds +default_pollfreq_profile = 20 # Hz +default_pollfreq_background = 100 # Hz -- a maximum for sleep's resolution +default_parentframe = 0.25 # should not be more than 0.5 (50%) + + +def full(memory=None, time=None, memorymax=None, timemax=None): + """Compile as much as possible. + +Typical use is for small scripts performing intensive computations +or string handling.""" + import profiler + if PYTHON_SUPPORT: + p = profiler.FullCompiler() + else: + p = profiler.ActiveProfiler(0.0, 0.5) + p.run(memory, time, memorymax, timemax) + + +def profile(watermark = default_watermark, + halflife = default_halflife, + pollfreq = default_pollfreq_profile, + parentframe = default_parentframe, + memory=None, time=None, memorymax=None, timemax=None): + """Turn on profiling. + +The 'watermark' parameter controls how easily running functions will +be compiled. The smaller the value, the more functions are compiled.""" + import profiler + p = profiler.ActivePassiveProfiler(watermark, halflife, + pollfreq, parentframe) + p.run(memory, time, memorymax, timemax) + + +def background(watermark = default_watermark, + halflife = default_halflife, + pollfreq = default_pollfreq_background, + parentframe = default_parentframe, + memory=None, time=None, memorymax=None, timemax=None): + """Turn on passive profiling. + +This is a very lightweight mode in which only intensively computing +functions can be detected. The smaller the 'watermark', the more functions +are compiled.""" + import profiler + p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe) + p.run(memory, time, memorymax, timemax) + + +def runonly(memory=None, time=None, memorymax=None, timemax=None): + """Nonprofiler. + +XXX check if this is useful and document.""" + if PYTHON_SUPPORT: + import profiler + p = profiler.RunOnly() + p.run(memory, time, memorymax, timemax) + + +def stop(): + """Turn off all automatic compilation. bind() calls remain in effect.""" + import profiler + profiler.go([]) + + +def log(logfile='', mode='w', top=10): + """Enable logging to the given file. + +If the file name is unspecified, a default name is built by appending +a 'log-psyco' extension to the main script name. + +Mode is 'a' to append to a possibly existing file or 'w' to overwrite +an existing file. Note that the log file may grow quickly in 'a' mode.""" + import profiler, logger + if not logfile: + import os + logfile, dummy = os.path.splitext(sys.argv[0]) + if os.path.basename(logfile): + logfile += '.' + logfile += 'log-psyco' + if hasattr(_psyco, 'VERBOSE_LEVEL'): + print >> sys.stderr, 'psyco: logging to', logfile + # logger.current should be a real file object; subtle problems + # will show up if its write() and flush() methods are written + # in Python, as Psyco will invoke them while compiling. + logger.current = open(logfile, mode) + logger.print_charges = top + profiler.logger = logger + logger.writedate('Logging started') + cannotcompile(logger.psycowrite) + _psyco.statwrite(logger=logger.psycowrite) + + +def bind(x, rec=None): + """Enable compilation of the given function, method, or class object. + +If C is a class (or anything with a '__dict__' attribute), bind(C) will +rebind all functions and methods found in C.__dict__ (which means, for +classes, all methods defined in the class but not in its parents). + +The optional second argument specifies the number of recursive +compilation levels: all functions called by func are compiled +up to the given depth of indirection.""" + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + if rec is None: + x.func_code = _psyco.proxycode(x) + else: + x.func_code = _psyco.proxycode(x, rec) + return + if hasattr(x, '__dict__'): + funcs = [o for o in x.__dict__.values() + if isinstance(o, types.MethodType) + or isinstance(o, types.FunctionType)] + if not funcs: + raise error, ("nothing bindable found in %s object" % + type(x).__name__) + for o in funcs: + bind(o, rec) + return + raise TypeError, "cannot bind %s objects" % type(x).__name__ + + +def unbind(x): + """Reverse of bind().""" + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + try: + f = _psyco.unproxycode(x.func_code) + except error: + pass + else: + x.func_code = f.func_code + return + if hasattr(x, '__dict__'): + for o in x.__dict__.values(): + if (isinstance(o, types.MethodType) + or isinstance(o, types.FunctionType)): + unbind(o) + return + raise TypeError, "cannot unbind %s objects" % type(x).__name__ + + +def proxy(x, rec=None): + """Return a Psyco-enabled copy of the function. + +The original function is still available for non-compiled calls. +The optional second argument specifies the number of recursive +compilation levels: all functions called by func are compiled +up to the given depth of indirection.""" + if isinstance(x, types.FunctionType): + if rec is None: + code = _psyco.proxycode(x) + else: + code = _psyco.proxycode(x, rec) + return new.function(code, x.func_globals, x.func_name) + if isinstance(x, types.MethodType): + p = proxy(x.im_func, rec) + return new.instancemethod(p, x.im_self, x.im_class) + raise TypeError, "cannot proxy %s objects" % type(x).__name__ + + +def unproxy(proxy): + """Return a new copy of the original function of method behind a proxy. +The result behaves like the original function in that calling it +does not trigger compilation nor execution of any compiled code.""" + if isinstance(proxy, types.FunctionType): + return _psyco.unproxycode(proxy.func_code) + if isinstance(proxy, types.MethodType): + f = unproxy(proxy.im_func) + return new.instancemethod(f, proxy.im_self, proxy.im_class) + raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__ + + +def cannotcompile(x): + """Instruct Psyco never to compile the given function, method +or code object.""" + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + x = x.func_code + if isinstance(x, types.CodeType): + _psyco.cannotcompile(x) + else: + raise TypeError, "unexpected %s object" % type(x).__name__ + + +def dumpcodebuf(): + """Write in file psyco.dump a copy of the emitted machine code, +provided Psyco was compiled with a non-zero CODE_DUMP. +See py-utils/httpxam.py to examine psyco.dump.""" + if hasattr(_psyco, 'dumpcodebuf'): + _psyco.dumpcodebuf() + + +########################################################################### +# Psyco variables +# error * the error raised by Psyco +# warning * the warning raised by Psyco +# __in_psyco__ * a new built-in variable which is always zero, but which +# Psyco special-cases by returning 1 instead. So +# __in_psyco__ can be used in a function to know if +# that function is being executed by Psyco or not. diff --git a/nodeboxgl/ext/psyco/kdictproxy.py b/nodeboxgl/ext/psyco/kdictproxy.py new file mode 100644 index 0000000..c764e5e --- /dev/null +++ b/nodeboxgl/ext/psyco/kdictproxy.py @@ -0,0 +1,133 @@ +########################################################################### +# +# Support code for the 'psyco.compact' type. + +from __future__ import generators + +try: + from UserDict import DictMixin +except ImportError: + + # backported from Python 2.3 to Python 2.2 + class DictMixin: + # Mixin defining all dictionary methods for classes that already have + # a minimum dictionary interface including getitem, setitem, delitem, + # and keys. Without knowledge of the subclass constructor, the mixin + # does not define __init__() or copy(). In addition to the four base + # methods, progressively more efficiency comes with defining + # __contains__(), __iter__(), and iteritems(). + + # second level definitions support higher levels + def __iter__(self): + for k in self.keys(): + yield k + def has_key(self, key): + try: + value = self[key] + except KeyError: + return False + return True + def __contains__(self, key): + return self.has_key(key) + + # third level takes advantage of second level definitions + def iteritems(self): + for k in self: + yield (k, self[k]) + def iterkeys(self): + return self.__iter__() + + # fourth level uses definitions from lower levels + def itervalues(self): + for _, v in self.iteritems(): + yield v + def values(self): + return [v for _, v in self.iteritems()] + def items(self): + return list(self.iteritems()) + def clear(self): + for key in self.keys(): + del self[key] + def setdefault(self, key, default): + try: + return self[key] + except KeyError: + self[key] = default + return default + def pop(self, key, *args): + if len(args) > 1: + raise TypeError, "pop expected at most 2 arguments, got "\ + + repr(1 + len(args)) + try: + value = self[key] + except KeyError: + if args: + return args[0] + raise + del self[key] + return value + def popitem(self): + try: + k, v = self.iteritems().next() + except StopIteration: + raise KeyError, 'container is empty' + del self[k] + return (k, v) + def update(self, other): + # Make progressively weaker assumptions about "other" + if hasattr(other, 'iteritems'): # iteritems saves memory and lookups + for k, v in other.iteritems(): + self[k] = v + elif hasattr(other, '__iter__'): # iter saves memory + for k in other: + self[k] = other[k] + else: + for k in other.keys(): + self[k] = other[k] + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + def __repr__(self): + return repr(dict(self.iteritems())) + def __cmp__(self, other): + if other is None: + return 1 + if isinstance(other, DictMixin): + other = dict(other.iteritems()) + return cmp(dict(self.iteritems()), other) + def __len__(self): + return len(self.keys()) + +########################################################################### + +from _psyco import compact + + +class compactdictproxy(DictMixin): + + def __init__(self, ko): + self._ko = ko # compact object of which 'self' is the dict + + def __getitem__(self, key): + return compact.__getslot__(self._ko, key) + + def __setitem__(self, key, value): + compact.__setslot__(self._ko, key, value) + + def __delitem__(self, key): + compact.__delslot__(self._ko, key) + + def keys(self): + return compact.__members__.__get__(self._ko) + + def clear(self): + keys = self.keys() + keys.reverse() + for key in keys: + del self[key] + + def __repr__(self): + keys = ', '.join(self.keys()) + return '' % (keys,) diff --git a/nodeboxgl/ext/psyco/logger.py b/nodeboxgl/ext/psyco/logger.py new file mode 100644 index 0000000..a3c5219 --- /dev/null +++ b/nodeboxgl/ext/psyco/logger.py @@ -0,0 +1,96 @@ +########################################################################### +# +# Psyco logger. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco logger. + +See log() in core.py. +""" +########################################################################### + + +import _psyco +from time import time, localtime, strftime + + +current = None +print_charges = 10 +dump_delay = 0.2 +dump_last = 0.0 + +def write(s, level): + t = time() + f = t-int(t) + try: + current.write("%s.%02d %-*s%s\n" % ( + strftime("%X", localtime(int(t))), + int(f*100.0), 63-level, s, + "%"*level)) + current.flush() + except (OSError, IOError): + pass + +def psycowrite(s): + t = time() + f = t-int(t) + try: + current.write("%s.%02d %-*s%s\n" % ( + strftime("%X", localtime(int(t))), + int(f*100.0), 60, s.strip(), + "% %")) + current.flush() + except (OSError, IOError): + pass + +##def writelines(lines, level=0): +## if lines: +## t = time() +## f = t-int(t) +## timedesc = strftime("%x %X", localtime(int(t))) +## print >> current, "%s.%03d %-*s %s" % ( +## timedesc, int(f*1000), +## 50-level, lines[0], +## "+"*level) +## timedesc = " " * (len(timedesc)+5) +## for line in lines[1:]: +## print >> current, timedesc, line + +def writememory(): + write("memory usage: %d+ kb" % _psyco.memory(), 1) + +def dumpcharges(): + global dump_last + if print_charges: + t = time() + if not (dump_last <= t < dump_last+dump_delay): + if t <= dump_last+1.5*dump_delay: + dump_last += dump_delay + else: + dump_last = t + #write("%s: charges:" % who, 0) + lst = _psyco.stattop(print_charges) + if lst: + f = t-int(t) + lines = ["%s.%02d ______\n" % ( + strftime("%X", localtime(int(t))), + int(f*100.0))] + i = 1 + for co, charge in lst: + detail = co.co_filename + if len(detail) > 19: + detail = '...' + detail[-17:] + lines.append(" #%-3d |%4.1f %%| %-26s%20s:%d\n" % + (i, charge*100.0, co.co_name, detail, + co.co_firstlineno)) + i += 1 + current.writelines(lines) + current.flush() + +def writefinalstats(): + dumpcharges() + writememory() + writedate("program exit") + +def writedate(msg): + write('%s, %s' % (msg, strftime("%x")), 20) diff --git a/nodeboxgl/ext/psyco/profiler.py b/nodeboxgl/ext/psyco/profiler.py new file mode 100644 index 0000000..ef7bf8e --- /dev/null +++ b/nodeboxgl/ext/psyco/profiler.py @@ -0,0 +1,388 @@ +########################################################################### +# +# Psyco profiler (Python part). +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco profiler (Python part). + +The implementation of the non-time-critical parts of the profiler. +See profile() and full() in core.py for the easy interface. +""" +########################################################################### + +import _psyco +from support import * +import math, time, types, atexit +now = time.time +try: + import thread +except ImportError: + import dummy_thread as thread + + +# current profiler instance +current = None + +# enabled profilers, in order of priority +profilers = [] + +# logger module (when enabled by core.log()) +logger = None + +# a lock for a thread-safe go() +go_lock = thread.allocate_lock() + +def go(stop=0): + # run the highest-priority profiler in 'profilers' + global current + go_lock.acquire() + try: + prev = current + if stop: + del profilers[:] + if prev: + if profilers and profilers[0] is prev: + return # best profiler already running + prev.stop() + current = None + for p in profilers[:]: + if p.start(): + current = p + if logger: # and p is not prev: + logger.write("%s: starting" % p.__class__.__name__, 5) + return + finally: + go_lock.release() + # no profiler is running now + if stop: + if logger: + logger.writefinalstats() + else: + tag2bind() + +atexit.register(go, 1) + + +def buildfncache(globals, cache): + if hasattr(types.IntType, '__dict__'): + clstypes = (types.ClassType, types.TypeType) + else: + clstypes = types.ClassType + for x in globals.values(): + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + cache[x.func_code] = x, '' + elif isinstance(x, clstypes): + for y in x.__dict__.values(): + if isinstance(y, types.MethodType): + y = y.im_func + if isinstance(y, types.FunctionType): + cache[y.func_code] = y, x.__name__ + +# code-to-function mapping (cache) +function_cache = {} + +def trytobind(co, globals, log=1): + try: + f, clsname = function_cache[co] + except KeyError: + buildfncache(globals, function_cache) + try: + f, clsname = function_cache[co] + except KeyError: + if logger: + logger.write('warning: cannot find function %s in %s' % + (co.co_name, globals.get('__name__', '?')), 3) + return # give up + if logger and log: + modulename = globals.get('__name__', '?') + if clsname: + modulename += '.' + clsname + logger.write('bind function: %s.%s' % (modulename, co.co_name), 1) + f.func_code = _psyco.proxycode(f) + + +if PYTHON_SUPPORT: + # the list of code objects that have been tagged + tagged_codes = [] + + def tag(co, globals): + if logger: + try: + f, clsname = function_cache[co] + except KeyError: + buildfncache(globals, function_cache) + try: + f, clsname = function_cache[co] + except KeyError: + clsname = '' # give up + modulename = globals.get('__name__', '?') + if clsname: + modulename += '.' + clsname + logger.write('tag function: %s.%s' % (modulename, co.co_name), 1) + tagged_codes.append((co, globals)) + _psyco.turbo_frame(co) + _psyco.turbo_code(co) + + def tag2bind(): + if tagged_codes: + if logger: + logger.write('profiling stopped, binding %d functions' % + len(tagged_codes), 2) + for co, globals in tagged_codes: + trytobind(co, globals, 0) + function_cache.clear() + del tagged_codes[:] + +else: + # tagging is impossible, always bind + tag = trytobind + def tag2bind(): + pass + + + +class Profiler: + MemoryTimerResolution = 0.103 + + def run(self, memory, time, memorymax, timemax): + self.memory = memory + self.memorymax = memorymax + self.time = time + if timemax is None: + self.endtime = None + else: + self.endtime = now() + timemax + self.alarms = [] + profilers.append(self) + go() + + def start(self): + curmem = _psyco.memory() + memlimits = [] + if self.memorymax is not None: + if curmem >= self.memorymax: + if logger: + logger.writememory() + return self.limitreached('memorymax') + memlimits.append(self.memorymax) + if self.memory is not None: + if self.memory <= 0: + if logger: + logger.writememory() + return self.limitreached('memory') + memlimits.append(curmem + self.memory) + self.memory_at_start = curmem + + curtime = now() + timelimits = [] + if self.endtime is not None: + if curtime >= self.endtime: + return self.limitreached('timemax') + timelimits.append(self.endtime - curtime) + if self.time is not None: + if self.time <= 0.0: + return self.limitreached('time') + timelimits.append(self.time) + self.time_at_start = curtime + + try: + self.do_start() + except error, e: + if logger: + logger.write('%s: disabled by psyco.error:' % ( + self.__class__.__name__), 4) + logger.write(' %s' % str(e), 3) + return 0 + + if memlimits: + self.memlimits_args = (time.sleep, (self.MemoryTimerResolution,), + self.check_memory, (min(memlimits),)) + self.alarms.append(_psyco.alarm(*self.memlimits_args)) + if timelimits: + self.alarms.append(_psyco.alarm(time.sleep, (min(timelimits),), + self.time_out)) + return 1 + + def stop(self): + for alarm in self.alarms: + alarm.stop(0) + for alarm in self.alarms: + alarm.stop(1) # wait for parallel threads to stop + del self.alarms[:] + if self.time is not None: + self.time -= now() - self.time_at_start + if self.memory is not None: + self.memory -= _psyco.memory() - self.memory_at_start + + try: + self.do_stop() + except error: + return 0 + return 1 + + def check_memory(self, limit): + if _psyco.memory() < limit: + return self.memlimits_args + go() + + def time_out(self): + self.time = 0.0 + go() + + def limitreached(self, limitname): + try: + profilers.remove(self) + except ValueError: + pass + if logger: + logger.write('%s: disabled (%s limit reached)' % ( + self.__class__.__name__, limitname), 4) + return 0 + + +class FullCompiler(Profiler): + + def do_start(self): + _psyco.profiling('f') + + def do_stop(self): + _psyco.profiling('.') + + +class RunOnly(Profiler): + + def do_start(self): + _psyco.profiling('n') + + def do_stop(self): + _psyco.profiling('.') + + +class ChargeProfiler(Profiler): + + def __init__(self, watermark, parentframe): + self.watermark = watermark + self.parent2 = parentframe * 2.0 + self.lock = thread.allocate_lock() + + def init_charges(self): + _psyco.statwrite(watermark = self.watermark, + parent2 = self.parent2) + + def do_stop(self): + _psyco.profiling('.') + _psyco.statwrite(callback = None) + + +class ActiveProfiler(ChargeProfiler): + + def active_start(self): + _psyco.profiling('p') + + def do_start(self): + self.init_charges() + self.active_start() + _psyco.statwrite(callback = self.charge_callback) + + def charge_callback(self, frame, charge): + tag(frame.f_code, frame.f_globals) + + +class PassiveProfiler(ChargeProfiler): + + initial_charge_unit = _psyco.statread('unit') + reset_stats_after = 120 # half-lives (maximum 200!) + reset_limit = initial_charge_unit * (2.0 ** reset_stats_after) + + def __init__(self, watermark, halflife, pollfreq, parentframe): + ChargeProfiler.__init__(self, watermark, parentframe) + self.pollfreq = pollfreq + # self.progress is slightly more than 1.0, and computed so that + # do_profile() will double the change_unit every 'halflife' seconds. + self.progress = 2.0 ** (1.0 / (halflife * pollfreq)) + + def reset(self): + _psyco.statwrite(unit = self.initial_charge_unit, callback = None) + _psyco.statreset() + if logger: + logger.write("%s: resetting stats" % self.__class__.__name__, 1) + + def passive_start(self): + self.passivealarm_args = (time.sleep, (1.0 / self.pollfreq,), + self.do_profile) + self.alarms.append(_psyco.alarm(*self.passivealarm_args)) + + def do_start(self): + tag2bind() + self.init_charges() + self.passive_start() + + def do_profile(self): + _psyco.statcollect() + if logger: + logger.dumpcharges() + nunit = _psyco.statread('unit') * self.progress + if nunit > self.reset_limit: + self.reset() + else: + _psyco.statwrite(unit = nunit, callback = self.charge_callback) + return self.passivealarm_args + + def charge_callback(self, frame, charge): + trytobind(frame.f_code, frame.f_globals) + + +class ActivePassiveProfiler(PassiveProfiler, ActiveProfiler): + + def do_start(self): + self.init_charges() + self.active_start() + self.passive_start() + + def charge_callback(self, frame, charge): + tag(frame.f_code, frame.f_globals) + + + +# +# we register our own version of sys.settrace(), sys.setprofile() +# and thread.start_new_thread(). +# + +def psyco_settrace(*args, **kw): + "This is the Psyco-aware version of sys.settrace()." + result = original_settrace(*args, **kw) + go() + return result + +def psyco_setprofile(*args, **kw): + "This is the Psyco-aware version of sys.setprofile()." + result = original_setprofile(*args, **kw) + go() + return result + +def psyco_thread_stub(callable, args, kw): + _psyco.statcollect() + if kw is None: + return callable(*args) + else: + return callable(*args, **kw) + +def psyco_start_new_thread(callable, args, kw=None): + "This is the Psyco-aware version of thread.start_new_thread()." + return original_start_new_thread(psyco_thread_stub, (callable, args, kw)) + +original_settrace = sys.settrace +original_setprofile = sys.setprofile +original_start_new_thread = thread.start_new_thread +sys.settrace = psyco_settrace +sys.setprofile = psyco_setprofile +if PYTHON_SUPPORT: + thread.start_new_thread = psyco_start_new_thread + # hack to patch threading._start_new_thread if the module is + # already loaded + if (sys.modules.has_key('threading') and + hasattr(sys.modules['threading'], '_start_new_thread')): + sys.modules['threading']._start_new_thread = psyco_start_new_thread diff --git a/nodeboxgl/ext/psyco/src/COPYING.txt b/nodeboxgl/ext/psyco/src/COPYING.txt new file mode 100644 index 0000000..7ae25af --- /dev/null +++ b/nodeboxgl/ext/psyco/src/COPYING.txt @@ -0,0 +1,9 @@ +Psyco is distributed under the MIT License. + +Copyright (c) 2001-2003 Armin Rigo + +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/nodeboxgl/ext/psyco/src/MANIFEST b/nodeboxgl/ext/psyco/src/MANIFEST new file mode 100644 index 0000000..de79f6d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/MANIFEST @@ -0,0 +1,171 @@ +COPYING.txt +MANIFEST +README.txt +c/Makefile +c/Modules/parray.c +c/Modules/pmath.c +c/Modules/ppsyco.c +c/Objects/compactobject.c +c/Objects/compactobject.h +c/Objects/pabstract.c +c/Objects/pabstract.h +c/Objects/pboolobject.c +c/Objects/pboolobject.h +c/Objects/pclassobject.c +c/Objects/pclassobject.h +c/Objects/pcompactobject.c +c/Objects/pcompactobject.h +c/Objects/pdescrobject.c +c/Objects/pdescrobject.h +c/Objects/pdictobject.c +c/Objects/pdictobject.h +c/Objects/pfloatobject.c +c/Objects/pfloatobject.h +c/Objects/pfuncobject.c +c/Objects/pfuncobject.h +c/Objects/pintobject.c +c/Objects/pintobject.h +c/Objects/piterobject.c +c/Objects/piterobject.h +c/Objects/plistobject.c +c/Objects/plistobject.h +c/Objects/plongobject.c +c/Objects/plongobject.h +c/Objects/pmethodobject.c +c/Objects/pmethodobject.h +c/Objects/pobject.c +c/Objects/pobject.h +c/Objects/prangeobject.c +c/Objects/prangeobject.h +c/Objects/pstringobject.c +c/Objects/pstringobject.h +c/Objects/pstructmember.c +c/Objects/pstructmember.h +c/Objects/ptupleobject.c +c/Objects/ptupleobject.h +c/Objects/ptypeobject.c +c/Objects/ptypeobject.h +c/Python/frames.c +c/Python/frames.h +c/Python/pbltinmodule.c +c/Python/pbltinmodule.h +c/Python/pycheader.h +c/Python/pycinternal.h +c/Python/pycompiler.c +c/Python/pycompiler.h +c/Python/pyver.h +c/alarm.c +c/alarm.h +c/blockalloc.h +c/codegen.c +c/codegen.h +c/codemanager.c +c/codemanager.h +c/cstruct.c +c/cstruct.h +c/depend.py +c/dispatcher.c +c/dispatcher.h +c/files.py +c/i386/idispatcher.c +c/i386/idispatcher.h +c/i386/iencoding.c +c/i386/iencoding.h +c/i386/iinitialize.h +c/i386/iprocessor.c +c/i386/ipyencoding.c +c/i386/ipyencoding.h +c/i386/itiming.h +c/initialize.h +c/ivm/idispatcher.c +c/ivm/idispatcher.h +c/ivm/iencoding.c +c/ivm/iencoding.h +c/ivm/iinitialize.h +c/ivm/iprocessor.c +c/ivm/ipyencoding.c +c/ivm/ipyencoding.h +c/ivm/itiming.h +c/ivm/ivm-insns.c +c/ivm/ivm-insns.h +c/ivm/localsetup.py +c/ivm/prolog/Makefile +c/ivm/prolog/ccode.pl +c/ivm/prolog/detcheck.pl +c/ivm/prolog/insns-igen-h.i.default +c/ivm/prolog/insns-igen.i.default +c/ivm/prolog/insns-switch.i.default +c/ivm/prolog/insns-table.py.default +c/ivm/prolog/insns-threaded.i.default +c/ivm/prolog/insns.pl +c/ivm/prolog/insns.py +c/ivm/prolog/insnset.py +c/ivm/prolog/mode_combine.pl.default +c/ivm/prolog/optimize.pl +c/ivm/prolog/samelines.py +c/ivm/prolog/utils.pl +c/ivm/prolog/vm.pl +c/ivm/prolog/vmwriter.pl +c/linuxmemchk.c +c/linuxmemchk.h +c/mergepoints.c +c/mergepoints.h +c/mkincl.py +c/mychecker.py +c/platform.c +c/platform.h +c/processor.h +c/profile.c +c/profile.h +c/psyco.c +c/psyco.h +c/psyfunc.c +c/psyfunc.h +c/pycodegen.h +c/stats.c +c/stats.h +c/timing.h +c/vcompiler.c +c/vcompiler.h +c/versionchecker.py +c/win32/psyco.vcproj +doc/Makefile +doc/README.txt +doc/psycoguide.tex +py-support/__init__.py +py-support/classes.py +py-support/core.py +py-support/kdictproxy.py +py-support/logger.py +py-support/profiler.py +py-support/support.py +py-utils/cvs.py +py-utils/httpxam.py +py-utils/ivmdump.py +py-utils/ivmextract.py +py-utils/ivmoptimize.py +py-utils/manifest.py +py-utils/symbols.py +py-utils/vinfo_dump.py +py-utils/win32/README.TXT +py-utils/xam.py +py-utils/xamsupport.c +setup.py +test/bpnn.py +test/btrun.py +test/classicregrtest.py +test/file1-basetests +test/file2-basetests.uu +test/fulltester.py +test/life-psyco.py +test/life.py +test/pystone-jit.py +test/pystone.py +test/regrtester.py +test/regrtester2.py +test/test1.py +test/test3.py +test/test5.py +test/test_base.py +test/test_compactobject.py +test/test_misc.py diff --git a/nodeboxgl/ext/psyco/src/README.txt b/nodeboxgl/ext/psyco/src/README.txt new file mode 100644 index 0000000..222aa68 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/README.txt @@ -0,0 +1,77 @@ +====================================================================== + Psyco, the Python Specializing Compiler +====================================================================== + + + VERSION 1.5.2+SVN + ----------------- + +Psyco is a Python extension module which can massively speed up the +execution of any Python code. + + +REQUIREMENTS +------------ + +Psyco works on almost any version of Python (currently 2.2.2 +to 2.5). At present it *requires* a *32-bit* *PC* (i.e. a +386-compatible processor), but it is OS-independant. + +This program is still and will always be incomplete, but it +has been stable for a long time and can give good results. + +There are no plans to port Psyco to 64-bit architectures. +This would be rather involved. Psyco is only being +maintained, not further developed. The development efforts of +the author are now focused on PyPy, which will include +Psyco-like techniques. (http://codespeak.net/pypy) + +Psyco requires Python >= 2.2.2. Support for older versions +has been dropped after Psyco 1.5.2. + + +QUICK INTRODUCTION +------------------ + +To install Psyco, do the usual + + python setup.py install + +Manually, you can also put the 'psyco' package in your Python search +path, e.g. by copying the subdirectory 'psyco' into the directory +'/usr/lib/python2.x/site-packages' (default path on Linux). + +Basic usage is very simple: add + + import psyco + psyco.full() + +to the beginning of your main script. For basic introduction see: + + import psyco + help(psyco) + + +DOCUMENTATION AND LATEST VERSIONS +--------------------------------- + +Home page: + + * http://psyco.sourceforge.net + +The current up-to-date documentation is the Ultimate Psyco Guide. +If it was not included in this distribution ("psycoguide.ps" or +"psycoguide/index.html"), see the doc page: + + * http://psyco.sourceforge.net/doc.html + + +DEBUG BUILD +----------- + +To build a version of Psyco that includes debugging checks and/or +debugging output, see comments in setup.py. + + +---------- +Armin Rigo. diff --git a/nodeboxgl/ext/psyco/src/c/Makefile b/nodeboxgl/ext/psyco/src/c/Makefile new file mode 100644 index 0000000..562afd6 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Makefile @@ -0,0 +1,108 @@ + +# G = debug, O = optimized, V = verbose, X = all tests, +# H = heavy mem check +mode = O + +processor = i386 +# processor = ivm + + +# OPTS = -DPSYCO_DEBUG=1 -DBIG_BUFFER_SIZE=0x100000 -DVERBOSE_LEVEL=0 -DCODE_DUMP=1 -DHEAVY_MEM_CHECK=0 +OPTS_G = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 +C_FLAGS_G = -g + +OPTS_O = -DPSYCO_DEBUG=0 -DVERBOSE_LEVEL=0 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=0 +C_FLAGS_O = -O3 + +OPTS_OG = -DPSYCO_DEBUG=0 -DVERBOSE_LEVEL=3 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=0 +C_FLAGS_OG= -O3 -g + +OPTS_FASTG= -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 +C_FLAGS_FASTG= -O3 -g + +OPTS_DG = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DMETA_ASSERT_DEPTH +C_FLAGS_DG = -g + +OPTS_V = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=3 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 +C_FLAGS_V = -g + +OPTS_X = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=2 +C_FLAGS_X = -g + +OPTS_H = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=1 -DCODE_DUMP=1 +C_FLAGS_H = -g + +OPTS_P = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DVERBOSE_STATS=1 +C_FLAGS_P = -g + +OPTS_PP = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=3 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DVERBOSE_STATS=1 +C_FLAGS_PP= -g + +OPTS_M = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DPSYCO_NO_LINKED_LISTS +C_FLAGS_M = -g + +OPTS_T = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 '-DPSYCO_TRACE="psyco.trace"' +C_FLAGS_T = -g + +OPTS_TT = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=3 '-DPSYCO_TRACE="psyco.trace"' + +OPTS_OO = -DPSYCO_DEBUG=0 -DVERBOSE_LEVEL=0 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=0 +C_FLAGS_OO= -DNDEBUG -O3 -Wall -fomit-frame-pointer -mcpu=pentium4 -march=pentium4 -mmmx -msse -mfpmath=sse + + +OPTS = ${OPTS_${mode}} +C_FLAGS = -I${processor} -DNDEBUG ${C_FLAGS_${mode}} -Wall -Wstrict-prototypes -fPIC -fno-strict-aliasing ${OPTS} ${incl} -ansi -Wdeclaration-after-statement -Wundef +LD_FLAGS = -shared +BUILDDIR = ../build +LIBDIR = lib.linux-i686-${PY_VER} +OUTDIR = ${BUILDDIR}/${LIBDIR}/psyco +OUTPUT = ${OUTDIR}/_psyco.so + +ifdef cvs + cvshome = ${HOME}/cvs/2.2 + python = ${cvshome}/dist/src/python +else + python = python +endif + + +PY_VER := $(shell $(python) -c "import sys; print '%d.%d' % sys.version_info[:2]") +PY_VER_EX := $(shell $(python) -V 2>&1) +incl := $(shell $(python) mkincl.py) + +BUILD_VERSION = Compiling mode ${mode} for ${PY_VER_EX} on ${processor} + +main: build_ext build_py + +dyn: ${OUTDIR}/dyn-tag build_py + +build_ext: build_py + @echo ------------------------------------------- + @echo ${BUILD_VERSION} + @echo ------------------------------------------- + gcc ${LD_FLAGS} ${C_FLAGS} -DALL_STATIC=1 psyco.c platform.c -o ${OUTPUT} + echo ${BUILD_VERSION} > ${OUTDIR}/build-version + cd ..; $(python) setup.py install + +build_py: + cd ..; $(python) setup.py build_py + +-include dyn-Makefile + +%.o: %.c + gcc ${C_FLAGS} -DALL_STATIC=0 -c $< -o $@ + +${OUTDIR}/dyn-tag: ${O_FILES} +# -rm ${BUILDDIR}/current + gcc ${LD_FLAGS} $^ -o ${OUTPUT} + echo ${BUILD_VERSION} > ${OUTDIR}/build-version + echo dyn-tag >> ${OUTDIR}/build-version +# ln -s ${LIBDIR} ${BUILDDIR}/current + touch $@ + +clean: + -rm -f ${O_FILES} + +depend: + python files.py + python depend.py ${processor} diff --git a/nodeboxgl/ext/psyco/src/c/Modules/parray.c b/nodeboxgl/ext/psyco/src/c/Modules/parray.c new file mode 100644 index 0000000..4e92787 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Modules/parray.c @@ -0,0 +1,515 @@ +#include "../psyco.h" +#include "../Objects/pabstract.h" +#include "../Objects/pintobject.h" +#include "../Objects/pfloatobject.h" +#include "../Objects/pstringobject.h" +#include "../Objects/ptupleobject.h" + + +/***************************************************************/ + +/* the following two variables are set by the initialization function + to point to private things in arraymodule.c */ +static PyCFunction cimpl_array = NULL; /* ptr to C impl of array.array() */ +static PyTypeObject* arraytype; /* array.ArrayType */ + + +/* declarations copied from arraymodule.c */ +struct arrayobject; /* Forward */ +struct arraydescr { + int typecode; + int itemsize; + PyObject * (*getitem)(struct arrayobject *, int); + int (*setitem)(struct arrayobject *, int, PyObject *); +}; +typedef struct arrayobject { + PyObject_HEAD + int ob_size; + char *ob_item; +#if HAVE_arrayobject_allocated + int allocated; +#endif + struct arraydescr *ob_descr; +} arrayobject; + + +#define ARRAY_ob_item FMUT(DEF_FIELD(arrayobject, char*, ob_item, VAR_size)) +#define ARRAY_ob_descr DEF_FIELD(arrayobject, struct arraydescr*, \ + ob_descr, ARRAY_ob_item) +#define iARRAY_OB_ITEM FIELD_INDEX(ARRAY_ob_item) +#define iARRAY_OB_DESCR FIELD_INDEX(ARRAY_ob_descr) +#define ARRAY_TOTAL FIELDS_TOTAL(ARRAY_ob_descr) + + +/* meta-implementation of some getitem() and setitem() functions. + Our meta-implementations of setitem() are never called with a run-time + index equal to -1; to do the equivalent of the array module's object + type checking, you must call setitem() with a *compile-time* value of -1. */ + +PSY_INLINE vinfo_t* generic_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, + defield_t rdf) +{ + vinfo_t* result; + vinfo_t* ob_item; + + ob_item = psyco_get_field(po, ap, ARRAY_ob_item); + if (ob_item == NULL) + return NULL; + + result = psyco_get_field_array(po, ob_item, rdf, vi); + vinfo_decref(ob_item, po); + return result; +} + +static vinfo_t* integral_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, + defield_t rdf) +{ + vinfo_t* num = generic_getitem(po, ap, vi, rdf); + if (num != NULL) { + return PsycoInt_FROM_LONG(num); + } + else + return NULL; +} + +static vinfo_t* p_c_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) +{ + defield_t rdf = FMUT(UNSIGNED_ARRAY(unsigned char, 0)); + vinfo_t* chr = generic_getitem(po, ap, vi, rdf); + if (chr != NULL) { + vinfo_t* result = PsycoCharacter_New(chr); + vinfo_decref(chr, po); + return result; + } + else + return NULL; +} + +static vinfo_t* p_b_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { + return integral_getitem(po, ap, vi, + FMUT(DEF_ARRAY(signed char, 0))); +} + +static vinfo_t* p_BB_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { + return integral_getitem(po, ap, vi, + FMUT(UNSIGNED_ARRAY(unsigned char, 0))); +} + +static vinfo_t* p_h_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { + return integral_getitem(po, ap, vi, + FMUT(DEF_ARRAY(signed short, 0))); +} + +static vinfo_t* p_HH_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { + return integral_getitem(po, ap, vi, + FMUT(UNSIGNED_ARRAY(unsigned short, 0))); +} + +static vinfo_t* p_l_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { + return integral_getitem(po, ap, vi, + FMUT(DEF_ARRAY(long, 0))); +} + +#if HAVE_FP_FN_CALLS +static vinfo_t* p_f_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) +{ + defield_t rdf = FMUT(DEF_ARRAY(float, 0)); + vinfo_t* fval = generic_getitem(po, ap, vi, rdf); + if (fval != NULL) { + vinfo_t* result = PsycoFloat_FromFloat(po, fval); + vinfo_decref(fval, po); + return result; + } + else + return NULL; +} + +static vinfo_t* p_d_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) +{ + vinfo_t* ob_item; + vinfo_t* fval1; + vinfo_t* fval2; + defield_t rdf = FMUT(DEF_ARRAY(double, 0)); + + ob_item = psyco_get_field(po, ap, ARRAY_ob_item); + if (ob_item == NULL) + return NULL; + + fval1 = psyco_get_field_array(po, ob_item, rdf, vi); + if (fval1 == NULL) { + vinfo_decref(ob_item, po); + return NULL; + } + fval2 = psyco_get_field_array(po, ob_item, FIELD_PART2(rdf), vi); + vinfo_decref(ob_item, po); + if (fval2 == NULL) { + vinfo_decref(fval1, po); + return NULL; + } + + return PsycoFloat_FROM_DOUBLE(fval1, fval2); +} +#else +# define p_f_getitem NULL +# define p_d_getitem NULL +#endif + + +PSY_INLINE bool generic_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, + vinfo_t* value, defield_t rdf) +{ + bool result; + vinfo_t* ob_item; + + ob_item = psyco_get_field(po, ap, ARRAY_ob_item); + if (ob_item == NULL) + return false; + + result = psyco_put_field_array(po, ob_item, rdf, vi, value); + vinfo_decref(ob_item, po); + return result; +} + +static bool integral_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, + vinfo_t* v, long lowbound, long highbound, + defield_t rdf) +{ + bool result; + vinfo_t* value = PsycoInt_AsLong(po, v); + if (value == NULL) { + /* XXX translate TypeError("an integer is required") + into TypeError("array item must be integer") */ + return false; + } + + switch (runtime_in_bounds(po, value, lowbound, highbound)) { + case 0: + /* XXX build the correct error message */ + PycException_SetString(po, PyExc_OverflowError, + "array item is out of bounds"); + result = false; + break; + case 1: + result = generic_setitem(po, ap, vi, value, rdf); + break; + default: + result = false; + break; + } + vinfo_decref(value, po); + return result; +} + +static bool p_c_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) +{ + vinfo_t* value; + if (!PsycoCharacter_Ord(po, v, &value)) + return false; + + if (value != NULL) { + /* 'v' is really a string of size 1 */ + defield_t rdf = FMUT(UNSIGNED_ARRAY(char, 0)); + bool result = generic_setitem(po, ap, vi, value, rdf); + vinfo_decref(value, po); + return result; + } + PycException_SetString(po, PyExc_TypeError, + "array item must be char"); + return false; +} + +static bool p_b_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { + return integral_setitem(po, ap, vi, v, -128, 127, + FMUT(DEF_ARRAY(char, 0))); +} + +static bool p_BB_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { + return integral_setitem(po, ap, vi, v, 0, UCHAR_MAX, + FMUT(UNSIGNED_ARRAY(char, 0))); +} + +static bool p_h_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { + return integral_setitem(po, ap, vi, v, SHRT_MIN, SHRT_MAX, + FMUT(DEF_ARRAY(short, 0))); +} + +static bool p_HH_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { + return integral_setitem(po, ap, vi, v, 0, USHRT_MAX, + FMUT(UNSIGNED_ARRAY(short, 0))); +} + +static bool p_l_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { + return integral_setitem(po, ap, vi, v, LONG_MIN, LONG_MAX, + FMUT(DEF_ARRAY(long, 0))); +} + +#if HAVE_FP_FN_CALLS +#define p_f_setitem NULL +/* +static bool p_f_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { + XXX implement PsycoFloat_AsFloat() XXX +}*/ + +static bool p_d_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { + vinfo_t* w1; + vinfo_t* w2; + bool result; + vinfo_t* ob_item; + defield_t rdf = FMUT(DEF_ARRAY(double, 0)); + + if (!PsycoFloat_AsDouble(po, v, &w1, &w2)) + return false; + + ob_item = psyco_get_field(po, ap, ARRAY_ob_item); + if (ob_item == NULL) + result = false; + else { + result = psyco_put_field_array(po, ob_item, rdf, vi, w1) && + psyco_put_field_array(po, ob_item, FIELD_PART2(rdf), vi, w2); + vinfo_decref(ob_item, po); + } + vinfo_decref(w2, po); + vinfo_decref(w1, po); + return result; +} +#else +# define p_f_setitem NULL +# define p_d_setitem NULL +#endif + + +/* list of meta-implementations of descriptor-specific getitem() and setitem() */ +struct metadescr_s { + int typecode; + vinfo_t* (*meta_getitem) (PsycoObject*, vinfo_t*, vinfo_t*); + bool (*meta_setitem) (PsycoObject*, vinfo_t*, vinfo_t*, vinfo_t*); + struct arraydescr* base; +}; + +static struct metadescr_s metadescriptors[] = { + {'c', p_c_getitem, p_c_setitem}, + {'b', p_b_getitem, p_b_setitem}, + {'B', p_BB_getitem, p_BB_setitem}, +#ifdef Py_USING_UNICODE + /* XXX */ +#endif + {'h', p_h_getitem, p_h_setitem}, + {'H', p_HH_getitem, p_HH_setitem}, +#if SIZEOF_INT==SIZEOF_LONG +# define p_i_getitem p_l_getitem +# define p_i_setitem p_l_setitem + {'i', p_i_getitem, p_i_setitem}, + /*# define p_II_getitem p_l_getitem + # define p_II_setitem p_l_setitem + {'I', p_II_getitem, p_II_setitem},*/ +#endif + {'l', p_l_getitem, p_l_setitem}, + /*#define p_LL_getitem p_l_getitem + #define p_LL_setitem p_l_setitem + {'L', p_LL_getitem, p_LL_setitem},*/ + {'f', p_f_getitem, p_f_setitem}, + {'d', p_d_getitem, p_d_setitem}, + {'\0', NULL, NULL} /* Sentinel */ +}; + + +/* meta-implementation of array_item */ +static vinfo_t* parray_item(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) +{ + condition_code_t cc; + vinfo_t* vlen; + struct arraydescr* d; + long dlong; + + /* get the ob_descr field of 'ap' and promote it to compile-time */ + vinfo_t* vdescr = psyco_get_const(po, ap, ARRAY_ob_descr); + if (vdescr == NULL) + return NULL; + dlong = psyco_atcompiletime(po, vdescr); + if (dlong == -1) { + /* a pointer cannot be -1, so we know it must be an exception */ + extra_assert(PycException_Occurred(po)); + return NULL; + } + d = (struct arraydescr*) dlong; + + /* check that the index is within range */ + vlen = psyco_get_field(po, ap, VAR_size); + if (vlen == NULL) + return NULL; + + cc = integer_cmp(po, vi, vlen, Py_GE|COMPARE_UNSIGNED); + vinfo_decref(vlen, po); + if (cc == CC_ERROR) + return NULL; + + if (runtime_condition_f(po, cc)) { + PycException_SetString(po, PyExc_IndexError, + "array index out of range"); + return NULL; + } + + /* call the item getter or its meta-implementation */ + return Psyco_META2(po, d->getitem, CfReturnRef|CfPyErrIfNull, + "vv", ap, vi); +} + +static bool parray_ass_item(PsycoObject* po, vinfo_t* ap, vinfo_t* vi,vinfo_t* v) +{ + vinfo_t* vdescr; + condition_code_t cc; + vinfo_t* vlen; + struct arraydescr* d; + long dlong; + + if (v == NULL) { + /* XXX implement item deletion */ + return psyco_generic_call(po, arraytype->tp_as_sequence-> + sq_ass_item, + CfNoReturnValue|CfPyErrIfNonNull, + "vvl", ap, vi, (long) NULL) != NULL; + } + + /* get the ob_descr field of 'ap' and promote it to compile-time */ + vdescr = psyco_get_const(po, ap, ARRAY_ob_descr); + if (vdescr == NULL) + return false; + dlong = psyco_atcompiletime(po, vdescr); + if (dlong == -1) { + /* a pointer cannot be -1, so we know it must be an exception */ + extra_assert(PycException_Occurred(po)); + return false; + } + d = (struct arraydescr*) dlong; + + /* check that the index is within range */ + vlen = psyco_get_field(po, ap, VAR_size); + if (vlen == NULL) + return false; + + cc = integer_cmp(po, vi, vlen, Py_GE|COMPARE_UNSIGNED); + vinfo_decref(vlen, po); + if (cc == CC_ERROR) + return false; + + if (runtime_condition_f(po, cc)) { + PycException_SetString(po, PyExc_IndexError, + "array assignment index out of range"); + return false; + } + + /* call the item setter or its meta-implementation */ + return Psyco_META3(po, d->setitem, CfNoReturnValue|CfPyErrIfNonNull, + "vvv", ap, vi, v) != NULL; +} + + +/* array creation: we know the result is of type ArrayType. */ +DEF_KNOWN_RET_TYPE_2(pa_array, cimpl_array, CfReturnRef|CfPyErrIfNull, arraytype) + +static vinfo_t* parray_new(PsycoObject* po, PyTypeObject* type, + vinfo_t* varg, vinfo_t* vkw) +{ + /* In this version we also decode a constant-time + description character. */ + vinfo_t* result = psyco_generic_call(po, arraytype->tp_new, + CfReturnRef|CfPyErrIfNull, + "lvv", type, varg, vkw); + if (result != NULL) { + vinfo_t* firstarg; + PyObject* a; + struct metadescr_s* descr; + char code; + + if (PsycoTuple_Load(varg) < 1) goto cannot_decode; + firstarg = PsycoTuple_GET_ITEM(varg, 0); + if (!is_compiletime(firstarg->source)) goto cannot_decode; + + a = (PyObject*) CompileTime_Get(firstarg->source)->value; + if (!PyString_Check(a) || PyString_GET_SIZE(a) != 1) + goto cannot_decode; + + code = *PyString_AS_STRING(a); + for (descr=metadescriptors; descr->typecode!=0; descr++) { + if (descr->typecode == code) { + if (descr->base != NULL) { + psyco_assert_field(po, result, + ARRAY_ob_descr, + (long) descr->base); + } + break; + } + } + + cannot_decode: + Psyco_AssertType(po, result, type); + } + return result; +} + +/***************************************************************/ + + +INITIALIZATIONFN +void psyco_initarray(void) +{ + PyObject* md = Psyco_DefineMetaModule("array"); + PyObject* arrayobj; + struct metadescr_s* descr; + PySequenceMethods* m; + PyMappingMethods *mm; + + if (md == NULL) + return; + + /* get array.array and array.ArrayType */ + arrayobj = Psyco_GetModuleObject(md, "array", NULL); + arraytype = (PyTypeObject*) + Psyco_GetModuleObject(md, "ArrayType", &PyType_Type); + + /* bail out if not found */ + if (arrayobj == NULL || arraytype == NULL) { + Py_DECREF(md); + return; + } + + m = arraytype->tp_as_sequence; + Psyco_DefineMeta(m->sq_length, psyco_generic_mut_ob_size); + Psyco_DefineMeta(m->sq_item, parray_item); + Psyco_DefineMeta(m->sq_ass_item, parray_ass_item); + + mm = arraytype->tp_as_mapping; + if (mm) { /* Python >= 2.3 */ + Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); + Psyco_DefineMeta(mm->mp_ass_subscript, + psyco_generic_ass_subscript); + } + + /* map array.array() to its meta-implementation pa_array() */ + cimpl_array = Psyco_DefineModuleC(md, "array", METH_VARARGS, + &pa_array, &parray_new); + + for (descr=metadescriptors; descr->typecode!=0; descr++) { + /* There seem to be no better way to get Python's + original array descriptors than to create dummy + arrays */ + PyObject* array = PyObject_CallFunction(arrayobj, "c", + (char) descr->typecode); + if (!array) { + PyErr_Clear(); + debug_printf(1, ("init: cannot create an array of " + "typecode '%c'\n", + (char)descr->typecode)); + } + else { + struct arraydescr* d = ((arrayobject*) array)->ob_descr; + if (descr->meta_getitem) + Psyco_DefineMeta(d->getitem,descr->meta_getitem); + if (descr->meta_setitem) + Psyco_DefineMeta(d->setitem,descr->meta_setitem); + descr->base = d; + Py_DECREF(array); + } + } + Py_DECREF(md); +} diff --git a/nodeboxgl/ext/psyco/src/c/Modules/pmath.c b/nodeboxgl/ext/psyco/src/c/Modules/pmath.c new file mode 100644 index 0000000..64fe503 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Modules/pmath.c @@ -0,0 +1,200 @@ +/* + * Psyco version of python math module, mathmodule.c + * + * TODO: + * - raise python exceptions on math errors (domain error etc) + * - implement: + * - frexp() + * - ldexp() + * - log() + * - log10() + * - modf() + */ + +#include "../initialize.h" +#if HAVE_FP_FN_CALLS /* disable float optimizations if functions with + float/double arguments are not implemented + in the back-end */ + +#ifndef _MSC_VER +#ifndef __STDC__ +extern double fmod (double, double); +extern double frexp (double, int *); +extern double ldexp (double, int); +extern double modf (double, double *); +#endif /* __STDC__ */ +#endif /* _MSC_VER */ + + +#include + +#define CIMPL_MATH_FUNC1(funcname, func, libfunc) \ + static int cimpl_math_##func(double a, double* result) { \ + errno = 0; \ + PyFPE_START_PROTECT(funcname, return -1) \ + *result = libfunc(a); \ + PyFPE_END_PROTECT(*result); \ + return 0; \ + } + +#define CIMPL_MATH_FUNC2(funcname, func, libfunc) \ + static int cimpl_math_##func(double a, double b, double* result) { \ + errno = 0; \ + PyFPE_START_PROTECT(funcname, return -1) \ + *result = libfunc(a,b); \ + PyFPE_END_PROTECT(*result); \ + return 0; \ + } + +/* + * This is almost but not quite the same as the + * version in pfloatobject.c. The error handling + * on invalid args is different + */ +#define PMATH_CONVERT_TO_DOUBLE(vobj, v1, v2, ERRORACTION) \ + switch (psyco_convert_to_double(po, vobj, &v1, &v2)) { \ + case true: \ + break; /* fine */ \ + case false: \ + ERRORACTION; /* error or promotion */ \ + default: \ + PycException_SetString(po, PyExc_TypeError, \ + "bad argument type for built-in operation"); \ + ERRORACTION; \ + } + +#define PMATH_RELEASE_DOUBLE(v1, v2) \ + vinfo_decref(v2, po); \ + vinfo_decref(v1, po); + +#define PMATH_FUNC1(funcname, func ) \ + static PyCFunction fallback_##func; \ + static vinfo_t* pmath_##func(PsycoObject* po, vinfo_t* vself, vinfo_t* varg) { \ + vinfo_t *a1, *a2, *x; \ + vinfo_array_t* result; \ + vinfo_t *v; \ + int tuplesize = PsycoTuple_Load(varg); \ + if (tuplesize != 1){ /* wrong or unknown number of arguments */ \ + return psyco_generic_call(po, fallback_##func, \ + CfReturnRef|CfPyErrIfNull, \ + "lv", NULL, varg); \ + } \ + v = PsycoTuple_GET_ITEM(varg, 0); \ + PMATH_CONVERT_TO_DOUBLE(v,a1,a2,return NULL); \ + result = array_new(2); \ + x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ + "vva",a1,a2,result); \ + PMATH_RELEASE_DOUBLE(a1,a2); \ + if (x != NULL) \ + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); \ + array_release(result); \ + return x; \ + } + + +#define PMATH_FUNC2(funcname, func ) \ + static PyCFunction fallback_##func; \ + static vinfo_t* pmath_##func(PsycoObject* po, vinfo_t* vself, vinfo_t* varg) { \ + vinfo_t *a1, *a2, *b1, *b2, *x; \ + vinfo_array_t* result; \ + vinfo_t *v1, *v2; \ + int tuplesize = PsycoTuple_Load(varg); \ + if (tuplesize != 2){ /* wrong or unknown number of arguments */ \ + return psyco_generic_call(po, fallback_##func, \ + CfReturnRef|CfPyErrIfNull, \ + "lv", NULL, varg); \ + } \ + v1 = PsycoTuple_GET_ITEM(varg, 0); \ + v2 = PsycoTuple_GET_ITEM(varg, 1); \ + PMATH_CONVERT_TO_DOUBLE(v1,a1,a2,return NULL); \ + PMATH_CONVERT_TO_DOUBLE(v2,b1,b2,goto cleanup); \ + result = array_new(2); \ + x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ + "vvvva",a1,a2,b1,b2,result); \ + PMATH_RELEASE_DOUBLE(a1,a2); \ + PMATH_RELEASE_DOUBLE(b1,b2); \ + if (x != NULL) \ + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); \ + array_release(result); \ + return x; \ + cleanup:\ + PMATH_RELEASE_DOUBLE(a1,a2); \ + return NULL; \ + } + +/* the functions cimpl_math_sin() etc */ +CIMPL_MATH_FUNC1("acos", acos, acos) +CIMPL_MATH_FUNC1("asin", asin, asin) +CIMPL_MATH_FUNC1("atan", atan, atan) +CIMPL_MATH_FUNC2("atan2", atan2, atan2) +CIMPL_MATH_FUNC1("ceil", ceil, ceil) +CIMPL_MATH_FUNC1("cos", cos, cos) +CIMPL_MATH_FUNC1("cosh", cosh, cosh) +CIMPL_MATH_FUNC1("exp", exp, exp) +CIMPL_MATH_FUNC1("fabs", fabs, fabs) +CIMPL_MATH_FUNC1("floor", floor, floor) +CIMPL_MATH_FUNC2("fmod", fmod, fmod) +CIMPL_MATH_FUNC2("hypot", hypot, hypot) +/*CIMPL_MATH_FUNC2("power", power, pow)*/ +CIMPL_MATH_FUNC2("pow", pow, pow) +CIMPL_MATH_FUNC1("sin", sin, sin) +CIMPL_MATH_FUNC1("sinh", sinh, sinh) +CIMPL_MATH_FUNC1("sqrt", sqrt, sqrt) +CIMPL_MATH_FUNC1("tan", tan, tan) +CIMPL_MATH_FUNC1("tanh", tanh, tanh) + +/* the functions pmath_sin() etc */ +PMATH_FUNC1("acos", acos) +PMATH_FUNC1("asin", asin) +PMATH_FUNC1("atan", atan) +PMATH_FUNC2("atan2", atan2) +PMATH_FUNC1("ceil", ceil) +PMATH_FUNC1("cos", cos) +PMATH_FUNC1("cosh", cosh) +PMATH_FUNC1("exp", exp) +PMATH_FUNC1("fabs", fabs) +PMATH_FUNC1("floor", floor) +PMATH_FUNC2("fmod", fmod) +PMATH_FUNC2("hypot", hypot) +/*PMATH_FUNC2("power", power)*/ +PMATH_FUNC2("pow", pow) +PMATH_FUNC1("sin", sin) +PMATH_FUNC1("sinh", sinh) +PMATH_FUNC1("sqrt", sqrt) +PMATH_FUNC1("tan", tan) +PMATH_FUNC1("tanh", tanh) + +INITIALIZATIONFN +void psyco_initmath(void) +{ + PyObject* md = Psyco_DefineMetaModule("math"); + + fallback_acos = Psyco_DefineModuleFn(md, "acos", METH_VARARGS, pmath_acos); + fallback_asin = Psyco_DefineModuleFn(md, "asin", METH_VARARGS, pmath_asin); + fallback_atan = Psyco_DefineModuleFn(md, "atan", METH_VARARGS, pmath_atan); + fallback_atan2= Psyco_DefineModuleFn(md, "atan2",METH_VARARGS, pmath_atan2); + fallback_ceil = Psyco_DefineModuleFn(md, "ceil", METH_VARARGS, pmath_ceil); + fallback_cos = Psyco_DefineModuleFn(md, "cos", METH_VARARGS, pmath_cos); + fallback_cosh = Psyco_DefineModuleFn(md, "cosh", METH_VARARGS, pmath_cosh); + fallback_exp = Psyco_DefineModuleFn(md, "exp", METH_VARARGS, pmath_exp); + fallback_fabs = Psyco_DefineModuleFn(md, "fabs", METH_VARARGS, pmath_fabs); + fallback_floor= Psyco_DefineModuleFn(md, "floor",METH_VARARGS, pmath_floor); + fallback_fmod = Psyco_DefineModuleFn(md, "fmod", METH_VARARGS, pmath_fmod); + fallback_hypot= Psyco_DefineModuleFn(md, "hypot",METH_VARARGS, pmath_hypot); + /*Psyco_DefineModuleFn(md, "power", METH_VARARGS, pmath_power);*/ + fallback_pow = Psyco_DefineModuleFn(md, "pow", METH_VARARGS, pmath_pow); + fallback_sin = Psyco_DefineModuleFn(md, "sin", METH_VARARGS, pmath_sin); + fallback_sinh = Psyco_DefineModuleFn(md, "sinh", METH_VARARGS, pmath_sinh); + fallback_sqrt = Psyco_DefineModuleFn(md, "sqrt", METH_VARARGS, pmath_sqrt); + fallback_tan = Psyco_DefineModuleFn(md, "tan", METH_VARARGS, pmath_tan); + fallback_tanh = Psyco_DefineModuleFn(md, "tanh", METH_VARARGS, pmath_tanh); + + Py_XDECREF(md); +} + +#else /* !HAVE_FP_FN_CALLS */ +INITIALIZATIONFN +void psyco_initmath(void) +{ +} +#endif /* !HAVE_FP_FN_CALLS */ diff --git a/nodeboxgl/ext/psyco/src/c/Modules/ppsyco.c b/nodeboxgl/ext/psyco/src/c/Modules/ppsyco.c new file mode 100644 index 0000000..55d3a8d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Modules/ppsyco.c @@ -0,0 +1,247 @@ +#include "../psyco.h" +#include "../mergepoints.h" +#include "../Objects/ptupleobject.h" +#include "../Objects/pdictobject.h" + + +static PyCFunction cimpl_globals; +static PyCFunction cimpl_eval; +static PyCFunction cimpl_execfile; +static PyCFunction cimpl_locals; +static PyCFunction cimpl_vars; +static PyCFunction cimpl_dir; +static PyCFunction cimpl_input; + +/***************************************************************/ + /*** Psyco meta-version of functions accessing the locals ***/ + +PSY_INLINE bool psyco_fast_locals_ok(PsycoObject* po) +{ + return !(psyco_mp_flags(po->pr.merge_points) & MP_FLAGS_CONTROLFLOW); +} + +static vinfo_t* psyco_fast_to_locals(PsycoObject* po) +{ + int j; + PyObject* map; + PyCodeObject* co = po->pr.co; + vinfo_t* vlocals = PsycoDict_New(po); + if (vlocals == NULL) + return NULL; + + map = co->co_varnames; + if (!PyTuple_Check(map)) + return vlocals; + j = PyTuple_GET_SIZE(map); + if (j > co->co_nlocals) + j = co->co_nlocals; + + while (--j >= 0) { + PyObject *key = PyTuple_GET_ITEM(map, j); + vinfo_t* vvalue = LOC_LOCALS_PLUS[j]; + /* a local variable can only be unbound if its + value is known to be (PyObject*)NULL. A run-time + or virtual value is always non-NULL. */ + if (!psyco_knowntobe(vvalue, 0)) { + if (!PsycoDict_SetItem(po, vlocals, key, vvalue)) { + vinfo_decref(vlocals, po); + return NULL; + } + } + } + return vlocals; +} + +static PyObject* fast_to_locals_keys(PsycoObject* po) +{ + int j; + PyObject* map; + PyCodeObject* co = po->pr.co; + PyObject* keys = PyList_New(0); + if (keys == NULL) + return NULL; + + map = co->co_varnames; + if (!PyTuple_Check(map)) + return keys; + j = PyTuple_GET_SIZE(map); + if (j > co->co_nlocals) + j = co->co_nlocals; + + while (--j >= 0) { + PyObject *key = PyTuple_GET_ITEM(map, j); + vinfo_t* vvalue = LOC_LOCALS_PLUS[j]; + /* a local variable can only be unbound if its + value is known to be (PyObject*)NULL. A run-time + or virtual value is always non-NULL. */ + if (!psyco_knowntobe(vvalue, 0)) { + if (PyList_Append(keys, key) < 0) { + Py_DECREF(keys); + return NULL; + } + } + } + if (PyList_Sort(keys) < 0) { + Py_DECREF(keys); + return NULL; + } + return keys; +} + +static vinfo_t* pget_cpsyco_obj(char* name) +{ + PyObject* d = PyModule_GetDict(CPsycoModule); + PyObject* result = PyDict_GetItemString(d, name); + if (result == NULL) + return NULL; + else + return vinfo_new(CompileTime_New((long) result)); +} + +static vinfo_t* ppsyco_globals(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + if (PsycoTuple_Load(vargs) == 0) { + vinfo_t* vglobals = LOC_GLOBALS; + vinfo_incref(vglobals); + return vglobals; + } + return psyco_generic_call(po, cimpl_globals, + CfReturnRef|CfPyErrIfNull, + "vv", vself, vargs); +} + +static vinfo_t* pbuiltinevaluator(PsycoObject* po, vinfo_t* vargs, + char* original_name, PyCFunction cimpl) +{ + vinfo_t* vfn; + vinfo_t* var; + vinfo_t* vkw; + vinfo_t* vresult = NULL; + vinfo_t* args[3]; + + if (!psyco_fast_locals_ok(po) || PsycoTuple_Load(vargs) != 1) + goto fallback; + + vfn = pget_cpsyco_obj(original_name); + if (vfn == NULL) + goto fallback; + + args[0] = PsycoTuple_GET_ITEM(vargs, 0); + args[1] = LOC_GLOBALS; + args[2] = psyco_fast_to_locals(po); + if (args[2] == NULL) + goto error; + + var = PsycoTuple_New(3, args); + vkw = psyco_vi_Zero(); + vresult = PsycoObject_Call(po, vfn, var, vkw); + vinfo_decref(vkw, po); + vinfo_decref(var, po); + vinfo_decref(args[2], po); + error: + vinfo_decref(vfn, po); + return vresult; + + fallback: + return psyco_generic_call(po, cimpl, CfReturnRef|CfPyErrIfNull, + "lv", (long) NULL, vargs); +} + +static vinfo_t* ppsyco_eval(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + return pbuiltinevaluator(po, vargs, "original_eval", cimpl_eval); +} + +static vinfo_t* ppsyco_execfile(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + return pbuiltinevaluator(po, vargs, "original_execfile", cimpl_execfile); +} + +static vinfo_t* ppsyco_locals(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + if (psyco_fast_locals_ok(po) && PsycoTuple_Load(vargs) == 0) { + return psyco_fast_to_locals(po); + } + return psyco_generic_call(po, cimpl_locals, + CfReturnRef|CfPyErrIfNull, + "vv", vself, vargs); +} + +static vinfo_t* ppsyco_vars(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + if (psyco_fast_locals_ok(po) && PsycoTuple_Load(vargs) == 0) { + return psyco_fast_to_locals(po); + } + return psyco_generic_call(po, cimpl_vars, + CfReturnRef|CfPyErrIfNull, + "vv", vself, vargs); +} + +static vinfo_t* ppsyco_dir(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + if (psyco_fast_locals_ok(po) && PsycoTuple_Load(vargs) == 0) { + PyObject* keys = fast_to_locals_keys(po); + if (keys == NULL) { + psyco_virtualize_exception(po); + return NULL; + } + return vinfo_new(CompileTime_NewSk(sk_new((long) keys, + SkFlagPyObj))); + } + return psyco_generic_call(po, cimpl_dir, + CfReturnRef|CfPyErrIfNull, + "vv", vself, vargs); +} + +static vinfo_t* ppsyco_input(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + vinfo_t* vfn; + vinfo_t* vkw; + vinfo_t* vcmd; + vinfo_t* vresult; + + vfn = pget_cpsyco_obj("original_raw_input"); + if (vfn == NULL) + goto fallback; + + vkw = psyco_vi_Zero(); + vcmd = PsycoObject_Call(po, vfn, vargs, vkw); + vinfo_decref(vkw, po); + vinfo_decref(vfn, po); + if (vcmd == NULL) + return NULL; + + vargs = PsycoTuple_New(1, &vcmd); + vresult = ppsyco_eval(po, NULL, vargs); + vinfo_decref(vargs, po); + vinfo_decref(vcmd, po); + return vresult; + + fallback: + return psyco_generic_call(po, cimpl_input, + CfReturnRef|CfPyErrIfNull, + "vv", vself, vargs); +} + +/***************************************************************/ + + +INITIALIZATIONFN +void psyco_initpsyco(void) +{ + PyObject* md = CPsycoModule; + +#define DEFMETA(name) \ + cimpl_ ## name = Psyco_DefineModuleFn(md, #name, METH_VARARGS, \ + &ppsyco_ ## name) + + DEFMETA( globals ); + DEFMETA( eval ); + DEFMETA( execfile ); + DEFMETA( locals ); + DEFMETA( vars ); + DEFMETA( dir ); + DEFMETA( input ); + +#undef DEFMETA +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/compactobject.c b/nodeboxgl/ext/psyco/src/c/Objects/compactobject.c new file mode 100644 index 0000000..f2c5d42 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/compactobject.c @@ -0,0 +1,1033 @@ +#include "compactobject.h" +#include "../blockalloc.h" +#include "../dispatcher.h" +#include "../Python/pycompiler.h" +#include "pintobject.h" + + +#define DEBUG_K_IMPL 0 + + +BLOCKALLOC_STATIC(kimpl, compact_impl_t, 4096) + + +static compact_impl_t k_empty_impl = { + NULL, /* attrname */ + NULL, /* vattr */ + 0, /* datasize */ + NULL, /* extensions */ + NULL, /* next */ + NULL, /* parent */ +}; + +/*****************************************************************/ + +#if DEBUG_K_IMPL + +static void debug_k_impl(compact_impl_t* p) +{ + int smin, smax; + compact_impl_t *q, *lim; + fprintf(stderr, "\t$ "); + lim = &k_empty_impl; + while (p != lim) { + for (q=p; q->parent != lim; q = q->parent) + ; + fprintf(stderr, " %s", PyString_AsString(q->attrname)); + smin = p->datasize; + smax = 0; + k_attribute_range(q->vattr, &smin, &smax); + if (smin < smax) + fprintf(stderr, "(%d-%d)", smin, smax); + else + fprintf(stderr, "(void)"); + lim = q; + } + fprintf(stderr, ".\n"); +} + +#else /* !DEBUG_K_IMPL */ +# define debug_k_impl(p) /* nothing */ +#endif + +/*****************************************************************/ + +/* static int */ +/* compact_init(PyObject *self, PyObject *args, PyObject *kwds) */ +/* { */ +/* return 0; */ +/* } */ + +static newfunc object_new; + +static PyObject * +compact_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyObject* ko = object_new(type, args, kwds); + if (ko != NULL) { + ((PyCompactObject*) ko)->k_impl = &k_empty_impl; + } + return ko; +} + +#if 0 +DEFINEFN +PyObject* PyCompact_New(void) +{ + PyCompactObject* o = PyObject_GC_New(PyCompactObject, &PyCompact_Type); + if (o != NULL) { + o->k_impl = &k_empty_impl; + o->k_data = NULL; + PyObject_GC_Track(o); + } + return (PyObject*) o; +} +#endif + +static bool k_same_vinfo(vinfo_t* a, vinfo_t* b) +{ + if (a->source != b->source) { + if (is_compiletime(a->source) && is_compiletime(b->source)) + return (CompileTime_Get(a->source)->value == + CompileTime_Get(b->source)->value); + else + return false; + } + if (a->array != b->array) { + int i = a->array->count; + if (i != b->array->count) + return false; + while (--i >= 0) { + if (a->array->items[i] == b->array->items[i]) + continue; + if (a->array->items[i] == NULL || + b->array->items[i] == NULL) + return false; + if (!k_same_vinfo(a->array->items[i], + b->array->items[i])) + return false; + } + } + return true; +} + +static int k_fix_run_time_vars(vinfo_t* a, int datasize) +{ + if (is_runtime(a->source)) { + bool ref = has_rtref(a->source); + int sindex = datasize; + datasize += sizeof(long); + extra_assert(sizeof(long) == sizeof(PyObject*)); + a->source = RunTime_NewStack(sindex, ref, false); + } + if (a->array != NullArray) { + int i, n = a->array->count; + for (i=0; iarray->items[i] != NULL) + datasize = k_fix_run_time_vars( + a->array->items[i], datasize); + } + } + return datasize; +} + +DEFINEFN +compact_impl_t* k_extend_impl(compact_impl_t* oldimpl, PyObject* attr, + vinfo_t* v) +{ + int datasize; + compact_impl_t* p; + extra_assert(PyString_CheckExact(attr) && PyString_CHECK_INTERNED(attr)); + + /* enumerate the run-time entries */ + datasize = k_fix_run_time_vars(v, oldimpl->datasize); + + /* look for a matching existing extension of oldimpl */ + for (p = oldimpl->extensions; p != NULL; p = p->next) { + if (p->attrname == attr && p->datasize == datasize && + k_same_vinfo(v, p->vattr)) + return p; + } + + /* build a new impl */ + p = psyco_llalloc_kimpl(); + p->attrname = attr; + Py_INCREF(attr); + p->vattr = v; + vinfo_incref(v); + p->datasize = datasize; + p->extensions = NULL; + p->next = oldimpl->extensions; + oldimpl->extensions = p; + p->parent = oldimpl; + debug_k_impl(p); + return p; +} + +#if PSYCO_DEBUG +static int k_check_extension(compact_impl_t* impl1, compact_impl_t* impl2) +{ + while (impl1 != impl2) { + impl1 = impl1->parent; + if (impl1 == NULL) + return false; + } + return true; +} +#endif + +static int k_extend(PyCompactObject* ko, compact_impl_t* nimpl) +{ + char* ndata; + extra_assert(k_check_extension(nimpl, ko->k_impl)); + if (nimpl->datasize > K_ROUNDUP(ko->k_impl->datasize)) { + ndata = ko->k_data; + ndata = (char*) PyMem_Realloc(ndata, + K_ROUNDUP(nimpl->datasize)); + if (ndata == NULL) { + PyErr_NoMemory(); + return -1; + } + ko->k_data = ndata; + } + ko->k_impl = nimpl; + return 0; +} + +DEFINEFN +vinfo_t* vinfo_copy_no_share(vinfo_t* vi) +{ + vinfo_t* result = vinfo_new_skref(vi->source); + if (vi->array != NullArray) { + int i = vi->array->count; + vinfo_array_grow(result, i); + while (--i >= 0) { + if (vi->array->items[i] != NULL) + result->array->items[i] = + vinfo_copy_no_share(vi->array->items[i]); + } + } + return result; +} + + +/*****************************************************************/ + +/* decref all PyObjects found in the CompactObject */ +static void k_decref_objects(vinfo_t* a, char* data) +{ + if (has_rtref(a->source)) { + int sindex = getstack(a->source); + PyObject* o = *(PyObject**)(data+sindex); + Py_DECREF(o); + } + if (a->array != NullArray) { + int i = a->array->count; + while (--i >= 0) { + if (a->array->items[i] != NULL) + k_decref_objects(a->array->items[i], data); + } + } +} + +static void compact_dealloc(PyCompactObject* ko) +{ + compact_impl_t* impl = ko->k_impl; + while (impl->vattr != NULL) { + k_decref_objects(impl->vattr, ko->k_data); + impl = impl->parent; + } + PyMem_Free(ko->k_data); + ko->ob_type->tp_free((PyObject*) ko); +} + +static int k_traverse_objects(vinfo_t* a, char* data, + visitproc visit, void* arg) +{ + int err; + if (has_rtref(a->source)) { /* run-time && with reference */ + int sindex = getstack(a->source); + PyObject* o = *(PyObject**)(data+sindex); + err = visit(o, arg); + if (err) + return err; + } + if (a->array != NullArray) { + int i = a->array->count; + while (--i >= 0) { + if (a->array->items[i] != NULL) { + err = k_traverse_objects(a->array->items[i], + data, visit, arg); + if (err) + return err; + } + } + } + return 0; +} + +static int compact_traverse(PyCompactObject* ko, visitproc visit, void* arg) +{ + int err; + compact_impl_t* impl = ko->k_impl; + while (impl->vattr != NULL) { + err = k_traverse_objects(impl->vattr, ko->k_data, visit, arg); + if (err) + return err; + impl = impl->parent; + } + return 0; +} + +static int compact_clear(PyCompactObject* ko) +{ + compact_impl_t* impl = ko->k_impl; + char* data = ko->k_data; + ko->k_impl = &k_empty_impl; + ko->k_data = NULL; + while (impl->vattr != NULL) { + k_decref_objects(impl->vattr, data); + impl = impl->parent; + } + PyMem_Free(data); + return 0; +} + + +/*****************************************************************/ + +static PyObject* compact_getattro(PyCompactObject* ko, PyObject* attr) +{ + PyTypeObject* tp = ko->ob_type; + PyObject* descr; + descrgetfunc f = NULL; + compact_impl_t* impl = ko->k_impl; + PyObject* o; + + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) + return NULL; + } + + Py_INCREF(attr); + K_INTERN(attr); + + /* Special code for data descriptors first, as in + PyObject_GenericGetAttr() */ + descr = _PyType_Lookup(tp, attr); + if (descr != NULL) { + Py_INCREF(descr); + if (PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { + f = descr->ob_type->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + o = f(descr, (PyObject*) ko, (PyObject*) tp); + Py_DECREF(descr); + goto done; + } + } + } + + /* Read data out of the compact memory buffer */ + while (impl->attrname != NULL) { + if (impl->attrname == attr) { + o = direct_xobj_vinfo(impl->vattr, ko->k_data); + if (o != NULL || PyErr_Occurred()) { + Py_XDECREF(descr); + goto done; + } + } + impl = impl->parent; + } + + /* The end of PyObject_GenericGetAttr() */ + if (f != NULL) { + o = f(descr, (PyObject*) ko, (PyObject*) tp); + Py_DECREF(descr); + goto done; + } + + if (descr != NULL) { + o = descr; + /* descr was already increfed above */ + goto done; + } + + o = NULL; + PyErr_Format(PyExc_AttributeError, + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(attr)); + done: + Py_DECREF(attr); + return o; +} + +DEFINEFN +bool k_match_vinfo(vinfo_t* vnew, vinfo_t* vexisting) +{ + if (vnew == NULL) + return vexisting == NULL; + if (vexisting == NULL) + return false; + switch (gettime(vnew->source)) { + + case RunTime: + if (!is_runtime(vexisting->source)) + return false; + break; + + case CompileTime: + if (!is_compiletime(vexisting->source)) + return false; + return CompileTime_Get(vnew->source)->value == + CompileTime_Get(vexisting->source)->value; + + case VirtualTime: + if (vexisting->source != vnew->source) + return false; + break; + } + if (vnew->array != vexisting->array) { + int i, n = vexisting->array->count; + if (n != vnew->array->count) + return false; + for (i=0; iarray->items[i], + vexisting->array->items[i])) + return false; + } + } + return true; +} + +static char* k_store_vinfo(vinfo_t* v, char* target, char* source) +{ + if (is_runtime(v->source)) { + int sindex = getstack(v->source); + if (has_rtref(v->source)) { + PyObject* o = *(PyObject**) source; + source += sizeof(PyObject*); + *(PyObject**)(target+sindex) = o; + Py_INCREF(o); + } + else { + long l = *(long*) source; + source += sizeof(long); + *(long*)(target+sindex) = l; + } + } + if (v->array != NullArray) { + int i, n = v->array->count; + for (i=0; iarray->items[i] != NULL) + source = k_store_vinfo(v->array->items[i], + target, source); + } + } + return source; +} + +DEFINEFN +void k_attribute_range(vinfo_t* v, int* smin, int* smax) +{ + /* XXX Assumes that the data for an attr is stored consecutively */ + if (is_runtime(v->source)) { + int sindex = getstack(v->source); + if (*smin > sindex) + *smin = sindex; + sindex += sizeof(PyObject*); + extra_assert(sizeof(PyObject*) == sizeof(long)); + if (*smax < sindex) + *smax = sindex; + } + if (v->array != NullArray) { + int i = v->array->count; + while (--i >= 0) { + if (v->array->items[i] != NULL) + k_attribute_range(v->array->items[i], + smin, smax); + } + } +} + +static void k_shift_rt_pos(vinfo_t* v, int delta) +{ + if (is_runtime(v->source)) { + v->source += delta; + } + if (v->array != NullArray) { + int i = v->array->count; + while (--i >= 0) { + if (v->array->items[i] != NULL) + k_shift_rt_pos(v->array->items[i], delta); + } + } +} + +DEFINEFN +compact_impl_t* k_duplicate_impl(compact_impl_t* base, + compact_impl_t* first_excluded, + compact_impl_t* last, + int shift_delta) +{ + vinfo_t* v; + if (first_excluded == last) + return base; + base = k_duplicate_impl(base, first_excluded, last->parent, + shift_delta); + v = vinfo_copy_no_share(last->vattr); + k_shift_rt_pos(v, shift_delta); + return k_extend_impl(base, last->attrname, v); +} + +static +int compact_set(PyCompactObject* ko, PyObject* attr, PyObject* value, + PyObject* pyerr_notfound) +{ + int err, smin, smax; + long immed_value; + vinfo_t* source_vi; + char* source_data; + compact_impl_t* impl; + compact_impl_t* p; + + /* recognize a few obvious object types and optimize accordingly + Note that this is not related to Psyco's ability to store + attributes with arbitrary flexibility, which is implemented in + pcompactobject.c. */ + if (value == NULL) { + source_vi = NULL; + source_data = NULL; + } + else if (PyInt_CheckExact(value)) { + immed_value = PyInt_AS_LONG(value); + source_vi = PsycoInt_FROM_LONG(vinfo_new(SOURCE_DUMMY)); + source_data = (char*) &immed_value; + } + else if (value == Py_None) { + source_vi = psyco_vi_None(); + source_data = NULL; + } + else { + source_vi = vinfo_new(SOURCE_DUMMY_WITH_REF); + source_data = (char*) &value; + } + impl = ko->k_impl; + while (impl->attrname != NULL) { + if (impl->attrname == attr) { + k_decref_objects(impl->vattr, ko->k_data); + + if (k_match_vinfo(source_vi, impl->vattr)) { + /* the attr already has the correct format */ + k_store_vinfo(impl->vattr, ko->k_data, + source_data); + err = 0; + goto finally; + } + + /* a format change is needed: first delete the + * existing attribute. + * XXX Not too efficient right now. + * XXX Also assumes that attribute order matches + * XXX data storage order. + */ + smin = ko->k_impl->datasize; + smax = 0; + k_attribute_range(impl->vattr, &smin, &smax); + if (smax < smin) + smax = smin; + + /* data between smin and smax is removed */ + memmove(ko->k_data + smin, + ko->k_data + smax, + ko->k_impl->datasize - smax); + + /* make the new 'impl' by starting from impl->parent + and accounting for all following attrs excluding + 'impl', shifted as per memmove() */ + ko->k_impl = k_duplicate_impl(impl->parent, impl, + ko->k_impl, smin - smax); + + if (source_vi != NULL) + goto store_data; /* now, re-create the attr + under its new format */ + err = 0; + goto finally; /* if attribute deletion: done */ + } + impl = impl->parent; + } + + if (source_vi == NULL) { + /* deleting a non-existing attribute */ + PyErr_SetObject(pyerr_notfound, attr); + return -1; + } + + /* setting a new attribute */ + store_data: + p = k_extend_impl(ko->k_impl, attr, source_vi); + err = k_extend(ko, p); + if (err == 0) { + k_store_vinfo(p->vattr, ko->k_data, source_data); + } + + finally: + vinfo_xdecref(source_vi, NULL); + return err; +} + +static +int compact_setattro(PyCompactObject* ko, PyObject* attr, PyObject* value) +{ + PyTypeObject* tp = ko->ob_type; + PyObject* descr; + descrsetfunc f; + + /* NB. this assumes that 'attr' is an already-interned string. + PyObject_SetAttr() should have interned it. */ + + /* Special code for data descriptors first, as in + PyObject_GenericSetAttr() */ + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) + return -1; + } + descr = _PyType_Lookup(tp, attr); + if (descr != NULL && + PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { + f = descr->ob_type->tp_descr_set; + if (f != NULL && PyDescr_IsData(descr)) + return f(descr, (PyObject*) ko, value); + } + + return compact_set(ko, attr, value, PyExc_AttributeError); +} + +static PyObject* k_interned_key(PyObject* key) +{ + if (key->ob_type != &PyString_Type) { + if (!PyString_Check(key)) { + PyErr_SetString(PyExc_TypeError, + "keys in compact objects " + "must be strings"); + return NULL; + } + key = PyString_FromStringAndSize(PyString_AS_STRING(key), + PyString_GET_SIZE(key)); + if (key == NULL) + return NULL; + } + else { + Py_INCREF(key); + } + K_INTERN(key); + return key; +} + +#if 0 +DEFINEFN +PyObject* PyCompact_GetSlot(PyObject* ko, PyObject* key) +{ + compact_impl_t* impl; + PyObject* o; + + if (!PyCompact_Check(ko)) { + PyErr_BadInternalCall(); + return NULL; + } + + key = k_interned_key(key); + if (key == NULL) + return NULL; + + impl = ((PyCompactObject*) ko)->k_impl; + while (impl->attrname != NULL) { + if (impl->attrname == key) { + o = direct_xobj_vinfo(impl->vattr, + ((PyCompactObject*) ko)->k_data); + if (o != NULL || PyErr_Occurred()) + goto finally; + } + impl = impl->parent; + } + PyErr_SetObject(PyExc_KeyError, key); + o = NULL; + finally: + Py_DECREF(key); + return o; +} + +DEFINEFN +PyObject* PyCompact_SetSlot(PyObject* ko, PyObject* key, PyObject* value) +{ + int err; + + if (!PyCompact_Check(ko)) { + PyErr_BadInternalCall(); + return NULL; + } + + key = k_interned_key(key); + if (key == NULL) + return NULL; + + err = compact_set((PyCompactObject*) ko, key, value, + PyExc_KeyError); + Py_DECREF(key); + return err; +} +#endif + +static PyObject* compact_getslot(PyCompactObject* ko, PyObject* key) +{ + compact_impl_t* impl = ko->k_impl; + PyObject* o; + + key = k_interned_key(key); + if (key == NULL) + return NULL; + + while (impl->attrname != NULL) { + if (impl->attrname == key) { + o = direct_xobj_vinfo(impl->vattr, ko->k_data); + if (o != NULL || PyErr_Occurred()) + goto finally; + } + impl = impl->parent; + } + PyErr_SetObject(PyExc_KeyError, key); + o = NULL; + finally: + Py_DECREF(key); + return o; +} + +static PyObject* compact_setslot(PyCompactObject* ko, PyObject* args) +{ + PyObject* key; + PyObject* value; + int err; + + if (!PyArg_ParseTuple(args, "OO", &key, &value)) + return NULL; + + key = k_interned_key(key); + if (key == NULL) + return NULL; + + err = compact_set(ko, key, value, PyExc_KeyError); + Py_DECREF(key); + if (err < 0) + return NULL; + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* compact_delslot(PyCompactObject* ko, PyObject* key) +{ + int err; + + key = k_interned_key(key); + if (key == NULL) + return NULL; + + err = compact_set(ko, key, NULL, PyExc_KeyError); + Py_DECREF(key); + if (err < 0) + return NULL; + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* compact_getmembers(PyCompactObject* ko, void* context) +{ + compact_impl_t* impl = ko->k_impl; + PyObject* result = PyList_New(0); + if (result == NULL) + return NULL; + while (impl->attrname != NULL) { + if (PyList_Append(result, impl->attrname) < 0) { + Py_DECREF(result); + return NULL; + } + impl = impl->parent; + } + if (PyList_Reverse(result) < 0) { + Py_DECREF(result); + return NULL; + } + return result; +} + +static PyObject* compact_getdict(PyObject* ko, void* context) +{ + PyObject* t = need_cpsyco_obj("compactdictproxy"); + if (t == NULL) + return NULL; + return PyObject_CallFunction(t, "O", ko); +} + +static int compact_setdict(PyObject* ko, PyObject* value, void* context) +{ + PyObject* nval; + PyObject* d; + PyObject* tmp; + + if (value == NULL) { + PyErr_SetString(PyExc_AttributeError, + "__dict__ attribute cannot be deleted"); + return -1; + } + if (PyDict_Check(value)) { + nval = value; + Py_INCREF(nval); + } + else { + /* Force a complete copy of 'value' for the assignment + x.__dict__ = x.__dict__. Note that we could do better + and just copy the memory buffer if we detect that + 'value' is the dict proxy of another compact object. */ + if (!PyMapping_Check(value)) { + PyErr_SetString(PyExc_TypeError, + "__dict__ attribute must be set " + "to a mapping"); + return -1; + } + nval = PyDict_New(); + if (nval == NULL) + return -1; + if (PyDict_Merge(nval, value, 1) < 0) + goto error; + } + d = compact_getdict(ko, context); + if (d == NULL) + goto error; + tmp = PyObject_CallMethod(d, "clear", ""); + if (tmp == NULL) + goto error; + Py_DECREF(tmp); + tmp = PyObject_CallMethod(d, "update", "O", nval); + if (tmp == NULL) + goto error; + Py_DECREF(tmp); + Py_DECREF(nval); + return 0; + + error: + Py_DECREF(nval); + return -1; +} + + +/*****************************************************************/ +/* The custom metaclass 'psyco.compacttype'. + * The only difference with the standard 'type' is that it + * forces some values: + * __slots__ == () + * __bases__[-1] == psyco.compact + */ + +staticforward PyTypeObject PyCompactType_Type; + +static PyObject * +compacttype_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) +{ + int i, n; + PyObject *name, *bases, *dict, *slots, *result, *nbases; + static char *kwlist[] = {"name", "bases", "dict", 0}; + + /* Check arguments: (name, bases, dict) */ + if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:compacttype", + kwlist, + &name, + &PyTuple_Type, &bases, + &PyDict_Type, &dict)) + return NULL; + + slots = PyDict_GetItemString(dict, "__slots__"); + if (slots != NULL) { + /* Specifying __slots__ on compacttypes is forbidden! */ + PyErr_SetString(PyExc_PsycoError, "psyco.compact classes " + "cannot have an explicit __slots__"); + return NULL; + } + + args = PyTuple_New(3); + if (args == NULL) + return NULL; + PyTuple_SET_ITEM(args, 0, name); Py_INCREF(name); + + /* Append 'psyco.compact' to bases if necessary, i.e. if none of the + provided bases already has a metaclass of psyco.compacttype. + The goal is to ensure that all the instances of psyco.compacttype + are classes that inherit from psyco.compact, but only add + psyco.compact to the bases if absolutely necessary. */ + n = PyTuple_GET_SIZE(bases); + for (i=0; iob_type != &PyString_Type || !PyString_CHECK_INTERNED(attr)) \ + Py_FatalError("Psyco failed to intern an attribute name"); \ +} while (0) + +EXTERNFN vinfo_t* vinfo_copy_no_share(vinfo_t* vi); +EXTERNFN bool k_match_vinfo(vinfo_t* vnew, vinfo_t* vexisting); +EXTERNFN compact_impl_t* k_extend_impl(compact_impl_t* oldimpl, PyObject* attr, + vinfo_t* v); +EXTERNFN void k_attribute_range(vinfo_t* v, int* smin, int* smax); +EXTERNFN compact_impl_t* k_duplicate_impl(compact_impl_t* base, + compact_impl_t* first_excluded, + compact_impl_t* last, + int shift_delta); + +#endif /* _COMPACTOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pabstract.c b/nodeboxgl/ext/psyco/src/c/Objects/pabstract.c new file mode 100644 index 0000000..45f6731 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pabstract.c @@ -0,0 +1,1092 @@ +#include "pabstract.h" +#include "pintobject.h" +#include "plongobject.h" +#include "pstringobject.h" +#include "piterobject.h" +#include "ptupleobject.h" +#include "pmethodobject.h" +#include "pclassobject.h" +#include "pfuncobject.h" + + +/*** This file is translated from the original 'abstract.c', see comments + in the original file for the general ideas about the algorithms. ***/ + +/* Shorthand to return certain errors */ + +static vinfo_t* type_error(PsycoObject* po, const char *msg) +{ + PycException_SetString(po, PyExc_TypeError, msg); + return NULL; +} + + +DEFINEFN +vinfo_t* PsycoObject_Call(PsycoObject* po, vinfo_t* callable_object, + vinfo_t* args, vinfo_t* kw) +{ /* 'kw' may not be NULL */ + ternaryfunc call; + PyTypeObject* tp = Psyco_NeedType(po, callable_object); + if (tp == NULL) + return NULL; + + if ((call = tp->tp_call) != NULL) { + return Psyco_META3(po, call, CfReturnRef|CfPyErrIfNull, + "vvv", callable_object, args, kw); + } + PycException_SetFormat(po, PyExc_TypeError, + "object of type '%.100s' is not callable", + tp->tp_name); + return NULL; +} + +DEFINEFN +vinfo_t* PsycoEval_CallObjectWithKeywords(PsycoObject* po, + vinfo_t* callable_object, + vinfo_t* args, vinfo_t* kw) +{ + vinfo_t* result; + + if (args == NULL) + args = PsycoTuple_New(0, NULL); + else { + switch (Psyco_VerifyType(po, args, &PyTuple_Type)) { + case true: /* args is a tuple */ + vinfo_incref(args); + break; + case false: /* args is not a tuple */ + goto use_proxy; + default: /* error or promotion */ + return NULL; + } + } + if (kw == NULL) + kw = psyco_vi_Zero(); + else { + switch (Psyco_VerifyType(po, kw, &PyDict_Type)) { + case true: /* kw is a dict */ + vinfo_incref(kw); + break; + case false: /* kw is not a dict */ + vinfo_decref(args, po); + goto use_proxy; + default: /* error or promotion */ + return NULL; + } + } + + result = PsycoObject_Call(po, callable_object, args, kw); + vinfo_decref(kw, po); + vinfo_decref(args, po); + return result; + + use_proxy: + return psyco_generic_call(po, PyEval_CallObjectWithKeywords, + CfReturnRef|CfPyErrIfNull, + "vvv", callable_object, args, kw); +} + + +DEFINEFN +vinfo_t* PsycoObject_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key) +{ + PyMappingMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, o); + if (tp == NULL) + return NULL; + + m = tp->tp_as_mapping; + if (m && m->mp_subscript) + return Psyco_META2(po, m->mp_subscript, + CfReturnRef|CfPyErrIfNull, "vv", o, key); + + if (tp->tp_as_sequence) { + /* TypeSwitch */ + PyTypeObject* ktp = Psyco_NeedType(po, key); + if (ktp == NULL) + return NULL; + + if (PyType_TypeCheck(ktp, &PyInt_Type)) { + return PsycoSequence_GetItem(po, o, + PsycoInt_AS_LONG(po, key)); + } + if (PyType_TypeCheck(ktp, &PyLong_Type)) { + vinfo_t* result; + vinfo_t* key_value = PsycoLong_AsLong(po, key); + if (key_value == NULL) + return NULL; + result = PsycoSequence_GetItem(po, o, key_value); + vinfo_decref(key_value, po); + return result; + } +#if HAVE_NB_INDEX + if (PsycoIndex_Check(ktp)) { + vinfo_t* result; + vinfo_t* key_value; + key_value = psyco_generic_call(po, PyNumber_AsSsize_t, + CfReturnNormal|CfPyErrCheckMinus1, + "vl", key, (long) PyExc_IndexError); + if (key_value == NULL) + return NULL; + result = PsycoSequence_GetItem(po, o, key_value); + vinfo_decref(key_value, po); + return result; + } +#endif + type_error(po, "sequence index must be integer"); + return false; + } + + type_error(po, "unsubscriptable object"); + return false; +} + +DEFINEFN +bool PsycoObject_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key, + vinfo_t* value) +{ + PyMappingMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, o); + if (tp == NULL) + return false; + + m = tp->tp_as_mapping; + if (m && m->mp_ass_subscript) { + char* vargs = (value!=NULL) ? "vvv" : "vvl"; + return Psyco_META3(po, m->mp_ass_subscript, + CfNoReturnValue|CfPyErrIfNonNull, + vargs, o, key, value) != NULL; + } + + if (tp->tp_as_sequence) { + /* TypeSwitch */ + PyTypeObject* ktp = Psyco_NeedType(po, key); + if (ktp == NULL) + return false; + + if (PyType_TypeCheck(ktp, &PyInt_Type)) { + return PsycoSequence_SetItem(po, o, + PsycoInt_AS_LONG(po, key), + value); + } + if (PyType_TypeCheck(ktp, &PyLong_Type)) { + bool result; + vinfo_t* key_value = PsycoLong_AsLong(po, key); + if (key_value == NULL) + return false; + result = PsycoSequence_SetItem(po, o, key_value,value); + vinfo_decref(key_value, po); + return result; + } +#if HAVE_NB_INDEX + if (PsycoIndex_Check(ktp)) { + bool result; + vinfo_t* key_value; + key_value = psyco_generic_call(po, PyNumber_AsSsize_t, + CfReturnNormal|CfPyErrCheckMinus1, + "vl", key, (long) PyExc_IndexError); + if (key_value == NULL) + return false; + result = PsycoSequence_SetItem(po, o, key_value,value); + vinfo_decref(key_value, po); + return result; + } +#endif + if (tp->tp_as_sequence->sq_ass_item) { + type_error(po, "sequence index must be integer"); + return false; + } + } + + type_error(po, (value!=NULL) ? + "object does not support item assignment" : + "object does not support item deletion"); + return false; +} + +DEFINEFN +vinfo_t* PsycoObject_Size(PsycoObject* po, vinfo_t* vi) +{ + PySequenceMethods *m; + void* f; + PyTypeObject* tp = Psyco_NeedType(po, vi); + if (tp == NULL) + return NULL; + + m = tp->tp_as_sequence; + if (m && m->sq_length) + f = m->sq_length; + else { + PyMappingMethods *m2 = tp->tp_as_mapping; + if (m2 && m2->mp_length) + f = m2->mp_length; + else + return type_error(po, "len() of unsized object"); + } + + return Psyco_META1(po, f, CfReturnNormal|CfPyErrIfNeg, "v", vi); +} + +DEFINEFN +vinfo_t* psyco_generic_immut_ob_size(PsycoObject* po, vinfo_t* vi) +{ + return psyco_get_field(po, vi, FIX_size); +} + +DEFINEFN +vinfo_t* psyco_generic_mut_ob_size(PsycoObject* po, vinfo_t* vi) +{ + return psyco_get_field(po, vi, VAR_size); +} + +DEFINEFN +vinfo_t* PsycoSequence_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i) +{ + PySequenceMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, o); + if (tp == NULL) + return NULL; + + m = tp->tp_as_sequence; + if (m && m->sq_item) { + vinfo_t* result; + vinfo_t* release_me = NULL; + if (m->sq_length) { + condition_code_t cc = integer_cmp_i(po, i, 0, Py_LT); + if (cc == CC_ERROR) + return NULL; + if (runtime_condition_f(po, cc)) { + vinfo_t* l = Psyco_META1(po, m->sq_length, + CfReturnNormal|CfPyErrIfNeg, + "v", o); + if (l == NULL) + return NULL; + release_me = i = integer_add(po, i, l, false); + vinfo_decref(l, po); + if (i == NULL) + return NULL; + } + else + assert_nonneg(i); + } + result = Psyco_META2(po, m->sq_item, CfReturnRef|CfPyErrIfNull, + "vv", o, i); + vinfo_xdecref(release_me, po); + return result; + } + + return type_error(po, "unindexable object"); +} + +DEFINEFN +bool PsycoSequence_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i, + vinfo_t* value) +{ + PySequenceMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, o); + if (tp == NULL) + return false; + + m = tp->tp_as_sequence; + if (m && m->sq_ass_item) { + bool result; + char* vargs; + vinfo_t* release_me = NULL; + if (m->sq_length) { + condition_code_t cc = integer_cmp_i(po, i, 0, Py_LT); + if (cc == CC_ERROR) + return false; + if (runtime_condition_f(po, cc)) { + vinfo_t* l = Psyco_META1(po, m->sq_length, + CfReturnNormal|CfPyErrIfNeg, + "v", o); + if (l == NULL) + return false; + release_me = i = integer_add(po, i, l, false); + vinfo_decref(l, po); + if (i == NULL) + return false; + } + else + assert_nonneg(i); + } + vargs = (value!=NULL) ? "vvv" : "vvl"; + result = Psyco_META3(po, m->sq_ass_item, + CfNoReturnValue|CfPyErrIfNonNull, + vargs, o, i, value) != NULL; + vinfo_xdecref(release_me, po); + return result; + } + + type_error(po, (value!=NULL) ? + "object doesn't support item assignment" : + "object doesn't support item deletion"); + return false; +} + +DEFINEFN +vinfo_t* PsycoSequence_GetSlice(PsycoObject* po, vinfo_t* o, + vinfo_t* i1, vinfo_t* i2) +{ + PySequenceMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, o); + if (tp == NULL) + return false; + + m = tp->tp_as_sequence; + if (m && m->sq_slice) { + vinfo_t* result = NULL; + vinfo_t* l = NULL; /* length, if already computed */ + vinfo_t* release_me1 = NULL; + vinfo_t* release_me2 = NULL; + if (m->sq_length) { + condition_code_t cc; + cc = integer_cmp_i(po, i1, 0, Py_LT); + if (cc == CC_ERROR) + goto fail; + if (runtime_condition_f(po, cc)) { + /* i1 < 0 */ + l = Psyco_META1(po, m->sq_length, + CfReturnNormal|CfPyErrIfNeg, + "v", o); + if (l == NULL) + goto fail; + release_me1 = i1 = integer_add(po, i1, l, false); + if (i1 == NULL) + goto fail; + } + else + assert_nonneg(i1); + + cc = integer_cmp_i(po, i2, 0, Py_LT); + if (cc == CC_ERROR) + goto fail; + if (runtime_condition_f(po, cc)) { + /* i2 < 0 */ + if (l == NULL) { + l = Psyco_META1(po, m->sq_length, + CfReturnNormal|CfPyErrIfNeg, + "v", o); + if (l == NULL) + goto fail; + } + release_me2 = i2 = integer_add(po, i2, l, false); + if (i2 == NULL) + goto fail; + } + else + assert_nonneg(i2); + } + result = Psyco_META3(po, m->sq_slice, CfReturnRef|CfPyErrIfNull, + "vvv", o, i1, i2); + + fail: + vinfo_xdecref(release_me2, po); + vinfo_xdecref(release_me1, po); + vinfo_xdecref(l, po); + return result; + } + else { + /* XXX call mp_subscript with sliceobj_from_intint */ + /* fallback */ + return psyco_generic_call(po, PySequence_GetSlice, + CfReturnRef|CfPyErrIfNull, + "vvv", o, i1, i2); + } +} + +DEFINEFN +bool PsycoSequence_SetSlice(PsycoObject* po, vinfo_t* o, + vinfo_t* ilow, vinfo_t* ihigh, vinfo_t* value) +{ + /* XXX implement me */ + if (value != NULL) + return psyco_generic_call(po, PySequence_SetSlice, + CfNoReturnValue|CfPyErrIfNonNull, + "vvvv", o, ilow, ihigh, value)!=NULL; + else + return psyco_generic_call(po, PySequence_DelSlice, + CfNoReturnValue|CfPyErrIfNonNull, + "vvv", o, ilow, ihigh) != NULL; +} + +DEFINEFN +vinfo_t* PsycoSequence_Contains(PsycoObject* po, vinfo_t* seq, vinfo_t* ob) +{ + PyTypeObject* tp = Psyco_NeedType(po, seq); + if (tp == NULL) + return false; + + if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_SEQUENCE_IN)) { + PySequenceMethods *sqm = tp->tp_as_sequence; + if (sqm != NULL && sqm->sq_contains != NULL) + return Psyco_META2(po, sqm->sq_contains, + CfReturnNormal|CfPyErrIfNeg, + "vv", seq, ob); + } + + /* XXX implement me */ + return psyco_generic_call(po, _PySequence_IterSearch, + CfReturnNormal|CfPyErrIfNeg, + "vvl", seq, ob, PY_ITERSEARCH_CONTAINS); +} + +DEFINEFN +vinfo_t* PsycoSequence_Tuple(PsycoObject* po, vinfo_t* seq) +{ + /* XXX implement me */ + vinfo_t* v = psyco_generic_call(po, PySequence_Tuple, + CfReturnRef|CfPyErrIfNull, + "v", seq); + if (v == NULL) + return NULL; + + /* the result is a tuple */ + Psyco_AssertType(po, v, &PyTuple_Type); + return v; +} + + +DEFINEFN +vinfo_t* PsycoNumber_Positive(PsycoObject* po, vinfo_t* vi) +{ + PyNumberMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, vi); + if (tp == NULL) + return NULL; + + m = tp->tp_as_number; + if (m && m->nb_positive) + return Psyco_META1(po, m->nb_positive, + CfReturnRef|CfPyErrIfNull, "v", vi); + + return type_error(po, "bad operand type for unary +"); +} + +DEFINEFN +vinfo_t* PsycoNumber_Negative(PsycoObject* po, vinfo_t* vi) +{ + PyNumberMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, vi); + if (tp == NULL) + return NULL; + + m = tp->tp_as_number; + if (m && m->nb_negative) + return Psyco_META1(po, m->nb_negative, + CfReturnRef|CfPyErrIfNull, "v", vi); + + return type_error(po, "bad operand type for unary -"); +} + +DEFINEFN +vinfo_t* PsycoNumber_Invert(PsycoObject* po, vinfo_t* vi) +{ + PyNumberMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, vi); + if (tp == NULL) + return NULL; + + m = tp->tp_as_number; + if (m && m->nb_invert) + return Psyco_META1(po, m->nb_invert, + CfReturnRef|CfPyErrIfNull, "v", vi); + + return type_error(po, "bad operand type for unary ~"); +} + +DEFINEFN +vinfo_t* PsycoNumber_Absolute(PsycoObject* po, vinfo_t* vi) +{ + PyNumberMethods *m; + PyTypeObject* tp = Psyco_NeedType(po, vi); + if (tp == NULL) + return NULL; + + m = tp->tp_as_number; + if (m && m->nb_absolute) + return Psyco_META1(po, m->nb_absolute, + CfReturnRef|CfPyErrIfNull, "v", vi); + + return type_error(po, "bad operand type for abs()"); +} + +#ifdef Py_TPFLAGS_CHECKTYPES +# define NEW_STYLE_NUMBER(otp) PyType_HasFeature((otp), \ + Py_TPFLAGS_CHECKTYPES) +#else +# define NEW_STYLE_NUMBER(otp) 0 +#endif + + +#define NB_SLOT(x) offsetof(PyNumberMethods, x) +#define NB_BINOP(nb_methods, slot) \ + ((binaryfunc*)(& ((char*)nb_methods)[slot] )) +#define NB_TERNOP(nb_methods, slot) \ + ((ternaryfunc*)(& ((char*)nb_methods)[slot] )) + + +/* the 'cimpl_xxx()' functions are called at run-time, to do things + we give up to write at the meta-level in the PsycoXxx() functions. */ +static PyObject* cimpl_oldstyle_binary_op1(PyObject* v, PyObject* w, + const int op_slot) +{ + int err = PyNumber_CoerceEx(&v, &w); + if (err < 0) { + return NULL; + } + if (err == 0) { + PyNumberMethods *mv = v->ob_type->tp_as_number; + if (mv) { + binaryfunc slot; + slot = *NB_BINOP(mv, op_slot); + if (slot) { + PyObject *x = slot(v, w); + Py_DECREF(v); + Py_DECREF(w); + return x; + } + } + /* CoerceEx incremented the reference counts */ + Py_DECREF(v); + Py_DECREF(w); + } + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; +} + +static vinfo_t* binary_op1(PsycoObject* po, vinfo_t* v, vinfo_t* w, + const int op_slot) +{ + vinfo_t* x; + binaryfunc slotv = NULL; + binaryfunc slotw = NULL; + + PyTypeObject* vtp; + PyTypeObject* wtp; + vtp = Psyco_NeedType(po, v); + if (vtp == NULL) + return NULL; + wtp = Psyco_NeedType(po, w); + if (wtp == NULL) + return NULL; + + if (vtp->tp_as_number != NULL && NEW_STYLE_NUMBER(vtp)) + slotv = *NB_BINOP(vtp->tp_as_number, op_slot); + if (wtp != vtp && + wtp->tp_as_number != NULL && NEW_STYLE_NUMBER(wtp)) { + slotw = *NB_BINOP(wtp->tp_as_number, op_slot); + if (slotw == slotv) + slotw = NULL; + } + if (slotv) { + if (slotw && PyType_IsSubtype(wtp, vtp)) { + x = Psyco_META2(po, slotw, + CfReturnRef|CfPyErrNotImplemented, + "vv", v, w); + if (IS_IMPLEMENTED(x)) + return x; /* may be NULL */ + vinfo_decref(x, po); /* can't do it */ + slotw = NULL; + } + x = Psyco_META2(po, slotv, + CfReturnRef|CfPyErrNotImplemented, "vv", v, w); + if (IS_IMPLEMENTED(x)) + return x; + vinfo_decref(x, po); /* can't do it */ + } + if (slotw) { + x = Psyco_META2(po, slotw, CfReturnRef|CfPyErrNotImplemented, + "vv", v, w); + if (IS_IMPLEMENTED(x)) + return x; + vinfo_decref(x, po); /* can't do it */ + } + if (!NEW_STYLE_NUMBER(vtp) || !NEW_STYLE_NUMBER(wtp)) { + /* inline a bit of PyNumber_CoerceEx */ + if (vtp == wtp) { + /* PyNumber_CoerceEx returns 0 in this case */ + PyNumberMethods *mv = vtp->tp_as_number; + if (mv) { + binaryfunc slot; + slot = *NB_BINOP(mv, op_slot); + if (slot) { + x = Psyco_META2(po, slot, + CfReturnRef|CfPyErrIfNull, + "vv", v, w); + return x; + } + } + } + else if ((vtp->tp_as_number && vtp->tp_as_number->nb_coerce) || + (wtp->tp_as_number && wtp->tp_as_number->nb_coerce)) { + /* stop inlining now, we don't try to optimize + old-style numbers any further here */ + return psyco_generic_call(po, cimpl_oldstyle_binary_op1, + CfReturnRef|CfPyErrNotImplemented, + "vvl", v, w, op_slot); + } + } + return psyco_vi_NotImplemented(); +} + +static vinfo_t* binop_type_error(PsycoObject* po, + vinfo_t* v, vinfo_t* w, const char *op_name) +{ + PycException_SetFormat(po, PyExc_TypeError, + "unsupported operand type(s) for %s: '%s' and '%s'", + op_name, + Psyco_FastType(v)->tp_name, + Psyco_FastType(w)->tp_name); + return NULL; +} + +static vinfo_t* binary_op(PsycoObject* po, vinfo_t* v, vinfo_t* w, + const int op_slot, const char *op_name) +{ + vinfo_t* result = binary_op1(po, v, w, op_slot); + if (!IS_IMPLEMENTED(result)) { + vinfo_decref(result, po); + return binop_type_error(po, v, w, op_name); + } + return result; +} + +#define BINARY_FUNC(func, op, op_name) \ +DEFINEFN vinfo_t* func(PsycoObject* po, vinfo_t* v, vinfo_t* w) { \ + return binary_op(po, v, w, NB_SLOT(op), op_name); \ +} + +BINARY_FUNC(PsycoNumber_Or, nb_or, "|") +BINARY_FUNC(PsycoNumber_Xor, nb_xor, "^") +BINARY_FUNC(PsycoNumber_And, nb_and, "&") +BINARY_FUNC(PsycoNumber_Lshift, nb_lshift, "<<") +BINARY_FUNC(PsycoNumber_Rshift, nb_rshift, ">>") +BINARY_FUNC(PsycoNumber_Subtract, nb_subtract, "-") +BINARY_FUNC(PsycoNumber_Divide, nb_divide, "/") +BINARY_FUNC(PsycoNumber_Divmod, nb_divmod, "divmod()") + + /* XXX tp_flags test -- not done in Python either, check future releases */ +BINARY_FUNC(PsycoNumber_FloorDivide, nb_floor_divide, "//") +BINARY_FUNC(PsycoNumber_TrueDivide, nb_true_divide, "/") + + +DEFINEFN +vinfo_t* PsycoNumber_Add(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* result = binary_op1(po, v, w, NB_SLOT(nb_add)); + if (!IS_IMPLEMENTED(result)) { + PySequenceMethods* m; + vinfo_decref(result, po); + m = Psyco_FastType(v)->tp_as_sequence; + if (m && m->sq_concat) { + result = Psyco_META2(po, m->sq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", v, w); + } + else { + return binop_type_error(po, v, w, "+"); + } + } + return result; +} + +static vinfo_t* psequence_repeat(PsycoObject* po, void *repeatfunc, + vinfo_t* vseq, vinfo_t* vn) +{ + PyTypeObject* tp = Psyco_FastType(vn); + vinfo_t* vcount; + vinfo_t* result; + + if (PyType_TypeCheck(tp, &PyInt_Type)) { + vcount = PsycoInt_AsLong(po, vn); + } + else if (PyType_TypeCheck(tp, &PyLong_Type)) { + vcount = PsycoLong_AsLong(po, vn); + } +#if HAVE_NB_INDEX + else if (PsycoIndex_Check(tp)) { + vcount = psyco_generic_call(po, PyNumber_AsSsize_t, + CfReturnNormal|CfPyErrCheckMinus1, + "vl", vn, + (long) PyExc_OverflowError); + } +#endif + else { + return type_error(po, + "can't multiply sequence to non-int"); + } + if (vcount == NULL) + return NULL; + +#if LONG_MAX != INT_MAX +# error "omitted code from Python 2.3 here" +#endif + result = Psyco_META2(po, repeatfunc, CfReturnRef|CfPyErrIfNull, + "vv", vseq, vcount); + vinfo_decref(vcount, po); + return result; +} + +DEFINEFN +vinfo_t* PsycoNumber_Multiply(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + /* This has varied a lot over recent Python versions. + 2.2 has no special code here; instead, int_mul and long_mul + check if they should delegate to the other argument's + sq_repeat. In 2.3 there is code similar to the code below: + int_mul and long_mul just return NotImplemented, and when + they do we check if we should proceed with sq_repeat. + I use the 2.3 semantics even with earlier Python versions. + Only convoluted user code would see the difference. */ + + vinfo_t* result = binary_op1(po, v, w, NB_SLOT(nb_multiply)); + if (!IS_IMPLEMENTED(result)) { + PySequenceMethods *mv = Psyco_FastType(v)->tp_as_sequence; + PySequenceMethods *mw = Psyco_FastType(w)->tp_as_sequence; + vinfo_decref(result, po); + if (mv && mv->sq_repeat) { + return psequence_repeat(po, mv->sq_repeat, v, w); + } + else if (mw && mw->sq_repeat) { + return psequence_repeat(po, mw->sq_repeat, w, v); + } + result = binop_type_error(po, v, w, "*"); + } + return result; +} + +DEFINEFN +vinfo_t* PsycoNumber_Remainder(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + PyTypeObject* vtp = Psyco_NeedType(po, v); + if (vtp == NULL) + return NULL; + if (vtp->tp_as_number == NULL) { + /* <= 2.2 only: special-case strings */ + if (PsycoString_Check(vtp)) + return psyco_generic_call(po, PyString_Format, + CfReturnRef|CfPyErrIfNull, + "vv", v, w); +#ifdef Py_USING_UNICODE + else if (PsycoUnicode_Check(vtp)) + return psyco_generic_call(po, +# if PSYCO_CAN_CALL_UNICODE + PyUnicode_Format, +# else + PyNumber_Remainder, +# endif + CfReturnRef|CfPyErrIfNull, + "vv", v, w); +#endif + } + return binary_op(po, v, w, NB_SLOT(nb_remainder), "%"); +} + +DEFINEFN +vinfo_t* PsycoNumber_Power(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, vinfo_t*v3) +{ + /* limited support -- the goal is only to support + (int-or-long-or-float) ** (int-or-long-or-float) */ + vinfo_t* x; + PyTypeObject* vtp; + PyTypeObject* wtp; + ternaryfunc f; + vtp = Psyco_NeedType(po, v1); + if (vtp == NULL) + return NULL; + if (vtp != &PyInt_Type && vtp != &PyLong_Type && vtp != &PyFloat_Type) + goto fallback; + wtp = Psyco_NeedType(po, v2); + if (wtp == NULL) + return NULL; + if (wtp != &PyInt_Type && wtp != &PyLong_Type && wtp != &PyFloat_Type) + goto fallback; + if (vtp == &PyFloat_Type || wtp == &PyFloat_Type) + f = PyFloat_Type.tp_as_number->nb_power; + else if (vtp == &PyLong_Type || wtp == &PyLong_Type) + f = PyLong_Type.tp_as_number->nb_power; + else + f = PyInt_Type.tp_as_number->nb_power; + x = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, + "vvv", v1, v2, v3); + if (IS_IMPLEMENTED(x)) + return x; /* may be NULL */ + vinfo_decref(x, po); + + fallback: + return psyco_generic_call(po, PyNumber_Power, CfReturnRef|CfPyErrIfNull, + "vvv", v1, v2, v3); +} + + +#define HASINPLACE(tp) PyType_HasFeature((tp), Py_TPFLAGS_HAVE_INPLACEOPS) + +static vinfo_t* binary_iop1(PsycoObject* po, vinfo_t* v, vinfo_t* w, + const int iop_slot, const int op_slot) +{ + PyNumberMethods *mv; + PyTypeObject* vtp = Psyco_NeedType(po, v); + if (vtp == NULL) + return NULL; + + mv = vtp->tp_as_number; + if (mv != NULL && HASINPLACE(vtp)) { + binaryfunc slot = *NB_BINOP(mv, iop_slot); + if (slot) { + vinfo_t* x = Psyco_META2(po, slot, + CfReturnRef|CfPyErrNotImplemented, + "vv", v, w); + if (IS_IMPLEMENTED(x)) + return x; + vinfo_decref(x, po); + } + } + return binary_op1(po, v, w, op_slot); +} + +static vinfo_t* binary_iop(PsycoObject* po, vinfo_t* v, vinfo_t* w, + const int iop_slot, const int op_slot, + const char *op_name) +{ + vinfo_t* result = binary_iop1(po, v, w, iop_slot, op_slot); + if (!IS_IMPLEMENTED(result)) { + vinfo_decref(result, po); + return binop_type_error(po, v, w, op_name); + } + return result; +} + +#define INPLACE_BINOP(func, iop, op, op_name) \ +DEFINEFN vinfo_t* func(PsycoObject* po, vinfo_t* v, vinfo_t* w) { \ + return binary_iop(po, v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \ +} + +INPLACE_BINOP(PsycoNumber_InPlaceOr, nb_inplace_or, nb_or, "|=") +INPLACE_BINOP(PsycoNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=") +INPLACE_BINOP(PsycoNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=") +INPLACE_BINOP(PsycoNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=") +INPLACE_BINOP(PsycoNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=") +INPLACE_BINOP(PsycoNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract,"-=") +INPLACE_BINOP(PsycoNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=") + + /* XXX tp_flags test -- not done in Python either, check future releases */ +INPLACE_BINOP(PsycoNumber_InPlaceFloorDivide, nb_inplace_floor_divide, + nb_floor_divide, "//=") +INPLACE_BINOP(PsycoNumber_InPlaceTrueDivide, nb_inplace_true_divide, + nb_true_divide, "/=") + +DEFINEFN +vinfo_t* PsycoNumber_InPlaceAdd(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* result = binary_iop1(po, v, w, NB_SLOT(nb_inplace_add), + NB_SLOT(nb_add)); + if (!IS_IMPLEMENTED(result)) { + PyTypeObject* vtp = Psyco_FastType(v); + PySequenceMethods* m = vtp->tp_as_sequence; + vinfo_decref(result, po); + if (m != NULL) { + binaryfunc f = NULL; + if (HASINPLACE(vtp)) + f = m->sq_inplace_concat; + if (f == NULL) + f = m->sq_concat; + if (f != NULL) + return Psyco_META2(po, f, + CfReturnRef|CfPyErrIfNull, + "vv", v, w); + } + result = binop_type_error(po, v, w, "+="); + } + return result; +} + +DEFINEFN +vinfo_t* PsycoNumber_InPlaceMultiply(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* result = binary_iop1(po, v, w, NB_SLOT(nb_inplace_multiply), + NB_SLOT(nb_multiply)); + if (!IS_IMPLEMENTED(result)) { + PyTypeObject* vtp = Psyco_FastType(v); + PyTypeObject* wtp = Psyco_FastType(w); + void *f = NULL; + PySequenceMethods *mv = vtp->tp_as_sequence; + PySequenceMethods *mw = wtp->tp_as_sequence; + vinfo_decref(result, po); + if (mv != NULL) { + if (HASINPLACE(vtp)) + f = mv->sq_inplace_repeat; + if (f == NULL) + f = mv->sq_repeat; + if (f != NULL) + return psequence_repeat(po, f, v, w); + } + else if (mw != NULL) { + /* Note that the right hand operand should not be + * mutated in this case so sq_inplace_repeat is not + * used. */ + if (mw->sq_repeat) + return psequence_repeat(po, + mw->sq_repeat, w, v); + } + result = binop_type_error(po, v, w, "*="); + } + return result; +} + +DEFINEFN +vinfo_t* PsycoNumber_InPlaceRemainder(PsycoObject* po, vinfo_t* v ,vinfo_t* w) +{ + PyTypeObject* vtp = Psyco_NeedType(po, v); + if (vtp == NULL) + return NULL; + if (vtp->tp_as_number == NULL) { + /* <= 2.2 only: special-case strings */ + if (PsycoString_Check(vtp)) + return psyco_generic_call(po, PyString_Format, + CfReturnRef|CfPyErrIfNull, + "vv", v, w); +#ifdef Py_USING_UNICODE + else if (PsycoUnicode_Check(vtp)) + return psyco_generic_call(po, +# if PSYCO_CAN_CALL_UNICODE + PyUnicode_Format, +# else + PyNumber_InPlaceRemainder, +# endif + CfReturnRef|CfPyErrIfNull, + "vv", v, w); +#endif + } + return binary_iop(po, v, w, NB_SLOT(nb_inplace_remainder), + NB_SLOT(nb_remainder), "%"); +} + +DEFINEFN +vinfo_t* PsycoNumber_InPlacePower(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, + vinfo_t* v3) { + /* XXX implement the ternary operators */ + return psyco_generic_call(po, PyNumber_InPlacePower, + CfReturnRef|CfPyErrIfNull, + "vvv", v1, v2, v3); +} + + +DEFINEFN +vinfo_t* PsycoObject_GetIter(PsycoObject* po, vinfo_t* vi) +{ + getiterfunc f; + PyTypeObject* t = Psyco_NeedType(po, vi); + if (t == NULL) + return NULL; + if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER)) + f = t->tp_iter; + else + f = NULL; + if (f == NULL) { + if (PsycoSequence_Check(t)) + return PsycoSeqIter_New(po, vi); + PycException_SetString(po, PyExc_TypeError, + "iteration over non-sequence"); + return NULL; + } + else { + return Psyco_META1(po, f, CfReturnRef|CfPyErrIfNull, + "v", vi); + } +} + +DEFINEFN +vinfo_t* PsycoIter_Next(PsycoObject* po, vinfo_t* iter) +{ + PyTypeObject* tp = Psyco_NeedType(po, iter); + if (tp == NULL) + return NULL; + if (!PsycoIter_Check(tp)) { + PycException_SetFormat(po, PyExc_TypeError, + "'%.100s' object is not an iterator", + tp->tp_name); + return NULL; + } + return Psyco_META1(po, tp->tp_iternext, CfReturnRef|CfPyErrIterNext, + "v", iter); +} + + +DEFINEFN +vinfo_t* psyco_generic_subscript(PsycoObject* po, vinfo_t* o, vinfo_t* key) +{ + /* This is the meta-implementation of the mapping item assignment + for sequences in Python >= 2.3, which is called for any + expression of the form a[n]. It expects n to be an integer + or an extended slice object. Regular slicing a[n:m] does not + come here. */ + + /* TypeSwitch */ + PyTypeObject* ktp = Psyco_NeedType(po, key); + if (ktp == NULL) + return NULL; + + if (PyType_TypeCheck(ktp, &PyInt_Type)) { + return PsycoSequence_GetItem(po, o, + PsycoInt_AS_LONG(po, key)); + } + else if (PyType_TypeCheck(ktp, &PyLong_Type)) { + vinfo_t* result; + vinfo_t* key_value = PsycoLong_AsLong(po, key); + if (key_value == NULL) + return NULL; + result = PsycoSequence_GetItem(po, o, key_value); + vinfo_decref(key_value, po); + return result; + } + else { + PyTypeObject* tp = Psyco_NeedType(po, o); + if (tp == NULL) + return NULL; + extra_assert(tp->tp_as_mapping != NULL); + extra_assert(tp->tp_as_mapping->mp_subscript != NULL); + return psyco_generic_call(po, tp->tp_as_mapping->mp_subscript, + CfReturnRef|CfPyErrIfNull, + "vv", o, key); + } +} + +DEFINEFN +bool psyco_generic_ass_subscript(PsycoObject* po, vinfo_t* o, + vinfo_t* key, vinfo_t* value) +{ + /* see psyco_generic_subscript() for comments */ + + /* TypeSwitch */ + PyTypeObject* ktp = Psyco_NeedType(po, key); + if (ktp == NULL) + return false; + + if (PyType_TypeCheck(ktp, &PyInt_Type)) { + return PsycoSequence_SetItem(po, o, + PsycoInt_AS_LONG(po, key), + value); + } + else if (PyType_TypeCheck(ktp, &PyLong_Type)) { + bool result; + vinfo_t* key_value = PsycoLong_AsLong(po, key); + if (key_value == NULL) + return false; + result = PsycoSequence_SetItem(po, o, key_value, value); + vinfo_decref(key_value, po); + return result; + } + else { + char* vargs = (value!=NULL) ? "vvv" : "vvl"; + PyTypeObject* tp = Psyco_NeedType(po, o); + if (tp == NULL) + return false; + extra_assert(tp->tp_as_mapping != NULL); + extra_assert(tp->tp_as_mapping->mp_ass_subscript != NULL); + return psyco_generic_call(po, + tp->tp_as_mapping->mp_ass_subscript, + CfNoReturnValue|CfPyErrIfNonNull, + vargs, o, key, value) != NULL; + } +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pabstract.h b/nodeboxgl/ext/psyco/src/c/Objects/pabstract.h new file mode 100644 index 0000000..5a1c94e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pabstract.h @@ -0,0 +1,110 @@ + /***************************************************************/ +/*** Psyco equivalent of abstract.h ***/ + /***************************************************************/ + +#ifndef _PSY_ABSTRACT_H +#define _PSY_ABSTRACT_H + + +#include "pobject.h" +#include "../Python/pycinternal.h" + + +EXTERNFN vinfo_t* PsycoObject_Call(PsycoObject* po, vinfo_t* callable_object, + vinfo_t* args, vinfo_t* kw); +/* 'args' and 'kw' may be NULL; this version performs type checks */ +EXTERNFN vinfo_t* PsycoEval_CallObjectWithKeywords(PsycoObject* po, + vinfo_t* callable_object, + vinfo_t* args, vinfo_t* kw); + +EXTERNFN vinfo_t* PsycoObject_Size(PsycoObject* po, vinfo_t* vi); +EXTERNFN vinfo_t* PsycoObject_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key); +EXTERNFN bool PsycoObject_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key, + vinfo_t* value); + +EXTERNFN vinfo_t* PsycoSequence_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i); +EXTERNFN bool PsycoSequence_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i, + vinfo_t* value); +EXTERNFN vinfo_t* PsycoSequence_GetSlice(PsycoObject* po, vinfo_t* o, + vinfo_t* i1, vinfo_t* i2); +EXTERNFN bool PsycoSequence_SetSlice(PsycoObject* po, vinfo_t* o, + vinfo_t* ilow, vinfo_t* ihigh, + vinfo_t* value); +EXTERNFN vinfo_t* PsycoSequence_Contains(PsycoObject* po, vinfo_t* seq, + vinfo_t* ob); +EXTERNFN vinfo_t* PsycoSequence_Tuple(PsycoObject* po, vinfo_t* seq); + +EXTERNFN vinfo_t* PsycoNumber_Positive(PsycoObject* po, vinfo_t* vi); +EXTERNFN vinfo_t* PsycoNumber_Negative(PsycoObject* po, vinfo_t* vi); +EXTERNFN vinfo_t* PsycoNumber_Invert(PsycoObject* po, vinfo_t* vi); +EXTERNFN vinfo_t* PsycoNumber_Absolute(PsycoObject* po, vinfo_t* vi); + +EXTERNFN vinfo_t* PsycoNumber_Add(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Or(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Xor(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_And(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Lshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Rshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Subtract(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Multiply(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Divide(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Divmod(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Remainder(PsycoObject* po, vinfo_t* v,vinfo_t* w); +EXTERNFN vinfo_t* PsycoNumber_Power(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, + vinfo_t* v3); + +EXTERNFN +vinfo_t* PsycoNumber_FloorDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_TrueDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceFloorDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceTrueDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); + +EXTERNFN +vinfo_t* PsycoNumber_InPlaceAdd(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceOr(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceXor(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceAnd(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceLshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceRshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceSubtract(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceMultiply(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlaceRemainder(PsycoObject* po, vinfo_t* v,vinfo_t* w); +EXTERNFN +vinfo_t* PsycoNumber_InPlacePower(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, + vinfo_t* v3); + + /* Attention! This does not catch PyExc_StopIteration. + As with all meta-functions, when it returns NULL there is + an exception set. All iterators raise PyExc_StopIteration at + the meta-level (because this is not time-consuming, the + exceptions being virtualized and not really set at Python's + eyes): */ +EXTERNFN vinfo_t* PsycoIter_Next(PsycoObject* po, vinfo_t* iter); +EXTERNFN vinfo_t* PsycoObject_GetIter(PsycoObject* po, vinfo_t* vi); + + +/* generic implementations of len() that reads the object's ob_size field + and the tp_subscript of all sequences in Python 2.3. + See e.g. plistobject.c */ +EXTERNFN vinfo_t* psyco_generic_immut_ob_size(PsycoObject* po, vinfo_t* vi); +EXTERNFN vinfo_t* psyco_generic_mut_ob_size(PsycoObject* po, vinfo_t* vi); +EXTERNFN vinfo_t* psyco_generic_subscript(PsycoObject* po, vinfo_t* o, + vinfo_t* key); +EXTERNFN bool psyco_generic_ass_subscript(PsycoObject* po, vinfo_t* o, + vinfo_t* key, vinfo_t* value); + + +#endif /* _PSY_ABSTRACT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pboolobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pboolobject.c new file mode 100644 index 0000000..a842e06 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pboolobject.c @@ -0,0 +1,110 @@ +#include "pboolobject.h" +#include "pintobject.h" + +#if BOOLEAN_TYPE /* Booleans were introduced in Python 2.3 */ + + +static bool compute_bool(PsycoObject* po, vinfo_t* boolobj) +{ + vinfo_t* newobj; + vinfo_t* x; + condition_code_t cc; + + /* get the field 'ob_ival' from the Python object 'boolobj' */ + x = vinfo_getitem(boolobj, iBOOL_OB_IVAL); + if (x == NULL) + return false; + + cc = integer_non_null(po, x); + if (cc == CC_ERROR) + return false; + newobj = integer_conditional(po, cc, + (long) Py_True, + (long) Py_False); + if (newobj == NULL) + return false; + + /* move the resulting non-virtual Python object back into 'boolobj' */ + vinfo_move(po, boolobj, newobj); + return true; +} + +static PyObject* direct_compute_bool(vinfo_t* boolobj, char* data) +{ + PyObject* result; + int ival; + ival = direct_read_vinfo(vinfo_getitem(boolobj, iBOOL_OB_IVAL), data); + if (ival == -1 && PyErr_Occurred()) + return NULL; + result = ival ? Py_True : Py_False; + Py_INCREF(result); + return result; +} + + +DEFINEVAR source_virtual_t psyco_computed_bool; + + + /***************************************************************/ + /*** boolean objects meta-implementation ***/ + +#define CONVERT_TO_BOOL(vobj, vlng) \ + switch (Psyco_VerifyType(po, vobj, &PyBool_Type)) { \ + case true: /* vobj is a PyBoolObject */ \ + vlng = PsycoInt_AS_LONG(po, vobj); \ + if (vlng == NULL) \ + return NULL; \ + break; \ + case false: /* vobj is not a PyBoolObject */ \ + return pint_base2op(po, v, w, op); \ + default: /* error or promotion */ \ + return NULL; \ + } + +static vinfo_t* pbool_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, + vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_BOOL(v, a); + CONVERT_TO_BOOL(w, b); + x = op (po, a, b); + if (x != NULL) + x = PsycoBool_FROM_LONG(x); + return x; +} + +static vinfo_t* pbool_or(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pbool_base2op(po, v, w, integer_or); +} + +static vinfo_t* pbool_xor(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pbool_base2op(po, v, w, integer_xor); +} + +static vinfo_t* pbool_and(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pbool_base2op(po, v, w, integer_and); +} + + +INITIALIZATIONFN +void psy_boolobject_init(void) +{ + PyNumberMethods *m = PyBool_Type.tp_as_number; + + Psyco_DefineMeta(m->nb_or, pbool_or); + Psyco_DefineMeta(m->nb_xor, pbool_xor); + Psyco_DefineMeta(m->nb_and, pbool_and); + + INIT_SVIRTUAL(psyco_computed_bool, compute_bool, + direct_compute_bool, 0, 0, 0); +} + +#else /* !BOOLEAN_TYPE */ +INITIALIZATIONFN +void psy_boolobject_init(void) { } +#endif /* BOOLEAN_TYPE */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pboolobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pboolobject.h new file mode 100644 index 0000000..5a38914 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pboolobject.h @@ -0,0 +1,56 @@ + /***************************************************************/ +/*** Psyco equivalent of boolobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_BOOLOBJECT_H +#define _PSY_BOOLOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + +#if BOOLEAN_TYPE /* Booleans were introduced in Python 2.3 */ + + +#define BOOL_ob_ival DEF_FIELD(PyBoolObject, long, ob_ival, OB_type) +#define iBOOL_OB_IVAL FIELD_INDEX(BOOL_ob_ival) +#define BOOL_TOTAL FIELDS_TOTAL(BOOL_ob_ival) + + +#define PsycoBool_Check(tp) PyType_TypeCheck(tp, &PyBool_Type) + + + /***************************************************************/ + /*** Virtual-time object builder ***/ + +/* not-yet-computed booleans */ +EXTERNVAR source_virtual_t psyco_computed_bool; + +/* !! consumes a reference to vlong. PsycoBool_FromLong() does not. */ +PSY_INLINE vinfo_t* PsycoBool_FROM_LONG(vinfo_t* vlong) +{ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_bool)); + result->array = array_new(BOOL_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyBool_Type))); + result->array->items[iBOOL_OB_IVAL] = vlong; assert_nonneg(vlong); + return result; +} +PSY_INLINE vinfo_t* PsycoBool_FromLong(vinfo_t* vlong) +{ + vinfo_incref(vlong); + return PsycoBool_FROM_LONG(vlong); +} + + +#else /* !BOOLEAN_TYPE */ +/* define the booleans as synonims for integers */ +# define PsycoBool_FROM_LONG(v) PsycoInt_FROM_LONG(v) +# define PsycoBool_FromLong(v) PsycoInt_FromLong(v) +#endif /* BOOLEAN_TYPE */ + +/* utility */ +#define PsycoBool_FromCondition(po, cc) \ + PsycoBool_FROM_LONG(psyco_vinfo_condition(po, cc)) + +#endif /* _PSY_INTOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pclassobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pclassobject.c new file mode 100644 index 0000000..f2fe05d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pclassobject.c @@ -0,0 +1,167 @@ +#include "pclassobject.h" +#include "ptupleobject.h" + + +DEFINEFN +vinfo_t* PsycoMethod_New(PyObject* func, vinfo_t* self, PyObject* cls) +{ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_method)); + + result->array = array_new(METHOD_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyMethod_Type))); + + Py_INCREF(func); + result->array->items[iMETHOD_IM_FUNC] = + vinfo_new(CompileTime_NewSk(sk_new((long) func, SkFlagPyObj))); + + vinfo_incref(self); + result->array->items[iMETHOD_IM_SELF] = self; + + Py_INCREF(cls); + result->array->items[iMETHOD_IM_CLASS] = + vinfo_new(CompileTime_NewSk(sk_new((long) cls, SkFlagPyObj))); + + return result; +} + + +static bool compute_method(PsycoObject* po, vinfo_t* methobj) +{ + vinfo_t* newobj; + vinfo_t* im_func; + vinfo_t* im_self; + vinfo_t* im_class; + + /* get the fields from the Python object 'methobj' */ + im_func = vinfo_getitem(methobj, iMETHOD_IM_FUNC); + if (im_func == NULL) + return false; + im_self = vinfo_getitem(methobj, iMETHOD_IM_SELF); + if (im_self == NULL) + return false; + im_class = vinfo_getitem(methobj, iMETHOD_IM_CLASS); + if (im_class == NULL) + return false; + + /* call PyMethod_New() */ + newobj = psyco_generic_call(po, PyMethod_New, + CfPure|CfReturnRef|CfPyErrIfNull, + "vvv", im_func, im_self, im_class); + if (newobj == NULL) + return false; + + /* move the resulting non-virtual Python object back into 'methobj' */ + vinfo_move(po, methobj, newobj); + return true; +} + +static PyObject* direct_compute_method(vinfo_t* methobj, char* data) +{ + PyObject* im_func; + PyObject* im_self; + PyObject* im_class; + PyObject* result = NULL; + + im_func = direct_xobj_vinfo( + vinfo_getitem(methobj, iMETHOD_IM_FUNC), data); + im_self = direct_xobj_vinfo( + vinfo_getitem(methobj, iMETHOD_IM_SELF), data); + im_class = direct_xobj_vinfo( + vinfo_getitem(methobj, iMETHOD_IM_CLASS), data); + + if (!PyErr_Occurred() && im_func != NULL) + result = PyMethod_New(im_func, im_self, im_class); + + Py_XDECREF(im_class); + Py_XDECREF(im_self); + Py_XDECREF(im_func); + return result; +} + + +DEFINEVAR source_virtual_t psyco_computed_method; + + + /***************************************************************/ + /*** instance method objects meta-implementation ***/ + + +DEFINEFN +vinfo_t* pinstancemethod_call(PsycoObject* po, vinfo_t* methobj, + vinfo_t* arg, vinfo_t* kw) +{ + vinfo_t* im_func; + vinfo_t* im_self; + vinfo_t* result; + condition_code_t cc; + + /* get the 'im_self' field from the Python object 'methobj' */ + im_self = psyco_get_const(po, methobj, METHOD_im_self); + if (im_self == NULL) + return NULL; + + cc = object_non_null(po, im_self); + if (cc == CC_ERROR) /* error or more likely promotion */ + return NULL; + + if (!runtime_condition_t(po, cc)) { + /* Unbound methods, XXX implement me */ + goto fallback; + } + else + { + int i, argcount; + vinfo_t* newarg; + if (PycException_Occurred(po)) + return NULL; + + argcount = PsycoTuple_Load(arg); + if (argcount < 0) + goto fallback; + + newarg = PsycoTuple_New(argcount+1, NULL); + vinfo_incref(im_self); + PsycoTuple_GET_ITEM(newarg, 0) = im_self; + for (i = 0; i < argcount; i++) { + vinfo_t* v = PsycoTuple_GET_ITEM(arg, i); + vinfo_incref(v); + PsycoTuple_GET_ITEM(newarg, i+1) = v; + } + arg = newarg; + } + + im_func = psyco_get_const(po, methobj, METHOD_im_func); + if (im_func == NULL) + result = NULL; + else + result = PsycoObject_Call(po, im_func, arg, kw); + vinfo_decref(arg, po); + return result; + + fallback: + return psyco_generic_call(po, PyMethod_Type.tp_call, + CfReturnRef|CfPyErrIfNull, + "vvv", methobj, arg, kw); +} + + /***************************************************************/ + /*** instances and classes ***/ + +DEF_KNOWN_RET_TYPE_3(pinstance_new, PyInstance_New, + CfReturnRef|CfPyErrIfNull, &PyInstance_Type) + + +INITIALIZATIONFN +void psy_classobject_init(void) +{ + Psyco_DefineMeta(PyMethod_Type.tp_call, pinstancemethod_call); + Psyco_DefineMeta(PyInstance_New, pinstance_new); + + INIT_SVIRTUAL(psyco_computed_method, compute_method, + direct_compute_method, + (1 << iMETHOD_IM_FUNC) | + (1 << iMETHOD_IM_SELF) | + (1 << iMETHOD_IM_CLASS), + 0, 0); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pclassobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pclassobject.h new file mode 100644 index 0000000..7864817 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pclassobject.h @@ -0,0 +1,40 @@ + /***************************************************************/ +/*** Psyco equivalent of classobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_CLASSOBJECT_H +#define _PSY_CLASSOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +/* Instance methods */ +#define METHOD_im_func DEF_FIELD(PyMethodObject, PyObject*, im_func, OB_type) +#define METHOD_im_self DEF_FIELD(PyMethodObject, PyObject*, im_self, \ + METHOD_im_func) +#define METHOD_im_class DEF_FIELD(PyMethodObject, PyObject*, im_class, \ + METHOD_im_self) +#define iMETHOD_IM_FUNC FIELD_INDEX(METHOD_im_func) +#define iMETHOD_IM_SELF FIELD_INDEX(METHOD_im_self) +#define iMETHOD_IM_CLASS FIELD_INDEX(METHOD_im_class) +#define METHOD_TOTAL FIELDS_TOTAL(METHOD_im_class) + + +EXTERNFN vinfo_t* pinstancemethod_call(PsycoObject* po, vinfo_t* methobj, + vinfo_t* arg, vinfo_t* kw); + + + /***************************************************************/ + /*** Virtual-time object builder ***/ + +/* not-yet-computed instance method objects. Usually not computed at all, + but if it needs be, will call PyMethod_New(). */ +EXTERNVAR source_virtual_t psyco_computed_method; + +EXTERNFN +vinfo_t* PsycoMethod_New(PyObject* func, vinfo_t* self, PyObject* cls); + + +#endif /* _PSY_CLASSOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.c new file mode 100644 index 0000000..461410b --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.c @@ -0,0 +1,653 @@ +#include "compactobject.h" +#include "pcompactobject.h" +#include "../Python/pycompiler.h" +#include "ptupleobject.h" +#include "ptypeobject.h" + +#define COMPACT_impl FMUT(DEF_FIELD(PyCompactObject, compact_impl_t*, \ + k_impl, OB_type)) +#define COMPACT_data FMUT(DEF_FIELD(PyCompactObject, char*, \ + k_data, COMPACT_impl)) +#define iCOMPACT_IMPL FIELD_INDEX(COMPACT_impl) +#define iCOMPACT_DATA FIELD_INDEX(COMPACT_data) +#define COMPACT_TOTAL FIELDS_TOTAL(COMPACT_data) + +#define KDATA_AS_LONG FMUT(DEF_ARRAY(long, 0)) +#define KDATA_AS_PYOBJ FMUT(FPYREF(DEF_ARRAY(PyObject*, 0))) +#define KDATA_AS_PYOBJ_NOREF FMUT(DEF_ARRAY(PyObject*, 0)) + + +#define PSY_READ_K_DATA(vdata, on_error) do { \ + if (vdata == NULL) { \ + /* read ko->k_data */ \ + vdata = psyco_get_field(po, vk, COMPACT_data); \ + if (vdata == NULL) \ + on_error; \ + } \ + } while (0) + + + /***************************************************************/ + /*** Meta-implementation of compact_getattro ***/ + +static vinfo_t* psy_k_load_vinfo(PsycoObject* po, vinfo_t* vsrc, vinfo_t* vk, + vinfo_t** pvdata) +{ + /* duplicate a vinfo_t structure from a compact_impl_t, generating + the code to read it out of the PyCompactObject */ + int sindex; + vinfo_t* vresult; + switch (gettime(vsrc->source)) { + + case RunTime: /* read from the object's k_data */ + PSY_READ_K_DATA(*pvdata, return NULL); + sindex = getstack(vsrc->source); + if (has_rtref(vsrc->source)) { + vresult = psyco_get_nth_field(po, *pvdata, + KDATA_AS_PYOBJ, sindex / sizeof(PyObject*)); + } + else { + vresult = psyco_get_nth_field(po, *pvdata, + KDATA_AS_LONG, sindex / sizeof(long)); + } + if (!vresult) + return NULL; + break; + + case CompileTime: /* return a fresh copy of the vinfo_t */ + sk_incref(CompileTime_Get(vsrc->source)); + return vinfo_new(vsrc->source); + + default: + vresult = vinfo_new(vsrc->source); + } + if (vsrc->array != NullArray) { + int i = vsrc->array->count; + vinfo_array_grow(vresult, i); + while (--i >= 0) { + if (vsrc->array->items[i] != NULL) { + vinfo_t* v; + v = psy_k_load_vinfo(po, vsrc->array->items[i], + vk, pvdata); + if (v == NULL) { + vinfo_decref(vresult, po); + return NULL; + } + vresult->array->items[i] = v; + } + } + } + return vresult; +} + +struct source_tmp_virtual_s { + source_virtual_t sv; + PyObject* ko; +}; + +static struct source_tmp_virtual_s* stv_table_start = NULL; +static struct source_tmp_virtual_s* stv_table_next = NULL; +static struct source_tmp_virtual_s* stv_table_stop = NULL; + +static bool compute_stv_never(PsycoObject* po, vinfo_t* vk) +{ + psyco_fatal_msg("compute_stv_never"); + return true; +} + +PSY_INLINE struct source_tmp_virtual_s* malloc_stv(PyObject* ko) +{ + /* this leaks, but we try to minimize the impact by alloc'ing + blocks and doing some sharing */ + struct source_tmp_virtual_s* p; + for (p = stv_table_start; p != stv_table_next; p++) { + if (p->ko == ko) + return p; + } + if (p == stv_table_stop) { + p = (struct source_tmp_virtual_s*) malloc( + 64 * sizeof(struct source_tmp_virtual_s*)); + if (!p) + OUT_OF_MEMORY(); + stv_table_start = p; + stv_table_stop = p + 64; + } + INIT_SVIRTUAL_NOCALL(p->sv, compute_stv_never, 0); + p->ko = ko; + stv_table_next = p + 1; + return p; +} + +static compact_impl_t* pcompact_getimpl(PsycoObject* po, vinfo_t* vk) +{ + /* The problem is to promote the vimpl read out of vk. + To be promotable it must be temporarily stored in vk->array. + However, we cannot store a run-time vimpl in a compile-time vk. + Ideally, this restriction should be lifted, but this + would need a careful review of a lot of code and a lot + of testing :-( + Instead, this is done by temporarily turning the compile-time + vk into a virtual-time value. */ + + long l; + vinfo_t* vimpl; + struct source_tmp_virtual_s* stv; + vinfo_t* vtype; + source_known_t* sk; + + vimpl = vinfo_getitem(vk, iCOMPACT_IMPL); + if (vimpl == NULL) { + /* initial case */ + vimpl = psyco_get_field(po, vk, COMPACT_impl); + if (vimpl == NULL) + return NULL; + extra_assert(is_runtime(vimpl->source)); /* freshly read */ + if (is_compiletime(vk->source)) { + /* CompileTime -> VirtualTime */ + /* leaks stv. */ + sk = CompileTime_Get(vk->source); + stv = malloc_stv((PyObject*) sk->value); + sk_decref(sk); + vk->source = VirtualTime_New(&stv->sv); + + /* store the type as a constant in vk->array */ + vtype = vinfo_new(CompileTime_New( + (long)(stv->ko->ob_type))); + vinfo_setitem(po, vk, iOB_TYPE, vtype); + } + /* temporarily store vimpl in vk->array */ + vinfo_setitem(po, vk, iCOMPACT_IMPL, vimpl); + l = psyco_atcompiletime(po, vimpl); + psyco_assert(l == -1); /* must be promoting here */ + return NULL; + } + else { + /* case 2: resuming after promotion */ + psyco_assert(is_compiletime(vimpl->source)); + /* remove vimpl after promotion */ + l = CompileTime_Get(vimpl->source)->value; + vinfo_setitem(po, vk, iCOMPACT_IMPL, NULL); + if (is_virtualtime(vk->source)) { + /* VirtualTime -> CompileTime */ + /* XXX fix this if virtual compactobjects + are introduced! */ + stv = ((struct source_tmp_virtual_s*) + VirtualTime_Get(vk->source)); + vk->source = CompileTime_New((long) stv->ko); + } + return (compact_impl_t*) l; + } +} + +static vinfo_t* pcompact_getattro(PsycoObject* po, vinfo_t* vk, vinfo_t* vattr) +{ + PyTypeObject* tp; + PyObject* descr = NULL; + descrgetfunc f = NULL; + compact_impl_t* impl; + vinfo_t* vresult = NULL; + PyObject* name; + + /* don't try to optimize non-constant attribute names + (see explanation in PsycoObject_GenericGetAttr()) */ + if (!is_compiletime(vattr->source)) { + return psyco_generic_call(po, PyCompact_Type.tp_getattro, + CfReturnRef|CfPyErrIfNull, + "vv", vk, vattr); + } + + /* we need the type of 'obj' at compile-time */ + tp = (PyTypeObject*) Psyco_NeedType(po, vk); + if (tp == NULL) + return NULL; + + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) { + psyco_virtualize_exception(po); + return NULL; + } + } + + /* use interned strings only */ + name = (PyObject*) CompileTime_Get(vattr->source)->value; + Py_INCREF(name); + K_INTERN(name); + + /* XXX this is broken in the same way as PsycoObject_GenericGetAttr() */ + descr = _PyType_Lookup(tp, name); + if (descr != NULL) { + Py_INCREF(descr); + if (PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { + f = descr->ob_type->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + vresult = Psyco_META3(po, f, + CfReturnRef|CfPyErrIfNull, + "lvl", descr, vk, tp); + goto done; + } + } + } + + /* read and temporarily promote the k_impl field of the object */ + impl = pcompact_getimpl(po, vk); + if (impl == NULL) + goto done; + + while (impl->attrname != NULL) { + if (impl->attrname == name) { + /* read the attribute data from the object and build a + copy of the attribute's vinfo to reflect the position + of the loaded data in the processor registers */ + vinfo_t* vdata = NULL; + vresult = psy_k_load_vinfo(po, impl->vattr, vk, &vdata); + vinfo_xdecref(vdata, po); + goto done; + } + impl = impl->parent; + } + + /* The end of PyObject_GenericGetAttr() */ + if (f != NULL) { + vresult = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, + "lvl", descr, vk, tp); + goto done; + } + + if (descr != NULL) { + source_known_t* sk = sk_new((long) descr, SkFlagPyObj); + descr = NULL; + vresult = vinfo_new(CompileTime_NewSk(sk)); + goto done; + } + + PycException_SetFormat(po, PyExc_AttributeError, + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(name)); + done: + Py_XDECREF(descr); + Py_DECREF(name); + return vresult; +} + + + /***************************************************************/ + /*** Meta-implementation of compact_setattro ***/ + +static void psy_k_mark_references(vinfo_t* v, bool mark) +{ + long pyobj_mask; + switch (gettime(v->source)) { + + case VirtualTime: + pyobj_mask = VirtualTime_Get(v->source)->pyobject_mask; + break; + + case RunTime: + if (mark) + v->source = add_rtref(v->source); + /* fall through */ + default: + pyobj_mask = 0; + } + + if (v->array != NullArray) { + int i = v->array->count; + while(--i >= 0) { + vinfo_t* a = v->array->items[i]; + if (a != NULL) + psy_k_mark_references(a, pyobj_mask & 1); + pyobj_mask >>= 1; + } + } +} + +static bool psy_k_store_vinfo(PsycoObject* po, vinfo_t* source_vi, + vinfo_t* attr_vi, vinfo_t* vk, vinfo_t** pvdata) +{ + /* generate code that writes 'source_vi' into the raw 'vdata' + using the format described by 'attr_vi' */ + int sindex; + bool result; + extra_assert(gettime(source_vi->source) == gettime(attr_vi->source)); + + if (attr_vi->array != NullArray) { + int i = attr_vi->array->count; + while (--i >= 0) { + if (attr_vi->array->items[i] == NULL) + continue; + extra_assert(source_vi->array->count > i); + result = psy_k_store_vinfo(po, + source_vi->array->items[i], + attr_vi->array->items[i], + vk, pvdata); + if (!result) + return false; + } + } + + if (!is_runtime(attr_vi->source)) + return true; + PSY_READ_K_DATA(*pvdata, return false); + sindex = getstack(attr_vi->source); + if (has_rtref(attr_vi->source)) { + result = psyco_put_nth_field(po, *pvdata, + KDATA_AS_PYOBJ, sindex / sizeof(PyObject*), + source_vi); + } + else { + result = psyco_put_nth_field(po, *pvdata, + KDATA_AS_LONG, sindex / sizeof(long), + source_vi); + } + return result; +} + +static bool psy_k_decref_objects(PsycoObject* po, vinfo_t* attr_vi, + vinfo_t* vk, vinfo_t** pvdata) +{ + if (has_rtref(attr_vi->source)) { + vinfo_t* v; + int sindex = getstack(attr_vi->source); + PSY_READ_K_DATA(*pvdata, return false); + v = psyco_get_nth_field(po, *pvdata, KDATA_AS_PYOBJ_NOREF, + sindex / sizeof(PyObject*)); + if (v == NULL) + return false; + v->source = add_rtref(v->source); /* 'v' stole the reference + from the object */ + vinfo_decref(v, po); + } + if (attr_vi->array != NullArray) { + int i = attr_vi->array->count; + while (--i >= 0) { + if (attr_vi->array->items[i] != NULL && + !psy_k_decref_objects(po, attr_vi->array->items[i], + vk, pvdata)) + return false; + } + } + return true; +} + +static bool pcompact_setattro(PsycoObject* po, vinfo_t* vk, PyObject* attr, + vinfo_t* source_vi) +{ + PyTypeObject* tp; + PyObject* descr; + descrsetfunc f; + vinfo_t* vimpl; + compact_impl_t* impl; + compact_impl_t* k_impl; + vinfo_t* vcopy; + condition_code_t cc; + vinfo_array_t a; + vinfo_t* vdata = NULL; + vinfo_t* vndata; + vinfo_t* v1; + vinfo_t* v2; + bool ok; + int smin, smax, s, s1, s2; + + /* we need the type of 'obj' at compile-time */ + tp = (PyTypeObject*) Psyco_NeedType(po, vk); + if (tp == NULL) + return false; + + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) { + psyco_virtualize_exception(po); + return false; + } + } + + /* XXX this is broken in the same way as PsycoObject_GenericGetAttr() */ + descr = _PyType_Lookup(tp, attr); + if (descr != NULL && + PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { + f = descr->ob_type->tp_descr_set; + if (f != NULL && PyDescr_IsData(descr)) { + Py_INCREF(descr); /* XXX leaks */ + return Psyco_META3(po, f, + CfNoReturnValue|CfPyErrIfNonNull, + source_vi ? "lvv" : "lvl", + descr, vk, source_vi) != NULL; + } + } + + if (source_vi != NULL) { + /* force mutable virtual-time objects out of virtual-time, + and limit the virtual depth a bit */ + a.count = 1; + a.items[0] = source_vi; + if (!psyco_forking(po, &a)) + return false; + clear_tmp_marks(&a); + psyco_simplify_array(&a, po); + } + + /* read and temporarily promote the k_impl field of the object */ + k_impl = pcompact_getimpl(po, vk); + if (k_impl == NULL) + return false; + + for (impl = k_impl; impl->attrname != NULL; impl = impl->parent) { + if (impl->attrname != attr) + continue; + if (!psy_k_decref_objects(po, impl->vattr, vk, &vdata)) + goto error; + if (k_match_vinfo(source_vi, impl->vattr)) { + /* the attr already has the correct format */ + if (!psy_k_store_vinfo(po, source_vi, impl->vattr, + vk, &vdata)) + goto error; + vinfo_xdecref(vdata, po); + return true; + } + /* a format change is needed: first delete the + * existing attribute. + * XXX same restrictions as in compact_setattro(). + * XXX it's already far too scary. + */ + smin = impl->datasize; + smax = 0; + k_attribute_range(impl->vattr, &smin, &smax); + if (smax < smin) + smax = smin; + + /* data between smin and smax is removed */ + if (smin < smax && smax < k_impl->datasize) { + PSY_READ_K_DATA(vdata, return false); + extra_assert((smin % sizeof(long)) == 0); + extra_assert((smax % sizeof(long)) == 0); + extra_assert((k_impl->datasize % sizeof(long)) == 0); + if (k_impl->datasize-smax <= 5*sizeof(long)) { + s1 = smax/sizeof(long); + s2 = k_impl->datasize/sizeof(long); + for (s=s1; sdatasize-smax) + != NULL; + vinfo_decref(v2, po); + vinfo_decref(v1, po); + if (!ok) + goto error; + } + } + + /* make the new 'impl' by starting from impl->parent + and accounting for all following attrs excluding + 'impl', shifted as per memmove() */ + impl = k_duplicate_impl(impl->parent, impl, + k_impl, smin - smax); + + if (source_vi != NULL) + goto store_data; /* now, re-create the attr + under its new format */ + + goto update_k_impl; /* if attribute deletion: done */ + } + + if (source_vi == NULL) { + /* deleting a non-existing attribute */ + return psyco_generic_call(po, PyObject_GenericSetAttr, + CfNoReturnValue|CfPyErrIfNonNull, + "vll", vk, attr, (long) NULL) != NULL; + } + + /* setting a new attribute */ + impl = k_impl; + + /* XXX Psyco's error handling on top of Python's error handling code + is the best recipe for scary sources */ + + store_data: + vcopy = vinfo_copy_no_share(source_vi); + psy_k_mark_references(vcopy, true); + impl = k_extend_impl(impl, attr, vcopy); + vinfo_decref(vcopy, NULL); + + /* generate the operations of PyCompact_Extend() in-line: */ + if (impl->datasize <= K_ROUNDUP(k_impl->datasize)) { + /* already enough space */ + } + else { + PSY_READ_K_DATA(vdata, return false); + + /* call PyMem_Realloc() on k->k_data */ + vndata = psyco_generic_call(po, PyMem_Realloc, CfReturnNormal, + "vl", vdata, + K_ROUNDUP(impl->datasize)); + if (vndata == NULL) + goto error; + vinfo_decref(vdata, po); + vdata = vndata; + /* did PyMem_Realloc() return NULL? */ + cc = integer_non_null(po, vdata); + if (cc == CC_ERROR) + goto error; + if (!runtime_condition_t(po, cc)) { + /* yes -> raise a MemoryError */ + PycException_SetVInfo(po, PyExc_MemoryError, + psyco_vi_None()); + goto error; + } + /* store the result of PyMem_Realloc() back into + ko->k_data */ + if (!psyco_put_field(po, vk, COMPACT_data, vdata)) + goto error; + } + /* store 'v' into the newly allocated data */ + if (!psy_k_store_vinfo(po, source_vi, impl->vattr, vk, &vdata)) + goto error; + + /* update ko->k_impl with the extended compact_impl_t */ + update_k_impl: + vinfo_xdecref(vdata, po); + vimpl = vinfo_new(CompileTime_New((long) impl)); + ok = psyco_put_field(po, vk, COMPACT_impl, vimpl); + vinfo_decref(vimpl, po); + return ok; + + error: + vinfo_xdecref(vdata, po); + return false; +} + + + /***************************************************************/ + /*** More meta-implementations ***/ + +static vinfo_t* pcompact_new(PsycoObject* po, PyTypeObject* type, + vinfo_t* vargs, vinfo_t* vkwds) +{ + /* first delegate to object_new() */ + bool ok; + vinfo_t* vimpl; + vinfo_t* vk = psyco_pobject_new(po, type, vargs, vkwds); + if (vk != NULL) { + extra_assert(Psyco_KnownType(vk) == type); + vimpl = vinfo_new(CompileTime_New((long) PyCompact_EmptyImpl)); + ok = psyco_put_field(po, vk, COMPACT_impl, vimpl); + vinfo_decref(vimpl, po); + if (!ok) { + vinfo_decref(vk, po); + return NULL; + } + } + return vk; +} + + + /***************************************************************/ + /*** Virtual-time compact objects ***/ + +/* A compact object allocated in the heap contains raw data and a pointer + to a compact_impl_t structure that may describe that some of this raw + data represents further virtual-time objects. This is implemented in + compactobject.c and optimized in pcompact_getattro/pcompact_setattro + above the present point. + + This section implements a further optimization: compact objects that + are not yet allocated in the heap at all. This only applies to + newly created compact objects. + + XXX NOT DONE YET +*/ + +#if 0 +static source_virtual_t psyco_computed_compact; + +static +vinfo_t* PsycoCompactObject_New(PyTypeObject* tp) +{ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_compact)); + result->array = array_new(COMPACT_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long) tp)); + result->array->items[iCOMPACT_IMPL] = + vinfo_new(CompileTime_New((long) &k_empty_impl)); + result->array->items[iCOMPACT_DATA] = psyco_vi_Zero(); + + vinfo_incref(self); + result->array->items[iMETHOD_IM_SELF] = self; + + Py_INCREF(cls); + result->array->items[iMETHOD_IM_CLASS] = + vinfo_new(CompileTime_NewSk(sk_new((long) cls, SkFlagPyObj))); + + return result; +} +#endif + + /***************************************************************/ + +INITIALIZATIONFN +void psy_compactobject_init(void) +{ + Psyco_DefineMeta(PyCompact_Type.tp_getattro, pcompact_getattro); + Psyco_DefineMeta(PyCompact_Type.tp_setattro, pcompact_setattro); + Psyco_DefineMeta(PyCompact_Type.tp_new, pcompact_new); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.h new file mode 100644 index 0000000..03d5f85 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pcompactobject.h @@ -0,0 +1,18 @@ + /***************************************************************/ +/*** Meta-version of compactobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_COMPACTOBJECT_H +#define _PSY_COMPACTOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +/***************************************************************/ + /* virtual compact objects. */ +/*EXTERNFN vinfo_t* PsycoCompact_New(PsycoObject* po); + XXX to do */ + +#endif /* _PSY_COMPACTOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.c new file mode 100644 index 0000000..2e6b198 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.c @@ -0,0 +1,58 @@ +#include "../psyfunc.h" +#include "pdescrobject.h" +#include "pstructmember.h" +#include "pmethodobject.h" + + +static vinfo_t* pmember_get(PsycoObject* po, PyMemberDescrObject* descr, + vinfo_t* obj, PyTypeObject *type) +{ + /* a meta-implementation for member_get() of descrobject.c. + Note that not all parameters are 'vinfo_t*'; only 'obj' + is. This is because PsycoObject_GenericGetAttr() gives + immediate values for the other two arguments. */ + + /* XXX We assume that 'obj' is a valid instance of 'type'. */ + return PsycoMember_GetOne(po, obj, descr->d_member); +} + +static vinfo_t* pmethod_get(PsycoObject* po, PyMethodDescrObject* descr, + vinfo_t* obj, PyTypeObject *type) +{ + /* a meta-implementation for method_get() of descrobject.c. + Same remarks as for pmember_get(). */ + return PsycoCFunction_New(po, descr->d_method, obj); +} + + +INITIALIZATIONFN +void psy_descrobject_init(void) +{ + PyObject* dummy; + PyTypeObject* PyMemberDescr_Type; + PyTypeObject* PyMethodDescr_Type; + PyMemberDef dummydef; + PyMethodDef dummydef2; + + /* Member descriptors */ + /* any better way to get a pointer to PyMemberDescr_Type? */ + memset(&dummydef, 0, sizeof(dummydef)); + dummydef.name = "dummy"; + dummy = PyDescr_NewMember(&PsycoFunction_Type, &dummydef); + PyMemberDescr_Type = dummy->ob_type; + Py_DECREF(dummy); + + Psyco_DefineMeta(PyMemberDescr_Type->tp_descr_get, + pmember_get); + + /* C Method descriptors */ + /* any better way to get a pointer to PyMethodDescr_Type? */ + memset(&dummydef2, 0, sizeof(dummydef2)); + dummydef2.ml_name = "dummy"; + dummy = PyDescr_NewMethod(&PsycoFunction_Type, &dummydef2); + PyMethodDescr_Type = dummy->ob_type; + Py_DECREF(dummy); + + Psyco_DefineMeta(PyMethodDescr_Type->tp_descr_get, + pmethod_get); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.h new file mode 100644 index 0000000..e374c21 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pdescrobject.h @@ -0,0 +1,13 @@ + /***************************************************************/ +/*** Psyco equivalent of descrobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_DESCROBJECT_H +#define _PSY_DESCROBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +#endif /* _PSY_DESCROBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pdictobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pdictobject.c new file mode 100644 index 0000000..c639c7c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pdictobject.c @@ -0,0 +1,55 @@ +#include "pdictobject.h" + + +#define DICT_ma_used FMUT(DEF_FIELD(PyDictObject, int, ma_used, OB_type)) +#define iDICT_MA_USED FIELD_INDEX(DICT_ma_used) + +DEFINEFN +vinfo_t* PsycoDict_New(PsycoObject* po) +{ + /* XXX no virtual dicts yet */ + vinfo_t* v = psyco_generic_call(po, PyDict_New, + CfReturnRef|CfPyErrIfNull, ""); + if (v == NULL) + return NULL; + + /* the result is a dict */ + Psyco_AssertType(po, v, &PyDict_Type); + return v; +} + +DEFINEFN +vinfo_t* PsycoDict_Copy(PsycoObject* po, vinfo_t* orig) +{ + vinfo_t* v = psyco_generic_call(po, PyDict_Copy, + CfReturnRef|CfPyErrIfNull, + "v", orig); + if (v == NULL) + return NULL; + + /* the result is a dict */ + Psyco_AssertType(po, v, &PyDict_Type); + return v; +} + +DEFINEFN +bool PsycoDict_SetItem(PsycoObject* po, vinfo_t* vdict, + PyObject* key, vinfo_t* vvalue) +{ + return psyco_generic_call(po, PyDict_SetItem, + CfNoReturnValue|CfPyErrIfNeg, + "vlv", vdict, (long) key, vvalue) != NULL; +} + +static vinfo_t* psyco_dict_length(PsycoObject* po, vinfo_t* vi) +{ + return psyco_get_field(po, vi, DICT_ma_used); +} + + +INITIALIZATIONFN +void psy_dictobject_init(void) +{ + PyMappingMethods *m = PyDict_Type.tp_as_mapping; + Psyco_DefineMeta(m->mp_length, psyco_dict_length); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pdictobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pdictobject.h new file mode 100644 index 0000000..2f64b03 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pdictobject.h @@ -0,0 +1,19 @@ + /***************************************************************/ +/*** Psyco equivalent of dictobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_DICTOBJECT_H +#define _PSY_DICTOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +EXTERNFN vinfo_t* PsycoDict_New(PsycoObject* po); +EXTERNFN vinfo_t* PsycoDict_Copy(PsycoObject* po, vinfo_t* orig); +EXTERNFN bool PsycoDict_SetItem(PsycoObject* po, vinfo_t* vdict, + PyObject* key, vinfo_t* vvalue); + + +#endif /* _PSY_LISTOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.c new file mode 100644 index 0000000..4544020 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.c @@ -0,0 +1,599 @@ +#include "pfloatobject.h" +#include "plongobject.h" +#include "pboolobject.h" + +#if HAVE_FP_FN_CALLS + +#ifdef WANT_SIGFPE_HANDLER +# define CF_PURE_FP_HELPER (CfPure|CfNoReturnValue|CfPyErrIfNonNull) +#else +# define CF_PURE_FP_HELPER (CfPure|CfNoReturnValue) +#endif + +static int +cimpl_fp_cmp(double a, double b) { + return (a < b) ? -1 : (a > b) ? 1 : 0; +} + +/* XXX the following is only valid if sizeof(long) < sizeof(double). + See Python 2.4's PyFloat_Type.tp_richcompare() */ +static int cimpl_fp_eq_int(double a, long b) { return a == (double) b; } +static int cimpl_fp_ne_int(double a, long b) { return a != (double) b; } +static int cimpl_fp_le_int(double a, long b) { return a <= (double) b; } +static int cimpl_fp_lt_int(double a, long b) { return a < (double) b; } +static int cimpl_fp_ge_int(double a, long b) { return a >= (double) b; } +static int cimpl_fp_gt_int(double a, long b) { return a > (double) b; } + +static int cimpl_fp_eq_fp(double a, double b) { return a == b; } +static int cimpl_fp_ne_fp(double a, double b) { return a != b; } +static int cimpl_fp_le_fp(double a, double b) { return a <= b; } +static int cimpl_fp_lt_fp(double a, double b) { return a < b; } + +static int +cimpl_fp_add(double a, double b, double* result) { + PyFPE_START_PROTECT("add", return -1) + *result = a + b; + PyFPE_END_PROTECT(*result) + return 0; +} + +static int +cimpl_fp_sub(double a, double b, double* result) { + PyFPE_START_PROTECT("subtract", return -1) + *result = a - b; + PyFPE_END_PROTECT(*result) + return 0; +} + + +static int +cimpl_fp_mul(double a, double b, double* result) { + PyFPE_START_PROTECT("multiply", return -1) + *result = a * b; + PyFPE_END_PROTECT(*result) + return 0; +} + +static int +cimpl_fp_div(double a, double b, double* result) { + if (b == 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + return -1; + } + PyFPE_START_PROTECT("divide", return -1) + *result = a / b; + PyFPE_END_PROTECT(*result) + return 0; +} + +static int +cimpl_fp_pow(double iv, double iw, double* result) { + double ix; + /* Sort out special cases here instead of relying on pow() */ + if (iw == 0) { /* v**0 is 1, even 0**0 */ + *result = 1.0; + return 0; + } + if (iv == 0.0) { /* 0**w is error if w<0, else 0 */ + if (iw < 0.0) { + PyErr_SetString(PyExc_ZeroDivisionError, + "0.0 cannot be raised to a negative power"); + return -1; + } + *result = 0.0; + return 0; + } + if (iv < 0.0) { + /* Whether this is an error is a mess, and bumps into libm + * bugs so we have to figure it out ourselves. + */ + if (iw != floor(iw)) { + PyErr_SetString(PyExc_ValueError, "negative number " + "cannot be raised to a fractional power"); + return -1; + } + /* iw is an exact integer, albeit perhaps a very large one. + * -1 raised to an exact integer should never be exceptional. + * Alas, some libms (chiefly glibc as of early 2003) return + * NaN and set EDOM on pow(-1, large_int) if the int doesn't + * happen to be representable in a *C* integer. That's a + * bug; we let that slide in math.pow() (which currently + * reflects all platform accidents), but not for Python's **. + */ + if (iv == -1.0 && !Py_IS_INFINITY(iw) && iw == iw) { + /* XXX the "iw == iw" was to weed out NaNs. This + * XXX doesn't actually work on all platforms. + */ + /* Return 1 if iw is even, -1 if iw is odd; there's + * no guarantee that any C integral type is big + * enough to hold iw, so we have to check this + * indirectly. + */ + ix = floor(iw * 0.5) * 2.0; + *result = ix == iw ? 1.0 : -1.0; + return 0; + } + /* Else iv != -1.0, and overflow or underflow are possible. + * Unless we're to write pow() ourselves, we have to trust + * the platform to do this correctly. + */ + } + errno = 0; + PyFPE_START_PROTECT("pow", return -1) + ix = pow(iv, iw); + PyFPE_END_PROTECT(ix) +#ifdef Py_ADJUST_ERANGE1 + Py_ADJUST_ERANGE1(ix); +#else +# ifdef Py_SET_ERANGE_IF_OVERFLOW + Py_SET_ERANGE_IF_OVERFLOW(ix); +# endif +#endif + if (errno != 0) { + /* We don't expect any errno value other than ERANGE, but + * the range of libm bugs appears unbounded. + */ + PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : + PyExc_ValueError); + return -1; + } + *result = ix; + return 0; +} + +static int +cimpl_fp_nonzero(double a) { + return (a != 0); +} + +static void +cimpl_fp_neg(double a, double* result) { + *result = -a; +} + +static void +cimpl_fp_abs(double a, double* result) { + *result = fabs(a); +} + + +DEFINEFN void +cimpl_fp_from_long(long value, double* result) +{ + *result = value; +} + +DEFINEFN void +cimpl_fp_from_float(float value, double* result) +{ + *result = value; +} + + +DEFINEFN +vinfo_t* PsycoFloat_FromFloat(PsycoObject* po, vinfo_t* vfloat) +{ + vinfo_t* x; + vinfo_array_t* result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_from_float, CfNoReturnValue|CfPure, + "va", vfloat, result); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; +} + +DEFINEFN +bool PsycoFloat_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** result_1, vinfo_t** result_2) +{ + PyNumberMethods *nb; + PyTypeObject* tp; + + tp = Psyco_NeedType(po, v); + if (tp == NULL) + return false; + + if (PsycoFloat_Check(tp)) { + *result_1 = PsycoFloat_AS_DOUBLE_1(po, v); + *result_2 = PsycoFloat_AS_DOUBLE_2(po, v); + if (*result_1 == NULL || *result_2 == NULL) + return false; + vinfo_incref(*result_1); + vinfo_incref(*result_2); + return true; + } + + if ((nb = tp->tp_as_number) == NULL || nb->nb_float == NULL) { + PycException_SetString(po, PyExc_TypeError, + "a float is required"); + return false; + } + + v = Psyco_META1(po, nb->nb_float, + CfReturnRef|CfPyErrIfNull, + "v", v); + if (v == NULL) + return false; + + /* silently assumes the result is a float object */ + *result_1 = PsycoFloat_AS_DOUBLE_1(po, v); + *result_2 = PsycoFloat_AS_DOUBLE_2(po, v); + if (*result_1 == NULL || *result_2 == NULL) { + vinfo_decref(v, po); + return false; + } + vinfo_incref(*result_1); + vinfo_incref(*result_2); + vinfo_decref(v, po); + return true; +} + +static bool compute_float(PsycoObject* po, vinfo_t* floatobj) +{ + vinfo_t* newobj; + vinfo_t* first_half; + vinfo_t* second_half; + + /* get the field 'ob_fval' from the Python object 'floatobj' */ + first_half = vinfo_getitem(floatobj, iFLOAT_OB_FVAL+0); + second_half = vinfo_getitem(floatobj, iFLOAT_OB_FVAL+1); + if (first_half == NULL || second_half == NULL) + return false; + + /* call PyFloat_FromDouble() */ + newobj = psyco_generic_call(po, PyFloat_FromDouble, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", first_half, second_half); + + if (newobj == NULL) + return false; + + /* move the resulting non-virtual Python object back into 'floatobj' */ + vinfo_move(po, floatobj, newobj); + return true; +} + +static PyObject* direct_compute_float(vinfo_t* floatobj, char* data) +{ + double value; + long* vl = (long*) &value; + extra_assert(sizeof(double) == 2*sizeof(long)); + vl[0] = direct_read_vinfo(vinfo_getitem(floatobj, iINT_OB_IVAL+0), data); + vl[1] = direct_read_vinfo(vinfo_getitem(floatobj, iINT_OB_IVAL+1), data); + if (PyErr_Occurred()) + return NULL; + return PyFloat_FromDouble(value); +} + + +DEFINEVAR source_virtual_t psyco_computed_float; + + + /***************************************************************/ + /*** float objects meta-implementation ***/ + + +#define CONVERT_TO_DOUBLE_CORE(vobj, v1, v2, ERRORACTION) \ + switch (psyco_convert_to_double(po, vobj, &v1, &v2)) { \ + case true: \ + break; /* fine */ \ + case false: \ + return ERRORACTION; /* error or promotion */ \ + default: \ + ERRORACTION; \ + return psyco_vi_NotImplemented(); /* cannot do it */ \ + } + +#define CONVERT_TO_DOUBLE(vobj, v1, v2) \ + CONVERT_TO_DOUBLE_CORE(vobj, v1, v2, return_null()) + +#define CONVERT_TO_DOUBLE2(uobj, u1, u2, vobj, v1, v2) \ + CONVERT_TO_DOUBLE_CORE(uobj, u1, u2, return_null()); \ + CONVERT_TO_DOUBLE_CORE(vobj, v1, v2, release_double(po, u1, u2)) + +#define RELEASE_DOUBLE(v1, v2) \ + vinfo_decref(v1, po); \ + vinfo_decref(v2, po); + +#define RELEASE_DOUBLE2(v1, v2, u1, u2) \ + vinfo_decref(v1, po); \ + vinfo_decref(v2, po); \ + vinfo_decref(u1, po); \ + vinfo_decref(u2, po); + +static vinfo_t* release_double(PsycoObject* po, vinfo_t* u1, vinfo_t* u2) { + vinfo_decref(u1, po); + vinfo_decref(u2, po); + return NULL; +} + +static vinfo_t* return_null(void) { + return NULL; +} + + +DEFINEFN +int psyco_convert_to_double(PsycoObject* po, vinfo_t* vobj, + vinfo_t** pv1, vinfo_t** pv2) +{ + /* TypeSwitch */ + PyTypeObject* vtp = Psyco_NeedType(po, vobj); + if (vtp == NULL) + return false; + + if (PyType_TypeCheck(vtp, &PyInt_Type)) { + vinfo_array_t* result = array_new(2); + psyco_generic_call(po, cimpl_fp_from_long, CfNoReturnValue|CfPure, + "va", PsycoInt_AS_LONG(po, vobj), result); + *pv1 = result->items[0]; + *pv2 = result->items[1]; + array_release(result); + return true; + } + if (PyType_TypeCheck(vtp, &PyLong_Type)) { + return PsycoLong_AsDouble(po, vobj, pv1, pv2); + } + if (PyType_TypeCheck(vtp, &PyFloat_Type)) { + *pv1 = PsycoFloat_AS_DOUBLE_1(po, vobj); + *pv2 = PsycoFloat_AS_DOUBLE_2(po, vobj); + if (*pv1 == NULL || *pv2 == NULL) + return false; + vinfo_incref(*pv1); + vinfo_incref(*pv2); + return true; + } + return -1; /* cannot do it */ +} + +static vinfo_t* pfloat_cmp(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + /* Python < 2.4 */ + vinfo_t *a1, *a2, *b1, *b2, *x; + /* We could probably assume that these are floats, but using CONVERT is easier */ + CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); + x = psyco_generic_call(po, cimpl_fp_cmp, CfPure|CfReturnNormal, "vvvv", a1, a2, b1, b2); + RELEASE_DOUBLE2(a1, a2, b1, b2); + return x; +} + +static vinfo_t* pfloat_richcompare(PsycoObject* po, vinfo_t* v, + vinfo_t* w, int op) +{ + /* Python >= 2.4 */ + /* TypeSwitch */ + PyTypeObject* wtp; + vinfo_t *a1, *a2, *b1, *b2, *r; + void* fn; + + wtp = Psyco_NeedType(po, w); + if (wtp == NULL) + return NULL; + + extra_assert(Psyco_KnownType(v) != NULL); + extra_assert(PsycoFloat_Check(Psyco_KnownType(v))); + a1 = PsycoFloat_AS_DOUBLE_1(po, v); + a2 = PsycoFloat_AS_DOUBLE_2(po, v); + if (a1 == NULL || a2 == NULL) + return NULL; + + if (PyType_TypeCheck(wtp, &PyInt_Type)) { + switch (op) { + case Py_EQ: fn = cimpl_fp_eq_int; break; + case Py_NE: fn = cimpl_fp_ne_int; break; + case Py_LE: fn = cimpl_fp_le_int; break; + case Py_GE: fn = cimpl_fp_ge_int; break; + case Py_LT: fn = cimpl_fp_lt_int; break; + case Py_GT: fn = cimpl_fp_gt_int; break; + default: Py_FatalError("bad richcmp op"); return NULL; + } + r = psyco_generic_call(po, fn, CfReturnNormal|CfPure, + "vvv", a1, a2, PsycoInt_AS_LONG(po, w)); + if (r != NULL) + r = PsycoBool_FROM_LONG(r); + return r; + } + if (PyType_TypeCheck(wtp, &PyLong_Type)) { + /* fall back */ + return psyco_generic_call(po, PyFloat_Type.tp_richcompare, + CfReturnRef|CfPure, + "vvl", v, w, op); + } + if (PyType_TypeCheck(wtp, &PyFloat_Type)) { + b1 = PsycoFloat_AS_DOUBLE_1(po, w); + b2 = PsycoFloat_AS_DOUBLE_2(po, w); + if (b1 == NULL || b2 == NULL) + return NULL; +#define SWAP_A_B r=a1; a1=b1; b1=r; r=a2; a2=b2; b2=r + switch (op) { + case Py_EQ: fn = cimpl_fp_eq_fp; break; + case Py_NE: fn = cimpl_fp_ne_fp; break; + case Py_LE: fn = cimpl_fp_le_fp; break; + case Py_GE: fn = cimpl_fp_le_fp; SWAP_A_B; break; + case Py_LT: fn = cimpl_fp_lt_fp; break; + case Py_GT: fn = cimpl_fp_lt_fp; SWAP_A_B; break; + default: Py_FatalError("bad richcmp op"); return NULL; + } +#undef SWAP_A_B + r = psyco_generic_call(po, fn, CfReturnNormal|CfPure, + "vvvv", a1, a2, b1, b2); + if (r != NULL) + r = PsycoBool_FROM_LONG(r); + return r; + } + + return psyco_vi_NotImplemented(); /* cannot do it */ +} + +static vinfo_t* pfloat_nonzero(PsycoObject* po, vinfo_t* v) +{ + vinfo_t *a1, *a2; + /* Assume that this is a float */ + a1 = PsycoFloat_AS_DOUBLE_1(po, v); + a2 = PsycoFloat_AS_DOUBLE_2(po, v); + if (a1 == NULL || a2 == NULL) + return NULL; + return psyco_generic_call(po, cimpl_fp_nonzero, CfPure|CfReturnNormal, "vv", a1, a2); +} + +static vinfo_t* pfloat_pos(PsycoObject* po, vinfo_t* v) +{ + vinfo_t *a1, *a2, *x; + CONVERT_TO_DOUBLE(v, a1, a2); + x = PsycoFloat_FromDouble(a1, a2); + RELEASE_DOUBLE(a1, a2); + return x; +} + + +static vinfo_t* pfloat_neg(PsycoObject* po, vinfo_t* v) +{ + vinfo_t *a1, *a2, *x; + vinfo_array_t* result; + CONVERT_TO_DOUBLE(v, a1, a2); + result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_neg, CfPure|CfNoReturnValue, + "vva", a1, a2, result); + RELEASE_DOUBLE(a1, a2); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; +} + +static vinfo_t* pfloat_abs(PsycoObject* po, vinfo_t* v) +{ + vinfo_t *a1, *a2, *x; + vinfo_array_t* result; + CONVERT_TO_DOUBLE(v, a1, a2); + result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_abs, CfPure|CfNoReturnValue, + "vva", a1, a2, result); + RELEASE_DOUBLE(a1, a2); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; +} + +static vinfo_t* pfloat_add(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t *a1, *a2, *b1, *b2, *x; + vinfo_array_t* result; + CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); + result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_add, CF_PURE_FP_HELPER, + "vvvva", a1, a2, b1, b2, result); + RELEASE_DOUBLE2(a1, a2, b1, b2); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; +} + +static vinfo_t* pfloat_sub(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t *a1, *a2, *b1, *b2, *x; + vinfo_array_t* result; + CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); + result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_sub, CF_PURE_FP_HELPER, + "vvvva", a1, a2, b1, b2, result); + RELEASE_DOUBLE2(a1, a2, b1, b2); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; +} + +static vinfo_t* pfloat_mul(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t *a1, *a2, *b1, *b2, *x; + vinfo_array_t* result; + CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); + result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_mul, CF_PURE_FP_HELPER, + "vvvva", a1, a2, b1, b2, result); + RELEASE_DOUBLE2(a1, a2, b1, b2); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; +} + +static vinfo_t* pfloat_div(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t *a1, *a2, *b1, *b2, *x; + vinfo_array_t* result; + CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); + result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_div, CfPure|CfNoReturnValue|CfPyErrIfNonNull, + "vvvva", a1, a2, b1, b2, result); + RELEASE_DOUBLE2(a1, a2, b1, b2); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; +} + +static vinfo_t* pfloat_pow(PsycoObject* po, vinfo_t* v, vinfo_t* w, vinfo_t* z) +{ + vinfo_t *a1, *a2, *b1, *b2, *x; + vinfo_array_t* result; + if (!psyco_knowntobe(z, (long) Py_None)) + goto fallback; + CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); + result = array_new(2); + x = psyco_generic_call(po, cimpl_fp_pow, CF_PURE_FP_HELPER, + "vvvva", a1, a2, b1, b2, result); + RELEASE_DOUBLE2(a1, a2, b1, b2); + if (x != NULL) { + x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); + } + array_release(result); + return x; + + fallback: + return psyco_generic_call(po, PyFloat_Type.tp_as_number->nb_power, + CfReturnRef|CfPyErrIfNull, + "vvv", v, w, z); +} + + +INITIALIZATIONFN +void psy_floatobject_init(void) +{ + PyNumberMethods *m = PyFloat_Type.tp_as_number; + Psyco_DefineMeta(m->nb_nonzero, pfloat_nonzero); + + Psyco_DefineMeta(m->nb_positive, pfloat_pos); + Psyco_DefineMeta(m->nb_negative, pfloat_neg); + Psyco_DefineMeta(m->nb_absolute, pfloat_abs); + + Psyco_DefineMeta(m->nb_add, pfloat_add); + Psyco_DefineMeta(m->nb_subtract, pfloat_sub); + Psyco_DefineMeta(m->nb_multiply, pfloat_mul); + Psyco_DefineMeta(m->nb_divide, pfloat_div); + Psyco_DefineMeta(m->nb_power, pfloat_pow); + + if (PyFloat_Type.tp_compare == NULL) /* Python >= 2.4 */ + Psyco_DefineMeta(PyFloat_Type.tp_richcompare, pfloat_richcompare); + else + Psyco_DefineMeta(PyFloat_Type.tp_compare, pfloat_cmp); + + INIT_SVIRTUAL(psyco_computed_float, compute_float, + direct_compute_float, 0, 0, 0); +} + +#else /* !HAVE_FP_FN_CALLS */ +INITIALIZATIONFN +void psy_floatobject_init(void) +{ +} +#endif /* !HAVE_FP_FN_CALLS */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.h new file mode 100644 index 0000000..56a6c96 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pfloatobject.h @@ -0,0 +1,81 @@ + /***************************************************************/ +/*** Psyco equivalent of floatobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_FLOATOBJECT_H +#define _PSY_FLOATOBJECT_H + +#include +#if HAVE_FP_FN_CALLS /* disable float optimizations if functions with + float/double arguments are not implemented + in the back-end */ +#include "pobject.h" +#include "pabstract.h" +#include "pintobject.h" + +#define FLOAT_ob_fval DEF_FIELD(PyFloatObject, double, ob_fval, OB_type) +#define iFLOAT_OB_FVAL FIELD_INDEX(FLOAT_ob_fval) +#define FLOAT_TOTAL FIELDS_TOTAL(FLOAT_ob_fval) + +#define PsycoFloat_Check(tp) PyType_TypeCheck(tp, &PyFloat_Type) + + +/***************************************************************/ +/*** Virtual-time object builder ***/ + +/* not-yet-computed integers; it will call PyFloat_FromDouble */ +EXTERNVAR source_virtual_t psyco_computed_float; + +/* !! consumes a references to vdouble. PsycoFloat_FromLong() does not. */ +PSY_INLINE vinfo_t* PsycoFloat_FROM_DOUBLE(vinfo_t* vdouble1, vinfo_t* vdouble2) +{ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_float)); + result->array = array_new(FLOAT_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyFloat_Type))); + result->array->items[iFLOAT_OB_FVAL+0] = vdouble1; + result->array->items[iFLOAT_OB_FVAL+1] = vdouble2; + return result; +} + +PSY_INLINE vinfo_t* PsycoFloat_FromDouble(vinfo_t* vdouble1, vinfo_t* vdouble2) +{ + vinfo_incref(vdouble1); + vinfo_incref(vdouble2); + return PsycoFloat_FROM_DOUBLE(vdouble1, vdouble2); +} + +EXTERNFN vinfo_t* PsycoFloat_FromFloat(PsycoObject* po, vinfo_t* vfloat); + +PSY_INLINE vinfo_t* PsycoFloat_AS_DOUBLE_1(PsycoObject* po, vinfo_t* v) +{ /* no type check; does not return a new reference. */ + return psyco_get_const(po, v, FLOAT_ob_fval); +} + +PSY_INLINE vinfo_t* PsycoFloat_AS_DOUBLE_2(PsycoObject* po, vinfo_t* v) +{ /* no type check; does not return a new reference. */ + return psyco_get_const(po, v, FIELD_PART2(FLOAT_ob_fval)); +} + +/* return a new ref */ +EXTERNFN bool PsycoFloat_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** vd1, vinfo_t** vd2); + +/* return true if successful, false if error or promotion, or + -1 if the convertion is impossible */ +EXTERNFN int psyco_convert_to_double(PsycoObject* po, vinfo_t* vobj, + vinfo_t** pv1, vinfo_t** pv2); + +/*EXTERNFN condition_code_t float_cmp(PsycoObject* po, vinfo_t* a1, vinfo_t* a2, + vinfo_t* b1, vinfo_t* b2, int op);*/ + + +/* Some C implementations made visible for Modules/pmath.c */ +EXTERNFN void +cimpl_fp_from_long(long value, double* result); +EXTERNFN void +cimpl_fp_from_float(float value, double* result); + + +#endif /* HAVE_FP_FN_CALLS */ + +#endif /* _PSY_FLOATOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.c new file mode 100644 index 0000000..20f1720 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.c @@ -0,0 +1,234 @@ +#include "../psyfunc.h" +#include "pfuncobject.h" +#include "pclassobject.h" + + + /***************************************************************/ + /*** Virtual functions ***/ + +static source_virtual_t psyco_computed_function; + +static bool compute_function(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* newobj; + vinfo_t* fcode; + vinfo_t* fglobals; + vinfo_t* fdefaults; + + fcode = vinfo_getitem(v, iFUNC_CODE); + if (fcode == NULL) + return false; + + fglobals = vinfo_getitem(v, iFUNC_GLOBALS); + if (fglobals == NULL) + return false; + + fdefaults = vinfo_getitem(v, iFUNC_DEFAULTS); + if (fdefaults == NULL) + return false; + + newobj = psyco_generic_call(po, PyFunction_New, + CfReturnRef|CfPyErrIfNull, + "vv", fcode, fglobals); + if (newobj == NULL) + return false; + + if (!psyco_knowntobe(fdefaults, (long) NULL)) { + if (!psyco_generic_call(po, PyFunction_SetDefaults, + CfNoReturnValue|CfPyErrIfNonNull, + "vv", newobj, fdefaults)) + return false; + } + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, newobj); + return true; +} + +#if 0 /* not needed currently */ +static PyObject* direct_compute_function(vinfo_t* v, char* data) +{ + PyObject* fcode; + PyObject* fglobals; + PyObject* fdefaults; + PyObject* result = NULL; + + fcode = direct_xobj_vinfo(vinfo_getitem(v, iFUNC_CODE), data); + fglobals = direct_xobj_vinfo(vinfo_getitem(v, iFUNC_GLOBALS), data); + fdefaults = direct_xobj_vinfo(vinfo_getitem(v, iFUNC_DEFAULTS), data); + + if (!PyErr_Occurred() && fcode != NULL && fglobals != NULL) { + result = PyFunction_New(fcode, fglobals); + if (result != NULL && fdefaults != NULL) { + if (PyFunction_SetDefaults(result, fdefaults) != 0) { + Py_DECREF(result); + result = NULL; + } + } + } + Py_XDECREF(fdefaults); + Py_XDECREF(fglobals); + Py_XDECREF(fcode); + return result; +} +#endif + + +DEFINEFN +vinfo_t* PsycoFunction_New(PsycoObject* po, vinfo_t* fcode, + vinfo_t* fglobals, vinfo_t* fdefaults) +{ + vinfo_t* r; + + /* fdefaults contains potential arguments; mutable objects there + must be forced out of virtual-time right now */ + if (fdefaults != NULL && !psyco_forking(po, fdefaults->array)) + return NULL; + + /* Build a virtual function object */ + r = vinfo_new(VirtualTime_New(&psyco_computed_function)); + r->array = array_new(FUNC_TOTAL); + r->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyFunction_Type))); + vinfo_incref(fcode); + r->array->items[iFUNC_CODE] = fcode; + vinfo_incref(fglobals); + r->array->items[iFUNC_GLOBALS] = fglobals; + if (fdefaults == NULL) + fdefaults = psyco_vi_Zero(); + else + vinfo_incref(fdefaults); + r->array->items[iFUNC_DEFAULTS] = fdefaults; + return r; +} + + + /***************************************************************/ + /*** function objects meta-implementation ***/ + +DEFINEFN +vinfo_t* pfunction_simple_call(PsycoObject* po, PyObject* f, + vinfo_t* arg, bool allow_inline) +{ + PyObject* glob; + PyObject* defl; + PyCodeObject* co; + vinfo_t* fglobals; + vinfo_t* fdefaults; + vinfo_t* result; + int saved_inlining; + + /* XXX we capture the code object, so this breaks if someone + changes the .func_code attribute of the function later */ + co = (PyCodeObject*) PyFunction_GET_CODE(f); + if (PyCode_GetNumFree(co) > 0) + goto fallback; + + glob = PyFunction_GET_GLOBALS(f); + defl = PyFunction_GET_DEFAULTS(f); + Py_INCREF(glob); + fglobals = vinfo_new(CompileTime_NewSk(sk_new + ((long)glob, SkFlagPyObj))); + if (defl == NULL) + fdefaults = psyco_vi_Zero(); + else { + Py_INCREF(defl); + fdefaults = vinfo_new(CompileTime_NewSk(sk_new + ((long)defl, SkFlagPyObj))); + } + + saved_inlining = po->pr.is_inlining; + if (!allow_inline) + po->pr.is_inlining = true; + result = psyco_call_pyfunc(po, co, fglobals, fdefaults, + arg, po->pr.auto_recursion); + po->pr.is_inlining = saved_inlining; + vinfo_decref(fdefaults, po); + vinfo_decref(fglobals, po); + return result; + + fallback: + return psyco_generic_call(po, PyFunction_Type.tp_call, + CfReturnRef|CfPyErrIfNull, + "lvl", (long) f, arg, 0); +} + +DEFINEFN +vinfo_t* pfunction_call(PsycoObject* po, vinfo_t* func, + vinfo_t* arg, vinfo_t* kw) +{ + if (!psyco_knowntobe(kw, (long) NULL)) + goto fallback; + + if (!is_virtualtime(func->source)) { + /* run-time or compile-time values: promote the + function object as a whole into compile-time */ + PyObject* f; + switch (psyco_pyobj_atcompiletime_mega(po, func, &f)) { + + case 1: /* promotion ok */ + return pfunction_simple_call(po, f, arg, true); + + case 0: /* megamorphic site */ + goto fallback; /* XXX could do better */ + + default: + return NULL; + } + } + else { /* virtual-time function objects: read the + individual components */ + PyCodeObject* co; + vinfo_t* fcode; + vinfo_t* fglobals; + vinfo_t* fdefaults; + + fcode = vinfo_getitem(func, iFUNC_CODE); + if (fcode == NULL) + return NULL; + co = (PyCodeObject*)psyco_pyobj_atcompiletime(po, fcode); + if (co == NULL) + return NULL; + + fglobals = vinfo_getitem(func, iFUNC_GLOBALS); + if (fglobals == NULL) + return NULL; + + fdefaults = vinfo_getitem(func, iFUNC_DEFAULTS); + if (fdefaults == NULL) + return NULL; + + return psyco_call_pyfunc(po, co, fglobals, fdefaults, + arg, po->pr.auto_recursion); + } + + fallback: + + return psyco_generic_call(po, PyFunction_Type.tp_call, + CfReturnRef|CfPyErrIfNull, + "vvv", func, arg, kw); +} + + +static vinfo_t* pfunc_descr_get(PsycoObject* po, PyObject* func, + vinfo_t* obj, PyObject* type) +{ + /* see comments of pmember_get() in pdescrobject.c. */ + + /* XXX obj is never Py_None here in the current implementation, + but could be if called by other routines than + PsycoObject_GenericGetAttr(). */ + return PsycoMethod_New(func, obj, type); +} + + +INITIALIZATIONFN +void psy_funcobject_init(void) +{ + Psyco_DefineMeta(PyFunction_Type.tp_call, pfunction_call); + Psyco_DefineMeta(PyFunction_Type.tp_descr_get, pfunc_descr_get); + + /* function object are mutable; + they must be forced out of virtual-time across function calls */ + INIT_SVIRTUAL_NOCALL(psyco_computed_function, compute_function, 1); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.h new file mode 100644 index 0000000..b8c6590 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pfuncobject.h @@ -0,0 +1,37 @@ + /***************************************************************/ +/*** Psyco equivalent of funcobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_FUNCOBJECT_H +#define _PSY_FUNCOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +#define FUNC_code DEF_FIELD(PyFunctionObject, PyObject*, func_code, OB_type) +#define FUNC_globals DEF_FIELD(PyFunctionObject, PyObject*, func_globals, \ + FUNC_code) +#define FUNC_defaults DEF_FIELD(PyFunctionObject, PyObject*, func_defaults, \ + FUNC_globals) +#define iFUNC_CODE FIELD_INDEX(FUNC_code) +#define iFUNC_GLOBALS FIELD_INDEX(FUNC_globals) +#define iFUNC_DEFAULTS FIELD_INDEX(FUNC_defaults) +#define FUNC_TOTAL FIELDS_TOTAL(FUNC_defaults) + + +EXTERNFN vinfo_t* pfunction_call(PsycoObject* po, vinfo_t* func, + vinfo_t* arg, vinfo_t* kw); +EXTERNFN vinfo_t* pfunction_simple_call(PsycoObject* po, PyObject* f, + vinfo_t* arg, bool allow_inline); + + +/***************************************************************/ +/* virtual functions. */ +/* 'fdefaults' may be NULL. */ +EXTERNFN vinfo_t* PsycoFunction_New(PsycoObject* po, vinfo_t* fcode, + vinfo_t* fglobals, vinfo_t* fdefaults); + + +#endif /* _PSY_FUNCOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pintobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pintobject.c new file mode 100644 index 0000000..65b9ef4 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pintobject.c @@ -0,0 +1,539 @@ +#include "pintobject.h" +#include "plongobject.h" + + +/* Division and Modulo code follows Python's intobject.c */ +static long cimpl_int_mod(long x, long y) +{ + long xmody; + /* (-sys.maxint-1)/-1 is the only overflow case. */ + if (y == 0 || (y == -1 && x == LONG_MIN)) { + /* the exception will be cleared by the caller */ + PyErr_SetString(PyExc_ValueError, "punt and do this in python code"); + return -1; + } + xmody = x % y; + if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) { + xmody += y; + } + return xmody; +} + +static long cimpl_int_div(long x, long y) +{ + long xdivy; + long xmody; + /* (-sys.maxint-1)/-1 is the only overflow case. */ + if (y == 0 || (y == -1 && x == LONG_MIN)) { + /* the exception will be cleared by the caller */ + PyErr_SetString(PyExc_ValueError, "punt and do this in python code"); + return -1; + } + xdivy = x / y; + xmody = x - xdivy * y; + if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) { + --xdivy; + } + return xdivy; +} + +static long cimpl_int_pow2_nonneg(long iv, long iw) +{ + long ix, prev, temp; + extra_assert(iw >= 0); + /* code from Python 2.5 */ + temp = iv; + ix = 1; + while (iw > 0) { + prev = ix; /* Save value for overflow check */ + if (iw & 1) { + ix = ix*temp; + if (temp == 0) + break; /* Avoid ix / 0 */ + if (ix / temp != prev) + goto overflow; + } + iw >>= 1; /* Shift exponent down by 1 bit */ + if (iw==0) break; + prev = temp; + temp *= temp; /* Square the value of temp */ + if (prev != 0 && temp / prev != prev) + goto overflow; + } + return ix; + + overflow: + /* the exception will be cleared by the caller */ + PyErr_SetString(PyExc_OverflowError, "punt and do this in python code"); + return -1; +} + +static long cimpl_int_pow2(long iv, long iw) +{ + if (iw < 0) { + /* the exception will be cleared by the caller */ + PyErr_SetString(PyExc_ValueError, + "punt and do this in python code"); + return -1; + } + return cimpl_int_pow2_nonneg(iv, iw); +} + +DEFINEFN +vinfo_t* PsycoInt_AsLong(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* result; + PyNumberMethods *nb; + PyTypeObject* tp; + + tp = Psyco_NeedType(po, v); + if (tp == NULL) + return NULL; + + if (PsycoInt_Check(tp)) { + result = PsycoInt_AS_LONG(po, v); + if (result != NULL) + vinfo_incref(result); + return result; + } + + if ((nb = tp->tp_as_number) == NULL || nb->nb_int == NULL) { + PycException_SetString(po, PyExc_TypeError, + "an integer is required"); + return NULL; + } + + return psyco_generic_call(po, PyInt_AsLong, + CfReturnNormal|CfPyErrCheckMinus1, + "v", v); +#if 0 + --- DISABLED: cannot promote the type of a returned object :-( --- + v = Psyco_META1(po, nb->nb_int, + CfReturnRef|CfPyErrIfNull, + "v", v); + if (v == NULL) + return NULL; + + /* check the returned type */ + result = NULL; + tp = Psyco_NeedType(po, v); + if (tp != NULL) { + if (PsycoInt_Check(tp)) { + result = PsycoInt_AS_LONG(po, v); + if (result != NULL) + vinfo_incref(result); + } + else if (PsycoLong_Check(tp)) { + result = PsycoLong_AsLong(po, v); + } + else { /* fall back */ + result = psyco_generic_call(po, PyInt_AsLong, + CfReturnNormal|CfPyErrCheckMinus1, + "v", v); + } + } + vinfo_decref(v, po); + return result; +#endif +} + +static bool compute_int(PsycoObject* po, vinfo_t* intobj) +{ + vinfo_t* newobj; + vinfo_t* x; + + /* get the field 'ob_ival' from the Python object 'intobj' */ + x = vinfo_getitem(intobj, iINT_OB_IVAL); + if (x == NULL) + return false; + + /* call PyInt_FromLong() */ + newobj = psyco_generic_call(po, PyInt_FromLong, + CfPure|CfReturnRef|CfPyErrIfNull, "v", x); + if (newobj == NULL) + return false; + + /* move the resulting non-virtual Python object back into 'intobj' */ + vinfo_move(po, intobj, newobj); + return true; +} + +static PyObject* direct_compute_int(vinfo_t* intobj, char* data) +{ + int ival; + ival = direct_read_vinfo(vinfo_getitem(intobj, iINT_OB_IVAL), data); + if (ival == -1 && PyErr_Occurred()) + return NULL; + return PyInt_FromLong(ival); +} + + +DEFINEVAR source_virtual_t psyco_computed_int; + + + /***************************************************************/ + /*** integer objects meta-implementation ***/ + +static vinfo_t* pint_nonzero(PsycoObject* po, vinfo_t* intobj) +{ + vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); + condition_code_t cc = integer_non_null(po, ival); + if (cc == CC_ERROR) + return NULL; + return psyco_vinfo_condition(po, cc); +} + +static vinfo_t* pint_pos(PsycoObject* po, vinfo_t* intobj) +{ + if (Psyco_KnownType(intobj) == &PyInt_Type) { + vinfo_incref(intobj); + return intobj; + } + else { + vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); + if (ival == NULL) + return NULL; + return PsycoInt_FromLong(ival); + } +} + +static vinfo_t* pint_neg(PsycoObject* po, vinfo_t* intobj) +{ + vinfo_t* result; + vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); + if (ival == NULL) + return NULL; + result = integer_neg(po, ival, true); + if (result != NULL) + return PsycoInt_FROM_LONG(result); + + if (PycException_Occurred(po)) + return NULL; + /* overflow */ + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_negative, + CfPure|CfReturnRef|CfPyErrIfNull, + "v", intobj); +} + +static vinfo_t* pint_invert(PsycoObject* po, vinfo_t* intobj) +{ + vinfo_t* result; + vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); + if (ival == NULL) + return NULL; + result = integer_inv(po, ival); + if (result != NULL) + result = PsycoInt_FROM_LONG(result); + return result; +} + +static vinfo_t* pint_abs(PsycoObject* po, vinfo_t* intobj) +{ + vinfo_t* result; + vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); + if (ival == NULL) + return NULL; + result = integer_abs(po, ival, true); + if (result != NULL) + return PsycoInt_FROM_LONG(result); + + if (PycException_Occurred(po)) + return NULL; + /* overflow */ + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_absolute, + CfPure|CfReturnRef|CfPyErrIfNull, + "v", intobj); +} + + +#define CONVERT_TO_LONG(vobj, vlng) \ + switch (Psyco_VerifyType(po, vobj, &PyInt_Type)) { \ + case true: /* vobj is a PyIntObject */ \ + vlng = PsycoInt_AS_LONG(po, vobj); \ + if (vlng == NULL) \ + return NULL; \ + break; \ + case false: /* vobj is not a PyIntObject */ \ + return psyco_vi_NotImplemented(); \ + default: /* error or promotion */ \ + return NULL; \ + } + +static vinfo_t* pint_add(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + x = integer_add(po, a, b, true); + if (x != NULL) + return PsycoInt_FROM_LONG(x); + if (PycException_Occurred(po)) + return NULL; + /* overflow */ + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_add, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", v, w); +} + +static vinfo_t* pint_sub(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + x = integer_sub(po, a, b, true); + if (x != NULL) + return PsycoInt_FROM_LONG(x); + if (PycException_Occurred(po)) + return NULL; + /* overflow */ + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_subtract, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", v, w); +} + +static vinfo_t* pint_mod(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + x = psyco_generic_call(po, cimpl_int_mod, CfPure|CfReturnNormal|CfPyErrCheckMinus1, "vv", a, b); + if (x != NULL) + return PsycoInt_FROM_LONG(x); + /* Either an error occured or it overflowed. In either case let python deal with it */ + PycException_Clear(po); + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_remainder, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", v, w); +} + +static vinfo_t* pint_div(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + x = psyco_generic_call(po, cimpl_int_div, CfPure|CfReturnNormal|CfPyErrCheckMinus1, "vv", a, b); + if (x != NULL) + return PsycoInt_FROM_LONG(x); + /* Either an error occured or it overflowed. In either case let python deal with it */ + PycException_Clear(po); + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_divide, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", v, w); +} + +static vinfo_t* pint_pow(PsycoObject* po, vinfo_t* v, vinfo_t* w, vinfo_t* z) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + void* cimpl; + if (!psyco_knowntobe(z, (long) Py_None)) { + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_power, + CfPure|CfReturnRef|CfPyErrNotImplemented, + "vvv", v, w, z); + } + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + if (is_nonneg(b->source)) + cimpl = cimpl_int_pow2_nonneg; + else + cimpl = cimpl_int_pow2; + x = psyco_generic_call(po, cimpl, + CfPure|CfReturnNormal|CfPyErrCheckMinus1, + "vv", a, b); + if (x != NULL) + return PsycoInt_FROM_LONG(x); + /* Either an error occured or it overflowed. In either case let python deal with it */ + PycException_Clear(po); + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_power, + CfPure|CfReturnRef|CfPyErrIfNull, + "vvv", v, w, z); +} + +DEFINEFN +vinfo_t* pint_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, + vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + x = op (po, a, b); + if (x != NULL) + x = PsycoInt_FROM_LONG(x); + return x; +} + +static vinfo_t* pint_or(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pint_base2op(po, v, w, integer_or); +} + +static vinfo_t* pint_xor(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pint_base2op(po, v, w, integer_xor); +} + +static vinfo_t* pint_and(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pint_base2op(po, v, w, integer_and); +} + +static vinfo_t* pint_mul(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + x = integer_mul(po, a, b, true); + if (x != NULL) + return PsycoInt_FROM_LONG(x); + if (PycException_Occurred(po)) + return NULL; + /* overflow */ + return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_multiply, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", v, w); +} + +#if PY_VERSION_HEX < 0x02040000 + +static vinfo_t* pint_lshift(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pint_base2op(po, v, w, integer_lshift); +} + +#else +/* Python 2.4: left shifts can return longs */ + +static long cimpl_int_lshift(long a, long b) +{ + long c; + if (b < 0) + return -1; /* error */ + if (a == 0) + return 0; + if (b >= LONG_BIT) + return -1; /* overflow */ + c = a << b; + if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) + return -1; /* overflow */ + return c; +} + +static PyObject* cimpl_ovf_int_lshift(long a, long b) +{ + if (b > 0) { + /* cimpl_int_lshift() overflowed */ + PyObject *vv, *ww, *result; + vv = PyLong_FromLong(a); + if (vv == NULL) + return NULL; + ww = PyLong_FromLong(b); + if (ww == NULL) { + Py_DECREF(vv); + return NULL; + } + result = PyNumber_Lshift(vv, ww); + Py_DECREF(vv); + Py_DECREF(ww); + return result; + } + else if (b == 0) { + /* special case '(-1)<<0', which makes cimpl_int_lshift() + return -1 by accident */ + return PyInt_FromLong(a); + } + else { + PyErr_SetString(PyExc_ValueError, "negative shift count"); + return NULL; + } +} + +static vinfo_t* pint_lshift(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + condition_code_t cc; + vinfo_t* a; + vinfo_t* b; + vinfo_t* x; + CONVERT_TO_LONG(v, a); + CONVERT_TO_LONG(w, b); + x = psyco_generic_call(po, cimpl_int_lshift, + CfPure|CfReturnNormal, + "vv", a, b); + if (x == NULL) + return NULL; + + cc = integer_cmp_i(po, x, -1, Py_EQ); + if (cc == CC_ERROR) { + vinfo_decref(x, po); + return NULL; + } + + if (runtime_condition_f(po, cc)) { + /* overflow */ + vinfo_decref(x, po); + return psyco_generic_call(po, cimpl_ovf_int_lshift, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", a, b); + } + else + return PsycoInt_FROM_LONG(x); +} + +#endif /* Python 2.4 */ + +static vinfo_t* pint_rshift(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + return pint_base2op(po, v, w, integer_rshift); +} + + + + +/* Careful, most operations might return a long if they overflow. + Only list here the ones that cannot. Besides, all these operations + should sooner or later be implemented in Psyco. XXX */ +/*DEF_KNOWN_RET_TYPE_2(pint_lshift, PyInt_Type.tp_as_number->nb_lshift, + CfReturnRef|CfPyErrNotImplemented, &PyInt_Type) + DEF_KNOWN_RET_TYPE_2(pint_rshift, PyInt_Type.tp_as_number->nb_rshift, + CfReturnRef|CfPyErrNotImplemented, &PyInt_Type)*/ + +INITIALIZATIONFN +void psy_intobject_init(void) +{ + PyNumberMethods *m = PyInt_Type.tp_as_number; + Psyco_DefineMeta(m->nb_nonzero, pint_nonzero); + + Psyco_DefineMeta(m->nb_positive, pint_pos); + Psyco_DefineMeta(m->nb_negative, pint_neg); + Psyco_DefineMeta(m->nb_invert, pint_invert); + Psyco_DefineMeta(m->nb_absolute, pint_abs); + + Psyco_DefineMeta(m->nb_add, pint_add); + Psyco_DefineMeta(m->nb_subtract, pint_sub); + Psyco_DefineMeta(m->nb_or, pint_or); + Psyco_DefineMeta(m->nb_xor, pint_xor); + Psyco_DefineMeta(m->nb_and, pint_and); + Psyco_DefineMeta(m->nb_multiply, pint_mul); + Psyco_DefineMeta(m->nb_lshift, pint_lshift); + Psyco_DefineMeta(m->nb_rshift, pint_rshift); + + /* partial implementations not emitting machine code */ + Psyco_DefineMeta(m->nb_divide, pint_div); + Psyco_DefineMeta(m->nb_remainder,pint_mod); + Psyco_DefineMeta(m->nb_power, pint_pow); + + INIT_SVIRTUAL(psyco_computed_int, compute_int, + direct_compute_int, 0, 0, 0); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pintobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pintobject.h new file mode 100644 index 0000000..1f17121 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pintobject.h @@ -0,0 +1,74 @@ + /***************************************************************/ +/*** Psyco equivalent of intobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_INTOBJECT_H +#define _PSY_INTOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" +#include "pboolobject.h" + + +#define INT_ob_ival DEF_FIELD(PyIntObject, long, ob_ival, OB_type) +#define iINT_OB_IVAL FIELD_INDEX(INT_ob_ival) +#define INT_TOTAL FIELDS_TOTAL(INT_ob_ival) + + +#define PsycoInt_Check(tp) PyType_TypeCheck(tp, &PyInt_Type) + + + /***************************************************************/ + /*** Virtual-time object builder ***/ + +/* not-yet-computed integers; it will call PyInt_FromLong */ +EXTERNVAR source_virtual_t psyco_computed_int; + +/* !! consumes a reference to vlong. PsycoInt_FromLong() does not. */ +PSY_INLINE vinfo_t* PsycoInt_FROM_LONG(vinfo_t* vlong) +{ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_int)); + result->array = array_new(INT_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyInt_Type))); + result->array->items[iINT_OB_IVAL] = vlong; + return result; +} +PSY_INLINE vinfo_t* PsycoInt_FromLong(vinfo_t* vlong) +{ + vinfo_incref(vlong); + return PsycoInt_FROM_LONG(vlong); +} + +PSY_INLINE vinfo_t* PsycoInt_AS_LONG(PsycoObject* po, vinfo_t* v) +{ /* no type check; does not return a new reference. */ + return psyco_get_const(po, v, INT_ob_ival); +} + +/* return a new ref */ +EXTERNFN vinfo_t* PsycoInt_AsLong(PsycoObject* po, vinfo_t* v); + + +PSY_INLINE vinfo_t* PsycoIntInt_RichCompare(PsycoObject* po, vinfo_t* v, + vinfo_t* w, int op) +{ /* only for two integer objects */ + vinfo_t* a; + vinfo_t* b; + condition_code_t cc; + a = PsycoInt_AS_LONG(po, v); + if (a == NULL) return NULL; + b = PsycoInt_AS_LONG(po, w); + if (b == NULL) return NULL; + cc = integer_cmp(po, a, b, op); + if (cc == CC_ERROR) return NULL; + return PsycoBool_FromCondition(po, cc); +} + + +EXTERNFN /* internal, for pboolobject.c */ +vinfo_t* pint_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, + vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)); + + +#endif /* _PSY_INTOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/piterobject.c b/nodeboxgl/ext/psyco/src/c/Objects/piterobject.c new file mode 100644 index 0000000..c03969a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/piterobject.c @@ -0,0 +1,141 @@ +#include "piterobject.h" + + +DEFINEFN vinfo_t* PsycoSeqIter_NEW(PsycoObject* po, vinfo_t* seq) +{ + vinfo_t* zero; + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_seqiter)); + result->array = array_new(SEQITER_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PySeqIter_Type))); + /* the iterator index is immediately run-time because it is + very likely to be unpromoted to run-time anyway */ + zero = psyco_vi_Zero(); + result->array->items[iSEQITER_IT_INDEX] = make_runtime_copy(po, zero); + vinfo_decref(zero, po); + /*result->array->items[SEQITER_IT_INDEX] = + vinfo_new(CompileTime_New(0));*/ + result->array->items[iSEQITER_IT_SEQ] = seq; + return result; +} + + +static vinfo_t* piter_getiter(PsycoObject* po, vinfo_t* v) +{ + vinfo_incref(v); + return v; +} + +static vinfo_t* piter_iternext(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* seq; + vinfo_t* index; + vinfo_t* result; + PyTypeObject* tp; + + seq = psyco_get_const(po, v, SEQITER_it_seq); + if (seq == NULL) + return NULL; + + tp = Psyco_NeedType(po, seq); + if (tp == NULL) + return NULL; + + index = psyco_get_field(po, v, SEQITER_it_index); + if (index == NULL) + return NULL; + assert_nonneg(index); + + if (PyType_IsSubtype(tp, &PyList_Type)) { + /* If the sequence is a list, explicitly ignore a + user-overridden __getitem__ slot. This is what both + Python 2.2 and >=2.3 do (although they use a + different trick to reach that effect). */ + result = plist_item(po, seq, index); + } + else { + result = PsycoSequence_GetItem(po, seq, index); + } + if (result == NULL) { + vinfo_t* matches = PycException_Matches(po, PyExc_IndexError); + if (runtime_NON_NULL_t(po, matches) == true) { + PycException_SetVInfo(po, PyExc_StopIteration, + psyco_vi_None()); + } + } + else { + /* very remotely potential incompatibility: when exhausted, + the internal iterator index is not incremented. Python + is not consistent in this respect. This could be an + issue if an iterator of a mutable object is not + immediately deleted when exhausted. Well, I guess that + muting an object we iterate over is generally considered + as DDIWWY (Don't Do It -- We Warned You.) + (Update: Python 2.5 is consistent, and does the same + as Psyco.) */ + vinfo_t* index_plus_1 = integer_add_i(po, index, 1, true); + if (index_plus_1 == NULL || + !psyco_put_field(po, v, SEQITER_it_index, index_plus_1)) { + vinfo_decref(result, po); + result = NULL; + } + vinfo_xdecref(index_plus_1, po); + } + vinfo_decref(index, po); + return result; +} + + +static bool compute_seqiter(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* seq; + vinfo_t* index; + vinfo_t* newobj; + + index = vinfo_getitem(v, iSEQITER_IT_INDEX); + if (index == NULL) + return false; + + seq = vinfo_getitem(v, iSEQITER_IT_SEQ); + if (seq == NULL) + return false; + + newobj = psyco_generic_call(po, PySeqIter_New, + CfReturnRef|CfPyErrIfNull, "v", seq); + if (newobj == NULL) + return false; + + /* Put the current index into the seq iterator. + This is done by putting the value directly in the + seqiterobject structure; it could be done by calling + PyIter_Next() n times but obviously that's not too + good a solution */ + if (!psyco_knowntobe(index, 0)) { + if (!psyco_put_field(po, v, SEQITER_it_index, index)) { + vinfo_decref(newobj, po); + return false; + } + } + + /* Remove the SEQITER_IT_INDEX entry from v->array because it + is a mutable field now, and could be changed at any time by + anybody .*/ + psyco_forget_field(po, v, SEQITER_it_index); + + vinfo_move(po, v, newobj); + return true; +} + +DEFINEVAR source_virtual_t psyco_computed_seqiter; + + +INITIALIZATIONFN +void psy_iterobject_init(void) +{ + Psyco_DefineMeta(PySeqIter_Type.tp_iter, &piter_getiter); + Psyco_DefineMeta(PySeqIter_Type.tp_iternext, &piter_iternext); + + /* iterator object are mutable; + they must be forced out of virtual-time across function calls */ + INIT_SVIRTUAL_NOCALL(psyco_computed_seqiter, compute_seqiter, 1); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/piterobject.h b/nodeboxgl/ext/psyco/src/c/Objects/piterobject.h new file mode 100644 index 0000000..9264314 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/piterobject.h @@ -0,0 +1,41 @@ + /***************************************************************/ +/*** Psyco equivalent of iterobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_ITEROBJECT_H +#define _PSY_ITEROBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +/* this structure not exported by iterobject.h */ +typedef struct { + PyObject_HEAD + long it_index; + PyObject *it_seq; +} seqiterobject; + +#define SEQITER_it_index FMUT(DEF_FIELD(seqiterobject, long, it_index, OB_type)) +#define SEQITER_it_seq DEF_FIELD(seqiterobject, PyObject*, it_seq, \ + SEQITER_it_index) +#define iSEQITER_IT_INDEX FIELD_INDEX(SEQITER_it_index) +#define iSEQITER_IT_SEQ FIELD_INDEX(SEQITER_it_seq) +#define SEQITER_TOTAL FIELDS_TOTAL(SEQITER_it_seq) + + +/*********************************************************************/ + /* Virtual sequence iterators. Created if needed by PySeqIter_New(). */ +EXTERNVAR source_virtual_t psyco_computed_seqiter; + +/* !! consumes a ref on 'seq' */ +EXTERNFN vinfo_t* PsycoSeqIter_NEW(PsycoObject* po, vinfo_t* seq); + +PSY_INLINE vinfo_t* PsycoSeqIter_New(PsycoObject* po, vinfo_t* seq) +{ + vinfo_incref(seq); + return PsycoSeqIter_NEW(po, seq); +} + +#endif /* _PSY_ITEROBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/plistobject.c b/nodeboxgl/ext/psyco/src/c/Objects/plistobject.c new file mode 100644 index 0000000..5f18d8a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/plistobject.c @@ -0,0 +1,340 @@ +#include "plistobject.h" +#include "pintobject.h" +#include "plongobject.h" +#include "piterobject.h" +#include "prangeobject.h" +#include "../pycodegen.h" + + +/***************************************************************/ +/* virtual short lists. */ + +/*DEFINEVAR vinfo_t* psyco_empty_list;*/ +static source_virtual_t psyco_computed_vlist; + +PSY_INLINE int vlist_length(vinfo_t* v) +{ + int len = v->array->count - VLIST_ITEMS; +#if ALL_CHECKS + vinfo_t* vlen = vinfo_getitem(v, iVAR_SIZE); + extra_assert(vlen != NULL); + extra_assert(len == CompileTime_Get(vlen->source)->value); +#endif + return len; +} + +static bool compute_vlist(PsycoObject* po, vinfo_t* v) +{ + int length = vlist_length(v); + vinfo_t* newobj; + vinfo_t* ob_item; + + newobj = psyco_generic_call(po, PyList_New, + CfReturnRef|CfPyErrIfNull, + "l", (long) length); + if (newobj == NULL) + return false; + + /* write the storing of the objects in the list */ + if (length > 0) { + int i; + ob_item = psyco_get_field(po, newobj, LIST_ob_item); + if (ob_item == NULL) + goto fail; + + for (i=0; iarray->items[VLIST_ITEMS + i]; + extra_assert(vi != NULL); + if (!psyco_put_nth_field(po, ob_item, + FPYREF(LIST_itemsarray), + i, vi)) + goto fail2; + } + vinfo_decref(ob_item, po); + } + + /* forget fields that were only relevant in virtual-time */ + vinfo_array_shrink(po, v, LIST_TOTAL); + psyco_forget_field(po, v, VAR_size); + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, newobj); + return true; + + fail2: + vinfo_decref(ob_item, po); + fail: + vinfo_decref(newobj, po); + return false; +} + +PSY_INLINE vinfo_t* list_maybe_compute(PsycoObject* po, vinfo_t* v) +{ + /* force a list out of virtual-time if it is too long. + decref v in case of error. */ + if (vlist_length(v) > VLIST_LENGTH_MAX) { + if (!compute_vinfo(v, po)) { + /* error */ + vinfo_decref(v, po); + v = NULL; + } + } + return v; +} + + +PSY_INLINE vinfo_t* PsycoList_NEW(int size) +{ + /* returns a virtual list. The caller should use list_maybe_compute() + after initialization. */ + vinfo_t* r = vinfo_new(VirtualTime_New(&psyco_computed_vlist)); + r->array = array_new(VLIST_ITEMS + size); + r->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyList_Type))); + r->array->items[iVAR_SIZE] = vinfo_new(CompileTime_NewSk + (sk_new(size, SkFlagFixed))); + return r; +} + +DEFINEFN +vinfo_t* PsycoList_New(PsycoObject* po, int size, vinfo_t** source) +{ + vinfo_t* v; + int i; + vinfo_t* r = PsycoList_NEW(size); + extra_assert(source != NULL); + for (i=0; iarray->items[VLIST_ITEMS + i] = v; + } + return list_maybe_compute(po, r); +} + +DEFINEFN +vinfo_t* PsycoList_SingletonNew(vinfo_t* vitem) +{ + vinfo_t* r = PsycoList_NEW(1); + vinfo_incref(vitem); + r->array->items[VLIST_ITEMS + 0] = vitem; + return r; +} + +DEFINEFN +int PsycoList_Load(vinfo_t* list) +{ + /* only for virtual lists */ + if (list->source == VirtualTime_New(&psyco_computed_vlist)) + return vlist_length(list); + else + return -1; +} + + + /***************************************************************/ + /*** list objects meta-implementation ***/ + +DEFINEFN +vinfo_t* plist_item(PsycoObject* po, vinfo_t* a, vinfo_t* i) +{ + condition_code_t cc; + vinfo_t* vlen; + vinfo_t* ob_item; + vinfo_t* result; + + vlen = psyco_get_field(po, a, VAR_size); + if (vlen == NULL) + return NULL; + + cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); + vinfo_decref(vlen, po); + if (cc == CC_ERROR) + return NULL; + + if (runtime_condition_f(po, cc)) { + PycException_SetString(po, PyExc_IndexError, + "list index out of range"); + return NULL; + } + assert_nonneg(i); + + if (a->source == VirtualTime_New(&psyco_computed_vlist) && + is_compiletime(i->source)) { + /* optimize virtual lists */ + vlist_length(a); /* for the assert()s */ + result = vinfo_getitem(a, VLIST_ITEMS + + CompileTime_Get(i->source)->value); + extra_assert(result != NULL); + vinfo_incref(result); + need_reference(po, result); + return result; + } + + if (a->source == VirtualTime_New(&psyco_computed_listrange)) { + /* optimize range().__getitem__() */ + /* XXX no support for 'step' right now, + so that the return value is simply 'start+i'. */ + vinfo_t* vstart = vinfo_getitem(a, RANGE_START); + if (vstart == NULL) + return NULL; + result = integer_add(po, i, vstart, false); + if (result == NULL) + return NULL; + return PsycoInt_FROM_LONG(result); + } + + ob_item = psyco_get_field(po, a, LIST_ob_item); + if (ob_item == NULL) + return NULL; + + result = psyco_get_field_array(po, ob_item, FPYREF(LIST_itemsarray), i); + vinfo_decref(ob_item, po); + return result; +} + +static bool plist_ass_item(PsycoObject* po, vinfo_t* a, vinfo_t* i, vinfo_t* v) +{ + condition_code_t cc; + vinfo_t* vlen; + vinfo_t* ob_item; + vinfo_t* old_value; + bool ok; + + if (v == NULL) { + /* XXX implement item deletion */ + return psyco_generic_call(po, PyList_Type.tp_as_sequence-> + sq_ass_item, + CfNoReturnValue|CfPyErrIfNonNull, + "vvl", a, i, (long) NULL) != NULL; + } + + vlen = psyco_get_field(po, a, VAR_size); + if (vlen == NULL) + return false; + + cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); + vinfo_decref(vlen, po); + if (cc == CC_ERROR) + return false; + + if (runtime_condition_f(po, cc)) { + PycException_SetString(po, PyExc_IndexError, + "list assignment index out of range"); + return false; + } + assert_nonneg(i); + + if (a->source == VirtualTime_New(&psyco_computed_vlist) && + is_compiletime(i->source)) { + /* optimize virtual lists */ + vlist_length(a); /* for the assert()s */ + vinfo_incref(v); + vinfo_setitem(po, a, VLIST_ITEMS + + CompileTime_Get(i->source)->value, v); + return true; + } + + ob_item = psyco_get_field(po, a, LIST_ob_item); + if (ob_item == NULL) + return false; + + old_value = psyco_get_field_array(po, ob_item, LIST_itemsarray, i); + ok = (old_value != NULL) && + psyco_put_field_array(po, ob_item, FPYREF(LIST_itemsarray), i, v); + + vinfo_decref(ob_item, po); + if (ok) psyco_decref_v(po, old_value); + vinfo_xdecref(old_value, po); + + return ok; +} + +DEFINEFN +vinfo_t* psyco_plist_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b) +{ + PyTypeObject* btp = Psyco_NeedType(po, b); + if (btp == NULL) + return NULL; + + if (PyType_TypeCheck(btp, &PyList_Type)) { + vinfo_t* r; + int alen, blen; + + blen = PsycoList_Load(b); + if (blen >= 0) { + alen = PsycoList_Load(a); + if (alen >= 0) { + /* known source list lengths: + build a virtual list */ + vinfo_t* buffer[VLIST_LENGTH_MAX*2]; + extra_assert(alen <= VLIST_LENGTH_MAX); + extra_assert(blen <= VLIST_LENGTH_MAX); + memcpy(buffer, + a->array->items + VLIST_ITEMS, + alen * sizeof(vinfo_t*)); + memcpy(buffer + alen, + b->array->items + VLIST_ITEMS, + blen * sizeof(vinfo_t*)); + return PsycoList_New(po, alen+blen, buffer); + } + else if (blen == 1) { + /* XXX - fallback to an append ? */ + } + } + /* fallback - but we still know that the result is a list */ + r = psyco_generic_call(po, + PyList_Type.tp_as_sequence->sq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", a, b); + if (r != NULL) + Psyco_AssertType(po, r, &PyList_Type); + return r; + } + + /* fallback */ + return psyco_generic_call(po, PyList_Type.tp_as_sequence->sq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", a, b); +} + +DEFINEFN +bool PsycoList_Append(PsycoObject* po, vinfo_t* v, vinfo_t* vitem) +{ + /* use the real PyList_Append */ + return psyco_generic_call(po, PyList_Append, + CfNoReturnValue|CfPyErrIfNonNull, + "vv", v, vitem) != NULL; +} + + +INITIALIZATIONFN +void psy_listobject_init(void) +{ + PyMappingMethods *mm; + PySequenceMethods *m = PyList_Type.tp_as_sequence; + Psyco_DefineMeta(m->sq_length, psyco_generic_mut_ob_size); + Psyco_DefineMeta(m->sq_item, plist_item); + Psyco_DefineMeta(m->sq_ass_item, plist_ass_item); + Psyco_DefineMeta(m->sq_concat, psyco_plist_concat); + + mm = PyList_Type.tp_as_mapping; + if (mm) { /* Python >= 2.3 */ + Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); + Psyco_DefineMeta(mm->mp_ass_subscript, + psyco_generic_ass_subscript); + } + + /* In Python 2.3, lists have their own iterator type for + performance, because generic sequence iterators have an + extra overhead -- which is however completely removed by + Psyco. So we redirect list iterators to generic iterators. + (thus in Psyco, iter(l) never returns a listiterator) */ + if (PyList_Type.tp_iter != NULL) /* Python >= 2.3 */ + Psyco_DefineMeta(PyList_Type.tp_iter, &PsycoSeqIter_New); + + /* list object are mutable; + they must be forced out of virtual-time across function calls */ + INIT_SVIRTUAL_NOCALL(psyco_computed_vlist, compute_vlist, NW_VLISTS); + + /*psyco_empty_list = PsycoList_NEW(0);*/ +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/plistobject.h b/nodeboxgl/ext/psyco/src/c/Objects/plistobject.h new file mode 100644 index 0000000..59021fa --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/plistobject.h @@ -0,0 +1,44 @@ + /***************************************************************/ +/*** Psyco equivalent of listobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_LISTOBJECT_H +#define _PSY_LISTOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +#define LIST_ob_item FMUT(DEF_FIELD(PyListObject, PyObject**, ob_item, \ + VAR_size)) +#define LIST_TOTAL FIELDS_TOTAL(LIST_ob_item) +#define VLIST_ITEMS LIST_TOTAL +#define LIST_itemsarray FMUT(DEF_ARRAY(PyObject*, 0)) + + +/* Warning: only for very short lists! Each new length could + force a new copy of the whole code to be emitted... */ +#define VLIST_LENGTH_MAX 3 + + +EXTERNFN vinfo_t* PsycoList_New(PsycoObject* po, int size, vinfo_t** source); +EXTERNFN vinfo_t* PsycoList_SingletonNew(vinfo_t* vitem); +EXTERNFN bool PsycoList_Append(PsycoObject* po, vinfo_t* v, vinfo_t* vitem); +/*EXTERNVAR vinfo_t* psyco_empty_list;*/ + +/* get the virtual array of items in the list, + returning the length of the list or -1 if it fails (items not known). + The items are then found in list->array->items[VLIST+i]. + Never sets a PycException. */ +EXTERNFN int PsycoList_Load(vinfo_t* list); + + +/* for pstringobject.c */ +EXTERNFN vinfo_t* psyco_plist_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b); + +/* for piterobject.c */ +EXTERNFN vinfo_t* plist_item(PsycoObject* po, vinfo_t* a, vinfo_t* i); + + +#endif /* _PSY_LISTOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/plongobject.c b/nodeboxgl/ext/psyco/src/c/Objects/plongobject.c new file mode 100644 index 0000000..52a60dd --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/plongobject.c @@ -0,0 +1,96 @@ +#include "plongobject.h" + + +DEFINEFN +vinfo_t* PsycoLong_AsLong(PsycoObject* po, vinfo_t* v) +{ + /* XXX implement me */ + return psyco_generic_call(po, PyLong_AsLong, + CfReturnNormal|CfPyErrCheckMinus1, + "v", v); +} + +static void cimpl_lng_as_double(PyObject* o, double* result) +{ + *result = PyLong_AsDouble(o); +} + +DEFINEFN +bool PsycoLong_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** vd1, vinfo_t** vd2) +{ + /* XXX implement me */ + vinfo_array_t* result; + result = array_new(2); + if (psyco_generic_call(po, cimpl_lng_as_double, + CfPyErrCheck, + "va", v, result) == NULL) { + array_release(result); + return false; + } + *vd1 = result->items[0]; + *vd2 = result->items[1]; + array_release(result); + return true; +} + + +/* XXX this assumes that operations between longs always return a long. + There are hints that this might change in future releases of Python. */ +#define RETLONG(arity, cname, slotname) \ + DEF_KNOWN_RET_TYPE_##arity(cname, \ + PyLong_Type.tp_as_number->slotname, \ + (arity)==1 ? (CfReturnRef|CfPyErrIfNull) : \ + (CfReturnRef|CfPyErrNotImplemented), \ + &PyLong_Type) + +/* Python 2.2's long_mul() tries to be clever about 'sequence * long' */ +#define SANE_CONVERT_BINOP (PY_VERSION_HEX >= 0x02030000) /* 2.3 */ + +RETLONG(2, plong_add, nb_add) +RETLONG(2, plong_sub, nb_subtract) +#if SANE_CONVERT_BINOP +RETLONG(2, plong_mul, nb_multiply) +#endif +RETLONG(2, plong_classic_div, nb_divide) +RETLONG(2, plong_mod, nb_remainder) +RETLONG(3, plong_pow, nb_power) +RETLONG(1, plong_neg, nb_negative) +RETLONG(1, plong_pos, nb_positive) +RETLONG(1, plong_abs, nb_absolute) +RETLONG(1, plong_invert, nb_invert) +RETLONG(2, plong_lshift, nb_lshift) +RETLONG(2, plong_rshift, nb_rshift) +RETLONG(2, plong_and, nb_and) +RETLONG(2, plong_xor, nb_xor) +RETLONG(2, plong_or, nb_or) +RETLONG(2, plong_div, nb_floor_divide) + /*RETFLOAT(2, plong_true_divide, nb_true_divide) XXX-implement*/ + +#undef RETLONG + + +INITIALIZATIONFN +void psy_longobject_init(void) +{ + PyNumberMethods *m = PyLong_Type.tp_as_number; + + Psyco_DefineMeta(m->nb_add, plong_add); + Psyco_DefineMeta(m->nb_subtract, plong_sub); +#if SANE_CONVERT_BINOP + Psyco_DefineMeta(m->nb_multiply, plong_mul); +#endif + Psyco_DefineMeta(m->nb_divide, plong_classic_div); + Psyco_DefineMeta(m->nb_remainder, plong_mod); + Psyco_DefineMeta(m->nb_power, plong_pow); + Psyco_DefineMeta(m->nb_negative, plong_neg); + Psyco_DefineMeta(m->nb_positive, plong_pos); + Psyco_DefineMeta(m->nb_absolute, plong_abs); + Psyco_DefineMeta(m->nb_invert, plong_invert); + Psyco_DefineMeta(m->nb_lshift, plong_lshift); + Psyco_DefineMeta(m->nb_rshift, plong_rshift); + Psyco_DefineMeta(m->nb_and, plong_and); + Psyco_DefineMeta(m->nb_xor, plong_xor); + Psyco_DefineMeta(m->nb_or, plong_or); + Psyco_DefineMeta(m->nb_floor_divide, plong_div); +/* Psyco_DefineMeta(m->nb_true_divide, plong_true_divide); XXX-implement*/ +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/plongobject.h b/nodeboxgl/ext/psyco/src/c/Objects/plongobject.h new file mode 100644 index 0000000..3d63fb1 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/plongobject.h @@ -0,0 +1,19 @@ + /***************************************************************/ +/*** Psyco equivalent of longobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_LONGOBJECT_H +#define _PSY_LONGOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +#define PsycoLong_Check(tp) PyType_TypeCheck(tp, &PyLong_Type) + + +EXTERNFN vinfo_t* PsycoLong_AsLong(PsycoObject* po, vinfo_t* v); +EXTERNFN bool PsycoLong_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** vd1, vinfo_t** vd2); + +#endif /* _PSY_LONGOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.c new file mode 100644 index 0000000..4a17187 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.c @@ -0,0 +1,141 @@ +#include "pmethodobject.h" +#include "ptupleobject.h" + + +static bool compute_cfunction(PsycoObject* po, vinfo_t* methobj) +{ + vinfo_t* newobj; + vinfo_t* m_self; + vinfo_t* m_ml; + + /* get the fields from the Python object 'methobj' */ + m_self = vinfo_getitem(methobj, iCFUNC_M_SELF); + if (m_self == NULL) + return false; + m_ml = vinfo_getitem(methobj, iCFUNC_M_ML); + if (m_ml == NULL) + return false; + + /* call PyCFunction_New() */ +#ifdef PyCFunction_New /* Python >= 2.3 introduced PyCFunction_NewEx() */ + newobj = psyco_generic_call(po, PyCFunction_NewEx, + CfPure|CfReturnRef|CfPyErrIfNull, + "vvl", m_ml, m_self, NULL); +#else + newobj = psyco_generic_call(po, PyCFunction_New, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", m_ml, m_self); +#endif + if (newobj == NULL) + return false; + + /* move the resulting non-virtual Python object back into 'methobj' */ + vinfo_move(po, methobj, newobj); + return true; +} + +static PyObject* direct_compute_cfunction(vinfo_t* methobj, char* data) +{ + PyObject* m_self; + long m_ml; + PyObject* result = NULL; + + m_self = direct_xobj_vinfo( + vinfo_getitem(methobj, iCFUNC_M_SELF), data); + m_ml = direct_read_vinfo( + vinfo_getitem(methobj, iCFUNC_M_ML), data); + + if (!PyErr_Occurred()) + result = PyCFunction_New((PyMethodDef*) m_ml, m_self); + + Py_XDECREF(m_self); + return result; +} + + +DEFINEVAR source_virtual_t psyco_computed_cfunction; + + + /***************************************************************/ + /*** C method objects meta-implementation ***/ + +DEFINEFN +vinfo_t* PsycoCFunction_Call(PsycoObject* po, vinfo_t* func, + vinfo_t* tuple, vinfo_t* kw) +{ + long mllong; + vinfo_t* vml = psyco_get_const(po, func, CFUNC_m_ml); + if (vml == NULL) + return NULL; + + /* promote to compile-time the function if we do not know which one + it is yet */ + mllong = psyco_atcompiletime(po, vml); + if (mllong == -1) { + /* -1 is not a valid pointer */ + extra_assert(PycException_Occurred(po)); + return NULL; + } + else { + PyMethodDef* ml = (PyMethodDef*) \ + CompileTime_Get(vml->source)->value; + int flags = ml->ml_flags; + int tuplesize; + vinfo_t* carg; + char* argumentlist = "vv"; + + vinfo_t* vself = psyco_get_const(po, func, CFUNC_m_self); + if (vself == NULL) + return NULL; + + if (flags & METH_KEYWORDS) { + return Psyco_META3(po, ml->ml_meth, + CfReturnRef|CfPyErrIfNull, + "vvv", vself, tuple, kw); + } + if (!psyco_knowntobe(kw, (long) NULL)) + goto use_proxy; + + switch (flags) { + case METH_VARARGS: + carg = tuple; + break; + case METH_NOARGS: + tuplesize = PsycoTuple_Load(tuple); + if (tuplesize != 0) + /* if size unknown or known to be != 0 */ + goto use_proxy; + carg = NULL; + argumentlist = "vl"; + break; + case METH_O: + tuplesize = PsycoTuple_Load(tuple); + if (tuplesize != 1) + /* if size unknown or known to be != 1 */ + goto use_proxy; + carg = PsycoTuple_GET_ITEM(tuple, 0); + break; + default: + goto use_proxy; + } + return Psyco_META2(po, ml->ml_meth, CfReturnRef|CfPyErrIfNull, + argumentlist, vself, carg); + } + + /* default, slow version */ + use_proxy: + return psyco_generic_call(po, PyCFunction_Call, + CfReturnRef|CfPyErrIfNull, + "vvv", func, tuple, kw); +} + + +INITIALIZATIONFN +void psy_methodobject_init(void) +{ + Psyco_DefineMeta(PyCFunction_Type.tp_call, PsycoCFunction_Call); + INIT_SVIRTUAL(psyco_computed_cfunction, compute_cfunction, + direct_compute_cfunction, + (1 << iCFUNC_M_SELF), + 1, 1); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.h new file mode 100644 index 0000000..39d779d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pmethodobject.h @@ -0,0 +1,47 @@ + /***************************************************************/ +/*** Psyco equivalent of methodobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_METHODOBJECT_H +#define _PSY_METHODOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +#define CFUNC_m_ml DEF_FIELD(PyCFunctionObject, PyMethodDef*, m_ml, OB_type) +#define CFUNC_m_self DEF_FIELD(PyCFunctionObject, PyObject*, m_self, CFUNC_m_ml) +#define iCFUNC_M_ML FIELD_INDEX(CFUNC_m_ml) +#define iCFUNC_M_SELF FIELD_INDEX(CFUNC_m_self) +#define CFUNC_TOTAL FIELDS_TOTAL(CFUNC_m_self) + + +EXTERNFN vinfo_t* PsycoCFunction_Call(PsycoObject* po, vinfo_t* func, + vinfo_t* tuple, vinfo_t* kw); + + + /***************************************************************/ + /*** Virtual-time object builder ***/ + +/* not-yet-computed C method objects, with a m_ml and m_self field. + Usually not computed at all, but if it needs be, will call + PyCFunction_New(). */ +EXTERNVAR source_virtual_t psyco_computed_cfunction; + +PSY_INLINE vinfo_t* PsycoCFunction_New(PsycoObject* po, PyMethodDef* ml, + vinfo_t* self) +{ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_cfunction)); + result->array = array_new(CFUNC_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyCFunction_Type))); + result->array->items[iCFUNC_M_ML] = + vinfo_new(CompileTime_New((long) ml)); + vinfo_incref(self); + result->array->items[iCFUNC_M_SELF] = self; + return result; +} + + +#endif /* _PSY_METHODOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pobject.c new file mode 100644 index 0000000..9dba371 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pobject.c @@ -0,0 +1,699 @@ +#include "pobject.h" +#include "pintobject.h" +#include "pboolobject.h" +#include "pstringobject.h" +#include "../pycodegen.h" + + +#if USE_RUNTIME_SWITCHES +DEFINEVAR fixed_switch_t psyfs_int; +DEFINEVAR fixed_switch_t psyfs_int_long; +DEFINEVAR fixed_switch_t psyfs_int_long_float; +DEFINEVAR fixed_switch_t psyfs_tuple_list; +DEFINEVAR fixed_switch_t psyfs_string_unicode; +DEFINEVAR fixed_switch_t psyfs_tuple; +DEFINEVAR fixed_switch_t psyfs_dict; +DEFINEVAR fixed_switch_t psyfs_none; +#endif + + +DEFINEFN +PyTypeObject* Psyco_NeedType(PsycoObject* po, vinfo_t* vi) +{ + if (is_compiletime(vi->source)) { + /* optimization for the type of a known object */ + PyObject* o = (PyObject*) CompileTime_Get(vi->source)->value; + return o->ob_type; + } + else { + vinfo_t* vtp = psyco_get_const(po, vi, OB_type); + if (vtp == NULL) + return NULL; + return (PyTypeObject*) psyco_pyobj_atcompiletime(po, vtp); + } +} + +DEFINEFN +PyTypeObject* Psyco_KnownType(vinfo_t* vi) +{ + if (is_compiletime(vi->source)) { + PyObject* o = (PyObject*) CompileTime_Get(vi->source)->value; + return o->ob_type; + } + else { + vinfo_t* vtp = vinfo_getitem(vi, iOB_TYPE); + if (vtp != NULL && is_compiletime(vtp->source)) + return (PyTypeObject*) + CompileTime_Get(vtp->source)->value; + else + return NULL; + } +} + + +DEFINEFN +vinfo_t* PsycoObject_IsTrue(PsycoObject* po, vinfo_t* vi) +{ + PyTypeObject* tp; + tp = (PyTypeObject*) Psyco_NeedType(po, vi); + if (tp == NULL) + return NULL; + + if (tp == Py_None->ob_type) + return psyco_vi_Zero(); + else if (tp->tp_as_number != NULL && + tp->tp_as_number->nb_nonzero != NULL) + return Psyco_META1(po, tp->tp_as_number->nb_nonzero, + CfReturnNormal|CfPyErrIfNeg, "v", vi); + else if (tp->tp_as_mapping != NULL && + tp->tp_as_mapping->mp_length != NULL) + return Psyco_META1(po, tp->tp_as_mapping->mp_length, + CfReturnNormal|CfPyErrIfNeg, "v", vi); + else if (tp->tp_as_sequence != NULL && + tp->tp_as_sequence->sq_length != NULL) + return Psyco_META1(po, tp->tp_as_sequence->sq_length, + CfReturnNormal|CfPyErrIfNeg, "v", vi); + else + return psyco_vi_One(); +} + +DEFINEFN +vinfo_t* PsycoObject_Repr(PsycoObject* po, vinfo_t* vi) +{ + /* XXX implement me */ + vinfo_t* vstr = psyco_generic_call(po, PyObject_Repr, + CfReturnRef|CfPyErrIfNull, + "v", vi); + if (vstr == NULL) + return NULL; + + /* the result is a string */ + Psyco_AssertType(po, vstr, &PyString_Type); + return vstr; +} + +DEFINEFN +vinfo_t* PsycoObject_GetAttr(PsycoObject* po, vinfo_t* o, vinfo_t* attr_name) +{ + /* TypeSwitch */ + PyTypeObject* tp = Psyco_NeedType(po, attr_name); + if (tp == NULL) + return NULL; + + if (!PyType_TypeCheck(tp, &PyString_Type)) { + +#ifdef Py_USING_UNICODE + if (PyType_TypeCheck(tp, &PyUnicode_Type)) + goto generic; +#endif + PycException_SetString(po, PyExc_TypeError, + "attribute name must be string"); + return NULL; + } + + tp = (PyTypeObject*) Psyco_NeedType(po, o); + if (tp == NULL) + return NULL; + if (tp->tp_getattro != NULL) + return Psyco_META2(po, tp->tp_getattro, + CfReturnRef|CfPyErrIfNull, + "vv", o, attr_name); + if (tp->tp_getattr != NULL) + return Psyco_META2(po, tp->tp_getattr, + CfReturnRef|CfPyErrIfNull, + "vv", o, + PsycoString_AS_STRING(po, attr_name)); + + generic: + /* when the above fails */ + return psyco_generic_call(po, PyObject_GetAttr, + CfReturnRef|CfPyErrIfNull, + "vv", o, attr_name); +} + +DEFINEFN +bool PsycoObject_SetAttr(PsycoObject* po, vinfo_t* o, + vinfo_t* vattrname, vinfo_t* v) +{ + PyObject* name; + PyTypeObject* tp; + vinfo_t* vresult; + /* as in PsycoObject_GenericGetAttr() we don't try to analyse + a non-constant vattrname */ + if (!is_compiletime(vattrname->source)) + goto generic; + + tp = (PyTypeObject*) Psyco_NeedType(po, o); + if (tp == NULL) + return false; + + name = (PyObject*) CompileTime_Get(vattrname->source)->value; + if (!PyString_Check(name)){ +#ifdef Py_USING_UNICODE + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { +# if PSYCO_CAN_CALL_UNICODE + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) { + psyco_virtualize_exception(po); + return NULL; + } +# else + goto generic; +# endif + } + else +#endif + { + PycException_SetString(po, PyExc_TypeError, + "attribute name must be string"); + return false; + } + } + else + Py_INCREF(name); + + PyString_InternInPlace(&name); + if (tp->tp_setattro != NULL) { + vresult = Psyco_META3(po, tp->tp_setattro, + CfNoReturnValue|CfPyErrIfNonNull, + v ? "vlv" : "vll", o, name, v); + Py_DECREF(name); + return vresult != NULL; + } + if (tp->tp_setattr != NULL) { + vresult = Psyco_META3(po, tp->tp_setattr, + CfNoReturnValue|CfPyErrIfNonNull, + v ? "vlv" : "vll", o, + (long)PyString_AS_STRING(name), v); + Py_DECREF(name); + return vresult != NULL; + } + Py_DECREF(name); + + generic: + /* fall-back implementation */ + return psyco_generic_call(po, PyObject_SetAttr, + CfNoReturnValue|CfPyErrIfNonNull, + v ? "vvv" : "vvl", o, vattrname, v) != NULL; +} + +/* Helper to get the offset an object's __dict__ slot, if any. + Return a defield_t to the base offset, or NO_PREV_FIELD if there is + no __dict__ slot. A variable offset may be computed and stored in + *varindex. */ + +static defield_t getdictoffset(PsycoObject* po, vinfo_t* obj, vinfo_t** varindex) +{ + long dictoffset; + PyTypeObject *tp = Psyco_FastType(obj); + + /*if (!(tp->tp_flags & Py_TPFLAGS_HAVE_CLASS)) + return NO_PREV_FIELD;*/ + dictoffset = tp->tp_dictoffset; + if (dictoffset == 0) + return NO_PREV_FIELD; + if (dictoffset < 0) { + vinfo_t* size1; + vinfo_t* ob_size = psyco_get_field(po, obj, VAR_signed_size); + if (ob_size == NULL) + return NO_PREV_FIELD; + size1 = integer_abs(po, ob_size, false); + vinfo_decref(ob_size, po); + if (size1 == NULL) + return NO_PREV_FIELD; + + extra_assert(dictoffset % SIZEOF_VOID_P == 0); + /* the following code emulates _PyObject_VAR_SIZE() */ + if ((tp->tp_itemsize & (SIZEOF_VOID_P-1)) == 0 && + (tp->tp_basicsize & (SIZEOF_VOID_P-1)) == 0) { + /* the result is automatically aligned */ + vinfo_t* a; + a = integer_mul_i(po, size1, + tp->tp_itemsize / SIZEOF_VOID_P); + vinfo_decref(size1, po); + if (a == NULL) + return NO_PREV_FIELD; + *varindex = a; + dictoffset = tp->tp_basicsize + dictoffset; + } + else { + /* need to align the result to the next + SIZEOF_VOID_P boundary */ + vinfo_t* a; + vinfo_t* b; + vinfo_t* c; + a = integer_mul_i(po, size1, tp->tp_itemsize); + vinfo_decref(size1, po); + if (a == NULL) + return NO_PREV_FIELD; + c = integer_add_i(po, a, tp->tp_basicsize + dictoffset + + SIZEOF_VOID_P - 1, false); + vinfo_decref(a, po); + if (c == NULL) + return NO_PREV_FIELD; + b = integer_urshift_i(po, c, SIZE_OF_LONG_BITS); + vinfo_decref(c, po); + if (b == NULL) + return NO_PREV_FIELD; + *varindex = b; + dictoffset = 0; + } + } + return FMUT(DEF_ARRAY(PyObject*, dictoffset)); +} + +DEFINEFN +vinfo_t* PsycoObject_GenericGetAttr(PsycoObject* po, vinfo_t* obj, + vinfo_t* vname) +{ + PyTypeObject* tp; + PyObject *descr = NULL; + vinfo_t* res = NULL; + descrgetfunc f; + PyObject* name; + defield_t dictofsbase; + vinfo_t* dictofs; + + /* 'name' is generally known at compile-time. + We could promote it at compile-time with + + name = psyco_pyobj_atcompiletime(po, vname); + if (name == NULL) + return NULL; + + but we don't, because run-time names generally + mean that the Python code uses functions like getattr(), + probably inside of a loop, with a lot of various + attributes. Let's emit a call to PyObject_GenericGetAttr + instead. */ + if (!is_compiletime(vname->source)) { + fallback: + return psyco_generic_call(po, PyObject_GenericGetAttr, + CfReturnRef|CfPyErrIfNull, + "vv", obj, vname); + } + name = (PyObject*) CompileTime_Get(vname->source)->value; + + if (!PyString_Check(name)){ +#ifdef Py_USING_UNICODE + /* The Unicode to string conversion is done here because the + existing tp_setattro slots expect a string object as name + and we wouldn't want to break those. */ + if (PyUnicode_Check(name)) { +# if PSYCO_CAN_CALL_UNICODE + name = PyUnicode_AsEncodedString(name, NULL, NULL); + if (name == NULL) { + psyco_virtualize_exception(po); + return NULL; + } +# else + goto fallback; +# endif + } + else +#endif + { + PycException_SetString(po, PyExc_TypeError, + "attribute name must be string"); + return NULL; + } + } + else + Py_INCREF(name); + + /* we need the type of 'obj' at compile-time */ + tp = (PyTypeObject*) Psyco_NeedType(po, obj); + if (tp == NULL) + goto done; + + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) { + psyco_virtualize_exception(po); + goto done; + } + } + + /* XXX this is broken because the type might have been modified + XXX since the last time we were here! */ + descr = _PyType_Lookup(tp, name); + Py_XINCREF(descr); + + f = NULL; + if (descr != NULL && + PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { + f = descr->ob_type->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + res = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, + "lvl", descr, obj, tp); + goto done; + } + } + + dictofs = NULL; + dictofsbase = getdictoffset(po, obj, &dictofs); + if (dictofsbase == NO_PREV_FIELD) { + if (PycException_Occurred(po)) + goto done; + /* no __dict__ slot */ + } + else { + condition_code_t cc; + int cond; + vinfo_t* dict; + if (dictofs == NULL) + dict = psyco_get_field(po, obj, dictofsbase); + else { + dict = psyco_get_field_array(po, obj, dictofsbase, + dictofs); + vinfo_decref(dictofs, po); + } + if (dict == NULL) + goto done; + cc = integer_non_null(po, dict); + if (cc == CC_ERROR) { + vinfo_decref(dict, po); + goto done; + } + + if (runtime_condition_t(po, cc)) { + /* the __dict__ slot contains a non-NULL value */ + res = psyco_generic_call(po, PyDict_GetItem, + CfReturnNormal, + "vl", dict, (long) name); + vinfo_decref(dict, po); + if (res == NULL) + goto done; + Py_INCREF(name); /* XXX ref hold by the code buf */ + + /* if there is a method descriptor of the same name, + then it is likely that we don't find an attribute + with that name; otherwise, it is likely that we + do find it. */ + cc = integer_non_null(po, res); + if (cc == CC_ERROR) { + vinfo_decref(res, po); + goto done; + } + + if (f != NULL) + cond = runtime_condition_f(po, cc); + else + cond = runtime_condition_t(po, cc); + + if (cond) { + /* we have found the attribute */ + need_reference(po, res); + goto done; + } + else { + /* there is no such attribute */ + vinfo_decref(res, po); + res = NULL; + } + } + else { + /* the __dict__ slot contains NULL */ + vinfo_decref(dict, po); + } + } + + if (f != NULL) { + res = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, + "lvl", descr, obj, tp); + goto done; + } + + if (descr != NULL) { + source_known_t* sk = sk_new((long) descr, SkFlagPyObj); + descr = NULL; + res = vinfo_new(CompileTime_NewSk(sk)); + goto done; + } + + PycException_SetFormat(po, PyExc_AttributeError, + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(name)); + done: + Py_XDECREF(descr); + Py_DECREF(name); + return res; +} + + +/* Macro to get the tp_richcompare field of a type if defined */ +#define RICHCOMPARE(t) (PyType_HasFeature((t), Py_TPFLAGS_HAVE_RICHCOMPARE) \ + ? (t)->tp_richcompare : NULL) + + +/* Map rich comparison operators to their swapped version, e.g. LT --> GT */ +static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE}; + +static vinfo_t* try_rich_compare(PsycoObject* po, vinfo_t* v, vinfo_t* w, int op) +{ + bool swap; + PyTypeObject* vtp = Psyco_FastType(v); + PyTypeObject* wtp = Psyco_FastType(w); + richcmpfunc fv = RICHCOMPARE(vtp); + richcmpfunc fw = RICHCOMPARE(wtp); + vinfo_t* res; + + swap = (vtp != wtp && + PyType_IsSubtype(wtp, vtp) && + fw != NULL); + if (swap) { + res = Psyco_META3(po, fw, CfReturnRef|CfPyErrNotImplemented, + "vvl", w, v, swapped_op[op]); + if (IS_IMPLEMENTED(res)) + return res; /* 'res' might be NULL */ + vinfo_decref(res, po); + } + if (fv != NULL) { + res = Psyco_META3(po, fv, CfReturnRef|CfPyErrNotImplemented, + "vvl", v, w, op); + if (IS_IMPLEMENTED(res)) + return res; + vinfo_decref(res, po); + } + if (!swap && fw != NULL) { + return Psyco_META3(po, fw, CfReturnRef|CfPyErrNotImplemented, + "vvl", w, v, swapped_op[op]); + } + return psyco_vi_NotImplemented(); +} + +PSY_INLINE vinfo_t* convert_3way_to_object(PsycoObject* po, int op, vinfo_t* c) +{ + condition_code_t cc = integer_cmp_i(po, c, 0, op); + if (cc == CC_ERROR) + return NULL; + return PsycoBool_FromCondition(po, cc); +} + +PSY_INLINE vinfo_t* try_3way_to_rich_compare(PsycoObject* po, vinfo_t* v, + vinfo_t* w, int op) +{ + /* XXX implement me (some day) */ + return psyco_generic_call(po, PyObject_RichCompare, + CfReturnRef|CfPyErrIfNull, + "vvl", v, w, (long) op); +} + +DEFINEFN vinfo_t* PsycoObject_RichCompare(PsycoObject* po, vinfo_t* v, + vinfo_t* w, int op) +{ + PyTypeObject* vtp; + PyTypeObject* wtp; + vinfo_t* res; + cmpfunc f; + extra_assert(Py_LT <= op && op <= Py_GE); + + /* XXX try to detect circular data structures */ + + vtp = (PyTypeObject*) Psyco_NeedType(po, v); + if (vtp == NULL) + return NULL; + wtp = (PyTypeObject*) Psyco_NeedType(po, w); + if (wtp == NULL) + return NULL; + + /* If the types are equal, don't bother with coercions etc. + Instances are special-cased in try_3way_compare, since + a result of 2 does *not* mean one value being greater + than the other. */ + if (vtp == wtp + && (f = vtp->tp_compare) != NULL + && !PyType_TypeCheck(vtp, &PyInstance_Type)) { + vinfo_t* c; + richcmpfunc f1; + if (vtp == &PyInt_Type) { + /* Special-case integers because they don't use + rich comparison, and the plain 3-way comparisons + are too low-level for serious optimizations + (they would require building the value -1, 0 or + 1 in a register and then testing it). */ + return PsycoIntInt_RichCompare(po, v, w, op); + } + if ((f1 = RICHCOMPARE(vtp)) != NULL) { + /* If the type has richcmp, try it first. + try_rich_compare would try it two-sided, + which is not needed since we've a single + type only. */ + res = Psyco_META3(po, f1, + CfReturnRef|CfPyErrNotImplemented, + "vvl", v, w, (long) op); + if (IS_IMPLEMENTED(res)) + return res; + vinfo_decref(res, po); + } + c = Psyco_META2(po, f, CfReturnNormal|CfPyErrCheck, + "vv", v, w); + if (c == NULL) + return NULL; + res = convert_3way_to_object(po, op, c); + vinfo_decref(c, po); + return res; + } + + res = try_rich_compare(po, v, w, op); + if (IS_IMPLEMENTED(res)) + return res; + vinfo_decref(res, po); + + return try_3way_to_rich_compare(po, v, w, op); +} + +DEFINEFN +vinfo_t* PsycoObject_RichCompareBool(PsycoObject* po, + vinfo_t* v, vinfo_t* w, int op) +{ + vinfo_t* diff; + vinfo_t* result = PsycoObject_RichCompare(po, v, w, op); + if (result == NULL) + return NULL; + diff = PsycoObject_IsTrue(po, result); + vinfo_decref(result, po); + return diff; +} + +static vinfo_t* collect_undeletable_vars(vinfo_t* vi, vinfo_t* link) +{ + int i; + PyTypeObject* tp; + switch (gettime(vi->source)) { + + case RunTime: + if (vi->tmp != NULL || (vi->source & RunTime_NoRef) != 0) + break; /* already seen or not holding a ref */ + tp = Psyco_KnownType(vi); + if (tp && (tp == &PyInt_Type || tp == &PyString_Type || +#if BOOLEAN_TYPE + tp == &PyBool_Type || +#endif + tp == &PyFloat_Type || tp == &PyLong_Type || + tp == Py_None->ob_type || tp == &PyRange_Type)) + break; /* known safe type */ + /* make a linked list of results */ + vi->tmp = link; + link = vi; + break; + + case VirtualTime: + for (i=vi->array->count; i--; ) + if (vi->array->items[i] != NULL) + link = collect_undeletable_vars( + vi->array->items[i], link); + break; + + default: + break; + } + return link; +} + +DEFINEFN +vinfo_t* Psyco_SafelyDeleteVar(PsycoObject* po, vinfo_t* vi) +{ + vinfo_t* result; + vinfo_t* head; + vinfo_t* queue = (vinfo_t*) 1; + vinfo_t* p; + int count; + vi->tmp = NULL; + clear_tmp_marks(vi->array); + + head = collect_undeletable_vars(vi, queue); + count = 0; + for (p = head; p != queue; p = p->tmp) { + vinfo_array_t* a = p->array; + p->array = NullArray; + array_delete(a, po); + count++; + } + if (count == 0) { + result = psyco_vi_Zero(); + } + else if (count == 1) { + result = head; + vinfo_incref(result); + } + else { + result = vinfo_new( + VirtualTime_New(&psyco_vsource_not_important)); + count += iOB_TYPE + 1; + result->array = array_new(count); + for (p = head; p != queue; p = p->tmp) { + vinfo_incref(p); + result->array->items[--count] = p; + } + } + return result; +} + + +INITIALIZATIONFN +void psy_object_init(void) +{ +#if USE_RUNTIME_SWITCHES + long values[3]; + int cnt; + + values[0] = (long)(&PyInt_Type); + psyco_build_run_time_switch(&psyfs_int, SkFlagFixed, values, 1); + + values[0] = (long)(&PyInt_Type); + values[1] = (long)(&PyLong_Type); + values[2] = (long)(&PyFloat_Type); + psyco_build_run_time_switch(&psyfs_int_long, SkFlagFixed, values, 2); + psyco_build_run_time_switch(&psyfs_int_long_float, SkFlagFixed, values, 3); + + values[0] = (long)(&PyTuple_Type); + values[1] = (long)(&PyList_Type); + psyco_build_run_time_switch(&psyfs_tuple_list, SkFlagFixed, values, 2); + + values[0] = (long)(&PyString_Type); +#ifdef Py_USING_UNICODE + values[1] = (long)(&PyUnicode_Type); + cnt = 2; +#else + cnt = 1; +#endif + psyco_build_run_time_switch(&psyfs_string_unicode, SkFlagFixed, + values, cnt); + + values[0] = (long)(Py_None->ob_type); + psyco_build_run_time_switch(&psyfs_none, SkFlagFixed, values, 1); + + values[0] = (long)(&PyTuple_Type); + psyco_build_run_time_switch(&psyfs_tuple, SkFlagFixed, values, 1); + + values[0] = (long)(&PyDict_Type); + psyco_build_run_time_switch(&psyfs_dict, SkFlagFixed, values, 1); +#endif /* USE_RUNTIME_SWITCHES */ + + /* associate the Python implementation of some functions with + the one from Psyco */ + Psyco_DefineMeta(PyObject_GenericGetAttr, PsycoObject_GenericGetAttr); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pobject.h new file mode 100644 index 0000000..477796a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pobject.h @@ -0,0 +1,182 @@ + /***************************************************************/ +/*** Psyco equivalent of object.h ***/ + /***************************************************************/ + +#ifndef _PSY_OBJECT_H +#define _PSY_OBJECT_H + + +#include "../Python/pycompiler.h" + + +/*#define OB_REFCOUNT never directly manipulated*/ +#define OB_type DEF_FIELD(PyObject, PyTypeObject*, ob_type, NO_PREV_FIELD) +#define FIX_size NONNEG_FIELD(PyVarObject, int, ob_size, OB_type) +#define VAR_size FMUT(FIX_size) +#define FIX_signed_size DEF_FIELD(PyVarObject, int, ob_size, OB_type) +#define VAR_signed_size FMUT(FIX_signed_size) + +#define iOB_TYPE FIELD_INDEX(OB_type) +#define iFIX_SIZE FIELD_INDEX(FIX_size) +#define iVAR_SIZE FIELD_INDEX(VAR_size) + + +/* common type checkers, rewritten because in Psyco we manipulate type + objects directly and Python's usual macros insist on taking a regular + PyObject* whose type is checked. */ +# define PyType_TypeCheck(tp1, tp) \ + ((tp1) == (tp) || PyType_IsSubtype((tp1), (tp))) + +#define PsycoIter_Check(tp) \ + (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_ITER) && \ + (tp)->tp_iternext != NULL) + +#define PsycoSequence_Check(tp) \ + ((tp)->tp_as_sequence && (tp)->tp_as_sequence->sq_item != NULL) + + +/* Return the type of an object, or NULL in case of exception (typically + a promotion exception). */ +EXTERNFN PyTypeObject* Psyco_NeedType(PsycoObject* po, vinfo_t* vi); + +PSY_INLINE PyTypeObject* Psyco_FastType(vinfo_t* vi) { + /* fast version. Only call this when you know the type has + already been loaded by a previous Psyco_NeedType() */ + vinfo_t* vtp = vinfo_getitem(vi, iOB_TYPE); + if (vtp == NULL) { + PyObject* o = (PyObject*) CompileTime_Get(vi->source)->value; + return o->ob_type; + } + else { + return (PyTypeObject*) CompileTime_Get(vtp->source)->value; + } +} +#if USE_RUNTIME_SWITCHES +# error "Disabled because of type inheritance. The switch overlooks subtypes." +/* Check for the type of an object. Returns the index in the set 'fs' or + -1 if not in the set (or if exception). Used this is better than + Psyco_NeedType() if you are only interested in some types, not all of them. */ +PSY_INLINE int Psyco_TypeSwitch(PsycoObject* po, vinfo_t* vi, fixed_switch_t* fs) { + vinfo_t* vtp = get_array_item(po, vi, OB_TYPE); + if (vtp == NULL) + return -1; + return psyco_switch_index(po, vtp, fs); +} +#endif + +/* Is the given object is of the given type (or a subtype of it) ? + Returns -1 in case of error or if promotion is requested. */ +PSY_INLINE int Psyco_VerifyType(PsycoObject* po, vinfo_t* vi, PyTypeObject* tp) { + PyTypeObject* vtp = Psyco_NeedType(po, vi); + if (vtp == NULL) + return -1; + return PyType_TypeCheck(vtp, tp); +} +/* Return the type that the object is known to be of, or NULL if unknown. + Never fails. */ +EXTERNFN PyTypeObject* Psyco_KnownType(vinfo_t* vi); + +/* Use this to assert the type of an object. Do not use unless you are + sure about it! (e.g. don't use this for integer-computing functions + if they might return a long in case of overflow) */ +PSY_INLINE void Psyco_AssertType(PsycoObject* po, vinfo_t* vi, PyTypeObject* tp) { + psyco_assert_field(po, vi, OB_type, (long) tp); +} + +/* Same as integer_non_null() but assumes we are testing a PyObject* pointer, + so that only compile-time NULLs or run-time pointers from which we have + not read anything yet can be NULL. Virtual-time pointers are assumed never + to be NULL. */ +PSY_INLINE condition_code_t object_non_null(PsycoObject* po, vinfo_t* v) { + if (is_virtualtime(v->source) || v->array != NullArray) + return CC_ALWAYS_TRUE; + else + return integer_non_null(po, v); +} + + +/* The following functions are Psyco implementations of common functions + of the standard interpreter. */ +EXTERNFN vinfo_t* PsycoObject_IsTrue(PsycoObject* po, vinfo_t* vi); +EXTERNFN vinfo_t* PsycoObject_Repr(PsycoObject* po, vinfo_t* vi); + +/* Note: DelAttr() is SetAttr() with 'v' set to NULL (and not some vinfo_t + that would happend to contain zero). */ +EXTERNFN vinfo_t* PsycoObject_GetAttr(PsycoObject* po, vinfo_t* o, + vinfo_t* attr_name); +EXTERNFN bool PsycoObject_SetAttr(PsycoObject* po, vinfo_t* o, + vinfo_t* attr_name, vinfo_t* v); +EXTERNFN vinfo_t* PsycoObject_GenericGetAttr(PsycoObject* po, vinfo_t* obj, + vinfo_t* vname); + +EXTERNFN vinfo_t* PsycoObject_RichCompare(PsycoObject* po, vinfo_t* v, + vinfo_t* w, int op); +EXTERNFN vinfo_t* PsycoObject_RichCompareBool(PsycoObject* po, + vinfo_t* v, + vinfo_t* w, int op); + + +/* a quick way to specify the type of the object returned by an operation + when it is known, without having to go into all the details of the + operation itself (be careful, you must be *sure* of the return type): */ + +#define DEF_KNOWN_RET_TYPE_1(cname, op, flags, knowntype) \ + DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ + (PsycoObject* po, vinfo_t* v1), \ + (po, op, flags, "v", v1)) +#define DEF_KNOWN_RET_TYPE_2(cname, op, flags, knowntype) \ + DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ + (PsycoObject* po, vinfo_t* v1, vinfo_t* v2), \ + (po, op, flags, "vv", v1, v2)) +#define DEF_KNOWN_RET_TYPE_3(cname, op, flags, knowntype) \ + DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ + (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, \ + vinfo_t* v3), \ + (po, op, flags, "vvv", v1, v2, v3)) +#define DEF_KNOWN_RET_TYPE_4(cname, op, flags, knowntype) \ + DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ + (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, \ + vinfo_t* v3, vinfo_t* v4), \ + (po, op, flags, "vvvv", v1, v2, v3, v4)) + +#define DEF_KNOWN_RET_TYPE_internal(cname, knowntype, fargs, gargs) \ +static vinfo_t* cname fargs { \ + vinfo_t* result = psyco_generic_call gargs ; \ + if (result != NULL && !IS_NOTIMPLEMENTED(result)) { \ + Psyco_AssertType(po, result, knowntype); \ + } \ + return result; \ +} + +/* 'true' unless 'x' is exactly the special 'not implemented' value + built by psyco_generic_call with CfPyErrNotImplemented */ +#define IS_IMPLEMENTED(x) ((x) == NULL || !IS_NOTIMPLEMENTED(x)) + +/* is 'x' the special 'not implemented' value? */ +#define IS_NOTIMPLEMENTED(x) \ + ((x)->source == CompileTime_NewSk(&psyco_skNotImplemented)) + + +#if USE_RUNTIME_SWITCHES +/* definition of commonly used "fixed switches", i.e. sets of + values (duplicating fixed switch structures for the same set + of value can inccur a run-time performance loss in some cases) */ + +/* the variable names list the values in order. + 'int' means '&PyInt_Type' etc. */ +EXTERNVAR fixed_switch_t psyfs_int; +EXTERNVAR fixed_switch_t psyfs_int_long; +EXTERNVAR fixed_switch_t psyfs_int_long_float; +EXTERNVAR fixed_switch_t psyfs_tuple_list; +EXTERNVAR fixed_switch_t psyfs_string_unicode; +EXTERNVAR fixed_switch_t psyfs_tuple; +EXTERNVAR fixed_switch_t psyfs_dict; +EXTERNVAR fixed_switch_t psyfs_none; +/* NOTE: don't forget to update pobject.c when adding new variables here */ +#endif + +/* for dispatcher.c */ +EXTERNFN vinfo_t* Psyco_SafelyDeleteVar(PsycoObject* po, vinfo_t* vi); + + +#endif /* _PSY_OBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/prangeobject.c b/nodeboxgl/ext/psyco/src/c/Objects/prangeobject.c new file mode 100644 index 0000000..ac06ad1 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/prangeobject.c @@ -0,0 +1,231 @@ +#include "prangeobject.h" +#include "pintobject.h" +#include "piterobject.h" +#include "../Python/pycinternal.h" + + + /***************************************************************/ + /*** Virtual xrange objects ***/ + +/* This is private in rangeobject.c + */ +struct rangeobject { + PyObject_HEAD + long start; + long step; + long len; +}; + +/* only step == 1 currently supported */ +#define RANGEOBJECT_start DEF_FIELD(struct rangeobject, long, start, OB_type) +#define RANGEOBJECT_step DEF_FIELD(struct rangeobject, long, step, RANGEOBJECT_start) +#define RANGEOBJECT_len DEF_FIELD(struct rangeobject, long, len, RANGEOBJECT_step) +#define iRANGE_START FIELD_INDEX(RANGEOBJECT_start) +#define iRANGE_STEP FIELD_INDEX(RANGEOBJECT_step) +#define iRANGE_LEN FIELD_INDEX(RANGEOBJECT_len) +#define RANGEOBJECT_TOTAL FIELDS_TOTAL(RANGEOBJECT_len) + + +static source_virtual_t psyco_computed_xrange; + +static PyObject* cimpl_xrange_new(long start, long len) +{ + struct rangeobject *obj; + obj = PyObject_New(struct rangeobject, &PyRange_Type); + if (obj == NULL) + return NULL; + obj->start = start; + obj->len = len; + obj->step = 1; + return (PyObject *) obj; +} + +static bool compute_xrange(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* vstart; + vinfo_t* vlen; + vinfo_t* newobj; + + /* get the fields from the Python object 'v' */ + vstart = vinfo_getitem(v, iRANGE_START); + if (vstart == NULL) + return false; + + vlen = vinfo_getitem(v, iRANGE_LEN); + if (vlen == NULL) + return false; + + /* call PyRange_New() */ + newobj = psyco_generic_call(po, cimpl_xrange_new, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", vstart, vlen); + if (newobj == NULL) + return false; + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, newobj); + return true; +} + +static PyObject* direct_compute_xrange(vinfo_t* v, char* data) +{ + long start, len; + start = direct_read_vinfo(vinfo_getitem(v, iRANGE_START), data); + len = direct_read_vinfo(vinfo_getitem(v, iRANGE_LEN), data); + if (PyErr_Occurred()) + return NULL; + return cimpl_xrange_new(start, len); +} + +DEFINEFN +vinfo_t* PsycoXRange_NEW(PsycoObject* po, vinfo_t* start, vinfo_t* len) +{ + vinfo_t* r = vinfo_new(VirtualTime_New(&psyco_computed_xrange)); + r->array = array_new(RANGEOBJECT_TOTAL); + r->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyRange_Type))); + r->array->items[iRANGE_START] = start; + r->array->items[iRANGE_STEP] = psyco_vi_One(); + r->array->items[iRANGE_LEN] = len; + return r; +} + + + /***************************************************************/ + /*** Virtual list range objects ***/ + +/* NB. The fields in the virtual range object are different from the ones in + virtual xrange objects. This is necessary because they must be compatible + with real list objects... */ + +DEFINEVAR source_virtual_t psyco_computed_listrange; + +static PyObject* cimpl_listrange(long start, long len) +{ + PyObject* lst = PyList_New(len); + long i; + if (lst != NULL) + { + for (i=0; iarray = array_new(RANGE_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyList_Type))); + result->array->items[RANGE_LEN] = len; + result->array->items[RANGE_START] = start; + return result; +} + + + /***************************************************************/ + /*** xrange objects meta-implementation ***/ + +static vinfo_t* prange_length(PsycoObject* po, vinfo_t* vi) +{ + return psyco_get_field(po, vi, RANGEOBJECT_len); +} + +static vinfo_t* prange_item(PsycoObject* po, vinfo_t* a, vinfo_t* i) +{ + condition_code_t cc; + vinfo_t* vstart; + vinfo_t* vstep; + vinfo_t* vlen; + vinfo_t* vdelta; + vinfo_t* result; + + vlen = psyco_get_const(po, a, RANGEOBJECT_len); + if (vlen == NULL) + return NULL; + + cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); + if (cc == CC_ERROR) + return NULL; + + if (runtime_condition_f(po, cc)) { + PycException_SetString(po, PyExc_IndexError, + "xrange object index out of range"); + return NULL; + } + assert_nonneg(i); + + vstep = psyco_get_const(po, a, RANGEOBJECT_step); + if (vstep == NULL) + return NULL; + + vstart = psyco_get_const(po, a, RANGEOBJECT_start); + if (vstart == NULL) + return NULL; + + vdelta = integer_mul(po, vstep, i, false); + if (vdelta == NULL) + return NULL; + + result = integer_add(po, vstart, vdelta, false); + vinfo_decref(vdelta, po); + if (result == NULL) + return NULL; + return PsycoInt_FROM_LONG(result); +} + + +INITIALIZATIONFN +void psy_rangeobject_init(void) +{ + PySequenceMethods *m = PyRange_Type.tp_as_sequence; + Psyco_DefineMeta(m->sq_length, prange_length); + Psyco_DefineMeta(m->sq_item, prange_item); + if (PyRange_Type.tp_iter != NULL) /* Python >= 2.3 */ + Psyco_DefineMeta(PyRange_Type.tp_iter, PsycoSeqIter_New); + INIT_SVIRTUAL(psyco_computed_xrange, compute_xrange, + direct_compute_xrange, 0, 0, 0); + INIT_SVIRTUAL_NOCALL(psyco_computed_listrange, compute_listrange, 0); + /* ranges, unlike xranges, are mutable; + they must be forced out of virtual-time across function calls */ +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/prangeobject.h b/nodeboxgl/ext/psyco/src/c/Objects/prangeobject.h new file mode 100644 index 0000000..81522fb --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/prangeobject.h @@ -0,0 +1,36 @@ + /***************************************************************/ +/*** Psyco equivalent of rangeobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_RANGEOBJECT_H +#define _PSY_RANGEOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" +#include "plistobject.h" + + +/* currently step == 1 only */ +/* The following functions *consume* a reference to start and len ! */ + +/* for xrange() */ +EXTERNFN vinfo_t* PsycoXRange_NEW(PsycoObject* po, vinfo_t* start, vinfo_t* len); +/* for range() */ +EXTERNFN vinfo_t* PsycoListRange_NEW(PsycoObject* po, vinfo_t* start, vinfo_t* len); + + + /***************************************************************/ + /*** Virtual list range objects (not for xrange) ***/ + +#define RANGE_LEN iVAR_SIZE /* for virtual range() only */ +#define RANGE_START LIST_TOTAL /* " */ +/*#define RANGE_STEP (RANGE_START+1) * " */ +#define RANGE_TOTAL /*(RANGE_STEP+1)*/ (RANGE_START+1) +/* XXX no support for steps currently. Needs implementation of division to + figure out the length. */ + +EXTERNVAR source_virtual_t psyco_computed_listrange; + + +#endif /* _PSY_RANGEOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pstringobject.c b/nodeboxgl/ext/psyco/src/c/Objects/pstringobject.c new file mode 100644 index 0000000..e499406 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pstringobject.c @@ -0,0 +1,1221 @@ +#include "pstringobject.h" +#include "pstructmember.h" +#include "../pycodegen.h" + +#if USE_CATSTR +#include "plistobject.h" +#endif + + +static PyObject* pempty_string; + +static vinfo_t* pstr_memory_source(PsycoObject* po, vinfo_t* s); + + +/***************************************************************/ +/* string characters. */ +static source_virtual_t psyco_computed_char; + +static PyObject* cimpl_character(char c) +{ + return PyString_FromStringAndSize(&c, 1); +} + +static bool compute_char(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* chrval; + vinfo_t* newobj; + + chrval = vinfo_getitem(v, CHARACTER_CHAR); + if (chrval == NULL) + return false; + + newobj = psyco_generic_call(po, cimpl_character, + CfPure|CfReturnRef|CfPyErrIfNull, + "v", chrval); + if (newobj == NULL) + return false; + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, newobj); + return true; +} + +static PyObject* direct_compute_char(vinfo_t* v, char* data) +{ + char c; + c = (char) direct_read_vinfo(vinfo_getitem(v, CHARACTER_CHAR), data); + if (c == -1 && PyErr_Occurred()) + return NULL; + return PyString_FromStringAndSize(&c, 1); +} + + +PSY_INLINE vinfo_t* PsycoCharacter_NEW(vinfo_t* chrval) +{ + /* consumes a ref to 'chrval' */ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_char)); + result->array = array_new(CHARACTER_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyString_Type))); + result->array->items[iFIX_SIZE] = psyco_vi_One(); + result->array->items[CHARACTER_CHAR] = chrval; assert_nonneg(chrval); + return result; +} + +DEFINEFN +vinfo_t* PsycoCharacter_New(vinfo_t* chrval) +{ + vinfo_incref(chrval); + return PsycoCharacter_NEW(chrval); +} + +PSY_INLINE defield_t first_character(vinfo_t* v) +{ + if (v->source == VirtualTime_New(&psyco_computed_char)) + return (defield_t) CHARACTER_CHAR; + else + return STR_sval; +} + +DEFINEFN bool PsycoCharacter_Ord(PsycoObject* po, vinfo_t* v, vinfo_t** vord) +{ + vinfo_t* vlen; + PyTypeObject* vtp; + condition_code_t cc; + vinfo_t* result = NULL; + + if (v->source == VirtualTime_New(&psyco_computed_char)) { + result = vinfo_getitem(v, CHARACTER_CHAR); + if (result != NULL) { + vinfo_incref(result); + goto done; + } + } + + vtp = Psyco_NeedType(po, v); + if (vtp == NULL) + return false; + + if (PyType_TypeCheck(vtp, &PyString_Type)) { + vlen = PsycoString_GET_SIZE(po, v); + if (vlen == NULL) + return false; + cc = integer_cmp_i(po, vlen, 1, Py_EQ); + if (cc == CC_ERROR) + return false; + if (runtime_condition_t(po, cc)) + result = psyco_get_field(po, v, STR_sval); + } + done: + *vord = result; + return true; +} + + +/***************************************************************/ +/* string slices. */ +static source_virtual_t psyco_computed_strslice; + +/* a virtual string obtained as a slice of a source string STRSLICE_SOURCE. + The slice range is defined as [STRSLICE_START:STRSLICE_START+FIX_SIZE] */ + +static bool compute_strslice(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* newobj; + vinfo_t* ptr; + vinfo_t* tmp; + vinfo_t* source; + vinfo_t* start; + vinfo_t* length; + + source = vinfo_getitem(v, STRSLICE_SOURCE); + start = vinfo_getitem(v, STRSLICE_START); + length = vinfo_getitem(v, iFIX_SIZE); + if (source==NULL || start==NULL || length==NULL) + return false; + + tmp = integer_add(po, source, start, false); + if (tmp == NULL) + return false; + ptr = integer_add_i(po, tmp, offsetof(PyStringObject, ob_sval), false); + vinfo_decref(tmp, po); + if (ptr == NULL) + return false; + + newobj = psyco_generic_call(po, PyString_FromStringAndSize, + CfPure|CfReturnRef|CfPyErrIfNull, + "vv", ptr, length); + vinfo_decref(ptr, po); + if (newobj == NULL) + return false; + + /* forget fields that were only relevant in virtual-time */ + vinfo_setitem(po, v, STRSLICE_SOURCE, NULL); + vinfo_setitem(po, v, STRSLICE_START, NULL); + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, newobj); + return true; +} + +static PyObject* direct_compute_strslice(vinfo_t* v, char* data) +{ + PyObject* source; + long start, length; + PyObject* result = NULL; + source = direct_xobj_vinfo(vinfo_getitem(v, STRSLICE_SOURCE), data); + start = direct_read_vinfo(vinfo_getitem(v, STRSLICE_START), data); + length = direct_read_vinfo(vinfo_getitem(v, iFIX_SIZE), data); + if (!PyErr_Occurred() && source != NULL && PyString_Check(source)) { + char* p = PyString_AS_STRING(source); + result = PyString_FromStringAndSize(p+start, length); + } + Py_XDECREF(source); + return result; +} + +PSY_INLINE vinfo_t* PsycoStrSlice_NEW(vinfo_t* source, vinfo_t* start, vinfo_t* len) +{ + /* consumes a ref to all arguments */ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_strslice)); + result->array = array_new(STRSLICE_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyString_Type))); + result->array->items[iFIX_SIZE] = len; assert_nonneg(len); + result->array->items[STRSLICE_SOURCE] = source; + result->array->items[STRSLICE_START] = start; assert_nonneg(start); + return result; +} + + +#if USE_CATSTR +/***************************************************************/ +/* string concatenations. */ +static source_virtual_t psyco_computed_catstr; + +/* a virtual string defined as the concatenation of all the strings + in a given list. The list must not be user-visible nor shared in + any way, because the correct total length *must always* remain in + FIX_SIZE. + NB: compute_catstr is not too smart with lists of length 1, and + does not work at all with empty lists. */ + +static PyObject* cimpl_concatenate(int totallen, PyObject* lst) +{ + /* C implementation -- equivalent of ''.join(lst), + optimized to skip checks and with a known total length */ + PyObject* result; + extra_assert(PyList_Check(lst)); + + result = PyString_FromStringAndSize(NULL, totallen); + if (result != NULL) { + char* dest = PyString_AS_STRING(result); + int i, slen, count = PyList_GET_SIZE(lst); + PyObject* s; + + for (i=0; iarray->items[VLIST_ITEMS+0])->source) && + !is_virtualtime((t=list->array->items[VLIST_ITEMS+1])->source)) { + /* optimize (for code size) the common case of the sum of two + non-virtual strings */ + newobj = psyco_generic_call(po, + PyString_Type.tp_as_sequence->sq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", s, t); + if (newobj == NULL) + return false; + goto complete; + } + + /* short virtual list: inline cimpl_concatenate */ + newobj = psyco_generic_call(po, PyString_FromStringAndSize, + CfReturnRef|CfPyErrIfNull, + "lv", (long) NULL, slen); + if (newobj == NULL) + return false; + + ptr = integer_add_i(po,newobj, offsetof(PyStringObject, ob_sval), false); + if (ptr == NULL) { + fail: /* generic failure code */ + vinfo_xdecref(release_me, po); + vinfo_xdecref(ptr, po); + vinfo_decref(newobj, po); + return false; + } + + extra_assert(count > 0); + i = 0; + while (1) { + s = list->array->items[VLIST_ITEMS + i]; + slen = psyco_get_const(po, s, FIX_size); + if (slen == NULL) + goto fail; + release_me = s = pstr_memory_source(po, s); + if (is_compiletime(slen->source)) { + int l = CompileTime_Get(slen->source)->value; + if (1 <= l && l <= sizeof(long)) { + /* special-case 1-4 characters */ + bool ok; + defield_t rdf, wdf; + switch (l) { + case 1: /*SIZEOF_CHAR:*/ + rdf = first_character(s); + wdf = FMUT(DEF_ARRAY(char, 0)); + break; + case 2: /*SIZEOF_SHORT:*/ + rdf = STR_sval2; + wdf = FMUT(DEF_ARRAY(short, 0)); + break; + default: + rdf = STR_sval4; + wdf = FMUT(DEF_ARRAY(long, 0)); + break; + /* for 3 chars, we copy a whole word, + but it does not matter */ + } + t = psyco_get_field(po, s, rdf); + if (t == NULL) + goto fail; + ok = psyco_put_field(po, ptr, wdf, t); + vinfo_decref(t, po); + if (!ok) + goto fail; + goto string_done; + } + else if (l == 0) + goto string_done; + } + else { + /* normal case: read out of the string s */ + } + t = integer_add_i(po, s, offsetof(PyStringObject, ob_sval), + false); + if (t == NULL) + goto fail; + /* variable-sized memcpy */ + err = !psyco_generic_call(po, memcpy, CfNoReturnValue, + "vvv", ptr, t, slen); + vinfo_decref(t, po); + if (err) + goto fail; + + string_done: + vinfo_decref(release_me, po); + release_me = NULL; + if (++i == count) + break; /* done */ + t = integer_add(po, ptr, slen, false); + vinfo_decref(ptr, po); + ptr = t; + if (ptr == NULL) + goto fail; + } + vinfo_decref(ptr, po); + + complete: + /* forget fields that were only relevant in virtual-time */ + vinfo_setitem(po, v, CATSTR_LIST, NULL); + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, newobj); + return true; +} + +PSY_INLINE vinfo_t* PsycoCatStr_NEW(PsycoObject* po, + vinfo_t* totallength, vinfo_t* list) +{ + /* consumes a ref to the arguments */ + + vinfo_t* result; + int count = PsycoList_Load(list); + if (count == 1) { + /* optimize if 'list' contains just one string */ + result = list->array->items[VLIST_ITEMS + 0]; + if (Psyco_KnownType(result) == &PyString_Type) { + vinfo_incref(result); + /* XXX store totallength in result? */ + vinfo_decref(totallength, po); + vinfo_decref(list, po); + return result; + } + } + result = vinfo_new(VirtualTime_New(&psyco_computed_catstr)); + result->array = array_new(CATSTR_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyString_Type))); + result->array->items[iFIX_SIZE]= totallength; assert_nonneg(totallength); + result->array->items[CATSTR_LIST] = list; + return result; +} + +PSY_INLINE vinfo_t* pstring_as_catlist(vinfo_t* vs) +{ + /* the resulting list is guaranteed to be of length >= 1 */ + vinfo_t* list; + if (vs->source == VirtualTime_New(&psyco_computed_catstr)) { + list = vs->array->items[CATSTR_LIST]; + vinfo_incref(list); + } + else { + list = PsycoList_SingletonNew(vs); + } + return list; +} +#endif /* USE_CATSTR */ + + + /***************************************************************/ + /*** string objects meta-implementation ***/ + +static vinfo_t* pstring_item(PsycoObject* po, vinfo_t* a, vinfo_t* i) +{ + condition_code_t cc; + vinfo_t* vlen; + vinfo_t* result; + + vlen = psyco_get_const(po, a, FIX_size); + if (vlen == NULL) + return NULL; + + cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); + if (cc == CC_ERROR) + return NULL; + + if (runtime_condition_f(po, cc)) { + PycException_SetString(po, PyExc_IndexError, + "string index out of range"); + return NULL; + } + assert_nonneg(i); + + if (psyco_knowntobe(vlen, 1) && + Psyco_KnownType(a) == &PyString_Type) { + /* if a is known to be a single character, return a */ + vinfo_incref(a); + return a; + } + + a = pstr_memory_source(po, a); + result = psyco_get_field_array(po, a, STR_sval, i); + vinfo_decref(a, po); + if (result == NULL) + return NULL; + + return PsycoCharacter_NEW(result); +} + +static vinfo_t* pstring_slice(PsycoObject* po, vinfo_t* a, + vinfo_t* i, vinfo_t* j) +{ + condition_code_t cc; + vinfo_t* vlen; + vinfo_t* slicelen; + vinfo_t* slicestart = NULL; + vinfo_t* result = NULL; + + vlen = psyco_get_const(po, a, FIX_size); + if (vlen == NULL) + return NULL; + + cc = integer_cmp(po, j, vlen, Py_GT|COMPARE_UNSIGNED|CHEAT_MAXINT); + if (cc == CC_ERROR) + goto fail; + if (runtime_condition_f(po, cc)) { + /* j < 0 or j > vlen */ + cc = integer_cmp_i(po, j, 0, Py_LT); + if (cc == CC_ERROR) + goto fail; + if (runtime_condition_f(po, cc)) { + /* j < 0 */ + return vinfo_new(CompileTime_New((long) pempty_string)); + } + else { + /* j > vlen */ + j = vlen; + } + } + assert_nonneg(j); + + if (j == vlen && /* if j is known to be vlen */ + Psyco_KnownType(a) == &PyString_Type) { + cc = integer_cmp_i(po, i, 0, Py_LE); + if (cc == CC_ERROR) + goto fail; + if (runtime_condition_f(po, cc)) { + /* i <= 0 */ + /* a[i:j] is a */ + vinfo_incref(a); + return a; + } + else + assert_nonneg(i); + } + + cc = integer_cmp(po, i, j, Py_GT|COMPARE_UNSIGNED|CHEAT_MAXINT); + if (cc == CC_ERROR) + goto fail; + if (runtime_condition_f(po, cc)) { + /* i < 0 or i > j */ + cc = integer_cmp_i(po, i, 0, Py_LT); + if (cc == CC_ERROR) + goto fail; + if (runtime_condition_f(po, cc)) { + /* i < 0 */ + i = psyco_vi_Zero(); + } + else { + assert_nonneg(i); + /* i > j */ + return vinfo_new(CompileTime_New((long) pempty_string)); + } + } + else { + assert_nonneg(i); + vinfo_incref(i); + } + slicestart = i; + + /* at this point we have 0 <= i <= j <= vlen. + We don't try to capture the case i==j and special-case it to + an empty string because it might create uninteresting extra paths + for looping algorithms. */ + + if (a->source == VirtualTime_New(&psyco_computed_strslice)) { + vinfo_t* source = vinfo_getitem(a, STRSLICE_SOURCE); + vinfo_t* start = vinfo_getitem(a, STRSLICE_START); + if (source!=NULL && start!=NULL) { + /* optimize slicing of a slice */ + vinfo_t* k = integer_add(po, start, slicestart, false); + if (k == NULL) + goto fail; + vinfo_decref(slicestart, po); + slicestart = k; + a = source; + } + } + + slicelen = integer_sub(po, j, i, false); + if (slicelen == NULL) + goto fail; + vinfo_incref(a); + need_reference(po, a); + return PsycoStrSlice_NEW(a, slicestart, slicelen); + + fail: + vinfo_xdecref(slicestart, po); + return result; +} + +#if USE_CATSTR +static vinfo_t* pstring_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b) +{ + PyTypeObject* btp = Psyco_NeedType(po, b); + if (btp == NULL) + return NULL; + + if (PyType_TypeCheck(btp, &PyString_Type)) { + /* we build a virtual catstr. Each of a or b may already + be a catstr. We convert a and b to a list + representation (of length 1 if they are not already + catstr's) and concatenate the two lists. + Some more optimizations are done by plist_concat(). */ + vinfo_t* lena; + vinfo_t* lenb; + vinfo_t* lenc; + vinfo_t* lista; + vinfo_t* listb; + vinfo_t* listc; + int listalen; + int listblen; + vinfo_t* vlasta; + vinfo_t* vfirstb; + + lena = psyco_get_const(po, a, FIX_size); + if (lena == NULL) + return NULL; + if (psyco_knowntobe(lena, 0) && btp == &PyString_Type) { + /* ('' + b) is b */ + vinfo_incref(b); + return b; + } + + lenb = psyco_get_const(po, b, FIX_size); + if (lenb == NULL) + return NULL; + if (psyco_knowntobe(lenb, 0) && + Psyco_KnownType(a) == &PyString_Type) { + /* (a + '') is a */ + vinfo_incref(a); + return a; + } + + lenc = integer_add(po, lena, lenb, false); + if (lenc == NULL) + return NULL; + + lista = pstring_as_catlist(a); + listb = pstring_as_catlist(b); + + /* if lista ends in a constant string and listb starts + in a constant string, concatenate them now */ + if ((listalen=PsycoList_Load(lista)) > 0 && + is_compiletime( + (vlasta=lista->array->items[VLIST_ITEMS + listalen - 1]) + ->source) && + (listblen=PsycoList_Load(listb)) > 0 && + is_compiletime( + (vfirstb=listb->array->items[VLIST_ITEMS + 0]) + ->source)) { + + vinfo_t* buffer[VLIST_LENGTH_MAX*2-1]; + vinfo_t* v; + PyObject* s1 = (PyObject*) + CompileTime_Get(vlasta->source)->value; + PyObject* s2 = (PyObject*) + CompileTime_Get(vfirstb->source)->value; + Py_INCREF(s1); + PyString_Concat(&s1, s2); + if (s1 == NULL) { + psyco_virtualize_exception(po); + goto fail; + } + v = vinfo_new(CompileTime_NewSk( + sk_new((long) s1, SkFlagPyObj))); + + memcpy(buffer, + lista->array->items + VLIST_ITEMS, + (listalen-1) * sizeof(vinfo_t*)); + buffer[listalen-1] = v; + memcpy(buffer + listalen, + listb->array->items + VLIST_ITEMS + 1, + (listblen-1) * sizeof(vinfo_t*)); + + listc = PsycoList_New(po, listalen+listblen-1, buffer); + vinfo_decref(v, po); + } + else { + /* general case */ + listc = psyco_plist_extend_or_concat(po, lista, listb); + } + if (listc == NULL) + goto fail; + vinfo_decref(listb, po); + vinfo_decref(lista, po); + return PsycoCatStr_NEW(po, lenc, listc); + + fail: + vinfo_decref(listb, po); + vinfo_decref(lista, po); + vinfo_decref(lenc, po); + return NULL; + + } + + /* fallback */ + return psyco_generic_call(po, PyString_Type.tp_as_sequence->sq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", a, b); +} +#endif + + +/* higher-level meta-version of memcmp(): compares the data in string 'v' of length + 'vlen' with the data in string 'w' of length 'wlen'. + Return 0 (no), 1 (yes), or -1 (error). */ +PSY_INLINE int psyco_richmemcmp(PsycoObject* po, vinfo_t* v, vinfo_t* w, + vinfo_t* vlen, vinfo_t* wlen, int op) +{ + condition_code_t cc; + vinfo_t* minlen; + bool same_size; + int result; + vinfo_t* vresult; + vinfo_t* vtest; + vinfo_t* wtest; + + /* first compare the sizes */ + cc = integer_cmp(po, vlen, wlen, Py_EQ); + if (cc == CC_ERROR) + return -1; + same_size = runtime_condition_t(po, cc); + if (same_size) { + /* same length, but better put in 'minlen' the compile-time + value if there is one */ + if (is_compiletime(wlen->source)) + minlen = wlen; + else + minlen = vlen; + if (psyco_knowntobe(minlen, 0)) + return (op == Py_EQ || op == Py_LE || op == Py_GE); + } + else { + /* different sizes */ + switch (op) { + case Py_EQ: + return 0; + case Py_NE: + return 1; + default: + break; + } + if (psyco_knowntobe(vlen, 0)) + return (op == Py_LT || op == Py_LE); + if (psyco_knowntobe(wlen, 0)) + return (op == Py_GT || op == Py_GE); + + cc = integer_cmp(po, vlen, wlen, Py_LT); + if (cc == CC_ERROR) + return -1; + if (runtime_condition_t(po, cc)) { + /* len(v) < len(w) */ + minlen = vlen; + /* (v < w) iff (v[:minlen] <= w[:minlen]) */ + /* (v <= w) iff (v[:minlen] <= w[:minlen]) */ + /* (v > w) iff (v[:minlen] > w[:minlen]) */ + /* (v >= w) iff (v[:minlen] > w[:minlen]) */ + switch (op) { + case Py_LT: op = Py_LE; break; + case Py_GE: op = Py_GT; break; + default: break; + } + } + else { + /* len(v) > len(w) */ + minlen = wlen; + /* (v < w) iff (v[:minlen] < w[:minlen]) */ + /* (v <= w) iff (v[:minlen] < w[:minlen]) */ + /* (v > w) iff (v[:minlen] >= w[:minlen]) */ + /* (v >= w) iff (v[:minlen] >= w[:minlen]) */ + switch (op) { + case Py_LE: op = Py_LT; break; + case Py_GT: op = Py_GE; break; + default: break; + } + } + } + + /* optimize slices and bufstrs */ + w = pstr_memory_source(po, w); + v = pstr_memory_source(po, v); + + /* is 'minlen' a known and small value? */ + if (is_compiletime(minlen->source)) { + defield_t vrdf, wrdf; + switch (CompileTime_Get(minlen->source)->value) { + case 1: /*SIZEOF_CHAR:*/ + vrdf = first_character(v); + wrdf = first_character(w); + break; + + case 2: /*SIZEOF_SHORT:*/ + if (op != Py_EQ && op != Py_NE) goto use_memcmp; + vrdf = wrdf = STR_sval2; + break; + + case 4: /*SIZEOF_LONG:*/ + if (op != Py_EQ && op != Py_NE) goto use_memcmp; + vrdf = wrdf = STR_sval4; + break; + + default: + goto use_memcmp; + } + + /* load all the characters of the (short) strings + into registers */ + vtest = psyco_get_field(po, v, vrdf); + wtest = psyco_get_field(po, w, wrdf); + if (vtest == NULL || wtest == NULL) + goto fail2; + cc = integer_cmp(po, vtest, wtest, op); + vresult = NULL; + } + else { + use_memcmp: + /* compare the 'minlen' first bytes of the data blocks */ + vtest = integer_add_i(po, v, offsetof(PyStringObject, ob_sval), + false); + wtest = integer_add_i(po, w, offsetof(PyStringObject, ob_sval), + false); + if (vtest == NULL || wtest == NULL) + goto fail2; + /* variable-sized memcmp */ + vresult = psyco_generic_call(po, memcmp, CfReturnNormal, + "vvv", vtest, wtest, minlen); + cc = integer_cmp_i(po, vresult, 0, op); + } + + if (cc == CC_ERROR) + result = -1; + else + result = runtime_condition_t(po, cc); + vinfo_xdecref(vresult, po); + vinfo_decref(wtest, po); + vinfo_decref(vtest, po); + vinfo_decref(v, po); + vinfo_decref(w, po); + return result; + + fail2: + vinfo_xdecref(wtest, po); + vinfo_xdecref(vtest, po); + vinfo_xdecref(v, po); + vinfo_xdecref(w, po); + return -1; +} + +static vinfo_t* pstring_richcompare(PsycoObject* po, vinfo_t* v, vinfo_t* w, int op) +{ + int result; + + /* Make sure both arguments are strings. */ + PyTypeObject *tp = Psyco_FastType(v); + if (!PyType_TypeCheck(tp, &PyString_Type)) { + return psyco_vi_NotImplemented(); + } + tp = Psyco_NeedType(po, w); + if (tp == NULL) + return NULL; + if (!PyType_TypeCheck(tp, &PyString_Type)) { + return psyco_vi_NotImplemented(); + } + + if (vinfo_known_equal(v, w)) { + /* identical strings */ + result = (op == Py_EQ || op == Py_LE || op == Py_GE); + } + else { + vinfo_t* vlen; + vinfo_t* wlen; + /* get the sizes */ + wlen = psyco_get_const(po, w, FIX_size); + if (wlen == NULL) + return NULL; + vlen = psyco_get_const(po, v, FIX_size); + if (vlen == NULL) + return NULL; + + result = psyco_richmemcmp(po, v, w, vlen, wlen, op); + } + + switch (result) { + case 0: + return psyco_vi_Py_False(); + case 1: + return psyco_vi_Py_True(); + default: + return NULL; + } +} + +static vinfo_t* pstring_mod(PsycoObject* po, vinfo_t* v, vinfo_t* w) +{ + PyTypeObject *tp = Psyco_FastType(v); + if (!PyType_TypeCheck(tp, &PyString_Type)) { + return psyco_vi_NotImplemented(); + } + return psyco_generic_call(po, PyString_Format, + CfReturnRef|CfPyErrIfNull, + "vv", v, w); +} + + +#if USE_BUFSTR +/***************************************************************/ +/* buffer-based over-allocated concatenations. */ +static source_virtual_t psyco_computed_bufstr; + +PSY_INLINE vinfo_t* PsycoBufStr_NEW(vinfo_t* vcb, vinfo_t* vlen) +{ + /* consumes a ref to its args */ + vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_bufstr)); + result->array = array_new(BUFSTR_TOTAL); + result->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyString_Type))); + result->array->items[iFIX_SIZE] = vlen; assert_nonneg(vlen); + result->array->items[BUFSTR_BUFOBJ] = vcb; + return result; +} + + +typedef PyStringObject stringlike_t; +/* we abuse the PyStringObject structure for our purposes, + so that a buffer can be very quickly turned into a real Python string. + + ob_size - # bytes allocated + ob_shash - # bytes currently used in the buffer + + the number of used bytes must be between the string length (stored in + the virtual bufstr's FIX_SIZE field) and ob_size. If it is larger than + FIX_SIZE it means that the string was enlarged due to some other + concatenation. +*/ + +#define BUFSTR_OVERALLOCATION_MASK 7 +#define BUFSTR_ACCEPT_OVERALLOCATED 15 + +static void +bufstr_dealloc(PyObject *op) +{ + PyObject_DEL(op); +} + +/* this special type is only ever used by Psyco to access tp_dealloc */ +static PyTypeObject PsycoBufStr_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "psyco_bufstr", /*tp_name*/ + sizeof(stringlike_t), /*tp_basicsize*/ + sizeof(char), /*tp_itemsize*/ + /* methods */ + (destructor)bufstr_dealloc, /*tp_dealloc*/ +}; + + +#if PSYCO_DEBUG +static void assert_bufstr_invariants(stringlike_t* a, int a_size) +{ + if (PyString_Check(a)) { + extra_assert(a_size <= a->ob_size); + } + else { + extra_assert(a->ob_type == &PsycoBufStr_Type); + extra_assert(a_size <= a->ob_shash); + extra_assert(a->ob_shash <= a->ob_size); + } +} +#else +#define assert_bufstr_invariants(a, a_size) do { } while (0) /* nothing */ +#endif + + +static stringlike_t* cimpl_cb_new(stringlike_t* a, stringlike_t* b, + int a_size, int b_size, int size) +{ + stringlike_t *op; + assert_bufstr_invariants(a, a_size); + + /* Inline PyObject_NewVar */ + op = (stringlike_t *) + PyObject_MALLOC(sizeof(stringlike_t) + size * sizeof(char)); + if (op == NULL) + return (stringlike_t*) PyErr_NoMemory(); + PyObject_INIT_VAR(op, &PsycoBufStr_Type, size); + op->ob_shash = a_size + b_size; + memcpy(op->ob_sval, a->ob_sval, a_size); + memcpy(op->ob_sval + a_size, b->ob_sval, b_size); + return op; +} + +static stringlike_t* cimpl_cb_grow(stringlike_t* a, stringlike_t* b, + int a_size, int b_size, int size) +{ + assert_bufstr_invariants(a, a_size); + + /* check if the result would fit in the existing buffer + and if we can write there without overwriting anything. */ + if (size <= a->ob_size && a_size == a->ob_shash && + a->ob_type == &PsycoBufStr_Type) { + /* yes -> fast case */ + a->ob_shash += b_size; + memcpy(a->ob_sval + a_size, b->ob_sval, b_size); + Py_INCREF(a); + return a; + } + else { + /* no -> make a new buffer, overallocating by some + hopefully typical value derived from b_size. + XXX catch integer overflows here */ + size = (size + (size+b_size)/2) | BUFSTR_OVERALLOCATION_MASK; + return cimpl_cb_new(a, b, a_size, b_size, size); + } +} + +static PyStringObject* cimpl_cb_normalize(stringlike_t* a, int a_size) +{ + assert_bufstr_invariants(a, a_size); + + if (a->ob_type == &PsycoBufStr_Type) { + + /* this checks that no one else uses this buffer past a_size + and limit the wasted overallocated space */ + /* XXX try using PyObject_REALLOC if we are 100% sure that + nobody else has a pointer to the area */ + if (a->ob_shash == a_size && + a_size >= a->ob_size-BUFSTR_ACCEPT_OVERALLOCATED) { + a->ob_type = &PyString_Type; + a->ob_size = a_size; + a->ob_shash = -1; +#ifdef SSTATE_NOT_INTERNED /* Python >= 2.3 */ + a->ob_sstate = SSTATE_NOT_INTERNED; +#else +#ifdef INTERN_STRINGS + a->ob_sinterned = NULL; +#endif +#endif + a->ob_sval[a_size] = '\0'; + Py_INCREF(a); + return a; + } + } + else if (a->ob_size == a_size) { + /* 'a' is already a string, and it has the expected size */ + Py_INCREF(a); + return a; + } + /* in other cases we must build a new string from scratch */ + return (PyStringObject*) + PyString_FromStringAndSize(a->ob_sval, a_size); +} + +static bool compute_bufstr(PsycoObject* po, vinfo_t* v) +{ + /* computing a bufstr into a PyStringObject is fast, we just have + to patch ob_type, initialize ob_shash, and add a '\0' at the + end of the string. */ + + vinfo_t* vcb; + vinfo_t* vlen; + + vlen = psyco_get_const(po, v, FIX_size); + if (vlen == NULL) + return false; + + vcb = vinfo_getitem(v, BUFSTR_BUFOBJ); + if (vcb == NULL) + return false; + + vcb = psyco_generic_call(po, &cimpl_cb_normalize, CfReturnRef, + "vv", vcb, vlen); + if (vcb == NULL) + return false; + + /* forget fields that were only relevant in virtual-time */ + vinfo_setitem(po, v, BUFSTR_BUFOBJ, NULL); + + /* move the resulting non-virtual Python object back into 'v' */ + vinfo_move(po, v, vcb); + return true; +} + +static PyObject* direct_compute_bufstr(vinfo_t* v, char* data) +{ + PyObject* bufobj; + long length; + PyObject* result = NULL; + length = direct_read_vinfo(vinfo_getitem(v, iFIX_SIZE), data); + bufobj = direct_xobj_vinfo(vinfo_getitem(v, BUFSTR_BUFOBJ), data); + + if (!PyErr_Occurred() && bufobj != NULL) { + /* patch 'bufobj' as explained in compute_bufstr() */ + result = (PyObject*) + cimpl_cb_normalize((stringlike_t*) bufobj, length); + } + Py_XDECREF(bufobj); + return result; +} + + +static vinfo_t* pstring_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b) +{ + PyTypeObject* btp = Psyco_NeedType(po, b); + if (btp == NULL) + return NULL; + + if (PyType_TypeCheck(btp, &PyString_Type)) { + vinfo_t* lena; + vinfo_t* lenb; + vinfo_t* lenc; + vinfo_t* v; + vinfo_t* breal; + + /* if both strings are constants, concatenate them now */ + if (is_compiletime(a->source) && is_compiletime(b->source)) { + PyObject* s1 = (PyObject*) + CompileTime_Get(a->source)->value; + PyObject* s2 = (PyObject*) + CompileTime_Get(b->source)->value; + Py_INCREF(s1); + PyString_Concat(&s1, s2); + if (s1 == NULL) { + psyco_virtualize_exception(po); + return NULL; + } + return vinfo_new(CompileTime_NewSk( + sk_new((long) s1, SkFlagPyObj))); + } + + lenb = psyco_get_const(po, b, FIX_size); + if (lenb == NULL) + return NULL; + if (psyco_knowntobe(lenb, 0) && + Psyco_KnownType(a) == &PyString_Type) { + /* (a + '') is a */ + vinfo_incref(a); + return a; + } + + lena = psyco_get_const(po, a, FIX_size); + if (lena == NULL) + return NULL; + if (psyco_knowntobe(lena, 0) && btp == &PyString_Type) { + /* ('' + b) is b */ + vinfo_incref(b); + return b; + } + + lenc = integer_add(po, lena, lenb, false); + if (lenc == NULL) + return NULL; + + breal = pstr_memory_source(po, b); + + /* if 'a' is already a bufstring, let it grow */ + if (a->source == VirtualTime_New(&psyco_computed_bufstr)) { + vinfo_t* vcb = vinfo_getitem(a, BUFSTR_BUFOBJ); + if (vcb != NULL) { + v = psyco_generic_call(po, &cimpl_cb_grow, + CfReturnRef|CfPyErrIfNull, + "vvvvv", vcb, breal, + lena, lenb, lenc); + goto done; + } + } + + /* make a new bufstring */ + v = psyco_generic_call(po, &cimpl_cb_new, + CfReturnRef|CfPyErrIfNull, + "vvvvv", a, breal, lena, lenb, lenc); + + done: + vinfo_decref(breal, po); + if (v == NULL) { + vinfo_decref(lenc, po); + return NULL; + } + else { + Psyco_AssertType(po, v, &PsycoBufStr_Type); + return PsycoBufStr_NEW(v, lenc); + } + } + + /* fallback */ + return psyco_generic_call(po, PyString_Type.tp_as_sequence->sq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", a, b); +} +#endif /* USE_BUFSTR */ + + +/***************************************************************/ + + +static vinfo_t* pstr_memory_source(PsycoObject* po, vinfo_t* s) +{ + if (s->source == VirtualTime_New(&psyco_computed_strslice)) { + /* get a ptr to the real source memory + without forcing the strslice out of + virtual-time */ + vinfo_t* start = vinfo_getitem(s, STRSLICE_START); + vinfo_t* src = vinfo_getitem(s, STRSLICE_SOURCE); + if (src != NULL && start != NULL) { + return integer_add(po, src, start, false); + } + } +#if USE_BUFSTR + if (s->source == VirtualTime_New(&psyco_computed_bufstr)) { + vinfo_t* cb = vinfo_getitem(s, BUFSTR_BUFOBJ); + if (cb != NULL) + s = cb; + } +#endif + vinfo_incref(s); + return s; +} + + +INITIALIZATIONFN +void psy_stringobject_init(void) +{ + PyMappingMethods *mm; + PyNumberMethods *nm; + PySequenceMethods *m = PyString_Type.tp_as_sequence; + Psyco_DefineMeta(m->sq_length, psyco_generic_immut_ob_size); + Psyco_DefineMeta(m->sq_item, pstring_item); + Psyco_DefineMeta(m->sq_slice, pstring_slice); +#if USE_CATSTR || USE_BUFSTR + Psyco_DefineMeta(m->sq_concat, pstring_concat); +#endif + Psyco_DefineMeta(PyString_Type.tp_richcompare, pstring_richcompare); + + mm = PyString_Type.tp_as_mapping; + if (mm) { /* Python >= 2.3 */ + Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); + } + nm = PyString_Type.tp_as_number; + if (nm) { /* Python >= 2.3 */ + Psyco_DefineMeta(nm->nb_remainder, pstring_mod); + } + + INIT_SVIRTUAL(psyco_computed_char, compute_char, + direct_compute_char, 0, 0, 0); + INIT_SVIRTUAL(psyco_computed_strslice, compute_strslice, + direct_compute_strslice, + (1 << STRSLICE_SOURCE), + NW_STRSLICES_NORMAL, NW_STRSLICES_FUNCALL); +#if USE_CATSTR +# error direct_compute_catstr is missing + INIT_SVIRTUAL(psyco_computed_catstr, compute_catstr, + NW_CATSTRS_NORMAL, NW_CATSTRS_FUNCALL); +#endif +#if USE_BUFSTR + INIT_SVIRTUAL(psyco_computed_bufstr, compute_bufstr, + direct_compute_bufstr, + (1 << BUFSTR_BUFOBJ), + NW_BUFSTRS_NORMAL, NW_BUFSTRS_NORMAL); +#endif + + pempty_string = PyString_FromString(""); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pstringobject.h b/nodeboxgl/ext/psyco/src/c/Objects/pstringobject.h new file mode 100644 index 0000000..f2db690 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pstringobject.h @@ -0,0 +1,69 @@ + /***************************************************************/ +/*** Psyco equivalent of stringobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_STRINGOBJECT_H +#define _PSY_STRINGOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + +#define USE_CATSTR 0 /*trying to use only bufstring virtual strings instead*/ +#define USE_BUFSTR 1 + + +/* various ways to access the actual character data */ +#define STR_sval UNSIGNED_ARRAY(char, offsetof(PyStringObject, ob_sval)) +#define STR_sval2 UNSIGNED_ARRAY(short, offsetof(PyStringObject, ob_sval)) +#define STR_sval4 UNSIGNED_ARRAY(long, offsetof(PyStringObject, ob_sval)) + + +/* all flavors of virtual strings */ +#define VIRTUALSTR_FIRST FIELDS_TOTAL(FIX_size) + +/* virtual one-character strings */ +#define CHARACTER_CHAR VIRTUALSTR_FIRST +#define CHARACTER_TOTAL (CHARACTER_CHAR+1) + +/* virtual string slices */ +#define STRSLICE_SOURCE VIRTUALSTR_FIRST +#define STRSLICE_START (STRSLICE_SOURCE+1) +#define STRSLICE_TOTAL (STRSLICE_START+1) + +#if USE_CATSTR +/* virtual string concatenations */ +#define CATSTR_LIST VIRTUALSTR_FIRST +#define CATSTR_TOTAL (CATSTR_LIST+1) +#endif + +#if USE_BUFSTR +/* virtual overallocated-buffer concatenations */ +#define BUFSTR_BUFOBJ VIRTUALSTR_FIRST +#define BUFSTR_TOTAL (BUFSTR_BUFOBJ+1) +#endif + + +#define PsycoString_Check(tp) PyType_TypeCheck(tp, &PyString_Type) +#ifdef Py_USING_UNICODE +# define PsycoUnicode_Check(tp) PyType_TypeCheck(tp, &PyUnicode_Type) +#else +# define PsycoUnicode_Check(tp) 0 +#endif + + +PSY_INLINE vinfo_t* PsycoString_AS_STRING(PsycoObject* po, vinfo_t* v) +{ /* no type check */ + return integer_add_i(po, v, offsetof(PyStringObject, ob_sval), false); +} +PSY_INLINE vinfo_t* PsycoString_GET_SIZE(PsycoObject* po, vinfo_t* v) +{ /* no type check */ + return psyco_get_const(po, v, FIX_size); +} + + +EXTERNFN vinfo_t* PsycoCharacter_New(vinfo_t* chrval); +EXTERNFN bool PsycoCharacter_Ord(PsycoObject* po, vinfo_t* v, vinfo_t** vord); + + +#endif /* _PSY_STRINGOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pstructmember.c b/nodeboxgl/ext/psyco/src/c/Objects/pstructmember.c new file mode 100644 index 0000000..1f70b24 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pstructmember.c @@ -0,0 +1,166 @@ +#include "pstructmember.h" +#include "pstringobject.h" +#include "pintobject.h" +#include "pfloatobject.h" +#include "../pycodegen.h" + + +DEFINEFN +vinfo_t* PsycoMember_GetOne(PsycoObject* po, vinfo_t* addr, PyMemberDef* l) +{ + condition_code_t cc; + vinfo_t* v; + vinfo_t* w1; + vinfo_t* w2; + defield_t rdf; + if (l->flags & READ_RESTRICTED) + goto fallback; + + /* XXX add (some of) the missing types */ + switch (l->type) { + case T_BYTE: /* read a byte, extend it signed */ + rdf = FMUT(DEF_ARRAY(signed char, 0)); + break; + case T_UBYTE: /* read a byte, extend it unsigned */ + rdf = FMUT(UNSIGNED_ARRAY(unsigned char, 0)); + break; + case T_SHORT: /* read a short, extend it signed */ + rdf = FMUT(DEF_ARRAY(signed short, 0)); + break; + case T_USHORT: /* read a short, extend it unsigned */ + rdf = FMUT(UNSIGNED_ARRAY(unsigned short, 0)); + break; + case T_INT: + case T_UINT: + case T_LONG: + case T_ULONG: /* read a long */ + /* XXX assumes sizeof(int) == sizeof(long) */ + rdf = FMUT(DEF_ARRAY(long, 0)); + break; +#if HAVE_FP_FN_CALLS + case T_FLOAT: /* read a long, turn it into a float */ + rdf = FMUT(DEF_ARRAY(float, 0)); + w1 = psyco_get_field_offset(po, addr, rdf, l->offset); + if (w1 == NULL) + return NULL; + v = PsycoFloat_FromFloat(po, w1); + vinfo_decref(w1, po); + return v; + case T_DOUBLE: /* read two longs, turn them into a double */ + rdf = FMUT(DEF_ARRAY(double, 0)); + w1 = psyco_get_field_offset(po, addr, rdf, l->offset); + if (w1 == NULL) + return NULL; + w2 = psyco_get_field_offset(po, addr, FIELD_PART2(rdf), + l->offset); + if (w2 == NULL) { + vinfo_decref(w1, po); + return NULL; + } + v = PsycoFloat_FROM_DOUBLE(w1, w2); + return v; +#endif + case T_STRING: /* read a char*, turn it into a string */ + rdf = FMUT(DEF_ARRAY(char*, 0)); + w1 = psyco_get_field_offset(po, addr, rdf, l->offset); + if (w1 == NULL) + return NULL; + cc = integer_non_null(po, w1); + if (cc == CC_ERROR) { + vinfo_decref(w1, po); + return NULL; + } + + if (runtime_condition_t(po, cc)) { + /* the char* is not NULL */ + v = psyco_generic_call(po, PyString_FromString, + CfReturnRef|CfPyErrIfNull, + "v", w1); + if (v != NULL) + Psyco_AssertType(po, v, &PyString_Type); + } + else { + v = psyco_vi_None(); + } + vinfo_decref(w1, po); + return v; + case T_STRING_INPLACE: /* read an array of characters from the struct */ + w1 = integer_add_i(po, addr, l->offset, false); + if (w1 == NULL) + return NULL; + v = psyco_generic_call(po, PyString_FromString, + CfReturnRef|CfPyErrIfNull, + "v", w1); + if (v != NULL) + Psyco_AssertType(po, v, &PyString_Type); + vinfo_decref(w1, po); + return v; + case T_CHAR: /* read a byte, turn it into a char */ + rdf = FMUT(UNSIGNED_ARRAY(unsigned char, 0)); + w1 = psyco_get_field_offset(po, addr, rdf, l->offset); + if (w1 == NULL) + return NULL; + v = PsycoCharacter_New(w1); + vinfo_decref(w1, po); + return v; + case T_OBJECT: /* read a long, turn it into a PyObject with reference */ + rdf = FMUT(DEF_ARRAY(PyObject*, 0)); + v = psyco_get_field_offset(po, addr, rdf, l->offset); + if (v == NULL) + return NULL; + cc = integer_non_null(po, v); + if (cc == CC_ERROR) { + vinfo_decref(v, po); + return NULL; + } + + if (runtime_condition_t(po, cc)) { + /* 'v' contains a non-NULL value */ + need_reference(po, v); + } + else { + /* 'v' contains NULL */ + vinfo_decref(v, po); + v = psyco_vi_None(); + } + return v; +#ifdef T_OBJECT_EX + case T_OBJECT_EX: /* same as T_OBJECT, exception if NULL */ + rdf = FMUT(DEF_ARRAY(PyObject*, 0)); + v = psyco_get_field_offset(po, addr, rdf, l->offset); + if (v == NULL) + return NULL; + cc = integer_non_null(po, v); + if (cc == CC_ERROR) { + vinfo_decref(v, po); + return NULL; + } + + if (runtime_condition_t(po, cc)) { + /* 'v' contains a non-NULL value */ + need_reference(po, v); + } + else { + /* 'v' contains NULL */ + vinfo_decref(v, po); + PycException_SetString(po, PyExc_AttributeError, + l->name); + return NULL; + } + return v; +#endif + default: + goto fallback; + } + + /* for integer fields of any size */ + v = psyco_get_field_offset(po, addr, rdf, l->offset); + if (v != NULL) + v = PsycoInt_FROM_LONG(v); + return v; + + fallback: + /* call the Python implementation for cases we cannot handle directy */ + return psyco_generic_call(po, PyMember_GetOne, + CfReturnRef|CfPyErrIfNull, "vl", addr, l); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/pstructmember.h b/nodeboxgl/ext/psyco/src/c/Objects/pstructmember.h new file mode 100644 index 0000000..86232a0 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/pstructmember.h @@ -0,0 +1,16 @@ + /***************************************************************/ +/*** Psyco equivalent of structmember.h ***/ + /***************************************************************/ + +#ifndef _PSY_STRUCTMEMBER_H +#define _PSY_STRUCTMEMBER_H + +#include "../Python/pycompiler.h" +#include "pobject.h" + + +EXTERNFN +vinfo_t* PsycoMember_GetOne(PsycoObject* po, vinfo_t* addr, PyMemberDef* l); + + +#endif /* _PSY_STRUCTMEMBER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.c b/nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.c new file mode 100644 index 0000000..a147824 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.c @@ -0,0 +1,263 @@ +#include "ptupleobject.h" + + + /***************************************************************/ + /*** Virtual tuples ***/ + +static source_virtual_t psyco_computed_tuple; + +#if ALL_CHECKS +static void check_ituple(vinfo_t* v) +{ + int tuple_end = v->array->count; + int l1 = CompileTime_Get(v->array->items[iFIX_SIZE]->source)->value; + psyco_assert(tuple_end == iTUPLE_OB_ITEM + l1); +} +#else +# define check_ituple(v) ; +#endif + +static bool compute_tuple(PsycoObject* po, vinfo_t* v) +{ + int i, tuple_end; + check_ituple(v); + tuple_end = v->array->count; + + /* check whether all tuple objects are constant */ + for (i=iTUPLE_OB_ITEM; iarray->items[i]; + if (!is_compiletime(vi->source)) + break; /* no */ + } + if (i == tuple_end) { + /* yes -- let's build a constant compile-time tuple */ + source_known_t* sk; + PyObject* constant = PyTuple_New(tuple_end - iTUPLE_OB_ITEM); + if (constant == NULL) + OUT_OF_MEMORY(); + for (i=iTUPLE_OB_ITEM; iarray->items[i]->source); + obj = (PyObject*) sk->value; + Py_INCREF(obj); + PyTuple_SET_ITEM(constant, i-iTUPLE_OB_ITEM, obj); + } + + /* move the resulting non-virtual Python object back into 'v' */ + sk = sk_new((long) constant, SkFlagPyObj); + v->source = CompileTime_NewSk(sk); + } + else { + /* no -- code a call to PyTuple_New() */ + int tuple_len = tuple_end - iTUPLE_OB_ITEM; + vinfo_t* tuple = psyco_generic_call(po, PyTuple_New, + CfReturnRef|CfPyErrIfNull, + "l", tuple_len); + if (tuple == NULL) + return false; + + /* write the storing of the objects in the tuple */ + for (i=0; iarray->count; + + result = PyTuple_New(tuple_end - iTUPLE_OB_ITEM); + if (result == NULL) + return NULL; + + for (i=iTUPLE_OB_ITEM; iarray->items[i], data); + if (obj == NULL) { + Py_DECREF(result); + return NULL; + } + PyTuple_SET_ITEM(result, i-iTUPLE_OB_ITEM, obj); + } + return result; +} + +DEFINEFN +vinfo_t* PsycoTuple_New(int count, vinfo_t** source) +{ + int i; + vinfo_t* r = vinfo_new(VirtualTime_New(&psyco_computed_tuple)); + r->array = array_new(iTUPLE_OB_ITEM + count); + r->array->items[iOB_TYPE] = + vinfo_new(CompileTime_New((long)(&PyTuple_Type))); + r->array->items[iFIX_SIZE] = vinfo_new(CompileTime_New(count)); + if (source != NULL) + for (i=0; isource == VirtualTime_New(&psyco_computed_tuple)) + size = tuple->array->count - iTUPLE_OB_ITEM; + else if (is_compiletime(tuple->source)) { + /* a constant tuple means constant tuple items */ + int i; + PyObject* o = (PyObject*)(CompileTime_Get(tuple->source)->value); + extra_assert(PyTuple_Check(o)); + size = PyTuple_GET_SIZE(o); + if (tuple->array->count < iTUPLE_OB_ITEM + size) { + if (/*not_too_much &&*/ size > CT_TUPLE_LOAD_SIZE_LIMIT) + return -1; + vinfo_array_grow(tuple, iTUPLE_OB_ITEM + size); + } + /* load the tuple into the vinfo_array_t */ + for (i=0; isq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", v1, v2); + default: + return NULL; + } + + /* XXX a "virtual tuple concatenation" would be cool */ + len1 = PsycoTuple_Load(v1); /* -1 if unknown */ + if (len1 == 0) { + vinfo_incref(v2); + return v2; + } + len2 = PsycoTuple_Load(v2); /* -1 if unknown */ + if (len2 == 0) { + vinfo_incref(v1); + return v1; + } + + if (len1 == -1 || len2 == -1) { + /* cannot do it now. Fall back. */ + result = psyco_generic_call(po, + PyTuple_Type.tp_as_sequence->sq_concat, + CfReturnRef|CfPyErrIfNull, + "vv", v1, v2); + if (result == NULL) + return NULL; + + /* the result is a tuple */ + Psyco_AssertType(po, result, &PyTuple_Type); + } + else { + int i; + result = PsycoTuple_New(len1+len2, NULL); + for (i=0; isq_length, psyco_generic_immut_ob_size); + Psyco_DefineMeta(m->sq_item, ptuple_item); + Psyco_DefineMeta(m->sq_concat, PsycoTuple_Concat); + + mm = PyString_Type.tp_as_mapping; + if (mm) { /* Python >= 2.3 */ + Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); + } + + INIT_SVIRTUAL(psyco_computed_tuple, compute_tuple, + direct_compute_tuple, + (-1 << iTUPLE_OB_ITEM), /* sign bit of bitfield will + be extended indefinitely */ + NW_TUPLES_NORMAL, NW_TUPLES_FUNCALL); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.h b/nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.h new file mode 100644 index 0000000..de8c149 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/ptupleobject.h @@ -0,0 +1,40 @@ + /***************************************************************/ +/*** Psyco equivalent of tupleobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_TUPLEOBJECT_H +#define _PSY_TUPLEOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +#define TUPLE_ob_item FARRAY(DEF_FIELD(PyTupleObject, PyObject*, ob_item, \ + FIX_size)) +#define iTUPLE_OB_ITEM FIELD_INDEX(TUPLE_ob_item) + +/* The following macro reads an item from a Psyco tuple without any + checks. Be sure the item has already been loaded in the array of + the vinfo_t. This should only be used after a successful call to + PsycoTuple_Load(). */ +#define PsycoTuple_GET_ITEM(vtuple, index) \ + ((vtuple)->array->items[iTUPLE_OB_ITEM + (index)]) + + +/***************************************************************/ +/* virtual tuples. + If 'source' is not NULL it gives the content of the tuple. + If 'source' is NULL you have to initialize it yourself. */ +EXTERNFN vinfo_t* PsycoTuple_New(int count, vinfo_t** source); + +/* get the (possibly virtual) array of items in the tuple, + returning the length of the tuple or -1 if it fails (items not known). + The items are then found in PsycoTuple_GET_ITEM(tuple, i). + Never sets a PycException. */ +EXTERNFN int PsycoTuple_Load(vinfo_t* tuple); + +EXTERNFN vinfo_t* PsycoTuple_Concat(PsycoObject* po, vinfo_t* v1, vinfo_t* v2); + + +#endif /* _PSY_TUPLEOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.c b/nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.c new file mode 100644 index 0000000..3c34b6d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.c @@ -0,0 +1,355 @@ +#include "ptypeobject.h" +#include "ptupleobject.h" +#include "pfuncobject.h" + + +static ternaryfunc type_call; +static initproc object_init; +static newfunc object_new; +static initproc slot_tp_init = NULL; + +/***************************************************************/ + /*** type objects meta-implementation ***/ + +static int cimpl_call_tp_init(PyTypeObject* type, PyObject* obj, + PyObject* args, PyObject* kwds) +{ + /* If the returned object is not an instance of type, + it won't be initialized. (Python 2.3 behavior) */ + if (!PyType_IsSubtype(obj->ob_type, type)) + return 0; + type = obj->ob_type; + if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS) && + type->tp_init != NULL) + return type->tp_init(obj, args, kwds); + return 0; +} + +static vinfo_t* ptype_call(PsycoObject* po, vinfo_t* vtype, + vinfo_t* varg, vinfo_t* vkw) +{ + vinfo_t* vobj; + PyTypeObject* type; + PyTypeObject* otype; + type = (PyTypeObject*) psyco_pyobj_atcompiletime(po, vtype); + if (type == NULL) + return NULL; + if (type->tp_new == NULL) + goto fallback; + + /* Ugly exception: if the call is type(o), + just return the type of 'o'. */ + if (type == &PyType_Type) { + int nb_args; + if (!psyco_knowntobe(vkw, (long) NULL)) + goto fallback; + nb_args = PsycoTuple_Load(varg); + if (nb_args == 1) { + vinfo_t* v = PsycoTuple_GET_ITEM(varg, 0); + return psyco_get_field(po, v, OB_type); + } + if (nb_args < 0) + goto fallback; + } + + vobj = Psyco_META3(po, type->tp_new, + CfReturnRef|CfPyErrIfNull, "lvv", + type, varg, vkw); + if (vobj == NULL) + return NULL; + + otype = Psyco_KnownType(vobj); + if (otype == NULL) { + /* unknown return type, cannot promote it to compile-time + now because 'vobj' is not yet stored in 'po->vlocals'. + XXX check again why this wouldn't work */ + if (!psyco_generic_call(po, cimpl_call_tp_init, + CfNoReturnValue|CfPyErrIfNeg, + "vvvv", vtype, vobj, varg, vkw)) + goto error; + return vobj; + } + + /* If the returned object is not an instance of type, + it won't be initialized. (Python 2.3 behavior) */ + if (PyType_IsSubtype(otype, type) && + PyType_HasFeature(otype, Py_TPFLAGS_HAVE_CLASS) && + otype->tp_init != NULL) { + if (!Psyco_META3(po, otype->tp_init, + CfNoReturnValue|CfPyErrIfNeg, + "vvv", vobj, varg, vkw)) + goto error; + } + return vobj; + + error: + vinfo_decref(vobj, po); + return NULL; + + fallback: + return psyco_generic_call(po, type_call, + CfReturnRef|CfPyErrIfNull, + "vvv", vtype, varg, vkw); +} + +static int cimpl_check_noarg(PyObject* args, PyObject* kwds) +{ + if ((PyTuple_GET_SIZE(args) || + (kwds && PyDict_Check(kwds) && PyDict_Size(kwds)))) { + PyErr_SetString(PyExc_TypeError, + "default __new__ takes no parameters"); + return -1; + } + return 0; +} + +DEFINEFN +vinfo_t* psyco_pobject_new(PsycoObject* po, PyTypeObject* type, + vinfo_t* varg, vinfo_t* vkw) +{ + if (type->tp_init == object_init) { + /* same rule as in object_new(): check that no argument + is passed if type->tp_init == object_init */ + int safe = (psyco_knowntobe(vkw, (long) NULL) && + PsycoTuple_Load(varg) == 0); + if (!safe && !psyco_generic_call(po, cimpl_check_noarg, + CfNoReturnValue|CfPyErrIfNeg, + "vv", varg, vkw)) + return NULL; + } + return Psyco_META2(po, type->tp_alloc, + CfReturnRef|CfPyErrIfNull, "ll", + type, 0); +} + +static vinfo_t* ptype_genericnew(PsycoObject* po, PyTypeObject* type, + vinfo_t* varg, vinfo_t* vkw) +{ + return Psyco_META2(po, type->tp_alloc, + CfReturnRef|CfPyErrIfNull, "ll", + type, 0); +} + +static bool pobject_init(PsycoObject* po, vinfo_t* vself, + vinfo_t* vargs, vinfo_t* vkwds) +{ + return true; +} + +#define INLINE_GENERIC_ALLOC (PY_VERSION_HEX >= 0x02030000) /* 2.3 */ + +#if INLINE_GENERIC_ALLOC +static PyObject* cimpl_alloc_gc_heap(PyTypeObject* type) +{ + size_t size = type->tp_basicsize; + PyObject* obj = _PyObject_GC_Malloc(size); + if (obj == NULL) + return PyErr_NoMemory(); + memset(obj, '\0', size); + Py_INCREF(type); + PyObject_INIT(obj, type); + PyObject_GC_Track(obj); + return obj; +} + +static PyObject* cimpl_alloc_gc_nonheap(PyTypeObject* type) +{ + size_t size = type->tp_basicsize; + PyObject* obj = _PyObject_GC_Malloc(size); + if (obj == NULL) + return PyErr_NoMemory(); + memset(obj, '\0', size); + PyObject_INIT(obj, type); + PyObject_GC_Track(obj); + return obj; +} + +static PyObject* cimpl_alloc_nongc_heap(PyTypeObject* type) +{ + size_t size = type->tp_basicsize; + PyObject* obj = PyObject_MALLOC(size); + if (obj == NULL) + return PyErr_NoMemory(); + memset(obj, '\0', size); + Py_INCREF(type); + PyObject_INIT(obj, type); + return obj; +} + +static PyObject* cimpl_alloc_nongc_nonheap(PyTypeObject* type) +{ + size_t size = type->tp_basicsize; + PyObject* obj = PyObject_MALLOC(size); + if (obj == NULL) + return PyErr_NoMemory(); + memset(obj, '\0', size); + PyObject_INIT(obj, type); + return obj; +} +#endif /* INLINE_GENERIC_ALLOC */ + +static vinfo_t* ptype_genericalloc(PsycoObject* po, PyTypeObject* type, + int nitems) +{ + vinfo_t* v_result; +#if INLINE_GENERIC_ALLOC + if (type->tp_itemsize != 0) { +#endif + /* fallback */ + v_result = psyco_generic_call(po, PyType_GenericAlloc, + CfReturnRef|CfPyErrIfNull, + "ll", type, nitems); +#if INLINE_GENERIC_ALLOC + } + else { + void* cimpl; + if (PyType_IS_GC(type)) { + if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) + cimpl = cimpl_alloc_gc_heap; + else + cimpl = cimpl_alloc_gc_nonheap; + } + else { + if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) + cimpl = cimpl_alloc_nongc_heap; + else + cimpl = cimpl_alloc_nongc_nonheap; + } + v_result = psyco_generic_call(po, cimpl, + CfReturnRef|CfPyErrIfNull, + "l", type); + } +#endif + if (v_result != NULL) { + Psyco_AssertType(po, v_result, type); + } + return v_result; +} + +/* call a special method in a "safe" way: with inlining turned off and + without promotion. See test5.class_creation_2() for why this is needed. */ +static vinfo_t* soft_method_call(PsycoObject* po, + PyTypeObject* tp, vinfo_t* vself, + char* attrstr, PyObject** attrobj, + vinfo_t* vargs, vinfo_t* vkwds) +{ + PyObject* descr; + vinfo_t* v_res; + vinfo_t* newarg; + int i, argcount; + + if (*attrobj == NULL) { + *attrobj = PyString_InternFromString(attrstr); + if (*attrobj == NULL) { + psyco_virtualize_exception(po); + return NULL; + } + } + + /* XXX this is broken because the type might have been modified + XXX since the last time we were here! */ + descr = _PyType_Lookup(tp, *attrobj); + if (descr == NULL || !PyFunction_Check(descr)) + return NULL; /* fallback */ + + argcount = PsycoTuple_Load(vargs); + if (argcount < 0) + return NULL; /* fallback */ + if (!psyco_knowntobe(vkwds, (long) NULL)) + return NULL; /* fallback */ + + newarg = PsycoTuple_New(argcount+1, NULL); + vinfo_incref(vself); + PsycoTuple_GET_ITEM(newarg, 0) = vself; + for (i = 0; i < argcount; i++) { + vinfo_t* v = PsycoTuple_GET_ITEM(vargs, i); + vinfo_incref(v); + PsycoTuple_GET_ITEM(newarg, i+1) = v; + } + Py_INCREF(descr); + v_res = pfunction_simple_call(po, descr, newarg, false); + vinfo_decref(newarg, po); + return v_res; +} + +static bool pslot_tp_init(PsycoObject* po, vinfo_t* vself, + vinfo_t* vargs, vinfo_t* vkwds) +{ + static PyObject *init_str; + vinfo_t* v_res; + bool ok; + PyTypeObject* type = Psyco_KnownType(vself); + if (type == NULL) { + /* unknown type, cannot promote it to compile-time + now because 'vself' is not yet stored in 'po->vlocals'. */ + goto fallback; + } + v_res = soft_method_call(po, type, vself, "__init__", &init_str, + vargs, vkwds); + if (v_res == NULL) { + if (PycException_Occurred(po)) + return false; + else + goto fallback; + } + +#if PY_VERSION_HEX >= 0x02050000 /* 2.5 */ + { + /* check that __init__ returned None */ + condition_code_t cc; + cc = integer_cmp_i(po, v_res, (long) Py_None, Py_EQ); + if (cc == CC_ERROR) { + vinfo_decref(v_res, po); + return false; + } + ok = runtime_condition_t(po, cc); + vinfo_decref(v_res, po); + if (!ok) { + PycException_SetString(po, PyExc_TypeError, + "__init__() should return None"); + } + } +#else + vinfo_decref(v_res, po); /* ignore return value */ + ok = true; +#endif + return ok; + + fallback: + return psyco_generic_call(po, slot_tp_init, + CfNoReturnValue|CfPyErrIfNeg, + "vvv", vself, vargs, vkwds) != NULL; +} + + +INITIALIZATIONFN +void psy_typeobject_init(void) +{ + PyObject* d; + PyObject* tmp; + + type_call = PyType_Type.tp_call; + object_new = PyBaseObject_Type.tp_new; + object_init = PyBaseObject_Type.tp_init; + Psyco_DefineMeta(type_call, ptype_call); + Psyco_DefineMeta(object_new, psyco_pobject_new); + Psyco_DefineMeta(object_init, pobject_init); + Psyco_DefineMeta(PyType_GenericNew, ptype_genericnew); + Psyco_DefineMeta(PyType_GenericAlloc, ptype_genericalloc); + + /* Any better way to get pointers to the slot_tp_* functions? */ + if (PyErr_Occurred()) + return; + d = PyDict_New(); + if (d != NULL) { + char* expr = "type('X', (object,), {'__init__': lambda self: None})"; + tmp = PyRun_String(expr, Py_eval_input, PyEval_GetBuiltins(), d); + if (tmp && PyType_Check(tmp)) { + slot_tp_init = ((PyTypeObject*) tmp)->tp_init; + Psyco_DefineMeta(slot_tp_init, pslot_tp_init); + } + Py_XDECREF(tmp); + Py_DECREF(d); + } + PyErr_Clear(); +} diff --git a/nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.h b/nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.h new file mode 100644 index 0000000..4ed3f30 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Objects/ptypeobject.h @@ -0,0 +1,17 @@ + /***************************************************************/ +/*** Psyco equivalent of typeobject.h ***/ + /***************************************************************/ + +#ifndef _PSY_TYPEOBJECT_H +#define _PSY_TYPEOBJECT_H + + +#include "pobject.h" +#include "pabstract.h" + + +EXTERNFN vinfo_t* psyco_pobject_new(PsycoObject* po, PyTypeObject* type, + vinfo_t* varg, vinfo_t* vkw); + + +#endif /* _PSY_TYPEOBJECT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Python/frames.c b/nodeboxgl/ext/psyco/src/c/Python/frames.c new file mode 100644 index 0000000..21eaa7f --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/frames.c @@ -0,0 +1,736 @@ +#include "frames.h" +#include "pyver.h" +#include "../codemanager.h" +#include "../stats.h" +#include "../vcompiler.h" +#include "../Objects/pobject.h" + +#include + + + /***************************************************************/ + +/* turn a running frame into its Psyco equivalent, a PsycoObject. + Return Py_None if the frame cannot be turned into a PsycoObject. + Never sets an exception. */ +PSY_INLINE PyObject* PsycoObject_FromFrame(PyFrameObject* f, int recursion) +{ + int i, extras, module; + vinfo_t* v; + PsycoObject* po; + RunTimeSource rsrc; + source_known_t* sk; + PyCodeObject* co = f->f_code; + PyObject* merge_points; + + if (f->f_stacktop == NULL) { + /* cannot patch a frame other than the top (running) one */ + goto fail; + } + module = f->f_globals == f->f_locals; + merge_points = PyCodeStats_MergePoints(PyCodeStats_Get(co), module); + if (merge_points == Py_None) { + /* unsupported bytecode instructions */ + goto fail; + } + if (psyco_mp_flags(merge_points) & MP_FLAGS_HAS_FINALLY) { + /* incompatible handling of 'finally' blocks */ + goto fail; + } + + /* the local variables are assumed to be stored as 'fast' variables, + not in the f_locals dictionary. This is currently asserted by + the fact that LOAD_NAME and STORE_NAME opcodes are not supported + at all. XXX support LOAD_NAME / STORE_NAME / DELETE_NAME */ + extras = (f->f_valuestack - f->f_localsplus) + co->co_stacksize; + + po = PsycoObject_New(INDEX_LOC_LOCALS_PLUS + extras); + po->stack_depth = INITIAL_STACK_DEPTH; + po->vlocals.count = INDEX_LOC_LOCALS_PLUS + extras; + INIT_PROCESSOR_PSYCOOBJECT(po); + po->pr.auto_recursion = AUTO_RECURSION(recursion); + + /* initialize po->vlocals */ + Py_INCREF(f->f_globals); + sk = sk_new((long) f->f_globals, SkFlagPyObj); + LOC_GLOBALS = vinfo_new(CompileTime_NewSk(sk)); + + /* move the current arguments, locals, and object stack into + their target place */ + for (i = f->f_stacktop - f->f_localsplus; i--; ) { + PyObject* o = f->f_localsplus[i]; + po->stack_depth += sizeof(long); + if (o == NULL) { + /* uninitialized local variable, + the corresponding stack position is not used */ + v = psyco_vi_Zero(); + } + else { + /* XXX do something more intelligent for cell and + free vars */ + /* arguments get borrowed references */ + rsrc = RunTime_NewStack(po->stack_depth, false, false); + v = vinfo_new(rsrc); + } + LOC_LOCALS_PLUS[i] = v; + } + /* the rest of the stack in LOC_LOCALS_PLUS is + initialized to NULL by PsycoObject_New() */ + + /* store the code object */ + po->pr.co = co; + Py_INCREF(co); /* XXX never freed */ + po->pr.next_instr = f->f_lasti; + pyc_data_build(po, merge_points); + if (f->f_iblock) { + po->pr.iblock = f->f_iblock; + memcpy(po->pr.blockstack, f->f_blockstack, + sizeof(PyTryBlock)*po->pr.iblock); + } + + /* set up the CALL return address */ + po->stack_depth += sizeof(long); + rsrc = RunTime_NewStack(po->stack_depth, false, false); + LOC_CONTINUATION = vinfo_new(rsrc); + psyco_assert_coherent(po); + return (PyObject*) po; + + fail: + Py_INCREF(Py_None); + return Py_None; +} + +/* same as PsycoObject_FromFrame() on any not-yet-started frame with the + given code object */ +PSY_INLINE PyObject* PsycoObject_FromCode(PyCodeObject* co, + PyObject* globals, + int recursion, + int module) +{ + int i, argc, ncells, nfrees, extras; + PyObject* merge_points; + PsycoObject* po; + Source rsrc; + source_known_t* sk; + vinfo_t* v; + + merge_points = PyCodeStats_MergePoints(PyCodeStats_Get(co), module); + if (merge_points == Py_None) { + /* unsupported bytecode instructions */ + goto fail; + } + + ncells = PyTuple_GET_SIZE(co->co_cellvars); + nfrees = PyTuple_GET_SIZE(co->co_freevars); + extras = co->co_stacksize + co->co_nlocals + ncells + nfrees; + + po = PsycoObject_New(INDEX_LOC_LOCALS_PLUS + extras); + po->stack_depth = INITIAL_STACK_DEPTH; + po->vlocals.count = INDEX_LOC_LOCALS_PLUS + extras; + INIT_PROCESSOR_PSYCOOBJECT(po); + po->pr.auto_recursion = AUTO_RECURSION(recursion); + + /* initialize po->vlocals */ + Py_INCREF(globals); + sk = sk_new((long) globals, SkFlagPyObj); + LOC_GLOBALS = vinfo_new(CompileTime_NewSk(sk)); + + argc = co->co_argcount; + if (co->co_flags & CO_VARARGS) + argc++; + if (co->co_flags & CO_VARKEYWORDS) + argc++; + + /* initialize the free and cell vars */ + i = co->co_nlocals + ncells + nfrees; + if (ncells || nfrees) { + while (i > co->co_nlocals) { + po->stack_depth += sizeof(long); + /* borrowed references from the frame object */ + rsrc = RunTime_NewStack(po->stack_depth, false, false); + v = vinfo_new(rsrc); + LOC_LOCALS_PLUS[--i] = v; + } + /* skip the unbound local variables */ + po->stack_depth += sizeof(long) * (i-argc); + } + /* initialize the local variables to zero (unbound) */ + while (i > argc) { + v = psyco_vi_Zero(); + LOC_LOCALS_PLUS[--i] = v; + } + /* initialize the keyword arguments dict */ + if (co->co_flags & CO_VARKEYWORDS) { + po->stack_depth += sizeof(long); + rsrc = RunTime_NewStack(po->stack_depth, false, false); + v = vinfo_new(rsrc); + /* known to be a dict */ + /*Psyco_AssertType(NULL, v, &PyDict_Type);*/ + rsrc = CompileTime_New((long) &PyDict_Type); + v->array = array_new(FIELDS_TOTAL(OB_type)); + v->array->items[iOB_TYPE] = vinfo_new(rsrc); + LOC_LOCALS_PLUS[--i] = v; + } + /* initialize the extra arguments tuple */ + if (co->co_flags & CO_VARARGS) { + po->stack_depth += sizeof(long); + rsrc = RunTime_NewStack(po->stack_depth, false, false); + v = vinfo_new(rsrc); + /* known to be a tuple */ + rsrc = CompileTime_New((long) &PyTuple_Type); + v->array = array_new(iOB_TYPE+1); + v->array->items[iOB_TYPE] = vinfo_new(rsrc); + LOC_LOCALS_PLUS[--i] = v; + } + /* initialize the regular arguments */ + while (i > 0) { + /* XXX do something more intelligent for cell and + free vars */ + po->stack_depth += sizeof(long); + /* arguments get borrowed references */ + rsrc = RunTime_NewStack(po->stack_depth, false, false); + v = vinfo_new(rsrc); + LOC_LOCALS_PLUS[--i] = v; + } + /* the rest of the stack in LOC_LOCALS_PLUS is + initialized to NULL by PsycoObject_New() */ + + /* store the code object */ + po->pr.co = co; + Py_INCREF(co); /* XXX never freed */ + pyc_data_build(po, merge_points); + + /* set up the CALL return address */ + po->stack_depth += sizeof(long); + rsrc = RunTime_NewStack(po->stack_depth, false, false); + LOC_CONTINUATION = vinfo_new(rsrc); + return (PyObject*) po; + + fail: + Py_INCREF(Py_None); + return Py_None; +} + +DEFINEFN +PyObject* PsycoCode_CompileCode(PyCodeObject* co, + PyObject* globals, + int recursion, + int module) +{ + mergepoint_t* mp; + PsycoObject* po; + PyObject* o = PsycoObject_FromCode(co, globals, recursion, module); + if (o == Py_None) + return o; + + /* compile the function */ + po = (PsycoObject*) o; + mp = PsycoObject_Ready(po); + return (PyObject*) psyco_compile_code(po, mp); +} + +DEFINEFN +PyObject* PsycoCode_CompileFrame(PyFrameObject* f, int recursion) +{ + mergepoint_t* mp; + PsycoObject* po; + PyObject* o = PsycoObject_FromFrame(f, recursion); + if (o == Py_None) + return o; + + /* compile the function */ + po = (PsycoObject*) o; + mp = psyco_exact_merge_point(po->pr.merge_points, po->pr.next_instr); + if (mp != NULL) + psyco_delete_unused_vars(po, &mp->entries); + return (PyObject*) psyco_compile_code(po, mp); +} + +DEFINEFN +bool PsycoCode_Run(PyObject* codebuf, PyFrameObject* f, bool entering) +{ + PyObject* tdict; + PyFrameRuntime* fruntime; + stack_frame_info_t** finfo; + int err; + long* initial_stack; + PyObject* result; + PyCodeObject* co = f->f_code; + + extra_assert(codebuf != NULL); + extra_assert(CodeBuffer_Check(codebuf)); + + /* over the current Python frame, a lightweight chained list of + Psyco frames will be built. Mark the current Python frame as + the starting point of this chained list. */ + tdict = psyco_thread_dict(); + if (tdict==NULL) return false; + fruntime = PyCStruct_NEW(PyFrameRuntime, PyFrameRuntime_dealloc); + Py_INCREF(f); + fruntime->cs_key = (PyObject*) f; + fruntime->psy_frames_start = &finfo; + fruntime->psy_code = co; + fruntime->psy_globals = f->f_globals; + extra_assert(PyDict_GetItem(tdict, (PyObject*) f) == NULL); + err = PyDict_SetItem(tdict, (PyObject*) f, (PyObject*) fruntime); + Py_DECREF(fruntime); + if (err) return false; + /* Warning, no 'return' between this point and the PyDict_DelItem() + below */ + + /* get the actual arguments */ + initial_stack = (long*) f->f_localsplus; + + /* run! */ + Py_INCREF(codebuf); + result = psyco_processor_run((CodeBufferObject*) codebuf, + initial_stack, &finfo, tdict); + Py_DECREF(codebuf); + psyco_trash_object(NULL); /* free any trashed object now */ + +#if CODE_DUMP >= 2 + psyco_dump_code_buffers(); +#endif + if (PyDict_DelItem(tdict, (PyObject*) f)) { + Py_XDECREF(result); + result = NULL; + } + if (result == NULL) { + PyObject *exc, *value, *tb; + if (entering) { + /* Nothing special to worry in this case, + eval_frame() will return right away */ + extra_assert(PyErr_Occurred()); /* exception */ + return false; + } + + /* Attention: the maybe_call_line_trace() call of ceval.c:822 + (Python 2.3b1) will *not* reload f->f_lasti and + f->f_stacktop if these get modified in case of exception! + We definitely cannot modify the stack top. We *must* + however empty the block stack to prevent exception + handlers to be entered --- they have already been run by + Psyco! */ + PyErr_Fetch(&exc, &value, &tb); + extra_assert(exc != NULL); /* exception */ + f->f_iblock = 0; + + /* We cannot prevent Python from calling PyTraceBack_Here() + when this function returns, althought Psyco has already + recorded a traceback. We remove Psyco's traceback and + make sure Python will re-insert an equivalent one. */ + if (tb != NULL) { /* should normally never be NULL */ + /* no C interface to tb_lasti; call it via Python */ + PyObject *tb_next, *tb_lasti; + tb_lasti = PyObject_GetAttrString(tb, "tb_lasti"); + extra_assert(tb_lasti != NULL); + extra_assert(PyInt_Check(tb_lasti)); + f->f_lasti = PyInt_AS_LONG(tb_lasti); + Py_DECREF(tb_lasti); + + tb_next = PyObject_GetAttrString(tb, "tb_next"); + extra_assert(tb_next != NULL); + Py_DECREF(tb); + tb = tb_next; + } + PyErr_Restore(exc, value, tb); + return false; + } + else { + /* to emulate the return, move the current position to + the end of the function code. We assume that the + last instruction of any code object is a RETURN_VALUE. */ + PyObject** p; + int new_i = PyString_GET_SIZE(co->co_code) - 1; + /* Python 2.5: the bytecode doesn't always end with a + RETURN_VALUE, but surely there must be one *somewhere* */ + while (PyString_AS_STRING(co->co_code)[new_i] != RETURN_VALUE){ + --new_i; + psyco_assert(new_i >= 0); + } +#if PY_VERSION_HEX >= 0x02030000 /* 2.3 */ + /* dubious compatibility hack for Python 2.3, in which f_lasti + no longer always refer to the instruction that will be + executed just after the current trace hook returns */ + new_i -= entering; +#endif + f->f_lasti = new_i; + f->f_iblock = 0; + + /* free the stack */ + for (p=f->f_stacktop; --p >= f->f_valuestack; ) { + Py_XDECREF(*p); + *p = NULL; + } + /* push the result alone on the stack */ + p = f->f_valuestack; + *p++ = result; /* consume a ref */ + f->f_stacktop = p; + + extra_assert(!PyErr_Occurred()); + return true; + } +} + + + /***************************************************************/ + +#define FRAME_STACK_ALLOC_BY 83 /* about 1KB */ + +DEFINEFN +stack_frame_info_t* psyco_finfo(PsycoObject* caller, PsycoObject* callee) +{ + static stack_frame_info_t* current = NULL; + static stack_frame_info_t* end = NULL; + + Source sglobals; + stack_frame_info_t* p; + int inlining = caller != NULL && caller->pr.is_inlining; + + if (end - current <= inlining) { + psyco_memory_usage += sizeof(stack_frame_info_t) * + FRAME_STACK_ALLOC_BY; + current = PyMem_NEW(stack_frame_info_t, FRAME_STACK_ALLOC_BY); + if (current == NULL) + OUT_OF_MEMORY(); + end = current + FRAME_STACK_ALLOC_BY; + } + p = current; + current += inlining + 1; +#if NEED_STACK_FRAME_HACK + p->link_stack_depth = -inlining; +#endif + p->co = callee->pr.co; + sglobals = callee->vlocals.items[INDEX_LOC_GLOBALS]->source; + if (is_compiletime(sglobals)) + p->globals = (PyObject*) CompileTime_Get(sglobals)->value; + else + p->globals = NULL; /* uncommon */ + if (inlining) { + (p+1)->co = caller->pr.co; + sglobals = caller->vlocals.items[INDEX_LOC_GLOBALS]->source; + if (is_compiletime(sglobals)) + (p+1)->globals = (PyObject*) + CompileTime_Get(sglobals)->value; + else + (p+1)->globals = NULL; /* uncommon */ + } + return p; +} + +DEFINEFN +void PyFrameRuntime_dealloc(PyFrameRuntime* self) +{ + /* nothing */ +} + +PSY_INLINE PyFrameObject* psyco_build_pyframe(PyObject* co, PyObject* globals, + PyThreadState* tstate) +{ + PyFrameObject* back; + PyFrameObject* result; + + /* frame objects are not created in stack order + with Psyco, so it's probably better not to + create plain wrong chained lists */ + back = tstate->frame; + tstate->frame = NULL; + result = PyFrame_New(tstate, (PyCodeObject*) co, globals, NULL); + if (result == NULL) + OUT_OF_MEMORY(); + result->f_lasti = -1; /* can be used to identify emulated frames */ + tstate->frame = back; + return result; +} + +DEFINEFN +PyFrameObject* psyco_emulate_frame(PyObject* o) +{ + if (PyFrame_Check(o)) { + /* a real Python frame */ + Py_INCREF(o); + return (PyFrameObject*) o; + } + else { + /* a Psyco frame: emulate it */ + PyObject* co = PyTuple_GetItem(o, 0); + PyObject* globals = PyTuple_GetItem(o, 1); + extra_assert(co != NULL); + extra_assert(globals != NULL); + return psyco_build_pyframe(co, globals, PyThreadState_GET()); + } +} + +struct sfitmp_s { + stack_frame_info_t** fi; + struct sfitmp_s* next; +}; + +static PyObject* pvisitframes(PyObject*(*callback)(PyObject*,void*), + void* data) +{ + /* Whenever we run Psyco-produced machine code, we mark the current + Python frame as the starting point of a chained list of Psyco + frames. The machine code will update this chained list so that + psyco_next_stack_frame() can be used to visit the list from + the outermost to the innermost frames. Note that the list does + not contain the first Psyco frame, the one directly run by a + call to psyco_processor_run(). This still gives the expected + result, because PsycoFunctionObjects are only supposed to be + called by proxy codes (see psyco_proxycode()). This proxy + code itself has a frame. It replaces the missing Psyco frame. + XXX this would no longer work if we filled the emulated frames + with more information, like local variables */ + + PyObject* result = NULL; + PyFrameRuntime* fstart; + PyObject* tdict = psyco_thread_dict(); + PyFrameObject* f = PyThreadState_Get()->frame; + + RECLIMIT_SAFE_ENTER(); + while (f != NULL) { + /* is this Python frame the starting point of a chained + list of Psyco frames ? */ + fstart = (PyFrameRuntime*) PyDict_GetItem(tdict, (PyObject*) f); + if (fstart != NULL) { + /* Yes. Get the list start. */ + struct sfitmp_s* revlist; + struct sfitmp_s* p; + PyObject* o; + PyObject* g; + long tag; + stack_frame_info_t** f1; + stack_frame_info_t** finfo; + stack_frame_info_t* fdata; + stack_frame_info_t* flimit; + finfo = *(fstart->psy_frames_start); + + /* Enumerate the frames and store them in a + last-in first-out linked list. The end is marked by + a pointer with an odd integer value (actually with + i386 the least significant byte of the integer value + is -1, and with ivm the end pointer's value is + exactly 1; but real pointers cannot be odd at all + because they are aligned anyway). */ + revlist = NULL; + for (f1 = finfo; (((long)(*f1)) & 1) == 0; + f1 = psyco_next_stack_frame(f1)) { + p = (struct sfitmp_s*) + PyMem_MALLOC(sizeof(struct sfitmp_s)); + if (p == NULL) + OUT_OF_MEMORY(); + p->fi = f1; + p->next = revlist; + revlist = p; +#if NEED_STACK_FRAME_HACK + if ((*f1)->link_stack_depth == 0) + break; /* stack top is an inline frame */ +#endif + } + + /* now actually visit them in the correct order */ + while (revlist) { + p = revlist; + /* a Psyco frame is represented as + (co, globals, address_of(*fi)) */ + if (result == NULL) { + tag = (long)(p->fi); + fdata = *p->fi; + flimit = finfo_last(fdata); + while (1) { + g = fdata->globals; + if (g == NULL) + g = f->f_globals; + o = Py_BuildValue("OOl", + fdata->co, g, + tag); + if (o == NULL) + OUT_OF_MEMORY(); + result = callback(o, data); + Py_DECREF(o); + if (result != NULL) + break; + if (fdata == flimit) + break; + fdata++, tag--; + } + } + revlist = p->next; + PyMem_FREE(p); + } + if (result != NULL) + break; + + /* there is still the real Python frame + which is shadowed by a Psyco frame, i.e. a + proxy function. Represented as + (co, globals, f) */ + o = Py_BuildValue("OOO", + fstart->psy_code, + fstart->psy_globals, + f); + if (o == NULL) + OUT_OF_MEMORY(); + result = callback(o, data); + Py_DECREF(o); + } + else { + /* a real unshadowed Python frame */ + result = callback((PyObject*) f, data); + } + if (result != NULL) + break; + f = f->f_back; + } + RECLIMIT_SAFE_LEAVE(); + return result; +} + + + +static PyObject* visit_nth_frame(PyObject* o, void* n) +{ + /* count the calls to the function and return 'o' when + the counter reaches zero */ + if (!--*(int*)n) { + Py_INCREF(o); + return o; + } + return NULL; +} + +static PyObject* visit_prev_frame(PyObject* o, void* data) +{ + PyObject* cmp = *(PyObject**) data; + + if (cmp != NULL) { + /* still searching */ + if (PyFrame_Check(o) || PyFrame_Check(cmp)) { + if (o != cmp) return NULL; + } + else { + PyObject* p1; + PyObject* p2; + + p1 = PyTuple_GetItem(o, 2); /* tag */ + p2 = PyTuple_GetItem(cmp, 2); + if (PyObject_Compare(p1, p2) != 0) return NULL; + + p1 = PyTuple_GetItem(o, 0); /* code */ + p2 = PyTuple_GetItem(cmp, 0); + if (p1 != p2) return NULL; + + p1 = PyTuple_GetItem(o, 1); /* globals */ + p2 = PyTuple_GetItem(cmp, 1); + if (p1 != p2) return NULL; + } + /* found it ! We will succeed the next time + visit_find_frame() is called. */ + *(PyObject**) data = NULL; + return NULL; + } + else { + /* found it the previous time, now return this next 'o' */ + Py_INCREF(o); + return o; + } +} + +DEFINEFN +PyObject* psyco_find_frame(PyObject* o) +{ + void* result; + if (PyInt_Check(o)) { + int depth = PyInt_AsLong(o) + 1; + if (depth <= 0) + depth = 1; + result = pvisitframes(visit_nth_frame, &depth); + } + else { + result = pvisitframes(visit_prev_frame, (void*) &o); + if (result == NULL && !PyErr_Occurred() && o != NULL) + PyErr_SetString(PyExc_PsycoError, + "f_back is invalid when frames are no longer active"); + } + if (result == NULL && !PyErr_Occurred()) + PyErr_SetString(PyExc_ValueError, + "call stack is not deep enough"); + return (PyObject*) result; +} + +static PyObject* visit_get_globals(PyObject* o, void* ignored) +{ + if (PyFrame_Check(o)) + return ((PyFrameObject*) o)->f_globals; + else + return PyTuple_GetItem(o, 1); +} +DEFINEFN +PyObject* psyco_get_globals(void) +{ + PyObject* result = pvisitframes(visit_get_globals, NULL); + if (result == NULL) + psyco_fatal_msg("sorry, don't know what to do with no globals"); + return result; +} + +static PyFrameObject* cached_frame = NULL; +static PyObject* visit_first_frame(PyObject* o, void* ts) +{ + if (PyFrame_Check(o)) { + /* a real Python frame: don't return a new reference */ + return (PyObject*) o; + } + else { + /* a Psyco frame: emulate it */ + /* we can't return a new reference, so we have to remember + the last frame we emulated and free it now. This is + not too bad since we can use this as a cache and avoid + rebuilding the new emulated frame all the time. */ + PyFrameObject* f; + PyFrameObject* newf; + PyObject* co = PyTuple_GetItem(o, 0); + PyObject* globals = PyTuple_GetItem(o, 1); + PyThreadState* tstate = (PyThreadState*) ts; + extra_assert(co != NULL); + extra_assert(globals != NULL); + while (cached_frame != NULL) { + f = cached_frame; + if ((PyObject*) f->f_code == co + && f->f_globals == globals) { + /* reuse the cached frame */ + f->f_tstate = tstate; + return (PyObject*) f; + } + cached_frame = NULL; + Py_DECREF(f); /* might set cached_frame again + XXX could this loop never end? */ + } + newf = psyco_build_pyframe(co, globals, tstate); + while (cached_frame != NULL) { + /* worst-case safe... this is unlikely */ + f = cached_frame; + cached_frame = NULL; + Py_DECREF(f); + } + cached_frame = newf; /* transfer ownership */ + return (PyObject*) newf; + } +} +static PyFrameObject* psyco_threadstate_getframe(PyThreadState* self) +{ + return (PyFrameObject*) pvisitframes(visit_first_frame, (void*)self); +} + + + /***************************************************************/ + +INITIALIZATIONFN +void psyco_frames_init(void) +{ + _PyThreadState_GetFrame = +# if PYTHON_API_VERSION < 1012 + (unaryfunc) +# endif + psyco_threadstate_getframe; +} diff --git a/nodeboxgl/ext/psyco/src/c/Python/frames.h b/nodeboxgl/ext/psyco/src/c/Python/frames.h new file mode 100644 index 0000000..fcf2a0e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/frames.h @@ -0,0 +1,82 @@ + /***************************************************************/ +/*** Python frames and virtual frames ***/ + /***************************************************************/ + +#ifndef _FRAMES_H +#define _FRAMES_H + + +#include "../psyco.h" +#include "../cstruct.h" +#include +#include "pyver.h" +#include +#include + + +/* Basic interface to compile the given code object. Return the + code buffer or Py_None if this code cannot be compiled. + Never sets an exception. */ +EXTERNFN PyObject* PsycoCode_CompileCode(PyCodeObject* co, + PyObject* globals, + int recursion, + int module); + +/* Same as PsycoCode_CompileCode, but starts compiling from the middle + of a frame */ +EXTERNFN PyObject* PsycoCode_CompileFrame(PyFrameObject* f, int recursion); + +/* Run a compiled buffer returned by PsycoCode_CompileXxx(). + The submitted frame object will be modified to reflect any progress done + in running this frame by Psyco. Return 'false' if an exception is set. + For code compiled by PsycoCode_CompileCode, the frame must just have been + initialized by ceval.c but not yet run. For code compiled by + PsycoCode_CompileFrame, the frame must be in the same state as when it + was compiled. */ +EXTERNFN bool PsycoCode_Run(PyObject* codebuf, PyFrameObject* f, bool entering); + + +/* Find a frame. If 'o' is an integer, it is the 'o'th frame (0=top). + If 'o' was returned by a previous call to psyco_get_frame(), find + the previous frame (as reading f_back does). + The return value is either a normal Python frame object, or + a tuple (code, globals, tag). tag is only used for the next call + to psyco_get_frame(). */ +EXTERNFN PyObject* psyco_find_frame(PyObject* o); +EXTERNFN PyFrameObject* psyco_emulate_frame(PyObject* o); + +EXTERNFN PyObject* psyco_get_globals(void); +/* PyObject* psyco_get_locals(void); this one implemented in psyco.c */ + + +/* to keep a trace of the Psyco stack frames */ +struct stack_frame_info_s { +#if NEED_STACK_FRAME_HACK + int link_stack_depth; /* -1 if there is an inline frame following */ +#endif + PyCodeObject* co; + PyObject* globals; /* NULL if not compile-time */ +}; +PSY_INLINE stack_frame_info_t* finfo_last(stack_frame_info_t* finfo) { +#if NEED_STACK_FRAME_HACK + if (finfo->link_stack_depth < 0) finfo -= finfo->link_stack_depth; +#endif + return finfo; +} + +EXTERNFN stack_frame_info_t* psyco_finfo(PsycoObject* caller, + PsycoObject* callee); + +/* extra run-time data attached to the Python frame objects which are + used as starting point for Psyco frames */ +typedef struct { + PyCStruct_HEAD /* cs_key is the frame object */ + stack_frame_info_t*** psy_frames_start; + PyCodeObject* psy_code; + PyObject* psy_globals; +} PyFrameRuntime; + +EXTERNFN void PyFrameRuntime_dealloc(PyFrameRuntime* self); + + +#endif /* _FRAMES_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.c b/nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.c new file mode 100644 index 0000000..c94af75 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.c @@ -0,0 +1,281 @@ +#include "pbltinmodule.h" +#include "../Objects/pintobject.h" +#include "../Objects/ptupleobject.h" +#include "../Objects/plistobject.h" +#include "../Objects/pstringobject.h" +#include "../Objects/prangeobject.h" + + +static PyCFunction cimpl_range; +static PyCFunction cimpl_xrange; +static PyCFunction cimpl_chr; +static PyCFunction cimpl_ord; +static PyCFunction cimpl_id; +static PyCFunction cimpl_len; +static PyCFunction cimpl_abs; +static PyCFunction cimpl_apply; +static PyCFunction cimpl_divmod; + + +static vinfo_t* get_len_of_range(PsycoObject* po, vinfo_t* lo, vinfo_t* hi + /*, vinfo_t* step == 1 currently*/) +{ + /* translated from bltinmodule.c */ + condition_code_t cc = integer_cmp(po, lo, hi, Py_LT); + if (cc == CC_ERROR) + return NULL; + if (runtime_condition_t(po, cc)) { + vinfo_t* vresult = integer_sub(po, hi, lo, false); + assert_nonneg(vresult); + return vresult; + } + else + return psyco_vi_Zero(); +} + +static vinfo_t* intobj_as_long(PsycoObject* po, vinfo_t* v) +{ + if (Psyco_VerifyType(po, v, &PyInt_Type) == 1) + return PsycoInt_AS_LONG(po, v); + else + return NULL; +} + +static bool parse_range_args(PsycoObject* po, vinfo_t* vargs, + vinfo_t** iistart, vinfo_t** iilen) +{ + vinfo_t* ilow; + vinfo_t* ihigh; + int tuplesize = PsycoTuple_Load(vargs); /* -1 if unknown */ + + switch (tuplesize) { + case 1: + ihigh = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 0)); + if (ihigh == NULL) return false; + ilow = psyco_vi_Zero(); + vinfo_incref(ihigh); + break; + /*case 3: + istep = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 2)); + if (istep == NULL) return NULL;*/ + /* fall through */ + case 2: + ilow = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 0)); + if (ilow == NULL) return false; + ihigh = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 1)); + if (ihigh == NULL) return false; + vinfo_incref(ilow); + vinfo_incref(ihigh); + break; + default: + return false; + } + *iilen = get_len_of_range(po, ilow, ihigh); + vinfo_decref(ihigh, po); + if (*iilen == NULL) { + vinfo_decref(ilow, po); + return false; + } + *iistart = ilow; + return true; +} + +static vinfo_t* pbuiltin_range(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + vinfo_t* istart; + vinfo_t* ilen; + if (parse_range_args(po, vargs, &istart, &ilen)) { + return PsycoListRange_NEW(po, istart, ilen); + } + if (PycException_Occurred(po)) + return NULL; + return psyco_generic_call(po, cimpl_range, + CfReturnRef|CfPyErrIfNull, + "lv", NULL, vargs); +} + +static vinfo_t* pbuiltin_xrange(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + vinfo_t* istart; + vinfo_t* ilen; + if (parse_range_args(po, vargs, &istart, &ilen)) { + return PsycoXRange_NEW(po, istart, ilen); + } + if (PycException_Occurred(po)) + return NULL; + return psyco_generic_call(po, cimpl_xrange, + CfReturnRef|CfPyErrIfNull, + "lv", NULL, vargs); +} + +static vinfo_t* prange_new(PsycoObject* po, PyTypeObject* type, + vinfo_t* vargs, vinfo_t* vkw) +{ + /* for Python >= 2.3, where __builtin__.xrange is a type */ + vinfo_t* istart; + vinfo_t* ilen; + psyco_assert(type == &PyRange_Type); /* no subclassing xrange */ + if (parse_range_args(po, vargs, &istart, &ilen)) { + return PsycoXRange_NEW(po, istart, ilen); + } + if (PycException_Occurred(po)) + return NULL; + return psyco_generic_call(po, type->tp_new, + CfReturnRef|CfPyErrIfNull, + "lvv", type, vargs, vkw); +} + +static vinfo_t* pbuiltin_chr(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + vinfo_t* intval; + vinfo_t* result; + condition_code_t cc; + + if (PsycoTuple_Load(vargs) != 1) + goto use_proxy; + intval = PsycoInt_AsLong(po, PsycoTuple_GET_ITEM(vargs, 0)); + if (intval == NULL) + return NULL; + + cc = integer_cmp_i(po, intval, 255, Py_GT|COMPARE_UNSIGNED); + if (cc == CC_ERROR) { + vinfo_decref(intval, po); + return NULL; + } + if (runtime_condition_f(po, cc)) { + vinfo_decref(intval, po); + goto use_proxy; + } + + result = PsycoCharacter_New(intval); + vinfo_decref(intval, po); + return result; + + use_proxy: + return psyco_generic_call(po, cimpl_chr, CfReturnRef|CfPyErrIfNull, + "lv", NULL, vargs); +} + +static vinfo_t* pbuiltin_ord(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) +{ + vinfo_t* result; + if (!PsycoCharacter_Ord(po, vobj, &result)) + return NULL; + + if (result != NULL) + return PsycoInt_FROM_LONG(result); + + return psyco_generic_call(po, cimpl_ord, CfReturnRef|CfPyErrIfNull, + "lv", NULL, vobj); +} + +static vinfo_t* pbuiltin_id(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) +{ +#if HAVE_NEGATIVE_IDS /* Python < 2.5 */ + return PsycoInt_FromLong(vobj); +#else + /* XXX fall-back for now */ + return psyco_generic_call(po, PyLong_FromVoidPtr, + CfReturnRef|CfPyErrIfNull, + "v", vobj); +#endif +} + +static vinfo_t* pbuiltin_len(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) +{ + vinfo_t* result; + result = PsycoObject_Size(po, vobj); + if (result != NULL) + result = PsycoInt_FROM_LONG(result); + return result; +} + +static vinfo_t* pbuiltin_abs(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) +{ + return PsycoNumber_Absolute(po, vobj); +} + +static vinfo_t* pbuiltin_apply(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + vinfo_t* alist = NULL; + vinfo_t* kwdict = NULL; + vinfo_t* retval; + int tuplesize = PsycoTuple_Load(vargs); /* -1 if unknown */ + PyTypeObject* argt; + vinfo_t* t = NULL; + + switch (tuplesize) { + case 3: + kwdict = PsycoTuple_GET_ITEM(vargs, 2); + if (Psyco_VerifyType(po, kwdict, &PyDict_Type) != true) { + /* 'kwdict' is not a dictionary */ + break; + } + /* fall through */ + case 2: + alist = PsycoTuple_GET_ITEM(vargs, 1); + argt = Psyco_NeedType(po, alist); + if (argt == NULL) + return NULL; + if (!PyType_TypeCheck(argt, &PyTuple_Type)) { + /* 'alist' is not a tuple */ + if (!PsycoSequence_Check(argt)) + break; /* give up */ + t = PsycoSequence_Tuple(po, alist); + if (t == NULL) + break; /* give up */ + alist = t; + } + /* fall through */ + case 1: + retval = PsycoEval_CallObjectWithKeywords(po, + PsycoTuple_GET_ITEM(vargs, 0), + alist, kwdict); + vinfo_xdecref(t, po); + return retval; + } + + if (PycException_Occurred(po)) + return NULL; + return psyco_generic_call(po, cimpl_apply, CfReturnRef|CfPyErrIfNull, + "lv", NULL, vargs); +} + +static vinfo_t* pbuiltin_divmod(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) +{ + int tuplesize = PsycoTuple_Load(vargs); /* -1 if unknown */ + + if (tuplesize == 2) { + return PsycoNumber_Divmod(po, + PsycoTuple_GET_ITEM(vargs, 0), + PsycoTuple_GET_ITEM(vargs, 1)); + } + return psyco_generic_call(po, cimpl_divmod, CfReturnRef|CfPyErrIfNull, + "lv", NULL, vargs); +} + + +/***************************************************************/ + + +INITIALIZATIONFN +void psyco_bltinmodule_init(void) +{ + PyObject* md = Psyco_DefineMetaModule("__builtin__"); + +#define DEFMETA(name, flags) \ + cimpl_ ## name = Psyco_DefineModuleFn(md, #name, flags, &pbuiltin_ ## name) + + DEFMETA( range, METH_VARARGS ); + DEFMETA( chr, METH_VARARGS ); + DEFMETA( ord, METH_O); + DEFMETA( id, METH_O); + DEFMETA( len, METH_O); + DEFMETA( abs, METH_O); + DEFMETA( apply, METH_VARARGS ); + DEFMETA( divmod, METH_VARARGS ); + cimpl_xrange = Psyco_DefineModuleC(md, "xrange", METH_VARARGS, + &pbuiltin_xrange, prange_new); +#undef DEFMETA + Py_XDECREF(md); +} diff --git a/nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.h b/nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.h new file mode 100644 index 0000000..3d59fb8 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/pbltinmodule.h @@ -0,0 +1,10 @@ + /***************************************************************/ +/*** interface to bltinmodule.c ***/ + /***************************************************************/ + +#ifndef _PSY_BLTINMODULE_H +#define _PSY_BLTINMODULE_H + +/* empty */ + +#endif /* _PSY_BLTINMODULE_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Python/pycheader.h b/nodeboxgl/ext/psyco/src/c/Python/pycheader.h new file mode 100644 index 0000000..81ed1ce --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/pycheader.h @@ -0,0 +1,116 @@ + /***************************************************************/ +/*** Language-dependent structures ***/ + /***************************************************************/ + + +#ifndef _PYCHEADER_H +#define _PYCHEADER_H + + +#include "../psyco.h" +#include +#include + + +/* "Frames": the Python compiler may be interrupted between the + compilation of two opcodes. Any local data it needs that should + persist across such interruptions must be stored in the PsycoObject + driving compilation. The PsycoObject plays the same role as the + FrameObject in normal interpretation. The usual fields of + FrameObjects are split into two groups: + + 1) in the 'vlocals' array, as 'vinfo_t' structures. This makes + dynamically-staged variables, that is, whose value may be known + at compile-time, run-time or virtual-time only. Use the LOC_xxx + macros to access these variables. + + 2) in the 'pr' field whose structure is defined below. For + compile-time-only data. + + IMPORTANT: the dispatcher only looks at LOC_xxx variables to + determine if the needed code has already be compiled. If two + PsycoObjects differ only by their 'pr' field, the code that + the compiler would emit in each case must be interchangeable + (but not necessary identical, as different optimizations + could be done). +*/ + +#define INDEX_LOC_CONTINUATION 0 /* return address in the stack */ +#define INDEX_LOC_GLOBALS 1 /* globals() dict object */ +#define INDEX_LOC_INLINING 2 /* for function inlining */ +#define INDEX_LOC_LOCALS_PLUS 3 /* start of local variables + stack */ + +#define LOC_CONTINUATION (po->vlocals.items[INDEX_LOC_CONTINUATION]) +#define LOC_GLOBALS (po->vlocals.items[INDEX_LOC_GLOBALS]) +#define LOC_INLINING (po->vlocals.items[INDEX_LOC_INLINING]) +#define LOC_LOCALS_PLUS (po->vlocals.items + INDEX_LOC_LOCALS_PLUS) + + +typedef struct { + PyCodeObject* co; /* code object we are compiling */ + int next_instr; /* next instruction to compile */ + short auto_recursion; /* # levels to auto-compile calls to Python functions */ + char is_inlining; /* true when compiling a code inlined in a parent */ + unsigned char iblock; /* index in blockstack */ + PyTryBlock blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ + + /* fields after 'blockstack' are not saved in a FrozenPsycoObject */ + int stack_base; /* number of items before the stack in LOC_LOCALS_PLUS */ + int stack_level; /* see note below */ + PyObject* merge_points; /* see mergepoints.h */ + vinfo_t* exc; /* current compile-time (pseudo) exception, see below */ + vinfo_t* val; /* exception value */ + vinfo_t* tb; /* traceback object */ + PyObject* f_builtins; + PyObject* changing_globals; /* dict of names of globals that are detected to + change */ +} pyc_data_t; + +#define AUTO_RECURSION_MAX 200 +#define AUTO_RECURSION(r) ((r)>AUTO_RECURSION_MAX ? AUTO_RECURSION_MAX : (r)) + +/* Note. + 'stack_level' is stored in 'pr'. To do so we must assume that the level + of the interpreter value stack is always the same when execution reaches + the same position in the bytecode. This is normally the case in Python, + with a few exceptions that need to be worked around ('finally:' clauses + in the original interpreter are invoked with a variable number of objects + pushed on the stack; the present interpreter always only pushes one, + grouping objects in a tuple if necessary (remember that tuples are + abstracted to virtual-time, so this doesn't mean we loose time building + and deconstructing Python tuples)). + + The same assumption holds for the other fields of pyc_data_t but only + 'stack_level' needs special care. +*/ + + +/* some extra flags recognized by psyco_generic_call(). They tell how the + Python C function signals errors. They are ignored by the Psyco_METAX() + macros if a meta-implementation is found, as meta-implementations always + signal errors by returning either (vinfo_t*)NULL or CC_ERROR. */ +#define CfPyErrDontCheck 0x000 /* default: no check */ +#define CfPyErrIfNull 0x100 /* a return == 0 (or NULL) means an error */ +#define CfPyErrIfNonNull 0x200 /* a return != 0 means an error */ +#define CfPyErrIfNeg 0x300 /* a return < 0 means an error */ +#define CfPyErrIfMinus1 0x400 /* only -1 means an error */ +#define CfPyErrCheck 0x500 /* always check with PyErr_Occurred() */ +#define CfPyErrCheckMinus1 0x600 /* use PyErr_Occurred() if return is -1 */ +#define CfPyErrCheckNeg 0x700 /* use PyErr_Occurred() if return is < 0 */ +#define CfPyErrNotImplemented 0x800 /* test for a Py_NotImplemented result */ +#define CfPyErrIterNext 0x900 /* specially for tp_iternext slots */ +#define CfPyErrAlways 0xA00 /* always set an exception */ + +#define CfPyErrMask 0xF00 + +/* Note: CfPyErrNotImplemented means that the C function may return + Py_NotImplemented, and this is checked; if true, then Psyco_METAX() + returns exactly 'psyco_viNotImplemented', and not just a possibly run-time + vinfo_t* containing Py_NotImplemented. Meta-implementations always return + exactly 'psyco_viNotImplemented'. */ + +/* for psyco_generic_call() only */ +EXTERNFN vinfo_t* generic_call_check(PsycoObject* po, int flags, vinfo_t* vi); +EXTERNFN vinfo_t* generic_call_ct(int flags, long result); + +#endif /* _PYCHEADER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Python/pycinternal.h b/nodeboxgl/ext/psyco/src/c/Python/pycinternal.h new file mode 100644 index 0000000..bc19eae --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/pycinternal.h @@ -0,0 +1,24 @@ + /***************************************************************/ +/*** Includes Python internal headers ***/ + /***************************************************************/ + + +#ifndef _PYCINTERNAL_H +#define _PYCINTERNAL_H + +#include + + +/* Post-2.2 versions of Python introduced the following more explicit names. + XXX We should map the new names to the old ones if the new names do not + XXX exist but how can we detect if this is needed? + XXX Hacked by completely overriding the enum values with #defines. */ + +#define PyCmp_IN 6 +#define PyCmp_NOT_IN 7 +#define PyCmp_IS 8 +#define PyCmp_IS_NOT 9 +#define PyCmp_EXC_MATCH 10 + + +#endif /* _PYCINTERNAL_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Python/pycompiler.c b/nodeboxgl/ext/psyco/src/c/Python/pycompiler.c new file mode 100644 index 0000000..4be1335 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/pycompiler.c @@ -0,0 +1,3237 @@ +#include "pycompiler.h" +#include "../processor.h" +#include "../dispatcher.h" +#include "../mergepoints.h" +#include "../codemanager.h" +#include "../psyfunc.h" +#include "../pycodegen.h" + +#include "../Objects/pabstract.h" +#include "../Objects/pintobject.h" +#include "../Objects/plongobject.h" +#include "../Objects/ptupleobject.h" +#include "../Objects/plistobject.h" +#include "../Objects/pdictobject.h" +#include "../Objects/pfuncobject.h" + +#include +#include "pycinternal.h" +#include + + +#define KNOWN_VAR(type, varname, loc) \ + type varname = (type)(CompileTime_Get(loc->source)->value) + + +/*****************************************************************/ + /*** Meta functions ***/ + +DEFINEVAR PyObject* Psyco_Meta_Dict = NULL; + +DEFINEFN +void Psyco_DefineMeta(void* c_function, void* psyco_function) +{ + PyObject* key; + PyObject* value; + if (Psyco_Meta_Dict == NULL) { + Psyco_Meta_Dict = PyDict_New(); + if (Psyco_Meta_Dict == NULL) + return; + } + if (c_function == NULL) { + /* should not occur */ + debug_printf(1, ("init: C function pointer NULL in CPython\n")); + return; + } + key = PyInt_FromLong((long) c_function); + if (key != NULL) { + value = PyInt_FromLong((long) psyco_function); + if (value != NULL) { + PyDict_SetItem(Psyco_Meta_Dict, key, value); + Py_DECREF(value); + } + Py_DECREF(key); + } +} + +DEFINEFN +PyObject* Psyco_DefineMetaModule(char* modulename) +{ + PyObject* module = PyImport_ImportModule(modulename); + if (module == NULL) { + PyErr_Clear(); + debug_printf(1, ("init: module %s not found\n", + modulename)); + } + else { + debug_printf(2, ("init: activated module %s\n", modulename)); + } + return module; +} + +DEFINEFN +PyObject* Psyco_GetModuleObject(PyObject* module, char* name, + PyTypeObject* expected_type) +{ + PyObject* fobj; + if (module == NULL) + return NULL; + + fobj = PyObject_GetAttrString(module, name); + if (fobj == NULL) { + debug_printf(1, ("init: %s.%s not found\n", + PyModule_GetName(module), name)); + PyErr_Clear(); + return NULL; + } + if (expected_type != NULL && !PyObject_TypeCheck(fobj, expected_type)) { + debug_printf(1, ("init: %s.%s is of type %.200s instead of " + "%.200s\n", PyModule_GetName(module), name, + fobj->ob_type->tp_name, + expected_type->tp_name)); + Py_DECREF(fobj); + fobj = NULL; + } + return fobj; +} + +DEFINEFN +PyCFunction Psyco_DefineModuleFn(PyObject* module, char* meth_name, + int meth_flags, void* meta_fn) +{ + PyCFunction f; + PyObject* fobj = Psyco_GetModuleObject(module, meth_name, + &PyCFunction_Type); + if (fobj == NULL) + return NULL; + + if (PyCFunction_GET_FLAGS(fobj) != meth_flags) { + f = NULL; + debug_printf(1, ("init: %s.%s built-in has wrong " + "meth_flags\n", PyModule_GetName(module), + meth_name)); + } + else { + f = PyCFunction_GET_FUNCTION(fobj); + Psyco_DefineMeta(f, meta_fn); + } + Py_DECREF(fobj); + return f; +} + +DEFINEFN +PyCFunction Psyco_DefineModuleC(PyObject* module, char* meth_name, + int meth_flags, void* meta_fn, + void* meta_type_new) +{ + PyObject* o = Psyco_GetModuleObject(module, meth_name, NULL); + if (o == NULL) + return NULL; + if (PyType_Check(o) && + PyType_HasFeature((PyTypeObject*) o, Py_TPFLAGS_HAVE_CLASS) && + ((PyTypeObject*)o)->tp_new != NULL) { + /* maps a callable type */ + Psyco_DefineMeta(((PyTypeObject*)o)->tp_new, meta_type_new); + return NULL; + } + else + return Psyco_DefineModuleFn(module, meth_name, + meth_flags, meta_fn); +} + + +#define FORGET_REF if (has_rtref(vi->source)) \ + vi->source = remove_rtref(vi->source) + +DEFINEFN +vinfo_t* generic_call_check(PsycoObject* po, int flags, vinfo_t* vi) +{ + condition_code_t cc; + + switch (flags & CfPyErrMask) { + + case CfPyErrIfNull: /* a return == 0 (or NULL) means an error */ + cc = integer_cmp_i(po, vi, 0, Py_EQ); + break; + + case CfPyErrIfNonNull: /* a return != 0 means an error */ + cc = integer_cmp_i(po, vi, 0, Py_NE); + break; + + case CfPyErrIfNeg: /* a return < 0 means an error */ + cc = integer_cmp_i(po, vi, 0, Py_GE); + if (cc == CC_ERROR) + goto Error; + if (runtime_condition_t(po, cc)) { + assert_nonneg(vi); + return vi; /* result is >= 0, ok */ + } + goto Error; + + case CfPyErrIfMinus1: /* only -1 means an error */ + cc = integer_cmp_i(po, vi, -1, Py_EQ); + break; + + case CfPyErrCheck: /* always check with PyErr_Occurred() */ + cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); + break; + + case CfPyErrCheckMinus1: /* use PyErr_Occurred() if return is -1 */ + cc = integer_cmp_i(po, vi, -1, Py_NE); + if (cc == CC_ERROR) + goto Error; + if (runtime_condition_t(po, cc)) + return vi; /* result is not -1, ok */ + cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); + break; + + case CfPyErrCheckNeg: /* use PyErr_Occurred() if return is < 0 */ + cc = integer_cmp_i(po, vi, 0, Py_GE); + if (cc == CC_ERROR) + goto Error; + if (runtime_condition_t(po, cc)) { + assert_nonneg(vi); + return vi; /* result is >= 0, ok */ + } + cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); + break; + + case CfPyErrNotImplemented: /* test for a Py_NotImplemented result */ + cc = integer_cmp_i(po, vi, (long) Py_NotImplemented, Py_EQ); + if (cc == CC_ERROR) + goto Error; + if (runtime_condition_f(po, cc)) { + /* result is Py_NotImplemented */ + vinfo_decref(vi, po); + return psyco_vi_NotImplemented(); + } + cc = integer_cmp_i(po, vi, 0, Py_EQ); + break; + + case CfPyErrIterNext: /* specially for tp_iternext slots */ + cc = integer_cmp_i(po, vi, 0, Py_NE); + if (cc == CC_ERROR) + goto Error; + if (runtime_condition_t(po, cc)) + return vi; /* result is not 0, ok */ + + FORGET_REF; /* NULL result */ + vinfo_decref(vi, po); + cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); + if (cc == CC_ERROR || runtime_condition_f(po, cc)) + goto PythonError; /* PyErr_Occurred() returns true */ + + /* NULL result with no error set; it is the end of the + iteration. Raise a pseudo PyErr_StopIteration. */ + PycException_SetVInfo(po, PyExc_StopIteration, psyco_vi_None()); + return NULL; + + case CfPyErrAlways: /* always set an exception */ + goto Error; + + default: + return vi; + } + + if (cc != CC_ERROR && !runtime_condition_f(po, cc)) + return vi; /* no error */ + + Error: + if ((flags & CfReturnMask) == CfReturnRef) { + /* in case of error, 'vi' is not a real + reference, so forget it */ + FORGET_REF; + } + vinfo_decref(vi, po); + + /* We have detected that a Python exception must be set at + this point. */ + PythonError: + PycException_Raise(po, vinfo_new(VirtualTime_New(&ERtPython)), + NULL); + return NULL; +} +#undef FORGET_REF + +DEFINEFN +vinfo_t* generic_call_ct(int flags, long result) +{ + switch (flags & CfPyErrMask) { + + case CfPyErrNotImplemented: /* test for a Py_NotImplemented result */ + if ((PyObject*) result == Py_NotImplemented) + return psyco_vi_NotImplemented(); + break; + } + return NULL; /* meaning: nothing particular */ +} + +DEFINEFN +vinfo_t* Psyco_Meta1x(PsycoObject* po, void* c_function, int flags, + const char* arguments, long a1) +{ + void* psyco_fn = Psyco_Lookup(c_function); + if (psyco_fn == NULL) { + return psyco_generic_call(po, c_function, flags, arguments, + a1); + } + else + return ((vinfo_t*(*)(PsycoObject*, long))(psyco_fn)) + (po, a1); +} + +DEFINEFN +vinfo_t* Psyco_Meta2x(PsycoObject* po, void* c_function, int flags, + const char* arguments, long a1, long a2) +{ + void* psyco_fn = Psyco_Lookup(c_function); + if (psyco_fn == NULL) + return psyco_generic_call(po, c_function, flags, arguments, + a1, a2); + else + return ((vinfo_t*(*)(PsycoObject*, long, long))(psyco_fn)) + (po, a1, a2); +} + +DEFINEFN +vinfo_t* Psyco_Meta3x(PsycoObject* po, void* c_function, int flags, + const char* arguments, long a1, long a2, long a3) +{ + void* psyco_fn = Psyco_Lookup(c_function); + if (psyco_fn == NULL) + return psyco_generic_call(po, c_function, flags, arguments, + a1, a2, a3); + else + return ((vinfo_t*(*)(PsycoObject*, long, long, long))(psyco_fn)) + (po, a1, a2, a3); +} + +#if 0 +DEFINEFN +int psyco_atcompiletime_mega(PsycoObject* po, vinfo_t* vi, long* out) +{ + if (!compute_vinfo(vi, po)) + return -1; + if (is_runtime(vi->source)) { + if (vi->source & RunTime_Megamorphic) + return 0; + PycException_Promote(po, vi, &psyco_nonfixed_promotion_mega); + return -1; + } + else { + source_known_t* sk = CompileTime_Get(vi->source); + sk->refcount1_flags |= SkFlagFixed; + *out = sk->value; + return 1; + } +} +#endif + +DEFINEFN +int psyco_pyobj_atcompiletime_mega(PsycoObject* po, + vinfo_t* vi, PyObject** out) +{ + if (!compute_vinfo(vi, po)) + return -1; + if (is_runtime(vi->source)) { + if (vi->source & RunTime_Megamorphic) + return 0; + PycException_Promote(po, vi, + &psyco_nonfixed_pyobj_promotion_mega); + return -1; + } + else { + source_known_t* sk = CompileTime_Get(vi->source); + sk->refcount1_flags |= SkFlagFixed; + *out = (PyObject*) sk->value; + return 1; + } +} + + +/***************************************************************/ + /*** pyc_data_t ***/ + + +DEFINEFN +void pyc_data_build(PsycoObject* po, PyObject* merge_points) +{ + /* rebuild the data in the pyc_data_t */ + int i; + PyCodeObject* co = po->pr.co; + int stack_base = po->vlocals.count - co->co_stacksize; + for (i=stack_base; ivlocals.count; i++) + if (po->vlocals.items[i] == NULL) + break; + po->pr.stack_base = stack_base; + po->pr.stack_level = i - stack_base; + po->pr.merge_points = merge_points; +} + +static void block_setup(PsycoObject* po, int type, int handler, int level) +{ + PyTryBlock *b; + extra_assert(!po->pr.is_inlining); + if (po->pr.iblock >= CO_MAXBLOCKS) + Py_FatalError("block stack overflow"); + b = &po->pr.blockstack[(int)(po->pr.iblock++)]; + b->b_type = type; + b->b_level = level; + b->b_handler = handler; +} + +static PyTryBlock* block_pop(PsycoObject* po) +{ + extra_assert(!po->pr.is_inlining); + if (po->pr.iblock <= 0) + Py_FatalError("block stack underflow"); + return &po->pr.blockstack[(int)(--po->pr.iblock)]; +} + + +/*****************************************************************/ + /*** Compile-time Pseudo exceptions ***/ + + +DEFINEVAR source_virtual_t ERtPython; /* Exception raised by Python */ +DEFINEVAR source_virtual_t EReturn; /* 'return' statement */ +DEFINEVAR source_virtual_t EBreak; /* 'break' statement */ +DEFINEVAR source_virtual_t EContinue; /* 'continue' statement */ +DEFINEVAR source_virtual_t EInline; /* request to inline a function */ + +DEFINEFN +void PycException_SetString(PsycoObject* po, PyObject* e, const char* text) +{ + PyObject* s = PyString_FromString(text); + if (s == NULL) + OUT_OF_MEMORY(); + PycException_SetObject(po, e, s); +} + +DEFINEFN +void PycException_SetObject(PsycoObject* po, PyObject* e, PyObject* v) +{ + PycException_Raise(po, vinfo_new(CompileTime_New((long) e)), + vinfo_new(CompileTime_NewSk(sk_new((long) v, + SkFlagPyObj)))); +} + +DEFINEFN +void PycException_SetVInfo(PsycoObject* po, PyObject* e, vinfo_t* v) +{ + PycException_Raise(po, vinfo_new(CompileTime_New((long) e)), v); +} + +DEFINEFN +void PycException_Promote(PsycoObject* po, vinfo_t* vi, c_promotion_t* promotion) +{ + vinfo_incref(vi); + PycException_Raise(po, vinfo_new(VirtualTime_New(&promotion->header)), + vi); +} + +DEFINEFN +void PycException_SetFormat(PsycoObject* po, PyObject* e, const char* fmt, ...) +{ + PyObject* s; + va_list vargs; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, fmt); +#else + va_start(vargs); +#endif + s = PyString_FromFormatV(fmt, vargs); + va_end(vargs); + + if (s == NULL) + OUT_OF_MEMORY(); + PycException_SetObject(po, e, s); +} + +DEFINEFN +vinfo_t* PycException_Matches(PsycoObject* po, PyObject* e) +{ + vinfo_t* result; + if (PycException_Is(po, &ERtPython)) { + /* Exception raised by Python, emit a call to + PyErr_ExceptionMatches() */ + result = psyco_generic_call(po, PyErr_ExceptionMatches, + CfReturnNormal, "l", (long) e); + } + else if (PycException_IsPython(po)) { + /* Exception virtually set, that is, present in the PsycoObject + but not actually set at run-time by Python's PyErr_SetXxx */ + result = psyco_generic_call(po, PyErr_GivenExceptionMatches, + CfPure | CfReturnNormal, + "vl", po->pr.exc, (long) e); + } + else { /* pseudo exceptions don't match real Python ones */ + result = psyco_vi_Zero(); + } + return result; +} + +PSY_INLINE void clear_pseudo_exception(PsycoObject* po) +{ + extra_assert(PycException_Occurred(po)); + if (po->pr.tb != NULL) { + vinfo_decref(po->pr.tb, po); + po->pr.tb = NULL; + } + if (po->pr.val != NULL) { + vinfo_decref(po->pr.val, po); + po->pr.val = NULL; + } + vinfo_decref(po->pr.exc, po); + po->pr.exc = NULL; +} + +DEFINEFN +void PycException_Clear(PsycoObject* po) +{ + if (PycException_Is(po, &ERtPython)) { + /* Clear the Python exception set at run-time */ + psyco_generic_call(po, PyErr_Clear, CfNoReturnValue, ""); + } + clear_pseudo_exception(po); +} + +DEFINEFN +void psyco_virtualize_exception(PsycoObject* po) +{ + /* fetch a Python exception set at compile-time (that is, now) + and turn into a pseudo-exception (typically to be re-raised + at run-time). */ + PyObject *exc, *val, *tb; + vinfo_t *vexc, *vval, *vtb; + PyErr_Fetch(&exc, &val, &tb); + extra_assert(exc != NULL); + + vexc = vinfo_new(CompileTime_NewSk(sk_new((long) exc, SkFlagPyObj))); + vval = vinfo_new(CompileTime_NewSk(sk_new((long) val, SkFlagPyObj))); + vtb = tb == NULL ? NULL : + vinfo_new(CompileTime_NewSk(sk_new((long) tb, SkFlagPyObj))); + PycException_Restore(po, vexc, vval, vtb); +} + +static void cimpl_pyerr_fetch(PyObject* target[]) +{ + extra_assert(PyErr_Occurred()); + PyErr_Fetch(target+0, target+1, target+2); + if (target[0] == NULL) { + target[0] = Py_None; + Py_INCREF(Py_None); + } + if (target[1] == NULL) { + target[1] = Py_None; + Py_INCREF(Py_None); + } + if (target[2] == NULL) { + target[2] = Py_None; + Py_INCREF(Py_None); + } +} + +DEFINEFN +void cimpl_finalize_frame_locals(PyObject* f_exc_type, + PyObject* f_exc_value, + PyObject* f_exc_traceback) +{ + /* Called by code emitted by pycencoding.h when a function exits, + but only if f_exc_type!=NULL. Works like reset_exc_info() of + Python. */ + PyThreadState *tstate = PyThreadState_GET(); + PyObject *tmp_type, *tmp_value, *tmp_tb; + + /* This frame caught an exception */ + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = f_exc_type; /* references are transferred */ + tstate->exc_value = f_exc_value; + tstate->exc_traceback = f_exc_traceback; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + /* For b/w compatibility */ + PySys_SetObject("exc_type", f_exc_type); + PySys_SetObject("exc_value", f_exc_value); + PySys_SetObject("exc_traceback", f_exc_traceback); +} + +PSY_INLINE void cimpl_set_exc_info(PyObject* target[], + PyObject** f_exc_type, + PyObject** f_exc_value, + PyObject** f_exc_traceback) +{ + /* Equivalent of PyErr_NormalizeException() + set_exc_info() */ + PyThreadState *tstate = PyThreadState_GET(); + PyObject *type, *value, *tb; + PyObject *tmp_type, *tmp_value, *tmp_tb; + + PyErr_NormalizeException(target+0, target+1, target+2); + type = target[0]; + value = target[1]; + tb = target[2]; + + if (*f_exc_type == NULL) { + /* This frame didn't catch an exception before */ + /* Save previous exception of this thread in this frame */ + if (tstate->exc_type == NULL) { + Py_INCREF(Py_None); + tstate->exc_type = Py_None; + } + Py_INCREF(tstate->exc_type); + Py_XINCREF(tstate->exc_value); + Py_XINCREF(tstate->exc_traceback); + *f_exc_type = tstate->exc_type; + *f_exc_value = tstate->exc_value; + *f_exc_traceback = tstate->exc_traceback; + } + /* Set new exception for this thread */ + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(tb); + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); + /* For b/w compatibility */ + PySys_SetObject("exc_type", type); + PySys_SetObject("exc_value", value); + PySys_SetObject("exc_traceback", tb); +} + +static void cimpl_pyerr_fetch_and_normalize(PyObject* target[], + PyObject** f_exc_type, + PyObject** f_exc_value, + PyObject** f_exc_traceback) +{ + extra_assert(PyErr_Occurred()); + PyErr_Fetch(target+0, target+1, target+2); + cimpl_set_exc_info(target, + f_exc_type, f_exc_value, f_exc_traceback); +} + +static void cimpl_pyerr_normalize(PyObject* exc, PyObject* val, PyObject* tb, + PyObject* target[], + PyObject** f_exc_type, + PyObject** f_exc_value, + PyObject** f_exc_traceback) +{ + target[0] = exc; Py_INCREF(exc); + target[1] = val; Py_XINCREF(val); + target[2] = tb; Py_XINCREF(tb); + cimpl_set_exc_info(target, + f_exc_type, f_exc_value, f_exc_traceback); +} + +DEFINEFN +void PycException_Fetch(PsycoObject* po) +{ + if (PycException_Is(po, &ERtPython)) { +/* vinfo_t* exc = vinfo_new(SOURCE_DUMMY_WITH_REF); */ +/* vinfo_t* val = vinfo_new(SOURCE_DUMMY_WITH_REF); */ +/* vinfo_t* tb = vinfo_new(SOURCE_DUMMY_WITH_REF); */ +/* psyco_generic_call(po, PyErr_Fetch, CfNoReturnValue, */ +/* "rrr", exc, val, tb); */ +/* vinfo_decref(tb, po); */ + vinfo_array_t* array = array_new(3); + psyco_generic_call(po, cimpl_pyerr_fetch, + CfNoReturnValue, "A", array); + clear_pseudo_exception(po); + po->pr.exc = array->items[0]; + po->pr.val = array->items[1]; /* po->pr.val!=NULL after this */ + po->pr.tb = array->items[2]; /* po->pr.tb!=NULL after this */ + array_release(array); + } +} + +PSY_INLINE bool PycException_FetchNormalize(PsycoObject* po) +{ + vinfo_t* result; + vinfo_array_t* array = array_new(3); + vinfo_array_t* f_exc = LOC_CONTINUATION->array; + + /* At runtime, we load the following data into the array: + + array[0] -- exc_type new exception, normalized + array[1] -- exc_value new exception, normalized + array[2] -- exc_traceback new exception, normalized + */ + extra_assert(f_exc->count >= 3); + if (PycException_Is(po, &ERtPython)) { + /* fetch and normalize the exception */ + result = psyco_generic_call(po, cimpl_pyerr_fetch_and_normalize, + CfNoReturnValue, "Arrr", array, + f_exc->items[0], + f_exc->items[1], + f_exc->items[2]); + } + else { + char args[8]; + args[0] = 'v'; + args[1] = po->pr.val == NULL ? 'l' : 'v'; + args[2] = po->pr.tb == NULL ? 'l' : 'v'; + args[3] = 'A'; + args[4] = 'r'; + args[5] = 'r'; + args[6] = 'r'; + args[7] = 0; + /* normalize the already-given exception */ + result = psyco_generic_call(po, cimpl_pyerr_normalize, + CfNoReturnValue, args, + po->pr.exc, po->pr.val, po->pr.tb, + array, + f_exc->items[0], + f_exc->items[1], + f_exc->items[2]); + } + if (result == NULL) { + array_release(array); + return false; + } + clear_pseudo_exception(po); + po->pr.exc = array->items[0]; + po->pr.val = array->items[1]; /* po->pr.val!=NULL after this */ + po->pr.tb = array->items[2]; /* po->pr.tb!=NULL after this */ + array_release(array); + return true; +} + +static PyFrameObject* cimpl_new_frame(PyThreadState* tstate, PyCodeObject* code, + PyObject* globals, int lasti, int lineno) +{ + /* Make a minimalistic frame object, working around the specific + expectations of PyFrame_New(), which is the only reasonable way + to create frame objects (because of free lists etc) */ + PyFrameObject* result; + PyFrameObject* back = tstate->frame; + tstate->frame = NULL; /* frame objects are not created in stack order + with Psyco, so it's probably better not to + create plain wrong chained lists */ + result = PyFrame_New(tstate, code, globals, NULL); + tstate->frame = back; + if (result != NULL) { + result->f_lasti = lasti; + result->f_lineno = lineno; + } + return result; +} + +static void cimpl_rt_traceback(PyCodeObject* code, PyObject* globals, + int lasti, int lineno) +{ + PyThreadState* tstate = PyThreadState_GET(); + PyFrameObject* f = cimpl_new_frame(tstate, code, globals, lasti, lineno); + /* an out-of-memory error just replaces the current exception */ + if (f != NULL) { + PyTraceBack_Here(f); + Py_DECREF(f); + } +} + +static PyObject* cimpl_vt_traceback(PyCodeObject* code, PyObject* globals, + int lasti, int lineno) +{ + /* This is a hack around the limited interface to tracebacks. + PyTraceBack_Here() seems to be the only clean way to create new + traceback objects. */ + PyObject* oldtb; + PyObject* newtb; + PyThreadState* tstate = PyThreadState_GET(); + PyFrameObject* f = cimpl_new_frame(tstate, code, globals, lasti, lineno); + if (f == NULL) { + /* out-of-memory error */ + Py_INCREF(Py_None); + return Py_None; + } + oldtb = tstate->curexc_traceback; /* might be NULL */ + Py_XINCREF(oldtb); + if (PyTraceBack_Here(f)) { + /* out-of-memory error */ + Py_XDECREF(oldtb); + Py_DECREF(f); + Py_INCREF(Py_None); + return Py_None; + } + /* the new traceback is now in curexc_traceback */ + newtb = tstate->curexc_traceback; /* extracts the reference */ + tstate->curexc_traceback = oldtb; /* consumes the reference */ + Py_DECREF(f); + return newtb; +} + +/* record a traceback entry for the current virtual Python exception */ +PSY_INLINE void PsycoTraceBack_Here(PsycoObject* po, int lasti) +{ + int lineno = PyCode_Addr2Line(po->pr.co, lasti); + + if (PycException_Is(po, &ERtPython)) { + /* Python exception is actually set at run-time */ + psyco_generic_call(po, cimpl_rt_traceback, + CfNoReturnValue, "lvll", + (long) po->pr.co, LOC_GLOBALS, lasti, lineno); + } + else { + /* We only have a virtual-time exception (not set in Python), + so we build po->pr.tb without actually setting it either */ + vinfo_t* tb = psyco_generic_call(po, cimpl_vt_traceback, + CfReturnRef, "lvll", + (long) po->pr.co, LOC_GLOBALS, + lasti, lineno); + vinfo_xdecref(po->pr.tb, po); + po->pr.tb = tb; + } +} + + + /***************************************************************/ +/*** Initialization ***/ + /***************************************************************/ + +DEFINEVAR source_known_t psyco_skZero; /* known value 0 */ +DEFINEVAR source_known_t psyco_skOne; /* known value 1 */ +DEFINEVAR source_known_t psyco_skNone; /* known value 'Py_None' */ +DEFINEVAR source_known_t psyco_skPy_False; /* known value 'Py_False' */ +DEFINEVAR source_known_t psyco_skPy_True; /* known value 'Py_True' */ +DEFINEVAR source_known_t psyco_skNotImplemented; + +static PyObject* s_builtin_object; /* intern string '__builtins__' */ + +INITIALIZATIONFN +void psyco_pycompiler_init(void) +{ + s_builtin_object = PyString_InternFromString("__builtins__"); + + psyco_skZero .refcount1_flags = SkFlagFixed; + psyco_skZero .value = (long) 0; + psyco_skOne .refcount1_flags = SkFlagFixed; + psyco_skOne .value = (long) 1; + psyco_skNone .refcount1_flags = SkFlagFixed; + psyco_skNone .value = (long) Py_None; + psyco_skPy_False .refcount1_flags = SkFlagFixed; + psyco_skPy_False .value = (long) Py_False; + psyco_skPy_True .refcount1_flags = SkFlagFixed; + psyco_skPy_True .value = (long) Py_True; + psyco_skNotImplemented.refcount1_flags = SkFlagFixed; + psyco_skNotImplemented.value = (long) Py_NotImplemented; + + ERtPython = psyco_vsource_not_important; + EReturn = psyco_vsource_not_important; + EContinue = psyco_vsource_not_important; + EBreak = psyco_vsource_not_important; + EInline = psyco_vsource_not_important; +} + + + /***************************************************************/ +/*** Compiler ***/ + /***************************************************************/ + +#define CHKSTACK(n) extra_assert(0 <= po->pr.stack_level+(n) && \ + po->pr.stack_base+po->pr.stack_level+(n) < \ + po->vlocals.count) + +#define NEXTOP() (bytecode[next_instr++]) +#define NEXTARG() (next_instr += 2, \ + (bytecode[next_instr-1]<<8) + bytecode[next_instr-2]) + +#define PUSH(v) (CHKSTACK(0), stack_a[po->pr.stack_level++] = v) +#define POP(targ) (CHKSTACK(-1), targ = stack_a[--po->pr.stack_level], \ + stack_a[po->pr.stack_level] = NULL) +#define NTOP(n) (CHKSTACK(-(n)), stack_a[po->pr.stack_level-(n)]) +#define TOP() NTOP(1) +#define POP_DECREF() do { vinfo_t* v1; POP(v1); \ + vinfo_decref(v1, po); } while (0) + +/*#define GETCODEOBJ() ((PyCodeObject*)(KNOWN_SOURCE(LOC_CODE)->value))*/ +#define GETCONST(i) (PyTuple_GET_ITEM(co->co_consts, i)) +#define GETNAMEV(i) (PyTuple_GET_ITEM(co->co_names, i)) + +#define GETLOCAL(i) (LOC_LOCALS_PLUS[i]) +#define SETLOCAL(i, v) do { vinfo_decref(GETLOCAL(i), po); \ + GETLOCAL(i) = v; } while (0) + +#define STACK_POINTER() (stack_a + po->pr.stack_level) +#define INSTR_OFFSET() (next_instr) +#define STACK_LEVEL() (po->pr.stack_level) +#define JUMPBY(offset) (next_instr += (offset)) +#define JUMPTO(target) (next_instr = (target)) + +#define SAVE_NEXT_INSTR(nextinstr1) (po->pr.next_instr = (nextinstr1)) + +/* #define MISSING_OPCODE(opcode) */ +/* case opcode: */ +/* PycException_SetString(po, PyExc_PsycoError, */ +/* "opcode '" #opcode "' not implemented"); */ +/* break */ + + +/***************************************************************/ + /*** LOAD_GLOBAL tricks ***/ + + +static void mark_varying(PsycoObject* po, PyObject* key) +{ + RECLIMIT_SAFE_ENTER(); + if (po->pr.changing_globals == NULL) { + po->pr.changing_globals = PyDict_New(); + if (po->pr.changing_globals == NULL) + OUT_OF_MEMORY(); + } + if (PyDict_SetItem(po->pr.changing_globals, key, Py_True)) + OUT_OF_MEMORY(); + RECLIMIT_SAFE_LEAVE(); +} + +/* closure for the do_changed_global call-back */ +typedef struct { + PyObject* varname; + PyObject* previousvalue; + void* originalmacrocode; + PyDictObject* globals; +} changed_global_t; + +static code_t* do_changed_global(changed_global_t* cg) +{ + PyObject* key = cg->varname; + PyDictEntry* ep; + PyDictObject* globals = cg->globals; + + /* first check that the value really changed; it could merely + have moved in the dictionary table (reallocations etc.) */ + ep = (globals->ma_lookup)(globals, key, + ((PyStringObject*) key)->ob_shash); + + if (ep->me_value == cg->previousvalue) { + /* no real change; update the original macro code + and that's it */ + dictitem_update_nochange(cg->originalmacrocode, + globals, ep); + return psyco_dont_respawn(cg, sizeof(*cg)); + } + else { + /* real change: respawn */ + return psyco_do_respawn(cg, sizeof(*cg)); + } +} + +PyObject* psy_get_builtins(PyObject* globals) +{ + static PyObject* minimal_builtins = NULL; + PyObject* builtins; + /* code copied from frameobject.c */ + RECLIMIT_SAFE_ENTER(); + builtins = PyDict_GetItem((PyObject*) globals, s_builtin_object); + if (builtins) { + if (PyDict_Check(builtins)) + goto done; + if (PyModule_Check(builtins)) { + builtins = PyModule_GetDict(builtins); + if (builtins) { + psyco_assert(PyDict_Check(builtins)); + goto done; + } + } + } + /* No builtins! Make up a minimal one + Give them 'None', at least. */ + if (minimal_builtins == NULL) { + minimal_builtins = PyDict_New(); + if (minimal_builtins == NULL || + PyDict_SetItemString(minimal_builtins, + "None", Py_None) < 0) + OUT_OF_MEMORY(); + } + builtins = minimal_builtins; + done: + RECLIMIT_SAFE_LEAVE(); + return builtins; +} + + +#define GLOBAL_NAME_ERROR_MSG \ + "global name '%.200s' is not defined" +#define UNBOUNDLOCAL_ERROR_MSG \ + "local variable '%.200s' referenced before assignment" + +/* Load the global variable whose name is in 'key' (an interned string). + Returns a new reference to the result or NULL. */ +static PyObject* load_global(PsycoObject* po, PyObject* key, int next_instr) +{ + /* XXX this assumes that builtins never change, and that + no global variable shadowing a builtin variable is added + or removed after Psyco has compiled a piece of code. + + Idea of the current implementation: we perform now the + look-up in the globals() and remember where it was found + in the ma_table of the dictionary. We then emit machine + code that performs a speeded-up version of the lookup by + checking directly at that place if the same value is still + in place. If it is not, do_changed_global() is called. + It redoes a complete look-up, and if the value has merely + moved in the dictionary it updates the machine code. + If the value has really changed, a full respawn is + triggered, which will eventually cause load_global() to + be re-entered and detect_respawn() to succeed. At that + point we un-promote the variable from compile-time to + run-time. + + This requires knowledge of the internal workings of a + dictionary. + + This also assumes that a majority of global variables + never change, which should be the case (typically, + global functions, classes, etc. do not change). + + A more correct but more involved solution could be + implemented by adding to dictobject.c some kind of + 'on-change' hooks. The hooks might be called at any + time; we would then have to insert an espace sequence + inside of the machine code to trigger recompilation the + next time the execution reaches this point. This is not + easy to do because it must be done in a single byte to + prevent accidental overrides of the next instruction. + Processors typically have such a minimally-sized + instruction for debugging purposes but it is not + supposed to be used outside of debuggers -- it + triggers some kind of OS-dependent signal which must + be caught. Not portable at all. (insert dummy NOPs in + the first place to make room for a future JMP?) + */ + KNOWN_VAR(PyDictObject*, globals, LOC_GLOBALS); + PyDictEntry* ep; + PyObject* result; + + /* careful when respawning. The value could have been added or + deleted from the globals in the meantime. This is why we + cannot just do that in the "found in globals()" branch + below. */ + if (detect_respawn_ex(po)) { + /* respawning was triggered by the call to + psyco_prepare_respawn_ex() below */ + /* dictitem_check_change can use NEED_CC and + NEED_FREE_REG, further updating the state of po before + the actual jump to the respawn buffer. We emulate this + effect by calling dictitem_check_change() again here. */ + static PyDictObject* dummy_dict = NULL; + static PyDictEntry* dummy_entry = NULL; + if (dummy_entry == NULL) { + RECLIMIT_SAFE_ENTER(); + dummy_dict = (PyDictObject*) PyDict_New(); /* immortal */ + if (!dummy_dict || PyDict_SetItem( + (PyObject*) dummy_dict, Py_None, Py_None)) + OUT_OF_MEMORY(); + dummy_entry = (dummy_dict->ma_lookup)( + dummy_dict, Py_None, PyObject_Hash(Py_None)); + extra_assert(dummy_entry != NULL); + RECLIMIT_SAFE_LEAVE(); + } + dictitem_check_change(po, dummy_dict, dummy_entry); + /* end of respawning -- this dummy code will now be trashed */ + psyco_respawn_detected(po); + mark_varying(po, key); + return NULL; + } + if (po->pr.changing_globals != NULL && + PyDict_GetItem(po->pr.changing_globals, key) != NULL) + return NULL; /* we know the variable is changing */ + + /* the compiler only puts interned strings in op_names */ + extra_assert(PyString_CheckExact(key)); + /*extra_assert(((PyStringObject*) key)->ob_sinterned != NULL);*/ + extra_assert(((PyStringObject*) key)->ob_shash != -1); + + ep = (globals->ma_lookup)(globals, key, + ((PyStringObject*) key)->ob_shash); + if (ep->me_value != NULL) { + /* found in the globals() */ + changed_global_t* cg; + void* macrocode; + condition_code_t cc; + result = ep->me_value; + + macrocode = dictitem_check_change(po, globals, ep); + cc = DICT_ITEM_CHECK_CC; + cg = (changed_global_t*) psyco_prepare_respawn_ex(po, cc, + &do_changed_global, + sizeof(*cg)); + if (cg != NULL) { + cg->varname = key; Py_INCREF(key); + cg->previousvalue = result; Py_INCREF(result); + cg->originalmacrocode = macrocode; + cg->globals = globals; + } + } + else if (strcmp(PyString_AS_STRING(key), "__in_psyco__") == 0) { + /* special-case __in_psyco__ to always return 1, although + its value in the builtins is always 0. This variable + can be used by a function to know that it is compiled + by Psyco. */ + result = Py_True; + } + else { + /* no such global variable, get the builtins */ + if (po->pr.f_builtins == NULL) { + po->pr.f_builtins = psy_get_builtins((PyObject*)globals); + } + result = PyDict_GetItem(po->pr.f_builtins, key); + + if (result == NULL) { + /* name not found. Maybe it will exist at run-time + in the globals. Fall back to the safe + cimpl_load_global(). */ + return NULL; + } + } + Py_INCREF(result); + return result; +} + + +/***************************************************************/ + /*** Slicing ***/ + +static vinfo_t* _PsycoEval_SliceIndex(PsycoObject* po, vinfo_t* v) +{ + vinfo_t* result; + /* TypeSwitch */ + PyTypeObject* vtp = Psyco_NeedType(po, v); + if (vtp == NULL) + return NULL; + + if (PyType_TypeCheck(vtp, &PyInt_Type)) { + result = PsycoInt_AS_LONG(po, v); + vinfo_incref(result); + } + else if (PyType_TypeCheck(vtp, &PyLong_Type)) { + result = PsycoLong_AsLong(po, v); + if (result == NULL) { + vinfo_t* vi_zero; + PyObject* long_zero; + long x; + vinfo_t* v_err; + + /* catch PyExc_OverflowError */ + v_err = PycException_Matches(po, PyExc_OverflowError); + if (runtime_NON_NULL_t(po, v_err) != true) + return NULL; + + /* It's an overflow error, so we need to + check the sign of the long integer, + set the value to INT_MAX or 0, and clear + the error. */ + PycException_Clear(po); + + long_zero = PyLong_FromLong(0L); + if (long_zero == NULL) + OUT_OF_MEMORY(); + vi_zero = vinfo_new(CompileTime_NewSk(sk_new + ((long) long_zero, SkFlagPyObj))); + result = PsycoObject_RichCompareBool(po, v, vi_zero, + Py_GT); + vinfo_decref(vi_zero, po); + switch (runtime_NON_NULL_t(po, result)) { + case true: + x = INT_MAX; + break; + case false: + x = LARGE_NEG_LONG_AS_SLICE_INDEX; + break; + default: + return NULL; + } + result = vinfo_new(CompileTime_New(x)); + } + } +#if HAVE_NB_INDEX + else if (PsycoIndex_Check(vtp)) { + result = psyco_generic_call(po, PyNumber_AsSsize_t, + CfReturnNormal|CfPyErrCheckMinus1, + "vl", v, (long) NULL); + } +#endif + else { + /* no error set */ + result = NULL; + } + return result; +} + +static vinfo_t* psyco_apply_slice(PsycoObject* po, vinfo_t* u, + vinfo_t* v, vinfo_t* w) +{ /* u[v:w] */ + PyTypeObject *tp; + PySequenceMethods *sq; + + tp = Psyco_NeedType(po, u); + if (tp == NULL) + return NULL; + sq = tp->tp_as_sequence; + + if (sq && sq->sq_slice) { + vinfo_t* ilow; + vinfo_t* ihigh; + if (v == NULL) { + ilow = psyco_vi_Zero(); + } + else { + ilow = _PsycoEval_SliceIndex(po, v); + if (ilow == NULL) { + if (PycException_Occurred(po)) + return NULL; + goto with_slice_object; + } + } + if (w == NULL) + ihigh = vinfo_new(CompileTime_New(INT_MAX)); + else { + ihigh = _PsycoEval_SliceIndex(po, w); + if (ihigh == NULL) { + vinfo_decref(ilow, po); + if (PycException_Occurred(po)) + return NULL; + goto with_slice_object; + } + } + u = PsycoSequence_GetSlice(po, u, ilow, ihigh); + vinfo_decref(ihigh, po); + vinfo_decref(ilow, po); + return u; + } + + with_slice_object: + { + char modes[4]; + vinfo_t* vslice; + modes[0] = v == NULL ? 'l' : 'v'; + modes[1] = w == NULL ? 'l' : 'v'; + modes[2] = 'l'; + modes[3] = 0; + vslice = psyco_generic_call(po, PySlice_New, + CfReturnRef|CfPyErrIfNull, + modes, v, w, NULL); + if (vslice != NULL) { + Psyco_AssertType(po, vslice, &PySlice_Type); + u = PsycoObject_GetItem(po, u, vslice); + vinfo_decref(vslice, po); + return u; + } + else + return NULL; + } +} + +static bool psyco_assign_slice(PsycoObject* po, vinfo_t* u, + vinfo_t* v, vinfo_t* w, vinfo_t* x) +{ /* u[v:w] = x or del u[v:w] if x==NULL */ + PyTypeObject *tp; + PySequenceMethods *sq; + bool ok; + + tp = Psyco_NeedType(po, u); + if (tp == NULL) + return false; + sq = tp->tp_as_sequence; + + if (sq && sq->sq_slice) { + vinfo_t* ilow; + vinfo_t* ihigh; + if (v == NULL) { + ilow = psyco_vi_Zero(); + } + else { + ilow = _PsycoEval_SliceIndex(po, v); + if (ilow == NULL) { + if (PycException_Occurred(po)) + return false; + goto with_slice_object; + } + } + if (w == NULL) + ihigh = vinfo_new(CompileTime_New(INT_MAX)); + else { + ihigh = _PsycoEval_SliceIndex(po, w); + if (ihigh == NULL) { + vinfo_decref(ilow, po); + if (PycException_Occurred(po)) + return false; + goto with_slice_object; + } + } + ok = PsycoSequence_SetSlice(po, u, ilow, ihigh, x); + vinfo_decref(ihigh, po); + vinfo_decref(ilow, po); + return ok; + } + + with_slice_object: + { + char modes[4]; + vinfo_t* vslice; + modes[0] = v == NULL ? 'l' : 'v'; + modes[1] = w == NULL ? 'l' : 'v'; + modes[2] = 'l'; + modes[3] = 0; + vslice = psyco_generic_call(po, PySlice_New, + CfReturnRef|CfPyErrIfNull, + modes, v, w, NULL); + if (vslice != NULL) { + Psyco_AssertType(po, vslice, &PySlice_Type); + ok = PsycoObject_SetItem(po, u, vslice, x); + vinfo_decref(vslice, po); + return ok; + } + else + return false; + } +} + +#define CALL_FLAG_VAR 1 +#define CALL_FLAG_KW 2 +static vinfo_t* psyco_ext_do_calls(PsycoObject* po, int opcode, int oparg, + vinfo_t** stack_top, int* stack_to_pop) +{ + int na = oparg & 0xff; + int nk = (oparg>>8) & 0xff; + int flags = (opcode - CALL_FUNCTION) & 3; + int n = na + 2 * nk; + vinfo_t** args; + vinfo_t* vargs = NULL; + vinfo_t* wdict = NULL; + vinfo_t* result = NULL; + + if (flags & CALL_FLAG_VAR) + n++; + if (flags & CALL_FLAG_KW) + n++; + args = stack_top - n; + *stack_to_pop = n+1; + + /* reminder: the stack layout, top-to-bottom, is: + + - keyword dictionary (for '**kw' call syntax) + - arguments tuple (for '*args' call syntax) + - kw value (nk-1) + - kw key (nk-1) + ... + - kw value (0) + - kw key (0) + - argument value (na-1) + ... + - argument value (0) + - callable object + + We use 'n' as the current stack depth (not including + the callable object) while processing arguments. + */ + + /* keyword arguments */ + if (nk == 0 && !(flags & CALL_FLAG_KW)) + wdict = psyco_vi_Zero(); /* no keyword arguments */ + else { + int i; + if (flags & CALL_FLAG_KW) { /* '**kw' call syntax */ + vinfo_t* w = args[--n]; /* pop keyword dictionary */ + /* check that it is a dictionary */ + switch (Psyco_VerifyType(po, w, &PyDict_Type)) { + case true: /* fine */ + break; + case false: /* not a dict */ + /* don't bother displaying the function name + which might not be known yet */ + PycException_SetString(po, PyExc_TypeError, + "argument after ** " + "must be a dictionary"); + default: /* fall through */ + goto fail; + } + if (nk != 0) { + /* make a copy of the dictionary; + the original one must not be modified */ + wdict = PsycoDict_Copy(po, w); + } + else { + wdict = w; + vinfo_incref(wdict); + } + } + else + wdict = PsycoDict_New(po); + + if (wdict == NULL) + goto fail; + + /* update 'wdict' with the explicit keyword arguments */ + /* XXX do something closer to + update_keyword_args() in ceval.c, e.g. + check for duplicate keywords */ + for (i = na + 2*nk; i > na; ) { + i -= 2; + if (!psyco_generic_call(po, PyDict_SetItem, + CfNoReturnValue|CfPyErrIfNonNull, + "vvv", wdict, args[i], args[i+1])) + break; + } + } + + /* non-keyword arguments */ + vargs = PsycoTuple_New(na, args); /* virtual tuple */ + + if (flags & CALL_FLAG_VAR) { + vinfo_t* vtotal; + vinfo_t* v = args[--n]; /* pop argument tuple */ + PyTypeObject* vt = Psyco_NeedType(po, v); + if (vt == NULL) + goto fail; + if (!PyType_TypeCheck(vt, &PyTuple_Type)) { + /* 'v' is not a tuple */ + v = PsycoSequence_Tuple(po, v); + if (v == NULL) { + /* catch PyExc_TypeError */ + v = PycException_Matches(po, PyExc_TypeError); + if (runtime_NON_NULL_t(po, v) != true) + goto fail; + + PycException_SetString(po, PyExc_TypeError, + "argument after * " + "must be a sequence"); + goto fail; + } + } + else + vinfo_incref(v); + + vtotal = PsycoTuple_Concat(po, vargs, v); + vinfo_decref(v, po); + vinfo_decref(vargs, po); + vargs = vtotal; + if (vargs == NULL) + goto fail; + } + + result = PsycoObject_Call(po, args[-1], vargs, wdict); + /* fall through */ + fail: + vinfo_xdecref(vargs, po); + vinfo_xdecref(wdict, po); + return result; +} + + +/***************************************************************/ + /*** Run-time implementation of various opcodes ***/ + +/* the code of the following functions is "copy-pasted" from ceval.c */ + +static PyObject* cimpl_load_global(PyObject* globals, PyObject* w) +{ + PyObject* x; + RECLIMIT_SAFE_ENTER(); + x = PyDict_GetItem(globals, w); + if (x == NULL) { + x = PyDict_GetItem(psy_get_builtins(globals), w); + if (x == NULL) { + char* obj_str = PyString_AsString(w); + if (obj_str) + PyErr_Format(PyExc_NameError, + GLOBAL_NAME_ERROR_MSG, + obj_str); + RECLIMIT_SAFE_LEAVE(); + return NULL; + } + } + RECLIMIT_SAFE_LEAVE(); + Py_INCREF(x); + return x; +} + +static int cimpl_print_expr(PyObject* v) +{ + PyObject* x; + PyObject* w = PySys_GetObject("displayhook"); + if (w == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "lost sys.displayhook"); + return -1; + } + x = Py_BuildValue("(O)", v); + if (x == NULL) + return -1; + w = PyEval_CallObject(w, x); + Py_XDECREF(w); + Py_DECREF(x); + if (w == NULL) + return -1; + return 0; +} + +static int cimpl_print_item_to(PyObject* v, PyObject* stream) +{ + /* XXX update to Python 2.3's implementation */ + if (stream == NULL || stream == Py_None) { + stream = PySys_GetObject("stdout"); + if (stream == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "lost sys.stdout"); + return -1; + } + } + if (PyFile_SoftSpace(stream, 1)) + if (PyFile_WriteString(" ", stream)) + return -1; + if (PyFile_WriteObject(v, stream, Py_PRINT_RAW)) + return -1; + if (PyString_Check(v)) { + /* move into writeobject() ? */ + char *s = PyString_AsString(v); + int len = PyString_Size(v); + if (len > 0 && + isspace(Py_CHARMASK(s[len-1])) && + s[len-1] != ' ') + PyFile_SoftSpace(stream, 0); + } + return 0; +} + +static int cimpl_print_newline_to(PyObject* stream) +{ + if (stream == NULL || stream == Py_None) { + stream = PySys_GetObject("stdout"); + if (stream == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "lost sys.stdout"); + return -1; + } + } + if (PyFile_WriteString("\n", stream)) + return -1; + PyFile_SoftSpace(stream, 0); + return 0; +} + +static int cimpl_unpack_iterable(PyObject* v, int argcnt, PyObject** sp) +{ + int i = 0; + PyObject *it; /* iter(v) */ + PyObject *w; + + extra_assert(v != NULL); + + it = PyObject_GetIter(v); + if (it == NULL) + goto Error; + + for (; i < argcnt; i++) { + w = PyIter_Next(it); + if (w == NULL) { + /* Iterator done, via error or exhaustion. */ + if (!PyErr_Occurred()) { + PyErr_Format(PyExc_ValueError, + "need more than %d value%s to unpack", + i, i == 1 ? "" : "s"); + } + goto Error; + } + *sp++ = w; + } + + /* We better have exhausted the iterator now. */ + w = PyIter_Next(it); + if (w == NULL) { + if (PyErr_Occurred()) + goto Error; + Py_DECREF(it); + return 0; + } + PyErr_SetString(PyExc_ValueError, "too many values to unpack"); + Py_DECREF(w); + /* fall through */ +Error: + for (; i > 0; i--) { + --sp; + Py_DECREF(*sp); + } + Py_XDECREF(it); + return -1; +} + +static int cimpl_unpack_list(PyObject* listobject, int argcnt, PyObject** sp) +{ + int i; + extra_assert(PyList_Check(listobject)); + + if (PyList_GET_SIZE(listobject) != argcnt) { + PyErr_SetString(PyExc_ValueError, "unpack list of wrong size"); + return -1; + } + for (i=argcnt; i--; ) { + PyObject* v = sp[i] = PyList_GET_ITEM(listobject, i); + Py_INCREF(v); + } + return 0; +} + +/* Logic for the raise statement. + XXX a meta-implementation would be nice (e.g. to know at compile-time + which exception class we got, so that we can know at compile-time which + except: statements match) */ +static void cimpl_do_raise(PyObject *type, PyObject *value, PyObject *tb) +{ + if (type == NULL) { + /* Reraise */ + PyThreadState *tstate = PyThreadState_Get(); + type = tstate->exc_type == NULL ? Py_None : tstate->exc_type; + value = tstate->exc_value; + tb = tstate->exc_traceback; + } + + /* unlike the ceval.c version, this never consumes a reference + to its arguments (psyco_generic_call cannot handle this). */ + Py_XINCREF(type); + Py_XINCREF(value); + Py_XINCREF(tb); + + /* We support the following forms of raise: + raise , + raise , + raise , None + raise , + raise , None + raise , + raise , None + + An omitted second argument is the same as None. + + In addition, raise , is the same as + raising the tuple's first item (and it better have one!); + this rule is applied recursively. + + Finally, an optional third argument can be supplied, which + gives the traceback to be substituted (useful when + re-raising an exception after examining it). */ + + /* First, check the traceback argument, replacing None with + NULL. */ + if (tb == Py_None) { + Py_DECREF(tb); + tb = NULL; + } + else if (tb != NULL && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + + /* Next, replace a missing value with None */ + if (value == NULL) { + value = Py_None; + Py_INCREF(value); + } + + /* Next, repeatedly, replace a tuple exception with its first item */ + while (PyTuple_Check(type) && PyTuple_Size(type) > 0) { + PyObject *tmp = type; + type = PyTuple_GET_ITEM(type, 0); + Py_INCREF(type); + Py_DECREF(tmp); + } + + if (PyString_CheckExact(type)) + /* warning skipped */; + + else if (PyExceptionClass_Check(type)) + PyErr_NormalizeException(&type, &value, &tb); + + else if (PyExceptionInstance_Check(type)) { + /* Raising an instance. The value should be a dummy. */ + if (value != Py_None) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + else { + /* Normalize to raise , */ + Py_DECREF(value); + value = type; + type = PyExceptionInstance_Class(type); + Py_INCREF(type); + } + } + else { + /* Not something you can raise. You get an exception + anyway, just not what you specified :-) */ + PyErr_Format(PyExc_TypeError, + "exceptions must be classes, instances, or " + "strings (deprecated), not %s", + type->ob_type->tp_name); + goto raise_error; + } + PyErr_Restore(type, value, tb); + /*if (tb == NULL) + return WHY_EXCEPTION; + else + return WHY_RERAISE;*/ + return; + + raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + /*return WHY_EXCEPTION;*/ +} + +/* copied from ceval.c where it is private */ +static PyObject* +cimpl_build_class(PyObject* g, /* globals */ + PyObject *methods, PyObject *bases, PyObject *name) +{ + PyObject *metaclass = NULL, *result, *base; + + if (PyDict_Check(methods)) + metaclass = PyDict_GetItemString(methods, "__metaclass__"); + if (metaclass != NULL) + Py_INCREF(metaclass); + else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) { + base = PyTuple_GET_ITEM(bases, 0); + metaclass = PyObject_GetAttrString(base, "__class__"); + if (metaclass == NULL) { + PyErr_Clear(); + metaclass = (PyObject *)base->ob_type; + Py_INCREF(metaclass); + } + } + else { + /*if (g != NULL && PyDict_Check(g))*/ + metaclass = PyDict_GetItemString(g, "__metaclass__"); + if (metaclass == NULL) + metaclass = (PyObject *) &PyClass_Type; + Py_INCREF(metaclass); + } + result = PyObject_CallFunction(metaclass, "OOO", + name, bases, methods); + Py_DECREF(metaclass); + return result; +} + +static PyObject* cimpl_import_name(PyObject* globals, PyObject* name, + PyObject* fromlist +#if VERYCONVOLUTED_IMPORT_NAME + , PyObject* fitharg +#endif + ) +{ + PyObject* w; + PyObject* x = PyDict_GetItemString(psy_get_builtins(globals), + "__import__"); + if (x == NULL) { + PyErr_SetString(PyExc_ImportError, + "__import__ not found"); + return NULL; + } +#if VERYCONVOLUTED_IMPORT_NAME + if (PyInt_AsLong(fitharg) != -1 || PyErr_Occurred()) + w = PyTuple_Pack(5, + name, + globals, + Py_None, + fromlist, + fitharg); + else +#endif + w = Py_BuildValue("(OOOO)", + name, + globals, + Py_None, + fromlist); + if (w == NULL) + return NULL; + x = PyEval_CallObject(x, w); + Py_DECREF(w); + return x; +} + +static int cimpl_import_all_from(PyObject *locals, PyObject *v) +{ + PyObject *all = PyObject_GetAttrString(v, "__all__"); + PyObject *dict, *name, *value; + int skip_leading_underscores = 0; + int pos, err; + + if (all == NULL) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) + return -1; /* Unexpected error */ + PyErr_Clear(); + dict = PyObject_GetAttrString(v, "__dict__"); + if (dict == NULL) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) + return -1; + PyErr_SetString(PyExc_ImportError, + "from-import-* object has no __dict__ and no __all__"); + return -1; + } + all = PyMapping_Keys(dict); + Py_DECREF(dict); + if (all == NULL) + return -1; + skip_leading_underscores = 1; + } + + for (pos = 0, err = 0; ; pos++) { + name = PySequence_GetItem(all, pos); + if (name == NULL) { + if (!PyErr_ExceptionMatches(PyExc_IndexError)) + err = -1; + else + PyErr_Clear(); + break; + } + if (skip_leading_underscores && + PyString_Check(name) && + PyString_AS_STRING(name)[0] == '_') + { + Py_DECREF(name); + continue; + } + value = PyObject_GetAttr(v, name); + if (value == NULL) + err = -1; + else + err = PyDict_SetItem(locals, name, value); + Py_DECREF(name); + Py_XDECREF(value); + if (err != 0) + break; + } + Py_DECREF(all); + return err; +} + + + /***************************************************************/ +/*** Main loop ***/ + /***************************************************************/ + +static bool compute_and_raise_exception(PsycoObject* po) +{ + /* &ERtPython is the case where the code that raised + the Python exception is already written, e.g. when + we called a function in the Python interpreter which + raised an exception. */ + if (!PycException_Is(po, &ERtPython)) { + /* In the other cases (virtual exception), + compute and raise the exception now. */ + char args[4]; + args[3] = 0; + if (po->pr.tb == NULL) + args[2] = 'l'; + else { + args[2] = 'v'; + consume_reference(po, po->pr.tb); + } + if (po->pr.val == NULL) + args[1] = 'l'; + else { + args[1] = 'v'; + consume_reference(po, po->pr.val); + } + args[0] = 'v'; + consume_reference(po, po->pr.exc); + return (psyco_generic_call(po, PyErr_Restore, + CfNoReturnValue, args, + po->pr.exc, po->pr.val, + po->pr.tb) != NULL); + } + else + return true; +} + +static code_t* exit_function(PsycoObject* po) +{ + vinfo_t** locals_plus; + vinfo_t** pp; + Source retsource; + extra_assert(!po->pr.is_inlining); + + /* clear the stack and the locals */ + locals_plus = LOC_LOCALS_PLUS; + for (pp = po->vlocals.items + po->vlocals.count; --pp >= locals_plus; ) + if (*pp != NULL) { + vinfo_decref(*pp, po); + *pp = NULL; + } + + if (PycException_Is(po, &EReturn)) { + /* load the return value */ + vinfo_t* retval = po->pr.val; + extra_assert(retval != NULL); + if (!compute_vinfo(retval, po)) return NULL; + /* return a new reference */ + consume_reference(po, retval); + if (retval->array->count > 0) { + array_delete(retval->array, po); + retval->array = NullArray; + } + retsource = retval->source; + } + else { + if (!compute_and_raise_exception(po)) + return NULL; + clear_pseudo_exception(po); + sk_incref(&psyco_skZero); + retsource = CompileTime_NewSk(&psyco_skZero); /*to return NULL */ + } + + return psyco_finish_return(po, retsource); +} + + +/***************************************************************/ + /*** the main loop of the interpreter/compiler. ***/ + +/* psyco_pycompiler_mainloop() compiles the function using psyco_core_mainloop() + writing function entry and exit points if needed, and destroys 'po' when + it is done */ +DEFINEFN +code_t* psyco_pycompiler_mainloop(PsycoObject* po) +{ + /* 'stack_a' is the Python stack base pointer */ + vinfo_t** stack_a = po->vlocals.items + po->pr.stack_base; + int opcode=0; /* Current opcode */ + int oparg=0; /* Current opcode argument, if any */ + code_t* code1; + + /* save and restore the current Python exception throughout compilation */ + PyObject *old_py_exc, *old_py_val, *old_py_tb; + PyErr_Fetch(&old_py_exc, &old_py_val, &old_py_tb); + + if ((psyco_mp_flags(po->pr.merge_points) & MP_FLAGS_HAS_EXCEPT) != 0 && + (LOC_CONTINUATION->array == NullArray)) { + /* for functions that have "try: except:" blocks, we reserve some room + in the stack to store the previous tstate->exc_xxx if an exception + is raised and catched. This space plays the role of Python's + PyFrameObject::f_exc_xxx fields. */ + psyco_emit_header(po, 3); + } + + while (po->pr.next_instr != -1) + { + /* 'co' is the code object we are interpreting/compiling */ + PyCodeObject* co = po->pr.co; + unsigned char* bytecode = (unsigned char*) PyString_AS_STRING(co->co_code); + vinfo_t *u, *v, /* temporary objects */ + *w, *x; /* popped off the stack */ + condition_code_t cc; + /* 'next_instr' is the position in the byte-code of the next instr */ + int next_instr = po->pr.next_instr; + mergepoint_t* mp = psyco_next_merge_point(po->pr.merge_points, + next_instr+1); + + /* trace each code block entry point */ + TRACE_EXECUTION_NOERR("ENTER_MAINLOOP"); + + /* main loop */ + while (1) { + + extra_assert(!PycException_Occurred(po)); + psyco_assert_coherent(po); /* this test is expensive */ + + /* are we potentially running out of stack space? */ + CHECK_STACK_SPACE(); + + /* save 'next_instr' and 'respawn_cnt' */ + SAVE_NEXT_INSTR(next_instr); /* could be optimized, not needed in the + case of an opcode that cannot set + run-time conditions */ + + opcode = NEXTOP(); + if (HAS_ARG(opcode)) + oparg = NEXTARG(); + dispatch_opcode: + + /* Main switch on opcode */ + + /* !!IMPORTANT!! + No operation with side-effects must be performed before we are + sure the compilation of the current instruction succeeded! + Indeed, if the compilation is interrupted by a C++ exception, + it will be restarted by re-running psyco_pycompiler_mainloop() + and this will restart the compilation of the instruction from + the beginning. In particular, use POP() with care. Better use + TOP() to get the arguments off the stack and call POP() at the + end when you are sure everything when fine. */ + + /* All opcodes found here must also be listed in mergepoints.c. + Python code objects using a bytecode instruction not listed + in mergepoints.c are never Psyco-ified. */ + + switch (opcode) { + + /* case STOP_CODE: this is an error! */ + + case POP_TOP: + POP_DECREF(); + goto fine; + + case ROT_TWO: + POP(v); + POP(w); + PUSH(v); + PUSH(w); + goto fine; + + case ROT_THREE: + POP(v); + POP(w); + POP(x); + PUSH(v); + PUSH(x); + PUSH(w); + goto fine; + + case ROT_FOUR: + POP(u); + POP(v); + POP(w); + POP(x); + PUSH(u); + PUSH(x); + PUSH(w); + PUSH(v); + goto fine; + + case DUP_TOP: + v = TOP(); + vinfo_incref(v); + PUSH(v); + goto fine; + + case DUP_TOPX: + { + int i; + for (i=0; i b->b_level) { + POP(v); + vinfo_decref(v, po); + } + goto fine; + } + + case END_FINALLY: + /* First make extra sure no exception is pending */ + if (PycException_Occurred(po)) + Py_FatalError("psyco: undetected exception " + "in END_FINALLY"); + POP(v); + if (psyco_knowntobe(v, (long) Py_None)) { + /* 'None' on the stack, it is the end of a finally + block with no exception raised */ + vinfo_decref(v, po); + goto fine; + } + if (Psyco_KnownType(v) == &PyTuple_Type && + PsycoTuple_Load(v) == 3) { + /* 'v' is a 3- tuple. As no real Python exception is + a tuple object we are sure it comes from a + finally block (see the SETUP_FINALLY stack unwind + code at the end of pycompiler.c) */ + /* Re-raise the pseudo exception. This will re-raise + exceptions like EReturn as well. */ + po->pr.exc = PsycoTuple_GET_ITEM(v, 0); + PsycoTuple_GET_ITEM(v, 0) = NULL; + po->pr.val = PsycoTuple_GET_ITEM(v, 1); + PsycoTuple_GET_ITEM(v, 1) = NULL; + po->pr.tb = PsycoTuple_GET_ITEM(v, 2); + PsycoTuple_GET_ITEM(v, 2) = NULL; + vinfo_decref(v, po); + break; + } + else { + /* end of an EXCEPT block, re-raise the exception + stored in the stack. As in Python, no extra + traceback is recorded, but instead of the + WHY_RERAISE trick we simply record no traceback + if the opcode is END_FINALLY. */ + po->pr.exc = v; + POP(po->pr.val); + POP(po->pr.tb); + break; + } + + case BUILD_CLASS: + x = psyco_generic_call(po, cimpl_build_class, + CfReturnRef|CfPyErrIfNull, + "vvvv", LOC_GLOBALS, + NTOP(1), NTOP(2), NTOP(3)); + if (x == NULL) + break; + POP_DECREF(); + POP_DECREF(); + POP_DECREF(); + PUSH(x); + goto fine; + + case UNPACK_SEQUENCE: + { + int i; + void* cimpl_unpack; + PyTypeObject* vtp; + + v = TOP(); + vtp = Psyco_NeedType(po, v); + if (vtp == NULL) + break; + + if (PyType_TypeCheck(vtp, &PyTuple_Type)) { + /* shortcut: is this a virtual tuple? + of the correct length? */ + if (PsycoTuple_Load(v) != oparg) { + + /* No, fall back to the default path: + load the size, compare it with oparg, + and if they match proceed by loading the + tuple item by item into the stack. */ + vinfo_t* vsize; + vsize = psyco_get_const(po, v, FIX_size); + if (vsize == NULL) + break; + + /* check the size */ + cc = integer_cmp_i(po, vsize, oparg, Py_NE); + if (cc == CC_ERROR) + break; + if (runtime_condition_f(po, cc)) { + PycException_SetString(po, + PyExc_ValueError, + "unpack tuple of wrong size"); + break; + } + + /* make sure the tuple data is loaded */ + for (i=oparg; i--; ) { + w = psyco_get_nth_const(po, v, + TUPLE_ob_item, + i); + if (w == NULL) + break; + } + if (i >= 0) + break; + } + /* copy the tuple items into the stack */ + POP(v); + for (i=oparg; i--; ) { + w = PsycoTuple_GET_ITEM(v, i); + vinfo_incref(w); + PUSH(w); + /* in case the tuple is freed while its items + are still in use: */ + need_reference(po, w); + } + vinfo_decref(v, po); + goto fine; + + } + + if (PyType_TypeCheck(vtp, &PyList_Type)) + cimpl_unpack = cimpl_unpack_list; + else + cimpl_unpack = cimpl_unpack_iterable; + + { + vinfo_array_t* array = array_new(oparg); + if (!psyco_generic_call(po, cimpl_unpack, + CfNoReturnValue|CfPyErrIfNonNull, + "vlA", v, oparg, array)) { + array_release(array); + break; + } + POP_DECREF(); + for (i=oparg; i--; ) + PUSH(array->items[i]); + array_release(array); + goto fine; + } + } + + case STORE_ATTR: + { + bool ok; + w = vinfo_new(CompileTime_New(((long) GETNAMEV(oparg)))); + ok = PsycoObject_SetAttr(po, TOP(), w, NTOP(2)); /* v.w = u */ + vinfo_decref(w, po); + if (!ok) + break; + POP_DECREF(); + POP_DECREF(); + goto fine; + } + + case DELETE_ATTR: + { + bool ok; + w = vinfo_new(CompileTime_New(((long) GETNAMEV(oparg)))); + ok = PsycoObject_SetAttr(po, TOP(), w, NULL); /* del v.w */ + vinfo_decref(w, po); + if (!ok) + break; + POP_DECREF(); + goto fine; + } + + case STORE_NAME: + /* only for modules: we can only reach this point + for code objects compiled from frames where + f_locals == f_globals */ + /* fall through */ + case STORE_GLOBAL: + { + PyObject* w = GETNAMEV(oparg); + mark_varying(po, w); + if (!psyco_generic_call(po, PyDict_SetItem, + CfNoReturnValue|CfPyErrIfNonNull, + "vlv", LOC_GLOBALS, w, TOP())) + break; + POP_DECREF(); + goto fine; + } + + case DELETE_NAME: + /* only for modules: we can only reach this point + for code objects compiled from frames where + f_locals == f_globals */ + /* fall through */ + case DELETE_GLOBAL: + { + PyObject* w = GETNAMEV(oparg); + mark_varying(po, w); + if (runtime_NON_NULL_f(po, psyco_generic_call(po, PyDict_DelItem, + CfReturnNormal, "vl", LOC_GLOBALS, w))) { + PycException_SetFormat(po, PyExc_NameError, + GLOBAL_NAME_ERROR_MSG, + PyString_AsString(w)); + break; + } + goto fine; + } + + case LOAD_CONST: + /* reference borrowed from the code object */ + v = vinfo_new(CompileTime_New((long) GETCONST(oparg))); + PUSH(v); + goto fine; + + case LOAD_NAME: + /* only for modules: we can only reach this point + for code objects compiled from frames where + f_locals == f_globals */ + /* fall through */ + case LOAD_GLOBAL: + { + PyObject* namev = GETNAMEV(oparg); + PyObject* value; + if (is_compiletime(LOC_GLOBALS->source)) { + /* Common case: fast global loading */ + value = load_global(po, namev, next_instr); + if (value != NULL) { + /* success */ + v = vinfo_new(CompileTime_NewSk( + sk_new((long) value, SkFlagPyObj))); + PUSH(v); + goto fine; + } + /* else { variable not found at all, + or the global has been marked as varying } */ + } + /* else { Globals dict is unknown at compile-time } */ + v = psyco_generic_call(po, cimpl_load_global, + CfReturnRef|CfPyErrIfNull, + "vl", LOC_GLOBALS, namev); + if (v == NULL) + break; + PUSH(v); + goto fine; + } + + case LOAD_FAST: + x = GETLOCAL(oparg); + /* a local variable can only be unbound if its + value is known to be (PyObject*)NULL. A run-time + or virtual value is always non-NULL. */ + if (psyco_knowntobe(x, 0)) { + PyObject* namev; + namev = PyTuple_GetItem(co->co_varnames, oparg); + PycException_SetFormat(po, PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, + PyString_AsString(namev)); + break; + } + vinfo_incref(x); + PUSH(x); + goto fine; + + case STORE_FAST: + POP(v); + SETLOCAL(oparg, v); + goto fine; + + case DELETE_FAST: + x = GETLOCAL(oparg); + /* a local variable can only be unbound if its + value is known to be (PyObject*)NULL. A run-time + or virtual value is always non-NULL. */ + if (psyco_knowntobe(x, 0)) { + PyObject* namev; + namev = PyTuple_GetItem(co->co_varnames, oparg); + PycException_SetFormat(po, PyExc_UnboundLocalError, + UNBOUNDLOCAL_ERROR_MSG, + PyString_AsString(namev)); + break; + } + + u = psyco_vi_Zero(); + SETLOCAL(oparg, u); + goto fine; + + /*MISSING_OPCODE(LOAD_CLOSURE); + MISSING_OPCODE(LOAD_DEREF); + MISSING_OPCODE(STORE_DEREF);*/ + + case BUILD_TUPLE: + v = PsycoTuple_New(oparg, STACK_POINTER() - oparg); + while (oparg--) + POP_DECREF(); + PUSH(v); + goto fine; + + case BUILD_LIST: + v = PsycoList_New(po, oparg, STACK_POINTER() - oparg); + if (v == NULL) + break; + while (oparg--) + POP_DECREF(); + PUSH(v); + goto fine; + + case BUILD_MAP: + v = PsycoDict_New(po); + if (v == NULL) + break; + PUSH(v); + goto fine; + + case LOAD_ATTR: + w = vinfo_new(CompileTime_New(((long) GETNAMEV(oparg)))); + x = PsycoObject_GetAttr(po, TOP(), w); /* v.w */ + vinfo_decref(w, po); + if (x == NULL) + break; + POP_DECREF(); + PUSH(x); + goto fine; + + case COMPARE_OP: + { + condition_code_t cc = CC_ERROR; + w = TOP(); + v = NTOP(2); + switch (oparg) { + + case PyCmp_IS: /* pointer comparison */ + cc = integer_cmp(po, v, w, Py_EQ); + break; + + case PyCmp_IS_NOT: /* pointer comparison */ + cc = integer_cmp(po, v, w, Py_NE); + break; + + case PyCmp_IN: + case PyCmp_NOT_IN: + x = PsycoSequence_Contains(po, w, v); + cc = integer_NON_NULL(po, x); + if (oparg == PyCmp_NOT_IN && cc != CC_ERROR) + cc = INVERT_CC(cc); + break; + + case PyCmp_EXC_MATCH: + x = psyco_generic_call(po, PyErr_GivenExceptionMatches, + CfPure|CfReturnNormal, + "vv", v, w); + cc = integer_NON_NULL(po, x); + break; + + default: + x = PsycoObject_RichCompare(po, v, w, oparg); + goto compare_done; + } + + if (cc == CC_ERROR) + break; + + /* turns 'cc' into a virtual Python boolean object */ + x = PsycoBool_FromCondition(po, cc); + + compare_done: + if (x == NULL) + break; + POP_DECREF(); + POP_DECREF(); + PUSH(x); /* consumes ref on x */ + goto fine; + } + + case IMPORT_NAME: + { + PyObject* w = GETNAMEV(oparg); +#if !VERYCONVOLUTED_IMPORT_NAME /* Python < 2.5 */ + x = psyco_generic_call(po, cimpl_import_name, + CfReturnRef|CfPyErrIfNull, + "vlv", LOC_GLOBALS, w, TOP()); + if (x == NULL) + break; + POP_DECREF(); +#else + v = TOP(); + u = NTOP(2); + x = psyco_generic_call(po, cimpl_import_name, + CfReturnRef|CfPyErrIfNull, + "vlvv", LOC_GLOBALS, w, v, u); + if (x == NULL) + break; + POP_DECREF(); + POP_DECREF(); +#endif + PUSH(x); + goto fine; + } + + case IMPORT_STAR: + { + /* only for modules: we can only reach this point + for code objects compiled from frames where + f_locals == f_globals */ + x = psyco_generic_call(po, cimpl_import_all_from, + CfReturnNormal|CfPyErrIfNonNull, + "vv", LOC_GLOBALS, TOP()); + if (x == NULL) + break; + vinfo_decref(x, po); + POP_DECREF(); + goto fine; + } + + case IMPORT_FROM: + { + PyObject* name = GETNAMEV(oparg); + w = vinfo_new(CompileTime_New(((long) name))); + v = TOP(); + x = PsycoObject_GetAttr(po, v, w); + vinfo_decref(w, po); + if (x == NULL) { + extra_assert(PycException_Occurred(po)); + + /* catch PyExc_AttributeError */ + v = PycException_Matches(po, PyExc_AttributeError); + if (runtime_NON_NULL_t(po, v) == true) { + PycException_SetFormat(po, PyExc_ImportError, + "cannot import name %.230s", + PyString_AsString(name)); + } + break; + } + PUSH(x); + goto fine; + } + + case JUMP_FORWARD: + JUMPBY(oparg); + mp = psyco_next_merge_point(po->pr.merge_points, next_instr); + goto fine; + + case JUMP_IF_TRUE: + case JUMP_IF_FALSE: + /* This code is very different from the original + interpreter's, because we generally do not know the + outcome of PyObject_IsTrue(). In the case of JUMP_IF_xxx + we must be prepared to have to compile the two possible + paths. */ + cc = integer_NON_NULL(po, PsycoObject_IsTrue(po, TOP())); + if (cc == CC_ERROR) + break; + if (opcode == JUMP_IF_FALSE) + cc = INVERT_CC(cc); + if ((int)cc < CC_TOTAL) { + /* compile the beginning of the "if true" path */ + int current_instr = next_instr; + JUMPBY(oparg); + SAVE_NEXT_INSTR(next_instr); + psyco_compile_cond(po, + psyco_exact_merge_point(po->pr.merge_points, + next_instr), + cc); + next_instr = current_instr; + } + else if (cc == CC_ALWAYS_TRUE) { + JUMPBY(oparg); /* always jump */ + mp = psyco_next_merge_point(po->pr.merge_points, + next_instr); + } + else + ; /* never jump */ + goto fine; + + case JUMP_ABSOLUTE: + JUMPTO(oparg); + mp = psyco_next_merge_point(po->pr.merge_points, next_instr); + goto fine; + + case GET_ITER: + x = PsycoObject_GetIter(po, TOP()); + if (x == NULL) + break; + POP_DECREF(); + PUSH(x); + goto fine; + + case FOR_ITER: + v = PsycoIter_Next(po, TOP()); + if (v != NULL) { + /* iterator not exhausted */ + PUSH(v); + } + else { + extra_assert(PycException_Occurred(po)); + + /* catch PyExc_StopIteration */ + v = PycException_Matches(po, PyExc_StopIteration); + if (runtime_NON_NULL_t(po, v) == true) { + /* iterator ended normally */ + PycException_Clear(po); + POP_DECREF(); + JUMPBY(oparg); + mp = psyco_next_merge_point(po->pr.merge_points, + next_instr); + } + else + break; /* any other exception, or error in + runtime_NON_NULL_t() */ + } + goto fine; + + case SETUP_LOOP: + case SETUP_EXCEPT: + case SETUP_FINALLY: + block_setup(po, opcode, INSTR_OFFSET() + oparg, + STACK_LEVEL()); + goto fine; + +#ifdef SET_LINENO + case SET_LINENO: + /* trace machine code execution at each SET_LINENO opcode + XXX re-implement this feature for Python 2.3, which + no longer uses the SET_LINENO opcode */ + TRACE_EXECUTION_NOERR("SET_LINENO"); + goto fine; +#endif + + case CALL_FUNCTION: + case CALL_FUNCTION_VAR: + case CALL_FUNCTION_KW: + case CALL_FUNCTION_VAR_KW: + { + int i, stack_to_pop; + x = psyco_ext_do_calls(po, opcode, oparg, STACK_POINTER(), + &stack_to_pop); + if (x == NULL) + break; + + /* clean up the stack (remove args and func) */ + for (i=stack_to_pop; i--; ) + POP_DECREF(); + PUSH(x); + goto fine; + } + + /*MISSING_OPCODE(MAKE_CLOSURE);*/ + + case MAKE_FUNCTION: + if (oparg > 0) + v = PsycoTuple_New(oparg, STACK_POINTER() - oparg - 1); + else + v = NULL; + x = PsycoFunction_New(po, TOP(), LOC_GLOBALS, v); + vinfo_xdecref(v, po); + if (x == NULL) + break; + + /* clean up the stack (remove args and func) */ + while (oparg-- >= 0) + POP_DECREF(); + PUSH(x); + goto fine; + + case BUILD_SLICE: + if (oparg == 3) { + w = NTOP(1); + v = NTOP(2); + u = NTOP(3); + } + else { + w = psyco_vi_Zero(); + v = NTOP(1); + u = NTOP(2); + } + x = psyco_generic_call(po, PySlice_New, + CfReturnRef|CfPyErrIfNull, + "vvv", u, v, w); + if (oparg != 3) + vinfo_decref(w, po); + if (x == NULL) + break; + Psyco_AssertType(po, x, &PySlice_Type); + if (oparg == 3) + POP_DECREF(); /* w */ + POP_DECREF(); /* v */ + POP_DECREF(); /* u */ + PUSH(x); + goto fine; + + case EXTENDED_ARG: + opcode = NEXTOP(); + oparg = oparg<<16 | NEXTARG(); + goto dispatch_opcode; + + default: + fprintf(stderr, + "XXX opcode: %d\n", + opcode); + Py_FatalError("unknown opcode"); + + } /* switch (opcode) */ + + /* Exit if an error occurred */ + if (PycException_Occurred(po)) + break; + + fine: + extra_assert(!PycException_Occurred(po)); + extra_assert(mp == psyco_next_merge_point(po->pr.merge_points, + next_instr)); + + /* are we running out of space in the current code buffer? */ + if ((po->codelimit - po->code) < BUFFER_MARGIN) { + if (is_respawning(po)) { + /* when respawning, just forget everything we + wrote so far and come back to the beginning + again */ + PsycoObject_EmergencyCodeRoom(po); + } + else { + /* normal case: save the current position, and + stop compilation. When this point is reached + at run-time, compilation will go on in a + new buffer. */ + SAVE_NEXT_INSTR(next_instr); + if (mp->bytecode_position != next_instr) + mp = NULL; + code1 = psyco_compile(po, mp, false); + goto finished; + } + } + + /* mark merge points via a call to psyco_compile() */ + if (mp->bytecode_position == next_instr) { + extra_assert(!is_respawning(po)); + SAVE_NEXT_INSTR(next_instr); + /* simplify the po->vlocals array */ + if (!psyco_limit_nested_weight(po, &po->vlocals, NWI_NORMAL, + NESTED_WEIGHT_END)) + break; + psyco_delete_unused_vars(po, &mp->entries); + code1 = psyco_compile(po, mp, true); + if (code1 != NULL) + goto finished; + mp++; + /* trace execution at each of the s the execution + goes through */ + TRACE_EXECUTION_NOERR("SNAPSHOT"); + } + } /* end of the main loop, exit if pseudo-exception */ + + psyco_assert_coherent(po); + + /* check for the 'promotion' pseudo-exception. + This is the only case in which the instruction + causing the exception is restarted. */ + if (is_virtualtime(po->pr.exc->source) && + psyco_vsource_is_promotion(po->pr.exc->source)) + { + c_promotion_t* promotion = (c_promotion_t*) + VirtualTime_Get(po->pr.exc->source); + vinfo_t* promote_me = po->pr.val; + /* NOTE: we assume that 'promote_me' is a member of the + 'po->vlocals' arrays, so that we can safely DECREF it + now without actually releasing it. If this assumption + is false, the psyco_finish_xxx() calls below will give + unexpected results. */ + assert_array_contains_nonct(&po->vlocals, promote_me); + clear_pseudo_exception(po); +#if USE_RUNTIME_SWITCHES + if (promotion->fs == NULL) +#endif + code1 = psyco_finish_promotion(po, promote_me, + promotion->pflags); +#if USE_RUNTIME_SWITCHES + else + code1 = psyco_finish_fixed_switch(po, promote_me, + promotion->kflags, + promotion->fs); +#endif + goto finished; + } + + /* check for the 'inline' pseudo-exception. */ + if (PycException_Is(po, &EInline)) + { + vinfo_t* v; + + /* po->pr.val->array contains the new sub-frame that we + should now start to compile, inlined into the parent frame */ + extra_assert(!po->pr.is_inlining); + /* store po->vlocals away */ + v = psyco_save_inline_po(po); + /* copy po->pr.val->array to po->vlocals */ + po = psyco_restore_inline_po(po, &po->pr.val->array); + stack_a = po->vlocals.items + po->pr.stack_base; + /* save the copy of the previous po->vlocals to LOC_INLINING */ + extra_assert(LOC_INLINING == NULL); + LOC_INLINING = v; + po->pr.is_inlining = true; + /* mark this point as an inline frame entry */ + psyco_inline_enter(po); + /* go on with compilation */ + clear_pseudo_exception(po); + continue; + } + + /* At this point, we got a real pseudo-exception. */ + + if (PycException_IsPython(po) && opcode != END_FINALLY) + { + /* log traceback info for real Python exceptions, + unless re-raised by END_FINALLY */ + PsycoTraceBack_Here(po, po->pr.next_instr); + } + + /* All exceptions raised inside an inlined frame are passed to the + parent (neither exception handlers nor loops are allowed in + inlinable code objects). */ + if (po->pr.is_inlining) + { + /* unwind the inlined frame by restoring the parent one */ + vinfo_t* v = LOC_INLINING; + LOC_INLINING = NULL; + po = psyco_restore_inline_po(po, &v->array); + stack_a = po->vlocals.items + po->pr.stack_base; + vinfo_decref(v, po); + po->pr.is_inlining = false; + /* mark this point as an inline frame exit */ + psyco_inline_exit(po); + + if (PycException_Is(po, &EReturn)) + { + /* caught EReturn from the inlined frame */ + + /* 'po' is now in the parent frame, pointing to the instruction + (typically CALL_FUNCTION) which triggered the inline + compilation in the first place. We restart this instruction + entierely. With almost no code emitted we should reach the + psyco_call_pyfunc() again, which will at that point return + the expected result. To this end we save the result in + LOC_INLINING. It might be exceptionally possible that the + restarting CALL_FUNCTION does not reach psyco_call_pyfunc() + again in some cases; this hopefully corresponds to cases + that can never occur at run-time. The waste of code is + minimal. */ + LOC_INLINING = po->pr.val; + po->pr.val = NULL; + clear_pseudo_exception(po); + need_reference(po, LOC_INLINING); /* see test5.makeSelection() */ + continue; + } + + /* stack unwind goes on in the parent frame */ + if (PycException_IsPython(po) && compute_and_raise_exception(po)) + { + /* force the exception to be recorded on inner frame + before we can record its traceback on the parent frame */ + clear_pseudo_exception(po); + PycException_Raise(po, vinfo_new(VirtualTime_New(&ERtPython)), + NULL); + PsycoTraceBack_Here(po, po->pr.next_instr); + } + } + + /* Unwind the Python stack until we find a handler for + the (pseudo) exception. You will recognize here + ceval.c's stack unwinding code. */ + + while (po->pr.iblock > 0) { + PyTryBlock *b = block_pop(po); + + if (b->b_type == SETUP_LOOP && PycException_Is(po, &EContinue)) + { + /* For a continue inside a try block, + don't pop the block for the loop. */ + int next_instr; + block_setup(po, b->b_type, b->b_handler, b->b_level); + JUMPTO(CompileTime_Get(po->pr.val->source)->value); + clear_pseudo_exception(po); + SAVE_NEXT_INSTR(next_instr); + break; + } + + /* clear the stack up to b->b_level */ + while (STACK_LEVEL() > b->b_level) + { + POP_DECREF(); /* no NULLs here */ + } + if (b->b_type == SETUP_LOOP && PycException_Is(po, &EBreak)) + { + int next_instr; + clear_pseudo_exception(po); + JUMPTO(b->b_handler); + SAVE_NEXT_INSTR(next_instr); + break; + } + if (b->b_type == SETUP_FINALLY) + { + /* SETUP_FINALLY always pushes on the stack either a + single compile-time None object or three objects + (exc, value, traceback). Unlike Python, the latter + might represent a pseudo-exception like EReturn. */ + int next_instr; + vinfo_t* exc_info = PsycoTuple_New(3, NULL); + PycException_Fetch(po); + PsycoTuple_GET_ITEM(exc_info, 0) = po->pr.exc; + PsycoTuple_GET_ITEM(exc_info, 1) = po->pr.val; + PsycoTuple_GET_ITEM(exc_info, 2) = po->pr.tb; + po->pr.exc = NULL; + po->pr.val = NULL; + po->pr.tb = NULL; + PUSH(exc_info); + JUMPTO(b->b_handler); + SAVE_NEXT_INSTR(next_instr); + break; + } + if (b->b_type == SETUP_EXCEPT && PycException_IsPython(po)) + { + /* SETUP_EXCEPT pushes three objects individually as in + ceval.c, as needed for bytecode compatibility. See tricks + in END_FINALLY to distinguish between the end of a FINALLY + and the end of an EXCEPT block. */ + int next_instr; + while (!PycException_FetchNormalize(po)) { + /* got an exception while initializing the EXCEPT + block... Consider this new exception as overriding + the previous one, so that we just re-enter the same + EXCEPT block. */ + /* XXX check that this empty loop cannot be endless */ + } + extra_assert(po->pr.val != NULL); + extra_assert(po->pr.tb != NULL); + PUSH(po->pr.tb); po->pr.tb = NULL; + PUSH(po->pr.val); po->pr.val = NULL; + PUSH(po->pr.exc); po->pr.exc = NULL; + JUMPTO(b->b_handler); + SAVE_NEXT_INSTR(next_instr); + break; + } + } /* end of unwind stack */ + + /* End the function if we still have a (pseudo) exception */ + if (PycException_Occurred(po)) + { + /* at the end of the function we set next_instr to -1 + because the actual position has no longer any importance */ + po->pr.next_instr = -1; + } + } + + /* function return (either by RETURN or by exception). */ + while ((code1 = exit_function(po)) == NULL) { + /* If LOC_EXCEPTION is still set after exit_function(), it + means an exception was raised while handling the functn + return... In this case, we do a function return again, + this time with the newly raised exception. XXX make sure + this loop cannot be endless */ + } + + finished: +#if ALL_CHECKS + if (PyErr_Occurred()) { + fprintf(stderr, "psyco: unexpected Python exception during compilation:\n"); + PyErr_WriteUnraisable(Py_None); + } +#endif + PyErr_Restore(old_py_exc, old_py_val, old_py_tb); + return code1; +} diff --git a/nodeboxgl/ext/psyco/src/c/Python/pycompiler.h b/nodeboxgl/ext/psyco/src/c/Python/pycompiler.h new file mode 100644 index 0000000..9d074d7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/pycompiler.h @@ -0,0 +1,366 @@ + /***************************************************************/ +/*** Language-dependent part of the compiler ***/ + /***************************************************************/ + +#ifndef _PYCOMPILER_H +#define _PYCOMPILER_H + + +#include "pycheader.h" +#include "pyver.h" +#include "../vcompiler.h" +#include "../processor.h" +#include "../dispatcher.h" + + +/*#define MAX3(a,b,c) ((a)>(b)?((a)>(c)?(a):(c)):(b)>(c)?(b):(c))*/ + + +/*****************************************************************/ + /*** Common constants ***/ + +/* the following known values have the SkFlagFixed set */ +#define DEF_SK_AND_VI(name) \ +EXTERNVAR source_known_t psyco_sk##name; \ +PSY_INLINE vinfo_t* psyco_vi_##name(void) { \ + sk_incref(&psyco_sk##name); \ + return vinfo_new(CompileTime_NewSk(&psyco_sk##name)); \ +} + +DEF_SK_AND_VI(Zero) /* known value 0 */ +DEF_SK_AND_VI(One) /* known value 1 */ +DEF_SK_AND_VI(None) /* known value 'Py_None' */ +DEF_SK_AND_VI(Py_False) /* known value 'Py_False' */ +DEF_SK_AND_VI(Py_True) /* known value 'Py_True' */ +DEF_SK_AND_VI(NotImplemented) /* 'Py_NotImplemented' */ + + /* the macro defines psyco_vi_None(), psyco_vi_Zero(), + psyco_vi_One() and psyco_vi_NotImplemented(). */ + +#undef DEF_SK_AND_VI + + +/*****************************************************************/ + /*** Compile-time Pseudo exceptions ***/ + + +/***** + * A pseudo-exception is the compile-time equivalent of a Python exception. + * They are encoded in the fields 'exc' and 'val' of pyc_data_t. For real + * Python the translation is immediate: 'exc' describes the PyObject* + * pointing to the Python exception class, and 'val' is the associated value. + * + * For the other pseudo-exceptions, like special events breaking the Python + * main loop (returns, break, continue), 'exc' is a virtual value using + * one of the following non-computable virtual sources. + * + * 'ERtPython' is particular: it is the virtual equivalent of "the exception + * currently set at run-time". Use PycException_Fetch() to emit the actual + * call to PyErr_Fetch(). + */ +EXTERNVAR source_virtual_t ERtPython; /* Exception raised by Python */ +EXTERNVAR source_virtual_t EReturn; /* 'return' statement */ +EXTERNVAR source_virtual_t EBreak; /* 'break' statement */ +EXTERNVAR source_virtual_t EContinue; /* 'continue' statement */ +EXTERNVAR source_virtual_t EInline; /* inline a frame inside a parent frame */ + + +/* Check whether a pseudo-exception is currently set */ +PSY_INLINE bool PycException_Occurred(PsycoObject* po) { + return po->pr.exc != NULL; +} + + +/* raise an arbitrary pseudo-exception (consumes the references) */ +EXTERNFN void PycException_Clear(PsycoObject* po); +PSY_INLINE void PycException_Raise(PsycoObject* po, vinfo_t* exc, vinfo_t* val) { + if (PycException_Occurred(po)) + PycException_Clear(po); + po->pr.exc = exc; + po->pr.val = val; +} +PSY_INLINE void PycException_Restore(PsycoObject* po, vinfo_t* exc, + vinfo_t* val, vinfo_t* tb) { + PycException_Raise(po, exc, val); + po->pr.tb = tb; +} + +/* for Python exceptions detected at compile-time */ +EXTERNFN void PycException_SetString(PsycoObject* po, + PyObject* e, const char* text); +EXTERNFN void PycException_SetFormat(PsycoObject* po, + PyObject* e, const char* fmt, ...); + /* consumes a reference on 'v': */ +EXTERNFN void PycException_SetObject(PsycoObject* po, PyObject* e, PyObject* v); + /* consumes a reference on 'v': */ +EXTERNFN void PycException_SetVInfo(PsycoObject* po, PyObject* e, vinfo_t* v); + +/* checking for the Python class of an exception */ +EXTERNFN vinfo_t* PycException_Matches(PsycoObject* po, PyObject* e); + +PSY_INLINE bool PycException_Is(PsycoObject* po, source_virtual_t* sv) { + return po->pr.exc->source == VirtualTime_New(sv); +} +PSY_INLINE bool PycException_IsPython(PsycoObject* po) { + Source src = po->pr.exc->source; + if (is_virtualtime(src)) { + return !(src == VirtualTime_New(&EReturn) || + src == VirtualTime_New(&EBreak) || + src == VirtualTime_New(&EContinue) || + psyco_vsource_is_promotion(src)); + } + else + return true; +} + +/* fetch a Python exception set at compile-time (that is, now) and turn into + a pseudo-exception (typically to be re-raised at run-time). */ +EXTERNFN void psyco_virtualize_exception(PsycoObject* po); + +/* fetch a Python exception set at run-time (that is, a ERtPython) and turn into + a pseudo-exception. This is a no-op if !PycException_Is(po, &ERtPython). */ +EXTERNFN void PycException_Fetch(PsycoObject* po); + +/*****************************************************************/ + /*** Promotion ***/ + +/* Raise a pseudo-exception meaning "promote 'vi' from run-time to + compile-time". If 'promotion->fs' is not NULL, only promote if the + run-time value turns out to be in the given set. +*/ +EXTERNFN void PycException_Promote(PsycoObject* po, + vinfo_t* vi, c_promotion_t* promotion); + +/* A powerful function: it appears to return the value of the + variable 'vi', even if it is a run-time variable. Implemented + by raising a EPromotion exception if needed. Returns -1 in + this case; use PycException_Occurred() to know if it is really + an exception or a plain normal -1. */ +PSY_INLINE long psyco_atcompiletime(PsycoObject* po, vinfo_t *vi) { + if (!compute_vinfo(vi, po)) + return -1; + if (is_runtime(vi->source)) { + PycException_Promote(po, vi, &psyco_nonfixed_promotion); + return -1; + } + else { + source_known_t* sk = CompileTime_Get(vi->source); + sk->refcount1_flags |= SkFlagFixed; + return sk->value; + } +} +/* the same if the value to promote is itself a PyObject* which can be + used as key in the look-up dictionary */ +PSY_INLINE PyObject* psyco_pyobj_atcompiletime(PsycoObject* po, vinfo_t* vi) { + if (!compute_vinfo(vi, po)) + return NULL; + if (is_runtime(vi->source)) { + PycException_Promote(po, vi, &psyco_nonfixed_pyobj_promotion); + return NULL; + } + else { + source_known_t* sk = CompileTime_Get(vi->source); + sk->refcount1_flags |= SkFlagFixed; + return (PyObject*) sk->value; + } +} +/* the same again, detecting megamorphic sites: if many different run-time + values keep showing up, return 0. If successfully promoted, return 1. + In case of exception, return -1. */ +/*EXTERNFN int psyco_atcompiletime_mega(PsycoObject* po, vinfo_t *vi, + long *out);*/ +EXTERNFN int psyco_pyobj_atcompiletime_mega(PsycoObject* po, vinfo_t* vi, + PyObject** out); + +#if USE_RUNTIME_SWITCHES +/* same as above, when the return value is used in a switch. + In this case we must only promote the known values. So instead + of writing 'switch (psyco_atcompiletime(po, vi))' you + must write 'switch (psyco_switch_index(po, vi, fs))' */ +PSY_INLINE int psyco_switch_index(PsycoObject* po, vinfo_t* vi, fixed_switch_t* fs) { + if (!compute_vinfo(vi, po)) + return -1; + if (is_runtime(vi->source)) { + if (!known_to_be_default(vi, fs)) + PycException_Promote(po, vi, &fs->fixed_promotion); + return -1; + } + else + return psyco_switch_lookup(fs, CompileTime_Get(vi->source)->value); +} +#endif + +/* lazy comparison. Returns true if 'vi' is non-NULL, compile-time, and has the + given value, and false otherwise. */ +PSY_INLINE bool psyco_knowntobe(vinfo_t* vi, long value) { + return vi != NULL && is_compiletime(vi->source) && + CompileTime_Get(vi->source)->value == value; +} + +/* comparison with a special PyObject* value, e.g. Py_NotImplemented; assume + that virtual sources are never one of these special objects. The _f version + assumes a generally false outcome, and the _t version a generally true one. */ +/* --- disabled, use CfPyErrNotImplemented instead --- */ +/* inline bool psyco_is_special_f(PsycoObject* po, vinfo_t* vi, */ +/* PyObject* value) { */ +/* return !is_virtualtime(vi->source) && */ +/* runtime_condition_f(po, * integer_cmp_i does not fail here * */ +/* integer_cmp_i(po, vi, (long) value, Py_EQ)); */ +/* } */ +/* inline bool psyco_is_special_t(PsycoObject* po, vinfo_t* vi, PyObject* */ +/* value) { */ +/* return !is_virtualtime(vi->source) && */ +/* runtime_condition_t(po, * integer_cmp_i does not fail here * */ +/* integer_cmp_i(po, vi, (long) value, Py_EQ)); */ +/* } */ + + +/*****************************************************************/ + /*** Exception utilities ***/ + +/* Psyco meta-equivalent of PyErr_Occurred(). Not to be confused with + PycException_Occurred(), which tells whether a Psyco-level exception + is currently set. */ +PSY_INLINE vinfo_t* psyco_PyErr_Occurred(PsycoObject* po) { + if (PycException_Occurred(po) && PycException_IsPython(po)) { + return psyco_vi_One(); + } + else { + /* normal call would be: + return psyco_generic_call(po, PyErr_Occurred, + CfReturnNormal, ""); + but we inline the check done in PyErr_Occurred(). */ + vinfo_t* vaddr; + vinfo_t* vtstate; + vinfo_t* vcurexc; + vaddr = vinfo_new(CompileTime_New( + (long)(&_PyThreadState_Current))); + vtstate = psyco_memory_read(po, vaddr, 0, NULL, 2, false); + vinfo_decref(vaddr, po); + vcurexc = psyco_memory_read(po, vtstate, + offsetof(PyThreadState, curexc_type), + NULL, 2, false); + vinfo_decref(vtstate, po); + return vcurexc; + } +} + + +/*****************************************************************/ + /*** Meta functions ***/ + +/* Each C function of the Python interpreter might be associated to a + "meta" function from Psyco with the same signature but 'vinfo_t*' for + the arguments and return value. The idea is that when such a meta + function exists, Psyco can invoke it at compile-time to do (a part of) + what the Python interpreter would do at run-time only. The code of the + meta function typically ressembles that of the original function enough + that we might dream about a language in which we never have to write + the two versions (where Psyco's version could be derived automatically + from the standard version). +*/ + +EXTERNVAR PyObject* Psyco_Meta_Dict; /* key is a PyIntObject holding the + address of the C function, value is + a PyIntObject holding the address + of the corresponding Psyco function. */ +EXTERNFN void Psyco_DefineMeta(void* c_function, void* psyco_function); +PSY_INLINE void* Psyco_Lookup(void* c_function) { + PyObject* value; + PyObject* key = PyInt_FromLong((long) c_function); + if (key == NULL) OUT_OF_MEMORY(); + value = PyDict_GetItem(Psyco_Meta_Dict, key); + Py_DECREF(key); + if (value != NULL) + return (void*) PyInt_AS_LONG(value); + else + return NULL; +} + +/*** To map the content of a Python module to meta-implementations. ***/ +/* Returns the module object (refcount *incremented*) or NULL if + not found. It also prints some infos in verbose mode. */ +EXTERNFN PyObject* Psyco_DefineMetaModule(char* modulename); +/* Returns an object from a module (refcount *incremented*) or NULL + if not found. In verbose mode, 'not found' errors are printed. */ +EXTERNFN PyObject* Psyco_GetModuleObject(PyObject* module, char* name, + PyTypeObject* expected_type); +/* Maps a built-in function object from a module to a meta-implementation. + Returns a pointer to the C function itself. */ +EXTERNFN PyCFunction Psyco_DefineModuleFn(PyObject* module, char* meth_name, + int meth_flags, void* meta_fn); +/* Same as above, but also alternatively accepts a callable type object + and maps it to meta_type_new. Returns NULL in this case. */ +EXTERNFN PyCFunction Psyco_DefineModuleC(PyObject* module, char* meth_name, + int meth_flags, void* meta_fn, + void* meta_type_new); + +/* the general-purpose calling routine: it looks for a meta implementation of + 'c_function' and call it if found; if not found, it encode a run-time call + to 'c_function'. The 'flags' and 'arguments' are as in psyco_generic_call(). + The remaining arguments are given to the meta function or encoded in the + run-time call; they should be compatible with the description given in + 'arguments'. + This is a bit tricky, with one version of the macro per number of arguments, + because the C processor is too limited and we want to avoid handling + functions with '...' arguments all around +*/ +#define Psyco_META1(po, c_function, flags, arguments, a1) \ + Psyco_Meta1x(po, c_function, flags, arguments, \ + (long)(a1)) +#define Psyco_META2(po, c_function, flags, arguments, a1, a2) \ + Psyco_Meta2x(po, c_function, flags, arguments, \ + (long)(a1), (long)(a2)) +#define Psyco_META3(po, c_function, flags, arguments, a1, a2, a3) \ + Psyco_Meta3x(po, c_function, flags, arguments, \ + (long)(a1), (long)(a2), (long)(a3)) + +#define Psyco_flag_META1 (condition_code_t) Psyco_META1 +#define Psyco_flag_META2 (condition_code_t) Psyco_META2 +#define Psyco_flag_META3 (condition_code_t) Psyco_META3 + +EXTERNFN vinfo_t* Psyco_Meta1x(PsycoObject* po, void* c_function, int flags, + const char* arguments, long a1); +EXTERNFN vinfo_t* Psyco_Meta2x(PsycoObject* po, void* c_function, int flags, + const char* arguments, long a1, long a2); +EXTERNFN vinfo_t* Psyco_Meta3x(PsycoObject* po, void* c_function, int flags, + const char* arguments, long a1, long a2, long a3); + + +/******************************************************************/ + /*** pyc_data_t implementation and snapshots for the dispatcher ***/ + +/* construction for non-frozen snapshots */ +EXTERNFN void pyc_data_build(PsycoObject* po, PyObject* merge_points); +PSY_INLINE void pyc_data_release(pyc_data_t* pyc) { + vinfo_xdecref(pyc->val, NULL); + vinfo_xdecref(pyc->exc, NULL); + vinfo_xdecref(pyc->tb, NULL); + Py_XDECREF(pyc->changing_globals); +} +PSY_INLINE void pyc_data_duplicate(pyc_data_t* target, pyc_data_t* source) { + memcpy(target, source, sizeof(pyc_data_t)); + target->exc = NULL; + target->val = NULL; + target->tb = NULL; + Py_XINCREF(target->changing_globals); +} + +/* construction for frozen snapshots */ +PSY_INLINE size_t frozen_size(pyc_data_t* pyc) { + return offsetof(pyc_data_t, blockstack) + pyc->iblock*sizeof(PyTryBlock); +} +PSY_INLINE void frozen_copy(pyc_data_t* target, pyc_data_t* source) { + memcpy(target, source, frozen_size(source)); +} +PSY_INLINE pyc_data_t* pyc_data_new(pyc_data_t* original) { + pyc_data_t* pyc = (pyc_data_t*) PyMem_MALLOC(frozen_size(original)); + if (pyc == NULL) OUT_OF_MEMORY(); + frozen_copy(pyc, original); + return pyc; +} +PSY_INLINE void pyc_data_delete(pyc_data_t* pyc) { + PyMem_FREE(pyc); +} + +#endif /* _PYCOMPILER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/Python/pyver.h b/nodeboxgl/ext/psyco/src/c/Python/pyver.h new file mode 100644 index 0000000..c5582e0 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/Python/pyver.h @@ -0,0 +1,81 @@ + /***************************************************************/ +/*** Detection of Python features ***/ + /***************************************************************/ + +#ifndef _PYVER_H +#define _PYVER_H + + +#include + +#define PSYCO_VERSION_HEX 0x010502f0 /* 1.5.2 */ + + +/*****************************************************************/ + /*** Detects differences between Python versions ***/ + +/* Note: not all features can be automatically detected; in some cases + we just assume that the feature is present or not based on some + other feature that has been introduced roughly at the same time. + This may need fixes to compile with some intermediary Python + versions. */ + +#define PSYCO_CAN_CALL_UNICODE 0 /* prevent references to PyUnicode_Xxx + functions causing potential linker + errors because of UCS2/UCS4 name + mangling */ + +#define HAVE_arrayobject_allocated (PY_VERSION_HEX>=0x02040000) /* 2.4 */ +#define VERYCONVOLUTED_IMPORT_NAME (PY_VERSION_HEX>=0x02050000) /* 2.5 */ + +#if HAVE_LONG_LONG && !defined(PY_LONG_LONG) +# define PY_LONG_LONG LONG_LONG /* Python < 2.3 */ +#endif + +#ifdef PyBool_Check +# define BOOLEAN_TYPE 1 /* Python >=2.3 */ +#else +# define BOOLEAN_TYPE 0 +#endif + +#ifndef PyString_CHECK_INTERNED +# define PyString_CHECK_INTERNED(op) (((PyStringObject*)(op))->ob_sinterned) +#endif + +#ifndef PyMODINIT_FUNC +# define PyMODINIT_FUNC void +#endif + +#ifndef PyExceptionClass_Check /* Python < 2.5 */ +# define PyExceptionClass_Check(x) PyClass_Check(x) +# define PyExceptionInstance_Check(x) PyInstance_Check(x) +# define PyExceptionInstance_Class(x) \ + (PyObject*)((PyInstanceObject*)(x))->in_class +#endif + +#ifdef Py_TPFLAGS_HAVE_INDEX /* Python >= 2.5 */ +# define HAVE_NB_INDEX 1 +# define PsycoIndex_Check(tp) \ + ((tp)->tp_as_number != NULL && \ + PyType_HasFeature((tp), Py_TPFLAGS_HAVE_INDEX) && \ + (tp)->tp_as_number->nb_index != NULL) + +#else +# define HAVE_NB_INDEX 0 +#endif + +/* for extra fun points, let's try to emulate Python's ever-changing behavior + (but not too hard; you can still tell the difference in Python < 2.5 if + you use -sys.maxint-1 as the lower bound of a slice, provided you inspect + it with a custom __getslice__() */ +#if PY_VERSION_HEX < 0x02030000 +# define LARGE_NEG_LONG_AS_SLICE_INDEX 0 /* 2.2 */ +#elif PY_VERSION_HEX < 0x02050000 +# define LARGE_NEG_LONG_AS_SLICE_INDEX (-INT_MAX) /* 2.3, 2.4 */ +#else +# define LARGE_NEG_LONG_AS_SLICE_INDEX (-INT_MAX-1) /* 2.5 */ +#endif + +#define HAVE_NEGATIVE_IDS (PY_VERSION_HEX < 0x02050000) /* Python < 2.5 */ + +#endif /* _PYVER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/alarm.c b/nodeboxgl/ext/psyco/src/c/alarm.c new file mode 100644 index 0000000..eff8222 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/alarm.c @@ -0,0 +1,280 @@ + +/* Define this to compile as a stand-alone "alarm" module */ +/*#undef STANDALONE*/ + +#ifdef STANDALONE +# include +#else +# include "alarm.h" +#endif + +/************************************************************/ +#ifdef WITH_THREAD +/************************************************************/ + +#include + + +typedef struct { + PyObject_HEAD + PyInterpreterState* interp; + PyThread_type_lock lock; + PyObject* args; + enum { st_waiting, st_running, st_stopped } state; +} PyAlarmObject; + + +staticforward PyTypeObject PyAlarm_Type; + +static void t_bootstrap(void* rawself) +{ + PyAlarmObject* self = (PyAlarmObject*) rawself; + PyThreadState *tstate; + PyObject* args = NULL; + + tstate = PyThreadState_New(self->interp); + PyEval_AcquireThread(tstate); + + while (1) + { + PyObject *res, *sleepfn, *sleeparg, *callback, *cbarg = NULL; + Py_XDECREF(args); + args = self->args; + Py_XINCREF(args); + if (args == NULL || args == Py_None) + break; + if (!PyArg_ParseTuple(args, "OOO|O", &sleepfn, &sleeparg, + &callback, &cbarg)) + break; + res = PyObject_CallObject(sleepfn, sleeparg); + if (res == NULL) + break; + Py_DECREF(res); + res = NULL; + if (self->args == NULL) + break; + + PyThread_acquire_lock(self->lock, WAIT_LOCK); + if (self->args != NULL) + { + self->state = st_running; + res = PyObject_CallObject(callback, cbarg); + self->state = st_waiting; + } + PyThread_release_lock(self->lock); + + Py_DECREF(args); + args = self->args; + self->args = res; + } + Py_XDECREF(args); + Py_XDECREF(self->args); + self->args = NULL; + + self->state = st_stopped; + if (PyErr_Occurred()) + { + if (PyErr_ExceptionMatches(PyExc_SystemExit)) + PyErr_Clear(); + else + { + PySys_WriteStderr("Unhandled exception in alarm:\n"); + PyErr_PrintEx(0); + } + } + Py_DECREF(self); + PyThreadState_Clear(tstate); + PyThreadState_DeleteCurrent(); + PyThread_exit_thread(); +} + + /***************************************************************/ + +static void alarm_dealloc(PyAlarmObject* self) +{ + Py_XDECREF(self->args); + if (self->lock != NULL) + PyThread_free_lock(self->lock); + PyObject_Del((PyObject*) self); +} + +#if 0 +static int alarm_traverse(PyAlarmObject* self, visitproc visit, void* arg) +{ + if (self->args != NULL) + return visit(self->args, arg); + else + return 0; +} +#endif + +PSY_INLINE int alarm_clear(PyAlarmObject* self) +{ + PyObject* nargs = self->args; + self->args = NULL; + Py_XDECREF(nargs); + return 0; +} + +static PyObject* alarmstate(PyAlarmObject* self, PyObject* args) +{ + char* s; + if (!PyArg_ParseTuple(args, "")) + return NULL; + switch (self->state) { + case st_waiting: s = "waiting"; break; + case st_running: s = "running"; break; + default: s = "stopped"; break; + } + return PyString_FromString(s); +} + +static PyObject* alarmstop(PyAlarmObject* self, PyObject* args) +{ + int wait; + if (!PyArg_ParseTuple(args, "i", &wait)) + return NULL; + alarm_clear(self); + if (wait && self->state != st_stopped) + { + Py_BEGIN_ALLOW_THREADS + PyThread_acquire_lock(self->lock, WAIT_LOCK); + PyThread_release_lock(self->lock); + Py_END_ALLOW_THREADS + } + Py_INCREF(Py_None); + return Py_None; +} + +#ifdef STANDALONE +static PyObject* new_alarm(PyObject* dummy, PyObject* args) +#else +DEFINEFN +PyObject* psyco_new_alarm(PyObject* dummy, PyObject* args) +#endif +{ + PyAlarmObject* self; + long ident; + + self = PyObject_New(PyAlarmObject, &PyAlarm_Type); + if (self == NULL) + return NULL; + + PyEval_InitThreads(); /* Start the interpreter's thread-awareness */ + self->interp = PyThreadState_Get()->interp; + self->lock = PyThread_allocate_lock(); + Py_INCREF(args); + self->args = args; + self->state = st_waiting; + + if (self->lock == NULL) goto error; + + Py_INCREF(self); /* t_bootstrap consumes a ref */ + ident = PyThread_start_new_thread(t_bootstrap, (void*) self); + if (ident == -1) + { + Py_DECREF(self); + PyErr_SetString(PyExc_RuntimeError, "can't start new thread"); + goto error; + } + return (PyObject*) self; + + error: + Py_DECREF(self); + return NULL; +} + + /***************************************************************/ + +static PyMethodDef alarm_methods[] = { + {"state", (PyCFunction)alarmstate, METH_VARARGS}, + {"stop", (PyCFunction)alarmstop, METH_VARARGS}, + {NULL, NULL} /* sentinel */ +}; + +static PyObject* alarm_getattr(PyObject* self, char* name) +{ + return Py_FindMethod(alarm_methods, self, name); +} + +statichere PyTypeObject PyAlarm_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "alarm", /*tp_name*/ + sizeof(PyAlarmObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)alarm_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + (getattrfunc)alarm_getattr, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ +}; + + +#ifdef STANDALONE +static PyMethodDef AlarmMethods[] = { + {"alarm", new_alarm, METH_VARARGS}, + {NULL, NULL} /* Sentinel */ +}; + +void initalarm() +{ + PyObject* m; + PyAlarm_Type.ob_type = &PyType_Type; + m = Py_InitModule("alarm", AlarmMethods); + if (m == NULL) + return; + Py_INCREF(&PyAlarm_Type); + if (PyModule_AddObject(m, "AlarmType", (PyObject*) &PyAlarm_Type)) + return; +} +#else +INITIALIZATIONFN +void psyco_alarm_init(void) +{ + PyAlarm_Type.ob_type = &PyType_Type; +} +#endif + + +/************************************************************/ +#else /* if !defined(WITH_THREAD) */ +/************************************************************/ + +#ifdef STANDALONE +# error "Thread support is required for the alarm module" +#else + +DEFINEFN +PyObject* psyco_new_alarm(PyObject* dummy, PyObject* args) +{ + PyErr_SetString(PyExc_PsycoError, + "Python and Psyco must be compiled with thread support."); + return NULL; +} + +INITIALIZATIONFN +void psyco_alarm_init(void) +{ +} +#endif + + +/************************************************************/ +#endif /* WITH_THREAD */ +/************************************************************/ diff --git a/nodeboxgl/ext/psyco/src/c/alarm.h b/nodeboxgl/ext/psyco/src/c/alarm.h new file mode 100644 index 0000000..0e29395 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/alarm.h @@ -0,0 +1,17 @@ + /***************************************************************/ +/*** General-purpose alarm module ***/ + /***************************************************************/ + +#ifndef _ALARM_H +#define _ALARM_H + + +#include "psyco.h" + + +#define ALARM_FUNCTIONS {"alarm", psyco_new_alarm, METH_VARARGS} + +EXTERNFN PyObject* psyco_new_alarm(PyObject* dummy, PyObject* args); + + +#endif /* _ALARM_H */ diff --git a/nodeboxgl/ext/psyco/src/c/blockalloc.h b/nodeboxgl/ext/psyco/src/c/blockalloc.h new file mode 100644 index 0000000..24d860f --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/blockalloc.h @@ -0,0 +1,118 @@ + /***************************************************************/ +/*** Generic fixed-sized-blocks allocator ***/ + /***************************************************************/ + +#ifndef _BLOCKALLOC_H +#define _BLOCKALLOC_H + + +#include "psyco.h" + + +/* Define two functions to allocate and free items of type 'type'. + The functions are named psyco_llalloc_[name] and psyco_llfree_[name]. */ +#define BLOCKALLOC_INTERFACE(name, type) \ + BLOCKALLOC_INTERN_DEF(name, type, EXTERNVAR, EXTERNFN) + + +/* Implements the required internal variables and functions. + The allocator will reserve and subdivide blocks of the given size. */ +#define BLOCKALLOC_IMPLEMENTATION(name, type, blocksize) \ + BLOCKALLOC_INTERN_IMPL(name, type, blocksize, DEFINEVAR, DEFINEFN) + + +/* Same as the combination of the above two when the result need only + be local to a .c source (i.e. static). */ +#define BLOCKALLOC_STATIC(name, type, blocksize) \ + BLOCKALLOC_INTERN_DEF(name, type, staticforward, static /*forward*/) \ + BLOCKALLOC_INTERN_IMPL(name, type, blocksize, statichere, static) + + +/***************************************************************/ + /*** dummy version, used in conjunction with a memory ***/ + /*** checker like linuxmemchk ***/ + +#ifdef PSYCO_NO_LINKED_LISTS + +#define BLOCKALLOC_INTERN_DEF(name, type, EVAR, EFN) \ +PSY_INLINE type* psyco_llalloc_##name(void) { \ + type* vi = (type*) PyMem_MALLOC(sizeof(type)); \ + if (vi == NULL) \ + OUT_OF_MEMORY(); \ + return vi; \ +} \ +PSY_INLINE void psyco_llfree_##name(type* vi) { \ + PyMem_FREE((char*) vi); \ +} + +#define BLOCKALLOC_INTERN_IMPL(name, type, blocksize, DVAR, DFN) /* nothing */ + + +/***************************************************************/ + /*** full linked-list block-allocated version ***/ + +#else /* if !PSYCO_NO_LINKED_LISTS */ + +#define BLOCKALLOC_INTERN_DEF(name, type, EVAR, EFN) \ +EVAR void** psyco_linked_list_##name; \ +EFN void* psyco_ll_newblock_##name(void); \ +PSY_INLINE type* psyco_llalloc_##name(void) { \ + type* vi; \ + if (psyco_linked_list_##name == NULL) \ + vi = (type*) psyco_ll_newblock_##name(); \ + else { \ + vi = (type*) psyco_linked_list_##name; \ + psyco_linked_list_##name = *(void**) vi; \ + BLOCKALLOC_DEBUG_CHECK( \ + (type*) psyco_linked_list_##name, type) \ + } \ + BLOCKALLOC_DEBUG_CHECK(vi, type) \ + return vi; \ +} \ +PSY_INLINE void psyco_llfree_##name(type* vi) { \ + if (PSYCO_DEBUG) \ + memset(vi, 0xCD, sizeof(type)); \ + *(void**) vi = psyco_linked_list_##name; \ + psyco_linked_list_##name = (void**) vi; \ +} + +#define BLOCKALLOC_INTERN_IMPL(name, type, blocksize, DVAR, DFN) \ +DVAR void** psyco_linked_list_##name = NULL; \ +DFN void* psyco_ll_newblock_##name() \ +{ \ + int block_count = (blocksize)/sizeof(type); \ + size_t sze = block_count * sizeof(type); \ + type* p; \ + type* prev = (type*) psyco_linked_list_##name; \ + type* block = (type*) PyMem_MALLOC(sze); \ + psyco_memory_usage += sze; \ + extra_assert(block_count > 0 && sizeof(type) >= sizeof(void*)); \ + if (block == NULL) \ + OUT_OF_MEMORY(); \ + if (PSYCO_DEBUG) \ + memset(block, 0xCD, sze); \ + for (p=block+block_count; --p!=block; ) { \ + *(type**)p = prev; \ + prev = p; \ + } \ + psyco_linked_list_##name = *(void***) prev; \ + return prev; \ +} + +#if PSYCO_DEBUG +# define BLOCKALLOC_DEBUG_CHECK(vi, type) \ + if (vi) { \ + int i; \ + for (i=sizeof(void*); i +#include "pycodegen.h" + +/*** The processor-independent part of the code generator. ***/ + + +DEFINEFN +void psyco_emit_header(PsycoObject* po, int nframelocal) +{ + int j = nframelocal; + vinfo_array_t* array; + extra_assert(LOC_CONTINUATION->array->count == 0); + + BEGIN_CODE + INITIALIZE_FRAME_LOCALS(nframelocal); + po->stack_depth += 4*nframelocal; + END_CODE + + array = LOC_CONTINUATION->array = array_new(nframelocal); + while (j--) + array->items[j] = vinfo_new(RunTime_NewStack( + po->stack_depth - sizeof(long)*j, false, false)); +} + +#define INITIAL_STACK_DEPTH_INUSE (INITIAL_STACK_DEPTH + \ + (!NEED_STACK_FRAME_HACK) * sizeof(long)) + +DEFINEFN +code_t* psyco_finish_return(PsycoObject* po, Source retval) +{ + code_t* code = po->code; + int retpos; + int nframelocal = LOC_CONTINUATION->array->count; + + /* 'retpos' is the position in the stack of the return address. */ + retpos = getstack(LOC_CONTINUATION->source); + extra_assert(retpos != RunTime_StackNone); + + /* write the epilogue */ + WRITE_FRAME_EPILOGUE(retval, nframelocal); + + /* now clean up the stack up to retpos */ + STACK_CORRECTION(retpos - po->stack_depth); + + /* emit the 'RET' instruction */ + retpos -= INITIAL_STACK_DEPTH_INUSE; + FUNCTION_RET(retpos); + + PsycoObject_Delete(po); + return code; +} + + +/***************************************************************/ + /*** Condition Codes (a.k.a. the processor 'flags' register) ***/ + +#if HAVE_CCREG +static source_virtual_t cc_functions_table[CC_TOTAL]; + +DEFINEFN +condition_code_t cc_from_vsource(Source source) +{ + source_virtual_t* sv = VirtualTime_Get(source); + return (condition_code_t) (sv - cc_functions_table); +} + +static bool generic_computed_cc(PsycoObject* po, vinfo_t* v) +{ + /* also upon forking, because the condition codes cannot be + sent as arguments (function calls typically require adds + and subs to adjust the stack). */ + /* 'v' should be one of the po->ccregs[_] here */ + BEGIN_CODE + code = psyco_compute_cc(po, code +#if REG_TOTAL > 0 + , REG_NONE +#endif + ); + END_CODE + return true; +} + + +DEFINEFN +vinfo_t* psyco_vinfo_condition(PsycoObject* po, condition_code_t cc) +{ + vinfo_t* result; + if ((int)cc < CC_TOTAL) + { + int index = INDEX_CC(cc); + if (po->ccregs[index] != NULL) + { + /* there is already a value in the processor flags register */ + condition_code_t prevcc = psyco_vsource_cc(po->ccregs[index]->source); + extra_assert(prevcc != CC_ALWAYS_FALSE); + + if (prevcc == cc) + { + /* it is the same condition, so reuse it */ + result = po->ccregs[index]; + vinfo_incref(result); + return result; + } + else + { + /* it is not the same condition at all, save the old one and + make a new one (should never occur with the ivm backend) */ + BEGIN_CODE + NEED_CC(); + END_CODE + } + } + extra_assert(po->ccregs[index] == NULL); + result = vinfo_new(VirtualTime_New(cc_functions_table+(int)cc)); + po->ccregs[index] = result; + } + else + result = vinfo_new(CompileTime_New(cc == CC_ALWAYS_TRUE)); + return result; +} + +DEFINEFN +VirtualTimeSource psyco_source_condition(condition_code_t cc) +{ + return VirtualTime_New(cc_functions_table+(int)cc); +} + +DEFINEFN +condition_code_t psyco_vsource_cc(Source source) +{ + if (is_virtualtime(source)) + { + source_virtual_t* sv = VirtualTime_Get(source); + if (cc_functions_table <= sv && sv < cc_functions_table+CC_TOTAL) + { + /* 'sv' points within the cc_functions_table */ + return (condition_code_t) (sv - cc_functions_table); + } + } + return CC_ALWAYS_FALSE; +} + +DEFINEFN +void psyco_resolved_cc(PsycoObject* po, condition_code_t cc_known_true) +{ + if ((int)cc_known_true < CC_TOTAL) + { + vinfo_t* v; + int index; + + index = INDEX_CC(cc_known_true); + v = po->ccregs[index]; + if (v != NULL && psyco_vsource_cc(v->source) == cc_known_true) + { + sk_incref(&psyco_skOne); + v->source = CompileTime_NewSk(&psyco_skOne); + po->ccregs[index] = NULL; + } + + index = INDEX_CC(INVERT_CC(cc_known_true)); + v = po->ccregs[index]; + if (v != NULL && psyco_vsource_cc(v->source) == INVERT_CC(cc_known_true)) + { + sk_incref(&psyco_skZero); + v->source = CompileTime_NewSk(&psyco_skZero); + po->ccregs[index] = NULL; + } + } +} + +#else /* if !HAVE_CCREG */ + +# error "this was meant for ivm, but now ivm also defines HAVE_CCREG." + +#endif /* HAVE_CCREG */ + + +/*****************************************************************/ + /*** run-time switches ***/ + +static bool computed_promotion(PsycoObject* po, vinfo_t* v) +{ + /* uncomputable, but still use the address of computed_promotion() as a + tag to figure out if a virtual source is a c_promotion_s structure. */ + return psyco_vsource_not_important.compute_fn(po, v); +} + +DEFINEVAR c_promotion_t psyco_nonfixed_promotion; +DEFINEVAR c_promotion_t psyco_nonfixed_pyobj_promotion; +/*DEFINEVAR c_promotion_t psyco_nonfixed_promotion_mega;*/ +DEFINEVAR c_promotion_t psyco_nonfixed_pyobj_promotion_mega; + +DEFINEFN +bool psyco_vsource_is_promotion(VirtualTimeSource source) +{ + return VirtualTime_Get(source)->compute_fn == &computed_promotion; +} + + +/*****************************************************************/ + /*** Calling C functions ***/ + +#define MAX_ARGUMENTS_COUNT 16 + +DEFINEFN +vinfo_t* psyco_generic_call(PsycoObject* po, void* c_function, + int flags, const char* arguments, ...) +{ + char argtags[MAX_ARGUMENTS_COUNT]; + long raw_args[MAX_ARGUMENTS_COUNT], args[MAX_ARGUMENTS_COUNT]; + int count, i, j, stackbase, totalstackspace = 0; + vinfo_t* vresult; + bool has_refs = false; + + va_list vargs; + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, arguments); +#else + va_start(vargs); +#endif + extra_assert(c_function != NULL); + + for (count=0; arguments[count]; count++) { + long arg; + char tag; + vinfo_t* vi; + + extra_assert(count <= MAX_ARGUMENTS_COUNT); + raw_args[count] = arg = va_arg(vargs, long); + tag = arguments[count]; + + switch (tag) { + + case 'l': + break; + + case 'v': + /* Compute all values first */ + vi = (vinfo_t*) arg; + if (!compute_vinfo(vi, po)) return NULL; + if (!is_compiletime(vi->source)) { + flags &= ~CfPure; + } + else { + /* compile-time: get the value */ + arg = CompileTime_Get(vi->source)->value; + tag = 'l'; + } + break; + + case 'r': + /* Push by-reference values in the stack now */ + vi = (vinfo_t*) arg; + extra_assert(is_runtime(vi->source)); +#if REG_TOTAL > 0 + if (getstack(vi->source) == RunTime_StackNone) { + reg_t rg = getreg(vi->source); + if (rg == REG_NONE) { + /* for undefined sources, pushing + just any register will be fine */ + rg = REG_ANY_CALLER_SAVED; + } + BEGIN_CODE + SAVE_REG_VINFO(vi, rg); + END_CODE + } +#endif + arg = RunTime_NewStack(getstack(vi->source), + false, false); + has_refs = true; + break; + + case 'a': + case 'A': + has_refs = true; + totalstackspace += sizeof(long) * + ((vinfo_array_t*) arg)->count; + break; + + default: + Py_FatalError("unknown character argument in" + " psyco_generic_call()"); + } + args[count] = arg; + argtags[count] = tag; + } + va_end(vargs); + + if (flags & CfPure) { + /* calling a pure function with no run-time argument */ + long result; + + if (has_refs) { + for (i = 0; i < count; i++) { + if (argtags[i] == 'a' || argtags[i] == 'A') { + int cnt = ((vinfo_array_t*)args[i])->count; + args[i] = (long)malloc(cnt*sizeof(long)); + } +#if ALL_CHECKS + if (argtags[i] == 'r') + Py_FatalError("psyco_generic_call(): arg mode " + "incompatible with CfPure"); +#endif + } + } + #ifdef __APPLE__ + /* Adjust # of arguments for MacOS 16-byte stack alignment */ + result = psyco_call_var(c_function, (count+3)&~3, args); + #else + result = psyco_call_var(c_function, count, args); + #endif + if (PyErr_Occurred()) { + if (has_refs) + for (i = 0; i < count; i++) + if (argtags[i] == 'a' || argtags[i] == 'A') + free((void*)args[i]); + psyco_virtualize_exception(po); + return NULL; + } + if (has_refs) { + for (i = 0; i < count; i++) + if (argtags[i] == 'a' || argtags[i] == 'A') { + vinfo_array_t* array = (vinfo_array_t*)raw_args[i]; + long sk_flag = (argtags[i] == 'a') ? 0 : SkFlagPyObj; + for (j = 0; j < array->count; j++) { + array->items[j] = vinfo_new(CompileTime_NewSk( + sk_new( ((long*)args[i])[j], sk_flag))); + } + free((void*)args[i]); + } + } + + if (flags & CfPyErrMask) { + /* such functions are rarely pure, but there are + exceptions with CfPyErrNotImplemented */ + vresult = generic_call_ct(flags, result); + if (vresult != NULL) + return vresult; + } + + switch (flags & CfReturnMask) { + + case CfReturnNormal: + vresult = vinfo_new(CompileTime_New(result)); + break; + + case CfReturnRef: + vresult = vinfo_new(CompileTime_NewSk(sk_new(result, + SkFlagPyObj))); + break; + + default: + vresult = (vinfo_t*) 1; /* anything non-NULL */ + } + return vresult; + } + +#ifdef CALL_SET_ARG_FROM_ADDR_CLOBBER_REG + if (has_refs) { + /* we will need a trash register to compute the references + we push later. The following three lines prevent another + argument which would currently be in the same trash + register from being pushed from the register after we + clobbered it. */ + BEGIN_CODE + NEED_REGISTER(CALL_SET_ARG_FROM_ADDR_CLOBBER_REG); + END_CODE + } +#endif + + BEGIN_CODE + NEED_CC(); + + for (count=0; arguments[count]; count++) { + if (argtags[count] == 'v') { + /* We collect all the sources in 'args' now, + before SAVE_REGS_FN_CALLS which might move + some run-time values into the stack. In this + case the old copy in the registers is still + useable to PUSH it for the C function call. */ + RunTimeSource src = ((vinfo_t*)(args[count]))->source; + args[count] = (long) src; + } + } + + SAVE_REGS_FN_CALLS(false); /* CC saved above */ + stackbase = po->stack_depth; + po->stack_depth += totalstackspace; + STACK_CORRECTION(totalstackspace); + CALL_STACK_ALIGN(count); + for (i=count; i--; ) { + switch (argtags[i]) { + + case 'v': + CALL_SET_ARG_FROM_RT (args[i], i, count); + break; + + case 'r': + CALL_SET_ARG_FROM_ADDR (args[i], i, count); + break; + + case 'a': + case 'A': + { + vinfo_array_t* array = (vinfo_array_t*) args[i]; + bool with_reference = (argtags[i] == 'A'); + int j = array->count; + while (j > 0) { + stackbase += sizeof(long); + array->items[--j] = vinfo_new( + RunTime_NewStack(stackbase, + with_reference, false)); + } + CALL_SET_ARG_FROM_ADDR(array->items[0]->source, i,count); + break; + } + + default: + CALL_SET_ARG_IMMED (args[i], i, count); + break; + } + } + CALL_C_FUNCTION (c_function, count); + END_CODE + + switch (flags & CfReturnMask) { + + case CfReturnNormal: + vresult = bfunction_result(po, false); + break; + + case CfReturnRef: + vresult = bfunction_result(po, true); + break; + + default: + if ((flags & CfPyErrMask) == 0) + return (vinfo_t*) 1; /* anything non-NULL */ + + vresult = bfunction_result(po, false); + vresult = generic_call_check(po, flags, vresult); + if (vresult == NULL) + goto error_detected; + vinfo_decref(vresult, po); + return (vinfo_t*) 1; /* anything non-NULL */ + } + + if (flags & CfPyErrMask) { + vresult = generic_call_check(po, flags, vresult); + if (vresult == NULL) + goto error_detected; + } + return vresult; + + error_detected: + /* if the called function returns an error, we then assume that + it did not actually fill the arrays */ + if (has_refs) { + for (i = 0; i < count; i++) + if (argtags[i] == 'a' || argtags[i] == 'A') { + vinfo_array_t* array = (vinfo_array_t*)args[i]; + int j = array->count; + while (j--) { + vinfo_t* v = array->items[j]; + array->items[j] = NULL; + v->source = remove_rtref(v->source); + vinfo_decref(v, po); + } + } + } + + return NULL; +} + + +DEFINEFN +void psyco_inline_enter(PsycoObject* po) +{ + struct stack_frame_info_s* finfo = psyco_finfo(NULL, po); + BEGIN_CODE + ABOUT_TO_CALL_SUBFUNCTION((long) finfo); + END_CODE +} + +DEFINEFN +void psyco_inline_exit (PsycoObject* po) +{ + BEGIN_CODE + RETURNED_FROM_SUBFUNCTION(); + END_CODE +} + + +/*****************************************************************/ + /*** Emit common instructions ***/ + +/* forward */ +static condition_code_t int_cmp_i(PsycoObject* po, vinfo_t* rt1, + long immed2, int py_op); + +DEFINEFN +condition_code_t integer_non_null(PsycoObject* po, vinfo_t* vi) +{ + condition_code_t result; + + if (is_virtualtime(vi->source)) { + result = psyco_vsource_cc(vi->source); + if (result != CC_ALWAYS_FALSE) + return result; + if (!compute_vinfo(vi, po)) + return CC_ERROR; + } + if (is_compiletime(vi->source)) { + if (CompileTime_Get(vi->source)->value != 0) + return CC_ALWAYS_TRUE; + else + return CC_ALWAYS_FALSE; + } + BEGIN_CODE + CHECK_NONZERO_FROM_RT(vi->source, result); + END_CODE + return result; +} + +DEFINEFN +condition_code_t integer_NON_NULL(PsycoObject* po, vinfo_t* vi) +{ + condition_code_t result; + + if (vi == NULL) + return CC_ERROR; + + result = integer_non_null(po, vi); + + /* 'vi' cannot be a reference to a Python object if we are + asking ourselves if it is NULL or not. So the following + vinfo_decref() will not emit a Py_DECREF() that would + clobber the condition code. We check all this. */ +#if ALL_CHECKS + extra_assert(!has_rtref(vi->source)); + { code_t* code1 = po->code; +#endif + vinfo_decref(vi, po); +#if ALL_CHECKS + extra_assert(po->code == code1); } +#endif + return result; +} + +#define GENERIC_BINARY_HEADER \ + if (!compute_vinfo(v2, po) || !compute_vinfo(v1, po)) return NULL + +#define GENERIC_BINARY_HEADER_i \ + if (!compute_vinfo(v1, po)) return NULL + +#define GENERIC_BINARY_CT_CT(c_code) \ + if (is_compiletime(v1->source) && is_compiletime(v2->source)) \ + { \ + long a = CompileTime_Get(v1->source)->value; \ + long b = CompileTime_Get(v2->source)->value; \ + long c = (c_code); \ + return vinfo_new(CompileTime_New(c)); \ + } + +DEFINEFN +vinfo_t* integer_add(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf) +{ + GENERIC_BINARY_HEADER; + if (is_compiletime(v1->source)) + { + long a = CompileTime_Get(v1->source)->value; + if (a == 0) + { + /* adding zero to v2 */ + vinfo_incref(v2); + return v2; + } + if (is_compiletime(v2->source)) + { + long b = CompileTime_Get(v2->source)->value; + long c = a + b; + if (ovf && (c^a) < 0 && (c^b) < 0) + return NULL; /* overflow */ + return vinfo_new(CompileTime_New(c)); + } + if (!ovf) + return bint_add_i(po, v2, a, false); + } + else + if (is_compiletime(v2->source)) + { + long b = CompileTime_Get(v2->source)->value; + if (b == 0) + { + /* adding zero to v1 */ + vinfo_incref(v1); + return v1; + } + if (!ovf) + return bint_add_i(po, v1, b, false); + } + return BINARY_INSTR_ADD(ovf, ovf && is_nonneg(v1->source) + && is_nonneg(v2->source)); +} + +DEFINEFN +vinfo_t* integer_add_i(PsycoObject* po, vinfo_t* v1, long value2, bool unsafe) +{ + if (value2 == 0) + { + /* adding zero to v1 */ + vinfo_incref(v1); + return v1; + } + else + { + GENERIC_BINARY_HEADER_i; + if (is_compiletime(v1->source)) + { + long c = CompileTime_Get(v1->source)->value + value2; + return vinfo_new(CompileTime_New(c)); + } + return bint_add_i(po, v1, value2, unsafe); + } +} + +DEFINEFN +vinfo_t* integer_sub(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf) +{ + GENERIC_BINARY_HEADER; + if (is_compiletime(v1->source)) + { + long a = CompileTime_Get(v1->source)->value; + if (is_compiletime(v2->source)) + { + long b = CompileTime_Get(v2->source)->value; + long c = a - b; + if (ovf && (c^a) < 0 && (c^~b) < 0) + return NULL; /* overflow */ + return vinfo_new(CompileTime_New(c)); + } + } + else + if (is_compiletime(v2->source)) + { + long b = CompileTime_Get(v2->source)->value; + if (b == 0) + { + /* subtracting zero from v1 */ + vinfo_incref(v1); + return v1; + } + if (!ovf) + return bint_add_i(po, v1, -b, false); + } + return BINARY_INSTR_SUB(ovf, false); +} + +DEFINEFN +vinfo_t* integer_or(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) +{ + GENERIC_BINARY_HEADER; + GENERIC_BINARY_CT_CT(a | b); + return BINARY_INSTR_OR(false, is_nonneg(v1->source) && + is_nonneg(v2->source)); +} + +DEFINEFN +vinfo_t* integer_xor(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) +{ + GENERIC_BINARY_HEADER; + GENERIC_BINARY_CT_CT(a ^ b); + return BINARY_INSTR_XOR(false, is_nonneg(v1->source) && + is_nonneg(v2->source)); +} + +DEFINEFN +vinfo_t* integer_and(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) +{ + GENERIC_BINARY_HEADER; + GENERIC_BINARY_CT_CT(a & b); + return BINARY_INSTR_AND(false, is_nonneg(v1->source) || + is_nonneg(v2->source)); +} + +static vinfo_t* int_mul_i(PsycoObject* po, vinfo_t* v1, long value2, + bool ovf) +{ + switch (value2) { + case 0: + return vinfo_new(CompileTime_New(0)); + case 1: + vinfo_incref(v1); + return v1; + } + if (((value2-1) & value2) == 0 && value2 >= 0 && !ovf) + { + /* value2 is a power of two */ + return bint_lshift_i(po, v1, intlog2(value2)); + } + else + { + return bint_mul_i(po, v1, value2, ovf); + } +} + +DEFINEFN +vinfo_t* integer_mul(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf) +{ + GENERIC_BINARY_HEADER; + if (is_compiletime(v1->source)) + { + long a = CompileTime_Get(v1->source)->value; + if (is_compiletime(v2->source)) + { + long b = CompileTime_Get(v2->source)->value; + /* unlike Python, we use a function written in assembly + to perform the product overflow checking */ + if (ovf && psyco_int_mul_ovf(a, b)) + return NULL; /* overflow */ + return vinfo_new(CompileTime_New(a * b)); + } + return int_mul_i(po, v2, a, ovf); + } + else + if (is_compiletime(v2->source)) + { + long b = CompileTime_Get(v2->source)->value; + return int_mul_i(po, v1, b, ovf); + } + return BINARY_INSTR_MUL(ovf, ovf && is_rtnonneg(v1->source) + && is_rtnonneg(v2->source)); +} + +DEFINEFN +vinfo_t* integer_mul_i(PsycoObject* po, vinfo_t* v1, long value2) +{ + GENERIC_BINARY_HEADER_i; + if (is_compiletime(v1->source)) + { + long c = CompileTime_Get(v1->source)->value * value2; + return vinfo_new(CompileTime_New(c)); + } + return int_mul_i(po, v1, value2, false); +} + +DEFINEFN +vinfo_t* integer_lshift(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) +{ + condition_code_t cc; + GENERIC_BINARY_HEADER; + if (is_compiletime(v2->source)) + return integer_lshift_i(po, v1, CompileTime_Get(v2->source)->value); + + cc = int_cmp_i(po, v2, LONG_BIT, Py_GE|COMPARE_UNSIGNED); + if (cc == CC_ERROR) + return NULL; + + if (runtime_condition_f(po, cc)) + { + cc = int_cmp_i(po, v2, 0, Py_LT); + if (cc == CC_ERROR) + return NULL; + if (runtime_condition_f(po, cc)) + { + PycException_SetString(po, PyExc_ValueError, "negative shift count"); + return NULL; + } + return vinfo_new(CompileTime_New(0)); + } + return BINARY_INSTR_LSHIFT(false); +} + +DEFINEFN +vinfo_t* integer_lshift_i(PsycoObject* po, vinfo_t* v1, long counter) +{ + GENERIC_BINARY_HEADER_i; + if (0 < counter && counter < LONG_BIT) + { + if (is_compiletime(v1->source)) + { + long c = CompileTime_Get(v1->source)->value << counter; + return vinfo_new(CompileTime_New(c)); + } + else + return bint_lshift_i(po, v1, counter); + } + else if (counter == 0) + { + vinfo_incref(v1); + return v1; + } + else if (counter >= LONG_BIT) + return vinfo_new(CompileTime_New(0)); + else + { + PycException_SetString(po, PyExc_ValueError, "negative shift count"); + return NULL; + } +} + +DEFINEFN /* signed */ +vinfo_t* integer_rshift(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) +{ + condition_code_t cc; + GENERIC_BINARY_HEADER; + if (is_compiletime(v2->source)) + return integer_rshift_i(po, v1, CompileTime_Get(v2->source)->value); + + cc = int_cmp_i(po, v2, LONG_BIT, Py_GE|COMPARE_UNSIGNED); + if (cc == CC_ERROR) + return NULL; + + if (runtime_condition_f(po, cc)) + { + cc = int_cmp_i(po, v2, 0, Py_LT); + if (cc == CC_ERROR) + return NULL; + if (runtime_condition_f(po, cc)) + { + PycException_SetString(po, PyExc_ValueError, "negative shift count"); + return NULL; + } + return integer_rshift_i(po, v1, LONG_BIT-1); + } + return BINARY_INSTR_RSHIFT(is_nonneg(v1->source)); +} + +DEFINEFN /* signed */ +vinfo_t* integer_rshift_i(PsycoObject* po, vinfo_t* v1, long counter) +{ + GENERIC_BINARY_HEADER_i; + if (counter >= LONG_BIT-1) + { + if (is_nonneg(v1->source)) + return vinfo_new(CompileTime_New(0)); + counter = LONG_BIT-1; + } + if (counter > 0) + { + if (is_compiletime(v1->source)) + { + long c = ((long)(CompileTime_Get(v1->source)->value)) >> counter; + return vinfo_new(CompileTime_New(c)); + } + else + return bint_rshift_i(po, v1, counter); + } + else if (counter == 0) + { + vinfo_incref(v1); + return v1; + } + else + { + PycException_SetString(po, PyExc_ValueError, "negative shift count"); + return NULL; + } +} + +DEFINEFN +vinfo_t* integer_urshift_i(PsycoObject* po, vinfo_t* v1, long counter) +{ + GENERIC_BINARY_HEADER_i; + if (0 < counter && counter < LONG_BIT) + { + if (is_compiletime(v1->source)) + { + long c = ((unsigned long)(CompileTime_Get(v1->source)->value)) >> counter; + return vinfo_new(CompileTime_New(c)); + } + else + return bint_urshift_i(po, v1, counter); + } + else if (counter == 0) + { + vinfo_incref(v1); + return v1; + } + else if (counter >= LONG_BIT) + return vinfo_new(CompileTime_New(0)); + else + { + PycException_SetString(po, PyExc_ValueError, "negative shift count"); + return NULL; + } +} + +/* DEFINEFN */ +/* vinfo_t* integer_lshift(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) */ +/* { */ +/* NonVirtualSource v1s, v2s; */ +/* v2s = vinfo_compute(v2, po); */ +/* if (v2s == SOURCE_ERROR) return NULL; */ +/* if (is_compiletime(v2s)) */ +/* return integer_lshift_i(po, v1, CompileTime_Get(v2s)->value); */ + +/* v1s = vinfo_compute(v1, po); */ +/* if (v1s == SOURCE_ERROR) return NULL; */ +/* XXX implement me */ +/* } */ + +#define GENERIC_UNARY_HEADER \ + if (!compute_vinfo(v1, po)) return NULL; + +#define GENERIC_UNARY_CT(c_code, ovf, c_ovf) \ + if (is_compiletime(v1->source)) \ + { \ + long a = CompileTime_Get(v1->source)->value; \ + long c = (c_code); \ + if ((ovf) && (c_ovf)) \ + return NULL; \ + return vinfo_new(CompileTime_New(c)); \ + } + +DEFINEFN +vinfo_t* integer_inv(PsycoObject* po, vinfo_t* v1) +{ + GENERIC_UNARY_HEADER; + GENERIC_UNARY_CT(~a, false, false); + return UNARY_INSTR_INV(false, false); +} + +DEFINEFN +vinfo_t* integer_neg(PsycoObject* po, vinfo_t* v1, bool ovf) +{ + GENERIC_UNARY_HEADER; + GENERIC_UNARY_CT(-a, ovf, c == (-LONG_MAX-1)); + return UNARY_INSTR_NEG(ovf, false); +} + +DEFINEFN +vinfo_t* integer_abs(PsycoObject* po, vinfo_t* v1, bool ovf) +{ + GENERIC_UNARY_HEADER; + if (is_nonneg(v1->source)) + { + vinfo_incref(v1); + return v1; + } + GENERIC_UNARY_CT(a<0 ? -a : a, ovf, c == (-LONG_MAX-1)); + return UNARY_INSTR_ABS(ovf, true); /* nb. result assumed to be positive, + which is false in case of overflow */ +} + +static condition_code_t immediate_compare(long a, long b, int base_py_op) +{ + switch (base_py_op) { + case Py_LT: return a < b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_LE: return a <= b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_EQ|COMPARE_UNSIGNED: + case Py_EQ: return a == b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_NE|COMPARE_UNSIGNED: + case Py_NE: return a != b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_GT: return a > b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_GE: return a >= b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + + case Py_LT|COMPARE_UNSIGNED: return ((unsigned long) a) < ((unsigned long) b) + ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_LE|COMPARE_UNSIGNED: return ((unsigned long) a) <= ((unsigned long) b) + ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_GT|COMPARE_UNSIGNED: return ((unsigned long) a) > ((unsigned long) b) + ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + case Py_GE|COMPARE_UNSIGNED: return ((unsigned long) a) >= ((unsigned long) b) + ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; + default: + Py_FatalError("immediate_compare(): bad py_op"); + return CC_ERROR; + } +} + +static condition_code_t int_cmp_i(PsycoObject* po, vinfo_t* rt1, + long immed2, int py_op) +{ + int base_py_op = py_op & COMPARE_OP_MASK; + extra_assert(is_runtime(rt1->source)); + /* detect easy cases */ + if (immed2 == 0) + { + if (is_rtnonneg(rt1->source)) /* if we know that rt1>=0 */ + switch (base_py_op) { + case Py_LT: /* rt1 < 0 */ + return CC_ALWAYS_FALSE; + case Py_GE: /* rt1 >= 0 */ + return CC_ALWAYS_TRUE; + default: + ; /* pass */ + } + switch (base_py_op) { + case Py_LT|COMPARE_UNSIGNED: /* (unsigned) rt1 < 0 */ + return CC_ALWAYS_FALSE; + case Py_GE|COMPARE_UNSIGNED: /* (unsigned) rt1 >= 0 */ + return CC_ALWAYS_TRUE; + default: + ; /* pass */ + } + } + else if (immed2 < 0) + { + if (is_rtnonneg(rt1->source)) /* rt1>=0 && immed2<0 */ + { + switch (base_py_op) { + case Py_EQ: /* rt1 == immed2 */ + case Py_LT: /* rt1 < immed2 */ + case Py_LE: /* rt1 <= immed2 */ + case Py_GT|COMPARE_UNSIGNED: /* (unsigned) rt1 > immed2 */ + case Py_GE|COMPARE_UNSIGNED: /* (unsigned) rt1 >= immed2 */ + return CC_ALWAYS_FALSE; + case Py_NE: /* rt1 != immed2 */ + case Py_GE: /* rt1 >= immed2 */ + case Py_GT: /* rt1 > immed2 */ + case Py_LE|COMPARE_UNSIGNED: /* (unsigned) rt1 <= immed2 */ + case Py_LT|COMPARE_UNSIGNED: /* (unsigned) rt1 < immed2 */ + return CC_ALWAYS_TRUE; + default: + ; /* pass */ + } + } + if (immed2 == LONG_MIN) + { + switch (base_py_op) { + case Py_LT: /* rt1 < LONG_MIN */ + return CC_ALWAYS_FALSE; + case Py_GE: /* rt1 >= LONG_MIN */ + return CC_ALWAYS_TRUE; + case Py_EQ: /* rt1 == LONG_MIN */ + case Py_LE: /* rt1 <= LONG_MIN */ + if (py_op & CHEAT_MAXINT) return CC_ALWAYS_FALSE; + break; + case Py_NE: /* rt1 != LONG_MIN */ + case Py_GT: /* rt1 > LONG_MIN */ + if (py_op & CHEAT_MAXINT) return CC_ALWAYS_TRUE; + break; + default: + ; /* pass */ + } + } + } + else if (immed2 == LONG_MAX) + { + if (is_rtnonneg(rt1->source)) /* if we know that rt1>=0 */ + { + switch (base_py_op) { + case Py_GT|COMPARE_UNSIGNED: /* (unsigned) rt1 > LONG_MAX */ + return CC_ALWAYS_FALSE; + case Py_LE|COMPARE_UNSIGNED: /* (unsigned) rt1 <= LONG_MAX */ + return CC_ALWAYS_TRUE; + case Py_GE|COMPARE_UNSIGNED: /* (unsigned) rt1 >= LONG_MAX */ + if (py_op & CHEAT_MAXINT) return CC_ALWAYS_FALSE; + break; + case Py_LT|COMPARE_UNSIGNED: /* (unsigned) rt1 < LONG_MAX */ + if (py_op & CHEAT_MAXINT) return CC_ALWAYS_TRUE; + break; + default: + ; /* pass */ + } + } + switch (base_py_op) { + case Py_LE: /* rt1 <= LONG_MAX */ + return CC_ALWAYS_TRUE; + case Py_GT: /* rt1 > LONG_MAX */ + return CC_ALWAYS_FALSE; + case Py_EQ: /* rt1 == LONG_MAX */ + case Py_GE: /* rt1 >= LONG_MAX */ + if (py_op & CHEAT_MAXINT) return CC_ALWAYS_FALSE; + break; + case Py_NE: /* rt1 != LONG_MAX */ + case Py_LT: /* rt1 < LONG_MAX */ + if (py_op & CHEAT_MAXINT) return CC_ALWAYS_TRUE; + break; + default: + ; /* pass */ + } + } + /* end of easy cases */ + return bint_cmp_i(po, base_py_op, rt1, immed2); +} + +static const int inverted_py_op[8] = { + /* Py_LT: */ Py_GT, + /* Py_LE: */ Py_GE, + /* Py_EQ: */ Py_EQ, + /* Py_NE: */ Py_NE, + /* Py_GT: */ Py_LT, + /* Py_GE: */ Py_LE, + /* (6) */ -1, + /* (7) */ -1 }; + +DEFINEFN +condition_code_t integer_cmp(PsycoObject* po, vinfo_t* v1, + vinfo_t* v2, int py_op) +{ + int base_py_op = py_op & COMPARE_OP_MASK; + + if (vinfo_known_equal(v1, v2)) + goto same_source; + + if (!compute_vinfo(v1, po) || !compute_vinfo(v2, po)) + return CC_ERROR; + + if (vinfo_known_equal(v1, v2)) + { + same_source: + /* comparing equal sources */ + switch (base_py_op) { + case Py_LE: + case Py_EQ: + case Py_GE: + return CC_ALWAYS_TRUE; + default: + return CC_ALWAYS_FALSE; + } + } + if (is_compiletime(v1->source)) + if (is_compiletime(v2->source)) + { + long a = CompileTime_Get(v1->source)->value; + long b = CompileTime_Get(v2->source)->value; + return immediate_compare(a, b, base_py_op); + } + else + { + /* invert the two operands because (assumedly) the processor has + only CMP xxx,immed and not CMP immed,xxx */ + py_op = inverted_py_op[py_op & COMPARE_BASE_MASK] | + (py_op & ~COMPARE_BASE_MASK); + return int_cmp_i(po, v2, CompileTime_Get(v1->source)->value, py_op); + } + else + if (is_compiletime(v2->source)) + { + return int_cmp_i(po, v1, CompileTime_Get(v2->source)->value, py_op); + } + else + { + return BINARY_INSTR_CMP(base_py_op); + } +} + +DEFINEFN +condition_code_t integer_cmp_i(PsycoObject* po, vinfo_t* v1, + long value2, int py_op) +{ + if (!compute_vinfo(v1, po)) return CC_ERROR; + + if (is_compiletime(v1->source)) + { + long a = CompileTime_Get(v1->source)->value; + return immediate_compare(a, value2, py_op); + } + else + return int_cmp_i(po, v1, value2, py_op); +} + +DEFINEFN +vinfo_t* integer_conditional(PsycoObject* po, condition_code_t cc, + long immed_true, long immed_false) +{ + switch ((int)cc) { + case (int)CC_ALWAYS_FALSE: + return vinfo_new(CompileTime_New(immed_false)); + + case (int)CC_ALWAYS_TRUE: + return vinfo_new(CompileTime_New(immed_true)); + + default: + return BINARY_INSTR_COND(cc, immed_true, immed_false); + } +} + + +INITIALIZATIONFN +void psyco_codegen_init(void) +{ +#if HAVE_CCREG + int i; + for (i=0; i + +#if SIZEOF_LONG == 4 +# define SIZE_OF_LONG_BITS 2 +#else +# error "-----------------------------------------------------" +# error "Sorry, non-32-bit platforms are not supported at all." +# error "You may try with a Python compiled in 32-bit " +# error "compatibility mode. Note that Psyco will probably " +# error "never support non-32-bit platforms, as it is no " +# error "longer actively developed. Instead, the PyPy group " +# error "plans to replace it with a more flexible and easily " +# error "retargettable Psyco-for-PyPy during the year 2006. " +# error "See http://codespeak.net/pypy/ " +# error "-----------------------------------------------------" +#endif + +#if SIZEOF_LONG != SIZEOF_VOID_P +# error "Sorry, your platform is not supported at all." +# error "Psyco currently requires sizeof(long)==sizeof(void*)." +#endif + +#define INITIAL_STACK_DEPTH 4 /* anything >0 and a multiple of 4 */ + + +/***************************************************************/ + /*** Condition Codes (a.k.a. the processor 'flags' register) ***/ + +/* return a new vinfo_t* meaning `in the processor flags, true if ', + as an integer 0 or 1. The source of the vinfo_t* is compile-time + if cc is CC_ALWAYS_TRUE/FALSE, and virtual-time otherwise. */ +EXTERNFN vinfo_t* psyco_vinfo_condition(PsycoObject* po, condition_code_t cc); +EXTERNFN VirtualTimeSource psyco_source_condition(condition_code_t cc); + +/* if 'source' comes from psyco_vinfo_condition(), return its ; + otherwise return CC_ALWAYS_FALSE. */ +#if HAVE_CCREG +EXTERNFN condition_code_t psyco_vsource_cc(Source source); +EXTERNFN void psyco_resolved_cc(PsycoObject* po, condition_code_t cc_known_true); +#else +# define psyco_vsource_cc(src) CC_ALWAYS_FALSE +#endif + + +/***************************************************************/ + /*** Read/write memory ***/ + +/* access the data word at address 'nv_ptr + offset + (rt_vindex<refcount1_flags & SkFlagPyObj) != 0) { + /* XXX we get a reference from the code. + Implement freeing such references + together with code buffers. */ + sk_incref(sk); + } + return sk->value; +} +#endif + + +/*****************************************************************/ + /*** Calling C functions ***/ + +/* A generic way of emitting the call to a C function. + For maximal performance you can also directly use the macros + CALL_C_FUNCTION()&co. in encoding.h. + + 'arguments' is a string describing the following arguments + of psyco_generic_call(). Each argument to the C function to call + comes from a 'vinfo_t*' structure, excepted when it is known to be + compile-time, in which case a 'long' or 'PyObject*' can be passed + instead. In 'arguments' the characters are interpreted as follows: + + l an immediate 'long' or 'PyObject*' value + v a 'vinfo_t*' value + r a run-time 'vinfo_t*' value passed as a reference + a a 'vinfo_array_t*' used by the C function as output buffer + A same as 'a', but the C function creates new references + + 'r' means that the C function wants to get a reference to a + single-word value (typically it is an output argument). The + run-time value is pushed in the stack if it is just in a + register. Incompatible with CfPure. + + 'a' means that the C function gets a pointer to a buffer capable of + containing as many words as specified by the array count. + psyco_generic_call() fills the array with run-time vinfo_ts + representing the output values. +*/ +EXTERNFN vinfo_t* psyco_generic_call(PsycoObject* po, void* c_function, + int flags, const char* arguments, ...); + +/* if the C function has no side effect it can be called at compile-time + if all its arguments are compile-time. Use CfPure in this case. */ +#define CfPure 0x10 + +/* if the C function returns a long or a PyObject* but not a new reference */ +#define CfReturnNormal 0x00 /* default */ + +/* if the C function returns a new reference */ +#define CfReturnRef 0x01 + +/* if the C function does not return anything + or if you are not interested in getting the result in a vinfo_t. + psyco_generic_call() returns anything non-NULL (unless there is an error) + in this case. */ +#define CfNoReturnValue 0x03 + +#define CfReturnMask 0x0F +/* See also the Python-specific flags CfPyErrXxx defined in pycheader.h. */ + + +/* To emit the call to other code blocks emitted by Psyco. 'argsources' gives + the run-time sources for the arguments, as specified by + psyco_build_frame(). */ +EXTERNFN vinfo_t* psyco_call_psyco(PsycoObject* po, CodeBufferObject* codebuf, + Source argsources[], int argcount, + struct stack_frame_info_s* finfo); + +PSY_INLINE int get_arguments_count(vinfo_array_t* vlocals) { + int retpos = getstack(vlocals->items[INDEX_LOC_CONTINUATION]->source); + extra_assert(retpos != RunTime_StackNone); + return (retpos-(INITIAL_STACK_DEPTH+sizeof(long))) / sizeof(long); +} + +/* Emit the code to mark the presence of an inlined frame */ +EXTERNFN void psyco_inline_enter(PsycoObject* po); +EXTERNFN void psyco_inline_exit (PsycoObject* po); + + +/*****************************************************************/ + /*** Emit common instructions ***/ + +/* Returns a condition code for: "'vi' is not null". Warning, when a + function returns a condition code it must be used immediately, before + there is any chance for new code to be emitted. If you are unsure, use + psyco_vinfo_condition() to turn the condition code into a 0 or 1 integer. */ +EXTERNFN condition_code_t integer_non_null(PsycoObject* po, vinfo_t* vi); + +/* Same as above, but consumes the reference on 'vi'. Also checks if + 'vi==NULL' and returns CC_ERROR in this case. */ +EXTERNFN condition_code_t integer_NON_NULL(PsycoObject* po, vinfo_t* vi); + +/* Instructions with an 'ovf' parameter will check for overflow + if 'ovf' is true. They return NULL if an overflow is detected. */ +EXTERNFN +vinfo_t* integer_add (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf); +EXTERNFN /* 'unsafe': optimize by silently assuming no overflow is possible */ +vinfo_t* integer_add_i(PsycoObject* po, vinfo_t* v1, long value2, bool unsafe); +EXTERNFN +vinfo_t* integer_sub (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf); +/*EXTERNFN XXX implement me + vinfo_t* integer_sub_i(PsycoObject* po, vinfo_t* v1, long value2);*/ +EXTERNFN +vinfo_t* integer_mul (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf); +EXTERNFN +vinfo_t* integer_mul_i(PsycoObject* po, vinfo_t* v1, long value2); +EXTERNFN +vinfo_t* integer_or (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); +EXTERNFN +vinfo_t* integer_xor (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); +EXTERNFN +vinfo_t* integer_and (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); +/*EXTERNFN + vinfo_t* integer_and_i(PsycoObject* po, vinfo_t* v1, long value2);*/ +EXTERNFN +vinfo_t* integer_lshift (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); +EXTERNFN /* signed */ +vinfo_t* integer_rshift (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); +/*EXTERNFN unsigned + vinfo_t* integer_urshift (PsycoObject* po, vinfo_t* v1, vinfo_t* v2);*/ +EXTERNFN +vinfo_t* integer_lshift_i(PsycoObject* po, vinfo_t* v1, long counter); +EXTERNFN /* signed */ +vinfo_t* integer_rshift_i(PsycoObject* po, vinfo_t* v1, long counter); +EXTERNFN /* unsigned */ +vinfo_t* integer_urshift_i(PsycoObject* po, vinfo_t* v1, long counter); +EXTERNFN +vinfo_t* integer_inv (PsycoObject* po, vinfo_t* v1); +EXTERNFN +vinfo_t* integer_neg (PsycoObject* po, vinfo_t* v1, bool ovf); +EXTERNFN +vinfo_t* integer_abs (PsycoObject* po, vinfo_t* v1, bool ovf); +/* Comparison: 'py_op' is one of Python's rich comparison numbers + Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE + optionally together with COMPARE_UNSIGNED, CHEAT_MAXINT. */ +EXTERNFN condition_code_t integer_cmp (PsycoObject* po, vinfo_t* v1, + vinfo_t* v2, int py_op); +EXTERNFN condition_code_t integer_cmp_i(PsycoObject* po, vinfo_t* v1, + long value2, int py_op); +#define COMPARE_UNSIGNED 8 +#define CHEAT_MAXINT 16 /* assume only a constant can be exactly + LONG_MIN or LONG_MAX */ +#define COMPARE_BASE_MASK 7 +#define COMPARE_OP_MASK 15 + +/* Return one of two constants, depending on the condition code */ +EXTERNFN vinfo_t* integer_conditional(PsycoObject* po, condition_code_t cc, + long immed_true, long immed_false); + +/* make a run-time copy of a vinfo_t */ +EXTERNFN vinfo_t* make_runtime_copy(PsycoObject* po, vinfo_t* v); + +PSY_INLINE int intlog2(long value) { + int counter = 0; + while ((1<array == NullArrayAt(rts->zero); +} + +#endif /* USE_RUNTIME_SWITCHES */ + + +/* The pseudo-exceptions meaning 'promote me' but against no particular + fixed_switch_t. The second one has the SkFlagPyObj flag. */ +EXTERNVAR c_promotion_t psyco_nonfixed_promotion; +EXTERNVAR c_promotion_t psyco_nonfixed_pyobj_promotion; + +/* The same, but detecting megamorphic sites, where many different run-time + values keep showing up. Promotion stop after MEGAMORPHIC_MAX different + values. */ +/*EXTERNVAR c_promotion_t psyco_nonfixed_promotion_mega;*/ +EXTERNVAR c_promotion_t psyco_nonfixed_pyobj_promotion_mega; + +#define MEGAMORPHIC_MAX 5 + +/* Check if the given virtual source is a promotion exception */ +EXTERNFN bool psyco_vsource_is_promotion(VirtualTimeSource source); + + +#endif /* _CODEGEN_H */ diff --git a/nodeboxgl/ext/psyco/src/c/codemanager.c b/nodeboxgl/ext/psyco/src/c/codemanager.c new file mode 100644 index 0000000..7b4141d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/codemanager.c @@ -0,0 +1,374 @@ +#include "codemanager.h" +#include +#include "platform.h" + +/*** Allocators for Large Executable Blocks of Memory ***/ + +#define BUFFER_SIGNATURE 0xE673B506 /* arbitrary */ + +typedef struct codemanager_buf_s { + long signature; + char* position; + bool inuse; + struct codemanager_buf_s* next; +} codemanager_buf_t; + +static codemanager_buf_t* big_buffers = NULL; +static codemanager_buf_t* completed_big_buffers = NULL; + + +PSY_INLINE void check_signature(codemanager_buf_t* b) +{ + if (b->signature != BUFFER_SIGNATURE) + Py_FatalError("psyco: code buffer overwrite detected"); +} + +static void allocate_more_buffers(codemanager_buf_t** bb) +{ + static char plat_ok = 0; + char* p; + long allocated; + int num_bigblocks = 0; + + if (plat_ok != 'n') + { + /* try the platform-specific allocator */ + allocated = psyco_allocate_executable_buffer(BIG_BUFFER_SIZE, &p); + num_bigblocks = allocated / BIG_BUFFER_SIZE; + if (num_bigblocks <= 0) + { + /* failed */ + if (plat_ok == 0) + plat_ok = 'n'; /* doesn't work, don't try again */ + else + OUT_OF_MEMORY(); + } + else + plat_ok = 'y'; /* works */ + } + if (num_bigblocks <= 0) + { + p = (char*) PyMem_MALLOC(BIG_BUFFER_SIZE); + if (p == NULL) + OUT_OF_MEMORY(); + num_bigblocks = 1; + } + while (--num_bigblocks >= 0) + { + /* the codemanager_buf_t structure is put at the end of the buffer, + with its signature to detect overflows (just in case) */ +#define BUFFER_START_OFFSET (BIG_BUFFER_SIZE - sizeof(codemanager_buf_t)) + codemanager_buf_t* b; + b = (codemanager_buf_t*) (p + BUFFER_START_OFFSET); + b->signature = BUFFER_SIGNATURE; + b->position = p; + b->next = NULL; + /* insert 'b' at the end of the chained list */ + *bb = b; + bb = &b->next; + p += BIG_BUFFER_SIZE; + } +} + +static code_t* get_next_buffer(code_t** limit) +{ + codemanager_buf_t* b; + codemanager_buf_t** bb; + for (b=big_buffers; b!=NULL; b=b->next) + { + check_signature(b); + if (!b->inuse) + break; /* returns the first (oldest) unlocked buffer */ + } + + if (b == NULL) + { + /* no more free buffers, allocate one or a few new ones */ + for (bb=&big_buffers; *bb!=NULL; bb=&(*bb)->next) + ; + allocate_more_buffers(bb); + b = *bb; + } + b->inuse = true; + *limit = ((code_t*) b) - GUARANTEED_MINIMUM; + return (code_t*) b->position; +} + +DEFINEFN int psyco_locked_buffers(void) +{ + codemanager_buf_t* b; + int count = 0; + for (b=big_buffers; b!=NULL; b=b->next) + if (b->inuse) + count++; + return count; +} + +static void close_buffer_use(code_t* code) +{ + codemanager_buf_t* b; + for (b=big_buffers; b!=NULL; b=b->next) + { + check_signature(b); + if (b->position <= (char*) code && (char*) code <= (char*) b) + { + extra_assert(b->inuse); + ALIGN_NO_FILL(); + /* unlock the buffer */ + psyco_memory_usage += (char*) code - b->position; + b->position = (char*) code; + b->inuse = false; + + if (code > ((code_t*) b) - (BUFFER_MARGIN+2*GUARANTEED_MINIMUM)) + { + /* buffer nearly full, remove it from the chained list */ + codemanager_buf_t** bb; + for (bb=&big_buffers; *bb!=b; bb=&(*bb)->next) + ; + *bb = b->next; + /* add it to the list of completed buffers */ + b->next = completed_big_buffers; + completed_big_buffers = b; + } + return; + } + } + Py_FatalError("psyco: code buffer allocator corruption"); +} + + +static CodeBufferObject* new_code_buffer(PsycoObject* po, global_entries_t* ge, + code_t* proxy_to, code_t** plimit) +{ + CodeBufferObject* b; + code_t* limit; + psyco_trash_object(NULL); + if (plimit == NULL) + plimit = &limit; + + b = PyObject_New(CodeBufferObject, &CodeBuffer_Type); + if (b == NULL) + OUT_OF_MEMORY(); + if (proxy_to != NULL) + { + *plimit = NULL; + b->codestart = proxy_to; /* points inside another code buffer */ + SET_CODEMODE(b, "proxy"); + } + else + { + /* start a new code buffer */ + b->codestart = get_next_buffer(plimit); + SET_CODEMODE(b, "(compiling)"); + } + debug_printf(3, ("%s code buffer %p\n", + proxy_to==NULL ? "new" : "proxy", b->codestart)); + + fpo_mark_new(&b->snapshot); + if (po == NULL) + fpo_mark_unused(&b->snapshot); + else + { + if (is_respawning(po)) + Py_FatalError("psyco: internal bug: respawning in new_code_buffer()"); + fpo_build(&b->snapshot, po); + if (ge != NULL) + register_codebuf(ge, b); + po->respawn_cnt = 0; + po->respawn_proxy = b; + } + return b; +} + +DEFINEFN +CodeBufferObject* psyco_new_code_buffer(PsycoObject* po, global_entries_t* ge, code_t** plimit) +{ + return new_code_buffer(po, ge, NULL, plimit); +} + +DEFINEFN +CodeBufferObject* psyco_proxy_code_buffer(PsycoObject* po, global_entries_t* ge) +{ + return new_code_buffer(po, ge, po->code, NULL); +} + +#if 0 /* not used any more */ +DEFINEFN +CodeBufferObject* psyco_minimal_code_buffer(code_t* code) +{ + return new_code_buffer(NULL, NULL, code, NULL); +} +#endif + +#if 0 /* not used in this version */ +DEFINEFN +CodeBufferObject* psyco_new_code_buffer_size(int size) +{ + PyObject* o; + CodeBufferObject* b; + + /* PyObject_New is inlined */ + o = PyObject_MALLOC(sizeof(CodeBufferObject) + size); + if (o == NULL) + return (CodeBufferObject*) PyErr_NoMemory(); + b = (CodeBufferObject*) PyObject_INIT(o, &CodeBuffer_Type); + b->codestart = (code_t*) (b + 1); + b->po = NULL; + debug_printf(3, ("new_code_buffer_size(%d) %p\n", size, b->codestart)); + return b; +} +#endif + +#if CODE_DUMP +DEFINEVAR CodeBufferObject* psyco_codebuf_chained_list = NULL; +DEFINEVAR void** psyco_codebuf_spec_dict_list = NULL; +#endif + +DEFINEFN +void psyco_shrink_code_buffer(CodeBufferObject* obj, code_t* codeend) +{ + /* Note: "disassemble" will give a wrong size estimation if the buffer has + been split by END_CODE (which occurs very rarely) */ + debug_printf(3, ("disassemble %p %p (%d bytes)\n", obj->codestart, + codeend, codeend - ((code_t*)obj->codestart))); + if (VERBOSE_LEVEL == 2) + fprintf(stderr, "[%d]", codeend - ((code_t*)obj->codestart)); + + close_buffer_use(codeend); + SET_CODEMODE(obj, "normal"); + +#if CODE_DUMP + obj->chained_list = psyco_codebuf_chained_list; + psyco_codebuf_chained_list = obj; +#endif +} + +/* int psyco_tie_code_buffer(PsycoObject* po) */ +/* { */ +/* CodeBufferObject* b = po->respawn_proxy; */ +/* global_entries_t* ge = GET_UNUSED_SNAPSHOT(b->snapshot); */ +/* if (psyco_snapshot(b, po, ge)) */ +/* return -1; */ +/* po->respawn_cnt = 0; */ +/* return 0; */ +/* } */ + +DEFINEFN +void psyco_emergency_enlarge_buffer(code_t** pcode, code_t** pcodelimit) +{ + code_t* code = *pcode; + code_t* nextcode; + if (code - *pcodelimit > GUARANTEED_MINIMUM - MAXIMUM_SIZE_OF_FAR_JUMP) + Py_FatalError("psyco: code buffer overflowing"); + + nextcode = get_next_buffer(pcodelimit); + debug_printf(2, ("emergency enlarge buffer %p -> %p\n", code, nextcode)); + JUMP_TO(nextcode); + close_buffer_use(code); + + *pcode = insn_code_label(nextcode); +} + +#if CODE_DUMP +DEFINEFN +void psyco_dump_bigbuffers(FILE* f) +{ + codemanager_buf_t* b; + for (b = completed_big_buffers; b; b = b->next) + { + char* start = ((char*) b) - BUFFER_START_OFFSET; + size_t size = b->position-start; + fprintf(f, "BigBuffer 0x%lx %d\n", (long) start, size); + fwrite(start, 1, size, f); + } + for (b = big_buffers; b; b = b->next) + { + char* start = ((char*) b) - BUFFER_START_OFFSET; + size_t size = b->position-start; + fprintf(f, "BigBuffer 0x%lx %d\n", (long) start, size); + fwrite(start, 1, size, f); + if (b->inuse) + fprintf(stderr, "warning, BigBuffer at %p still in use\n", + b->position); + } +} +#endif + + +/*****************************************************************/ + +static PyObject* trashed = NULL; + +DEFINEFN +void psyco_trash_object(PyObject* obj) +{ + Py_XDECREF(trashed); + trashed = obj; +} + + +/*****************************************************************/ + +static PyObject* codebuf_repr(CodeBufferObject* self) +{ + char buf[100]; + sprintf(buf, "", + self->codestart, self); + return PyString_FromString(buf); +} + +static void codebuf_dealloc(CodeBufferObject* self) +{ +#if CODE_DUMP + CodeBufferObject** ptr = &psyco_codebuf_chained_list; +/*void** chain;*/ + while (*ptr != NULL) + { + if (*ptr == self) + { + *ptr = self->chained_list; + break; + } + ptr = &((*ptr)->chained_list); + } +/* for (chain = psyco_codebuf_spec_dict_list; chain; chain=(void**)*chain) */ +/* if (self->codestart < (code_t*)chain && (code_t*)chain <= self->codeend) */ +/* assert(!"releasing a code buffer with a spec_dict"); */ +#endif + debug_printf(3, ("releasing code buffer %p at %p\n", + self->codestart, self)); + fpo_release(&self->snapshot); + +/* #if defined(ALL_CHECKS) && defined(STORE_CODE_END) */ +/* if (self->codeend != NULL) */ +/* { */ +/* * do not actully release, to detect calls to released code * */ +/* * 0xCC is the breakpoint instruction (INT 3) * */ +/* memset(self->codestart, 0xCC, self->codeend - self->codeptr); */ +/* return; */ +/* } */ +/* #endif */ + + PyObject_Del(self); +} + +DEFINEVAR +PyTypeObject CodeBuffer_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "CodeBuffer", /*tp_name*/ + sizeof(CodeBufferObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)codebuf_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + (reprfunc)codebuf_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ +}; diff --git a/nodeboxgl/ext/psyco/src/c/codemanager.h b/nodeboxgl/ext/psyco/src/c/codemanager.h new file mode 100644 index 0000000..67e55cf --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/codemanager.h @@ -0,0 +1,88 @@ + /***************************************************************/ +/*** Support to manage the emitted code chunks ***/ + /***************************************************************/ + +#ifndef _CODEMANAGER_H +#define _CODEMANAGER_H + + +#include "psyco.h" +#include "dispatcher.h" + + +#define WARN_TOO_MANY_BUFFERS 6 /* to detect missing buffer unlocks */ + + +/* a CodeBufferObject is a pointer to emitted code. + The 'state' PsycoObject records the state of the compiler at + the start of the emission of code. Consider this field as private. + Future versions of the code manager will probably encode the recorded + states in a more sophisticated form than just a dump copy. + (There are usually a lot of small CodeBufferObjects, so if each + one has a full copy of the state big projects will explode the memory.) +*/ +struct CodeBufferObject_s { + PyObject_HEAD + void* codestart; + FrozenPsycoObject snapshot; + +#if CODE_DUMP + char* codemode; + CodeBufferObject* chained_list; +#endif +}; + +#if CODE_DUMP +EXTERNVAR CodeBufferObject* psyco_codebuf_chained_list; +EXTERNVAR void** psyco_codebuf_spec_dict_list; +EXTERNFN void psyco_dump_bigbuffers(FILE* f); +# define SET_CODEMODE(b, mode) ((b)->codemode = (mode)) +#else +# define SET_CODEMODE(b, mode) do { } while (0) /* nothing */ +#endif + + +#define CodeBuffer_Check(v) ((v)->ob_type == &CodeBuffer_Type) +EXTERNVAR PyTypeObject CodeBuffer_Type; + + +/* starts a new code buffer. The limit is returned in the optional last argument. + 'po' is the state of the compiler at this point, of which a + frozen copy will be made. It can be NULL. If not, set 'ge' as in + psyco_compile(). */ +EXTERNFN +CodeBufferObject* psyco_new_code_buffer(PsycoObject* po, global_entries_t* ge, code_t** plimit); + +/* creates a CodeBufferObject pointing to an already existing code target */ +EXTERNFN +CodeBufferObject* psyco_proxy_code_buffer(PsycoObject* po, global_entries_t* ge); + +#if 0 /* creates a minimal CodeBufferObject with only a code pointer */ +EXTERNFN +CodeBufferObject* psyco_minimal_code_buffer(code_t* code); +#endif + +/* shrink a buffer returned by new_code_buffer() */ +EXTERNFN +void psyco_shrink_code_buffer(CodeBufferObject* obj, code_t* codeend); + +/* emergency enlarge a buffer (by coding a jump to a new buffer) */ +EXTERNFN +void psyco_emergency_enlarge_buffer(code_t** pcode, code_t** pcodelimit); + +EXTERNFN +int psyco_locked_buffers(void); + +#define SHRINK_CODE_BUFFER(obj, nend, mode) do { \ + psyco_shrink_code_buffer(obj, nend); \ + SET_CODEMODE(obj, mode); \ +} while (0) + + +/* a replacement for Py_XDECREF(obj) which does not release the object + immediately, but only at the next call to psyco_trash_object() */ +EXTERNFN +void psyco_trash_object(PyObject* obj); + + +#endif /* _CODEMANAGER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/cstruct.c b/nodeboxgl/ext/psyco/src/c/cstruct.c new file mode 100644 index 0000000..da9f623 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/cstruct.c @@ -0,0 +1,93 @@ +#include "cstruct.h" + + +DEFINEFN +PyObject* PyCStruct_New(size_t size, destructor d) +{ + cstruct_header_t* cs; + cs = (cstruct_header_t*) PyObject_Malloc(size); + if (cs == NULL) + OUT_OF_MEMORY(); + PyObject_INIT(cs, &PyCStruct_Type); + cs->cs_destructor = d; + cs->cs_key = NULL; + return (PyObject*) cs; +} + +static void cstruct_dealloc(cstruct_header_t* cs) +{ + if (cs->cs_destructor != NULL) + cs->cs_destructor((PyObject*) cs); + Py_XDECREF(cs->cs_key); + PyObject_Del((PyObject*) cs); +} + +static long cstruct_hash(cstruct_header_t* cs) +{ + /* loosing high bits is fine. This can't be -1 */ + if (cs->cs_key == NULL) + return (long)cs; + else + return (long)cs->cs_key; +} + +static PyObject* cstruct_richcmp(cstruct_header_t* o1, cstruct_header_t* o2, + int op) +{ + int c; + PyObject* result; + char* k1 = o1->cs_key ? (char*) o1->cs_key : (char*) o1; + char* k2 = o2->cs_key ? (char*) o2->cs_key : (char*) o2; + switch (op) { + case Py_EQ: c = k1 == k2; break; + case Py_NE: c = k1 != k2; break; + case Py_LT: c = k1 < k2; break; + case Py_LE: c = k1 <= k2; break; + case Py_GT: c = k1 > k2; break; + case Py_GE: c = k1 >= k2; break; + default: + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + result = c ? Py_True : Py_False; + Py_INCREF(result); + return result; +} + + +DEFINEVAR +PyTypeObject PyCStruct_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "CStruct", /*tp_name*/ + sizeof(cstruct_header_t) /* + ??? */, /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)cstruct_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + (hashfunc)cstruct_hash, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + (richcmpfunc)cstruct_richcmp, /*tp_richcompare*/ +}; + + +INITIALIZATIONFN +void psyco_cstruct_init(void) +{ + PyCStruct_Type.ob_type = &PyType_Type; +} diff --git a/nodeboxgl/ext/psyco/src/c/cstruct.h b/nodeboxgl/ext/psyco/src/c/cstruct.h new file mode 100644 index 0000000..048cb03 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/cstruct.h @@ -0,0 +1,42 @@ + /***************************************************************/ +/*** Turning general-purpose C structures into Python objects ***/ + /***************************************************************/ + +#ifndef _CSTRUCT_H +#define _CSTRUCT_H + + +#include "psyco.h" + + +#define PyCStruct_HEAD \ + PyObject_HEAD \ + destructor cs_destructor; \ + PyObject* cs_key; + +typedef struct { /* internal */ + PyCStruct_HEAD +} cstruct_header_t; + + +EXTERNVAR PyTypeObject PyCStruct_Type; + +#define PyCStruct_Check(op) PyObject_TypeCheck(op, &PyCStruct_Type) + +EXTERNFN PyObject* PyCStruct_New(size_t size, destructor d); +#define PyCStruct_NEW(TYPE, d) \ + ((TYPE*) PyCStruct_New(sizeof(TYPE), (destructor)(d))) + +/* lookup in the given dict for the item whose key is a CStruct with + the given key as cs_key */ +PSY_INLINE PyObject* PyCStruct_DictGet(PyObject* dict, PyObject* key) +{ + cstruct_header_t sample; + sample.ob_type = &PyCStruct_Type; + sample.ob_refcnt = 1; + sample.cs_key = key; + return PyDict_GetItem(dict, (PyObject*) &sample); +} + + +#endif /* _CSTRUCT_H */ diff --git a/nodeboxgl/ext/psyco/src/c/depend.py b/nodeboxgl/ext/psyco/src/c/depend.py new file mode 100644 index 0000000..19f854c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/depend.py @@ -0,0 +1,44 @@ +import os, sys, files +from mkincl import * + +GCC = '/usr/bin/gcc' + +processor = sys.argv[1] + + +g = open('dyn-Makefile', 'w') +print >> g, "# automatically generated by depend.py" +print >> g +print >> g, "O_FILES =", + +basenames = [] +for f in files.SRC: + assert f.filename.endswith('.c') + basenames.append(f.filename[:-2]) +for f in files.PROCESSOR_SRC[processor]: + assert f.filename.endswith('.c') + basenames.append(processor + '/' + f.filename[:-2]) + +for fn in basenames: + print >> g, fn+'.o', +print >> g +print >> g + +for fn in basenames: + print fn + h = os.popen("%s -I%s %s -M -Wundef %s.c" % (GCC, processor, + INCLUDE_STR, fn), 'r') + data = h.read() + h.close() + data = data.replace('\\\n', ' ') + data = data[data.index(':')+1:] + data = data.strip().split() + data = map(os.path.normpath, data) + found = {} + print >> g, '%s.o:' % fn, + for f1 in data: + if f1 not in found and not f1.startswith('/'): + print >> g, f1, + found[f1] = 1 + print >> g + print >> g diff --git a/nodeboxgl/ext/psyco/src/c/dispatcher.c b/nodeboxgl/ext/psyco/src/c/dispatcher.c new file mode 100644 index 0000000..1ff444f --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/dispatcher.c @@ -0,0 +1,2259 @@ +#include "dispatcher.h" +#include "codemanager.h" +#include "mergepoints.h" +#include "blockalloc.h" +#include "Python/pycompiler.h" /* for pyc_data_xxx() */ +#include "Objects/pobject.h" /* for Psyco_SafelyDeleteVar() */ +#include + + + /***************************************************************/ +/*** Snapshots ***/ + /***************************************************************/ + + +#if !VLOCALS_OPC + +/* Store-by-copy: this implementation is kept around for reference. + See the "!VLOCALS_OPC" version of compatible_array(). +*/ + +PSY_INLINE void fz_build(FrozenPsycoObject* fpo, vinfo_array_t* aa) { + fpo->fz_vlocals = array_new(aa->count); + duplicate_array(fpo->fz_vlocals, aa); +} + +PSY_INLINE void fz_unfreeze(vinfo_array_t* aa, FrozenPsycoObject* fpo) { + assert_cleared_tmp_marks(fpo->fz_vlocals); + duplicate_array(aa, fpo->fz_vlocals); + clear_tmp_marks(fpo->fz_vlocals); +} + +PSY_INLINE void fz_release(FrozenPsycoObject* fpo) { + array_delete(fpo->fz_vlocals, NULL); +} + + /* invariant: all snapshot.fz_vlocals in the fatlist have + all their 'tmp' fields set to NULL. */ +PSY_INLINE void fz_check_invariant(FrozenPsycoObject* fpo) { + assert_cleared_tmp_marks(fpo->fz_vlocals); +} + +PSY_INLINE void fz_restore_invariant(FrozenPsycoObject* fpo) { + clear_tmp_marks(fpo->fz_vlocals); +} + +PSY_INLINE int fz_top_array_count(FrozenPsycoObject* fpo) { + return fpo->fz_vlocals->count; +} + +static void fz_find_rt1(vinfo_array_t* bb, fz_find_fn callback, + void* extra, bool clear +#if ALL_CHECKS + , vinfo_array_t* aa +#endif + ) +{ + int i = bb->count; + while (i--) + { + vinfo_t* b = bb->items[i]; + if (b != NULL && b->tmp != NULL) + { +#if ALL_CHECKS + extra_assert(i < aa->count); + if (is_runtime(b->source)) + extra_assert(aa->items[i] == b->tmp); +#endif + if (is_runtime(b->source)) + (*callback)(b->tmp, b->source, extra); + if (clear) + b->tmp = NULL; /* don't consider the same 'b' more than once */ + if (b->array != NullArray) + fz_find_rt1(b->array, callback, extra, clear +#if ALL_CHECKS + , aa->items[i]->array +#endif + ); + } + } +} + +DEFINEFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, + fz_find_fn callback, void* extra, bool clear) +{ + fz_find_rt1(fpo->fz_vlocals, callback, extra, clear +#if ALL_CHECKS + , aa +#endif + ); +} + + +#else /* if VLOCALS_OPC */ + +#define COMPRESS_COMPILETIME_SUBITEMS 0 + + +struct vcilink_s { + int time; + union { + vinfo_t* preva; + vinfo_t** fix; + void* data; + } v; + struct vcilink_s* next; +}; + +BLOCKALLOC_STATIC(vci, struct vcilink_s, 128) + +typedef struct { + /* pointers to an internal buffer for the creation of the pseudo-code + copies, as well as for lookups */ + signed char* buf_begin; + signed char* buf_end; + signed char* buf_opc; /* current opcode position */ + Source* buf_args; /* current opargs position */ + int tmp_counter; /* for links */ + struct vcilink_s* vcilink; /* pending links during decompression */ + struct vcilink_s sentinel; +} vcompat_internal_t; + +/* XXX Argh, a global variable -- this is (just) tolerable because the + algorithms depending on it are not re-entrent anyway. This lets us + share a global all-purpose buffer between the pseudo-code creation + and the lookups. */ +static vcompat_internal_t cmpinternal = { NULL, NULL }; + +static signed char* fz_internal_copy(vcompat_internal_t* current, int nsize) +{ + int opc_size = current->buf_end - current->buf_opc; + signed char* buf = (signed char*) PyMem_MALLOC(nsize); + if (buf == NULL) + OUT_OF_MEMORY(); + memcpy(buf, current->buf_begin, + ((signed char*) current->buf_args) - current->buf_begin); + memcpy(buf + nsize - opc_size, current->buf_opc, opc_size); + return buf; +} + +static void fz_internal_expand(void) +{ + signed char* nbuf; + int opc_size = cmpinternal.buf_end - cmpinternal.buf_opc; + int arg_size = ((signed char*) cmpinternal.buf_args) - cmpinternal.buf_begin; + int nsize = (cmpinternal.buf_end - cmpinternal.buf_begin) * 3 / 2; + if (nsize < 64) nsize = 64; + nbuf = fz_internal_copy(&cmpinternal, nsize); + if (cmpinternal.buf_begin != cmpinternal.buf_end) + PyMem_FREE(cmpinternal.buf_begin); + cmpinternal.buf_begin = nbuf; + cmpinternal.buf_end = nbuf + nsize; + cmpinternal.buf_opc = cmpinternal.buf_end - opc_size; + cmpinternal.buf_args = (Source*)(nbuf + arg_size); +} + +#define FZ_OPC_EXT (-1) +#define FZ_OPC_NULL (-2) +#define FZ_OPC_LINK (-3) /* and the following negative numbers */ + +/* Note: the pseudo-code is built in left-to-right array order, + but it is intended to be read backwards, thus uncompression creates + the arrays right-to-left. */ +PSY_INLINE void fz_putarg(Source arg) +{ + if (cmpinternal.buf_opc < (signed char*) (cmpinternal.buf_args+1)) + fz_internal_expand(); + *cmpinternal.buf_args++ = arg; +} + +PSY_INLINE void fz_putopc(int opc) +{ + if (!(-128 <= opc && opc < 128)) + { + fz_putarg((Source) opc); + opc = FZ_OPC_EXT; + } + if (cmpinternal.buf_opc == (signed char*) cmpinternal.buf_args) + fz_internal_expand(); + *--cmpinternal.buf_opc = opc; +} + +#if COMPRESS_COMPILETIME_SUBITEMS +static void fz_compress(vinfo_array_t* aa, bool nolinks) +{ + int i; + int length = aa->count; + /*while (length > 0 && aa->items[length-1] == NULL) + length--; ---- invalid optimization ---- */ + for (i=0; iitems[i]; + if (a == NULL) { + fz_putopc(FZ_OPC_NULL); /* emit FZ_OPC_NULL */ + } + else if (a->tmp != NULL) { + int prevcounter = (int) a->tmp; /* already seen, emit a link */ + fz_putopc(FZ_OPC_LINK - (cmpinternal.tmp_counter-prevcounter)); + } + else { + bool nosublinks = nolinks; + int length; + Source arg = a->source; + if (is_compiletime(arg)) + { + sk_incref(CompileTime_Get(arg)); + nosublinks = true; + } + ++cmpinternal.tmp_counter; + if (!nolinks) + a->tmp = (vinfo_t*) cmpinternal.tmp_counter; + length = a->array->count; + if (length) /* avoid recursive call if unneeded */ + fz_compress(a->array, nosublinks); /* store the subarray */ + fz_putarg(a->source); /* store the 'source' field */ + fz_putopc(length); /* store the length of the subarray */ + } + } +} +#else /* !COMPRESS_COMPILETIME_SUBITEMS */ +static void fz_compress(vinfo_array_t* aa) +{ + int i; + int length = aa->count; + /*while (length > 0 && aa->items[length-1] == NULL) + length--; ---- invalid optimization ---- */ + for (i=0; iitems[i]; + if (a == NULL) { + fz_putopc(FZ_OPC_NULL); /* emit FZ_OPC_NULL */ + } + else if (a->tmp != NULL) { + int prevcounter = (int) a->tmp; /* already seen, emit a link */ + fz_putopc(FZ_OPC_LINK - (cmpinternal.tmp_counter-prevcounter)); + } + else { + int length; + Source arg; + a->tmp = (vinfo_t*) (++cmpinternal.tmp_counter); + arg = a->source; + if (is_compiletime(arg)) + { + sk_incref(CompileTime_Get(arg)); + length = 0; + } + else + { + length = a->array->count; + if (length) /* avoid recursive call if unneeded */ + fz_compress(a->array); /* store the subarray */ + } + fz_putarg(a->source); /* store the 'source' field */ + fz_putopc(length); /* store the length of the subarray */ + } + } +} +#endif /* COMPRESS_COMPILETIME_SUBITEMS */ +/* Compression note: if we implement sharing of common initial segments + (which could save another 50% memory) we get better results by storing + the 'source' field *before* its sub-array. This will complicate + compatible_array() a bit. */ + +PSY_INLINE Source fz_getarg(void) +{ + return *--cmpinternal.buf_args; +} + +PSY_INLINE int fz_getopc(void) +{ + int result = *cmpinternal.buf_opc++; + if (result == FZ_OPC_EXT) + result = (int) fz_getarg(); + return result; +} + +static void fz_pushstack(int opc, void* ndata) +{ + int ntime = cmpinternal.tmp_counter + (FZ_OPC_LINK-opc); + struct vcilink_s** q; + struct vcilink_s* p = psyco_llalloc_vci(); + p->time = ntime; + p->v.data = ndata; + + /* Record the pending link by inserting it inon the vcilink linked list. + 'ntime' is the value that tmp_counter will have when the pending + item is found, so currently 'ntime >= tmp_counter'. + This linked list is sorted against the time, smallest time first. */ + q = &cmpinternal.vcilink; + while ((*q)->time < ntime) + q = &(*q)->next; + p->next = *q; /* insert new item at the correct position */ + *q = p; +} + +static void fz_uncompress(vinfo_array_t* result) +{ + int i = result->count; + while (i--) + { + vinfo_t* a; + int opc = fz_getopc(); + if (opc >= 0) { /* new item, potentially with its sub-array */ + a = vinfo_new_skref(fz_getarg()); + if (opc != 0) { /* test to make the common path (opc==0) faster */ + a->array = array_new(opc); + fz_uncompress(a->array); + } + } + else if (opc == FZ_OPC_NULL) { /* NULL */ + continue; /* there is already NULL in result->items[i] */ + } + else { /* link to an item not built yet */ + fz_pushstack(opc, &result->items[i]); + continue; + } + + /* At this point we have a real item to store into the array */ + while (cmpinternal.tmp_counter == cmpinternal.vcilink->time) + { + struct vcilink_s* p = cmpinternal.vcilink; + cmpinternal.vcilink = p->next; + /* resolve link */ + vinfo_incref(a); + *p->v.fix = a; + psyco_llfree_vci(p); + } + cmpinternal.tmp_counter++; + result->items[i] = a; + } +} + +static void fz_parse(int length, bool clear) +{ /* highly simplified version of fz_uncompress() that does nothing */ + extra_assert(length >= 0); + while (length--) + { + int opc = fz_getopc(); + if (opc >= 0) + { + Source arg = fz_getarg(); + fz_parse(opc, clear); + if (clear && is_compiletime(arg)) + sk_decref(CompileTime_Get(arg)); + } + } +} + +static void fz_find_rt1(vinfo_array_t* aa, int length, + fz_find_fn callback, void* extra) +{ /* simplified version of fz_uncompress() that does not build anything */ + extra_assert(length >= 0); + while (length--) + { + int opc = fz_getopc(); + if (opc >= 0) + { + vinfo_t* a; + Source source = fz_getarg(); + if (is_compiletime(source)) + { + /* no run-time value should exist under a compile-time one */ + extra_assert(aa == NULL || length < aa->count); + if (opc > 0) + fz_find_rt1(NULL, opc, NULL, NULL); + } + else + { + extra_assert(aa != NULL && length < aa->count); + a = aa->items[length]; + if (is_runtime(source)) + (*callback)(a, source, extra); + if (opc > 0) + fz_find_rt1(a->array, opc, callback, extra); + } + } + } +} + +PSY_INLINE void fz_load_fpo(FrozenPsycoObject* fpo) { + cmpinternal.buf_opc = (signed char*) fpo->fz_vlocals_opc; + cmpinternal.buf_args = fpo->fz_vlocals_opc; +} + +DEFINEFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, + fz_find_fn callback, void* extra, bool clear) +{ + fz_load_fpo(fpo); + fz_find_rt1(aa, fz_getopc(), callback, extra); +} + +PSY_INLINE void fz_build(FrozenPsycoObject* fpo, vinfo_array_t* aa) +{ + int opc_size, arg_size; + signed char* nbuf; + cmpinternal.buf_opc = cmpinternal.buf_end; + cmpinternal.buf_args = (Source*) cmpinternal.buf_begin; + cmpinternal.tmp_counter = 0; + clear_tmp_marks(aa); +#if COMPRESS_COMPILETIME_SUBITEMS + fz_compress(aa, false); +#else + fz_compress(aa); +#endif + fz_putopc(aa->count); + opc_size = cmpinternal.buf_end - cmpinternal.buf_opc; + arg_size = ((signed char*) cmpinternal.buf_args) - cmpinternal.buf_begin; + psyco_memory_usage += arg_size + opc_size + sizeof(CodeBufferObject); + nbuf = fz_internal_copy(&cmpinternal, arg_size + opc_size); + fpo->fz_vlocals_opc = (Source*) (nbuf + arg_size); +} + +PSY_INLINE void fz_load_fpo_stack(FrozenPsycoObject* fpo) { + fz_load_fpo(fpo); + cmpinternal.tmp_counter = 0; + cmpinternal.vcilink = &cmpinternal.sentinel; + cmpinternal.sentinel.time = INT_MAX; /* sentinel */ +} + +PSY_INLINE int fz_top_array_count(FrozenPsycoObject* fpo) { + int result; + if (fpo->fz_vlocals_opc == NULL) + return 0; + fz_load_fpo(fpo); + result = fz_getopc(); + extra_assert(result >= 0); + return result; +} + +PSY_INLINE void fz_unfreeze(vinfo_array_t* aa, FrozenPsycoObject* fpo) { + fz_load_fpo_stack(fpo); + aa->count = fz_getopc(); + fz_uncompress(aa); + /* no more pending link should be left */ + extra_assert(cmpinternal.vcilink == &cmpinternal.sentinel); +} + +PSY_INLINE void fz_release(FrozenPsycoObject* fpo) { + if (fpo->fz_vlocals_opc != NULL) + { + fz_load_fpo(fpo); + fz_parse(fz_getopc(), true); /* find the beginning of the pseudo-code */ + PyMem_FREE(cmpinternal.buf_args); + } +} + +PSY_INLINE void fz_check_invariant(FrozenPsycoObject* fpo) { +} + +PSY_INLINE void fz_restore_invariant(FrozenPsycoObject* fpo) { +} + + +#endif /* VLOCALS_OPC */ + + +#if !ALL_STATIC + DEFINEFN int psyco_top_array_count(FrozenPsycoObject* fpo) /*for psyco.c*/ + { return fz_top_array_count(fpo); } +#endif + + + /***************************************************************/ + +DEFINEFN +void fpo_build(FrozenPsycoObject* fpo, PsycoObject* po) +{ + psyco_assert_coherent1(po, false); + clear_tmp_marks(&po->vlocals); + fz_build(fpo, &po->vlocals); + fpo->fz_stuff.fz_stack_depth = po->stack_depth; + SAVE_PROCESSOR_FROZENOBJECT(fpo, po); + fpo->fz_pyc_data = pyc_data_new(&po->pr); +} + +DEFINEFN +void fpo_release(FrozenPsycoObject* fpo) +{ + if (fpo->fz_pyc_data != NULL) + pyc_data_delete(fpo->fz_pyc_data); + fz_release(fpo); +} + +static void fpo_find_regs_array(vinfo_array_t* source, PsycoObject* po) +{ +#if HAVE_CCREG + condition_code_t cc; +#endif + int i = source->count; + while (i--) + { + vinfo_t* a = source->items[i]; + if (a != NULL) + { + Source src = a->source; +#if REG_TOTAL > 0 + if (is_runtime(src) && !is_reg_none(src)) + REG_NUMBER(po, getreg(src)) = a; + else +#endif +#if HAVE_CCREG + if ((cc = psyco_vsource_cc(src)) != CC_ALWAYS_FALSE) + po->ccregs[INDEX_CC(cc)] = a; + else +#endif + /* nothing */ ; + if (a->array != NullArray) + fpo_find_regs_array(a->array, po); + } + } +} + +DEFINEFN +PsycoObject* fpo_unfreeze(FrozenPsycoObject* fpo) +{ + /* rebuild a PsycoObject from 'this' */ + PsycoObject* po = PsycoObject_New(fz_top_array_count(fpo)); + po->stack_depth = get_stack_depth(fpo); + RESTORE_PROCESSOR_FROZENOBJECT(fpo, po); + fz_unfreeze(&po->vlocals, fpo); + fpo_find_regs_array(&po->vlocals, po); + frozen_copy(&po->pr, fpo->fz_pyc_data); + pyc_data_build(po, psyco_get_merge_points(po->pr.co, -1)); + psyco_assert_coherent(po); + return po; +} + + +/***************************************************************** + * Respawning is restoring a frozen compiler state into a live + * PsycoObject and restarting the compilation. It will produce + * exactly the same code up to a given point. This point was + * a jump in the run-time code, pointing to code that we did + * not compile yet. The purpose of 'replaying' the compilation + * is to rebuild exactly the same state as the compiler had when + * it emitted the jump instruction in the first place. At this + * point we can go on with the real compilation of the missing + * code. + * + * This is all based on the idea that we want to avoid tons + * of copies of PsycoObjects all around for all pending + * compilation branches, and there are a lot of them -- e.g. all + * instructions that could trigger an exception have such a + * (generally uncompiled) branch. + *****/ + +typedef struct respawn_s { + CodeBufferObject* self; + void* write_jmp; + int respawn_cnt; + CodeBufferObject* respawn_from; +} respawn_t; + +static code_t* do_respawn(respawn_t* rs) +{ + /* called when entering a not-compiled branch requiring a respawn */ + code_t* code; + CodeBufferObject* firstcodebuf; + CodeBufferObject* codebuf; + PsycoObject* po; + + /* we might have a chain of code buffers, each containing a conditional + jump to the next one. It ends with a proxy (not-yet-compiled) calling + the function do_respawn(). + + +----------+ + | ... | + | Jcond -----------> +----------+ + | ... | | ... | + +----------+ | Jcond -----------> +-----------------+ + | ... | | CALL do_respawn | + +----------+ +-----------------+ + + The structure 'rs' is stored in the last block (the proxy). + 'rs->respawn_from' is the previous code buffer. + 'rs->respawn_from->snapshot.fz_respawned_from' is the previous one. + etc. + */ + int respawn_cnt = rs->respawn_cnt; + /* find the first code buffer in the chain */ + for (firstcodebuf = rs->respawn_from; + firstcodebuf->snapshot.fz_respawned_from != NULL; + firstcodebuf = firstcodebuf->snapshot.fz_respawned_from) + respawn_cnt = firstcodebuf->snapshot.fz_respawned_cnt; + /* respawn there */ + po = fpo_unfreeze(&firstcodebuf->snapshot); + + codebuf = psyco_new_code_buffer(NULL, NULL, &po->codelimit); + codebuf->snapshot.fz_stuff.respawning = rs; + codebuf->snapshot.fz_respawned_cnt = rs->respawn_cnt; + codebuf->snapshot.fz_respawned_from = firstcodebuf; + po->code = insn_code_label(codebuf->codestart); + /* respawn by restarting the Python compiler at the beginning of the + instruction where it left. It will probably re-emit a few machine + instructions -- not needed, they will be trashed, but this has + rebuilt the correct PsycoObject state. This occurs when eventually + a positive detect_respawn() is issued. */ + po->respawn_cnt = - respawn_cnt; + po->respawn_proxy = codebuf; + + code = GLOBAL_ENTRY_POINT(po); + + SHRINK_CODE_BUFFER(codebuf, code, "respawned"); + /* make sure detect_respawn() succeeded */ + psyco_assert(codebuf->snapshot.fz_respawned_from == rs->respawn_from); + + /* fix the jump to point to 'codebuf->codestart' */ + change_cond_jump_target(rs->write_jmp, (code_t*)codebuf->codestart); + + /* cannot Py_DECREF(cp->self) because the current function is returning into + that code now, but any time later is fine: use the trash of codemanager.c */ + psyco_trash_object((PyObject*) rs->self); + dump_code_buffers(); + /* XXX don't know what to do with this reference to codebuf */ + return codebuf->codestart; +} + +DEFINEFN +void psyco_respawn_detected(PsycoObject* po) +{ + /* this is called when detect_respawn() succeeds. We can now proceed + to the next code block in the picture above. When we reach the + last one, it means we are about to compile the 'special' branch of + a conditional jump -- the one that is not compiled yet. + */ + CodeBufferObject* codebuf = po->respawn_proxy; + CodeBufferObject* current = codebuf->snapshot.fz_respawned_from; + respawn_t* rs = codebuf->snapshot.fz_stuff.respawning; + + /* 'codebuf' is the new block we are writing. + 'current' is the block we are currently respawning. + 'rs->respawn_from' is the last block before the proxy calling + do_respawn(). */ + if (current == rs->respawn_from) + { + /* respawn finished */ + extra_assert(fz_top_array_count(&codebuf->snapshot) == 0); + fpo_build(&codebuf->snapshot, po); + } + else + { + /* proceed to the next block */ + CodeBufferObject* nextblock; + int respawn_cnt = rs->respawn_cnt; + for (nextblock = rs->respawn_from; + nextblock->snapshot.fz_respawned_from != current; + nextblock = nextblock->snapshot.fz_respawned_from) + respawn_cnt = nextblock->snapshot.fz_respawned_cnt; + codebuf->snapshot.fz_respawned_from = nextblock; + po->respawn_cnt = - respawn_cnt; + } + /* restart at the beginning of the buffer, overriding the code written + so far. XXX when implementing freeing of code, be careful that this + lost code does not looses references to other objects as well. + Use is_respawning() to bypass the creation of all references when + compiling during respawn. */ + po->code = (code_t*) codebuf->codestart; + INIT_CODE_EMISSION(po->code); +} + +DEFINEFN +void* psyco_prepare_respawn_ex(PsycoObject* po, condition_code_t jmpcondition, + void* fn, int extrasize) +{ + /* ignore calls to psyco_prepare_respawn() while currently respawning */ + if (!is_respawning(po)) + { + char* closure; + respawn_t* rs; + code_t* calling_code; + code_t* calling_limit; + code_t* limit; + CodeBufferObject* codebuf = psyco_new_code_buffer(NULL, NULL, &limit); + + extra_assert((int)jmpcondition < CC_TOTAL); + + /* the proxy contains only a jump to do_respawn, + followed by a respawn_t structure */ + calling_code = po->code; + calling_limit = po->codelimit; + po->code = insn_code_label(codebuf->codestart); + po->codelimit = limit; + closure = (char*) psyco_call_code_builder(po, fn, true, SOURCE_DUMMY); + rs = (respawn_t*) (closure+extrasize); + SHRINK_CODE_BUFFER(codebuf, (code_t*)(rs+1), "respawn"); + /* fill in the respawn_t structure */ + extra_assert(po->respawn_proxy != NULL); + rs->self = codebuf; + rs->respawn_cnt = po->respawn_cnt; + rs->respawn_from = po->respawn_proxy; + + /* write the jump to the proxy */ + po->code = calling_code; + po->codelimit = calling_limit; + psyco_resolved_cc(po, INVERT_CC(jmpcondition)); /* no jump => cond false */ + rs->write_jmp = conditional_jump_to(po, (code_t*)codebuf->codestart, + jmpcondition); + dump_code_buffers(); + return closure; + } + else + { + /* respawning: come back at the + beginning of the trash memory for + the next instructions */ + po->code = (code_t*) po->respawn_proxy->codestart; + INIT_CODE_EMISSION(po->code); + return NULL; + } +} + +DEFINEFN +bool psyco_prepare_respawn(PsycoObject* po, condition_code_t jmpcondition) +{ + if (detect_respawn(po)) return true; + psyco_prepare_respawn_ex(po, jmpcondition, &do_respawn, 0); + return false; +} + +DEFINEFN +code_t* psyco_do_respawn(void* arg, int extrasize) +{ + respawn_t* rs = (respawn_t*)(((char*) arg) + extrasize); + return do_respawn(rs); +} + +DEFINEFN +code_t* psyco_dont_respawn(void* arg, int extrasize) +{ + respawn_t* rs = (respawn_t*)(((char*) arg) + extrasize); + return resume_after_cond_jump(rs->write_jmp); +} + +DEFINEFN +int runtime_NON_NULL_f(PsycoObject* po, vinfo_t* vi) +{ + condition_code_t cc = integer_NON_NULL(po, vi); + return cc == CC_ERROR ? -1 : runtime_condition_f(po, cc); +} + +DEFINEFN +int runtime_NON_NULL_t(PsycoObject* po, vinfo_t* vi) +{ + condition_code_t cc = integer_NON_NULL(po, vi); + return cc == CC_ERROR ? -1 : runtime_condition_t(po, cc); +} + +DEFINEFN +int runtime_in_bounds(PsycoObject* po, vinfo_t* vi, + long lowbound, long highbound) +{ + condition_code_t cc; + if (highbound == LONG_MAX) + { + if (lowbound == LONG_MIN) + return 1; + cc = integer_cmp_i(po, vi, lowbound, Py_GE); + } + else if (lowbound == 0) + { + cc = integer_cmp_i(po, vi, highbound, Py_LE | COMPARE_UNSIGNED); + } + else + { + if (lowbound != LONG_MIN) + { + cc = integer_cmp_i(po, vi, lowbound, Py_GE); + if (cc == CC_ERROR) + return -1; + if (!runtime_condition_t(po, cc)) + return 0; + } + cc = integer_cmp_i(po, vi, highbound, Py_LE); + } + return cc == CC_ERROR ? -1 : runtime_condition_t(po, cc); +} + + +DEFINEFN +void PsycoObject_EmergencyCodeRoom(PsycoObject* po) +{ + if (!is_respawning(po)) + { + /* non-respawning case: start a new buffer, and code a JMP at + the end of the current buffer. Note that it is exceptional + to reach this point. Normally, pycompiler.c regularly checks + that we are not reaching the end of the buffer, and if so, + pauses compilation. */ + psyco_emergency_enlarge_buffer(&po->code, &po->codelimit); + } + else + { + /* respawning case: trash everything written so far */ + po->code = (code_t*) po->respawn_proxy->codestart; + INIT_CODE_EMISSION(po->code); + } +} + + +/*****************************************************************/ + +#if !VLOCALS_OPC + +/* This implementation should probably not be used any more, but it + is kept around for reference. Once you understand the comparison + algorithm below you can read its more obscure implementation of + the VLOCALS_OPC case. +*/ +static bool compatible_array(vinfo_array_t* aa, vinfo_array_t* bb, + vinfo_array_t** result) +{ + /* 'aa' is the array from the live PsycoObject. 'bb' is from the snapshop. + Test for compatibility. More precisely, it must be allowable for the + living state 'aa' to jump back to the code already produced for the + state 'bb'. There might be more information in 'aa' than in 'bb' (which + will then just be discarded), but the converse is not allowable. + Moreover, if two slots in the arrays point to the same vinfo_t in 'bb', + they must also do so in 'aa' because the code compiled from 'bb' might + have used this fact. Conversely, shared pointers in 'aa' need *not* be + shared any more in 'bb'. + + The sharing rule only applies to run-time values: for compile-time and + virtual-time values, being shared or not is irrelevant to the compilation + process. + + Return value of compatible_array(): false if incompatible, otherwise + fills the 'result' array with the variables to un-promote. + */ + int i; + int count = bb->count; + if (aa->count != count) + { + if (aa->count < count) /* array too short; ok only if the extra items */ + { /* in 'bb' are all NULL. */ + for (i=aa->count; iitems[i] != NULL) + return false; /* differs */ + count = aa->count; + } + else /* array too long */ + { +#if 0 + /* the extra items in 'aa' must pass the test (b == NULL) below. */ + for (i=aa->count; i>count; ) + { + vinfo_t* a = aa->items[--i]; + if (a != NULL && is_compiletime(a->source) && + ((KNOWN_SOURCE(a)->refcount1_flags & SkFlagFixed) != 0)) + return false; /* incompatible */ + } +#else + /* the extra items in 'aa' must all be NULL. This is not strictly + necessary for a compatibility (the above condition is more + precise) but I guess that you get better results this way, + because you have more information for a recompilation. + XXX This assumption should be tested. + XXX What about requiring that no NULL goes non-NULL in the + rest of the array as well? */ + for (i=aa->count; i>count; ) + if (aa->items[--i] != NULL) + return false; /* differs */ +#endif + } + } + for (i=0; iitems[i]; + vinfo_t* b = bb->items[i]; + if (b == NULL) + { + /* if b == NULL, any value in 'a' is ok -- + with the exception of a fixed compile-time value, as + created by a promotion. Without the following test, + Psyco sometimes emits an infinite loop because the + PsycoObject after promotion is found to be compatible + with itself just before promotion. */ + if (a != NULL && is_compiletime(a->source) && + ((KNOWN_SOURCE(a)->refcount1_flags & SkFlagFixed) != 0)) + goto incompatible; + } + else + { + long diff; + /* we store in the 'tmp' fields of the 'bb' arrays pointers to the + vinfo_t that matched in 'aa'. We assume that all 'tmp' fields + are NULL initially. If, walking in the 'bb' arrays, we encounter + the same 'b' several times, we use these 'tmp' pointers to make + sure they all matched the same 'a'. */ + if (b->tmp != NULL) + { + /* This 'b' has already be seen. */ + if (b->tmp == a) + continue; /* quotient graph */ + + /* at this point, the graph 'aa' is not a quotient of the + graph 'bb', i.e. two nodes are shared in 'bb' but not + in 'aa'. This is not acceptable if it is a run-time + value, or if it is a virtual-time value whose identity + matters. */ + switch (gettime(b->source)) + { + case RunTime: + goto incompatible; + + case VirtualTime: + if (SVIRTUAL_MUTABLE(VirtualTime_Get(b->source))) + goto incompatible; + break; + + default: + ; + } + } + + /* A new 'b', let's check if its 'a' matches. */ + if (a == NULL) + goto incompatible; /* NULL not compatible with non-NULL */ + b->tmp = a; + diff = ((long)a->source) ^ ((long)b->source); + if (diff != 0) + { + if ((diff & TimeMask) != 0) + goto incompatible; /* not the same TIME_MASK */ + if (is_runtime(a->source)) + { + if ((diff & RunTime_NoRef) != 0) + { + /* from 'with ref' to 'without ref' or vice-versa: + a source in 'a' with reference cannot pass for + a source in 'b' without reference */ + if ((a->source & RunTime_NoRef) == 0) + goto incompatible; + } + } + else + { + if (is_virtualtime(a->source)) + goto incompatible; /* different virtual sources */ + if (KNOWN_SOURCE(a)->value != KNOWN_SOURCE(b)->value) + { + if ((KNOWN_SOURCE(b)->refcount1_flags & + SkFlagFixed) != 0) + goto incompatible; /* b's value is fixed */ + if ((KNOWN_SOURCE(a)->refcount1_flags & + SkFlagFixed) != 0 && KNOWN_SOURCE(a)->value == 0) + goto incompatible; /* hack: */ + /* fixed known-to-be-zero values have a special + role to play with local variables: undefined + variables. These must *never* be un-promoted + to run-time, because we will get a NULL + pointer and a segfault. Argh. */ + else { + /* approximative match, might un-promote 'a' from + compile-time to run-time. */ + /*fprintf(stderr, "psyco: compatible_array() with vinfo_t* a=%p, b=%p\n", a, b);*/ + int i, ocount = (*result)->count; + /* do not add several time the same value to the array */ + for (i=0; iitems[i] == a) + break; + if (i==ocount) + { + *result = array_grow1(*result, ocount+1); + (*result)->items[ocount] = a; + } + } + } + } + } + if (a->array != b->array) /* can only be equal if both ==NullArray */ + { + if (is_compiletime(a->source)) + { + /* For compile-time values we don't bother comparing + subarrays, because they only have a caching role + in this case; they should never contain information + different from what psyco_get_field() can load or + reload from immutable data. */ +#if PSYCO_DEBUG + /* we just verify that there are only compile-time + subitems. */ + int j; + for (j=0; jarray->count; j++) + extra_assert(a->array->items[j] == NULL || + is_compiletime(a->array->items[j]->source)); + for (j=0; jarray->count; j++) + extra_assert(b->array->items[j] == NULL || + is_compiletime(b->array->items[j]->source)); +#endif + } + else + if (!compatible_array(a->array, b->array, result)) + goto incompatible; + } + } + } + return true; + + incompatible: /* we have to reset the 'tmp' fields to NULL, + but only as far as we actually progressed */ + for (; i>=0; i--) + if (bb->items[i] != NULL) + { + bb->items[i]->tmp = NULL; + if (bb->items[i]->array != NullArray) + clear_tmp_marks(bb->items[i]->array); + } + return false; +} + +PSY_INLINE bool fz_compatible_array(vinfo_array_t* aa, FrozenPsycoObject* fpo, + vcompatible_t* result) { + return compatible_array(aa, fpo->fz_vlocals, &result->diff); +} + + +#else /* if VLOCALS_OPC */ + +/* forward */ +static bool compatible_array(vinfo_array_t* aa, int count, + vinfo_array_t** result, vinfo_array_t* reference, + int recdepth); +#if COMPRESS_COMPILETIME_SUBITEMS +static void skip_compatible_array(int count); +#endif + +static bool compatible_vinfo(vinfo_t* a, Source bsource, int bcount, + vinfo_array_t** result, vinfo_t* aref, + int recdepth) +{ + /* Check if 'a' matches 'bsource'. */ + long diff; + /*bool skip_subarray = false;*/ + + /* If 'aref!=a' then 'aref' is a vinfo_t* that already passed the test + against the same 'bsource'. In this case there is an extra test: + as the two nodes 'a' and 'aref' are not shared in 'aa', but shared + in 'bb', then they must not be run-time sources, because the + compiler could have used this fact when compiling from 'bb' + (typically, this single value was in a single register). Nor can + they be mutable virtual-time values, for identity reasons. */ + if (a != aref) + switch (gettime(bsource)) + { + case RunTime: + return false; + + case VirtualTime: + if (SVIRTUAL_MUTABLE(VirtualTime_Get(bsource))) + return false; + break; + + default: + ; + } + + /* invariant */ + extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); + + if (a == NULL) + return false; /* NULL not compatible with non-NULL */ + diff = ((long)a->source) ^ ((long)bsource); + if (diff != 0) + { + if ((diff & TimeMask) != 0) + return false; /* not the same TIME_MASK */ + + switch (gettime(a->source)) { + + case RunTime: + if ((diff & (RunTime_NoRef|RunTime_NonNeg|RunTime_Megamorphic)) != 0) + { + /* from 'with ref' to 'without ref' or vice-versa: + a source in 'a' with reference cannot pass for + a source in 'b' without reference */ + if ((a->source & RunTime_NoRef) == 0 && + ( bsource & RunTime_NoRef) != 0) + return false; + /* from 'non-negative' to 'possibly negative' or vice-versa: + a source in 'a' which may be negative cannot pass for + a source in 'b' which cannot */ + if ((a->source & RunTime_NonNeg) == 0 && + ( bsource & RunTime_NonNeg) != 0) + return false; + /* a source in 'a' which is flagged as megamorphic should + not fall back to a source in 'b' which is not */ + if ((a->source & RunTime_Megamorphic) != 0 && + ( bsource & RunTime_Megamorphic) == 0) + return false; + } + break; + + case CompileTime: + if (CompileTime_Get(a->source)->value != CompileTime_Get(bsource)->value) + { + if ((CompileTime_Get(bsource)->refcount1_flags & + SkFlagFixed) != 0) + return false; /* b's value is fixed */ + if ((CompileTime_Get(a->source)->refcount1_flags & + SkFlagFixed) != 0 && CompileTime_Get(a->source)->value == 0) + return false; /* hack: */ + /* fixed known-to-be-zero values have a special + role to play with local variables: undefined + variables. These must *never* be un-promoted + to run-time, because we will get a NULL + pointer and a segfault. Argh. */ + else { + /* approximative match, might un-promote 'a' from + compile-time to run-time. */ + int i, ocount = (*result)->count; + /* do not add several time the same value to the array */ + for (i=0; iitems[i] == a) + break; + if (i==ocount) + { + *result = array_grow1(*result, ocount+1); + (*result)->items[ocount] = a; + } + } + } + /*else + skip_subarray = true;*/ + break; + + default: /* case VirtualTime */ + return false; /* different virtual sources */ + } + } + /*else + skip_subarray = is_compiletime(bsource);*/ + + if (bcount == 0 && a->array == NullArray) + return true; /* shortcut */ + +#if COMPRESS_COMPILETIME_SUBITEMS + if (/*skip_subarray*/ is_compiletime(bsource)) + { + /* For compile-time values we don't bother comparing + subarrays, because they only have a caching role + in this case; they should never contain information + different from what psyco_get_field() can load or + reload from immutable data. */ +#if PSYCO_DEBUG + /* we just verify that there are only compile-time + subitems. */ + int j; + for (j=0; jarray->count; j++) + extra_assert(a->array->items[j] == NULL || + is_compiletime(a->array->items[j]->source)); +#endif + /* skip the subarray in the pseudo-code */ + skip_compatible_array(bcount); + return true; + } +#else /* !COMPRESS_COMPILETIME_SUBITEMS */ + if (is_compiletime(bsource)) + { + extra_assert(bcount == 0); + return true; + } +#endif /* COMPRESS_COMPILETIME_SUBITEMS */ + + return compatible_array(a->array, bcount, result, aref->array, recdepth+1); +} + +/* The following function is the composition of fz_uncompress() and + the above compatible_array(), optimized so that we need not build + a whole uncompressed copy of the pseudo-code. */ +static bool compatible_array(vinfo_array_t* aa, int count, + vinfo_array_t** result, vinfo_array_t* reference, + int recdepth) +{ + /* In the following comments, 'bb' refers to the implicit intermediate + array that would be created by fz_uncompress(). */ + /* 'reference' is a either 'aa', or another array of items that already + passed the test against the same pseudo-code. This lets us check + shared structures. */ + + /* special-case test. See comments below. */ +#define CHECK_FOR_NULL(a) \ + if (a != NULL) { \ + /* if there is no proved progress, and 'a' \ + might just have been promoted, \ + then we have to let compilation go on */ \ + if (*result == NullArray && \ + is_compiletime(a->source) && \ + ((CompileTime_Get(a->source)->refcount1_flags & SkFlagFixed) != 0)) \ + return false; \ + /* if we are not too deep in the array, then we might as \ + well try compiling with this extra information */ \ + if (recdepth <= 2) \ + return false; \ + } + + int i; + /* count = bb->count; */ + extra_assert(count >= 0); + if (aa->count != count) + { + if (aa->count < count) /* array too short; ok only if the extra items */ + { /* in 'bb' are all NULL. */ + do { + if (fz_getopc() != FZ_OPC_NULL) + return false; /* differs */ + } while (aa->count < --count); + } + else /* array too long */ + { + /* the extra items in 'aa' must all be NULL. This is not strictly + necessary for a compatibility (the above condition is more + precise) but I guess that you get better results this way, + because you have more information for a recompilation. + XXX This assumption should be tested. */ + + /* This potentially allows for unbounded array depth, + so we disable it after a given depth and revert to the + old behavior: all extra items are matched against b == NULL + life below. */ + for (i=aa->count; i>count; ) + { + vinfo_t* a = aa->items[--i]; + CHECK_FOR_NULL(a) + } + } + } + for (i=count; i--; ) + { + int opc = fz_getopc(); + vinfo_t* a = aa->items[i]; + + /* invariant */ + extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); + + if (opc == FZ_OPC_NULL) /* 'b' is NULL */ + { + /* if b == NULL, any value in 'a' is ok -- + with the exception of a fixed compile-time value, as + created by a promotion. Without the following test, + Psyco sometimes emits an infinite loop because the + PsycoObject after promotion is found to be compatible + with itself just before promotion. */ + CHECK_FOR_NULL(a) + } + else if (opc < 0) /* 'b' is a link to another 'b'. */ + { + /* We cannot compare right now the 'a' with the corresponding 'b' + because we do not know it yet. We record the comparison as + "to be done later" in the linked list. */ + if (a == NULL) + return false; /* shortcut: cannot match later */ + fz_pushstack(opc, a); + } + else /* 'b' is a vinfo_t */ + { + Source bsource = fz_getarg(); + + /* Save the current position (resolving links require backtracking) */ + signed char* saved_buf_opc = cmpinternal.buf_opc; + Source* saved_buf_args = cmpinternal.buf_args; + int saved_tmp_counter = cmpinternal.tmp_counter; + + /* Compare 'a' and 'bsource'. */ + extra_assert(i < reference->count); + if (!compatible_vinfo(a, bsource, opc, result, reference->items[i], + recdepth)) + return false; + + /* Only after the above call we know if any link previously pending + link just resolved into the current 'b'. */ + if (cmpinternal.tmp_counter == cmpinternal.vcilink->time) + { + bool ok = true; + struct vcilink_s* pending = NULL; /* links that resolve to 'b' */ + struct vcilink_s* p; + vinfo_t* preva; + + while (1) { + /* Move all links with the current time to 'pending' */ + while (cmpinternal.tmp_counter == cmpinternal.vcilink->time) + { + p = cmpinternal.vcilink; + cmpinternal.vcilink = p->next; + p->next = pending; + pending = p; + } + extra_assert(cmpinternal.tmp_countertime); + if (!pending) + break; /* done */ + + /* Resolve the next link */ + shortcut1: + p = pending; + pending = p->next; + preva = p->v.preva; + psyco_llfree_vci(p); + + /* First check if the same link is found later in the + linked list, and ignore it if so (optimization). */ + for (p = pending; p; p=p->next) + if (p->v.preva == preva) + goto shortcut1; + + if (ok && preva != a) + { + /* the two vinfo_ts shared in 'bb' are not shared in 'aa', + i.e. two nodes are shared in 'bb' but not in 'aa'. + We must compare the second node in 'aa' again with the + same single node of 'bb'. */ + /* Backtracking */ +#if ALL_CHECKS + signed char* buf_opc1 = cmpinternal.buf_opc; + Source* buf_args1 = cmpinternal.buf_args; + int tmp_counter1 = cmpinternal.tmp_counter; +#endif + cmpinternal.tmp_counter = saved_tmp_counter; + cmpinternal.buf_args = saved_buf_args; + cmpinternal.buf_opc = saved_buf_opc; + ok = compatible_vinfo(preva, bsource, opc, result, a, + recdepth); +#if ALL_CHECKS + if (ok) { + extra_assert(buf_opc1 == cmpinternal.buf_opc); + extra_assert(buf_args1 == cmpinternal.buf_args); + extra_assert(tmp_counter1 == cmpinternal.tmp_counter); + } +#endif + } + + /* go on with the loop even if !ok, to free all items left + in [pbegin, pend[. They must be freed now because they are + no longer members of the main linked list -- + the members of the linked list are freed automatically by + fz_compatible_array() */ + } + + if (!ok) + return false; + } + + cmpinternal.tmp_counter++; + extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); + } + } + return true; +#undef CHECK_FOR_NULL +} + +#if COMPRESS_COMPILETIME_SUBITEMS +/* same as 'compatible_array', faster, for when you are not + interested in the result */ +static void skip_compatible_array(int count) +{ + int i; + extra_assert(count >= 0); + for (i=count; i--; ) + { + int opc = fz_getopc(); + extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); + if (opc == FZ_OPC_NULL) + ; + else if (opc < 0) + ; + else + { +#if PSYCO_DEBUG + Source bsource = fz_getarg(); + extra_assert(is_compiletime(bsource)); +#else + fz_getarg(); +#endif + skip_compatible_array(opc); + + /* no link should resolve now, fz_compress() takes care of that */ + extra_assert(cmpinternal.tmp_counter < cmpinternal.vcilink->time); + cmpinternal.tmp_counter++; + } + } +} +#endif /* COMPRESS_COMPILETIME_SUBITEMS */ + +PSY_INLINE bool fz_compatible_array(vinfo_array_t* aa, FrozenPsycoObject* fpo, + vcompatible_t* result) { + bool ok; + fz_load_fpo_stack(fpo); + ok = compatible_array(aa, fz_getopc(), &result->diff, aa, 0); + + /* free the linked list (it should already be free if 'ok') */ + while (cmpinternal.vcilink != &cmpinternal.sentinel) + { + struct vcilink_s* p = cmpinternal.vcilink; + cmpinternal.vcilink = p->next; + psyco_llfree_vci(p); + } + + return ok; +} + + +#endif /* VLOCALS_OPC */ + + +DEFINEFN +void psyco_delete_unused_vars(PsycoObject* po, global_entries_t* ge) +{ + int i, limit; + PyObject* plist = ge->fatlist; + extra_assert(PyList_Check(plist)); + limit = PyList_GET_SIZE(plist); + for (i=0; ifatlist; + extra_assert(PyList_Check(plist)); + i = PyList_GET_SIZE(plist); + while (i--) /* the most dummy algorithm: step by step in the list, */ + { /* checking for a match at each step. */ + CodeBufferObject* codebuf; + PyObject* o1 = PyList_GET_ITEM(plist, i); + if (!CodeBuffer_Check(o1)) + break; + codebuf = (CodeBufferObject*) o1; + result.matching = codebuf; + result.diff = NullArray; + extra_assert(CodeBuffer_Check(codebuf)); + fz_check_invariant(&codebuf->snapshot); + if (fz_compatible_array(&po->vlocals, &codebuf->snapshot, &result)) + { + /* compatible_array() leaves data in the 'tmp' fields. + It must be cleared unless it is the final result of + psyco_compatible() itself. */ + if (result.diff == NullArray) + { + /* Total match */ + if (bestresult != NULL) + array_release(bestresult); + return &result; + } + else + { + /* Partial match, clear 'tmp' fields */ + fz_restore_invariant(&codebuf->snapshot); + if (bestresult != NULL) + { + if (bestresult->count <= result.diff->count) + { + array_release(result.diff); + continue; /* not better than the previous partial match */ + } + array_release(bestresult); + } + /* Record the best partial match we found so far */ + bestresult = result.diff; + bestbuf = codebuf; + } + } + else /* compatible_array() should have reset all 'tmp' fields */ + fz_check_invariant(&codebuf->snapshot); + } + if (bestresult == NULL) + return NULL; + else + { + result.matching = bestbuf; + result.diff = bestresult; + return &result; + } +} + +DEFINEFN +void psyco_stabilize(vcompatible_t* lastmatch) +{ + if (lastmatch->diff == NullArray) + fz_restore_invariant(&lastmatch->matching->snapshot); + else + fz_check_invariant(&lastmatch->matching->snapshot); + array_release(lastmatch->diff); +} + + + /***************************************************************/ +/*** Unification ***/ + /***************************************************************/ + + +/* psyco_unify() is implemented in idispatcher.c */ + + +DEFINEFN +CodeBufferObject* psyco_unify_code(PsycoObject* po, vcompatible_t* lastmatch) +{ + /* simplified interface to psyco_unify() without using a previously + existing code buffer. */ + + CodeBufferObject* target; + code_t localbuf[GUARANTEED_MINIMUM]; + /* relies on the fact that psyco_unify() has no room at all in localbuf. + Anything but the final JMP will trigger the creation of a new code + buffer. */ + po->code = localbuf; + INIT_CODE_EMISSION(po->code); + po->codelimit = NULL; + psyco_unify(po, lastmatch, &target); + return target; +} + +#define KEEP_MARK ((vinfo_t*) 1) + +static int mark_to_keep(vinfo_array_t* array, bool virtual_parent) +{ + int i, total=0; + for (i=array->count; i--; ) + { + vinfo_t* vi = array->items[i]; + if (vi != NULL) + { + if (is_runtime(vi->source) && vi->tmp == NULL) + { + if (!virtual_parent) + continue; + /* mark this item to be kept */ + vi->tmp = KEEP_MARK; + total++; + } + if (vi->array != NullArray) + total += mark_to_keep(vi->array, is_virtualtime(vi->source)); + } + } + return total; +} + +static void remove_non_marked(vinfo_array_t* array, PsycoObject* po) +{ + int i; + for (i=array->count; i--; ) + { + vinfo_t* vi = array->items[i]; + if (vi != NULL) + { + if (is_runtime(vi->source) && vi->tmp == NULL) + { + /* remove this item */ + array->items[i] = NULL; + vinfo_decref(vi, po); + } + else if (vi->array != NullArray) + { + if (is_compiletime(vi->source)) + { + /* remove all sub-items */ + vinfo_array_t* array = vi->array; +#if PSYCO_DEBUG + /* we just verify that there are only compile-time + subitems. */ + int j; + for (j=0; jcount; j++) + extra_assert(array->items[j] == NULL || + is_compiletime(array->items[j]->source)); +#endif + vi->array = NullArray; + array_delete(array, po); + } + else + remove_non_marked(vi->array, po); + } + } + } +} + +DEFINEFN +int psyco_simplify_array(vinfo_array_t* array, PsycoObject* po) +{ + /* We remove a run-time vinfo_t if it is not directly in 'array' and + if it is not in the sub-vinfo_array_t of any virtual-time source. */ + + /* First mark with a non-NULL value all run-time sources that must + be kept. */ + int total; + assert_cleared_tmp_marks(array); + total = mark_to_keep(array, true); + + /* Remove all non-marked run-time sources */ + remove_non_marked(array, po); + + /* Done */ + return total; +} + +static void remove_non_compiletime(vinfo_t* v, PsycoObject* po) +{ + vinfo_array_t* array = v->array; + int j, length=array->count, newlength=0; + for (j=0; jitems[j]; + if (vi != NULL) + { + if (!is_compiletime(vi->source)) + { + array->items[j] = NULL; + vinfo_decref(vi, po); + } + else + newlength = j+1; + } + } + vinfo_array_shrink(po, v, newlength); +} + + + /***************************************************************/ +/*** Promotion and un-promotion ***/ + /***************************************************************/ + + +/*****************************************************************/ + /*** Promotion of a run-time variable into a fixed ***/ + /*** compile-time one ***/ + + +/* Implementation tactics */ + +/* 0 -- use a plain Python dictionary whose keys + are the value to promote and values the code objects. + 1 -- put code buffers in a chained list, + with the most used items moving forward in the list. + 2 -- order the code buffers as a binary search tree, + with the most used nodes moving up in the tree (not implemented) +*/ +#define PROMOTION_TACTIC 1 + + +#if PROMOTION_TACTIC == 1 +typedef struct rt_local_buf_s { +# if CODE_DUMP + long signature; +# endif + struct rt_local_buf_s* next; + long key; +} rt_local_buf_t; +#endif + +typedef struct { /* produced at compile time and read by the dispatcher */ + INTERNAL_PROMOTION_FIELDS + + PsycoObject* po; /* state before promotion */ + vinfo_t* fix; /* variable to promote */ + +#if PROMOTION_TACTIC == 0 + PyObject* spec_dict; /* local cache (promotions to already-seen values) */ +# if CODE_DUMP + void** chained_list; /* must be last, with spec_dict just before */ +# endif +#endif + +#if PROMOTION_TACTIC == 1 + rt_local_buf_t* local_chained_list; +# if CODE_DUMP + long zero_tag; +# endif +#endif +} rt_promotion_t; + + +/* this macro might be redefined below */ +#define QUICK_LOOKUP_PROMOTION_VALUE(fs, value, result) \ + result = lookup_old_promotion_values(fs, value) + + +#if PROMOTION_TACTIC == 0 +#define NEED_PYOBJ_KEY +PSY_INLINE code_t* lookup_old_promotion_values(rt_promotion_t* fs, + PyObject* key) +{ + /* have we already seen this value? */ + CodeBufferObject* codebuf; + codebuf = (CodeBufferObject*) PyDict_GetItem(fs->spec_dict, key); + if (codebuf != NULL) /* yes */ + return (code_t*) codebuf->codestart; + return NULL; /* no */ +} +#endif /* PROMOTION_TACTIC == 0 */ + +#if PROMOTION_TACTIC == 1 +# if PROMOTION_FAST_COMMON_CASE +static +# else +PSY_INLINE +# endif +code_t* lookup_old_promotion_values(rt_promotion_t* fs, long value) +{ + rt_local_buf_t** ppbuf; + if (fs->local_chained_list == NULL) + return NULL; /* not found (list is empty) */ + +#if PROMOTION_FAST_COMMON_CASE + /* 'fs->local_chained_list' points to the current head + of the list, which we know is not what we are looking + for because otherwise the CMP/JE instructions + would have found it and we would not be here */ + extra_assert(fs->local_chained_list->key != value); +#else + if (fs->local_chained_list->key == value) + return (code_t*)(fs->local_chained_list+1); /* it is the head of the list */ +#endif + + ppbuf = &fs->local_chained_list->next; + while (1) + { + rt_local_buf_t* buf = *ppbuf; + if (buf == NULL) + return NULL; /* not found (list exhausted) */ + if (buf->key == value) + { + /* found inside the list, put it at the head */ + *ppbuf = buf->next; + buf->next = fs->local_chained_list; + fs->local_chained_list = buf; + return (code_t*)(buf+1); + } + ppbuf = &buf->next; + } +} + +#if PROMOTION_FAST_COMMON_CASE +static int quick_lookup_counter = 0; +# undef QUICK_LOOKUP_PROMOTION_VALUE +# define QUICK_LOOKUP_PROMOTION_VALUE(fs, value, res) do { \ + rt_local_buf_t* buf = (fs)->local_chained_list; \ + if (buf == NULL) { \ + res = NULL; /* not found (list is empty) */ \ + } \ + else if ((quick_lookup_counter-=13) >= 0) { \ + for (buf=buf->next; buf!=NULL; buf=buf->next) { \ + if (buf->key == (value)) \ + return (code_t*)(buf+1); \ + } \ + res = NULL; /* not found */ \ + } \ + else { \ + /* approximately once every 23 times, go through */ \ + /* the slower path that will move the item to */ \ + /* the head of the search list if it is found. */ \ + quick_lookup_counter += 307; \ + res = lookup_old_promotion_values(fs, value); \ + } \ + } while (0) +#endif + +PSY_INLINE int lookup_count_previous_values(rt_promotion_t* fs, + rt_local_buf_t** megabuf) +{ + int result = 0; + rt_local_buf_t* buf = fs->local_chained_list; + while (buf) { + if (buf->key == -1) /* use (PyObject*)(-1) as a marker */ + *megabuf = buf; + result++; + buf = buf->next; + } + return result; +} +#endif /* PROMOTION_TACTIC == 1 */ + + +static code_t* do_promotion_internal(rt_promotion_t* fs, +#ifdef NEED_PYOBJ_KEY + PyObject* key, +#else + long key, +#endif + source_known_t* sk) +{ + CodeBufferObject* codebuf; + code_t* result; + vinfo_t* v; + PsycoObject* newpo; + PsycoObject* po = fs->po; + mergepoint_t* mp; + + /* get a copy of the compiler state */ + newpo = PsycoObject_Duplicate(po); + if (newpo == NULL) + OUT_OF_MEMORY(); + /* store the copy back into 'fs' and use the old 'po' to compile. + We do so because in 'newpo' all 'tmp' fields are now NULL, + but no longer in 'po'. */ + fs->po = newpo; + v = fs->fix; /* get the variable we will promote to compile-time... */ + fs->fix = v->tmp; /* ...and update 'fs' with its copy in 'newpo' */ + + /* fix the value of 'v' */ + CHKTIME(v->source, RunTime); /* from run-time to compile-time */ +#if REG_TOTAL > 0 + if (!RSOURCE_REG_IS_NONE(v->source)) + { + /* remove this value from 'po->regarray' */ + REG_NUMBER(po, RSOURCE_REG(v->source)) = NULL; + SET_RUNTIME_REG_TO_NONE(v); + } +#endif + v->source = CompileTime_NewSk(sk); + /* compile from this new state, in which 'v' has been promoted to + compile-time. */ + mp = psyco_exact_merge_point(po->pr.merge_points, po->pr.next_instr); + +#if PROMOTION_TACTIC == 0 + codebuf = psyco_compile_code(po, mp); + + /* store the new code buffer into the local cache */ + RECLIMIT_SAFE_ENTER(); + if (PyDict_SetItem(fs->spec_dict, key, (PyObject*) codebuf)) + OUT_OF_MEMORY(); + RECLIMIT_SAFE_LEAVE(); + Py_DECREF(codebuf); /* there is a reference left + in the dictionary */ + result = (code_t*) codebuf->codestart; +#endif + +#if PROMOTION_TACTIC == 1 + codebuf = psyco_new_code_buffer(NULL, NULL, &po->codelimit); + { + code_t* codeend; + rt_local_buf_t* buf = (rt_local_buf_t*) codebuf->codestart; + code_t* code = (code_t*)(buf+1); + ALIGN_NO_FILL(); + result = code; + buf = ((rt_local_buf_t*) code) - 1; + +# if CODE_DUMP + memset(codebuf->codestart, 0xCC, ((char*) buf) - ((char*) codebuf->codestart)); + buf->signature = 0x66666666; +# endif + buf->next = fs->local_chained_list; + buf->key = key; + fs->local_chained_list = buf; + + po->code = insn_code_label(result); + codeend = psyco_compile(po, mp, false); + psyco_shrink_code_buffer(codebuf, codeend); + /* XXX don't know what to do with reference to 'codebuf' */ + } +#endif + + dump_code_buffers(); + return result; +} + +static code_t* detected_megamorphic_pyobj_site(rt_promotion_t* fs) +{ + CodeBufferObject* codebuf; + code_t* result; + vinfo_t* v; + PsycoObject* newpo; + PsycoObject* po = fs->po; + mergepoint_t* mp; + + /* get a copy of the compiler state */ + newpo = PsycoObject_Duplicate(po); + if (newpo == NULL) + OUT_OF_MEMORY(); + /* store the copy back into 'fs' and use the old 'po' to compile. + We do so because in 'newpo' all 'tmp' fields are now NULL, + but no longer in 'po'. */ + fs->po = newpo; + v = fs->fix; /* get the variable we will mark as megamorphic... */ + fs->fix = v->tmp; /* ...and update 'fs' with its copy in 'newpo' */ + + /* mark 'v' as megamorphic */ + CHKTIME(v->source, RunTime); + v->source |= RunTime_Megamorphic; + /* compile from this new state, in which 'v' has been flagged */ + mp = psyco_exact_merge_point(po->pr.merge_points, po->pr.next_instr); + +#if PROMOTION_TACTIC == 0 +# error "XXX reimplement" +#endif + +#if PROMOTION_TACTIC == 1 + codebuf = psyco_new_code_buffer(NULL, NULL, &po->codelimit); + { + code_t* codeend; + rt_local_buf_t* buf = (rt_local_buf_t*) codebuf->codestart; + code_t* code = (code_t*)(buf+1); + ALIGN_NO_FILL(); + result = code; + buf = ((rt_local_buf_t*) code) - 1; + +# if CODE_DUMP + memset(codebuf->codestart, 0xCC, ((char*) buf) - ((char*) codebuf->codestart)); + buf->signature = 0x66666666; +# endif + buf->next = fs->local_chained_list; + buf->key = -1; /* use (PyObject*)(-1) as a marker */ + fs->local_chained_list = buf; + + po->code = insn_code_label(result); + codeend = psyco_compile(po, mp, false); + psyco_shrink_code_buffer(codebuf, codeend); + /* XXX don't know what to do with reference to 'codebuf' */ + } +#endif + + dump_code_buffers(); + return result; +} + + +/* NOTE: the following two functions must be as fast as possible, because + they are called from the run-time code even during normal (non-compiling) + execution. */ +static code_t* do_promotion_long(rt_promotion_t* fs, long value) +{ + /* need a PyObject* key for the local cache dictionary */ + code_t* result; + +#ifdef NEED_PYOBJ_KEY + PyObject* key1 = PyInt_FromLong(value); + if (key1 == NULL) + OUT_OF_MEMORY(); +#else + long key1 = value; +#endif + + /* have we already seen this value? */ + QUICK_LOOKUP_PROMOTION_VALUE(fs, key1, result); + if (result == NULL) + { + /* no -> we must build new code */ + result = do_promotion_internal(fs, key1, sk_new(value, SkFlagFixed)); + } +#ifdef NEED_PYOBJ_KEY + Py_DECREF(key1); +#endif + /* done -> jump to the codebuf */ + return fix_fast_common_case(fs, value, result); +} + +static code_t* do_promotion_pyobj(rt_promotion_t* fs, PyObject* key) +{ + code_t* result; + +#ifdef NEED_PYOBJ_KEY + PyObject* key1 = key; +#else + long key1 = (long) key; +#endif + + /* have we already seen this value? */ + QUICK_LOOKUP_PROMOTION_VALUE(fs, key1, result); + if (result == NULL) + { + /* no -> we must build new code */ + Py_INCREF(key); + result = do_promotion_internal(fs, key1, sk_new((long) key, + SkFlagFixed|SkFlagPyObj)); + } + /* done -> jump to the codebuf */ + return fix_fast_common_case(fs, (long) key, result); +} + +static code_t* do_promotion_pyobj_mega(rt_promotion_t* fs, PyObject* key) +{ + code_t* result; + +#ifdef NEED_PYOBJ_KEY + PyObject* key1 = key; +#else + long key1 = (long) key; +#endif + + /* have we already seen this value? */ + QUICK_LOOKUP_PROMOTION_VALUE(fs, key1, result); + if (result == NULL) + { + /* no -> did we already promote many objects here? */ + rt_local_buf_t* megabuf = NULL; + if (lookup_count_previous_values(fs, &megabuf) >= MEGAMORPHIC_MAX) + { + /* yes -> stop specializing */ + if (megabuf == NULL) + return detected_megamorphic_pyobj_site(fs); + else + return (code_t*)(megabuf+1); /* mega version already compiled */ + } + /* no -> we must build new code */ + Py_INCREF(key); + result = do_promotion_internal(fs, key1, sk_new((long) key, + SkFlagFixed|SkFlagPyObj)); + } + /* done -> jump to the codebuf */ + return fix_fast_common_case(fs, (long) key, result); +} + +DEFINEFN +code_t* psyco_finish_promotion(PsycoObject* po, vinfo_t* fix, int pflags) +{ + rt_promotion_t* fs; + void* do_promotion; + + /* we remove the non-compile-time array values from 'fix' */ + if (fix->array != NullArray) + remove_non_compiletime(fix, po); + + TRACE_EXECUTION("PROMOTION"); + + /* write the code that calls the proxy 'do_promotion' */ + switch (pflags) { + case 0: + do_promotion = &do_promotion_long; + break; + case PFlagPyObj: + do_promotion = &do_promotion_pyobj; + break; + /*case PFlagMegamorphic: ... */ + case PFlagPyObj | PFlagMegamorphic: + do_promotion = &do_promotion_pyobj_mega; + break; + default: + psyco_fatal_msg("bad pflags"); + return NULL; + } + fs = (rt_promotion_t*) ipromotion_finish(po, fix, do_promotion); + + /* fill in the constant structure that 'do_promotion' will get as parameter */ + clear_tmp_marks(&po->vlocals); + psyco_assert_coherent(po); + fs->po = po; /* don't release 'po' */ + fs->fix = fix; + +#if PROMOTION_TACTIC == 0 + fs->spec_dict = PyDict_New(); + if (fs->spec_dict == NULL) + OUT_OF_MEMORY(); +# if CODE_DUMP + fs->chained_list = psyco_codebuf_spec_dict_list; + psyco_codebuf_spec_dict_list = (void**)&fs->chained_list; +# endif +#endif + +#if PROMOTION_TACTIC == 1 + fs->local_chained_list = NULL; +# if CODE_DUMP + fs->zero_tag = 0; +# endif +#endif + + return (code_t*)(fs+1); /* end of code == end of 'fs' structure */ +} + + +/*****************************************************************/ + /*** Promotion of certain run-time values into ***/ + /*** compile-time ones (promotion only occurs for certain ***/ + /*** values, e.g. for types that we know how to optimize). ***/ + +#if USE_RUNTIME_SWITCHES + +typedef struct { /* produced at compile time and read by the dispatcher */ + fixed_switch_t* rts; /* special values */ + PsycoObject* po; /* state before promotion */ + vinfo_t* fix; /* variable to promote */ + long kflags; /* flags after promotion */ + code_t* switchcodeend; /* end of the private copy of the switch code */ +} rt_fixed_switch_t; + +static code_t* do_fixed_switch(rt_fixed_switch_t* rtfxs, long value) +{ + int item; + CodeBufferObject* codebuf; + fixed_switch_t* rts = rtfxs->rts; + vinfo_t* v; + PsycoObject* newpo; + PsycoObject* po = rtfxs->po; + + /* get a copy of the compiler state */ + newpo = psyco_duplicate(po); + /* store the copy back into rtfxs and use the old 'po' to compile. + We do so because in 'newpo' all 'tmp' fields are now NULL, + but no longer in 'po'. */ + rtfxs->po = newpo; + v = rtfxs->fix; /* get the variable we will promote to compile-time... */ + rtfxs->fix = v->tmp; /* ...and update 'rtfxs' with its copy in 'newpo' */ + + item = psyco_switch_lookup(rts, value); /* which value did we found? */ + if (item == -1) + { + /* none --> go into 'default' mode */ + /* abuse the 'array' field to point to this fixed_switch_t + to mean 'known to be none of the special values'. + See known_to_be_default(). */ + v->array = NullArrayAt(rts->zero); + } + else + { + /* fix the value of 'v' to the one we found */ + CHKTIME(v->source, RunTime); /* from run-time to compile-time */ + if (!RUNTIME_REG_IS_NONE(v)) + REG_NUMBER(po, RUNTIME_REG(v)) = NULL; + v->source = CompileTime_NewSk(sk_new(value, rtfxs->kflags)); + } + + /* compile from this new state */ + codebuf = psyco_compile_code(po, psyco_exact_merge_point(po->pr.merge_points, + po->pr.next_instr)); + + /* store the pointer to the new code directly into + the original code that jumped to do_fixed_switch() */ + psyco_fix_switch_case(rts, rtfxs->switchcodeend, item, codebuf->codeptr); + + return codebuf->codeptr; /* jump there */ + /* XXX no place to store the reference to codebuf */ +} + +DEFINEFN +code_t* psyco_finish_fixed_switch(PsycoObject* po, vinfo_t* fix, long kflags, + fixed_switch_t* special_values) +{ + rt_fixed_switch_t* rtfxs; + code_t* switchcodeend; + CHKTIME(fix->source, RunTime); + extra_assert(fix->array->count == 0); /* cannot fix array values, + because of known_to_be_default() */ + TRACE_EXECUTION("FIXED_SWITCH"); + BEGIN_CODE + NEED_CC(); + RTVINFO_IN_REG(fix); + switchcodeend = code = psyco_write_run_time_switch(special_values, code, + RUNTIME_REG(fix)); + + TEMP_SAVE_REGS_FN_CALLS; /* save all registers that might be clobbered */ + CALL_SET_ARG_FROM_RT(fix->source, 1, 2);/* argument index 1 out of total 2 */ + END_CODE + + /* write the code that calls the proxy 'do_fixed_switch' */ + rtfxs = (rt_fixed_switch_t*) psyco_jump_proxy(po, &do_fixed_switch, 1, 2); + + /* fill in the constant struct that 'do_fixed_switch' will get as parameter */ + clear_tmp_marks(&po->vlocals); + psyco_assert_coherent(po); + rtfxs->rts = special_values; + rtfxs->po = po; + rtfxs->fix = fix; + rtfxs->kflags = kflags; + rtfxs->switchcodeend = switchcodeend; + return (code_t*)(rtfxs+1); +} + +#endif /* USE_RUNTIME_SWITCHES */ + + +/*****************************************************************/ + /*** Un-Promotion from non-fixed compile-time into run-time ***/ + +static void array_remove_vinfo(vinfo_array_t* array, vinfo_t* vi) +{ + int i = array->count; + while (i--) + { + vinfo_t* a = array->items[i]; + if (a != NULL) + { + if (a == vi) + { + extra_assert(a->refcount > 1); + vinfo_decref(a, NULL); /* other references expected */ + array->items[i] = NULL; + } + else if (a->array != NullArray) + array_remove_vinfo(a->array, vi); + } + } +} + +static void array_remove_inside_ct(vinfo_array_t* array, vinfo_t* vi) +{ + int i = array->count; + while (i--) + { + vinfo_t* a = array->items[i]; + if (a != NULL && a->array != NullArray) + { + if (is_compiletime(a->source)) + array_remove_vinfo(a->array, vi); + else + array_remove_inside_ct(a->array, vi); + } + } +} + +DEFINEFN +void psyco_unfix(PsycoObject* po, vinfo_t* vi) +{ + /* Convert 'vi' from compile-time to run-time variable. */ + vinfo_t* newvi; + source_known_t* sk; + CHKTIME(vi->source, CompileTime); + + /*printf("psyco_unfix(%p, %p, %p)\n", po, po->code, vi);*/ + + /* forget all sub-items of the compile-time 'vi', + which should all be compile-time */ + if (vi->array != NullArray) + { + array_delete(vi->array, po); + vi->array = NullArray; + } + + /* A particular case that *do* occur: + 'vi' was always selected as a compile-time vinfo_t not within + another compile-time vinfo_t's subarray; but it could + actually appear more than once in po->vlocals, and another + occurrence could be inside another compile-time vinfo_t. + As compile-time vinfo_ts are not allowed to contain anything + but compile-time vinfo_ts, unfixing 'vi' would break it. + In this situation we remove the faulty occurrences. */ + if (vi->refcount > 1) + array_remove_inside_ct(&po->vlocals, vi); + assert_array_contains_nonct(&po->vlocals, vi); + + newvi = make_runtime_copy(po, vi); + /* make_runtime_copy() never fails for compile-time sources */ + extra_assert(newvi != NULL); + + /* release 'vi->source' and move 'newvi->source' into it */ + sk = CompileTime_Get(vi->source); + if (sk->refcount1_flags & SkFlagPyObj) { + /* XXX can't release the PyObject anywhere, because we + write a pointer to it in the code itself. We should + somehow transfer the ownership of this reference to + the CodeBufferObject. Fix me when implementing + memory releasing! */ + sk->refcount1_flags &= ~SkFlagPyObj; + } + sk_decref(sk); + vinfo_move(po, vi, newvi); +} diff --git a/nodeboxgl/ext/psyco/src/c/dispatcher.h b/nodeboxgl/ext/psyco/src/c/dispatcher.h new file mode 100644 index 0000000..ded8a65 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/dispatcher.h @@ -0,0 +1,284 @@ + /***************************************************************/ +/*** Structures used by the dispatcher part ***/ + /***************************************************************/ + +#ifndef _DISPATCHER_H +#define _DISPATCHER_H + + +#include "psyco.h" +#include "vcompiler.h" +#include "processor.h" +#include "codegen.h" + + +/* a frozen PsycoObject is a snapshot of an actual PsycoObject, + capturing the state of the compiler in a form that can be used + later to compare live states to it. + The FrozenPsycoObject's secondary goal is to capture enough + information to rebuild a "live" PsycoObject, close enough to + the original to let the next few Python instructions produce + exactly the same machine code as the original. See + psyco_prepare_respawn(). Be careful, there are a lot of such + snapshots around in memory; keep them as small as possible. + + The first implementation (with VLOCALS_OPC=0) stores a copy + of the PsycoObject vlocals. So does the second implementation + (VLOCALS_OPC=1), but it compresses the copy into a very compact + pseudo-code. */ +#define VLOCALS_OPC 1 + +struct FrozenPsycoObject_s { + union { + int fz_stack_depth; + struct respawn_s* respawning; + } fz_stuff; +#if VLOCALS_OPC + Source* fz_vlocals_opc; /* compact pseudo-code copy */ +#else + vinfo_array_t* fz_vlocals; /* verbatim copy */ +#endif + PROCESSOR_FROZENOBJECT_FIELDS + short fz_respawned_cnt; + CodeBufferObject* fz_respawned_from; + pyc_data_t* fz_pyc_data; /* only partially allocated */ +}; + + +/* construction */ +PSY_INLINE void fpo_mark_new(FrozenPsycoObject* fpo) { + fpo->fz_respawned_cnt = 0; + fpo->fz_respawned_from = NULL; +} +PSY_INLINE void fpo_mark_unused(FrozenPsycoObject* fpo) { +#if VLOCALS_OPC + fpo->fz_vlocals_opc = NULL; +#else + fpo->fz_vlocals = NullArray; +#endif + fpo->fz_pyc_data = NULL; +} +EXTERNFN void fpo_build(FrozenPsycoObject* fpo, PsycoObject* po); +EXTERNFN void fpo_release(FrozenPsycoObject* fpo); + +/* build a 'live' PsycoObject from frozen snapshot */ +EXTERNFN PsycoObject* fpo_unfreeze(FrozenPsycoObject* fpo); + +/* inspection */ +PSY_INLINE int get_stack_depth(FrozenPsycoObject* fpo) { + return fpo->fz_stuff.fz_stack_depth; +} + +/* psyco_compatible(): + search in the given global_entries_t for a match to the live PsycoObject. + Return NULL if no match is found, or a vcompatible_t structure otherwise. + The returned 'diff' is an array of the 'vinfo_t*' of 'po' which are + compile-time but should be un-promoted to run-time. In particular, the + array is empty (==NullArray) if an exact match is found. + + The current implementation is not re-entrent. The returned vcompatible_t + structure must be released by psyco_stabilize() or one of the psyco_unify + functions below, before another call to psyco_compatible() can be made. +*/ +typedef struct { + CodeBufferObject* matching; /* best match */ + vinfo_array_t* diff; /* array of differences */ +} vcompatible_t; +EXTERNFN vcompatible_t* psyco_compatible(PsycoObject* po, + global_entries_t* pattern); + +EXTERNFN void psyco_stabilize(vcompatible_t* lastmatch); + + +/*****************************************************************/ + /*** "Global Entries" ***/ + +/* global entry points for the compiler. One global entry point holds a list + of already-compiled code buffers corresponding to the various states + in which the compiler has already be seen at this point. See + psyco_compatible(). + + The dispatcher saves all CodeBufferObjects (with their copy of the + compiler state) in a list for each 'entry point' of the compiler + (the main entry point is spec_main_loop, the start of the main loop). + When coming back to this entry point later, the list let us determine + whether we already encountered the same state. + + The details of this structure are private. + XXX implemented as a list object holding CodeBufferObjects in no + XXX particular order. Must be optimized for reasonably fast searches + XXX if the lists become large (more than just a few items). + + The list starts with PyIntObjects whose numbers tell which local variables + may safely be deleted at that point. +*/ +struct global_entries_s { + PyObject* fatlist; /* list of PyIntObjects then CodeBufferObjects */ +}; + +/* initialize a global_entries_t structure */ +PSY_INLINE void psyco_ge_init(global_entries_t* ge) { + ge->fatlist = PyList_New(0); + if (ge->fatlist == NULL) + OUT_OF_MEMORY(); +} + +/* register the code buffer; it will be found by future calls to + psyco_compatible(). */ +PSY_INLINE int register_codebuf(global_entries_t* ge, CodeBufferObject* codebuf) { + return PyList_Append(ge->fatlist, (PyObject*) codebuf); +} + +/* for mergepoints.c */ +PSY_INLINE void psyco_ge_unused_var(global_entries_t* ge, int num) +{ + PyObject* o = PyInt_FromLong(num); + if (o == NULL || PyList_Append(ge->fatlist, o)) + OUT_OF_MEMORY(); +} + +EXTERNFN void psyco_delete_unused_vars(PsycoObject* po, global_entries_t* ge); + + +/*****************************************************************/ + /*** Unification ***/ + +/* Update 'po' to match 'lastmatch', then jump to 'lastmatch'. + For the conversion we might have to emit some code. + If po->code == NULL or there is not enough room between code and + po->codelimit, a new code buffer is created. A new reference to + the new or target code buffer is returned in 'target'. + If po->code != NULL, the return value points at the end of the + code that has been written there; otherwise, the return value is + undefined (but not NULL). + 'po' and 'lastmatch' are released. +*/ +EXTERNFN code_t* psyco_unify(PsycoObject* po, vcompatible_t* lastmatch, + CodeBufferObject** target); + +/* Simplified interface to psyco_unify() without using a previously + existing code buffer (i.e. 'po->code' is uninitialized). If needed, + return a new buffer with the necessary code followed by a JMP to + 'lastmatch'. If no code is needed, just return a new reference to + 'lastmatch->matching'. +*/ +EXTERNFN CodeBufferObject* psyco_unify_code(PsycoObject* po, + vcompatible_t* lastmatch); + +/* To "simplify" recursively a vinfo_array_t. The simplification done + is to replace run-time values inside a sub-array of a non-virtual + value with NULL, and to remove sub-arrays of constant-time values. + We assume that these can still be reloaded later if necessary. + Returns the number of run-time values left. + This assumes that all 'tmp' marks are cleared in 'array'. */ +EXTERNFN int psyco_simplify_array(vinfo_array_t* array, + PsycoObject* po); /* 'po' may be NULL */ + +/* Emit the code to prepare for Psyco code calling Psyco code in + a compiled function call */ +PSY_INLINE bool psyco_forking(PsycoObject* po, vinfo_array_t* array) { + /* Some virtual-time objects cannot remain virtualized across calls, + because if the called function pulls them out of virtual-time, + the caller will not know it. This is unacceptable for + mutable Python objects. We hope it does not hurt in other cases, + but could be defeated by the "is" operator. */ + return psyco_limit_nested_weight(po, array, NWI_FUNCALL, + NESTED_WEIGHT_END); +} + +/*****************************************************************/ + /*** Promotion ***/ + +/* Promotion of a run-time variable into a fixed compile-time one. + Finish the code block with a jump to the dispatcher that + promotes the run-time variable 'fix' to compile-time. This + usually means the compiler will be called back again, at the + given entry point. + Note: Releases 'po'. +*/ +EXTERNFN code_t* psyco_finish_promotion(PsycoObject* po, vinfo_t* fix, + int pflags); + +#if USE_RUNTIME_SWITCHES +/* Promotion of certain run-time values into compile-time ones + (promotion only occurs for values inside a given set, e.g. for + types that we know how to optimize). The special values are + described in an array of long, turned into a source_known_t + (see processor.h). + Note: Releases 'po'. +*/ +EXTERNFN code_t* psyco_finish_fixed_switch(PsycoObject* po, vinfo_t* fix, + long kflags, + fixed_switch_t* special_values); +#endif + +/* Un-Promotion from non-fixed compile-time into run-time. + Note: this does not release 'po'. Un-promoting is easy and + don't require encoding calls to the dispatcher. +*/ +EXTERNFN void psyco_unfix(PsycoObject* po, vinfo_t* vi); + + +/*****************************************************************/ + /*** Respawning ***/ + +/* internal use */ +EXTERNFN void* psyco_prepare_respawn_ex(PsycoObject* po, + condition_code_t jmpcondition, + void* fn, int extrasize); +EXTERNFN bool psyco_prepare_respawn(PsycoObject* po, + condition_code_t jmpcondition); +EXTERNFN code_t* psyco_do_respawn(void* arg, int extrasize); +EXTERNFN code_t* psyco_dont_respawn(void* arg, int extrasize); +EXTERNFN void psyco_respawn_detected(PsycoObject* po); +#define detect_respawn_ex(po) (!++(po)->respawn_cnt) +PSY_INLINE bool detect_respawn(PsycoObject* po) { + if (detect_respawn_ex(po)) { + psyco_respawn_detected(po); + return true; + } + else + return false; +} +PSY_INLINE bool is_respawning(PsycoObject* po) { return po->respawn_cnt < 0; } + +/* the following powerful function stands for 'if the processor flag (cond) is + set at run-time, then...'. Of course we do not know yet if this will be + the case or not, but the macro takes care of preparing the required + respawns if needed. 'cond' may be CC_ALWAYS_xxx or a real processor flag. + runtime_condition_f() assumes the outcome is generally false, + runtime_condition_t() assumes the outcome is generally true. */ +PSY_INLINE bool runtime_condition_f(PsycoObject* po, condition_code_t cond) { + extra_assert(cond != CC_ERROR); + if (cond == CC_ALWAYS_FALSE) return false; + if (cond == CC_ALWAYS_TRUE) return true; + return psyco_prepare_respawn(po, cond); +} +PSY_INLINE bool runtime_condition_t(PsycoObject* po, condition_code_t cond) { + extra_assert(cond != CC_ERROR); + if (cond == CC_ALWAYS_TRUE) return true; + if (cond == CC_ALWAYS_FALSE) return false; + return !psyco_prepare_respawn(po, INVERT_CC(cond)); +} +/* extreme care is needed when using the runtime_condition_x() functions: + they must *always* get called in a sequence that doesn't depend on external + factors that may change. If a call is in one branch on an if/else, for + example, then you must make sure that the "if" condition cannot give a + different result during later respawning. See load_global for a what to do + if this is not the case. */ + +/* the following functions let you test at compile-time the fact that a + value is 0 or not. Returns 0 or 1, or -1 in case of error. + Uses integer_NON_NULL() and so accepts 'vi==NULL' and !!consumes a ref!! + *Do not use* for values that might hold a reference to a PyObject; + use object_non_null() in this case. */ +EXTERNFN int runtime_NON_NULL_f(PsycoObject* po, vinfo_t* vi); +EXTERNFN int runtime_NON_NULL_t(PsycoObject* po, vinfo_t* vi); + +/* check if an integer is between the given *inclusive* bounds. + Same return values as above. Does not consume a ref. */ +EXTERNFN int runtime_in_bounds(PsycoObject* po, vinfo_t* vi, + long lowbound, long highbound); + + +#endif /* _DISPATCHER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/files.py b/nodeboxgl/ext/psyco/src/c/files.py new file mode 100644 index 0000000..fb101d6 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/files.py @@ -0,0 +1,166 @@ +#! /usr/bin/env python + +"""List of source files of Psyco, the Python specializing compiler + +This script can be used to rebuild various headers and the MANIFEST.""" + + +class Source: + def __init__(self, filename, initname=None): + self.filename = filename + self.initname = initname + +class Object(Source): + def __init__(self, name, has_init=1): + if has_init: + initname = 'psy_%s_init' % name + else: + initname = None + Source.__init__(self, 'Objects/p%s.c' % name, initname) + +class Module(Source): + def __init__(self, name): + Source.__init__(self, 'Modules/p%s.c' % name, 'psyco_init%s' % name) + + +SRC = [ + Source('dispatcher.c'), + Source('vcompiler.c', 'psyco_compiler_init'), + Source('psyco.c'), + Source('platform.c'), + Source('psyfunc.c'), + Source('stats.c', 'psyco_stats_init'), + Source('profile.c', 'psyco_profile_init'), + Source('cstruct.c', 'psyco_cstruct_init'), + Source('alarm.c', 'psyco_alarm_init'), + Source('codemanager.c'), + Source('codegen.c', 'psyco_codegen_init'), + Source('mergepoints.c'), + Source('linuxmemchk.c'), + Source('Python/pycompiler.c', 'psyco_pycompiler_init'), + Source('Python/frames.c', 'psyco_frames_init'), + Source('Python/pbltinmodule.c', 'psyco_bltinmodule_init'), + + Object('object'), + Object('abstract', 0), + Object('boolobject'), + Object('classobject'), + Object('descrobject'), + Object('dictobject'), + Object('floatobject'), + Object('funcobject'), + Object('intobject'), + Object('iterobject'), + Object('listobject'), + Object('longobject'), + Object('methodobject'), + Object('rangeobject'), + Object('stringobject'), + Object('structmember', 0), + Object('tupleobject'), + Object('typeobject'), + Source('Objects/compactobject.c', 'psyco_compact_init'), + Object('compactobject'), + + Module('array'), + Module('math'), + Module('psyco'), + ] + +PROCESSOR_SRC = { + 'i386': [ + Source('iprocessor.c', 'psyco_processor_init'), + Source('idispatcher.c'), + Source('iencoding.c'), + Source('ipyencoding.c'), + ], + 'ivm': [ + Source('iprocessor.c'), + Source('idispatcher.c'), + Source('iencoding.c'), + Source('ipyencoding.c'), + Source('ivm-insns.c'), + ], + } + +MAINFILE = 'psyco.c' +PLATFILE = 'platform.c' + + +def generate(processor=None): + if processor: + filename = '%s/iinitialize.h' % processor + src = PROCESSOR_SRC[processor] + else: + filename = 'initialize.h' + src = SRC + header = """\ + /***************************************************************/ +/*** Automatically generated support file ***/ + /***************************************************************/ + + /* This file is automatically generated by 'files.py'. + DO NOT MODIFY. Changes will be overwritten ! */ + +""" + print 'Rebuilding %s...' % filename + f = open(filename, 'w') + print >> f, header + if not processor: + print >> f, ' /* Including this file results in all headers Objects/xxx.h' + print >> f, ' being included, so that it has roughly the same result' + print >> f, ' for Psyco as a "#include " has for Python:' + print >> f, ' including all headers extension modules generally need.' + print >> f + print >> f, ' This file is moreover used internally by psyco.c. */' + print >> f + print >> f + print >> f, '#ifndef PSYCO_INITIALIZATION' + print >> f + for s in src: + if isinstance(s, Object): + if processor or s.filename != PLATFILE: + assert s.filename.endswith(".c") + print >> f, '# include "%s"' % (s.filename[:-2] + ".h") + print >> f + print >> f, '#else /* if PSYCO_INITIALIZATION */' + print >> f, '# undef PSYCO_INITIALIZATION' + print >> f + print >> f, '#include /* processor-specific initialization */' + print >> f + print >> f, ' /* internal part for psyco.c */' + print >> f, '#if ALL_STATIC' + for s in src: + if processor or s.filename not in (MAINFILE, PLATFILE): + print >> f, '# include "%s"' % s.filename + print >> f, '#else /* if !ALL_STATIC */' + for s in src: + if s.initname: + print >> f, ' EXTERNFN void %s(void);\t/* %s */' % (s.initname, s.filename) + print >> f, '#endif /* !ALL_STATIC */' + print >> f + if processor: + print >> f, 'PSY_INLINE void initialize_processor_files(void) {' + else: + print >> f, 'PSY_INLINE void initialize_all_files(void) {' + print >> f, ' initialize_processor_files();' + for s in src: + if s.initname: + print >> f, ' %s();\t/* %s */' % (s.initname, s.filename) + print >> f, '}' + if not processor: + print >> f + print >> f, '#endif /* PSYCO_INITIALIZATION */' + f.close() + +def main(): + generate() + for processor in PROCESSOR_SRC.keys(): + generate(processor) + + import os, sys; sys.path.insert(0, os.path.join(os.pardir, 'py-utils')) + import manifest + manifest.generate() + +if __name__ == '__main__': + main() diff --git a/nodeboxgl/ext/psyco/src/c/i386/idispatcher.c b/nodeboxgl/ext/psyco/src/c/i386/idispatcher.c new file mode 100644 index 0000000..e4b4168 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/idispatcher.c @@ -0,0 +1,367 @@ +#include "idispatcher.h" +#include "../dispatcher.h" +#include "../codemanager.h" +#include "ipyencoding.h" + + +/***************************************************************/ + /*** the hard processor-dependent part of dispatching: ***/ + /*** Unification. ***/ + + +struct dmove_s { + PsycoObject* po; + int original_stack_depth; + char* usages; /* buffer: array of vinfo_t*, see ORIGINAL_VINFO() below */ + int usages_size; + vinfo_t* copy_regs[REG_TOTAL]; + code_t* code_origin; + code_t* code_limit; + code_t* code; /* only used by data_update_stack() */ + CodeBufferObject* private_codebuf; +}; + +static code_t* data_new_buffer(code_t* code, struct dmove_s* dm) +{ + /* creates a new buffer containing a copy of the already-written code */ + CodeBufferObject* codebuf; + int codesize; + if (dm->private_codebuf != NULL) + { + /* overflowing the regular (large) code buffer */ + psyco_emergency_enlarge_buffer(&code, &dm->code_limit); + return code; + } + else + { + /* overflowing the small buffer, start a new (regular) one */ + codebuf = psyco_new_code_buffer(NULL, NULL, &dm->code_limit); + codebuf->snapshot.fz_stuff.fz_stack_depth = dm->original_stack_depth; + /* the new buffer should be at least as large as the old one */ + codesize = code - dm->code_origin; + if ((code_t*) codebuf->codestart + codesize > dm->code_limit) + Py_FatalError("psyco: unexpected unify buffer overflow"); + /* copy old code to new buffer */ + memcpy(codebuf->codestart, dm->code_origin, codesize); + dm->private_codebuf = codebuf; +#if PSYCO_DEBUG + dm->code_origin = (code_t*) 0xCDCDCDCD; +#endif + return ((code_t*) codebuf->codestart) + codesize; + } +} + +#define ORIGINAL_VINFO(spos) (*(vinfo_t**)(dm->usages + ( \ + extra_assert(0 <= (spos) && (spos) < dm->usages_size), \ + (spos)))) + +static void data_original_table(vinfo_t* a, RunTimeSource bsource, + struct dmove_s* dm) +{ + /* called on each run-time vinfo_t in the FrozenPsycoObject. + Record in the array dm->usages which vinfo_t is found at what position + in the stack. Ignore the ones after dm->usages_size: they correspond to + stack positions which will soon be deleted (because the stack will + shrink). Note: this uses the fact that RUNTIME_STACK_NONE is zero + and uses the 0th item of dm->usages_size as general trash. */ + if (RUNTIME_STACK(a) < dm->usages_size) + ORIGINAL_VINFO(RUNTIME_STACK(a)) = a; +} + +static void data_update_stack(vinfo_t* a, RunTimeSource bsource, + struct dmove_s* dm) +{ + PsycoObject* po = dm->po; + code_t* code = dm->code; + long dststack = getstack(bsource); + long srcstack = getstack(a->source); + char rg, rgb; + vinfo_t* overridden; + + /* check for values passing from no-reference to reference */ + if ((bsource & RunTime_NoRef) == 0) { /* destination has ref */ + if ((a->source & RunTime_NoRef) == 0) /* source has ref too */ + { + /* remove the reference from 'a' because it now belongs + to 'b' ('b->source' itself is in the frozen snapshot + and must not be modified!) */ + a->source = remove_rtref(a->source); + } + else + { + /* create a new reference for 'b'. Note that if the same + 'a' is copied to several 'b's during data_update_stack() + as is allowed by graph quotient detection in + psyco_compatible(), then only the first copy will get + the original reference owned by 'a' (if any) and for + the following copies the following increfing code is + executed as well. */ + RTVINFO_IN_REG(a); + rg = RUNTIME_REG(a); + INC_OB_REFCNT_CC(rg); + } + } + /* 'a' must no longer own a reference at this point. + The case of 'b' wanting no reference but 'a' having one + is forbidden by psyco_compatible() because decrefing 'a' + would potentially leave a freed pointer in 'b'. */ + extra_assert(!has_rtref(a->source)); + + /* The operation below is: copy the value currently held by 'a' + into the stack position 'dststack'. */ + rgb = getreg(bsource); + if (rgb != REG_NONE) + dm->copy_regs[(int)rgb] = a; + if (dststack == RUNTIME_STACK_NONE || dststack == srcstack) + ; /* nothing to do */ + else + { + rg = RUNTIME_REG(a); + if (rg == REG_NONE) /* load 'a' into a register before it can be */ + { /* stored back in the stack */ + NEED_FREE_REG(rg); + LOAD_REG_FROM_EBP_BASE(rg, srcstack); + REG_NUMBER(po, rg) = a; + /*SET_RUNTIME_REG_TO(a, rg); ignored*/ + } + /* is there already a pending value at 'dststack'? */ + overridden = ORIGINAL_VINFO(dststack); + if (overridden == NULL || RUNTIME_STACK(overridden) != dststack) + goto can_save_only; /* no -- just save the new value to 'dststack'. + The case RUNTIME_STACK(overridden) != dststack + corresponds to a vinfo_t which has been moved + elsewhere in the mean time. */ + + /* yes -- careful! We might have to save the current value of + 'dststack' before we can overwrite it. */ + SET_RUNTIME_STACK_TO_NONE(overridden); + + if (!RUNTIME_REG_IS_NONE(overridden)) + { + /* no need to save the value, it is already in a register too */ + can_save_only: + /* copy 'a' to 'dststack' */ + SAVE_REG_TO_EBP_BASE(rg, dststack); + /*if (rgb == REG_NONE) + { + REG_NUMBER(po, rg) = NULL; + rg = REG_NONE; + }*/ + } + else + { + /* save 'a' to 'dststack' and load the previous value of 'dststack' + back into the register 'rg' */ + XCHG_REG_AND_EBP_BASE(rg, dststack); + SET_RUNTIME_REG_TO(overridden, rg); + REG_NUMBER(po, rg) = overridden; + rg = REG_NONE; + } + /* Now 'a' is at 'dststack', but might still be in 'rg' too */ + a->source = RunTime_New1(dststack, rg, false, false); + ORIGINAL_VINFO(dststack) = a; /* 'a' is now there */ + + if (code > dm->code_limit) + /* oops, buffer overflow. Start a new buffer */ + code = data_new_buffer(code, dm); + + } + dm->code = code; +} + +static code_t* data_free_unused(code_t* code, struct dmove_s* dm, + vinfo_array_t* aa) +{ + /* decref any object that would be present in 'po' but not at all in + the snapshot. Note that it is uncommon that this function actually + finds any unused object at all. */ + int i = aa->count; + while (i--) + { + vinfo_t* a = aa->items[i]; + if (a != NULL) + { + if (has_rtref(a->source)) + { + PsycoObject* po = dm->po; + code_t* saved_code; + a->source = remove_rtref(a->source); + + saved_code = po->code; + po->code = code; + psyco_decref_rt(po, a); + code = po->code; + po->code = saved_code; + + if (code > dm->code_limit) + /* oops, buffer overflow. Start a new buffer */ + code = data_new_buffer(code, dm); + } + if (a->array != NullArray) + code = data_free_unused(code, dm, a->array); + } + } + return code; +} + +DEFINEFN +code_t* psyco_unify(PsycoObject* po, vcompatible_t* lastmatch, + CodeBufferObject** target) +{ + /* Update 'po' to match 'lastmatch', then jump to 'lastmatch'. */ + + int i; + struct dmove_s dm; + code_t* code = po->code; + code_t* backpointer; + CodeBufferObject* target_codebuf = lastmatch->matching; + int sdepth = get_stack_depth(&target_codebuf->snapshot); + int popsdepth; + char pops[REG_TOTAL+2]; +#if PSYCO_DEBUG + bool has_ccreg = HAS_CCREG(po); +#endif + + extra_assert(lastmatch->diff == NullArray); /* unify with exact match only */ + psyco_assert_coherent(po); + dm.usages_size = sdepth + sizeof(vinfo_t**); + dm.usages = (char*) PyMem_MALLOC(dm.usages_size); + if (dm.usages == NULL) + OUT_OF_MEMORY(); + memset(dm.usages, 0, dm.usages_size); /* set to all NULL */ + memset(dm.copy_regs, 0, sizeof(dm.copy_regs)); + fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, + (fz_find_fn) &data_original_table, + &dm, false); + + dm.po = po; + dm.original_stack_depth = po->stack_depth; + dm.code_origin = code; + dm.code_limit = po->codelimit == NULL ? code : po->codelimit; + dm.private_codebuf = NULL; + + if (sdepth > po->stack_depth) + { + /* more items in the target stack (uncommon case). + Let the stack grow. */ + STACK_CORRECTION(sdepth - po->stack_depth); + po->stack_depth = sdepth; + } + + /* update the stack */ + dm.code = code; + fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, + (fz_find_fn) &data_update_stack, + &dm, true); + code = dm.code; + + /* decref any object that would be present in 'po' but not at all in + the snapshot (data_update_stack() has removed the 'ref' tag of all + vinfo_ts it actually used from 'po') */ + code = data_free_unused(code, &dm, &po->vlocals); + + /* update the registers (1): reg-to-reg moves and exchanges */ + popsdepth = po->stack_depth; + memset(pops, -1, sizeof(pops)); + for (i=0; istack_depth - RUNTIME_STACK(a); + extra_assert(from_tos >= 0); + if (from_tos < REG_TOTAL*sizeof(void*)) + { + char* ptarget = pops + (from_tos / sizeof(void*)); + if (*ptarget == -1) + *ptarget = i; + else + *ptarget = -2; + } + } + } + } + /* update the registers (2): stack-to-register POPs */ + if (popsdepth == po->stack_depth) /* only if no PUSHes have messed things up */ + for (i=0; pops[i]>=0 || pops[i+1]>=0; i++) + { + char reg = pops[i]; + if (reg<0) + {/* If there is only one 'garbage' stack entry, POP it as well. + If there are more, give up and use regular MOVs to load the rest */ + po->stack_depth -= 4; + reg = pops[++i]; + POP_REG(reg); + } + POP_REG(reg); + dm.copy_regs[(int) reg] = NULL; + po->stack_depth -= 4; + } + if (code > dm.code_limit) /* start a new buffer if we wrote past the end */ + code = data_new_buffer(code, &dm); + + /* update the registers (3): stack-to-register loads */ + for (i=0; istack_depth); + if (code > dm.code_limit) /* start a new buffer if we wrote past the end */ + code = data_new_buffer(code, &dm); +#if PSYCO_DEBUG + extra_assert(has_ccreg == HAS_CCREG(po)); +#endif + backpointer = code; + JUMP_TO((code_t*) target_codebuf->codestart); + + /* start a new buffer if the last JUMP_TO overflowed, + but not if we had no room at all in the first place. */ + if (code > dm.code_limit && po->codelimit != NULL) + { + /* the JMP instruction emitted by JUMP_TO() is not position- + independent; we must emit it again at the new position */ + code = data_new_buffer(backpointer, &dm); + JUMP_TO((code_t*) target_codebuf->codestart); + psyco_assert(code <= dm.code_limit); + } + + PyMem_FREE(dm.usages); + if (dm.private_codebuf == NULL) + { + Py_INCREF(target_codebuf); /* no new buffer created */ + *target = target_codebuf; + } + else + { + SHRINK_CODE_BUFFER(dm.private_codebuf, code, "unify"); + *target = dm.private_codebuf; + /* add a jump from the original code buffer to the new one */ + code = po->code; + JUMP_TO((code_t*) dm.private_codebuf->codestart); + dump_code_buffers(); + } + PsycoObject_Delete(po); + return code; +} diff --git a/nodeboxgl/ext/psyco/src/c/i386/idispatcher.h b/nodeboxgl/ext/psyco/src/c/i386/idispatcher.h new file mode 100644 index 0000000..ef85dd1 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/idispatcher.h @@ -0,0 +1,155 @@ + /***************************************************************/ +/*** Processor-specific routines for dispatcher.c ***/ + /***************************************************************/ + +#ifndef _IDISPATCHER_H +#define _IDISPATCHER_H + +#include "../vcompiler.h" +#include "../codegen.h" +#include "iencoding.h" + +#define NEED_STACK_FRAME_HACK 1 + + +/***************************************************************/ + /*** Unification ***/ + +/* idispatcher.c implements psyco_unify(), + whose header is given in dispatcher.h. + Conversely, dispatcher.c implements the following function + which is declared here because it is really internal: */ +typedef void (*fz_find_fn) (vinfo_t* a, RunTimeSource bsource, void* extra); +EXTERNFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, + fz_find_fn callback, void* extra, bool clear); + + +/***************************************************************/ + /*** Promotion ***/ + +/* Define to 1 to emit a "compare/jump-if-equal" pair of instructions + that checks for the most common case (actually the last seen one). */ +#define PROMOTION_FAST_COMMON_CASE 1 + + +#if PROMOTION_FAST_COMMON_CASE + /* for FIX_JUMP_IF_EQUAL() */ +# define INTERNAL_PROMOTION_FIELDS code_t* jump_if_equal_code; +#else +# define INTERNAL_PROMOTION_FIELDS /* nothing */ +#endif + +struct ipromotion_s { + INTERNAL_PROMOTION_FIELDS + /* more stuff follows, this structure is only the head of what + dispatch.c defines as rt_promotion_t */ +}; + + +PSY_INLINE code_t* fix_fast_common_case(void* fs, long value, + code_t* codeptr) +{ +#if PROMOTION_FAST_COMMON_CASE + FIX_JUMP_IF_EQUAL(((struct ipromotion_s*)fs)->jump_if_equal_code, + value, codeptr); +#endif + return codeptr; +} + +PSY_INLINE void* ipromotion_finish(PsycoObject* po, vinfo_t* fix, void* do_promotion) +{ + long xsource; + struct ipromotion_s* fs; + +#if PROMOTION_FAST_COMMON_CASE + code_t* jeqcode; + BEGIN_CODE + NEED_CC(); + RTVINFO_IN_REG(fix); + xsource = fix->source; + RESERVE_JUMP_IF_EQUAL(RSOURCE_REG(xsource)); + jeqcode = code; + END_CODE +#else + xsource = fix->source; +#endif + + fs = (struct ipromotion_s*) psyco_call_code_builder(po, do_promotion, + PROMOTION_FAST_COMMON_CASE, + xsource); +#if PROMOTION_FAST_COMMON_CASE + fs->jump_if_equal_code = jeqcode; +#endif + return fs; +} + + +/***************************************************************/ + /*** Misc. ***/ + +PSY_INLINE void* conditional_jump_to(PsycoObject* po, code_t* target, + condition_code_t condition) +{ + BEGIN_CODE + switch (condition) { + case CC_ALWAYS_FALSE: /* never jumps */ + break; + case CC_ALWAYS_TRUE: + JUMP_TO(target); /* always jumps */ + break; + default: + FAR_COND_JUMP_TO(target, condition); + } + END_CODE + return po->code; +} + +PSY_INLINE void change_cond_jump_target(void* tag, code_t* newtarget) +{ + code_t* code = (code_t*) tag; + /* safety check: do not write a JMP whose target is itself... + would make an endless loop */ + psyco_assert(newtarget != code-5 && newtarget != code-6); + CHANGE_JUMP_TO(newtarget); +} + +PSY_INLINE code_t* resume_after_cond_jump(void* tag) +{ + return (code_t*) tag; +} + +/* reserve a small buffer of code behind po->code in which conditional + code can be stored. See make_code_conditional(). */ +PSY_INLINE void* setup_conditional_code_bounds(PsycoObject* po, PsycoObject* po2, + condition_code_t condition) +{ + code_t* code2 = po->code + SIZE_OF_SHORT_CONDITIONAL_JUMP; + po2->code = code2; + po2->codelimit = code2 + RANGE_OF_SHORT_CONDITIONAL_JUMP; + return NULL; +} + +/* mark a small buffer reserved by setup_conditional_code_bounds() to be + only executed if 'condition' holds. */ +PSY_INLINE void make_code_conditional(PsycoObject* po, code_t* codeend, + condition_code_t condition, void* extra) +{ + code_t* target; + code_t* code2 = po->code + SIZE_OF_SHORT_CONDITIONAL_JUMP; + extra_assert(code2 <= codeend && + codeend <= code2 + RANGE_OF_SHORT_CONDITIONAL_JUMP); + BEGIN_CODE + if (IS_A_SINGLE_JUMP(code2, codeend, target)) + FAR_COND_JUMP_TO(target, condition); /* replace a jump with a cond jump */ + else + { /* other cases: write a short cond jump to skip the block if !condition */ + SHORT_COND_JUMP_TO(codeend, INVERT_CC(condition)); + code = codeend; + } + END_CODE + /* record the known value of 'condition' in the 'po' (non-jump) branch */ + psyco_resolved_cc(po, INVERT_CC(condition)); +} + + +#endif /* _IDISPATCHER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/i386/iencoding.c b/nodeboxgl/ext/psyco/src/c/i386/iencoding.c new file mode 100644 index 0000000..4d61177 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/iencoding.c @@ -0,0 +1,736 @@ +#include "iencoding.h" +#include "../vcompiler.h" +#include "../codegen.h" +#include "../dispatcher.h" +#include "../codemanager.h" +#include "../Python/frames.h" + + +/* We make no special use of any register but ESP, and maybe EBP + * (if EBP_IF_RESERVED). + * We consider that we can call C functions with arbitrary values in + * all registers but ESP, and that only EAX, ECX and EDX will be + * clobbered. + * We do not use EBP as the frame pointer, unlike normal C compiled + * functions. This makes instruction encodings one byte longer + * (ESP-relative instead of EBP-relative). + */ + +DEFINEVAR +reg_t RegistersLoop[REG_TOTAL] = { + /* following EAX: */ REG_386_ECX, + /* following ECX: */ REG_386_EDX, + /* following EDX: */ REG_386_EBX, + /* following EBX: */ EBP_IS_RESERVED ? REG_386_ESI : REG_386_EBP, + /* following ESP: */ REG_NONE, + /* following EBP: */ EBP_IS_RESERVED ? REG_NONE : REG_386_ESI, + /* following ESI: */ REG_386_EDI, + /* following EDI: */ REG_386_EAX }; + + +#if 0 /* disabled */ +DEFINEFN +code_t* psyco_emergency_jump(PsycoObject* po, code_t* code) +{ + STACK_CORRECTION(INITIAL_STACK_DEPTH - po->stack_depth); /* at most 6 bytes */ + code[0] = 0xE9; /* JMP rel32 */ + code += 5; + *(long*)(code-4) = ((code_t*)(&PyErr_NoMemory)) - code; + /* total: at most 11 bytes. Check the value of EMERGENCY_PROXY_SIZE. */ + return code; +} +#endif + +DEFINEFN +void* psyco_call_code_builder(PsycoObject* po, void* fn, int restore, + RunTimeSource extraarg) +{ + code_t* code = po->code; + void* result; + code_t* fixvalue; + #ifdef __APPLE__ + int aligndelta; + #endif + + if (restore) + TEMP_SAVE_REGS_FN_CALLS; + else + SAVE_REGS_FN_CALLS(true); + + CALL_STACK_ALIGN_DELTA(1+(extraarg != SOURCE_DUMMY), aligndelta); + + /* first pushed argument */ + if (extraarg != SOURCE_DUMMY) + CALL_SET_ARG_FROM_RT(extraarg, 1, 2); /* argument index 1 out of total 2 */ + + /* last pushed argument (will be the first argument of 'fn') */ + code[0] = 0x68; /* PUSH IMM32 */ + fixvalue = code+1; /* will be filled below */ + code[5] = 0xE8; /* CALL fn */ + code += 10; + *(long*)(code-4) = ((code_t*)fn) - code; + + if (restore) + { + /* cancel the effect of CALL_SET_ARG_FROM_RT on po->stack_depth, + to match the 'ADD ESP' instruction below */ + int nb_args = 1 + (extraarg != SOURCE_DUMMY); + po->stack_depth -= 4*(nb_args-1); + + extra_assert(4*nb_args < 128); /* trivially true */ + CODE_FOUR_BYTES(code, + 0x83, /* ADD */ + 0xC4, /* ESP, */ + 4*nb_args, /* 4*nb_args */ + 0); /* not used */ + code += 3; + CALL_STACK_ALIGN_RESTORE(aligndelta); + TEMP_RESTORE_REGS_FN_CALLS_AND_JUMP; + } + else + { + po->stack_depth += 4; /* for the PUSH IMM32 above */ + code[0] = 0xFF; /* JMP *EAX */ + code[1] = 0xE0; + code += 2; + } + + /* make 'fs' point just after the end of the code, aligned */ + result = (void*)(((long)code + 3) & ~ 3); +#if CODE_DUMP + while (code != (code_t*) result) + *code++ = (code_t) 0xCC; /* fill with INT 3 (debugger trap) instructions */ +#endif + *(void**)fixvalue = result; /* set value at code+1 above */ + return result; +} + +DEFINEFN +vinfo_t* psyco_call_psyco(PsycoObject* po, CodeBufferObject* codebuf, + Source argsources[], int argcount, + struct stack_frame_info_s* finfo) +{ + /* this is a simplified version of psyco_generic_call() which + assumes Psyco's calling convention instead of the C's. */ + int i, initial_depth; + Source* p; + bool ccflags; + #ifdef __APPLE__ + int aligncount=0; + #endif + BEGIN_CODE + /* cannot use NEED_CC(): it might clobber one of the registers + mentioned in argsources */ + ccflags = HAS_CCREG(po); + #ifdef __APPLE__ + /* Calculate number of registers that will be pushed by + NEED_REGISTER */ + for (i=0; ilink_stack_depth = po->stack_depth; + ABOUT_TO_CALL_SUBFUNCTION(finfo); + initial_depth = po->stack_depth; + CALL_SET_ARG_IMMED(-1, argcount, argcount+1); + p = argsources; + for (i=argcount; i--; p++) + CALL_SET_ARG_FROM_RT(*p, i, argcount+1); + CALL_C_FUNCTION(codebuf->codestart, argcount+1); + po->stack_depth = initial_depth; /* callee removes arguments */ + RETURNED_FROM_SUBFUNCTION(); + if (ccflags) + POP_CC_FLAGS(); + END_CODE + return generic_call_check(po, CfReturnRef|CfPyErrIfNull, + bfunction_result(po, true)); +} + + +/* run-time vinfo_t creation */ +PSY_INLINE vinfo_t* new_rtvinfo(PsycoObject* po, reg_t reg, bool ref, bool nonneg) { + vinfo_t* vi = vinfo_new(RunTime_New(reg, ref, nonneg)); + REG_NUMBER(po, reg) = vi; + return vi; +} + +PSY_INLINE code_t* write_modrm(code_t* code, code_t middle, + reg_t base, reg_t index, int shift, + unsigned long offset) +{ + /* write a mod/rm encoding. */ + extra_assert(index != REG_386_ESP); + extra_assert(0 <= shift && shift < 4); + if (base == REG_NONE) + { + if (index == REG_NONE) + { + code[0] = middle | 0x05; + *(unsigned long*)(code+1) = offset; + return code+5; + } + else + { + code[0] = middle | 0x04; + code[1] = (shift<<6) | (index<<3) | 0x05; + *(unsigned long*)(code+2) = offset; + return code+6; + } + } + else if (index == REG_NONE) + { + if (base == REG_386_ESP) + { + code[0] = 0x84 | middle; + code[1] = 0x24; + *(unsigned long*)(code+2) = offset; + return code+6; + } + else if (COMPACT_ENCODING && offset == 0 && base!=REG_386_EBP) + { + code[0] = middle | base; + return code+1; + } + else if (COMPACT_ENCODING && offset < 128) + { + code[0] = 0x40 | middle | base; + code[1] = (code_t) offset; + return code+2; + } + else + { + code[0] = 0x80 | middle | base; + *(unsigned long*)(code+1) = offset; + return code+5; + } + } + else + { + code[1] = (shift<<6) | (index<<3) | base; + if (COMPACT_ENCODING && offset == 0 && base!=REG_386_EBP) + { + code[0] = middle | 0x04; + return code+2; + } + else if (COMPACT_ENCODING && offset < 128) + { + code[0] = middle | 0x44; + code[2] = (code_t) offset; + return code+3; + } + else + { + code[0] = middle | 0x84; + *(long*)(code+2) = offset; + return code+6; + } + } +} + +#define NewOutputRegister ((vinfo_t*) 1) + +static reg_t mem_access(PsycoObject* po, code_t opcodes[], vinfo_t* nv_ptr, + long offset, vinfo_t* rt_vindex, int size2, + vinfo_t* rt_extra) +{ + int i; + reg_t basereg, indexreg, extrareg; + + BEGIN_CODE + if (is_runtime(nv_ptr->source)) + { + RTVINFO_IN_REG(nv_ptr); + basereg = RUNTIME_REG(nv_ptr); + } + else + { + offset += CompileTime_Get(nv_ptr->source)->value; + basereg = REG_NONE; + } + + if (rt_vindex != NULL) + { + DELAY_USE_OF(basereg); + RTVINFO_IN_REG(rt_vindex); + indexreg = RUNTIME_REG(rt_vindex); + } + else + indexreg = REG_NONE; + + if (rt_extra == NULL) + extrareg = 0; + else + { + DELAY_USE_OF_2(basereg, indexreg); + if (rt_extra == NewOutputRegister) + NEED_FREE_REG(extrareg); + else + { + if (size2==0) + RTVINFO_IN_BYTE_REG(rt_extra, basereg, indexreg); + else + RTVINFO_IN_REG(rt_extra); + extrareg = RUNTIME_REG(rt_extra); + } + } + + for (i = *opcodes++; i--; ) *code++ = *opcodes++; + code = write_modrm(code, (code_t)(extrareg<<3), basereg, indexreg, size2, + (unsigned long) offset); + for (i = *opcodes++; i--; ) *code++ = *opcodes++; + END_CODE + return extrareg; +} + +DEFINEFN +vinfo_t* psyco_memory_read(PsycoObject* po, vinfo_t* nv_ptr, long offset, + vinfo_t* rt_vindex, int size2, bool nonsigned) +{ + code_t opcodes[4]; + reg_t targetreg; + switch (size2) { + case 0: + /* reading only one byte */ + opcodes[0] = 2; + opcodes[1] = 0x0F; + opcodes[2] = nonsigned + ? 0xB6 /* MOVZX reg, byte [...] */ + : 0xBE; /* MOVSX reg, byte [...] */ + opcodes[3] = 0; + break; + case 1: + /* reading only two bytes */ + opcodes[0] = 2; + opcodes[1] = 0x0F; + opcodes[2] = nonsigned + ? 0xB7 /* MOVZX reg, short [...] */ + : 0xBF; /* MOVSX reg, short [...] */ + opcodes[3] = 0; + break; + default: + /* reading a long */ + opcodes[0] = 1; + opcodes[1] = 0x8B; /* MOV reg, long [...] */ + opcodes[2] = 0; + break; + } + targetreg = mem_access(po, opcodes, nv_ptr, offset, rt_vindex, + size2, NewOutputRegister); + return new_rtvinfo(po, targetreg, false, false); +} + +DEFINEFN +bool psyco_memory_write(PsycoObject* po, vinfo_t* nv_ptr, long offset, + vinfo_t* rt_vindex, int size2, vinfo_t* value) +{ + code_t opcodes[8]; + if (!compute_vinfo(value, po)) return false; + + if (is_runtime(value->source)) + { + switch (size2) { + case 0: + /* writing only one byte */ + opcodes[0] = 1; + opcodes[1] = 0x88; /* MOV byte [...], reg */ + /* 'reg' is forced in mem_access to be an 8-bit register */ + opcodes[2] = 0; + break; + case 1: + /* writing only two bytes */ + opcodes[0] = 2; + opcodes[1] = 0x66; + opcodes[2] = 0x89; /* MOV short [...], reg */ + opcodes[3] = 0; + break; + default: + /* writing a long */ + opcodes[0] = 1; + opcodes[1] = 0x89; /* MOV long [...], reg */ + opcodes[2] = 0; + break; + } + } + else + { + code_t* code1; + long immed = CompileTime_Get(value->source)->value; + value = NULL; /* not run-time */ + switch (size2) { + case 0: + /* writing an immediate byte */ + opcodes[0] = 1; + opcodes[1] = 0xC6; + opcodes[2] = 1; + opcodes[3] = (code_t) immed; + break; + case 1: + /* writing an immediate short */ + opcodes[0] = 2; + opcodes[1] = 0x66; + opcodes[2] = 0xC7; + opcodes[3] = 2; + opcodes[4] = (code_t) immed; + opcodes[5] = (code_t) (immed >> 8); + break; + default: + /* writing an immediate long */ + code1 = opcodes; /* workaround for a GCC overoptimization */ + code1[0] = 1; + code1[1] = 0xC7; + code1[2] = 4; + *(long*)(code1+3) = immed; + break; + } + } + mem_access(po, opcodes, nv_ptr, offset, rt_vindex, size2, value); + return true; +} + + +/* internal, see NEED_CC() */ +EXTERNFN condition_code_t cc_from_vsource(Source source); /* in codegen.c */ + +DEFINEFN +code_t* psyco_compute_cc(PsycoObject* po, code_t* code, reg_t reserved) +{ + int i; + vinfo_t* v; + condition_code_t cc; + reg_t rg; + for (i=0; i<2; i++) { + v = po->ccregs[i]; + if (v == NULL) + continue; + cc = cc_from_vsource(v->source); + + NEED_FREE_BYTE_REG(rg, reserved, REG_NONE); + LOAD_REG_FROM_CONDITION(rg, cc); + + v->source = RunTime_New(rg, false, true); + REG_NUMBER(po, rg) = v; + po->ccregs[i] = NULL; + } + return code; +} + + +/*****************************************************************/ + /*** Emit common instructions ***/ + + +DEFINEFN +vinfo_t* bininstrgrp(PsycoObject* po, int group, bool ovf, bool nonneg, + vinfo_t* v1, vinfo_t* v2) +{ + reg_t rg; + BEGIN_CODE + NEED_CC(); + COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ + COMMON_INSTR_FROM(group, rg, v2->source); /* XXX rg, (v2) */ + END_CODE + if (ovf && runtime_condition_f(po, CC_O)) + return NULL; /* if overflow */ + return new_rtvinfo(po, rg, false, nonneg); +} + +DEFINEFN +vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, bool unsafe) +{ + reg_t rg, dst; + extra_assert(is_runtime(rt1->source)); + BEGIN_CODE + NEED_FREE_REG(dst); + rg = getreg(rt1->source); + if (rg == REG_NONE) + { + rg = dst; + LOAD_REG_FROM(rt1->source, rg); + } + LOAD_REG_FROM_REG_PLUS_IMMED(dst, rg, value2); + END_CODE + return new_rtvinfo(po, dst, false, + unsafe && value2>=0 && is_rtnonneg(rt1->source)); +} + +#define GENERIC_SHIFT_BY(rtmacro, nonneg) \ + { \ + reg_t rg; \ + extra_assert(0 < counter && counter < LONG_BIT); \ + BEGIN_CODE \ + NEED_CC(); \ + COPY_IN_REG(v1, rg); \ + rtmacro(rg, counter); \ + END_CODE \ + return new_rtvinfo(po, rg, false, nonneg); \ + } + +DEFINEFN +vinfo_t* bininstrshift(PsycoObject* po, int group, + bool nonneg, vinfo_t* v1, vinfo_t* v2) +{ + reg_t rg; + BEGIN_CODE + if (RSOURCE_REG(v2->source) != SHIFT_COUNTER) { + NEED_REGISTER(SHIFT_COUNTER); + LOAD_REG_FROM(v2->source, SHIFT_COUNTER); + } + NEED_CC_REG(SHIFT_COUNTER); + DELAY_USE_OF(SHIFT_COUNTER); + COPY_IN_REG(v1, rg); + SHIFT_GENERICCL(rg, group); /* SHx rg, CL */ + END_CODE + return new_rtvinfo(po, rg, false, nonneg); +} + + +DEFINEFN +vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter) + GENERIC_SHIFT_BY(SHIFT_LEFT_BY, false) + +DEFINEFN +vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter) + GENERIC_SHIFT_BY(SHIFT_SIGNED_RIGHT_BY, is_nonneg(v1->source)) + +DEFINEFN +vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter) + GENERIC_SHIFT_BY(SHIFT_RIGHT_BY, true) + +DEFINEFN +vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, bool ovf) +{ + reg_t rg; + BEGIN_CODE + NEED_CC(); + NEED_FREE_REG(rg); + IMUL_IMMED_FROM_RT(v1->source, value2, rg); + END_CODE + if (ovf && runtime_condition_f(po, CC_O)) + return NULL; + return new_rtvinfo(po, rg, false, + ovf && value2>=0 && is_rtnonneg(v1->source)); +} + +DEFINEFN +vinfo_t* bininstrmul(PsycoObject* po, bool ovf, + bool nonneg, vinfo_t* v1, vinfo_t* v2) +{ + reg_t rg; + BEGIN_CODE + NEED_CC(); + COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ + IMUL_REG_FROM_RT(v2->source, rg); /* IMUL rg, (v2) */ + END_CODE + if (ovf && runtime_condition_f(po, CC_O)) + return NULL; /* if overflow */ + return new_rtvinfo(po, rg, false, nonneg); +} + +DEFINEFN +vinfo_t* unaryinstrgrp(PsycoObject* po, int group, bool ovf, + bool nonneg, vinfo_t* v1) +{ + reg_t rg; + BEGIN_CODE + NEED_CC(); + COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ + UNARY_INSTR_ON_REG(group, rg); /* XXX rg */ + END_CODE + if (ovf && runtime_condition_f(po, CC_O)) + return NULL; /* if overflow */ + return new_rtvinfo(po, rg, false, nonneg); +} + +DEFINEFN +vinfo_t* unaryinstrabs(PsycoObject* po, bool ovf, + bool nonneg, vinfo_t* v1) +{ + reg_t rg; + BEGIN_CODE + NEED_CC(); + COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ + INT_ABS(rg, v1->source); /* 'ABS' rg */ + END_CODE + if (ovf && runtime_condition_f(po, CHECK_ABS_OVERFLOW)) + return NULL; /* if overflow */ + return new_rtvinfo(po, rg, false, nonneg); +} + +static const condition_code_t direct_results[16] = { + /***** signed comparison **/ + /* Py_LT: */ CC_L, + /* Py_LE: */ CC_LE, + /* Py_EQ: */ CC_E, + /* Py_NE: */ CC_NE, + /* Py_GT: */ CC_G, + /* Py_GE: */ CC_GE, + /* (6) */ CC_ERROR, + /* (7) */ CC_ERROR, + /***** unsigned comparison **/ + /* Py_LT: */ CC_uL, + /* Py_LE: */ CC_uLE, + /* Py_EQ: */ CC_E, + /* Py_NE: */ CC_NE, + /* Py_GT: */ CC_uG, + /* Py_GE: */ CC_uGE, + /* (14) */ CC_ERROR, + /* (15) */ CC_ERROR }; + +DEFINEFN +condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, + vinfo_t* rt1, long immed2) +{ + BEGIN_CODE + NEED_CC(); + COMPARE_IMMED_FROM_RT(rt1->source, immed2); /* CMP rt1, immed2 */ + END_CODE + return direct_results[base_py_op]; +} + +DEFINEFN +condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, + vinfo_t* v1, vinfo_t* v2) +{ + BEGIN_CODE + NEED_CC(); + RTVINFO_IN_REG(v1); /* CMP v1, v2 */ + COMMON_INSTR_FROM_RT(7, getreg(v1->source), v2->source); + END_CODE + return direct_results[base_py_op]; +} + +DEFINEFN +vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, + long immed_true, long immed_false) +{ + reg_t rg; + BEGIN_CODE + NEED_FREE_REG(rg); + LOAD_REG_FROM_IMMED(rg, immed_true); + SHORT_COND_JUMP_TO(code + SIZE_OF_SHORT_CONDITIONAL_JUMP + + SIZE_OF_LOAD_REG_FROM_IMMED, cc); + LOAD_REG_FROM_IMMED(rg, immed_false); + END_CODE + return new_rtvinfo(po, rg, false, immed_true >= 0 && immed_false >= 0); +} + +DEFINEFN +vinfo_t* bfunction_result(PsycoObject* po, bool ref) +{ + return new_rtvinfo(po, REG_FUNCTIONS_RETURN, ref, false); +} + +DEFINEFN +vinfo_t* make_runtime_copy(PsycoObject* po, vinfo_t* v) +{ + reg_t rg; + if (!compute_vinfo(v, po)) return NULL; + BEGIN_CODE + NEED_FREE_REG(rg); + LOAD_REG_FROM(v->source, rg); + END_CODE + return new_rtvinfo(po, rg, false, is_nonneg(v->source)); +} + + +#if 0 +DEFINEFN -- unused -- +vinfo_t* integer_and_i(PsycoObject* po, vinfo_t* v1, long value2) + GENERIC_BINARY_INSTR_2(4, a & b, /* AND */ + value2>=0 || is_rtnonneg(v1->source)) +#define GENERIC_BINARY_INSTR_2(group, c_code, nonneg) \ +{ \ + if (!compute_vinfo(v1, po)) return NULL; \ + if (is_compiletime(v1->source)) \ + { \ + long a = CompileTime_Get(v1->source)->value; \ + long b = value2; \ + long c = (c_code); \ + return vinfo_new(CompileTime_New(c)); \ + } \ + else \ + { \ + reg_t rg; \ + BEGIN_CODE \ + NEED_CC(); \ + COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ \ + COMMON_INSTR_IMMED(group, rg, value2); /* XXX rg, value2 */ \ + END_CODE \ + return new_rtvinfo(po, rg, false, nonneg); \ + } \ +} +#endif + +#if 0 +DEFINEFN (not used) +vinfo_t* integer_seqindex(PsycoObject* po, vinfo_t* vi, vinfo_t* vn, bool ovf) +{ + NonVirtualSource vns, vis; + vns = vinfo_compute(vn, po); + if (vns == SOURCE_ERROR) return NULL; + vis = vinfo_compute(vi, po); + if (vis == SOURCE_ERROR) return NULL; + + if (!is_compiletime(vis)) + { + reg_t rg, tmprg; + BEGIN_CODE + NEED_CC_SRC(vis); + NEED_FREE_REG(rg); + LOAD_REG_FROM_RT(vis, rg); + DELAY_USE_OF(rg); + NEED_FREE_REG(tmprg); + + /* Increase 'rg' by 'vns' unless it is already in the range(0, vns). */ + /* CMP i, n */ + vns = vn->source; /* reload, could have been moved by NEED_FREE_REG */ + COMMON_INSTR_FROM(7, rg, vns); + /* SBB t, t */ + COMMON_INSTR_FROM_RT(3, tmprg, RunTime_New(tmprg, false...)); + /* AND t, n */ + COMMON_INSTR_FROM(4, tmprg, vns); + /* SUB i, t */ + COMMON_INSTR_FROM_RT(5, rg, RunTime_New(tmprg, false...)); + /* ADD i, n */ + COMMON_INSTR_FROM(0, rg, vns); + END_CODE + + if (ovf && runtime_condition_f(po, CC_NB)) /* if out of range */ + return NULL; + return new_rtvinfo(po, rg, false...); + } + else + { + long index = CompileTime_Get(vis)->value; + long reqlength; + if (index >= 0) + reqlength = index; /* index is known, length must be greater than it */ + else + reqlength = ~index; /* idem for negative index */ + if (ovf) + { + /* test for out of range index -- more precisely, test that the + length is not large enough for the known index */ + condition_code_t cc = integer_cmp_i(po, vn, reqlength, Py_LE); + if (cc == CC_ERROR || runtime_condition_f(po, cc)) + return NULL; + } + if (index >= 0) + { + vinfo_incref(vi); + return vi; + } + else + return integer_add_i(po, vn, index...); + } +} +#endif /* 0 */ diff --git a/nodeboxgl/ext/psyco/src/c/i386/iencoding.h b/nodeboxgl/ext/psyco/src/c/i386/iencoding.h new file mode 100644 index 0000000..e3e88ac --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/iencoding.h @@ -0,0 +1,1120 @@ + /***************************************************************/ +/*** Processor-specific code-producing macros ***/ + /***************************************************************/ + +#ifndef _IENCODING_H +#define _IENCODING_H + + +#include "../psyco.h" +#define MACHINE_CODE_FORMAT "i386" +#define HAVE_FP_FN_CALLS 1 + + + /* set to 0 to emit code that runs on 386 and 486 */ +#ifndef PENTIUM_INSNS +# define PENTIUM_INSNS 1 +#endif + + /* Define to 1 to always write the most compact encoding of instructions. + (a quite minor overhead). Set to 0 to disable. No effect on real + optimizations. */ +#ifndef COMPACT_ENCODING +#ifdef __APPLE__ +/* COMPACT_ENCODING not yet supported on MacOS X */ +# define COMPACT_ENCODING 0 +#else +# define COMPACT_ENCODING 1 +#endif +#endif + +/* Define to 0 to use EBP as any other register, or to 1 to reserve it */ +#ifndef EBP_IS_RESERVED +# define EBP_IS_RESERVED 0 +#endif + + +typedef enum { + REG_386_EAX = 0, + REG_386_ECX = 1, + REG_386_EDX = 2, + REG_386_EBX = 3, + REG_386_ESP = 4, + REG_386_EBP = 5, + REG_386_ESI = 6, + REG_386_EDI = 7, +#define REG_TOTAL 8 + + REG_NONE = -1} reg_t; + +#define REG_FUNCTIONS_RETURN REG_386_EAX +#define REG_ANY_CALLER_SAVED REG_386_EAX /* just any "trash" register */ +#define REG_ANY_CALLEE_SAVED REG_386_EBX /* saved by C functions */ + +typedef enum { + CC_O = 0, /* overflow */ + CC_NO = 1, + CC_B = 2, /* below (unsigned) */ + CC_NB = 3, + CC_E = 4, /* equal */ + CC_NE = 5, + CC_BE = 6, /* below or equal (unsigned) */ + CC_NBE = 7, + CC_S = 8, /* sign (i.e. negative) */ + CC_NS = 9, + CC_L = 12, /* lower than */ + CC_NL = 13, + CC_LE = 14, /* lower or equal */ + CC_NLE = 15, +#define CC_TOTAL 16 +/* synonyms */ + CC_NGE = CC_L, /* not greater or equal */ + CC_GE = CC_NL, /* greater or equal */ + CC_NG = CC_LE, /* not greater than */ + CC_G = CC_NLE, /* greater than */ + CC_uL = CC_B, /* unsigned test */ + CC_uNL = CC_NB, /* unsigned test */ + CC_uLE = CC_BE, /* unsigned test */ + CC_uNLE = CC_NBE, /* unsigned test */ + CC_uNGE = CC_uL, /* unsigned test */ + CC_uGE = CC_uNL, /* unsigned test */ + CC_uNG = CC_uLE, /* unsigned test */ + CC_uG = CC_uNLE, /* unsigned test */ + CC_ALWAYS_FALSE = 16, /* pseudo condition codes for known outcomes */ + CC_ALWAYS_TRUE = 17, + CC_ERROR = -1 } condition_code_t; + +#define INVERT_CC(cc) ((condition_code_t)((int)(cc) ^ 1)) +#define HAVE_CCREG 2 +#define INDEX_CC(cc) ((int)(cc) & 1) +#define HAS_CCREG(po) ((po)->ccregs[0] != NULL || (po)->ccregs[1] != NULL) + + +/* the registers we want Psyco to use in compiled code, + as a circular linked list (see iprocessor.c) */ +EXTERNVAR reg_t RegistersLoop[REG_TOTAL]; + +/* the first register in RegistersLoop that Psyco will use. + The best choice is probably the first callee-saved register */ +#define REG_LOOP_START REG_386_EBX + +/* returns the next register that should be used */ +#define next_free_reg(po) \ + ((po)->last_used_reg = RegistersLoop[(int)((po)->last_used_reg)]) + +/* processor-depend part of PsycoObject */ +#define PROCESSOR_PSYCOOBJECT_FIELDS \ + int stack_depth; /* the size of data currently pushed in the stack */ \ + vinfo_t* reg_array[REG_TOTAL]; /* the 'vinfo_t' currently stored in regs */ \ + vinfo_t* ccregs[2]; /* processor condition codes (aka flags) */ \ + /* ccregs[0] is for "positive" conditions */ \ + /* and ccregs[1] for "negative" ones */ \ + reg_t last_used_reg; /* the most recently used register */ +#define INIT_PROCESSOR_PSYCOOBJECT(po) \ + (po->last_used_reg = REG_LOOP_START) + +#define PROCESSOR_FROZENOBJECT_FIELDS \ + short fz_last_used_reg; +#define SAVE_PROCESSOR_FROZENOBJECT(fpo, po) \ + (fpo->fz_last_used_reg = (int) po->last_used_reg) +#define RESTORE_PROCESSOR_FROZENOBJECT(fpo, po) \ + (po->last_used_reg = (reg_t) fpo->fz_last_used_reg) + +#define INIT_CODE_EMISSION(code) do { /* nothing */ } while (0) +#define POST_CODEBUFFER_SIZE 0 +#define insn_code_label(code) ((code_t*)(code)) + +#define CHECK_STACK_SPACE() do { /* nothing */ } while (0) + + +/*****************************************************************/ + /*** Production of code (common instruction encodings) ***/ + +/* Most of the following macros implicitely use and update the + * local variable 'code'. Some also use 'po'. No macro outside the + * present header file must implicitely use or modify 'code'. + */ + + +/* Written as a large set of macro. */ + +#define RSOURCE_REG(src) getreg(src) +#define RSOURCE_REG_IS_NONE(src) is_reg_none(src) +#define RSOURCE_STACK(src) getstack(src) + +#define RUNTIME_STACK_MAX RunTime_StackMax +#define RUNTIME_STACK_NONE RunTime_StackNone +#define RUNTIME_REG(vi) RSOURCE_REG ((vi)->source) +#define RUNTIME_REG_IS_NONE(vi) RSOURCE_REG_IS_NONE ((vi)->source) +#define RUNTIME_STACK(vi) RSOURCE_STACK ((vi)->source) + +#define SET_RUNTIME_REG_TO(vi, rg) ((vi)->source = \ + set_rtreg_to((vi)->source, rg)) +#define SET_RUNTIME_REG_TO_NONE(vi) ((vi)->source = \ + set_rtreg_to_none((vi)->source)) +#define SET_RUNTIME_STACK_TO(vi, s) ((vi)->source = \ + set_rtstack_to((vi)->source, (s))) +#define SET_RUNTIME_STACK_TO_NONE(vi) ((vi)->source = \ + set_rtstack_to_none((vi)->source)) + +#define KSOURCE_SOURCE(src) CompileTime_Get(src) +#define KNOWN_SOURCE(vi) KSOURCE_SOURCE((vi)->source) + +#define NEXT_FREE_REG() next_free_reg(po) +#define REG_NUMBER(po, rg) ((po)->reg_array[(int)(rg)]) + +/* release a run-time vinfo_t */ +#define RTVINFO_RELEASE(rtsource) do { \ + if (!RSOURCE_REG_IS_NONE(rtsource)) \ + REG_NUMBER(po, RSOURCE_REG(rtsource)) = NULL; \ +} while (0) + +/* move a run-time vinfo_t */ +#define RTVINFO_MOVE(rtsource, vtarget) do { \ + if (!RSOURCE_REG_IS_NONE(rtsource)) \ + REG_NUMBER(po, RSOURCE_REG(rtsource)) = (vtarget); \ +} while (0) + +/* for PsycoObject_Duplicate() */ +#define DUPLICATE_PROCESSOR(result, po) do { \ + int i; \ + for (i=0; itmp; \ + for (i=0; i<2; i++) \ + if (po->ccregs[i] != NULL) \ + result->ccregs[i] = po->ccregs[i]->tmp; \ + \ + result->stack_depth = po->stack_depth; \ + result->last_used_reg = po->last_used_reg; \ +} while (0) + +#define RTVINFO_CHECK(po, vsource, found) do { \ + RunTimeSource _src = (vsource)->source; \ + if (!RSOURCE_REG_IS_NONE(_src)) \ + { \ + extra_assert(REG_NUMBER(po, RSOURCE_REG(_src)) == (vsource)); \ + found[(int) RSOURCE_REG(_src)] = 1; \ + } \ +} while (0) +#define RTVINFO_CHECKED(po, found) do { \ + int i; \ + for (i=0; istack_depth - (stack_pos); \ + extra_assert(0 < (stack_pos) && (stack_pos) <= RUNTIME_STACK_MAX); \ + extra_assert(0 <= _s_p); \ + code[2] = 0x24; \ + if (COMPACT_ENCODING && _s_p == 0) \ + { \ + code[1] = 0x04 | (middle); \ + code += 3; \ + } \ + else if (COMPACT_ENCODING && _s_p < 128) \ + { \ + code[1] = 0x44 | (middle); \ + code[3] = _s_p; \ + code += 4; \ + } \ + else \ + { \ + code[1] = 0x84 | (middle); \ + *(long*)(code+3) = _s_p; \ + code += 7; \ + } \ +} while (0) +#endif + +/* Emit instruction 'opcode' having a mod/rm as its second byte. + Insert 'middle' in the mod/rm. Let the mod/rm point to the given stack_pos. */ +#define INSTR_EBP_BASE(opcode, middle, stack_pos) do { \ + code[0] = (opcode); \ + MODRM_EBP_BASE(middle, stack_pos); \ +} while (0) + + +/* note: the following macro starts writing at code+1 */ +#define MODRM_FROM_RT(source, middle) do { \ + if (RSOURCE_REG_IS_NONE(source)) \ + MODRM_EBP_BASE(middle, RSOURCE_STACK(source)); \ + else { /* register source */ \ + code[1] = 0xC0 | (middle) | RSOURCE_REG(source); \ + code += 2; \ + } \ +} while (0) + +/* Same as INSTR_EBP_BASE but reading from the 'source' of a run-time vinfo_t */ +#define INSTR_MODRM_FROM_RT(source, opcode, middle) do { \ + code[0] = (opcode); \ + MODRM_FROM_RT(source, middle); \ +} while (0) + + +/* The "common instructions" groups: there are 8 arithmetic instructions + whose encodings are identical. Here they are, with their 'group' value: + ADD (group 0) + OR (group 1) + ADC (group 2) + SBB (group 3) + AND (group 4) + SUB (group 5) + XOR (group 6) + CMP (group 7) */ + +/* The following macro encodes "INSTR register, immediate" */ +#define COMMON_INSTR_IMMED(group, rg, value) do { \ + long _v; \ + code[1] = 0xC0 | (group<<3) | (rg); \ + _v = value; \ + if (COMPACT_ENCODING && -128 <= _v && _v < 128) { \ + code[2] = (code_t) _v; \ + code[0] = 0x83; \ + code += 3; \ + } \ + else { \ + *(long*)(code+2) = _v; \ + code[0] = 0x81; \ + code += 6; \ + } \ +} while (0) + +/* Encodes "INSTR register, source" for a run-time or compile-time vinfo_t */ +#define COMMON_INSTR_FROM(group, rg, source) do { \ + if (((source) & TimeMask) == RunTime) \ + COMMON_INSTR_FROM_RT(group, rg, source); \ + else \ + COMMON_INSTR_IMMED(group, rg, KSOURCE_SOURCE(source)->value); \ +} while(0) + +/* Encodes "INSTR register, source" for a run-time vinfo_t */ +#define COMMON_INSTR_FROM_RT(group, rg, source) do { \ + code[0] = group*8 + 3; \ + MODRM_FROM_RT(source, (rg)<<3); \ +} while(0) + +/* Encodes "INSTR reg" for the following instructions: + NOT (group 2) + NEG (group 3) + IDIV (group 7) */ +#define UNARY_INSTR_ON_REG(group, rg) do { \ + code[0] = 0xF7; \ + code[1] = 0xC0 | (group<<3) | (rg); \ + code += 2; \ +} while (0) + +/* Encodes "INSTR source" for the same instructions as above */ +#define UNARY_INSTR_FROM_RT(group, source) do { \ + INSTR_MODRM_FROM_RT(0xF7, source, (group)<<3); \ +} while (0) + +/* Encodes "INC rg" and "DEC rg" */ +#define INCREASE_REG(rg) (*code++ = 0x40 | (rg)) +#define DECREASE_REG(rg) (*code++ = 0x48 | (rg)) + +/* Encodes taking absolute value of the register 'rg' knowing that + 'sourcecopy' is a (run-time) copy of 'rg' */ +#define INT_ABS(rg, sourcecopy) do { \ + /* as you can check the following takes the absolute value of (say) EAX: \ + ADD EAX, EAX \ + SBB EAX, sourcecopy \ + SBB EDX, EDX \ + XOR EAX, EDX \ + (note: although the idea is not original, the above code might be \ + original as it has been found by an exhaustive search on *all* \ + short codes :-) \ + */ \ + reg_t _rg2; \ + code[0] = 0x01; \ + code[1] = 0xC0 | ((rg)<<3) | (rg); /* ADD rg, rg */ \ + code += 2; \ + COMMON_INSTR_FROM_RT(3, rg, sourcecopy); /* SBB rg, sourcecopy */ \ + DELAY_USE_OF(rg); \ + NEED_FREE_REG(_rg2); \ + code[0] = 0x19; \ + code[1] = 0xC0 | (_rg2<<3) | _rg2; /* SBB _rg2, _rg2 */ \ + code[2] = 0x31; \ + code[3] = 0xC0 | (_rg2<<3) | (rg); /* XOR rg, _rg2 */ \ + code += 4; \ +} while (0) +#define CHECK_ABS_OVERFLOW CC_S + +/* Encodes a check (zero/non-zero) on the given 'source' */ +#define CHECK_NONZERO_FROM_RT(source, rcc) do { \ + NEED_CC_SRC(source); \ + if (RSOURCE_REG_IS_NONE(source)) \ + { \ + INSTR_MODRM_FROM_RT(source, 0x83, 7<<3); /* CMP (source), imm8 */ \ + *code++ = 0; \ + } \ + else \ + CHECK_NONZERO_REG(RSOURCE_REG(source)); \ + rcc = CC_NE; /* a.k.a. NZ flag */ \ +} while (0) +#define CHECK_NONZERO_REG(rg) ( \ + code[0] = 0x85, /* TEST reg, reg */ \ + code[1] = 0xC0 | ((rg)*9), \ + code += 2) + +#define COMPARE_IMMED_FROM_RT(source, immed) do { \ + long _value = (immed); \ + if (COMPACT_ENCODING && -128 <= _value && _value < 128) \ + /*if (_value == 0 && !RSOURCE_REG_IS_NONE(source)) \ + CHECK_NONZERO_REG(RSOURCE_REG(source)); \ + else*/ { \ + INSTR_MODRM_FROM_RT(source, 0x83, 7<<3); /* CMP (source), imm8 */ \ + *code++ = (code_t) _value; \ + } \ + else { \ + INSTR_MODRM_FROM_RT(source, 0x81, 7<<3); /* CMP (source), imm32 */ \ + *(long*)code = _value; \ + code += 4; \ + } \ +} while (0) + +/* Signed integer multiplications */ +#define IMUL_REG_FROM_RT(source, rg) do { \ + *code++ = 0x0F; /* IMUL rg, source */ \ + INSTR_MODRM_FROM_RT(source, 0xAF, (rg)<<3); \ +} while (0) + +#define IMUL_IMMED_FROM_RT(source, immed, dstrg) do { \ + long _value = (immed); \ + code_t opcode = (COMPACT_ENCODING && -128 <= _value && _value < 128) \ + ? 0x6B : 0x69; /* IMUL dstrg, source, immed */ \ + INSTR_MODRM_FROM_RT(source, opcode, (dstrg)<<3); \ + if (opcode == 0x69) { \ + *(long*)code = _value; \ + code += 4; \ + } \ + else \ + *code++ = (code_t) _value; \ +} while (0) + +/* Shitfs. The counters must never be >=32. */ +#define SHIFT_GENERIC1(rg, cnt, middle) do { \ + code[1] = 0xC0 | ((middle)<<3) | (rg); \ + if (COMPACT_ENCODING && cnt==1) { \ + code[0] = 0xD1; \ + code += 2; \ + } \ + else { \ + code[0] = 0xC1; \ + code[2] = (cnt); \ + code += 3; \ + } \ +} while (0) +#define SHIFT_COUNTER REG_386_ECX /* must be in range(0,32) */ +#define SHIFT_GENERICCL(rg, middle) do { \ + code[0] = 0xD3; \ + code[1] = 0xC0 | ((middle)<<3) | (rg); \ + code += 2; \ +} while (0) + +#define SHIFT_LEFT_BY(rg, cnt) SHIFT_GENERIC1(rg, cnt, 4) +#define SHIFT_LEFT_CL(rg) SHIFT_GENERICCL(rg, 4) +#define SHIFT_RIGHT_BY(rg, cnt) SHIFT_GENERIC1(rg, cnt, 5) +#define SHIFT_RIGHT_CL(rg) SHIFT_GENERICCL(rg, 5) +#define SHIFT_SIGNED_RIGHT_BY(rg, cnt) SHIFT_GENERIC1(rg, cnt, 7) +#define SHIFT_SIGNED_RIGHT_CL(rg) SHIFT_GENERICCL(rg, 7) + + +EXTERNFN vinfo_t* bininstrgrp(PsycoObject* po, int group, bool ovf, + bool nonneg, vinfo_t* v1, vinfo_t* v2); +EXTERNFN vinfo_t* bininstrmul(PsycoObject* po, bool ovf, + bool nonneg, vinfo_t* v1, vinfo_t* v2); +EXTERNFN vinfo_t* bininstrshift(PsycoObject* po, int group, + bool nonneg, vinfo_t* v1, vinfo_t* v2); +EXTERNFN condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, + vinfo_t* v1, vinfo_t* v2); +EXTERNFN vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, + long immed_true, long immed_false); +EXTERNFN vinfo_t* unaryinstrgrp(PsycoObject* po, int group, bool ovf, + bool nonneg, vinfo_t* v1); +EXTERNFN vinfo_t* unaryinstrabs(PsycoObject* po, bool ovf, + bool nonneg, vinfo_t* v1); + +#define BINARY_INSTR_ADD(ovf, nonneg) bininstrgrp(po, 0, ovf, nonneg, v1, v2) +#define BINARY_INSTR_OR( ovf, nonneg) bininstrgrp(po, 1, ovf, nonneg, v1, v2) +#define BINARY_INSTR_AND(ovf, nonneg) bininstrgrp(po, 4, ovf, nonneg, v1, v2) +#define BINARY_INSTR_SUB(ovf, nonneg) bininstrgrp(po, 5, ovf, nonneg, v1, v2) +#define BINARY_INSTR_XOR(ovf, nonneg) bininstrgrp(po, 6, ovf, nonneg, v1, v2) +#define BINARY_INSTR_MUL(ovf, nonneg) bininstrmul(po, ovf, nonneg, v1, v2) +#define BINARY_INSTR_LSHIFT( nonneg) bininstrshift(po, 4, nonneg, v1, v2) +#define BINARY_INSTR_RSHIFT( nonneg) bininstrshift(po, 7, nonneg, v1, v2) +#define BINARY_INSTR_CMP(base_py_op) bininstrcmp(po, base_py_op, v1, v2) +#define BINARY_INSTR_COND(cc, i1, i2) bininstrcond(po, cc, i1, i2) +#define UNARY_INSTR_INV(ovf, nonneg) unaryinstrgrp(po, 2, ovf, nonneg, v1) +#define UNARY_INSTR_NEG(ovf, nonneg) unaryinstrgrp(po, 3, ovf, nonneg, v1) +#define UNARY_INSTR_ABS(ovf, nonneg) unaryinstrabs(po, ovf, nonneg, v1) + +EXTERNFN vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, + bool unsafe); +EXTERNFN vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, + bool ovf); +EXTERNFN vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter); +EXTERNFN vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter); +EXTERNFN vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter); +EXTERNFN condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, + vinfo_t* rt1, long immed2); +EXTERNFN vinfo_t* bfunction_result(PsycoObject* po, bool ref); + +/*****************************************************************/ + +/* PUSH the value described in the 'source' of a run-time vinfo_t */ +#define PUSH_FROM_RT(source) do { \ + if (RSOURCE_REG_IS_NONE(source)) \ + PUSH_EBP_BASE(RSOURCE_STACK(source)); \ + else \ + PUSH_REG(RSOURCE_REG(source)); \ +} while (0) + +/* insert a PUSH_FROM_RT at point 'insert_at' in the given 'code1' */ +/* EXTERNFN code_t* insert_push_from_rt(PsycoObject* po, code_t* code1, */ +/* long source, code_t* insert_at); */ + +/* PUSH a run-time or compile-time vinfo_t's value */ +#define PUSH_FROM(source) do { \ + if (((source) & TimeMask) == RunTime) \ + PUSH_FROM_RT(source); \ + else \ + PUSH_IMMED(KSOURCE_SOURCE(source)->value); \ +} while (0) + + +/*****************************************************************/ + /*** Some basic management instructions... ***/ + +/* these two macros do not actually emit the code. + They just give you the one-byte instruction encoding. */ +#define PUSH_REG_INSTR(reg) (0x50 | (reg)) +#define POP_REG_INSTR(reg) (0x58 | (reg)) + +#define PUSH_REG(reg) (*code++ = PUSH_REG_INSTR(reg)) +#define POP_REG(reg) (*code++ = POP_REG_INSTR(reg)) + +#define PUSH_CC_FLAGS_INSTR 0x9C /* PUSHF */ +#define POP_CC_FLAGS_INSTR 0x9D /* POPF */ + +#define PUSH_CC_FLAGS() (*code++ = PUSH_CC_FLAGS_INSTR) +#define POP_CC_FLAGS() (*code++ = POP_CC_FLAGS_INSTR) + +#define LOAD_REG_FROM_REG(dst, src) ( \ + code[0] = 0x89, /* MOV dst, src */ \ + code[1] = 0xC0 | ((src) << 3) | (dst), \ + code += 2 \ +) + +#define XCHG_REGS(rg1, rg2) do { \ + if (COMPACT_ENCODING && ((rg1) == REG_386_EAX)) \ + *code++ = 0x90 | (rg2); \ + else if (COMPACT_ENCODING && ((rg2) == REG_386_EAX)) \ + *code++ = 0x90 | (rg1); \ + else { \ + code[0] = 0x87; \ + code[1] = 0xC0 | ((rg2)<<3) | (rg1); \ + code += 2; \ + } \ +} while (0) + +#define LOAD_REG_FROM_IMMED(dst, immed) ( \ + code[0] = 0xB8 | (dst), /* MOV dst, immed */ \ + *(long*)(code+1) = (immed), \ + code += 5 \ +) +#define SIZE_OF_LOAD_REG_FROM_IMMED 5 + +/* loads 0 in a register. The macro name reminds you that this + clobbers po->ccreg (use NEED_CC() to save it first). */ +/* #define CLEAR_REG_CLOBBER_CC(rg) ( \ */ +/* code[0] = 0x33, * XOR rg, rg * \ */ +/* code[1] = 0xC0 | ((rg)<<3) | (rg), \ */ +/* code += 2 \ */ +/* ) */ + +#define LOAD_REG_FROM_EBP_BASE(dst, stack_pos) \ + INSTR_EBP_BASE(0x8B, (dst)<<3, stack_pos) /* MOV dst, [EBP-stack_pos] */ + +#define SAVE_REG_TO_EBP_BASE(src, stack_pos) \ + INSTR_EBP_BASE(0x89, (src)<<3, stack_pos) /* MOV [EBP-stack_pos], src */ + +#define XCHG_REG_AND_EBP_BASE(src, stack_pos) \ + INSTR_EBP_BASE(0x87, (src)<<3, stack_pos) /* XCHG src, [EBP-stack_pos] */ + +#define SAVE_IMMED_TO_EBP_BASE(immed, stack_pos) do { \ + INSTR_EBP_BASE(0xC7, 0<<3, stack_pos); /* MOV [EBP-stack_pos], immed */\ + *(long*)code = (immed); \ + code += 4; \ +} while (0) + +#define SAVE_IMM8_TO_EBP_BASE(imm8, stack_pos) do { \ + INSTR_EBP_BASE(0xC6, 0<<3, stack_pos); /* MOV byte [EBP-stack_pos], imm8 */\ + *code++ = (imm8); \ +} while (0) + +#define ABOUT_TO_CALL_SUBFUNCTION(finfo) \ + SAVE_IMMED_TO_EBP_BASE((long)(finfo), INITIAL_STACK_DEPTH) +#define RETURNED_FROM_SUBFUNCTION() \ + SAVE_IMM8_TO_EBP_BASE(-1, INITIAL_STACK_DEPTH) + +#define LOAD_REG_FROM_RT(source, dst) \ + INSTR_MODRM_FROM_RT(source, 0x8B, (dst)<<3) /* MOV dst, (...) */ + +#define SAVE_REG_TO_RT(source, src) \ + INSTR_MODRM_FROM_RT(source, 0x89, (src)<<3) /* MOV (...), src */ + +#define PUSH_EBP_BASE(ofs) \ + INSTR_EBP_BASE(0xFF, 0x30, ofs) /* PUSH [EBP-ofs] */ + +#define POP_EBP_BASE(ofs) \ + INSTR_EBP_BASE(0x8F, 0x00, ofs) /* POP [EBP-ofs] */ + +#define PUSH_IMMED(immed) do { \ + if (COMPACT_ENCODING && -128 <= (immed) && (immed) < 128) { \ + code[0] = 0x6A; /* PUSH imm8 */ \ + code[1] = (code_t) (immed); \ + code += 2; \ + } \ + else { \ + code[0] = 0x68; /* PUSH imm32 */ \ + *(long*)(code+1) = (immed); \ + code += 5; \ + } \ +} while (0) + +/* call a function written in C. Use the macros CALL_SET_ARG_xxx() for + each argument in reverse order, then use CALL_C_FUNCTION(). */ +/* Note: the update of po->stack_depth saves one "ADD ESP, 4*nb_args" + at the end of the call. If the stack is to be kept as compact as + possible we might as well write the instruction. We have to + update po->stack_depth at each CALL_SET_ARG_xxx (instead of just + in CALL_C_FUNCTION) because run-time arguments after the first one + would be fetched at the wrong place otherwise. */ +#define CALL_SET_ARG_IMMED(immed, arg_index, nb_args) do { \ + PUSH_IMMED(immed); \ + po->stack_depth += 4; \ +} while (0) +#define CALL_SET_ARG_FROM_RT(source, arg_index, nb_args) do { \ + PUSH_FROM_RT(source); \ + po->stack_depth += 4; \ +} while (0) +#define CALL_SET_ARG_FROM(source, arg_index, nb_args) do { \ + PUSH_FROM(source); \ + po->stack_depth += 4; \ +} while (0) +#define CALL_SET_ARG_FROM_ADDR_CLOBBER_REG REG_ANY_CALLER_SAVED +#define CALL_SET_ARG_FROM_ADDR(source, arg_index, nb_args) do { \ + LOAD_ADDRESS_FROM_RT(source, CALL_SET_ARG_FROM_ADDR_CLOBBER_REG); \ + CALL_SET_ARG_FROM_RT(RunTime_New(CALL_SET_ARG_FROM_ADDR_CLOBBER_REG, \ + false, false), arg_index, nb_args); \ +} while (0) +#define CALL_C_FUNCTION(target, nb_args) do { \ + code[0] = 0xE8; /* CALL */ \ + code += 5; \ + *(long*)(code-4) = (code_t*)(target) - code; \ +} while (0) +#define CALL_C_FUNCTION_FROM_RT(source, nb_args) \ + INSTR_MODRM_FROM_RT(source, 0xFF, 2<<3) /* CALL [source] */ +#define CALL_C_FUNCTION_FROM(source, nb_args) do { \ + if (((source) & CompileTime) != 0) \ + CALL_C_FUNCTION(KSOURCE_SOURCE(source)->value, nb_args); \ + else \ + CALL_C_FUNCTION_FROM_RT(source, nb_args); \ +} while (0) +/* optimization of a CALL followed by a JMP */ +#define CALL_C_FUNCTION_AND_JUMP(target, nb_args, jmptarget) do { \ + PUSH_IMMED((long)(jmptarget)); \ + JUMP_TO((code_t*)(target)); \ +} while (0) + +#ifdef __APPLE__ +/* Stack alignment for MacOS X IA-32 ABI */ +#define CALL_STACK_ALIGN_DELTA(nbargs, delta) do { \ + int sp = po->stack_depth-INITIAL_STACK_DEPTH+(nbargs)*4; \ + delta = ((sp+15)&~15)-sp; \ + po->stack_depth += delta; \ + STACK_CORRECTION(delta); \ +} while (0) + +#define CALL_STACK_ALIGN(nbargs) do { \ + int delta; \ + CALL_STACK_ALIGN_DELTA(nbargs, delta); \ +} while (0) + +#define CALL_STACK_ALIGN_RESTORE(delta) do { \ + po->stack_depth -= delta; \ + STACK_CORRECTION(-delta); \ +} while (0) +#else +/* Dummy stack alignment for non-MacOS X */ +#define CALL_STACK_ALIGN_DELTA(nbargs, delta) +#define CALL_STACK_ALIGN(nbargs) +#define CALL_STACK_ALIGN_RESTORE(delta) +#endif + +/* load the 'dst' register with the run-time address of 'source' + which must be in the stack */ +#define LOAD_ADDRESS_FROM_RT(source, dst) do { \ + extra_assert(RSOURCE_STACK(source) != RUNTIME_STACK_NONE); \ + INSTR_MODRM_FROM_RT(source, 0x8D, ((dst)<<3)); /* LEA dst, [source] */ \ +} while (0) + +#define LOAD_REG_FROM_REG_PLUS_REG(dst, rg1, rg2) do { \ + code[0] = 0x8D; \ + code[1] = 0x04 | ((dst)<<3); /* LEA dst, [rg1+rg2] */ \ + code[2] = ((rg1)<<3) | (rg2); \ + if (!EBP_IS_RESERVED && (rg2) == REG_386_EBP) \ + { \ + if ((rg1) != REG_386_EBP) \ + code[2] = ((rg2)<<3) | (rg1); \ + else \ + { \ + code[1] |= 0x40; \ + code[3] = 0; \ + code++; \ + } \ + } \ + code += 3; \ +} while (0) + +#define LOAD_REG_FROM_REG_PLUS_IMMED(dst, rg1, immed) do { \ + long _value = (immed); \ + code[0] = 0x8D; /* LEA dst,[rg1+immed] */ \ + if (COMPACT_ENCODING && -128 <= _value && _value < 128) { \ + code[1] = 0x40 | (dst)<<3 | (rg1); \ + code[2] = (code_t) _value; \ + code += 3; \ + } \ + else { \ + code[1] = 0x80 | (dst)<<3 | (rg1); \ + *(long*)(code+2) = _value; \ + code += 6; \ + } \ +} while (0) + + +/* saving and restoring the registers currently in use (see also + SAVE_REGS_FN_CALLS) */ +#define TEMP_SAVE_REGS_FN_CALLS do { \ + if (COMPACT_ENCODING) { \ + if (REG_NUMBER(po, REG_386_EAX) != NULL) PUSH_REG(REG_386_EAX); \ + if (REG_NUMBER(po, REG_386_ECX) != NULL) PUSH_REG(REG_386_ECX); \ + if (REG_NUMBER(po, REG_386_EDX) != NULL) PUSH_REG(REG_386_EDX); \ + if (HAS_CCREG(po)) PUSH_CC_FLAGS(); \ + } \ + else { \ + CODE_FOUR_BYTES(code, \ + PUSH_REG_INSTR(REG_386_EAX), \ + PUSH_REG_INSTR(REG_386_ECX), \ + PUSH_REG_INSTR(REG_386_EDX), \ + PUSH_CC_FLAGS_INSTR); \ + code += 4; \ + } \ +} while (0) + +#define TEMP_RESTORE_REGS_FN_CALLS do { \ + if (COMPACT_ENCODING) { \ + if (HAS_CCREG(po)) POP_CC_FLAGS(); \ + if (REG_NUMBER(po, REG_386_EDX) != NULL) POP_REG(REG_386_EDX); \ + if (REG_NUMBER(po, REG_386_ECX) != NULL) POP_REG(REG_386_ECX); \ + if (REG_NUMBER(po, REG_386_EAX) != NULL) POP_REG(REG_386_EAX); \ + } \ + else { \ + CODE_FOUR_BYTES(code, \ + POP_CC_FLAGS_INSTR, \ + POP_REG_INSTR(REG_386_EDX), \ + POP_REG_INSTR(REG_386_ECX), \ + POP_REG_INSTR(REG_386_EAX)); \ + code += 4; \ + } \ +} while (0) + +/* same as above, but concludes with a JMP *EAX */ +#define TEMP_RESTORE_REGS_FN_CALLS_AND_JUMP do { \ + if (COMPACT_ENCODING) { \ + if (HAS_CCREG(po)) POP_CC_FLAGS(); \ + if (REG_NUMBER(po, REG_386_EDX) != NULL) POP_REG(REG_386_EDX); \ + if (REG_NUMBER(po, REG_386_ECX) != NULL) POP_REG(REG_386_ECX); \ + } \ + else { \ + CODE_FOUR_BYTES(code, \ + POP_CC_FLAGS_INSTR, \ + POP_REG_INSTR(REG_386_EDX), \ + POP_REG_INSTR(REG_386_ECX), \ + 0 /* dummy */); \ + code += 3; \ + } \ + if (!COMPACT_ENCODING || REG_NUMBER(po, REG_386_EAX) != NULL) { \ + /* must restore EAX, but it contains the jump target... */ \ + CODE_FOUR_BYTES(code, \ + 0x87, \ + 0x04, \ + 0x24, /* XCHG EAX, [ESP] */ \ + 0xC3); /* RET */ \ + code += 4; \ + } \ + else { \ + code[0] = 0xFF; \ + code[1] = 0xE0; /* JMP *EAX */ \ + code += 2; \ + } \ +} while (0) + + +/* put an immediate value in memory */ +#define SET_REG_ADDR_TO_IMMED(rg, immed) do { \ + code[0] = 0xC7; /* MOV [reg], immed */ \ + if (EBP_IS_RESERVED || (rg) != REG_386_EBP) \ + { \ + extra_assert((rg) != REG_386_EBP); \ + code[1] = (rg); \ + } \ + else \ + { \ + *++code = 0x45; \ + code[1] = 0; \ + } \ + *(long*)(code+2) = (immed); \ + code += 6; \ +} while (0) + +/* put an immediate value in memory */ +#define SET_IMMED_ADDR_TO_IMMED(addr, immed) do { \ + code[0] = 0xC7; /* MOV [addr], immed */ \ + code[1] = 0x05; \ + *(long*)(code+2) = (addr); \ + *(long*)(code+6) = (immed); \ + code += 10; \ +} while (0) + +#define FUNCTION_RET(popbytes) do { \ + /* emit a 'RET xxx' instruction that pops and jumps to the address \ + which is now at the top of the stack, and finishes to clean the \ + stack by removing everything left past the return address \ + (typically the arguments, although it could be anything). */ \ + int _b = popbytes; \ + extra_assert(0 < _b); \ + if (_b >= 0x8000) \ + { \ + /* uncommon case: too many stuff left in the stack for the 16-bit \ + immediate we can encoding in RET */ \ + POP_REG(REG_386_EDX); \ + STACK_CORRECTION(-_b); \ + PUSH_REG(REG_386_EDX); \ + _b = 0; \ + } \ + code[0] = 0xC2; /* RET imm16 */ \ + *(short*)(code+1) = _b; \ + code += 3; \ +} while (0) + + +/*****************************************************************/ + /*** vinfo_t saving ***/ + +/* save 'vi', which is currently in register 'rg'. */ +#define SAVE_REG_VINFO(vi, rg) do { \ + PUSH_REG(rg); \ + po->stack_depth += 4; \ + SET_RUNTIME_STACK_TO(vi, po->stack_depth); \ +} while (0) + +/* * save 'vi' if needed. * */ +/* #define SAVE_VINFO(vi) do { */ +/* if (((vi)->source & (TIME_MASK | RUNTIME_STACK_MASK)) == */ +/* (RUN_TIME | RUNTIME_STACK_NONE)) */ +/* SAVE_REG_VINFO(vi, RUNTIME_REG(vi), 0); */ +/* } while (0) */ + +/* ensure that the register 'rg' is free */ +#define NEED_REGISTER(rg) do { \ + vinfo_t* _content = REG_NUMBER(po, (rg)); \ + if (_content != NULL) { \ + if (RUNTIME_STACK(_content) == RUNTIME_STACK_NONE) \ + SAVE_REG_VINFO(_content, rg); \ + SET_RUNTIME_REG_TO_NONE(_content); \ + REG_NUMBER(po, (rg)) = NULL; \ + } \ +} while (0) + +/* ensure that the condition code flags of the processor no + longer contain any useful information */ + +#define NEED_CC() NEED_CC_REG(REG_NONE) +/* same as NEED_CC() but don't overwrite rg */ +#define NEED_CC_REG(rg) do { \ + if (HAS_CCREG(po)) \ + code = psyco_compute_cc(po, code, (rg)); \ +} while (0) +/* same as NEED_CC() but don't overwrite the given source */ +#define NEED_CC_SRC(src) \ + NEED_CC_REG(is_runtime(src) ? RSOURCE_REG(src) : REG_NONE) +/* internal */ +EXTERNFN code_t* psyco_compute_cc(PsycoObject* po, code_t* code, reg_t reserved); + +#define LOAD_REG_FROM_CONDITION(rg, cc) do { /* 'rg' is an 8-bit reg */ \ + code[0] = 0x0F; /* SETcond rg8 */ \ + code[1] = 0x90 | (cc); \ + code[2] = 0xC0 | (rg); /* actually an 8-bit register, but the first four \ + 32-bit registers have the same number as their \ + respective lower-8-bit parts */ \ + code[3] = 0x0F; \ + code[4] = 0xB6; /* MOVZX rg32, rg8 */ \ + code[5] = 0xC0 | ((rg)*9); \ + code += 6; \ +} while (0) + +/* save all registers that might be clobbered by a call to a C function */ +#define SAVE_REGS_FN_CALLS(cc) do { \ + if (cc) NEED_CC(); \ + NEED_REGISTER(REG_386_EAX); \ + NEED_REGISTER(REG_386_ECX); \ + NEED_REGISTER(REG_386_EDX); \ +} while (0) + +#define NEED_FREE_REG_COND(targ, cond) do { \ + targ = po->last_used_reg; \ + if (!(cond) || REG_NUMBER(po, targ) != NULL) { \ + do { \ + targ = NEXT_FREE_REG(); \ + } while (!(cond)); \ + NEED_REGISTER(targ); \ + } \ +} while (0) + +/* like NEED_REGISTER but 'targ' is an output argument which will + receive the number of a now-free register */ +#define NEED_FREE_REG(targ) NEED_FREE_REG_COND(targ, 1) +#define IS_BYTE_REG(rg) (REG_386_EAX <= (rg) && (rg) <= REG_386_EBX) +#define NEED_FREE_BYTE_REG(targ, resrv1, resrv2) \ + NEED_FREE_REG_COND(targ, IS_BYTE_REG(targ) && \ + targ!=(resrv1) && targ!=(resrv2)) + +/* make sure that the register 'reg' will not + be returned by the next call to NEED_FREE_REG() */ +#define DELAY_USE_OF(reg) do { \ + if (RegistersLoop[(int) po->last_used_reg] == (reg)) \ + po->last_used_reg = (reg); \ + if (po->last_used_reg == (reg)) \ + NEXT_FREE_REG(); \ +} while (0) + +/* the same for two registers */ +#define DELAY_USE_OF_2(rg1, rg2) do { \ + DELAY_USE_OF(rg1); \ + DELAY_USE_OF(rg2); \ + DELAY_USE_OF(rg1); \ +} while (0) + +/* the same if the given source is run-time and in a register */ +#define DONT_OVERWRITE_SOURCE(src) do { \ + if (is_runtime_with_reg(src)) \ + DELAY_USE_OF(RSOURCE_REG(src)); \ +} while (0) + + +/*****************************************************************/ + /*** vinfo_t restoring ***/ + +/* ensure that a run-time vinfo is in a register */ +#define RTVINFO_IN_REG(vi) do { \ + if (RUNTIME_REG_IS_NONE(vi)) { \ + /* reload the vinfo from the stack */ \ + reg_t _rg; \ + long _stack; \ + NEED_FREE_REG(_rg); \ + REG_NUMBER(po, _rg) = (vi); \ + _stack = RUNTIME_STACK(vi); \ + SET_RUNTIME_REG_TO(vi, _rg); \ + LOAD_REG_FROM_EBP_BASE(_rg, _stack); \ + } \ +} while (0) + +#define RTVINFO_IN_BYTE_REG(vi, resrv1, resrv2) do { \ + reg_t _currg = RUNTIME_REG(vi); \ + if (!IS_BYTE_REG(_currg)) { \ + reg_t _rg; \ + NEED_FREE_BYTE_REG(_rg, resrv1, resrv2); \ + if (_currg != REG_NONE) \ + REG_NUMBER(po, _currg) = NULL; \ + REG_NUMBER(po, _rg) = (vi); \ + LOAD_REG_FROM_RT((vi)->source, _rg); \ + SET_RUNTIME_REG_TO(vi, _rg); \ + } \ +} while (0) + +/* load register 'dst' from the given non-virtual source vinfo */ +#define LOAD_REG_FROM(source, dst) do { \ + if (((source) & CompileTime) != 0) \ + LOAD_REG_FROM_IMMED(dst, KSOURCE_SOURCE(source)->value); \ + else { \ + if (RSOURCE_REG(source) != dst) \ + LOAD_REG_FROM_RT(source, dst); \ + } \ +} while (0) + + +/*****************************************************************/ + /*** conditional jumps ***/ + +#define JUMP_TO(addr) do { \ + code[0] = 0xE9; /* JMP rel32 */ \ + code += 5; \ + *(long*)(code-4) = (addr) - code; \ +} while (0) + +#define IS_A_JUMP(code, targetaddr) \ + (code[0]==(code_t)0xE9 && (targetaddr=code+5+*(long*)(code+1), 1)) + +#define IS_A_SINGLE_JUMP(code, codeend, targetaddr) \ + ((codeend)-(code) == SIZE_OF_FAR_JUMP && IS_A_JUMP(code, targetaddr)) + +#define FAR_COND_JUMP_TO(addr, condition) do { \ + code[0] = 0x0F; /* Jcond rel32 */ \ + code[1] = 0x80 | (code_t)(condition); \ + code += 6; \ + *(long*)(code-4) = (addr) - code; \ +} while (0) +#define CHANGE_JUMP_TO(addr) do { \ + *(long*)(code-4) = (addr) - code; \ +} while (0) + +#define SIZE_OF_FAR_JUMP 5 +#define MAXIMUM_SIZE_OF_FAR_JUMP SIZE_OF_FAR_JUMP +#define SIZE_OF_SHORT_CONDITIONAL_JUMP 2 /* Jcond rel8 */ +#define RANGE_OF_SHORT_CONDITIONAL_JUMP 127 /* max. positive offset */ + +#define SHORT_COND_JUMP_TO(addr, condition) do { \ + long _ofs = (addr) - (code+2); \ + extra_assert(-128 <= _ofs && _ofs < 128); \ + code[0] = 0x70 | (code_t)(condition); \ + code[1] = (code_t) _ofs; \ + code += 2; \ +} while (0) + +/* reverse room for a CMP/JE pair of instructions */ +#define RESERVE_JUMP_IF_EQUAL(rg) do { \ + code[0] = 0x81; \ + code[1] = 0xC0 | (7<<3) | (rg); /* CMP rg, imm32 */ \ + code[6] = 0x0F; \ + code[7] = 0x80 | (code_t)(CC_E); /* JE rel32 */ \ + code += 12; \ + *(long*)(code-4) = 0; /* by default, go nowhere else */ \ +} while (0) +#define FIX_JUMP_IF_EQUAL(codeend, value, targetaddr) do { \ + code_t* _codeend = (codeend); \ + *(long*)(_codeend-10) = (value); \ + *(long*)(_codeend-4) = (targetaddr) - _codeend; \ +} while (0) + + +#if PENTIUM_INSNS +/* #define CONDITIONAL_LOAD_REG_FROM_RT(source, dst, condition) do { \ */ +/* *code++ = 0x0F; * CMOVxx dst, (...) * \ */ +/* INSTR_MODRM_FROM_RT(source, 0x40 | (condition), (dst)<<3); \ */ +/* } while (0) */ +#endif + + +/* correct the stack pointer */ +#define STACK_CORRECTION(stack_correction) do { \ + if ((stack_correction) != 0) { \ + if (COMPACT_ENCODING && !HAS_CCREG(po) && \ + -128 <= (stack_correction) && (stack_correction) < 128) { \ + code[0] = 0x83; /* SUB */ \ + code[1] = 0xEC; /* ESP, imm8 */ \ + code[2] = (stack_correction); \ + code += 3; \ + } \ + else { \ + code[0] = 0x8D; /* LEA */ \ + code[1] = 0x84 | ((code_t)REG_386_ESP)<<3;/* ESP, */ \ + code[2] = 0x24; /* [ESP+imm32] */ \ + *(long*)(code+3) = -(stack_correction); \ + code += 7; \ + } \ + } \ +} while (0) + + + /* convenience macros */ +#define COPY_IN_REG(vi, rg) do { \ + NEED_FREE_REG(rg); \ + if (((vi)->source & (TimeMask|RunTime_StackMask)) == \ + (RunTime|RunTime_StackNone)) { \ + reg_t _rg2 = rg; \ + rg = RUNTIME_REG(vi); \ + extra_assert(rg!=_rg2); \ + LOAD_REG_FROM_REG(_rg2, rg); \ + SET_RUNTIME_REG_TO(vi, _rg2); \ + REG_NUMBER(po, _rg2) = vi; \ + REG_NUMBER(po, rg) = NULL; \ + } \ + else { \ + LOAD_REG_FROM(vi->source, rg); \ + } \ +} while (0) + +#define EMIT_TRACE(msg, fn) do { \ + TEMP_SAVE_REGS_FN_CALLS; \ + PUSH_IMMED((long) code); \ + PUSH_IMMED((long) (msg)); \ + CALL_C_FUNCTION(fn, 2); \ + STACK_CORRECTION(-8); \ + TEMP_RESTORE_REGS_FN_CALLS; \ +} while (0) + +#define ALIGN_PAD_CODE_PTR() do { \ + if ((((long)code) & 15) > 8) /* directive .p2align 4,,7 of 'as' */ \ + code = (code_t*)((((long)code) & ~15) + 16); \ +} while (0) + +#define ALIGN_WITH_BYTE(byte) do { \ + if ((((long)code) & 15) > 8) /* directive .p2align 4,,7 of 'as' */ \ + do { \ + *code++ = byte; \ + } while ((((long)code) & 15) != 0); \ +} while (0) + +/* XXX in the GNU 'as' padding is more subtle: it inserts only one or two + instructions that do nothing but take more space than a single NOP */ +#define ALIGN_WITH_NOP() ALIGN_WITH_BYTE(0x90) + +#if ALL_CHECKS +#define ALIGN_NO_FILL() ALIGN_WITH_BYTE(0xCC) /* INT 03 (debugging) */ +#else +#define ALIGN_NO_FILL() ALIGN_PAD_CODE_PTR() +#endif + + +#endif /* _IENCODING_H */ diff --git a/nodeboxgl/ext/psyco/src/c/i386/iinitialize.h b/nodeboxgl/ext/psyco/src/c/i386/iinitialize.h new file mode 100644 index 0000000..05be703 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/iinitialize.h @@ -0,0 +1,21 @@ + /***************************************************************/ +/*** Automatically generated support file ***/ + /***************************************************************/ + + /* This file is automatically generated by 'files.py'. + DO NOT MODIFY. Changes will be overwritten ! */ + + + /* internal part for psyco.c */ +#if ALL_STATIC +# include "iprocessor.c" +# include "idispatcher.c" +# include "iencoding.c" +# include "ipyencoding.c" +#else /* if !ALL_STATIC */ + EXTERNFN void psyco_processor_init(void); /* iprocessor.c */ +#endif /* !ALL_STATIC */ + +PSY_INLINE void initialize_processor_files(void) { + psyco_processor_init(); /* iprocessor.c */ +} diff --git a/nodeboxgl/ext/psyco/src/c/i386/iprocessor.c b/nodeboxgl/ext/psyco/src/c/i386/iprocessor.c new file mode 100644 index 0000000..ce553f7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/iprocessor.c @@ -0,0 +1,152 @@ +#include "../processor.h" +#include "iencoding.h" +#include "../dispatcher.h" +#include "../codemanager.h" +#include "../Python/frames.h" + + +/* define to copy static machine code in the heap before running it. + I've seen some Linux distributions in which the static data pages + are not executable by default. */ +#define COPY_CODE_IN_HEAP + + +/* glue code for psyco_processor_run(). */ +static code_t glue_run_code[] = { + 0x8B, 0x44, 0x24, 4, /* MOV EAX, [ESP+4] (code target) */ + 0x8B, 0x4C, 0x24, 8, /* MOV ECX, [ESP+8] (stack end) */ + 0x8B, 0x54, 0x24, 12, /* MOV EDX, [ESP+12] (initial stack) */ + PUSH_REG_INSTR(REG_386_EBP), /* PUSH EBP */ + PUSH_REG_INSTR(REG_386_EBX), /* PUSH EBX */ + PUSH_REG_INSTR(REG_386_ESI), /* PUSH ESI */ + PUSH_REG_INSTR(REG_386_EDI), /* PUSH EDI */ + 0x8B, 0x5C, 0x24, 32, /* MOV EBX, [ESP+32] (finfo frame stack ptr) */ +#ifdef __APPLE__ + /* Align stack on 16-byte boundary for MacOS X */ + 0x83, 0xEC, 8, /* SUB ESP, 8 */ +#endif + 0x6A, -1, /* PUSH -1 */ + 0x89, 0x23, /* MOV [EBX], ESP */ + 0xEB, +5, /* JMP Label2 */ + /* Label1: */ + 0x83, 0xE9, 4, /* SUB ECX, 4 */ + 0xFF, 0x31, /* PUSH [ECX] */ + /* Label2: */ + 0x39, 0xCA, /* CMP EDX, ECX */ + 0x75, -9, /* JNE Label1 */ + 0xFF, 0xD0, /* CALL *EAX (callee removes args) */ +#ifdef __APPLE__ + /* Restore stack from 16-byte alignment on MacOS X */ + 0x83, 0xC4, 8, /* ADD ESP, 8 */ +#endif + POP_REG_INSTR(REG_386_EDI), /* POP EDI */ + POP_REG_INSTR(REG_386_ESI), /* POP ESI */ + POP_REG_INSTR(REG_386_EBX), /* POP EBX */ + POP_REG_INSTR(REG_386_EBP), /* POP EBP */ + 0xC3, /* RET */ +}; + +typedef PyObject* (*glue_run_code_fn) (code_t* code_target, + long* stack_end, + long* initial_stack, + struct stack_frame_info_s*** finfo); + +#ifdef COPY_CODE_IN_HEAP +static glue_run_code_fn glue_run_code_1; +#else +# define glue_run_code_1 ((glue_run_code_fn) glue_run_code) +#endif + +DEFINEFN +PyObject* psyco_processor_run(CodeBufferObject* codebuf, + long initial_stack[], + struct stack_frame_info_s*** finfo, + PyObject* tdict) +{ + int argc = RUN_ARGC(codebuf); + return glue_run_code_1(codebuf->codestart, initial_stack + argc, + initial_stack, finfo); +} + +/* call a C function with a variable number of arguments */ +DEFINEVAR long (*psyco_call_var) (void* c_func, int argcount, long arguments[]); + +static code_t glue_call_var[] = { + 0x53, /* PUSH EBX */ + 0x8B, 0x5C, 0x24, 12, /* MOV EBX, [ESP+12] (argcount) */ + 0x8B, 0x44, 0x24, 8, /* MOV EAX, [ESP+8] (c_func) */ +#ifdef __APPLE__ + /* Align stack on 16-byte boundary for MacOS X */ + 0x83, 0xEC, 8, /* SUB ESP, 8 */ +#endif + 0x09, 0xDB, /* OR EBX, EBX */ + 0x74, +16, /* JZ Label1 */ +#ifdef __APPLE__ + /* Arguments are 8 bytes further up stack on MacOS X */ + 0x8B, 0x54, 0x24, 24, /* MOV EDX, [ESP+24] (arguments) */ +#else + 0x8B, 0x54, 0x24, 16, /* MOV EDX, [ESP+16] (arguments) */ +#endif + 0x8D, 0x0C, 0x9A, /* LEA ECX, [EDX+4*EBX] */ + /* Label2: */ + 0x83, 0xE9, 4, /* SUB ECX, 4 */ + 0xFF, 0x31, /* PUSH [ECX] */ + 0x39, 0xCA, /* CMP EDX, ECX */ + 0x75, -9, /* JNE Label2 */ + /* Label1: */ + 0xFF, 0xD0, /* CALL *EAX */ +#ifdef __APPLE__ + /* Restore stack from 16-byte alignment on MacOS X */ + 0x83, 0xC4, 8, /* ADD ESP, 8 */ +#endif + 0x8D, 0x24, 0x9C, /* LEA ESP, [ESP+4*EBX] */ + 0x5B, /* POP EBX */ + 0xC3, /* RET */ +}; + +/* check for signed integer multiplication overflow */ +DEFINEVAR char (*psyco_int_mul_ovf) (long a, long b); + +static code_t glue_int_mul[] = { + 0x8B, 0x44, 0x24, 8, /* MOV EAX, [ESP+8] (a) */ + 0x0F, 0xAF, 0x44, 0x24, 4, /* IMUL EAX, [ESP+4] (b) */ + 0x0F, 0x90, 0xC0, /* SETO AL */ + 0xC3, /* RET */ +}; + + +#ifdef COPY_CODE_IN_HEAP +static code_t* internal_copy_code(void* source, int size) { + CodeBufferObject* codebuf = psyco_new_code_buffer(NULL, NULL, NULL); + code_t* code = codebuf->codestart; + memcpy(code, source, size); + SHRINK_CODE_BUFFER(codebuf, code+size, "glue"); + return code; +} +# define COPY_CODE(target, source, type) do { \ + target = (type) internal_copy_code(source, sizeof(source)); \ +} while (0) +#else +# define COPY_CODE(target, source, type) (target = (type) source) +#endif + + +INITIALIZATIONFN +void psyco_processor_init(void) +{ +#ifdef COPY_CODE_IN_HEAP + COPY_CODE(glue_run_code_1, glue_run_code, glue_run_code_fn); +#endif + COPY_CODE(psyco_int_mul_ovf, glue_int_mul, char(*)(long, long)); + COPY_CODE(psyco_call_var, glue_call_var, long(*)(void*, int, long[])); +} + + +DEFINEFN struct stack_frame_info_s** +psyco_next_stack_frame(struct stack_frame_info_s** finfo) +{ + /* Hack to pick directly from the machine stack the stored + "stack_frame_info_t*" pointers */ + return (struct stack_frame_info_s**) + (((char*) finfo) - finfo_last(*finfo)->link_stack_depth); +} diff --git a/nodeboxgl/ext/psyco/src/c/i386/ipyencoding.c b/nodeboxgl/ext/psyco/src/c/i386/ipyencoding.c new file mode 100644 index 0000000..1b54f45 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/ipyencoding.c @@ -0,0 +1,104 @@ +#include "ipyencoding.h" +#include "../pycodegen.h" + + +DEFINEFN +code_t* decref_dealloc_calling(code_t* code, PsycoObject* po, reg_t rg, + destructor fn) +{ + code_t* code_origin; + int save_eax, save_ecx, save_edx; + reg_t last_reg; + DEC_OB_REFCNT_NZ(rg); + extra_assert(offsetof(PyObject, ob_type) < 128); + extra_assert(offsetof(PyTypeObject, tp_dealloc) < 128); + code[0] = 0x75; /* JNZ rel8 */ + code += 2; + code_origin = code; + if (COMPACT_ENCODING) { + save_eax = REG_NUMBER(po, REG_386_EAX) != NULL; + save_ecx = REG_NUMBER(po, REG_386_ECX) != NULL; + save_edx = REG_NUMBER(po, REG_386_EDX) != NULL; + last_reg = REG_386_EAX; + if (save_eax) PUSH_REG(REG_386_EAX); + if (save_ecx) { PUSH_REG(REG_386_ECX); last_reg = REG_386_ECX; } + if (save_edx) { PUSH_REG(REG_386_EDX); last_reg = REG_386_EDX; } + PUSH_REG(rg); + } + else { + CODE_FOUR_BYTES(code, + PUSH_REG_INSTR(REG_386_EAX), + PUSH_REG_INSTR(REG_386_ECX), + PUSH_REG_INSTR(REG_386_EDX), + PUSH_REG_INSTR(rg)); + code += 4; + } + if (fn == NULL) { + code[0] = 0x8B; /* MOV EAX, [reg+ob_type] */ + code[1] = 0x40 | (rg); + CODE_FOUR_BYTES(code+2, + offsetof(PyObject, ob_type), + 0xFF, /* CALL [EAX+tp_dealloc] */ + 0x50, + offsetof(PyTypeObject, tp_dealloc)); + code += 6; + } + else { + code[0] = 0xE8; /* CALL */ + code += 5; + *(long*)(code-4) = (code_t*)(fn) - code; + } + if (COMPACT_ENCODING) { + POP_REG(last_reg); /* pop argument back */ + if (save_edx) POP_REG(REG_386_EDX); + if (save_ecx) POP_REG(REG_386_ECX); + if (save_eax) POP_REG(REG_386_EAX); + } + else { + CODE_FOUR_BYTES(code, + POP_REG_INSTR(REG_386_EDX), + POP_REG_INSTR(REG_386_EDX), + POP_REG_INSTR(REG_386_ECX), + POP_REG_INSTR(REG_386_EAX)); + code += 4; + } + extra_assert(code-code_origin < 128); + code_origin[-1] = (code_t)(code-code_origin); + return code; +} + +DEFINEFN +void decref_create_new_ref(PsycoObject* po, vinfo_t* w) +{ + /* we must Py_INCREF() the object */ + BEGIN_CODE + if (is_compiletime(w->source)) + INC_KNOWN_OB_REFCNT((PyObject*) + CompileTime_Get(w->source)->value); + else { + /* 'w' is in a register because of write_array_item() */ + extra_assert(!RUNTIME_REG_IS_NONE(w)); + INC_OB_REFCNT(RUNTIME_REG(w)); + } + END_CODE +} + +DEFINEFN +bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w) +{ + bool could_eat = eat_reference(w); + if (!could_eat) { + /* in this case we must Py_INCREF() the object */ + BEGIN_CODE + if (is_compiletime(w->source)) + INC_KNOWN_OB_REFCNT((PyObject*) + CompileTime_Get(w->source)->value); + else { + /* 'w' is in a register because of write_array_item() */ + extra_assert(!RUNTIME_REG_IS_NONE(w)); + INC_OB_REFCNT(RUNTIME_REG(w)); + } + END_CODE + } + return could_eat; +} diff --git a/nodeboxgl/ext/psyco/src/c/i386/ipyencoding.h b/nodeboxgl/ext/psyco/src/c/i386/ipyencoding.h new file mode 100644 index 0000000..9b152ef --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/i386/ipyencoding.h @@ -0,0 +1,318 @@ + /***************************************************************/ +/*** Processor- and language-dependent code producers ***/ + /***************************************************************/ + +#ifndef _IPYENCODING_H +#define _IPYENCODING_H + + +#include "../processor.h" +#include "../dispatcher.h" + +#include "../Objects/pobject.h" +#include "../Objects/pdictobject.h" + + +#define TRACE_START_COMPILING(c) do { /* nothing */ } while (0) + + +/* Note: the following macro must output a fixed number of bytes of + code, so that DICT_ITEM_UPDINDEX() can be called later + to update an existing code buffer */ +#define DICT_ITEM_KEYVALUE(code, index, key, value, mprg) do { \ + extra_assert(0 < offsetof(PyDictObject, ma_mask) && \ + offsetof(PyDictObject, ma_mask) < 128); \ + extra_assert(0 < offsetof(PyDictObject, ma_table) && \ + offsetof(PyDictObject, ma_table) < 128); \ + code[0] = 0x81; /* CMP [...], imm32 */ \ + code[1] = 0x40 | (7<<3) | mprg; /* CMP [mpreg->ma_mask], ... */ \ + code[2] = offsetof(PyDictObject, ma_mask); \ + *(long*)(code+3) = (index); \ + /* perform the load before checking the CMP outcome */ \ + code[7] = 0x8B; \ + code[8] = 0x40 | (mprg<<3) | mprg; /* MOV mpreg, [mpreg->ma_table] */ \ + CODE_FOUR_BYTES(code+9, \ + offsetof(PyDictObject, ma_table), \ + 0x70 | CC_L, /* JL +22 (skip rest of macro) */ \ + 34 - 12, \ + 0x81); /* CMP [mpreg+dictentry*index+me_key], key */ \ + code[13] = 0x80 | (7<<3) | mprg; \ + *(long*)(code+14) = (index)*sizeof(PyDictEntry) + \ + offsetof(PyDictEntry, me_key); \ + *(long*)(code+18) = (long)(key); \ + CODE_FOUR_BYTES(code+22, \ + 0x70 | CC_NE, /* JNE +10 (skip rest of macro) */ \ + 34 - 24, \ + 0x81, /* CMP [mpreg+dictentry*index+me_value], value */ \ + 0x80 | (7<<3) | mprg); \ + *(long*)(code+26) = (index)*sizeof(PyDictEntry) + \ + offsetof(PyDictEntry, me_value); \ + *(long*)(code+30) = (long)(value); \ + code += 34; \ +} while (0) + +#define DICT_ITEM_CHECK_CC CC_NE + +#define DICT_ITEM_UPDINDEX(index) do { \ + *(long*)(code+3) = (index); \ + *(long*)(code+14) = (index)*sizeof(PyDictEntry) + \ + offsetof(PyDictEntry, me_key); \ + *(long*)(code+26) = (index)*sizeof(PyDictEntry) + \ + offsetof(PyDictEntry, me_value); \ +} while (0) + + +/* A cleaner interface to the two big macros above: quickly + checking if a globals' dictionary still map the given key to + the given value. + XXX 'dict' must never be released! */ +PSY_INLINE void* dictitem_check_change(PsycoObject* po, + PyDictObject* dict, PyDictEntry* ep) +{ + int index = ep - dict->ma_table; + PyObject* key = ep->me_key; + PyObject* result = ep->me_value; + reg_t mprg; + code_t* codebase; + + Py_INCREF(key); /* XXX these become immortal */ + Py_INCREF(result); /* XXX */ + + BEGIN_CODE + NEED_CC(); + NEED_FREE_REG(mprg); + /* write code that quickly checks that the same + object is still in place in the dictionary */ + LOAD_REG_FROM_IMMED(mprg, (long) dict); + codebase = code; + DICT_ITEM_KEYVALUE(code, index, key, result, mprg); + END_CODE + return codebase; +} + +PSY_INLINE void dictitem_update_nochange(void* originalmacrocode, + PyDictObject* dict, PyDictEntry* new_ep) +{ + int index = new_ep - dict->ma_table; + code_t* code = (code_t*) originalmacrocode; + DICT_ITEM_UPDINDEX(index); +} + + +/* emit the equivalent of the Py_INCREF() macro */ +/* the PyObject* is stored in the register 'rg' */ +/* XXX if Py_REF_DEBUG is set (Python debug mode), the + following will not properly update _Py_RefTotal. + Don't trust _Py_RefTotal with Psyco. */ +#define INC_OB_REFCNT(rg) do { \ + NEED_CC_REG(rg); \ + INC_OB_REFCNT_internal(rg); \ +} while (0) +/* same as above, preserving the cc */ +#define INC_OB_REFCNT_CC(rg) do { \ + bool _save_ccreg = HAS_CCREG(po); \ + if (_save_ccreg) PUSH_CC_FLAGS(); \ + INC_OB_REFCNT_internal(rg); \ + if (_save_ccreg) POP_CC_FLAGS(); \ +} while (0) +#define INC_OB_REFCNT_internal(rg) do { \ + code[0] = 0xFF; /* INC [reg] */ \ + if ((EBP_IS_RESERVED || (rg) != REG_386_EBP) && \ + offsetof(PyObject, ob_refcnt) == 0) \ + { \ + extra_assert((rg) != REG_386_EBP); \ + code[1] = (rg); \ + } \ + else \ + { \ + code++; \ + extra_assert(offsetof(PyObject, ob_refcnt) < 128);\ + code[0] = 0x40 | (rg); \ + code[1] = (code_t) offsetof(PyObject, ob_refcnt); \ + } \ + code += 2; \ +} while (0) + +/* Py_INCREF() for a compile-time-known 'pyobj' */ +#define INC_KNOWN_OB_REFCNT(pyobj) do { \ + NEED_CC(); \ + code[0] = 0xFF; /* INC [address] */ \ + code[1] = 0x05; \ + *(int**)(code+2) = &(pyobj)->ob_refcnt; \ + code += 6; \ + } while (0) + +/* Py_DECREF() for a compile-time 'pyobj' assuming counter cannot reach zero */ +#define DEC_KNOWN_OB_REFCNT_NZ(pyobj) do { \ + NEED_CC(); \ + code[0] = 0xFF; /* DEC [address] */ \ + code[1] = (1<<3) | 0x05; \ + *(int**)(code+2) = &(pyobj)->ob_refcnt; \ + code += 6; \ + } while (0) + +/* like DEC_OB_REFCNT() but assume the reference counter cannot reach zero */ +#define DEC_OB_REFCNT_NZ(rg) do { \ + NEED_CC_REG(rg); \ + code[0] = 0xFF; /* DEC [reg] */ \ + if ((EBP_IS_RESERVED || (rg) != REG_386_EBP) && \ + offsetof(PyObject, ob_refcnt) == 0) \ + { \ + extra_assert((rg) != REG_386_EBP); \ + code[1] = 0x08 | (rg); \ + } \ + else \ + { \ + code++; \ + extra_assert(offsetof(PyObject, ob_refcnt) < 128);\ + code[0] = 0x48 | (rg); \ + code[1] = (code_t) offsetof(PyObject, ob_refcnt); \ + } \ + code += 2; \ +} while (0) + +/* internal utilities for the macros below */ +EXTERNFN code_t* decref_dealloc_calling(code_t* code, PsycoObject* po, reg_t rg, + destructor fn); + +/* the equivalent of Py_DECREF(). + XXX Same remark as INC_OB_REFCNT(). + We correctly handle the Py_TRACE_REFS case, + however, by calling the _Py_Dealloc() function. + Slow but correct (and you have the debugging Python + version anyway, so you are not looking for top speed + but just testing things). */ +#ifdef Py_TRACE_REFS +/* debugging only */ +# define DEC_OB_REFCNT(rg) (code=decref_dealloc_calling(code, po, rg, \ + _Py_Dealloc)) +#else +# define DEC_OB_REFCNT(rg) (code=decref_dealloc_calling(code, po, rg, NULL)) +#endif + +/* the equivalent of Py_DECREF() when we know the type of the object + (assuming that tp_dealloc never changes for a given type) */ +#ifdef Py_TRACE_REFS +/* debugging only */ +# define DEC_OB_REFCNT_T(rg, type) (code=decref_dealloc_calling(code, po, rg, \ + _Py_Dealloc)) +#else +# define DEC_OB_REFCNT_T(rg, type) (code=decref_dealloc_calling(code, po, rg, \ + (type)->tp_dealloc)) +#endif + + +/***************************************************************/ + /*** generic reference counting functions ***/ + +/* emit Py_INCREF(v) for run-time v */ +PSY_INLINE void psyco_incref_rt(PsycoObject* po, vinfo_t* v) +{ + reg_t rg; + BEGIN_CODE + RTVINFO_IN_REG(v); + rg = RUNTIME_REG(v); + INC_OB_REFCNT(rg); + END_CODE +} + +/* emit Py_INCREF(v) for non-virtual v */ +PSY_INLINE void psyco_incref_nv(PsycoObject* po, vinfo_t* v) +{ + if (!is_compiletime(v->source)) + psyco_incref_rt(po, v); + else + { + BEGIN_CODE + INC_KNOWN_OB_REFCNT((PyObject*) CompileTime_Get(v->source)->value); + END_CODE + } +} + +/* emit Py_DECREF(v) for run-time v. Used by vcompiler.c when releasing a + run-time vinfo_t holding a reference to a Python object. */ +PSY_INLINE void psyco_decref_rt(PsycoObject* po, vinfo_t* v) +{ + PyTypeObject* tp = Psyco_KnownType(v); + reg_t rg; + BEGIN_CODE + RTVINFO_IN_REG(v); + rg = RUNTIME_REG(v); + if (tp != NULL) + DEC_OB_REFCNT_T(rg, tp); + else + DEC_OB_REFCNT(rg); + END_CODE +} + +/* emit Py_DECREF(o) for a compile-time o */ +PSY_INLINE void psyco_decref_c(PsycoObject* po, PyObject* o) +{ + BEGIN_CODE + DEC_KNOWN_OB_REFCNT_NZ(o); + END_CODE +} + + +/* to store a new reference to a Python object into a memory structure, + use psyco_put_field() or psyco_put_field_array() to store the value + proper and then one of the following two functions to adjust the + reference counter: */ + +/* normal case */ +EXTERNFN void decref_create_new_ref(PsycoObject* po, vinfo_t* w); + +/* if 'w' is supposed to be freed soon, this function tries (if possible) + to move an eventual Python reference owned by 'w' to the memory + structure. This avoids a Py_INCREF()/Py_DECREF() pair. + Returns 'true' if the reference was successfully transfered; + 'false' does not mean failure. */ +EXTERNFN bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w); + + +/* called by psyco_emit_header() */ +#define INITIALIZE_FRAME_LOCALS(nframelocal) do { \ + STACK_CORRECTION(4*((nframelocal)-1)); \ + PUSH_IMMED(0); /* f_exc_type, initially NULL */ \ +} while (0) + +/* called by psyco_finish_return() */ +#define FINALIZE_FRAME_LOCALS(nframelocal) do { \ + CODE_FOUR_BYTES(code, \ + 0x83, \ + 0x3C, /* CMP [ESP], 0 */ \ + 0x24, \ + 0); \ + code[4] = 0x70 | CC_E; /* JE exit */ \ + code[5] = 11 - 6; \ + code[6] = 0xE8; /* CALL cimpl_finalize_frame_locals */ \ + code += 11; \ + *(long*)(code-4) = (code_t*)(&cimpl_finalize_frame_locals) - code; \ +} while (0) + +#define WRITE_FRAME_EPILOGUE(retval, nframelocal) do { \ + /* load the return value into EAX for regular functions, EBX for functions \ + with a prologue */ \ + if (retval != SOURCE_DUMMY) { \ + reg_t rg = nframelocal>0 ? REG_ANY_CALLEE_SAVED : REG_FUNCTIONS_RETURN; \ + LOAD_REG_FROM(retval, rg); \ + } \ + \ + if (nframelocal > 0) \ + { \ + /* psyco_emit_header() was used; first clear the stack only up to and not \ + including the frame-local data */ \ + int framelocpos = getstack(LOC_CONTINUATION->array->items[0]->source); \ + STACK_CORRECTION(framelocpos - po->stack_depth); \ + po->stack_depth = framelocpos; \ + \ + /* perform Python-specific cleanup */ \ + FINALIZE_FRAME_LOCALS(nframelocal); \ + LOAD_REG_FROM_REG(REG_FUNCTIONS_RETURN, REG_ANY_CALLEE_SAVED); \ + } \ +} while (0) + +/* implemented in pycompiler.c */ +EXTERNFN void cimpl_finalize_frame_locals(PyObject*, PyObject*, PyObject*); + +#endif /* _IPYENCODING_H */ diff --git a/nodeboxgl/ext/psyco/src/c/initialize.h b/nodeboxgl/ext/psyco/src/c/initialize.h new file mode 100644 index 0000000..a992ba5 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/initialize.h @@ -0,0 +1,150 @@ + /***************************************************************/ +/*** Automatically generated support file ***/ + /***************************************************************/ + + /* This file is automatically generated by 'files.py'. + DO NOT MODIFY. Changes will be overwritten ! */ + + + /* Including this file results in all headers Objects/xxx.h + being included, so that it has roughly the same result + for Psyco as a "#include " has for Python: + including all headers extension modules generally need. + + This file is moreover used internally by psyco.c. */ + + +#ifndef PSYCO_INITIALIZATION + +# include "Objects/pobject.h" +# include "Objects/pabstract.h" +# include "Objects/pboolobject.h" +# include "Objects/pclassobject.h" +# include "Objects/pdescrobject.h" +# include "Objects/pdictobject.h" +# include "Objects/pfloatobject.h" +# include "Objects/pfuncobject.h" +# include "Objects/pintobject.h" +# include "Objects/piterobject.h" +# include "Objects/plistobject.h" +# include "Objects/plongobject.h" +# include "Objects/pmethodobject.h" +# include "Objects/prangeobject.h" +# include "Objects/pstringobject.h" +# include "Objects/pstructmember.h" +# include "Objects/ptupleobject.h" +# include "Objects/ptypeobject.h" +# include "Objects/pcompactobject.h" + +#else /* if PSYCO_INITIALIZATION */ +# undef PSYCO_INITIALIZATION + +#include /* processor-specific initialization */ + + /* internal part for psyco.c */ +#if ALL_STATIC +# include "dispatcher.c" +# include "vcompiler.c" +# include "psyfunc.c" +# include "stats.c" +# include "profile.c" +# include "cstruct.c" +# include "alarm.c" +# include "codemanager.c" +# include "codegen.c" +# include "mergepoints.c" +# include "linuxmemchk.c" +# include "Python/pycompiler.c" +# include "Python/frames.c" +# include "Python/pbltinmodule.c" +# include "Objects/pobject.c" +# include "Objects/pabstract.c" +# include "Objects/pboolobject.c" +# include "Objects/pclassobject.c" +# include "Objects/pdescrobject.c" +# include "Objects/pdictobject.c" +# include "Objects/pfloatobject.c" +# include "Objects/pfuncobject.c" +# include "Objects/pintobject.c" +# include "Objects/piterobject.c" +# include "Objects/plistobject.c" +# include "Objects/plongobject.c" +# include "Objects/pmethodobject.c" +# include "Objects/prangeobject.c" +# include "Objects/pstringobject.c" +# include "Objects/pstructmember.c" +# include "Objects/ptupleobject.c" +# include "Objects/ptypeobject.c" +# include "Objects/compactobject.c" +# include "Objects/pcompactobject.c" +# include "Modules/parray.c" +# include "Modules/pmath.c" +# include "Modules/ppsyco.c" +#else /* if !ALL_STATIC */ + EXTERNFN void psyco_compiler_init(void); /* vcompiler.c */ + EXTERNFN void psyco_stats_init(void); /* stats.c */ + EXTERNFN void psyco_profile_init(void); /* profile.c */ + EXTERNFN void psyco_cstruct_init(void); /* cstruct.c */ + EXTERNFN void psyco_alarm_init(void); /* alarm.c */ + EXTERNFN void psyco_codegen_init(void); /* codegen.c */ + EXTERNFN void psyco_pycompiler_init(void); /* Python/pycompiler.c */ + EXTERNFN void psyco_frames_init(void); /* Python/frames.c */ + EXTERNFN void psyco_bltinmodule_init(void); /* Python/pbltinmodule.c */ + EXTERNFN void psy_object_init(void); /* Objects/pobject.c */ + EXTERNFN void psy_boolobject_init(void); /* Objects/pboolobject.c */ + EXTERNFN void psy_classobject_init(void); /* Objects/pclassobject.c */ + EXTERNFN void psy_descrobject_init(void); /* Objects/pdescrobject.c */ + EXTERNFN void psy_dictobject_init(void); /* Objects/pdictobject.c */ + EXTERNFN void psy_floatobject_init(void); /* Objects/pfloatobject.c */ + EXTERNFN void psy_funcobject_init(void); /* Objects/pfuncobject.c */ + EXTERNFN void psy_intobject_init(void); /* Objects/pintobject.c */ + EXTERNFN void psy_iterobject_init(void); /* Objects/piterobject.c */ + EXTERNFN void psy_listobject_init(void); /* Objects/plistobject.c */ + EXTERNFN void psy_longobject_init(void); /* Objects/plongobject.c */ + EXTERNFN void psy_methodobject_init(void); /* Objects/pmethodobject.c */ + EXTERNFN void psy_rangeobject_init(void); /* Objects/prangeobject.c */ + EXTERNFN void psy_stringobject_init(void); /* Objects/pstringobject.c */ + EXTERNFN void psy_tupleobject_init(void); /* Objects/ptupleobject.c */ + EXTERNFN void psy_typeobject_init(void); /* Objects/ptypeobject.c */ + EXTERNFN void psyco_compact_init(void); /* Objects/compactobject.c */ + EXTERNFN void psy_compactobject_init(void); /* Objects/pcompactobject.c */ + EXTERNFN void psyco_initarray(void); /* Modules/parray.c */ + EXTERNFN void psyco_initmath(void); /* Modules/pmath.c */ + EXTERNFN void psyco_initpsyco(void); /* Modules/ppsyco.c */ +#endif /* !ALL_STATIC */ + +PSY_INLINE void initialize_all_files(void) { + initialize_processor_files(); + psyco_compiler_init(); /* vcompiler.c */ + psyco_stats_init(); /* stats.c */ + psyco_profile_init(); /* profile.c */ + psyco_cstruct_init(); /* cstruct.c */ + psyco_alarm_init(); /* alarm.c */ + psyco_codegen_init(); /* codegen.c */ + psyco_pycompiler_init(); /* Python/pycompiler.c */ + psyco_frames_init(); /* Python/frames.c */ + psyco_bltinmodule_init(); /* Python/pbltinmodule.c */ + psy_object_init(); /* Objects/pobject.c */ + psy_boolobject_init(); /* Objects/pboolobject.c */ + psy_classobject_init(); /* Objects/pclassobject.c */ + psy_descrobject_init(); /* Objects/pdescrobject.c */ + psy_dictobject_init(); /* Objects/pdictobject.c */ + psy_floatobject_init(); /* Objects/pfloatobject.c */ + psy_funcobject_init(); /* Objects/pfuncobject.c */ + psy_intobject_init(); /* Objects/pintobject.c */ + psy_iterobject_init(); /* Objects/piterobject.c */ + psy_listobject_init(); /* Objects/plistobject.c */ + psy_longobject_init(); /* Objects/plongobject.c */ + psy_methodobject_init(); /* Objects/pmethodobject.c */ + psy_rangeobject_init(); /* Objects/prangeobject.c */ + psy_stringobject_init(); /* Objects/pstringobject.c */ + psy_tupleobject_init(); /* Objects/ptupleobject.c */ + psy_typeobject_init(); /* Objects/ptypeobject.c */ + psyco_compact_init(); /* Objects/compactobject.c */ + psy_compactobject_init(); /* Objects/pcompactobject.c */ + psyco_initarray(); /* Modules/parray.c */ + psyco_initmath(); /* Modules/pmath.c */ + psyco_initpsyco(); /* Modules/ppsyco.c */ +} + +#endif /* PSYCO_INITIALIZATION */ diff --git a/nodeboxgl/ext/psyco/src/c/ivm/idispatcher.c b/nodeboxgl/ext/psyco/src/c/ivm/idispatcher.c new file mode 100644 index 0000000..127fa1f --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/idispatcher.c @@ -0,0 +1,272 @@ +#include "idispatcher.h" +#include "../dispatcher.h" +#include "../codemanager.h" +#include "ipyencoding.h" + + +/***************************************************************/ + /*** the hard processor-dependent part of dispatching: ***/ + /*** Unification. ***/ + +#define RUNTIME_STACK(v) getstack((v)->source) +#define RUNTIME_STACK_NONE RunTime_StackNone + + +struct dmove_s { + PsycoObject* po; + int original_stack_depth; + char* usages; /* buffer: array of vinfo_t*, see ORIGINAL_VINFO() below */ + int usages_size; + code_t* code_origin; + code_t* code_limit; + code_t* code; /* only used by data_update_stack() */ + CodeBufferObject* private_codebuf; +}; + +static code_t* data_new_buffer(code_t* code, struct dmove_s* dm) +{ + /* creates a new buffer containing a copy of the already-written code */ + CodeBufferObject* codebuf; + int codesize; + if (dm->private_codebuf != NULL) + { + /* overflowing the regular (large) code buffer */ + psyco_emergency_enlarge_buffer(&code, &dm->code_limit); + return code; + } + else + { + /* overflowing the small buffer, start a new (regular) one */ + codebuf = psyco_new_code_buffer(NULL, NULL, &dm->code_limit); + codebuf->snapshot.fz_stuff.fz_stack_depth = dm->original_stack_depth; + /* the new buffer should be at least as large as the old one */ + codesize = code - dm->code_origin; + code = insn_code_label(codebuf->codestart); + if (code + codesize > dm->code_limit) + Py_FatalError("psyco: unexpected unify buffer overflow"); + /* copy old code to new buffer */ + memcpy(code, dm->code_origin, codesize+POST_CODEBUFFER_SIZE); + dm->private_codebuf = codebuf; +#if PSYCO_DEBUG + dm->code_origin = (code_t*) 0xCDCDCDCD; +#endif + return code + codesize; + } +} + +#define ORIGINAL_VINFO(spos) (*(vinfo_t**)(dm->usages + ( \ + extra_assert(0 <= (spos) && (spos) < dm->usages_size), \ + (spos)))) + +static void data_original_table(vinfo_t* a, RunTimeSource bsource, + struct dmove_s* dm) +{ + /* called on each run-time vinfo_t in the FrozenPsycoObject. + Record in the array dm->usages which vinfo_t is found at what position + in the stack. Ignore the ones after dm->usages_size: they correspond to + stack positions which will soon be deleted (because the stack will + shrink). */ + if (RUNTIME_STACK(a) < dm->usages_size) + ORIGINAL_VINFO(RUNTIME_STACK(a)) = a; +} + +static void data_update_stack(vinfo_t* a, RunTimeSource bsource, + struct dmove_s* dm) +{ + PsycoObject* po = dm->po; + code_t* code = dm->code; + long dststack = getstack(bsource); + long srcstack = getstack(a->source); + vinfo_t* overridden; + RunTimeSource osrc; + + /* check for values passing from no-reference to reference */ + if ((bsource & RunTime_NoRef) == 0) { /* destination has ref */ + if ((a->source & RunTime_NoRef) == 0) /* source has ref too */ + { + /* remove the reference from 'a' because it now belongs + to 'b' ('b->source' itself is in the frozen snapshot + and must not be modified!) */ + a->source = remove_rtref(a->source); + } + else + { + /* create a new reference for 'b'. Note that if the same + 'a' is copied to several 'b's during data_update_stack() + as is allowed by graph quotient detection in + psyco_compatible(), then only the first copy will get + the original reference owned by 'a' (if any) and for + the following copies the following increfing code is + executed as well. */ + INSN_rt_push(a->source); + INSN_incref(); + } + } + /* 'a' must no longer own a reference at this point. + The case of 'b' wanting no reference but 'a' having one + is forbidden by psyco_compatible() because decrefing 'a' + would potentially leave a freed pointer in 'b'. */ + extra_assert(!has_rtref(a->source)); + + /* The operation below is: copy the value currently held by 'a' + into the stack position 'dststack'. */ + if (dststack == RUNTIME_STACK_NONE || dststack == srcstack) + ; /* nothing to do */ + else + { + /* is there already a pending value at 'dststack'? */ + overridden = ORIGINAL_VINFO(dststack); + if (overridden == NULL || RUNTIME_STACK(overridden) != dststack) + goto can_save_only; /* no -- just save the new value to 'dststack'. + The case RUNTIME_STACK(overridden) != dststack + corresponds to a vinfo_t which has been moved + elsewhere in the mean time. */ + + /* yes -- careful! We have to save the current value of + 'dststack' before we can overwrite it. */ + osrc = overridden->source; + INSN_rt_push(osrc); + osrc = set_rtstack_to_none(osrc); + INSNPUSHED(1); + overridden->source = set_rtstack_to(osrc, po->stack_depth); + + can_save_only: + /* copy 'a' to 'dststack' */ + INSN_rt_push(a->source); INSNPUSHED(1); + INSN_rt_pop(bsource); INSNPOPPED(1); + + /* Now 'a' is at 'dststack' */ + a->source = RunTime_New1(dststack, false, false); + ORIGINAL_VINFO(dststack) = a; /* 'a' is now there */ + + if (code > dm->code_limit) + /* oops, buffer overflow. Start a new buffer */ + code = data_new_buffer(code, dm); + + } + dm->code = code; +} + +static code_t* data_free_unused(code_t* code, struct dmove_s* dm, + vinfo_array_t* aa) +{ + /* decref any object that would be present in 'po' but not at all in + the snapshot. Note that it is uncommon that this function actually + finds any unused object at all. */ + int i = aa->count; + while (i--) + { + vinfo_t* a = aa->items[i]; + if (a != NULL) + { + if (has_rtref(a->source)) + { + PsycoObject* po = dm->po; + code_t* saved_code; + a->source = remove_rtref(a->source); + + saved_code = po->code; + po->code = code; + psyco_decref_rt(po, a); + code = po->code; + po->code = saved_code; + + if (code > dm->code_limit) + /* oops, buffer overflow. Start a new buffer */ + code = data_new_buffer(code, dm); + } + if (a->array != NullArray) + code = data_free_unused(code, dm, a->array); + } + } + return code; +} + +DEFINEFN +code_t* psyco_unify(PsycoObject* po, vcompatible_t* lastmatch, + CodeBufferObject** target) +{ + /* Update 'po' to match 'lastmatch', then jump to 'lastmatch'. */ + + struct dmove_s dm; + code_t* code = po->code; + CodeBufferObject* target_codebuf = lastmatch->matching; + int sdepth = get_stack_depth(&target_codebuf->snapshot); +#if PSYCO_DEBUG + bool has_ccreg = HAS_CCREG(po); +#endif + + extra_assert(lastmatch->diff == NullArray); /* unify with exact match only */ + psyco_assert_coherent(po); + dm.usages_size = sdepth + sizeof(vinfo_t**); + dm.usages = (char*) PyMem_MALLOC(dm.usages_size); + if (dm.usages == NULL) + OUT_OF_MEMORY(); + memset(dm.usages, 0, dm.usages_size); /* set to all NULL */ + fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, + (fz_find_fn) &data_original_table, + &dm, false); + + dm.po = po; + dm.original_stack_depth = po->stack_depth; + dm.code_origin = code; + dm.code_limit = po->codelimit == NULL ? code : po->codelimit; + dm.private_codebuf = NULL; + + if (sdepth > po->stack_depth) + { + /* more items in the target stack (uncommon case). + Let the stack grow. */ + STACK_CORRECTION(sdepth - po->stack_depth); + po->stack_depth = sdepth; + } + + /* update the stack */ + dm.code = code; + fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, + (fz_find_fn) &data_update_stack, + &dm, true); + code = dm.code; + + /* decref any object that would be present in 'po' but not at all in + the snapshot (data_update_stack() has removed the 'ref' tag of all + vinfo_ts it actually used from 'po') */ + code = data_free_unused(code, &dm, &po->vlocals); + + /* done */ + STACK_CORRECTION(sdepth - po->stack_depth); + if (code > dm.code_limit) /* start a new buffer if we wrote past the end */ + code = data_new_buffer(code, &dm); +#if PSYCO_DEBUG + extra_assert(has_ccreg == HAS_CCREG(po)); +#endif + JUMP_TO((code_t*) target_codebuf->codestart); + + /* start a new buffer if the last JUMP_TO overflowed, + but not if we had no room at all in the first place. */ + if (code > dm.code_limit && po->codelimit != NULL) + { + /* Note that the JMP instruction emitted by JUMP_TO() is + position-independent (a property of the vm) */ + code = data_new_buffer(code, &dm); + psyco_assert(code <= dm.code_limit); + } + + PyMem_FREE(dm.usages); + if (dm.private_codebuf == NULL) + { + Py_INCREF(target_codebuf); /* no new buffer created */ + *target = target_codebuf; + } + else + { + SHRINK_CODE_BUFFER(dm.private_codebuf, code, "unify"); + *target = dm.private_codebuf; + /* add a jump from the original code buffer to the new one */ + code = po->code; + JUMP_TO((code_t*) dm.private_codebuf->codestart); + dump_code_buffers(); + } + PsycoObject_Delete(po); + return code; +} diff --git a/nodeboxgl/ext/psyco/src/c/ivm/idispatcher.h b/nodeboxgl/ext/psyco/src/c/ivm/idispatcher.h new file mode 100644 index 0000000..c78c65c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/idispatcher.h @@ -0,0 +1,121 @@ + /***************************************************************/ +/*** Processor-specific routines for dispatcher.c ***/ + /***************************************************************/ + +#ifndef _IDISPATCHER_H +#define _IDISPATCHER_H + +#include "../vcompiler.h" +#include "../codegen.h" +#include "iencoding.h" +#include "ivm-insns.h" + +#define NEED_STACK_FRAME_HACK 0 + + +/***************************************************************/ + /*** Unification ***/ + +/* idispatcher.c implements psyco_unify(), + whose header is given in dispatcher.h. + Conversely, dispatcher.c implements the following function + which is declared here because it is really internal: */ +typedef void (*fz_find_fn) (vinfo_t* a, RunTimeSource bsource, void* extra); +EXTERNFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, + fz_find_fn callback, void* extra, bool clear); + + +/***************************************************************/ + /*** Promotion ***/ + +#define PROMOTION_FAST_COMMON_CASE 0 /* not implemented for ivm */ +#define INTERNAL_PROMOTION_FIELDS /* nothing */ + + +PSY_INLINE code_t* fix_fast_common_case(void* fs, long value, code_t* codeptr) +{ + return codeptr; +} + +PSY_INLINE void* ipromotion_finish(PsycoObject* po, vinfo_t* fix, void* do_promotion) +{ + return psyco_call_code_builder(po, do_promotion, 0, fix->source); +} + + +/***************************************************************/ + /*** Misc. ***/ + +PSY_INLINE void* conditional_jump_to(PsycoObject* po, code_t* target, + condition_code_t condition) +{ + /* no INSN_PUSHED() in this function! Otherwise, fix + detect_respawn() calls to track the new stack depth! */ + if (condition == CC_ALWAYS_FALSE) + return NULL; /* never jumps */ + else if (condition == CC_ALWAYS_TRUE) { + word_t* arg; + BEGIN_CODE + INSN_jumpfar(&arg); /* always jumps */ + END_CODE + *arg = (word_t) target; + return arg; + } + else { + word_t* arg; + /* the condition code should be resolved by the caller */ + extra_assert(!HAS_CCREG(po)); + BEGIN_CODE + INSN_normalize_cc(condition); + INSN_jcondfar(&arg); + code = META_dynamicfreq2(code); + END_CODE + *arg = (word_t) target; + return arg; + } +} + +PSY_INLINE void change_cond_jump_target(void* tag, code_t* newtarget) +{ + word_t* arg = (word_t*)tag; + *arg = (word_t) newtarget; +} + +PSY_INLINE code_t* resume_after_cond_jump(void* tag) +{ + word_t* arg = (word_t*)tag; + return (code_t*) (arg+1); +} + + +/* reserve a small buffer of code behind po->code in which conditional + code can be stored. That code should only be executed if 'condition'. */ +PSY_INLINE void* setup_conditional_code_bounds(PsycoObject* po, PsycoObject* po2, + condition_code_t condition) +{ + code_t* forward_distance_ptr; + extra_assert(!HAS_CCREG(po)); /* the conditions should be resolved */ + extra_assert(!HAS_CCREG(po2)); /* by the caller */ + BEGIN_CODE + INSN_normalize_cc(INVERT_CC(condition)); + INSN_jcondnear(&forward_distance_ptr); + po2->code = code; + po2->codelimit = code + 255; + END_CODE + return forward_distance_ptr; +} + +/* Backpatch the distance over which to skip the conditional code. */ +PSY_INLINE void make_code_conditional(PsycoObject* po, code_t* codeend, + condition_code_t condition, void* extra) +{ + code_t* forward_distance_ptr = (code_t*) extra; + code_t* code = codeend; + int distance = code - po->code; + po->code = insn_code_label(code); + extra_assert(0 <= distance && distance <= 255); + *forward_distance_ptr = (code_t) distance; +} + + +#endif /* _IDISPATCHER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/ivm/iencoding.c b/nodeboxgl/ext/psyco/src/c/ivm/iencoding.c new file mode 100644 index 0000000..04950a7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/iencoding.c @@ -0,0 +1,487 @@ +#include "iencoding.h" +#include "ivm-insns.h" +#include "../vcompiler.h" +#include "../dispatcher.h" +#include "../codegen.h" +#include "../codemanager.h" +#include "../Python/frames.h" + + +/* building run-time values meaning "the top of stack" */ +#define RunTime_TOS() RunTime_TOSF(false, false) +#define RunTime_TOSF(ref, nonneg) RunTime_NewStack(po->stack_depth, ref, nonneg) + +/* building run-time values meaning "the nth item in the stack", + where n=0 is the top */ +#define RunTime_STACK(n) RunTime_STACKF(n, false, false) +#define RunTime_STACKF(n, ref, nonneg) \ + RunTime_NewStack(po->stack_depth - (n)*sizeof(long), ref, nonneg) + + +DEFINEFN +void* psyco_call_code_builder(PsycoObject* po, void* fn, int restore, + RunTimeSource extraarg) +{ + word_t* arg; + code_t* code = po->code; + /* the INSN_cbuildX() instructions call the given function + and then jump to whatever address the function has returned. */ + if (extraarg != SOURCE_DUMMY) { + INSN_rt_push(extraarg); + INSN_cbuild2(&arg); + } + else { + INSN_cbuild1(&arg); + } + *arg = (word_t) fn; +#if PSYCO_DEBUG + /* add a zero to seperate code from data for ivmextract.py */ + *code++ = 0; +#endif + /* make 'fs' point just after the end of the code, aligned */ + ALIGN_NO_FILL(); + return code; +} + +DEFINEFN +vinfo_t* psyco_call_psyco(PsycoObject* po, CodeBufferObject* codebuf, + Source argsources[], int argcount, + struct stack_frame_info_s* finfo) +{ + word_t* arg; + int i, initial_depth; + Source* p; + BEGIN_CODE + NEED_CC(); /* 'flag' and 'retval' are a single shared register */ + + ABOUT_TO_CALL_SUBFUNCTION(finfo); + /* no stack push between the INSN_pyenter above and the INSN_vmcall + below, apart from function arguments! See iprocessor.c:impl_vmcall */ + initial_depth = po->stack_depth; + p = argsources; + for (i=argcount; i--; p++) { + INSN_rt_push(*p); INSNPUSHED(1); + } + INSN_vmcall(&arg); + *arg = (word_t) codebuf->codestart; + po->stack_depth = initial_depth; /* callee removes arguments */ + RETURNED_FROM_SUBFUNCTION(); + INSN_pushretval(); INSNPUSHED(1); + END_CODE + META_assertdepth(po->stack_depth); + return generic_call_check(po, CfReturnRef|CfPyErrIfNull, + bfunction_result(po, true)); +} + + +/***************************************************************/ + /*** Memory reads and writes ***/ + +static void mem_access(PsycoObject* po, vinfo_t* nv_ptr, + long offset, vinfo_t* rt_vindex, int size2) +{ + BEGIN_CODE + if (is_runtime(nv_ptr->source)) { + INSN_rt_push(nv_ptr->source); + if (offset) { + INSN_immed(offset); + INSN_add(); + } + } + else { + offset += CompileTime_Get(nv_ptr->source)->value; + INSN_immed(offset); + } + INSNPUSHED(1); + if (rt_vindex != NULL) { + INSN_rt_push(rt_vindex->source); + if (size2 > 0) { + INSN_immed(size2); + INSN_lshift(); + } + INSN_add(); + } + END_CODE +} + +DEFINEFN +vinfo_t* psyco_memory_read(PsycoObject* po, vinfo_t* nv_ptr, + long offset, vinfo_t* rt_vindex, + int size2, bool nonsigned) +{ + mem_access(po, nv_ptr, offset, rt_vindex, size2); + BEGIN_CODE + switch (size2) { + case 0: /* load 1 byte */ + if (nonsigned) + INSN_load1u(); + else + INSN_load1(); + break; + case 1: /* load 2 bytes */ + if (nonsigned) + INSN_load2u(); + else + INSN_load2(); + break; + default: /* load 4 bytes */ + INSN_load4(); + } + END_CODE + return vinfo_new(RunTime_TOS()); +} + +DEFINEFN +bool psyco_memory_write(PsycoObject* po, vinfo_t* nv_ptr, + long offset, vinfo_t* rt_vindex, + int size2, vinfo_t* value) +{ + if (!compute_vinfo(value, po)) return false; + mem_access(po, nv_ptr, offset, rt_vindex, size2); + BEGIN_CODE + INSN_nv_push(value->source); + switch (size2) { + case 0: /* store 1 byte */ + INSN_store1(); + break; + case 1: /* store 2 bytes */ + INSN_store2(); + break; + default: /* store 4 bytes */ + INSN_store4(); + } + INSNPOPPED(1); + END_CODE + return true; +} + + +/* internal, see NEED_CC() */ +EXTERNFN condition_code_t cc_from_vsource(Source source); /* in codegen.c */ + +DEFINEFN +code_t* psyco_compute_cc(PsycoObject* po, code_t* code) +{ + vinfo_t* vf; + vinfo_t* vnf; + INSN_flag_push(); + INSNPUSHED(1); + + vf = po->ccregs[INDEX_CC(CC_FLAG)]; + vnf = po->ccregs[INDEX_CC(CC_NOT_FLAG)]; + if (vf != NULL) { + extra_assert(cc_from_vsource(vf->source) == CC_FLAG); + vf->source = RunTime_TOSF(false, true); + po->ccregs[INDEX_CC(CC_FLAG)] = NULL; + } + if (vnf != NULL) { + extra_assert(cc_from_vsource(vnf->source) == CC_NOT_FLAG); + if (vf != NULL) { + INSN_rt_push(vf->source); + INSNPUSHED(1); + } + INSN_cmpz(); + INSN_flag_push(); + vnf->source = RunTime_TOSF(false, true); + po->ccregs[INDEX_CC(CC_NOT_FLAG)] = NULL; + } + return code; +} + +DEFINEFN +void psyco_inverted_cc(PsycoObject* po) +{ + vinfo_t* v[2]; + int i; + for (i=0; i<2; i++) { + v[i] = po->ccregs[i]; + } + for (i=0; i<2; i++) { + condition_code_t cc = (condition_code_t) i; + if (v[i] != NULL) { + extra_assert(cc_from_vsource(v[i]->source) == cc); + v[i]->source = psyco_source_condition(INVERT_CC(cc)); + } + po->ccregs[INDEX_CC(INVERT_CC(cc))] = v[i]; + } +} + + +/*****************************************************************/ + /*** Emit common instructions ***/ + +DEFINEFN +condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, + vinfo_t* v1, vinfo_t* v2) +{ + condition_code_t result = CC_FLAG; + vinfo_t* tmp; + BEGIN_CODE + NEED_CC(); + /* the only operation with have is '<', so exchange v1 and v2 as needed */ + switch (base_py_op & COMPARE_BASE_MASK) { + + case Py_NE: + result = CC_NOT_FLAG; /* fall through */ + case Py_EQ: + INSN_rt_push(v1->source); INSNPUSHED(1); + INSN_rt_push(v2->source); + INSN_cmpeq(); + goto done; + + case Py_LE: + result = CC_NOT_FLAG; /* fall through */ + case Py_GT: + tmp=v1; v1=v2; v2=tmp; + break; + case Py_GE: + result = CC_NOT_FLAG; + break; + default: + ; + } + INSN_rt_push(v1->source); INSNPUSHED(1); + INSN_rt_push(v2->source); + if (base_py_op & COMPARE_UNSIGNED) + INSN_cmpltu(); + else + INSN_cmplt(); + + done: + INSNPOPPED(1); + END_CODE + return result; +} + +DEFINEFN +vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, + long immed_true, long immed_false) +{ + bool swap; + extra_assert(cc == CC_FLAG || cc == CC_NOT_FLAG); + swap = (cc == CC_NOT_FLAG); + BEGIN_CODE + if (!HAS_CCREG(po)) { + INSN_flag_push(); + } + else { + vinfo_t* v = po->ccregs[1]; + if (v) { + swap = !swap; + } + else { + v = po->ccregs[0]; + extra_assert(v); + } + code = psyco_compute_cc(po, code); + INSN_rt_push(v->source); + } + if (swap) { + long tmp = immed_true; + immed_true = immed_false; + immed_false = tmp; + } + INSN_immed(-1); + INSN_add(); + INSN_immed(immed_false - immed_true); + INSN_and(); + INSN_immed(immed_true); + INSN_add(); + INSNPUSHED(1); + END_CODE + return vinfo_new(RunTime_TOSF(false, + immed_true >= 0 && immed_false >= 0)); +} + +#define DEFINE_BINARY_INSTRO(insn) \ + DEFINEFN vinfo_t* bininstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ + vinfo_t* v1, vinfo_t* v2) { \ + BEGIN_CODE \ + NEED_CC(); \ + INSN_nv_push(v1->source); INSNPUSHED(1); \ + INSN_nv_push(v2->source); \ + INSN_##insn##_o(); \ + if (!ovf) INSN_flag_forget(); \ + END_CODE \ + if (ovf && runtime_condition_f(po, CC_FLAG)) \ + return NULL; /* if overflow */ \ + return vinfo_new(RunTime_TOSF(false, nonneg)); \ + } + +#define DEFINE_UNARY_INSTRO(insn) \ + DEFINEFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ + vinfo_t* v1) { \ + BEGIN_CODE \ + NEED_CC(); \ + INSN_rt_push(v1->source); INSNPUSHED(1); \ + INSN_##insn##_o(); \ + if (!ovf) INSN_flag_forget(); \ + END_CODE \ + if (ovf && runtime_condition_f(po, CC_FLAG)) \ + return NULL; /* if overflow */ \ + return vinfo_new(RunTime_TOSF(false, nonneg)); \ + } + +#define DEFINE_BINARY_INSTR(insn) \ + DEFINEFN vinfo_t* bininstr##insn(PsycoObject* po, bool nonneg, \ + vinfo_t* v1, vinfo_t* v2) { \ + BEGIN_CODE \ + INSN_nv_push(v1->source); INSNPUSHED(1); \ + INSN_nv_push(v2->source); \ + INSN_##insn(); \ + END_CODE \ + return vinfo_new(RunTime_TOSF(false, nonneg)); \ + } + +#define DEFINE_UNARY_INSTR(insn) \ + DEFINEFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool nonneg, \ + vinfo_t* v1) { \ + BEGIN_CODE \ + INSN_rt_push(v1->source); INSNPUSHED(1); \ + INSN_##insn(); \ + END_CODE \ + return vinfo_new(RunTime_TOSF(false, nonneg)); \ + } + +DEFINE_BINARY_INSTRO(add) +DEFINE_BINARY_INSTR(or ) +DEFINE_BINARY_INSTR(and) +DEFINE_BINARY_INSTRO(sub) +DEFINE_BINARY_INSTR(xor) +DEFINE_BINARY_INSTRO(mul) +DEFINE_BINARY_INSTR(lshift) +DEFINE_BINARY_INSTR(rshift) +DEFINE_UNARY_INSTR(inv) +DEFINE_UNARY_INSTRO(neg) +DEFINE_UNARY_INSTRO(abs) + +DEFINEFN +vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, bool unsafe) +{ + BEGIN_CODE + INSN_rt_push(rt1->source); INSNPUSHED(1); + INSN_immed(value2); + INSN_add(); + END_CODE + return vinfo_new(RunTime_TOSF(false, unsafe && + value2>=0 && is_rtnonneg(rt1->source))); +} + +DEFINEFN +vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, bool ovf) +{ + BEGIN_CODE + NEED_CC(); + INSN_rt_push(v1->source); INSNPUSHED(1); + INSN_immed(value2); + INSN_mul_o(); + if (!ovf) INSN_flag_forget(); + END_CODE + if (ovf && runtime_condition_f(po, CC_FLAG)) + return NULL; + return vinfo_new(RunTime_TOSF(false, + ovf && value2>=0 && is_rtnonneg(v1->source))); +} + +#define GENERIC_SHIFT_BY(Insn, nonneg) \ + { \ + extra_assert(0 < counter && counter < LONG_BIT); \ + BEGIN_CODE \ + INSN_rt_push(v1->source); INSNPUSHED(1); \ + INSN_immed(counter); \ + Insn (); \ + END_CODE \ + return vinfo_new(RunTime_TOSF(false, nonneg)); \ + } + +DEFINEFN +vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter) + GENERIC_SHIFT_BY(INSN_lshift, false) + +DEFINEFN +vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter) + GENERIC_SHIFT_BY(INSN_rshift, is_nonneg(v1->source)) + +DEFINEFN +vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter) + GENERIC_SHIFT_BY(INSN_urshift, true) + +DEFINEFN +condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, + vinfo_t* rt1, long immed2) +{ + condition_code_t result = CC_FLAG; + BEGIN_CODE + NEED_CC(); + /* the only operation with have is '<', so exchange v1 and v2 as needed */ + switch (base_py_op & COMPARE_BASE_MASK) { + + case Py_NE: + result = CC_NOT_FLAG; /* fall through */ + case Py_EQ: + INSN_rt_push(rt1->source); + INSN_immed(immed2); + INSN_cmpeq(); + break; + + case Py_LE: + result = CC_NOT_FLAG; /* fall through */ + case Py_GT: + INSN_immed(immed2); INSNPUSHED(1); /* reversed arguments */ + INSN_rt_push(rt1->source); + if (base_py_op & COMPARE_UNSIGNED) + INSN_cmpltu(); + else + INSN_cmplt(); + INSNPOPPED(1); + break; + + case Py_GE: + result = CC_NOT_FLAG; /* fall through */ + default: + INSN_rt_push(rt1->source); + INSN_immed(immed2); + if (base_py_op & COMPARE_UNSIGNED) + INSN_cmpltu(); + else + INSN_cmplt(); + } + END_CODE + return result; +} + +DEFINEFN +vinfo_t* bfunction_result(PsycoObject* po, bool ref) +{ + return vinfo_new(RunTime_TOSF(ref, false)); +} + +/* DEFINEFN */ +/* vinfo_t* psyco_vinfo_condition(PsycoObject* po, condition_code_t cc) */ +/* { */ +/* Source src; */ +/* if ((int)cc < CC_TOTAL) */ +/* { */ +/* BEGIN_CODE */ +/* INSN_flag_push(); */ +/* if (cc == CC_NOT_FLAG) */ +/* INSN_not(); */ +/* INSNPUSHED(1); */ +/* END_CODE */ +/* src = RunTime_TOSF(false, true); */ +/* } */ +/* else */ +/* src = CompileTime_New(cc == CC_ALWAYS_TRUE); */ +/* return vinfo_new(src); */ +/* } */ + +DEFINEFN +vinfo_t* make_runtime_copy(PsycoObject* po, vinfo_t* v) +{ + if (!compute_vinfo(v, po)) return NULL; + BEGIN_CODE + INSN_nv_push(v->source); + INSNPUSHED(1); + END_CODE + return vinfo_new(RunTime_TOSF(false, is_nonneg(v->source))); +} diff --git a/nodeboxgl/ext/psyco/src/c/ivm/iencoding.h b/nodeboxgl/ext/psyco/src/c/ivm/iencoding.h new file mode 100644 index 0000000..c7dd79a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/iencoding.h @@ -0,0 +1,285 @@ + /***************************************************************/ +/*** Processor-specific code-producing macros ***/ + /***************************************************************/ + + +#ifndef _IENCODING_H +#define _IENCODING_H + + +#include "../psyco.h" +#define MACHINE_CODE_FORMAT "ivm" +#define HAVE_FP_FN_CALLS 0 + + +#define REG_TOTAL 0 /* the virtual machine has only a stack */ + +/* the condition code is stored in the 'flag' register. */ +typedef enum { + CC_FLAG = 0, + CC_NOT_FLAG = 1, +#define CC_TOTAL 2 + CC_ALWAYS_FALSE = 2, /* pseudo condition codes for known outcomes */ + CC_ALWAYS_TRUE = 3, + CC_ERROR = -1 } condition_code_t; + +#define INVERT_CC(cc) ((condition_code_t)((int)(cc) ^ 1)) +#define HAVE_CCREG 2 +#define INDEX_CC(cc) (extra_assert((cc) == CC_FLAG || (cc) == CC_NOT_FLAG), \ + (int)(cc)) +#define HAS_CCREG(po) ((po)->ccregs[0] != NULL || (po)->ccregs[1] != NULL) + +#if PSYCO_DEBUG +struct cc_s; +# define CC_FLAG ((struct cc_s*) CC_FLAG) +# define CC_NOT_FLAG ((struct cc_s*) CC_NOT_FLAG) +# define CC_ALWAYS_FALSE ((struct cc_s*) CC_ALWAYS_FALSE) +# define CC_ALWAYS_TRUE ((struct cc_s*) CC_ALWAYS_TRUE) +# define CC_ERROR ((struct cc_s*) CC_ERROR) +# define condition_code_t struct cc_s* +#endif + + +/* processor-depend part of PsycoObject */ +#define PROCESSOR_PSYCOOBJECT_FIELDS \ + int stack_depth; /* the size of data currently pushed in the stack */ \ + int minimal_stack_size; /* total stack size that we are sure about */ \ + vinfo_t* ccregs[2]; /* processor condition codes (aka flags) */ +#define INIT_PROCESSOR_PSYCOOBJECT(po) \ + ((po)->minimal_stack_size = VM_INITIAL_MINIMAL_STACK_SIZE) + +#define PROCESSOR_FROZENOBJECT_FIELDS \ + unsigned short minimal_extra_stack_words; /* ~= minimal_stack_size */ +#define SAVE_PROCESSOR_FROZENOBJECT(fpo, po) do { \ + int extra_stack_words = ((po)->minimal_stack_size - \ + (po)->stack_depth) / sizeof(long); \ + if (extra_stack_words < 0) \ + extra_stack_words = 0; \ + else if (extra_stack_words > 0xFFFF) \ + extra_stack_words = 0xFFFF; \ + (fpo)->minimal_extra_stack_words = extra_stack_words; \ +} while (0) +#define RESTORE_PROCESSOR_FROZENOBJECT(fpo, po) do { \ + (po)->minimal_stack_size = (po)->stack_depth + \ + (fpo)->minimal_extra_stack_words * sizeof(long); \ +} while (0) + +#define CHECK_STACK_SPACE() do { \ + if (po->stack_depth >= po->minimal_stack_size) { \ + BEGIN_CODE \ + INSN_stackgrow(); \ + END_CODE \ + po->minimal_stack_size = po->stack_depth + VM_EXTRA_STACK_SIZE; \ + } \ + META_assertdepth(po->stack_depth); \ +} while(0) + + +#define CURRENT_STACK_POSITION(rtsource) ( \ + (po->stack_depth - getstack(rtsource)) / sizeof(long)) + +/* release a run-time vinfo_t */ +/* #define RTVINFO_RELEASE(rtsource) do { \ */ +/* // pop an item off the stack only if it is close to the top \ */ +/* switch (CURRENT_STACK_POSITION(rtsource)) { \ */ +/* case 0: \ */ +/* INSN_pop(); INSN_POPPED(1); \ */ +/* break; \ */ +/* case 1: \ */ +/* INSN_pop2nd(); ??? \ */ +/* break; \ */ +/* default: \ */ +/* break; // not removed \ */ +/* } \ */ +/* } while (0) */ +#define RTVINFO_RELEASE(rtsource) do { /* nothing */ } while (0) + +/* move a run-time vinfo_t */ +#define RTVINFO_MOVE(rtsource, vtarget) do { /*nothing*/ } while (0) + +/* for PsycoObject_Duplicate() */ +#define DUPLICATE_PROCESSOR(result, po) do { \ + int i; \ + result->stack_depth = po->stack_depth; \ + result->minimal_stack_size = po->minimal_stack_size; \ + for (i=0; i<2; i++) \ + if (po->ccregs[i] != NULL) \ + result->ccregs[i] = po->ccregs[i]->tmp; \ +} while (0) + +#define RTVINFO_CHECK(po, vsource, found) do { /*nothing*/ } while (0) +#define RTVINFO_CHECKED(po, found) do { /*nothing*/ } while (0) + +#define ABOUT_TO_CALL_SUBFUNCTION(finfo) do { \ + word_t* _arg; \ + INSN_pyenter(&_arg); \ + *_arg = (word_t)(finfo); \ +} while (0) +#define RETURNED_FROM_SUBFUNCTION() do { \ + INSN_pyleave(); \ +} while (0) + + +/*****************************************************************/ + /*** Emit common instructions ***/ + +#define EXTERN_BINARY_INSTRO(insn) \ + EXTERNFN vinfo_t* bininstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ + vinfo_t* v1, vinfo_t* v2); +#define EXTERN_UNARY_INSTRO(insn) \ + EXTERNFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ + vinfo_t* v1); +#define EXTERN_BINARY_INSTR(insn) \ + EXTERNFN vinfo_t* bininstr##insn(PsycoObject* po, bool nonneg, \ + vinfo_t* v1, vinfo_t* v2); +#define EXTERN_UNARY_INSTR(insn) \ + EXTERNFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool nonneg, \ + vinfo_t* v1); + +EXTERN_BINARY_INSTRO(add) +EXTERN_BINARY_INSTR (or) +EXTERN_BINARY_INSTR (and) +EXTERN_BINARY_INSTRO(sub) +EXTERN_BINARY_INSTR (xor) +EXTERN_BINARY_INSTRO(mul) +EXTERN_BINARY_INSTR (lshift) +EXTERN_BINARY_INSTR (rshift) +EXTERN_UNARY_INSTR (inv) +EXTERN_UNARY_INSTRO (neg) +EXTERN_UNARY_INSTRO (abs) + +EXTERNFN condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, + vinfo_t* v1, vinfo_t* v2); +EXTERNFN vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, + long immed_true, long immed_false); + +#define BINARY_INSTR_ADD(ovf, nonneg) bininstradd(po, ovf, nonneg, v1, v2) +#define BINARY_INSTR_OR( ovf, nonneg) bininstror (po, nonneg, v1, v2) +#define BINARY_INSTR_AND(ovf, nonneg) bininstrand(po, nonneg, v1, v2) +#define BINARY_INSTR_SUB(ovf, nonneg) bininstrsub(po, ovf, nonneg, v1, v2) +#define BINARY_INSTR_XOR(ovf, nonneg) bininstrxor(po, nonneg, v1, v2) +#define BINARY_INSTR_MUL(ovf, nonneg) bininstrmul(po, ovf, nonneg, v1, v2) +#define BINARY_INSTR_LSHIFT( nonneg) bininstrlshift(po, nonneg, v1, v2) +#define BINARY_INSTR_RSHIFT( nonneg) bininstrrshift(po, nonneg, v1, v2) +#define BINARY_INSTR_CMP(base_py_op) bininstrcmp(po, base_py_op, v1, v2) +#define BINARY_INSTR_COND(cc, i1, i2) bininstrcond(po, cc, i1, i2) +#define UNARY_INSTR_INV(ovf, nonneg) unaryinstrinv(po, nonneg, v1) +#define UNARY_INSTR_NEG(ovf, nonneg) unaryinstrneg(po, ovf, nonneg, v1) +#define UNARY_INSTR_ABS(ovf, nonneg) unaryinstrabs(po, ovf, nonneg, v1) + +EXTERNFN vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, + bool unsafe); +EXTERNFN vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, + bool ovf); +EXTERNFN vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter); +EXTERNFN vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter); +EXTERNFN vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter); +EXTERNFN condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, + vinfo_t* rt1, long immed2); +EXTERNFN vinfo_t* bfunction_result(PsycoObject* po, bool ref); + +/***************************************************************/ + /*** some macro for code emission ***/ + +#define CHECK_NONZERO_FROM_RT(src, rcc) do { \ + NEED_CC(); \ + INSN_rt_push(src); \ + INSN_cmpz(); /* negative form, to normalize to 1 or 0 */ \ + rcc = CC_NOT_FLAG; \ +} while (0) + +#define NEED_CC() do { \ + if (HAS_CCREG(po)) \ + code = psyco_compute_cc(po, code); \ +} while (0) +/* internal */ +EXTERNFN code_t* psyco_compute_cc(PsycoObject* po, code_t* code); +EXTERNFN void psyco_inverted_cc(PsycoObject* po); + +#define SAVE_REGS_FN_CALLS(cc) do { if (cc) NEED_CC(); } while (0) + +#define TEMP_SAVE_REGS_FN_CALLS do { /* nothing */ } while (0) + +#define TEMP_RESTORE_REGS_FN_CALLS do { /* nothing */ } while (0) + +#define JUMP_TO(target) do { \ + word_t* _arg; \ + INSN_jumpfar(&_arg); \ + *_arg = (word_t) target; \ +} while (0) + +#define MAXIMUM_SIZE_OF_FAR_JUMP (sizeof(code_t)+sizeof(word_t)+sizeof(code_t)) + + +#define CALL_SET_ARG_IMMED(immed, arg_index, nb_args) do { \ + INSN_immed(immed); \ + INSNPUSHED(1); \ +} while (0) +#define CALL_SET_ARG_FROM_RT(source, arg_index, nb_args) do { \ + INSN_rt_push(source); \ + INSNPUSHED(1); \ +} while (0) +#define CALL_SET_ARG_FROM_ADDR(source, arg_index, nb_args) do { \ + INSN_ref_push(CURRENT_STACK_POSITION(source)); \ + INSNPUSHED(1); \ +} while (0) +#define CALL_C_FUNCTION(target, nb_args) do { \ + word_t* _arg; \ + switch (nb_args) { \ + case 0: INSN_ccall0(&_arg); break; \ + case 1: INSN_ccall1(&_arg); break; \ + case 2: INSN_ccall2(&_arg); break; \ + case 3: INSN_ccall3(&_arg); break; \ + case 4: INSN_ccall4(&_arg); break; \ + case 5: INSN_ccall5(&_arg); break; \ + case 6: INSN_ccall6(&_arg); break; \ + case 7: INSN_ccall7(&_arg); break; \ + default: psyco_fatal_msg("too many arguments to C function call"); \ + } \ + *_arg = (word_t)(target); \ + INSNPOPPED((nb_args)-1); /* can be -1, if nb_args is 0 */ \ +} while (0) + + +#define STACK_CORRECTION(stack_correction) do { \ + int _stackcorr = (int)(stack_correction); \ + if (_stackcorr < 0) \ + INSN_settos((-_stackcorr) / sizeof(long)); \ + else if (_stackcorr > 0) \ + INSN_pushn(_stackcorr / sizeof(long)); \ +} while (0) +/* Dummy stack alignment for non-MacOS X */ +#define CALL_STACK_ALIGN_DELTA(nbargs, delta) +#define CALL_STACK_ALIGN(nbargs) +#define CALL_STACK_ALIGN_RESTORE(delta) + +#define FUNCTION_RET(popbytes) do { \ + INSN_ret((popbytes) / sizeof(long) + 1); /* +1 for the retaddr itself */ \ +} while (0) + +#if defined(PSYCO_TRACE) +# error "This Trace not implemented for the ivm; use IVM_TRACE instead" +#endif + + +#define ALIGN_CODE_MASK (sizeof(long)-1) + +#define ALIGN_PAD_CODE_PTR() do { \ + code = (code_t*)((((long)code) + ALIGN_CODE_MASK) & ~ALIGN_CODE_MASK); \ +} while (0) + +#define ALIGN_WITH_BYTE(byte) do { \ + while (((long)code) & ALIGN_CODE_MASK) \ + *code++ = byte; \ +} while (0) + +#define ALIGN_WITH_NOP() do { /*nothing*/ } while (0) + +#if ALL_CHECKS +#define ALIGN_NO_FILL() ALIGN_WITH_BYTE(0xFF) /* debugging */ +#else +#define ALIGN_NO_FILL() ALIGN_PAD_CODE_PTR() +#endif + + +#endif /* _IENCODING_H */ diff --git a/nodeboxgl/ext/psyco/src/c/ivm/iinitialize.h b/nodeboxgl/ext/psyco/src/c/ivm/iinitialize.h new file mode 100644 index 0000000..ba5b55e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/iinitialize.h @@ -0,0 +1,20 @@ + /***************************************************************/ +/*** Automatically generated support file ***/ + /***************************************************************/ + + /* This file is automatically generated by 'files.py'. + DO NOT MODIFY. Changes will be overwritten ! */ + + + /* internal part for psyco.c */ +#if ALL_STATIC +# include "iprocessor.c" +# include "idispatcher.c" +# include "iencoding.c" +# include "ipyencoding.c" +# include "ivm-insns.c" +#else /* if !ALL_STATIC */ +#endif /* !ALL_STATIC */ + +PSY_INLINE void initialize_processor_files(void) { +} diff --git a/nodeboxgl/ext/psyco/src/c/ivm/iprocessor.c b/nodeboxgl/ext/psyco/src/c/ivm/iprocessor.c new file mode 100644 index 0000000..b68041b --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/iprocessor.c @@ -0,0 +1,476 @@ +#include "../processor.h" +#include "../codemanager.h" +#include "../cstruct.h" +#include "../blockalloc.h" +#include "../Python/frames.h" +#include "ivm-insns.h" + + +/* We distinguish between different types of interpreters: + * - the most compatible one is switch()-based + * - a GCC extension allows absolute threaded jumps + * - a more recent GCC extension allows relative threaded jumps + * (not sure that it is better than the previous one, though; + * will need some tests) + */ +#ifdef __GNUC__ +# define VM_THREADED_INTERPRETER 1 +# define VM_RELATIVE_JUMPS 0 /* XXX check if this is really better */ +//# define VM_RELATIVE_JUMPS (__GNUC__>3||(__GNUC__==3&&__GNUC_MINOR__>=2)) +#else +# define VM_THREADED_INTERPRETER 0 +#endif + + +/***************************************************************/ + /*** Stack of the virtual machine ***/ + +/* Note that the stack grows downwards. */ +/* See ivm-insns.h for customizable parameters. */ + +/* XXX loafy stack overflow checking ahead */ + +#define FINFO_STOP ((struct stack_frame_info_s*) 1) + +typedef struct vmstackframe_s vmstackframe_t; +struct vmstackframe_s { + struct stack_frame_info_s* finfo; /* describes the *called* (i.e. next + frame's) function (this is for + compatibility with the hacks needed + for real machine code */ + char* limit; + char* sp; /* stack pointer: limit<=sp<=origin */ + char* origin; + vmstackframe_t* prevframe; /* the previous frame */ + vmstackframe_t* nextframe; /* the next more recent frame */ +}; + +BLOCKALLOC_STATIC(vmstackframe, vmstackframe_t, 256) + +typedef struct { + PyCStruct_HEAD + vmstackframe_t* topframe; /* most recent stack frame */ +} PyVMStack; + +PSY_INLINE PyVMStack* vm_get_stack(PyObject* tdict) +{ + PyVMStack* st; + RECLIMIT_SAFE_ENTER(); + st = (PyVMStack*) PyDict_GetItem(tdict, Py_None); + if (st == NULL) { + st = PyCStruct_NEW(PyVMStack, NULL); + st->topframe = NULL; + if (PyDict_SetItem(tdict, Py_None, (PyObject*) st)) + OUT_OF_MEMORY(); + } + RECLIMIT_SAFE_LEAVE(); + return st; +} + + +/***************************************************************/ + /*** Virtual machine interpreter ***/ + +#define bytecode_nextopcode() (*nextip++) +#define bytecode_nx_code_t() (*nextip++) +#define bytecode_nx_word_t() (tmp = *(word_t*) nextip, \ + nextip += sizeof(word_t), \ + tmp) +#define bytecode_nx_char() ((char)(*nextip++)) +#define bytecode_next(T) (bytecode_nx_##T()) + +#define stack_nth(N) sp[N] +#define stack_shift(N) (sp += (N), \ + extra_assert((char*)sp >= frame->limit)) +#define stack_shift_pos(N) (sp += (N)) +#define stack_savesp() (frame->sp = (char*) sp) + +#define macro_args /* nothing */ +#define macro_noarg () /* macro call with no argument */ + +PSY_INLINE long abs_o(long a) { return a < 0 ? -a : a; } +#define ovf_checkabs_o(a) (a == LONG_MIN) +#define ovf_checkneg_o(a) (a == LONG_MIN) +#define ovf_checkadd_o(a, b) (((a+b)^a) < 0 && (a^b) >= 0) +#define ovf_checksub_o(a, b) (((a-b)^a) < 0 && ((a-b)^b) >= 0) +#define ovf_checkmul_o(a, b) psyco_int_mul_ovf(a, b) +#define ovf_check(INSN, ARGS) ovf_check##INSN ARGS + +#define impl_stackgrow(sz) if ((char*)sp - frame->limit < \ + (sz) + VM_STACK_SIZE_MARGIN) \ + sp = vm_stackgrow(frame, sp) +#define impl_jcond(test, newip) if (test) nextip = (code_t*) newip +#define impl_jump(newip) nextip = (code_t*) newip +typedef code_t* (*cbuild1_fn) (char*); +typedef code_t* (*cbuild2_fn) (char*, word_t extra); +#define impl_cbuild1(fn) stack_savesp(); \ + nextip = ((cbuild1_fn) fn) ( \ + (char*)((((long)nextip) + PSYCO_DEBUG + \ + ALIGN_CODE_MASK)&~ALIGN_CODE_MASK)) +#define impl_cbuild2(fn, extra) stack_savesp(); \ + nextip = ((cbuild2_fn) fn) ( \ + (char*)((((long)nextip) + PSYCO_DEBUG + \ + ALIGN_CODE_MASK)&~ALIGN_CODE_MASK), \ + extra) +#define impl_incref(o) Py_INCREF((PyObject*) o) +#define impl_decref(o) stack_savesp(); Py_DECREF((PyObject*) o) +#define impl_decrefnz(o) ((PyObject*) o)->ob_refcnt-- +/* implemented in pycompiler.c */ +EXTERNFN void cimpl_finalize_frame_locals(PyObject*, PyObject*, PyObject*); +#define impl_exitframe(tb, val, exc) stack_savesp(); \ + if (exc) cimpl_finalize_frame_locals( \ + (PyObject*) exc, \ + (PyObject*) val, \ + (PyObject*) tb) +#define impl_pyenter(finfo) frame = vm_pyenter(vmst, frame, finfo, sp) +#define impl_pyleave frame = vm_pyleave(vmst, frame, sp); \ + sp = (word_t*) frame->sp; +/* XXX hack! We abuse the fact that frame->sp is not completely in sync with + the local sp (this is the case for optimization purposes). When impl_vmcall() + is called, frame->sp still has the value it had at the last impl_pyenter() + (see iencoding.c:psyco_call_psyco()). */ +#define impl_vmcall(target) (tmp=(word_t) nextip, \ + nextip=(code_t*) target, \ + frame->origin = frame->sp, \ + tmp) +#define impl_ret(retaddr) if (retaddr == 0) { \ + return retval; \ + } else { \ + nextip = (code_t*) retaddr; \ + } +/* XXX divide the stack in separately-growable blocks across INSN_vmcall() */ +typedef word_t (*ccalled_fn_t_0) (void); +typedef word_t (*ccalled_fn_t_1) (word_t); +typedef word_t (*ccalled_fn_t_2) (word_t,word_t); +typedef word_t (*ccalled_fn_t_3) (word_t,word_t,word_t); +typedef word_t (*ccalled_fn_t_4) (word_t,word_t,word_t,word_t); +typedef word_t (*ccalled_fn_t_5) (word_t,word_t,word_t,word_t,word_t); +typedef word_t (*ccalled_fn_t_6) (word_t,word_t,word_t,word_t,word_t,word_t); +typedef word_t (*ccalled_fn_t_7) (word_t,word_t,word_t,word_t,word_t,word_t,word_t); +#define impl_ccall(nbargs, fn, args) (stack_savesp(), \ + (((ccalled_fn_t_##nbargs)(fn)) args)) +#define impl_checkdict(dict, key, result, index) ( \ + (unsigned)((PyDictObject*)dict)->ma_mask < (unsigned)index || \ + ((PyDictObject*)dict)->ma_table[index].me_key != (PyObject*)key || \ + ((PyDictObject*)dict)->ma_table[index].me_value != (PyObject*)result) +#define impl_dynamicfreq (((word_t*) nextip)[-1] ++) +#if PSYCO_DEBUG +# define impl_debug_check_flag(x) extra_assert(x == 0 || x == 1) +# define impl_debug_forget_flag(x) x = 0xABABABAB +#else +# define impl_debug_check_flag(x) /* nothing */ +# define impl_debug_forget_flag(x) /* nothing */ +#endif + +PSY_INLINE vmstackframe_t* vm_pyenter(PyVMStack* vmst, vmstackframe_t* frame, + word_t finfo, word_t* currentsp) +{ + vmstackframe_t* top = psyco_llalloc_vmstackframe(); + top->finfo = FINFO_STOP; + top->limit = frame->limit; + top->sp = frame->sp = (char*) currentsp; + top->origin = frame->origin; + top->prevframe = frame; + top->nextframe = NULL; + frame->finfo = (struct stack_frame_info_s*) finfo; + frame->nextframe = top; + vmst->topframe = top; + return top; +} +PSY_INLINE vmstackframe_t* vm_pyleave(PyVMStack* vmst, vmstackframe_t* top, + word_t* currentsp) +{ + vmstackframe_t* prevtop = top->prevframe; + prevtop->finfo = FINFO_STOP; + prevtop->nextframe = NULL; + + if (prevtop->limit != top->limit) { + /* only when leaving an non-inlined subfunction. + Then prevtop->sp already contains the equivalent + pointer to restore. This only works if the pyleave + instruction is immediately after vmcall, because + it assumes that the stack has the same depth as when + pyenter was called (which is false when pyleave is + used for an inlined subfunction). */ + PyMem_Free(top->limit); + } + else { + prevtop->sp = (char*) currentsp; + } + vmst->topframe = prevtop; + psyco_llfree_vmstackframe(top); + return prevtop; +} +static word_t* vm_stackgrow(vmstackframe_t* frame, word_t* currentsp) +{ + /* enlarge the stack of the topmost frame 'frame' + and all the previous frames which share exactly the same stack */ + vmstackframe_t* f; + char* currentlimit = frame->limit; + char* currentorigin = frame->origin; + char* newsp; + size_t cursize = currentorigin - (char*)currentsp; + size_t newsize = cursize + VM_EXTRA_STACK_SIZE+2*VM_STACK_SIZE_MARGIN-1; + newsize &= -VM_STACK_SIZE_MARGIN; + frame->limit = PyMem_Malloc(newsize); + if (frame->limit == NULL) + OUT_OF_MEMORY(); + frame->origin = frame->limit + newsize; + newsp = frame->origin - cursize; + memcpy(newsp, currentsp, cursize); + + for (f = frame->prevframe; + f != NULL && f->limit == currentlimit; + f = f->prevframe) { + if (f->origin == currentorigin) { + /* exactly the same stack, fix it too */ + f->limit = frame->limit; + f->origin = frame->origin; + f->sp = newsp; + } + else { + /* previous frame has a larger stack starting + from the same position, which means it is from + a parent function -- the child function's stack + is smaller because it does not contain everything + past the input arguments. In this case there is + no old stack to free because the old stack is + still in use. */ + return (word_t*) newsp; + } + } + /* free old stack */ + PyMem_Free(currentlimit); + return (word_t*) newsp; +} + +/* on register-limited architectures it may help a little bit + to force these local variables in registers, as the compiler + may think it would be better not to. */ + +#if defined(__GNUC__) && !PSYCO_DEBUG +# ifdef __i386__ +# define F_SPREG asm("esi") +# define F_NEXTIPREG asm("edi") +# endif +#endif + + +#ifndef F_ACCUMREG +# define F_ACCUMREG /* nothing */ +#endif +#ifndef F_SPREG +# define F_SPREG /* nothing */ +#endif +#ifndef F_NEXTIPREG +# define F_NEXTIPREG /* nothing */ +#endif + + +#define retval flag /* same ivm register */ + +static word_t vm_interpreter_main_loop(PyVMStack* vmst) +{ + /* virtual machine "registers" */ + register word_t accum F_ACCUMREG; /* 1st stack item, for optimization */ + register word_t* sp F_SPREG; /* stack pointer */ + register code_t* nextip F_NEXTIPREG; /* next instruction pointer */ + word_t flag; /* flags OR retval register */ + word_t tmp; + vmstackframe_t* frame = vmst->topframe; + + /* initialization */ + nextip = (code_t*) frame->limit; /* hack from psyco_processor_run() */ + sp = (word_t*) frame->sp; + accum = 0xCDCDCDCD; /* unused */ + flag = 0xCDCDCDCD; /* unused */ + + /* Let's loop! */ +# if VM_THREADED_INTERPRETER + { +# if VM_RELATIVE_JUMPS +# include "prolog/insns-threaded-rel.i" +# else +# include "prolog/insns-threaded.i" +# endif + } +# else + while (1) { + switch (bytecode_nextopcode()) { +# include "prolog/insns-switch.i" + default: + psyco_fatal_msg("invalid vm opcode"); + } + } +# endif +} + +#undef retval + + +/***************************************************************/ + /*** Virtual machine entry point ***/ + +#define VM_ENOUGH_STACK \ + (top->origin - top->limit >= (int)(4*sizeof(long)*argc + \ + VM_INITIAL_MINIMAL_STACK_SIZE + VM_STACK_SIZE_MARGIN)) + +DEFINEFN +PyObject* psyco_processor_run(CodeBufferObject* codebuf, + long initial_stack[], + struct stack_frame_info_s*** finfo, + PyObject* tdict) +{ + PyObject* result; + PyVMStack* vmst = vm_get_stack(tdict); + vmstackframe_t* prevtop = vmst->topframe; + vmstackframe_t* top = psyco_llalloc_vmstackframe(); + *finfo = &top->finfo; + top->finfo = FINFO_STOP; + top->prevframe = prevtop; + top->nextframe = NULL; + if (prevtop) { + top->limit = prevtop->limit; + top->origin = prevtop->sp; /* start using the stack from + the prevtop's current sp */ + } + else { + top->limit = NULL; + top->origin = NULL; + } + + /* to store the incoming arguments on the stack, + the "cleanest" solution seems to be to build a temporary + pseudo-code. The not-so-clean hack is to abuse the stack + to write this code. */ + { + int argc = RUN_ARGC(codebuf); + word_t* arg; + code_t* code; + + if (!VM_ENOUGH_STACK) { + top->limit = PyMem_Malloc(VM_STACK_BLOCK); + if (!top->limit) + OUT_OF_MEMORY(); + top->origin = top->limit + VM_STACK_BLOCK; + extra_assert(VM_ENOUGH_STACK); + } + top->sp = top->origin; + + code = (code_t*) top->limit; + INIT_CODE_EMISSION(code); + while (argc) { /* incoming arguments */ + long argvalue = initial_stack[--argc]; + INSN_immed(argvalue); + } + INSN_immed(0); /* return address. Special value 0 means + "leave the interpreter main loop" */ + INSN_jumpfar(&arg); + *arg = (word_t) codebuf->codestart; + } + + vmst->topframe = top; + result = (PyObject*) vm_interpreter_main_loop(vmst); + vmst->topframe = prevtop; + + /* restore the stack */ + if (prevtop == NULL || top->limit != prevtop->limit) { + PyMem_Free(top->limit); + } + psyco_llfree_vmstackframe(top); + return result; +} + + +/***************************************************************/ + /*** Misc ***/ + +static struct stack_frame_info_s* finfo_stop = FINFO_STOP; + +DEFINEFN struct stack_frame_info_s** +psyco_next_stack_frame(struct stack_frame_info_s** finfo) +{ + vmstackframe_t* frame = (vmstackframe_t*) finfo; + extra_assert(finfo == &frame->finfo); + if (frame->nextframe == NULL) + return &finfo_stop; + else + return &frame->nextframe->finfo; +} + +/* check for signed integer multiplication overflow */ +/* code shamelessly ripped off Python's intobject.c */ +static char python_style_mul_ovf(long a, long b) +{ + long longprod; /* a*b in native long arithmetic */ + double doubled_longprod; /* (double)longprod */ + double doubleprod; /* (double)a * (double)b */ + + longprod = a * b; + doubleprod = (double)a * (double)b; + doubled_longprod = (double)longprod; + + /* Fast path for normal case: small multiplicands, and no info + is lost in either method. */ + if (doubled_longprod == doubleprod) + return false; /* no overflow */ + + /* Somebody somewhere lost info. Close enough, or way off? Note + that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0). + The difference either is or isn't significant compared to the + true value (of which doubleprod is a good approximation). + */ + { + const double diff = doubled_longprod - doubleprod; + const double absdiff = diff >= 0.0 ? diff : -diff; + const double absprod = doubleprod >= 0.0 ? doubleprod : + -doubleprod; + /* absdiff/absprod <= 1/32 iff + 32 * absdiff <= absprod -- 5 good bits is "close enough" */ + return !(32.0 * absdiff <= absprod); + } +} + +DEFINEVAR char (*psyco_int_mul_ovf) (long a, long b) = &python_style_mul_ovf; + + +/* don't look */ +static long hacky_call_var(void* c_func, int argcount, long arguments[]) +{ + switch (argcount) { + case 0: return ((ccalled_fn_t_0) c_func) (); + case 1: return ((ccalled_fn_t_1) c_func) (arguments[0]); + case 2: return ((ccalled_fn_t_2) c_func) (arguments[0], + arguments[1]); + case 3: return ((ccalled_fn_t_3) c_func) (arguments[0], + arguments[1], + arguments[2]); + case 4: return ((ccalled_fn_t_4) c_func) (arguments[0], + arguments[1], + arguments[2], + arguments[3]); + case 5: return ((ccalled_fn_t_5) c_func) (arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4]); + case 6: return ((ccalled_fn_t_6) c_func) (arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4], + arguments[5]); + case 7: return ((ccalled_fn_t_7) c_func) (arguments[0], + arguments[1], + arguments[2], + arguments[3], + arguments[4], + arguments[5], + arguments[6]); + default: psyco_fatal_msg("too many arguments to C function call"); + } + return 0; +} + +DEFINEVAR long (*psyco_call_var) (void* c_func, int argcount, long arguments[]) = + &hacky_call_var; diff --git a/nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.c b/nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.c new file mode 100644 index 0000000..8cbef75 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.c @@ -0,0 +1,20 @@ +#include "ipyencoding.h" +#include "../pycodegen.h" + + +DEFINEFN +void decref_create_new_ref(PsycoObject* po, vinfo_t* w) +{ + psyco_incref_nv(po, w); +} + +DEFINEFN +bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w) +{ + bool could_eat = eat_reference(w); + if (!could_eat) { + /* in this case we must Py_INCREF() the object */ + psyco_incref_nv(po, w); + } + return could_eat; +} diff --git a/nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.h b/nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.h new file mode 100644 index 0000000..014f9a7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/ipyencoding.h @@ -0,0 +1,117 @@ + /***************************************************************/ +/*** Processor- and language-dependent code producers ***/ + /***************************************************************/ + +#ifndef _IPYENCODING_H +#define _IPYENCODING_H + +#include "iencoding.h" +#include "ivm-insns.h" + +/* See comments in i386/ipyencoding.h about these functions */ + +PSY_INLINE void* dictitem_check_change(PsycoObject* po, + PyDictObject* dict, PyDictEntry* ep) +{ + int index = ep - dict->ma_table; + PyObject* key = ep->me_key; + PyObject* result = ep->me_value; + word_t* arg1; + word_t* arg2; + word_t* arg3; + word_t* arg4; + + Py_INCREF(key); /* XXX these become immortal */ + Py_INCREF(result); /* XXX */ + BEGIN_CODE + NEED_CC(); + /* this special instruction quickly checks that the same + object is still in place in the dictionary */ + INSN_checkdict(&arg1, &arg2, &arg3, &arg4); + *arg1 = (word_t) dict; + *arg2 = (word_t) key; + *arg3 = (word_t) result; + *arg4 = index; + END_CODE + return arg4; +} + +#define DICT_ITEM_CHECK_CC CC_FLAG + +PSY_INLINE void dictitem_update_nochange(void* originalmacrocode, + PyDictObject* dict, PyDictEntry* new_ep) +{ + int index = new_ep - dict->ma_table; + word_t* arg5 = (word_t*) originalmacrocode; + *arg5 = index; +} + +PSY_INLINE void psyco_incref_nv(PsycoObject* po, vinfo_t* v) +{ + BEGIN_CODE + INSN_nv_push(v->source); + INSN_incref(); + END_CODE +} + +PSY_INLINE void psyco_incref_rt(PsycoObject* po, vinfo_t* v) +{ + BEGIN_CODE + INSN_rt_push(v->source); + INSN_incref(); + END_CODE +} + +PSY_INLINE void psyco_decref_rt(PsycoObject* po, vinfo_t* v) +{ + BEGIN_CODE + INSN_rt_push(v->source); + INSN_decref(); + END_CODE +} + +PSY_INLINE void psyco_decref_c(PsycoObject* po, PyObject* o) +{ + word_t* arg; + BEGIN_CODE + INSN_decrefnz(&arg); + *arg = (word_t) o; + END_CODE +} + +EXTERNFN void decref_create_new_ref(PsycoObject* po, vinfo_t* w); +EXTERNFN bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w); + + +/* called by psyco_emit_header() */ +#define INITIALIZE_FRAME_LOCALS(nframelocal) do { \ + STACK_CORRECTION(sizeof(long)*((nframelocal)-1)); \ + INSN_immed(0); /* f_exc_type, initially NULL */ \ +} while (0) + +/* called by psyco_finish_return() */ +#define WRITE_FRAME_EPILOGUE(retval, nframelocal) do { \ + /* load the return value into the dedicated 'retval' register */ \ + /* which actually shares with 'flag' */ \ + if (retval != SOURCE_DUMMY) { \ + if (is_runtime(retval) && getstack(retval) == po->stack_depth) \ + INSNPOPPED(1); \ + else \ + INSN_nv_push(retval); \ + INSN_retval(); \ + } \ + if (nframelocal > 0) \ + { \ + /* psyco_emit_header() was used; first clear the stack only up to and not \ + including the frame-local data */ \ + int framelocpos = getstack(LOC_CONTINUATION->array->items[0]->source); \ + STACK_CORRECTION(framelocpos - po->stack_depth); \ + po->stack_depth = framelocpos; \ + \ + /* perform Python-specific cleanup */ \ + INSN_exitframe(); \ + INSNPOPPED(3); \ + } \ +} while (0) + +#endif /* _IPYENCODING_H */ diff --git a/nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.c b/nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.c new file mode 100644 index 0000000..f194888 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.c @@ -0,0 +1,20 @@ +#include "ivm-insns.h" + + +#define setlatestopcode(opcode) (*code = (opcode)) +#define INSN_EMIT_opcode(opcode) (*code++ = (opcode)) +#define INSN_EMIT_modified_opcode(opcode, totalargs) \ + (code[-((int)(totalargs))-1] = (opcode)) + +#define bytecode_size(T) sizeof(T) +#define INSN_EMIT_void(arg) do { /*nothing*/ } while (0) +#define INSN_EMIT_byte(arg) (*code++ = (code_t)(arg)) +#define INSN_EMIT_char(arg) (*code++ = (code_t)(arg)) +#define INSN_EMIT_int(arg) (*(int*)code = (int)(arg), code += sizeof(int)) +#define INSN_EMIT_word_t(arg) (*(word_t*)code=(word_t)(arg),code+=sizeof(word_t)) +#define INSN_EMIT_placeholder_byte(ppbyte) (*(ppbyte)=code++) +#define INSN_EMIT_placeholder_long(ppword) (*(ppword)=(word_t*)code, \ + code+=sizeof(word_t)) + + +#include "prolog/insns-igen.i" diff --git a/nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.h b/nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.h new file mode 100644 index 0000000..5d3001e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/ivm-insns.h @@ -0,0 +1,111 @@ + /***************************************************************/ +/*** Link to the Prolog-generated instruction producers ***/ + /***************************************************************/ + +#ifndef _IVMINSNS_H +#define _IVMINSNS_H + +#include "../vcompiler.h" + +#ifndef META_ASSERT_DEPTH +# define META_ASSERT_DEPTH 0 +#endif + +#ifndef VM_STRESS_STACK +# define VM_STRESS_STACK 0 +#endif + +/* Some tunable run-time virtual machine parameters. + Keep in mind that each thread has its own VM stack. */ +#if !VM_STRESS_STACK +# define VM_INITIAL_MINIMAL_STACK_SIZE 4096 +# define VM_EXTRA_STACK_SIZE 8192 +# define VM_STACK_SIZE_MARGIN 2048 /* power of 2 */ +# define VM_STACK_BLOCK 16384 +#else +# define VM_INITIAL_MINIMAL_STACK_SIZE 512 +# define VM_EXTRA_STACK_SIZE 512 +# define VM_STACK_SIZE_MARGIN 1024 /* power of 2 */ +# define VM_STACK_BLOCK 2048 +#endif + + +/* The virtual machine uses opcode compression: some sequences of opcodes + can be compressed into a single opcode which expects all the arguments of + the individual opcodes. A single, slightly more complicated opcode is + typically much faster to interpret than several simpler opcodes. + + Each INSN_xxx() macro detects if the most recently generated opcode can + be combined with the new one. For this purpose, we store an extra byte + at '*code' which is the most recently emitted opcode. In other words, + 'code' points (as normally) just past the most recently written byte of + the vm bytecode, but during code generation this bytecode is immediately + following by an extra byte which is a copy of the most recently emitted + opcode instruction. + (This is necessary: the most recent opcode instruction starts just a few + bytes before '*code', but we don't know how many exactly -- it depends on + the number of arguments.) +*/ + +#define LATEST_OPCODE (extra_assert(*code <= LAST_DEFINED_OPCODE), *code) +#define INIT_CODE_EMISSION(code) (*(code) = 0) +#define POST_CODEBUFFER_SIZE 1 /* byte for the LATEST_OPCODE */ +#define INSN_EMIT_macro_opcode(opcode) (*code++ = (opcode), \ + *code = (opcode)) + +typedef long word_t; + +#include "prolog/insns-igen-h.i" + + +/* stack handling */ +#define INSNPOPPED(N) (po->stack_depth -= (N)*sizeof(long)) +#define INSNPUSHED(N) (po->stack_depth += (N)*sizeof(long)) + +/* meta-instructions */ +#if CODE_DUMP +PSY_INLINE code_t* META_dynamicfreq2(code_t* code) { + word_t* arg; + INSN_dynamicfreq(&arg); + *arg = 0; + return code; +} +# define INSN_label_marker() (code = META_dynamicfreq2(code)) +#else +# define META_dynamicfreq2(code) code +# define INSN_label_marker() (void)0 /* nothing */ +#endif + +#define INSN_nv_push(nvsource) do { \ + if (is_compiletime(nvsource)) \ + INSN_immed(CompileTime_Get(nvsource)->value); \ + else \ + INSN_rt_push(nvsource); \ +} while (0) + +#define INSN_rt_push(rtsource) INSN_s_push(CURRENT_STACK_POSITION(rtsource)) +#define INSN_rt_pop(rtsource) INSN_s_pop(CURRENT_STACK_POSITION(rtsource)) +#define INSN_normalize_cc(cc) do { \ + if ((cc) == CC_NOT_FLAG) { \ + INSN_flag_push(); \ + INSN_cmpz(); \ + if (HAS_CCREG(po)) psyco_inverted_cc(po); \ + } \ +} while (0) + +#if META_ASSERT_DEPTH +# define META_assertdepth(x) BEGIN_CODE INSN_assertdepth(x); END_CODE +#else +# define META_assertdepth(x) /* nothing */ +#endif + + +PSY_INLINE code_t* insn_code_label(void* code1) +{ + code_t* code = (code_t*) code1; + INSN_label_marker(); + INIT_CODE_EMISSION(code); + return code; +} + +#endif /* _IVMINSNS_H */ diff --git a/nodeboxgl/ext/psyco/src/c/ivm/localsetup.py b/nodeboxgl/ext/psyco/src/c/ivm/localsetup.py new file mode 100644 index 0000000..555f8f7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/localsetup.py @@ -0,0 +1,20 @@ +import os + +dir = os.path.join(os.path.dirname(__file__), 'prolog') +for filename in os.listdir(dir): + if filename.lower().endswith('.default'): + basename = os.path.join(dir, filename[:-8]) + filename = os.path.join(dir, filename) + if not os.path.exists(basename): + copy = 2 + else: + try: + copy = os.stat(filename).st_mtime > os.stat(basename).st_mtime + except OSError: + copy = 0 + if copy: + print 'Copying', filename, '->', basename + if copy != 2: + print '(OVERRIDING the older file)' + import shutil + shutil.copy(filename, basename) diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/Makefile b/nodeboxgl/ext/psyco/src/c/ivm/prolog/Makefile new file mode 100644 index 0000000..e447026 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/Makefile @@ -0,0 +1,57 @@ +#################################################################### +## ## +## SWI-Prolog Virtual Machine Generator ## +## ## +#################################################################### + +# +# To run this you will need SWI-Prolog. +# http://www.swi-prolog.org/ +# + +VMWRITER = vm.pl vmwriter.pl utils.pl ccode.pl detcheck.pl mode_combine.pl +GENERATED = insns-switch.i insns-threaded.i insns-igen.i insns-igen-h.i \ + insns-table.py +# insns-threaded-rel.i +TEMP = optimize.tmp + + +all: $(GENERATED) + +clean: + rm -f $(GENERATED) $(TEMP) + +default: $(addsuffix .default,$(GENERATED) mode_combine.pl) + +minimal: empty_mode_combine all + +empty_mode_combine: + echo > mode_combine.pl + + +$(GENERATED): insns.pl $(VMWRITER) + pl -f insns.pl -g main_emit -t halt + +%.default: % + cp $< $@ + +#%-switch.i: %.pl $(VMWRITER) +# pl -f $< -g "main_emit(modes, switch)" -t halt > $@ +# +#%-threaded-rel.i: %.pl $(VMWRITER) +# pl -f $< -g "main_emit(modes, threaded(relative))" -t halt > $@ +# +#%-threaded.i: %.pl $(VMWRITER) +# pl -f $< -g "main_emit(modes, threaded(absolute))" -t halt > $@ +# +#%-immed.i: %.pl $(VMWRITER) +# pl -f $< -g "main_emit(modes, single([immed(int)]))" -t halt > $@ +# +#%-igen.i: %.pl $(VMWRITER) +# pl -f $< -g "main_emit(insns, functions('DEFINEFN '))" -t halt > $@ +# +#%-igen-h.i: %.pl $(VMWRITER) +# pl -f $< -g "main_emit(insns, headers('EXTERNFN '))" -t halt > $@ +# +#%-table.py: %.pl $(VMWRITER) +# pl -f $< -g "main_emit(pytable)" -t halt > $@ diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/ccode.pl b/nodeboxgl/ext/psyco/src/c/ivm/prolog/ccode.pl new file mode 100644 index 0000000..5cf54b5 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/ccode.pl @@ -0,0 +1,274 @@ +:- consult(utils). +:- multifile goal_to_C/2, unary_prolog_to_C/2, binary_prolog_to_C/2. + + +unary_prolog_to_C(not, '!'). +unary_prolog_to_C(inv, '~'). +unary_prolog_to_C('-', '-'). +unary_prolog_to_C(addr, '(word_t) &'). +unary_prolog_to_C(unsigned, '(unsigned)'). +unary_prolog_to_C(mem1, '*(char*)'). +unary_prolog_to_C(mem1u, '*(unsigned char*)'). +unary_prolog_to_C(mem2, '*(short*)'). +unary_prolog_to_C(mem2u, '*(unsigned short*)'). +unary_prolog_to_C(mem4, '*(long*)'). +unary_prolog_to_C(cast1, '(char)'). +unary_prolog_to_C(cast2, '(short)'). + +binary_prolog_to_C('=', '='). +binary_prolog_to_C('=<', '<='). +binary_prolog_to_C('<', '<'). +binary_prolog_to_C('>=', '>='). +binary_prolog_to_C('>', '>'). +binary_prolog_to_C('=:=', '=='). +binary_prolog_to_C('=/=', '!='). +binary_prolog_to_C('>>', '>>'). +binary_prolog_to_C('<<', '<<'). +binary_prolog_to_C(or, '|'). +binary_prolog_to_C(and, '&'). +binary_prolog_to_C(xor, '^'). +binary_prolog_to_C(',', '&&'). + +goal_to_C(fail, '0'). +goal_to_C(true, '1'). +goal_to_C(c_unary(COp, X), Code) :- + goal_to_C(X, XCode), + concat_atom(['(', COp, XCode, ')'], Code). +goal_to_C(c_binary(COp, X, Y), Code) :- + goal_to_C(X, XCode1), + goal_to_C(Y, YCode1), + (COp = '=' -> + remove_paren(XCode1, XCode), + remove_paren(YCode1, YCode) + ; + XCode1 = XCode, + YCode1 = YCode + ), + concat_atom(['(', XCode, ' ', COp, ' ', YCode, ')'], Code). + +goal_to_C(Term, Code) :- + Term =.. [PrologOp, Arg1, Arg2], + binary_prolog_to_C(PrologOp, COp), + goal_to_C(c_binary(COp, Arg1, Arg2), Code). +goal_to_C(Term, Code) :- + Term =.. [PrologOp, Arg1], + unary_prolog_to_C(PrologOp, COp), + goal_to_C(c_unary(COp, Arg1), Code). +goal_to_C(Term, Code) :- + Term =.. [Code]. +goal_to_C(Term, Code) :- + Term =.. [Functor | Args], + maplist(goal_to_C, Args, ArgsCode), + NewTerm =.. [Functor | ArgsCode], + sformat(SCode, '~w', [NewTerm]), + string_to_atom(SCode, Code). + +%goal_to_C([], ''). +%goal_to_C([H|T], Code) :- +% goal_to_C(H, Code1), +% goal_to_C(T, Code2), +% concat_atom([Code1, ';\n', Code2], Code). + +remove_paren(Inp, Outp) :- + sub_atom(Inp, 0, _, _, '('), + sub_atom(Inp, _, _, 0, ')'), + sub_atom(Inp, 1, _, 1, Outp), + !. +remove_paren(C, C). + +% C structures +declare_local(Type, (V, Index), var(Type, V)) :- + int_to_atom(Index, Suffix), + atom_concat(local, Suffix, V). + +block_locals(CodeL1, Type, block(DeclList, CodeL1)) :- + free_variables(CodeL1, FreeVars), + enumerate_list(FreeVars, NumberedFreeVars, 1, _), + maplist(declare_local(Type), NumberedFreeVars, DeclList). + +% C code emission +write_codelist([], _, _). +write_codelist([C1], _, EndSep) :- + write_code(C1), + write(EndSep). +write_codelist([C1, C2 | Tail], MiddleSep, EndSep) :- + write_code(C1), + write(MiddleSep), + write_codelist([C2 | Tail], MiddleSep, EndSep). + +arg_name_only(var(_, V), var(V)). + +write_code1(var(V)) :- + write(V). + +write_code1(var(Type, V)) :- + write(Type), write(' '), write(V). + +write_code1(var(Type, V, Init)) :- + write(Type), write(' '), write(V), write(' = '), + write_code(Init). + +write_code1(function_header(Name, RetType, ArgList)) :- + write(RetType), write(' '), + write(Name), write('('), + (ArgList = [] -> + write(void) + ; + write_codelist(ArgList, ', ', '') + ), + write(')'). + +write_code1(macro_call(Name, ArgList)) :- + write(Name), write('('), + maplist(arg_name_only, ArgList, ArgList1), + write_codelist(ArgList1, ', ', ''), + write(')'). + +write_code1(function_def(Name, RetType, ArgList, Body)) :- + write_code(function_header(Name, RetType, ArgList)), + nl, + write_codestmt(Body). + +write_code1(error(Descr)) :- + write('psyco_fatal_msg("'), + write(Descr), + write('");\nreturn NULL'). + +write_code1(comment(Descr)) :- + write('/* '), + write(Descr), + write(' */'). + +write_code1(emit(Type, Value)) :- + write('INSN_EMIT_'), + write(Type), + write('('), + write(Value), + write(')'). + +write_code1(emit(Type, Value, Extra)) :- + write('INSN_EMIT_'), + write(Type), + write('('), + write(Value), + write(', '), + write(Extra), + write(')'). + +write_code1(Expr) :- + goal_to_C(Expr, Code), + remove_paren(Code, Code1), + write(Code1). + +:- det(write_code/1). +write_code(Code) :- + write_code1(Code), + !. + +write_codestmt1([]). +write_codestmt1([H|T]) :- + write_codestmt(H), + write_codestmt(T). + +write_codestmt1(block(DeclList, CodeList)) :- + write('{\n'), + write_codelist(DeclList, ';\n', ';\n'), + write_codestmt(CodeList), + write('}\n'). + +write_codestmt1(block_locals(Type, CodeList)) :- + block_locals(CodeList, Type, Outp), + write_codestmt(Outp). + +write_codestmt1(ift(Cond, Then)) :- + write('if ('), + write_code(Cond), + write(') '), + write_codeblock(Then). + +write_codestmt1(ifte(Cond, Then, Else)) :- + write('if ('), + write_code(Cond), + write(') '), + write_codeblock(Then), + write('else '), + write_codeblock(Else). + +write_codestmt1(switch(Expr, Body)) :- + write('switch ('), + write_code(Expr), + write(') {\n'), + write_codestmt(Body), + write('} /* switch */\n'). + +write_codestmt1(case(Expr, Body)) :- + write('case '), + write_code(Expr), + write(':\n'), + write_codeblock(Body). + +write_codestmt1(comment(Descr)) :- + write('/* '), + write(Descr), + write(' */\n'). + +write_codestmt1(Expr) :- + write_code(Expr), + write(';\n'). + +:- det(write_codestmt/1). +write_codestmt(Code) :- + write_codestmt1(Code), + !. + +write_codeblock(Block) :- + write_codestmt(block([], Block)). + +code_simplify1([], []). +code_simplify1([Code1], Code2) :- + code_simplify1(Code1, Code2). +code_simplify1([H1|T1], Code2) :- + code_simplify1(H1, H2), + code_simplify1(T1, T2), + (H2 = [] -> Code2 = T2 ; + (T2 = [] -> Code2 = H2 ; + Code2 = [H2|T2])). + +code_simplify1(block([], block(Decl1, Body1)), Code2) :- + code_simplify1(block(Decl1, Body1), Code2). +code_simplify1(block(Decl, Stmt1), block(Decl, Stmt2)) :- + code_simplify1(Stmt1, Stmt2). + +code_simplify1(ift(true, Then), Code2) :- + code_simplify1(Then, Code2). +code_simplify1(ift(fail, _), []). + +code_simplify1(ifte(true, Then, _), Code2) :- + code_simplify1(Then, Code2). +code_simplify1(ifte(fail, _, Else), Code2) :- + code_simplify1(Else, Code2). + +code_simplify1(switch(_, []), []). +code_simplify1(switch(Expr, Body1), switch(Expr, Body2)) :- + code_simplify1(Body1, Body2). + +code_simplify1(case(Expr, Body1), case(Expr, Body2)) :- + code_simplify1(Body1, Body2). + +code_simplify1(Code, Code). + +:- det(code_simplify/1). +code_simplify(Code1, Code2) :- + code_simplify1(Code1, Code2), + !. + + +trivial_c_arg(Term) :- var(Term). +trivial_c_arg(Term) :- Term =.. [_]. + +trivial_c_op(X=Y) :- trivial_c_arg(X), trivial_c_arg(Y). +trivial_c_op(extra_assert(_)). + +codecost(block_locals(_, L), Cost) :- + closelist(L, FlatL), + countsuccesses((member(X, FlatL), \+trivial_c_op(X)), Cost). diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/detcheck.pl b/nodeboxgl/ext/psyco/src/c/ivm/prolog/detcheck.pl new file mode 100644 index 0000000..4cd4bd2 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/detcheck.pl @@ -0,0 +1,37 @@ +:- dynamic detchecked/1, detdebug/0. + +det(Functor/Arity) :- + ignore(retract(detchecked(Functor/Arity))), + assert(detchecked(Functor/Arity)), + length(Args, Arity), + Head =.. [Functor | Args], + atom_concat('__detcheck$', Functor, MangledFunctor), + MangledHead =.. [MangledFunctor | Args], + ignore(retract(Head :- _)), + assert(Head :- ((detdebug -> writeq(Head), nl ; true), MangledHead, ! ; + deterror(Head))). + +deterror(Head) :- + user_error('*** Predicate call should not have failed:', Head). + +user_error(Msg, Object) :- + tell(user_error), + nl, + write(Msg), + nl, + write_term(Object, [quoted(true), max_depth(8)]), + nl, + throw(user_error). + + +term_expansion(Head :- Body, MangledHead :- Body) :- + !, + term_expansion(Head, MangledHead). + +term_expansion(Head, MangledHead) :- + Head =.. [Functor | Args], + length(Args, Arity), + detchecked(Functor/Arity), + !, + atom_concat('__detcheck$', Functor, MangledFunctor), + MangledHead =.. [MangledFunctor | Args]. diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default new file mode 100644 index 0000000..c68dbfb --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default @@ -0,0 +1,89 @@ +#define LAST_DEFINED_OPCODE 73 + +#define INSN_inv() INSN_EMIT_macro_opcode(1) +#define INSN_abs_o() INSN_EMIT_macro_opcode(2) +#define INSN_neg_o() INSN_EMIT_macro_opcode(3) +#define INSN_load1() INSN_EMIT_macro_opcode(4) +#define INSN_load1u() INSN_EMIT_macro_opcode(5) +#define INSN_load2() INSN_EMIT_macro_opcode(6) +#define INSN_load2u() INSN_EMIT_macro_opcode(7) +#define INSN_load4() INSN_EMIT_macro_opcode(8) +#define INSN_or() INSN_EMIT_macro_opcode(9) +#define INSN_and() INSN_EMIT_macro_opcode(10) +#define INSN_xor() INSN_EMIT_macro_opcode(11) +#define INSN_add() INSN_EMIT_macro_opcode(12) +#define INSN_add_o() INSN_EMIT_macro_opcode(13) +#define INSN_sub_o() INSN_EMIT_macro_opcode(14) +#define INSN_mul_o() INSN_EMIT_macro_opcode(15) +#define INSN_lshift() INSN_EMIT_macro_opcode(16) +#define INSN_rshift() INSN_EMIT_macro_opcode(17) +#define INSN_urshift() INSN_EMIT_macro_opcode(18) +#define INSN_cmpeq() INSN_EMIT_macro_opcode(19) +#define INSN_cmplt() INSN_EMIT_macro_opcode(20) +#define INSN_cmpltu() INSN_EMIT_macro_opcode(21) +#define INSN_settos(arg1) (code = psyco_insn_settos(code, arg1)) +EXTERNFN code_t* psyco_insn_settos(code_t* code, int arg1); +#define INSN_pushn(arg1) (code = psyco_insn_pushn(code, arg1)) +EXTERNFN code_t* psyco_insn_pushn(code_t* code, word_t arg1); +#define INSN_immed(arg1) (code = psyco_insn_immed(code, arg1)) +EXTERNFN code_t* psyco_insn_immed(code_t* code, word_t arg1); +#define INSN_s_push(arg1) (code = psyco_insn_s_push(code, arg1)) +EXTERNFN code_t* psyco_insn_s_push(code_t* code, int arg1); +#define INSN_s_pop(arg1) (code = psyco_insn_s_pop(code, arg1)) +EXTERNFN code_t* psyco_insn_s_pop(code_t* code, int arg1); +#define INSN_ref_push(arg1) (code = psyco_insn_ref_push(code, arg1)) +EXTERNFN code_t* psyco_insn_ref_push(code_t* code, word_t arg1); +#define INSN_stackgrow() INSN_EMIT_macro_opcode(39) +#define INSN_assertdepth(arg1) (code = psyco_insn_assertdepth(code, arg1)) +EXTERNFN code_t* psyco_insn_assertdepth(code_t* code, word_t arg1); +#define INSN_dynamicfreq(arg1) (code = psyco_insn_dynamicfreq(code, arg1)) +EXTERNFN code_t* psyco_insn_dynamicfreq(code_t* code, word_t** arg1); +#define INSN_flag_push() INSN_EMIT_macro_opcode(43) +#define INSN_cmpz() INSN_EMIT_macro_opcode(44) +#define INSN_flag_forget() (code = psyco_insn_flag_forget(code)) +EXTERNFN code_t* psyco_insn_flag_forget(code_t* code); +#define INSN_jcondnear(arg1) (code = psyco_insn_jcondnear(code, arg1)) +EXTERNFN code_t* psyco_insn_jcondnear(code_t* code, code_t** arg1); +#define INSN_jcondfar(arg1) (code = psyco_insn_jcondfar(code, arg1)) +EXTERNFN code_t* psyco_insn_jcondfar(code_t* code, word_t** arg1); +#define INSN_jumpfar(arg1) (code = psyco_insn_jumpfar(code, arg1)) +EXTERNFN code_t* psyco_insn_jumpfar(code_t* code, word_t** arg1); +#define INSN_cbuild1(arg1) (code = psyco_insn_cbuild1(code, arg1)) +EXTERNFN code_t* psyco_insn_cbuild1(code_t* code, word_t** arg1); +#define INSN_cbuild2(arg1) (code = psyco_insn_cbuild2(code, arg1)) +EXTERNFN code_t* psyco_insn_cbuild2(code_t* code, word_t** arg1); +#define INSN_store1() INSN_EMIT_macro_opcode(50) +#define INSN_store2() INSN_EMIT_macro_opcode(51) +#define INSN_store4() INSN_EMIT_macro_opcode(52) +#define INSN_incref() INSN_EMIT_macro_opcode(53) +#define INSN_decref() INSN_EMIT_macro_opcode(54) +#define INSN_decrefnz(arg1) (code = psyco_insn_decrefnz(code, arg1)) +EXTERNFN code_t* psyco_insn_decrefnz(code_t* code, word_t** arg1); +#define INSN_exitframe() INSN_EMIT_macro_opcode(56) +#define INSN_ret(arg1) (code = psyco_insn_ret(code, arg1)) +EXTERNFN code_t* psyco_insn_ret(code_t* code, int arg1); +#define INSN_retval() INSN_EMIT_macro_opcode(60) +#define INSN_pushretval() INSN_EMIT_macro_opcode(61) +#define INSN_pyenter(arg1) (code = psyco_insn_pyenter(code, arg1)) +EXTERNFN code_t* psyco_insn_pyenter(code_t* code, word_t** arg1); +#define INSN_pyleave() INSN_EMIT_macro_opcode(63) +#define INSN_vmcall(arg1) (code = psyco_insn_vmcall(code, arg1)) +EXTERNFN code_t* psyco_insn_vmcall(code_t* code, word_t** arg1); +#define INSN_ccall0(arg1) (code = psyco_insn_ccall0(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall0(code_t* code, word_t** arg1); +#define INSN_ccall1(arg1) (code = psyco_insn_ccall1(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall1(code_t* code, word_t** arg1); +#define INSN_ccall2(arg1) (code = psyco_insn_ccall2(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall2(code_t* code, word_t** arg1); +#define INSN_ccall3(arg1) (code = psyco_insn_ccall3(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall3(code_t* code, word_t** arg1); +#define INSN_ccall4(arg1) (code = psyco_insn_ccall4(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall4(code_t* code, word_t** arg1); +#define INSN_ccall5(arg1) (code = psyco_insn_ccall5(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall5(code_t* code, word_t** arg1); +#define INSN_ccall6(arg1) (code = psyco_insn_ccall6(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall6(code_t* code, word_t** arg1); +#define INSN_ccall7(arg1) (code = psyco_insn_ccall7(code, arg1)) +EXTERNFN code_t* psyco_insn_ccall7(code_t* code, word_t** arg1); +#define INSN_checkdict(arg1, arg2, arg3, arg4) (code = psyco_insn_checkdict(code, arg1, arg2, arg3, arg4)) +EXTERNFN code_t* psyco_insn_checkdict(code_t* code, word_t** arg1, word_t** arg2, word_t** arg3, word_t** arg4); diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen.i.default b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen.i.default new file mode 100644 index 0000000..d678b7a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-igen.i.default @@ -0,0 +1,377 @@ + +DEFINEFN code_t* psyco_insn_settos(code_t* code, int arg1) +{ +if (arg1 == 0) { +INSN_EMIT_opcode(22); +INSN_EMIT_void(arg1); +setlatestopcode(22); +return(code); +} +else { +if ((1 <= arg1) && (arg1 <= 255)) { +INSN_EMIT_opcode(23); +INSN_EMIT_byte(arg1); +setlatestopcode(23); +return(code); +} +else { +if (1 <= arg1) { +INSN_EMIT_opcode(24); +INSN_EMIT_int(arg1); +setlatestopcode(24); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(settos)"); +return NULL; +} +} +} +} + +DEFINEFN code_t* psyco_insn_pushn(code_t* code, word_t arg1) +{ +if ((-128 <= arg1) && (arg1 <= 127)) { +INSN_EMIT_opcode(25); +INSN_EMIT_char(arg1); +setlatestopcode(25); +return(code); +} +else { +if (1) { +INSN_EMIT_opcode(26); +INSN_EMIT_word_t(arg1); +setlatestopcode(26); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(pushn)"); +return NULL; +} +} +} + +DEFINEFN code_t* psyco_insn_immed(code_t* code, word_t arg1) +{ +if (arg1 == 0) { +INSN_EMIT_opcode(27); +INSN_EMIT_void(arg1); +setlatestopcode(27); +return(code); +} +else { +if (arg1 == 1) { +INSN_EMIT_opcode(28); +INSN_EMIT_void(arg1); +setlatestopcode(28); +return(code); +} +else { +if ((-128 <= arg1) && (arg1 <= 127)) { +INSN_EMIT_opcode(29); +INSN_EMIT_char(arg1); +setlatestopcode(29); +return(code); +} +else { +if (1) { +INSN_EMIT_opcode(30); +INSN_EMIT_word_t(arg1); +setlatestopcode(30); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(immed)"); +return NULL; +} +} +} +} +} + +DEFINEFN code_t* psyco_insn_s_push(code_t* code, int arg1) +{ +if (arg1 == 0) { +INSN_EMIT_opcode(31); +INSN_EMIT_void(arg1); +setlatestopcode(31); +return(code); +} +else { +if ((1 <= arg1) && (arg1 <= 255)) { +INSN_EMIT_opcode(32); +INSN_EMIT_byte(arg1); +setlatestopcode(32); +return(code); +} +else { +if (1 <= arg1) { +INSN_EMIT_opcode(33); +INSN_EMIT_int(arg1); +setlatestopcode(33); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(s_push)"); +return NULL; +} +} +} +} + +DEFINEFN code_t* psyco_insn_s_pop(code_t* code, int arg1) +{ +if (arg1 == 0) { +INSN_EMIT_opcode(34); +INSN_EMIT_void(arg1); +setlatestopcode(34); +return(code); +} +else { +if ((1 <= arg1) && (arg1 <= 255)) { +INSN_EMIT_opcode(35); +INSN_EMIT_byte(arg1); +setlatestopcode(35); +return(code); +} +else { +if (1 <= arg1) { +INSN_EMIT_opcode(36); +INSN_EMIT_int(arg1); +setlatestopcode(36); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(s_pop)"); +return NULL; +} +} +} +} + +DEFINEFN code_t* psyco_insn_ref_push(code_t* code, word_t arg1) +{ +if ((-128 <= arg1) && (arg1 <= 127)) { +INSN_EMIT_opcode(37); +INSN_EMIT_char(arg1); +setlatestopcode(37); +return(code); +} +else { +if (1) { +INSN_EMIT_opcode(38); +INSN_EMIT_word_t(arg1); +setlatestopcode(38); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(ref_push)"); +return NULL; +} +} +} + +DEFINEFN code_t* psyco_insn_assertdepth(code_t* code, word_t arg1) +{ +if ((-128 <= arg1) && (arg1 <= 127)) { +INSN_EMIT_opcode(40); +INSN_EMIT_char(arg1); +setlatestopcode(40); +return(code); +} +else { +if (1) { +INSN_EMIT_opcode(41); +INSN_EMIT_word_t(arg1); +setlatestopcode(41); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(assertdepth)"); +return NULL; +} +} +} + +DEFINEFN code_t* psyco_insn_dynamicfreq(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(42); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(42); +return(code); +} + +DEFINEFN code_t* psyco_insn_flag_forget(code_t* code) +{ +/* suffix only */ +return(code); +} + +DEFINEFN code_t* psyco_insn_jcondnear(code_t* code, code_t** arg1) +{ +INSN_EMIT_opcode(45); +INSN_EMIT_placeholder_byte(arg1); +setlatestopcode(45); +return(code); +} + +DEFINEFN code_t* psyco_insn_jcondfar(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(46); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(46); +return(code); +} + +DEFINEFN code_t* psyco_insn_jumpfar(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(47); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(47); +return(code); +} + +DEFINEFN code_t* psyco_insn_cbuild1(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(48); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(48); +return(code); +} + +DEFINEFN code_t* psyco_insn_cbuild2(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(49); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(49); +return(code); +} + +DEFINEFN code_t* psyco_insn_decrefnz(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(55); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(55); +return(code); +} + +DEFINEFN code_t* psyco_insn_ret(code_t* code, int arg1) +{ +if (arg1 == 0) { +INSN_EMIT_opcode(57); +INSN_EMIT_void(arg1); +setlatestopcode(57); +return(code); +} +else { +if ((1 <= arg1) && (arg1 <= 255)) { +INSN_EMIT_opcode(58); +INSN_EMIT_byte(arg1); +setlatestopcode(58); +return(code); +} +else { +if (1 <= arg1) { +INSN_EMIT_opcode(59); +INSN_EMIT_int(arg1); +setlatestopcode(59); +return(code); +} +else { +psyco_fatal_msg("invalid_mode(ret)"); +return NULL; +} +} +} +} + +DEFINEFN code_t* psyco_insn_pyenter(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(62); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(62); +return(code); +} + +DEFINEFN code_t* psyco_insn_vmcall(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(64); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(64); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall0(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(65); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(65); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall1(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(66); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(66); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall2(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(67); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(67); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall3(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(68); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(68); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall4(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(69); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(69); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall5(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(70); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(70); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall6(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(71); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(71); +return(code); +} + +DEFINEFN code_t* psyco_insn_ccall7(code_t* code, word_t** arg1) +{ +INSN_EMIT_opcode(72); +INSN_EMIT_placeholder_long(arg1); +setlatestopcode(72); +return(code); +} + +DEFINEFN code_t* psyco_insn_checkdict(code_t* code, word_t** arg1, word_t** arg2, word_t** arg3, word_t** arg4) +{ +INSN_EMIT_opcode(73); +INSN_EMIT_placeholder_long(arg1); +INSN_EMIT_placeholder_long(arg2); +INSN_EMIT_placeholder_long(arg3); +INSN_EMIT_placeholder_long(arg4); +setlatestopcode(73); +return(code); +} diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-switch.i.default b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-switch.i.default new file mode 100644 index 0000000..2098a6d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-switch.i.default @@ -0,0 +1,853 @@ +case 1: /* [inv] */ +{ +word_t local1; +word_t local2; +local1 = ~accum; +local2 = local1; +accum = local2; +} +continue; + +case 2: /* [abs_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = abs_o(accum); +local2 = ovf_check(abs_o, macro_args(accum)); +local3 = local1; +accum = local3; +flag = local2; +} +continue; + +case 3: /* [neg_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = -accum; +local2 = ovf_check(neg_o, macro_args(accum)); +local3 = local1; +accum = local3; +flag = local2; +} +continue; + +case 4: /* [load1] */ +{ +word_t local1; +word_t local2; +local1 = *(char*)accum; +local2 = local1; +accum = local2; +} +continue; + +case 5: /* [load1u] */ +{ +word_t local1; +word_t local2; +local1 = *(unsigned char*)accum; +local2 = local1; +accum = local2; +} +continue; + +case 6: /* [load2] */ +{ +word_t local1; +word_t local2; +local1 = *(short*)accum; +local2 = local1; +accum = local2; +} +continue; + +case 7: /* [load2u] */ +{ +word_t local1; +word_t local2; +local1 = *(unsigned short*)accum; +local2 = local1; +accum = local2; +} +continue; + +case 8: /* [load4] */ +{ +word_t local1; +word_t local2; +local1 = *(long*)accum; +local2 = local1; +accum = local2; +} +continue; + +case 9: /* [or] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) | accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +continue; + +case 10: /* [and] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) & accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +continue; + +case 11: /* [xor] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) ^ accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +continue; + +case 12: /* [add] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0)+accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +continue; + +case 13: /* [add_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = stack_nth(0)+accum; +local2 = ovf_check(add_o, macro_args(stack_nth(0), accum)); +local3 = local1; +accum = local3; +stack_shift_pos(1); +flag = local2; +} +continue; + +case 14: /* [sub_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = stack_nth(0)-accum; +local2 = ovf_check(sub_o, macro_args(stack_nth(0), accum)); +local3 = local1; +accum = local3; +stack_shift_pos(1); +flag = local2; +} +continue; + +case 15: /* [mul_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = stack_nth(0)*accum; +local2 = ovf_check(mul_o, macro_args(stack_nth(0), accum)); +local3 = local1; +accum = local3; +stack_shift_pos(1); +flag = local2; +} +continue; + +case 16: /* [lshift] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) << accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +continue; + +case 17: /* [rshift] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) >> accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +continue; + +case 18: /* [urshift] */ +{ +word_t local1; +word_t local2; +local1 = ((unsigned)stack_nth(0)) >> accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +continue; + +case 19: /* [cmpeq] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) == accum; +local2 = stack_nth(1); +accum = local2; +stack_shift_pos(2); +flag = local1; +} +continue; + +case 20: /* [cmplt] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) < accum; +local2 = stack_nth(1); +accum = local2; +stack_shift_pos(2); +flag = local1; +} +continue; + +case 21: /* [cmpltu] */ +{ +word_t local1; +word_t local2; +local1 = ((unsigned)stack_nth(0)) < ((unsigned)accum); +local2 = stack_nth(1); +accum = local2; +stack_shift_pos(2); +flag = local1; +} +continue; + +case 22: /* [settos(0)] */ +{ +} +continue; + +case 23: /* [settos(1:255)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(code_t); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +continue; + +case 24: /* [settos(1:maxint)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +continue; + +case 25: /* [pushn(char)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(char); +local2 = accum; +stack_nth(-1) = local2; +stack_shift(-1); +stack_shift((-local1)); +local3 = stack_nth(0); +accum = local3; +stack_shift_pos(1); +} +continue; + +case 26: /* [pushn(int)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = accum; +stack_nth(-1) = local2; +stack_shift(-1); +stack_shift((-local1)); +local3 = stack_nth(0); +accum = local3; +stack_shift_pos(1); +} +continue; + +case 27: /* [immed(0)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = 0; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +continue; + +case 28: /* [immed(1)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = 1; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +continue; + +case 29: /* [immed(char)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(char); +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +continue; + +case 30: /* [immed(int)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +continue; + +case 31: /* [s_push(0)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = accum; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +continue; + +case 32: /* [s_push(1:255)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(code_t); +local2 = stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +continue; + +case 33: /* [s_push(1:maxint)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +continue; + +case 34: /* [s_pop(0)] */ +{ +word_t local1; +accum = accum; +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +continue; + +case 35: /* [s_pop(1:255)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(code_t); +stack_nth(local1-1) = accum; +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +continue; + +case 36: /* [s_pop(1:maxint)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +stack_nth(local1-1) = accum; +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +continue; + +case 37: /* [ref_push(char)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(char); +local2 = (word_t) &stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +continue; + +case 38: /* [ref_push(int)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = (word_t) &stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +continue; + +case 39: /* [stackgrow] */ +{ +impl_stackgrow(VM_EXTRA_STACK_SIZE); +} +continue; + +case 40: /* [assertdepth(char)] */ +{ +word_t local1; +local1 = bytecode_next(char); +/* debugging assertion */ +} +continue; + +case 41: /* [assertdepth(int)] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +/* debugging assertion */ +} +continue; + +case 42: /* [dynamicfreq(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_dynamicfreq; +} +continue; + +case 43: /* [flag_push] */ +{ +word_t local1; +word_t local2; +word_t local3; +impl_debug_check_flag(flag); +local1 = flag; +impl_debug_forget_flag(flag); +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +continue; + +case 44: /* [cmpz] */ +{ +word_t local1; +word_t local2; +local1 = !accum; +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +flag = local1; +} +continue; + +case 45: /* [jcondnear(indirect(code_t))] */ +{ +word_t local1; +local1 = bytecode_next(code_t); +impl_debug_check_flag(flag); +impl_jcond(flag, nextip+local1); +impl_debug_forget_flag(flag); +} +continue; + +case 46: /* [jcondfar(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_debug_check_flag(flag); +impl_jcond(flag, local1); +impl_debug_forget_flag(flag); +} +continue; + +case 47: /* [jumpfar(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_jump(local1); +} +continue; + +case 48: /* [cbuild1(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_cbuild1(local1); +} +continue; + +case 49: /* [cbuild2(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +impl_cbuild2(local1, accum); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +continue; + +case 50: /* [store1] */ +{ +word_t local1; +*(char*)stack_nth(0) = (char)accum; +local1 = stack_nth(1); +accum = local1; +stack_shift_pos(2); +} +continue; + +case 51: /* [store2] */ +{ +word_t local1; +*(short*)stack_nth(0) = (short)accum; +local1 = stack_nth(1); +accum = local1; +stack_shift_pos(2); +} +continue; + +case 52: /* [store4] */ +{ +word_t local1; +*(long*)stack_nth(0) = accum; +local1 = stack_nth(1); +accum = local1; +stack_shift_pos(2); +} +continue; + +case 53: /* [incref] */ +{ +word_t local1; +impl_incref(accum); +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +continue; + +case 54: /* [decref] */ +{ +word_t local1; +impl_decref(accum); +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +continue; + +case 55: /* [decrefnz(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_decrefnz(local1); +} +continue; + +case 56: /* [exitframe] */ +{ +word_t local1; +impl_exitframe(stack_nth(1), stack_nth(0), accum); +local1 = stack_nth(2); +accum = local1; +stack_shift_pos(3); +} +continue; + +case 57: /* [ret(0)] */ +{ +impl_ret(accum); +} +continue; + +case 58: /* [ret(1:255)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(code_t); +impl_ret(accum); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +continue; + +case 59: /* [ret(1:maxint)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +impl_ret(accum); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +continue; + +case 60: /* [retval] */ +{ +word_t local1; +retval = accum; +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +continue; + +case 61: /* [pushretval] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = retval; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +continue; + +case 62: /* [pyenter(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_pyenter(local1); +} +continue; + +case 63: /* [pyleave] */ +{ +impl_pyleave; +} +continue; + +case 64: /* [vmcall(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = impl_vmcall(local1); +impl_stackgrow(VM_INITIAL_MINIMAL_STACK_SIZE); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +continue; + +case 65: /* [ccall0(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = impl_ccall(0, local1, macro_noarg); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +continue; + +case 66: /* [ccall1(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(1, local1, macro_args(accum)); +local3 = local2; +accum = local3; +} +continue; + +case 67: /* [ccall2(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(2, local1, macro_args(accum, stack_nth(0))); +local3 = local2; +accum = local3; +stack_shift_pos(1); +} +continue; + +case 68: /* [ccall3(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(3, local1, macro_args(accum, stack_nth(0), stack_nth(1))); +local3 = local2; +accum = local3; +stack_shift_pos(2); +} +continue; + +case 69: /* [ccall4(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(4, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2))); +local3 = local2; +accum = local3; +stack_shift_pos(3); +} +continue; + +case 70: /* [ccall5(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(5, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3))); +local3 = local2; +accum = local3; +stack_shift_pos(4); +} +continue; + +case 71: /* [ccall6(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(6, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4))); +local3 = local2; +accum = local3; +stack_shift_pos(5); +} +continue; + +case 72: /* [ccall7(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(7, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4), stack_nth(5))); +local3 = local2; +accum = local3; +stack_shift_pos(6); +} +continue; + +case 73: /* [checkdict(indirect(word_t), indirect(word_t), indirect(word_t), indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +word_t local5; +local1 = bytecode_next(word_t); +local2 = bytecode_next(word_t); +local3 = bytecode_next(word_t); +local4 = bytecode_next(word_t); +local5 = impl_checkdict(local1, local2, local3, local4); +flag = local5; +} +continue; + diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-table.py.default b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-table.py.default new file mode 100644 index 0000000..c45d133 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-table.py.default @@ -0,0 +1,201 @@ +insntable = { + 1: [("inv",), ], + 2: [("abs_o",), ], + 3: [("neg_o",), ], + 4: [("load1",), ], + 5: [("load1u",), ], + 6: [("load2",), ], + 7: [("load2u",), ], + 8: [("load4",), ], + 9: [("or",), ], + 10: [("and",), ], + 11: [("xor",), ], + 12: [("add",), ], + 13: [("add_o",), ], + 14: [("sub_o",), ], + 15: [("mul_o",), ], + 16: [("lshift",), ], + 17: [("rshift",), ], + 18: [("urshift",), ], + 19: [("cmpeq",), ], + 20: [("cmplt",), ], + 21: [("cmpltu",), ], + 22: [("settos",stack(0),), ], + 23: [("settos",stack(byte),), ], + 24: [("settos",stack(long),), ], + 25: [("pushn",char,), ], + 26: [("pushn",int,), ], + 27: [("immed",0,), ], + 28: [("immed",1,), ], + 29: [("immed",char,), ], + 30: [("immed",int,), ], + 31: [("s_push",stack(0),), ], + 32: [("s_push",stack(byte),), ], + 33: [("s_push",stack(long),), ], + 34: [("s_pop",stack(0),), ], + 35: [("s_pop",stack(byte),), ], + 36: [("s_pop",stack(long),), ], + 37: [("ref_push",char,), ], + 38: [("ref_push",int,), ], + 39: [("stackgrow",), ], + 40: [("assertdepth",char,), ], + 41: [("assertdepth",int,), ], + 42: [("dynamicfreq",indirect(word_t),), ], + 43: [("flag_push",), ], + 44: [("cmpz",), ], + 45: [("jcondnear",indirect(code_t),), ], + 46: [("jcondfar",indirect(word_t),), ], + 47: [("jumpfar",indirect(word_t),), ], + 48: [("cbuild1",indirect(word_t),), ], + 49: [("cbuild2",indirect(word_t),), ], + 50: [("store1",), ], + 51: [("store2",), ], + 52: [("store4",), ], + 53: [("incref",), ], + 54: [("decref",), ], + 55: [("decrefnz",indirect(word_t),), ], + 56: [("exitframe",), ], + 57: [("ret",stack(0),), ], + 58: [("ret",stack(byte),), ], + 59: [("ret",stack(long),), ], + 60: [("retval",), ], + 61: [("pushretval",), ], + 62: [("pyenter",indirect(word_t),), ], + 63: [("pyleave",), ], + 64: [("vmcall",indirect(word_t),), ], + 65: [("ccall0",indirect(word_t),), ], + 66: [("ccall1",indirect(word_t),), ], + 67: [("ccall2",indirect(word_t),), ], + 68: [("ccall3",indirect(word_t),), ], + 69: [("ccall4",indirect(word_t),), ], + 70: [("ccall5",indirect(word_t),), ], + 71: [("ccall6",indirect(word_t),), ], + 72: [("ccall7",indirect(word_t),), ], + 73: [("checkdict",indirect(word_t),indirect(word_t),indirect(word_t),indirect(word_t),), ], +} +stackpushes = { + 1: 0, + 2: 0, + 3: 0, + 4: 0, + 5: 0, + 6: 0, + 7: 0, + 8: 0, + 9: -1, + 10: -1, + 11: -1, + 12: -1, + 13: -1, + 14: -1, + 15: -1, + 16: -1, + 17: -1, + 18: -1, + 19: -2, + 20: -2, + 21: -2, + 27: 1, + 28: 1, + 29: 1, + 30: 1, + 31: 1, + 32: 1, + 33: 1, + 34: -1, + 35: -1, + 36: -1, + 37: 1, + 38: 1, + 39: 0, + 40: 0, + 41: 0, + 42: 0, + 43: 1, + 44: -1, + 45: 0, + 46: 0, + 47: 0, + 48: 0, + 49: -1, + 50: -2, + 51: -2, + 52: -2, + 53: -1, + 54: -1, + 55: 0, + 56: -3, + 60: -1, + 61: 1, + 62: 0, + 63: 0, + 65: 1, + 66: 0, + 67: -1, + 68: -2, + 69: -3, + 70: -4, + 71: -5, + 72: -6, + 73: 0, +} +chainable = { + 1: 1, + 2: 1, + 3: 1, + 4: 1, + 5: 1, + 6: 1, + 7: 1, + 8: 1, + 9: 1, + 10: 1, + 11: 1, + 12: 1, + 13: 1, + 14: 1, + 15: 1, + 16: 1, + 17: 1, + 18: 1, + 19: 1, + 20: 1, + 21: 1, + 27: 1, + 28: 1, + 29: 1, + 30: 1, + 31: 1, + 32: 1, + 33: 1, + 34: 1, + 35: 1, + 36: 1, + 37: 1, + 38: 1, + 39: 1, + 40: 1, + 41: 1, + 43: 1, + 44: 1, + 50: 1, + 51: 1, + 52: 1, + 53: 1, + 54: 1, + 55: 1, + 56: 1, + 60: 1, + 61: 1, + 62: 1, + 63: 1, + 65: 1, + 66: 1, + 67: 1, + 68: 1, + 69: 1, + 70: 1, + 71: 1, + 72: 1, + 73: 1, +} diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default new file mode 100644 index 0000000..78df2f1 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default @@ -0,0 +1,1118 @@ +static const void* opcodetable[] = { + &&lblorigin, /* 0 */ + &&lblopcode1, /* [inv] */ + &&lblopcode2, /* [abs_o] */ + &&lblopcode3, /* [neg_o] */ + &&lblopcode4, /* [load1] */ + &&lblopcode5, /* [load1u] */ + &&lblopcode6, /* [load2] */ + &&lblopcode7, /* [load2u] */ + &&lblopcode8, /* [load4] */ + &&lblopcode9, /* [or] */ + &&lblopcode10, /* [and] */ + &&lblopcode11, /* [xor] */ + &&lblopcode12, /* [add] */ + &&lblopcode13, /* [add_o] */ + &&lblopcode14, /* [sub_o] */ + &&lblopcode15, /* [mul_o] */ + &&lblopcode16, /* [lshift] */ + &&lblopcode17, /* [rshift] */ + &&lblopcode18, /* [urshift] */ + &&lblopcode19, /* [cmpeq] */ + &&lblopcode20, /* [cmplt] */ + &&lblopcode21, /* [cmpltu] */ + &&lblopcode22, /* [settos(0)] */ + &&lblopcode23, /* [settos(1:255)] */ + &&lblopcode24, /* [settos(1:maxint)] */ + &&lblopcode25, /* [pushn(char)] */ + &&lblopcode26, /* [pushn(int)] */ + &&lblopcode27, /* [immed(0)] */ + &&lblopcode28, /* [immed(1)] */ + &&lblopcode29, /* [immed(char)] */ + &&lblopcode30, /* [immed(int)] */ + &&lblopcode31, /* [s_push(0)] */ + &&lblopcode32, /* [s_push(1:255)] */ + &&lblopcode33, /* [s_push(1:maxint)] */ + &&lblopcode34, /* [s_pop(0)] */ + &&lblopcode35, /* [s_pop(1:255)] */ + &&lblopcode36, /* [s_pop(1:maxint)] */ + &&lblopcode37, /* [ref_push(char)] */ + &&lblopcode38, /* [ref_push(int)] */ + &&lblopcode39, /* [stackgrow] */ + &&lblopcode40, /* [assertdepth(char)] */ + &&lblopcode41, /* [assertdepth(int)] */ + &&lblopcode42, /* [dynamicfreq(indirect(word_t))] */ + &&lblopcode43, /* [flag_push] */ + &&lblopcode44, /* [cmpz] */ + &&lblopcode45, /* [jcondnear(indirect(code_t))] */ + &&lblopcode46, /* [jcondfar(indirect(word_t))] */ + &&lblopcode47, /* [jumpfar(indirect(word_t))] */ + &&lblopcode48, /* [cbuild1(indirect(word_t))] */ + &&lblopcode49, /* [cbuild2(indirect(word_t))] */ + &&lblopcode50, /* [store1] */ + &&lblopcode51, /* [store2] */ + &&lblopcode52, /* [store4] */ + &&lblopcode53, /* [incref] */ + &&lblopcode54, /* [decref] */ + &&lblopcode55, /* [decrefnz(indirect(word_t))] */ + &&lblopcode56, /* [exitframe] */ + &&lblopcode57, /* [ret(0)] */ + &&lblopcode58, /* [ret(1:255)] */ + &&lblopcode59, /* [ret(1:maxint)] */ + &&lblopcode60, /* [retval] */ + &&lblopcode61, /* [pushretval] */ + &&lblopcode62, /* [pyenter(indirect(word_t))] */ + &&lblopcode63, /* [pyleave] */ + &&lblopcode64, /* [vmcall(indirect(word_t))] */ + &&lblopcode65, /* [ccall0(indirect(word_t))] */ + &&lblopcode66, /* [ccall1(indirect(word_t))] */ + &&lblopcode67, /* [ccall2(indirect(word_t))] */ + &&lblopcode68, /* [ccall3(indirect(word_t))] */ + &&lblopcode69, /* [ccall4(indirect(word_t))] */ + &&lblopcode70, /* [ccall5(indirect(word_t))] */ + &&lblopcode71, /* [ccall6(indirect(word_t))] */ + &&lblopcode72, /* [ccall7(indirect(word_t))] */ + &&lblopcode73, /* [checkdict(indirect(word_t), indirect(word_t), indirect(word_t), indirect(word_t))] */ +#if PSYCO_DEBUG + &&lblorigin, /* 74 */ + &&lblorigin, /* 75 */ + &&lblorigin, /* 76 */ + &&lblorigin, /* 77 */ + &&lblorigin, /* 78 */ + &&lblorigin, /* 79 */ + &&lblorigin, /* 80 */ + &&lblorigin, /* 81 */ + &&lblorigin, /* 82 */ + &&lblorigin, /* 83 */ + &&lblorigin, /* 84 */ + &&lblorigin, /* 85 */ + &&lblorigin, /* 86 */ + &&lblorigin, /* 87 */ + &&lblorigin, /* 88 */ + &&lblorigin, /* 89 */ + &&lblorigin, /* 90 */ + &&lblorigin, /* 91 */ + &&lblorigin, /* 92 */ + &&lblorigin, /* 93 */ + &&lblorigin, /* 94 */ + &&lblorigin, /* 95 */ + &&lblorigin, /* 96 */ + &&lblorigin, /* 97 */ + &&lblorigin, /* 98 */ + &&lblorigin, /* 99 */ + &&lblorigin, /* 100 */ + &&lblorigin, /* 101 */ + &&lblorigin, /* 102 */ + &&lblorigin, /* 103 */ + &&lblorigin, /* 104 */ + &&lblorigin, /* 105 */ + &&lblorigin, /* 106 */ + &&lblorigin, /* 107 */ + &&lblorigin, /* 108 */ + &&lblorigin, /* 109 */ + &&lblorigin, /* 110 */ + &&lblorigin, /* 111 */ + &&lblorigin, /* 112 */ + &&lblorigin, /* 113 */ + &&lblorigin, /* 114 */ + &&lblorigin, /* 115 */ + &&lblorigin, /* 116 */ + &&lblorigin, /* 117 */ + &&lblorigin, /* 118 */ + &&lblorigin, /* 119 */ + &&lblorigin, /* 120 */ + &&lblorigin, /* 121 */ + &&lblorigin, /* 122 */ + &&lblorigin, /* 123 */ + &&lblorigin, /* 124 */ + &&lblorigin, /* 125 */ + &&lblorigin, /* 126 */ + &&lblorigin, /* 127 */ + &&lblorigin, /* 128 */ + &&lblorigin, /* 129 */ + &&lblorigin, /* 130 */ + &&lblorigin, /* 131 */ + &&lblorigin, /* 132 */ + &&lblorigin, /* 133 */ + &&lblorigin, /* 134 */ + &&lblorigin, /* 135 */ + &&lblorigin, /* 136 */ + &&lblorigin, /* 137 */ + &&lblorigin, /* 138 */ + &&lblorigin, /* 139 */ + &&lblorigin, /* 140 */ + &&lblorigin, /* 141 */ + &&lblorigin, /* 142 */ + &&lblorigin, /* 143 */ + &&lblorigin, /* 144 */ + &&lblorigin, /* 145 */ + &&lblorigin, /* 146 */ + &&lblorigin, /* 147 */ + &&lblorigin, /* 148 */ + &&lblorigin, /* 149 */ + &&lblorigin, /* 150 */ + &&lblorigin, /* 151 */ + &&lblorigin, /* 152 */ + &&lblorigin, /* 153 */ + &&lblorigin, /* 154 */ + &&lblorigin, /* 155 */ + &&lblorigin, /* 156 */ + &&lblorigin, /* 157 */ + &&lblorigin, /* 158 */ + &&lblorigin, /* 159 */ + &&lblorigin, /* 160 */ + &&lblorigin, /* 161 */ + &&lblorigin, /* 162 */ + &&lblorigin, /* 163 */ + &&lblorigin, /* 164 */ + &&lblorigin, /* 165 */ + &&lblorigin, /* 166 */ + &&lblorigin, /* 167 */ + &&lblorigin, /* 168 */ + &&lblorigin, /* 169 */ + &&lblorigin, /* 170 */ + &&lblorigin, /* 171 */ + &&lblorigin, /* 172 */ + &&lblorigin, /* 173 */ + &&lblorigin, /* 174 */ + &&lblorigin, /* 175 */ + &&lblorigin, /* 176 */ + &&lblorigin, /* 177 */ + &&lblorigin, /* 178 */ + &&lblorigin, /* 179 */ + &&lblorigin, /* 180 */ + &&lblorigin, /* 181 */ + &&lblorigin, /* 182 */ + &&lblorigin, /* 183 */ + &&lblorigin, /* 184 */ + &&lblorigin, /* 185 */ + &&lblorigin, /* 186 */ + &&lblorigin, /* 187 */ + &&lblorigin, /* 188 */ + &&lblorigin, /* 189 */ + &&lblorigin, /* 190 */ + &&lblorigin, /* 191 */ + &&lblorigin, /* 192 */ + &&lblorigin, /* 193 */ + &&lblorigin, /* 194 */ + &&lblorigin, /* 195 */ + &&lblorigin, /* 196 */ + &&lblorigin, /* 197 */ + &&lblorigin, /* 198 */ + &&lblorigin, /* 199 */ + &&lblorigin, /* 200 */ + &&lblorigin, /* 201 */ + &&lblorigin, /* 202 */ + &&lblorigin, /* 203 */ + &&lblorigin, /* 204 */ + &&lblorigin, /* 205 */ + &&lblorigin, /* 206 */ + &&lblorigin, /* 207 */ + &&lblorigin, /* 208 */ + &&lblorigin, /* 209 */ + &&lblorigin, /* 210 */ + &&lblorigin, /* 211 */ + &&lblorigin, /* 212 */ + &&lblorigin, /* 213 */ + &&lblorigin, /* 214 */ + &&lblorigin, /* 215 */ + &&lblorigin, /* 216 */ + &&lblorigin, /* 217 */ + &&lblorigin, /* 218 */ + &&lblorigin, /* 219 */ + &&lblorigin, /* 220 */ + &&lblorigin, /* 221 */ + &&lblorigin, /* 222 */ + &&lblorigin, /* 223 */ + &&lblorigin, /* 224 */ + &&lblorigin, /* 225 */ + &&lblorigin, /* 226 */ + &&lblorigin, /* 227 */ + &&lblorigin, /* 228 */ + &&lblorigin, /* 229 */ + &&lblorigin, /* 230 */ + &&lblorigin, /* 231 */ + &&lblorigin, /* 232 */ + &&lblorigin, /* 233 */ + &&lblorigin, /* 234 */ + &&lblorigin, /* 235 */ + &&lblorigin, /* 236 */ + &&lblorigin, /* 237 */ + &&lblorigin, /* 238 */ + &&lblorigin, /* 239 */ + &&lblorigin, /* 240 */ + &&lblorigin, /* 241 */ + &&lblorigin, /* 242 */ + &&lblorigin, /* 243 */ + &&lblorigin, /* 244 */ + &&lblorigin, /* 245 */ + &&lblorigin, /* 246 */ + &&lblorigin, /* 247 */ + &&lblorigin, /* 248 */ + &&lblorigin, /* 249 */ + &&lblorigin, /* 250 */ + &&lblorigin, /* 251 */ + &&lblorigin, /* 252 */ + &&lblorigin, /* 253 */ + &&lblorigin, /* 254 */ + &&lblorigin, /* 255 */ +#endif +}; +goto *opcodetable[bytecode_nextopcode()]; + +lblorigin: +psyco_fatal_msg("invalid vm opcode"); + +lblopcode1: /* [inv] */ +{ +word_t local1; +word_t local2; +local1 = ~accum; +local2 = local1; +accum = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode2: /* [abs_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = abs_o(accum); +local2 = ovf_check(abs_o, macro_args(accum)); +local3 = local1; +accum = local3; +flag = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode3: /* [neg_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = -accum; +local2 = ovf_check(neg_o, macro_args(accum)); +local3 = local1; +accum = local3; +flag = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode4: /* [load1] */ +{ +word_t local1; +word_t local2; +local1 = *(char*)accum; +local2 = local1; +accum = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode5: /* [load1u] */ +{ +word_t local1; +word_t local2; +local1 = *(unsigned char*)accum; +local2 = local1; +accum = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode6: /* [load2] */ +{ +word_t local1; +word_t local2; +local1 = *(short*)accum; +local2 = local1; +accum = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode7: /* [load2u] */ +{ +word_t local1; +word_t local2; +local1 = *(unsigned short*)accum; +local2 = local1; +accum = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode8: /* [load4] */ +{ +word_t local1; +word_t local2; +local1 = *(long*)accum; +local2 = local1; +accum = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode9: /* [or] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) | accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode10: /* [and] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) & accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode11: /* [xor] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) ^ accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode12: /* [add] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0)+accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode13: /* [add_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = stack_nth(0)+accum; +local2 = ovf_check(add_o, macro_args(stack_nth(0), accum)); +local3 = local1; +accum = local3; +stack_shift_pos(1); +flag = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode14: /* [sub_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = stack_nth(0)-accum; +local2 = ovf_check(sub_o, macro_args(stack_nth(0), accum)); +local3 = local1; +accum = local3; +stack_shift_pos(1); +flag = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode15: /* [mul_o] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = stack_nth(0)*accum; +local2 = ovf_check(mul_o, macro_args(stack_nth(0), accum)); +local3 = local1; +accum = local3; +stack_shift_pos(1); +flag = local2; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode16: /* [lshift] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) << accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode17: /* [rshift] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) >> accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode18: /* [urshift] */ +{ +word_t local1; +word_t local2; +local1 = ((unsigned)stack_nth(0)) >> accum; +local2 = local1; +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode19: /* [cmpeq] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) == accum; +local2 = stack_nth(1); +accum = local2; +stack_shift_pos(2); +flag = local1; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode20: /* [cmplt] */ +{ +word_t local1; +word_t local2; +local1 = stack_nth(0) < accum; +local2 = stack_nth(1); +accum = local2; +stack_shift_pos(2); +flag = local1; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode21: /* [cmpltu] */ +{ +word_t local1; +word_t local2; +local1 = ((unsigned)stack_nth(0)) < ((unsigned)accum); +local2 = stack_nth(1); +accum = local2; +stack_shift_pos(2); +flag = local1; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode22: /* [settos(0)] */ +{ +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode23: /* [settos(1:255)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(code_t); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode24: /* [settos(1:maxint)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode25: /* [pushn(char)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(char); +local2 = accum; +stack_nth(-1) = local2; +stack_shift(-1); +stack_shift((-local1)); +local3 = stack_nth(0); +accum = local3; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode26: /* [pushn(int)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = accum; +stack_nth(-1) = local2; +stack_shift(-1); +stack_shift((-local1)); +local3 = stack_nth(0); +accum = local3; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode27: /* [immed(0)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = 0; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode28: /* [immed(1)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = 1; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode29: /* [immed(char)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(char); +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode30: /* [immed(int)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode31: /* [s_push(0)] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = accum; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode32: /* [s_push(1:255)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(code_t); +local2 = stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode33: /* [s_push(1:maxint)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode34: /* [s_pop(0)] */ +{ +word_t local1; +accum = accum; +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode35: /* [s_pop(1:255)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(code_t); +stack_nth(local1-1) = accum; +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode36: /* [s_pop(1:maxint)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +stack_nth(local1-1) = accum; +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode37: /* [ref_push(char)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(char); +local2 = (word_t) &stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode38: /* [ref_push(int)] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = (word_t) &stack_nth(local1-1); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode39: /* [stackgrow] */ +{ +impl_stackgrow(VM_EXTRA_STACK_SIZE); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode40: /* [assertdepth(char)] */ +{ +word_t local1; +local1 = bytecode_next(char); +/* debugging assertion */ +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode41: /* [assertdepth(int)] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +/* debugging assertion */ +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode42: /* [dynamicfreq(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_dynamicfreq; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode43: /* [flag_push] */ +{ +word_t local1; +word_t local2; +word_t local3; +impl_debug_check_flag(flag); +local1 = flag; +impl_debug_forget_flag(flag); +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode44: /* [cmpz] */ +{ +word_t local1; +word_t local2; +local1 = !accum; +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +flag = local1; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode45: /* [jcondnear(indirect(code_t))] */ +{ +word_t local1; +local1 = bytecode_next(code_t); +impl_debug_check_flag(flag); +impl_jcond(flag, nextip+local1); +impl_debug_forget_flag(flag); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode46: /* [jcondfar(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_debug_check_flag(flag); +impl_jcond(flag, local1); +impl_debug_forget_flag(flag); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode47: /* [jumpfar(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_jump(local1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode48: /* [cbuild1(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_cbuild1(local1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode49: /* [cbuild2(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +impl_cbuild2(local1, accum); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode50: /* [store1] */ +{ +word_t local1; +*(char*)stack_nth(0) = (char)accum; +local1 = stack_nth(1); +accum = local1; +stack_shift_pos(2); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode51: /* [store2] */ +{ +word_t local1; +*(short*)stack_nth(0) = (short)accum; +local1 = stack_nth(1); +accum = local1; +stack_shift_pos(2); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode52: /* [store4] */ +{ +word_t local1; +*(long*)stack_nth(0) = accum; +local1 = stack_nth(1); +accum = local1; +stack_shift_pos(2); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode53: /* [incref] */ +{ +word_t local1; +impl_incref(accum); +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode54: /* [decref] */ +{ +word_t local1; +impl_decref(accum); +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode55: /* [decrefnz(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_decrefnz(local1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode56: /* [exitframe] */ +{ +word_t local1; +impl_exitframe(stack_nth(1), stack_nth(0), accum); +local1 = stack_nth(2); +accum = local1; +stack_shift_pos(3); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode57: /* [ret(0)] */ +{ +impl_ret(accum); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode58: /* [ret(1:255)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(code_t); +impl_ret(accum); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode59: /* [ret(1:maxint)] */ +{ +word_t local1; +word_t local2; +local1 = bytecode_next(word_t); +impl_ret(accum); +stack_shift(local1-1); +local2 = stack_nth(0); +accum = local2; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode60: /* [retval] */ +{ +word_t local1; +retval = accum; +local1 = stack_nth(0); +accum = local1; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode61: /* [pushretval] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = retval; +local2 = local1; +local3 = accum; +stack_nth(-1) = local3; +accum = local2; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode62: /* [pyenter(indirect(word_t))] */ +{ +word_t local1; +local1 = bytecode_next(word_t); +impl_pyenter(local1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode63: /* [pyleave] */ +{ +impl_pyleave; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode64: /* [vmcall(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = impl_vmcall(local1); +impl_stackgrow(VM_INITIAL_MINIMAL_STACK_SIZE); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode65: /* [ccall0(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +local1 = bytecode_next(word_t); +local2 = impl_ccall(0, local1, macro_noarg); +local3 = local2; +local4 = accum; +stack_nth(-1) = local4; +accum = local3; +stack_shift(-1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode66: /* [ccall1(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(1, local1, macro_args(accum)); +local3 = local2; +accum = local3; +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode67: /* [ccall2(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(2, local1, macro_args(accum, stack_nth(0))); +local3 = local2; +accum = local3; +stack_shift_pos(1); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode68: /* [ccall3(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(3, local1, macro_args(accum, stack_nth(0), stack_nth(1))); +local3 = local2; +accum = local3; +stack_shift_pos(2); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode69: /* [ccall4(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(4, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2))); +local3 = local2; +accum = local3; +stack_shift_pos(3); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode70: /* [ccall5(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(5, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3))); +local3 = local2; +accum = local3; +stack_shift_pos(4); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode71: /* [ccall6(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(6, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4))); +local3 = local2; +accum = local3; +stack_shift_pos(5); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode72: /* [ccall7(indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +local1 = bytecode_next(word_t); +local2 = impl_ccall(7, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4), stack_nth(5))); +local3 = local2; +accum = local3; +stack_shift_pos(6); +} +goto *opcodetable[bytecode_nextopcode()]; + +lblopcode73: /* [checkdict(indirect(word_t), indirect(word_t), indirect(word_t), indirect(word_t))] */ +{ +word_t local1; +word_t local2; +word_t local3; +word_t local4; +word_t local5; +local1 = bytecode_next(word_t); +local2 = bytecode_next(word_t); +local3 = bytecode_next(word_t); +local4 = bytecode_next(word_t); +local5 = impl_checkdict(local1, local2, local3, local4); +flag = local5; +} +goto *opcodetable[bytecode_nextopcode()]; + diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.pl b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.pl new file mode 100644 index 0000000..9523f18 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.pl @@ -0,0 +1,111 @@ +:- consult(vmwriter). +:- consult(mode_combine). + + +unary_insn(inv). +unary_insn(neg_o, '-'). +overflow_flag(neg_o). +unary_insn(abs_o). +overflow_flag(abs_o). + +binary_insn(add, '+'). +binary_insn(add_o, '+'). +overflow_flag(add_o). +binary_insn(sub_o, '-'). +overflow_flag(sub_o). +binary_insn(mul_o, '*'). +overflow_flag(mul_o). +binary_insn(or). +binary_insn(and). +binary_insn(xor). +%binary_insn(div). +binary_insn(lshift, '<<'). +binary_insn(rshift, '>>'). +insn(urshift, [], [out(0)=(unsigned(in(1))>>in(0))], [stack(2->1)]). +insn(cmpeq, [], [setflag=(in(1)=:=in(0))], [flag(set), stack(2->0)]). +insn(cmplt, [], [setflag=(in(1) < in(0))], [flag(set), stack(2->0)]). +insn(cmpltu, [], [setflag=(unsigned(in(1)) < unsigned(in(0)))], + [flag(set), stack(2->0)]). + +%insn(pop, [], [], [stack(pop(0))]). % note: this is the same as s_pop(0) +%insn(pop2nd, [], [], [stack(pop(1))]). +insn(settos, [s], [], [stack(settos), nonchainable]). +insn(pushn, [i], [], [stack(pushn), nonchainable]). + +insn(immed, [i([0,1])], [out(0) = arg(0)], [stack(push)]). +insn(s_push, [s], [out(0) = arg(0)], [stack(push)]). +insn(s_pop, [s], [arg(0) = in(0)], [stack(pop)]). +insn(ref_push, [i], [out(0) = addr(stack_nth(arg(0)-stkshft))], [stack(push)]). +insn(stackgrow, [], [impl_stackgrow('VM_EXTRA_STACK_SIZE')], []). + +insn(assertdepth, [i], [comment('debugging assertion')], []). +insn(dynamicfreq, [l], [impl_dynamicfreq], [nonchainable]). + +insn(flag_push, [], [out(0)=flag], [stack(push), flag(get)]). +insn(cmpz, [], [setflag=not(in(0))], [stack(pop), flag(set)]). +insn(flag_forget, [],[], [flag(get), suffixonly]). +insn(jcondnear,[b], [impl_jcond(flag, nextip+arg(0))],[nonchainable,flag(get)]). +insn(jcondfar, [l], [impl_jcond(flag, arg(0))], [nonchainable,flag(get)]). +insn(jumpfar, [l], [impl_jump(arg(0))], [nonchainable]). + +insn(cbuild1, [l], [impl_cbuild1(arg(0))], [nonchainable]). +insn(cbuild2, [l], [impl_cbuild2(arg(0), in(0))], + [stack(1->0), nonchainable]). + +unary_insn(load1, mem1). +unary_insn(load1u, mem1u). +unary_insn(load2, mem2). +unary_insn(load2u, mem2u). +unary_insn(load4, mem4). +insn(store1, [], [mem1(in(1)) = cast1(in(0))], [stack(2->0)]). +insn(store2, [], [mem2(in(1)) = cast2(in(0))], [stack(2->0)]). +insn(store4, [], [mem4(in(1)) = in(0)], [stack(2->0)]). + +insn(incref, [], [impl_incref(in(0))], [stack(1->0)]). +insn(decref, [], [impl_decref(in(0))], [stack(1->0)]). +insn(decrefnz, [l], [impl_decrefnz(arg(0))], []). + +insn(exitframe, [], [impl_exitframe(in(2), in(1), in(0))], [stack(3->0)]). +insn(ret, [s], [impl_ret(in(0))], [stack(settos), nonchainable]). +insn(retval, [], [retval=in(0)], [stack(pop)]). +insn(pushretval,[], [out(0)=retval], [stack(push)]). + +insn(pyenter, [l], [impl_pyenter(arg(0))], []). % enter a Python sub-function +insn(pyleave, [], [impl_pyleave], []). % exit a Python sub-function +insn(vmcall, [l], [out(0)=impl_vmcall(arg(0)), % call a Python sub-function + impl_stackgrow('VM_INITIAL_MINIMAL_STACK_SIZE')], + [stack(0->1), nonchainable, nostackanalysis]). +% The normal sequence is pyenter/vmcall/pyleave, but vmcall might be +% omitted if the called function is inlined. + +insn(ccall0, [l], [out(0)=impl_ccall(0, arg(0), macro_noarg)],[stack(0->1)]). +insn(CallInsn, [l], [out(0)=impl_ccall(N, arg(0), ArgDef)], [stack(N->1)]) :- + between(1, 7, N), + sformat(SInsn, 'ccall~d', [N]), + N1 is N-1, + findall(S, (S=in(M), between(0, N1, M)), Args), + ArgDef =.. [macro_args | Args], + string_to_atom(SInsn, CallInsn). + +insn(checkdict, [l,l,l,l], [setflag=impl_checkdict(arg(0), arg(1), arg(2), + arg(3))], [flag(set)]). + + +% custom operand modes +standard_mode(small, _, i([H|_]), H). +standard_mode(Size, _, i([_|T]), Value) :- standard_mode(Size, _, i(T), Value). +standard_mode(Size, _, i([]), Cond) :- standard_mode(Size, _, i, Cond). + + +%mode_combine([s_push(0), immed(char), cmplt, jcondfar(long)]). +%mode_combine([s_push(0), immed(char), add, pop2nd]). +%mode_combine([s_push(truestack(byte)), immed(char), add, pop2nd]). +% +%mode_combine([not, jcondfar(long)]). +% +%mode_combine([immed(long), immed(long), threeway(0)]). +%mode_combine([immed(long), immed(long), threeway(1)]). + +%XXX fix duplicate [immed(long), immed(long)] + +%mode_combine([s_push(1:255), s_push(2:255)]). diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.py b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.py new file mode 100644 index 0000000..b037185 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insns.py @@ -0,0 +1,88 @@ +from insnset import InstructionSet + + + --- IN-PROGRESS --- + + +class Immed: + def __init__(self, *commonvalues): + self.commonvalues = commonvalues + + def modes(self, ivm): + for n in self.commonvalues: + if ivm.nextarg('void', min=n, max=n) is not None: + return str(n) + return ivm.nextarg('word_t') + +class Address: + def modes(self, ivm): + return ivm.nextarg('word_t') + +class Stack: + def modes(self, ivm): + for i in range(len(ivm.stack)): + if ivm.nextarg('void', min=i, max=i) is not None: + return ivm.stack[i] + n = ivm.nextarg('code_t', min=len(stack), max=255) + if n is None: + n = ivm.nextarg('word_t') + return ivm.compute('stack_nth(%s-%d)' % (n, len(stack))) + +class StackRef: + def modes(self, ivm): + ... + + +class IVM(InstructionSet): + + def insn_inv(self): + x = self.pop(); self.push('~%s' % x) + + def insn_neg_o(self): + x = self.pop(); self.push('-%s' % x) + self.setflag('%s == LONG_MIN' % x) + + def insn_abs_o(self): + x = self.pop(); self.push('%s<0 ? -%s : %s' % (x,x,x)) + self.setflag('%s == LONG_MIN' % x) + + def insn_add(self): + y = self.pop(); x = self.pop(); self.push('%s+%s' % (x,y)) + + def insn_add_o(self): + y = self.pop(); x = self.pop(); self.push('%s+%s' % (x,y)) + self.setflag('((%s+%s)^%s) < 0 && (%s^%s) >= 0' % (x,y,x,x,y)) + + def insn_immed(self, x=Immed(0,1)): + self.push(x) + + def insn_s_push(self, s=Stack()): + self.push(s) + + def insn_s_pop(self, s=StackRef()): + s.write(self.pop()) + + def insn_flag_push(self): + self.push(self.consumeflag()) + + def insn_cmpz(self): + self.pop('x'); self.setflag('x == 0') + + def insn_jumpfar(self, target=Address()): + self.do('nextip = (code_t*) %s;' % target) + insn_jumpfar.chainable = False + + def insn_load1(self): + self.pop('addr'); self.push('*(char*) addr') + + def insn_store1(self): + self.pop('value'); self.pop('addr') + self.do('*(char*) addr = value;') + + +ivm = IVM(['accum']) +ivm.insn_add_o() +ivm.insn_add() +ivm.insn_flag_push() +ivm.normalize(['accum']) +ivm.write() diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/insnset.py b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insnset.py new file mode 100644 index 0000000..2c6c9c7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/insnset.py @@ -0,0 +1,81 @@ + + +class InstructionSet: + + def __init__(self, stack): + self.locals = {} + self.stack = stack + self.popped = 0 + self.flag = 'flag' + self.codelines = [] + + def do(self, code): + self.codelines.append(code) + + def push(self, expr): + self.stack.append(expr) + + def compute(self, expr): + if expr in self.locals: + return expr + name = 'l%d' % len(self.locals) + self.locals[name] = expr + self.do('%s = %s;' % (name, expr)) + return name + + def pop(self): + if self.stack: + name = self.compute(self.stack.pop()) + else: + name = self.compute('stack_nth(%d);' % self.popped) + self.popped += 1 + return name + + def setflag(self, expr): + self.flag = expr + + def forgetflag(self): + self.flag = None + + def consumeflag(self): + result = self.flag + self.forgetflag() + return result + + def normalize(self, stack): + rstack = list(stack) + rstack.reverse() + code = ['%s = %s;' % (target, self.pop()) for target in rstack] + shift = self.popped-len(self.stack) + code += ['stack_nth(%d) = %s;' % (i, self.pop()) + for i in range(len(self.stack))] + if self.flag is not None and self.flag != 'flag': + self.do('flag = %s;' % self.flag) + if shift != 0: + if shift > 0: + self.do('stack_shift_pos(%d);' % shift) + else: + self.do('stack_shift(%d);' % shift) + for line in code: + self.do(line) + self.stack = list(stack) + self.popped = 0 + + def write(self): + print '{' + if self.locals: + locals = self.locals.keys() + locals.sort() + print '\tword_t %s;' % (', '.join(locals),) + for line in self.codelines: + print '\t' + line + print '}' + + +class InstructionSetWriter: + + def __init__(self, InsnSet, nbaccum=1): + self.InsnSet = InsnSet + self.nbaccum = nbaccum + + diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default b/nodeboxgl/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default new file mode 100644 index 0000000..f1d00cf --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default @@ -0,0 +1,12 @@ +% This file defines combination of instructions, or more precisely instruction +% modes, that should be produced as a single larger instruction with its +% own bytecode. There are about 73 basic instruction modes, so this leaves +% room for 182 extra combined instructions. For example: + +%% mode_combine([s_push(0), immed(char)]). +%% mode_combine([s_push(0), immed(char), cmplt]). +%% mode_combine([s_push(0), immed(char), cmplt, jcondfar(long)]). + +% See py-utils/ivmoptimize.py for a way to generate automatically the 182 best +% combinations for your own program. Optimizing Psyco/IVM in this way for a +% specific program can make it run quite faster. diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/optimize.pl b/nodeboxgl/ext/psyco/src/c/ivm/prolog/optimize.pl new file mode 100644 index 0000000..62c5c75 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/optimize.pl @@ -0,0 +1,186 @@ +:- consult(insns). +:- dynamic psycodump/2, stackpush/2. +:- dynamic frequency/2. + + +%%% interactive usage %%% + +clear :- + retractall(psycodump(_,_)). + +load(DumpDir) :- + atom_concat('python ../../../py-utils/ivmextract.py ', DumpDir, CmdLine), + see(pipe(CmdLine)), + read(Filename), + seen, + loaddumpfile(Filename). + +loaddumpfile(Filename) :- + write('loading '), write(Filename), write('...'), nl, + see(Filename), + load_rec, + seen. + +measure(MaxLength) :- + write('measuring frequencies...'), nl, + tell(pipe('python samelines.py "frequency(%s, %d)." > optimize.tmp')), + ( + L1 = [_,_|_], + codeslice(DynFreq, L1, MaxLength), + generalize(L1, L), + write(DynFreq), write('*'), + write(L), nl, + fail + ) ; + told, + retractall(frequency(_,_)), + loadmeasures. + +loadmeasures :- + see('optimize.tmp'), + load_rec, + seen. + +show :- + findall(F, (F=(Rank,L), frequency(L, Freq), modecost(L, Cost), + Rank is Freq/Cost), Results), + sort(Results, Sorted), + ( + member(X, Sorted), + write(X), nl, + fail + ) ; + true. + +emitmodes(HighestOpcode) :- + write('creating mode_combine.pl...'), nl, + findall(F, (F=(Rank,L), frequency(L, Freq), modecost(L, Cost), + Rank is Cost/Freq), Results), + sort(Results, Sorted), + initial_stack(InitialStack), + countsuccesses(insn_single_mode(_, _, InitialStack), NbBaseOpcodes), + LenMax is HighestOpcode - NbBaseOpcodes, + processmodes(Result, LenMax, Sorted), + FirstOpcode is NbBaseOpcodes+1, + tell('mode_combine.pl'), + ( + enumerate(member(Clause, Result), Opcode, FirstOpcode), + Opcode =< HighestOpcode, + write(Clause), + write('.'), + nl, + fail + ) ; + told. + + +%%% end interactive usage %%% + + +%preprocess(psycodump(L1), psycodump(L2)) :- +% joinlist(basemodes, L1, L2). + +load_rec :- + read(Term), + Term \= end_of_file, + !, + %preprocess(Term, Term1), + assert(Term), + load_rec. +load_rec. + +codeslice(DynFreq, L1, MaxLength) :- + psycodump(DynFreq, L), + subslice(L, L1, MaxLength). + +subslice(L, L1, MaxLength) :- + subslice1(L, L1, MaxLength). +subslice([_|Tail], L1, MaxLength) :- + subslice(Tail, L1, MaxLength). + +subslice1(_, [], _). +subslice1([X|Xs], [X|Ys], MaxLength) :- + MaxLength > 0, + N is MaxLength-1, + subslice1(Xs, Ys, N). + +generalize(L, G) :- + initial_stack(InitialStack), + chainlist(generalize1, L, G, ([], InitialStack), _). + +%:- det(generalize1/4). +generalize1(Term, Mode, (OldOptions, OldStack), (Options, Stack1)) :- + (memberchk(stack(StackOp), OldOptions) -> + insn_stack(StackOp, OldStack, Stack1, dummy) ; + Stack1 = OldStack + ), + Term =.. [Insn | Args], + insn(Insn, FormalArgs, _, Options), + maplist(generalize_arg(Stack1), FormalArgs, Args, ArgModes), + Mode =.. [Insn | ArgModes]. + +%:- det(generalize_arg/4). +generalize_arg(Stack, FormalArg, RealArg, ArgMode) :- + standard_mode(_, Stack, FormalArg, ArgMode), + condition_test(ArgMode, RealArg), + !. + + +complexity(Term, P, Q) :- + (var(Term) -> Subterms = [] ; Term =.. [_ | Subterms]), + S is P+1, + chainlist(complexity, Subterms, S, Q). + +modecost(Mode, Cost) :- + mode_operate(Mode, Code), + codecost(Code, Cost1), + (Cost1 == 0 -> Cost = 1 ; Cost = Cost1). + +length_ex(A, Length) :- + var(A) -> Length = 0 ; + A = [_|B] -> length_ex(B, L), Length is L+1 ; + A = [] -> Length = 0 ; + Length = 1. + +initialslice(_, []). +initialslice([X|Xs], [X|Ys]) :- + initialslice(Xs, Ys). + +regmode(Result, Mode) :- + memberchk(mode_combine(Mode), Result). + +closelist([], []) :- !. +closelist([X|Xs], [X|Ys]) :- !, closelist(Xs, Ys). +closelist(A, [A]). + +processmodes(Result, LenMax, [(_Cost, Mode) | Tail]) :- + length_ex(Result, Len1), + Len1 < LenMax, + !, + InitialMode = [_,_|_], + findall(InitialMode, initialslice(Mode, InitialMode), InitialModes), + maplist(regmode(Result), InitialModes), + processmodes(Result, LenMax, Tail). +processmodes(Result, _, _) :- + closelist(Result, Result). + + +remotecontrol :- + read(Term), + Term \= end_of_file, + !, + Term, + remotecontrol. +remotecontrol. + + +setup :- + retractall(stackpush(_,_)), + ( + count_stackpush(Insn, P), + assert(stackpush(Insn, P)), + fail + ) ; + true. + +:- setup. diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/samelines.py b/nodeboxgl/ext/psyco/src/c/ivm/prolog/samelines.py new file mode 100644 index 0000000..394902e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/samelines.py @@ -0,0 +1,38 @@ +# +# Search for identical lines in stdin. Line starting with "*" +# are assumed to be repeated that number of times. +# stdout report is formatted according to sys.argv[1]. +# +import sys, re + +re1 = re.compile(r"([0-9]+)[*](.*)") + +def samelines(infile, outfile, format, verbose=1, minimum=2): + lines = {} + total = 0 + try: + for line in infile: + verbose -= 1 + if not verbose: + if total: + print >> sys.stderr, '%d lines, %d without duplicates...' % ( + total, len(lines)) + total += 5000 + verbose = 5000 + if line.endswith('\n'): + line = line[:-1] + match = re1.match(line) + if match: + count = int(match.group(1)) + line = match.group(2) + else: + count = 1 + lines[line] = lines.get(line, 0) + count + finally: + for line, count in lines.iteritems(): + if count >= minimum: + print >> outfile, format % (line, count) + +if __name__ == '__main__': + format = sys.argv[1] + samelines(sys.stdin, sys.stdout, format) diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/utils.pl b/nodeboxgl/ext/psyco/src/c/ivm/prolog/utils.pl new file mode 100644 index 0000000..b958389 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/utils.pl @@ -0,0 +1,110 @@ +:- consult(detcheck). + +% succnat(N, N+1) only with N>=0 +succnat(N, Ns) :- succ(N, Ns), N>=0. + +% same as reverse/2, but accepts any instantiation pattern. +reverse1([], []). +reverse1([H1|T1], [H2|T2]) :- + same_length(T1, T2, T2r), + append(T2r, [H2], [H1|T1]), + reverse1(T2, T2r). + +same_length([], []). +same_length([_|T1], [_|T2]) :- + same_length(T1, T2). + +same_length([], [], []). +same_length([_|T1], [_|T2], [_|T3]) :- + same_length(T1, T2, T3). + +% longer versions of append. +% Deterministic if all arguments but the last one are bound. +% Finitely backtracking if the last argument is bound. +append(L1, L2, L3, L123) :- + append(L1, L23, L123), + append(L2, L3, L23). +append(L1, L2, L3, L4, L1234) :- + append(L1, L234, L1234), + append(L2, L34, L234), + append(L3, L4, L34). + +% a shorter and some longer versions of maplist. +maplist(_Pred, []). +maplist(Pred, [H1|T1]) :- + call(Pred, H1), + maplist(Pred, T1). +maplist(_Pred, [], [], []). +maplist(Pred, [H1|T1], [H2|T2], [H3|T3]) :- + call(Pred, H1, H2, H3), + maplist(Pred, T1, T2, T3). +maplist(_Pred, [], [], [], []). +maplist(Pred, [H1|T1], [H2|T2], [H3|T3], [H4|T4]) :- + call(Pred, H1, H2, H3, H4), + maplist(Pred, T1, T2, T3, T4). + +% Succeeds as many times as Goal, with N successfully bound to N0, N0+1, N0+2... +% Can also be used with N bound to get the Nth success of Goal. +enumerate(Goal, N, N0) :- + flag(enumerate, Old, N0), + ( + Goal, + flag(enumerate, Current, Current+1), + N = Current + ; + flag(enumerate, _, Old), + fail). + +% Count the number of successes of Goal +countsuccesses(Goal, N) :- + flag(countsuccesses, Old, 0), + ( + Goal, + flag(countsuccesses, Current, Current+1), + fail + ; + flag(countsuccesses, N, Old)). + +% [X,Y,Z...] --> [(X,0), (Y,1), (Z,2)...] +enumerate_list([], [], Index, Index). +enumerate_list([H|T], [(H, Start)|Tail], Start, End) :- + succ(Start, Next), + enumerate_list(T, Tail, Next, End). + + +% joinlist(+Map, +List, -ResultList) +% calls Map(X,L) for all X in List. ResultList is the concatenation of all L's. +joinlist(_, [], []). +joinlist(Map, [Head|Tail], ResultList) :- + call(Map, Head, L1), + joinlist(Map, Tail, L2), + append(L1, L2, ResultList). + +joinlist(_, [], [], []). +joinlist(Map, [H1|T1], [H2|T2], ResultList) :- + call(Map, H1, H2, L1), + joinlist(Map, T1, T2, L2), + append(L1, L2, ResultList). + +joinlist(_, [], [], [], []). +joinlist(Map, [H1|T1], [H2|T2], [H3|T3], ResultList) :- + call(Map, H1, H2, H3, L1), + joinlist(Map, T1, T2, T3, L2), + append(L1, L2, ResultList). + +% chainlist(+Map, +List, +Input, -Output) +% DCG chain: calls Map(X1, Input, A), Map(X2, A, B), Map(X3, B, C), ... +chainlist(_, [], IO, IO). +chainlist(Map, [Head|Tail], Input, Output) :- + call(Map, Head, Input, Middle), + chainlist(Map, Tail, Middle, Output). + +chainlist(_, [], [], IO, IO). +chainlist(Map, [H1|T1], [H2|T2], Input, Output) :- + call(Map, H1, H2, Input, Middle), + chainlist(Map, T1, T2, Middle, Output). + +chainlist(_, [], [], [], IO, IO). +chainlist(Map, [H1|T1], [H2|T2], [H3|T3], Input, Output) :- + call(Map, H1, H2, H3, Input, Middle), + chainlist(Map, T1, T2, T3, Middle, Output). diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/vm.pl b/nodeboxgl/ext/psyco/src/c/ivm/prolog/vm.pl new file mode 100644 index 0000000..0d52b85 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/vm.pl @@ -0,0 +1,567 @@ +:- consult(ccode). +:- consult(utils). + +:- multifile insn/4, overflow_flag/1. +:- discontiguous insn/4, overflow_flag/1. +:- multifile unary_insn/2, binary_insn/2, unary_insn/1, binary_insn/1. +:- discontiguous unary_insn/2, binary_insn/2, unary_insn/1, binary_insn/1. +:- multifile mode_combine/1, standard_mode/4. + + +% conditions +condition_range(char, -128:127). +condition_range(positive, 0:maxint). +condition_range(byte, 0:255). +%condition_range(truestack(byte), A:B) :- initial_stack_depth(A), B = 255. +%condition_range(truestack(long), A:B) :- initial_stack_depth(A), B = maxint. +condition_range(int, minint:maxint). +condition_range(long, minint:maxint). +condition_range(minint:maxint, minint:maxint) :- !. +condition_range(minint:B, minint:Bx ) :- !, Bx is B. +condition_range(A :maxint, Ax :maxint) :- !, Ax is A. +condition_range(A :B, Ax :Bx ) :- !, Ax is A, Bx is B. +condition_range((C1, C2), A:B) :- + condition_range(C1, A1:B1), + condition_range(C2, A2:B2), + mmax(A1, A2, A), + mmin(B1, B2, B). +condition_range(C1+Offset, A:B) :- + condition_range(C1, A1:B1), + mplus(A1, Offset, A), + mplus(B1, Offset, B). +condition_range(C1-Offset, A:B) :- + condition_range(C1, A1:B1), + mplus(A, Offset, A1), + mplus(B, Offset, B1). +condition_range(A, A:A) :- + integer(A). + +goal_condition(Cond, V, unsigned(V) =< B) :- + condition_range(Cond, 0:B), + integer(B), B>0, !. +goal_condition(Cond, V, V =:= A) :- + condition_range(Cond, A:A), + integer(A), !. +goal_condition(Cond, V, G) :- + condition_range(Cond, A:B), + goal_in_range(V, A, B, G), !. +goal_condition(indirect(_), _, true). + +goal_conj(_, fail, fail) :- !. +goal_conj(fail, _, fail) :- !. +goal_conj(G1, true, G1) :- !. +goal_conj(true, G2, G2) :- !. +goal_conj(G1, G2, (G1, G2)). + +goal_leq(A, A, true) :- !. +goal_leq(minint, _, true) :- !. +goal_leq(maxint, _, fail) :- !. +goal_leq(_, maxint, true) :- !. +goal_leq(_, minint, fail) :- !. +goal_leq(A, B, A =< B). + +goal_add(0, A, A) :- !. +goal_add(A, 0, A) :- !. +goal_add(A, B, B+A). + +mmin(A, B, A) :- goal_leq(A, B, G), G, !. +mmin(_, B, B). +mmax(A, B, B) :- goal_leq(A, B, G), G, !. +mmax(A, _, A). +mplus(minint, _, minint). +mplus(maxint, _, maxint). +mplus(_, minint, minint). +mplus(_, maxint, maxint). +mplus(A, B, C) :- + A \== minint, + A \== maxint, + B \== minint, + B \== maxint, + C \== minint, + C \== maxint, + plus(A, B, C). + +goal_in_range(V, A, B, G) :- + goal_leq(A, B, GCheck), + (GCheck -> + goal_leq(A, V, G1), + goal_leq(V, B, G2), + goal_conj(G1, G2, G) + ; + G = fail). + +condition_test(indirect(_), _) :- !. +condition_test(Cond, V) :- + condition_range(Cond, A:B), + goal_in_range(V, A, B, G), + G. + +goal_nonemptycondition(Cond, G) :- + condition_range(Cond, A:B), + goal_leq(A, B, G). + +goal_subcondition(C1, C2, G) :- + condition_range(C1, A1:B1), + condition_range(C2, A2:B2), + goal_leq(A2, A1, G1), + goal_leq(B1, B2, G2), + goal_conj(G1, G2, G). + +condition_type(Cond, singleton(A)) :- + condition_range(Cond, A:B), + goal_leq(B, A, G), G. +condition_type(Cond, char) :- + goal_subcondition(Cond, char, G), G. +condition_type(Cond, code_t) :- + goal_subcondition(Cond, byte, G), G. +condition_type(indirect(T), T). +condition_type(_, word_t). + + +% instruction helpers +unary_insn(Name, Name) :- unary_insn(Name). +binary_insn(Name, Name) :- binary_insn(Name). + +overflow_code(Name, Args, Ovf, [flag(set)]) :- + overflow_flag(Name), + !, + Op =.. [macro_args | Args], + Ovf = [setflag=ovf_check(Name, Op)]. +overflow_code(_, _, [], []). + +build_simple_insn(Name, COp, Code, Args, Opts) :- + Code = [out(0) = Op | OvfCode], + Op =.. [COp | Args], + overflow_code(Name, Args, OvfCode, Opts). + +insn(Name, [], Code, [stack(1->1)|Opts]) :- + unary_insn(Name, COp), + atom(COp), + build_simple_insn(Name, COp, Code, [in(0)], Opts). + +insn(Name, [], Code, [stack(2->1)|Opts]) :- + binary_insn(Name, COp), + atom(COp), + build_simple_insn(Name, COp, Code, [in(1), in(0)], Opts). + +%insn(Name, [], Code, [stack(1->N)]) :- +% unary_insn(Name, COp), +% is_list(COp), +% length(COp, N), +% build_insn(COp, [in(0)], Code). +% +%insn(Name, [], Code, [stack(2->N)]) :- +% binary_insn(Name, COp), +% is_list(COp), +% length(COp, N), +% build_insn(COp, [in(1), in(0)], Code). +% +%build_insn([COp1|Tail], CArgs, [out(TN) = Op | CodeTail]) :- +% Op =.. [COp1 | CArgs], +% length(Tail, TN), +% build_insn(Tail, CArgs, CodeTail). +%build_insn([], _, []). + + +% combined instructions +mode_pair(Modes, StdMode) :- + mode_combine(MList), + %append(MList1, _, MList), + %Modes = [_|_], + append(Modes, [StdMode], MList). + + +% insn_mode([insn(conditions...), insn(conditions...), ...]) + +% register all standard modes for a single instruction +insn_single_mode(Insn, StdMode, InputStack) :- + insn(Insn, Args, _, Options), + \+ memberchk(suffixonly, Options), + % the first arg of standard_mode/4 is a singleton var that must + % unify to the same atom for all the arguments. In other words + % we are only interested in condlists containing all small or all + % large conditions. + maplist(standard_mode(_, InputStack), Args, CondList), + StdMode =.. [Insn | CondList]. + +insn_mode([StdMode]) :- + initial_stack(Stack), + insn_single_mode(_, StdMode, Stack). + +% register combined modes +insn_mode(MList) :- + mode_pair(Modes, StdMode), + append(Modes, [StdMode], MList). + +standard_mode(small, _, i, char). +standard_mode(large, _, i, int). +standard_mode(_, _, l, indirect(word_t)). +standard_mode(_, _, b, indirect(code_t)). +standard_mode(Sz, Stack, s, Cond) :- + standard_mode_stack(Stack, Sz, 0, Cond). + +standard_mode_stack(push(_, _), _, N, N). +standard_mode_stack(push(_, Queue), Sz, N, Cond) :- + N1 is N+1, + standard_mode_stack(Queue, Sz, N1, Cond). +standard_mode_stack(slice(_), small, N, N:255). +standard_mode_stack(slice(_), large, N, N:maxint). + +% convert between mode and opcode number +:- det(mode_opcode/2). +mode_opcode(Mode, Opcode) :- + enumerate(insn_mode(M), Opcode, 1), + (M = Mode ; M = [Mode]), + !. + +% context stack manipulation +%initial_stack(slice(0)). +initial_stack(push(accum, slice(0))). +%initial_stack(push(accum, push(accum2, slice(0)))). + +initial_stack_depth(N) :- + initial_stack(S0), stack_depth(S0, N). + +cell_length(push(_, Tail), Ns) :- + cell_length(Tail, N), + succ(N, Ns). +cell_length(slice(_), 0). + +stack_depth(push(_, Tail), Ns) :- + stack_depth(Tail, N), + succ(N, Ns). +stack_depth(slice(ExtraPops), N) :- + plus(ExtraPops, N, 0). + +% stack_top(+-Item, +-Tail, -+Stack) <=> Stack = push(Item, Tail) +stack_top(Item, Tail, push(Item, Tail)) :- !. +stack_top(Item, slice(Ns), slice(N)) :- + succ(N, Ns), + stack_nth(slice(N), 0, Item). + +% stack_nth(+Stack, +N, -Item) +stack_nth(push(Item, _), 0, Item). +stack_nth(push(_, Tail), Ns, Item) :- + succnat(N, Ns), + stack_nth(Tail, N, Item). +stack_nth(slice(ExtraPops), N, stack_nth(P)) :- + plus(N, ExtraPops, P). + +% stack_shift(+stack_nth(N), +Shift, -stack_nth(N+Shift)) +stack_shift(stack_nth(N), Shift, stack_nth(M)) :- + plus(N, Shift, M), + !. +stack_shift(Item, _, Item). + + +% instruction stack operations +:- det(insn_stack/4). +insn_stack(none, Stack, Stack, _). + +insn_stack(push, OldStack, NewStack, X) :- + insn_stack(0->1, OldStack, NewStack, X). +insn_stack(pop, OldStack, NewStack, X) :- + insn_stack(1->0, OldStack, NewStack, X). +insn_stack(pop(0), OldStack, NewStack, X) :- + insn_stack(1->0, OldStack, NewStack, X). +insn_stack(pop(Ns), OldStack, NewStack, X) :- + succnat(N, Ns), + stack_top(Top, S1, OldStack), + insn_stack(pop(N), S1, S2, X), + stack_top(Top, S2, NewStack). + +%insn_stack(swap, OldStack, NewStack) :- +% stack_top(X1, S1, OldStack), +% stack_top(X2, S2, S1), +% stack_top(X1, S2, S3), +% stack_top(X2, S3, NewStack). + +insn_stack(unary, OldStack, NewStack, X) :- + insn_stack(1->1, OldStack, NewStack, X). +insn_stack(binary, OldStack, NewStack, X) :- + insn_stack(2->1, OldStack, NewStack, X). + +insn_stack(0->0, Stack, Stack, _). +insn_stack(0->Ns, OldStack, NewStack, X) :- + succnat(N, Ns), + stack_top(_, OldStack, S1), % push a new unnamed variable + insn_stack(0->N, S1, NewStack, X). +insn_stack(Ms->N, OldStack, NewStack, X) :- + succnat(M, Ms), + stack_top(_, S1, OldStack), % pop away the first element + insn_stack(M->N, S1, NewStack, X). + +insn_stack(settos, _, NewStack, extra([_:_|_],[stack_nth(N)])) :- + NewStack = trashed(N). % optimization for the next line + %NewStack = specialop(stack_shift(N), OldStack). +insn_stack(settos, OldStack, NewStack, extra([N|_], _)) :- + integer(N), + insn_stack(N->0, OldStack, NewStack, _). +insn_stack(pushn, OldStack, NewStack, extra(_, [N])) :- + NewStack = specialop(stack_shift(-N), OldStack). + +:- det(insn_operate_stack/4). +insn_operate_stack(Insn, OldStack, NewStack, Extra) :- + insn(Insn, _, _, Options), + (memberchk(stack(StackOp), Options), !; StackOp = none), + insn_stack(StackOp, OldStack, NewStack, Extra). +insn_operate_stack(Insn, OldStack, NewStack) :- + insn_operate_stack(Insn, OldStack, NewStack, dummy). + +:- det(insn_operate_flag/3). +insn_operate_flag(Insn, OldFlag, NewFlag, PreCode, PostCode) :- + insn(Insn, _, _, Options), + (memberchk(flag(get), Options) -> + PreCode = [impl_debug_check_flag(OldFlag)], + PostCode = [impl_debug_forget_flag(OldFlag)], + NewFlag = consumed + ; + PreCode = [], + PostCode = [], + (memberchk(flag(set), Options) -> + true % NewFlag stays a variable + ; + NewFlag = OldFlag)). + +map_operate((OldStack,_), _, _, in(N), Item) :- !, stack_nth(OldStack, N, Item). +map_operate(_, (NewStack,_), _, out(N), Item) :- !, stack_nth(NewStack, N, Item). +map_operate(_, _, InputArgs, arg(N), Item) :- !, nth0(N, InputArgs, Item). +map_operate((OldStack,_), _, _, stkshft, N) :- !, stack_depth(OldStack, N). +map_operate((_,OldFlag), _, _, flag, OldFlag) :- !. +map_operate(_, (_,NewFlag), _, setflag, NewFlag) :- !. +map_operate(P1, P2, P3, Compound, Item) :- + Compound =.. [Functor|Args], + !, + maplist(map_operate(P1, P2, P3), Args, MappedArgs), + Item =.. [Functor|MappedArgs]. +map_operate(_, _, _, Item, Item). + +map_operate_top(P1, P2, P3, X=Y, []) :- + map_operate(P1, P2, P3, X, Item1), var(Item1), + map_operate(P1, P2, P3, Y, Item2), var(Item2), + Item1 = Item2, + !. +map_operate_top(P1, P2, P3, Input, Item) :- + map_operate(P1, P2, P3, Input, Item). + +:- det(insn_operate_code/5). +insn_operate_code(Insn, OldState, NewState, InputArgs, Code) :- + insn(Insn, _, CodeTemplate, _), + maplist(map_operate_top(OldState, NewState, InputArgs), + CodeTemplate, Code). + +:- det(load_initexpr/5). +load_initexpr(CurrentStack, s, Cond, _, A2) :- + condition_range(Cond, N:N), + stack_nth(CurrentStack, N, A2), + !. +load_initexpr(slice(0), s, Cond, A1, stack_nth(A1)) :- + condition_range(Cond, A:_), + goal_leq(0, A, G), G, + !. +load_initexpr(slice(ExtraPops), s, Cond, A1, stack_nth(A1+ExtraPops)) :- + condition_range(Cond, A:_), + goal_leq(0, A, G), G, + !. +load_initexpr(slice(_), s, Cond, _, _) :- + user_error('*** Reading too deep from the stack', Cond). +load_initexpr(push(_, TailStack), s, Cond, A1, stack_nth(A2-1)) :- + load_initexpr(TailStack, s, Cond-1, A1, stack_nth(A2)), + !. +load_initexpr(_, _, _, V, V). + +:- det(init_arg/3). +init_arg(Cond, [], A) :- + condition_type(Cond, singleton(A)), + !. +init_arg(Cond, V=bytecode_next(T), V) :- + condition_type(Cond, T), + !. + +:- det(size_arg/2). +size_arg(Cond, 0) :- + condition_type(Cond, singleton(_)), + !. +size_arg(Cond, bytecode_size(T)) :- + condition_type(Cond, T), + !. + +:- det(mode_operate1/3). +mode_operate1(Mode, (Stack1, Flag1, InitU1, CodeL1), + (Stack2, Flag2, InitU2, CodeL2)) :- + Mode =.. [Insn|CondList], + insn(Insn, Args, _, _), + maplist(init_arg, CondList, InitUnif, InitArgs), + maplist(load_initexpr(Stack1), Args, CondList, InitArgs, UseArgs), + insn_operate_stack(Insn, Stack1, Stack2, extra(CondList, UseArgs)), + insn_operate_flag(Insn, Flag1, Flag2, FlagPreCode, FlagPostCode), + insn_operate_code(Insn, (Stack1, Flag1), (Stack2, Flag2), UseArgs, Code), + append(InitU1, InitUnif, InitU2), + append(CodeL1, FlagPreCode, Code, FlagPostCode, CodeL2). + +:- det(mode_operate/2). +mode_operate(Mode, block_locals(word_t, CodeBlock)) :- + initial_stack(OldStack), + chainlist(mode_operate1, Mode, + (OldStack, flag, [], []), (NewStack, NewFlag, U1, C3)), + mode_unify((NewStack, NewFlag), (OldStack, flag), C4), + append(U1, C3, C4, CodeBlock1), + code_simplify(CodeBlock1, CodeBlock). + +mode_nonclobber_flag(Mode) :- + initial_stack(OldStack), + chainlist(mode_operate1, Mode, + (OldStack, _, [], []), (_, NewFlag, _, _)), + var(NewFlag). + +% stack_unify(+CurrentStack, +TargetStack, -UnificationsList1, -2, -StackShift) +stack_unify(slice(E1), slice(E2), [], [], StackShift) :- + !, + plus(E2, StackShift, E1). +stack_unify(trashed(N), TargetStack, UnifList1, UnifList2, StackShift) :- + !, + stack_unify(slice(0), TargetStack, UnifL1, UnifList2, StackShift), + UnifList1 = [stack_shift(N) | UnifL1]. +stack_unify(specialop(Op, Cur), TargetStack, UnifList1, UnifList2, StackShift) :- + !, + stack_unify(Cur, slice(0), UnifL1, UnifL2, StackShift1), + UnifExtra = [stack_shift(StackShift1), Op], + stack_unify(slice(0), TargetStack, UnifL1bis, UnifList2, StackShift), + reverse(UnifL2, UnifL2r), + append(UnifL1, UnifL2r, UnifExtra, UnifL1bis, UnifList1). +stack_unify(CurrentStack, TargetStack, UnifList1, UnifList2, StackShift) :- + stack_top(Src, S1, CurrentStack), + stack_top(PreDest, S2, TargetStack), + stack_unify(S1, S2, UnifL1, UnifL2, StackShift), + stack_shift(PreDest, StackShift, Dest), + (Src == Dest -> + UnifList1 = UnifL1, + UnifList2 = UnifL2 + ; + UnifList1 = [Temp=Src | UnifL1], + UnifList2 = [Dest=Temp | UnifL2]). + +:- det(mode_unify/3). +mode_unify((S1,F1), (S2,F2), Code) :- + stack_unify(S1, S2, UnifList1, UnifList2, StackShift), + reverse(UnifList2, UnifList2r), + (StackShift > 0 -> + CodeL4 = [stack_shift_pos(StackShift)|CodeTail] + ; + (StackShift < 0 -> + CodeL4 = [stack_shift(StackShift)|CodeTail] + ; + CodeL4 = CodeTail)), + (var(F1) -> + CodeTail = [F2=F1] + ; + CodeTail = []), + append(UnifList1, UnifList2r, CodeL4, Code). + +% instruction emitters +insn_inputargname((_, Index), Name) :- + int_to_atom(Index, Suffix), + atom_concat(arg, Suffix, Name). + +insn_inputargtype(s, 'int') :- !. +insn_inputargtype(l, 'word_t**') :- !. +insn_inputargtype(b, 'code_t**') :- !. +insn_inputargtype(_, 'word_t'). + +insn_declarearg(Name, Type, var(Type, Name)). + +insn_defarglist(Insn, ArgList) :- + insn(Insn, Args, _, _), + enumerate_list(Args, NumberedArgs, 1, _), + maplist(insn_inputargname, NumberedArgs, ArgNames), + maplist(insn_inputargtype, Args, ArgTypes), + maplist(insn_declarearg, ArgNames, ArgTypes, ArgList). + +%insn_preparearg(s, Name, ModifiedName, [var(int, ModifiedName, Init)]) :- +% !, +% atom_concat(Name, s, ModifiedName), +% Init = 'CURRENT_STACK_POSITION'(Name). +insn_preparearg(_, Name, Name, []). + +mode_outputargtype(_, l, 'placeholder_long'). +mode_outputargtype(_, b, 'placeholder_byte'). +mode_outputargtype(Cond, _, void) :- + condition_range(Cond, A:A). +mode_outputargtype(Cond, _, char) :- + goal_subcondition(Cond, char, G), G. +mode_outputargtype(Cond, _, byte) :- + goal_subcondition(Cond, byte, G), G. +mode_outputargtype(_, s, 'int'). +mode_outputargtype(_, _, 'word_t'). + +mode_conditions(Mode, Conditions) :- + Mode =.. [_ | Conditions]. + +mode_emitarg(Cond, Arg, V, emit(Type, V)) :- + mode_outputargtype(Cond, Arg, Type), + !. + +:- det(mode_emit/4). +mode_emit(PrevMode, Mode, InputArgs, Code) :- + Mode =.. [Insn | Conditions], + insn(Insn, Args, _, _), + append(PrevMode, [Mode], FullMode), + mode_opcode(FullMode, Opcode), + (PrevMode = [] -> + Emitter = emit(opcode, Opcode) + ; + joinlist(mode_conditions, PrevMode, PrevConditions), + maplist(size_arg, PrevConditions, Sizes), + chainlist(goal_add, Sizes, 0, TotalSize), + Emitter = emit(modified_opcode, Opcode, TotalSize) + ), + maplist(mode_emitarg, Conditions, Args, InputArgs, CodeL2), + append([Emitter], CodeL2, [setlatestopcode(Opcode), return(code)], Code). + +:- det(insn_definemode/5). +insn_definemode(InputArgs, PrevMode, Mode, Code, ElseCode) :- + Mode =.. [_ | Conditions], + maplist(goal_condition, Conditions, InputArgs, Goals), + chainlist(goal_conj, Goals, true, FinalGoal), + Code = ifte(FinalGoal, CodeL1, ElseCode), + mode_emit(PrevMode, Mode, InputArgs, CodeL1). + +insn_combination(InputArgs, Insn, Case) :- + % setof backtracks over each value of PrevMode, + % giving for each a list of possible Modes. + setof(Mode, Cond^(mode_pair(PrevMode, Mode), Mode=..[Insn|Cond]), + Modes), + mode_opcode(PrevMode, Opcode), + Case = case(Opcode, [comment(PrevMode), Body1]), + chainlist(insn_definemode(InputArgs, PrevMode), Modes, + Body1, FinalCase), + FinalCase = break. + +:- det(insn_defbody/2). +insn_defbody(Insn, block(DeclCode, BodyCode)) :- + insn(Insn, Args, _, Options), + %(memberchk(flag(get), Options) -> + % BodyCode = [extra_assert('FLAG_NONCLOBBERING'('LATEST_OPCODE')) | + % MainBodyCode] + %; + MainBodyCode = BodyCode, + enumerate_list(Args, NumberedArgs, 1, _), + maplist(insn_inputargname, NumberedArgs, ArgNames), + joinlist(insn_preparearg, Args, ArgNames, InputArgs, DeclCode), + MainBodyCode = [switch('LATEST_OPCODE', Cases) | RegularBodyCode], + findall(Code, insn_combination(InputArgs, Insn, Code), Cases), + initial_stack(InitialStack), + findall(StdMode, insn_single_mode(Insn,StdMode,InitialStack), StdModes), + chainlist(insn_definemode(InputArgs, []), StdModes, + RegularBodyCode, FinalCase), + (memberchk(suffixonly, Options) -> + FinalCase = [comment('suffix only'), return(code)] + ; + FinalCase = error(invalid_mode(Insn)) + ). + +:- det(insn_define/4). +insn_define(Insn, Insn, ArgList, Body) :- + insn_defarglist(Insn, ArgList), + insn_defbody(Insn, Body1), + code_simplify(Body1, Body). diff --git a/nodeboxgl/ext/psyco/src/c/ivm/prolog/vmwriter.pl b/nodeboxgl/ext/psyco/src/c/ivm/prolog/vmwriter.pl new file mode 100644 index 0000000..bf3711c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/ivm/prolog/vmwriter.pl @@ -0,0 +1,241 @@ +:- consult(vm). +:- discontiguous main_emit/2. + + +% large-scale code emission: the virtual machine interpreter +main_emit(modes, switch) :- + ( + enumerate(insn_mode(M), Opcode, 1), + mode_operate(M, Code), + format('case ~d: /* ~w */\n', [Opcode, M]), + write_codestmt(Code), + write('continue;\n\n'), + fail + ; + true). + + +threaded_table(absolute, 'void*', + ' &&lblopcode~d, /* ~w */\n', + ' &&lblorigin, /* ~d */\n'). +threaded_table(relative, 'int', + ' &&lblopcode~d - &&lblorigin, /* ~w */\n', + ' 0, /* ~d */\n'). + +threaded_initial(_) :- + write('lblorigin:\npsyco_fatal_msg("invalid vm opcode");\n\n'). + +threaded_jump(absolute) :- + write('goto *opcodetable[bytecode_nextopcode()];\n\n'). +threaded_jump(relative) :- + write('goto *(&&lblorigin + opcodetable[bytecode_nextopcode()]);\n\n'). + +main_emit(modes, threaded(Origin)) :- + threaded_table(Origin, CType, LineFormatStr, MissingFormatStr), + format('static const ~w opcodetable[] = {\n', [CType]), + format(MissingFormatStr, [0]), + ( + enumerate(insn_mode(M), Opcode, 1), + format(LineFormatStr, [Opcode, M]), + fail + ; + countsuccesses(insn_mode(_), NbOpcodes), + FirstMissing is NbOpcodes+1, + write('#if PSYCO_DEBUG\n'), + ( + between(FirstMissing, 255, Opcode), + format(MissingFormatStr, [Opcode]), + fail + ; + write('#endif\n'), + write('};\n'), + threaded_jump(Origin), + threaded_initial(Origin), + ( + enumerate(insn_mode(M), Opcode, 1), + mode_operate(M, Code), + format('lblopcode~d: /* ~w */\n', [Opcode, M]), + write_codestmt(Code), + threaded_jump(Origin), + fail + ; + true))). + +% emits only the definition of a single instruction +main_emit(modes, single(Mode)) :- + mode_operate(Mode, Code), + write_codestmt(Code). + + +% large-scale code emission: the instruction writer helpers +insn_definition(MacroName, MacroArgList, FunctionName, FunctionArgList, Body, + SingleInstr) :- + insn(Insn, _, _, _), + insn_define(Insn, Name, MacroArgList, Body), + atom_concat('INSN_', Name, MacroName), + (Body=block([],[emit(opcode,Op),setlatestopcode(Op)|return(_)]) -> + % macro only + SingleInstr = emit(macro_opcode, Op), + FunctionName = '' + ; + atom_concat('psyco_insn_', Name, FunctionName), + FunctionArgList = [var('code_t*', code) | MacroArgList]). + +main_emit(insns, headers(Prefix)) :- + countsuccesses(insn_mode(_), NbOpcodes), + (NbOpcodes > 255 -> user_error('too many opcodes', NbOpcodes) ; true), + write('#define LAST_DEFINED_OPCODE '), + write(NbOpcodes), + nl, + nl, + ( + insn_definition(MacroName, MacroArgList, + FunctionName, FunctionArgList, _, SingleInstr), + write('#define '), + write_code(macro_call(MacroName, MacroArgList)), + write(' '), + (FunctionName = '' -> + % write as a macro + write_code(SingleInstr), + nl + ; + % write as a call to an EXTERN function + write('(code = '), + write_code(macro_call(FunctionName, FunctionArgList)), + write(')'), + nl, + write(Prefix), + write_code(function_header(FunctionName, 'code_t*', + FunctionArgList)), + write(';'), + nl), + fail + ; + true). + +main_emit(insns, functions(Prefix)) :- + %write('#define FLAG_NONCLOBBERING(op) ( \\'), nl, + %( + % enumerate(insn_mode(M), Opcode, 1), + % mode_nonclobber_flag(M), + % write('\t(op)=='), write(Opcode), write(' || \\\n'), + % fail + %; + %write('\t0)\n'), + ( + insn_definition(_, _, FunctionName, FunctionArgList, Body, _), + (FunctionName = '' -> + % only exists as a macro + true + ; + % write the function definition + nl, + write(Prefix), + write_code(function_def(FunctionName, 'code_t*', + FunctionArgList, Body))), + fail + ; + true). + +% write the instruction table in Python +:- det(objdump_mode/2). +:- det(objdump_insn/1). + +objdump_mode(Opcode, M) :- + format(' ~d: [', [Opcode]), + maplist(objdump_insn, M), + write('],'), + nl. + +objdump_insn(M) :- + M =.. [Insn | Args], + insn(Insn, ArgLetters, _, _), + format('("~w",', [Insn]), + maplist(objdump_arg, Args, ArgLetters), + write('), '). + +objdump_arg(_:255, s) :- !, + write(stack(byte)), + write(','). +objdump_arg(_:maxint, s) :- !, + write(stack(long)), + write(','). +objdump_arg(A, s) :- !, + write(stack(A)), + write(','). +objdump_arg(A, _) :- + write(A), + write(','). + +objdump_stackpushes(M, P) :- + chainlist(objdump_stackpush, M, 0, P). + +objdump_stackpush(M, P1, P2) :- + M =.. [Insn | _], + count_stackpush(Insn, P), + P2 is P1+P. + +count_stackpush(Insn, P) :- + insn(Insn, _, _, Options), + \+ memberchk(nostackanalysis, Options), + (memberchk(stack(StackOp), Options) -> true ; StackOp = none), + objdump_stackop(StackOp, P). + +objdump_chainables(M) :- + maplist(objdump_chainable, M). + +objdump_chainable(M) :- + M =.. [Insn | _], + chainable(Insn). + +chainable(Insn) :- + insn(Insn, _, _, Options), + \+ memberchk(nonchainable, Options). + +objdump_stackop(none, 0). +objdump_stackop(push, 1). +objdump_stackop(pop, -1). +objdump_stackop(pop(_), -1). +objdump_stackop(N->M, P) :- P is M-N. +objdump_stackop(unary, 0). +objdump_stackop(binary, -1). + +main_emit(pytable) :- + write('insntable = {'), + nl, + ( + enumerate(insn_mode(M), Opcode, 1), + objdump_mode(Opcode, M), + fail + ; + write('}'), + nl, + write('stackpushes = {'), + nl, + ( + enumerate(insn_mode(M), Opcode, 1), + objdump_stackpushes(M, P), + format(' ~d: ~d,\n', [Opcode, P]), + fail + ; + write('}'), + nl, + write('chainable = {'), + nl, + ( + enumerate(insn_mode(M), Opcode, 1), + objdump_chainables(M), + format(' ~d: 1,\n', [Opcode]), + fail + ; + write('}'), + nl))). + + +% generate all files +main_emit :- + tell('insns-igen-h.i'), main_emit(insns, headers('EXTERNFN ')), told, + tell('insns-igen.i'), main_emit(insns, functions('DEFINEFN ')), told, + tell('insns-threaded.i'), main_emit(modes, threaded(absolute)), told, + tell('insns-switch.i'), main_emit(modes, switch), told, + tell('insns-table.py'), main_emit(pytable), told. diff --git a/nodeboxgl/ext/psyco/src/c/linuxmemchk.c b/nodeboxgl/ext/psyco/src/c/linuxmemchk.c new file mode 100644 index 0000000..ae16493 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/linuxmemchk.c @@ -0,0 +1,102 @@ +/* custom checking allocators a la Electric Fence */ +#include "linuxmemchk.h" +#if HEAVY_MEM_CHECK +#undef NDEBUG +#include +#include +#include +#include +#include +#include +#include +#define PAGESIZE 4096 +#ifndef MALLOC_BIGBUFFER +# define MALLOC_BIGBUFFER PAGESIZE*16384 +#endif + + +struct _alloc_s { + void* ptr; + int npages; +}; +static void* _na_start = NULL; +static char* _na_cur; + +static struct _alloc_s* _na_find(void* data) +{ + int err; + long data1; + struct _alloc_s* s; + assert(_na_start+PAGESIZE <= data && + data < _na_start+MALLOC_BIGBUFFER-PAGESIZE); + data1 = (long) data; + data1 &= ~(PAGESIZE-1); + data1 -= PAGESIZE; + err = mprotect((void*) data1, PAGESIZE, PROT_READ|PROT_WRITE); + assert(!err); + s = (struct _alloc_s*) data1; + assert(s->npages > 0); + return s; +} + +DEFINEFN +void* memchk_ef_malloc(int size) +{ + int err, npages = (size + PAGESIZE-1) / PAGESIZE + 1; + struct _alloc_s* s; + char* data; + if (_na_start == NULL) + { + _na_start = mmap(NULL, MALLOC_BIGBUFFER, PROT_NONE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(_na_start != MAP_FAILED); + _na_cur = (char*) _na_start; + } + s = (struct _alloc_s*) _na_cur; + _na_cur += npages * PAGESIZE; + if (_na_cur >= ((char*) _na_start) + MALLOC_BIGBUFFER) + { + fprintf(stderr, "Nothing wrong so far, but MALLOC_CHECK is running out\n of mmap'ed memory. Increase MALLOC_BIGBUFFER.\n"); + assert(0); + } + err = mprotect(s, npages * PAGESIZE, PROT_READ|PROT_WRITE|PROT_EXEC); + assert(!err); + s->ptr = data = _na_cur - /*((size+3)&~3)*/ size; + s->npages = npages; + err = mprotect(s, PAGESIZE, PROT_NONE); + assert(!err); + return data; +} + +DEFINEFN +void memchk_ef_free(void* data) +{ + int err, npages; + struct _alloc_s* s; + if (data == NULL) + return; + s = _na_find(data); + assert(s->ptr == data); + npages = s->npages; + s->npages = 0; + err = mprotect(s, npages * PAGESIZE, PROT_NONE); + assert(!err); + //fprintf(stderr, "PyMem_FREE(%p): mprotect %p %x\n", data, s, npages*PAGESIZE); +} + +DEFINEFN +void* memchk_ef_realloc(void* data, int nsize) +{ + int size; + struct _alloc_s* s = _na_find(data); + void* ndata = PyMem_MALLOC(nsize); + + assert(s->ptr == data); + size = ((char*)s) + s->npages * PAGESIZE - (char*)data; + memcpy(ndata, data, size +#undef PyMem_MALLOC +#undef PyMem_REALLOC +#undef PyMem_FREE + +EXTERNFN void* memchk_ef_malloc(int size); +EXTERNFN void memchk_ef_free(void* data); +EXTERNFN void* memchk_ef_realloc(void* data, int nsize); + +#define PyMem_MALLOC memchk_ef_malloc +#define PyMem_REALLOC memchk_ef_realloc +#define PyMem_FREE memchk_ef_free + +#endif diff --git a/nodeboxgl/ext/psyco/src/c/mergepoints.c b/nodeboxgl/ext/psyco/src/c/mergepoints.c new file mode 100644 index 0000000..4b08701 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/mergepoints.c @@ -0,0 +1,947 @@ +#include "mergepoints.h" +#include "vcompiler.h" +#include "stats.h" +#include "Python/pycinternal.h" + +/* set to 1 to compute the detailed control flow + which allows for early variable deletion */ +#define FULL_CONTROL_FLOW 1 +#define DUMP_CONTROL_FLOW 0 + +/* the list of builtins whose usage should disable control flow + because they use the current frame's locals */ +static char* NoControlFlowIfBuiltin[] = { + "eval", "execfile", "locals", "vars", "dir", "input", + NULL +}; + +#define CONFLUENCE_TOTAL_DELAY 3 /* see comments in the code */ +#define INLINE_MAXIMUM_WEIGHT 6 /* see comments in the code */ + + + /***************************************************************/ +/*** Tables of code merge points ***/ + /***************************************************************/ + +/* for each code object we build a bitarray specifying which + positions in the byte code are potential merge points. + A "merge point" is an instruction which can be executed + immediately after two or more other instructions, + typically jump targets. + + The respawn mecanisms (see psyco_prepare_respawn()) require + that a merge point be also added after each instruction + whose produced machine code might depend on external data. + We should also avoid too long uninterrupted ranges of + instructions without a single merge point. +*/ + +/* instructions that cause an unconditional jump: */ +#define IS_JUMP_INSTR(op) (op == BREAK_LOOP || \ + op == RETURN_VALUE || \ + op == JUMP_FORWARD || \ + op == JUMP_ABSOLUTE || \ + op == CONTINUE_LOOP || \ + op == RAISE_VARARGS || \ + IS_EPILOGUE_INSTR(op)) + +/* instructions with a target: */ +#define HAS_JREL_INSTR(op) (op == JUMP_FORWARD || \ + op == JUMP_IF_FALSE || \ + op == JUMP_IF_TRUE || \ + op == FOR_ITER || \ + /* SETUP_LOOP replaced by FOR_ITER */ \ + op == SETUP_EXCEPT || \ + op == SETUP_FINALLY) + +#define HAS_JABS_INSTR(op) (op == JUMP_ABSOLUTE || \ + op == CONTINUE_LOOP) + +/* instructions whose target may be jumped to several times: */ +#define HAS_J_MULTIPLE(op) (op == FOR_ITER || \ + /* SETUP_LOOP replaced by FOR_ITER */ \ + op == SETUP_EXCEPT || \ + op == SETUP_FINALLY) + +/* instructions through which it is not safe to respawn: + LOAD_GLOBAL may produce a run-time or various compile-time values + each time it is respawned */ +#define IS_CTXDEP_INSTR(op) (op == LOAD_GLOBAL || \ + op == LOAD_NAME) + +#define MAX_UNINTERRUPTED_RANGE 170 /* bytecode instructions */ + +/* opcodes that never or seldom produce machine code are listed as + lightweight instructions and don't account for the mesured code weight. */ +#define IS_LIGHT_INSTR(op) (IS_JUMP_INSTR(op) || \ + HAS_JREL_INSTR(op) || \ + HAS_JABS_INSTR(op) || \ + IS_SET_LINENO(op) || \ + IS_NOP(op) || \ + op == POP_TOP || \ + op == ROT_TWO || \ + op == ROT_THREE || \ + op == ROT_FOUR || \ + op == DUP_TOP || \ + op == DUP_TOPX || \ + op == POP_BLOCK || \ + op == END_FINALLY || \ + op == LOAD_CONST || \ + op == LOAD_FAST || \ + op == STORE_FAST || \ + op == DELETE_FAST || \ + op == UNPACK_SEQUENCE || \ + op == BUILD_TUPLE || \ + op == BUILD_LIST || \ + op == BUILD_MAP) + +/* opcodes that can only be compiled at module top-level, + when locals() is globals() */ +#define IS_MODULE_INSTR(op) (op == STORE_NAME || \ + op == DELETE_NAME || \ + op == LOAD_NAME || \ + op == IMPORT_STAR) + +/* all other supported instructions must be listed here. */ +#define OTHER_OPCODE(op) (op == UNARY_POSITIVE || \ + op == UNARY_NEGATIVE || \ + op == UNARY_NOT || \ + op == UNARY_CONVERT || \ + op == UNARY_INVERT || \ + op == BINARY_POWER || \ + op == BINARY_MULTIPLY || \ + op == BINARY_DIVIDE || \ + op == BINARY_MODULO || \ + op == BINARY_ADD || \ + op == BINARY_SUBTRACT || \ + op == BINARY_SUBSCR || \ + op == BINARY_LSHIFT || \ + op == BINARY_RSHIFT || \ + op == BINARY_AND || \ + op == BINARY_XOR || \ + op == BINARY_OR || \ + op == BINARY_FLOOR_DIVIDE || \ + op == BINARY_TRUE_DIVIDE || \ + op == INPLACE_FLOOR_DIVIDE || \ + op == INPLACE_TRUE_DIVIDE || \ + IS_LIST_APPEND(op) || \ + op == INPLACE_POWER || \ + op == INPLACE_MULTIPLY || \ + op == INPLACE_DIVIDE || \ + op == INPLACE_MODULO || \ + op == INPLACE_ADD || \ + op == INPLACE_SUBTRACT || \ + op == INPLACE_LSHIFT || \ + op == INPLACE_RSHIFT || \ + op == INPLACE_AND || \ + op == INPLACE_XOR || \ + op == INPLACE_OR || \ + op == SLICE+0 || \ + op == SLICE+1 || \ + op == SLICE+2 || \ + op == SLICE+3 || \ + op == STORE_SLICE+0 || \ + op == STORE_SLICE+1 || \ + op == STORE_SLICE+2 || \ + op == STORE_SLICE+3 || \ + op == DELETE_SLICE+0 || \ + op == DELETE_SLICE+1 || \ + op == DELETE_SLICE+2 || \ + op == DELETE_SLICE+3 || \ + op == STORE_SUBSCR || \ + op == DELETE_SUBSCR || \ + op == PRINT_EXPR || \ + op == PRINT_ITEM || \ + op == PRINT_ITEM_TO || \ + op == PRINT_NEWLINE || \ + op == PRINT_NEWLINE_TO || \ + op == BUILD_CLASS || \ + op == STORE_ATTR || \ + op == DELETE_ATTR || \ + op == STORE_GLOBAL || \ + op == DELETE_GLOBAL || \ + op == LOAD_GLOBAL || \ + op == LOAD_ATTR || \ + /* COMPARE_OP special-cased */ \ + op == IMPORT_NAME || \ + op == IMPORT_FROM || \ + op == GET_ITER || \ + op == CALL_FUNCTION || \ + op == CALL_FUNCTION_VAR || \ + op == CALL_FUNCTION_KW || \ + op == CALL_FUNCTION_VAR_KW || \ + op == MAKE_FUNCTION || \ + op == BUILD_SLICE || \ + op == SETUP_LOOP) + +#define SUPPORTED_COMPARE_ARG(oparg) ( \ + (oparg) == Py_LT || \ + (oparg) == Py_LE || \ + (oparg) == Py_EQ || \ + (oparg) == Py_NE || \ + (oparg) == Py_GT || \ + (oparg) == Py_GE || \ + (oparg) == PyCmp_IS || \ + (oparg) == PyCmp_IS_NOT || \ + (oparg) == PyCmp_IN || \ + (oparg) == PyCmp_NOT_IN || \ + (oparg) == PyCmp_EXC_MATCH || \ + 0) + + /***************************************************************/ + +#ifdef RETURN_NONE +# define IS_EPILOGUE_INSTR(op) (op == RETURN_NONE) +#else +# define IS_EPILOGUE_INSTR(op) 0 +#endif + +#ifdef SET_LINENO +# define IS_SET_LINENO(op) (op == SET_LINENO) +#else +# define IS_SET_LINENO(op) 0 +#endif + +#ifdef NOP +# define IS_NOP(op) (op == NOP) +#else +# define IS_NOP(op) 0 +#endif + +#ifdef LIST_APPEND +# define IS_LIST_APPEND(op) (op == LIST_APPEND) +#else +# define IS_LIST_APPEND(op) 0 +#endif + +/***************************************************************/ + + +#define MP_OTHER 0x01 +#define MP_IS_JUMP 0x02 +#define MP_HAS_JREL 0x04 +#define MP_HAS_JABS 0x08 +#define MP_HAS_J_MULTIPLE 0x10 +#define MP_LIGHT 0x20 +#define MP_IS_CTXDEP 0x40 +#define MP_IS_MODULE 0x80 + +#define F(op) ((IS_JUMP_INSTR(op) ? MP_IS_JUMP : 0) | \ + (HAS_JREL_INSTR(op) ? MP_HAS_JREL : 0) | \ + (HAS_JABS_INSTR(op) ? MP_HAS_JABS : 0) | \ + (HAS_J_MULTIPLE(op) ? MP_HAS_J_MULTIPLE : 0) | \ + (IS_LIGHT_INSTR(op) ? MP_LIGHT : 0) | \ + (IS_CTXDEP_INSTR(op) ? MP_IS_CTXDEP : 0) | \ + (IS_MODULE_INSTR(op) ? MP_IS_MODULE : 0) | \ + (OTHER_OPCODE(op) ? MP_OTHER : 0)) + +/* opcode table -- the preprocessor expands this into several hundreds KB + of code (which reduces down to 256 bytes!). Hopefully not a problem + for modern C compilers */ +static const unsigned char instr_control_flow[256] = { + F(0x00), F(0x01), F(0x02), F(0x03), F(0x04), F(0x05), F(0x06), F(0x07), + F(0x08), F(0x09), F(0x0A), F(0x0B), F(0x0C), F(0x0D), F(0x0E), F(0x0F), + F(0x10), F(0x11), F(0x12), F(0x13), F(0x14), F(0x15), F(0x16), F(0x17), + F(0x18), F(0x19), F(0x1A), F(0x1B), F(0x1C), F(0x1D), F(0x1E), F(0x1F), + F(0x20), F(0x21), F(0x22), F(0x23), F(0x24), F(0x25), F(0x26), F(0x27), + F(0x28), F(0x29), F(0x2A), F(0x2B), F(0x2C), F(0x2D), F(0x2E), F(0x2F), + F(0x30), F(0x31), F(0x32), F(0x33), F(0x34), F(0x35), F(0x36), F(0x37), + F(0x38), F(0x39), F(0x3A), F(0x3B), F(0x3C), F(0x3D), F(0x3E), F(0x3F), + F(0x40), F(0x41), F(0x42), F(0x43), F(0x44), F(0x45), F(0x46), F(0x47), + F(0x48), F(0x49), F(0x4A), F(0x4B), F(0x4C), F(0x4D), F(0x4E), F(0x4F), + F(0x50), F(0x51), F(0x52), F(0x53), F(0x54), F(0x55), F(0x56), F(0x57), + F(0x58), F(0x59), F(0x5A), F(0x5B), F(0x5C), F(0x5D), F(0x5E), F(0x5F), + F(0x60), F(0x61), F(0x62), F(0x63), F(0x64), F(0x65), F(0x66), F(0x67), + F(0x68), F(0x69), F(0x6A), F(0x6B), F(0x6C), F(0x6D), F(0x6E), F(0x6F), + F(0x70), F(0x71), F(0x72), F(0x73), F(0x74), F(0x75), F(0x76), F(0x77), + F(0x78), F(0x79), F(0x7A), F(0x7B), F(0x7C), F(0x7D), F(0x7E), F(0x7F), + F(0x80), F(0x81), F(0x82), F(0x83), F(0x84), F(0x85), F(0x86), F(0x87), + F(0x88), F(0x89), F(0x8A), F(0x8B), F(0x8C), F(0x8D), F(0x8E), F(0x8F), + F(0x90), F(0x91), F(0x92), F(0x93), F(0x94), F(0x95), F(0x96), F(0x97), + F(0x98), F(0x99), F(0x9A), F(0x9B), F(0x9C), F(0x9D), F(0x9E), F(0x9F), + F(0xA0), F(0xA1), F(0xA2), F(0xA3), F(0xA4), F(0xA5), F(0xA6), F(0xA7), + F(0xA8), F(0xA9), F(0xAA), F(0xAB), F(0xAC), F(0xAD), F(0xAE), F(0xAF), + F(0xB0), F(0xB1), F(0xB2), F(0xB3), F(0xB4), F(0xB5), F(0xB6), F(0xB7), + F(0xB8), F(0xB9), F(0xBA), F(0xBB), F(0xBC), F(0xBD), F(0xBE), F(0xBF), + F(0xC0), F(0xC1), F(0xC2), F(0xC3), F(0xC4), F(0xC5), F(0xC6), F(0xC7), + F(0xC8), F(0xC9), F(0xCA), F(0xCB), F(0xCC), F(0xCD), F(0xCE), F(0xCF), + F(0xD0), F(0xD1), F(0xD2), F(0xD3), F(0xD4), F(0xD5), F(0xD6), F(0xD7), + F(0xD8), F(0xD9), F(0xDA), F(0xDB), F(0xDC), F(0xDD), F(0xDE), F(0xDF), + F(0xE0), F(0xE1), F(0xE2), F(0xE3), F(0xE4), F(0xE5), F(0xE6), F(0xE7), + F(0xE8), F(0xE9), F(0xEA), F(0xEB), F(0xEC), F(0xED), F(0xEE), F(0xEF), + F(0xF0), F(0xF1), F(0xF2), F(0xF3), F(0xF4), F(0xF5), F(0xF6), F(0xF7), + F(0xF8), F(0xF9), F(0xFA), F(0xFB), F(0xFC), F(0xFD), F(0xFE), F(0xFF), +}; +#undef F + + +struct instrnode_s { + struct instrnode_s* next1; /* next instruction */ + struct instrnode_s* next2; /* next instr (jump target) */ + struct instrnode_s* next3; /* next instr (exception handler) */ + unsigned char opcode; /* copy of the instruction opcode */ + unsigned char back; /* # of bytes to go back to find the instruction */ + unsigned char inpaths; /* number of incoming paths to this point */ + unsigned char pending; /* parse bytecode pending */ + global_entries_t* mp; /* set a mergepoint here? (see MPSET_XXX) */ + int mask; /* mask of bits for needed variables */ + int storemask; /* mask of bits for stored variables */ +}; + +#define MPSET_NEVER ((global_entries_t*) NULL) +#define MPSET_MAYBE ((global_entries_t*) -1) +#define MPSET_YES ((global_entries_t*) -2) +#define MPSET_FORCE ((global_entries_t*) -3) + + +/***************************************************************/ +#if FULL_CONTROL_FLOW + +/* how many variables fit in the 'int' bitfield of instrnode_s */ +#define VARS_PER_PASS (sizeof(int)*8-1) + +PSY_INLINE bool back_propagate_mask(struct instrnode_s* instrnodes, + struct instrnode_s* node, + int var0) +{ + bool modif = false; + int prevmask, mask, oparg; + while (node > instrnodes) + { + node--; + oparg = node->mask; + node -= node->back; /* skip back argument */ + if (node->next1 != NULL) + { + prevmask = mask = node->mask; + mask |= node->next1->mask; + /*fprintf(stderr, "propagate1 %d <- %d\n", + node-instrnodes, node->next1-instrnodes);*/ + if (node->next2 != NULL) + { + mask |= node->next2->mask; + /*fprintf(stderr, "propagate2 %d <- %d\n", + node-instrnodes, node->next1-instrnodes);*/ + if (node->next3 != NULL) { + mask |= node->next3->mask; + /*fprintf(stderr, "propagate3 %d <- %d\n", + node-instrnodes, node->next1-instrnodes);*/ + } + } + if (node->opcode == STORE_FAST) + { + int bit = oparg - var0; + if (0 <= bit && bit < VARS_PER_PASS) + mask &= ~(1< %x\n", + node-instrnodes, mask, node->mask);*/ + node->mask = mask; + modif = true; + } + } + + } + return modif; +} + +PSY_INLINE void mark_var_uses(struct instrnode_s* instrnodes, + struct instrnode_s* node, + int var0) +{ + while (node > instrnodes) + { + int m1 = 1<back) + { + int oparg = node->mask; + node -= node->back; /* skip back argument */ + if (node->opcode == LOAD_FAST || node->opcode == DELETE_FAST) + { + int bit = oparg - var0; + if (0 <= bit && bit < VARS_PER_PASS) + m1 |= (1<mask = m1; + node->storemask = 0; + } +} + +PSY_INLINE int function_args_mask(int var0, int ninitialized) +{ + int bits = ninitialized - var0; + if (bits <= 0) + return 0; + else if (bits >= VARS_PER_PASS) + return -1; + else + return (1<storemask) != node->storemask) + { + node->storemask = newmask; + if (!node->next1) + break; + if (node->mp) + { + /* at each mergepoint, we only keep variables that are + also present in mode->mask. */ + newmask &= node->mask; + } + if (node->opcode == STORE_FAST) + { + /* after each STORE_FAST, add the corresponding bit into newmask */ + int oparg = node[1].mask; + int bit = oparg - var0; + if (0 <= bit && bit < VARS_PER_PASS) + newmask |= (1<next2) + { + forward_propagate(node->next2, newmask, var0); + if (node->next3) + forward_propagate(node->next3, newmask, var0); + } + node = node->next1; + } +} + +PSY_INLINE void find_unused_vars(struct instrnode_s* instrnodes, + struct instrnode_s* node, + int var0) +{ + while (node > instrnodes) + { + node--; + node -= node->back; /* skip back argument */ + if (node->mp) + { + /* if at that mergepoint we have no use for a variable, + write a note to say it can be deleted. */ + int remove = node->storemask & ~node->mask; + int i; + psyco_assert(node->mask & (1<>=1) + if (remove & 1) + psyco_ge_unused_var(node->mp, i); + } + } +} + +static void analyse_variables(struct instrnode_s* instrnodes, + struct instrnode_s* end, + PyCodeObject* co) +{ + int var0; + int nlocals = co->co_nlocals; + int ninitialized = co->co_argcount; + if (co->co_flags & CO_VARKEYWORDS) ninitialized++; + if (co->co_flags & CO_VARARGS) ninitialized++; + + for (var0 = 0; var0 < nlocals; var0 += VARS_PER_PASS) + { + mark_var_uses(instrnodes, end, var0); + while (back_propagate_mask(instrnodes, end, var0)) + ; + forward_propagate(instrnodes, (function_args_mask(var0, ninitialized) | + (1<mp) + { + PyObject* plist = instrnodes->mp->fatlist; + int j; + fprintf(stderr, " line %d: %d ", PyCode_Addr2Line(co, i), i); + for (j=0; jco_varnames, num); + fprintf(stderr, " [%s]", PyString_AsString(o1)); + } + fprintf(stderr, "\n"); + } + } +#endif +} + +#endif /* FULL_CONTROL_FLOW */ +/***************************************************************/ + + +DEFINEFN +PyObject* psyco_build_merge_points(PyCodeObject* co, int module) +{ + PyObject* s; + mergepoint_t* mp; + int mp_flags = MP_FLAGS_EXTRA; + int length = PyString_GET_SIZE(co->co_code); + unsigned char* source = (unsigned char*) PyString_AS_STRING(co->co_code); + size_t ibytes = (length+1) * sizeof(struct instrnode_s); + struct instrnode_s* instrnodes; + int i, lasti, count; + bool modif; + PyTryBlock blockstack[CO_MAXBLOCKS]; + int iblock, bytecodeweight, iblockmax = 0; + bool valid_controlflow = true; + PyObject *etype, *evalue, *etb; + + if (length == 0) + { + /* normally a code object's code string is never empty, + but pyexpat.c has some hacks that we have to work around */ + Py_INCREF(Py_None); + return Py_None; + } +#ifdef CO_GENERATOR + /* check for this flag -- it is not enough to check for the presence of + a YIELD_VALUE instruction because such an instruction might exist but + be unreachable. */ + if (co->co_flags & CO_GENERATOR) + { + debug_printf(1 + (strcmp(PyCodeObject_NAME(co), "?")==0), + ("unsupported generator at %s\n", + PyCodeObject_NAME(co))); + Py_INCREF(Py_None); + return Py_None; + } +#endif /* CO_GENERATOR */ + + instrnodes = (struct instrnode_s*) PyMem_MALLOC(ibytes); + if (instrnodes == NULL) + OUT_OF_MEMORY(); + memset(instrnodes, 0, ibytes); + + PyErr_Fetch(&etype, &evalue, &etb); + + /* parse the bytecode once, filling the instrnodes[].opcode,back,mask fields */ + iblock = 0; + for (i=0; i iblockmax) iblockmax = iblock; + break; + + case POP_BLOCK: + psyco_assert(iblock > 0); + iblock--; + break; + + case BREAK_LOOP: + /* break the innermost loop */ + btop = iblock; + do { + psyco_assert(btop>0); + btop--; + } while (blockstack[btop].b_type != SETUP_LOOP && + blockstack[btop].b_type != SETUP_FINALLY); + /* jump to the loop bottom or finally handler */ + instrnodes[i0].next3 = instrnodes + blockstack[btop].b_handler; + if (blockstack[btop].b_type != SETUP_LOOP) + { /* argh, this gets messy */ + /* because END_FINALLY will then jump to the loop bottom */ + valid_controlflow = false; + } + break; + + case CONTINUE_LOOP: + btop = iblock; + do { + psyco_assert(btop>0); + btop--; + } while (blockstack[btop].b_type != SETUP_LOOP && + blockstack[btop].b_type != SETUP_FINALLY); + if (blockstack[btop].b_type == SETUP_LOOP) + { /* jump to the loop head */ + instrnodes[i0].next3 = instrnodes + oparg; + } + else + { /* argh, this gets messy */ + instrnodes[i0].next3 = instrnodes + blockstack[btop].b_handler; + valid_controlflow = false; + } + break; + + case LOAD_GLOBAL: + case LOAD_NAME: + { + PyObject* namev = PyTuple_GET_ITEM(co->co_names, oparg); + char** p; + for (p = NoControlFlowIfBuiltin; *p; p++) + if (strcmp(PyString_AS_STRING(namev), *p) == 0) + valid_controlflow = false; + } + break; + } + } + if (iblock != 0) + valid_controlflow = false; /* ?? */ + + /* control flow analysis */ + bytecodeweight = 0; + instrnodes[0].pending = 1; + do + { + modif = false; + for (i=0; ipending |= 1; + if (instrnodes[i].next2 != NULL) + { + instrnodes[i].next2->pending |= 1; + if (instrnodes[i].next3 != NULL) + instrnodes[i].next3->pending |= 1; + } + } + instrnodes[i].pending = 3; /* the current instruction is done */ + modif = true; + } + } while (modif); + + /* check with the user-defined filter function, if any */ + if (psyco_codeobj_filter_fn != NULL) + { + int res; + PyObject* o = PyObject_CallFunction(psyco_codeobj_filter_fn, "O", + (PyObject*) co); + res = o == NULL ? -1 : PyObject_IsTrue(o); + Py_XDECREF(o); + if (res < 0) + PyErr_WriteUnraisable(psyco_codeobj_filter_fn); + if (res <= 0) + { + s = Py_None; + Py_INCREF(s); + goto done; + } + } + + /* set and count merge points */ + /* a confluence point is an instruction with more than one incoming path */ + /* a merge point is generally set for each confluence point, but it may be + set a bit later than the actual confluence point or completely + omitted if there is another confluence point just after */ + + /* ensure there are confluence points at regular intervals */ + lasti = MAX_UNINTERRUPTED_RANGE; + for (i=1; i 0) + { + if (instrnodes[i].inpaths >= 2) + lasti = MAX_UNINTERRUPTED_RANGE; /* fine */ + else + if (!--lasti) + { + /* it's been too long, force a confluence point */ + instrnodes[i].inpaths = 99; + } + } + + instrnodes[0].inpaths = 99; + instrnodes[0].mp = MPSET_YES; /* there is a merge point at the beginning */ + count = 1; + { + /* the "weight" of a confluence point is the number of important + intructions that have to be done to reach the next confluence point. + It may be zero. The un-important instructions are listed in + IS_LIGHT_INSTR() and are marked MPSET_NEVER. + Some confluence points need not induce a merge point, but the total + weight of such omitted confluence points must not exceed + CONFLUENCE_TOTAL_DELAY. */ + + /* Confluence points of weight zero are stripped right away. + 'cpnodes' is a list of the best non-null lightweight confluence points, + sorted by weight, ended by a sentinel with cpnodes==NULL and cpweight== + CONFLUENCE_TOTAL_DELAY+1 - (sum of the previous cpweights). */ + struct instrnode_s* cpnodes[CONFLUENCE_TOTAL_DELAY+1]; + int cpweight[CONFLUENCE_TOTAL_DELAY+1]; + int weight, insertat, nextweight, insertweight; + struct instrnode_s* node; + struct instrnode_s* mpnode; + struct instrnode_s* nextnode; + cpnodes[0] = NULL; + cpweight[0] = CONFLUENCE_TOTAL_DELAY+1; + for (i=1; i= 2) /* confluence point */ + { + /* compute the weight */ + weight = 0; + insertat = 0; + mpnode = node = instrnodes + i; + if (mpnode->mp == MPSET_FORCE) + goto set_merge_point; + + while (1) + { + if (node->next2 != NULL) + goto set_merge_point; /* give up in case of fork */ + node = node->next1; + if (node == NULL || node->inpaths >= 2) + break; + if (node->mp == MPSET_MAYBE) + { + /* skipping over an important instruction */ + weight++; + while (weight >= cpweight[insertat]) + { + if (cpnodes[insertat] == NULL) /* sentinel */ + goto set_merge_point; /* too heavy, give up */ + insertat++; + } + } + } + /* reached the next confluence point or the end of the code */ + if (weight > 0) + { + /* record the confluence point */ + insertweight = weight; + do + { + nextnode = cpnodes [insertat]; + nextweight = cpweight[insertat]; + cpnodes [insertat] = mpnode; + cpweight[insertat] = insertweight; + mpnode = nextnode; + insertweight = nextweight; + insertat++; + } + while (mpnode != NULL); /* sentinel */ + + if (insertweight > weight) + { + /* no need to discard a confluence point, the + total weight is still low enough */ + cpnodes [insertat] = NULL; + cpweight[insertat] = insertweight - weight; + } + else + { + /* total weight exceeded, force the latest (heaviest) + confluence point into a merge point */ + insertat--; + mpnode = cpnodes[insertat]; + cpnodes [insertat] = NULL; + cpweight[insertat] += insertweight - weight; + extra_assert(cpweight[insertat] >= 1); + goto set_merge_point; + } + } + /* if we get here, the merge point is not needed */ + continue; + + set_merge_point: + mpnode->mp = MPSET_YES; + count++; + } + /* confluence points left in 'cpnodes' are discarded */ + } + +/* { */ +/* static int stats = 0, statsc = 0; */ +/* stats++; */ +/* statsc += count; */ +/* fprintf(stderr, "%d mergepoints in %d code obj\n", statsc, stats); */ +/* } */ + + /* inlinable functions are those not too heavy, with no merge point + after the mandatory first one, and with no iblock stack use */ + if (count == 1 && bytecodeweight <= INLINE_MAXIMUM_WEIGHT && iblockmax == 0) + { + mp_flags |= MP_FLAGS_INLINABLE; + debug_printf(2, ("inlining code object '%s'\n", PyCodeObject_NAME(co))); + } + + /* allocate the string buffer, one mergepoint_t per merge point plus + the room for a final negative bitfield flags. */ + ibytes = count * sizeof(mergepoint_t) + sizeof(int); + s = PyString_FromStringAndSize(NULL, ibytes); + if (s == NULL) + OUT_OF_MEMORY(); + mp = (mergepoint_t*) PyString_AS_STRING(s); + + for (i=0; ibytecode_position = i; + instrnodes[i].mp = &mp->entries; + psyco_ge_init(&mp->entries); + mp++; + } + } + extra_assert(mp - (mergepoint_t*) PyString_AS_STRING(s) == count); + mp->bytecode_position = mp_flags; +#if FULL_CONTROL_FLOW + if (valid_controlflow) + { + mp->bytecode_position |= MP_FLAGS_CONTROLFLOW; + analyse_variables(instrnodes, instrnodes+length, co); + } +#endif + + done: + PyMem_FREE(instrnodes); + PyErr_Restore(etype, evalue, etb); + return s; +} + +DEFINEFN +mergepoint_t* psyco_next_merge_point(PyObject* mergepoints, + int position) +{ + mergepoint_t* array; + int bufsize; + extra_assert(PyString_Check(mergepoints)); + array = (mergepoint_t*) PyString_AS_STRING(mergepoints); + bufsize = PyString_GET_SIZE(mergepoints); + extra_assert((bufsize % sizeof(mergepoint_t)) == sizeof(int)); + bufsize /= sizeof(mergepoint_t); + extra_assert(bufsize > 0); + do { + int test = bufsize/2; + if (position > array[test].bytecode_position) + { + ++test; + array += test; + bufsize -= test; + } + else + { + bufsize = test; + } + } while (bufsize > 0); + return array; +} + +DEFINEFN +PyObject* psyco_get_merge_points(PyCodeObject* co, int module) +{ + return PyCodeStats_MergePoints(PyCodeStats_Get(co), module); +} + +DEFINEVAR PyObject* psyco_codeobj_filter_fn = NULL; diff --git a/nodeboxgl/ext/psyco/src/c/mergepoints.h b/nodeboxgl/ext/psyco/src/c/mergepoints.h new file mode 100644 index 0000000..415c2c1 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/mergepoints.h @@ -0,0 +1,89 @@ + /***************************************************************/ +/*** Tables of code merge points ***/ + /***************************************************************/ + +#ifndef _MERGEPOINTS_H +#define _MERGEPOINTS_H + + +#include "psyco.h" +#include "dispatcher.h" +#include + +/* A merge point is a point reached by two or more control paths in + the bytecode. They are a subset of the targets found by the standard + module function dis.findlabels(). It may be a subset because some + targets can only be reached by jumping from a single point, e.g. 'else:'. + Such targets are not merge points. +*/ + +struct mergepoint_s { + int bytecode_position; + global_entries_t entries; +}; + +/* 'bytecode_ptr' gives the position of the merge point in the bytecode. + An array of mergepoint_t structures is sorted against this field. + + 'entries' is a list of snapshots of the compiler states previously + encountered at this point. +*/ + +/* Caching version of the following function */ +EXTERNFN PyObject* psyco_get_merge_points(PyCodeObject* co, int module); + +/* The following function detects the merge points and builds an array of + mergepoint_t structures, stored into a Python string object. It returns + Py_None if the bytecode uses unsupported instructions. */ +EXTERNFN PyObject* psyco_build_merge_points(PyCodeObject* co, int module); + +/* Get a pointer to the first mergepoint_t structure in the array whose + 'bytecode_ptr' is >= position. */ +EXTERNFN mergepoint_t* psyco_next_merge_point(PyObject* mergepoints, + int position); + +/* Get a pointer to the very first mergepoint_t structure in the array */ +PSY_INLINE mergepoint_t* psyco_first_merge_point(PyObject* mergepoints) +{ + extra_assert(PyString_Check(mergepoints)); + return (mergepoint_t*) PyString_AS_STRING(mergepoints); +} + +/* Same as psyco_next_merge_point() but returns NULL if bytecode_ptr!=position */ +PSY_INLINE mergepoint_t* psyco_exact_merge_point(PyObject* mergepoints, + int position) +{ + mergepoint_t* mp = psyco_next_merge_point(mergepoints, position); + if (mp->bytecode_position != position) + mp = NULL; + return mp; +} + + +#define MP_FLAGS_HAS_EXCEPT 1 /* the code block has an 'except' clause */ +#define MP_FLAGS_HAS_FINALLY 2 /* the code block has a 'finally' clause */ +#define MP_FLAGS_INLINABLE 4 /* function could be inlined */ +#define MP_FLAGS_MODULE 8 /* can only run as module top-level code */ +#define MP_FLAGS_CONTROLFLOW 16 /* can use early deletion of locals */ +#define MP_FLAGS_EXTRA (-256) + +PSY_INLINE int psyco_mp_flags(PyObject* mergepoints) +{ + char* endptr = PyString_AS_STRING(mergepoints)+PyString_GET_SIZE(mergepoints); + return ((int*) endptr)[-1]; +} + +/* end of PsycoObject construction */ +PSY_INLINE mergepoint_t* PsycoObject_Ready(PsycoObject* po) { + mergepoint_t* mp; + psyco_assert_coherent(po); + mp = psyco_first_merge_point(po->pr.merge_points); + psyco_delete_unused_vars(po, &mp->entries); + return mp; +} + +/* A user-defined filter function to prevent compilation of some code objs */ +EXTERNVAR PyObject* psyco_codeobj_filter_fn; + + +#endif /* _MERGEPOINTS_H */ diff --git a/nodeboxgl/ext/psyco/src/c/mkincl.py b/nodeboxgl/ext/psyco/src/c/mkincl.py new file mode 100644 index 0000000..5f69558 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/mkincl.py @@ -0,0 +1,16 @@ +import sys, os + +def getincl(): + PY_VER = sys.version[:3] + for p in (sys.prefix, sys.exec_prefix): + if sys.executable.startswith(p): + return [os.path.join(sys.prefix, 'include', 'python'+PY_VER)] + base = os.path.dirname(sys.executable) + if os.path.exists(os.path.join(base, 'Include')): + return [os.path.join(base, 'Include'), base, os.path.join(base, 'Stackless')] + raise IOError, 'cannot find the include directories for %s' % sys.executable + +INCLUDE_STR = ' '.join(['-I%s' % s for s in getincl()]) + +if __name__ == '__main__': + print INCLUDE_STR diff --git a/nodeboxgl/ext/psyco/src/c/mychecker.py b/nodeboxgl/ext/psyco/src/c/mychecker.py new file mode 100644 index 0000000..3e85d9d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/mychecker.py @@ -0,0 +1,78 @@ +import re, dis +recase = re.compile(r'case\s+([A-Z_][A-Z_+0-9]*)\s*[:]') +rebin = re.compile(r'BINARY_OPCODE[(]([A-Z_][A-Z_+0-9]*),') +remiss = re.compile(r'[/*]*MISSING_OPCODE[(]([A-Z_][A-Z_+0-9]*)[)]') + +if dis.opname[86] == 'YIELD_STMT': + dis.opname[86] = 'YIELD_VALUE' + +inswitch = 0 +lst = [] +miss = [] +warn = 0 + +def register(op): + global warn + print "%29s" % op, + if op not in lst: + lst.append(op) + if op not in dis.opname: + print "%29s" % "<--- unknown opcode", + #warn += 1 + print + +print "+++ Found +++" +print + +for line in open('Python/pycompiler.c').readlines(): + line = line.strip() + if line.startswith('switch (opcode)'): + inswitch = 1 + elif line.endswith('/* switch (opcode) */'): + inswitch = 0 + elif inswitch: + m = recase.match(line) or rebin.match(line) + if m: + register(m.group(1)) + else: + m = remiss.match(line) + if m: + miss.append(m.group(1)) +print +print + +assert not inswitch + +print '+++ Not implemented +++' +print +for i, opname in zip(range(1,256), dis.opname[1:]): + if not opname.startswith('<') and opname not in lst: + print "%4d %29s" % (i, opname), + if opname not in miss: + print "%29s" % "<--- forgotten ?", + warn += 1 + else: + miss.remove(opname) + print +print + +for opname in miss: + print "%29s" % opname, "%29s" % "<--- marked as missing, don't know why" + +print + +for line in open('mergepoints.c').readlines(): + for word in lst: + if line.find(word) >= 0: + lst.remove(word) + break + +for word in lst: + print '!!! Not found in mergepoints.c !!!' + print + print word + print + warn += 1 + +if warn: + print ' !!! %d warning(s) !!!' % warn diff --git a/nodeboxgl/ext/psyco/src/c/platform.c b/nodeboxgl/ext/psyco/src/c/platform.c new file mode 100644 index 0000000..916f63f --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/platform.c @@ -0,0 +1,66 @@ +/* + * OS-specific utilities. + * + * The rationale is that #include cannot be put anywhere else + * because it messes up things like default alignments; if included in the + * body of Psyco, we get crashes at run-time. + * + * This file is compiled separated. + */ + +/************************************************************/ +#ifdef _WIN32 +/************************************************************/ + +#include + +long psyco_allocate_executable_buffer(long basicsize, char **result) +{ + DWORD old; + char *p = (char*) VirtualAlloc(NULL, basicsize, MEM_COMMIT|MEM_RESERVE, + PAGE_EXECUTE_READWRITE); + if (p == NULL) + return 0; + VirtualProtect(p, basicsize, PAGE_EXECUTE_READWRITE, &old); + /* ignore errors, just try */ + *result = p; + return basicsize; +} + +/************************************************************/ +#else /* Assume UNIX */ +/************************************************************/ + +#include +#include +#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) +# define MAP_ANONYMOUS MAP_ANON +#endif + +long psyco_allocate_executable_buffer(long basicsize, char **result) +{ +#if defined(MAP_ANONYMOUS) && defined(MAP_PRIVATE) +/* note that some platforms *require* the allocation to be performed + by mmap, because PyMem_MALLOC() doesn't set the PROT_EXEC flag. + On these platforms we just hope that the first allocation is + successful, so that when another allocation fails, Psyco correctly + signals the OUT_OF_MEMORY. */ + long bigsize = basicsize * 32; /* allocate 32 blocks at a time */ + char *p = (char*) mmap(NULL, bigsize, + PROT_EXEC|PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if (p == MAP_FAILED || p == NULL) + return 0; + *result = p; + return bigsize; + +#else + + return 0; + +#endif +} + +/************************************************************/ +#endif /* !MS_WINDOWS */ +/************************************************************/ diff --git a/nodeboxgl/ext/psyco/src/c/platform.h b/nodeboxgl/ext/psyco/src/c/platform.h new file mode 100644 index 0000000..45ccff6 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/platform.h @@ -0,0 +1,9 @@ +/* + * OS-specific utilities. + */ + +/* allocate 'basicsize' bytes, or possibly a multiple of it if allocating + large blocks of memory is better. The allocated address is stored + in '*result'. The total allocated size is returned, or 0 to try some + other allocation method. */ +extern long psyco_allocate_executable_buffer(long basicsize, char **result); diff --git a/nodeboxgl/ext/psyco/src/c/processor.h b/nodeboxgl/ext/psyco/src/c/processor.h new file mode 100644 index 0000000..7df5f10 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/processor.h @@ -0,0 +1,43 @@ + /***************************************************************/ +/*** Processor-specific execution ***/ + /***************************************************************/ + +#ifndef _PROCESSOR_H +#define _PROCESSOR_H + +#include "psyco.h" + + +/***************************************************************/ + /*** Execution ***/ + +/* executes a block of code. A new stack frame is created and + the 'initial_stack' values are PUSHed into it. The number + of values pushed are determined by the saved arguments_count of + the 'codebuf'. +*/ +struct stack_frame_info_s; +EXTERNFN PyObject* psyco_processor_run(CodeBufferObject* codebuf, + long initial_stack[], + struct stack_frame_info_s*** finfo, + PyObject* tdict); + +#define RUN_ARGC(codebuf) \ + (extra_assert(CodeBuffer_Check((codebuf))), \ + (int)((get_stack_depth(&((CodeBufferObject*)(codebuf))->snapshot) \ + - INITIAL_STACK_DEPTH - sizeof(long)) / sizeof(long))) + +/* call a C function with a variable number of arguments + (implemented as a pointer to assembler code) */ +EXTERNVAR long (*psyco_call_var) (void* c_func, int argcount, long arguments[]); + +/* check for signed integer multiplication overflow */ +EXTERNVAR char (*psyco_int_mul_ovf) (long a, long b); + +/* find the next stack frame + ("next" = more recent in time = towards innermost frames) */ +EXTERNFN struct stack_frame_info_s** +psyco_next_stack_frame(struct stack_frame_info_s** finfo); + + +#endif /* _PROCESSOR_H */ diff --git a/nodeboxgl/ext/psyco/src/c/profile.c b/nodeboxgl/ext/psyco/src/c/profile.c new file mode 100644 index 0000000..6271e6e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/profile.c @@ -0,0 +1,673 @@ +#include "profile.h" +#include "stats.h" +#include "cstruct.h" +#include "Python/pyver.h" +#include "Python/frames.h" +#include "codemanager.h" + + +/* There are three profilers you can choose from: + + 1) Profiling via Python's profiler hooks + (active profiling) + 2) Have a parallel thread that peeks for info + (passive profiling, rough precision, requires threads) + 3) Both + (XXX test and compare all three choices) + + We use the tick_counter field of the PyThreadState to + measure "execution time", on the basis that Psyco is + good at removing opcode dispatching and the inter-opcode + allocations, so the theory is that the more opcodes are + executed, the better Psyco will perform on that code. +*/ + +/* Internal invariants in PyCodeStats: + + st_codebuf is NULL if not compiled yet, + None if the compilation failed, + or a real code buffer object. + + st_globals is NULL if the code should be normally executed, + an int if we want to accelerate that code object, + or the globals dictionary that st_codebuf we compiled with. + + Valid states are: (st_codebuf, st_globals) + + (NULL, NULL) normal execution + (NULL, rec-level) compile at the next occasion + (None, NULL) compilation failed + (codebuf, globals) compilation succeeded +*/ + + +/***************************************************************/ + /*** Flexibly hooking routines into Python's profiler and ***/ + /*** tracing hooks ***/ + +#define PyTrace_TOTAL 4 + + +/* a hook routine returns NULL or the code buffer object containing + the compiled code to run now. */ +typedef PyObject* (*ceval_event_fn) (PyFrameObject* frame, PyObject* arg); + +struct cevent_s { + ceval_event_fn fn; + PyObject* arg; +}; +struct cevents_s { + int count; + struct cevent_s* items; +}; +typedef struct { + PyCStruct_HEAD + /*PyThread_type_lock lock; not needed, changes protected by the GIL */ + struct cevents_s events[PyTrace_TOTAL]; + PyThreadState* tstate; + int events_total; + char current_hook; /* 'P'rofile, 'T'race */ +} ceval_events_t; + +static PyObject* ceval_events_key; /* interned string */ + +static void ceval_events_dealloc(ceval_events_t* cev) +{ + int i; + /*extra_assert(PyThread_acquire_lock(cev->lock, NOWAIT_LOCK));*/ + for (i=0; ievents[i].items); + } + /*PyThread_free_lock(cev->lock);*/ +} + +static ceval_events_t* new_cevents(PyThreadState* tstate) +{ + ceval_events_t* cev; + PyObject* dict = tstate->dict; + + RECLIMIT_SAFE_ENTER(); + if (dict == NULL) { + dict = tstate->dict = PyDict_New(); + if (dict == NULL) + OUT_OF_MEMORY(); + } + cev = PyCStruct_NEW(ceval_events_t, ceval_events_dealloc); + /*cev->lock = PyThread_allocate_lock();*/ + memset(cev->events, 0, sizeof(cev->events)); + cev->tstate = tstate; + cev->events_total = 0; + cev->current_hook = 0; + if (PyDict_SetItem(dict, ceval_events_key, (PyObject*) cev)) + OUT_OF_MEMORY(); + RECLIMIT_SAFE_LEAVE(); + Py_DECREF(cev); /* one ref left in dict */ + return cev; +} + +PSY_INLINE ceval_events_t* get_cevents(PyThreadState* tstate) +{ + PyObject* dict = tstate->dict; + if (dict != NULL) { + PyObject* o = PyDict_GetItem(dict, ceval_events_key); + if (o != NULL) { + extra_assert(PyCStruct_Check(o)); + return (ceval_events_t*) o; + } + } + return new_cevents(tstate); +} + + +static PyObject* deleted_ceval_hook(PyFrameObject* frame, PyObject* arg) +{ + return NULL; +} + +static void set_ceval_hook(ceval_events_t* cev, int when, + ceval_event_fn fn, PyObject* arg) +{ + int n, i, allow; + struct cevents_s* events; + extra_assert(0 <= when && when < PyTrace_TOTAL); + events = cev->events + when; + n = events->count++; + PyMem_RESIZE(events->items, struct cevent_s, events->count); + if (events->items == NULL) + OUT_OF_MEMORY(); + events->items[n].fn = fn; + events->items[n].arg = arg; + cev->events_total++; + if (arg != NULL) { + /* bound the total number of hooks by checking if there are + too many other hooks with the same 'fn' */ + allow = 8; + for (i=n; --i >= 0; ) { + if (events->items[i].fn == fn && !--allow) { + /* too many! remove an arbitrary one */ + events->items[i].fn = &deleted_ceval_hook; + cev->events_total--; + break; + } + } + } +} + +static void unset_ceval_hook(ceval_events_t* cev, int when, + ceval_event_fn fn, PyObject* arg) +{ + /* warning: do not shuffle values in the events->items array to + compact it, because this might be called while the array is + being enumerated by call_ceval_hooks() */ + int n; + struct cevents_s* events; + extra_assert(0 <= when && when < PyTrace_TOTAL); + events = cev->events + when; + n = events->count; + while (n--) { + if (events->items[n].fn == fn && events->items[n].arg == arg) { + events->items[n].fn = &deleted_ceval_hook; + cev->events_total--; + } + } +} + +#if VERBOSE_STATS +# define set_ceval_hook(cev, when, fn, arg) do { \ + stats_printf(("set_ceval_hook: " #when ", " #fn ", " #arg " = 0x%x\n", (int)arg)); \ + set_ceval_hook(cev, when, fn, arg); \ + } while (0) +# define unset_ceval_hook(cev, when, fn, arg) do { \ + stats_printf(("unset_ceval_hook: " #when ", " #fn ", " #arg " = 0x%x\n", (int)arg)); \ + unset_ceval_hook(cev, when, fn, arg); \ + } while (0) +#endif + +PSY_INLINE bool call_ceval_hooks(ceval_events_t* cev, int what, PyFrameObject* f) +{ + bool r = true; + int n; + struct cevents_s* events; + PyObject* codebuf; + PyObject* obj; + extra_assert(what >= 0); + if (what >= PyTrace_TOTAL) + return true; /* Python >= 2.4 defines PyTrace_C_xxx */ +#if VERBOSE_LEVEL >= 3 + stats_printf(("hook: %d %s\n", what, PyCodeObject_NAME(f->f_code))); +#endif + events = cev->events + what; + n = events->count; + do { + if (n == 0) + return true; /* done */ + n--; + extra_assert(n < events->count); + codebuf = events->items[n].fn(f, events->items[n].arg); + if (events->items[n].fn == &deleted_ceval_hook) { + events->items[n] = events->items[--events->count]; + } + } while (codebuf == NULL); + + /* call the other hooks, if any */ + while (n != 0) { + n--; + extra_assert(n < events->count); + obj = events->items[n].fn(f, events->items[n].arg); + Py_XDECREF(obj); + if (events->items[n].fn == &deleted_ceval_hook) { + events->items[n] = events->items[--events->count]; + } + } + /* enable recursive calls to call_ceval_hooks() */ + f->f_tstate->use_tracing = 1; + f->f_tstate->tracing--; + /* run the compiled code */ + r = PsycoCode_Run(codebuf, f, what == PyTrace_CALL); + f->f_tstate->tracing++; + Py_DECREF(codebuf); +#if (PY_VERSION_HEX >= 0x02030000) && (PY_VERSION_HEX < 0x020300f0) + if (!r) f->f_stacktop = NULL; /* work around a bug in Python 2.3b1 */ +#endif + return r; +} + + +static int do_trace_or_profile(PyObject *v, PyFrameObject *frame, + int what, PyObject *arg) +{ + return !call_ceval_hooks((ceval_events_t*) v, what, frame); +} +static void extended_SetProfile(PyThreadState* tstate, Py_tracefunc func, + PyObject* arg) +{ + /* cannot use PyEval_SetProfile() because it cannot set the + hook for another tstate than the current one */ + PyObject *temp = tstate->c_profileobj; + Py_XINCREF(arg); + tstate->c_profilefunc = NULL; + tstate->c_profileobj = NULL; + tstate->use_tracing = tstate->c_tracefunc != NULL; + Py_XDECREF(temp); + tstate->c_profilefunc = func; + tstate->c_profileobj = arg; + tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL); +} +static void extended_SetTrace(PyThreadState* tstate, Py_tracefunc func, + PyObject* arg) +{ + /* cannot use PyEval_SetProfile() because it cannot set the + hook for another tstate than the current one */ + PyObject *temp = tstate->c_traceobj; + Py_XINCREF(arg); + tstate->c_tracefunc = NULL; + tstate->c_traceobj = NULL; + tstate->use_tracing = tstate->c_profilefunc != NULL; + Py_XDECREF(temp); + tstate->c_tracefunc = func; + tstate->c_traceobj = arg; + tstate->use_tracing = ((func != NULL) + || (tstate->c_profilefunc != NULL)); +} +PSY_INLINE bool pstartprofile(PyThreadState* tstate) +{ + /* Set Python profile function to our function */ + if (tstate->c_profilefunc == NULL) { + ceval_events_t* cev = get_cevents(tstate); + extended_SetProfile(tstate, &do_trace_or_profile, + (PyObject*) cev); + } + return tstate->c_profilefunc == &do_trace_or_profile; +} +PSY_INLINE void pstopprofile(PyThreadState* tstate) +{ + if (tstate->c_profilefunc == &do_trace_or_profile) { + extended_SetProfile(tstate, NULL, NULL); + } +} +PSY_INLINE bool pstarttrace(PyThreadState* tstate) +{ + /* Set Python profile function to our function */ + if (tstate->c_tracefunc == NULL) { + ceval_events_t* cev = get_cevents(tstate); + extended_SetTrace(tstate, &do_trace_or_profile, + (PyObject*) cev); + } + return tstate->c_tracefunc == &do_trace_or_profile; +} +PSY_INLINE void pstoptrace(PyThreadState* tstate) +{ + if (tstate->c_tracefunc == &do_trace_or_profile) { + extended_SetTrace(tstate, NULL, NULL); + } +} + + +static bool update_ceval_hooks(ceval_events_t* cev) +{ + char needed; + if (cev->events_total == 0) { + needed = 0; + } + else if (cev->events[PyTrace_LINE].count == 0) { + needed = 'P'; /* profile hook only, no line-by-line tracing */ + } + else { + needed = 'T'; /* line-by-line tracing hook */ + } + if (cev->current_hook != needed) { + PyThreadState* tstate = cev->tstate; + switch (cev->current_hook) { + case 'P': + pstopprofile(tstate); + break; + case 'T': + pstoptrace(tstate); + break; + } + switch (needed) { + case 'P': + if (pstartprofile(tstate)) + break; /* ok */ + needed = 'T'; + /* cannot use profile hook, try to fall through + to trace hook */ + debug_printf(1, ("profiler hooks busy, " + "trying with the slower trace hooks")); + + case 'T': + if (pstarttrace(tstate)) + break; /* ok */ + cev->current_hook = 0; + stats_printf(("stats: update_ceval_hooks() cancel\n")); + return false; + } + cev->current_hook = needed; + } + return true; +} + + +/***************************************************************/ + /*** Profiling all threads ***/ + +typedef void (*profile_fn) (ceval_events_t*, int); +static profile_fn profile_function = NULL; + +DEFINEFN +void psyco_profile_threads(int start) +{ + PyInterpreterState* istate; + PyThreadState* tstate; + + if (!profile_function) + return; + istate = PyThreadState_Get()->interp; + for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { + ceval_events_t* cev; + if (!measuring_state(tstate)) + continue; + cev = get_cevents(tstate); + if (start == !cev->current_hook) { + stats_printf(("stats: %s hooks on thread %p\n", + start?"adding":"removing", tstate)); + profile_function(cev, start); + if (!update_ceval_hooks(cev) && start) { + /* cannot start, stop again */ + profile_function(cev, 0); + } + } + } +} + +DEFINEFN bool psyco_set_profiler(void (*rs)(void*, int)) +{ + if (rs == NULL) { + psyco_profile_threads(0); + } + else { + ceval_events_t* cev = get_cevents(PyThreadState_Get()); + profile_fn f = (profile_fn) rs; + f(cev, 1); + if (!update_ceval_hooks(cev)) { + psyco_profile_threads(0); + return false; + } + profile_function = f; + psyco_profile_threads(1); + } + return true; +} + + +/***************************************************************/ + /*** Active profiling via Python's profiler hooks ***/ + +static PyObject* profile_call(PyFrameObject* frame, PyObject* arg) +{ + PyCodeStats* cs; + psyco_stats_append(frame->f_tstate, frame->f_back); + + cs = PyCodeStats_Get(frame->f_code); + if (cs->st_globals != NULL) { + /* we want to accelerate this code object */ + if (cs->st_codebuf == NULL) { + /* not already compiled, compile it now */ + PyObject* g = frame->f_globals; + int rec, module; + stats_printf(("stats: compile code: %s\n", + PyCodeObject_NAME(frame->f_code))); + if (PyInt_Check(cs->st_globals)) + rec = PyInt_AS_LONG(cs->st_globals); + else + rec = DEFAULT_RECURSION; + module = frame->f_globals == frame->f_locals; + cs->st_codebuf = PsycoCode_CompileCode(frame->f_code, + g, rec, module); + if (cs->st_codebuf == Py_None) + g = NULL; /* failed */ + else { + Py_INCREF(g); + extra_assert + (CodeBuffer_Check(cs->st_codebuf)); + } + Py_DECREF(cs->st_globals); + cs->st_globals = g; + } + /* already compiled a Psyco version, run it + if the globals match */ + extra_assert(frame->f_globals != NULL); + if (cs->st_globals == frame->f_globals) { + Py_INCREF(cs->st_codebuf); + return cs->st_codebuf; + } + } + return NULL; +} + +static PyObject* profile_return(PyFrameObject* frame, PyObject* arg) +{ + psyco_stats_append(frame->f_tstate, frame); + return NULL; +} + +DEFINEFN +void psyco_rs_profile(void* cev_raw, int start) +{ + ceval_events_t* cev = (ceval_events_t*) cev_raw; + if (start) { + set_ceval_hook(cev, PyTrace_CALL, &profile_call, NULL); + set_ceval_hook(cev, PyTrace_RETURN, &profile_return, NULL); + } + else { + unset_ceval_hook(cev, PyTrace_CALL, &profile_call, NULL); + unset_ceval_hook(cev, PyTrace_RETURN, &profile_return, NULL); + } +} + + +/***************************************************************/ + /*** Full compiling via Python's profiler hooks ***/ + +static PyObject* do_fullcompile(PyFrameObject* frame, PyObject* arg) +{ + PyCodeStats* cs; + cs = PyCodeStats_Get(frame->f_code); + if (cs->st_codebuf == NULL) { + /* not already compiled, compile it now */ + PyObject* g = frame->f_globals; + int rec, module; + stats_printf(("stats: full compile code: %s\n", + PyCodeObject_NAME(frame->f_code))); + if (cs->st_globals && PyInt_Check(cs->st_globals)) + rec = PyInt_AS_LONG(cs->st_globals); + else + rec = DEFAULT_RECURSION; + module = frame->f_globals == frame->f_locals; + cs->st_codebuf = PsycoCode_CompileCode(frame->f_code, + g, rec, module); + if (cs->st_codebuf == Py_None) + g = NULL; /* failed */ + else { + Py_INCREF(g); + extra_assert(CodeBuffer_Check(cs->st_codebuf)); + } + Py_XDECREF(cs->st_globals); + cs->st_globals = g; + } + /* already compiled a Psyco version, run it if the globals match */ + extra_assert(frame->f_globals != NULL); + if (cs->st_globals == frame->f_globals) { + Py_INCREF(cs->st_codebuf); + return cs->st_codebuf; + } + return NULL; +} + +DEFINEFN +void psyco_rs_fullcompile(void* cev_raw, int start) +{ + ceval_events_t* cev = (ceval_events_t*) cev_raw; + if (start) { + set_ceval_hook(cev, PyTrace_CALL, &do_fullcompile, NULL); + } + else { + unset_ceval_hook(cev, PyTrace_CALL, &do_fullcompile, NULL); + } +} + + +/***************************************************************/ + /*** No compiling, but execution of already compiled code ***/ + +static PyObject* do_nocompile(PyFrameObject* frame, PyObject* arg) +{ + PyCodeStats* cs; + cs = PyCodeStats_MaybeGet(frame->f_code); + /* if already compiled a Psyco version, run it if the globals match */ + if (cs != NULL && cs->st_codebuf != NULL && + cs->st_globals == frame->f_globals) { + extra_assert(frame->f_globals != NULL); + Py_INCREF(cs->st_codebuf); + return cs->st_codebuf; + } + return NULL; +} + +DEFINEFN +void psyco_rs_nocompile(void* cev_raw, int start) +{ + ceval_events_t* cev = (ceval_events_t*) cev_raw; + if (start) { + set_ceval_hook(cev, PyTrace_CALL, &do_nocompile, NULL); + } + else { + unset_ceval_hook(cev, PyTrace_CALL, &do_nocompile, NULL); + } +} + + +/***************************************************************/ + /*** Turbo-ing a frame via Python's tracing hooks ***/ + +/* Careful when changing the fields of a Python frame: ceval.c's + interpreter will reload the changes and go on seamlessly only + when hitting a line-trace step. */ + +static PyObject* turbo_wait(PyFrameObject* frame, PyObject* target_frame); + +static PyObject* turbo_go(PyFrameObject* frame, PyObject* target_frame) +{ + PyObject* result; + ceval_events_t* cev = get_cevents(frame->f_tstate); + + /* single-shooting callback */ + unset_ceval_hook(cev, PyTrace_LINE, &turbo_go, target_frame); + + if ((PyObject*) frame == target_frame) { + /* the target is the current frame, compile it now */ + stats_printf(("stats: compile frame: %s\n", + PyCodeObject_NAME(frame->f_code))); + result = PsycoCode_CompileFrame(frame, DEFAULT_RECURSION); + if (result == Py_None) { + Py_DECREF(result); + result = NULL; + } + } + else { + /* hey, where is my frame? */ + PyFrameObject* f = frame->f_back; + stats_printf(("stats: where is my frame?\n")); + for (; f; f = f->f_back) { + if ((PyObject*) f == target_frame) { + /* it is lower in the stack, wait until + we return to it */ + stats_printf(("stats: lower in the stack.\n")); + set_ceval_hook(cev, PyTrace_RETURN, &turbo_wait, + target_frame); + break; + } + } + /* if nowhere to be seen, forget it */ + result = NULL; + } + if (!update_ceval_hooks(cev)) + unset_ceval_hook(cev, PyTrace_RETURN, &turbo_wait, target_frame); + return result; +} + +static PyObject* turbo_wait(PyFrameObject* frame, PyObject* target_frame) +{ + if ((PyObject*)(frame->f_back) == target_frame) { + /* here is my frame, we are returning back to it */ + ceval_events_t* cev = get_cevents(frame->f_tstate); + unset_ceval_hook(cev, PyTrace_RETURN, &turbo_wait, target_frame); + set_ceval_hook(cev, PyTrace_LINE, &turbo_go, target_frame); + if (!update_ceval_hooks(cev)) + unset_ceval_hook(cev, PyTrace_LINE, + &turbo_go, target_frame); + } + return NULL; +} + +DEFINEFN +bool psyco_turbo_frame(PyFrameObject* frame) +{ + if (frame->f_lasti >= 0) { + /* turbo-run the frame at the next possible occasion + unless the frame is actually emulated from a Psyco frame */ + ceval_events_t* cev = get_cevents(frame->f_tstate); + stats_printf(("stats: turbo frame: %s\n", + PyCodeObject_NAME(frame->f_code))); +/* if (frame->f_tstate != PyThreadState_GET()) { */ +/* stats_printf(("stats: TSTATE = %p, F_TSTATE=%p\n", */ +/* PyThreadState_GET(), */ +/* frame->f_tstate)); */ +/* } */ + set_ceval_hook(cev, PyTrace_LINE, &turbo_go, (PyObject*) frame); + if (!update_ceval_hooks(cev)) { + unset_ceval_hook(cev, PyTrace_LINE, &turbo_go, + (PyObject*) frame); + return false; + } + } + return true; +} + +DEFINEFN +void psyco_turbo_code(PyCodeObject* code, int recursion) +{ + PyCodeStats* cs = PyCodeStats_Get(code); + if (cs->st_codebuf == NULL && cs->st_globals == NULL) { + /* trigger compilation at the next occasion + by storing something non-NULL in st_globals */ + cs->st_globals = PyInt_FromLong(recursion); + if (cs->st_globals == NULL) + OUT_OF_MEMORY(); + } +} + +DEFINEFN +void psyco_turbo_frames(PyCodeObject* code) +{ + /* search all reachable Python frames + (this might overlook pending generators) */ + PyInterpreterState* istate = PyThreadState_Get()->interp; + PyThreadState* tstate; + for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { + PyFrameObject* f = tstate->frame; + for (; f; f = f->f_back) { + if (f->f_code == code) + psyco_turbo_frame(f); + } + } +} + + + /***************************************************************/ + +INITIALIZATIONFN +void psyco_profile_init(void) +{ + ceval_events_key = PyString_InternFromString("PsycoC"); +} diff --git a/nodeboxgl/ext/psyco/src/c/profile.h b/nodeboxgl/ext/psyco/src/c/profile.h new file mode 100644 index 0000000..9f1d090 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/profile.h @@ -0,0 +1,37 @@ + /***************************************************************/ +/*** Profilers to collect statistics ***/ + /***************************************************************/ + +#ifndef _PROFILE_H +#define _PROFILE_H + + +#include "psyco.h" +#include "Python/frames.h" +#include +#include + + +/* enable profiling, see comments in profile.c for the various methods */ +EXTERNFN bool psyco_set_profiler(void (*rs)(void*, int)); +/* where 'rs' may be: */ +EXTERNFN void psyco_rs_profile(void*, int); +EXTERNFN void psyco_rs_fullcompile(void*, int); +EXTERNFN void psyco_rs_nocompile(void*, int); + +/* enable the same profiling feature on all threads */ +EXTERNFN void psyco_profile_threads(int start); + +/* call this when it is detected to be worthwhile to give a frame a + little Psyco help */ +EXTERNFN bool psyco_turbo_frame(PyFrameObject* frame); + +/* call this to mark the code object as being worthwhile to + systematically accelerate */ +EXTERNFN void psyco_turbo_code(PyCodeObject* code, int recursion); + +/* call this to accelerate all frames currently executing the given code */ +EXTERNFN void psyco_turbo_frames(PyCodeObject* code); + + +#endif /* _PROFILE_H */ diff --git a/nodeboxgl/ext/psyco/src/c/psyco.c b/nodeboxgl/ext/psyco/src/c/psyco.c new file mode 100644 index 0000000..6ad5a6c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/psyco.c @@ -0,0 +1,1054 @@ +#include "psyco.h" +#include "psyfunc.h" +#include "codemanager.h" +#include "stats.h" +#include "profile.h" +#include "dispatcher.h" +#include "Python/pycompiler.h" +#include "Python/frames.h" +#include "alarm.h" +#include "timing.h" +#include "mergepoints.h" + +#define PSYCO_INITIALIZATION +#include "initialize.h" /* generated by files.py */ + +static PyObject* thread_dict_key; + +DEFINEFN +PyObject* psyco_thread_dict() +{ + PyObject* dict = PyThreadState_GetDict(); + PyObject* result; + bool err; + + if (dict == NULL) + return NULL; + result = PyDict_GetItem(dict, thread_dict_key); + if (result == NULL) + { + result = PyDict_New(); + if (result == NULL) + return NULL; + err = PyDict_SetItem(dict, thread_dict_key, result); + Py_DECREF(result); /* one reference left in 'dict' */ + if (err) + result = NULL; + } + return result; +} + +DEFINEFN +void psyco_out_of_memory(char *filename, int lineno) +{ + char *msg; + if (PyErr_Occurred()) + { + PyErr_Print(); + msg = "psyco cannot recover from the error above"; + } + else + msg = "psyco: out of memory"; + fprintf(stderr, "%s:%d: ", filename, lineno); + Py_FatalError(msg); +} + + /***************************************************************/ +/*** Implementation of the '_psyco' built-in module ***/ + /***************************************************************/ + +DEFINEVAR PyObject* PyExc_PsycoError; +DEFINEVAR long psyco_memory_usage = 0; +DEFINEVAR PyObject* CPsycoModule; +DEFINEVAR PyObject* psyco_logger = NULL; + + +#if VERBOSE_LEVEL +DEFINEFN +void psyco_debug_printf(char* msg, ...) +{ + va_list vargs; + fprintf(stderr, "psyco: "); + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, msg); +#else + va_start(vargs); +#endif + vfprintf(stderr, msg, vargs); + va_end(vargs); +} +#endif /* VERBOSE_LEVEL */ + + +/* Trace */ +#if defined(PSYCO_TRACE) +static void* trace_buffer[4096]; +static int trace_bufdata = 4096; +static FILE* trace_f = NULL; +DEFINEFN void psyco_trace_execution(char* msg, void* code_position) +{ + if (trace_bufdata == 4096) + { + if (trace_f == NULL) + trace_f = fopen(PSYCO_TRACE, "wb"); + else + fwrite(trace_buffer, sizeof(void*), 4096, trace_f); + trace_bufdata = 0; + } + trace_buffer[trace_bufdata++] = code_position; +} +static void trace_flush(void) +{ + if (trace_f != NULL) + { + fwrite(trace_buffer, sizeof(void*), trace_bufdata, trace_f); + fclose(trace_f); + trace_f = NULL; + trace_bufdata = 4096; + } +} +#elif VERBOSE_LEVEL >= 4 +DEFINEFN void psyco_trace_execution(char* msg, void* code_position) +{ + debug_printf(4, ("trace %p for %s\n", code_position, msg)); +} +DEFINEFN void psyco_trace_execution_noerr(char* msg, void* code_position) +{ + debug_printf(4, ("trace %p for %s\n", code_position, msg)); + psyco_assert(!PyErr_Occurred()); +} +#endif + + +DEFINEFN +void psyco_flog(char* msg, ...) +{ + va_list vargs; + PyObject* s; + PyObject* r; + PyObject *etype, *evalue, *etb; + extra_assert(psyco_logger != NULL); + + PyErr_Fetch(&etype, &evalue, &etb); + +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, msg); +#else + va_start(vargs); +#endif + s = PyString_FromFormatV(msg, vargs); + va_end(vargs); + + if (s == NULL) + OUT_OF_MEMORY(); + r = PyObject_CallFunction(psyco_logger, "O", s); + if (r == NULL) + PyErr_WriteUnraisable(psyco_logger); + else + Py_DECREF(r); + Py_DECREF(s); + + PyErr_Restore(etype, evalue, etb); +} + + +DEFINEFN +int psyco_fatal_error(char* msg, char* filename, int lineno) +{ + fprintf(stderr, "\n%s:%d: %s\n", filename, lineno, msg); + Py_FatalError("Psyco assertion failed"); + return 0; +} + +#if CODE_DUMP +static void vinfo_array_dump(vinfo_array_t* array, FILE* f, PyObject* d) +{ + int i = array->count; + fprintf(f, "%d\n", i); + while (i--) + { + vinfo_t* vi = array->items[i]; + PyObject* key = PyInt_FromLong((long)vi); + psyco_assert(key); + fprintf(f, "%ld\n", (long)vi); + if (vi != NULL && !PyDict_GetItem(d, key)) + { + switch (gettime(vi->source)) { + case CompileTime: + fprintf(f, "ct %ld %ld\n", + CompileTime_Get(vi->source)->refcount1_flags, + CompileTime_Get(vi->source)->value); + break; + case RunTime: + fprintf(f, "rt %ld\n", vi->source); + break; + case VirtualTime: + fprintf(f, "vt 0x%lx\n", (long) VirtualTime_Get(vi->source)); + break; + default: + psyco_fatal_msg("gettime() corrupted"); + } + PyDict_SetItem(d, key, Py_None); + vinfo_array_dump(vi->array, f, d); + } + Py_DECREF(key); + } +} +#ifndef MS_WIN32 +static void vinfo_dump_a1(vinfo_array_t* array) +{ + char cmdline[999]; + FILE* f; + sprintf(cmdline, "\"%s\" ../py-utils/vinfo_dump.py", Py_GetProgramFullPath()); + f = popen(cmdline, "w"); + if (f == NULL) + fprintf(stderr, "shell cannot execute: %s\n", cmdline); + else + { + PyObject* d = PyDict_New(); + psyco_assert(d); + vinfo_array_dump(array, f, d); + Py_DECREF(d); + pclose(f); + } +} +DEFINEFN void vinfo_dump(vinfo_t* vi) +{ + /* use this interactively, within the C debugger. Unix only */ + vinfo_array_t array; + array.count = 1; + array.items[0] = vi; + vinfo_dump_a1(&array); + if (&vinfo_dump) ; /* force the compiler to consider it as used */ +} +DEFINEFN void po_dump(PsycoObject* po) +{ + /* use this interactively, within the C debugger. Unix only */ + vinfo_dump_a1(&po->vlocals); + if (&po_dump) ; /* force the compiler to consider it as used */ +} +DEFINEFN void po_inlined_in(PsycoObject* po) +{ + if (po->pr.is_inlining) + { + fprintf(stderr, "inlined from position %d in\n", + (int) (CompileTime_Get(po->vlocals.items[0]-> + array->items[1]->source)->value)); + _PyObject_Dump((PyObject*) + (CompileTime_Get(po->vlocals.items[0]-> + array->items[0]->source)->value)); + } + else + fprintf(stderr, "not inlined\n"); + if (&po_inlined_in) ; /* force the compiler to consider it as used */ +} +#endif /* !MS_WIN32 */ +#if !ALL_STATIC + EXTERNFN int psyco_top_array_count(FrozenPsycoObject* fpo); /*in dispatcher.c*/ +#else +# define psyco_top_array_count fz_top_array_count +#endif +DEFINEFN +void psyco_dump_code_buffers(void) +{ + static int is_dumping = 0; + FILE* f; + +#if CODE_DUMP >= 3 + static int alt = 1; + char filename[200]; + sprintf(filename, "%s-%d", CODE_DUMP_FILE, alt); + alt = 3-alt; +#else + char* filename = CODE_DUMP_FILE; +#endif + +#if defined(PSYCO_TRACE) + trace_flush(); +#endif + + if (is_dumping) return; + is_dumping = 1; + f = fopen(filename, "wb"); + if (f != NULL) + { + CodeBufferObject* obj; + PyObject *exc, *val, *tb; + long buftablepos; + void** chain; + int bufcount = 0; + long* buftable; + PyErr_Fetch(&exc, &val, &tb); + debug_printf(1, ("writing %s\n", filename)); + + for (obj=psyco_codebuf_chained_list; obj != NULL; obj=obj->chained_list) + bufcount++; + buftable = PyMem_NEW(long, bufcount); + fprintf(f, "Psyco dump [%s]\n", MACHINE_CODE_FORMAT); + fwrite(&bufcount, sizeof(bufcount), 1, f); + buftablepos = ftell(f); + fwrite(buftable, sizeof(long), bufcount, f); + + /* give the address of an arbitrary symbol from the Python interpreter + and from the Psyco module */ + fprintf(f, "PyInt_FromLong: 0x%lx\n", (long) &PyInt_FromLong); + fprintf(f, "psyco_dump_code_buffers: 0x%lx\n", + (long) &psyco_dump_code_buffers); + + for (obj=psyco_codebuf_chained_list; obj != NULL; obj=obj->chained_list) + { + PyCodeObject* co = obj->snapshot.fz_pyc_data ? + obj->snapshot.fz_pyc_data->co : NULL; + fprintf(f, "CodeBufferObject 0x%lx %d '%s' '%s' %d '%s'\n", + (long) obj->codestart, get_stack_depth(&obj->snapshot), + co?PyString_AsString(co->co_filename):"", + co?PyCodeObject_NAME(co):"", + co?obj->snapshot.fz_pyc_data->next_instr:-1, + obj->codemode); + } + + psyco_dump_bigbuffers(f); + + for (chain = psyco_codebuf_spec_dict_list; chain; chain=(void**)*chain) + { + PyObject* spec_dict = (PyObject*)(chain[-1]); + int i = 0; + PyObject *key, *value; + fprintf(f, "spec_dict 0x%lx\n", (long) chain); + while (PyDict_Next(spec_dict, &i, &key, &value)) + { + PyObject* repr; + if (PyInt_Check(key)) + { + repr = (key->ob_type->tp_as_number->nb_hex)(key); + } + else + { + repr = PyObject_Repr(key); + } + psyco_assert(!PyErr_Occurred()); + psyco_assert(PyString_Check(repr)); + psyco_assert(CodeBuffer_Check(value)); + fprintf(f, "0x%lx %s\n", + (long)((CodeBufferObject*)value)->codestart, + PyString_AsString(repr)); + Py_DECREF(repr); + } + fprintf(f, "\n"); + } + { + int i = 0; + fprintf(f, "vinfo_array\n"); + for (obj=psyco_codebuf_chained_list; obj != NULL; obj=obj->chained_list) + { + PsycoObject* live_po; + PyObject* d; + if (psyco_top_array_count(&obj->snapshot) > 0) + live_po = fpo_unfreeze(&obj->snapshot); + else + live_po = NULL; + d = PyDict_New(); + psyco_assert(d); + buftable[i++] = ftell(f); + vinfo_array_dump(live_po ? &live_po->vlocals : NullArray, f, d); + Py_DECREF(d); + if (live_po) + PsycoObject_Delete(live_po); + } + psyco_assert(i==bufcount); + fseek(f, buftablepos, 0); + fwrite(buftable, sizeof(long), bufcount, f); + } + PyMem_FREE(buftable); + psyco_assert(!PyErr_Occurred()); + fclose(f); + PyErr_Restore(exc, val, tb); + } + is_dumping = 0; +} +static PyObject* Psyco_dumpcodebuf(PyObject* self, PyObject* args) +{ + psyco_dump_code_buffers(); + Py_INCREF(Py_None); + return Py_None; +} +#endif /* CODE_DUMP */ + + +/***************************************************************/ + /*** Replacements for PyEval_GetXxx() ***/ + +DEFINEFN +PyObject* need_cpsyco_obj(char* name) +{ + PyObject* d = PyModule_GetDict(CPsycoModule); + PyObject* result = PyDict_GetItemString(d, name); + if (result == NULL) + PyErr_Format(PyExc_PsycoError, "missing _psyco.%s", name); + return result; +} + +static PyObject* psyco_get_locals_msg(char* msg, int flag) +{ + static int already_logged = 0; + PyObject* o; + PyObject* result; + + o = psyco_find_frame(Py_False); + if (o == NULL) + return PyDict_New(); /* no frame at all -- no locals */ + + if (!PyFrame_Check(o)) { + /* it is a Psyco frame -- no locals available */ + char buffer[400]; + int i; + PyObject* w = need_cpsyco_obj("NoLocalsWarning"); + if (w == NULL) { + Py_DECREF(o); + return NULL; + } + for (i=0; msg[i] != '\\' && msg[i] != 0; i++) + buffer[i] = msg[i]; + if (psyco_logger && (flag & already_logged) == 0) { + already_logged |= flag; + buffer[i] = '\n'; + buffer[i+1] = 0; + debug_printf(1, (buffer)); + } + if (msg[i] == '\\') { + buffer[i++] = ' '; + for (; msg[i] != 0; i++) + buffer[i] = msg[i]; + } + buffer[i] = 0; + if (PyErr_Warn(w, buffer)) + result = NULL; + else + result = PyDict_New(); + } + else { + PyFrame_FastToLocals((PyFrameObject*) o); + result = ((PyFrameObject*) o)->f_locals; + Py_INCREF(result); + } + Py_DECREF(o); + return result; +} + +static PyObject* psyco_get_locals(void) +{ + return psyco_get_locals_msg("no locals() in functions bound by Psyco", + 0x01); +} + +#define WARN_IMPLICIT_LOCALS " cannot see the locals\\in functions bound by " \ + "Psyco; consider using eval() in its two- or " \ + "three-arguments form" + +/*****************************************************************/ + +static PyObject* Psyco_proxycode(PyObject* self, PyObject* args) +{ + int recursion = DEFAULT_RECURSION; + PyFunctionObject* function; + + if (!PyArg_ParseTuple(args, "O!|i", + &PyFunction_Type, &function, + &recursion)) + return NULL; + + return psyco_proxycode(function, recursion); +} + +static PyObject* Psyco_unproxycode(PyObject* self, PyObject* args) +{ + PyCodeObject* code; + PsycoFunctionObject* proxy; + PyObject* func; + + if (!PyArg_ParseTuple(args, "O!", &PyCode_Type, &code)) + return NULL; + + if (!is_proxycode(code)) { + PyErr_SetString(PyExc_PsycoError, "code object is not a proxy"); + return NULL; + } + proxy = (PsycoFunctionObject*) PyTuple_GET_ITEM(code->co_consts, 1); + + func = PyFunction_New((PyObject*) proxy->psy_code, proxy->psy_globals); + if (func == NULL) + return NULL; + if (proxy->psy_defaults != NULL && + PyFunction_SetDefaults(func, proxy->psy_defaults)) { + Py_DECREF(func); + return NULL; + } + return func; +} + +static PyObject* Psyco_cannotcompile(PyObject* self, PyObject* args) +{ + PyCodeObject* code; + PyCodeStats* cs; + + if (!PyArg_ParseTuple(args, "O!", &PyCode_Type, &code)) + return NULL; + cs = PyCodeStats_Get(code); + if (cs->st_mergepoints == NULL) { + Py_INCREF(Py_None); + cs->st_mergepoints = Py_None; + } + else if (cs->st_mergepoints != Py_None) { + PyErr_SetString(PyExc_PsycoError, "code is already compiled"); + return NULL; + } + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* Psyco_setfilter(PyObject* self, PyObject* args) +{ + PyObject* func; + PyObject* prev; + + if (!PyArg_ParseTuple(args, "O", &func)) + return NULL; + + if (func == Py_None) + func = NULL; + else { + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, + "setfilter() arg must be callable"); + return NULL; + } + Py_INCREF(func); + } + prev = psyco_codeobj_filter_fn; + psyco_codeobj_filter_fn = func; + if (prev == NULL) { + prev = Py_None; + Py_INCREF(prev); + } + return prev; +} + +/* replacement for sys._getframe() (together with _getframe() in support.py) */ +static PyObject* Psyco_getframe(PyObject* self, PyObject* args) +{ + PyObject* o = Py_False; + int emulate = 0; + if (!PyArg_ParseTuple(args, "|Oi:getframe", &o, &emulate)) + return NULL; + + o = psyco_find_frame(o); + if (emulate && o != NULL) { + PyObject* f = (PyObject*) psyco_emulate_frame(o); + Py_DECREF(o); + return f; + } + else + return o; +} + +/* replacement for __builtin__.globals() */ +static PyObject * +Psyco_globals(PyObject* self, PyObject* args) +{ + PyObject *d; + + if (!PyArg_ParseTuple(args, ":globals")) + return NULL; + d = psyco_get_globals(); + Py_INCREF(d); + return d; +} + +/* replacement for __builtin__.locals() */ +static PyObject * +Psyco_locals(PyObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, ":locals")) + return NULL; + return psyco_get_locals(); +} + +static PyObject* builtinevaluator(PyObject* args, char* oname) +{ + PyObject *o; + PyObject *cmd; + PyObject *freeme; + PyObject *globals = Py_None, *locals = Py_None; + + o = need_cpsyco_obj(oname); + if (o == NULL) + return NULL; + + if (!PyArg_ParseTuple(args, "O|O!O!", + &cmd, + &PyDict_Type, &globals, + &PyDict_Type, &locals)) { + /* let the original function report the problem, if any */ + PyErr_Clear(); + } + else if (globals == Py_None) { + globals = psyco_get_globals(); + if (locals == Py_None) { + locals = psyco_get_locals_msg("eval()/execfile()" + WARN_IMPLICIT_LOCALS, + 0x02); + if (locals == NULL) + return NULL; + freeme = locals; + } + else { + freeme = NULL; + } + o = PyObject_CallFunction(o, "OOO", cmd, globals, locals); + Py_XDECREF(freeme); + return o; + } + + /* fallback */ + return PyObject_CallObject(o, args); +} + +/* replacement for __builtin__.eval() */ +static PyObject * +Psyco_eval(PyObject* self, PyObject* args) +{ + return builtinevaluator(args, "original_eval"); +} + +/* replacement for __builtin__.execfile() */ +static PyObject * +Psyco_execfile(PyObject *self, PyObject *args) +{ + return builtinevaluator(args, "original_execfile"); +} + +/* replacement for __builtin__.vars() */ +static PyObject * +Psyco_vars(PyObject *self, PyObject *args) +{ + PyObject* o; + if (PyTuple_Size(args) == 0) { + return psyco_get_locals(); + } + /* fallback */ + o = need_cpsyco_obj("original_vars"); + if (o == NULL) + return NULL; + return PyObject_CallObject(o, args); +} + +/* replacement for __builtin__.dir() */ +static PyObject * +Psyco_dir(PyObject *self, PyObject *args) +{ + PyObject* o; + if (PyTuple_Size(args) == 0) { + PyObject* locals = psyco_get_locals(); + if (locals == NULL) + return NULL; + o = PyMapping_Keys(locals); + Py_DECREF(locals); + if (o == NULL) + return NULL; + if (!PyList_Check(o)) { + Py_DECREF(o); + PyErr_SetString(PyExc_TypeError, + "Expected keys() to be a list."); + return NULL; + } + if (PyList_Sort(o) != 0) { + Py_DECREF(o); + return NULL; + } + return o; + } + /* fallback */ + o = need_cpsyco_obj("original_dir"); + if (o == NULL) + return NULL; + return PyObject_CallObject(o, args); +} + +/* replacement for __builtin__.input() */ +static PyObject * +Psyco_input(PyObject *self, PyObject *args) +{ + PyObject* cmd; + PyObject* o = need_cpsyco_obj("original_raw_input"); + if (o == NULL) + return NULL; + + cmd = PyObject_CallObject(o, args); + if (cmd != NULL) { + PyObject* globals = psyco_get_globals(); + PyObject* locals = psyco_get_locals_msg("input()" + WARN_IMPLICIT_LOCALS, + 0x04); + if (locals == NULL) { + o = NULL; + } + else { + o = need_cpsyco_obj("original_eval"); + if (o != NULL) + o = PyObject_CallFunction(o, "OOO", cmd, + globals, locals); + Py_DECREF(locals); + } + Py_DECREF(cmd); + return o; + } + /* error in original_raw_input() */ + return NULL; +} + +static PyObject* hooks_busy(void) +{ + PyErr_SetString(PyExc_PsycoError, "Python trace/profile hooks are busy"); + return NULL; +} + +/* Enable or disable profiling. */ +static PyObject* Psyco_profiling(PyObject* self, PyObject* args) +{ + char mode; + void (*rs)(void*, int); + if (!PyArg_ParseTuple(args, "c", &mode)) + return NULL; + + switch (mode) { + case 'p': rs = &psyco_rs_profile; break; + case 'f': rs = &psyco_rs_fullcompile; break; + case 'n': rs = &psyco_rs_nocompile; break; + case '.': rs = NULL; break; + default: + PyErr_SetString(PyExc_ValueError, "unknown or unsupported mode"); + return NULL; + } + if (!psyco_set_profiler(rs)) + return hooks_busy(); + + Py_INCREF(Py_None); + return Py_None; +} + +/* turbo-mark a frame or all frames running a given code */ +static PyObject* Psyco_turbo_frame(PyObject* self, PyObject* args) +{ + PyObject* o = NULL; + + if (!PyArg_ParseTuple(args, "O", &o)) + return NULL; + + if (PyCode_Check(o)) + psyco_turbo_frames((PyCodeObject*) o); + else if (PyFrame_Check(o)) + { + if (!psyco_turbo_frame((PyFrameObject*) o)) + return hooks_busy(); + } + else + { + PyErr_SetString(PyExc_TypeError, "frame or code object"); + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +/* turbo-mark a code object (does not affect frames currently running it) */ +static PyObject* Psyco_turbo_code(PyObject* self, PyObject* args) +{ + int rec = DEFAULT_RECURSION; + PyCodeObject* co; + if (!PyArg_ParseTuple(args, "O!|i", &PyCode_Type, &co, &rec)) + return NULL; + + psyco_turbo_code(co, rec); + Py_INCREF(Py_None); + return Py_None; +} + +/* update collected statistics */ +static PyObject* Psyco_statcollect(PyObject* self, PyObject* args) +{ + psyco_profile_threads(1); + psyco_stats_collect(); + Py_INCREF(Py_None); + return Py_None; +} + +/* return the top n code objects */ +static PyObject* Psyco_stattop(PyObject* self, PyObject* args) +{ + int n; + if (!PyArg_ParseTuple(args, "i", &n)) + return NULL; + + return psyco_stats_top(n); +} + +/* clear all collected statistics now */ +static PyObject* Psyco_statreset(PyObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + + psyco_stats_reset(); + Py_INCREF(Py_None); + return Py_None; +} + +/* get tunable parameters */ +static PyObject* Psyco_statread(PyObject* self, PyObject* args) +{ + char* name; + if (!PyArg_ParseTuple(args, "s", &name)) + return NULL; + + return psyco_stats_read(name); +} + +/* set tunable parameters */ +static PyObject* Psyco_statwrite(PyObject* self, PyObject* args, PyObject* kwds) +{ + if (!psyco_stats_write(args, kwds)) + return NULL; + Py_INCREF(Py_None); + return Py_None; +} + +/* return a dump of all current statistics + (it also prints a nice table to stderr in verbose mode) */ +static PyObject* Psyco_statdump(PyObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + + psyco_stats_collect(); + return psyco_stats_dump(); +} + +/* get the current usage charge of a code object */ +static PyObject* Psyco_getcharge(PyObject* self, PyObject* args) +{ + PyCodeStats* cs; + PyCodeObject* co; + if (!PyArg_ParseTuple(args, "O!", &PyCode_Type, &co)) + return NULL; + + cs = PyCodeStats_Get(co); + return PyFloat_FromDouble((double) cs->st_charge); +} + +/* set the usage charge of a code object */ +static PyObject* Psyco_setcharge(PyObject* self, PyObject* args) +{ + PyCodeStats* cs; + PyCodeObject* co; + float new_charge; + if (!PyArg_ParseTuple(args, "O!f", &PyCode_Type, &co, &new_charge)) + return NULL; + + cs = PyCodeStats_Get(co); + cs->st_charge = new_charge; + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* Psyco_memory(PyObject* self, PyObject* args) +{ + if (!PyArg_ParseTuple(args, "")) + return NULL; + return PyInt_FromLong(psyco_memory_usage / 1024); +} + +#if 0 +--- disabled --- +static PyObject* t_finalizer(PyObject* self, PyObject* args, PyObject* kwds) +{ + PyObject* f; + PyObject* g; + PyObject* fres; + PyObject* gres; + PyObject *exc, *val, *tb; + + if (!PyArg_ParseTuple(self, "OO:finalizer", &f, &g)) + return NULL; + fres = PyEval_CallObjectWithKeywords(f, args, kwds); + PyErr_Fetch(&exc, &val, &tb); + gres = PyEval_CallObject(g, NULL); + if (gres == NULL) + { + Py_XDECREF(exc); + Py_XDECREF(val); + Py_XDECREF(tb); + Py_XDECREF(fres); + return NULL; + } + else + { + Py_DECREF(gres); + PyErr_Restore(exc, val, tb); + return fres; + } +} +static PyMethodDef m_finalizer = { + "finalizer_fn", (PyCFunction)t_finalizer, METH_VARARGS|METH_KEYWORDS }; + +/* finalizer(f,g) returns a built-in function object h + such that h(*args, **kw) is equivalent to + + try: + f(*args, **kw) + finally: + g() + + The purpose is for g() to be a lock.release() so that when the + lock is released we are sure that the thread will not run any + Python code any more (which cannot be done in Python). */ +static PyObject* Psyco_finalizer(PyObject* self, PyObject* args) +{ + return PyCFunction_New(&m_finalizer, args); +} +#endif + + +/*****************************************************************/ + +static char proxycode_doc[] = +"proxycode(func[, rec]) -> code object\n\ +\n\ +Return a proxy code object that invokes Psyco on the argument. The code\n\ +object can be used to replace func.func_code. Raise psyco.error if func\n\ +uses unsupported features. Return func.func_code itself if it is already\n\ +a proxy code object. The optional second argument specifies the number of\n\ +recursive compilation levels: all functions called by func are compiled\n\ +up to the given depth of indirection."; + +static char unproxycode_doc[] = +"unproxycode(code) -> function object\n\ +\n\ +Return a new copy of the original function that was used to build the\n\ +given proxy code object. Raise psyco.error if code is not a proxy."; + +static char getframe_doc[] = +"getframe([location, emulate]) -> frameobject or (code, globals, addr)\n\ +\n\ +Return a frame object from the call stack.\n\ +If location is an integer, return the nth frame (0=top).\n\ +If location was returned by a previous call to getframe(),\n\ +return the previous frame (as if by reading f_back)."; + +static char globals_doc[] = +"globals() -> dictionary\n\ +\n\ +Return the dictionary containing the current scope's global variables.\n\ +This is the Psyco-aware version."; + +static char gennolocals_doc[] = +"This is the Psyco-aware version of the builtin function of the same name.\n\ +For more information see psyco._psyco.original_<<>>.__doc__.\n\ +\n\ +Functions have no locals() dictionary with Psyco.\n\ +Accessing it returns {} and throws a NoLocalsWarning."; + +static char setfilter_doc[] = +"setfilter(func or None) -> previous filter or None\n\ +\n\ +Set a global filter function: func(co) will be called once per code object\n\ +'co' considered by Psyco. If it returns False, the code object will not\n\ +be compiled."; + +static PyMethodDef PsycoMethods[] = { + {"proxycode", &Psyco_proxycode, METH_VARARGS, proxycode_doc}, + {"unproxycode", &Psyco_unproxycode, METH_VARARGS, unproxycode_doc}, + {"getframe", &Psyco_getframe, METH_VARARGS, getframe_doc}, + {"globals", &Psyco_globals, METH_VARARGS, globals_doc}, + {"eval", &Psyco_eval, METH_VARARGS, gennolocals_doc}, + {"execfile", &Psyco_execfile, METH_VARARGS, gennolocals_doc}, + {"locals", &Psyco_locals, METH_VARARGS, gennolocals_doc}, + {"vars", &Psyco_vars, METH_VARARGS, gennolocals_doc}, + {"dir", &Psyco_dir, METH_VARARGS, gennolocals_doc}, + {"input", &Psyco_input, METH_VARARGS, gennolocals_doc}, + {"profiling", &Psyco_profiling, METH_VARARGS}, + {"turbo_frame", &Psyco_turbo_frame, METH_VARARGS}, + {"turbo_code", &Psyco_turbo_code, METH_VARARGS}, + {"statcollect", &Psyco_statcollect, METH_VARARGS}, + {"stattop", &Psyco_stattop, METH_VARARGS}, + {"statreset", &Psyco_statreset, METH_VARARGS}, + /*{"statread", &Psyco_statread, METH_VARARGS},*/ + {"statwrite", (PyCFunction)&Psyco_statwrite, METH_VARARGS|METH_KEYWORDS}, + {"statread", &Psyco_statread, METH_VARARGS}, + {"statdump", &Psyco_statdump, METH_VARARGS}, + {"getcharge", &Psyco_getcharge, METH_VARARGS}, + {"setcharge", &Psyco_setcharge, METH_VARARGS}, + {"memory", &Psyco_memory, METH_VARARGS}, + {"cannotcompile",&Psyco_cannotcompile, METH_VARARGS}, + {"setfilter", &Psyco_setfilter, METH_VARARGS, setfilter_doc}, +#if 0 + {"finalizer", &Psyco_finalizer, METH_VARARGS}, +#endif +#if CODE_DUMP + {"dumpcodebuf", &Psyco_dumpcodebuf, METH_VARARGS}, +#endif + ALARM_FUNCTIONS, + {NULL, NULL} /* Sentinel */ +}; + +/* Initialization */ +PyMODINIT_FUNC init_psyco(void) +{ + PsycoFunction_Type.ob_type = &PyType_Type; + CodeBuffer_Type.ob_type = &PyType_Type; + thread_dict_key = PyString_InternFromString("PsycoT"); + if (thread_dict_key == NULL) + return; + + CPsycoModule = Py_InitModule("_psyco", PsycoMethods); + if (CPsycoModule == NULL) + return; + PyExc_PsycoError = PyErr_NewException("psyco.error", NULL, NULL); + if (PyExc_PsycoError == NULL) + return; + Py_INCREF(PyExc_PsycoError); + if (PyModule_AddObject(CPsycoModule, "error", PyExc_PsycoError)) + return; + Py_INCREF(&PsycoFunction_Type); + if (PyModule_AddObject(CPsycoModule, "PsycoFunctionType", + (PyObject*) &PsycoFunction_Type)) + return; +/*if (PyModule_AddIntConstant(CPsycoModule, "DEFAULT_RECURSION", DEFAULT_RECURSION)) + return;*/ +#if ALL_CHECKS + if (PyModule_AddIntConstant(CPsycoModule, "ALL_CHECKS", ALL_CHECKS)) + return; +#endif +#if VERBOSE_LEVEL + if (PyModule_AddIntConstant(CPsycoModule, "VERBOSE_LEVEL", VERBOSE_LEVEL)) + return; +#endif +#ifdef PY_PSYCO_MODULE + PyPsycoModule = PyImport_ImportModule("psyco"); + if (PyPsycoModule == NULL) + return; +#endif + if (PyModule_AddIntConstant(CPsycoModule, "PYVER", PY_VERSION_HEX)) + return; + if (PyModule_AddIntConstant(CPsycoModule, "PSYVER", PSYCO_VERSION_HEX)) + return; + if (PyModule_AddIntConstant(CPsycoModule, "MEASURE_ALL_THREADS", + MEASURE_ALL_THREADS)) + return; + if (PyModule_AddStringConstant(CPsycoModule, "PROCESSOR", + MACHINE_CODE_FORMAT)) + return; + + initialize_all_files(); +} diff --git a/nodeboxgl/ext/psyco/src/c/psyco.h b/nodeboxgl/ext/psyco/src/c/psyco.h new file mode 100644 index 0000000..b2eb30f --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/psyco.h @@ -0,0 +1,302 @@ + /***************************************************************/ +/*** Global Psyco definitions ***/ + /***************************************************************/ + +#ifndef _PSYCO_H +#define _PSYCO_H + + +#include +#include /* for offsetof() */ + + +/*****************************************************************/ + /*** Various customizable parameters (use your compilers' ***/ + /*** option to override them, e.g. -DXXX=value in gcc) ***/ + + /* set to 0 to disable all debugging checks and output */ +#ifndef PSYCO_DEBUG +# define PSYCO_DEBUG 0 +#endif + + + /* define to 1 for extra assert()'s */ +#ifndef ALL_CHECKS +# define ALL_CHECKS (PSYCO_DEBUG ? 1 : 0) +#endif + + /* level of debugging outputs: 0 = none, 1 = a few, 2 = more, + 3 = detailled, 4 = full execution trace */ +#ifndef VERBOSE_LEVEL +# define VERBOSE_LEVEL (PSYCO_DEBUG ? 0 : 0) +#endif + + /* dump information about profiling and statistics */ +#ifndef VERBOSE_STATS +# define VERBOSE_STATS (VERBOSE_LEVEL>=2) +#endif + + /* define for *heavy* memory checking: 0 = off, 1 = reasonably heavy, + 2 = unreasonably heavy */ +#ifndef HEAVY_MEM_CHECK +# define HEAVY_MEM_CHECK (PSYCO_DEBUG ? 0 : 0) +#endif +#ifdef MS_WIN32 +# undef HEAVY_MEM_CHECK +# define HEAVY_MEM_CHECK 0 /* not supported on Windows */ +#endif + + /* define to write produced blocks of code into a file; see 'xam.py' + 0 = off, 1 = only manually (from a debugger or with _psyco.dumpcodebuf()), + 2 = only when returning from Psyco, + 3 = every time a new code block is built */ +#ifndef CODE_DUMP +# define CODE_DUMP (PSYCO_DEBUG ? 1 : 0) +#endif + +#if CODE_DUMP && !defined(CODE_DUMP_FILE) +# define CODE_DUMP_FILE "psyco.dump" +#endif + + /* define to inline the most common functions in the produced code + (should be enabled unless you want to trade code size for speed) */ +#ifndef INLINE_COMMON_FUNCTIONS +# define INLINE_COMMON_FUNCTIONS 1 +#endif + +#if CODE_DUMP && defined(HAVE_DLFCN_H) + /* define to locate shared symbols and write them in CODE_DUMP_FILE + requires the GNU extension dladdr() in + Not really useful, only finds non-static symbols. */ +/*# include + # define CODE_DUMP_SYMBOLS*/ +#endif + +#define DEFAULT_RECURSION 10 /* default value for the 'rec' argument */ + + +/*****************************************************************/ + +/* Size of buffer to allocate when emitting code. + Can be as large as you like (most OSes will not actually allocate + RAM pages before they are actually used). We no longer perform + any realloc() on this; a single allocated code region is reused + for all code buffers until it is exhausted. There are BUFFER_MARGIN + unused bytes at the end, so BIG_BUFFER_SIZE has better be large to + minimize this effect. + Linux note: I've seen in my version of glibc's malloc() that it + uses mmap for sizes >= 128k, and that it will refuse the use mmap + more than 1024 times, which means that if you allocate blocks of + 128k you cannot allocate more than 128M in total. + Note that Psyco will usually allocate and fill two buffers in + parallel, by the way vcompiler.c works. However, it occasionally + needs more; codemanager.c can handle any number of parallely-growing + buffers. There is a safeguard in vcompiler.c to put an upper bound + on this number (currently should not exceed 4). + In debugging mode, we use a small size to stress the buffer- + continuation coding routines. */ +#ifndef BIG_BUFFER_SIZE +# define BIG_BUFFER_SIZE (PSYCO_DEBUG ? 2*BUFFER_MARGIN : 0x100000) +#endif + +/* A safety margin for occasional overflows: we might write a few + instructions too much before we realize we wrote past 'codelimit'. + XXX carefully check that it is impossible to overflow by more + We need more than 128 bytes because of the way conditional jumps + are emitted; see pycompiler.c. + The END_CODE macro triggers a silent buffer change if space is + getting very low -- less than GUARANTEED_MINIMUM */ +#ifndef BUFFER_MARGIN +# define BUFFER_MARGIN 1024 +#endif + +/* When emitting code, all called functions can assume that they + have at least this amount of room to write their code. If they + might need more, they have to allocate new buffers and write a + jump to these from the original code (jumps can be done in less + than GUARANTEED_MINIMUM bytes). */ +#ifndef GUARANTEED_MINIMUM +# define GUARANTEED_MINIMUM 64 +#endif + + +#ifndef ALL_STATIC +# define ALL_STATIC 0 /* make all functions static; set to 1 by hack.c */ +#endif + +#if ALL_STATIC +# define EXTERNVAR staticforward +# define EXTERNFN static +# define DEFINEVAR statichere +# define DEFINEFN static +# define INITIALIZATIONFN PSY_INLINE +#else +# define EXTERNVAR +# define EXTERNFN +# define DEFINEVAR +# define DEFINEFN +# define INITIALIZATIONFN DEFINEFN +#endif + +#if defined(_MSC_VER) +# if _MSC_VER < 1310 /* not an exact number */ +# define BROKEN_CPP +# endif +#endif +#ifndef BROKEN_CPP +# define psyco_assert(x) ((void)((x) || psyco_fatal_msg(#x))) +#else +/* The VC++ preprocessor is not even able to produce from #x a C string that + is correctly escaped for the VC++ compiler !! */ +# define psyco_assert(x) ((void)((x) || psyco_fatal_msg("assertion failed"))) +#endif +#define psyco_fatal_msg(msg) psyco_fatal_error(msg, __FILE__, __LINE__) +EXTERNFN int psyco_fatal_error(char* msg, char* filename, int lineno); + +#if ALL_CHECKS +# define MALLOC_CHECK_ 2 /* GCC malloc() checks */ +# define extra_assert(x) psyco_assert(x) +#else +# define extra_assert(x) (void)0 /* nothing */ +#endif + +#if VERBOSE_LEVEL +# define debug_printf(level, args) do { \ + if (VERBOSE_LEVEL >= (level)) { \ + psyco_debug_printf args; \ + } \ + if (psyco_logger && (level) == 1) { \ + psyco_flog args; \ + } \ + } while (0) +EXTERNFN void psyco_debug_printf(char* msg, ...); +#else +# define debug_printf(level, args) do { \ + if (psyco_logger && (level) == 1) { \ + psyco_flog args; \ + } \ + } while (0) +#endif +EXTERNVAR PyObject* psyco_logger; +EXTERNFN void psyco_flog(char* msg, ...); + +#if (VERBOSE_LEVEL >= 4) || defined(PSYCO_TRACE) +# define TRACE_EXECUTION(msg) do { \ + BEGIN_CODE EMIT_TRACE(msg, psyco_trace_execution); END_CODE } while (0) +# define TRACE_EXECUTION_NOERR(msg) do { \ + BEGIN_CODE EMIT_TRACE(msg, psyco_trace_execution_noerr); END_CODE } while (0) +EXTERNFN void psyco_trace_execution(char* msg, void* code_position); +# if defined(PSYCO_TRACE) +# define psyco_trace_execution_noerr psyco_trace_execution +# else +EXTERNFN void psyco_trace_execution_noerr(char* msg, void* code_position); +# endif +#else +# define TRACE_EXECUTION(msg) do { } while (0) /* nothing */ +# define TRACE_EXECUTION_NOERR(msg) do { } while (0) /* nothing */ +#endif + +#define RECLIMIT_SAFE_ENTER() PyThreadState_GET()->recursion_depth-- +#define RECLIMIT_SAFE_LEAVE() PyThreadState_GET()->recursion_depth++ + + +#if INLINE_COMMON_FUNCTIONS +# define PSY_INLINE __inline static +#else +# define PSY_INLINE static +#endif + +#if HEAVY_MEM_CHECK +# include "linuxmemchk.h" +# if HEAVY_MEM_CHECK > 1 +# define PSYCO_NO_LINKED_LISTS +# endif +#endif + + +#ifndef bool +typedef int bool; +#endif +#ifndef false +# define false 0 +#endif +#ifndef true +# define true 1 +#endif + +#ifndef PyObject_TypeCheck +# define PyObject_TypeCheck(o,t) ((o)->ob_type == (t)) +#endif + + +typedef unsigned char code_t; + +typedef struct vinfo_s vinfo_t; /* defined in compiler.h */ +typedef struct vinfo_array_s vinfo_array_t; /* defined in compiler.h */ +typedef struct PsycoObject_s PsycoObject; /* defined in compiler.h */ +typedef struct FrozenPsycoObject_s FrozenPsycoObject; /* def in dispatcher.h */ +typedef struct CodeBufferObject_s CodeBufferObject; /* def in codemanager.h */ +typedef struct global_entries_s global_entries_t; /* def in dispatcher.h */ +typedef struct mergepoint_s mergepoint_t; /* defined in mergepoint.h */ +typedef struct stack_frame_info_s stack_frame_info_t; /* def in pycompiler.h */ + +EXTERNVAR PyObject* PyExc_PsycoError; +EXTERNVAR long psyco_memory_usage; /* approximative */ +EXTERNVAR PyObject* CPsycoModule; + + +/* moved here from vcompiler.h because needed by numerous header files. + See vcompiler.h for comments */ +typedef bool (*compute_fn_t)(PsycoObject* po, vinfo_t* vi); +typedef PyObject* (*direct_compute_fn_t)(vinfo_t* vi, char* data); +typedef struct { + compute_fn_t compute_fn; + direct_compute_fn_t direct_compute_fn; + long pyobject_mask; + signed char nested_weight[2]; +} source_virtual_t; + + +#if CODE_DUMP +EXTERNFN void psyco_dump_code_buffers(void); +#endif +#if CODE_DUMP >= 3 +# define dump_code_buffers() psyco_dump_code_buffers() +#else +# define dump_code_buffers() do { } while (0) /* nothing */ +#endif + +/* to display code object names */ +#define PyCodeObject_NAME(co) (co->co_name ? PyString_AS_STRING(co->co_name) \ + : "") + + +/* defined in pycompiler.c */ +#define GLOBAL_ENTRY_POINT psyco_pycompiler_mainloop +EXTERNFN code_t* psyco_pycompiler_mainloop(PsycoObject* po); + + +/* XXX no handling of out-of-memory conditions. We have to define precisely + what should occur in various cases, like when we run out of memory in the + middle of writing code, when the beginning is already executing. When + should we report the exception? */ +EXTERNFN void psyco_out_of_memory(char *filename, int lineno); +#define OUT_OF_MEMORY() psyco_out_of_memory(__FILE__, __LINE__) + +/* Thread-specific state */ +EXTERNFN PyObject* psyco_thread_dict(void); + +/* Getting data from the _psyco module */ +EXTERNFN PyObject* need_cpsyco_obj(char* name); + +/* defined in dispatcher.c */ +EXTERNFN void PsycoObject_EmergencyCodeRoom(PsycoObject* po); + +/* Convenience macros to start/end a code-emitting instruction block: */ +#define BEGIN_CODE { code_t* code = po->code; +#define END_CODE po->code = code; \ + if (code >= po->codelimit) \ + PsycoObject_EmergencyCodeRoom(po); \ + } + +#endif /* _PSYCO_H */ diff --git a/nodeboxgl/ext/psyco/src/c/psyfunc.c b/nodeboxgl/ext/psyco/src/c/psyfunc.c new file mode 100644 index 0000000..055921c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/psyfunc.c @@ -0,0 +1,890 @@ +#include "psyfunc.h" +#include "vcompiler.h" +#include "codemanager.h" +#include "mergepoints.h" +#include "stats.h" +#include "Objects/ptupleobject.h" +#include "Python/frames.h" +#include "Python/pycompiler.h" + +#include /* for PyEval_EvalCodeEx() */ + + + /***************************************************************/ +/*** Frame and arguments building ***/ + /***************************************************************/ + +static void fix_run_time_args(PsycoObject * po, vinfo_array_t* target, + vinfo_array_t* source, RunTimeSource* sources) +{ + int i = target->count; + extra_assert(target->count <= source->count); + while (i--) + { + vinfo_t* a = source->items[i]; + if (a != NULL && a->tmp != NULL) + { + vinfo_t* b = a->tmp; + if (is_runtime(a->source)) + { + if (target->items[i] == NULL) + continue; /* item was removed by psyco_simplify_array() */ + if (sources != NULL) { + int argc = (po->stack_depth-INITIAL_STACK_DEPTH) / sizeof(long); + sources[argc] = a->source; + } + po->stack_depth += sizeof(long); + /* arguments get borrowed references */ + b->source = RunTime_NewStack(po->stack_depth, false, false); + } + extra_assert(b == target->items[i]); + a->tmp = NULL; + if (a->array != NullArray) + fix_run_time_args(po, b->array, a->array, sources); + } + } +} + +struct fncall_arg_s { + PyCodeObject* co; + PyObject* merge_points; + vinfo_array_t* inputvinfos; + int po_size; +}; + +static bool fncall_init(struct fncall_arg_s* fncall, + PyCodeObject* co) +{ + int ncells = PyTuple_GET_SIZE(co->co_cellvars); + int nfrees = PyTuple_GET_SIZE(co->co_freevars); + if (co->co_flags & CO_VARKEYWORDS) + { + debug_printf(1, ("unsupported ** argument in call to %s\n", + PyCodeObject_NAME(co))); + return false; + } + if (ncells != 0 || nfrees != 0) + { + debug_printf(1, ("unsupported free or cell vars in %s\n", + PyCodeObject_NAME(co))); + return false; + } + fncall->co = co; + fncall->merge_points = psyco_get_merge_points(co, 0); + return fncall->merge_points != Py_None; +} + +static bool fncall_collect_arguments(struct fncall_arg_s* fncall, + vinfo_t* vglobals, + vinfo_t** argarray, int argcount, + vinfo_t** defarray, int defcount) +{ + PyCodeObject* co = fncall->co; + vinfo_array_t* inputvinfos; + int i, minargcnt, inputargs, extras; + + minargcnt = co->co_argcount - defcount; + inputargs = argcount; + if (inputargs != co->co_argcount) + { + if (inputargs > co->co_argcount && (co->co_flags & CO_VARARGS)) + /* ok, extra args will be collected below */ ; + else + { + if (inputargs < minargcnt || inputargs > co->co_argcount) + { + int n = co->co_argcount < minargcnt ? minargcnt : co->co_argcount; + PyErr_Format(PyExc_TypeError, + "%.200s() takes %s %d %sargument%s (%d given)", + PyCodeObject_NAME(co), + minargcnt == co->co_argcount ? "exactly" : + (inputargs < n ? "at least" : "at most"), + n, + /*kwcount ? "non-keyword " :*/ "", + n == 1 ? "" : "s", + inputargs); + return false; + } + inputargs = co->co_argcount; /* add default arguments */ + } + } + + /* Collect all input vinfo_t's (globals, arguments, needed default values) + into a new array that mimics the PsycoObject's vlocals. */ + inputvinfos = array_new(INDEX_LOC_LOCALS_PLUS + inputargs); + inputvinfos->items[INDEX_LOC_GLOBALS] = vglobals; + for (i=0; iitems[INDEX_LOC_LOCALS_PLUS+i] = argarray[i]; + for (; iitems[INDEX_LOC_LOCALS_PLUS+i] = defarray[i-minargcnt]; + + extras = co->co_stacksize + co->co_nlocals; /*+ncells+nfrees, both 0 now */ + fncall->inputvinfos = inputvinfos; + fncall->po_size = INDEX_LOC_LOCALS_PLUS + extras; + return true; +} + +PSY_INLINE void fncall_finish_store(struct fncall_arg_s* fncall, + PsycoObject* po) +{ + array_release(fncall->inputvinfos); + + /* store the code object */ + po->pr.co = fncall->co; + Py_INCREF(fncall->co); /* XXX never freed */ + pyc_data_build(po, fncall->merge_points); +} + +static void fncall_store_arguments(struct fncall_arg_s* fncall, + vinfo_t** vlocals) +{ + PyCodeObject* co = fncall->co; + vinfo_array_t* arraycopy = fncall->inputvinfos; + vinfo_t** pp; + int i; + int inputargs = arraycopy->count - INDEX_LOC_LOCALS_PLUS; + + /* initialize po->vlocals */ + vlocals[INDEX_LOC_GLOBALS] = arraycopy->items[INDEX_LOC_GLOBALS]; + + /* move the arguments into their target place, + excluding the ones that map to the '*' parameter */ + pp = arraycopy->items + INDEX_LOC_LOCALS_PLUS; + for (i=0; ico_argcount; i++) + vlocals[INDEX_LOC_LOCALS_PLUS + i] = *pp++; + if (co->co_flags & CO_VARARGS) + { + /* store the extra args in a virtual-time tuple */ + vlocals[INDEX_LOC_LOCALS_PLUS + i] = PsycoTuple_New(inputargs - i, pp); + for (; inputargs > i; inputargs--) + vinfo_decref(*pp++, NULL); + i++; + } + else + extra_assert(i == inputargs); + + /* the rest of locals is uninitialized */ + for (; ico_nlocals; i++) + vlocals[INDEX_LOC_LOCALS_PLUS + i] = psyco_vi_Zero(); + /* the rest of the array is the currently empty stack, + set to NULL by array_new(). */ +} + +/* Build a PsycoObject "frame" corresponding to the call of a Python + function. If 'sources!=NULL', it is set to an array of the sources of + the values that must be pushed to make the call. */ +static PsycoObject* psyco_build_frame(struct fncall_arg_s* fncall, + int recursion, RunTimeSource** sources) +{ + /* build a "frame" in a PsycoObject according to the given code object. */ + vinfo_array_t* arraycopy; + PsycoObject* po; + int rtcount; + RunTimeSource* source1; + + po = PsycoObject_New(fncall->po_size); + po->stack_depth = INITIAL_STACK_DEPTH; + po->vlocals.count = fncall->po_size; + INIT_PROCESSOR_PSYCOOBJECT(po); + po->pr.auto_recursion = AUTO_RECURSION(recursion); + + /* duplicate the inputvinfos. If two arguments share some common part, they + will also share it in the copy. */ + clear_tmp_marks(fncall->inputvinfos); + arraycopy = array_new(fncall->inputvinfos->count); + duplicate_array(arraycopy, fncall->inputvinfos); + + /* simplify arraycopy in the sense of psyco_simplify_array() */ + rtcount = psyco_simplify_array(arraycopy, NULL); + + /* all run-time arguments or argument parts must be corrected: in the + input vinfo_t's they have arbitrary sources, but in the new frame's + sources they will have to be fetched from the machine stack, where + the caller will have pushed them. */ + if (sources != NULL) + { + source1 = PyMem_NEW(RunTimeSource, rtcount); + if (source1 == NULL && rtcount > 0) + OUT_OF_MEMORY(); + *sources = source1; + } + else + source1 = NULL; + fix_run_time_args(po, arraycopy, fncall->inputvinfos, source1); + array_release(fncall->inputvinfos); + fncall->inputvinfos = arraycopy; + + /* initialize po->vlocals */ + fncall_store_arguments(fncall, po->vlocals.items); + fncall_finish_store(fncall, po); + + /* set up the CALL return address */ + po->stack_depth += sizeof(long); + LOC_CONTINUATION = vinfo_new(RunTime_NewStack(po->stack_depth, false, false)); + return po; +} + +/* extra data that must be saved about a parent frame when a child + frame is about to be run in-line in the same PsycoObject */ +#define LOC_INLINE_CO 0 +#define LOC_INLINE_NEXT_INSTR 1 +#define TOTAL_LOC_INLINE 2 + +static vinfo_t* call_with_inline_frame(PsycoObject* po, + struct fncall_arg_s* fncall, + int recursion) +{ + /* note: 'recursion' is ignored */ + vinfo_t* vresult; + if (LOC_INLINING != NULL) /* we have the result ready from the + initial case below */ + { + vresult = LOC_INLINING; + LOC_INLINING = NULL; + } + else + { + /* initial case: collect the arguments from the call into an + EInline pseudo-exception */ + int i; + vinfo_t** pp = fncall->inputvinfos->items; + vinfo_t* v = vinfo_new(SOURCE_NOT_IMPORTANT); + v->array = array_new(TOTAL_LOC_INLINE + fncall->po_size); + v->array->items[LOC_INLINE_CO] = + vinfo_new(CompileTime_New((long) fncall->co)); + Py_INCREF(fncall->co); /* XXX never freed */ + for (i=fncall->inputvinfos->count; i--; ) + if (pp[i] != NULL) + vinfo_incref(pp[i]); + fncall_store_arguments(fncall, v->array->items + TOTAL_LOC_INLINE); + PycException_Raise(po, vinfo_new(VirtualTime_New(&EInline)), v); + vresult = NULL; + } + array_release(fncall->inputvinfos); + return vresult; +} + +DEFINEFN +vinfo_t* psyco_save_inline_po(PsycoObject* po) +{ + int i = po->vlocals.count; + vinfo_t** pp = po->vlocals.items; + vinfo_t* v = vinfo_new(VirtualTime_New(&EInline)); + v->array = array_new(TOTAL_LOC_INLINE + i); + v->array->items[LOC_INLINE_CO] = + vinfo_new(CompileTime_New((long) po->pr.co)); + v->array->items[LOC_INLINE_NEXT_INSTR] = + vinfo_new(CompileTime_New(po->pr.next_instr)); + while (i--) + { + v->array->items[TOTAL_LOC_INLINE + i] = pp[i]; + pp[i] = NULL; + } + return v; +} + +DEFINEFN +PsycoObject* psyco_restore_inline_po(PsycoObject* po, vinfo_array_t** a) +{ + int i; + vinfo_t* v; + vinfo_array_t* array = *a; + *a = NullArray; + + for (i=po->vlocals.count; i--; ) + vinfo_xdecref(po->vlocals.items[i], po); + i = array->count - TOTAL_LOC_INLINE; + po = PsycoObject_Resize(po, i); + po->vlocals.count = i; /* attention, vlocals.count cannot be larger than i + even if there is enough memory already allocated */ + while (i--) + po->vlocals.items[i] = array->items[TOTAL_LOC_INLINE + i]; + + v = array->items[LOC_INLINE_CO]; + po->pr.co = (PyCodeObject*) CompileTime_Get(v->source)->value; + vinfo_decref(v, NULL); + v = array->items[LOC_INLINE_NEXT_INSTR]; + po->pr.next_instr = v ? CompileTime_Get(v->source)->value : 0; + vinfo_xdecref(v, NULL); + array_release(array); + + pyc_data_build(po, psyco_get_merge_points(po->pr.co, -1)); + po->pr.f_builtins = NULL; /* because the globals might have changed */ + return po; +} + + +static PyObject* cimpl_call_pyfunc(PyCodeObject* co, PyObject* globals, + PyObject* defaults, PyObject* arg) +{ + /* simple wrapper around PyEval_EvalCodeEx, for the fail_to_default + case of psyco_call_pyfunc() */ + int defcount = (defaults ? PyTuple_GET_SIZE(defaults) : 0); + PyObject** defs = (defcount ? &PyTuple_GET_ITEM(defaults, 0) : NULL); + return PyEval_EvalCodeEx(co, globals, (PyObject*)NULL, + &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg), + (PyObject**)NULL, 0, + defs, defcount, NULL); +} + +#define COMPUTE_DEFCOUNT() do { \ + /* is vdefaults!=NULL at run-time ? */ \ + condition_code_t cc = object_non_null(po, vdefaults); \ + if (cc == CC_ERROR) /* error or more likely promotion */ \ + return NULL; \ + if (runtime_condition_t(po, cc)) \ + defcount = PsycoTuple_Load(vdefaults); \ + else \ + defcount = 0; /* vdefaults==NULL at run-time */ \ +} while (0) + +DEFINEFN +vinfo_t* psyco_call_pyfunc(PsycoObject* po, PyCodeObject* co, + vinfo_t* vglobals, vinfo_t* vdefaults, + vinfo_t* arg_tuple, int recursion) +{ + CodeBufferObject* codebuf; + PsycoObject* mypo; + Source* sources; + vinfo_t* result; + stack_frame_info_t* finfo; + int tuple_size, argcount, defcount=-2; + struct fncall_arg_s fncall; + + if (is_proxycode(co)) + { + PsycoFunctionObject* pf; + pf = (PsycoFunctionObject*) PyTuple_GET_ITEM(co->co_consts, 1); + co = pf->psy_code; + if (pf->psy_defaults == NULL) + vdefaults = PsycoTuple_New(0, NULL); + else + { + Py_INCREF(pf->psy_defaults); /* XXX looses a ref */ + vdefaults = vinfo_new( + CompileTime_NewSk(sk_new((long) pf->psy_defaults, + SkFlagPyObj))); + } + /* the recursion limit only applies to non-proxified functions */ + recursion++; + result = psyco_call_pyfunc(po, co, vglobals, vdefaults, + arg_tuple, recursion); + vinfo_decref(vdefaults, po); + return result; + } + if (--recursion < 0) + goto fail_to_default; + extra_assert(PyCode_GetNumFree(co) == 0); + + tuple_size = PsycoTuple_Load(arg_tuple); + if (tuple_size == -1) + goto fail_to_default; + /* XXX calling with an unknown-at-compile-time number of arguments + is not implemented, revert to the default behaviour */ + + COMPUTE_DEFCOUNT(); + if (defcount == -1) + goto fail_to_default; + /* calling with an unknown-at-compile-time number of default arguments + is not implemented (but this is probably not useful to implement); + revert to the default behaviour */ + + /* Force mutable arguments out of virtual-time, + including the processor condition codes */ + /* This is expected to have already been done on default arguments; + see PsycoFunction_New() */ + if (!psyco_forking(po, arg_tuple->array)) + return NULL; + + /* prepare a frame */ + if (!fncall_init(&fncall, co)) + goto fail_to_default; /* unsupported bytecode features */ + if (!fncall_collect_arguments(&fncall, vglobals, + &PsycoTuple_GET_ITEM(arg_tuple, 0), tuple_size, + &PsycoTuple_GET_ITEM(vdefaults, 0), defcount)) + goto pyerr; /* Python exception (wrong # of arguments) */ + + /* try to inline the call */ + if (!po->pr.is_inlining && + (psyco_mp_flags(fncall.merge_points) & MP_FLAGS_INLINABLE)) + { + /* inlining call */ + result = call_with_inline_frame(po, &fncall, recursion); + } + else + { + /* non-inlining call */ + mypo = psyco_build_frame(&fncall, recursion, &sources); + if (mypo == NULL) + goto pyerr; + argcount = get_arguments_count(&mypo->vlocals); + finfo = psyco_finfo(po, mypo); + + /* compile the function (this frees mypo) */ + codebuf = psyco_compile_code(mypo, PsycoObject_Ready(mypo)); + + /* get the run-time argument sources and push them on the stack + and write the actual CALL */ + result = psyco_call_psyco(po, codebuf, sources, argcount, finfo); + PyMem_FREE(sources); + } + return result; + + fail_to_default: + return psyco_generic_call(po, cimpl_call_pyfunc, + CfReturnRef|CfPyErrIfNull, + "lvvv", co, vglobals, vdefaults, arg_tuple); + + pyerr: + psyco_virtualize_exception(po); + return NULL; +} + + + /***************************************************************/ +/*** PsycoFunctionObjects ***/ + /***************************************************************/ + +DEFINEFN +PsycoFunctionObject* psyco_PsycoFunction_NewEx(PyCodeObject* code, + PyObject* globals, + PyObject* defaults, + int rec) +{ + PsycoFunctionObject* result = PyObject_GC_New(PsycoFunctionObject, + &PsycoFunction_Type); + if (result != NULL) { + result->psy_code = code; Py_INCREF(code); + result->psy_globals = globals; Py_INCREF(globals); + result->psy_defaults = NULL; + result->psy_recursion = rec; + result->psy_fastcall = PyList_New(0); + PyObject_GC_Track(result); + + if (result->psy_fastcall == NULL) { + Py_DECREF(result); + return NULL; + } + + if (defaults != NULL) { + if (!PyTuple_Check(defaults)) { + Py_DECREF(result); + PyErr_SetString(PyExc_PsycoError, + "Psyco proxies need a tuple " + "for default arguments"); + return NULL; + } + if (PyTuple_GET_SIZE(defaults) > 0) { + result->psy_defaults = defaults; + Py_INCREF(defaults); + } + } + } + return result; +} + +#if 0 /* unneeded */ +DEFINEFN +PyObject* psyco_PsycoFunction_New(PyFunctionObject* func, int rec) +{ + /* return 'func' itself if the PsycoFunctionObject cannot be made */ + if (func->func_closure != NULL) { + Py_INCREF(func); + return (PyObject*) func; + } + return (PyObject*) + psyco_PsycoFunction_NewEx((PyCodeObject*) func->func_code, + func->func_globals, + func->func_defaults, + rec); +} +#endif /* 0 */ + +DEFINEFN +PyObject* psyco_proxycode(PyFunctionObject* func, int rec) +{ + PsycoFunctionObject *psyco_fun; + PyCodeObject *code, *newcode; + PyObject *consts, *proxy_cobj; + static PyObject *varnames = NULL; + static PyObject *free_cell_vars = NULL; + static PyObject *empty_string = NULL; + unsigned char proxy_bytecode[] = { + LOAD_CONST, 1, 0, + LOAD_FAST, 0, 0, + LOAD_FAST, 1, 0, + CALL_FUNCTION_VAR_KW, 0, 0, + RETURN_VALUE + }; + code = (PyCodeObject *)func->func_code; + if (is_proxycode(code)) + { + /* already a proxy code object */ + Py_INCREF(code); + return (PyObject*) code; + } + if (PyCode_GetNumFree(code) > 0) + { + /* it would be dangerous to continue in this case: the calling + convention changes when a function has free variables */ + PyErr_SetString(PyExc_PsycoError, "function has free variables"); + return NULL; + } + + newcode = NULL; + consts = NULL; + proxy_cobj = NULL; + psyco_fun = psyco_PsycoFunction_NewEx(code, + func->func_globals, + func->func_defaults, + rec); + if (psyco_fun == NULL) + goto error; + + consts = PyTuple_New(2); + if (consts == NULL) + goto error; + Py_INCREF(Py_None); + PyTuple_SET_ITEM(consts, 0, Py_None); /* if a __doc__ is expected there */ + PyTuple_SET_ITEM(consts, 1, (PyObject *)psyco_fun); /* consumes reference */ + psyco_fun = NULL; + + if (varnames == NULL) + { + if (free_cell_vars == NULL) + { + free_cell_vars = PyTuple_New(0); + if (free_cell_vars == NULL) + goto error; + } + if (empty_string == NULL) + { + empty_string = PyString_FromString(""); + if (empty_string == NULL) + goto error; + } + varnames = Py_BuildValue("ss", "args", "kwargs"); + if (varnames == NULL) + goto error; + } + + proxy_cobj = PyString_FromStringAndSize((char*)proxy_bytecode, + sizeof(proxy_bytecode)); + if (proxy_cobj == NULL) + goto error; + + newcode = PyCode_New(0, 2, 3, + CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, + proxy_cobj, consts, + varnames, varnames, free_cell_vars, + free_cell_vars, code->co_filename, + code->co_name, code->co_firstlineno, + empty_string); + /* fall through */ + error: + Py_XDECREF(psyco_fun); + Py_XDECREF(proxy_cobj); + Py_XDECREF(consts); + return (PyObject*) newcode; +} + +static void psycofunction_dealloc(PsycoFunctionObject* self) +{ + PyObject_GC_UnTrack(self); + Py_XDECREF(self->psy_fastcall); + Py_XDECREF(self->psy_defaults); + Py_DECREF(self->psy_globals); + Py_DECREF(self->psy_code); + PyObject_GC_Del(self); +} + +#if 0 +/* Disabled -- not supposed to be seen at user level */ +static PyObject* psycofunction_repr(PsycoFunctionObject* self) +{ + char buf[100]; + if (self->psy_func->func_name == Py_None) + sprintf(buf, "", self); + else + sprintf(buf, "", + PyString_AsString(self->psy_func->func_name), self); + return PyString_FromString(buf); +} +#endif + +static PyObject* psycofunction_call(PsycoFunctionObject* self, + PyObject* arg, PyObject* kw) +{ + PyObject* codebuf; + PyObject* result; + PyObject* tdict; + PyFrameRuntime* fruntime; + PyObject* f; + stack_frame_info_t** finfo; + long* initial_stack; + int key; + bool err; + + if (kw != NULL && PyDict_Check(kw) && PyDict_Size(kw) > 0) { + /* keyword arguments not supported yet */ + goto unsupported; + } + + key = PyTuple_GET_SIZE(arg); + if (key < PyList_GET_SIZE(self->psy_fastcall)) + codebuf = PyList_GET_ITEM(self->psy_fastcall, key); + else + codebuf = NULL; + + if (codebuf == NULL) { + /* not already seen with this number of arguments */ + vinfo_t* vglobals; + vinfo_array_t* vdefaults; + vinfo_array_t* arginfo; + PsycoObject* po = NULL; + source_known_t* sk; + struct fncall_arg_s fncall; + bool support; + int i = key; + + /* make an array of run-time values */ + arginfo = array_new(i); + while (i--) { + /* arbitrary values for the source */ + arginfo->items[i] = vinfo_new(SOURCE_DUMMY); + } + + /* build the globals and defaults as compile-time values */ + Py_INCREF(self->psy_globals); + sk = sk_new((long) self->psy_globals, SkFlagPyObj); + vglobals = vinfo_new(CompileTime_NewSk(sk)); + + if (self->psy_defaults == NULL) + vdefaults = NullArray; + else { + i = PyTuple_GET_SIZE(self->psy_defaults); + vdefaults = array_new(i); + while (i--) { + PyObject* v = PyTuple_GET_ITEM( + self->psy_defaults, i); + Py_INCREF(v); + sk = sk_new((long) v, SkFlagPyObj); + vdefaults->items[i] = + vinfo_new(CompileTime_NewSk(sk)); + } + } + + /* make a "frame" */ + support = fncall_init(&fncall, self->psy_code); + if (support && fncall_collect_arguments(&fncall, vglobals, + arginfo->items, arginfo->count, + vdefaults->items, vdefaults->count)) { + po = psyco_build_frame(&fncall, + self->psy_recursion, NULL); + } + array_delete(vdefaults, NULL); + vinfo_decref(vglobals, NULL); + array_delete(arginfo, NULL); + + if (po == NULL) { + if (!support) { + /* unsupported bytecode features */ + codebuf = Py_None; + Py_INCREF(codebuf); + } + else /* Python exception (wrong # of arguments) */ + return NULL; + } + else { + /* compile the function */ + codebuf = (PyObject*) psyco_compile_code(po, + PsycoObject_Ready(po)); + } + /* cache 'codebuf' (note that this is not necessary, as + multiple calls to psyco_compile_code() will just return + the same codebuf, but it makes things faster because we + don't have to build a whole PsycoObject the next time. */ + i = key+1 - PyList_GET_SIZE(self->psy_fastcall); + if (i > 0) { + /* list too short, first enlarge it with NULLs */ + PyObject* tmp = PyList_New(i); + if (tmp != NULL) { + PyList_SetSlice(self->psy_fastcall, + PyList_GET_SIZE(self->psy_fastcall), + PyList_GET_SIZE(self->psy_fastcall), + tmp); + Py_DECREF(tmp); + } + /* errors are detected by the failing PyList_SetItem() + call below */ + } + /* Eats a reference to codebuf */ + if (PyList_SetItem(self->psy_fastcall, key, codebuf)) + PyErr_Clear(); /* not fatal, ignore error */ + } + + if (codebuf == Py_None) + goto unsupported; + + /* over the current Python frame, a lightweight chained list of + Psyco frames will be built. Mark the current Python frame as + the starting point of this chained list. */ + f = (PyObject*) PyEval_GetFrame(); + if (f == NULL) { + debug_printf(1, ("warning: empty Python frame stack\n")); + goto unsupported; + } + tdict = psyco_thread_dict(); + if (tdict==NULL) return NULL; + fruntime = PyCStruct_NEW(PyFrameRuntime, PyFrameRuntime_dealloc); + Py_INCREF(f); + fruntime->cs_key = f; + fruntime->psy_frames_start = &finfo; + fruntime->psy_code = self->psy_code; + fruntime->psy_globals = self->psy_globals; + extra_assert(PyDict_GetItem(tdict, f) == NULL); + err = PyDict_SetItem(tdict, f, (PyObject*) fruntime); + Py_DECREF(fruntime); + if (err) return NULL; + /* Warning, no 'return' between this point and the PyDict_DelItem() + below */ + + /* get the actual arguments */ + extra_assert(RUN_ARGC(codebuf) == PyTuple_GET_SIZE(arg)); + initial_stack = (long*) (&PyTuple_GET_ITEM(arg, 0)); + + /* run! */ + Py_INCREF(codebuf); + result = psyco_processor_run((CodeBufferObject*) codebuf, + initial_stack, &finfo, tdict); + Py_DECREF(codebuf); + psyco_trash_object(NULL); /* free any trashed object now */ + +#if CODE_DUMP >= 2 + psyco_dump_code_buffers(); +#endif + if (PyDict_DelItem(tdict, f)) { + Py_XDECREF(result); + result = NULL; + } + + if (result==NULL) + extra_assert(PyErr_Occurred()); + else + extra_assert(!PyErr_Occurred()); + return result; + + unsupported: + { /* Code copied from function_call() in funcobject.c */ + PyObject **d, **k; + int nk, nd; + + PyObject* argdefs = self->psy_defaults; + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0); + nd = PyTuple_Size(argdefs); + } + else { + d = NULL; + nd = 0; + } + + if (kw != NULL && PyDict_Check(kw)) { + int pos, i; + nk = PyDict_Size(kw); + k = PyMem_NEW(PyObject *, 2*nk); + if (k == NULL) { + PyErr_NoMemory(); + return NULL; + } + pos = i = 0; + while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) + i += 2; + nk = i/2; + } + else { + k = NULL; + nk = 0; + } + + result = PyEval_EvalCodeEx(self->psy_code, + self->psy_globals, (PyObject *)NULL, + &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg), + k, nk, d, nd, + NULL); + + if (k != NULL) + PyMem_DEL(k); + + return result; + } +} + +static int psycofunction_traverse(PsycoFunctionObject *f, + visitproc visit, void *arg) +{ + int err; + if (f->psy_fastcall) { + err = visit(f->psy_fastcall, arg); + if (err) + return err; + } + if (f->psy_defaults) { + err = visit(f->psy_defaults, arg); + if (err) + return err; + } + err = visit(f->psy_globals, arg); + if (err) + return err; + return 0; +} + +static int psycofunction_clear(PsycoFunctionObject *f) +{ + PyObject* o; + o = f->psy_fastcall; + if (o) { + f->psy_fastcall = NULL; + Py_DECREF(o); + } + o = f->psy_defaults; + if (o) { + f->psy_defaults = NULL; + Py_DECREF(o); + } + o = f->psy_globals; + f->psy_globals = Py_None; + Py_INCREF(Py_None); + Py_DECREF(o); + return 0; +} + +DEFINEVAR +PyTypeObject PsycoFunction_Type = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Psyco_function", /*tp_name*/ + sizeof(PsycoFunctionObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + /* methods */ + (destructor)psycofunction_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + (ternaryfunc)psycofunction_call, /*tp_call*/ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ + 0, /* tp_doc */ + (traverseproc)psycofunction_traverse, /* tp_traverse */ + (inquiry)psycofunction_clear, /* tp_clear */ +}; diff --git a/nodeboxgl/ext/psyco/src/c/psyfunc.h b/nodeboxgl/ext/psyco/src/c/psyfunc.h new file mode 100644 index 0000000..451e01d --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/psyfunc.h @@ -0,0 +1,59 @@ + /***************************************************************/ +/*** Psyco Function objects (a.k.a. proxies) ***/ + /***************************************************************/ + +#ifndef _PSYFUNC_H +#define _PSYFUNC_H + + +#include "psyco.h" +#include /* for PyCodeObject */ + + +/* Encode a call to the given Python function, compiling it as needed. */ +EXTERNFN vinfo_t* psyco_call_pyfunc(PsycoObject* po, PyCodeObject* co, + vinfo_t* vglobals, vinfo_t* vdefaults, + vinfo_t* arg_tuple, int recursion); + +/* for pycompiler.c */ +EXTERNFN vinfo_t* psyco_save_inline_po(PsycoObject* po); +EXTERNFN PsycoObject* psyco_restore_inline_po(PsycoObject* po,vinfo_array_t** a); + + +/* Psyco proxies for Python functions. Calling a proxy has the same effect + as calling the function it has been built from, except that the function + is compiled first. As proxies are real Python objects, calling them is + the only way to go from Python's base level to Psyco's meta-level. + Note that (unlike in previous versions of Psyco) proxies should not be + seen by user Python code. Use _psyco.proxycode() to build a proxy and + emcompass it in a code object. */ +typedef struct { + PyObject_HEAD + PyCodeObject* psy_code; /* */ + PyObject* psy_globals; /* same as in Python function object */ + PyObject* psy_defaults; /* */ + int psy_recursion; /* # levels to automatically compile called functions */ + PyObject* psy_fastcall; /* cache mapping arg count to code bufs */ +} PsycoFunctionObject; + +EXTERNVAR PyTypeObject PsycoFunction_Type; + +#define PsycoFunction_Check(op) PyObject_TypeCheck(op, &PsycoFunction_Type) + + +#if 0 /* unneeded */ +EXTERNFN PyObject* psyco_PsycoFunction_New(PyFunctionObject* func, int rec); +#endif +EXTERNFN PsycoFunctionObject* psyco_PsycoFunction_NewEx(PyCodeObject* code, + PyObject* globals, + PyObject* defaults, /* or NULL */ + int rec); +EXTERNFN PyObject* psyco_proxycode(PyFunctionObject* func, int rec); + +PSY_INLINE bool is_proxycode(PyCodeObject* code) { + return PyTuple_Size(code->co_consts) > 1 && + PsycoFunction_Check(PyTuple_GET_ITEM(code->co_consts, 1)); +} + + +#endif /* _PSYFUNC_H */ diff --git a/nodeboxgl/ext/psyco/src/c/pycodegen.h b/nodeboxgl/ext/psyco/src/c/pycodegen.h new file mode 100644 index 0000000..4b6d4b8 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/pycodegen.h @@ -0,0 +1,68 @@ + /***************************************************************/ +/*** Generic support code for Python-specific code generation ***/ + /***************************************************************/ + +#ifndef _PYCODEGEN_H +#define _PYCODEGEN_H + +#include "vcompiler.h" +#include + + +/* emit Py_INCREF(v) */ +PSY_INLINE bool psyco_incref_v(PsycoObject* po, vinfo_t* v) +{ + if (!compute_vinfo(v, po)) return false; + psyco_incref_nv(po, v); + return true; +} + +/* emit Py_DECREF(v) */ +PSY_INLINE void psyco_decref_v(PsycoObject* po, vinfo_t* v) +{ + switch (gettime(v->source)) { + + case RunTime: + psyco_decref_rt(po, v); + break; + + case CompileTime: + psyco_decref_c(po, (PyObject*) CompileTime_Get(v->source)->value); + break; + } +} + + +/* can eat a reference if we had one in the first place, and + if no one else will require it (i.e. there is only one reference + left to 'vi') */ +PSY_INLINE bool eat_reference(vinfo_t* vi) +{ + if (has_rtref(vi->source) && vi->refcount == 1) + { + vi->source = remove_rtref(vi->source); + return true; + } + else + return false; +} + +/* force a reference to be consumed */ +PSY_INLINE void consume_reference(PsycoObject* po, vinfo_t* vi) +{ + if (!eat_reference(vi)) + psyco_incref_v(po, vi); +} + +/* make sure we have a reference on 'vi' */ +PSY_INLINE void need_reference(PsycoObject* po, vinfo_t* vi) +{ + if ((vi->source & (TimeMask | RunTime_NoRef)) == (RunTime | RunTime_NoRef)) + { + vi->source = add_rtref(vi->source); + psyco_incref_rt(po, vi); + } +} + + +#endif /* _PYCODEGEN_H */ diff --git a/nodeboxgl/ext/psyco/src/c/stats.c b/nodeboxgl/ext/psyco/src/c/stats.c new file mode 100644 index 0000000..1b7e698 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/stats.c @@ -0,0 +1,387 @@ +#include "stats.h" +#include "mergepoints.h" +#include "profile.h" +#include "cstruct.h" +#include +#include + + +static PyObject* codestats_dict; /* dict of {cs: cs} */ + + +static void PyCodeStats_dealloc(PyCodeStats* cs) +{ + Py_XDECREF(cs->st_codebuf); + Py_XDECREF(cs->st_globals); + Py_XDECREF(cs->st_mergepoints); +} + +DEFINEFN +PyCodeStats* PyCodeStats_Get(PyCodeObject* co) +{ + PyCodeStats* cs; + RECLIMIT_SAFE_ENTER(); + cs = (PyCodeStats*) PyCStruct_DictGet(codestats_dict, (PyObject*) co); + if (cs == NULL) { + cs = PyCStruct_NEW(PyCodeStats, PyCodeStats_dealloc); + + Py_INCREF(co); + cs->cs_key = (PyObject*) co; + cs->st_charge = 0.0f; + cs->st_mergepoints = NULL; + cs->st_codebuf = NULL; + cs->st_globals = NULL; + + if (PyDict_SetItem(codestats_dict, (PyObject*) cs, + (PyObject*) cs) < 0) + OUT_OF_MEMORY(); + Py_DECREF(cs); /* two references left in codestats_dict */ + } + RECLIMIT_SAFE_LEAVE(); + return cs; +} + +DEFINEFN +PyCodeStats* PyCodeStats_MaybeGet(PyCodeObject* co) +{ + PyCodeStats* cs; + RECLIMIT_SAFE_ENTER(); + cs = (PyCodeStats*) PyCStruct_DictGet(codestats_dict, (PyObject*) co); + RECLIMIT_SAFE_LEAVE(); + return cs; +} + + +/***************************************************************/ + /*** Collecting statistics ***/ + +/* to give recently executed code objects more chances to be compiled, + be simulate a "decay" of the st_charge associated with them. + We don't actually lower their st_charge; instead, we make their + value comparatively less important by increasing how much charge + the currently executing code objects will recieve. */ + +static double charge_total = 0.0; /* total of all st_charges */ +static float charge_prelimit = 0.0; /* optimization only */ +static float charge_watermark = 1.0f; /* see below */ +static float charge_unit = 1E-38f; /* current unit of charge */ +static float charge_parent2 = 1.0f; /* see below */ +static PyObject* charge_callback = NULL; + +/* When a single PyCodeStats.st_charge reaches + 'charge_total * charge_watermark', the callback function is called + (and typically, compilation starts). So charge_watermark gives the + charge limit expressed in a fraction of the total charge. This is + why decaying is important: a single function can reach a relatively + high percentage of the total charge only if the other functions' + charge decay quickly enough. + + 'charge_total' is a double because it is an accumulator and its + value must be accurate. */ + +/* the parent of a running frame is also charged, and its own parent too, + and so on, but the charge is less and less. Satistically, each parent + is charged only 'charge_parent2 / 2' as much as its child. */ + + +DEFINEFN +PyObject* psyco_stats_read(char* name) +{ + if (strcmp(name, "total") == 0) + return PyFloat_FromDouble( charge_total); + if (strcmp(name, "unit") == 0) + return PyFloat_FromDouble((double) charge_unit); + if (strcmp(name, "watermark") == 0) + return PyFloat_FromDouble((double) charge_watermark); + if (strcmp(name, "parent2") == 0) + return PyFloat_FromDouble((double) charge_parent2); + + PyErr_SetString(PyExc_ValueError, "no such readable parameter"); + return NULL; +} + +static int writeobj_with_ref(PyObject* obj, PyObject** target) +{ + PyObject* prev = *target; + if (obj == Py_None) + obj = NULL; + else + Py_INCREF(obj); + *target = obj; + Py_XDECREF(prev); + return 1; +} + +DEFINEFN +bool psyco_stats_write(PyObject* args, PyObject* kwds) +{ + static char *kwlist[] = {"unit", + "total", + "watermark", + "parent2", + "callback", + "logger", 0}; + charge_prelimit = 0.0f; + return PyArg_ParseTupleAndKeywords(args, kwds, "|fdffO&O&", kwlist, + &charge_unit, + &charge_total, + &charge_watermark, + &charge_parent2, + &writeobj_with_ref, &charge_callback, + &writeobj_with_ref, &psyco_logger); +} + + +/* very cheap very weak pseudo-random number generator */ +static unsigned int c_seek = 1; +PSY_INLINE unsigned int c_random(void) +{ + return (c_seek = c_seek * 9); +} + + +#if VERBOSE_STATS +# define STATLINES 10 +static void stats_dump(void) +{ + float top[STATLINES]; + char* top_names[STATLINES]; + int i, j, k=0; + PyObject *key, *value; + for (i=0; ics_key)); + co = (PyCodeObject*) cs->cs_key; + for (i=0; ist_charge > top[i]) { + for (j=STATLINES-1; j>i; j--) { + top [j] = top [j-1]; + top_names[j] = top_names[j-1]; + } + top [i] = cs->st_charge; + top_names[i] = PyCodeObject_NAME(co); + break; + } + } + } + for (i=0; if_code); + cs_charge = (float)(cs->st_charge + charge); + cs->st_charge = cs_charge; + charge_total += charge; + if (cs_charge > charge_prelimit && charge_callback) { + /* update charge_prelimit */ + charge_prelimit = (float)(charge_total * charge_watermark); + if (cs_charge > charge_prelimit) { + /* still over the up-to-date limit */ + cs->st_charge = 0.0f; + break; + } + } + if (bits >= 0) + return; /* triggers in about 50% of the cases */ + bits <<= 1; + f = f->f_back; + if (!f) + return; + charge *= charge_parent2; + } + + /* charge limit reached, invoke callback */ + { + PyObject* r; + r = PyObject_CallFunction(charge_callback, "Of", f, cs_charge); + if (r == NULL) { + PyErr_WriteUnraisable((PyObject*) f); + } + else { + Py_DECREF(r); + } + } +} + +DEFINEFN +void psyco_stats_collect(void) +{ + /* collect statistics for all registered threads */ + PyInterpreterState* istate = PyThreadState_Get()->interp; + PyThreadState* tstate; + for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { + psyco_stats_append(tstate, tstate->frame); + } +} + +DEFINEFN +void psyco_stats_reset(void) +{ + /* reset all stats */ + int i = 0; + PyObject *key, *value, *d; + stats_printf(("stats: reset\n")); + + /* reset the charge of all PyCodeStats, keep only the used ones */ + RECLIMIT_SAFE_ENTER(); + d = PyDict_New(); + if (d == NULL) + OUT_OF_MEMORY(); + while (PyDict_Next(codestats_dict, &i, &key, &value)) { + PyCodeStats* cs = (PyCodeStats*) key; + if (cs->st_mergepoints) { + /* clear the charge and keep alive */ + cs->st_charge = 0.0f; + if (PyDict_SetItem(d, key, value)) + OUT_OF_MEMORY(); + } + } + RECLIMIT_SAFE_LEAVE(); + Py_DECREF(codestats_dict); + codestats_dict = d; + charge_total = 0.0; + charge_prelimit = 0.0f; + + /* reset the time measure in all threads */ + { +#if MEASURE_ALL_THREADS + PyInterpreterState* istate = PyThreadState_Get()->interp; + PyThreadState* tstate; + for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { + (void) get_measure(tstate); + } +#else + (void) get_measure(NULL); +#endif + } +} + +DEFINEFN +PyObject* psyco_stats_dump(void) +{ + PyObject* d = PyDict_New(); + int i = 0; + PyObject *key, *value; + if (d == NULL) + return NULL; + + while (PyDict_Next(codestats_dict, &i, &key, &value)) { + PyCodeStats* cs = (PyCodeStats*) key; + PyObject* o = PyFloat_FromDouble(cs->st_charge); + extra_assert(PyCStruct_Check(key)); + extra_assert(PyCode_Check(cs->cs_key)); + if (o == NULL || PyDict_SetItem(d, cs->cs_key, o)) { + Py_DECREF(d); + return NULL; + } + } + stats_dump(); + return d; +} + +DEFINEFN +PyObject* psyco_stats_top(int n) +{ + PyObject* l; + PyObject* l2 = NULL; + int i, k=0, full=0; + PyObject *key, *value; + float charge_min = (float)(charge_total * 0.001); + + extra_assert(n>0); + l = PyList_New(n); + if (l == NULL) + goto fail; + + while (PyDict_Next(codestats_dict, &k, &key, &value)) { + PyCodeStats* cs = (PyCodeStats*) key; + extra_assert(PyCStruct_Check(key)); + extra_assert(PyCode_Check(cs->cs_key)); + if (cs->st_charge <= charge_min) + continue; + if (full < n) + full++; + i = full; + while (--i > 0) { + PyObject* o = PyList_GetItem(l, i-1); + PyCodeStats* current = (PyCodeStats*) o; + if (cs->st_charge <= current->st_charge) + break; + Py_INCREF(o); + if (PyList_SetItem(l, i, o)) + goto fail; + } + Py_INCREF(cs); + if (PyList_SetItem(l, i, (PyObject*) cs)) + goto fail; + cs = (PyCodeStats*) PyList_GetItem(l, full-1); + charge_min = cs->st_charge; + } + + l2 = PyList_New(full); + if (l2 == NULL) + goto fail; + + for (i=0; ics_key, + (double)(cs->st_charge / charge_total)); + if (!x || PyList_SetItem(l2, i, x)) + goto fail; + } + Py_DECREF(l); + return l2; + + fail: + Py_XDECREF(l2); + Py_XDECREF(l); + return NULL; +} + + + /***************************************************************/ + +#if !MEASURE_ALL_THREADS +DEFINEVAR PyThreadState* psyco_main_threadstate; +#endif + + +INITIALIZATIONFN +void psyco_stats_init(void) +{ + codestats_dict = PyDict_New(); + +#if !MEASURE_ALL_THREADS + psyco_main_threadstate = PyThreadState_Get(); +#endif +} diff --git a/nodeboxgl/ext/psyco/src/c/stats.h b/nodeboxgl/ext/psyco/src/c/stats.h new file mode 100644 index 0000000..44ac1a6 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/stats.h @@ -0,0 +1,74 @@ + /***************************************************************/ +/*** Statistics management and usage about code objects ***/ + /***************************************************************/ + +#ifndef _STATS_H +#define _STATS_H + +/* NB.: the real-time profilers are in profile.c */ + +#include "psyco.h" +#include "cstruct.h" +#include "mergepoints.h" +#include "timing.h" +#include "Python/frames.h" +#include +#include + + +#if VERBOSE_STATS +# define stats_printf(args) debug_printf(1, args) +#else +# define stats_printf(args) do { } while (0) /* nothing */ +#endif + + +/* extra data attached to code objects */ +typedef struct { + PyCStruct_HEAD /* cs_key is the code object */ + float st_charge; /* usage statistics */ + PyObject* st_mergepoints; + PyObject* st_codebuf; /* as compiled from PsycoCode_CompileCode() */ + PyObject* st_globals; /* globals used in st_codebuf */ +} PyCodeStats; + + +/* return the PyCodeStats for 'co' */ +EXTERNFN PyCodeStats* PyCodeStats_Get(PyCodeObject* co); +EXTERNFN PyCodeStats* PyCodeStats_MaybeGet(PyCodeObject* co); + +/* compute and return a Borrowed reference to st_mergepoints */ +PSY_INLINE PyObject* PyCodeStats_MergePoints(PyCodeStats* cs, int module) { + PyObject* mp = cs->st_mergepoints; + if (mp == NULL) { + mp = psyco_build_merge_points((PyCodeObject*) cs->cs_key, + module); + cs->st_mergepoints = mp; + } + else if (!module && mp != Py_None && + (psyco_mp_flags(mp) & MP_FLAGS_MODULE)) + mp = Py_None; /* can only run as top-level module code */ + return mp; +} + + +EXTERNFN void psyco_stats_reset(void); +EXTERNFN void psyco_stats_append(PyThreadState* tstate, PyFrameObject* f); +EXTERNFN void psyco_stats_collect(void); +EXTERNFN PyObject* psyco_stats_top(int n); + /* set tunable parameters */ +EXTERNFN bool psyco_stats_write(PyObject* args, PyObject* kwds); +EXTERNFN PyObject* psyco_stats_read(char* name); +EXTERNFN PyObject* psyco_stats_dump(void); + + +/* private timing data, based on timing.h */ +#if MEASURE_ALL_THREADS +# define measuring_state(ts) 1 +#else +# define measuring_state(ts) ((ts) == psyco_main_threadstate) +EXTERNVAR PyThreadState* psyco_main_threadstate; +#endif + + +#endif /* _STATS_H */ diff --git a/nodeboxgl/ext/psyco/src/c/timing.h b/nodeboxgl/ext/psyco/src/c/timing.h new file mode 100644 index 0000000..fe115f7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/timing.h @@ -0,0 +1,32 @@ + /***************************************************************/ +/*** Measuring processor time ***/ + /***************************************************************/ + +#ifndef _TIMING_H +#define _TIMING_H + +#include "psyco.h" +#include "Python/pyver.h" + + +#define measure_is_zero(m) ((m) == (time_measure_t) 0) + + +/***************************************************************/ +/* Use the tick_counter field of the PyThreadState for timing */ + +#define MEASURE_ALL_THREADS 1 + +typedef int time_measure_t; + +PSY_INLINE time_measure_t get_measure(PyThreadState* tstate) +{ + int result = tstate->tick_counter; + tstate->tick_counter = 0; + return result; +} + +/***************************************************************/ + + +#endif /* _TIMING_H */ diff --git a/nodeboxgl/ext/psyco/src/c/vcompiler.c b/nodeboxgl/ext/psyco/src/c/vcompiler.c new file mode 100644 index 0000000..c9a2b7c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/vcompiler.c @@ -0,0 +1,1004 @@ +#include "vcompiler.h" +#include "dispatcher.h" +#include "codemanager.h" +#include "mergepoints.h" +#include "Python/pycompiler.h" +#include "pycodegen.h" +#include + + +DEFINEVAR const long psyco_zero = 0; +DEFINEVAR source_virtual_t psyco_vsource_not_important; + + +/*****************************************************************/ + +BLOCKALLOC_IMPLEMENTATION(vinfo, vinfo_t, 8192) +BLOCKALLOC_IMPLEMENTATION(sk, source_known_t, 4096) + +/*****************************************************************/ + +DEFINEFN +vinfo_array_t* array_grow1(vinfo_array_t* array, int ncount) +{ + int i = array->count; + extra_assert(ncount > i); + if (i == 0) + array = PyMem_MALLOC(sizeof(int) + ncount * sizeof(vinfo_t*)); + else + array = PyMem_REALLOC(array, sizeof(int) + ncount * sizeof(vinfo_t*)); + if (array == NULL) + OUT_OF_MEMORY(); + array->count = ncount; + while (iitems[i++] = NULL; + return array; +} + +DEFINEFN +void vinfo_array_shrink(PsycoObject* po, vinfo_t* vi, int ncount) +{ + vinfo_array_t* array = vi->array; + int i = array->count; + if (i <= ncount) + return; + + while (i > ncount) + { + vinfo_t* v1 = array->items[--i]; + if (v1 != NULL) + { + array->items[i] = NULL; + vinfo_decref(v1, po); + } + } + if (ncount == 0) + array = NullArray; + else + { + array = PyMem_REALLOC(array, sizeof(int) + ncount * sizeof(vinfo_t*)); + if (array == NULL) + OUT_OF_MEMORY(); + array->count = ncount; + } + vi->array = array; +} + + +/*****************************************************************/ + +DEFINEFN +void sk_release(source_known_t *sk) +{ +#if 0 + XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX + The Python objects who get once in a source_known_t are never + freed. This is so because we might have references to them left + in the code buffers. This is tricky because the references can + be indirect (to a sub-objects, to a field in the object structure, + etc...) + So not freeing them at all is the easy way out. It is expected + that not too many objects will get lost this way. This must be + carefully worked out when implementing releasing of code + buffers. It will probably require careful checks for all + instructions that might emit an immediate value in the code, + and for where this immediate value (indirectly or not) comes from. + XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX + if ((sk->refcount1_flags & SkFlagPyObj) != 0) { + Py_XDECREF((PyObject*)(sk->value)); + } +#endif + sk_delete(sk); +} + +DEFINEFN +vinfo_t* vinfo_copy(vinfo_t* vi) +{ + vinfo_t* result = vinfo_new_skref(vi->source); + result->array = vi->array; + if (result->array->count > 0) + { + result->array = array_new(result->array->count); + duplicate_array(result->array, vi->array); + } + return result; +} + + +DEFINEFN +void vinfo_release(vinfo_t* vi, PsycoObject* po) +{ + switch (gettime(vi->source)) { + + case RunTime: + if (po != NULL) + { + if (has_rtref(vi->source)) + { + /* write Py_DECREF() when releasing the last reference to + a run-time vinfo_t holding a reference to a Python object */ + psyco_decref_rt(po, vi); + } + RTVINFO_RELEASE(vi->source); + } + break; + + case CompileTime: + sk_decref(CompileTime_Get(vi->source)); + break; + +#if HAVE_CCREG + case VirtualTime: + if (po != NULL) + { + int i; + for (i=0; iccregs[i]) + po->ccregs[i] = NULL; + } + break; +#endif + } + + /* must be after the switch because psyco_decref_rt() did use the + array to extract any available type information to speed up Py_DECREF(). */ + if (vi->array != NullArray) + array_delete(vi->array, po); + +#if HAVE_CCREG && PSYCO_DEBUG + /* only virtual-time vinfos are allowed in po->ccreg */ + if (po != NULL) + { + int i; + for (i=0; iccregs[i]); + } +#endif + psyco_llfree_vinfo(vi); +} + +DEFINEFN +void vinfo_move(PsycoObject* po, vinfo_t* vtarget, vinfo_t* vsource) +{ + Source src = vsource->source; + +#if PSYCO_DEBUG + extra_assert(!is_virtualtime(src)); + if (is_compiletime(src)) + { + /* a compile-time vinfo may only hold compile-time subitems */ + int j; + for (j=0; jarray->count; j++) + extra_assert(vtarget->array->items[j] == NULL || + is_compiletime(vtarget->array->items[j]->source)); + } +#endif + + extra_assert(vsource->array == NullArray); + vtarget->source = src; + if (is_runtime(src)) + RTVINFO_MOVE(src, vtarget); + extra_assert(vsource->refcount == 1); + psyco_llfree_vinfo(vsource); + clear_tmp_marks(vtarget->array); + psyco_simplify_array(vtarget->array, po); +} + + +DEFINEFN +void clear_tmp_marks(vinfo_array_t* array) +{ + /* clear all 'tmp' fields in the array, recursively */ + int i = array->count; + while (i--) + if (array->items[i] != NULL) + { + array->items[i]->tmp = NULL; + if (array->items[i]->array != NullArray) + clear_tmp_marks(array->items[i]->array); + } +} + +#if ALL_CHECKS +DEFINEFN +void assert_cleared_tmp_marks(vinfo_array_t* array) +{ + /* assert that all 'tmp' fields are NULL */ + int i = array->count; + while (i--) + if (array->items[i] != NULL) + { + extra_assert(array->items[i]->tmp == NULL); + if (array->items[i]->array != NullArray) + assert_cleared_tmp_marks(array->items[i]->array); + } +} + +static bool array_contains(vinfo_array_t* array, vinfo_t* vi) +{ + bool result = false; + int i = array->count; + while (i--) + if (array->items[i] != NULL) + { + if (array->items[i] == vi) + result = true; + if (array->items[i]->array != NullArray) + { + if (is_compiletime(array->items[i]->source)) + extra_assert(!array_contains(array->items[i]->array, vi)); + else + if (array_contains(array->items[i]->array, vi)) + result = true; + } + } + return result; +} + +DEFINEFN +void assert_array_contains_nonct(vinfo_array_t* array, vinfo_t* vi) +{ + /* check that 'vi' appears at least once in 'array', and + never appears as subitem of a compile-time vinfo_t */ + extra_assert(array_contains(array, vi)); +} + +static void coherent_array(vinfo_array_t* source, PsycoObject* po, int found[], + bool allow_any) +{ + int i = source->count; + while (i--) + if (source->items[i] != NULL) + { + Source src = source->items[i]->source; + extra_assert(allow_any || is_compiletime(src)); + switch (gettime(src)) { + case RunTime: + /* test that we don't have an unreasonably high value + although it might still be correct in limit cases */ + extra_assert(getstack(src) < RunTime_StackMax/2); + RTVINFO_CHECK(po, source->items[i], found); + break; + case CompileTime: + case VirtualTime: + break; + default: + psyco_fatal_msg("gettime() corrupted"); + } +#if HAVE_CCREG + if (psyco_vsource_cc(src) != CC_ALWAYS_FALSE) + { + int index = INDEX_CC(psyco_vsource_cc(src)); + extra_assert(po->ccregs[index] == source->items[i]); + found[REG_TOTAL+index] = 1; + } +#endif + if (source->items[i]->array != NullArray) + coherent_array(source->items[i]->array, po, found, + !is_compiletime(src)); + } +} + +static void hack_refcounts(vinfo_array_t* source, int delta, int mvalue) +{ + int i = source->count; + while (i--) + if (source->items[i] != NULL) + { + long rc = source->items[i]->refcount; + rc = ((rc + delta) & 0xFFFF) + (rc & 0x10000); + source->items[i]->refcount = rc; + if ((rc & 0x10000) == mvalue) + { + source->items[i]->refcount ^= 0x10000; + if (source->items[i]->array != NullArray) + hack_refcounts(source->items[i]->array, delta, mvalue); + } + } +} + +static vinfo_t* nonnull_refcount(vinfo_array_t* source) +{ + int i = source->count; + while (i--) + if (source->items[i] != NULL) + { + if (source->items[i]->refcount != 0x10000) + { + fprintf(stderr, "nonnull_refcount: item %d\n", i); + return source->items[i]; + } + if (source->items[i]->array != NullArray) + { + vinfo_t* result = nonnull_refcount(source->items[i]->array); + if (result != NULL) + { + fprintf(stderr, "nonnull_refcount: in array item %d\n", i); + return result; + } + } + } + return NULL; +} + +DEFINEFN +void psyco_assert_coherent1(PsycoObject* po, bool full) +{ + vinfo_array_t debug_extra_refs; + int found[REG_TOTAL+HAVE_CCREG]; + int i; + vinfo_t* err; + for (i=0; ipr.exc; /* normally private to pycompiler.c,*/ + debug_extra_refs.items[1] = po->pr.val; /* but this is for debugging only */ + coherent_array(&po->vlocals, po, found, true); + coherent_array(&debug_extra_refs, po, found, true); + if (full) + { + RTVINFO_CHECKED(po, found); +#if HAVE_CCREG + for (i=0; iccregs[i] == NULL); +#endif + hack_refcounts(&po->vlocals, -1, 0); + hack_refcounts(&debug_extra_refs, -1, 0); + err = nonnull_refcount(&po->vlocals); + hack_refcounts(&debug_extra_refs, +1, 0x10000); + hack_refcounts(&po->vlocals, +1, 0x10000); + extra_assert(!err); /* see nonnull_refcounts() */ + } +} +#endif /* ALL_CHECKS */ + +DEFINEFN +void duplicate_array(vinfo_array_t* target, vinfo_array_t* source) +{ + /* make a depth copy of an array. + Same requirements as psyco_duplicate(). + Do not use for arrays of length 0. */ + int i; + for (i=0; icount; i++) + { + vinfo_t* sourcevi = source->items[i]; + if (sourcevi == NULL) + target->items[i] = NULL; + else if (sourcevi->tmp != NULL) + { + target->items[i] = sourcevi->tmp; + target->items[i]->refcount++; + } + else + { + vinfo_t* targetvi = vinfo_copy(sourcevi); + targetvi->tmp = NULL; + target->items[i] = sourcevi->tmp = targetvi; + } + } + target->count = source->count; + + /*return true; + + fail: + while (i--) + if (items[i] != NULL) + { + items[i]->tmp = NULL; + target->items[i]->decref(NULL); + } + return false;*/ +} + +DEFINEFN +PsycoObject* psyco_duplicate(PsycoObject* po) +{ + /* Requires that all 'tmp' marks in 'po' are cleared. + In the new copy all 'tmp' marks will be cleared. */ + + PsycoObject* result = PsycoObject_New(po->vlocals.count); + psyco_assert_coherent(po); + assert_cleared_tmp_marks(&po->vlocals); + duplicate_array(&result->vlocals, &po->vlocals); + + /* set the register pointers of 'result' to the new vinfo_t's */ + DUPLICATE_PROCESSOR(result, po); + + /* the rest of the data is copied with no change */ + result->respawn_cnt = po->respawn_cnt; + result->respawn_proxy = po->respawn_proxy; + result->code = po->code; + result->codelimit = po->codelimit; + pyc_data_duplicate(&result->pr, &po->pr); + + assert_cleared_tmp_marks(&result->vlocals); + psyco_assert_coherent(result); + return result; +} + +DEFINEFN void PsycoObject_Delete(PsycoObject* po) +{ + pyc_data_release(&po->pr); + deallocate_array(&po->vlocals, NULL); + PyMem_FREE(po); +} + +DEFINEFN +bool psyco_limit_nested_weight(PsycoObject* po, vinfo_array_t* array, + int nw_index, signed char nw_end) +{ + signed char nw; + int i; + for (i=array->count; i--; ) + { + vinfo_t* vi = array->items[i]; + if (vi != NULL) + { + nw = nw_end; + if (is_virtualtime(vi->source)) + { + source_virtual_t* sv = VirtualTime_Get(vi->source); + nw -= sv->nested_weight[nw_index]; + if (nw <= 0) + { + /* maximum reached, force out of virtual-time */ + if (!sv->compute_fn(po, vi)) + return false; + /* vi->array may be modified by compute_fn() */ + continue; + } + } + if (vi->array != NullArray) + if (!psyco_limit_nested_weight(po, vi->array, nw_index, nw)) + return false; + } + } + return true; +} + +DEFINEFN +long direct_read_vinfo(vinfo_t* vi, char* data) +{ + int sindex; + if (vi == NULL) + { + PyErr_SetString(PyExc_PsycoError, "undefined value"); + return -1; + } + switch (gettime(vi->source)) { + + case RunTime: + sindex = getstack(vi->source); + return *(long*)(data+sindex); + + case CompileTime: + return CompileTime_Get(vi->source)->value; + + default: + Py_FatalError("Psyco: virtual-time direct_read_vinfo"); + return 0; + } +} + +DEFINEFN +PyObject* direct_xobj_vinfo(vinfo_t* vi, char* data) +{ + int sindex; + PyObject* o = NULL; + if (vi != NULL) + { + switch (gettime(vi->source)) { + + case RunTime: + sindex = getstack(vi->source); + o = *(PyObject**)(data+sindex); + break; + + case CompileTime: + o = (PyObject*) CompileTime_Get(vi->source)->value; + break; + + case VirtualTime: + if (VirtualTime_Get(vi->source)->direct_compute_fn == NULL) + Py_FatalError("Psyco: value not directly computable"); + return VirtualTime_Get(vi->source)->direct_compute_fn(vi, data); + } + Py_XINCREF(o); + } + return o; +} + + +/*****************************************************************/ + + +PSY_INLINE vinfo_t* field_read(PsycoObject* po, vinfo_t* vi, long offset, + vinfo_t* vindex, defield_t df, bool newref) +{ + vinfo_t* result = psyco_memory_read(po, vi, offset, vindex, + FIELD_SIZE2(df), (long)df & FIELD_UNSIGNED); + if ((long)df & FIELD_NONNEG) { + assert_nonneg(result); + } + if (newref && FIELD_HAS_REF(df)) { + /* the container 'vi' could be freed while the + field 'result' is still in use */ + need_reference(po, result); + } + return result; +} + +DEFINEFN +vinfo_t* psyco_internal_getfld(PsycoObject* po, int findex, defield_t df, + vinfo_t* vi, long offset) +{ + bool newref = !((long)df & FIELD_INTL_NOREF); + vinfo_t* vf; + if (is_virtualtime(vi->source)) { + vf = vinfo_getitem(vi, findex); + if (vf != NULL) + goto done; + if (!compute_vinfo(vi, po)) + return NULL; + } + if ((long)df & FIELD_MUTABLE) { + extra_assert(newref); + return field_read(po, vi, offset, NULL, df, newref); + } + vf = vinfo_getitem(vi, findex); + if (vf != NULL) + goto done; + + if (is_runtime(vi->source)) { + vf = field_read(po, vi, offset, NULL, df, newref); + } + else { + long result; + long sk_flag = 0; + char* ptr = (char*)(CompileTime_Get(vi->source)->value); + ptr += offset; + switch (FIELD_SIZE2(df)) { + case 0: + if ((long)df & FIELD_UNSIGNED) + result = *((unsigned char*) ptr); + else + result = *((signed char*) ptr); + break; + case 1: + if ((long)df & FIELD_UNSIGNED) + result = *((unsigned short*) ptr); + else + result = *((signed short*) ptr); + break; + default: + result = *((long*) ptr); + if ((long)df & FIELD_PYOBJ_REF) { + extra_assert(result); + extra_assert(newref); + Py_INCREF((PyObject*) result); + sk_flag = SkFlagPyObj; + } + break; + } + vf = vinfo_new(CompileTime_NewSk(sk_new(result, sk_flag))); + } + + if (((long)df & FIELD_ARRAY) && newref) + return vf; + CHECK_FIELD_INDEX(findex); + vinfo_setitem(po, vi, findex, vf); + + done: + if (newref) + vinfo_incref(vf); + return vf; +} + +DEFINEFN +vinfo_t* psyco_get_field_array(PsycoObject* po, vinfo_t* vi, defield_t df, + vinfo_t* vindex) +{ + long offset = FIELD_C_OFFSET(df); + if (!compute_vinfo(vindex, po)) + return NULL; + + extra_assert((long)df & FIELD_ARRAY); + if (is_compiletime(vindex->source)) { + return psyco_get_nth_field(po, vi, df, + CompileTime_Get(vindex->source)->value); + } + else { + if (!compute_vinfo(vi, po)) + return NULL; + return field_read(po, vi, offset, vindex, df, true); + } +} + +DEFINEFN +bool psyco_internal_putfld(PsycoObject* po, int findex, defield_t df, + vinfo_t* vi, long offset, vinfo_t* value) +{ + if (is_virtualtime(vi->source)) { + vinfo_t* vf = vinfo_getitem(vi, findex); + if (vf != NULL) { + /* can only set field virtually if a value was + previously found */ + vinfo_incref(value); + vinfo_setitem(po, vi, findex, value); + return true; + } + if (!compute_vinfo(vi, po)) + return false; + } + extra_assert((long)df & FIELD_MUTABLE); + if (!psyco_memory_write(po, vi, offset, NULL, FIELD_SIZE2(df), value)) + return false; + + if (FIELD_HAS_REF(df)) { + /* 'value' is a PyObject* that wants to hold a reference */ + if (vinfo_getitem(vi, findex) == value) { + /* special case: writing a value that is already + virtually there. This is common when promoting + objects out of virtual-time. In this case, we try + to transfer the reference to the new memory + location. If this succeeds, the original 'value' + must be removed from 'vi', because it no longer + holds the reference and might become invalid if + its new no-longer-virtual container object is + deleted too early. + + This causes the 'value' to be reloaded from the + memory location the next time it is used, but in a + lot of cases it avoids a Py_INCREF()/Py_DECREF() + pair, which costs more. */ + if (decref_create_new_lastref(po, value)) { + vinfo_setitem(po, vi, findex, NULL); + } + } + else { + /* common case */ + decref_create_new_ref(po, value); + } + } + return true; +} + +DEFINEFN +bool psyco_put_field_array(PsycoObject* po, vinfo_t* vi, defield_t df, + vinfo_t* vindex, vinfo_t* value) +{ + long offset = FIELD_C_OFFSET(df); + if (!compute_vinfo(vindex, po)) + return false; + + extra_assert((long)df & FIELD_ARRAY); + if (is_compiletime(vindex->source)) { + return psyco_put_nth_field(po, vi, df, + CompileTime_Get(vindex->source)->value, + value); + } + else { + if (!compute_vinfo(vi, po)) + return false; + if (!psyco_memory_write(po, vi, offset, vindex, + FIELD_SIZE2(df), value)) + return false; + if (FIELD_HAS_REF(df)) { + /* 'value' is a PyObject* that wants to + hold a reference */ + decref_create_new_ref(po, value); + } + return true; + } +} + +DEFINEFN +void psyco_assert_field(PsycoObject* po, vinfo_t* vi, defield_t df, + long value) +{ + long sk_flag = 0; + extra_assert(!((long)df & FIELD_MUTABLE)); + + if (is_compiletime(vi->source)) { +#if PSYCO_DEBUG + /* check assertion at compile-time */ + vinfo_t* vf = psyco_get_field(po, vi, df); + extra_assert(CompileTime_Get(vf->source)->value == value); + vinfo_decref(vf, po); +#endif + } + else { + if (FIELD_HAS_REF(df)) { + Py_INCREF((PyObject*) value); + sk_flag = SkFlagPyObj; + } + CHECK_FIELD_INDEX(df); + vinfo_setitem(po, vi, FIELD_INDEX(df), + vinfo_new(CompileTime_NewSk(sk_new(value, sk_flag)))); + } +} + + +/*****************************************************************/ + + +typedef struct { + CodeBufferObject* self; + PsycoObject* po; + resume_fn_t resume_fn; + void* jump_to_fix; +} coding_pause_t; + +static code_t* do_resume_coding(coding_pause_t* cp) +{ + /* called when entering a coding_pause (described by 'cp') */ + code_t* target = (cp->resume_fn) (cp->po, cp+1); /* resume compilation work */ + + /* then fix the jump to point to 'target' */ + change_cond_jump_target(cp->jump_to_fix, target); + + /* cannot Py_DECREF(cp->self) because the current function is returning into + that code now, but any time later is fine: use the trash of codemanager.c */ + dump_code_buffers(); + psyco_trash_object((PyObject*) cp->self); + return target; +} + +/* Prepare a 'coding pause', i.e. a short amount of code (proxy) that will be + called only if the execution actually reaches it to go on with compilation. + 'po' is the PsycoObject corresponding to the proxy. + 'jmpcondition' should not be CC_ALWAYS_FALSE. + The (possibly conditional) jump to the proxy is encoded in 'calling_code'. + When the execution reaches the proxy, 'resume_fn' is called and the proxy + destroys itself and replaces the original jump to it by a jump to the newly + compiled code. */ +DEFINEFN +void psyco_coding_pause(PsycoObject* po, condition_code_t jmpcondition, + resume_fn_t resume_fn, void* extra, int extrasize) +{ + coding_pause_t* cp; + code_t* calling_code; + code_t* calling_limit; + code_t* limit; + CodeBufferObject* codebuf = psyco_new_code_buffer(NULL, NULL, &limit); + + /* the proxy contains only a jump to do_resume_coding, + followed by a coding_pause_t structure, itself followed by the + 'extra' data. */ + calling_code = po->code; + calling_limit = po->codelimit; + po->code = insn_code_label(codebuf->codestart); + po->codelimit = limit; + cp = (coding_pause_t*) psyco_call_code_builder(po, &do_resume_coding, + true, SOURCE_DUMMY); + SHRINK_CODE_BUFFER(codebuf, + (code_t*)(cp+1) + extrasize, + "coding_pause"); + /* fill in the coding_pause_t structure and the following 'extra' data */ + psyco_resolved_cc(po, jmpcondition); /* jmpcondition is true if we follow + the branch */ + cp->self = codebuf; + cp->po = po; + cp->resume_fn = resume_fn; + memcpy(cp+1, extra, extrasize); + + /* write the jump to the proxy */ + po->code = calling_code; + po->codelimit = calling_limit; + cp->jump_to_fix = conditional_jump_to(po, (code_t*) codebuf->codestart, + jmpcondition); + dump_code_buffers(); +} + +/* for psyco_coding_pause(): a resume function that simply resumes compilation. + */ +static code_t* psyco_resume_compile(PsycoObject* po, void* extra) +{ + mergepoint_t* mp = psyco_exact_merge_point(po->pr.merge_points, + po->pr.next_instr); + /* check that we are not compiling recursively, or at least not too deeply */ + extra_assert(psyco_locked_buffers() < WARN_TOO_MANY_BUFFERS-1); + return (code_t*) psyco_compile_code(po, mp)->codestart; + /* XXX don't know what to do with the reference returned by + XXX psyco_compile_code() */ +} + + +/* Main compiling function. Emit machine code corresponding to the state + 'po'. The compiler produces its code into 'code' and the return value is + the end of the written code. 'po' is freed. */ +DEFINEFN +code_t* psyco_compile(PsycoObject* po, mergepoint_t* mp, + bool continue_compilation) +{ + vcompatible_t* cmp = mp==NULL ? NULL : psyco_compatible(po, &mp->entries); + + /*psyco_assert_cleared_tmp_marks(&po->vlocals); -- not needed -- */ + + if (cmp != NULL && cmp->diff == NullArray) /* exact match, jump there */ + { + CodeBufferObject* oldcodebuf; + code_t* code2 = psyco_unify(po, cmp, &oldcodebuf); + /* XXX store reference to oldcodebuf somewhere */ + return code2; + } + else + { + if (po->codelimit - po->code <= BUFFER_MARGIN && cmp == NULL) + { + /* Running out of space in this buffer. */ + + /* Instead of going on we stop now and make ready to + start the new buffer later, when the execution actually + reaches this point. This forces the emission of code to + pause at predicible intervals. Among other advantages it + prevents long or infinite loops from exploding the memory + while the user sees no progression in the execution of + her program. + */ + psyco_coding_pause(po, CC_ALWAYS_TRUE, &psyco_resume_compile, NULL, 0); + return po->code; + } + + /* Enough space left, continue in the same buffer. */ + { + CodeBufferObject* codebuf = psyco_proxy_code_buffer(po, + mp != NULL ? &mp->entries : NULL); +#if CODE_DUMP + codebuf->chained_list = psyco_codebuf_chained_list; + psyco_codebuf_chained_list = codebuf; +#endif + /*Py_DECREF(codebuf); XXX cannot loose reference if mp == NULL*/ + po->code = insn_code_label(codebuf->codestart); + } + + if (cmp != NULL) /* partial match */ + { + /* cmp->diff points to an array of vinfo_ts: make them run-time */ + int i; + for (i=cmp->diff->count; i--; ) + psyco_unfix(po, cmp->diff->items[i]); + psyco_stabilize(cmp); + /* start over (maybe we have already seen this new state) */ + return psyco_compile(po, mp, continue_compilation); + } + + if (continue_compilation) + return NULL; /* I won't actually compile myself, let the caller know */ + + /* call the entry point function which performs the actual compilation */ + return GLOBAL_ENTRY_POINT(po); + } +} + +DEFINEFN +void psyco_compile_cond(PsycoObject* po, mergepoint_t* mp, + condition_code_t condition) +{ + PsycoObject* po2 = PsycoObject_Duplicate(po); + vcompatible_t* cmp; + psyco_resolved_cc(po2, condition); + psyco_resolved_cc(po, INVERT_CC(condition)); + cmp = mp==NULL ? NULL : psyco_compatible(po2, &mp->entries); + + extra_assert((int)condition < CC_TOTAL); + + if (cmp != NULL && cmp->diff == NullArray) /* exact match */ + { + /* try to emit: + JNcond Label + + Label: + + if is only a JMP, recode the whole as a single + Jcond + */ + CodeBufferObject* oldcodebuf; + code_t* codeend; + void* extra = setup_conditional_code_bounds(po, po2, condition); + codeend = psyco_unify(po2, cmp, &oldcodebuf); + make_code_conditional(po, codeend, condition, extra); + /* XXX store reference to oldcodebuf somewhere */ + } + else + { + /* Use the conditional-compiling abilities of + coding_pause(); it will write a Jcond to a proxy + which will perform the actual compilation later. + */ + if (cmp != NULL) + psyco_stabilize(cmp); + psyco_coding_pause(po2, condition, &psyco_resume_compile, NULL, 0); + po->code = po2->code; + } +} + +/* Simplified interface to compile() without using a previously + existing code buffer. Return a new code buffer. */ +DEFINEFN +CodeBufferObject* psyco_compile_code(PsycoObject* po, mergepoint_t* mp) +{ + code_t* code1; + CodeBufferObject* codebuf; + bool compile_now; + vcompatible_t* cmp = mp==NULL ? NULL : psyco_compatible(po, &mp->entries); + + /*psyco_assert_cleared_tmp_marks(&po->vlocals); -- not needed -- */ + + if (cmp != NULL && cmp->diff == NullArray) /* exact match */ + return psyco_unify_code(po, cmp); + + /* We compile the new code right now if we have a full mismatch and if + there are not too many locked big buffers in codemanager.c */ + compile_now = cmp==NULL && psyco_locked_buffers() < WARN_TOO_MANY_BUFFERS-1; + if (cmp==NULL && !compile_now) + mp = NULL; /* we are about to write a coding pause, + don't register it in mp->entries */ + + /* Normal case. Start a new buffer */ + codebuf = psyco_new_code_buffer(po, mp==NULL ? NULL : &mp->entries, &po->codelimit); + po->code = insn_code_label(codebuf->codestart); + + if (compile_now) + { + /* call the entry point function which performs the actual compilation + (this is the usual case) */ + code1 = GLOBAL_ENTRY_POINT(po); + } + else if (cmp != NULL) /* partial match */ + { + int i; + for (i=cmp->diff->count; i--; ) + psyco_unfix(po, cmp->diff->items[i]); + psyco_stabilize(cmp); + /* start over (maybe we have already seen this new state) */ + code1 = psyco_compile(po, mp, false); + } + else + { + /* detected too many locked buffers. This occurs when compiling a + function that calls a function that needs compiling, recursively. + Delay compilation until run-time, when psyco_locked_buffers() will + be much smaller. */ + psyco_coding_pause(po, CC_ALWAYS_TRUE, &psyco_resume_compile, NULL, 0); + code1 = po->code; + } + + /* we have written some code into a new codebuf, now shrink it to + its actual size */ + psyco_shrink_code_buffer(codebuf, code1); + dump_code_buffers(); + return codebuf; +} + + +/*****************************************************************/ + +static bool computed_do_not_use(PsycoObject* po, vinfo_t* vi) +{ + fprintf(stderr, "psyco: internal error (computed_do_not_use)\n"); + extra_assert(0); /* stop if debugging */ + vi->source = SOURCE_DUMMY; + return true; +} + +static PyObject* direct_computed_do_not_use(vinfo_t* vi, char* data) +{ + PyErr_SetString(PyExc_PsycoError, + "internal error (direct_computed_do_not_use)"); + extra_assert(0); /* stop if debugging */ + return NULL; +} + +INITIALIZATIONFN +void psyco_compiler_init(void) +{ + INIT_SVIRTUAL(psyco_vsource_not_important, + computed_do_not_use, + direct_computed_do_not_use, + 0, 0, 0); +} + + +/*****************************************************************/ diff --git a/nodeboxgl/ext/psyco/src/c/vcompiler.h b/nodeboxgl/ext/psyco/src/c/vcompiler.h new file mode 100644 index 0000000..e40e1bb --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/vcompiler.h @@ -0,0 +1,760 @@ + /***************************************************************/ +/*** Structures used by the compiler part ***/ + /***************************************************************/ + +#ifndef _VCOMPILER_H +#define _VCOMPILER_H + +#include "psyco.h" +#include +#include "blockalloc.h" +#include "Python/pycheader.h" + + +/*****************************************************************/ + /*** Definition of the "sources" of vinfo_t structures ***/ + + +/* A "source" defines the stage of the variable (run-time, + compile-time or virtual-time), and gives information about + the value of the variable */ +typedef long Source; /* Implemented as a bitfield 32-bit integer. */ + +/* the next typedefs are for documentation purposes only, as the C compiler + will not make any difference between them all */ +typedef long RunTimeSource; +typedef long CompileTimeSource; +typedef long VirtualTimeSource; + +#define RunTime 0 +#define CompileTime 1 /* a.k.a. "Known value" */ +#define VirtualTime 2 +#define TimeMask (CompileTime | VirtualTime) + +PSY_INLINE bool is_runtime(Source s) { return (s & TimeMask) == RunTime; } +PSY_INLINE bool is_compiletime(Source s) { return (s & CompileTime) != 0; } +PSY_INLINE bool is_virtualtime(Source s) { return (s & VirtualTime) != 0; } +PSY_INLINE long gettime(Source s) { return s & TimeMask; } +#define CHKTIME(src, time) extra_assert(gettime(src) == (time)) + + +/************************ Run-time sources ******************************* + * + * If the last two bits of 'source' are 'RunTime', we have a run-time value. + * The rest of 'source' encodes both the position of the value in the stack + * (or StackNone) and the register holding this value (or REG_NONE). + * + **/ + +#if REG_TOTAL > 8 +# error "fix the masks below" +#endif + +/* flags */ +#define RunTime_StackMask 0x01FFFFFC +#define RunTime_StackMax RunTime_StackMask +#define RunTime_StackNone 0 +#define RunTime_RegMask 0xF0000000 +#define RunTime_NoRef 0x08000000 +#define RunTime_NonNeg 0x04000000 +#define RunTime_Megamorphic 0x02000000 +#define RunTime_FlagsMask RunTime_NoRef + +/* construction */ +PSY_INLINE RunTimeSource RunTime_New1(int stack_position, +#if REG_TOTAL > 0 + reg_t reg, +#endif + bool ref, bool nonneg) +{ + long result = RunTime + stack_position; +#if REG_TOTAL > 0 + result += (long) reg << 28; +#endif + if (!ref) + result += RunTime_NoRef; + if (nonneg) + result += RunTime_NonNeg; + return (RunTimeSource) result; +} +#if REG_TOTAL > 0 +# define RunTime_NewStack(stackpos, ref, nonneg) \ + RunTime_New1(stackpos, REG_NONE, ref, nonneg) +# define RunTime_New(reg, ref, nonneg) \ + RunTime_New1(RunTime_StackNone, reg, ref, nonneg) +#else +# define RunTime_NewStack RunTime_New1 +#endif + +/* field inspection */ +PSY_INLINE bool has_rtref(Source s) { + return (s & (TimeMask|RunTime_NoRef)) == RunTime; +} +#if REG_TOTAL > 0 +PSY_INLINE reg_t getreg(RunTimeSource s) { CHKTIME(s, RunTime); return (reg_t)(s >> 28); } +#endif +PSY_INLINE bool is_reg_none(RunTimeSource s) { CHKTIME(s, RunTime); return s < 0; } +PSY_INLINE int getstack(RunTimeSource s) { CHKTIME(s, RunTime); return s & RunTime_StackMask; } +PSY_INLINE bool is_runtime_with_reg(Source s) { + return (s & (TimeMask|(1<<31))) == 0; +} +PSY_INLINE bool is_rtnonneg(RunTimeSource s) { CHKTIME(s, RunTime); return s & RunTime_NonNeg; } + + +/* mutation */ +PSY_INLINE RunTimeSource remove_rtref(RunTimeSource s) { CHKTIME(s, RunTime); return s | RunTime_NoRef; } +PSY_INLINE RunTimeSource add_rtref(RunTimeSource s) { CHKTIME(s, RunTime); return s & ~RunTime_NoRef; } +#if REG_TOTAL > 0 +PSY_INLINE RunTimeSource set_rtreg_to(RunTimeSource s, reg_t newreg) { + CHKTIME(s, RunTime); + return (s & ~RunTime_RegMask) | ((long) newreg << 28); +} +PSY_INLINE RunTimeSource set_rtreg_to_none(RunTimeSource s) { + CHKTIME(s, RunTime); + return s | ((long) REG_NONE << 28); +} +#endif +PSY_INLINE RunTimeSource set_rtstack_to(RunTimeSource s, int stack) { + CHKTIME(s, RunTime); + extra_assert(getstack(s) == RunTime_StackNone); + return s | stack; +} +PSY_INLINE RunTimeSource set_rtstack_to_none(RunTimeSource s) { + CHKTIME(s, RunTime); + return s & ~RunTime_StackMask; +} +PSY_INLINE RunTimeSource set_rtnonneg(RunTimeSource s) { + CHKTIME(s, RunTime); + return s | RunTime_NonNeg; +} + + +/************************ Compile-time sources ******************************* + * + * if the last two bits of 'source' are 'CompileTime', + * the rest of 'source' points to a 'source_known_t' structure: + * + **/ +typedef struct { + long refcount1_flags; /* flags and reference counter */ + long value; /* compile-time known value */ +} source_known_t; + +/* flags for source_known_t::refcount1_flags: */ + +/* flag added when producing code that relies + essentially on this value to be constant */ +#define SkFlagFixed 0x01 + +/* value is a PyObject* and holds a reference */ +#define SkFlagPyObj 0x02 + +/* first unused flag */ +#define SkFlagEnd 0x04 +#define SkFlagMask (SkFlagEnd-1) + +/* refcounting */ +EXTERNFN void sk_release(source_known_t *sk); +PSY_INLINE void sk_incref(source_known_t *sk) { sk->refcount1_flags += SkFlagEnd; } +PSY_INLINE void sk_decref(source_known_t *sk) { + if ((sk->refcount1_flags -= SkFlagEnd)<0) sk_release(sk); +} + +/* construction */ +BLOCKALLOC_INTERFACE(sk, source_known_t) + +PSY_INLINE source_known_t* sk_new(long v, long flags) { + source_known_t* sk = psyco_llalloc_sk(); + sk->refcount1_flags = flags; + sk->value = v; + return sk; +} +PSY_INLINE void sk_delete(source_known_t* sk) { + psyco_llfree_sk(sk); +} + + +/* Compile-time sources */ +/* construction */ +PSY_INLINE CompileTimeSource CompileTime_NewSk(source_known_t* newsource) { + extra_assert((((long) newsource) & TimeMask) == 0); + return (CompileTimeSource) (((char*) newsource) + CompileTime); +} +PSY_INLINE CompileTimeSource CompileTime_New(long value) { + return CompileTime_NewSk(sk_new(value, 0)); +} + +/* inspection */ +PSY_INLINE source_known_t* CompileTime_Get(CompileTimeSource s) { + CHKTIME(s, CompileTime); + return (source_known_t*)(((char*) s) - CompileTime); +} +PSY_INLINE CompileTimeSource set_ct_value(CompileTimeSource s, long v) { + source_known_t* sk = CompileTime_Get(s); + extra_assert((sk->refcount1_flags & SkFlagPyObj) == 0); + if (sk->refcount1_flags < SkFlagEnd) { + sk->value = v; /* reuse object when only one reference */ + return s; + } + else { + sk_decref(sk); + return CompileTime_NewSk(sk_new(v, sk->refcount1_flags & + SkFlagMask)); + } +} + + +/************************ Virtual-time sources ******************************* + * + * if the last two bits of 'source' are VIRTUAL_TIME, + * the rest of 'source' points to a 'source_virtual_t' structure (in psyco.h). + * Description of the fields of source_virtual_t: + * + * compute_fn_t compute_fn; + * the function to be called to move the vinfo_t out of virtual-time. + * + * direct_compute_fn_t direct_compute_fn + * a non-meta function that computes the PyObject* out of raw data. + * 'compute_fn' is the meta version of 'direct_compute_fn'. + * + * long pyobject_mask + * a bitfield, one bit per item in the vinfo_t's array: the bit is set + * to 1 if the array item represents a PyObject (and hence needs to be + * forced to have a reference if the virtual object escapes the current + * scope, which so far is only possible through compactobject attrs). + * + * signed char nested_weight[2]; + * a value > 0 prevents infinite nesting of virtual 'vinfo_t's inside + * of other virtual 'vinfo_t's: the sum of all 'nested_weight' fields + * of a chain of nested 'vinfo_t's should always be less than + * NESTED_WEIGHT_END. There are two values because limiting some kind + * of virtual 'vinfo_t's is more important across function calls than + * inside the same function. + **/ +#define NESTED_WEIGHT_END 15 +#define NWI_NORMAL 0 /* use nested_weight[0] */ +#define NWI_FUNCALL 1 /* use nested_weight[1] */ +#define INIT_SVIRTUAL(sv, fn, directfn, objmask, w_normal, w_funcall) do { \ + (sv).compute_fn = fn; \ + (sv).direct_compute_fn = directfn; \ + (sv).pyobject_mask = objmask; \ + (sv).nested_weight[NWI_NORMAL] = w_normal; \ + (sv).nested_weight[NWI_FUNCALL] = w_funcall; \ +} while (0) +#define INIT_SVIRTUAL_NOCALL(sv, fn, w_normal) \ + INIT_SVIRTUAL(sv, fn, NULL, 0, w_normal, NW_FORCE) +#define SVIRTUAL_MUTABLE(sv) ((sv)->nested_weight[NWI_FUNCALL] == NW_FORCE) + +/* some weights for common virtual-time objects, grouped here to better + show their relative importance. A careful tuning is required to avoid + code size explosion. (The following figures are only a guess; some + real-code testing would be welcome.) */ +#define NW_VLISTS 5 +#define NW_TUPLES_NORMAL 4 +#define NW_TUPLES_FUNCALL 4 +#define NW_STRSLICES_NORMAL 5 +#define NW_STRSLICES_FUNCALL 9 +#define NW_CATSTRS_NORMAL 4 /* catstrs also have a vlist internally */ +#define NW_CATSTRS_FUNCALL 7 +#define NW_BUFSTRS_NORMAL 5 +#define NW_FORCE NESTED_WEIGHT_END /* always force */ + +/* construction */ +PSY_INLINE VirtualTimeSource VirtualTime_New(source_virtual_t* sv) { + extra_assert((((long) sv) & TimeMask) == 0); + return (VirtualTimeSource) (((char*) sv) + VirtualTime); +} + +/* inspection */ +PSY_INLINE source_virtual_t* VirtualTime_Get(VirtualTimeSource s) { + CHKTIME(s, VirtualTime); + return (source_virtual_t*)(((char*) s) - VirtualTime); +} + + +EXTERNVAR source_virtual_t psyco_vsource_not_important; + +#define SOURCE_NOT_IMPORTANT VirtualTime_New(&psyco_vsource_not_important) +#define SOURCE_DUMMY RunTime_NewStack(RunTime_StackNone, false, false) +#define SOURCE_DUMMY_WITH_REF RunTime_NewStack(RunTime_StackNone, true, false) +#define SOURCE_ERROR ((Source) -1) + + + + /***************************************************************/ +/*** Definition of the fundamental vinfo_t structure ***/ + /***************************************************************/ + + +/* 'array' fields are never NULL, but point to a fraction of vinfo_array_t + * in which 'count' is 0, like 'NullArray'. + * This allows 'array->count' to always return a sensible value. + * Invariant: the array is dynamically allocated if and only if 'array->count' + * is greater than 0. + */ +EXTERNVAR const long psyco_zero; +#define NullArrayAt(zero_variable) ((vinfo_array_t*)(&(zero_variable))) +#define NullArray NullArrayAt(psyco_zero) + + +struct vinfo_array_s { + int count; + vinfo_t* items[7]; /* always variable-sized */ +}; + +/* construction */ +EXTERNFN vinfo_array_t* array_grow1(vinfo_array_t* array, int ncount); +PSY_INLINE void array_release(vinfo_array_t* array) { + if (array->count > 0) PyMem_FREE(array); +} +PSY_INLINE vinfo_array_t* array_new(int ncount) { + if (ncount > 0) + return array_grow1(NullArray, ncount); + else + return NullArray; +} + + +/* 'vinfo_t' defines for the compiler the stage of a + variable and where it is found. It is a wrapper around a 'Source'. + For pointers to structures, 'array' is used to decompose the structure + fields into 'vinfo_t'-described variables which can in turn + be at various stages. */ +struct vinfo_s { + int refcount; /* reference counter */ + Source source; + vinfo_array_t* array; /* substructure variables or a NullArray */ + vinfo_t* tmp; /* internal use of the dispatcher */ +}; + +/* construction */ +BLOCKALLOC_INTERFACE(vinfo, vinfo_t) + +PSY_INLINE vinfo_t* vinfo_new(Source src) { + vinfo_t* vi = psyco_llalloc_vinfo(); + vi->refcount = 1; + vi->source = src; + vi->array = NullArray; + return vi; +} +PSY_INLINE vinfo_t* vinfo_new_skref(Source src) { + if (is_compiletime(src)) sk_incref(CompileTime_Get(src)); + return vinfo_new(src); +} + +/* copy constructor */ +EXTERNFN vinfo_t* vinfo_copy(vinfo_t* vi); + +/* refcounting */ +#define VINFO_CHECKREF \ + extra_assert(vi->refcount >= 1); \ + extra_assert(vi->refcount < 0x1000000 /* arbitrary */); +EXTERNFN void vinfo_release(vinfo_t* vi, PsycoObject* po); +PSY_INLINE void vinfo_incref(vinfo_t* vi) { VINFO_CHECKREF ++vi->refcount; } +PSY_INLINE void vinfo_decref(vinfo_t* vi, PsycoObject* po) { + VINFO_CHECKREF + if (!--vi->refcount) vinfo_release(vi, po); +} +PSY_INLINE void vinfo_xdecref(vinfo_t* vi, PsycoObject* po) { + if (vi != NULL) vinfo_decref(vi, po); +} + +/* promoting out of virtual-time */ +PSY_INLINE bool compute_vinfo(vinfo_t* vi, PsycoObject* po) { + if (is_virtualtime(vi->source)) { + if (!VirtualTime_Get(vi->source)->compute_fn(po, vi)) + return false; + extra_assert(!is_virtualtime(vi->source)); + } + return true; +} +EXTERNFN bool psyco_limit_nested_weight(PsycoObject* po, vinfo_array_t* array, + int nw_index, signed char nw_end); +EXTERNFN long direct_read_vinfo(vinfo_t* vi, char* data); +EXTERNFN PyObject* direct_xobj_vinfo(vinfo_t* vi, char* data); + +PSY_INLINE bool vinfo_known_equal(vinfo_t* v, vinfo_t* w) { + return (v->source == w->source && + (v == w || !is_virtualtime(v->source))); +} + +/* misc */ +PSY_INLINE bool is_nonneg(Source s) { + switch (gettime(s)) { + case RunTime: return is_rtnonneg(s); + case CompileTime: return CompileTime_Get(s)->value >= 0; + default: return false; + } +} +PSY_INLINE void assert_nonneg(vinfo_t* v) { + if (is_runtime(v->source)) + v->source = set_rtnonneg(v->source); + else + extra_assert(is_virtualtime(v->source) || is_nonneg(v->source)); +} + +/* sub-array (see also psyco_get_field()&co.) */ +PSY_INLINE void vinfo_array_grow(vinfo_t* vi, int ncount) { + if (ncount > vi->array->count) + vi->array = array_grow1(vi->array, ncount); +} +EXTERNFN void vinfo_array_shrink(PsycoObject* po, vinfo_t* vi, int ncount); +PSY_INLINE vinfo_t* vinfo_getitem(vinfo_t* vi, int index) { + if (((unsigned int) index) < ((unsigned int) vi->array->count)) + return vi->array->items[index]; + else + return NULL; +} +PSY_INLINE vinfo_t* vinfo_needitem(vinfo_t* vi, int index) { + vinfo_array_grow(vi, index+1); + return vi->array->items[index]; +} +PSY_INLINE void vinfo_setitem(PsycoObject* po, vinfo_t* vi, int index, + vinfo_t* newitem) { + /* consumes a reference to 'newitem' */ + if (newitem != NULL) { + extra_assert(!(is_compiletime(vi->source) && + !is_compiletime(newitem->source))); + } + vinfo_array_grow(vi, index+1); + vinfo_xdecref(vi->array->items[index], po); + vi->array->items[index] = newitem; +} + + +/* array management */ +EXTERNFN void clear_tmp_marks(vinfo_array_t* array); +#if ALL_CHECKS +EXTERNFN void assert_cleared_tmp_marks(vinfo_array_t* array); +EXTERNFN void assert_array_contains_nonct(vinfo_array_t* array, vinfo_t* vi); +#else +PSY_INLINE void assert_cleared_tmp_marks(vinfo_array_t* array) { } /* nothing */ +PSY_INLINE void assert_array_contains_nonct(vinfo_array_t* a, vinfo_t* v) { } +#endif +EXTERNFN void duplicate_array(vinfo_array_t* target, vinfo_array_t* source); +PSY_INLINE void deallocate_array(vinfo_array_t* array, PsycoObject* po) { + int i = array->count; + while (i--) vinfo_xdecref(array->items[i], po); +} +PSY_INLINE void array_delete(vinfo_array_t* array, PsycoObject* po) { + deallocate_array(array, po); + array_release(array); +} + + +/*****************************************************************/ + /*** read and write fields of structures in memory ***/ + +/* Implementation of defield_t as a single packed bitfield, + stored as a pointer to enable type checks in the C compiler */ +/* [This is internal stuff: see comments below for an introduction.] */ +/* type is defined by its size (given as the nth power of two) + and a handful of flags */ +typedef struct undefined_fld_s* defield_t; +EXTERNFN vinfo_t* psyco_internal_getfld(PsycoObject* po, int findex, + defield_t df, vinfo_t* vi, long offset); +EXTERNFN bool psyco_internal_putfld(PsycoObject* po, int findex, defield_t df, + vinfo_t* vi, long offset, vinfo_t* value); +#define FIELD_INDEX_MASK 0x00FF +#define FIELD_MUTABLE 0x0100 +#define FIELD_ARRAY 0x0200 +#define FIELD_UNSIGNED 0x0400 +#define FIELD_NONNEG 0x0800 +#define FIELD_PYOBJ_REF 0x1000 +#define FIELD_SIZE2_SHIFT 13 +#define FIELD_INTL_NOREF 0x8000 +#define FIELD_OFS_SHIFT 16 +#define NO_PREV_FIELD ((defield_t) -1) +#define FIELD_RESERVED_INDEX 0xCC +#define SIZE2_FROM_CTYPE(ctype) \ + (sizeof(ctype)==1 ? 0 : \ + sizeof(ctype)==2 ? 1 : \ + sizeof(ctype)==4 ? 2 : \ + sizeof(ctype)==8 ? 3 : \ + (extra_assert(!"field size is not a small power of two"), 0)) +/*#define FIELD_NTH(df, n) + (extra_assert(FIELD_INDEX(df)+(n) == FIELD_INDEX((df)+(n))), + ((df) + (n) + (((n) << FIELD_SIZE2(df)) << FIELD_OFS_SHIFT))*/ +#define STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, flags) \ + ((defield_t) ((offsetof(cstruct, cfield) << FIELD_OFS_SHIFT) | \ + (SIZE2_FROM_CTYPE(ctype) << FIELD_SIZE2_SHIFT) | \ + field_next_index(prevf, true) | \ + flags)) +#define ARRAY_FIELD_BUILD(ctype, baseofs, flags) \ + ((defield_t) (((baseofs) << FIELD_OFS_SHIFT) | \ + (SIZE2_FROM_CTYPE(ctype) << FIELD_SIZE2_SHIFT) | \ + FIELD_RESERVED_INDEX | FIELD_ARRAY | \ + flags)) + + +/***************************************************************** + * You must describe the fields of each C structure of the interpreter + * that you want Psyco to work with. Use the following macros field + * by field. Each macro returns a defield_t which contains the + * definition of the field. */ + +/* build the field definition corresponding to: + - the C structure whose name is in 'cstruct'; + - the C type given by 'ctype'; + - the field name given by 'cfield'. + For the field order you must give in 'prevf' the defield_t + corresponding to the previous field of the C structure, + or NO_PREV_FIELD if you are defining the first field. */ +#define DEF_FIELD(cstruct, ctype, cfield, prevf) \ + STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, 0) + +/* special case: use the following macro instead of DEF_FIELD + if 'ctype' is an unsigned numeric type. */ +#define UNSIGNED_FIELD(cstruct, ctype, cfield, prevf) \ + STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, FIELD_UNSIGNED) + +/* signed fields that are known to be non-negative */ +#define NONNEG_FIELD(cstruct, ctype, cfield, prevf) \ + STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, FIELD_NONNEG) + +/* the same, for pure arrays instead of structures */ +#define DEF_ARRAY(ctype, baseofs) \ + ARRAY_FIELD_BUILD(ctype, baseofs, 0) +#define UNSIGNED_ARRAY(ctype, baseofs) \ + ARRAY_FIELD_BUILD(ctype, baseofs, FIELD_UNSIGNED) + +/* you can surround DEF_FIELD() by FARRAY(), FMUT(), FPYREF(): + - FARRAY() means that the field is actually an array in the + structure, as for example 'ob_items' in PyTupleObject; + - FMUT() means that the field is mutable; + - FPYREF() means that we want to read or store a PyObject* reference */ +#define FARRAY(df) ((defield_t) ((long)(df) | FIELD_ARRAY)) +#define FMUT(df) ((defield_t) ((long)(df) | FIELD_MUTABLE)) +#define FPYREF(df) (extra_assert(1<array; + - 1<> FIELD_SIZE2_SHIFT) & 3) +#define FIELD_C_OFFSET(df) ((long)(df) >> FIELD_OFS_SHIFT) +#define FIELD_HAS_REF(df) ((long)(df) & FIELD_PYOBJ_REF) +#define CHECK_FIELD_INDEX(n) extra_assert((unsigned)FIELD_INDEX(n) < \ + FIELD_RESERVED_INDEX) + +/* functions to read or write a field from or to the structure + pointed to by 'vi': */ +PSY_INLINE vinfo_t* psyco_get_field(PsycoObject* po, vinfo_t* vi, defield_t df) { + return psyco_internal_getfld(po, FIELD_INDEX(df), df, + vi, FIELD_C_OFFSET(df)); +} +PSY_INLINE vinfo_t* psyco_get_nth_field(PsycoObject* po, vinfo_t* vi, defield_t df, + int index) { + long ofs = index << FIELD_SIZE2(df); + return psyco_internal_getfld(po, FIELD_INDEX(df) + index, df, + vi, FIELD_C_OFFSET(df) + ofs); +} +PSY_INLINE vinfo_t* psyco_get_field_offset(PsycoObject* po, vinfo_t* vi, + defield_t df, long offset) { + extra_assert((long)df & FIELD_MUTABLE); + return psyco_internal_getfld(po, FIELD_RESERVED_INDEX, df, + vi, FIELD_C_OFFSET(df) + offset); +} +EXTERNFN vinfo_t* psyco_get_field_array(PsycoObject* po, vinfo_t* vi, + defield_t df, vinfo_t* vindex); +PSY_INLINE bool psyco_put_field(PsycoObject* po, vinfo_t* vi, defield_t df, + vinfo_t* value) { + return psyco_internal_putfld(po, FIELD_INDEX(df), df, + vi, FIELD_C_OFFSET(df), value); +} +PSY_INLINE bool psyco_put_nth_field(PsycoObject* po, vinfo_t* vi, defield_t df, + int index, vinfo_t* value) { + long ofs = index << FIELD_SIZE2(df); + return psyco_internal_putfld(po, FIELD_INDEX(df) + index, df, + vi, FIELD_C_OFFSET(df) + ofs, value); +} +EXTERNFN bool psyco_put_field_array(PsycoObject* po, vinfo_t* vi, defield_t df, + vinfo_t* vindex, vinfo_t* value); + +/* fields of size 8 (like those of type 'double') are accessed as two + vinfo_t's, for the second of which we use the following macro */ +#define FIELD_PART2(df) ((defield_t) ((long)(df) + 1 + /* next index */ \ + (sizeof(long)<source' into 'vtarget->source'. Must be the last reference + to 'vsource', which is freed. 'vsource' must have no array, and + 'vtarget->source' must hold no reference to anything. In short, this + function must not be used except by virtual-time computers. */ +EXTERNFN void vinfo_move(PsycoObject* po, vinfo_t* vtarget, vinfo_t* vsource); + + +/*****************************************************************/ + /*** Compiler language-independent functions ***/ + +/* compilation */ + +/* Main compiling function. Emit machine code corresponding to the state + 'po'. The compiler produces its code into 'code' and the return value is + the end of the written code. 'po' is freed. 'mp' is the current mergepoint + position or NULL if there is no mergepoint here. + + Be sure to call clear_tmp_marks(&po->vlocals) before this function. + + 'continue_compilation' is normally false. When compile() is called + during the compilation of 'po', 'continue_compilation' is true and + psyco_compile() may return NULL to tell the caller to continue the + compilation of 'po' itself. The sole purpose of this is to reduce the + depth of recursion of the C stack. +*/ +EXTERNFN code_t* psyco_compile(PsycoObject* po, mergepoint_t* mp, + bool continue_compilation); + +/* Conditional compilation: the state 'po' is compiled to be executed only if + 'condition' holds. In general this creates a coding pause for it to be + compiled later. It always makes a copy of 'po' so that the original can be + used to compile the other case ('not condition'). 'condition' must not be + CC_ALWAYS_xxx here. 'mp' is the current mergepoint position or NULL if there + is no mergepoint here. +*/ +EXTERNFN void psyco_compile_cond(PsycoObject* po, mergepoint_t* mp, + condition_code_t condition); + +/* Simplified interface to compile() without using a previously + existing code buffer. Return a new code buffer. */ +EXTERNFN CodeBufferObject* psyco_compile_code(PsycoObject* po, mergepoint_t* mp); + +/* Prepare a 'coding pause', i.e. a short amount of code (proxy) that will be + called only if the execution actually reaches it to go on with compilation. + 'po' is the PsycoObject corresponding to the proxy. + 'condition' may not be CC_ALWAYS_FALSE. + The (possibly conditional) jump to the proxy is encoded in 'calling_code'. + When the execution reaches the proxy, 'resume_fn' is called and the proxy + destroys itself and replaces the original jump to it by a jump to the newly + compiled code. */ +typedef code_t* (*resume_fn_t)(PsycoObject* po, void* extra); +EXTERNFN void psyco_coding_pause(PsycoObject* po, condition_code_t jmpcondition, + resume_fn_t resume_fn, + void* extra, int extrasize); + +/* management functions; see comments in compiler.c */ +#if ALL_CHECKS +EXTERNFN void psyco_assert_coherent1(PsycoObject* po, bool full); +#else +# define psyco_assert_coherent1(po, full) do { } while (0) /* nothing */ +#endif +#define psyco_assert_coherent(po) psyco_assert_coherent1(po, true) + +/* construction */ +PSY_INLINE PsycoObject* PsycoObject_New(int vlocalscnt) { + int psize = PSYCOOBJECT_SIZE(vlocalscnt); + PsycoObject* po = (PsycoObject*) PyMem_MALLOC(psize); + if (po == NULL) + OUT_OF_MEMORY(); + memset(po, 0, psize); + return po; +} +EXTERNFN PsycoObject* psyco_duplicate(PsycoObject* po); /* internal */ +PSY_INLINE PsycoObject* PsycoObject_Duplicate(PsycoObject* po) { + clear_tmp_marks(&po->vlocals); + return psyco_duplicate(po); +} +EXTERNFN void PsycoObject_Delete(PsycoObject* po); +PSY_INLINE PsycoObject* PsycoObject_Resize(PsycoObject* po, int nvlocalscnt) { + int psize = PSYCOOBJECT_SIZE(nvlocalscnt); + return (PsycoObject*) PyMem_REALLOC(po, psize); +} + + +#endif /* _VCOMPILER_H */ diff --git a/nodeboxgl/ext/psyco/src/c/versionchecker.py b/nodeboxgl/ext/psyco/src/c/versionchecker.py new file mode 100644 index 0000000..faed865 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/versionchecker.py @@ -0,0 +1,46 @@ +import re + + +explicitnumber = { + '0x010100f0': '1.1.1', # bugfix release, no change in hex version + '0x010200f0': '1.2', + '0x010300f0': '1.3', + '0x010400f0': '1.4', + '0x010500f0': '1.5', + '0x010501f0': '1.5.1', + '0x010502f0': '1.5.2', + } + +FILES = { + 'Python/pyver.h': re.compile(r'PSYCO_VERSION_HEX\s+(0x[0-9a-fA-F]+)'), + '../py-support/support.py': re.compile(r'__version__\s*=\s*(0x[0-9a-fA-F]+)'), + '../doc/psycoguide.tex': re.compile(r'\\release\{([0-9.]+)\}'), + '../setup.py': re.compile(r'version\s*=\s*\"([0-9.]+)\"'), + '../../www/dist/Makefile': re.compile(r'version\s*=\s*([0-9.]+)'), + '../../www/content/index.rst': re.compile(r'`Psyco ([0-9.]+)@'), + '../../www/content/download.rst': re.compile(r'Current version is ([0-9.]+)'), + '../../www/content/./download.rst': re.compile(r'[dD]ownload Release ([0-9.]+)'), + '../../www/content/doc.rst': re.compile(r'Psyco release ([0-9.]+)'), + '../README.txt': re.compile(r'VERSION ([0-9.]+)'), + } + +versions = {} +for filename, regexp in FILES.items(): + for line in open(filename, 'r'): + match = regexp.search(line) + if match: + break + else: + raise Exception, "No version number found in " + filename + ver = match.group(1) + print '%20s %s' % (ver, filename) + if ver.startswith('0x'): + ver = explicitnumber[ver] + versions[ver] = filename + +if len(versions) != 1: + raise Exception, versions +else: + print "versionchecker: ok" + +import files; files.main() diff --git a/nodeboxgl/ext/psyco/src/c/win32/psyco.vcproj b/nodeboxgl/ext/psyco/src/c/win32/psyco.vcproj new file mode 100644 index 0000000..370fa73 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/c/win32/psyco.vcproj @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nodeboxgl/ext/psyco/src/doc/Makefile b/nodeboxgl/ext/psyco/src/doc/Makefile new file mode 100644 index 0000000..e76afc9 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/doc/Makefile @@ -0,0 +1,43 @@ + +# Makefile.local should define MKHOWTO to point to the Python +# distribution's Doc/tools/mkhowto, e.g. +# MKHOWTO = ${HOME}/cvs/python/dist/src/Doc/tools/mkhowto +include Makefile.local + +PAPER=a4 +DVIPS=dvips -N0 -t $(PAPER) + +html = psycoguide +dvi = psycoguide.dvi +ps = psycoguide.ps +ps-gz= psycoguide.ps.gz +all = $(html) $(dvi) $(ps) $(ps-gz) + +html : $(html) +dvi : $(dvi) +ps : $(ps) +ps-gz: $(ps-gz) +all : $(all) + +%: %.tex + -rm -fr $@ + ${MKHOWTO} $< + +%.dvi: %.tex + ${MKHOWTO} --paper=$(PAPER) --dvi $< + +%.ps.gz: %.ps + gzip -c < $< > $@ + +%.ps: %.dvi + $(DVIPS) -o $@ $< + +%.pdf: %.tex + rm -f $*.log $*.out $*.aux + pdflatex $< + pdflatex $< + rm -f $*.log $*.out $*.aux + +clean: + rm -fr $(all) + rm -f *.log *.aux *.ind *.idx *.l2h *.toc *.syn diff --git a/nodeboxgl/ext/psyco/src/doc/README.txt b/nodeboxgl/ext/psyco/src/doc/README.txt new file mode 100644 index 0000000..aa0fde3 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/doc/README.txt @@ -0,0 +1,21 @@ +To compile psycoguide.tex, see instructions at the top of the Makefile. + +See also: + +- Psyco presentations: + + http://codespeak.net/svn/user/arigo/talks/accu2004-psyco + http://codespeak.net/svn/user/arigo/talks/pepm04-psyco + + The two presentations are very similar, but introduce concepts in a + different order. The second one is best suited for people with an + academic background. + +- Papers about Psyco: + + Representation-Based Just-In-Time Specialization + and the Psyco Prototype for Python + PEPM'04 + http://codespeak.net/svn/user/arigo/papers/psyco/compiled/theory_psyco.ps.gz + http://codespeak.net/svn/user/arigo/papers/psyco/compiled/theory_psyco.pdf + diff --git a/nodeboxgl/ext/psyco/src/doc/psycoguide.tex b/nodeboxgl/ext/psyco/src/doc/psycoguide.tex new file mode 100644 index 0000000..b61abdd --- /dev/null +++ b/nodeboxgl/ext/psyco/src/doc/psycoguide.tex @@ -0,0 +1,1131 @@ +\documentclass{manual} + +\title{The Ultimate Psyco Guide} + +\author{Armin Rigo} + +\authoraddress{ + Email: \email{arigo@tunes.org} \\ + Psyco Home page: \url{http://psyco.sourceforge.net/} +} + +\date{updated June 10th, 2007} + +\release{1.5.2+SVN} % release version + +\makeindex + + + +\begin{document} +\catcode`\@=11 +\renewcommand{\py@reset}{} +\catcode`\@=13 + +\maketitle + + +\begin{abstract} + +\noindent +Psyco is a Python extension module which can massively speed up the execution of any Python code. + +%\strong{This document is an evolving Draft.} + +\end{abstract} + +\tableofcontents + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% INSTALLATION %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{Installation} + +\section{Requirements}\label{req} + +Psyco currently requires: + +\begin{itemize} + +\item \strong{A 32-bit Pentium or any other Intel 386 compatible processor.} Sorry, no other processor is supported. Psyco does not support the 64-bit x86 architecture, unless you have a Python compiled in 32-bit compatibility mode. + +\item \strong{Linux, Windows, BSD} are known to work. Mac OS/X support should be easy but no one bothered so far (see below). + +\item \strong{A regular Python installation, version 2.2.2 or up.} Psyco is not a replacement for the Python interpreter and libraries, it works on top of them. + +\end{itemize} + +Psyco is not strongly dependent on a particular OS. Precompiled binaries are provided for Windows. Compiling on Linux (or other Unixes) should be easy. + +Mac OS/X is not supported because of a difference in the calling convention. If you want to help, see \url{http://mail.python.org/pipermail/pythonmac-sig/2006-June/017533.html} for instructions about how to fix it. + + +\section{Installing}\label{binaries} + +Binaries are now only available for Windows as installers for recent Python versions. You need to compile from the source (see \ref{sources}) in all other cases (it is trivial on non-Windows platforms, though). + +Be sure to download the version of Psyco that corresponds to your Python version. Binary releases are at \url{http://sourceforge.net/project/showfiles.php?group_id=41036}. Only some pre-compiled versions are available (contributions for missing ones are welcome). + +\begin{tableiii}{l|l|l}{filenq}{File name}{Python versions}{Well-tested with} + \lineiii{ psyco-x.y-win32-py2.2.2.exe }{2.2.2 and up} {2.2.2 and 2.2.3} + \lineiii{ psyco-x.y-win32-py2.3.exe }{2.3 and up} {2.3 and 2.3.3} + \lineiii{ psyco-x.y-win32-py2.4.exe }{2.4 and up} {2.4.*} + \lineiii{ psyco-x.y-win32-py2.5.exe }{2.5 and up} {2.4} +\end{tableiii} + +Note that the 2.2.2 version will **not** work on the 2.2 or 2.2.1 Pythons! + + +\section{Installing from the sources}\label{sources} + +You should get the source code from its most current Subversion version at \url{http://codespeak.net/svn/psyco/dist/}. The command is: + +\begin{verbatim} + svn co http://codespeak.net/svn/psyco/dist/ psyco-dist +\end{verbatim} + +People unfamiliar with Subversion or whose Subversion access is firewalled can use a web grabber (e.g.\ ``wget -r http://codespeak.net/svn/psyco/dist/ -I /svn/psyco/dist``), or download a snapshop at \url{http://wyvern.cs.uni-duesseldorf.de/psyco/psyco-snapshot.tar.gz}. + +Note that the Subversion tree is considered the latest official release. It evolves slowly and it is more stable than the packaged version. But if you really really prefer official releases (though there is not much point, Psyco being stable and slow-changing nowadays), have a look at \url{http://sourceforge.net/project/showfiles.php?group_id=41036}. + +To install from the source, run the top-level installation script \file{setup.py}: + +\begin{verbatim} + python setup.py install +\end{verbatim} + +Warning, many Linux distributions (e.g.\ Debian) ship with an incomplete Python. You need to install the ``python-dev'' package for this to work. + +As usual, other commands are available, e.g.\ + +\begin{verbatim} + python setup.py build_ext -i +\end{verbatim} + +will compile the C source and put the result directly into the \file{py-support/} subdirectory (no administrator priviledge is required). After this step, the \file{py-support/} directory is a complete package (exactly as found in the binary distributions) that you can rename to \file{psyco} and copy around. + + +\section{Compiling Psyco in Debug mode}\label{debugpsyco} + +In case of trouble that you suspect to be a bug in Psyco, you can recompile it with additional coherency checks that will be done during the compilation of your Python functions (they should not slow down the execution of the compiled code). + +Additionally, Psyco will dump debugging information to the standard error. The debugging version of Psyco can also dump the whole compiled code buffers and associated data structures, using \function{psyco.dumpcodebuf}. + +Follow the instructions in \file{setup.py} to enable debugging. For fine-grained control under Unix, I use a custom \file{Makefile} instead of \file{setup.py}; this \file{Makefile} is present in the CVS tree too. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TUTORIAL %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{Tutorial} + +The goal of Psyco is to be extremely easy to use, and ideally it should be completely transparent. If this were the case, this user guide would be empty. This is not the case because it is still experimental, and because you will probably like to keep control over what you trust Psyco to accelerate and how much resources (mainly memory) you are ready to let it spend. + + +\section{Quick examples} + +Psyco comes as a package module that you can use in your applications, althought you will seldom need to use functions that are not exported via the top-level \module{psyco} module. Try adding the following two lines at the beginning of your main \file{.py} source file: + +\begin{verbatim} +import psyco +psyco.full() +\end{verbatim} + +This instructs Psyco to compile and run as much of your application code as possible. This is the simplest interface to Psyco. In good cases you can just add these two lines and enjoy the speed-up. If your application does a lot of initialization stuff before the real work begins, you can put the above two lines after this initialization -- e.g. after importing modules, creating constant global objects, etc. Psyco usually doesn't speed up the initialization of a program; it rather tends to make start-up slower. A good place to put these lines is at the beginning of the \code{__main__} part of the script: + +\begin{verbatim} +if __name__ == '__main__': + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + # ...your code here... +\end{verbatim} + +For larger applications, try: + +\begin{verbatim} +import psyco +psyco.profile() +\end{verbatim} + +Psyco will do some profiling behind the scene to discover which functions are worth being compiled. + +\begin{verbatim} +import psyco +psyco.log() +psyco.profile() +\end{verbatim} + +Enable logging to a file named \file{xxx.log-psyco} by default, where \file{xxx} is the name of the script you ran. + +\begin{verbatim} +import psyco +psyco.log() +psyco.profile(0.2) +\end{verbatim} + +The extra argument \code{0.2} to \function{profile} is called the watermark; it means that Psyco will compile all functions that take at least 20\% of the time. The exact meaning of the watermark will be given in the reference manual; simply keep in mind that smaller numbers (towards \code{0.0}) mean more functions compiled, and larger numbers (towards \code{1.0}) mean less functions compiled. The default watermark is \code{0.09}. + +\begin{verbatim} +import psyco +psyco.log() +psyco.full(memory=100) +psyco.profile(0.05, memory=100) +psyco.profile(0.2) +\end{verbatim} + +This example combines the previous ones. All functions are compiled until it takes 100 kilobytes of memory. Aggressive profiling (watermark \code{0.05}) is then used to select further functions until it takes an extra 100 kilobytes of memory. Then less aggressive profiling (watermark \code{0.2}) is used for the rest of the execution. \note{The limit of 100 kilobytes is largely underestimated by Psyco: your process' size will grow by much more than that before Psyco switches to the next profiler.} + +If you want to keep control over what gets compiled, you can select individual functions: + +\begin{verbatim} +import psyco +psyco.bind(myfunction1) +psyco.bind(myfunction2) +\end{verbatim} + +This only selects the two given functions for compilation. Typically, you would select functions that do CPU-intensive computations, like walking lists or working on strings or numbers. Note that the functions called by the functions you select will also be compiled. + +\begin{verbatim} +import psyco +g = psyco.proxy(f) +g(args) # Psyco-accelerated call +f(args) # regular slow call +\end{verbatim} + +Unlike \function{psyco.bind}, \function{psyco.proxy} does not affect your original function at all, but only creates a Psyco-accelerated copy of it (a ``proxy''). Useful if you only want to use Psyco at a very specific moment. One can also argue that \code{f=psyco.proxy(f)} looks more Pythonic than \code{psyco.bind(f)}. + + +\section{Zope's TAL: a real example with benchmarks} + +As an example of a good real-life candidate for Psyco acceleration, I chose \strong{TAL}, the simpler of the two templating languages of Zope (\url{http://www.zope.org}). TAL is an extension of HTML in which you can write templates which are used to generate real HTML pages dynamically. The translation from templates to real pages is a typical data-manipulation algorithm that is much faster in C than in Python, but much more obfuscated too. TAL is currently implemented in Python only. + +For these tests, we will use the file \file{TAL.markbench.py} of a Zope 2 installation (if you did not install Zope, the file is in the \file{lib/python} subdirectory of the source archive). You may have to create a file named \file{.path} to be able to run \file{markbench.py}, as explained when you first try to run it. + +On a Dual Pentium Linux running Python 2.2.2, using the Zope 2.6.1 distribution, I get the following times (lower numbers mean faster runs; I have added the horizontal line at test 9 for emphasis): + +\begin{verbatim} +##: ZPT TAL DTML +01: 0 0 0 +02: 0 0 0 +03: 2 1 0 +04: 9 6 3 +05: 16 12 4 +06: 19 13 10 +07: 15 10 1 +08: 10 7 1 +09: ------ 123 ------- 90 ------- 32 +10: 14 6 3 +11: 28 18 10 +12: 20 15 6 +\end{verbatim} + +If I add the following line at the top of \file{markbench.py} the times drop massively --- the longest-running tests run two to three times faster! + +\begin{verbatim} +import psyco; psyco.log(); psyco.full() +\end{verbatim} + +Results: + +\begin{verbatim} +##: ZPT TAL DTML +01: 0 0 0 +02: 0 0 0 +03: 1 0 0 +04: 5 2 2 +05: 8 4 4 +06: 11 5 10 +07: 7 4 1 +08: 6 2 1 +09: ------- 61 ------- 34 ------- 32 +10: 10 3 2 +11: 17 7 10 +12: 11 6 6 +\end{verbatim} + +Here you see in the DTML test the first rule about Psyco: some code is obviously not seen by Psyco at all. In other words for some reason this code runs in the normal interpreter only. There are a lot of potential reasons for this, which range from Psyco failing to ``steal'' the code from the Python interpreter before it executes it to code using unsupported constructs (see appendix \ref{unsupported}). + +\begin{verbatim} +import psyco; psyco.log(); psyco.profile() +\end{verbatim} + +Results: + +\begin{verbatim} +##: ZPT TAL DTML +01: 0 0 0 +02: 0 0 0 +03: 4 3 0 +04: 15 11 3 +05: 20 13 5 +06: 16 5 12 +07: 7 5 1 +08: 5 2 1 +09: ------- 65 ------- 35 ------- 40 +10: 11 3 2 +11: 18 8 10 +12: 12 6 6 +\end{verbatim} + +If you use the profiler instead of compiling everything, the small tests won't run much faster, but the long-running ones will be about as fast as above. It means that the profiler is a powerful tool that can be useful on arbitrarily large programs. However, in the case of a large program in which you know where most of the processor time is spent, you can choose to selectively compile this part: + +\begin{verbatim} +from TALInterpreter import TALInterpreter +import psyco; psyco.bind(TALInterpreter) +\end{verbatim} + +Results: + +\begin{verbatim} +##: ZPT TAL DTML +01: 0 0 0 +02: 0 0 0 +03: 2 0 0 +04: 9 2 2 +05: 16 4 4 +06: 19 5 10 +07: 14 4 1 +08: 10 3 1 +09: ------ 122 ------- 33 ------- 32 +10: 13 3 3 +11: 28 8 10 +12: 20 6 6 +\end{verbatim} + +Here you can see that only the TAL test is accelerated. If you have a Zope server using TAL, you could try to add the above two lines to it. You may get very interesting speed-ups for a very reasonable memory overweight! (untested: please tell me about it --- there is no real Zope server I can play with myself.) + +Another ceveat of Psyco is that it is not always easy to know which module or class Psyco has just acclerated in \code{psyco.full()} mode. It took me some time to discover what I should bind to accelerate specifically the ZPT test. Here is how: I ran Psyco in \code{psyco.log();psyco.profile()} mode, running only the ZPT test, and inspected the log file. Indeed, when a function is about to be accelerated, Psyco writes a line \samp{tag function: xxx}. In this case I figured out from the \file{markbench.log-psyco} file that I had to write this: + +\begin{verbatim} +import TAL.TALInterpreter +import psyco; psyco.bind(TAL.TALInterpreter.TALInterpreter.interpret) +\end{verbatim} + +Results: + +\begin{verbatim} +##: ZPT TAL DTML +01: 0 0 0 +02: 0 0 0 +03: 1 2 0 +04: 5 6 2 +05: 9 11 4 +06: 11 13 10 +07: 8 10 1 +08: 6 7 1 +09: ------- 66 ------- 90 ------- 32 +10: 10 6 4 +11: 18 18 10 +12: 12 15 6 +\end{verbatim} + + +\section{Old-style classes vs. Built-in types}\label{metaclass} + +Althought Psyco can plug itself over various versions of the interpreter, there are some features that depend on specific extensions. + +A major introduction of Python 2.2 are the so-called new-style classes, which have a (positive) performance impact on Psyco. So you should, as much as possible, let your classes be built-in types and not old-style classes (which is done by inheriting from another new-style class, or from \class{object} for root classes). + +In addition, Psyco 1.4 provides a compact alternative to Python's new-style instances: the \class{psyco.compact} root class. Currently, you have to use or inherit from \class{psyco.compact} explicitely. This lets Psyco produce faster code and reduces the memory used by your instances. Even better, if you add the line + +\begin{verbatim} +from psyco.classes import * +\end{verbatim} + +at the top of the module(s) that define the classes, then not only will all your classes automatically inherit from \class{psyco.compact}, but all the methods defined in your classes will automatically be compiled as if you had called \function{psyco.bind()} on them. + +\warning{In Python, instances of classes that inherit from a built-in type are subject to some semantic differences that you should know about. These are described in \url{http://www.python.org/2.2.2/descrintro.html}. An immediate difference is that if \var{x} contains an instance of such a new-style class, then \code{type(x)} will be \code{x.__class__} instead of \constant{types.InstanceType}.} + +For more information see sections \ref{psycodotclasses} and \ref{psycocompact}. + + +\section{Known bugs}\label{tutknownbugs} + +Almost any Python code should execute correctly when run under Psyco, including code that uses arbitrary C extension modules. Some features of Python which are marked as ``not supported'' by Psyco will not cause Psyco to fail to produce the correct result; instead, it will revert to the regular Python interpreter and the code will run non-accelerated. + +All exceptions to this rule are bugs, but there are a couple of them because they would be either very hard to fix or fixing them would severely hurt performance. They correspond to uncommon situations. The current list is in appendix \ref{bugs}. + +There are also performance bugs: situations in which Psyco slows down the code instead of accelerating it. It is difficult to make a complete list of the possible reasons, but here are a few common ones: + +\begin{itemize} +\item The built-in \function{map} and \function{filter} functions must be avoided and replaced by list comprehension. For example, \code{map(lambda x: x*x, lst)} should be replaced by the more readable but more recent syntax \code{[x*x for x in lst]}. +\item The compilation of regular expressions doesn't seem to benefit from Psyco. (The execution of regular expressions is unaffected, since it is C code.) Don't enable Psyco on this module; if necessary, disable it explicitely, e.g.\ by calling \code{psyco.cannotcompile(re.compile)}. +\end{itemize} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% USER REFERENCE GUIDE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{User Reference Guide} + +\declaremodule{}{psyco} + +This chapter describes in detail what you will find in the \module{psyco} package module. + +The various functions described here are all concerned with how you tell Psyco what it should compile and what it should leave to the standard interpreter to execute. Compiling everything is often overkill for medium- or large-sized applications. The drawbacks of compiling too much are in the time spent compiling, plus the amount of memory that this process consumes. It is a subtle balance to keep. + + +\section{Selecting the functions to compile} + +With the following functions you can explicitely control what parts of your application get compiled. + +\begin{funcdesc}{bind}{object, rec=10} + Tells Psyco that the given \var{object} should be compiled for faster execution. + + If \var{object} is a Python function, \function{bind} modifies the function object in-place (specifically, its \member{func_code} attribute is changed). All future calls to the function will go through Psyco. Remember that in Python no behavior can depend on which reference to the function you use to make the call; in other words, after + +\begin{verbatim} +g = f +bind(f) +\end{verbatim} + + calls to both \var{f} and \var{g} will go through Psyco. + + The \var{object} argument can also be: + \begin{itemize} + \item a method, either bound or unbound, implemented in Python; it underlying implementation is bound. + \item a class (or anything with a \member{__dict__} attribute); in this case, all functions and methods found in \code{c.__dict__} are bound (which means, for classes, all methods defined in the class but not in its parents). + \end{itemize} + + Note that compilation never actually starts before a function is first called. + + All functions called by a compiled function are also compiled, as well as the functions called by these, and so on, up to some limit (by default 10) that you can specify as the optional second argument. +\end{funcdesc} + +\begin{funcdesc}{proxy}{function-or-method, rec=10} + Makes a Psyco-enabled copy of \var{object}. + + This function returns a new object, which is a copy of the \var{function-or-method} with the same behavior but going through Psyco. The function or method must be implemented in Python. The argument itself is not affected; if you call it, it will still be run by the regular interpreter. + + Thus, \samp{bind(f)} is similar to \samp{f=proxy(f)}, except that any reference to \var{f} that might previously have been taken (for example by a \samp{from spam import *} statement) are unaffected in the second case. +\end{funcdesc} + +\begin{funcdesc}{unbind}{object} + Cancels the action of \function{bind}. + + Note that Psyco currently cannot release the memory occupied by the compilation of a function. +\end{funcdesc} + +\begin{funcdesc}{unproxy}{proxy-object} + Reverse of \function{proxy}. + + \code{unproxy(proxy(f))} is a new function object equal to \var{f}. Calling it does no longer invoke Psyco. +\end{funcdesc} + +\begin{funcdesc}{cannotcompile}{object} + Prevents the given function to be ever compiled by Psyco. \var{object} can also be a method object or directly a code object. Raises \exception{psyco.error} if the object is already being compiled. Note that this does not prevent functions called by \var{object} to be compiled, if they are bound or proxied or if the profiler chooses to compile them. +\end{funcdesc} + +\begin{funcdesc}{setfilter}{func or None} + Sets a global filter function: ``func(co)`` will be called once per code object \var{co} considered by Psyco. If it returns \var{False}, the code object will not be compiled. Note that ``func(co)`` will not be called if Psyco already started to compile the code object before you called \function{setfilter}, nor if the code object contains constructs that prevents Psyco from compiling it anyway. The return value of \function{setfilter} is the previous filter function or \var{None}. +\end{funcdesc} + +The same function will never be compiled over and over again, so that you can freely mix calls to \function{bind}, \function{proxy}, \function{unbind} and \function{unproxy} and to the profile-based routines described in the next section. + + +\section{Profile-based compilation} + +This section lists the functions that use the Python profiler and line tracer to discover which functions it should compile. These routines are best to use if your application doesn't have a clear "slow spot" where a lot of time is spent algorithmically. If it does, the previous section is all you need. + +\begin{funcdesc}{full}{memory=None, time=None, memorymax=None, timemax=None} + Compile as much as possible. + + Very efficient for small scripts and applications. Might be overkill for large applications: the memory blow-up and the time spent compiling a large amount of code could outweight the benefits. + + The (optional) arguments are described in the next sections. +\end{funcdesc} + +\begin{funcdesc}{profile}{watermark=0.09, halflife=0.5, pollfreq=20, parentframe=0.25, memory=None, time=None, memorymax=None, timemax=None} + Do profiling to detect the functions that consume a lot of interpretation time, and only compile those. + + As far as I can tell, the best solution for large applications. If a function takes a long time to run, it will be detected and compiled \emph{while it is still running,} in the middle of its execution. Psyco takes it away from the standard interpreter. + + The (optional) arguments are used for fine-tuning. They are described in the next sections. +\end{funcdesc} + +\begin{funcdesc}{background}{watermark=0.09, halflife=0.5, pollfreq=100, parentframe=0.25, memory=None, time=None, memorymax=None, timemax=None} + This is similar to \function{psyco.profile}, but does not use active profiling. It only starts a background thread that periodically checks where the execution point is in all the other threads, and collects statistics based on this. + + While quite less accurate, this method has the advantage of adding only a very small overhead to the standard execution and might be suited to large applications with an occasional algorithmically-intensive function. + + The (optional) arguments are used for fine-tuning. They are described in the next sections. Try putting a \samp{psyco.background()} call in your \file{site.py} file, with a larger \var{watermark}. Psyco will stay in the shadow and you should not notice it at all until you do some heavy work in Python. +\end{funcdesc} + +\begin{funcdesc}{runonly}{memory=None, time=None, memorymax=None, timemax=None} + Run the compiled functions but don't compile new ones. + + The usefulness of this routine is unknown. See below. +\end{funcdesc} + +\begin{funcdesc}{stop}{} + Stop the current profiler and purge the profiler queue (described below). + + Calling this function prevents Psyco from compiling any new function. It will still execute the ones that have already been compiled. +\end{funcdesc} + +\note{most comments on the performance are based on small tests and extrapolations. Just don't trust what I guess and try yourself. Any comment about which routine you found most useful or what value you often give to parameters are welcome!} + + +\subsection{Charge profilers}\label{charges} + +The ``profilers'' invoked by the above functions \function{profile} or \function{background} work on the following principles. During the regular execution of your application, Psyco measures the time spent by your functions. Individual functions are selected for compilation based on these data. + +Python 2.2.2 (and up) maintains a counter of executed bytecode instructions; this number is the most accurate (well, the least inaccurate) method I found out to guess how much a function could benefit from being run by Psyco. This number counts the number of bytecode instructions (or elementary steps) taken during the interpretation, which gives a ``time'' estimate. This ``time'' does not include things like time spent waiting for data to be read or written to a file, for example, which is a good thing because Psyco cannot optimize this anyway. + +The ``time'' thus charged to various functions is accumulated, until some limit is reached. To favour functions that have recently be seen running over old-timers, the charge of each function ``decays'' with time, following an exponential law as if the amount of time was stored as a dissipating electric charge. The limit at which a function is compiled is given as a fraction of the total charge; in other words, when a function's charge reaches at least xx percents of the total current charge, it is compiled. As all the charges decay with time, reaching such a limit is easier than it may seem; for example, if the limit is set at 10\%, and if the execution stays for several seconds within the same 10 functions, then at least one of them will eventually reach the limit. In practice, it seems to be a very good way to measure the charge; a few CPU-intensive functions will very quickly reach the limit, even if the program has already been running for a long time. + +The functions \function{profile} and \function{background} take the following optional keyword arguments: +% +\withsubitem{(profiling)}{ + \ttindex{watermark} + \ttindex{halflife} + \ttindex{pollfreq} + \ttindex{parentframe}} +% +\begin{description} + +\item[watermark] + The limit, as a fraction of the total charge, between \code{0.0} and \code{1.0}. The default value is \code{0.09}, or 9\%. + +\item[halflife] + The time (in seconds) it takes for the charge to drop to half its initial value by decay. After two half-lifes, the charge is one-fourth of the initial value; after three, one-eighth; and so on. The default value is \code{0.5} seconds. + +\item[pollfreq] + How many times per second statistics must be collected. This parameter is central to \function{background}'s operation. The default value is \code{100}. This is a maximum for a number of operating systems, whose \function{sleep} function is quite limited in resolution. + + \var{pollfreq} also applies to \function{profile}, whose main task is to do active profiling, but which collects statistics in the background too so that it can discover long-running functions that never call other functions. The default value in this case is \code{20}. + +\item[parentframe] + When a function is charged, its parent (the function that called it) is also charged a bit. The purpose is to discover functions that call several other functions, each of which does a part of the job, but none of which does enough to be individually identified and compiled. When a function is charged some amount of time, its the parent is additionally charged a fraction of it. The parent of the parent is charged too, and so on recursively, althought the effect is more and more imperceptible. This parameter controls the fraction. The default value of \code{0.25} means that the parent is charged one-fourth of what a child is charged. \note{Do not use values larger than \code{0.5}.} + +\end{description} + +\note{All default values need tuning. Any comments about values that seem to give better results in common cases are welcome.} + +Profiling data is not stored on disk (currently). Profiling starts anew each time you restart your application. This is consistent with the way the ``electric charges'' approach works: any charge older than a few half-lifes gets very close to zero anyway. Moreover, in the current implementation, a full reset of the charges occurs every 120 half-lifes, but the effect should go unnoticed. + + +\subsection{Limiting memory usage}\label{memlimits} + +Psyco can and will use large amounts of memory. To give you more control, the effect of the various ``profilers'' selected by the functions \function{full}, \function{profile} and \function{background} can be limited. + +Here are the corresponding optional keyword arguments. +% +\withsubitem{(profiler limit)}{ + \ttindex{memory} + \ttindex{time} + \ttindex{memorymax} + \ttindex{timemax}} +% +\begin{description} + +\item[memory] + Stop when the profiler has caused the given amount of memory to be consumed in code compilation (in kilobytes). + + Note that the value is very approximative because it only takes some of the data structures of Psyco in account. The actual amount of memory consumed by Psyco will be much larger than that. + +\item[time] + Only run the profiler for the given amount of seconds. + +\item[memorymax] + Stop when the memory consumed by Psyco reached the limit (in kilobytes). This limit includes the memory consumed before this profiler started. + +\item[timemax] + Stop after the given number of seconds has elapsed, counting from now. + + The difference with \var{time} is only apparent when the profiler does not actually start immediately, if it is queued as explained in the next section. + +\end{description} + + +\subsection{The profilers queue} + +Profilers can be chained. By calling several of the above profiling functions (or maybe the same function several times with different arguments), only the first one is started. The second one will only be started when the first one reaches one of its limits, and so on. For example: + +\begin{verbatim} +import psyco +psyco.full(memory=100) +psyco.profile() +\end{verbatim} + +causes Psyco to compile everything until it takes 100 kilobytes of memory, and then only compile based on collected statistics. Remember that the limit of 100 kilobytes is largely underestimated by Psyco: your process' size will grow by much more than that before Psyco switches to profiling. + +If all profilers reach their limits, profiling is stopped. Already-compiled functions will continue to run faster. + +You may try to add a line \samp{psyco.runonly()} after the last profiler, if all your profilers may stop (i.e.\ all of them have limits). It might help, or it might not. Feedback appreciated. + +\note{Besides the limits, external events may prevent a specific profiler from running. When this occurs, Psyco falls back to the next profiler but may come back later when the external condition changes again. This occurs if some other program (e.g.\ the \module{pdb} debugger) sets a profiling or line-by-line tracing hook. Psyco always gracefully leaves the priority to other programs when they want to occupy Python's hooks.} + + +\section{Exceptions and warnings} + +\begin{excdesc}{error} + The \exception{psyco.error} exception is raised in case of a Psyco-specific error during the call of one of the above functions or during profiling. It is never automatically raised within one of your function that is accelerated by Psyco. +\end{excdesc} + +\begin{excdesc}{warning} + The \exception{psyco.warning} warning is issued in the hopefully rare cases where the meaning of your functions may change because of Psyco. Unlike \exception{psyco.error}, this warning is typically issued while Psyco is running your own Python code, during a call to one of the functions described in appendix \ref{patchedfunctions}. +\end{excdesc} + + +\section{The \module{psyco.classes} module}\label{psycodotclasses} + +The \module{psyco.classes} module defines a practical metaclass that you can use in your applications. + +A metaclass is the type of a class. Just like a class controls how its instances behave, a metaclass controls how its classes behave. The purpose of the present metaclass is to make your classes more Psyco-friendly. + +\begin{classdesc*}{psymetaclass} +The new metaclass. This is a subclass of \class{psyco.compacttype}. Any user-defined class using this metaclass will be a new-style class and will automatically bind all the methods defined in the class body for compilation with Psyco. It will also automatically inherit from \class{psyco.compact} (see section \ref{psycocompact}). +\end{classdesc*} + +\begin{classdesc*}{__metaclass__} +A synonym for \class{psymetaclass}. +\end{classdesc*} + +\begin{classdesc*}{psyobj} +An empty class whose metaclass is \class{psymetaclass}, suitable for subclassing in the same way that the built-in \class{object} is the generic empty new-style class which you can subclass. +\end{classdesc*} + +See \url{http://www.python.org/2.2.2/descrintro.html} for more information about old-style vs.\ new-style classes. Be aware of the changes in semantics, as recalled in section \ref{metaclass} (Psyco tutorial). + +By using \class{psyco.classes.__metaclass__} as the metaclass of your commonly-used classes, Psyco will call \function{psyco.bind} for you on all methods defined in the class (this does not include inherited parent methods or methods added after the class is first created). Additionally, these classes are ``compact'' (section \ref{psycocompact}), i.e.\ Psyco can produce quite fast code to handle instances of these classes and they use less memory each. + +\subsection{Examples} + +The following examples both define a Psyco-friendly class \class{X} and bind the method \function{f}. + +\begin{verbatim} +from psyco.classes import __metaclass__ +class X: + def f(x): + return x+1 +\end{verbatim} + +\samp{import __metaclass__} affects all classes defined in the module. To select individual classes instead: + +\begin{verbatim} +import psyco.classes +class X(psyco.classes.psyobj): + def f(x): + return x+1 +\end{verbatim} + + +\section{The \module{psyco.compact} type}\label{psycocompact} + +Starting from version 1.4, Psyco exports two extension types: \class{psyco.compact} and \class{psyco.compacttype}. (In some future version, Psyco may be able to patch the features implemented by these types directly into the standard interpreter's built-in types). + +\begin{classdesc*}{psyco.compact} +A base class whose instances are stored more compactly in memory. Can be directly instantiated or subclassed. The instances behave roughly like normal Python instances, i.e.\ you can store and read attributes, and put methods and other attributes in the subclasses, including Python's special methods (\function{__init__}, \function{__str__}, etc.). Their advantages over regular instances are: +% +\begin{itemize} +\item They are more compact in memory, with a footprint similar to that of Python's \code{__slots__}-constrained instances. For example, an instance with two integer attributes uses around 180 bytes in plain Python, and only around 44 if you use \code{__slots__} or with \class{psyco.compact}. The advantage over \code{__slots__} is that you don't have to know all possible attributes in advance. +\item In non-Psyco-accelerated function, there is a space/time trade-off: attribute accesses are a bit slower. However, +\item Psyco-accelerated functions handle \class{psyco.compact} instances extremely efficiently, both in space and in time. For example, an assignment like \code{x.attr=(a,b,c)} stores the individual values of \code{a}, \code{b} and \code{c} directly into the instance data without building a tuple in memory. +\end{itemize} + +There are a few visible differences and limitations: +% +\begin{enumerate} +\item Explicit use of \code{__slots__} is forbidden. +\item Weak references to instances are not allowed. (Please write me if you would like me to remove this limitation.) +\item Instances are not based on a real dictionary; the \code{__dict__} attribute returns a dictionary proxy (which however supports all dict operations, including writes). +\item When assigning to \code{__dict__}, a copy of the data is stored into the instance; the dict and the instance do not reflect each other's future changes (they do in plain Python). +\item Instances have a \code{__members__} attribute which lists the current attributes, in the order in which they have been set. +\item For internal reasons, the subclasses' \code{__bases__} attribute will always contain \class{psyco.compact} as the last item, even if one or several other base classes were specified. +\item Three methods \code{__getslot__}, \code{__setslot__} and \code{__delslot__} show up for internal purposes. +\end{enumerate} +\end{classdesc*} + +\begin{classdesc*}{psyco.compacttype} +The metaclass of \class{psyco.compact}. It inherits from \class{type}. It means that when you subclass \class{psyco.compact}, your classes are by default of type \class{psyco.compacttype} instead of \class{type}. The sole purpose of this metaclass is to force \class{psyco.compact} to appear in the subclasses' bases, and to check for \code{__slots__}. + +Note that you should not mix \class{psyco.compacttype} classes and normal classes in the same hierarchy. Although this might work, the instances will still each have an unused allocated dictionary. +\end{classdesc*} + +\subsection{Examples} + +\begin{verbatim} +import psyco +class Rectangle(psyco.compact): + def __init__(self, w, h): + self.w = w + self.h = h + def getarea(self): + return self.w * self.h + +r = Rectangle(6, 7) +assert r.__dict__ == {'w': 6, 'h': 7} +print r.getarea() +\end{verbatim} + +The above example runs without using Psyco's compilation features. The \code{r} instance is stored compactly in memory. (Thus this feature of Psyco probably works on any processor, but this hasn't been tested.) + +The same example using the metaclass: + +\begin{verbatim} +import psyco +class Rectangle: + __metaclass__ = psyco.compacttype + def __init__(self, w, h): + self.w = w + self.h = h + def getarea(self): + return self.w * self.h + +r = Rectangle(6, 7) +assert r.__dict__ == {'w': 6, 'h': 7} +print r.getarea() +\end{verbatim} + + +\section{Logging} + +\begin{funcdesc}{log}{logfile='', mode='w', top=10} +This function enables logging. Psyco will write information to the file \var{logfile}, opened in the given \var{mode} (which should be \code{'w'} for overwriting or \code{'a'} for appending). + +If unspecified, \var{logfile} defaults to the base script name (i.e.\ the content of \code{sys.argv[0]} without the final \file{.py}) with a \file{.log-psyco} extension appened. + +See below for the meaning of \var{top}. +\end{funcdesc} + +A log file has the structure outlined in the following example (from \file{test/bpnn.py}): + +\begin{verbatim} +11:33:53.19 Logging started, 12/22/02 %%%%%%%%%%%%%%%%%%%% +11:33:53.29 ActivePassiveProfiler: starting %%%%% +11:33:53.40 ______ + #1 |95.1 %| active_start ...psyco\profiler.py:258 + #2 | 0.9 %| ? ...\lib\traceback.py:1 + #3 | 0.8 %| ? bpnn.py:8 + #4 | 0.7 %| time bpnn.py:22 + #5 | 0.4 %| seed ...222\lib\random.py:140 + #6 | 0.3 %| ? ...\lib\linecache.py:6 + #7 | 0.3 %| write ...s\psyco\logger.py:22 + #8 | 0.3 %| __init__ bpnn.py:48 + #9 | 0.2 %| go ...psyco\profiler.py:31 +11:33:53.62 tag function: backPropagate % +11:33:53.62 tag function: update % +11:33:53.67 tag function: train % +11:33:54.12 ______ + #1 |58.4 %| active_start ...psyco\profiler.py:258 + #2 | 2.5 %| random ...222\lib\random.py:168 + #3 | 2.1 %| __init__ bpnn.py:48 + #4 | 2.1 %| demo bpnn.py:167 + #5 | 2.0 %| dumpcharges ...s\psyco\logger.py:56 + #6 | 1.2 %| do_profile ...psyco\profiler.py:299 + #7 | 1.2 %| rand bpnn.py:36 + #8 | 0.9 %| makeMatrix bpnn.py:40 + #9 | 0.8 %| time bpnn.py:22 + #10 | 0.6 %| ? bpnn.py:8 +(...cut...) +11:33:55.50 ______ + #1 |42.5 %| active_start ...psyco\profiler.py:258 + #2 | 8.3 %| random ...222\lib\random.py:168 + #3 | 6.7 %| dumpcharges ...s\psyco\logger.py:56 + #4 | 6.6 %| __init__ bpnn.py:48 + #5 | 4.0 %| rand bpnn.py:36 + #6 | 3.4 %| demo bpnn.py:167 + #7 | 2.9 %| makeMatrix bpnn.py:40 + #8 | 2.3 %| do_profile ...psyco\profiler.py:299 + #9 | 1.3 %| time bpnn.py:22 + #10 | 1.0 %| test bpnn.py:140 +11:33:55.50 tag function: random % +11:33:55.94 memory usage: 220+ kb % +11:33:55.94 program exit, 12/22/02 %%%%%%%%%%%%%%%%%%%% +\end{verbatim} + +The first column is a time (hours, minutes, seconds, hundredths). Most lines end in a number of percent signs; the more percent signs, the more important the line is, so that you can for example do a \samp{grep \%\%\% bpnn.log-psyco} to see the lines of importance 3 or more. As an exception, lines produced by the Psyco C core (as opposed to the Python glue, e.g.\ the profiler logic) end in \samp{\%\ \%} (percent, space, percent). + +The most common lines you will find in logs are: +% +\begin{description} + +\item[\#1, \#2, \#3,\ldots] + List (on several lines) of the functions which currently have the highest charge. You can typically use this to tune the watermark (section \ref{charges}). The displayed list is limited to the first 10 items by default; this can be customized with the \var{top} argument of \function{psyco.log}. + +\item[memory usage: \var{x}+ kb] + Psyco's current notion of how much memory is consumes for the emitted machine code and supporting data structures. This is a rouch estimation of the memory overhead (the \code{+} sign is supposed to remind you that this figure is highly underestimated). Use this info to tune the memory limits (section \ref{memlimits}). + +\item[unsupported opcode \var{x} at \var{y}:\var{z}] + The function \var{y} cannot be compiled. Look up the opcode number \var{x} in the table of appendix \ref{unsupported}. + +\item[tag function: \var{x}] + The function charge has reached the watermark. Its code object is compiled. Execution of the function goes on in the compiled version. + +\item[bind function: \var{x}] + The function charge has reached the watermark and it is bound (with \function{psyco.bind}). Only when function tagging is impossible (when doing passive profiling only). Bound functions are only compiled the next time the function is called, which means that any work that is still done before the current call returns will be done uncompiled. The profiler will continue to charge the function for that work and possibly bind the same function several times (with no bad consequences). + +\item[cannot find function \var{x} in \var{y}] + The profiler's attempt to use \function{psyco.bind} failed because the function object could not be found. Indeed, the profiler charges code objects, and \function{psyco.bind} only applies to function objects. Looking for a function when we only have the code object is difficult (not to mention that some code objects may have been created by \function{compile} or \function{execfile} and are not owned by any function whatsoever). Psyco currently only locates the functions defined at the module top-level and the methods of top-level classes. (This is one reason why profilers tag and don't bind if they can.) + +\item[profiling stopped, binding \var{n} functions] + When active profiling stops, the profiler calls \function{psyco.bind} on all currently tagged functions. If you feel that this operation is too heavy (e.g.\ makes a visible pause in your real-time application) use the \function{psyco.runonly} profiler to prevent this from occuring. Normally it only applies if you have set limits on all the profilers queued so far. + +\item[disabled (\var{L} limit reached)] + The profiler is stopped because it reached the limit \var{L}. The next queued profiler can start. + +\item[disabled by psyco.error] + Failed to set the profiling or tracing hooks. Normally means that some other code (e.g.\ a debugger) is already using them. Psyco profiling will restart when the other program let go of the hooks. + +\item[resetting stats] + Profiling charges are reset to zero. Occurs periodically. + +\item[no locals() in functions bound by Psyco] + Logged the first time the corresponding \exception{psyco.warning} is issued. This is just a reminder. To locate the problem, use the information Python prints to the terminal. + +\item[unsupported ** argument in call to \var{x}] + The call to the function \var{x} cannot be compiled because of the \code{**} argument. This is a limitation of Psyco; try to avoid \code{**} arguments (or write to me and insist on this feature). + +\item[unsupported free or cell vars in \var{x}] + Psyco currently cannot compile functions that use nested scopes. + +\end{description} + + +\section{Machine code inspection} + +Psyco works by directly emitting machine code for the processor. Typically, it will write a large number of small blocks of code, with numerous jumps from one to the other. + +As you can guess, debugging this machine code with traditional tools was difficult, so I had to write helpers. They can be found in the \file{py-utils} subdirectory. You need a version of Psyco compiled in debugging mode; see section \ref{debugpsyco} for instructions on how to build it. + +\begin{funcdesc}{dumpcodebuf}{} + This function (to be called near the end of your program) dumps all the machine code and supporting data structures into a file \file{psyco.dump}. This function has no effect if Psyco was not compiled in debugging mode. +\end{funcdesc} + +Run the script \program{httpxam.py} with as argument the name of the directory which contains the \file{psyco.dump} file to examine. This script formats the data as HTML pages and presents them via a web server built on Python's standard \class{SimpleHTTPServer}. When it is running, point your browser to \url{http://127.0.0.1:8000}. + +\program{httpxam.py} probably only works on Linux. It requires the programs \program{objdump} or \program{ndisasm} to disassemble the code and \program{nm} to list symbol addresses in the Python and Psyco executables. + +The cross-calling code buffers are presented as cross-linked HTML pages. Bold lines show the targets of another jump. If preceeded by a blank line, a bold line shows that another code buffer jumps directly at this position. The end of the buffer is often garbage; it is not code, but data added there (typically for the promotion of a value). There are various kind of code buffers, depending (only) on why Psyco produced it: +% +\begin{description} +\item[normal] normal mainstream compilation +\item[respawn] execution jumps here when an error occurs, but never did so yet +\item[respawned] replaces a respawn buffer when execution has jumped here +\item[unify] small buffer whose purpose is to jump back to an existing one +\item[load_global] called when a change is detected in a global variable +\item[coding_pause] not yet compiled, will be compiled if execution jumps here +\end{description} + + + +%%%%%%%%%%%%%%% +%% CAVEATS %% +%%%%%%%%%%%%%%% +\appendix +\chapter{Caveats} + + +\section{Known bugs}\label{bugs} + +Apart from speed, functions are supposed to run identically under Psyco and under Python, with the following known exceptions: +% +\withsubitem{(in frame objects)}{ + \ttindex{f_back} + \ttindex{f_code} + \ttindex{f_globals} + \ttindex{f_locals}} +\withsubitem{(exception)}{ + \ttindex{KeyboardInterrupt}} +% +\begin{itemize} + +\item The functions \function{locals}, \function{eval}, \function{execfile}, \function{vars}, \function{dir} and \function{input} should work as expected starting from Psyco 1.3, but see section \ref{patchedfunctions}. + +\item \strong{Frame objects} are emulated. The \function{sys._getframe} function returns an instance of a custom class which emulates the standard frame objects' behavior as much as possible. The frames corresponding to a Psyco-accelerated frame have some placeholder attributes, notably \member{f_locals}. \emph{There is no way to read the local variables of a Psyco-accelerated frame.} Actually, only the \member{f_code}, \member{f_globals}, \member{f_back} and \member{f_lineno} fields are well-tested. Also keep in mind that if you obtain a real frame object (which you can do with some other mean than \function{sys._getframe}, e.g.\ via a traceback object), the \member{f_back} chained list will not include the Psyco-accelerated frames. + +\item The compiled machine code does not include the regular polling done by Python, meaning that a \exception{KeyboardInterrupt} will not be detected before execution comes back to the regular Python interpreter. Your program cannot be interrupted if caught into an infinite Psyco-compiled loop. (This could be fixed if requested.) + +\item Infinite recursions are not correctly detected. They are likely to result in segmentation faults (or whatever a stack overflow triggers on your system) instead of Python's nice \exception{RuntimeError}. Similarily, circularities among data structures can cause troubles (e.g.\ printing or comparing lists that contain themselves). + +\end{itemize} + +At other points, Psyco makes assumptions that may be wrong (and will cause damage if they turn out to be): +% +\withsubitem{(module)}{ + \ttindex{rexec}} +% +\begin{itemize} + +\item \strong{Built-ins} are assumed never to change. Global variables can change, of course, but you must not add or remove a global variable to shadow or expose a built-in (at least not after a module is initialized). + +\item Do not \strong{dynamically change the methods} of the new-style classes (classes that inherit from a built-in type). + +\item Psyco assumes that \strong{types never change}. This is basically wrong (you can assign to \code{__class__}). This might cause Psyco to randomly believe that instances are still of their previous type. + +\item Do not use Psyco together with \strong{restricted execution} (the \module{rexec} module). (Given that \module{rexec} is deprecated and not safe in the first place, not using it is probably a good idea anyway.) + +\end{itemize} + +Some minor points: +% +\begin{itemize} + +\item The error message coming with exceptions will occasionally differ from Python's (but not the exception class). + +\item The \code{is} operator might occasionally work unexpectedly on immutable built-in objects across function calls. For example, in +\begin{verbatim} +def save(x): + global g + g = x +def test(i): + n = i+1 + save(n) + return n is g +\end{verbatim} + there is no guarantee with Psyco that the integer object stored in \var{g} is identical to the object seen as \var{n} by the operator \code{is} (althought they would of course be equal). Well, \code{is} is not supposed to be too useful for immutable objects anyway. There are interesting exceptions, but these work as expected. Consider the above \function{test} function as broken because it should be (but is not) equivalent to +\begin{verbatim} +def test(i): + f(i+1) + return (i+1) is g +\end{verbatim} + +\item I did not test these artificial examples of tricky code accessing a list while it is being sorted. The potential problem here is that Psyco assumes that the type of an object never changes, while Python (before 2.3) changes the type of the list to make it immutable during the sort. + +\item Running out of memory during compilation is hard to recover from. I made it a fatal error. + +\item Occasionally, objects become immortal. An example of such a situation that comes in mind is the initial value of a then-changing global variable. In general, however, this concerns objects that are immortal anyway (like a global variable that does not change or constants in the code). + +\end{itemize} + + +\section{Patched functions}\label{patchedfunctions} + +When Psyco starts, it replaces a few functions from the \module{__builtin__} and \module{sys} modules with a version of its own. This trick fails if you made a copy of one of these functions elsewhere before Psyco has a chance to replace it, because the old copy will not behave properly in the presence of Psyco. + +\withsubitem{(built-in function)}{ + \ttindex{globals} + \ttindex{locals} + \ttindex{vars} + \ttindex{dir} + \ttindex{eval} + \ttindex{execfile} + \ttindex{input} + \ttindex{sys._getframe} + \ttindex{_getframe (sys)}} +% +\begin{tableii}{c|l}{function}{Built-in function}{Notes} + \lineii{ globals }{} + \lineii{ locals }{(1)} + \lineii{ vars }{(1) when called with no argument} + \lineii{ dir }{(1) when called with no argument} + \lineii{ eval }{(1)(2) when called with a single argument} + \lineii{ execfile }{(1) when called with a single argument} + \lineii{ input }{(1)} + \lineii{ sys._getframe }{(3)} +\end{tableii} + +\noindent +Notes: +% +\begin{description} +\item[(1)] + A function run by Psyco has no native \function{locals} dictionary. Psyco 1.3 and above can emulate it properly if a certain optimization (early dead variable deletion) is disabled. Psyco should turn off this optimization automatically for functions where it detects a call to one of the above built-in functions, but this detection is a guess over the function's bytecode. It means that certain indirect calls can be missed. If this occurs at run-time, a \exception{psyco.warning} is issued and the emulated \function{locals} dictionary is empty. +\item[(2)] + Note that it is common to find Python programs that use dynamic code evaluation for an effect that can be obtained by calling an ad-hoc built-in function instead. For example, \code{eval('self.'+attr)} is better written as \code{getattr(self, attr)} and \code{exec 'import '+module} is better written as \code{__import__(module, globals(), locals(), [])}. +\item[(3)] + Frames corresponding to Psyco-evaluated functions are incomplete, as described in section \ref{bugs}. +\end{description} + +Additionally, the \code{exec} statement is not supported yet, as seen in section \ref{unsupported}. + + +\section{Unsupported Python constructs}\label{unsupported} + +Psyco only compiles functions. It will not accelerate any code that runs outside any function, like: + +\begin{itemize} +\item top-level module code\footnote{Support for top-level module code is possible but disabled by default in recent versions of Psyco; contact me for more information.} +\item the code defining a class --- i.e.\ the execution of the \code{class} statement. Methods themselves are accelerated just fine when you actually call them. +\item the code run by an \code{exec} statement or \function{execfile} or \function{eval}. +\end{itemize} + +You can always work around the above limitations by creating functions and calling them instead of directly executing a time-consuming source. For example, instead of writing a short test script like +% +\begin{verbatim} +some_big_list = ... +for x in some_big_list: + do_something() +\end{verbatim} +% +write instead +% +\begin{verbatim} +def process_list(lst): + for x in lst: + do_something() +process_list(...) +\end{verbatim} + +As another example, a function like +% +\begin{verbatim} +def f(some_expr): + for x in range(100): + print eval(some_expr) # where some_expr can depend on x +\end{verbatim} +% +should instead be written +% +\begin{verbatim} +def f(some_expr): + my_func = eval("lambda x: " + some_expr) # -> a function object + for x in range(100): + print my_func(x) +\end{verbatim} + +In addition, inside a function, some syntactic constructs are not supported by Psyco. It does not mean that a function using them will fail; it merely means that the whole function will not be accelerated. The following table lists the unsupported constructs, along with the corresponding bytecode instruction name and number. Log files only report the bytecode instruction number, which you need to look up here. + +\begin{tableiii}{cl|l}{code}{Bytecode}{Instruction name}{Appears in} + \lineiii{ 82}{\code{LOAD_LOCALS }}{(1) class definitions} + \lineiii{ 84}{\code{IMPORT_STAR }}{(5) \code{from xx import *}} + \lineiii{ 85}{\code{EXEC_STMT }}{(2) \code{exec xx}} + \lineiii{ 86}{\code{YIELD_VALUE }}{(3) generators} + \lineiii{ 90}{\code{STORE_NAME }}{(5) outside functions} + \lineiii{ 91}{\code{DELETE_NAME }}{(5) outside functions} + \lineiii{101}{\code{LOAD_NAME }}{(5) outside functions} + \lineiii{134}{\code{MAKE_CLOSURE }}{(4) nested scopes} + \lineiii{135}{\code{LOAD_CLOSURE }}{(4) nested scopes} + \lineiii{136}{\code{LOAD_DEREF }}{(4) nested scopes} + \lineiii{137}{\code{STORE_DEREF }}{(4) nested scopes} +\end{tableiii} + +\noindent +Notes: +% +\begin{description} +\item[(1)] + Psyco cannot accelerate class definitions, i.e.\ the execution of the body of the class statement -- i.e.\ the creation of the class object itself. This does not prevent it from accelerating methods in the class. +\item[(2)] + Functions using this construct cannot be accelerated. +\item[(3)] + Generators (i.e.\ any function using the \code{yield} keyword) cannot be accelerated currently. If there is enough interest I can consider implementing them. This includes generator expressions (Python 2.4). Warning! The function containing a generator expression will be compiled by Psyco, but not the generator expression itself. If the latter calls other functions compiled by Psyco, then performance will be very bad: calling from Psyco to Python to Psyco comes with a significant overhead. +\item[(4)] + Using nested scopes (i.e.\ variables shared by a function and an inner sub-function) will prevent both the outer and the inner function to be accelerated. This too could be worked around if there is enough interest, at least for accelerating the unrelated parts of the functions -- the accesses to the shared variables themselves might be difficult to optimize. +\item[(5)] + These constructs can appear in class definitions (see (1)) or at the module top-level. It is possible to enable support for module top-level code, but not recommended; instead, try to put all the code you want accelerated in function bodies. +\end{description} + + +\chapter{Performance expectations} + +Psyco can compile code that uses arbitrary object types and extension modules. Operations that it does not know about will be compiled into direct calls to the C code that implements them. However, some specific operations can be optimized, and sometimes massively so --- this is the core idea around which Psyco is built, and the reason for the sometimes impressive results. + +The other reason for the performance improvement is that the machine code does not have to decode the pseudo-code (``bytecode'') over and over again while interpreting it. Removing this overhead is what compilers classically do. They also simplify the frame objects, making function calls more efficients. So does Psyco. But doing \emph{only} this would be ineffective with Python, because each bytecode instruction still has a lot of run-time decoding to do (typically, looking up the type of the arguments in tables, invoking the corresponding operation and building a resulting Python object). + +The type-based look-ups and the successive construction and destruction of objects for all intermediate values is what Psyco can most successfully cancel, but it needs to be taught about a type and its operations before it can do so. + +We list below the specifically optimized types and operations. Possible performance gains are just wild guesses; specialization is known to give often-good-but-hard-to-predict gains. Remember, all operations not listed below work well --- they just cannot be much accelerated. + +A \strong{performance killer} is the usage of the built-in functions \function{map} and \function{filter}. \strong{Never} use them with Psyco. Replace them with list comprehensions (see \ref{tutknownbugs}). The reason is that entering code compiled by Psyco from non-Psyco-accelerated (Python or C) code is quite slow, slower than a normal Python function call. The \function{map} and \function{filter} functions will typically result in a very large number of calls from C code to a \code{lambda} expression foolishly compiled by Psyco. An exception to this rule is when using \function{map} or \function{filter} with a built-in function, when they are typically slightly faster than list comprehension because the only difference is then that the loop is performed by C code instead of by Psyco-generated code. Still, I generally recommend that you forget about \function{map} and \function{filter} and use the "Pythonic" way. + +\strong{Virtual-time} objects are objects that, when used as intermediate values, are simply not be built at run-time at all. The noted performance gains only apply if the object can actually remain virtualized. Any unsupported operation will force the involved objects to be normally built. + +\begin{tableiii}{c|ll}{textrm}{Type}{Operations}{Notes} + + \lineiii{Any built-in type}{reading members and methods}{(1)} + + \lineiii{Built-in function and method}{call}{(1)} + + \lineiii{Integer}{truth testing, unary \code{+} \code{-} \code{\~} \code{abs()}, binary \code{+} \code{-} \code{*} \code{|} \code{\&} \code{<{}<} \code{>{}>} \code{\^}, comparison}{(2)} + + \lineiii{Dictionary}{\code{len()}}{(4)} + + \lineiii{Float}{truth testing, unary \code{+} \code{-} \code{abs()}, binary \code{+} \code{-} \code{*} \code{/}, comparison}{(5)} + + \lineiii{Function}{call}{(6)} + + \lineiii{Sequence iterators}{\code{for}}{(7)} + + \lineiii{List}{\code{len()}, item get and set, concatenation}{(8)} + + \lineiii{Long}{all arithmetic operations}{(9)} + + \lineiii{Instance method}{call}{(1)} + + \lineiii{String}{\code{len()}, item get, slicing, concatenation}{(10)} + + \lineiii{Tuple}{\code{len()}, item get, concatenation}{(11)} + + \lineiii{Type}{call}{} + + \lineiii{array.array}{item get, item set}{(15)} + +\end{tableiii} + +\begin{tableii}{c|l}{textrm}{Built-in function}{Notes} + \lineii{\function{range}}{(8)} + \lineii{\function{xrange}}{(13)} + \lineii{\function{chr}, \function{ord}}{(10)} + \lineii{\function{id}}{} + \lineii{\function{type}}{} + \lineii{\function{len}, \function{abs}, \function{divmod}}{} + \lineii{\function{apply}}{(14)} + \lineii{the whole \module{math} module}{(16)} + \lineii{\function{map}, \function{filter}}{\strong{not supported}(17)} +\end{tableii} + +\noindent +Notes: +% +\begin{description} + +\item[(1)] + In the common \samp{object.method(args)} the intermediate bound method object is never built; it is translated into a direct call to the function that implements the method. For C methods, the underlying \ctype{PyMethodDef} structure is decoded at compile-time. Algorithms doing repetitive calls to methods of e.g.\ lists or strings can see huge benefits. + +\item[(2)] + Virtual-time integers can be 100 times faster than their regular counterpart. + +\item[(4)] + Complex data structures are not optimized yet, beyond (1). In a future version it is planned to allow these structures to be re-implemented differently by Psyco, with an implementation that depends on actual run-time usage. + +\item[(5)] + Psyco does not know about the Intel FPU instruction set. It emits calls to C functions that just add or multiply two \ctype{double}s together. Virtual-time floats are still about 10 times faster than Python. + +\item[(6)] + Virtual-time functions occur when defining a function inside another function, with some default arguments. + +\item[(7)] + Sequence iterators are virtual-time, making \code{for} loops over sequences as efficient as what you would write in C. + +\item[(8)] + Short lists and \function{range}s of step 1 are virtualized. A \code{for} looping over a range is as efficient as the common C \code{for} loop. For the other cases of lists see (4). + +\item[(9)] + Minimal support only. Objects of this type are never virtualized. The majority of the CPU time is probably spent doing the actual operation anyway, not in the Python glue. + +\item[(10)] + Virtual-time strings come in many flavors: single characters implemented as a single byte; slices implemented as a pointer to a portion of the full string; concatenated strings implemented as a (possibly virtual) list of the strings this string is the join of. Text-manipulation algorithms should see massive speed-ups. + +\item[(11)] + Programs manipulating small tuples in local variables can see them completely virtualized away. In general however, the gains with tuples are mostly derived from the various places where Python (and Psyco that mimics it) internally manipulates tuples. + +\item[(13)] + Psyco can optimize \function{range} well enough to make \function{xrange} useless. Indeed, with no specific support \function{xrange} would be less efficient than \function{range}! Currently \function{xrange} is almost identical to \function{range}. + +\item[(14)] + Without keyword argument dictionary. + +\item[(15)] + Type codes \code{'I'} and \code{'L'} are not supported. Type code \code{'f'} does not support item assignment. The speed of a complex algorithm using an array as buffer (like manipulating an image pixel-by-pixel) should be very high; closer to C than plain Python. + +\item[(16)] + Missing: \function{frexp}, \function{ldexp}, \function{log}, \function{log10}, \function{modf}. See note (5). + +\item[(17)] + Systematically avoid \function{map} and \function{filter} and replace them with list comprehension (section \ref{tutknownbugs}). + +\end{description} + + +\input{psycoguide.ind} % Index + +\end{document} diff --git a/nodeboxgl/ext/psyco/src/psyco-mactel.diff b/nodeboxgl/ext/psyco/src/psyco-mactel.diff new file mode 100644 index 0000000..c1b01b4 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/psyco-mactel.diff @@ -0,0 +1,210 @@ +Index: c/codegen.c +=================================================================== +--- c/codegen.c (revision 45659) ++++ c/codegen.c (working copy) +@@ -308,7 +308,12 @@ + #endif + } + } ++ #ifdef __APPLE__ ++ /* Adjust # of arguments for MacOS 16-byte stack alignment */ ++ result = psyco_call_var(c_function, (count+3)&~3, args); ++ #else + result = psyco_call_var(c_function, count, args); ++ #endif + if (PyErr_Occurred()) { + if (has_refs) + for (i = 0; i < count; i++) +@@ -387,6 +392,7 @@ + stackbase = po->stack_depth; + po->stack_depth += totalstackspace; + STACK_CORRECTION(totalstackspace); ++ CALL_STACK_ALIGN(count); + for (i=count; i--; ) { + switch (argtags[i]) { + +@@ -467,6 +473,7 @@ + } + } + } ++ + return NULL; + } + +Index: c/ivm/iencoding.h +=================================================================== +--- c/ivm/iencoding.h (revision 45659) ++++ c/ivm/iencoding.h (working copy) +@@ -248,6 +248,10 @@ + else if (_stackcorr > 0) \ + INSN_pushn(_stackcorr / sizeof(long)); \ + } while (0) ++/* Dummy stack alignment for non-MacOS X */ ++#define CALL_STACK_ALIGN_DELTA(nbargs, delta) ++#define CALL_STACK_ALIGN(nbargs) ++#define CALL_STACK_ALIGN_RESTORE(delta) + + #define FUNCTION_RET(popbytes) do { \ + INSN_ret((popbytes) / sizeof(long) + 1); /* +1 for the retaddr itself */ \ +Index: c/i386/iencoding.c +=================================================================== +--- c/i386/iencoding.c (revision 45659) ++++ c/i386/iencoding.c (working copy) +@@ -48,12 +48,17 @@ + code_t* code = po->code; + void* result; + code_t* fixvalue; ++ #ifdef __APPLE__ ++ int aligndelta; ++ #endif + + if (restore) + TEMP_SAVE_REGS_FN_CALLS; + else + SAVE_REGS_FN_CALLS(true); + ++ CALL_STACK_ALIGN_DELTA(1+(extraarg != SOURCE_DUMMY), aligndelta); ++ + /* first pushed argument */ + if (extraarg != SOURCE_DUMMY) + CALL_SET_ARG_FROM_RT(extraarg, 1, 2); /* argument index 1 out of total 2 */ +@@ -79,6 +84,7 @@ + 4*nb_args, /* 4*nb_args */ + 0); /* not used */ + code += 3; ++ CALL_STACK_ALIGN_RESTORE(aligndelta); + TEMP_RESTORE_REGS_FN_CALLS_AND_JUMP; + } + else +@@ -109,10 +115,25 @@ + int i, initial_depth; + Source* p; + bool ccflags; ++ #ifdef __APPLE__ ++ int aligncount=0; ++ #endif + BEGIN_CODE + /* cannot use NEED_CC(): it might clobber one of the registers + mentioned in argsources */ + ccflags = HAS_CCREG(po); ++ #ifdef __APPLE__ ++ /* Calculate number of registers that will be pushed by ++ NEED_REGISTER */ ++ for (i=0; istack_depth-INITIAL_STACK_DEPTH+(nbargs)*4; \ ++ delta = ((sp+15)&~15)-sp; \ ++ po->stack_depth += delta; \ ++ STACK_CORRECTION(delta); \ ++} while (0) ++ ++#define CALL_STACK_ALIGN(nbargs) do { \ ++ int delta; \ ++ CALL_STACK_ALIGN_DELTA(nbargs, delta); \ ++} while (0) ++ ++#define CALL_STACK_ALIGN_RESTORE(delta) do { \ ++ po->stack_depth -= delta; \ ++ STACK_CORRECTION(-delta); \ ++} while (0) ++#else ++/* Dummy stack alignment for non-MacOS X */ ++#define CALL_STACK_ALIGN_DELTA(nbargs, delta) ++#define CALL_STACK_ALIGN(nbargs) ++#define CALL_STACK_ALIGN_RESTORE(delta) ++#endif ++ + /* load the 'dst' register with the run-time address of 'source' + which must be in the stack */ + #define LOAD_ADDRESS_FROM_RT(source, dst) do { \ +Index: c/i386/iprocessor.c +=================================================================== +--- c/i386/iprocessor.c (revision 45659) ++++ c/i386/iprocessor.c (working copy) +@@ -21,6 +21,10 @@ + PUSH_REG_INSTR(REG_386_ESI), /* PUSH ESI */ + PUSH_REG_INSTR(REG_386_EDI), /* PUSH EDI */ + 0x8B, 0x5C, 0x24, 32, /* MOV EBX, [ESP+32] (finfo frame stack ptr) */ ++#ifdef __APPLE__ ++ /* Align stack on 16-byte boundary for MacOS X */ ++ 0x83, 0xEC, 8, /* SUB ESP, 8 */ ++#endif + 0x6A, -1, /* PUSH -1 */ + 0x89, 0x23, /* MOV [EBX], ESP */ + 0xEB, +5, /* JMP Label2 */ +@@ -31,6 +35,10 @@ + 0x39, 0xCA, /* CMP EDX, ECX */ + 0x75, -9, /* JNE Label1 */ + 0xFF, 0xD0, /* CALL *EAX (callee removes args) */ ++#ifdef __APPLE__ ++ /* Restore stack from 16-byte alignment on MacOS X */ ++ 0x83, 0xC4, 8, /* ADD ESP, 8 */ ++#endif + POP_REG_INSTR(REG_386_EDI), /* POP EDI */ + POP_REG_INSTR(REG_386_ESI), /* POP ESI */ + POP_REG_INSTR(REG_386_EBX), /* POP EBX */ +@@ -67,9 +75,18 @@ + 0x53, /* PUSH EBX */ + 0x8B, 0x5C, 0x24, 12, /* MOV EBX, [ESP+12] (argcount) */ + 0x8B, 0x44, 0x24, 8, /* MOV EAX, [ESP+8] (c_func) */ ++#ifdef __APPLE__ ++ /* Align stack on 16-byte boundary for MacOS X */ ++ 0x83, 0xEC, 8, /* SUB ESP, 8 */ ++#endif + 0x09, 0xDB, /* OR EBX, EBX */ + 0x74, +16, /* JZ Label1 */ ++#ifdef __APPLE__ ++ /* Arguments are 8 bytes further up stack on MacOS X */ ++ 0x8B, 0x54, 0x24, 24, /* MOV EDX, [ESP+24] (arguments) */ ++#else + 0x8B, 0x54, 0x24, 16, /* MOV EDX, [ESP+16] (arguments) */ ++#endif + 0x8D, 0x0C, 0x9A, /* LEA ECX, [EDX+4*EBX] */ + /* Label2: */ + 0x83, 0xE9, 4, /* SUB ECX, 4 */ +@@ -78,6 +95,10 @@ + 0x75, -9, /* JNE Label2 */ + /* Label1: */ + 0xFF, 0xD0, /* CALL *EAX */ ++#ifdef __APPLE__ ++ /* Restore stack from 16-byte alignment on MacOS X */ ++ 0x83, 0xC4, 8, /* ADD ESP, 8 */ ++#endif + 0x8D, 0x24, 0x9C, /* LEA ESP, [ESP+4*EBX] */ + 0x5B, /* POP EBX */ + 0xC3, /* RET */ diff --git a/nodeboxgl/ext/psyco/src/py-support/__init__.py b/nodeboxgl/ext/psyco/src/py-support/__init__.py new file mode 100644 index 0000000..d25e197 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-support/__init__.py @@ -0,0 +1,54 @@ +########################################################################### +# +# Psyco top-level file of the Psyco package. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco -- the Python Specializing Compiler. + +Typical usage: add the following lines to your application's main module, +preferably after the other imports: + +try: + import psyco + psyco.full() +except ImportError: + print 'Psyco not installed, the program will just run slower' +""" +########################################################################### + + +# +# This module is present to make 'psyco' a package and to +# publish the main functions and variables. +# +# More documentation can be found in core.py. +# + + +# Try to import the dynamic-loading _psyco and report errors +try: + import _psyco +except ImportError, e: + extramsg = '' + import sys, imp + try: + file, filename, (suffix, mode, type) = imp.find_module('_psyco', __path__) + except ImportError: + ext = [suffix for suffix, mode, type in imp.get_suffixes() + if type == imp.C_EXTENSION] + if ext: + extramsg = (" (cannot locate the compiled extension '_psyco%s' " + "in the package path '%s')" % (ext[0], '; '.join(__path__))) + else: + extramsg = (" (check that the compiled extension '%s' is for " + "the correct Python version; this is Python %s)" % + (filename, sys.version.split()[0])) + raise ImportError, str(e) + extramsg + +# Publish important data by importing them in the package +from support import __version__, error, warning, _getrealframe, _getemulframe +from support import version_info, __version__ as hexversion +from core import full, profile, background, runonly, stop, cannotcompile +from core import log, bind, unbind, proxy, unproxy, dumpcodebuf +from _psyco import setfilter +from _psyco import compact, compacttype diff --git a/nodeboxgl/ext/psyco/src/py-support/classes.py b/nodeboxgl/ext/psyco/src/py-support/classes.py new file mode 100644 index 0000000..0563f84 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-support/classes.py @@ -0,0 +1,42 @@ +########################################################################### +# +# Psyco class support module. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco class support module. + +'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes. +Any class inheriting from it or using the metaclass '__metaclass__' might +get optimized specifically for Psyco. It is equivalent to call +psyco.bind() on the class object after its creation. + +Importing everything from psyco.classes in a module will import the +'__metaclass__' name, so all classes defined after a + + from psyco.classes import * + +will automatically use the Psyco-optimized metaclass. +""" +########################################################################### + +__all__ = ['psyobj', 'psymetaclass', '__metaclass__'] + + +from _psyco import compacttype +import core +from types import FunctionType + +class psymetaclass(compacttype): + "Psyco-optimized meta-class. Turns all methods into Psyco proxies." + + def __new__(cls, name, bases, dict): + bindlist = dict.get('__psyco__bind__') + if bindlist is None: + bindlist = [key for key, value in dict.items() + if isinstance(value, FunctionType)] + for attr in bindlist: + dict[attr] = core.proxy(dict[attr]) + return super(psymetaclass, cls).__new__(cls, name, bases, dict) + +psyobj = psymetaclass("psyobj", (), {}) +__metaclass__ = psymetaclass diff --git a/nodeboxgl/ext/psyco/src/py-support/core.py b/nodeboxgl/ext/psyco/src/py-support/core.py new file mode 100644 index 0000000..42a6c2f --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-support/core.py @@ -0,0 +1,232 @@ +########################################################################### +# +# Psyco main functions. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco main functions. + +Here are the routines that you can use from your applications. +These are mostly interfaces to the C core, but they depend on +the Python version. + +You can use these functions from the 'psyco' module instead of +'psyco.core', e.g. + + import psyco + psyco.log('/tmp/psyco.log') + psyco.profile() +""" +########################################################################### + +import _psyco +import types, new +from support import * + + +# Default charge profiler values +default_watermark = 0.09 # between 0.0 (0%) and 1.0 (100%) +default_halflife = 0.5 # seconds +default_pollfreq_profile = 20 # Hz +default_pollfreq_background = 100 # Hz -- a maximum for sleep's resolution +default_parentframe = 0.25 # should not be more than 0.5 (50%) + + +def full(memory=None, time=None, memorymax=None, timemax=None): + """Compile as much as possible. + +Typical use is for small scripts performing intensive computations +or string handling.""" + import profiler + if PYTHON_SUPPORT: + p = profiler.FullCompiler() + else: + p = profiler.ActiveProfiler(0.0, 0.5) + p.run(memory, time, memorymax, timemax) + + +def profile(watermark = default_watermark, + halflife = default_halflife, + pollfreq = default_pollfreq_profile, + parentframe = default_parentframe, + memory=None, time=None, memorymax=None, timemax=None): + """Turn on profiling. + +The 'watermark' parameter controls how easily running functions will +be compiled. The smaller the value, the more functions are compiled.""" + import profiler + p = profiler.ActivePassiveProfiler(watermark, halflife, + pollfreq, parentframe) + p.run(memory, time, memorymax, timemax) + + +def background(watermark = default_watermark, + halflife = default_halflife, + pollfreq = default_pollfreq_background, + parentframe = default_parentframe, + memory=None, time=None, memorymax=None, timemax=None): + """Turn on passive profiling. + +This is a very lightweight mode in which only intensively computing +functions can be detected. The smaller the 'watermark', the more functions +are compiled.""" + import profiler + p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe) + p.run(memory, time, memorymax, timemax) + + +def runonly(memory=None, time=None, memorymax=None, timemax=None): + """Nonprofiler. + +XXX check if this is useful and document.""" + if PYTHON_SUPPORT: + import profiler + p = profiler.RunOnly() + p.run(memory, time, memorymax, timemax) + + +def stop(): + """Turn off all automatic compilation. bind() calls remain in effect.""" + import profiler + profiler.go([]) + + +def log(logfile='', mode='w', top=10): + """Enable logging to the given file. + +If the file name is unspecified, a default name is built by appending +a 'log-psyco' extension to the main script name. + +Mode is 'a' to append to a possibly existing file or 'w' to overwrite +an existing file. Note that the log file may grow quickly in 'a' mode.""" + import profiler, logger + if not logfile: + import os + logfile, dummy = os.path.splitext(sys.argv[0]) + if os.path.basename(logfile): + logfile += '.' + logfile += 'log-psyco' + if hasattr(_psyco, 'VERBOSE_LEVEL'): + print >> sys.stderr, 'psyco: logging to', logfile + # logger.current should be a real file object; subtle problems + # will show up if its write() and flush() methods are written + # in Python, as Psyco will invoke them while compiling. + logger.current = open(logfile, mode) + logger.print_charges = top + profiler.logger = logger + logger.writedate('Logging started') + cannotcompile(logger.psycowrite) + _psyco.statwrite(logger=logger.psycowrite) + + +def bind(x, rec=None): + """Enable compilation of the given function, method, or class object. + +If C is a class (or anything with a '__dict__' attribute), bind(C) will +rebind all functions and methods found in C.__dict__ (which means, for +classes, all methods defined in the class but not in its parents). + +The optional second argument specifies the number of recursive +compilation levels: all functions called by func are compiled +up to the given depth of indirection.""" + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + if rec is None: + x.func_code = _psyco.proxycode(x) + else: + x.func_code = _psyco.proxycode(x, rec) + return + if hasattr(x, '__dict__'): + funcs = [o for o in x.__dict__.values() + if isinstance(o, types.MethodType) + or isinstance(o, types.FunctionType)] + if not funcs: + raise error, ("nothing bindable found in %s object" % + type(x).__name__) + for o in funcs: + bind(o, rec) + return + raise TypeError, "cannot bind %s objects" % type(x).__name__ + + +def unbind(x): + """Reverse of bind().""" + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + try: + f = _psyco.unproxycode(x.func_code) + except error: + pass + else: + x.func_code = f.func_code + return + if hasattr(x, '__dict__'): + for o in x.__dict__.values(): + if (isinstance(o, types.MethodType) + or isinstance(o, types.FunctionType)): + unbind(o) + return + raise TypeError, "cannot unbind %s objects" % type(x).__name__ + + +def proxy(x, rec=None): + """Return a Psyco-enabled copy of the function. + +The original function is still available for non-compiled calls. +The optional second argument specifies the number of recursive +compilation levels: all functions called by func are compiled +up to the given depth of indirection.""" + if isinstance(x, types.FunctionType): + if rec is None: + code = _psyco.proxycode(x) + else: + code = _psyco.proxycode(x, rec) + return new.function(code, x.func_globals, x.func_name) + if isinstance(x, types.MethodType): + p = proxy(x.im_func, rec) + return new.instancemethod(p, x.im_self, x.im_class) + raise TypeError, "cannot proxy %s objects" % type(x).__name__ + + +def unproxy(proxy): + """Return a new copy of the original function of method behind a proxy. +The result behaves like the original function in that calling it +does not trigger compilation nor execution of any compiled code.""" + if isinstance(proxy, types.FunctionType): + return _psyco.unproxycode(proxy.func_code) + if isinstance(proxy, types.MethodType): + f = unproxy(proxy.im_func) + return new.instancemethod(f, proxy.im_self, proxy.im_class) + raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__ + + +def cannotcompile(x): + """Instruct Psyco never to compile the given function, method +or code object.""" + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + x = x.func_code + if isinstance(x, types.CodeType): + _psyco.cannotcompile(x) + else: + raise TypeError, "unexpected %s object" % type(x).__name__ + + +def dumpcodebuf(): + """Write in file psyco.dump a copy of the emitted machine code, +provided Psyco was compiled with a non-zero CODE_DUMP. +See py-utils/httpxam.py to examine psyco.dump.""" + if hasattr(_psyco, 'dumpcodebuf'): + _psyco.dumpcodebuf() + + +########################################################################### +# Psyco variables +# error * the error raised by Psyco +# warning * the warning raised by Psyco +# __in_psyco__ * a new built-in variable which is always zero, but which +# Psyco special-cases by returning 1 instead. So +# __in_psyco__ can be used in a function to know if +# that function is being executed by Psyco or not. diff --git a/nodeboxgl/ext/psyco/src/py-support/kdictproxy.py b/nodeboxgl/ext/psyco/src/py-support/kdictproxy.py new file mode 100644 index 0000000..c764e5e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-support/kdictproxy.py @@ -0,0 +1,133 @@ +########################################################################### +# +# Support code for the 'psyco.compact' type. + +from __future__ import generators + +try: + from UserDict import DictMixin +except ImportError: + + # backported from Python 2.3 to Python 2.2 + class DictMixin: + # Mixin defining all dictionary methods for classes that already have + # a minimum dictionary interface including getitem, setitem, delitem, + # and keys. Without knowledge of the subclass constructor, the mixin + # does not define __init__() or copy(). In addition to the four base + # methods, progressively more efficiency comes with defining + # __contains__(), __iter__(), and iteritems(). + + # second level definitions support higher levels + def __iter__(self): + for k in self.keys(): + yield k + def has_key(self, key): + try: + value = self[key] + except KeyError: + return False + return True + def __contains__(self, key): + return self.has_key(key) + + # third level takes advantage of second level definitions + def iteritems(self): + for k in self: + yield (k, self[k]) + def iterkeys(self): + return self.__iter__() + + # fourth level uses definitions from lower levels + def itervalues(self): + for _, v in self.iteritems(): + yield v + def values(self): + return [v for _, v in self.iteritems()] + def items(self): + return list(self.iteritems()) + def clear(self): + for key in self.keys(): + del self[key] + def setdefault(self, key, default): + try: + return self[key] + except KeyError: + self[key] = default + return default + def pop(self, key, *args): + if len(args) > 1: + raise TypeError, "pop expected at most 2 arguments, got "\ + + repr(1 + len(args)) + try: + value = self[key] + except KeyError: + if args: + return args[0] + raise + del self[key] + return value + def popitem(self): + try: + k, v = self.iteritems().next() + except StopIteration: + raise KeyError, 'container is empty' + del self[k] + return (k, v) + def update(self, other): + # Make progressively weaker assumptions about "other" + if hasattr(other, 'iteritems'): # iteritems saves memory and lookups + for k, v in other.iteritems(): + self[k] = v + elif hasattr(other, '__iter__'): # iter saves memory + for k in other: + self[k] = other[k] + else: + for k in other.keys(): + self[k] = other[k] + def get(self, key, default=None): + try: + return self[key] + except KeyError: + return default + def __repr__(self): + return repr(dict(self.iteritems())) + def __cmp__(self, other): + if other is None: + return 1 + if isinstance(other, DictMixin): + other = dict(other.iteritems()) + return cmp(dict(self.iteritems()), other) + def __len__(self): + return len(self.keys()) + +########################################################################### + +from _psyco import compact + + +class compactdictproxy(DictMixin): + + def __init__(self, ko): + self._ko = ko # compact object of which 'self' is the dict + + def __getitem__(self, key): + return compact.__getslot__(self._ko, key) + + def __setitem__(self, key, value): + compact.__setslot__(self._ko, key, value) + + def __delitem__(self, key): + compact.__delslot__(self._ko, key) + + def keys(self): + return compact.__members__.__get__(self._ko) + + def clear(self): + keys = self.keys() + keys.reverse() + for key in keys: + del self[key] + + def __repr__(self): + keys = ', '.join(self.keys()) + return '' % (keys,) diff --git a/nodeboxgl/ext/psyco/src/py-support/logger.py b/nodeboxgl/ext/psyco/src/py-support/logger.py new file mode 100644 index 0000000..a3c5219 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-support/logger.py @@ -0,0 +1,96 @@ +########################################################################### +# +# Psyco logger. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco logger. + +See log() in core.py. +""" +########################################################################### + + +import _psyco +from time import time, localtime, strftime + + +current = None +print_charges = 10 +dump_delay = 0.2 +dump_last = 0.0 + +def write(s, level): + t = time() + f = t-int(t) + try: + current.write("%s.%02d %-*s%s\n" % ( + strftime("%X", localtime(int(t))), + int(f*100.0), 63-level, s, + "%"*level)) + current.flush() + except (OSError, IOError): + pass + +def psycowrite(s): + t = time() + f = t-int(t) + try: + current.write("%s.%02d %-*s%s\n" % ( + strftime("%X", localtime(int(t))), + int(f*100.0), 60, s.strip(), + "% %")) + current.flush() + except (OSError, IOError): + pass + +##def writelines(lines, level=0): +## if lines: +## t = time() +## f = t-int(t) +## timedesc = strftime("%x %X", localtime(int(t))) +## print >> current, "%s.%03d %-*s %s" % ( +## timedesc, int(f*1000), +## 50-level, lines[0], +## "+"*level) +## timedesc = " " * (len(timedesc)+5) +## for line in lines[1:]: +## print >> current, timedesc, line + +def writememory(): + write("memory usage: %d+ kb" % _psyco.memory(), 1) + +def dumpcharges(): + global dump_last + if print_charges: + t = time() + if not (dump_last <= t < dump_last+dump_delay): + if t <= dump_last+1.5*dump_delay: + dump_last += dump_delay + else: + dump_last = t + #write("%s: charges:" % who, 0) + lst = _psyco.stattop(print_charges) + if lst: + f = t-int(t) + lines = ["%s.%02d ______\n" % ( + strftime("%X", localtime(int(t))), + int(f*100.0))] + i = 1 + for co, charge in lst: + detail = co.co_filename + if len(detail) > 19: + detail = '...' + detail[-17:] + lines.append(" #%-3d |%4.1f %%| %-26s%20s:%d\n" % + (i, charge*100.0, co.co_name, detail, + co.co_firstlineno)) + i += 1 + current.writelines(lines) + current.flush() + +def writefinalstats(): + dumpcharges() + writememory() + writedate("program exit") + +def writedate(msg): + write('%s, %s' % (msg, strftime("%x")), 20) diff --git a/nodeboxgl/ext/psyco/src/py-support/profiler.py b/nodeboxgl/ext/psyco/src/py-support/profiler.py new file mode 100644 index 0000000..ef7bf8e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-support/profiler.py @@ -0,0 +1,388 @@ +########################################################################### +# +# Psyco profiler (Python part). +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco profiler (Python part). + +The implementation of the non-time-critical parts of the profiler. +See profile() and full() in core.py for the easy interface. +""" +########################################################################### + +import _psyco +from support import * +import math, time, types, atexit +now = time.time +try: + import thread +except ImportError: + import dummy_thread as thread + + +# current profiler instance +current = None + +# enabled profilers, in order of priority +profilers = [] + +# logger module (when enabled by core.log()) +logger = None + +# a lock for a thread-safe go() +go_lock = thread.allocate_lock() + +def go(stop=0): + # run the highest-priority profiler in 'profilers' + global current + go_lock.acquire() + try: + prev = current + if stop: + del profilers[:] + if prev: + if profilers and profilers[0] is prev: + return # best profiler already running + prev.stop() + current = None + for p in profilers[:]: + if p.start(): + current = p + if logger: # and p is not prev: + logger.write("%s: starting" % p.__class__.__name__, 5) + return + finally: + go_lock.release() + # no profiler is running now + if stop: + if logger: + logger.writefinalstats() + else: + tag2bind() + +atexit.register(go, 1) + + +def buildfncache(globals, cache): + if hasattr(types.IntType, '__dict__'): + clstypes = (types.ClassType, types.TypeType) + else: + clstypes = types.ClassType + for x in globals.values(): + if isinstance(x, types.MethodType): + x = x.im_func + if isinstance(x, types.FunctionType): + cache[x.func_code] = x, '' + elif isinstance(x, clstypes): + for y in x.__dict__.values(): + if isinstance(y, types.MethodType): + y = y.im_func + if isinstance(y, types.FunctionType): + cache[y.func_code] = y, x.__name__ + +# code-to-function mapping (cache) +function_cache = {} + +def trytobind(co, globals, log=1): + try: + f, clsname = function_cache[co] + except KeyError: + buildfncache(globals, function_cache) + try: + f, clsname = function_cache[co] + except KeyError: + if logger: + logger.write('warning: cannot find function %s in %s' % + (co.co_name, globals.get('__name__', '?')), 3) + return # give up + if logger and log: + modulename = globals.get('__name__', '?') + if clsname: + modulename += '.' + clsname + logger.write('bind function: %s.%s' % (modulename, co.co_name), 1) + f.func_code = _psyco.proxycode(f) + + +if PYTHON_SUPPORT: + # the list of code objects that have been tagged + tagged_codes = [] + + def tag(co, globals): + if logger: + try: + f, clsname = function_cache[co] + except KeyError: + buildfncache(globals, function_cache) + try: + f, clsname = function_cache[co] + except KeyError: + clsname = '' # give up + modulename = globals.get('__name__', '?') + if clsname: + modulename += '.' + clsname + logger.write('tag function: %s.%s' % (modulename, co.co_name), 1) + tagged_codes.append((co, globals)) + _psyco.turbo_frame(co) + _psyco.turbo_code(co) + + def tag2bind(): + if tagged_codes: + if logger: + logger.write('profiling stopped, binding %d functions' % + len(tagged_codes), 2) + for co, globals in tagged_codes: + trytobind(co, globals, 0) + function_cache.clear() + del tagged_codes[:] + +else: + # tagging is impossible, always bind + tag = trytobind + def tag2bind(): + pass + + + +class Profiler: + MemoryTimerResolution = 0.103 + + def run(self, memory, time, memorymax, timemax): + self.memory = memory + self.memorymax = memorymax + self.time = time + if timemax is None: + self.endtime = None + else: + self.endtime = now() + timemax + self.alarms = [] + profilers.append(self) + go() + + def start(self): + curmem = _psyco.memory() + memlimits = [] + if self.memorymax is not None: + if curmem >= self.memorymax: + if logger: + logger.writememory() + return self.limitreached('memorymax') + memlimits.append(self.memorymax) + if self.memory is not None: + if self.memory <= 0: + if logger: + logger.writememory() + return self.limitreached('memory') + memlimits.append(curmem + self.memory) + self.memory_at_start = curmem + + curtime = now() + timelimits = [] + if self.endtime is not None: + if curtime >= self.endtime: + return self.limitreached('timemax') + timelimits.append(self.endtime - curtime) + if self.time is not None: + if self.time <= 0.0: + return self.limitreached('time') + timelimits.append(self.time) + self.time_at_start = curtime + + try: + self.do_start() + except error, e: + if logger: + logger.write('%s: disabled by psyco.error:' % ( + self.__class__.__name__), 4) + logger.write(' %s' % str(e), 3) + return 0 + + if memlimits: + self.memlimits_args = (time.sleep, (self.MemoryTimerResolution,), + self.check_memory, (min(memlimits),)) + self.alarms.append(_psyco.alarm(*self.memlimits_args)) + if timelimits: + self.alarms.append(_psyco.alarm(time.sleep, (min(timelimits),), + self.time_out)) + return 1 + + def stop(self): + for alarm in self.alarms: + alarm.stop(0) + for alarm in self.alarms: + alarm.stop(1) # wait for parallel threads to stop + del self.alarms[:] + if self.time is not None: + self.time -= now() - self.time_at_start + if self.memory is not None: + self.memory -= _psyco.memory() - self.memory_at_start + + try: + self.do_stop() + except error: + return 0 + return 1 + + def check_memory(self, limit): + if _psyco.memory() < limit: + return self.memlimits_args + go() + + def time_out(self): + self.time = 0.0 + go() + + def limitreached(self, limitname): + try: + profilers.remove(self) + except ValueError: + pass + if logger: + logger.write('%s: disabled (%s limit reached)' % ( + self.__class__.__name__, limitname), 4) + return 0 + + +class FullCompiler(Profiler): + + def do_start(self): + _psyco.profiling('f') + + def do_stop(self): + _psyco.profiling('.') + + +class RunOnly(Profiler): + + def do_start(self): + _psyco.profiling('n') + + def do_stop(self): + _psyco.profiling('.') + + +class ChargeProfiler(Profiler): + + def __init__(self, watermark, parentframe): + self.watermark = watermark + self.parent2 = parentframe * 2.0 + self.lock = thread.allocate_lock() + + def init_charges(self): + _psyco.statwrite(watermark = self.watermark, + parent2 = self.parent2) + + def do_stop(self): + _psyco.profiling('.') + _psyco.statwrite(callback = None) + + +class ActiveProfiler(ChargeProfiler): + + def active_start(self): + _psyco.profiling('p') + + def do_start(self): + self.init_charges() + self.active_start() + _psyco.statwrite(callback = self.charge_callback) + + def charge_callback(self, frame, charge): + tag(frame.f_code, frame.f_globals) + + +class PassiveProfiler(ChargeProfiler): + + initial_charge_unit = _psyco.statread('unit') + reset_stats_after = 120 # half-lives (maximum 200!) + reset_limit = initial_charge_unit * (2.0 ** reset_stats_after) + + def __init__(self, watermark, halflife, pollfreq, parentframe): + ChargeProfiler.__init__(self, watermark, parentframe) + self.pollfreq = pollfreq + # self.progress is slightly more than 1.0, and computed so that + # do_profile() will double the change_unit every 'halflife' seconds. + self.progress = 2.0 ** (1.0 / (halflife * pollfreq)) + + def reset(self): + _psyco.statwrite(unit = self.initial_charge_unit, callback = None) + _psyco.statreset() + if logger: + logger.write("%s: resetting stats" % self.__class__.__name__, 1) + + def passive_start(self): + self.passivealarm_args = (time.sleep, (1.0 / self.pollfreq,), + self.do_profile) + self.alarms.append(_psyco.alarm(*self.passivealarm_args)) + + def do_start(self): + tag2bind() + self.init_charges() + self.passive_start() + + def do_profile(self): + _psyco.statcollect() + if logger: + logger.dumpcharges() + nunit = _psyco.statread('unit') * self.progress + if nunit > self.reset_limit: + self.reset() + else: + _psyco.statwrite(unit = nunit, callback = self.charge_callback) + return self.passivealarm_args + + def charge_callback(self, frame, charge): + trytobind(frame.f_code, frame.f_globals) + + +class ActivePassiveProfiler(PassiveProfiler, ActiveProfiler): + + def do_start(self): + self.init_charges() + self.active_start() + self.passive_start() + + def charge_callback(self, frame, charge): + tag(frame.f_code, frame.f_globals) + + + +# +# we register our own version of sys.settrace(), sys.setprofile() +# and thread.start_new_thread(). +# + +def psyco_settrace(*args, **kw): + "This is the Psyco-aware version of sys.settrace()." + result = original_settrace(*args, **kw) + go() + return result + +def psyco_setprofile(*args, **kw): + "This is the Psyco-aware version of sys.setprofile()." + result = original_setprofile(*args, **kw) + go() + return result + +def psyco_thread_stub(callable, args, kw): + _psyco.statcollect() + if kw is None: + return callable(*args) + else: + return callable(*args, **kw) + +def psyco_start_new_thread(callable, args, kw=None): + "This is the Psyco-aware version of thread.start_new_thread()." + return original_start_new_thread(psyco_thread_stub, (callable, args, kw)) + +original_settrace = sys.settrace +original_setprofile = sys.setprofile +original_start_new_thread = thread.start_new_thread +sys.settrace = psyco_settrace +sys.setprofile = psyco_setprofile +if PYTHON_SUPPORT: + thread.start_new_thread = psyco_start_new_thread + # hack to patch threading._start_new_thread if the module is + # already loaded + if (sys.modules.has_key('threading') and + hasattr(sys.modules['threading'], '_start_new_thread')): + sys.modules['threading']._start_new_thread = psyco_start_new_thread diff --git a/nodeboxgl/ext/psyco/src/py-support/support.py b/nodeboxgl/ext/psyco/src/py-support/support.py new file mode 100644 index 0000000..a61224e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-support/support.py @@ -0,0 +1,193 @@ +########################################################################### +# +# Psyco general support module. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco general support module. + +For internal use. +""" +########################################################################### + +import sys, _psyco, __builtin__ + +error = _psyco.error +class warning(Warning): + pass + +_psyco.NoLocalsWarning = warning + +def warn(msg): + from warnings import warn + warn(msg, warning, stacklevel=2) + +# +# Version checks +# +__version__ = 0x010502f0 +if _psyco.PSYVER != __version__: + raise error, "version mismatch between Psyco parts, reinstall it" + +version_info = (__version__ >> 24, + (__version__ >> 16) & 0xff, + (__version__ >> 8) & 0xff, + {0xa0: 'alpha', + 0xb0: 'beta', + 0xc0: 'candidate', + 0xf0: 'final'}[__version__ & 0xf0], + __version__ & 0xf) + + +VERSION_LIMITS = [0x02020200, # 2.2.2 + 0x02030000, # 2.3 + 0x02040000] # 2.4 + +if ([v for v in VERSION_LIMITS if v <= sys.hexversion] != + [v for v in VERSION_LIMITS if v <= _psyco.PYVER ]): + if sys.hexversion < VERSION_LIMITS[0]: + warn("Psyco requires Python version 2.2.2 or later") + else: + warn("Psyco version does not match Python version. " + "Psyco must be updated or recompiled") + +PYTHON_SUPPORT = hasattr(_psyco, 'turbo_code') + + +if hasattr(_psyco, 'ALL_CHECKS') and hasattr(_psyco, 'VERBOSE_LEVEL'): + print >> sys.stderr, ('psyco: running in debugging mode on %s' % + _psyco.PROCESSOR) + + +########################################################################### +# sys._getframe() gives strange results on a mixed Psyco- and Python-style +# stack frame. Psyco provides a replacement that partially emulates Python +# frames from Psyco frames. The new sys._getframe() may return objects of +# a custom "Psyco frame" type, which is a subtype of the normal frame type. +# +# The same problems require some other built-in functions to be replaced +# as well. Note that the local variables are not available in any +# dictionary with Psyco. + + +class Frame: + pass + + +class PythonFrame(Frame): + + def __init__(self, frame): + self.__dict__.update({ + '_frame': frame, + }) + + def __getattr__(self, attr): + if attr == 'f_back': + try: + result = embedframe(_psyco.getframe(self._frame)) + except ValueError: + result = None + except error: + warn("f_back is skipping dead Psyco frames") + result = self._frame.f_back + self.__dict__['f_back'] = result + return result + else: + return getattr(self._frame, attr) + + def __setattr__(self, attr, value): + setattr(self._frame, attr, value) + + def __delattr__(self, attr): + delattr(self._frame, attr) + + +class PsycoFrame(Frame): + + def __init__(self, tag): + self.__dict__.update({ + '_tag' : tag, + 'f_code' : tag[0], + 'f_globals': tag[1], + }) + + def __getattr__(self, attr): + if attr == 'f_back': + try: + result = embedframe(_psyco.getframe(self._tag)) + except ValueError: + result = None + elif attr == 'f_lineno': + result = self.f_code.co_firstlineno # better than nothing + elif attr == 'f_builtins': + result = self.f_globals['__builtins__'] + elif attr == 'f_restricted': + result = self.f_builtins is not __builtins__ + elif attr == 'f_locals': + raise AttributeError, ("local variables of functions run by Psyco " + "cannot be accessed in any way, sorry") + else: + raise AttributeError, ("emulated Psyco frames have " + "no '%s' attribute" % attr) + self.__dict__[attr] = result + return result + + def __setattr__(self, attr, value): + raise AttributeError, "Psyco frame objects are read-only" + + def __delattr__(self, attr): + if attr == 'f_trace': + # for bdb which relies on CPython frames exhibiting a slightly + # buggy behavior: you can 'del f.f_trace' as often as you like + # even without having set it previously. + return + raise AttributeError, "Psyco frame objects are read-only" + + +def embedframe(result): + if type(result) is type(()): + return PsycoFrame(result) + else: + return PythonFrame(result) + +def _getframe(depth=0): + """Return a frame object from the call stack. This is a replacement for +sys._getframe() which is aware of Psyco frames. + +The returned objects are instances of either PythonFrame or PsycoFrame +instead of being real Python-level frame object, so that they can emulate +the common attributes of frame objects. + +The original sys._getframe() ignoring Psyco frames altogether is stored in +psyco._getrealframe(). See also psyco._getemulframe().""" + # 'depth+1' to account for this _getframe() Python function + return embedframe(_psyco.getframe(depth+1)) + +def _getemulframe(depth=0): + """As _getframe(), but the returned objects are real Python frame objects +emulating Psyco frames. Some of their attributes can be wrong or missing, +however.""" + # 'depth+1' to account for this _getemulframe() Python function + return _psyco.getframe(depth+1, 1) + +def patch(name, module=__builtin__): + f = getattr(_psyco, name) + org = getattr(module, name) + if org is not f: + setattr(module, name, f) + setattr(_psyco, 'original_' + name, org) + +_getrealframe = sys._getframe +sys._getframe = _getframe +patch('globals') +patch('eval') +patch('execfile') +patch('locals') +patch('vars') +patch('dir') +patch('input') +_psyco.original_raw_input = raw_input +__builtin__.__in_psyco__ = 0==1 # False + +if hasattr(_psyco, 'compact'): + import kdictproxy + _psyco.compactdictproxy = kdictproxy.compactdictproxy diff --git a/nodeboxgl/ext/psyco/src/py-utils/cvs.py b/nodeboxgl/ext/psyco/src/py-utils/cvs.py new file mode 100644 index 0000000..a37bc93 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/cvs.py @@ -0,0 +1,116 @@ +import sys, os + +def data2unix(lines): + data = [] + modif = 0 + for line in lines: + line1 = line.replace('\r', '') + modif = modif + (line!=line1) + data.append(line1) + return data, modif + +def data2win(lines): + data = [] + modif = 0 + for line in lines: + if line[-1:] == '\n': + line1 = line[:-1].replace('\r', '') + '\r\n' + modif = modif + (line!=line1) + data.append(line1) + return data, modif + +def file2unix(name, verbose=1): + "Turn a file's end-of-line into Unix flavor without changing the timestamp." + s = os.stat(name) + f = open(name, 'rb') + data, modif = data2unix(f) + f.close() + if modif: + if verbose: + print "Unix'ed %d lines in %s" % (modif, name) + f = open(name, 'wb') + f.writelines(data) + f.close() + os.utime(name, (s.st_atime, s.st_mtime)) + return modif + +def file2win(name, verbose=1): + "Turn a file's end-of-line into Windows flavor without changing the timestamp." + s = os.stat(name) + f = open(name, 'rb') + data, modif = data2win(f) + f.close() + if modif: + if verbose: + print "Win'ed %d lines in %s" % (modif, name) + f = open(name, 'wb') + f.writelines(data) + f.close() + os.utime(name, (s.st_atime, s.st_mtime)) + return modif + +class Directory: + def __init__(self, srcpath, relpath=''): + self.path = srcpath + self.relpath = relpath + self.subdirs = [] + self.fileinfo = {} + entryname = os.path.join(srcpath, 'CVS', 'Entries') + try: + f = open(entryname, 'r') + except IOError: + print >> sys.stderr, "note: cannot read", entryname + return + lines = f.readlines() + f.close() + entryname2 = os.path.join(srcpath, 'CVS', 'Entries.Log') + try: + f = open(entryname2, 'r') + except IOError: + pass + else: + for line in f.readlines(): + if line[:2] == 'A ': + lines.append(line[2:]) + elif line[:2] == 'R ': + lines.remove(line[2:]) + f.close() + for line in lines: + line = line.split('/') + if len(line) >= 6: + fname1 = line[1] + if 'D' in line[0]: + self.subdirs.append(fname1) + else: + self.fileinfo[fname1] = line + def subdir(self, name): + return Directory(os.path.join(self.path, name), + os.path.join(self.relpath, name)) + def alldirs(self): + result = [self] + for name in self.subdirs: + result += self.subdir(name).alldirs() + return result + def unknownfiles(self): + try: + return [filename for filename in os.listdir(self.path) + if not self.fileinfo.has_key(filename) and + filename not in self.subdirs and + filename != 'CVS'] + except OSError: + return [] + + +if __name__ == '__main__': + # print the full name of all the files + root = Directory('.') + for dir in root.alldirs(): + for name, info in dir.fileinfo.items(): + print os.path.join(dir.path, name) + +## # Example: print the full name of the files with revision 1.1.1.1 +## root = Directory('.') +## for dir in root.alldirs(): +## for name, info in dir.fileinfo.items(): +## if info[2] == '1.1.1.1': +## print os.path.join(dir.path, name) diff --git a/nodeboxgl/ext/psyco/src/py-utils/httpxam.py b/nodeboxgl/ext/psyco/src/py-utils/httpxam.py new file mode 100644 index 0000000..e60a5ca --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/httpxam.py @@ -0,0 +1,448 @@ +import sys, re, cStringIO, os, dis, types, struct +import xam, psyco +from SimpleHTTPServer import SimpleHTTPRequestHandler, test + +# +# Adapted from SimpleHTTPServer.py. +# + +def show_vinfos(array, d, co=None, path=[]): + text = "
    " + for i in range(len(array)): + vi = array[i] + text += "
  1. " + if hasattr(co, 'co_code') and path == []: + j = i - xam.LOC_LOCALS_PLUS + if 0 <= j < len(co.co_varnames): + text += "(%s):\t" % co.co_varnames[j] + #if name is not None: + # text += "%s " % name + if vi is None: + text += "[NULL]" + else: + text += "[%x] %s" % (vi.addr, vi.gettext()) + if d.has_key(vi.addr): + text += " (already seen above)" + else: + d[vi.addr] = 1 + if vi.array: + text += show_vinfos(vi.array, d, co, path+[i]) + text += '
  2. \n' + text += '
\n' + return text + +def summary_vinfos(array, d, path=[]): + text = '' + indent = ' ' * len(path) + for i in range(len(array)): + vi = array[i] + text += indent + if vi is None: + text += "[NULL]\n" + else: + text += "%d. %s" % (i, vi.getsummarytext()) + if d.has_key(vi.addr): + text += " (already seen above)" + else: + d[vi.addr] = 1 + text += '\n' + if vi.array: + text += summary_vinfos(vi.array, d, path+[i]) + return text + +def find4(f, s4): + result = [] + while 1: + base = f.tell() + buffer = f.read(8192) + if not buffer: + return result + p = -1 + while 1: + p = buffer.find(s4, p+1) + if p<0: + break + if not (p&3): + result.append(base + p) + +re_codebuf = re.compile(r'[/]0x([0-9A-Fa-f]+)$') +re_proxy = re.compile(r'[/]proxy(\d+)$') +re_summary = re.compile(r'[/]summary(\d+)$') +re_trace = re.compile(r'[/]trace0x([0-9A-Fa-f]+)$') +re_traces = re.compile(r'[/]traces0x([0-9A-Fa-f]+)$') +re_trlist = re.compile(r'[/]trace0x([0-9A-Fa-f]+)[-]0x([0-9A-Fa-f]+)$') + +##def cache_load(filename, cache={}): +## try: +## return cache[filename] +## except KeyError: +## data = {} +## try: +## f = execfile(filename, data) +## except: +## data = None +## cache[filename] = data +## return data + +def cache_load(filename, codename, cache={}): + try: + modulecode = cache[filename] + except KeyError: + source = None + try: + f = open(filename, 'rU') + source = f.read() + f.close() + modulecode = compile(source, filename, 'exec') + except Exception, e: + print repr(source) + print '*** While loading %s:' % (filename,) + import traceback + traceback.print_exc() + return None + + return recfindcode(modulecode, codename) + +def recfindcode(code, codename): + if code.co_name == codename: + return code + else: + for c in code.co_consts: + if type(c) is type(code): + result = recfindcode(c, codename) + if result: + return result + return '' + + +class CodeBufHTTPHandler(SimpleHTTPRequestHandler): + + def symhtml(self, sym, addr, inbuf=None, lineaddr=None): + text = xam.symtext(sym, addr, inbuf, lineaddr) + if isinstance(sym, xam.CodeBuf): + if addr == sym.addr: + name = '' + else: + name = '#0x%x' % addr + text = "%s" % (sym.addr, name, text) + if addr == lineaddr: + text += "\ttraces" % addr + return text + + def linehtml(self, line, addr): + line = "%s" % (addr, line) + if addr in self.trace_addr: + line = "%s" % line + i = self.trace_addr.index(addr) + if i == 0 and self.trace_prev is not None: + line += ("\t<<<<<" % + self.trace_prev) + if i == len(self.trace_addr)-1 and self.trace_next is not None: + line += ("\t>>>>>" % + self.trace_next) + return line + + def proxyhtml(self, proxy): + return "(snapshot %s:%s)\n" % ( + codebufs.index(proxy), proxy.co_name, proxy.get_next_instr()) + + def htmlpage(self, title, data): + return ('%s\n' % title + + '

%s

\n' % title + # + '
\n' + + data + + '
\n') + + def bufferpage(self, codebuf): + rev = {} + for o, c in codebuf.reverse_lookup: + if c is not codebuf: + rev[c] = rev.get(c,0) + 1 + if rev: + data = '

Other code buffers pointing to this one:

    \n' + for c in codebufs: # display them in original load order + if rev.has_key(c): + if rev[c] == 1: + extra = '' + else: + extra = '\t(%d times)' % rev[c] + data += '
  • %s\t(%d bytes)%s
  • \n' % \ + (self.symhtml(c, c.addr), + len(c.data), + extra) + data += '
\n' + else: + data = '

No other code buffer points to this one.

\n' + data += '
\n' + data += '
%s
\n' % codebuf.disassemble(self.symhtml, + self.linehtml, + self.proxyhtml) + data += "
Back to the list of code objects\n" + if codebuf.co_name: + data = '

Code object %s from file %s, at position %s

%s' % ( + codebuf.co_name, codebuf.co_filename, codebuf.get_next_instr(), + data) + return data + + def try_hard_to_name(self, addr): + def result(codebuf): + return '%s:%s:%s' % (codebuf.co_filename, codebuf.co_name, + codebuf.get_next_instr()) + codebuf = xam.codeat(addr) + if codebuf is not None: + codemap = codebuf.codemap + proxylist = [] + for lineaddr in range(addr, codebuf.addr-1, -1): + if codemap.has_key(lineaddr): + for proxy in codemap[lineaddr]: + if proxy.co_name: + return result(proxy) + if codebuf.co_name: + return result(codebuf) + else: + return '?' + + def send_head(self): + global codebufs # CT + self.trace_prev = None + self.trace_next = None + self.trace_addr = () + + if self.path == '/' or self.path == '/all': + all = self.path == '/all' + if all: + title = 'List of ALL code objects' + else: + title = 'List of all named code objects' + data = ['
    '] + named = 0 + proxies = 0 + for codebuf in codebufs: + if codebuf.data and codebuf.co_name: + named += 1 + else: + if not codebuf.data: + proxies += 1 + if not all: + continue + data.append('
  • %s:\t%s:\t%s:\t%s\t(%d bytes)
  • \n' % ( + codebuf.co_filename, codebuf.co_name, + codebuf.get_next_instr(), + self.symhtml(codebuf, codebuf.addr), + len(codebuf.data))) + data.append('
\n') + data.append('
%d named buffers; ' % named + + '%d buffers in total, ' % len(codebufs) + + 'including %d proxies' % proxies) + data = ''.join(data) + return self.donepage(title, data) + + match = re_codebuf.match(self.path) + if match: + addr = long(match.group(1), 16) + codebuf = xam.codeat(addr) + if not codebuf: + self.send_error(404, "No code buffer at this address") + return None + if codebuf.addr != addr: + self.trace_addr = [addr] + title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), + codebuf.addr) + data = self.bufferpage(codebuf) + return self.donepage(title, data) + + match = re_trace.match(self.path) + if match: + tracepos = int(match.group(1), 16) + f = open(tracefilename, 'rb') + try: + def traceat(p, f=f): + f.seek(p) + data = f.read(4) + if len(data) == 4: + addr, = struct.unpack('L', data) + return addr + else: + raise IOError + addr = traceat(tracepos) + codebuf = xam.codeat(addr) + if not codebuf: + self.send_error(404, "No code buffer at 0x%x" % addr) + return None + start = codebuf.addr + end = start + len(codebuf.data) + while tracepos > 0: + addr1 = traceat(tracepos-4) + if not (start <= addr1 < addr): + break + tracepos -= 4 + addr = addr1 + self.trace_prev = tracepos-4 + self.trace_addr = [] + while 1: + self.trace_addr.append(addr) + addr1 = traceat(tracepos+4) + if not (addr < addr1 < end): + break + tracepos += 4 + addr = addr1 + self.trace_next = tracepos+4 + finally: + f.close() + title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), + codebuf.addr) + data = self.bufferpage(codebuf) + return self.donepage(title, data) + + match = re_traces.match(self.path) + if match: + traceaddr = long(match.group(1), 16) + f = open(tracefilename, 'rb') + plist = find4(f, struct.pack('L', traceaddr)) + f.close() + title = 'Traces through 0x%x' % traceaddr + data = ['
    '] + for p in plist: + data.append("
  • 0x%x\n" % (p, p)) + data.append('
') + data = ''.join(data) + return self.donepage(title, data) + + match = re_trlist.match(self.path) + if match: + start = int(match.group(1), 16) + end = int(match.group(2), 16) + title = 'Traces timed 0x%x to 0x%x' % (start, end) + data = ["

<<<<

\n" % + (start-(end-start), start), + '
    '] + f = open(tracefilename, 'rb') + f.seek(start) + prevname = None + for p in range(start, end, 4): + addr, = struct.unpack('L', f.read(4)) + s = self.try_hard_to_name(addr) + if s == prevname: + continue + data.append("
  • 0x%x: %s\n" % (p,p,s)) + prevname = s + data.append('
') + data.append( + "

>>>>

\n" % + (end, end+(end-start))) + f.close() + data = ''.join(data) + return self.donepage(title, data) + + match = re_proxy.match(self.path) + if match: + title = 'Snapshot' + n = int(match.group(1)) + proxy = codebufs[n] + for n1 in xrange(n-1, -1, -1): + pprev = codebufs[n1] + if (pprev.nextinstr == proxy.nextinstr and + pprev.co_name == proxy.co_name and + pprev.co_filename == proxy.co_filename): + pprev = n1 + break + else: + pprev = None + for n1 in xrange(n+1, len(codebufs)): + pnext = codebufs[n1] + if (pnext.nextinstr == proxy.nextinstr and + pnext.co_name == proxy.co_name and + pnext.co_filename == proxy.co_filename): + pnext = n1 + break + else: + pnext = None + filename = os.path.join(DIRECTORY, proxy.co_filename) + co = cache_load(filename, proxy.co_name) + data = '

PsycoObject structure at this point:' + data += ' ' * 20 + data += '[' + data += '  summary  ' % n + if pprev is not None or pnext is not None: + if pprev is not None: + data += '  <<< previous  ' % pprev + if pnext is not None: + data += '  next >>>  ' % pnext + data += ']' + data += '

\n' + data += show_vinfos(proxy.vlocals, {}, co) + data += '

Disassembly of %s:%s:%s:

\n' % ( + proxy.co_filename, proxy.co_name, proxy.get_next_instr()) + if co is None: #moduledata is None: + txt = "(exception while loading the file '%s')\n" % ( + filename) + else: + if not hasattr(co, 'co_code'): + txt = "(no function object '%s' in file '%s')\n" % ( + proxy.co_name, filename) + else: + txt = cStringIO.StringIO() + oldstdout = sys.stdout + try: + sys.stdout = txt + dis.disassemble(co, proxy.get_next_instr()) + finally: + sys.stdout = oldstdout + txt = txt.getvalue() + data += '
%s
\n' % txt + data += "
Back\n" % proxy.addr + return self.donepage(title, data) + + match = re_summary.match(self.path) + if match: + n = int(match.group(1)) + proxy = codebufs[n] + data = summary_vinfos(proxy.vlocals, {}) + f = cStringIO.StringIO(data) + self.send_response(200) + self.send_header("Content-type", "text/plain") + self.end_headers() + return f + + if self.path == '/checkall': + for codebuf in codebufs: + codebuf.cache_text + f = cStringIO.StringIO('done') + self.send_response(200) + self.send_header("Content-type", "text/plain") + self.end_headers() + return f + + ## CT: simple reload feature + if self.path == "/reload": + codebufs = xam.readdump(FILENAME) + self.path = "/all" + return self.send_head() + + self.send_error(404, "Invalid path") + return None + + def donepage(self, title, data): + f = cStringIO.StringIO(self.htmlpage(title, data)) + self.send_response(200) + self.send_header("Content-type", "text/html") + self.end_headers() + return f + + +if __name__ == '__main__': + if len(sys.argv) <= 1: + print "Usage: python httpxam.py " + print " psyco.dump and any .py files containing code objects" + print " are loaded from the ." + sys.exit(1) + DIRECTORY = sys.argv[1] + del sys.argv[1] + filename = os.path.join(DIRECTORY, 'psyco.dump') + if not os.path.isfile(filename) and os.path.isfile(DIRECTORY): + filename = DIRECTORY + DIRECTORY = os.path.dirname(DIRECTORY) + tracefilename = os.path.join(DIRECTORY, 'psyco.trace') + codebufs = xam.readdump(filename) + FILENAME = filename # CT hack + test(CodeBufHTTPHandler) diff --git a/nodeboxgl/ext/psyco/src/py-utils/ivmdump.py b/nodeboxgl/ext/psyco/src/py-utils/ivmdump.py new file mode 100644 index 0000000..3ace03a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/ivmdump.py @@ -0,0 +1,110 @@ +import sys, os +from struct import unpack, calcsize, error + + +class argtypes: + char = "b", "0x%x" + byte = code_t = "B", "0x%x" + int = "i", "0x%x" + long = word_t = "l", "0x%x" + def stack(t): + if isinstance(t, tuple): + return t[0], "[%d]" + else: + return "", "[%s]" % t, t + def indirect(t): + return t + +fn = os.path.join(os.path.dirname(__file__), '../c/ivm/prolog/insns-table.py') +execfile(fn, argtypes.__dict__, globals()) + + +class Mode: + + def __init__(self, opcode): + self.opcode = opcode + if opcode in insntable: + self.insns = insntable[opcode] + else: + self.insns = [("<%d>" % opcode,)] + if len(self.insns) == 1: + self.singleinsn = self.insns[0][0] + else: + self.singleinsn = None + self.stackpushes = stackpushes.get(opcode) + self.unpackfmt = "=" + self.template = "" + self.constantargs = [] + i = 0 + line = '%10x\t' + for insn in self.insns: + args = [] + for arg in insn[1:]: + if isinstance(arg, tuple): + self.unpackfmt += arg[0] + args.append(arg[1]) + if len(arg)>2: + self.constantargs.append((i, arg[2])) + else: + args.append(str(arg)) + self.constantargs.append((i, arg)) + i += 1 + line += '%-11s %s' % (insn[0], ', '.join(args)) + self.template += line + line = '\n \t' + self.unpacksize = calcsize(self.unpackfmt) + + def dump(self, data, address, position): + data = data[position:position+self.unpacksize] + args = unpack(self.unpackfmt, data) + result = self.template % ((address,) + args) + return position+self.unpacksize, result.split('\n'), args + + def getargs(self, data, position): + data = data[position:position+self.unpacksize] + args = list(unpack(self.unpackfmt, data)) + for i, value in self.constantargs: + args.insert(i, value) + return args + +insnlist = [Mode(opcode) for opcode in range(256)] + + +def dump(data, originaddr): + l = len(data) + if l>8 and data[-4:] == '\x00\x00\x00\x00': + p, = unpack("l", data[-8:-4]) + queue = ["", " (promotion chained list: 0x%x)" % p] + l -= 4 + else: + queue = [] + depth = None + result = [] + p = 0 + try: + while p < l: + mode = insnlist[ord(data[p])] + p, lines, args = mode.dump(data, originaddr+p, p+1) + if depth is not None: + if mode.stackpushes is None: + depth = None + else: + depth += mode.stackpushes + lines[-1] = '%-40s [%d]' % (lines[-1], depth) + if mode.singleinsn == 'assertdepth': + asserteddepth = args[0]/4 + if depth is not None and asserteddepth != depth: + err = '************* assertion error **************' + lines.append(err) + print >> sys.stderr, err + print >> sys.stderr, originaddr + else: + lines = [(s+' ')[:s.find('assertdepth')] for s in lines] + depth = asserteddepth + result += lines + except error: + while p < l: + result.append(" %10x\t<%d>" % (originaddr+p, ord(data[p]))) + p += 1 + result += queue + return result diff --git a/nodeboxgl/ext/psyco/src/py-utils/ivmextract.py b/nodeboxgl/ext/psyco/src/py-utils/ivmextract.py new file mode 100644 index 0000000..12c67a3 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/ivmextract.py @@ -0,0 +1,73 @@ +import os, sys +import xam +from ivmdump import insnlist, insntable, stackpushes, chainable +from struct import unpack + + +IGNORE_INSNS = ('assertdepth', 'dynamicfreq') + +def dump(data): + l = len(data) + p = 0 + results = [] + result = [] + freq = 1 + while p < l: + mode = insnlist[ord(data[p])] + if mode.opcode not in insntable: + break + p += mode.unpacksize + 1 + if p > l: + break + args = mode.getargs(data, p-mode.unpacksize) + for insn in mode.insns: + if insn[0] in IGNORE_INSNS: + if insn[0] == 'dynamicfreq': + freq = args[0] + continue + a = len(insn)-1 + if a: + txt = '%s(%s)' % (insn[0], ','.join(map(str,args[:a]))) + del args[:a] + else: + txt = insn[0] + result.append(txt) + if mode.opcode not in chainable: + results.append((freq, result)) + result = [] + results.append((freq, result)) + return results + + +def main(DIRECTORY): + filename = os.path.join(DIRECTORY, 'psyco.dump') + if not os.path.isfile(filename) and os.path.isfile(DIRECTORY): + filename = DIRECTORY + DIRECTORY = os.path.dirname(DIRECTORY) + outfilename = filename + '.ivm' + if os.path.isfile(filename): + codebufs = xam.readdump(filename) + f = open(outfilename, 'w') + for codebuf in codebufs: + if codebuf.data: + data, addr, next, key = codebuf.splitheader() + for freq, lst in dump(data): + if len(lst) > 1: + print >> f, 'psycodump(%d, [%s]).' % (freq, + ', '.join(lst)) + f.close() + elif not os.path.isfile(outfilename): + print >> sys.stderr, filename, "not found." + sys.exit(1) + else: + print >> sys.stderr, "reusing text dump from", outfilename + return outfilename + + +if __name__ == '__main__': + if len(sys.argv) <= 1: + print "Usage: python ivmextract.py " + print " psyco.dump is loaded from the ." + sys.exit(2) + for dir in sys.argv[1:]: + print "'%s'." % main(dir) diff --git a/nodeboxgl/ext/psyco/src/py-utils/ivmoptimize.py b/nodeboxgl/ext/psyco/src/py-utils/ivmoptimize.py new file mode 100644 index 0000000..fd5a916 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/ivmoptimize.py @@ -0,0 +1,61 @@ +""" +python ivmoptimize.py path [ path ... ] + +This script optimizes and regenerates the 'ivm' virtual machine +used by Psyco on non-i386 platforms. You need to compile Psyco +in debugging mode (see below) and use 'psyco.dumpcodebuf()' to +generate one or more dump files called 'psyco.dump'. Run then +the present script with the path(s) to the 'psyco.dump' file(s). +Finally, you have to recompile Psyco in normal (optimized) mode. + +You need SWI Prolog to do that. http://www.swi-prolog.org/ + +To compile Psyco in debugging mode, create a file 'preferences.py' +in the same directory as 'setup.py' with the following content: + +PROCESSOR = 'ivm' +PSYCO_DEBUG = 1 +VERBOSE_LEVEL = 1 +CODE_DUMP = 1 + +and re-run 'python setup.py build -f install'. +""" +import sys, os +import ivmextract + +try: + LOCALDIR = __file__ +except NameError: + LOCALDIR = sys.argv[0] +LOCALDIR = os.path.dirname(LOCALDIR) + + +def main(paths, maxlength=8, optmode='optimize.pl'): + outfilenames = [os.path.abspath(ivmextract.main(dir)) for dir in paths] + os.chdir(os.path.join(LOCALDIR, os.pardir, 'c', 'ivm', 'prolog')) + g = open("mode_combine.pl", "w") + g.close() # empty file + g = os.popen('pl -f %s -g remotecontrol -t halt' % optmode, 'w') + for fn in outfilenames: + print >> g, "loaddumpfile('%s')." % fn + print >> g, "measure(%d)." % maxlength + print >> g, "emitmodes(255)." + g.close() + g = open("mode_combine.pl", "r") + if not g.readline(): + print >> sys.stderr, "*** the Prolog program %s failed" % optmode + sys.exit(1) + g.close() + err = os.system('pl -f insns.pl -g main_emit -t halt') + if err == 0: + print + print 'Done. If you compile Psyco, its ivm virtual machine will now' + print 'be optimized for the usage patterns found in the dump files.' + + +if __name__ == '__main__': + if len(sys.argv) <= 1: + print >> sys.stderr, __doc__ + sys.exit(2) + else: + main(sys.argv[1:]) diff --git a/nodeboxgl/ext/psyco/src/py-utils/manifest.py b/nodeboxgl/ext/psyco/src/py-utils/manifest.py new file mode 100644 index 0000000..5b6344a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/manifest.py @@ -0,0 +1,24 @@ +from __future__ import generators +import os +import py # the py lib, see http://codespeak.net/py + +def psycofiles(): + path = py.path.svnwc(os.pardir) + for p in path.visit(lambda x: x.check(versioned=1)): + if p.check(dir=1): + print p + else: + yield p.relto(path) + +def generate(): + filename = os.path.join('..', 'MANIFEST') + print 'Rebuilding %s...' % filename + lst = list(psycofiles()) + lst.sort() + f = open(filename, 'w') + for filename in lst: + print >> f, filename + f.close() + +if __name__ == '__main__': + generate() diff --git a/nodeboxgl/ext/psyco/src/py-utils/symbols.py b/nodeboxgl/ext/psyco/src/py-utils/symbols.py new file mode 100644 index 0000000..a034948 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/symbols.py @@ -0,0 +1,38 @@ +import sys, os +import xam + +""" +This script loads a psyco.dump file (like httpxam.py) and +reads on its standard input a list of addresses. For each +address that it recognizes it prints the name of the +corresponding symbol or the address of the code buffer +that contains the address. Use this on debugger memory +dumps. + +This could be enhanced by detecting the addresses of +vinfo_t's as well. +""" + + +def main(codebufs, f): + while 1: + line = f.readline() + if not line: + break + for addr in xam.lineaddresses(line): + sym = xam.symbols.get(addr) + if sym: + print '0x%x\tis\t' % addr, xam.symtext(sym, addr) + break + + +if __name__ == '__main__': + if len(sys.argv) <= 1: + print "Usage: python symbols.py " + print " psyco.dump is loaded from the ." + sys.exit(1) + DIRECTORY = sys.argv[1] + del sys.argv[1] + codebufs = xam.readdump(os.path.join(DIRECTORY, 'psyco.dump')) + print >> sys.stderr, "Reading for addresses from stdin..." + main(codebufs, sys.stdin) diff --git a/nodeboxgl/ext/psyco/src/py-utils/vinfo_dump.py b/nodeboxgl/ext/psyco/src/py-utils/vinfo_dump.py new file mode 100644 index 0000000..54a2e09 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/vinfo_dump.py @@ -0,0 +1,56 @@ +from xam import * +import httpxam + + +def load_vi_array(dumpfile, d): + match = re_int.match(dumpfile.readline()) + assert match + count = int(match.group(1)) + a = [] + for i in range(count): + line = dumpfile.readline() + match = re_int.match(line) + assert match + addr = long(match.group(1)) + if d.has_key(addr): + vi = d[addr] + else: + line = dumpfile.readline() + match = re_ctvinfo.match(line) + if match: + vi = CompileTimeVInfo(int(match.group(1)), + long(match.group(2))) + else: + match = re_rtvinfo.match(line) + if match: + vi = RunTimeVInfo(long(match.group(1))) + else: + match = re_vtvinfo.match(line) + assert match + vi = VirtualTimeVInfo(long(match.group(1), 16)) + d[addr] = vi + vi.addr = addr + vi.array = load_vi_array(dumpfile, d) + a.append(vi) + a.reverse() + return a + +def main(dumpfile): + import os, tempfile + array = load_vi_array(dumpfile, {0: None}) + text = httpxam.show_vinfos(array, {}) + if os.fork() == 0: + TMP = tempfile.mktemp('.html') + g = open(TMP, 'w') + g.write('\n') + g.write(text) + g.write('\n') + g.close() + try: + os.system('xterm -e lynx -force_html %s' % TMP) + finally: + os.unlink(TMP) + +if __name__ == '__main__': + import sys + main(sys.stdin) diff --git a/nodeboxgl/ext/psyco/src/py-utils/win32/README.TXT b/nodeboxgl/ext/psyco/src/py-utils/win32/README.TXT new file mode 100644 index 0000000..5f88631 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/win32/README.TXT @@ -0,0 +1,16 @@ +Windows users who want to explore the generated machine code need to download +the following files and put them in this directory: + + objdump.exe: + +http://cvs.sourceforge.net/viewcvs.py/psyco/psyco/py-utils/win32/objdump.exe?rev=1.1&view=auto + + cygwin1.dll: + +http://cvs.sourceforge.net/viewcvs.py/psyco/psyco/py-utils/win32/cygwin1.dll?rev=1.1&view=auto + + +Both are GPL software distributed (with source) in Red Hat's Cygwin +(http://www.redhat.com/software/cygwin/). + +For more information on exploring the machine code see the top-level README.TXT file. diff --git a/nodeboxgl/ext/psyco/src/py-utils/xam.py b/nodeboxgl/ext/psyco/src/py-utils/xam.py new file mode 100644 index 0000000..80fc982 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/xam.py @@ -0,0 +1,570 @@ +from __future__ import nested_scopes +import os, sys, re, htmlentitydefs, struct, bisect +__metaclass__ = type + +tmpfile = '~tmpfile.tmp' + +# the disassembler to use. 'objdump' writes GNU-style instructions. +# 'ndisasm' uses Intel syntax. + +objdump = 'objdump -b binary -m i386 --adjust-vma=%(origin)d -D %(file)s' +if sys.platform == "win32": + try: + from xam import __file__ as _xamfile + except ImportError: + raise ImportError, "could not import xam module" + _win32_path = os.path.join(os.path.split(_xamfile)[0], "win32") + objdump = os.path.join(_win32_path, objdump) + _objdumpexe = objdump.split()[0]+".exe" + # test whether it works: + if os.system(_objdumpexe + " -v"): + raise IOError, "file %s and cygwin1.dll must exist" % _objdumpexe +#objdump = 'ndisasm -o %(origin)d -u %(file)s' + +# the files from which symbols are loaded. +# the order and number of files must match +# psyco_dump_code_buffers() in psyco.c. +symbolfiles = [sys.executable] +try: + from psyco import _psyco + symbolfiles.append(_psyco.__file__) +except ImportError: + pass + +# the program that lists symbols, and the output it gives +symbollister = 'nm %s' +re_symbolentry = re.compile(r'([0-9a-fA-F]+)\s\w\s(.*)') + +if sys.platform == "win32": + # no way to get full info into the executables by + # VC7. /PDB:NONE no longer supported. + # so we have to read the map files. + if sys.executable.lower().endswith("_d.exe"): + _mapfiles = ("python23_d.map", "_psyco_d.map") + else: + _mapfiles = ("python23.map", "_psyco.map") + symbolfiles = [os.path.join(_win32_path, x) for x in _mapfiles] + for _filepath in symbolfiles: + if not os.path.exists(_filepath): + raise IOError, "please make sure that '%s' exists" % _filepath + + class symbollister: + def __init__(self, filename): + self.file = file(filename) + self.generator = self._readline() + + def _readline(self): + for line in self.file: + # 0001:000661e0 _PyEval_CallFunction 1e0671e0 f modsupport.obj + # 0003:0000e770 _PyClass_Type 1e0d8770 classobject.obj + pieces = line.split() + if len(pieces) == 5: + colonadr, name, adr, dummy, obj = pieces + elif len(pieces) == 4: + colonadr, name, adr, obj = pieces + dummy = "d" + else: + continue + if colonadr.count(":") == 1 and obj.endswith(".obj"): + yield "%s %s %s\n" % (adr, dummy, name[1:]) + + def readline(self): + try: + return self.generator.next() + except StopIteration: + return "" + + def close(self): + self.file.close() + + def __iter__(self): + return self.generator + + +re_addr = re.compile(r'[\s,$]0x([0-9a-fA-F]+)') +re_lineaddr = re.compile(r'\s*0?x?([0-9a-fA-F]+)') + + +symbols = {} +#rawtargets = {} +codeboundary = [] + +try: + from xamsupport import any_pointer +except ImportError: + def any_pointer(addr0, data, start, end, unpack=struct.unpack): + for i in range(4, len(data)+1): + offset, = unpack('l', data[i-4:i]) + if start <= addr0+i+offset < end or start <= offset < end: + return 1 + return 0 + +def machine_code_dump(data, originaddr, format): + if format == 'ivm': + import ivmdump + result = ivmdump.dump(data, originaddr) + elif format == 'i386': + f = open(tmpfile, 'wb') + f.write(data) + f.close() + try: + g = os.popen(objdump % {'file': tmpfile, 'origin': originaddr}, 'r') + result = g.readlines() + g.close() + finally: + os.unlink(tmpfile) + return result + +def load_symbol_file(filename, symb1, addr1): + d = {} + if type(symbollister) is str: + g = os.popen(symbollister % filename, "r") + else: + g = symbollister(filename) + while 1: + line = g.readline() + if not line: + break + match = re_symbolentry.match(line) + if match: + d[match.group(2)] = long(match.group(1), 16) + g.close() + if d.has_key(symb1): + delta = addr1 - d[symb1] + else: + delta = 0 + print >> sys.stderr,"Warning: no symbol '%s' in '%s'" % (symb1, filename) + for key, value in d.items(): + symbols[value + delta] = key + + +def symtext(sym, addr, inbuf=None, lineaddr=None): + if isinstance(sym, CodeBuf): + if sym is inbuf: + name = 'top' + else: + name = '%s codebuf 0x%x' % (sym.mode, sym.addr) + if addr > sym.addr: + name += ' + %d' % (addr-sym.addr) + return name + else: + return sym + +revmap = {} +for key, value in htmlentitydefs.entitydefs.items(): + if type(value) is type(' '): + revmap[value] = '&%s;' % key + +def htmlquote(text): + return ''.join([revmap.get(c,c) for c in text]) + +def lineaddresses(line): + result = [] + i = 0 + while 1: + match = re_addr.search(line, i) + if not match: + break + i = match.end() + addr = long(match.group(1), 16) + result.append(addr) + return result + +def codeat(addr): + i = bisect.bisect(codeboundary, (addr, None)) + if i>0: + addrend, codebuf = codeboundary[i-1] + if isinstance(codebuf, CodeBuf): + return codebuf + + +re_int = re.compile(r"(\-?\d+)$") +re_ctvinfo = re.compile(r"ct (\d+) (\-?\d+)$") +re_rtvinfo = re.compile(r"rt (\-?\d+)$") +re_vtvinfo = re.compile(r"vt 0x([0-9a-fA-F]+)$") + +LOC_LOCALS_PLUS = 3 + +class CodeBuf: + __slots__ = ['mode', 'co_filename', 'co_name', 'nextinstr', 'addr', + 'stackdepth', 'specdict', 'data', 'cache_text', + 'disass_text', 'reverse_lookup', 'vlocals', + 'complete_list', 'dumpfile', 'vlocalsofs', 'codemap'] + machine_code_format = '?' + + def __init__(self, mode, co_filename, co_name, nextinstr, + addr, stackdepth): + self.mode = mode + self.co_filename = co_filename + self.co_name = co_name + self.nextinstr = nextinstr + self.addr = addr + #self.data = data + self.stackdepth = stackdepth + #self.reverse_lookup = [] # list of (offset, codebuf pointing there) + self.specdict = [] + if self.mode != "proxy": + codeboundary.append((self.addr-0.5, self)) + else: + self.data = "" + #for i in range(4, len(data)+1): + # offset, = struct.unpack('l', data[i-4:i]) + # rawtargets.setdefault(addr+i+offset, {})[self] = 1 + + def getboundary(self): + i = bisect.bisect(codeboundary, (self.addr-0.5, self)) + prev = codeboundary[i-1][1] + next = codeboundary[i][1] + #while not isinstance(next, BigBuffer) and next.addr == self.addr: + # i = i + 1 + # next = codeboundary[i][1] + while not isinstance(codeboundary[i][1], BigBuffer): + i = i + 1 + bigbuf = codeboundary[i][1] + return prev, next, bigbuf + + def splitheader(self): + data = self.data + addr = self.addr + k = 0 + while data[k:k+1] == '\xCC': + k = k + 1 + if data[k:k+4] == '\x66\x66\x66\x66': + # detected a rt_local_buf_t structure + next, key = struct.unpack('LL', data[k+4:k+12]) + data = data[k+12:] + addr += k+12 + else: + next = key = None + return data, addr, next, key + + def __getattr__(self, attr): + if attr == 'data': + prev, next, bigbuf = self.getboundary() + assert prev is self + self.data = data = bigbuf.load(self.addr, next.addr) + return data + if attr == 'cache_text': + # produce the disassembly listing + data, addr, next, key = self.splitheader() + self.cache_text = [] + if key is not None: + self.cache_text.append( + 'Created by promotion of the value 0x%x\n' % key) + if next is not None: + self.cache_text.append( + 'Next promoted value at buffer 0x%x\n' % next) + self.cache_text += machine_code_dump(data, addr, + CodeBuf.machine_code_format) + return self.cache_text + if attr == 'disass_text': + txt = self.cache_text + if self.specdict: + txt.append('\n') + txt.append("'do_promotion' dictionary:\n") + for key, value in self.specdict: + txt.append('.\t%s:\t\t\n' % htmlquote(key)) + txt.append('.\t\t0x%x\t\t\n' % value) + self.disass_text = txt + return txt + if attr == 'reverse_lookup': + # 'reverse_lookup' is a list of (offset, codebuf pointing there) + self.reverse_lookup = [] + start = self.addr + end = start + len(self.data) + for codebuf in self.complete_list: + if any_pointer(codebuf.addr, codebuf.data, start, end): + for line in codebuf.disass_text: + for addr in lineaddresses(line): + if start <= addr < end: + self.reverse_lookup.append((addr-start, codebuf)) + return self.reverse_lookup + if attr == 'vlocals': + self.dumpfile.seek(self.vlocalsofs) + self.vlocals = self.load_vi_array({0: None}) + return self.vlocals + raise AttributeError, attr + + def load_vi_array(self, d): + dumpfile = self.dumpfile + match = re_int.match(dumpfile.readline()) + assert match + count = int(match.group(1)) + a = [] + for i in range(count): + line = dumpfile.readline() + match = re_int.match(line) + assert match + addr = long(match.group(1)) + if d.has_key(addr): + vi = d[addr] + else: + line = dumpfile.readline() + match = re_ctvinfo.match(line) + if match: + vi = CompileTimeVInfo(int(match.group(1)), + long(match.group(2))) + else: + match = re_rtvinfo.match(line) + if match: + vi = RunTimeVInfo(long(match.group(1)), self.stackdepth) + else: + match = re_vtvinfo.match(line) + assert match + vi = VirtualTimeVInfo(long(match.group(1), 16)) + d[addr] = vi + vi.addr = addr + vi.array = self.load_vi_array(d) + a.append(vi) + a.reverse() + return a + + def get_next_instr(self): + if self.nextinstr >= 0: + return self.nextinstr + + def spec_dict(self, key, value): + self.specdict.append((key, value)) + #rawtargets.setdefault(value, {})[self] = 1 + try: + del self.disass_text + except: + pass + try: + del self.reverse_lookup + except: + pass + +## def build_reverse_lookup(self): +## for line in self.disass_text: +## for addr in lineaddresses(line): +## sym = symbols.get(addr) +## if isinstance(sym, CodeBuf): +## sym.reverse_lookup.append((addr-sym.addr, self)) + + def disassemble(self, symtext=symtext, linetext=None, snapshot=None): + seen = {} + data = [] + for line in self.disass_text: + if line.endswith('\n'): + line = line[:-1] + match = re_lineaddr.match(line) + if match: + lineaddr = long(match.group(1), 16) + if not seen.has_key(lineaddr): + if self.codemap.has_key(lineaddr) and snapshot: + for proxy in self.codemap[lineaddr]: + data.append(snapshot(proxy)) + seen[lineaddr] = 1 + ofs = lineaddr - self.addr + sources = [c for o, c in self.reverse_lookup if o == ofs] + if sources and linetext: + line = linetext(line, lineaddr) + if sources != [self]*len(sources): + data.append('\n') + else: + lineaddr = None + for addr in lineaddresses(line): + sym = symbols.get(addr) or codeat(addr) + if sym: + line = '%s\t(%s)' % (line, symtext(sym, addr, self,lineaddr)) + break + data.append(line + '\n') + return ''.join(data) + + +class BigBuffer: + __slots__ = ['file', 'offset', 'start', 'length', 'addr', 'priority'] + def __init__(self, file, start, length): + #if sys.stderr.softspace: + # print >> sys.stderr + #print >> sys.stderr, 'BigBuffer:', hex(start), hex(start+length), + #print >> sys.stderr, '(%d)' % length + self.file = file + self.offset = file.tell() + self.start = start + self.length = length + self.addr = start + length # end address + self.priority = -len(codeboundary) + codeboundary.append((self.addr-0.25, self)) + file.seek(self.length, 1) + def load(self, begin, end): + assert self.start <= begin <= self.addr, \ + (hex(self.start), hex(begin), hex(end), hex(self.addr)) + self.file.seek(self.offset + (begin-self.start)) + return self.file.read(min(self.addr, end) - begin) + + +class VInfo: + __slots__ = ['addr', 'array'] + +class CompileTimeVInfo(VInfo): + __slots__ = ['flags', 'value'] + def __init__(self, flags, value): + self.flags = flags + self.value = value + def gettext(self): + text = "Compile-time value 0x%x" % self.value + if self.flags & 1: + text += ", fixed" + if self.flags & 2: + text += ", reference" + return text + def getsummarytext(self): + text = "Compile-time" + if self.flags & 1: + text += " fixed" + text += " 0x%x" % self.value + return text + +class RunTimeVInfo(VInfo): + __slots__ = ['source', 'stackdepth'] + REG_NAMES = ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"] + def __init__(self, source, stackdepth=None): + self.source = source + self.stackdepth = stackdepth + def gettext(self): + text = "Run-time source," + reg = self.source >> 28 + stack = self.source & 0x03FFFFFC + if CodeBuf.machine_code_format == 'ivm': + if reg: + text += " in a register ??????" + if not stack: + text += " not in stack ??????" + else: + text += " in stack [%d] or from top #%d" % ( + (self.stackdepth-stack)/4, + stack/4) + else: + if 0 <= reg < 8: + text += " in register %s" % self.REG_NAMES[reg].upper() + if stack: + text += " and" + if stack: + if self.stackdepth is None: + sd = "" + else: + sd = "[ESP+0x%x] or " % (self.stackdepth - stack) + text += " in stack %sfrom top %d" % (sd, stack) + if not (self.source & 0x08000000): + text += " holding a reference" + if self.source & 0x04000000: + text += " >=0" + return text + def getsummarytext(self): + return "Run-time" + +class VirtualTimeVInfo(VInfo): + __slots__ = ['vs'] + def __init__(self, vs): + self.vs = vs + def gettext(self): + return "Virtual-time source (%x)" % self.vs + def getsummarytext(self): + return "Virtual-time (%x)" % self.vs + +def readdump(filename = 'psyco.dump'): + del codeboundary[:] + re_header = re.compile(r"Psyco dump [[](\w+?)[]]") + re_symb1 = re.compile(r"(\w+?)[:]\s0x([0-9a-fA-F]+)") + re_codebuf = re.compile(r"CodeBufferObject 0x([0-9a-fA-F]+) (\-?\d+) \'(.*?)\' \'(.*?)\' (\-?\d+) \'(.*?)\'$") + re_specdict = re.compile(r"spec_dict 0x([0-9a-fA-F]+)") + re_vinfo_array = re.compile(r"vinfo_array") + re_spec1 = re.compile(r"0x([0-9a-fA-F]+)\s(.*)$") + re_bigbuffer = re.compile(r"BigBuffer 0x([0-9a-fA-F]+) (\d+)$") + + codebufs = [] + dumpfile = open(filename, 'rb') + match = re_header.match(dumpfile.readline()) + if not match: + raise ValueError, "'%s' does not look like a Psyco dump" % filename + CodeBuf.machine_code_format = match.group(1) + + bufcount, = struct.unpack("i", dumpfile.read(4)) + buftable = list(struct.unpack("l"*bufcount, dumpfile.read(4*bufcount))) + buftable.reverse() + if buftable: + filesize = buftable[-1] + else: + filesize = sys.maxint + filesize *= 1.0 + nextp = 0.1 + cbsortedsize = 0 + for filename in symbolfiles: + line = dumpfile.readline() + match = re_symb1.match(line) + assert match + load_symbol_file(filename, match.group(1), long(match.group(2), 16)) + while 1: + line = dumpfile.readline() + if not line: + print "Note: unexpected end of file" + break + #print line.strip() + match = re_codebuf.match(line) + if match: + percent = dumpfile.tell() / filesize + if percent >= nextp: + print >> sys.stderr, '%d%%...' % int(100*percent), + nextp += 0.1 + #size = int(match.group(2)) + #data = dumpfile.read(size) + #assert len(data) == size + codebuf = CodeBuf(match.group(6), match.group(3), match.group(4), + int(match.group(5)), long(match.group(1), 16), + int(match.group(2))) + codebuf.dumpfile = dumpfile + codebuf.vlocalsofs = buftable.pop() + codebufs.append(codebuf) + else: + match = re_specdict.match(line) + if match: + addr = long(match.group(1), 16) + if len(codeboundary) != cbsortedsize: + codeboundary.sort() + cbsortedsize = len(codeboundary) + codebuf = codeat(addr-4) + if codebuf is None: + raise "spec_dict with no matching code buffer", line + while 1: + line = dumpfile.readline() + if len(line)<=1: + break + match = re_spec1.match(line) + assert match + codebuf.spec_dict(match.group(2), long(match.group(1), 16)) + elif re_vinfo_array.match(line): + assert len(codebufs) == bufcount + break + else: + match = re_bigbuffer.match(line) + if match: + BigBuffer(dumpfile, long(match.group(1), 16), + int(match.group(2))) + else: + raise "invalid line", line + print >> sys.stderr, 'sorting...', + if len(codeboundary) != cbsortedsize: + codeboundary.sort() + codemap = {} + #cblist = [] + codebufs.reverse() + for codebuf in codebufs: + codebuf.complete_list = codebufs + codebuf.codemap = codemap + codemap.setdefault(codebuf.addr, []).insert(0, codebuf) + #prev, next, bigbuf = codebuf.getboundary() + #cblist.append((bigbuf.priority, codebuf.addr, codebuf)) + #cblist.sort() + #codebufs[:] = [codebuf for priority, addr, codebuf in cblist] + print >> sys.stderr, '100%' + return codebufs + +if __name__ == '__main__': + if len(sys.argv) > 1: + codebufs = readdump(sys.argv[1]) + else: + codebufs = readdump() + for codebuf in codebufs: + print codebuf.disassemble() diff --git a/nodeboxgl/ext/psyco/src/py-utils/xamsupport.c b/nodeboxgl/ext/psyco/src/py-utils/xamsupport.c new file mode 100644 index 0000000..5858c55 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/py-utils/xamsupport.c @@ -0,0 +1,31 @@ +#include + +static PyObject* any_pointer(PyObject* self, PyObject* args) +{ + char* from; + int fromlen, i; + long addr0, start, end, intervallen; + if (!PyArg_ParseTuple(args, "ls#ll", &addr0, &from, &fromlen, &start, &end)) + return NULL; + + intervallen = end-start; + for (i=0; i<=fromlen-4; i++) + { + long offset = *(long*) (from+i); + offset -= start; + if (((unsigned long)(addr0+i+offset)) < intervallen || + ((unsigned long) offset) < intervallen) + return PyInt_FromLong(1); + } + return PyInt_FromLong(0); +} + +static PyMethodDef XamMethods[] = { + {"any_pointer", any_pointer, METH_VARARGS}, + {NULL, NULL} /* Sentinel */ +}; + +void initxamsupport() +{ + Py_InitModule("xamsupport", XamMethods); +} diff --git a/nodeboxgl/ext/psyco/src/setup.py b/nodeboxgl/ext/psyco/src/setup.py new file mode 100644 index 0000000..5963d95 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/setup.py @@ -0,0 +1,180 @@ +#! /usr/bin/env python + +"""Psyco shows that it is possible to execute Python code at speeds +approaching that of fully compiled languages, by "specialization". +This extension module for the unmodified interpreter accelerates +user programs with little or not change in their sources, by a +factor that can be very interesting (2-10 times is common).""" + +import os, sys +from distutils.core import setup +from distutils.extension import Extension + +PROCESSOR = None # autodetect + +#################################################################### +# +# Customizable debugging flags. +# Copy the following section in a new file 'preferences.py' to +# avoiding changing setup.py. Uncomment and change the options there +# at your will. Setting PsycoDebug to 1 is probably the first thing +# you want to do to enable all internal checks. + +#PSYCO_DEBUG = 1 + +# level of debugging outputs: 0 = none, 1 = a few, 2 = more, +# 3 = detailled, 4 = full execution trace +#VERBOSE_LEVEL = 0 + +# write produced blocks of code into a file; see 'xam.py' +# 0 = off, 1 = only manually (from a debugger or with _psyco.dumpcodebuf()), +# 2 = only when returning from Psyco, +# 3 = every time a new code block is built +#CODE_DUMP = 1 + +# Linux-only *heavy* memory checking: 0 = off, 1 = reasonably heavy, +# 2 = unreasonably heavy. +#HEAVY_MEM_CHECK = 0 + +# If the following is set to 1, Psyco is compiled by #including all .c +# files into psyco.c. +# It provides a version of _psyco.so whose only exported (non-static) +# symbol is init_psyco(). It also seems that the GDB debugger doesn't locate +# too well non-static symbols in shared libraries. Recompiling after minor +# changes is faster if ALL_STATIC=0. +ALL_STATIC = 1 + +# Be careful with ALL_STATIC=0, because I am not sure the distutils can +# correctly detect all the dependencies. In case of doubt always compile +# with `setup.py build_ext -f'. + + +#################################################################### + +# override options with the ones from preferences.py, if the file exists. +try: + execfile('preferences.py') +except IOError: + pass + + +# processor auto-detection +class ProcessorAutodetectError(Exception): + pass +def autodetect(): + platform = sys.platform.lower() + if platform.startswith('win'): # assume an Intel Windows + return 'i386' + # assume we have 'uname' + mach = os.popen('uname -m', 'r').read().strip() + if not mach: + raise ProcessorAutodetectError, "cannot run 'uname -m'" + if mach == 'x86_64' and sys.maxint == 2147483647: + mach = 'x86' # it's a 64-bit processor but in 32-bits mode, maybe + try: + return {'i386': 'i386', + 'i486': 'i386', + 'i586': 'i386', + 'i686': 'i386', + 'i86pc': 'i386', # Solaris/Intel + 'x86': 'i386', # Apple + }[mach] + except KeyError: + raise ProcessorAutodetectError, "unsupported processor '%s'" % mach + + +# loads the list of source files from SOURCEDIR/files.py +# and make the appropriate options for the Extension class. +SOURCEDIR = 'c' + +data = {} +execfile(os.path.join(SOURCEDIR, 'files.py'), data) + +SRC = data['SRC'] +MAINFILE = data['MAINFILE'] +PLATFILE = data['PLATFILE'] + +macros = [] +for name in ['PSYCO_DEBUG', 'VERBOSE_LEVEL', + 'CODE_DUMP', 'HEAVY_MEM_CHECK', 'ALL_STATIC', + 'PSYCO_NO_LINKED_LISTS']: + if globals().has_key(name): + macros.append((name, str(globals()[name]))) + +if PROCESSOR is None: + try: + PROCESSOR = autodetect() + except ProcessorAutodetectError: + PROCESSOR = 'ivm' # fall back to the generic virtual machine + print "PROCESSOR = %r" % PROCESSOR +processor_dir = os.path.join('c', PROCESSOR) +localsetup = os.path.join(processor_dir, 'localsetup.py') +if os.path.isfile(localsetup): + d = globals().copy() + d['__file__'] = localsetup + execfile(localsetup, d) + +if ALL_STATIC: + sources = [SOURCEDIR + '/' + MAINFILE, + SOURCEDIR + '/' + PLATFILE] +else: + sources = [SOURCEDIR + '/' + s.filename for s in SRC] + +extra_compile_args = [] +extra_link_args = [] +if sys.platform == 'win32': + if globals().get('PSYCO_DEBUG'): + # how do we know if distutils will use the MS compilers ??? + # these are just hacks that I really need to compile psyco debug versions + # on Windows + extra_compile_args.append('/Od') # no optimizations, override the default /Ox + extra_compile_args.append('/ZI') # debugging info + extra_link_args.append('/debug') # debugging info + macros.insert(0, ('NDEBUG', '1')) # prevents from being linked against python2x_d.lib + + +CLASSIFIERS = [ + 'Development Status :: 5 - Production/Stable', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Programming Language :: C', + 'Topic :: Software Development :: Compilers', + 'Topic :: Software Development :: Interpreters', + ] + +try: + import distutils.command.register +except ImportError: + kwds = {} +else: + kwds = {'classifiers': CLASSIFIERS} + +py_modules = ['psyco.%s' % os.path.splitext(fn)[0] + for fn in os.listdir('py-support') + if os.path.splitext(fn)[1].lower() == '.py'] +py_modules.remove('psyco.__init__') + +if sys.version_info < (2, 2, 2): + raise Exception("Psyco >= 1.5.3 requires Python >= 2.2.2") + + +setup ( name = "psyco", + version = "1.5.2", + description = "Psyco, the Python specializing compiler", + author = "Armin Rigo", + author_email = "arigo@users.sourceforge.net", + url = "http://psyco.sourceforge.net/", + license = "MIT License", + long_description = __doc__, + platforms = ["i386"], + py_modules = py_modules, + package_dir = {'psyco': 'py-support'}, + ext_modules=[Extension(name = 'psyco._psyco', + sources = sources, + extra_compile_args = extra_compile_args, + extra_link_args = extra_link_args, + define_macros = macros, + include_dirs = [processor_dir])], + **kwds ) diff --git a/nodeboxgl/ext/psyco/src/test/bpnn.py b/nodeboxgl/ext/psyco/src/test/bpnn.py new file mode 100755 index 0000000..d6aeabf --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/bpnn.py @@ -0,0 +1,192 @@ +#!/usr/bin/python +# Back-Propagation Neural Networks +# +# Written in Python. See http://www.python.org/ +# +# Neil Schemenauer + +import math +import random +import operator +import string +import psyco +#psyco.full() +from psyco.classes import * +#psyco.log() +#psyco.profile() +#__metaclass__ = type + + +random.seed(0) + +def time(fn, *args): + import time, traceback + begin = time.clock() + try: + result = fn(*args) + except: + end = time.clock() + traceback.print_exc() + result = '' + else: + end = time.clock() + return result, end-begin + +# calculate a random number where: a <= rand < b +def rand(a, b): + return (b-a)*random.random() + a + +# Make a matrix (we could use NumPy to speed this up) +def makeMatrix(I, J, fill=0.0): + m = [] + for i in range(I): + m.append([fill]*J) + return m + +class NN: + + def __init__(self, ni, nh, no): + # number of input, hidden, and output nodes + self.ni = ni + 1 # +1 for bias node + self.nh = nh + self.no = no + + # activations for nodes + self.ai = [1.0]*self.ni + self.ah = [1.0]*self.nh + self.ao = [1.0]*self.no + + # create weights + self.wi = makeMatrix(self.ni, self.nh) + self.wo = makeMatrix(self.nh, self.no) + # set them to random vaules + for i in range(self.ni): + for j in range(self.nh): + self.wi[i][j] = rand(-2.0, 2.0) + for j in range(self.nh): + for k in range(self.no): + self.wo[j][k] = rand(-2.0, 2.0) + + # last change in weights for momentum + self.ci = makeMatrix(self.ni, self.nh) + self.co = makeMatrix(self.nh, self.no) + + def update(self, inputs): + if len(inputs) != self.ni-1: + raise ValueError, 'wrong number of inputs' + + # input activations + for i in range(self.ni-1): + #self.ai[i] = 1.0/(1.0+math.exp(-inputs[i])) + self.ai[i] = inputs[i] + + # hidden activations + for j in range(self.nh): + sum = 0.0 + for i in range(self.ni): + sum = sum + self.ai[i] * self.wi[i][j] + self.ah[j] = 1.0/(1.0+math.exp(-sum)) + + # output activations + for k in range(self.no): + sum = 0.0 + for j in range(self.nh): + sum = sum + self.ah[j] * self.wo[j][k] + self.ao[k] = 1.0/(1.0+math.exp(-sum)) + + return self.ao[:] + + + def backPropagate(self, targets, N, M): + if len(targets) != self.no: + raise ValueError, 'wrong number of target values' + + # calculate error terms for output + output_deltas = [0.0] * self.no + for k in range(self.no): + ao = self.ao[k] + output_deltas[k] = ao*(1-ao)*(targets[k]-ao) + + # calculate error terms for hidden + hidden_deltas = [0.0] * self.nh + for j in range(self.nh): + sum = 0.0 + for k in range(self.no): + sum = sum + output_deltas[k]*self.wo[j][k] + hidden_deltas[j] = self.ah[j]*(1-self.ah[j])*sum + + # update output weights + for j in range(self.nh): + for k in range(self.no): + change = output_deltas[k]*self.ah[j] + self.wo[j][k] = self.wo[j][k] + N*change + M*self.co[j][k] + self.co[j][k] = change + #print N*change, M*self.co[j][k] + + # update input weights + for i in range(self.ni): + for j in range(self.nh): + change = hidden_deltas[j]*self.ai[i] + self.wi[i][j] = self.wi[i][j] + N*change + M*self.ci[i][j] + self.ci[i][j] = change + + # calculate error + error = 0.0 + for k in range(len(targets)): + error = error + 0.5*(targets[k]-self.ao[k])**2 + return error + + + def test(self, patterns): + for p in patterns: + print p[0], '->', self.update(p[0]) + + def weights(self): + print 'Input weights:' + for i in range(self.ni): + print self.wi[i] + print + print 'Output weights:' + for j in range(self.nh): + print self.wo[j] + + def train(self, patterns, iterations=2000, N=0.5, M=0.1): + # N: learning rate + # M: momentum factor + for i in xrange(iterations): + error = 0.0 + for p in patterns: + inputs = p[0] + targets = p[1] + self.update(inputs) + error = error + self.backPropagate(targets, N, M) + if i % 100 == 0: + print 'error %-14f' % error + + +def demo(): + # Teach network XOR function + pat = [ + [[0,0], [0]], + [[0,1], [1]], + [[1,0], [1]], + [[1,1], [0]] + ] + + # create a network with two input, two hidden, and two output nodes + n = NN(2, 3, 1) + # train it with some patterns + n.train(pat, 2000) + # test it + n.test(pat) + + + +if __name__ == '__main__': + v, t1 = time(demo) + v, t2 = time(demo) + v, t3 = time(demo) + v, t4 = time(demo) + v, t5 = time(demo) + print t1, t2, t3, t4, t5 + psyco.dumpcodebuf() diff --git a/nodeboxgl/ext/psyco/src/test/btrun.py b/nodeboxgl/ext/psyco/src/test/btrun.py new file mode 100644 index 0000000..9b6384a --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/btrun.py @@ -0,0 +1,778 @@ + +##### Prelude ##### + +>>> import sys, uu, psyco +>>> psyco.full() +>>> import test1, test3, test5 +>>> import test_compactobject as compactobject + +>>> def prep(): +... uu.decode('file2-basetests.uu', 'file2-basetests') + +>>> def g1(f): +... prep() +... d = f(['file1-basetests', 'BIN:file2-basetests']) +... return [d[chr(n)] for n in range(256)] + +>>> def protect(f, *args): +... try: +... return f(*args) +... except: +... return 'exception: ' + sys.exc_info()[0].__name__ + +>>> def assert_true(cond): +... if cond: +... print 'Ok' +... else: +... print 'Assert failed!' + +>>> True,False = 1==1,1==0 + +>>> PY21 = sys.hexversion < 0x02020000 + +>>> if sys.hexversion >= 0x02040000: +... def clamp(x): +... return x +... else: +... def clamp(x): +... if x & (sys.maxint+1L): +... return int(x & sys.maxint) - sys.maxint - 1 +... else: +... return int(x & sys.maxint) + + ################### + #### TEST1 #### + ################### + +>>> print test1.f1(217) +1115467 + +>>> print test1.f2(0) +0 + +>>> print test1.f2(-192570368) +-385140736 + +>>> test1.f3([3,4,0,'testing',12.75,(5,3,1),0]) +6 +8 +testingtesting +25.5 +(5, 3, 1, 5, 3, 1) + +>>> print g1(test1.f5) +[20, 14, 19, 9, 12, 25, 13, 9, 17, 23, 289, 26, 15, 13, 17, 19, 23, 18, 15, 14, 18, 22, 14, 18, 18, 17, 21, 27, 21, 20, 15, 12, 1745, 18, 17, 136, 25, 14, 27, 18, 92, 87, 386, 12, 52, 29, 63, 102, 49, 39, 26, 26, 18, 14, 16, 13, 22, 16, 29, 49, 24, 34, 30, 20, 16, 100, 98, 61, 20, 85, 61, 75, 54, 49, 19, 47, 32, 18, 67, 47, 86, 66, 184, 61, 42, 42, 74, 14, 26, 55, 74, 16, 37, 15, 19, 211, 17, 348, 369, 130, 12, 248, 264, 328, 162, 68, 69, 41, 128, 29, 240, 95, 244, 288, 673, 295, 108, 134, 380, 40, 42, 224, 137, 30, 15, 24, 11, 15, 6, 15, 19, 26, 19, 17, 15, 18, 16, 17, 11, 14, 11, 15, 11, 11, 19, 13, 18, 25, 14, 20, 12, 14, 8, 13, 17, 15, 16, 17, 15, 13, 12, 12, 10, 19, 15, 15, 16, 12, 24, 21, 14, 10, 19, 17, 14, 13, 20, 18, 11, 17, 21, 13, 21, 19, 17, 15, 19, 10, 17, 12, 16, 13, 16, 15, 13, 16, 16, 16, 15, 14, 11, 14, 18, 15, 25, 9, 19, 12, 13, 12, 18, 12, 13, 16, 13, 17, 18, 19, 16, 11, 18, 18, 27, 11, 22, 17, 13, 22, 20, 16, 9, 17, 14, 12, 20, 17, 15, 18, 16, 15, 15, 16, 16, 18, 18, 17, 21, 17, 12, 12, 17, 10, 20, 19, 18, 25] + +>>> assert_true(PY21 or g1(test1.f4) == g1(test1.f5)) +Ok + +>>> print test1.f6(n=100, p=10001) +803 + +>>> test1.f7(-2-1j, 1+1j, 0.04+0.08j) +!!!!!!!""""""####################$$$$$$$$%%%&'*.)+ %$$$$$######"""""""""""" +!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" +!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" +!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" +!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" +!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" +!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" +!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" +!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" +!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## +!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## +!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## +!%%&&')''((()-+/S ('&%%$$$$####### +!%%&&')''((()-+/S ('&%%$$$$####### +!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## +!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## +!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## +!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" +!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" +!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" +!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" +!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" +!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" +!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" +!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" +!!!!!!!""""""####################$$$$$$$$%%%&'*.)+J%$$$$$######"""""""""""" + +>>> test1.f7bis((-2.0, -1.0), (1.0, 1.0), (0.04, 0.08)) +!!!!!!!""""""####################$$$$$$$$%%%&'*.)+ %$$$$$######"""""""""""" +!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" +!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" +!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" +!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" +!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" +!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" +!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" +!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" +!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## +!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## +!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## +!%%&&')''((()-+/S ('&%%$$$$####### +!%%&&')''((()-+/S ('&%%$$$$####### +!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## +!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## +!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## +!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" +!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" +!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" +!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" +!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" +!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" +!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" +!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" +!!!!!!!""""""####################$$$$$$$$%%%&'*.)+J%$$$$$######"""""""""""" + +>>> print protect(test1.f8) +in finally clause +exception: ZeroDivisionError + +>>> test1.f9(50) +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 + +>>> test1.f10() +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 + +>>> print test1.f11(50) +950 + +>>> print test1.f11(-1.0) +1001.0 + + ################### + #### TEST2 #### + ################### + +>>> def f1(): +... return -abs(-10) +>>> print f1() +-10 + +>>> def f11(): +... return -abs(-10.125)+5.0+6.0 +>>> print f11() +0.875 + + ################### + #### TEST3 #### + ################### + +>>> test3.f11([5,6,7,5,3,5,6,2,5,5,6,7,5]) +[0, 0, 0, 1, 0, 1, 2, 0, 1, 1, 2, 3, 4] + +>>> print test3.f13((None, 'hello')) +None hello +None hello +('hello', None) + +>>> print test3.f13([12, 34]) +12 34 +12 34 +(34, 12) + +>>> test3.f14(5) +${True} + +>>> test3.f14(-2) +${False} + +>>> print test3.f16(123) +-124 + +>>> print test3.f17('abc') +('abc', 0, ()) + +>>> print test3.f17('abc', 'def', 'ghi', 'jkl') +('abc', 'def', ('ghi', 'jkl')) + +>>> print test3.f19([1,2,3,4]) +hello +${([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4], True, 0)} + +>>> print test3.f20('l', 12) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] +>>> print test3.f20('L', 12) +[0L, 10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 110L] +>>> print test3.f20('i', 12) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] +>>> print test3.f20('I', 12) +[0L, 10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 110L] +>>> print test3.f20('c', 12, 'x') +['\x00', '\n', '\x14', '\x1e', '(', '2', '<', 'F', 'P', 'Z', 'd', 'n'] +>>> print test3.f20('b', 12) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] +>>> print test3.f20('B', 12) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] +>>> print test3.f20('h', 12) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] +>>> print test3.f20('H', 12) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] +>>> print test3.f20('B', 17) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] +>>> print test3.f20('h', 28) +[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270] + +>>> print test3.f21([2,6,'never',9,3,0.123]) +3 + +>>> test3.f22(0) +Catch! + +>>> print test3.f22(-2.0) +None + +>>> test3.f23(0.0) +Catch! +Catch! +NameError + +>>> test3.f23(23) +NameError + +>>> print [x.__name__ for x in test3.f26()] +['float', 'list', 'urllib', 'psyco.classes', 'full'] + +>>> test3.N=5; print test3.f28(), test3.f28_1(), test3.f28_b(), test3.f28_b1() +test_getframe(): +test_getframe +f28 +? +5 test_getframe(): +test_getframe +test_getframe1 +f28_1 +? +5 test_getframe_b(): +test_getframe_b +f28_b +? +5 test_getframe_b(): +test_getframe_b +test_getframe_b1 +f28_b1 +? +5 + +>>> print test3.f27(), test3.f27_1(), test3.f27_b(), test3.f27_b1() +test_getframe(): +test_getframe +f28 +f27 +? +test_getframe(): +test_getframe +f28 +f27 +? +test_getframe(): +test_getframe +f28 +f27 +? +(5, 6, 7) test_getframe(): +test_getframe +test_getframe1 +f28_1 +f27_1 +? +test_getframe(): +test_getframe +test_getframe1 +f28_1 +f27_1 +? +test_getframe(): +test_getframe +test_getframe1 +f28_1 +f27_1 +? +(51, 61, 71) test_getframe_b(): +test_getframe_b +f28_b +f27_b +? +test_getframe_b(): +test_getframe_b +f28_b +f27_b +? +test_getframe_b(): +test_getframe_b +f28_b +f27_b +? +(95, 96, 97) test_getframe_b(): +test_getframe_b +test_getframe_b1 +f28_b1 +f27_b1 +? +test_getframe_b(): +test_getframe_b +test_getframe_b1 +f28_b1 +f27_b1 +? +test_getframe_b(): +test_getframe_b +test_getframe_b1 +f28_b1 +f27_b1 +? +(951, 961, 971) + +>>> print test3.f29(range(10,0,-1)) +[10, 9, 7, 6, 5, 4, 3, 2, 1] + +>>> print test3.f32('c:/temp') +('c:', '/temp') +>>> print test3.f32('*') +('', '*') +>>> print test3.f32('/dev/null') +('', '/dev/null') + +>>> test3.f33(31) +31 +>>> print test3.f33(33) +None +>>> print test3.f33(32) +None + +>>> test3.f34(70000) +0 +1 +3 +7 +15 +31 +63 +127 +255 +511 +1023 +2047 +4095 +8191 +16383 +32767 +65535 + +>>> test3.f35() +[[5 5 5] + [5 5 5] + [5 5 5]] + +>>> test3.f37(None) +${True} +1 + +>>> print test3.f38(12) +[234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234] + + ################### + #### TEST5 #### + ################### + +>>> print hash(test5.f('file1-basetests')) +33961417 +>>> prep(); print hash(test5.f('file2-basetests', 'rb')) +2034921519 + +>>> print test5.f2(4,5,6) +(6, 5, 4) +>>> print test5.f2(4,5,(6,)) +(6, 5, 4) + +>>> assert_true(test5.f3(15, 32) == (clamp(64424509440L), 30, +... clamp(32212254720L), 0, 7, 0)) +Ok +>>> assert_true(test5.f3(15, 31) == (clamp(32212254720L), 30, +... clamp(32212254720L), 0, 7, 0)) +Ok +>>> assert_true(test5.f3(15, 33) == (clamp(128849018880L), 30, +... clamp(32212254720L), 0, 7, 0)) +Ok +>>> assert_true(test5.f3(15, 63) == (clamp(138350580552821637120L), 30, +... clamp(32212254720L), 0, 7, 0)) +Ok +>>> assert_true(test5.f3(-15, 63) == (clamp(-138350580552821637120L), -30, +... clamp(-32212254720L), -1, -8, -1)) +Ok +>>> assert_true(test5.f3(-15, 32) == (clamp(-64424509440L), -30, +... clamp(-32212254720L), -1, -8, -1)) +Ok +>>> assert_true(test5.f3(-15, 31) == (clamp(-32212254720L), -30, +... clamp(-32212254720L), -1, -8, -1)) +Ok +>>> assert_true(test5.f3(-15, 33) == (clamp(-128849018880L), -30, +... clamp(-32212254720L), -1, -8, -1)) +Ok +>>> assert_true(test5.f3(-15, 2) == (-60, -30, +... clamp(-32212254720L), -4, -8, -1)) +Ok +>>> assert_true(test5.f3(-15, 1) == (-30, -30, +... clamp(-32212254720L), -8, -8, -1)) +Ok +>>> assert_true(test5.f3(-15, 0) == (-15, -30, +... clamp(-32212254720L), -15, -8, -1)) +Ok +>>> assert_true(test5.f3(15, 0) == (15, 30, +... clamp(32212254720L), 15, 7, 0)) +Ok +>>> assert_true(test5.f3(15, 1) == (30, 30, +... clamp(32212254720L), 7, 7, 0)) +Ok +>>> assert_true(test5.f3(15, 2) == (60, 30, +... clamp(32212254720L), 3, 7, 0)) +Ok +>>> assert_true(test5.f3(-1, 0) == (-1, -2, -2147483648L, -1, -1, -1)) +Ok + +>>> print test5.f4("some-string") +abcsome-string + +>>> print test5.overflowtest() +-3851407362L + +>>> test5.booltest() +${False} +${True} +${False} +${True} +${False} +${True} +${[a & b for a in (False,True) for b in (False,True)]} +${[a | b for a in (False,True) for b in (False,True)]} +${[a ^ b for a in (False,True) for b in (False,True)]} +${True} + +>>> test5.exc_test() +IndexError list index out of range +2 + +>>> test5.seqrepeat() +'abcabcabcabcabc' +'abcabcabcabcabc' +[3, 'z', 3, 'z', 3, 'z', 3, 'z', 3, 'z'] +[6, 3, 6, 3, 6, 3, 6, 3, 6, 3] +'yyyyyx' +'abcabcabcabcabcabc' +'abcabcabcabcabcabc' +[3, 'z', 3, 'z', 3, 'z', 3, 'z', 3, 'z', 3, 'z'] +[6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3] +'yyyyyyx' +'' +'' +[] +[] +'x' + +>>> test5.f5(99) +100 +100 +4 +100 + +>>> test5.f5(-3.0) +-2.0 +-2.0 +4 +-2.0 + +>>> test5.f6(3) +None +None +None +None +5 + +>>> test5.f6(-2) +-1 +-1 +None +-1 +48 + +>>> test5.f6(99) +100 +100 +None +100 +IndexError + +>>> test5.f6("error") +TypeError + +>>> test5.f7(8) +[8, 75, 121] +[8, 15, 11] + +>>> test5.f7(8.5) +[8.5, 75, 121] +[8.5, 15, 11] + +>>> test5.f8(8) +[0, 30, 44] +[0.0, 0.0, 0.0] + +>>> test5.f8(8.5) +[0.0, 30, 44] +[0.0, 0.0, 0.0] + +>>> print test5.f9(10) +(4, 11) + +>>> assert_true(PY21 or test5.f9(sys.maxint) == (4, 2147483648L)) +Ok + +>>> test5.teststrings() +'userhruuiadsfz1if623opadoa8ua09q34rx093q\x00qw09exdqw0e9dqw9e8d8qw9r8qw\x1d\xd7\xae\xa2\x06\x10\x1a\x00a\xff\xf6\xee\x15\xa2\xea\x89akjsdfhqweirewru 3498cr 3849rx398du389du389dur398d31623' +'someanother' +'userhru.' +'.userhru' +'userhruuiadsfz' +'akjsdfhqweirewru 3498cr 3849rx398du389du389dur398d31623\x1d\xd7\xae\xa2\x06\x10\x1a\x00a\xff\xf6\xee\x15\xa2\xea\x89qw09exdqw0e9dqw9e8d8qw9r8qw\x0009q34rx093qoa8uaopad623if1uiadsfzuserhru' +1 +'a' +'sdfhqweirewru 3498cr 3849rx398du389du389dur398d3' +1 +1 +0 +1 + +>>> test5.testslices('hello') +'' +'hello' +'hello' +'' +'hello' +'hello' +'' +'ello' +'ello' +'' +'' +'' + +>>> test5.testovf(1987654321, 2012345789) +4000000110 +4012345789 +3987654321 +-24691468 +-12345789 +-12345679 +3999847802852004269 +4024691578000000000 +3975308642000000000 +1987654321 +-1987654321 +1987654321 + +>>> test5.testovf(-2147483647-1, 2012345789) +-135137859 +4012345789 +-147483648 +-4159829437 +-12345789 +-4147483648 +-4321479675999158272 +4024691578000000000 +-4294967296000000000 +-2147483648 +2147483648 +2147483648 + +>>> test5.testovf(-2147483647-1, -2147483647-1) +-4294967296 +-147483648 +-147483648 +0 +4147483648 +-4147483648 +4611686018427387904 +-4294967296000000000 +-4294967296000000000 +-2147483648 +2147483648 +2147483648 + +>>> test5.rangetypetest(12) +list +list +list +xrange +xrange +xrange + +>>> test5.rangetest(15) +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 +10 11 12 13 14 +15 14 13 12 11 + +>>> test5.xrangetest(15) +0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 +10 11 12 13 14 +15 14 13 12 11 + +>>> test5.longrangetest() +[1234567890123456789L, 1234567890123456790L] + +>>> print list(xrange(10)) +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + +>>> x = xrange(10); print sys.getrefcount(x); print list(x) +2 +[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + +>>> print list(xrange(-2, 5)) +[-2, -1, 0, 1, 2, 3, 4] + +>>> print list(xrange(-2, 5, 2)) +[-2, 0, 2, 4] + +>>> print list(xrange(-2, 5, -2)) +[] + +>>> print list(xrange(5, -2, -2)) +[5, 3, 1, -1] + +>>> test5.arraytest() +S + +>>> test5.proxy_defargs() +12 + +>>> test5.setfilter() +('f1', 1) +('f2', 0) + +>>> test5.makeSelection() +do stuff here + +>>> test5.class_creation_1(1111) +ok + +>>> test5.class_creation_2(1111) +ok + +>>> test5.class_creation_3() +ok + +>>> test5.class_creation_4(1111) +ok + +>>> test5.power_int(1) +332833500 + +>>> test5.power_int(10) +332833500 + +>>> test5.power_int_long(1) +long 332833500 + +>>> test5.power_int_long(10) +long 332833500 + +>>> test5.power_float(1) +float 7038164 + +>>> test5.power_float(10) +float 7038164 + +>>> test5.conditional_doubletest_fold() +ok(1) +ok(2) + +>>> test5.importname(['ab', 'cd', 'ef']) +Ok + +>>> test5.sharedlists(3); test5.sharedlists(12) +4 +8 + +>>> test5.variousslices() +slice(4, None, None) +slice(None, 7, None) +slice(9, 'hello', None) +slice('world', None, None) +slice(1, 10, 'hello') +4 2147483647 +0 7 +slice(9, 'hello', None) +slice('world', None, None) +slice(1, 10, 'hello') + +>>> test5.listgetitem() +foobar +Ok + +>>> test5.negintpow(8) +0.015625 + + ########################### + #### COMPACTOBJECT #### + ########################### + +>>> for i in range(5): print compactobject.do_test(i) or i +0 +1 +2 +3 +4 + +>>> for i in range(5, 10): +... compactobject.do_test(i, +... do_test_1=psyco.proxy(compactobject.do_test_1)) +... print i +5 +6 +7 +8 +9 + +>>> compactobject.pcompact_test() +13 +hello +None + +>>> compactobject.pcompact_creat('hel' + 'lo') +(0, 0, 0) 3 None hello +(0, 1, 2) 4 None hello +(0, 2, 4) 5 None hello +(0, 3, 6) 6 None hello +(0, 4, 8) 7 None hello +(0, 5, 10) 8 None hello +(0, 6, 12) 9 None hello +(0, 7, 14) 10 None hello +(0, 8, 16) 11 None hello +(0, 9, 18) 12 None hello +(0, 10, 20) 13 None hello +11 +0 + +>>> compactobject.pcompact_modif('hel' + 'lo') +hello 1 0 1 +hello 1 0 2 +hello 1 0 3 +hello 1 0 4 +hello 1 0 5 +hello 1 0 6 +hello 1 0 7 +hello 1 0 8 +hello 1 0 9 +hello 1 0 10 +hello 1 0 11 +hello 1 0 12 +hello 1 0 13 +hello 1 0 14 +hello 1 0 15 +hello 1 0 16 +hello 1 0 17 +hello 1 0 18 +hello 1 0 19 +hello 1 0 20 +hello 1 0 21 +0 diff --git a/nodeboxgl/ext/psyco/src/test/classicregrtest.py b/nodeboxgl/ext/psyco/src/test/classicregrtest.py new file mode 100644 index 0000000..7d72223 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/classicregrtest.py @@ -0,0 +1,178 @@ +import sys, os, StringIO, psyco, psyco.logger + +LOGFILE = 'log-regrtest-psyco' + + +#NO_SYS_GETFRAME = """using sys._getframe() fails with Psyco""" + +#NO_THREAD = """XXX not reliable, check if Psyco is generally +# unreliable with threads or if there is another problem""" + +#NO_PICKLE = """pickles function objects that Psyco rebinds""" + +#NO_SYS_EXC = """XXX Psyco does not set sys.exc_xxx upon exception""" + + +SKIP = {'test_gc': "test_gc.test_frame() does not create a cycle with Psyco's limited frames", +# 'test_thread': NO_THREAD, +# 'test_asynchat': NO_THREAD, +# 'test_extcall': 'prints to stdout a function object that Psyco rebinds', + 'test_descr': 'seems that it mutates user-defined types and Psyco does not like it at all', +# 'test_pickle': NO_PICKLE, +# 'test_cpickle': NO_PICKLE, +# 'test_re': NO_PICKLE, +# 'test_sre': NO_SYS_EXC, +# 'test_string': NO_SYS_EXC, +# 'test_unicode': NO_SYS_EXC, +# 'test_inspect': 'gets confused with Psyco rebinding functions', + 'test_profilehooks': 'profiling does not see all functions run by Psyco', + 'test_profile': 'profiling does not see all functions run by Psyco', + 'test_repr': 'self-nested tuples and lists not supported', + 'test_builtin': 'vars() and locals() not supported', + 'test_inspect': 'does not run even in Python (when called the way classicregrtest.py calls it) and leaves buggy temp files around', + 'test_trace': 'no line tracing with Psyco', + 'test_threaded_import': 'Python hang-ups', + 'test_hotshot': "PyEval_SetProfile(NULL,NULL) doesn't allow Psyco to take control back", + 'test_coercion': 'uses eval() with locals', + 'test_weakref': 'incompatible with early unused variable deletion', + } +# SKIP['test_operator'] = NO_SYS_EXC +# SKIP['test_strop'] = NO_SYS_EXC +if sys.version_info[:2] >= (2,3): + SKIP['test_threadedtempfile'] = 'Python bug: Python test just hangs up' + +if hasattr(psyco._psyco, 'VERBOSE_LEVEL'): + SKIP['test_popen2'] = 'gets confused by Psyco debugging output to stderr' + +GROUP_TESTS = 5 # number of tests to run per Python process + + +if '' in sys.path: + sys.path.remove('') # don't import the test.py in this directory! + +from test import regrtest, test_support + +repeat_counter = 4 + + +def alltests(): + import random + # randomize the list of tests, but try to ensure that we start with + # not-already-seen tests and only after go on with the rest + try: + os.unlink(LOGFILE) + except OSError: + pass + filename = "tmp_tests_passed" + try: + f = open(filename) + tests_passed = eval(f.read()) + f.close() + except IOError: + tests_passed = {} + testlist = regrtest.findtests() + testlist = [test for test in testlist if not tests_passed.has_key(test)] + random.shuffle(testlist) + testlist1 = tests_passed.keys() + random.shuffle(testlist1) + print '\t'.join(['Scheduled tests:']+testlist) + if testlist1: + print '%d more tests were already passed and are scheduled to run thereafter.' % len(testlist1) + testlist += testlist1 + while testlist: + print '='*40 + tests1 = testlist[:GROUP_TESTS] + del testlist[:GROUP_TESTS] + err = os.system('"%s" %s %s' % (sys.executable, sys.argv[0], + ' '.join(tests1))) + if err: + print '*** exited with error code', err + return err + for test in tests1: + tests_passed[test] = 1 + f = open(filename, 'w') + f.write(repr(tests_passed)) + f.close() + print "="*60 + print + print "Classic Regression Tests with Psyco successfully completed." + print "All tests that succeeded twice in the same Python process" + print "also succeeded %d more times with Psyco activated." % repeat_counter + print + try: + os.unlink(filename) + except: + pass + print "Psyco compilation flags:", + d = psyco._psyco.__dict__ + if not d.has_key('ALL_CHECKS'): + print "Release mode", + for key in d.keys(): + if key == key.upper() and type(d[key]) == type(0): + print "%s=%s" % (key, hex(d[key])), + print + +def python_check(test): + if SKIP.has_key(test): + print '%s skipped -- %s' % (test, SKIP[test]) + return 0 + for i in range(min(repeat_counter, 2)): + print '%s, Python iteration %d' % (test, i+1) + ok = regrtest.runtest(test, 0, 0, 0) + special_cleanup() + if ok <= 0: + return 0 # skipped or failed -- don't test with Psyco + return 1 + +def main(testlist, verbose=0, use_resources=None): + if use_resources is None: + use_resources = [] + test_support.verbose = verbose # Tell tests to be moderately quiet + test_support.use_resources = use_resources + + if type(testlist) == type(""): + testlist = [testlist] + if not verbose: + testlist = filter(python_check, testlist) + + # Psyco selective compilation is only activated here + psyco.log(LOGFILE, 'a') + for test in testlist: + psyco.logger.write('with test ' + test, 1) + psyco.full() + #print "sleeping, time for a Ctrl-C !..." + #import time; time.sleep(1.5) + + + for test in testlist: + for i in range(repeat_counter): + print '%s, Psyco iteration %d' % (test, i+1) + ok = regrtest.runtest(test, 0, verbose, 0) + special_cleanup() + if ok == 0: + return 0 + elif ok < 0: + break + return 1 + +def special_cleanup(): + try: + dircache = sys.modules['dircache'] + except KeyError: + pass + else: + for key in dircache.cache.keys(): + del dircache.cache[key] + + +if __name__ == '__main__': + if len(sys.argv) <= 1: + sys.exit(alltests() or 0) + else: + try: + err = not main(sys.argv[1:]) + finally: + # Write psyco.dump + psyco.dumpcodebuf() + if err: + sys.exit(2) diff --git a/nodeboxgl/ext/psyco/src/test/file1-basetests b/nodeboxgl/ext/psyco/src/test/file1-basetests new file mode 100644 index 0000000..24b52a7 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/file1-basetests @@ -0,0 +1,271 @@ + /***************************************************************/ +/*** Tybony Cflpb qrsvavgvbaf ***/ + /***************************************************************/ + +#vsaqrs _CFLPB_U +#qrsvar _CFLPB_U + + +#vapyhqr +#vapyhqr /* sbe bssfrgbs() */ + + +/*****************************************************************/ + /*** Inevbhf phfgbzvmnoyr cnenzrgref (hfr lbhe pbzcvyref' ***/ + /*** bcgvba gb bireevqr gurz, r.t. -QKKK=inyhr va tpp) ***/ + + /* frg gb 0 gb qvfnoyr nyy qrohttvat purpxf naq bhgchg */ +#vsaqrs CFLPB_QROHT +# qrsvar CFLPB_QROHT 0 +#raqvs + + + /* qrsvar gb 1 sbe rkgen nffreg()'f */ +#vsaqrs NYY_PURPXF +# qrsvar NYY_PURPXF (CFLPB_QROHT ? 1 : 0) +#raqvs + + /* yriry bs qrohttvat bhgchgf: 0 = abar, 1 = n srj, 2 = zber, + 3 = qrgnvyyrq, 4 = shyy rkrphgvba genpr */ +#vsaqrs IREOBFR_YRIRY +# qrsvar IREOBFR_YRIRY (CFLPB_QROHT ? 0 : 0) +#raqvs + + /* qhzc vasbezngvba nobhg cebsvyvat naq fgngvfgvpf */ +#vsaqrs IREOBFR_FGNGF +# qrsvar IREOBFR_FGNGF (IREOBFR_YRIRY>=2) +#raqvs + + /* qrsvar sbe *urnil* zrzbel purpxvat: 0 = bss, 1 = ernfbanoyl urnil, + 2 = haernfbanoyl urnil */ +#vsaqrs URNIL_ZRZ_PURPX +# qrsvar URNIL_ZRZ_PURPX (CFLPB_QROHT ? 0 : 0) +#raqvs +#vsqrs ZF_JVA32 +# haqrs URNIL_ZRZ_PURPX +# qrsvar URNIL_ZRZ_PURPX 0 /* abg fhccbegrq ba Jvaqbjf */ +#raqvs + + /* qrsvar gb jevgr cebqhprq oybpxf bs pbqr vagb n svyr; frr 'knz.cl' + 0 = bss, 1 = bayl znahnyyl (sebz n qrohttre be jvgu _cflpb.qhzcpbqrohs()), + 2 = bayl jura ergheavat sebz Cflpb, + 3 = rirel gvzr n arj pbqr oybpx vf ohvyg */ +#vsaqrs PBQR_QHZC +# qrsvar PBQR_QHZC (CFLPB_QROHT ? 1 : 0) +#raqvs + +#vs PBQR_QHZC && !qrsvarq(PBQR_QHZC_SVYR) +# qrsvar PBQR_QHZC_SVYR "cflpb.qhzc" +#raqvs + + /* qrsvar gb vayvar gur zbfg pbzzba shapgvbaf va gur cebqhprq pbqr + (fubhyq or ranoyrq hayrff lbh jnag gb genqr pbqr fvmr sbe fcrrq) */ +#vsaqrs VAYVAR_PBZZBA_SHAPGVBAF +# qrsvar VAYVAR_PBZZBA_SHAPGVBAF 1 +#raqvs + +#vs PBQR_QHZC && qrsvarq(UNIR_QYSPA_U) + /* qrsvar gb ybpngr funerq flzobyf naq jevgr gurz va PBQR_QHZC_SVYR + erdhverf gur TAH rkgrafvba qynqqe() va + Abg ernyyl hfrshy, bayl svaqf aba-fgngvp flzobyf. */ +/*# vapyhqr + # qrsvar PBQR_QHZC_FLZOBYF*/ +#raqvs + +#qrsvar QRSNHYG_ERPHEFVBA 10 /* qrsnhyg inyhr sbe gur 'erp' nethzrag */ + + +/*****************************************************************/ + +/* Fvmr bs ohssre gb nyybpngr jura rzvggvat pbqr. + Pna or nf ynetr nf lbh yvxr (zbfg BFrf jvyy abg npghnyyl nyybpngr + ENZ cntrf orsber gurl ner npghnyyl hfrq). Jr ab ybatre cresbez + nal ernyybp() ba guvf; n fvatyr nyybpngrq pbqr ertvba vf erhfrq + sbe nyy pbqr ohssref hagvy vg vf rkunhfgrq. Gurer ner OHSSRE_ZNETVA + hahfrq olgrf ng gur raq, fb OVT_OHSSRE_FVMR unf orggre or ynetr gb + zvavzvmr guvf rssrpg. + Yvahk abgr: V'ir frra va zl irefvba bs tyvop'f znyybp() gung vg + hfrf zznc sbe fvmrf >= 128x, naq gung vg jvyy ershfr gur hfr zznc + zber guna 1024 gvzrf, juvpu zrnaf gung vs lbh nyybpngr oybpxf bs + 128x lbh pnaabg nyybpngr zber guna 128Z va gbgny. + Abgr gung Cflpb jvyy hfhnyyl nyybpngr naq svyy gjb ohssref va + cnenyyry, ol gur jnl ipbzcvyre.p jbexf. Ubjrire, vg bppnfvbanyyl + arrqf zber; pbqrznantre.p pna unaqyr nal ahzore bs cnenyyryl-tebjvat + ohssref. Gurer vf n fnsrthneq va ipbzcvyre.p gb chg na hccre obhaq + ba guvf ahzore (pheeragyl fubhyq abg rkprrq 4). + Va qrohttvat zbqr, jr hfr n fznyy fvmr gb fgerff gur ohssre- + pbagvahngvba pbqvat ebhgvarf. */ +#vsaqrs OVT_OHSSRE_FVMR +# qrsvar OVT_OHSSRE_FVMR (CFLPB_QROHT ? 2*OHSSRE_ZNETVA : 0k100000) +#raqvs + +/* N fnsrgl znetva sbe bppnfvbany biresybjf: jr zvtug jevgr n srj + vafgehpgvbaf gbb zhpu orsber jr ernyvmr jr jebgr cnfg 'pbqryvzvg'. + KKK pnershyyl purpx gung vg vf vzcbffvoyr gb biresybj ol zber + Jr arrq zber guna 128 olgrf orpnhfr bs gur jnl pbaqvgvbany whzcf + ner rzvggrq; frr clpbzcvyre.p. + Gur RAQ_PBQR znpeb gevttref n fvyrag ohssre punatr vs fcnpr vf + trggvat irel ybj -- yrff guna THNENAGRRQ_ZVAVZHZ */ +#vsaqrs OHSSRE_ZNETVA +# qrsvar OHSSRE_ZNETVA 1024 +#raqvs + +/* Jura rzvggvat pbqr, nyy pnyyrq shapgvbaf pna nffhzr gung gurl + unir ng yrnfg guvf nzbhag bs ebbz gb jevgr gurve pbqr. Vs gurl + zvtug arrq zber, gurl unir gb nyybpngr arj ohssref naq jevgr n + whzc gb gurfr sebz gur bevtvany pbqr (whzcf pna or qbar va yrff + guna THNENAGRRQ_ZVAVZHZ olgrf). */ +#vsaqrs THNENAGRRQ_ZVAVZHZ +# qrsvar THNENAGRRQ_ZVAVZHZ 64 +#raqvs + + +#vsaqrs NYY_FGNGVP +# qrsvar NYY_FGNGVP 0 /* znxr nyy shapgvbaf fgngvp; frg gb 1 ol unpx.p */ +#raqvs + +#vs NYY_FGNGVP +# qrsvar RKGREAINE fgngvpsbejneq +# qrsvar RKGREASA fgngvp +# qrsvar QRSVARINE fgngvpurer +# qrsvar QRSVARSA fgngvp +# qrsvar VAVGVNYVMNGVBASA vayvar +#ryfr +# qrsvar RKGREAINE +# qrsvar RKGREASA +# qrsvar QRSVARINE +# qrsvar QRSVARSA +# qrsvar VAVGVNYVMNGVBASA QRSVARSA +#raqvs + +#vs NYY_PURPXF +# qrsvar ZNYYBP_PURPX_ 2 /* TPP znyybp() purpxf */ +# haqrs AQROHT +# vapyhqr +# vs PBQR_QHZC +# qrsvar rkgen_nffreg(k) ((k) ? (ibvq)0 : (cflpb_qhzc_pbqr_ohssref(), \ + nffreg(k), nffreg(!"ibyngvyr nffregvba"))) +# ryfr +# qrsvar rkgen_nffreg(k) nffreg(k) +# raqvs +#ryfr +# qrsvar rkgen_nffreg(k) (ibvq)0 /* abguvat */ +#raqvs + +#vs IREOBFR_YRIRY +# qrsvar qroht_cevags(yriry, netf) qb { \ + vs (IREOBFR_YRIRY >= (yriry)) { \ + cflpb_qroht_cevags netf; \ + } \ + vs (cflpb_ybttre && (yriry) == 1) { \ + cflpb_sybt netf; \ + } \ + } juvyr (0) +RKGREASA ibvq cflpb_qroht_cevags(pune* zft, ...); +#ryfr +# qrsvar qroht_cevags(yriry, netf) qb { \ + vs (cflpb_ybttre && (yriry) == 1) { \ + cflpb_sybt netf; \ + } \ + } juvyr (0) +#raqvs +RKGREAINE ClBowrpg* cflpb_ybttre; +RKGREASA ibvq cflpb_sybt(pune* zft, ...); + +#vs IREOBFR_YRIRY >= 4 +# qrsvar GENPR_RKRPHGVBA(zft) qb { \ + ORTVA_PBQR RZVG_GENPR(zft, cflpb_genpr_rkrphgvba); RAQ_PBQR } juvyr (0) +# qrsvar GENPR_RKRPHGVBA_ABREE(zft) qb { \ + ORTVA_PBQR RZVG_GENPR(zft, cflpb_genpr_rkrphgvba_abree); RAQ_PBQR } juvyr (0) +RKGREASA ibvq cflpb_genpr_rkrphgvba(pune* zft, ibvq* pbqr_cbfvgvba); +RKGREASA ibvq cflpb_genpr_rkrphgvba_abree(pune* zft, ibvq* pbqr_cbfvgvba); +#ryfr +# qrsvar GENPR_RKRPHGVBA(zft) qb { } juvyr (0) /* abguvat */ +# qrsvar GENPR_RKRPHGVBA_ABREE(zft) qb { } juvyr (0) /* abguvat */ +#raqvs + + +#vs VAYVAR_PBZZBA_SHAPGVBAF +# qrsvar vayvar __vayvar fgngvp +#ryfr +# qrsvar vayvar fgngvp +#raqvs + +#vs URNIL_ZRZ_PURPX +# vapyhqr "yvahkzrzpux.u" +# vs URNIL_ZRZ_PURPX > 1 +# qrsvar CFLPB_AB_YVAXRQ_YVFGF +# raqvs +#raqvs + + +#vsaqrs obby +glcrqrs vag obby; +#raqvs +#vsaqrs snyfr +# qrsvar snyfr 0 +#raqvs +#vsaqrs gehr +# qrsvar gehr 1 +#raqvs + +#vsaqrs ClBowrpg_GlcrPurpx +# qrsvar ClBowrpg_GlcrPurpx(b,g) ((b)->bo_glcr == (g)) +#raqvs + + +glcrqrs hafvtarq pune pbqr_g; + +glcrqrs fgehpg ivasb_f ivasb_g; /* qrsvarq va pbzcvyre.u */ +glcrqrs fgehpg ivasb_neenl_f ivasb_neenl_g; /* qrsvarq va pbzcvyre.u */ +glcrqrs fgehpg CflpbBowrpg_f CflpbBowrpg; /* qrsvarq va pbzcvyre.u */ +glcrqrs fgehpg SebmraCflpbBowrpg_f SebmraCflpbBowrpg; /* qrs va qvfcngpure.u */ +glcrqrs fgehpg PbqrOhssreBowrpg_f PbqrOhssreBowrpg; /* qrs va pbqrznantre.u */ +glcrqrs fgehpg tybony_ragevrf_f tybony_ragevrf_g; /* qrs va qvfcngpure.u */ +glcrqrs fgehpg zretrcbvag_f zretrcbvag_g; /* qrsvarq va zretrcbvag.u */ +glcrqrs fgehpg fgnpx_senzr_vasb_f fgnpx_senzr_vasb_g; /* qrs va clpbzcvyre.u */ + +RKGREAINE ClBowrpg* ClRkp_CflpbReebe; +RKGREAINE ybat cflpb_zrzbel_hfntr; /* nccebkvzngvir */ + + +/* zbirq urer sebz ipbzcvyre.u orpnhfr arrqrq ol ahzrebhf urnqre svyrf */ +glcrqrs obby (*pbzchgr_sa_g)(CflpbBowrpg* cb, ivasb_g* iv, obby sbexvat); +glcrqrs fgehpg { + pbzchgr_sa_g pbzchgr_sa; +} fbhepr_iveghny_g; + + +#vs PBQR_QHZC +RKGREASA ibvq cflpb_qhzc_pbqr_ohssref(ibvq); +#raqvs +#vs PBQR_QHZC >= 3 +# qrsvar qhzc_pbqr_ohssref() cflpb_qhzc_pbqr_ohssref() +#ryfr +# qrsvar qhzc_pbqr_ohssref() qb { } juvyr (0) /* abguvat */ +#raqvs + +/* gb qvfcynl pbqr bowrpg anzrf */ +#qrsvar ClPbqrBowrpg_ANZR(pb) (pb->pb_anzr ? ClFgevat_NF_FGEVAT(pb->pb_anzr) \ + : "") + + +/* qrsvarq va clpbzcvyre.p */ +#qrsvar TYBONY_RAGEL_CBVAG cflpb_clpbzcvyre_znvaybbc +RKGREASA pbqr_g* cflpb_clpbzcvyre_znvaybbc(CflpbBowrpg* cb); + + +/* KKK ab unaqyvat bs bhg-bs-zrzbel pbaqvgvbaf. Jr unir gb qrsvar cerpvfryl + jung fubhyq bpphe va inevbhf pnfrf, yvxr jura jr eha bhg bs zrzbel va gur + zvqqyr bs jevgvat pbqr, jura gur ortvaavat vf nyernql rkrphgvat. Jura + fubhyq jr ercbeg gur rkprcgvba? */ +#qrsvar BHG_BS_ZRZBEL() Cl_SngnyReebe("cflpb: bhg bs zrzbel") + +/* Guernq-fcrpvsvp fgngr */ +RKGREASA ClBowrpg* cflpb_guernq_qvpg(ibvq); + +/* qrsvarq va qvfcngpure.p */ +RKGREASA ibvq CflpbBowrpg_RzretraplPbqrEbbz(CflpbBowrpg* cb); + + +#raqvs /* _CFLPB_U */ diff --git a/nodeboxgl/ext/psyco/src/test/file2-basetests.uu b/nodeboxgl/ext/psyco/src/test/file2-basetests.uu new file mode 100644 index 0000000..6186947 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/file2-basetests.uu @@ -0,0 +1,95 @@ +begin 644 file2-basetests +ML&">,WFJ:%-/]+?H7,%/!1MX8]5(.#Z$;FMMEFHA8N\]<]CRG8@SGKY3*\$1Q@PV7+8JZZQG +MK>P<,C_W1#0A\8@<.&VVX,&-W>FP@%63QMP=$1%\'Y$29N=,$GG +MJ[0.AZ#[P$V^6C% :D2&R>\0"W89VICRX*24;:BEX#"7K5QSS@:;+A%4^_R5 +M@9HF2XGUUS%_0QASXV 2_[4@@C%P"(2<&^HZLW;].HV]O&YZ=GE&V[N$JI-= +M#F9^[ISE:$UAJ66_K=K2DCF8857+!*P7E*-LYX1UE6W8V2J;++6 [#!.[4_B +M_$>J_Q:3)-'5TLRF_QIR%0R*.:'/\N11E4D=$[WAY#HQ&M0#?YR3VCH;_ ,JE??@HW]H=FY%L_Y":?IED\)5 +M;L[PT?)G>PVH]B7#?<2)DQC.$2'35>M,RO\CJ)EE!>FO1BS>2%7ES#Q)3?!/ +MSA"%UG7$W+FEMV@DF5OPJLI*@R0:KTLNQ"YF,BNJR&ES7(%(D-2^FM?,&G&Z +M6?ME_C!-/$MQ)B^=Q[V7>-QQF6Y=A,,G0Z89E +M^N98$#NX7;_R%^SK"E',0*@/W DTI0Z$?E+=;C?>*MD7;=XF,RW:[H@A201 +M$D.=]@%B7B@-[1XY]:FC\@D.P#&Y7JM")L=I]ZGTP7UYQKO<7AR?"UKN2V Q +M*P$9:@SU*:&PKF<*+4#_VA]B_/'!3#5[=R%HA9E8.3X_=,'8(2**"_:>F"/M +MPPQ_7M>NI0RYX=@S,",-K]D=0J8(/70\E4Q'&7PAU/+M%[2U^-M4R)' '00; +MH99#U*B;[EDF7SJX3,V#TJA1DXD+#CBMBY)?U7@S*="' L++"M("%(5QN/$) +M@H;XXA?VFAW/;(OC6 LOTO<+LY.\A%1R,O^)O-B7+[JH$-\L@J!2^^176^26 +M7LXQ1!-Y>)/,T"MR#7B-?V\W>I)!12W_=(A0D%F/;]FF8NHR8W?'T\-40GR! +MH6M0WG()XANDMC;\UB_C)V&=E;WRA<61D)C%RH,/"@%JUXV'KH-HFM'M\-[. +MB.V@73,Q(:BVE998U78C4_WU7'#OOI!%YX9K_U-R+SA:0^0=G/Y%?.^\^RB< +M6P)KC[:'LA-CZZ>L$@='5*U[5]Z$4?J'46U/3EO7G ^Y.2Y' O7]>\:1#/5VGC#C/'1"5H$BUF +M9<>9KP^&E$>D="*.+WG=M%SSJIQ8WM>\292#>(! >$0@]1(+NJA(<:8DCM$F +M%[%"'MXH9G9.1>H4>9$8YORS+05> &>M+!#E?O@ZDP(A-WS5$S[ 7C6CFE'! +MV >BR@N$5"HZ0LP8\29?#KU+.><=7'%)8(U+:XO!\Q08!Q)N#-DFX:'?D+6- +M&BSG!C2G[X(U8P5SNA[1"3G9[SVTQ[[,/.[>0W&5.$>@'AM$,7?0:5PV_0[= +M -?-" H:>V2C@<;T"0#Z+7<,HBV(=#RLSA1ZH@N\IB%^KAAI_P,1M _YON#K +ML",:MI_*;SOAQ"3\^/HY5\\XY2K3V6'$T(F@4Y3:0_1=>.NV;=OH B9#+87I +M,E6GXUB&Z4NY?RFH!&[ [[YQDU[4#U%Y1'32M'ATMCXWTMR&O)%G &7VJ-C&SZI]>$;A_)6HU.%N6GC/P +MD6VY]&CFSZ^RS-I%_.G0^%)]&/7.9784 +MF2P]"7,K"// V>E;M@;\>09=5B"XRR%)I=9;0FK=F/$J!8(;G%@"%5E+4Q[9 +MGB.*PA#Y!>=AC[OCA-)5.U\T5GC!;4-A__S,V-J6+7$H91T]'^* _GZ +M"5+5X\8Z_NKPBPGJC)_B3FN=Q&6]"67Y950<8$!W@ALS*,<;;47R&A=5+'4< +M:AL+-;;+'#OH>]X[LMG!8D>S]NQ:&N3*?#9X) NZ7W%S;R1'8 &L'V(FVHQT +M@#\H60RP,Q[PK^#CBM77:K?=X0?%2?DHXQ+@"/["<@"S97_<>:F$)AJL\75H +M4^G+A>/6ZNIOR/825=EZ1SK\G\PHRIM;LP&SIH29@[IM/FE*Y8X!@6H3KL,D +M!6XE2E]7RCO+PKVL09P%BX,0\S:QYV?H9B21L(*#:>Z Y>(U=SBNM?K@[-,9 +M6%8)G@;,J"IY#)L"!*FV&OPT^VI+T% +M5*B@:L/+MYW*6&V<%@KC%WVI6M22,Q[7 '>3W/1D;WLZ]^1J52J3F=@]M,*0 +M7H33-%QPEY8+O)QKYF!!.^6OHVXJUBH=-5\I%R!>*O32E!F#N'6'D^-J%>4ENY>[/2UC%=__1A@D +M7T/([EG^6\@X/XZWHSFI"*%;">;DMY4=P-IL_3S7"TM<'"6NX'5?&.I%M7:L +MD6C]N%ED3<,_Q!SI8M!<&Y$XW[#VYY RNJ,&N#<%O[_A=)0L0A\\5H?']BM +M@B3X1>_HQ%;?>H+K:P"YD0=8/,Q2 3H2O^)!@]FSXL!F__^/))1)@!U/AZ%Q +M<:PX%FUVN&0"E%KG#8T %$2S-?5'%]%))%NR1:0"& 8\104@FNY@^6HV&@/> +M*+?#(Z1$:T\WX-SS1WU]W%!=7>IB,D(K0K)@:L]2)/3U^C,C'W!VH?YXW)=KY&'** _4"IY;Z.00BM76 +MB *ZM'"TZ#_ MRU/V)UH"IIVEQ4$G3*2'$0,W/11$$*0 8W26(^U+',5A_<< +MK\$WFSD;>[,N>%'&$'(@\.R+V2AN8/*)L\DQ7/3@^5T'5?L75"6L7.MXI;=-0$E2%UUW[O;QD;)[#GZ(:3RQ!20V]O#R2G$#: 3FO++.TF +MD 3+#4D5V*507K'[3V@(O,1"G.(\+\X<_:#DB<(=,+# +MS@A[6J"*ALS W4-\^J*4WNH47WJR]TAGB?A>B?-?>6[1B%YP[!MIOO+;\I+< +MD6J,&X:A9L!HG5;*9"6XEQS,.C))&/#&!63-4#,Q13L3_'O +M\>WWX>,!_CC8#YV5D*MW7&2QY.L.T$*;-"J1;V5U/PK.$@94#GXM*Z95H_T0 +MX-)6RSD+:G.;FJS')1()FOS. 'D\J-Z$%*!#U,)91'M"V' 5Z !XS"1:/S \ +MO/;YKF/%=^BMW]Z$"X*"56,<";'TUS9+S+>[1Q[L2K=,*!;J!)L2"G',^BH[+D!=.B-TS*P0><25<)Y'96MX5K"J +M_!3H/.0+XP3^]'CN[1KT,WC!%1J*[>#D(QZ6U78*.,=KMQ< +M0-JM&;?\L(-BS[ZI4'LP'738.S$(-3&DX-1E_IV=W=I,)MUECH'C9>:,MPMC +M1> +WE/\%8SL.P"%NIX=V(H/;HT+-OUUVIP5#[@)/GMI'133]FW7F!K\16\" +M3'TD6@53HRS\][\-]^E"[4VBK>"(>1B)5S]-B*]WZL75X!N5SZ4SRS[\W\G* +MP!L";:F0]XN'_RX_ !@$6"+0+_P3@B=+VTK'VXN<'G>+)S7K&O)4'24?TZC +M(-'A+%.0M]891,*E:O.@J,<%H\?-HF6.?(WN/*A%O3@TYY+UB=8ZR>V:AT1? +M>2/CHD8C9QXL7ZW1@JJ??MBK>7D;0(\O6,S]QJR3>'RP@\3*M/TT'QI.TOTF0E5Y)6DR%-L46;M3@<:_TO/^3U8.?A-!"P2=% +M2!7MW5W1A9H8Q=W.>?=3&Y)5U42-!KD"5CZ%9GO-H^EIDA'DEC81NT8NDDG4 +MOE5U5?YO7P&=?XII8R7,4E3CJ:D +M\PBC/";ZV@"<;+E 9_AS =SAA.@<=BHFLKG5G:!'E<:NL=^\7W[V9M-EJ/$I +M+8X4NXAPQ3ZW=0GS3N$0M$K@A8D[S(,+ 8(0J .Q?.(X *<"\X$IQ01B0OCD +M%9O_;4V&1U+6#>IC.7)L]HB3[^YB8>\J1[E,\N+.Y,+]>P]>?A4K#ZF7TKX7 +MV:YA2W'@$R>5707:<6)%5(_L<(-Z':=Z-;8*FZ\ESL0BN.M(A +M%%A=DU)>=7TX/D*"YV0@F?_!68CS)=S^GG)@%NH'NI]A8[>&['\3Q>@#2ZLI +M!J0.>:%SKXLQI/[M!1!.QGOV9\VP);2UT@7]=QE9'L+'ETH%X9!U1C-7W(.I +MTJ2E@;85=B26B"3A;6@'L'&0;BV$70X> sys.stderr, "You must create a file 'fulltester.local' containing a" + print >> sys.stderr, "list of Python executables of various versions." + sys.exit(2) + +PYTHON_VERSIONS = [s.strip() for s in f.readlines()] +f.close() + +PSYCO_MODES = [ + # debugging mode, static compiling + {'PSYCO_DEBUG': 1, 'VERBOSE_LEVEL': 1, 'CODE_DUMP': 1, 'ALL_STATIC': 1}, + # optimized mode, static compiling + {'PSYCO_DEBUG': 0, 'VERBOSE_LEVEL': 0, 'CODE_DUMP': 0, 'ALL_STATIC': 1}, + # debugging mode, IVM virtual processor + {'PSYCO_DEBUG': 1, 'VERBOSE_LEVEL': 1, 'CODE_DUMP': 1, 'ALL_STATIC': 1, + 'PROCESSOR': 'ivm'}, + # optimized mode, IVM virtual processor + {'PSYCO_DEBUG': 0, 'VERBOSE_LEVEL': 0, 'CODE_DUMP': 0, 'ALL_STATIC': 1, + 'PROCESSOR': 'ivm'}, + ] + +FRACTION = 10 + +RUNNING_MODES = [ + ("test_base.py", {}), + ] +for n in range(FRACTION): + RUNNING_MODES.append( + ("regrtester2.py %d/%d -nodump" % (n, FRACTION), + {"regrtester.local": "psyco.full()"})) +for n in range(FRACTION): + RUNNING_MODES.append( + ("regrtester2.py %d/%d -nodump" % (n, FRACTION), + {"regrtester.local": "psyco.profile()"})) + +compiled_version = None + + +def run(path, *argv): + print '='*10, path, ' '.join(argv) + sys.stdout.flush() + path = os.path.expanduser(path) + err = os.spawnv(os.P_WAIT, path, [path]+list(argv)) + if err: + print '='*60 + print '*** exited with error code', err + sys.exit(err) + +def do_compile(python_version, psyco_mode): + print '~'*60 + print psyco_mode + preffile = os.path.join(os.pardir, 'preferences.py') + try: + f = open(preffile, 'r') + backup = f.read() + f.close() + except IOError: + backup = '' + if backup: + print "===== Note: ignoring your custom preferences.py" + cwd = os.getcwd() + try: + f = open(preffile, 'w') + for varvalue in psyco_mode.items(): + f.write('%s = %r\n' % varvalue) + f.close() + os.chdir(os.pardir) + run(python_version, 'setup.py', 'build', '-f') + run(python_version, 'setup.py', 'install_lib') + finally: + os.chdir(cwd) + f = open(preffile, 'w') + f.write(backup) + f.close() + +def test_with(python_version, psyco_mode, running_mode): + # + # Compile the appropriate Psyco version + # + global compiled_version + if (python_version, psyco_mode) != compiled_version: + do_compile(python_version, psyco_mode) + compiled_version = (python_version, psyco_mode) + # + # Prepare the running mode + # + script, prefiles = running_mode + for filename, content in prefiles.items(): + f = open(filename, 'w') + print >> f, content + f.close() + # + # Run it + # + print '='*10, '%s: %s' % ( + psyco_mode['PSYCO_DEBUG'] and "DEBUG" or "RELEASE", + running_mode) + run(python_version, *script.split()) + # + # Passed + # + tests_passed.append((python_version, psyco_mode, running_mode)) + f = open(passed_filename, 'w') + f.write(repr(tests_passed)) + f.close() + # + # Make a little pause to catch our breath again + # + time.sleep(1) + + +def test(): + global tests_passed, passed_filename + passed_filename = "tmp_fulltests_passed" + try: + f = open(passed_filename) + tests_passed = eval(f.read()) + f.close() + except IOError: + tests_passed = [] + + tests = [(python_version, psyco_mode, running_mode) + for python_version in PYTHON_VERSIONS + for psyco_mode in PSYCO_MODES + for running_mode in RUNNING_MODES] + tests.sort() + tests.reverse() + later_tests = [] + for mode in tests: + if mode in tests_passed: + later_tests.append(mode) + else: + test_with(*mode) + for mode in later_tests: + test_with(*mode) + try: + os.unlink(passed_filename) + except: + pass + try: + os.unlink("regrtester.local") + except: + pass + print "="*60 + print + print "The Ultimate Test Suite (tm) passed !" + print + print "="*60 + + +if __name__ == '__main__': + test() diff --git a/nodeboxgl/ext/psyco/src/test/life-psyco.py b/nodeboxgl/ext/psyco/src/test/life-psyco.py new file mode 100755 index 0000000..7411349 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/life-psyco.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python +# ------------------------------------------------ +# Based on "life.py" from the Python distribution. +# The same copyrights apply. +# I only added two lines: +# import psyco +# psyco.bind(LifeBoard) +# Compare this with the speed of the original. +# Armin Rigo +# ------------------------------------------------ +# life.py -- A curses-based version of Conway's Game of Life. +# Contributed by AMK +# +# An empty board will be displayed, and the following commands are available: +# E : Erase the board +# R : Fill the board randomly +# S : Step for a single generation +# C : Update continuously until a key is struck +# Q : Quit +# Cursor keys : Move the cursor around the board +# Space or Enter : Toggle the contents of the cursor's position +# +# TODO : +# Support the mouse +# Use colour if available +# Make board updates faster +# + +class LifeBoard: + """Encapsulates a Life board + + Attributes: + X,Y : horizontal and vertical size of the board + state : dictionary mapping (x,y) to 0 or 1 + + Methods: + display(update_board) -- If update_board is true, compute the + next generation. Then display the state + of the board and refresh the screen. + erase() -- clear the entire board + makeRandom() -- fill the board randomly + set(y,x) -- set the given cell to Live; doesn't refresh the screen + toggle(y,x) -- change the given cell from live to dead, or vice + versa, and refresh the screen display + + """ + def __init__(self, scr, char=ord('*')): + """Create a new LifeBoard instance. + + scr -- curses screen object to use for display + char -- character used to render live cells (default: '*') + """ + self.state={} ; self.scr=scr + Y, X = self.scr.getmaxyx() + self.X, self.Y = X-2, Y-2-1 + self.char = char + self.scr.clear() + + # Draw a border around the board + border_line='+'+(self.X*'-')+'+' + self.scr.addstr(0, 0, border_line) + self.scr.addstr(self.Y+1,0, border_line) + for y in range(0, self.Y): + self.scr.addstr(1+y, 0, '|') + self.scr.addstr(1+y, self.X+1, '|') + self.scr.refresh() + + def set(self, y, x): + """Set a cell to the live state""" + if x<0 or self.X<=x or y<0 or self.Y<=y: + raise ValueError, "Coordinates out of range %i,%i"% (y,x) + self.state[x,y] = 1 + + def toggle(self, y, x): + """Toggle a cell's state between live and dead""" + if x<0 or self.X<=x or y<0 or self.Y<=y: + raise ValueError, "Coordinates out of range %i,%i"% (y,x) + if self.state.has_key( (x,y) ): + del self.state[x,y] + self.scr.addch(y+1, x+1, ' ') + else: + self.state[x,y]=1 + self.scr.addch(y+1, x+1, self.char) + self.scr.refresh() + + def erase(self): + """Clear the entire board and update the board display""" + self.state={} + self.display(update_board=0) + + def display(self, update_board=1): + """Display the whole board, optionally computing one generation""" + M,N = self.X, self.Y + if not update_board: + for i in range(0, M): + for j in range(0, N): + if self.state.has_key( (i,j) ): + self.scr.addch(j+1, i+1, self.char) + else: + self.scr.addch(j+1, i+1, ' ') + self.scr.refresh() + return + + d={} ; self.boring=1 + for i in range(0, M): + L=range( max(0, i-1), min(M, i+2) ) + for j in range(0, N): + s=0 + live=self.state.has_key( (i,j) ) + for k in range( max(0, j-1), min(N, j+2) ): + for l in L: + if self.state.has_key( (l,k) ): + s=s+1 + s=s-live + if s==3: + # Birth + d[i,j]=1 + self.scr.addch(j+1, i+1, self.char) + if not live: self.boring=0 + elif s==2 and live: d[i,j]=1 # Survival + elif live: + # Death + self.scr.addch(j+1, i+1, ' ') + self.boring=0 + self.state=d + self.scr.refresh() + + def makeRandom(self): + "Fill the board with a random pattern" + import whrandom + self.state={} + for i in range(0, self.X): + for j in range(0, self.Y): + if whrandom.random()*10>5.0: self.set(j,i) + + +import psyco +psyco.bind(LifeBoard) + + +def erase_menu(stdscr, menu_y): + "Clear the space where the menu resides" + stdscr.move(menu_y, 0) ; stdscr.clrtoeol() + stdscr.move(menu_y+1, 0) ; stdscr.clrtoeol() + +def display_menu(stdscr, menu_y): + "Display the menu of possible keystroke commands" + erase_menu(stdscr, menu_y) + stdscr.addstr(menu_y, 4, + 'Use the cursor keys to move, and space or Enter to toggle a cell.') + stdscr.addstr(menu_y+1, 4, + 'E)rase the board, R)andom fill, S)tep once or C)ontinuously, Q)uit') + +def main(stdscr): + import string, curses + + # Clear the screen and display the menu of keys + stdscr.clear() + stdscr_y, stdscr_x = stdscr.getmaxyx() + menu_y=(stdscr_y-3)-1 + display_menu(stdscr, menu_y) + + # Allocate a subwindow for the Life board and create the board object + subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0) + board=LifeBoard(subwin, char=ord('*')) + board.display(update_board=0) + + # xpos, ypos are the cursor's position + xpos, ypos = board.X/2, board.Y/2 + + # Main loop: + while (1): + stdscr.move(1+ypos, 1+xpos) # Move the cursor + c=stdscr.getch() # Get a keystroke + if 00: ypos=ypos-1 + elif c==curses.KEY_DOWN and ypos0: xpos=xpos-1 + elif c==curses.KEY_RIGHT and xpos5.0: self.set(j,i) + + +def erase_menu(stdscr, menu_y): + "Clear the space where the menu resides" + stdscr.move(menu_y, 0) ; stdscr.clrtoeol() + stdscr.move(menu_y+1, 0) ; stdscr.clrtoeol() + +def display_menu(stdscr, menu_y): + "Display the menu of possible keystroke commands" + erase_menu(stdscr, menu_y) + stdscr.addstr(menu_y, 4, + 'Use the cursor keys to move, and space or Enter to toggle a cell.') + stdscr.addstr(menu_y+1, 4, + 'E)rase the board, R)andom fill, S)tep once or C)ontinuously, Q)uit') + +def main(stdscr): + import string, curses + + # Clear the screen and display the menu of keys + stdscr.clear() + stdscr_y, stdscr_x = stdscr.getmaxyx() + menu_y=(stdscr_y-3)-1 + display_menu(stdscr, menu_y) + + # Allocate a subwindow for the Life board and create the board object + subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0) + board=LifeBoard(subwin, char=ord('*')) + board.display(update_board=0) + + # xpos, ypos are the cursor's position + xpos, ypos = board.X/2, board.Y/2 + + # Main loop: + while (1): + stdscr.move(1+ypos, 1+xpos) # Move the cursor + c=stdscr.getch() # Get a keystroke + if 00: ypos=ypos-1 + elif c==curses.KEY_DOWN and ypos0: xpos=xpos-1 + elif c==curses.KEY_RIGHT and xpos 100: + EnumParOut = Ident1 + else: + EnumParOut = Ident4 + elif EnumParIn == Ident3: + EnumParOut = Ident2 + elif EnumParIn == Ident4: + pass + elif EnumParIn == Ident5: + EnumParOut = Ident3 + return EnumParOut + +def Proc7(IntParI1, IntParI2): + IntLoc = IntParI1 + 2 + IntParOut = IntParI2 + IntLoc + return IntParOut + +def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): + global IntGlob + + IntLoc = IntParI1 + 5 + Array1Par[IntLoc] = IntParI2 + Array1Par[IntLoc+1] = Array1Par[IntLoc] + Array1Par[IntLoc+30] = IntLoc + for IntIndex in range(IntLoc, IntLoc+2): + Array2Par[IntLoc][IntIndex] = IntLoc + Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1 + Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc] + IntGlob = 5 + +def Func1(CharPar1, CharPar2): + CharLoc1 = CharPar1 + CharLoc2 = CharLoc1 + if CharLoc2 != CharPar2: + return Ident1 + else: + return Ident2 + +def Func2(StrParI1, StrParI2): + IntLoc = 1 + while IntLoc <= 1: + if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1: + CharLoc = 'A' + IntLoc = IntLoc + 1 + if CharLoc >= 'W' and CharLoc <= 'Z': + IntLoc = 7 + if CharLoc == 'X': + return TRUE + else: + if StrParI1 > StrParI2: + IntLoc = IntLoc + 7 + return TRUE + else: + return FALSE + +def Func3(EnumParIn): + EnumLoc = EnumParIn + if EnumLoc == Ident3: return TRUE + return FALSE + +if __name__ == '__main__': + import psyco + psyco.jit(1) + main() + psyco.dumpcodebuf() diff --git a/nodeboxgl/ext/psyco/src/test/pystone.py b/nodeboxgl/ext/psyco/src/test/pystone.py new file mode 100644 index 0000000..8131ed1 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/pystone.py @@ -0,0 +1,307 @@ +#! /usr/bin/env python + +""" +"PYSTONE" Benchmark Program + +Version: Python/1.1 (corresponds to C/1.1 plus 2 Pystone fixes) + +Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013. + + Translated from ADA to C by Rick Richardson. + Every method to preserve ADA-likeness has been used, + at the expense of C-ness. + + Translated from C to Python by Guido van Rossum. + +Version History: + + Version 1.1 corrects two bugs in version 1.0: + + First, it leaked memory: in Proc1(), NextRecord ends + up having a pointer to itself. I have corrected this + by zapping NextRecord.PtrComp at the end of Proc1(). + + Second, Proc3() used the operator != to compare a + record to None. This is rather inefficient and not + true to the intention of the original benchmark (where + a pointer comparison to None is intended; the != + operator attempts to find a method __cmp__ to do value + comparison of the record). Version 1.1 runs 5-10 + percent faster than version 1.0, so benchmark figures + of different versions can't be compared directly. + +""" + +LOOPS = 100000 +LOOPS1 = 100000 # number of loops for the first run of Psyco + +from time import clock + +__version__ = "1.1" + +[Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6) + +class Record: + + def __init__(self, PtrComp = None, Discr = 0, EnumComp = 0, + IntComp = 0, StringComp = 0): + self.PtrComp = PtrComp + self.Discr = Discr + self.EnumComp = EnumComp + self.IntComp = IntComp + self.StringComp = StringComp + + def copy(self): + return Record(self.PtrComp, self.Discr, self.EnumComp, + self.IntComp, self.StringComp) + +TRUE = 1 +FALSE = 0 + +def mydiv(a,b): + try: + return float(a) / b + except: + return float("nan") + +def main(): + print "Pystone(%s) time loops per second" % __version__ + py_time, = pystones_reg(LOOPS1+LOOPS) + pyloop_time = py_time / (LOOPS1+LOOPS) + print "regular Python for %d passes %g %g" % \ + (LOOPS1+LOOPS, py_time, mydiv(1, pyloop_time)) + psy_time1, psy_time = pystones_psycho(LOOPS1, LOOPS) + print "Psyco for %d passes %g %g" % \ + (LOOPS1, psy_time1, mydiv(LOOPS1, psy_time1)) + print "Psyco for %d more passes %g %g" % \ + (LOOPS, psy_time, mydiv(LOOPS, psy_time)) + print "Total for %d passes %g %g" % \ + (LOOPS1+LOOPS, psy_time1+psy_time, + mydiv(LOOPS1+LOOPS, psy_time1+psy_time)) + + # invert the equation system: + # psy_time1 = start_time + LOOPS1*loop_time + # psy_time1+psy_time = start_time + (LOOPS1+LOOPS)*loop_time + loop_time = psy_time/LOOPS + start_time = psy_time1 - LOOPS1*loop_time + print "Separated compilation/execution timings for %d passes" % \ + (LOOPS1+LOOPS) + print "Compilation (i.e. start-up) %g %g" % \ + (start_time, mydiv(1, start_time)) + print "Machine code execution %g %g" % \ + (loop_time*(LOOPS1+LOOPS), mydiv(1, loop_time)) + print + print "Relative execution frequencies (iterations per second)" + print "iterations Psyco Python Psyco is ... times faster" + for d in range(8): + n = 10**d + psyco1 = mydiv(n, start_time+n*loop_time) + print " %8d %g %g %.2f" % \ + (n, psyco1, mydiv(1, pyloop_time), psyco1*pyloop_time) + + # invert the equation + # start_time + c*loop_time = c*pyloop_time + if pyloop_time <= loop_time: + print "Psyco is always slower than regular Python." + else: + c = mydiv(start_time, pyloop_time - loop_time) + print "Cut-off point: %.1f iterations" % c + if start_time < 0.07: + print "Note: start-up time is very low, the above figure is not reliable." + print "You should consider running the same benchmark a large number of times" + print "and taking the mean value for the cut-off point." + +def pystones_psycho(*loopslist): + import psyco + #old_dict = Record.__dict__.copy() + #try: + # replace all methods of Record by proxies + #for key, value in old_dict.items(): + # if type(value) is type(main): + # Record.__dict__[key] = _psyco.proxy(value, 99) + f = psyco.proxy(Proc0) + return map(f, loopslist) + #finally: + # Record.__dict__.update(old_dict) + +def pystones_reg(*loopslist): + return map(Proc0, loopslist) + +IntGlob = 0 +BoolGlob = FALSE +Char1Glob = '\0' +Char2Glob = '\0' +Array1Glob = [0]*51 +Array2Glob = map(lambda x: x[:], [Array1Glob]*51) +PtrGlb = None +PtrGlbNext = None + +def Proc0(loops=LOOPS): + global IntGlob + global BoolGlob + global Char1Glob + global Char2Glob + global Array1Glob + global Array2Glob + global PtrGlb + global PtrGlbNext + + PtrGlbNext = Record() + PtrGlb = Record() + PtrGlb.PtrComp = PtrGlbNext + PtrGlb.Discr = Ident1 + PtrGlb.EnumComp = Ident3 + PtrGlb.IntComp = 40 + PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING" + String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING" + Array2Glob[8][7] = 10 + + starttime = clock() + + for i in range(loops): + Proc5() + Proc4() + IntLoc1 = 2 + IntLoc2 = 3 + String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING" + EnumLoc = Ident2 + BoolGlob = not Func2(String1Loc, String2Loc) + while IntLoc1 < IntLoc2: + IntLoc3 = 5 * IntLoc1 - IntLoc2 + IntLoc3 = Proc7(IntLoc1, IntLoc2) + IntLoc1 = IntLoc1 + 1 + Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3) + PtrGlb = Proc1(PtrGlb) + CharIndex = 'A' + while CharIndex <= Char2Glob: + if EnumLoc == Func1(CharIndex, 'C'): + EnumLoc = Proc6(Ident1) + CharIndex = chr(ord(CharIndex)+1) + IntLoc3 = IntLoc2 * IntLoc1 + IntLoc2 = IntLoc3 / IntLoc1 + IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1 + IntLoc1 = Proc2(IntLoc1) + + benchtime = clock() - starttime + return benchtime + +def Proc1(PtrParIn): + PtrParIn.PtrComp = NextRecord = PtrGlb.copy() + PtrParIn.IntComp = 5 + NextRecord.IntComp = PtrParIn.IntComp + NextRecord.PtrComp = PtrParIn.PtrComp + NextRecord.PtrComp = Proc3(NextRecord.PtrComp) + if NextRecord.Discr == Ident1: + NextRecord.IntComp = 6 + NextRecord.EnumComp = Proc6(PtrParIn.EnumComp) + NextRecord.PtrComp = PtrGlb.PtrComp + NextRecord.IntComp = Proc7(NextRecord.IntComp, 10) + else: + PtrParIn = NextRecord.copy() + NextRecord.PtrComp = None + return PtrParIn + +def Proc2(IntParIO): + IntLoc = IntParIO + 10 + while 1: + if Char1Glob == 'A': + IntLoc = IntLoc - 1 + IntParIO = IntLoc - IntGlob + EnumLoc = Ident1 + if EnumLoc == Ident1: + break + return IntParIO + +def Proc3(PtrParOut): + global IntGlob + + if PtrGlb is not None: + PtrParOut = PtrGlb.PtrComp + else: + IntGlob = 100 + PtrGlb.IntComp = Proc7(10, IntGlob) + return PtrParOut + +def Proc4(): + global Char2Glob + + BoolLoc = Char1Glob == 'A' + BoolLoc = BoolLoc or BoolGlob + Char2Glob = 'B' + +def Proc5(): + global Char1Glob + global BoolGlob + + Char1Glob = 'A' + BoolGlob = FALSE + +def Proc6(EnumParIn): + EnumParOut = EnumParIn + if not Func3(EnumParIn): + EnumParOut = Ident4 + if EnumParIn == Ident1: + EnumParOut = Ident1 + elif EnumParIn == Ident2: + if IntGlob > 100: + EnumParOut = Ident1 + else: + EnumParOut = Ident4 + elif EnumParIn == Ident3: + EnumParOut = Ident2 + elif EnumParIn == Ident4: + pass + elif EnumParIn == Ident5: + EnumParOut = Ident3 + return EnumParOut + +def Proc7(IntParI1, IntParI2): + IntLoc = IntParI1 + 2 + IntParOut = IntParI2 + IntLoc + return IntParOut + +def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): + global IntGlob + + IntLoc = IntParI1 + 5 + Array1Par[IntLoc] = IntParI2 + Array1Par[IntLoc+1] = Array1Par[IntLoc] + Array1Par[IntLoc+30] = IntLoc + for IntIndex in range(IntLoc, IntLoc+2): + Array2Par[IntLoc][IntIndex] = IntLoc + Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1 + Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc] + IntGlob = 5 + +def Func1(CharPar1, CharPar2): + CharLoc1 = CharPar1 + CharLoc2 = CharLoc1 + if CharLoc2 != CharPar2: + return Ident1 + else: + return Ident2 + +def Func2(StrParI1, StrParI2): + IntLoc = 1 + while IntLoc <= 1: + if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1: + CharLoc = 'A' + IntLoc = IntLoc + 1 + if CharLoc >= 'W' and CharLoc <= 'Z': + IntLoc = 7 + if CharLoc == 'X': + return TRUE + else: + if StrParI1 > StrParI2: + IntLoc = IntLoc + 7 + return TRUE + else: + return FALSE + +def Func3(EnumParIn): + EnumLoc = EnumParIn + if EnumLoc == Ident3: return TRUE + return FALSE + +if __name__ == '__main__': + main() diff --git a/nodeboxgl/ext/psyco/src/test/regrtester.py b/nodeboxgl/ext/psyco/src/test/regrtester.py new file mode 100644 index 0000000..5cb14fe --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/regrtester.py @@ -0,0 +1,76 @@ +import sys, os, test.regrtest + +import psyco +import time; print "Break!"; time.sleep(0.5) +psyco.log() +if os.path.exists('regrtester.local'): + execfile('regrtester.local') +else: + psyco.full() + + +################################################################################# +SKIP = {'test_gc': "test_gc.test_frame() does not create a cycle with Psyco's limited frames", + 'test_descr': 'seems that it mutates user-defined types and Psyco does not like it at all', + 'test_profilehooks': 'no profiling allowed with Psyco!', + 'test_profile': 'no profiling allowed with Psyco!', + 'test_cProfile': 'no profiling allowed with Psyco!', + 'test_repr': 'self-nested tuples and lists not supported', + 'test_trace': 'no line tracing with Psyco', + 'test_threaded_import': 'Python hang-ups', + 'test_hotshot': "PyEval_SetProfile(NULL,NULL) doesn't allow Psyco to take control back", + 'test_richcmp': 'uses eval() with locals and circular data structure cmps', + 'test_longexp': 'run it separately if you want, but it takes time and memory', + 'test_weakref': 'only run with FULL_CONTROL_FLOW set to 0 in mergepoints.c', + 'test_gettext': 'gettext mutates _ in the builtins!', + 'test_inspect': 'isframe() does not recognize our Frame instances', + 'test_exceptions': 'uses tb.tb_frame.f_back', + 'test_largefile': 'fails on Python on my old Linux box', + 'test_popen2': 'log file descriptor messed up in Python < 2.2.2', + 'test_sys': 'getrefcount() cannot be reliably tested', + 'test_socket': 'refcounting stuff as well', + #'test_copy': 'xrange() is very similar to range() with Psyco', + 'test_tarfile': 'we get permission denied with Python', + 'test_scope': 'refcounting: relies on the __del__ of instances', + 'test_sax': 'fails without Psyco due to my Expat installation', + 'test_email': 'broken? on \n vs. \r\n', + 'test_mmap': '"invalid handle" with Python 2.2.2', + 'test_winsound': 'winsound fails on Python 2.3 on my machine', + 'test_strptime': "fails about my timezone ending in (heure d'ete) in 2.3", + 'test_atexit': "windows: tired to work around w9xpopen magic", + 'test_popen': "windows: tired to work around w9xpopen magic", + 'test_mimetypes': 'fail in 2.3 if run after test_urllib', + 'test_doctest': 'doctest uses the debugger!?', + 'test_subprocess': 'suspect subprocess messes up stdout with Psyco messages', + 'test_linuxaudiodev': 'this /dev is absent or unreliable on a few machines of mine', + 'test_tcl': 'requires $DISPLAY', + 'test_pep352': 'no warning for string exceptions', + 'test_ctypes': 'it is full of sys.getrefcount() assertions', + 'test_import': 'I hack my pythons to not import bare .pyc files any more', + 'test_runpy': 'I hack my pythons to not import bare .pyc files any more', + 'test_genexps': 'doctests checking the exact error message', + } +# SKIP['test_operator'] = NO_SYS_EXC +# SKIP['test_strop'] = NO_SYS_EXC +#if sys.version_info[:2] >= (2,3): +# SKIP['test_threadedtempfile'] = 'Python bug: Python test just hangs up' + +if sys.version_info[:3] == (2,4,0): + SKIP['test_distutils'] = 'distutils/tests/* not copied by the installer' + +if hasattr(psyco._psyco, 'VERBOSE_LEVEL'): + SKIP['test_popen2'] = 'gets confused by Psyco debugging output to stderr' + +if os.path.exists('regrtester.skip'): + execfile('regrtester.skip') + +################################################################################# + + +# the tests that don't work with Psyco +test.regrtest.NOTTESTS += SKIP.keys() +if __name__ == '__main__': + try: + test.regrtest.main(randomize=1) + finally: + psyco.dumpcodebuf() diff --git a/nodeboxgl/ext/psyco/src/test/regrtester2.py b/nodeboxgl/ext/psyco/src/test/regrtester2.py new file mode 100644 index 0000000..f72d313 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/regrtester2.py @@ -0,0 +1,48 @@ +# +# A less memory-exploding version of regrtester.py. +# It runs only a fraction of the tests. +# + +import sys, re, psyco + + +assert len(sys.argv) >= 2 +match = re.match(r"(\d+)[/](\d+)", sys.argv[1]) +assert match, "syntax: regrtester2.py n/m [-nodump] [seed]" +n = int(match.group(1)) +m = int(match.group(2)) +assert 0 <= n < m + + +import test.regrtest +import regrtester + +def confirm_still_in_psyco(): + return __in_psyco__ + +tests = [s for s in test.regrtest.findtests() + if hash(s) % m == n and s not in test.regrtest.NOTTESTS] +if __name__ == '__main__': + if len(sys.argv) > 2 and sys.argv[2] == '-nodump': + dump = 0 + del sys.argv[2] + else: + dump = 1 + + import random, time + seed = time.ctime() + if len(sys.argv) > 2: + seed = sys.argv[2] + del sys.argv[2] + print 'Random seed is %r' % seed + random.seed(seed) + random.shuffle(tests) + + fully_in_psyco = confirm_still_in_psyco() + try: + test.regrtest.main(tests) #, verbose=1) + finally: + if dump: + psyco.dumpcodebuf() + if fully_in_psyco: + assert confirm_still_in_psyco() diff --git a/nodeboxgl/ext/psyco/src/test/test1.py b/nodeboxgl/ext/psyco/src/test/test1.py new file mode 100644 index 0000000..fb7ed86 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/test1.py @@ -0,0 +1,211 @@ +import os +import psyco + +def time(fn, *args): + "Measure the execution time of fn(*args)." + import time, traceback + begin = time.clock() + try: + result = fn(*args) + except: + end = time.clock() + traceback.print_exc() + result = '' + else: + end = time.clock() + return result, end-begin + + +ZERO = 0 + +def f1(n): + "Arbitrary test function." + i = 0 + x = 1 + while i 2: + if i > 126-33: i = 126-33 + return chr(33+i) + return " " + +def f7(start, end, step): + "Computes the Mandelbrot set. All args are complex numbers." + width = int((end.real - start.real) / step.real) + while start.imag < end.imag: + line = [mandelbrot(start + n*step.real) for n in range(width)] + print ''.join(line) + start += complex(0, step.imag) + +def mandelbrotbis(c_r, c_i): + z_r = z_i = 0.0 + for i in xrange(1000): + z_r, z_i = z_r*z_r-z_i*z_i + c_r, 2*z_r*z_i + c_i + if z_r*z_r+z_i*z_i > 4.0: + if i > 126-33: i = 126-33 + return chr(33+i) + return " " + +def f7bis((start_r, start_i), (end_r, end_i), (step_r, step_i)): + "Computes the Mandelbrot set. All args are (real, imag) tuples." + width = int((end_r - start_r) / step_r) + while start_i < end_i: + line = [mandelbrotbis(start_r + n*step_r, start_i) for n in range(width)] + print ''.join(line) + start_i += step_i + +def f8(): + try: + x = 1.0 / 0.0 + #except StandardError, e: + # print "in except clause:", e + finally: + print "in finally clause" + x = 5 + print "x is now", x + +def f9(n): + for i in range(n): + print i, + print + +def f10(): + apply(f9, (50,)) + +def f11(n): + def subtracter(x, y=n): + return x-y + return subtracter(1000) + + +ALLTESTS = [] + +def go(f, *args): + print '-'*78 + v1, t1 = time(psyco.proxy(f), *args) + print v1 + print '^^^ computed by Psyco in %s seconds' % t1 + v2, t2 = time(f, *args) + if v1 == v2: + if t1 and t2: + ok = '%.2f times faster' % (t2/float(t1)) + s = ', Psyco is %s' % ok + else: + ok = s = '' + print 'Python got the same result in %s seconds%s' % (t2, s) + else: + print v2 + print '^^^ by Python in %s seconds' % t2 + print '*'*78 + print '!!! different results !!!' + ok = 'DIFFERENT RESULTS' + ALLTESTS.append((f.func_name,t2,t1,ok)) + +def print_results(): + import sys + print + print '='*23, 'Summary (Python %d.%d.%d)' % sys.version_info[:3], '='*23 + format = '%-15s %-15s %-15s %s' + print format % ('function', 'Python time', 'Psyco time', '') + for r in ALLTESTS: + print format % r + +def go1(arg=2117): + go(f1, arg) + +FILEPATH = '../c' +FILELIST = [os.path.join(FILEPATH, s) for s in os.listdir(FILEPATH)] +FILELIST = [s for s in FILELIST if os.path.isfile(s) and s!='psyco.dump'] + +def go4(arg=FILELIST): + go(f4, arg) + +def go5(arg=FILELIST): + go(f5, arg) + +def go6(n=100000, p=100000000000001L): + go(f6, n, p) + +def go7(start=-2-1j, end=1+1j, step=0.04+0.08j): + go(f7, start, end, step) + +def go7bis(start=(-2.0, -1.0), end=(1.0, 1.0), step=(0.04, 0.08)): + go(f7bis, start, end, step) + + +if __name__ == "__main__": + go(f11, 50) + go1() + go4() + go5() + go6() + go7() + go7bis() + go(f10) + psyco.dumpcodebuf() + print_results() diff --git a/nodeboxgl/ext/psyco/src/test/test3.py b/nodeboxgl/ext/psyco/src/test/test3.py new file mode 100644 index 0000000..2327c4c --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/test3.py @@ -0,0 +1,424 @@ +#from __future__ import generators +#from __future__ import division +import psyco, os, sys, array, operator, traceback +from time import sleep, clock + +def time(fn, *args): + "Measure the execution time of fn(*args)." + begin = clock() + try: + result = apply(fn, args) + except: + end = clock() + traceback.print_exc() + result = '' + else: + end = clock() + return result, end-begin + + +ZERO = 0 + +def f1(n): + "Arbitrary test function." + i = 0 + x = 1 + while i 4.0: + if i > 126-33: i = 126-33 + return chr(33+i) + za, zb = za2-zb2+c.real, 2*za*zb+c.imag + del za2, zb2 + return " " + +def f7(start, end, step): + "Computes the Mandelbrot set. All args are complex numbers." + width = int((end.real - start.real) / step.real) + while start.imag < end.imag: + line = [mandelbrot(start + n*step.real) for n in range(width)] + print ''.join(line) + start += complex(0, step.imag) + +def f8(): + try: + x = 1.0 / 0.0 + #except StandardError, e: + # print "in except clause:", e + finally: + print "in finally clause" + x = 5 + print "x is now", x + +def f9(n): + for i in range(n): + print i, + print + +def f10(): + apply(f9, (50,)) + + +def go(f, *args): + print '-'*80 + v1, t1 = time(psyco.proxy(f), *args) + print v1 + print '^^^ computed by Psyco in %s seconds' % t1 + v2, t2 = time(f, *args) + if v1 == v2: + if t1 and t2: + s = ', Psyco is %.2f times faster' % (t2/float(t1)) + else: + s = '' + print 'Python got the same result in %s seconds%s' % (t2, s) + else: + print v2 + print '^^^ by Python in %s seconds' % t2 + print '*'*80 + print '!!! different results !!!' + +def go1(arg=2117): + go(f1, arg) + +FILEPATH = '../c' +FILELIST = [os.path.join(FILEPATH, s) for s in os.listdir(FILEPATH)] +FILELIST = [s for s in FILELIST if os.path.isfile(s) and s!='psyco.dump'] + +def go4(arg=FILELIST): + go(f4, arg) + +def go5(arg=FILELIST): + go(f5, arg) + +def go6(n=100000, p=100000000000001L): + go(f6, n, p) + +def go7(start=-2-1j, end=1+1j, step=0.04+0.08j): + go(f7, start, end, step) + + +def f11(prefix): + #prefix = [60, 115, 116, 114, 114, 114, 114, 62] + + table = [-1] + ([0]*len(prefix)) + for i in range(len(prefix)): + table[i+1] = table[i]+1 + while table[i+1] > 0 and prefix[i] != prefix[table[i+1]-1]: + table[i+1] = table[table[i+1]-1]+1 + #code.extend(table[1:]) # don't store first entry + print table[1:] + +def f12(arg): + def g(x, y=arg): + return x+y + return g(123) + +def f13(arg): + x,y = arg + print x, y + u,v = x,y + print u, v + return v,u + +def f15(x): + print x + +def f14(n): + f15(n==5) + +def f16(x): + return ~x + +def f17(x, y=0, *args): + return x, y, args + +#def f18(): +# yield 5 +# yield 6 + +def f19(seq): + class C: + def __init__(self): + print "hello" + c = C() + seq = list(seq) + seq1 = seq + seq *= 3 + n = seq[0] + n /= 3 + return seq, seq1 is seq, n + +def f20(code, n, fill=0): + a = array.array(code, [fill]*n) + for i in range(n): + item = i*10 + if code == 'c': + item = chr(item) + a[i] = item + return [a[i] for i in range(len(a))] + +def f21(lst): + return operator.indexOf(lst, 9) + +def f22(n): + try: + x = 1/n + except: + print "Catch!" + +def f23(n): + f22(n) + try: + x = undefined_name + except: + f22(n) + print sys.exc_type.__name__ + +def f24(n): + return 1/n + +def f25(n): + try: + return f24(n) + except AttributeError: + auwsziazsi + +def f26(): + import psyco.classes + import array + import urllib + from types import FloatType, ListType + from psyco.core import full + return FloatType, ListType, urllib, psyco.classes, full + +def test_getframe(): + import sys + i = 0 + print 'test_getframe():' + while 1: + try: + f = sys._getframe(i) + except ValueError: + break + #print '%-26s %-60s %-40s' % (f, f.f_code, f.f_locals.keys()) + print f.f_code.co_name.replace('', '?') + i += 1 + +def test_getframe1(): + return test_getframe() +psyco.cannotcompile(test_getframe1) + +def test_getframe_b(): + import sys + i = 0 + print 'test_getframe_b():' + f = sys._getframe() + while f is not None: + print f.f_code.co_name.replace('', '?') + f = f.f_back # walk the stack with f_back + +def test_getframe_b1(): + return test_getframe_b() +psyco.cannotcompile(test_getframe_b1) + +def f28(): + test_getframe() + return N + +def f27(): + global N + N = 5 + a = f28() + N = 6 + b = f28() + N = 7 + c = f28() + return a,b,c + +def f28_1(): + test_getframe1() + return N + +def f27_1(): + global N + N = 51 + a = f28_1() + N = 61 + b = f28_1() + N = 71 + c = f28_1() + return a,b,c + +def f28_b(): + test_getframe_b() + return N + +def f27_b(): + global N + N = 95 + a = f28_b() + N = 96 + b = f28_b() + N = 97 + c = f28_b() + return a,b,c + +def f28_b1(): + test_getframe_b1() + return N + +def f27_b1(): + global N + N = 951 + a = f28_b1() + N = 961 + b = f28_b1() + N = 971 + c = f28_b1() + return a,b,c + +def f29(lst): + lst = lst[:] + del lst[2] + lst[3] = 6 + return lst + +def f30(): + Baz + +def f31(): + f30() + +def f32(p): + if p[1:2] == ':': + return p[0:2], p[2:] + return '', p + +def f33(n): + if ((n+1) & n) == 0: + print n + +def f34(m=2000000): + for i in xrange(m): + f33(i) + +def f35(): + try: + import Numeric + except ImportError: + print "[[5 5 5]" + print " [5 5 5]" + print " [5 5 5]]" + else: + a = Numeric.zeros((3,3)) + a += 5 + print a + +def f36(): + class X: + pass + class Y(X): + pass + return Y(), Y.__module__, __in_psyco__ + +def f37(x): + print 'ZERO' in globals().keys() + dir() + print eval('ZERO+1') + +def f38(n): + f = f1 + r = [ + f(n, *[]), + f(n), + apply(f, (n,)), + apply(f, [n]), + f(*(n,)), + f(*[n]), + f(n=n), + f(**{'n': n}), + apply(f, (n,), {}), + apply(f, [n], {}), + f(*(n,), **{}), + f(*[n], **{}), + f(n, **{}), + f(n, *[], **{}), + f(n=n, **{}), + f(n=n, *[], **{}), + f(*(n,), **{}), + f(*[n], **{}), + f(*[], **{'n':n}), + ] + return r + +if __name__ == "__main__": + print "Break!" + sleep(0.5) + #go(f36) + #go(f38, 100) + psyco.full() + try: + print f35() + #f23(0.0) + finally: + psyco.dumpcodebuf() diff --git a/nodeboxgl/ext/psyco/src/test/test5.py b/nodeboxgl/ext/psyco/src/test/test5.py new file mode 100644 index 0000000..4c8ae5e --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/test5.py @@ -0,0 +1,453 @@ +import psyco, dis, types, sys, math + +def f(filename, mode='r'): + s = "" + for line in open(filename, mode).readlines(): + s += "! " + line # extreme optimization case + return s + +def f2(x, y, z): + coords = (x, y) + if type(z) is types.IntType: + coords += (z,) + else: + coords += z + a, b, c = coords + return c, b, a + +def f3(x, y): + return x << y, x << 1, x << 31, x >> y, x >> 1, x >> 31 + +def f4(s): + return "abc" + s + +def double2(x): + return x * 2 + +def overflowtest(): + n = double2(-1925703681) + return `n` + +def booltest(): + True,False = 1==1,1==0 + print 'abcdefghijklmnop'=='abcdefghijklMNop' + print 'abcdefghijklmnop'=='abcdefghijklmnop' + print str('abcdefghijklmnop'=='abcdefghijklMNop') + print str('abcdefghijklmnop'=='abcdefghijklmnop') + print (lambda x: x==1)(0) + print (lambda x: x==1)(1) + print [a & b for a in (False,True) for b in (False,True)] + print [a | b for a in (False,True) for b in (False,True)] + print [a ^ b for a in (False,True) for b in (False,True)] + print not (False in ()) + +def exc_test(): + try: + failure = [][1] # opcode 9, line 2 from the start of the function + except: + exc, value, tb = sys.exc_info() + print exc.__name__, str(value) + print tb.tb_lineno - tb.tb_frame.f_code.co_firstlineno + +def seqrepeat(): + for i in [5, 6L, -999]: + print `i*'abc'` + print `'abc'*i` + print i*[3,'z'] + print [6,3]*i + print `('y'*i) + 'x'` + +def inplacerepeat(): + l = l1 = range(100) + l *= 2 + return l is l1 + +def g5(x): + return x+1 + +def f5(n): + "Function inlining tests" + print g5(n) + print g5(n) + print g5(3) + print g5(x=n) + +def g6(x): + if x != 3: + return x+1 + else: + return None + +def g6bis(n): + return range(2, 50)[n] + +def f6(n): + "Function inlining tests" + try: + print g6(n) + print g6(n) + print g6(3) + print g6(x=n) + print g6bis(n) + except: + print sys.exc_type.__name__ + +def g7(x, *args): + if not g7len(args): + last = g5(0) + else: + last = args[-1] + return last * x + +def g7bis(tuple): + return 0.0 + +def f7(n): + global g7len + g7len = len + "Function inlining tests" + print [g7(n), 5*g7(3,4,5), g7(*((11,)*5))] + g7len = g7bis + print [g7(n), 5*g7(3,4,5), g7(*((11,)*5))] + +def g8(x, *args): + return g7len(args) * x + +def f8(n): + global g7len + g7len = len + "Function inlining tests" + print [g8(n), 5*g8(3,4,5), g8(*((11,)*5))] + g7len = g7bis + print [g8(n), 5*g8(3,4,5), g8(*((11,)*5))] + +def f9(n): + return g5(3), g5(n) + + +# virtual string tests + +TEST = ['userhru', 'uiadsfz', '', '1', 'if', '623', 'opad', 'oa8ua', + '09q34rx093q', '\x00', + 'qw09exdqw0e9dqw9e8d8qw9r8qw', '', + '\x1d\xd7\xae\xa2\x06\x10\x1a\x00a\xff\xf6\xee\x15\xa2\xea\x89', + 'akjsdfhqweirewru 3498cr 3849rx398du389du389dur398d31623'] + +def s1(): + s = '' + for t in TEST: + s += t + return s + +def s2(): + return "some" + "another" + +def s3(): + return TEST[0] + '.' + +def s4(): + return '.' + TEST[0] + +def s5(): + return TEST[0] + (TEST[1] + TEST[2]) + +def s6(): + s = '' + for t in TEST: + s = t + s + return s + +def s7(): + return int(TEST[-1][5:10] == 'fhqwe') + +def s8(): + return TEST[-2][5:10][3] + +def s9(): + return TEST[-1][:-1][1:][2:-3] + +def s10(): + return int('t' < TEST[1][:1] == 'u') + +def s11(): + return int('ia' == TEST[1][1:3] < 'ib' and + 'dsf' == TEST[1][-4:-1] < 'dsf!' and + 'dsfz' == TEST[1][-4:] <= 'dsfz') + +def s12(): + return int(TEST[0] + TEST[1] != 'userhruuiadsfz') + +def s13(): + return int(TEST[3] + TEST[5] == TEST[-1][-4:]) + +def teststrings(): + print `s1()` + print `s2()` + print `s3()` + print `s4()` + print `s5()` + print `s6()` + print `s7()` + print `s8()` + print `s9()` + print `s10()` + print `s11()` + print `s12()` + print `s13()` + +def testslices(s): + "Test the various paths the code can take in pstring_slice()." + print `s[:-9999]` + print `s[:9999]` + print `s[:]` + print `s[-9999:-9999]` + print `s[-9999:9999]` + print `s[-9999:]` + print `s[1:-9999]` + print `s[1:9999]` + print `s[1:]` + print `s[9999:-9999]` + print `s[9999:9999]` + print `s[9999:]` + +def testovf(x, y): + print x+y + print 2000000000+y + print x+2000000000 + print x-y + print 2000000000-y + print x-2000000000 + print x*y + print 2000000000*y + print x*2000000000 + print x + print -x + print abs(x) + +def rangetypetest(n): + print type(range(n)).__name__ + print type(range(2, n)).__name__ + print type(range(n, 2, -1)).__name__ + print type(xrange(n)).__name__ + print type(xrange(2, n)).__name__ + print type(xrange(n, 2, -1)).__name__ + +def rangetest(n): + for i in range(n): + print i, + print + for i in range(10, n): + print i, + print + for i in range(n, 10, -1): + print i, + print + +def xrangetest(n): + for i in xrange(n): + print i, + print + for i in xrange(10, n): + print i, + print + for i in xrange(n, 10, -1): + print i, + print + +def longrangetest(): + L = 1234567890123456789L + if sys.hexversion >= 0x02030000: + print range(L, L+2) + else: + print [L, L+1] + +def proxy_defargs(): + d = {} + exec """ +def f(): + g() +def g(a=12): + print a +""" in d + d['f'] = psyco.proxy(d['f']) + d['g'] = psyco.proxy(d['g']) + d['f']() + +def setfilter(): + def f1(): + return ('f1', int(__in_psyco__)) + def f2(): + "TAGGY" + return ('f2', int(__in_psyco__)) + def myfilter(co): + return co.co_consts[0] != 'TAGGY' + psyco.setfilter(myfilter) + try: + print psyco.proxy(f1)() # ('f1', 1) + print psyco.proxy(f2)() # ('f2', 0) + finally: + prev = psyco.setfilter(None) + assert prev is myfilter + +if sys.version_info < (2,3): + def arraytest(): + print "S" +else: + def arraytest(): + import array + class S(array.array): pass + print type(S('i')).__name__ + + +class CompositeElement: + def __init__(self): + self.children = [] + + def append(self, child): + self.children.append(child) + return self + +def makeSelection(): + """Segfault bug (thanks xorAxAx)""" + result = CompositeElement() + result.append(CompositeElement().append(42)) + print 'do stuff here' + assert isinstance(result.children[0], CompositeElement) + +class Class1: + __metaclass__ = type +def class_creation_1(n=400000): + for i in xrange(n): + Class1() + print "ok" + +class Class2: + __metaclass__ = type + def __init__(self, a): + self.a = a +def class_creation_2(n=400000): + for i in xrange(n): + c = Class2(i) + assert c.a == i + print "ok" + +class Class3: + __metaclass__ = type + def __init__(self): + return 42 +def class_creation_3(): + try: + Class3() + except TypeError: + if (2,2) <= sys.version_info < (2,5): + print "got a TypeError, but new-style classes don't" + print "check the __init__() return value before 2.5" + else: + print "ok" + else: + if (2,2) <= sys.version_info < (2,5): + print "ok" + else: + print "__init__() => 42: should have raised TypeError!" + +class Class4: + __metaclass__ = type + def __init__(self, a=None): + self.a = a +def class_creation_4(n=200000): + for i in xrange(n): + c = Class4(a=i) + assert c.a == i + print "ok" + +def power_int(n=2000): + for j in range(n): + x = 0 + for i in range(1000): + x += i ** 2 + print x + +def power_int_long(n=200): + for j in range(n): + x = 0 + for i in range(1000): + x += i ** 2L + print type(x).__name__[:4], int(x) + +def power_float(n=500): + for j in range(n): + x = 0.0 + for i in range(1000): + x += i ** 1.409999992 + print type(x).__name__, int(x) + +def conditional_doubletest_fold(): + n = sys.getrefcount(conditional_doubletest_fold) # anything > 0 + if n < 0 and expression_not_evaluated: + print "BUG" + else: + print "ok(1)" + n = sys.getrefcount(conditional_doubletest_fold) # anything > 0 + if n >= 0 or expression_not_evaluated: + print "ok(2)" + else: + print "BUG" + +def importname(value): + for v in value: + import sys + print "Ok" + +def sharedlists(n): + if n > 5: + a = b = [4, 5] + else: + a = [4, 5] + b = [4, 5] + double2(21) + a[0] = 8 + print b[0] + +def variousslices(): + class X(object): + def __getitem__(self, x): + print x + class Y(object): + def __getitem__(self, x): + print x + def __getslice__(self, i, j): + print i, j + for o in [X(), Y()]: + o[4:] + o[:7] + o[9:'hello'] + o['world':] + o[1:10:'hello'] + +def listgetitem(): + class X(list): + def __getitem__(self, key): + return key + x = X(["Ok"]) + print x["foobar"] + for item in x: + print item + +def negintpow(x): + print x ** -2 + +if __name__ == '__main__': + from test1 import go, print_results + import time + print "break!" + time.sleep(0.5) + #go(class_creation_1) + #go(class_creation_2) + #go(class_creation_3) + #go(class_creation_4) + #go(power_int) + #go(power_int_long) + #go(power_float) + psyco.proxy(negintpow)(8) + psyco.dumpcodebuf() + print_results() diff --git a/nodeboxgl/ext/psyco/src/test/test_base.py b/nodeboxgl/ext/psyco/src/test/test_base.py new file mode 100755 index 0000000..5cfc419 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/test_base.py @@ -0,0 +1,92 @@ +#! /usr/bin/env python + +""" Run base Psyco tests. +""" + +import sys, os, random, doctest, cStringIO +True,False = 1==1,1==0 + + +SEPARATOR = """ +========== %r ========== +""" +LASTLINE = "Tests completed." +BUFFERFILE = "buffer-basetests.txt" +EXPECTEDFILE = "expected-basetests.txt" +INPUTSCRIPT = "input-basetexts.py" + +TESTS = open('btrun.py', 'r').read() + + +if hasattr(doctest, '_extract_examples'): + tests = doctest._extract_examples(TESTS) +else: + examples = doctest.DocTestParser().get_examples(TESTS) + tests = [(example.source, example.want, example.lineno) + for example in examples] + +# --- + +def main(quiet=False): + PRELUDE = '' + for inp, outp, line in tests[:]: + if not outp: + PRELUDE += inp + '\n' + tests.remove((inp, outp, line)) + random.shuffle(tests) # first run all tests in any order + tests_again = tests[:] + random.shuffle(tests_again) + all_tests = tests + tests_again # then run them all again in any other order + + childin = open(INPUTSCRIPT, 'w') + expected = open(EXPECTEDFILE, 'w') + + print >> childin, 'import sys' + print >> childin, PRELUDE + + def filterline(line): + if line.startswith('${') and line.endswith('}'): + line = str(eval(line[2:-1])) + return line + + for inp, outp, line in all_tests: + sep = SEPARATOR % inp + print >> childin, 'print %r' % sep + if not quiet: + print >> childin, 'print >> sys.stderr, %r' % inp.strip() + print >> expected, sep + print >> childin, inp + outplines = [filterline(line) for line in outp.split('\n')] + expected.write('\n'.join(outplines)) + + print >> childin, 'print %r' % LASTLINE + print >> expected, LASTLINE + expected.close() + childin.close() + + # run in a child process + err = os.system('"%s" %s > %s' % (sys.executable, INPUTSCRIPT, BUFFERFILE)) + print >> sys.stderr + if err: + print >> sys.stderr, 'FAIL: child process returned %d, %d' % (err>>8, err&255) + sys.exit(1) + else: + data1 = open(EXPECTEDFILE, 'r').read() + data2 = open(BUFFERFILE, 'r').read() + if data1 != data2: + print >> sys.stderr, 'FAIL: different output' + if sys.argv[1:2] != ['-q']: + cmd = 'diff -c %s %s' % (EXPECTEDFILE, BUFFERFILE) + os.system(cmd) + return False + else: + print >> sys.stderr, 'Passed.' + return True + +def test_main(): + ok = main(quiet=True) + assert ok + +if __name__ == '__main__': + if not main(): + sys.exit(1) diff --git a/nodeboxgl/ext/psyco/src/test/test_compactobject.py b/nodeboxgl/ext/psyco/src/test/test_compactobject.py new file mode 100644 index 0000000..27b4d7b --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/test_compactobject.py @@ -0,0 +1,280 @@ +from __future__ import generators +import os, sys, random +import psyco + + +def do_test_1(objects): + d = [{} for i in range(20)] + s = [psyco.compact() for i in range(20)] + attrnames = list('abcdefghijklmnopqrstuvwxyz') + for j in range(5000): + i = random.randrange(0, 20) + attr = random.choice(attrnames) + if random.randrange(0, 2): + if attr in d[i]: + if random.randrange(0,5) == 3: + delattr(s[i], attr) + del d[i][attr] + else: + assert d[i][attr] == getattr(s[i], attr) + else: + try: + getattr(s[i], attr) + except AttributeError: + pass + else: + raise AssertionError, attr + else: + obj = random.choice(objects) + setattr(s[i], attr, obj) + d[i][attr] = obj + for i in range(20): + d1 = {} + for attr in attrnames: + try: + d1[attr] = getattr(s[i], attr) + except AttributeError: + pass + assert d[i] == d1 + +def do_test(n, do_test_1=do_test_1): + random.jumpahead(n*111222333444555666777L) + N = 1 + TAIL = 'lo' + objects = [None, -1, 0, 1, 123455+N, -99-N, + 'hel'+TAIL, [1,2], {(5,): do_test}, 5.43+0.01*N, xrange(5)] + do_test_1(objects) + for o in objects[4:]: + #print '%5d -> %r' % (sys.getrefcount(o), o) + assert sys.getrefcount(o) == 4 + +psyco.cannotcompile(do_test) + + +def subprocess_test(n): + sys.stdout.flush() + childpid = os.fork() + if not childpid: + do_test(n) + sys.exit(0) + childpid, status = os.wait() + return os.WIFEXITED(status) and os.WEXITSTATUS(status) == 0 + +##def test_compact_stress(repeat=20): +## for i in range(repeat): +## yield subprocess_test, i + +# ____________________________________________________________ + +def read_x(k): + return k.x + 1 + +def read_y(k): + return k.y + +def read_z(k): + return k.z + +psyco.bind(read_x) +psyco.bind(read_y) + +def pcompact_test(): + k = psyco.compact() + k.x = 12 + k.z = None + k.y = 'hello' + print read_x(k) + print read_y(k) + print read_z(k) + #psyco.dumpcodebuf() + +def pcompact_creat(obj): + base = sys.getrefcount(obj) + items = [] + for i in range(11): + k = psyco.compact() + k.x = (0,i,i*2) + k.y = i+1 + k.z = None + k.t = obj + k.y = i+2 + k.y = i+3 + print k.x, k.y, k.z, k.t + items.append(k) + del k + print sys.getrefcount(obj) - base + del items[:] + print sys.getrefcount(obj) - base + +psyco.bind(pcompact_creat) + +def pcompact_modif(obj): + base = sys.getrefcount(obj) + for i in range(21): + k = psyco.compact() + #k.x = i+1 + #k.y = (i*2,i*3,i*4,i*5,i*6,i*7) + k.x = obj + print k.x, + print sys.getrefcount(obj) - base, + k.x = i+1 + print sys.getrefcount(obj) - base, + print k.x + #k.x = len + #k.x = i+2 + #print k.x, k.y + print sys.getrefcount(obj) - base + +psyco.bind(pcompact_modif) + +# ____________________________________________________________ + +class Rect(psyco.compact): + def __init__(self, w, h): + self.w = w + self.h = h + def getarea(self): + return self.w * self.h + +def test_rect(): + assert Rect(10, 12).getarea() == 120 + assert Rect(0.5, 2.5).getarea() == 1.25 + assert Rect([1,2,3], 2).getarea() == [1,2,3,1,2,3] + +class ClassWithNoInit(psyco.compact): + pass + +def test_init_arguments(): + import py + def f1(): Rect() + def f2(): psyco.compact(12) + def f3(): ClassWithNoInit(21) + py.test.raises(TypeError, f1) + if sys.version >= (2, 3): + py.test.raises(TypeError, f2) + py.test.raises(TypeError, f3) + py.test.raises(TypeError, psyco.proxy(f1)) + if sys.version >= (2, 3): + py.test.raises(TypeError, psyco.proxy(f2)) + py.test.raises(TypeError, psyco.proxy(f3)) + +def test_special_attributes(): + missing = object() + r = Rect(6, 7) + assert r.__members__ == ['w', 'h'] + assert r.__dict__.items() == [('w', 6), ('h', 7)] + assert r.__dict__ == {'w': 6, 'h': 7} + assert {'w': 6, 'h': 7} == r.__dict__ + assert list(r.__dict__) == ['w', 'h'] + del r.__dict__['w'] + assert getattr(r, 'w', missing) is missing + assert r.h == 7 + assert r.__members__ == ['h'] + assert r.__dict__.items() == [('h', 7)] + assert r.__dict__ == {'h': 7} + assert {'h': 7} == r.__dict__ + assert list(r.__dict__) == ['h'] + del r.h + assert r.__members__ == [] + assert getattr(r, 'w', missing) is missing + assert getattr(r, 'h', missing) is missing + +def test_inheritance(): + class X(psyco.compact): + pass + class Y(psyco.compact): + pass + class Z(X): + pass + x = X() + x.a = 5 + assert [s for s in dir(x) if not s.startswith('__')] == ['a'] + x.__class__ = Y + assert type(x) is Y + assert x.__class__ is Y + assert Y.__bases__ == (psyco.compact,) + assert Z.__bases__ == (X,) + if sys.version >= (2,3): # can't assign to __bases__ in Python 2.2 + Z.__bases__ = (Y,) + assert Z.__bases__ == (Y,) + +psyco.cannotcompile(test_inheritance) # because of type mutation + +def test_data_descr(): + global done + done = [] + class X(psyco.compact): + def g(self): done.append('g') + def s(self, value): done.append(value) + def d(self): done.append('d') + a = property(g,s,d) + x = X() + x.__dict__['a'] = 'this is hidden' + r = x.a + assert r is None + x.a = 123 + del x.a + del x.a + assert done == ['g', 123, 'd', 'd'] + assert x.__dict__ == {'a': 'this is hidden'} + x.__dict__ = {'a': 'this too'} + assert x.__dict__ == {'a': 'this too'} + assert done == ['g', 123, 'd', 'd'] + +def test_ass_dict(): + missing = object() + x = psyco.compact() + x.a = 5 + assert x.__dict__ == {'a': 5} + x.__dict__ = {'b': 6} + assert x.b == 6 + assert getattr(x, 'a', missing) is missing + assert x.__dict__ == {'b': 6} + y = psyco.compact() + y.__dict__ = x.__dict__ + assert y.__dict__ == {'b': 6} + y.__dict__ = y.__dict__ + assert y.__dict__ == {'b': 6} + +def test_with_psyco(): + yield psyco.proxy(test_rect) + yield psyco.proxy(test_special_attributes) + yield psyco.proxy(test_data_descr) + +def test_compact_stress(repeat=20): + for i in range(repeat): + yield do_test, i + +rect1 = Rect(0, 0) + +def test_constant_obj(): + def f1(): + return rect1.w * rect1.h + def f2(a): + rect1.w = a + psyco.bind(f1) + psyco.bind(f2) + rect1.w = 6 + rect1.h = 7 + res = f1() + assert res == 42 + f2(4) + res = f1() + assert res == 28 + f2(0.5) + res = f1() + assert res == 3.5 + +# ____________________________________________________________ + +if __name__ == '__main__': + import time; print "break!"; time.sleep(1) + #subprocess_test(10) + #pcompact_test() + #pcompact_creat('hel' + 'lo') + #pcompact_modif('hel' + 'lo') + #test_constant_obj() + psyco.proxy(test_rect)() + #psyco.proxy(test_special_attributes)() + #psyco.proxy(test_data_descr)() + psyco.dumpcodebuf() diff --git a/nodeboxgl/ext/psyco/src/test/test_misc.py b/nodeboxgl/ext/psyco/src/test/test_misc.py new file mode 100644 index 0000000..9758b70 --- /dev/null +++ b/nodeboxgl/ext/psyco/src/test/test_misc.py @@ -0,0 +1,102 @@ +import py, sys, psyco + + +def test_index(): + if sys.version_info < (2, 5): + py.test.skip("for Python 2.5") + + class X(object): + def __index__(self): + return -3 + + def f(x): + return (12, 23, 34, 45)[x] + + res = psyco.proxy(f)(X()) + assert res == 23 + + +def test_index_slice(): + if sys.version_info < (2, 5): + py.test.skip("for Python 2.5") + + class Observer(object): + def __getslice__(self, i, j): + return "slice", i, j + def __getitem__(self, x): + raise Exception("in __getitem__") + class X(object): + def __index__(self): + return 5 + class Y(object): + def __index__(self): + return -2 + + def f(o, x, y): + return o[x:y] + + res = psyco.proxy(f)(Observer(), X(), Y()) + assert res == ("slice", 5, -2) + +def test_index_repeat(): + if sys.version_info < (2, 5): + py.test.skip("for Python 2.5") + + class X(object): + def __index__(self): + return 3 + + def f(x): + return (12, 23) * x + + res = psyco.proxy(f)(X()) + assert res == (12, 23, 12, 23, 12, 23) + +def test_slice_overflow(): + class X(object): + def __len__(self): + return sys.maxint + def __getslice__(self, i, j): + return i, j + def f(X): + return X()[-(2**100):2**100] + + res = psyco.proxy(f)(X) + assert res == f(X) + +def test_id(): + def f(x): + return id(x) + obj = [] + res = psyco.proxy(f)(obj) + assert res == id(obj) + +def test_math_module(): + import math + global _operation + for name in ["acos", "asin", "atan", "ceil", "cos", "cosh", "exp", + "fabs", "floor", "sin", "sinh", "sqrt", "tan", "tanh"]: + _operation = getattr(math, name) + + def tester(a): + return _operation(a) + res = psyco.proxy(tester)(0.17) + assert abs(res - _operation(0.17)) < 1e6 + + def tester(a): + return _operation(*a) + res = psyco.proxy(tester)((0.71,)) + assert abs(res - _operation(0.71)) < 1e6 + + for name in ["atan2", "fmod", "hypot", "pow"]: + _operation = getattr(math, name) + + def tester(a, b): + return _operation(a, b) + res = psyco.proxy(tester)(0.17, 0.081) + assert abs(res - _operation(0.17, 0.081)) < 1e6 + + def tester(a): + return _operation(*a) + res = psyco.proxy(tester)((0.71, 0.2643)) + assert abs(res - _operation(0.71, 0.2643)) < 1e6 diff --git a/nodeboxgl/ext/psyco/support.py b/nodeboxgl/ext/psyco/support.py new file mode 100644 index 0000000..a61224e --- /dev/null +++ b/nodeboxgl/ext/psyco/support.py @@ -0,0 +1,193 @@ +########################################################################### +# +# Psyco general support module. +# Copyright (C) 2001-2002 Armin Rigo et.al. + +"""Psyco general support module. + +For internal use. +""" +########################################################################### + +import sys, _psyco, __builtin__ + +error = _psyco.error +class warning(Warning): + pass + +_psyco.NoLocalsWarning = warning + +def warn(msg): + from warnings import warn + warn(msg, warning, stacklevel=2) + +# +# Version checks +# +__version__ = 0x010502f0 +if _psyco.PSYVER != __version__: + raise error, "version mismatch between Psyco parts, reinstall it" + +version_info = (__version__ >> 24, + (__version__ >> 16) & 0xff, + (__version__ >> 8) & 0xff, + {0xa0: 'alpha', + 0xb0: 'beta', + 0xc0: 'candidate', + 0xf0: 'final'}[__version__ & 0xf0], + __version__ & 0xf) + + +VERSION_LIMITS = [0x02020200, # 2.2.2 + 0x02030000, # 2.3 + 0x02040000] # 2.4 + +if ([v for v in VERSION_LIMITS if v <= sys.hexversion] != + [v for v in VERSION_LIMITS if v <= _psyco.PYVER ]): + if sys.hexversion < VERSION_LIMITS[0]: + warn("Psyco requires Python version 2.2.2 or later") + else: + warn("Psyco version does not match Python version. " + "Psyco must be updated or recompiled") + +PYTHON_SUPPORT = hasattr(_psyco, 'turbo_code') + + +if hasattr(_psyco, 'ALL_CHECKS') and hasattr(_psyco, 'VERBOSE_LEVEL'): + print >> sys.stderr, ('psyco: running in debugging mode on %s' % + _psyco.PROCESSOR) + + +########################################################################### +# sys._getframe() gives strange results on a mixed Psyco- and Python-style +# stack frame. Psyco provides a replacement that partially emulates Python +# frames from Psyco frames. The new sys._getframe() may return objects of +# a custom "Psyco frame" type, which is a subtype of the normal frame type. +# +# The same problems require some other built-in functions to be replaced +# as well. Note that the local variables are not available in any +# dictionary with Psyco. + + +class Frame: + pass + + +class PythonFrame(Frame): + + def __init__(self, frame): + self.__dict__.update({ + '_frame': frame, + }) + + def __getattr__(self, attr): + if attr == 'f_back': + try: + result = embedframe(_psyco.getframe(self._frame)) + except ValueError: + result = None + except error: + warn("f_back is skipping dead Psyco frames") + result = self._frame.f_back + self.__dict__['f_back'] = result + return result + else: + return getattr(self._frame, attr) + + def __setattr__(self, attr, value): + setattr(self._frame, attr, value) + + def __delattr__(self, attr): + delattr(self._frame, attr) + + +class PsycoFrame(Frame): + + def __init__(self, tag): + self.__dict__.update({ + '_tag' : tag, + 'f_code' : tag[0], + 'f_globals': tag[1], + }) + + def __getattr__(self, attr): + if attr == 'f_back': + try: + result = embedframe(_psyco.getframe(self._tag)) + except ValueError: + result = None + elif attr == 'f_lineno': + result = self.f_code.co_firstlineno # better than nothing + elif attr == 'f_builtins': + result = self.f_globals['__builtins__'] + elif attr == 'f_restricted': + result = self.f_builtins is not __builtins__ + elif attr == 'f_locals': + raise AttributeError, ("local variables of functions run by Psyco " + "cannot be accessed in any way, sorry") + else: + raise AttributeError, ("emulated Psyco frames have " + "no '%s' attribute" % attr) + self.__dict__[attr] = result + return result + + def __setattr__(self, attr, value): + raise AttributeError, "Psyco frame objects are read-only" + + def __delattr__(self, attr): + if attr == 'f_trace': + # for bdb which relies on CPython frames exhibiting a slightly + # buggy behavior: you can 'del f.f_trace' as often as you like + # even without having set it previously. + return + raise AttributeError, "Psyco frame objects are read-only" + + +def embedframe(result): + if type(result) is type(()): + return PsycoFrame(result) + else: + return PythonFrame(result) + +def _getframe(depth=0): + """Return a frame object from the call stack. This is a replacement for +sys._getframe() which is aware of Psyco frames. + +The returned objects are instances of either PythonFrame or PsycoFrame +instead of being real Python-level frame object, so that they can emulate +the common attributes of frame objects. + +The original sys._getframe() ignoring Psyco frames altogether is stored in +psyco._getrealframe(). See also psyco._getemulframe().""" + # 'depth+1' to account for this _getframe() Python function + return embedframe(_psyco.getframe(depth+1)) + +def _getemulframe(depth=0): + """As _getframe(), but the returned objects are real Python frame objects +emulating Psyco frames. Some of their attributes can be wrong or missing, +however.""" + # 'depth+1' to account for this _getemulframe() Python function + return _psyco.getframe(depth+1, 1) + +def patch(name, module=__builtin__): + f = getattr(_psyco, name) + org = getattr(module, name) + if org is not f: + setattr(module, name, f) + setattr(_psyco, 'original_' + name, org) + +_getrealframe = sys._getframe +sys._getframe = _getframe +patch('globals') +patch('eval') +patch('execfile') +patch('locals') +patch('vars') +patch('dir') +patch('input') +_psyco.original_raw_input = raw_input +__builtin__.__in_psyco__ = 0==1 # False + +if hasattr(_psyco, 'compact'): + import kdictproxy + _psyco.compactdictproxy = kdictproxy.compactdictproxy diff --git a/nodeboxgl/ext/setup.py b/nodeboxgl/ext/setup.py new file mode 100644 index 0000000..0375647 --- /dev/null +++ b/nodeboxgl/ext/setup.py @@ -0,0 +1,13 @@ +from distutils.core import setup, Extension + +bezier = Extension("nglbezier", sources=["bezier.c"]) +geometry = Extension("nglgeometry", sources=["geometry.c"]) +noise = Extension("nglnoise", sources=["noise.c"]) + +setup( + name = "extensions", + version = "1.0", + author = "Tom De Smedt, Frederik De Bleser", + description = "Fast C Bezier, geometry and noise math.", + ext_modules = [bezier, geometry, noise] +) diff --git a/nodeboxgl/font/Droid Sans Mono.ttf b/nodeboxgl/font/Droid Sans Mono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6e79dad17fc95ac20b6f52097f70b2ca652316f2 GIT binary patch literal 117072 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 literal 0 HcmV?d00001 diff --git a/nodeboxgl/font/Droid Sans.ttf b/nodeboxgl/font/Droid Sans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..767c63ad000e3eea20f3cb7a43ba9f4154ed7a5d GIT binary patch literal 190044 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%0D=-PBu&{ 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 literal 0 HcmV?d00001 diff --git a/nodeboxgl/font/Droid Serif-BoldItalic.ttf b/nodeboxgl/font/Droid Serif-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d8e798b041a7abb86acd2ebb61be7bf11898a99 GIT binary patch literal 189916 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

%(YI$knULGlShzQ%lqVQEhDH4F!+aHdLE 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 J?~4zF_&+mqNJszx literal 0 HcmV?d00001 diff --git a/nodeboxgl/font/Droid Serif-Italic.ttf b/nodeboxgl/font/Droid Serif-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6acc86dae06a9204452f65dbcf7a186579398c76 GIT binary patch literal 177176 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 literal 0 HcmV?d00001 diff --git a/nodeboxgl/font/Droid Serif-Regular.ttf b/nodeboxgl/font/Droid Serif-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c1c2c4d021a57dd79dc139137b60640c0bae5d8 GIT binary patch literal 172532 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 literal 0 HcmV?d00001 diff --git a/nodeboxgl/font/glyph.p b/nodeboxgl/font/glyph.p new file mode 100644 index 0000000..11ad217 --- /dev/null +++ b/nodeboxgl/font/glyph.p @@ -0,0 +1,160310 @@ +(dp1 +S'Droid Serif' +p2 +(dp3 +S'bold italic' +p4 +(dp5 +V +(lp6 +(lp7 +S'moveto' +p8 +aI346 +aI0 +aa(lp9 +S'close' +p10 +aa(lp11 +g8 +aI346 +aI0 +aasV$ +(lp12 +(lp13 +g8 +aI670 +aI-312 +aa(lp14 +S'curveto' +p15 +aI648 +aI-202 +aI670 +aI-271 +aI663 +aI-234 +aa(lp16 +g15 +aI583 +aI-120 +aI633 +aI-170 +aI611 +aI-143 +aa(lp17 +g15 +aI482 +aI-68 +aI555 +aI-98 +aI521 +aI-80 +aa(lp18 +g15 +aI348 +aI-49 +aI442 +aI-56 +aI397 +aI-49 +aa(lp19 +S'lineto' +p20 +aI315 +aI105 +aa(lp21 +g20 +aI241 +aI105 +aa(lp22 +g20 +aI274 +aI-50 +aa(lp23 +g15 +aI93 +aI-106 +aI193 +aI-56 +aI133 +aI-75 +aa(lp24 +g15 +aI33 +aI-228 +aI53 +aI-138 +aI33 +aI-178 +aa(lp25 +g15 +aI71 +aI-320 +aI33 +aI-270 +aI46 +aI-301 +aa(lp26 +g15 +aI181 +aI-349 +aI97 +aI-339 +aI134 +aI-349 +aa(lp27 +g15 +aI189 +aI-266 +aI181 +aI-317 +aI184 +aI-290 +aa(lp28 +g15 +aI211 +aI-204 +aI194 +aI-242 +aI202 +aI-221 +aa(lp29 +g15 +aI246 +aI-161 +aI221 +aI-187 +aI233 +aI-172 +aa(lp30 +g15 +aI292 +aI-135 +aI260 +aI-150 +aI275 +aI-141 +aa(lp31 +g20 +aI352 +aI-419 +aa(lp32 +g15 +aI268 +aI-470 +aI320 +aI-436 +aI292 +aI-453 +aa(lp33 +g15 +aI206 +aI-526 +aI243 +aI-487 +aI223 +aI-506 +aa(lp34 +g15 +aI168 +aI-592 +aI189 +aI-546 +aI177 +aI-568 +aa(lp35 +g15 +aI156 +aI-675 +aI160 +aI-617 +aI156 +aI-644 +aa(lp36 +g15 +aI178 +aI-774 +aI156 +aI-712 +aI163 +aI-745 +aa(lp37 +g15 +aI239 +aI-849 +aI192 +aI-803 +aI213 +aI-828 +aa(lp38 +g15 +aI334 +aI-896 +aI266 +aI-869 +aI297 +aI-885 +aa(lp39 +g15 +aI458 +aI-915 +aI372 +aI-907 +aI413 +aI-914 +aa(lp40 +g20 +aI479 +aI-1012 +aa(lp41 +g20 +aI554 +aI-1012 +aa(lp42 +g20 +aI531 +aI-912 +aa(lp43 +g15 +aI690 +aI-868 +aI602 +aI-907 +aI654 +aI-892 +aa(lp44 +g15 +aI742 +aI-778 +aI725 +aI-844 +aI742 +aI-814 +aa(lp45 +g15 +aI735 +aI-729 +aI742 +aI-759 +aI740 +aI-743 +aa(lp46 +g15 +aI709 +aI-692 +aI729 +aI-715 +aI721 +aI-702 +aa(lp47 +g15 +aI663 +aI-670 +aI697 +aI-682 +aI682 +aI-675 +aa(lp48 +g15 +aI591 +aI-662 +aI643 +aI-664 +aI620 +aI-662 +aa(lp49 +g15 +aI587 +aI-711 +aI591 +aI-678 +aI590 +aI-694 +aa(lp50 +g15 +aI573 +aI-759 +aI584 +aI-728 +aI579 +aI-744 +aa(lp51 +g15 +aI549 +aI-801 +aI567 +aI-775 +aI559 +aI-788 +aa(lp52 +g15 +aI514 +aI-830 +aI540 +aI-813 +aI528 +aI-823 +aa(lp53 +g20 +aI458 +aI-567 +aa(lp54 +g20 +aI489 +aI-551 +aa(lp55 +g15 +aI625 +aI-446 +aI550 +aI-519 +aI596 +aI-484 +aa(lp56 +g15 +aI670 +aI-312 +aI655 +aI-407 +aI670 +aI-363 +aa(lp57 +g10 +aa(lp58 +g8 +aI500 +aI-252 +aa(lp59 +g15 +aI496 +aI-286 +aI500 +aI-264 +aI498 +aI-276 +aa(lp60 +g15 +aI484 +aI-317 +aI494 +aI-297 +aI490 +aI-307 +aa(lp61 +g15 +aI459 +aI-348 +aI478 +aI-327 +aI469 +aI-338 +aa(lp62 +g15 +aI418 +aI-381 +aI448 +aI-358 +aI435 +aI-369 +aa(lp63 +g20 +aI363 +aI-125 +aa(lp64 +g15 +aI420 +aI-135 +aI384 +aI-125 +aI403 +aI-128 +aa(lp65 +g15 +aI462 +aI-161 +aI436 +aI-141 +aI451 +aI-150 +aa(lp66 +g15 +aI490 +aI-202 +aI474 +aI-172 +aI483 +aI-186 +aa(lp67 +g15 +aI500 +aI-252 +aI496 +aI-217 +aI500 +aI-234 +aa(lp68 +g10 +aa(lp69 +g8 +aI328 +aI-719 +aa(lp70 +g15 +aI344 +aI-655 +aI328 +aI-693 +aI333 +aI-672 +aa(lp71 +g15 +aI391 +aI-607 +aI354 +aI-638 +aI370 +aI-622 +aa(lp72 +g20 +aI441 +aI-839 +aa(lp73 +g15 +aI398 +aI-827 +aI426 +aI-837 +aI411 +aI-833 +aa(lp74 +g15 +aI361 +aI-805 +aI384 +aI-822 +aI372 +aI-814 +aa(lp75 +g15 +aI337 +aI-769 +aI351 +aI-795 +aI343 +aI-783 +aa(lp76 +g15 +aI328 +aI-719 +aI331 +aI-755 +aI328 +aI-738 +aa(lp77 +g10 +aa(lp78 +g8 +aI745 +aI0 +aa(lp79 +g10 +aa(lp80 +g8 +aI745 +aI0 +aasV( +(lp81 +(lp82 +g8 +aI261 +aI-185 +aa(lp83 +g15 +aI266 +aI-103 +aI261 +aI-157 +aI263 +aI-130 +aa(lp84 +g15 +aI286 +aI-24 +aI270 +aI-75 +aI277 +aI-49 +aa(lp85 +g15 +aI322 +aI45 +aI295 +aI0 +aI307 +aI23 +aa(lp86 +g15 +aI377 +aI100 +aI337 +aI66 +aI355 +aI85 +aa(lp87 +g20 +aI360 +aI186 +aa(lp88 +g15 +aI221 +aI113 +aI306 +aI167 +aI260 +aI143 +aa(lp89 +g15 +aI127 +aI13 +aI183 +aI84 +aI151 +aI50 +aa(lp90 +g15 +aI73 +aI-109 +aI102 +aI-24 +aI84 +aI-65 +aa(lp91 +g15 +aI55 +aI-247 +aI61 +aI-153 +aI55 +aI-199 +aa(lp92 +g15 +aI71 +aI-414 +aI55 +aI-302 +aI61 +aI-358 +aa(lp93 +g15 +aI117 +aI-577 +aI81 +aI-470 +aI96 +aI-524 +aa(lp94 +g15 +aI194 +aI-729 +aI137 +aI-630 +aI163 +aI-681 +aa(lp95 +g15 +aI302 +aI-860 +aI224 +aI-777 +aI260 +aI-821 +aa(lp96 +g15 +aI442 +aI-963 +aI343 +aI-900 +aI390 +aI-934 +aa(lp97 +g15 +aI614 +aI-1028 +aI494 +aI-992 +aI551 +aI-1014 +aa(lp98 +g20 +aI601 +aI-944 +aa(lp99 +g15 +aI512 +aI-881 +aI568 +aI-926 +aI538 +aI-905 +aa(lp100 +g15 +aI442 +aI-805 +aI485 +aI-857 +aI462 +aI-832 +aa(lp101 +g15 +aI388 +aI-721 +aI421 +aI-778 +aI403 +aI-750 +aa(lp102 +g15 +aI349 +aI-634 +aI373 +aI-692 +aI360 +aI-663 +aa(lp103 +g15 +aI321 +aI-551 +aI338 +aI-606 +aI328 +aI-578 +aa(lp104 +g15 +aI301 +aI-476 +aI313 +aI-524 +aI307 +aI-499 +aa(lp105 +g15 +aI268 +aI-304 +aI284 +aI-409 +aI274 +aI-352 +aa(lp106 +g15 +aI261 +aI-185 +aI263 +aI-256 +aI261 +aI-216 +aa(lp107 +g10 +aa(lp108 +g8 +aI533 +aI0 +aa(lp109 +g10 +aa(lp110 +g8 +aI533 +aI0 +aasV, +(lp111 +(lp112 +g8 +aI278 +aI-82 +aa(lp113 +g15 +aI260 +aI14 +aI278 +aI-48 +aI272 +aI-16 +aa(lp114 +g15 +aI204 +aI96 +aI247 +aI44 +aI229 +aI72 +aa(lp115 +g15 +aI112 +aI160 +aI180 +aI121 +aI149 +aI142 +aa(lp116 +g15 +aI-14 +aI201 +aI76 +aI178 +aI33 +aI192 +aa(lp117 +g20 +aI0 +aI131 +aa(lp118 +g15 +aI137 +aI20 +aI91 +aI109 +aI137 +aI72 +aa(lp119 +g15 +aI131 +aI-3 +aI137 +aI11 +aI135 +aI3 +aa(lp120 +g15 +aI117 +aI-21 +aI128 +aI-9 +aI123 +aI-15 +aa(lp121 +g15 +aI99 +aI-37 +aI112 +aI-26 +aI106 +aI-32 +aa(lp122 +g15 +aI82 +aI-55 +aI93 +aI-42 +aI87 +aI-48 +aa(lp123 +g15 +aI68 +aI-78 +aI76 +aI-61 +aI71 +aI-69 +aa(lp124 +g15 +aI62 +aI-111 +aI64 +aI-87 +aI62 +aI-98 +aa(lp125 +g15 +aI70 +aI-149 +aI62 +aI-125 +aI65 +aI-138 +aa(lp126 +g15 +aI92 +aI-178 +aI76 +aI-161 +aI83 +aI-170 +aa(lp127 +g15 +aI124 +aI-197 +aI101 +aI-186 +aI112 +aI-193 +aa(lp128 +g15 +aI162 +aI-203 +aI136 +aI-201 +aI149 +aI-203 +aa(lp129 +g15 +aI208 +aI-195 +aI178 +aI-203 +aI193 +aI-200 +aa(lp130 +g15 +aI244 +aI-171 +aI222 +aI-189 +aI234 +aI-181 +aa(lp131 +g15 +aI269 +aI-133 +aI255 +aI-161 +aI263 +aI-148 +aa(lp132 +g15 +aI278 +aI-82 +aI275 +aI-119 +aI278 +aI-101 +aa(lp133 +g10 +aa(lp134 +g8 +aI391 +aI0 +aa(lp135 +g10 +aa(lp136 +g8 +aI391 +aI0 +aasV0 +(lp137 +(lp138 +g8 +aI49 +aI-307 +aa(lp139 +g15 +aI60 +aI-452 +aI49 +aI-353 +aI53 +aI-401 +aa(lp140 +g15 +aI95 +aI-600 +aI68 +aI-502 +aI79 +aI-551 +aa(lp141 +g15 +aI153 +aI-740 +aI110 +aI-649 +aI130 +aI-696 +aa(lp142 +g15 +aI236 +aI-856 +aI177 +aI-784 +aI204 +aI-823 +aa(lp143 +g15 +aI345 +aI-936 +aI268 +aI-890 +aI304 +aI-916 +aa(lp144 +g15 +aI479 +aI-966 +aI385 +aI-956 +aI430 +aI-966 +aa(lp145 +g15 +aI586 +aI-948 +aI518 +aI-966 +aI553 +aI-960 +aa(lp146 +g15 +aI672 +aI-893 +aI619 +aI-936 +aI648 +aI-918 +aa(lp147 +g15 +aI730 +aI-798 +aI697 +aI-868 +aI716 +aI-836 +aa(lp148 +g15 +aI751 +aI-661 +aI744 +aI-759 +aI751 +aI-713 +aa(lp149 +g15 +aI740 +aI-517 +aI751 +aI-616 +aI748 +aI-568 +aa(lp150 +g15 +aI707 +aI-365 +aI733 +aI-466 +aI722 +aI-415 +aa(lp151 +g15 +aI650 +aI-221 +aI692 +aI-315 +aI673 +aI-267 +aa(lp152 +g15 +aI568 +aI-99 +aI627 +aI-175 +aI600 +aI-134 +aa(lp153 +g15 +aI460 +aI-15 +aI537 +aI-64 +aI501 +aI-36 +aa(lp154 +g15 +aI326 +aI15 +aI420 +aI5 +aI375 +aI15 +aa(lp155 +g15 +aI213 +aI-5 +aI285 +aI15 +aI247 +aI8 +aa(lp156 +g15 +aI126 +aI-67 +aI179 +aI-19 +aI150 +aI-39 +aa(lp157 +g15 +aI69 +aI-168 +aI101 +aI-94 +aI83 +aI-128 +aa(lp158 +g15 +aI49 +aI-307 +aI56 +aI-208 +aI49 +aI-254 +aa(lp159 +g10 +aa(lp160 +g8 +aI231 +aI-250 +aa(lp161 +g15 +aI259 +aI-118 +aI231 +aI-190 +aI241 +aI-146 +aa(lp162 +g15 +aI334 +aI-75 +aI278 +aI-89 +aI303 +aI-75 +aa(lp163 +g15 +aI406 +aI-106 +aI360 +aI-75 +aI384 +aI-86 +aa(lp164 +g15 +aI466 +aI-189 +aI429 +aI-127 +aI449 +aI-154 +aa(lp165 +g15 +aI513 +aI-306 +aI484 +aI-223 +aI500 +aI-262 +aa(lp166 +g15 +aI548 +aI-441 +aI527 +aI-350 +aI539 +aI-395 +aa(lp167 +g15 +aI569 +aI-580 +aI557 +aI-488 +aI564 +aI-534 +aa(lp168 +g15 +aI576 +aI-704 +aI573 +aI-625 +aI576 +aI-667 +aa(lp169 +g15 +aI549 +aI-834 +aI576 +aI-763 +aI567 +aI-806 +aa(lp170 +g15 +aI473 +aI-877 +aI531 +aI-863 +aI505 +aI-877 +aa(lp171 +g15 +aI402 +aI-846 +aI448 +aI-877 +aI424 +aI-866 +aa(lp172 +g15 +aI343 +aI-765 +aI381 +aI-826 +aI361 +aI-799 +aa(lp173 +g15 +aI296 +aI-648 +aI325 +aI-731 +aI310 +aI-692 +aa(lp174 +g15 +aI261 +aI-513 +aI282 +aI-604 +aI270 +aI-559 +aa(lp175 +g15 +aI239 +aI-375 +aI251 +aI-466 +aI244 +aI-420 +aa(lp176 +g15 +aI231 +aI-250 +aI234 +aI-329 +aI231 +aI-287 +aa(lp177 +g10 +aa(lp178 +g8 +aI745 +aI0 +aa(lp179 +g10 +aa(lp180 +g8 +aI745 +aI0 +aasV4 +(lp181 +(lp182 +g8 +aI438 +aI-568 +aa(lp183 +g15 +aI451 +aI-626 +aI442 +aI-586 +aI446 +aI-605 +aa(lp184 +g15 +aI466 +aI-692 +aI455 +aI-647 +aI461 +aI-669 +aa(lp185 +g15 +aI483 +aI-759 +aI471 +aI-714 +aI477 +aI-737 +aa(lp186 +g15 +aI502 +aI-825 +aI489 +aI-782 +aI496 +aI-804 +aa(lp187 +g15 +aI469 +aI-774 +aI493 +aI-809 +aI481 +aI-793 +aa(lp188 +g15 +aI430 +aI-719 +aI456 +aI-756 +aI443 +aI-738 +aa(lp189 +g15 +aI391 +aI-667 +aI417 +aI-701 +aI404 +aI-684 +aa(lp190 +g15 +aI358 +aI-625 +aI379 +aI-651 +aI368 +aI-636 +aa(lp191 +g20 +aI122 +aI-335 +aa(lp192 +g20 +aI389 +aI-335 +aa(lp193 +g10 +aa(lp194 +g8 +aI171 +aI0 +aa(lp195 +g20 +aI185 +aI-70 +aa(lp196 +g20 +aI223 +aI-70 +aa(lp197 +g15 +aI263 +aI-72 +aI236 +aI-70 +aI250 +aI-71 +aa(lp198 +g15 +aI301 +aI-84 +aI277 +aI-74 +aI289 +aI-78 +aa(lp199 +g15 +aI332 +aI-113 +aI313 +aI-90 +aI323 +aI-100 +aa(lp200 +g15 +aI353 +aI-166 +aI341 +aI-125 +aI348 +aI-143 +aa(lp201 +g20 +aI370 +aI-247 +aa(lp202 +g20 +aI0 +aI-247 +aa(lp203 +g20 +aI18 +aI-330 +aa(lp204 +g20 +aI529 +aI-951 +aa(lp205 +g20 +aI716 +aI-951 +aa(lp206 +g20 +aI583 +aI-335 +aa(lp207 +g20 +aI722 +aI-335 +aa(lp208 +g20 +aI703 +aI-247 +aa(lp209 +g20 +aI565 +aI-247 +aa(lp210 +g20 +aI548 +aI-164 +aa(lp211 +g15 +aI544 +aI-143 +aI546 +aI-159 +aI545 +aI-152 +aa(lp212 +g15 +aI542 +aI-123 +aI543 +aI-134 +aI542 +aI-127 +aa(lp213 +g15 +aI549 +aI-95 +aI542 +aI-111 +aI545 +aI-102 +aa(lp214 +g15 +aI566 +aI-79 +aI553 +aI-88 +aI559 +aI-83 +aa(lp215 +g15 +aI594 +aI-72 +aI574 +aI-76 +aI583 +aI-73 +aa(lp216 +g15 +aI630 +aI-70 +aI605 +aI-71 +aI617 +aI-70 +aa(lp217 +g20 +aI654 +aI-70 +aa(lp218 +g20 +aI639 +aI0 +aa(lp219 +g10 +aa(lp220 +g8 +aI745 +aI0 +aa(lp221 +g10 +aa(lp222 +g8 +aI745 +aI0 +aasV8 +(lp223 +(lp224 +g8 +aI329 +aI13 +aa(lp225 +g15 +aI201 +aI-3 +aI282 +aI13 +aI240 +aI7 +aa(lp226 +g15 +aI103 +aI-50 +aI163 +aI-14 +aI130 +aI-30 +aa(lp227 +g15 +aI40 +aI-123 +aI76 +aI-71 +aI55 +aI-95 +aa(lp228 +g15 +aI17 +aI-215 +aI25 +aI-151 +aI17 +aI-182 +aa(lp229 +g15 +aI37 +aI-312 +aI17 +aI-253 +aI24 +aI-285 +aa(lp230 +g15 +aI93 +aI-383 +aI51 +aI-338 +aI69 +aI-362 +aa(lp231 +g15 +aI176 +aI-437 +aI116 +aI-403 +aI144 +aI-421 +aa(lp232 +g15 +aI279 +aI-481 +aI208 +aI-452 +aI242 +aI-467 +aa(lp233 +g15 +aI227 +aI-529 +aI260 +aI-496 +aI243 +aI-512 +aa(lp234 +g15 +aI187 +aI-586 +aI212 +aI-547 +aI198 +aI-566 +aa(lp235 +g15 +aI161 +aI-649 +aI176 +aI-606 +aI167 +aI-627 +aa(lp236 +g15 +aI151 +aI-718 +aI154 +aI-671 +aI151 +aI-694 +aa(lp237 +g15 +aI170 +aI-813 +aI151 +aI-751 +aI157 +aI-783 +aa(lp238 +g15 +aI229 +aI-891 +aI182 +aI-843 +aI202 +aI-869 +aa(lp239 +g15 +aI334 +aI-945 +aI256 +aI-914 +aI291 +aI-931 +aa(lp240 +g15 +aI489 +aI-965 +aI377 +aI-958 +aI428 +aI-965 +aa(lp241 +g15 +aI602 +aI-950 +aI531 +aI-965 +aI569 +aI-960 +aa(lp242 +g15 +aI685 +aI-909 +aI635 +aI-940 +aI663 +aI-927 +aa(lp243 +g15 +aI737 +aI-847 +aI708 +aI-892 +aI726 +aI-871 +aa(lp244 +g15 +aI755 +aI-770 +aI749 +aI-823 +aI755 +aI-798 +aa(lp245 +g15 +aI739 +aI-680 +aI755 +aI-736 +aI750 +aI-706 +aa(lp246 +g15 +aI693 +aI-611 +aI728 +aI-655 +aI713 +aI-631 +aa(lp247 +g15 +aI622 +aI-556 +aI673 +aI-591 +aI650 +aI-572 +aa(lp248 +g15 +aI531 +aI-509 +aI595 +aI-540 +aI564 +aI-524 +aa(lp249 +g15 +aI596 +aI-462 +aI554 +aI-495 +aI576 +aI-479 +aa(lp250 +g15 +aI647 +aI-408 +aI615 +aI-446 +aI632 +aI-427 +aa(lp251 +g15 +aI680 +aI-343 +aI661 +aI-388 +aI672 +aI-366 +aa(lp252 +g15 +aI693 +aI-269 +aI689 +aI-320 +aI693 +aI-295 +aa(lp253 +g15 +aI666 +aI-142 +aI693 +aI-220 +aI684 +aI-178 +aa(lp254 +g15 +aI591 +aI-54 +aI648 +aI-107 +aI623 +aI-77 +aa(lp255 +g15 +aI476 +aI-3 +aI559 +aI-31 +aI520 +aI-14 +aa(lp256 +g15 +aI329 +aI13 +aI431 +aI7 +aI382 +aI13 +aa(lp257 +g10 +aa(lp258 +g8 +aI339 +aI-63 +aa(lp259 +g15 +aI406 +aI-73 +aI363 +aI-63 +aI385 +aI-66 +aa(lp260 +g15 +aI460 +aI-105 +aI427 +aI-80 +aI445 +aI-91 +aa(lp261 +g15 +aI498 +aI-157 +aI476 +aI-119 +aI488 +aI-136 +aa(lp262 +g15 +aI511 +aI-231 +aI507 +aI-178 +aI511 +aI-203 +aa(lp263 +g15 +aI501 +aI-291 +aI511 +aI-253 +aI508 +aI-272 +aa(lp264 +g15 +aI473 +aI-342 +aI495 +aI-309 +aI485 +aI-326 +aa(lp265 +g15 +aI426 +aI-389 +aI460 +aI-359 +aI444 +aI-374 +aa(lp266 +g15 +aI360 +aI-431 +aI407 +aI-403 +aI385 +aI-417 +aa(lp267 +g15 +aI240 +aI-346 +aI309 +aI-411 +aI269 +aI-382 +aa(lp268 +g15 +aI197 +aI-210 +aI211 +aI-310 +aI197 +aI-265 +aa(lp269 +g15 +aI235 +aI-102 +aI197 +aI-164 +aI209 +aI-128 +aa(lp270 +g15 +aI339 +aI-63 +aI260 +aI-76 +aI295 +aI-63 +aa(lp271 +g10 +aa(lp272 +g8 +aI587 +aI-760 +aa(lp273 +g15 +aI581 +aI-811 +aI587 +aI-778 +aI585 +aI-795 +aa(lp274 +g15 +aI562 +aI-851 +aI577 +aI-826 +aI571 +aI-839 +aa(lp275 +g15 +aI529 +aI-877 +aI553 +aI-862 +aI542 +aI-871 +aa(lp276 +g15 +aI482 +aI-887 +aI516 +aI-884 +aI500 +aI-887 +aa(lp277 +g15 +aI424 +aI-876 +aI461 +aI-887 +aI442 +aI-883 +aa(lp278 +g15 +aI378 +aI-843 +aI406 +aI-868 +aI391 +aI-857 +aa(lp279 +g15 +aI347 +aI-792 +aI365 +aI-829 +aI354 +aI-812 +aa(lp280 +g15 +aI335 +aI-724 +aI339 +aI-772 +aI335 +aI-749 +aa(lp281 +g15 +aI449 +aI-551 +aI335 +aI-655 +aI373 +aI-597 +aa(lp282 +g15 +aI514 +aI-594 +aI474 +aI-565 +aI496 +aI-579 +aa(lp283 +g15 +aI557 +aI-644 +aI532 +aI-610 +aI546 +aI-626 +aa(lp284 +g15 +aI580 +aI-699 +aI568 +aI-661 +aI575 +aI-679 +aa(lp285 +g15 +aI587 +aI-760 +aI585 +aI-718 +aI587 +aI-739 +aa(lp286 +g10 +aa(lp287 +g8 +aI745 +aI0 +aa(lp288 +g10 +aa(lp289 +g8 +aI745 +aI0 +aasV< +(lp290 +(lp291 +g8 +aI108 +aI-448 +aa(lp292 +g20 +aI108 +aI-503 +aa(lp293 +g20 +aI679 +aI-815 +aa(lp294 +g20 +aI679 +aI-710 +aa(lp295 +g20 +aI250 +aI-475 +aa(lp296 +g20 +aI679 +aI-243 +aa(lp297 +g20 +aI679 +aI-138 +aa(lp298 +g10 +aa(lp299 +g8 +aI745 +aI0 +aa(lp300 +g10 +aa(lp301 +g8 +aI745 +aI0 +aasV@ +(lp302 +(lp303 +g8 +aI1165 +aI-522 +aa(lp304 +g15 +aI1141 +aI-344 +aI1165 +aI-455 +aI1157 +aI-396 +aa(lp305 +g15 +aI1078 +aI-212 +aI1125 +aI-292 +aI1104 +aI-248 +aa(lp306 +g15 +aI989 +aI-130 +aI1052 +aI-176 +aI1022 +aI-149 +aa(lp307 +g15 +aI890 +aI-102 +aI957 +aI-111 +aI924 +aI-102 +aa(lp308 +g15 +aI790 +aI-131 +aI851 +aI-102 +aI817 +aI-112 +aa(lp309 +g15 +aI726 +aI-227 +aI762 +aI-150 +aI741 +aI-182 +aa(lp310 +g20 +aI718 +aI-227 +aa(lp311 +g15 +aI687 +aI-178 +aI709 +aI-210 +aI699 +aI-193 +aa(lp312 +g15 +aI647 +aI-138 +aI675 +aI-163 +aI662 +aI-150 +aa(lp313 +g15 +aI597 +aI-112 +aI633 +aI-127 +aI616 +aI-118 +aa(lp314 +g15 +aI534 +aI-102 +aI578 +aI-105 +aI557 +aI-102 +aa(lp315 +g15 +aI454 +aI-116 +aI506 +aI-102 +aI479 +aI-106 +aa(lp316 +g15 +aI388 +aI-157 +aI429 +aI-125 +aI407 +aI-139 +aa(lp317 +g15 +aI342 +aI-228 +aI368 +aI-176 +aI353 +aI-200 +aa(lp318 +g15 +aI325 +aI-330 +aI331 +aI-257 +aI325 +aI-291 +aa(lp319 +g15 +aI333 +aI-407 +aI325 +aI-354 +aI328 +aI-379 +aa(lp320 +g15 +aI360 +aI-490 +aI339 +aI-435 +aI348 +aI-463 +aa(lp321 +g15 +aI407 +aI-570 +aI372 +aI-518 +aI388 +aI-545 +aa(lp322 +g15 +aI475 +aI-639 +aI426 +aI-596 +aI449 +aI-619 +aa(lp323 +g15 +aI567 +aI-686 +aI502 +aI-658 +aI532 +aI-674 +aa(lp324 +g15 +aI684 +aI-704 +aI601 +aI-698 +aI640 +aI-704 +aa(lp325 +g15 +aI763 +aI-692 +aI715 +aI-704 +aI741 +aI-700 +aa(lp326 +g15 +aI817 +aI-664 +aI785 +aI-685 +aI803 +aI-675 +aa(lp327 +g20 +aI873 +aI-692 +aa(lp328 +g20 +aI905 +aI-692 +aa(lp329 +g20 +aI849 +aI-359 +aa(lp330 +g15 +aI846 +aI-339 +aI848 +aI-354 +aI847 +aI-347 +aa(lp331 +g15 +aI843 +aI-314 +aI844 +aI-331 +aI843 +aI-322 +aa(lp332 +g15 +aI840 +aI-288 +aI842 +aI-305 +aI841 +aI-296 +aa(lp333 +g15 +aI839 +aI-269 +aI840 +aI-280 +aI839 +aI-274 +aa(lp334 +g15 +aI845 +aI-224 +aI839 +aI-250 +aI841 +aI-235 +aa(lp335 +g15 +aI860 +aI-196 +aI849 +aI-212 +aI854 +aI-203 +aa(lp336 +g15 +aI881 +aI-182 +aI866 +aI-189 +aI873 +aI-185 +aa(lp337 +g15 +aI904 +aI-179 +aI889 +aI-180 +aI896 +aI-179 +aa(lp338 +g15 +aI957 +aI-201 +aI921 +aI-179 +aI939 +aI-186 +aa(lp339 +g15 +aI1007 +aI-266 +aI975 +aI-216 +aI992 +aI-237 +aa(lp340 +g15 +aI1043 +aI-371 +aI1021 +aI-294 +aI1033 +aI-329 +aa(lp341 +g15 +aI1057 +aI-517 +aI1052 +aI-414 +aI1057 +aI-462 +aa(lp342 +g15 +aI1029 +aI-676 +aI1057 +aI-577 +aI1048 +aI-631 +aa(lp343 +g15 +aI952 +aI-791 +aI1011 +aI-722 +aI985 +aI-760 +aa(lp344 +g15 +aI834 +aI-860 +aI919 +aI-822 +aI880 +aI-845 +aa(lp345 +g15 +aI686 +aI-883 +aI789 +aI-875 +aI740 +aI-883 +aa(lp346 +g15 +aI562 +aI-866 +aI644 +aI-883 +aI603 +aI-877 +aa(lp347 +g15 +aI444 +aI-814 +aI521 +aI-854 +aI482 +aI-837 +aa(lp348 +g15 +aI342 +aI-731 +aI407 +aI-792 +aI373 +aI-764 +aa(lp349 +g15 +aI261 +aI-619 +aI311 +aI-698 +aI284 +aI-661 +aa(lp350 +g15 +aI207 +aI-480 +aI238 +aI-577 +aI220 +aI-531 +aa(lp351 +g15 +aI188 +aI-316 +aI194 +aI-429 +aI188 +aI-375 +aa(lp352 +g15 +aI223 +aI-115 +aI188 +aI-238 +aI199 +aI-170 +aa(lp353 +g15 +aI318 +aI20 +aI246 +aI-59 +aI278 +aI-14 +aa(lp354 +g15 +aI459 +aI97 +aI358 +aI55 +aI405 +aI81 +aa(lp355 +g15 +aI629 +aI121 +aI512 +aI113 +aI569 +aI121 +aa(lp356 +g15 +aI735 +aI111 +aI665 +aI121 +aI700 +aI118 +aa(lp357 +g15 +aI832 +aI86 +aI769 +aI105 +aI801 +aI96 +aa(lp358 +g15 +aI918 +aI50 +aI863 +aI75 +aI892 +aI64 +aa(lp359 +g15 +aI989 +aI9 +aI945 +aI37 +aI968 +aI23 +aa(lp360 +g20 +aI1021 +aI60 +aa(lp361 +g15 +aI941 +aI110 +aI998 +aI78 +aI971 +aI94 +aa(lp362 +g15 +aI844 +aI151 +aI911 +aI126 +aI879 +aI139 +aa(lp363 +g15 +aI733 +aI179 +aI809 +aI163 +aI772 +aI172 +aa(lp364 +g15 +aI610 +aI189 +aI693 +aI186 +aI652 +aI189 +aa(lp365 +g15 +aI464 +aI175 +aI559 +aI189 +aI511 +aI185 +aa(lp366 +g15 +aI332 +aI133 +aI417 +aI166 +aI373 +aI152 +aa(lp367 +g15 +aI220 +aI61 +aI291 +aI114 +aI253 +aI90 +aa(lp368 +g15 +aI133 +aI-37 +aI186 +aI33 +aI157 +aI0 +aa(lp369 +g15 +aI77 +aI-166 +aI109 +aI-76 +aI90 +aI-119 +aa(lp370 +g15 +aI57 +aI-325 +aI63 +aI-214 +aI57 +aI-267 +aa(lp371 +g15 +aI79 +aI-495 +aI57 +aI-384 +aI64 +aI-441 +aa(lp372 +g15 +aI140 +aI-646 +aI93 +aI-549 +aI114 +aI-600 +aa(lp373 +g15 +aI238 +aI-772 +aI167 +aI-692 +aI200 +aI-734 +aa(lp374 +g15 +aI366 +aI-868 +aI276 +aI-809 +aI319 +aI-841 +aa(lp375 +g15 +aI520 +aI-929 +aI413 +aI-895 +aI465 +aI-915 +aa(lp376 +g15 +aI695 +aI-951 +aI575 +aI-944 +aI634 +aI-951 +aa(lp377 +g15 +aI899 +aI-918 +aI772 +aI-951 +aI840 +aI-940 +aa(lp378 +g15 +aI1046 +aI-827 +aI957 +aI-896 +aI1006 +aI-865 +aa(lp379 +g15 +aI1135 +aI-691 +aI1085 +aI-788 +aI1115 +aI-743 +aa(lp380 +g15 +aI1165 +aI-522 +aI1155 +aI-638 +aI1165 +aI-582 +aa(lp381 +g10 +aa(lp382 +g8 +aI489 +aI-316 +aa(lp383 +g15 +aI513 +aI-214 +aI489 +aI-272 +aI497 +aI-238 +aa(lp384 +g15 +aI574 +aI-179 +aI528 +aI-191 +aI549 +aI-179 +aa(lp385 +g15 +aI623 +aI-192 +aI593 +aI-179 +aI609 +aI-183 +aa(lp386 +g15 +aI658 +aI-229 +aI637 +aI-202 +aI648 +aI-214 +aa(lp387 +g15 +aI681 +aI-279 +aI667 +aI-244 +aI675 +aI-260 +aa(lp388 +g15 +aI695 +aI-336 +aI687 +aI-298 +aI692 +aI-317 +aa(lp389 +g20 +aI749 +aI-608 +aa(lp390 +g15 +aI737 +aI-624 +aI746 +aI-614 +aI742 +aI-620 +aa(lp391 +g15 +aI720 +aI-636 +aI732 +aI-629 +aI727 +aI-633 +aa(lp392 +g15 +aI699 +aI-643 +aI714 +aI-639 +aI707 +aI-642 +aa(lp393 +g15 +aI678 +aI-646 +aI692 +aI-645 +aI685 +aI-646 +aa(lp394 +g15 +aI617 +aI-629 +aI655 +aI-646 +aI635 +aI-640 +aa(lp395 +g15 +aI569 +aI-584 +aI599 +aI-617 +aI583 +aI-602 +aa(lp396 +g15 +aI533 +aI-521 +aI555 +aI-566 +aI543 +aI-545 +aa(lp397 +g15 +aI508 +aI-449 +aI523 +aI-497 +aI514 +aI-473 +aa(lp398 +g15 +aI494 +aI-378 +aI501 +aI-425 +aI497 +aI-401 +aa(lp399 +g15 +aI489 +aI-316 +aI491 +aI-354 +aI489 +aI-334 +aa(lp400 +g10 +aa(lp401 +g8 +aI1227 +aI0 +aa(lp402 +g10 +aa(lp403 +g8 +aI1227 +aI0 +aasVD +(lp404 +(lp405 +g8 +aI-17 +aI-70 +aa(lp406 +g20 +aI1 +aI-70 +aa(lp407 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp408 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp409 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp410 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp411 +g20 +aI262 +aI-804 +aa(lp412 +g15 +aI266 +aI-821 +aI264 +aI-809 +aI265 +aI-815 +aa(lp413 +g15 +aI268 +aI-835 +aI267 +aI-827 +aI268 +aI-832 +aa(lp414 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp415 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp416 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp417 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp418 +g20 +aI154 +aI-881 +aa(lp419 +g20 +aI169 +aI-951 +aa(lp420 +g20 +aI595 +aI-951 +aa(lp421 +g15 +aI766 +aI-927 +aI659 +aI-951 +aI716 +aI-943 +aa(lp422 +g15 +aI893 +aI-858 +aI816 +aI-912 +aI859 +aI-889 +aa(lp423 +g15 +aI972 +aI-744 +aI928 +aI-827 +aI954 +aI-790 +aa(lp424 +g15 +aI1000 +aI-588 +aI990 +aI-699 +aI1000 +aI-647 +aa(lp425 +g15 +aI983 +aI-434 +aI1000 +aI-535 +aI994 +aI-484 +aa(lp426 +g15 +aI934 +aI-294 +aI972 +aI-385 +aI956 +aI-338 +aa(lp427 +g15 +aI854 +aI-175 +aI913 +aI-251 +aI886 +aI-211 +aa(lp428 +g15 +aI744 +aI-81 +aI823 +aI-138 +aI786 +aI-107 +aa(lp429 +g15 +aI605 +aI-21 +aI703 +aI-55 +aI656 +aI-35 +aa(lp430 +g15 +aI437 +aI0 +aI553 +aI-6 +aI497 +aI0 +aa(lp431 +g20 +aI-31 +aI0 +aa(lp432 +g10 +aa(lp433 +g8 +aI380 +aI-82 +aa(lp434 +g15 +aI547 +aI-120 +aI442 +aI-82 +aI498 +aI-94 +aa(lp435 +g15 +aI671 +aI-227 +aI596 +aI-145 +aI638 +aI-181 +aa(lp436 +g15 +aI749 +aI-390 +aI705 +aI-272 +aI731 +aI-327 +aa(lp437 +g15 +aI776 +aI-599 +aI767 +aI-454 +aI776 +aI-523 +aa(lp438 +g15 +aI759 +aI-720 +aI776 +aI-646 +aI770 +aI-686 +aa(lp439 +g15 +aI713 +aI-804 +aI748 +aI-754 +aI733 +aI-782 +aa(lp440 +g15 +aI639 +aI-854 +aI693 +aI-827 +aI668 +aI-843 +aa(lp441 +g15 +aI542 +aI-869 +aI610 +aI-864 +aI578 +aI-869 +aa(lp442 +g20 +aI486 +aI-869 +aa(lp443 +g20 +aI320 +aI-82 +aa(lp444 +g10 +aa(lp445 +g8 +aI1024 +aI0 +aa(lp446 +g10 +aa(lp447 +g8 +aI1024 +aI0 +aasVH +(lp448 +(lp449 +g8 +aI525 +aI0 +aa(lp450 +g20 +aI539 +aI-70 +aa(lp451 +g20 +aI557 +aI-70 +aa(lp452 +g15 +aI598 +aI-73 +aI571 +aI-70 +aI585 +aI-71 +aa(lp453 +g15 +aI636 +aI-84 +aI612 +aI-74 +aI624 +aI-78 +aa(lp454 +g15 +aI665 +aI-108 +aI647 +aI-90 +aI657 +aI-98 +aa(lp455 +g15 +aI682 +aI-151 +aI673 +aI-119 +aI679 +aI-133 +aa(lp456 +g20 +aI746 +aI-455 +aa(lp457 +g20 +aI398 +aI-455 +aa(lp458 +g20 +aI333 +aI-146 +aa(lp459 +g15 +aI329 +aI-129 +aI332 +aI-141 +aI330 +aI-135 +aa(lp460 +g15 +aI328 +aI-115 +aI328 +aI-123 +aI328 +aI-118 +aa(lp461 +g15 +aI335 +aI-92 +aI328 +aI-105 +aI330 +aI-98 +aa(lp462 +g15 +aI355 +aI-78 +aI340 +aI-86 +aI346 +aI-81 +aa(lp463 +g15 +aI386 +aI-72 +aI364 +aI-75 +aI374 +aI-73 +aa(lp464 +g15 +aI425 +aI-70 +aI398 +aI-71 +aI411 +aI-70 +aa(lp465 +g20 +aI442 +aI-70 +aa(lp466 +g20 +aI427 +aI0 +aa(lp467 +g20 +aI-30 +aI0 +aa(lp468 +g20 +aI-16 +aI-70 +aa(lp469 +g20 +aI1 +aI-70 +aa(lp470 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp471 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp472 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp473 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp474 +g20 +aI259 +aI-789 +aa(lp475 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp476 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp477 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp478 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp479 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp480 +g20 +aI154 +aI-881 +aa(lp481 +g20 +aI169 +aI-951 +aa(lp482 +g20 +aI629 +aI-951 +aa(lp483 +g20 +aI614 +aI-881 +aa(lp484 +g20 +aI597 +aI-881 +aa(lp485 +g15 +aI555 +aI-878 +aI582 +aI-881 +aI568 +aI-880 +aa(lp486 +g15 +aI517 +aI-866 +aI541 +aI-876 +aI528 +aI-872 +aa(lp487 +g15 +aI488 +aI-841 +aI506 +aI-861 +aI496 +aI-852 +aa(lp488 +g15 +aI470 +aI-799 +aI480 +aI-831 +aI474 +aI-817 +aa(lp489 +g20 +aI416 +aI-536 +aa(lp490 +g20 +aI764 +aI-536 +aa(lp491 +g20 +aI820 +aI-795 +aa(lp492 +g15 +aI825 +aI-819 +aI822 +aI-804 +aI824 +aI-812 +aa(lp493 +g15 +aI826 +aI-835 +aI826 +aI-826 +aI826 +aI-832 +aa(lp494 +g15 +aI819 +aI-858 +aI826 +aI-845 +aI824 +aI-852 +aa(lp495 +g15 +aI798 +aI-872 +aI814 +aI-864 +aI807 +aI-869 +aa(lp496 +g15 +aI767 +aI-879 +aI790 +aI-876 +aI779 +aI-878 +aa(lp497 +g15 +aI729 +aI-881 +aI755 +aI-880 +aI743 +aI-881 +aa(lp498 +g20 +aI712 +aI-881 +aa(lp499 +g20 +aI726 +aI-951 +aa(lp500 +g20 +aI1186 +aI-951 +aa(lp501 +g20 +aI1171 +aI-881 +aa(lp502 +g20 +aI1154 +aI-881 +aa(lp503 +g15 +aI1113 +aI-878 +aI1140 +aI-881 +aI1126 +aI-880 +aa(lp504 +g15 +aI1076 +aI-866 +aI1099 +aI-876 +aI1087 +aI-872 +aa(lp505 +g15 +aI1047 +aI-841 +aI1064 +aI-861 +aI1055 +aI-852 +aa(lp506 +g15 +aI1029 +aI-799 +aI1039 +aI-831 +aI1033 +aI-817 +aa(lp507 +g20 +aI891 +aI-146 +aa(lp508 +g15 +aI888 +aI-129 +aI890 +aI-141 +aI889 +aI-135 +aa(lp509 +g15 +aI886 +aI-115 +aI887 +aI-123 +aI886 +aI-118 +aa(lp510 +g15 +aI893 +aI-92 +aI886 +aI-105 +aI889 +aI-98 +aa(lp511 +g15 +aI913 +aI-78 +aI898 +aI-86 +aI905 +aI-81 +aa(lp512 +g15 +aI944 +aI-72 +aI922 +aI-75 +aI932 +aI-73 +aa(lp513 +g15 +aI982 +aI-70 +aI955 +aI-71 +aI968 +aI-70 +aa(lp514 +g20 +aI1000 +aI-70 +aa(lp515 +g20 +aI985 +aI0 +aa(lp516 +g10 +aa(lp517 +g8 +aI1091 +aI0 +aa(lp518 +g10 +aa(lp519 +g8 +aI1091 +aI0 +aasVL +(lp520 +(lp521 +g8 +aI542 +aI-80 +aa(lp522 +g15 +aI606 +aI-90 +aI567 +aI-80 +aI588 +aI-83 +aa(lp523 +g15 +aI652 +aI-117 +aI623 +aI-96 +aI639 +aI-105 +aa(lp524 +g15 +aI687 +aI-162 +aI665 +aI-128 +aI677 +aI-144 +aa(lp525 +g15 +aI714 +aI-226 +aI697 +aI-180 +aI706 +aI-201 +aa(lp526 +g20 +aI738 +aI-297 +aa(lp527 +g20 +aI824 +aI-297 +aa(lp528 +g20 +aI750 +aI0 +aa(lp529 +g20 +aI-30 +aI0 +aa(lp530 +g20 +aI-16 +aI-70 +aa(lp531 +g20 +aI1 +aI-70 +aa(lp532 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp533 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp534 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp535 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp536 +g20 +aI259 +aI-789 +aa(lp537 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp538 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp539 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp540 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp541 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp542 +g20 +aI154 +aI-881 +aa(lp543 +g20 +aI169 +aI-951 +aa(lp544 +g20 +aI629 +aI-951 +aa(lp545 +g20 +aI614 +aI-881 +aa(lp546 +g20 +aI597 +aI-881 +aa(lp547 +g15 +aI555 +aI-878 +aI582 +aI-881 +aI568 +aI-880 +aa(lp548 +g15 +aI517 +aI-866 +aI541 +aI-876 +aI528 +aI-872 +aa(lp549 +g15 +aI488 +aI-841 +aI506 +aI-861 +aI496 +aI-852 +aa(lp550 +g15 +aI470 +aI-799 +aI480 +aI-831 +aI474 +aI-817 +aa(lp551 +g20 +aI320 +aI-80 +aa(lp552 +g10 +aa(lp553 +g8 +aI871 +aI0 +aa(lp554 +g10 +aa(lp555 +g8 +aI871 +aI0 +aasVP +(lp556 +(lp557 +g8 +aI397 +aI-440 +aa(lp558 +g20 +aI453 +aI-440 +aa(lp559 +g15 +aI555 +aI-459 +aI493 +aI-440 +aI527 +aI-447 +aa(lp560 +g15 +aI623 +aI-510 +aI583 +aI-471 +aI606 +aI-488 +aa(lp561 +g15 +aI661 +aI-588 +aI641 +aI-532 +aI653 +aI-558 +aa(lp562 +g15 +aI673 +aI-687 +aI669 +aI-618 +aI673 +aI-651 +aa(lp563 +g15 +aI661 +aI-772 +aI673 +aI-721 +aI669 +aI-749 +aa(lp564 +g15 +aI630 +aI-830 +aI654 +aI-796 +aI643 +aI-815 +aa(lp565 +g15 +aI581 +aI-862 +aI616 +aI-845 +aI600 +aI-855 +aa(lp566 +g15 +aI520 +aI-872 +aI562 +aI-869 +aI542 +aI-872 +aa(lp567 +g20 +aI490 +aI-872 +aa(lp568 +g10 +aa(lp569 +g8 +aI333 +aI-146 +aa(lp570 +g15 +aI329 +aI-129 +aI332 +aI-141 +aI330 +aI-135 +aa(lp571 +g15 +aI328 +aI-115 +aI328 +aI-123 +aI328 +aI-118 +aa(lp572 +g15 +aI335 +aI-92 +aI328 +aI-105 +aI330 +aI-98 +aa(lp573 +g15 +aI355 +aI-78 +aI340 +aI-86 +aI346 +aI-81 +aa(lp574 +g15 +aI386 +aI-72 +aI364 +aI-75 +aI374 +aI-73 +aa(lp575 +g15 +aI425 +aI-70 +aI398 +aI-71 +aI411 +aI-70 +aa(lp576 +g20 +aI469 +aI-70 +aa(lp577 +g20 +aI454 +aI0 +aa(lp578 +g20 +aI-30 +aI0 +aa(lp579 +g20 +aI-16 +aI-70 +aa(lp580 +g20 +aI1 +aI-70 +aa(lp581 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp582 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp583 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp584 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp585 +g20 +aI259 +aI-789 +aa(lp586 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp587 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp588 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp589 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp590 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp591 +g20 +aI154 +aI-881 +aa(lp592 +g20 +aI169 +aI-951 +aa(lp593 +g20 +aI550 +aI-951 +aa(lp594 +g15 +aI692 +aI-934 +aI602 +aI-951 +aI649 +aI-945 +aa(lp595 +g15 +aI799 +aI-885 +aI734 +aI-923 +aI769 +aI-907 +aa(lp596 +g15 +aI866 +aI-803 +aI828 +aI-863 +aI851 +aI-836 +aa(lp597 +g15 +aI890 +aI-691 +aI882 +aI-771 +aI890 +aI-734 +aa(lp598 +g15 +aI884 +aI-619 +aI890 +aI-669 +aI888 +aI-645 +aa(lp599 +g15 +aI861 +aI-545 +aI879 +aI-594 +aI872 +aI-570 +aa(lp600 +g15 +aI815 +aI-476 +aI849 +aI-521 +aI834 +aI-498 +aa(lp601 +g15 +aI740 +aI-418 +aI795 +aI-454 +aI770 +aI-435 +aa(lp602 +g15 +aI631 +aI-378 +aI710 +aI-401 +aI674 +aI-388 +aa(lp603 +g15 +aI482 +aI-363 +aI589 +aI-368 +aI539 +aI-363 +aa(lp604 +g20 +aI381 +aI-363 +aa(lp605 +g10 +aa(lp606 +g8 +aI884 +aI0 +aa(lp607 +g10 +aa(lp608 +g8 +aI884 +aI0 +aasVT +(lp609 +(lp610 +g8 +aI138 +aI0 +aa(lp611 +g20 +aI153 +aI-70 +aa(lp612 +g20 +aI170 +aI-70 +aa(lp613 +g15 +aI211 +aI-73 +aI184 +aI-70 +aI198 +aI-71 +aa(lp614 +g15 +aI247 +aI-84 +aI224 +aI-74 +aI236 +aI-78 +aa(lp615 +g15 +aI275 +aI-108 +aI258 +aI-89 +aI267 +aI-97 +aa(lp616 +g15 +aI293 +aI-149 +aI283 +aI-118 +aI289 +aI-132 +aa(lp617 +g20 +aI444 +aI-869 +aa(lp618 +g20 +aI337 +aI-869 +aa(lp619 +g15 +aI284 +aI-862 +aI316 +aI-869 +aI298 +aI-867 +aa(lp620 +g15 +aI246 +aI-839 +aI269 +aI-856 +aI257 +aI-849 +aa(lp621 +g15 +aI219 +aI-801 +aI235 +aI-828 +aI226 +aI-816 +aa(lp622 +g15 +aI198 +aI-750 +aI212 +aI-786 +aI205 +aI-769 +aa(lp623 +g20 +aI179 +aI-692 +aa(lp624 +g20 +aI90 +aI-692 +aa(lp625 +g20 +aI151 +aI-951 +aa(lp626 +g20 +aI981 +aI-951 +aa(lp627 +g20 +aI934 +aI-692 +aa(lp628 +g20 +aI845 +aI-692 +aa(lp629 +g15 +aI847 +aI-713 +aI845 +aI-695 +aI846 +aI-702 +aa(lp630 +g15 +aI850 +aI-747 +aI848 +aI-724 +aI849 +aI-735 +aa(lp631 +g15 +aI854 +aI-781 +aI852 +aI-759 +aI853 +aI-770 +aa(lp632 +g15 +aI856 +aI-799 +aI855 +aI-791 +aI856 +aI-797 +aa(lp633 +g15 +aI834 +aI-852 +aI856 +aI-823 +aI849 +aI-840 +aa(lp634 +g15 +aI762 +aI-869 +aI820 +aI-864 +aI796 +aI-869 +aa(lp635 +g20 +aI656 +aI-869 +aa(lp636 +g20 +aI502 +aI-146 +aa(lp637 +g15 +aI499 +aI-129 +aI501 +aI-141 +aI500 +aI-135 +aa(lp638 +g15 +aI497 +aI-115 +aI498 +aI-123 +aI497 +aI-118 +aa(lp639 +g15 +aI504 +aI-92 +aI497 +aI-105 +aI499 +aI-98 +aa(lp640 +g15 +aI524 +aI-78 +aI509 +aI-86 +aI516 +aI-81 +aa(lp641 +g15 +aI555 +aI-72 +aI533 +aI-75 +aI543 +aI-73 +aa(lp642 +g15 +aI594 +aI-70 +aI567 +aI-71 +aI580 +aI-70 +aa(lp643 +g20 +aI611 +aI-70 +aa(lp644 +g20 +aI597 +aI0 +aa(lp645 +g10 +aa(lp646 +g8 +aI870 +aI0 +aa(lp647 +g10 +aa(lp648 +g8 +aI870 +aI0 +aasVX +(lp649 +(lp650 +g8 +aI1048 +aI-881 +aa(lp651 +g20 +aI1035 +aI-881 +aa(lp652 +g15 +aI1000 +aI-876 +aI1022 +aI-881 +aI1010 +aI-879 +aa(lp653 +g15 +aI966 +aI-860 +aI989 +aI-873 +aI977 +aI-868 +aa(lp654 +g15 +aI930 +aI-831 +aI954 +aI-853 +aI942 +aI-843 +aa(lp655 +g15 +aI885 +aI-786 +aI917 +aI-819 +aI902 +aI-804 +aa(lp656 +g20 +aI634 +aI-522 +aa(lp657 +g20 +aI798 +aI-140 +aa(lp658 +g15 +aI841 +aI-85 +aI810 +aI-113 +aI825 +aI-94 +aa(lp659 +g15 +aI890 +aI-70 +aI857 +aI-75 +aI874 +aI-70 +aa(lp660 +g20 +aI908 +aI-70 +aa(lp661 +g20 +aI893 +aI0 +aa(lp662 +g20 +aI453 +aI0 +aa(lp663 +g20 +aI468 +aI-70 +aa(lp664 +g20 +aI488 +aI-70 +aa(lp665 +g15 +aI545 +aI-82 +aI514 +aI-70 +aI533 +aI-74 +aa(lp666 +g15 +aI563 +aI-116 +aI557 +aI-90 +aI563 +aI-101 +aa(lp667 +g15 +aI557 +aI-158 +aI563 +aI-129 +aI561 +aI-143 +aa(lp668 +g15 +aI538 +aI-209 +aI552 +aI-174 +aI546 +aI-190 +aa(lp669 +g20 +aI457 +aI-392 +aa(lp670 +g20 +aI270 +aI-199 +aa(lp671 +g15 +aI232 +aI-151 +aI254 +aI-182 +aI241 +aI-167 +aa(lp672 +g15 +aI217 +aI-110 +aI222 +aI-136 +aI217 +aI-122 +aa(lp673 +g15 +aI220 +aI-93 +aI217 +aI-103 +aI218 +aI-98 +aa(lp674 +g15 +aI232 +aI-80 +aI222 +aI-88 +aI226 +aI-84 +aa(lp675 +g15 +aI254 +aI-73 +aI237 +aI-77 +aI244 +aI-74 +aa(lp676 +g15 +aI290 +aI-70 +aI263 +aI-71 +aI275 +aI-70 +aa(lp677 +g20 +aI294 +aI-70 +aa(lp678 +g20 +aI279 +aI0 +aa(lp679 +g20 +aI-55 +aI0 +aa(lp680 +g20 +aI-41 +aI-70 +aa(lp681 +g20 +aI-27 +aI-70 +aa(lp682 +g15 +aI9 +aI-75 +aI-14 +aI-70 +aI-2 +aI-72 +aa(lp683 +g15 +aI44 +aI-91 +aI20 +aI-78 +aI32 +aI-83 +aa(lp684 +g15 +aI83 +aI-120 +aI56 +aI-98 +aI69 +aI-108 +aa(lp685 +g15 +aI129 +aI-166 +aI96 +aI-132 +aI112 +aI-147 +aa(lp686 +g20 +aI423 +aI-470 +aa(lp687 +g20 +aI274 +aI-812 +aa(lp688 +g15 +aI254 +aI-848 +aI268 +aI-827 +aI261 +aI-839 +aa(lp689 +g15 +aI232 +aI-869 +aI248 +aI-857 +aI240 +aI-864 +aa(lp690 +g15 +aI204 +aI-878 +aI224 +aI-874 +aI214 +aI-877 +aa(lp691 +g15 +aI170 +aI-881 +aI194 +aI-880 +aI183 +aI-881 +aa(lp692 +g20 +aI158 +aI-881 +aa(lp693 +g20 +aI173 +aI-951 +aa(lp694 +g20 +aI614 +aI-951 +aa(lp695 +g20 +aI600 +aI-881 +aa(lp696 +g20 +aI569 +aI-881 +aa(lp697 +g15 +aI521 +aI-871 +aI546 +aI-881 +aI530 +aI-877 +aa(lp698 +g15 +aI506 +aI-843 +aI511 +aI-864 +aI506 +aI-855 +aa(lp699 +g15 +aI512 +aI-811 +aI506 +aI-834 +aI508 +aI-823 +aa(lp700 +g15 +aI530 +aI-763 +aI516 +aI-798 +aI522 +aI-782 +aa(lp701 +g20 +aI601 +aI-598 +aa(lp702 +g20 +aI758 +aI-766 +aa(lp703 +g15 +aI791 +aI-807 +aI770 +aI-779 +aI781 +aI-792 +aa(lp704 +g15 +aI805 +aI-847 +aI800 +aI-822 +aI805 +aI-835 +aa(lp705 +g15 +aI789 +aI-872 +aI805 +aI-859 +aI799 +aI-867 +aa(lp706 +g15 +aI741 +aI-881 +aI778 +aI-878 +aI762 +aI-881 +aa(lp707 +g20 +aI737 +aI-881 +aa(lp708 +g20 +aI751 +aI-951 +aa(lp709 +g20 +aI1062 +aI-951 +aa(lp710 +g10 +aa(lp711 +g8 +aI975 +aI0 +aa(lp712 +g10 +aa(lp713 +g8 +aI975 +aI0 +aasV\u005C +(lp714 +(lp715 +g8 +aI143 +aI-1012 +aa(lp716 +g20 +aI237 +aI-1012 +aa(lp717 +g20 +aI309 +aI161 +aa(lp718 +g20 +aI216 +aI161 +aa(lp719 +g10 +aa(lp720 +g8 +aI384 +aI0 +aa(lp721 +g10 +aa(lp722 +g8 +aI384 +aI0 +aasV` +(lp723 +(lp724 +g8 +aI541 +aI-807 +aa(lp725 +g15 +aI480 +aI-850 +aI521 +aI-818 +aI501 +aI-833 +aa(lp726 +g15 +aI417 +aI-904 +aI458 +aI-867 +aI437 +aI-885 +aa(lp727 +g15 +aI362 +aI-960 +aI398 +aI-923 +aI379 +aI-942 +aa(lp728 +g15 +aI324 +aI-1007 +aI346 +aI-978 +aI333 +aI-994 +aa(lp729 +g20 +aI328 +aI-1021 +aa(lp730 +g20 +aI524 +aI-1021 +aa(lp731 +g15 +aI544 +aI-968 +aI529 +aI-1004 +aI536 +aI-987 +aa(lp732 +g15 +aI570 +aI-914 +aI553 +aI-950 +aI561 +aI-932 +aa(lp733 +g15 +aI598 +aI-864 +aI580 +aI-896 +aI589 +aI-879 +aa(lp734 +g15 +aI623 +aI-825 +aI607 +aI-848 +aI616 +aI-835 +aa(lp735 +g20 +aI619 +aI-807 +aa(lp736 +g10 +aa(lp737 +g8 +aI769 +aI0 +aa(lp738 +g10 +aa(lp739 +g8 +aI769 +aI0 +aasVd +(lp740 +(lp741 +g8 +aI255 +aI-228 +aa(lp742 +g15 +aI261 +aI-164 +aI255 +aI-203 +aI257 +aI-182 +aa(lp743 +g15 +aI276 +aI-122 +aI265 +aI-147 +aI270 +aI-133 +aa(lp744 +g15 +aI299 +aI-99 +aI282 +aI-112 +aI290 +aI-104 +aa(lp745 +g15 +aI328 +aI-92 +aI308 +aI-95 +aI317 +aI-92 +aa(lp746 +g15 +aI388 +aI-118 +aI347 +aI-92 +aI367 +aI-101 +aa(lp747 +g15 +aI446 +aI-184 +aI408 +aI-134 +aI428 +aI-157 +aa(lp748 +g15 +aI495 +aI-277 +aI464 +aI-211 +aI481 +aI-242 +aa(lp749 +g15 +aI529 +aI-383 +aI510 +aI-312 +aI521 +aI-347 +aa(lp750 +g20 +aI576 +aI-605 +aa(lp751 +g15 +aI537 +aI-632 +aI566 +aI-617 +aI553 +aI-626 +aa(lp752 +g15 +aI488 +aI-642 +aI520 +aI-638 +aI504 +aI-642 +aa(lp753 +g15 +aI418 +aI-621 +aI463 +aI-642 +aI439 +aI-635 +aa(lp754 +g15 +aI361 +aI-567 +aI397 +aI-607 +aI378 +aI-589 +aa(lp755 +g15 +aI315 +aI-490 +aI343 +aI-545 +aI328 +aI-519 +aa(lp756 +g15 +aI282 +aI-401 +aI302 +aI-461 +aI291 +aI-432 +aa(lp757 +g15 +aI262 +aI-310 +aI273 +aI-370 +aI267 +aI-340 +aa(lp758 +g15 +aI255 +aI-228 +aI258 +aI-280 +aI255 +aI-253 +aa(lp759 +g10 +aa(lp760 +g8 +aI710 +aI-286 +aa(lp761 +g15 +aI705 +aI-258 +aI709 +aI-279 +aI707 +aI-270 +aa(lp762 +g15 +aI698 +aI-220 +aI703 +aI-246 +aI700 +aI-233 +aa(lp763 +g15 +aI693 +aI-182 +aI696 +aI-207 +aI694 +aI-195 +aa(lp764 +g15 +aI690 +aI-151 +aI691 +aI-169 +aI690 +aI-159 +aa(lp765 +g15 +aI705 +aI-105 +aI690 +aI-130 +aI695 +aI-115 +aa(lp766 +g15 +aI737 +aI-91 +aI714 +aI-96 +aI725 +aI-91 +aa(lp767 +g15 +aI775 +aI-100 +aI748 +aI-91 +aI761 +aI-94 +aa(lp768 +g15 +aI811 +aI-119 +aI788 +aI-106 +aI800 +aI-112 +aa(lp769 +g20 +aI841 +aI-67 +aa(lp770 +g15 +aI801 +aI-38 +aI829 +aI-57 +aI816 +aI-48 +aa(lp771 +g15 +aI752 +aI-12 +aI786 +aI-29 +aI770 +aI-20 +aa(lp772 +g15 +aI695 +aI6 +aI735 +aI-4 +aI716 +aI1 +aa(lp773 +g15 +aI630 +aI13 +aI675 +aI11 +aI653 +aI13 +aa(lp774 +g15 +aI577 +aI6 +aI611 +aI13 +aI593 +aI11 +aa(lp775 +g15 +aI536 +aI-13 +aI561 +aI2 +aI547 +aI-4 +aa(lp776 +g15 +aI509 +aI-46 +aI524 +aI-21 +aI515 +aI-32 +aa(lp777 +g15 +aI500 +aI-92 +aI503 +aI-59 +aI500 +aI-74 +aa(lp778 +g15 +aI500 +aI-114 +aI500 +aI-100 +aI500 +aI-108 +aa(lp779 +g15 +aI502 +aI-133 +aI501 +aI-121 +aI501 +aI-127 +aa(lp780 +g15 +aI504 +aI-154 +aI502 +aI-140 +aI503 +aI-147 +aa(lp781 +g15 +aI509 +aI-179 +aI505 +aI-161 +aI507 +aI-169 +aa(lp782 +g20 +aI501 +aI-179 +aa(lp783 +g15 +aI449 +aI-91 +aI484 +aI-144 +aI467 +aI-115 +aa(lp784 +g15 +aI390 +aI-31 +aI430 +aI-67 +aI411 +aI-47 +aa(lp785 +g15 +aI324 +aI2 +aI370 +aI-15 +aI348 +aI-4 +aa(lp786 +g15 +aI248 +aI13 +aI300 +aI9 +aI275 +aI13 +aa(lp787 +g15 +aI159 +aI-6 +aI213 +aI13 +aI184 +aI6 +aa(lp788 +g15 +aI99 +aI-58 +aI135 +aI-19 +aI115 +aI-36 +aa(lp789 +g15 +aI64 +aI-136 +aI83 +aI-80 +aI71 +aI-106 +aa(lp790 +g15 +aI53 +aI-230 +aI57 +aI-165 +aI53 +aI-197 +aa(lp791 +g15 +aI65 +aI-339 +aI53 +aI-264 +aI57 +aI-301 +aa(lp792 +g15 +aI101 +aI-451 +aI73 +aI-377 +aI85 +aI-414 +aa(lp793 +g15 +aI159 +aI-556 +aI117 +aI-488 +aI136 +aI-523 +aa(lp794 +g15 +aI240 +aI-644 +aI183 +aI-590 +aI209 +aI-619 +aa(lp795 +g15 +aI341 +aI-704 +aI270 +aI-669 +aI304 +aI-689 +aa(lp796 +g15 +aI462 +aI-727 +aI378 +aI-719 +aI419 +aI-727 +aa(lp797 +g15 +aI535 +aI-718 +aI488 +aI-727 +aI513 +aI-724 +aa(lp798 +g15 +aI595 +aI-695 +aI558 +aI-713 +aI578 +aI-705 +aa(lp799 +g15 +aI599 +aI-715 +aI597 +aI-701 +aI598 +aI-707 +aa(lp800 +g15 +aI603 +aI-738 +aI600 +aI-722 +aI602 +aI-730 +aa(lp801 +g15 +aI608 +aI-759 +aI605 +aI-745 +aI606 +aI-752 +aa(lp802 +g15 +aI611 +aI-775 +aI609 +aI-766 +aI611 +aI-771 +aa(lp803 +g20 +aI623 +aI-828 +aa(lp804 +g15 +aI627 +aI-846 +aI625 +aI-834 +aI626 +aI-840 +aa(lp805 +g15 +aI630 +aI-863 +aI628 +aI-852 +aI629 +aI-858 +aa(lp806 +g15 +aI632 +aI-877 +aI631 +aI-869 +aI632 +aI-873 +aa(lp807 +g15 +aI633 +aI-886 +aI633 +aI-881 +aI633 +aI-884 +aa(lp808 +g15 +aI629 +aI-915 +aI633 +aI-898 +aI632 +aI-908 +aa(lp809 +g15 +aI617 +aI-932 +aI626 +aI-922 +aI622 +aI-928 +aa(lp810 +g15 +aI595 +aI-940 +aI611 +aI-936 +aI604 +aI-939 +aa(lp811 +g15 +aI562 +aI-942 +aI585 +aI-941 +aI575 +aI-942 +aa(lp812 +g20 +aI531 +aI-942 +aa(lp813 +g20 +aI544 +aI-1012 +aa(lp814 +g20 +aI865 +aI-1012 +aa(lp815 +g10 +aa(lp816 +g8 +aI886 +aI0 +aa(lp817 +g10 +aa(lp818 +g8 +aI886 +aI0 +aasVh +(lp819 +(lp820 +g8 +aI490 +aI-123 +aa(lp821 +g15 +aI495 +aI-191 +aI490 +aI-142 +aI492 +aI-165 +aa(lp822 +g15 +aI511 +aI-282 +aI499 +aI-218 +aI504 +aI-248 +aa(lp823 +g20 +aI534 +aI-387 +aa(lp824 +g15 +aI541 +aI-419 +aI536 +aI-396 +aI539 +aI-406 +aa(lp825 +g15 +aI549 +aI-458 +aI544 +aI-432 +aI547 +aI-445 +aa(lp826 +g15 +aI555 +aI-499 +aI552 +aI-472 +aI554 +aI-486 +aa(lp827 +g15 +aI558 +aI-536 +aI557 +aI-513 +aI558 +aI-525 +aa(lp828 +g15 +aI556 +aI-562 +aI558 +aI-544 +aI557 +aI-553 +aa(lp829 +g15 +aI548 +aI-587 +aI554 +aI-571 +aI552 +aI-580 +aa(lp830 +g15 +aI531 +aI-605 +aI544 +aI-594 +aI538 +aI-600 +aa(lp831 +g15 +aI502 +aI-612 +aI523 +aI-610 +aI514 +aI-612 +aa(lp832 +g15 +aI457 +aI-597 +aI487 +aI-612 +aI472 +aI-607 +aa(lp833 +g15 +aI414 +aI-557 +aI442 +aI-587 +aI427 +aI-573 +aa(lp834 +g15 +aI374 +aI-499 +aI400 +aI-540 +aI387 +aI-521 +aa(lp835 +g15 +aI340 +aI-433 +aI362 +aI-478 +aI351 +aI-456 +aa(lp836 +g15 +aI314 +aI-367 +aI330 +aI-411 +aI321 +aI-389 +aa(lp837 +g15 +aI297 +aI-308 +aI307 +aI-345 +aI301 +aI-326 +aa(lp838 +g20 +aI227 +aI0 +aa(lp839 +g20 +aI27 +aI0 +aa(lp840 +g20 +aI203 +aI-828 +aa(lp841 +g15 +aI207 +aI-846 +aI205 +aI-834 +aI206 +aI-840 +aa(lp842 +g15 +aI210 +aI-863 +aI208 +aI-852 +aI210 +aI-858 +aa(lp843 +g15 +aI212 +aI-877 +aI211 +aI-869 +aI212 +aI-873 +aa(lp844 +g15 +aI213 +aI-886 +aI213 +aI-881 +aI213 +aI-884 +aa(lp845 +g15 +aI209 +aI-915 +aI213 +aI-898 +aI212 +aI-908 +aa(lp846 +g15 +aI197 +aI-932 +aI207 +aI-922 +aI202 +aI-928 +aa(lp847 +g15 +aI175 +aI-940 +aI191 +aI-936 +aI184 +aI-939 +aa(lp848 +g15 +aI142 +aI-942 +aI166 +aI-941 +aI155 +aI-942 +aa(lp849 +g20 +aI114 +aI-942 +aa(lp850 +g20 +aI126 +aI-1012 +aa(lp851 +g20 +aI449 +aI-1012 +aa(lp852 +g20 +aI386 +aI-719 +aa(lp853 +g15 +aI375 +aI-674 +aI383 +aI-706 +aI379 +aI-690 +aa(lp854 +g15 +aI363 +aI-625 +aI371 +aI-657 +aI367 +aI-641 +aa(lp855 +g15 +aI349 +aI-571 +aI358 +aI-608 +aI353 +aI-590 +aa(lp856 +g20 +aI357 +aI-571 +aa(lp857 +g15 +aI409 +aI-640 +aI374 +aI-598 +aI391 +aI-621 +aa(lp858 +g15 +aI468 +aI-689 +aI427 +aI-660 +aI447 +aI-676 +aa(lp859 +g15 +aI536 +aI-717 +aI488 +aI-702 +aI511 +aI-711 +aa(lp860 +g15 +aI617 +aI-727 +aI560 +aI-724 +aI587 +aI-727 +aa(lp861 +g15 +aI688 +aI-715 +aI645 +aI-727 +aI669 +aI-723 +aa(lp862 +g15 +aI736 +aI-681 +aI708 +aI-706 +aI724 +aI-695 +aa(lp863 +g15 +aI761 +aI-632 +aI747 +aI-667 +aI756 +aI-651 +aa(lp864 +g15 +aI769 +aI-574 +aI766 +aI-614 +aI769 +aI-594 +aa(lp865 +g15 +aI766 +aI-538 +aI769 +aI-563 +aI768 +aI-551 +aa(lp866 +g15 +aI760 +aI-499 +aI765 +aI-525 +aI763 +aI-512 +aa(lp867 +g15 +aI752 +aI-460 +aI758 +aI-486 +aI755 +aI-473 +aa(lp868 +g15 +aI745 +aI-423 +aI750 +aI-447 +aI747 +aI-435 +aa(lp869 +g20 +aI714 +aI-280 +aa(lp870 +g15 +aI701 +aI-212 +aI709 +aI-256 +aI704 +aI-233 +aa(lp871 +g15 +aI695 +aI-153 +aI697 +aI-191 +aI695 +aI-171 +aa(lp872 +g15 +aI708 +aI-108 +aI695 +aI-133 +aI700 +aI-118 +aa(lp873 +g15 +aI742 +aI-92 +aI716 +aI-97 +aI728 +aI-92 +aa(lp874 +g15 +aI780 +aI-100 +aI756 +aI-92 +aI769 +aI-95 +aa(lp875 +g15 +aI821 +aI-123 +aI792 +aI-105 +aI805 +aI-113 +aa(lp876 +g20 +aI853 +aI-78 +aa(lp877 +g15 +aI817 +aI-44 +aI842 +aI-67 +aI830 +aI-55 +aa(lp878 +g15 +aI771 +aI-15 +aI803 +aI-33 +aI788 +aI-23 +aa(lp879 +g15 +aI716 +aI5 +aI755 +aI-6 +aI736 +aI0 +aa(lp880 +g15 +aI649 +aI13 +aI695 +aI10 +aI673 +aI13 +aa(lp881 +g15 +aI531 +aI-22 +aI598 +aI13 +aI559 +aI1 +aa(lp882 +g15 +aI490 +aI-123 +aI504 +aI-46 +aI490 +aI-80 +aa(lp883 +g10 +aa(lp884 +g8 +aI874 +aI0 +aa(lp885 +g10 +aa(lp886 +g8 +aI874 +aI0 +aasVl +(lp887 +(lp888 +g8 +aI318 +aI-92 +aa(lp889 +g15 +aI356 +aI-100 +aI332 +aI-92 +aI345 +aI-95 +aa(lp890 +g15 +aI397 +aI-123 +aI368 +aI-105 +aI381 +aI-113 +aa(lp891 +g20 +aI429 +aI-78 +aa(lp892 +g15 +aI393 +aI-44 +aI418 +aI-67 +aI406 +aI-55 +aa(lp893 +g15 +aI347 +aI-15 +aI379 +aI-33 +aI364 +aI-23 +aa(lp894 +g15 +aI292 +aI5 +aI331 +aI-6 +aI312 +aI0 +aa(lp895 +g15 +aI225 +aI13 +aI271 +aI10 +aI249 +aI13 +aa(lp896 +g15 +aI107 +aI-22 +aI174 +aI13 +aI134 +aI1 +aa(lp897 +g15 +aI66 +aI-123 +aI80 +aI-46 +aI66 +aI-80 +aa(lp898 +g15 +aI87 +aI-282 +aI66 +aI-161 +aI73 +aI-214 +aa(lp899 +g20 +aI203 +aI-828 +aa(lp900 +g15 +aI207 +aI-846 +aI205 +aI-834 +aI206 +aI-840 +aa(lp901 +g15 +aI210 +aI-863 +aI208 +aI-852 +aI210 +aI-858 +aa(lp902 +g15 +aI212 +aI-877 +aI211 +aI-869 +aI212 +aI-873 +aa(lp903 +g15 +aI213 +aI-886 +aI213 +aI-881 +aI213 +aI-884 +aa(lp904 +g15 +aI209 +aI-915 +aI213 +aI-898 +aI212 +aI-908 +aa(lp905 +g15 +aI197 +aI-932 +aI207 +aI-922 +aI202 +aI-928 +aa(lp906 +g15 +aI175 +aI-940 +aI191 +aI-936 +aI184 +aI-939 +aa(lp907 +g15 +aI142 +aI-942 +aI166 +aI-941 +aI155 +aI-942 +aa(lp908 +g20 +aI114 +aI-942 +aa(lp909 +g20 +aI126 +aI-1012 +aa(lp910 +g20 +aI449 +aI-1012 +aa(lp911 +g20 +aI290 +aI-280 +aa(lp912 +g15 +aI277 +aI-212 +aI285 +aI-256 +aI280 +aI-233 +aa(lp913 +g15 +aI272 +aI-153 +aI273 +aI-191 +aI272 +aI-171 +aa(lp914 +g15 +aI284 +aI-108 +aI272 +aI-133 +aI276 +aI-118 +aa(lp915 +g15 +aI318 +aI-92 +aI292 +aI-97 +aI303 +aI-92 +aa(lp916 +g10 +aa(lp917 +g8 +aI472 +aI0 +aa(lp918 +g10 +aa(lp919 +g8 +aI472 +aI0 +aasVp +(lp920 +(lp921 +g8 +aI576 +aI-476 +aa(lp922 +g15 +aI572 +aI-529 +aI576 +aI-494 +aI574 +aI-512 +aa(lp923 +g15 +aI560 +aI-575 +aI570 +aI-546 +aI566 +aI-562 +aa(lp924 +g15 +aI538 +aI-608 +aI555 +aI-589 +aI548 +aI-600 +aa(lp925 +g15 +aI503 +aI-620 +aI529 +aI-616 +aI517 +aI-620 +aa(lp926 +g15 +aI459 +aI-607 +aI489 +aI-620 +aI474 +aI-616 +aa(lp927 +g15 +aI417 +aI-573 +aI445 +aI-599 +aI431 +aI-588 +aa(lp928 +g15 +aI379 +aI-524 +aI403 +aI-559 +aI391 +aI-542 +aa(lp929 +g15 +aI346 +aI-466 +aI367 +aI-505 +aI356 +aI-486 +aa(lp930 +g15 +aI321 +aI-405 +aI336 +aI-445 +aI328 +aI-425 +aa(lp931 +g15 +aI305 +aI-347 +aI314 +aI-384 +aI308 +aI-365 +aa(lp932 +g20 +aI254 +aI-108 +aa(lp933 +g15 +aI270 +aI-96 +aI258 +aI-105 +aI263 +aI-100 +aa(lp934 +g15 +aI292 +aI-84 +aI276 +aI-91 +aI284 +aI-87 +aa(lp935 +g15 +aI319 +aI-75 +aI300 +aI-80 +aI309 +aI-77 +aa(lp936 +g15 +aI349 +aI-71 +aI329 +aI-73 +aI339 +aI-71 +aa(lp937 +g15 +aI416 +aI-91 +aI373 +aI-71 +aI395 +aI-78 +aa(lp938 +g15 +aI472 +aI-143 +aI436 +aI-104 +aI455 +aI-121 +aa(lp939 +g15 +aI516 +aI-217 +aI489 +aI-165 +aI503 +aI-189 +aa(lp940 +g15 +aI549 +aI-304 +aI529 +aI-245 +aI540 +aI-274 +aa(lp941 +g15 +aI569 +aI-394 +aI558 +aI-334 +aI564 +aI-364 +aa(lp942 +g15 +aI576 +aI-476 +aI573 +aI-424 +aI576 +aI-451 +aa(lp943 +g10 +aa(lp944 +g8 +aI-39 +aI320 +aa(lp945 +g20 +aI141 +aI-530 +aa(lp946 +g15 +aI144 +aI-547 +aI142 +aI-535 +aI143 +aI-541 +aa(lp947 +g15 +aI147 +aI-564 +aI145 +aI-553 +aI146 +aI-559 +aa(lp948 +g15 +aI149 +aI-578 +aI148 +aI-570 +aI149 +aI-575 +aa(lp949 +g15 +aI150 +aI-587 +aI150 +aI-582 +aI150 +aI-585 +aa(lp950 +g15 +aI146 +aI-616 +aI150 +aI-599 +aI149 +aI-609 +aa(lp951 +g15 +aI134 +aI-633 +aI143 +aI-624 +aI139 +aI-629 +aa(lp952 +g15 +aI112 +aI-641 +aI128 +aI-637 +aI121 +aI-640 +aa(lp953 +g15 +aI80 +aI-643 +aI103 +aI-642 +aI92 +aI-643 +aa(lp954 +g20 +aI55 +aI-643 +aa(lp955 +g20 +aI67 +aI-714 +aa(lp956 +g20 +aI354 +aI-714 +aa(lp957 +g20 +aI320 +aI-536 +aa(lp958 +g20 +aI329 +aI-536 +aa(lp959 +g15 +aI376 +aI-613 +aI344 +aI-564 +aI360 +aI-590 +aa(lp960 +g15 +aI429 +aI-674 +aI392 +aI-636 +aI410 +aI-657 +aa(lp961 +g15 +aI496 +aI-713 +aI449 +aI-690 +aI471 +aI-704 +aa(lp962 +g15 +aI582 +aI-727 +aI520 +aI-722 +aI549 +aI-727 +aa(lp963 +g15 +aI662 +aI-711 +aI611 +aI-727 +aI638 +aI-722 +aa(lp964 +g15 +aI723 +aI-665 +aI686 +aI-701 +aI707 +aI-685 +aa(lp965 +g15 +aI763 +aI-590 +aI740 +aI-645 +aI754 +aI-619 +aa(lp966 +g15 +aI777 +aI-486 +aI772 +aI-560 +aI777 +aI-525 +aa(lp967 +g15 +aI765 +aI-382 +aI777 +aI-454 +aI773 +aI-419 +aa(lp968 +g15 +aI731 +aI-271 +aI758 +aI-345 +aI746 +aI-308 +aa(lp969 +g15 +aI674 +aI-164 +aI716 +aI-234 +aI697 +aI-198 +aa(lp970 +g15 +aI594 +aI-73 +aI652 +aI-129 +aI625 +aI-99 +aa(lp971 +g15 +aI490 +aI-10 +aI563 +aI-47 +aI528 +aI-26 +aa(lp972 +g15 +aI363 +aI13 +aI452 +aI5 +aI409 +aI13 +aa(lp973 +g15 +aI288 +aI5 +aI337 +aI13 +aI311 +aI10 +aa(lp974 +g15 +aI227 +aI-17 +aI265 +aI0 +aI245 +aI-7 +aa(lp975 +g15 +aI225 +aI4 +aI227 +aI-10 +aI226 +aI-3 +aa(lp976 +g15 +aI222 +aI24 +aI224 +aI10 +aI223 +aI17 +aa(lp977 +g15 +aI217 +aI47 +aI220 +aI32 +aI219 +aI39 +aa(lp978 +g20 +aI198 +aI136 +aa(lp979 +g15 +aI194 +aI154 +aI197 +aI142 +aI196 +aI148 +aa(lp980 +g15 +aI192 +aI171 +aI193 +aI160 +aI192 +aI165 +aa(lp981 +g15 +aI190 +aI185 +aI191 +aI176 +aI190 +aI181 +aa(lp982 +g15 +aI189 +aI193 +aI189 +aI189 +aI189 +aI192 +aa(lp983 +g15 +aI193 +aI223 +aI189 +aI205 +aI190 +aI215 +aa(lp984 +g15 +aI205 +aI240 +aI195 +aI230 +aI200 +aI236 +aa(lp985 +g15 +aI227 +aI247 +aI211 +aI243 +aI218 +aI246 +aa(lp986 +g15 +aI259 +aI249 +aI236 +aI249 +aI247 +aI249 +aa(lp987 +g20 +aI310 +aI249 +aa(lp988 +g20 +aI298 +aI320 +aa(lp989 +g10 +aa(lp990 +g8 +aI830 +aI0 +aa(lp991 +g10 +aa(lp992 +g8 +aI830 +aI0 +aasVt +(lp993 +(lp994 +g8 +aI360 +aI-95 +aa(lp995 +g15 +aI416 +aI-105 +aI380 +aI-95 +aI399 +aI-98 +aa(lp996 +g15 +aI464 +aI-130 +aI433 +aI-112 +aI449 +aI-120 +aa(lp997 +g20 +aI494 +aI-79 +aa(lp998 +g15 +aI448 +aI-43 +aI480 +aI-67 +aI464 +aI-55 +aa(lp999 +g15 +aI395 +aI-14 +aI431 +aI-32 +aI414 +aI-22 +aa(lp1000 +g15 +aI333 +aI5 +aI376 +aI-5 +aI355 +aI0 +aa(lp1001 +g15 +aI262 +aI13 +aI311 +aI10 +aI287 +aI13 +aa(lp1002 +g15 +aI194 +aI4 +aI238 +aI13 +aI215 +aI10 +aa(lp1003 +g15 +aI139 +aI-24 +aI173 +aI-2 +aI154 +aI-11 +aa(lp1004 +g15 +aI102 +aI-73 +aI123 +aI-37 +aI111 +aI-53 +aa(lp1005 +g15 +aI89 +aI-142 +aI93 +aI-92 +aI89 +aI-115 +aa(lp1006 +g15 +aI90 +aI-168 +aI89 +aI-149 +aI89 +aI-158 +aa(lp1007 +g15 +aI93 +aI-197 +aI90 +aI-177 +aI91 +aI-187 +aa(lp1008 +g15 +aI97 +aI-227 +aI94 +aI-207 +aI95 +aI-217 +aa(lp1009 +g15 +aI102 +aI-254 +aI99 +aI-236 +aI101 +aI-245 +aa(lp1010 +g20 +aI182 +aI-623 +aa(lp1011 +g20 +aI80 +aI-623 +aa(lp1012 +g20 +aI94 +aI-691 +aa(lp1013 +g15 +aI156 +aI-701 +aI113 +aI-691 +aI134 +aI-694 +aa(lp1014 +g15 +aI226 +aI-733 +aI179 +aI-707 +aI202 +aI-718 +aa(lp1015 +g15 +aI297 +aI-791 +aI249 +aI-748 +aI273 +aI-767 +aa(lp1016 +g15 +aI363 +aI-878 +aI320 +aI-815 +aI343 +aI-844 +aa(lp1017 +g20 +aI441 +aI-878 +aa(lp1018 +g20 +aI406 +aI-714 +aa(lp1019 +g20 +aI567 +aI-714 +aa(lp1020 +g20 +aI549 +aI-623 +aa(lp1021 +g20 +aI386 +aI-623 +aa(lp1022 +g20 +aI306 +aI-258 +aa(lp1023 +g15 +aI296 +aI-204 +aI301 +aI-238 +aI298 +aI-220 +aa(lp1024 +g15 +aI293 +aI-162 +aI294 +aI-189 +aI293 +aI-174 +aa(lp1025 +g15 +aI311 +aI-112 +aI293 +aI-140 +aI299 +aI-123 +aa(lp1026 +g15 +aI360 +aI-95 +aI324 +aI-100 +aI340 +aI-95 +aa(lp1027 +g10 +aa(lp1028 +g8 +aI555 +aI0 +aa(lp1029 +g10 +aa(lp1030 +g8 +aI555 +aI0 +aasVx +(lp1031 +(lp1032 +g8 +aI-26 +aI0 +aa(lp1033 +g20 +aI-13 +aI-70 +aa(lp1034 +g20 +aI3 +aI-70 +aa(lp1035 +g15 +aI38 +aI-73 +aI16 +aI-70 +aI27 +aI-71 +aa(lp1036 +g15 +aI68 +aI-85 +aI48 +aI-75 +aI58 +aI-79 +aa(lp1037 +g15 +aI102 +aI-111 +aI78 +aI-91 +aI90 +aI-100 +aa(lp1038 +g15 +aI145 +aI-155 +aI114 +aI-122 +aI128 +aI-137 +aa(lp1039 +g20 +aI313 +aI-340 +aa(lp1040 +g20 +aI221 +aI-562 +aa(lp1041 +g15 +aI200 +aI-603 +aI214 +aI-578 +aI207 +aI-592 +aa(lp1042 +g15 +aI179 +aI-627 +aI194 +aI-613 +aI186 +aI-621 +aa(lp1043 +g15 +aI152 +aI-640 +aI171 +aI-633 +aI162 +aI-638 +aa(lp1044 +g15 +aI119 +aI-643 +aI143 +aI-642 +aI132 +aI-643 +aa(lp1045 +g20 +aI104 +aI-643 +aa(lp1046 +g20 +aI117 +aI-714 +aa(lp1047 +g20 +aI367 +aI-714 +aa(lp1048 +g20 +aI461 +aI-461 +aa(lp1049 +g20 +aI646 +aI-714 +aa(lp1050 +g20 +aI809 +aI-714 +aa(lp1051 +g20 +aI796 +aI-643 +aa(lp1052 +g20 +aI772 +aI-643 +aa(lp1053 +g15 +aI737 +aI-639 +aI759 +aI-643 +aI747 +aI-642 +aa(lp1054 +g15 +aI706 +aI-624 +aI727 +aI-636 +aI716 +aI-632 +aa(lp1055 +g15 +aI674 +aI-595 +aI696 +aI-617 +aI685 +aI-607 +aa(lp1056 +g15 +aI633 +aI-547 +aI662 +aI-583 +aI649 +aI-567 +aa(lp1057 +g20 +aI496 +aI-388 +aa(lp1058 +g20 +aI593 +aI-164 +aa(lp1059 +g15 +aI616 +aI-118 +aI601 +aI-146 +aI609 +aI-130 +aa(lp1060 +g15 +aI638 +aI-89 +aI623 +aI-106 +aI630 +aI-96 +aa(lp1061 +g15 +aI664 +aI-74 +aI646 +aI-82 +aI655 +aI-77 +aa(lp1062 +g15 +aI698 +aI-70 +aI674 +aI-71 +aI685 +aI-70 +aa(lp1063 +g20 +aI716 +aI-70 +aa(lp1064 +g20 +aI702 +aI0 +aa(lp1065 +g20 +aI444 +aI0 +aa(lp1066 +g20 +aI343 +aI-269 +aa(lp1067 +g20 +aI136 +aI0 +aa(lp1068 +g10 +aa(lp1069 +g8 +aI805 +aI0 +aa(lp1070 +g10 +aa(lp1071 +g8 +aI805 +aI0 +aasV| +(lp1072 +(lp1073 +g8 +aI441 +aI320 +aa(lp1074 +g20 +aI345 +aI320 +aa(lp1075 +g20 +aI345 +aI-1012 +aa(lp1076 +g20 +aI441 +aI-1012 +aa(lp1077 +g10 +aa(lp1078 +g8 +aI745 +aI0 +aa(lp1079 +g10 +aa(lp1080 +g8 +aI745 +aI0 +aasV# +(lp1081 +(lp1082 +g8 +aI674 +aI-358 +aa(lp1083 +g20 +aI665 +aI-266 +aa(lp1084 +g20 +aI498 +aI-266 +aa(lp1085 +g20 +aI421 +aI0 +aa(lp1086 +g20 +aI326 +aI0 +aa(lp1087 +g20 +aI404 +aI-266 +aa(lp1088 +g20 +aI265 +aI-266 +aa(lp1089 +g20 +aI186 +aI0 +aa(lp1090 +g20 +aI91 +aI0 +aa(lp1091 +g20 +aI170 +aI-266 +aa(lp1092 +g20 +aI37 +aI-266 +aa(lp1093 +g20 +aI46 +aI-358 +aa(lp1094 +g20 +aI197 +aI-358 +aa(lp1095 +g20 +aI269 +aI-599 +aa(lp1096 +g20 +aI114 +aI-599 +aa(lp1097 +g20 +aI125 +aI-692 +aa(lp1098 +g20 +aI297 +aI-692 +aa(lp1099 +g20 +aI370 +aI-951 +aa(lp1100 +g20 +aI466 +aI-951 +aa(lp1101 +g20 +aI391 +aI-692 +aa(lp1102 +g20 +aI530 +aI-692 +aa(lp1103 +g20 +aI606 +aI-951 +aa(lp1104 +g20 +aI701 +aI-951 +aa(lp1105 +g20 +aI625 +aI-692 +aa(lp1106 +g20 +aI753 +aI-692 +aa(lp1107 +g20 +aI742 +aI-599 +aa(lp1108 +g20 +aI597 +aI-599 +aa(lp1109 +g20 +aI526 +aI-358 +aa(lp1110 +g10 +aa(lp1111 +g8 +aI292 +aI-358 +aa(lp1112 +g20 +aI432 +aI-358 +aa(lp1113 +g20 +aI503 +aI-599 +aa(lp1114 +g20 +aI363 +aI-599 +aa(lp1115 +g10 +aa(lp1116 +g8 +aI745 +aI0 +aa(lp1117 +g10 +aa(lp1118 +g8 +aI745 +aI0 +aasV' +(lp1119 +(lp1120 +g8 +aI221 +aI-951 +aa(lp1121 +g20 +aI429 +aI-951 +aa(lp1122 +g20 +aI290 +aI-584 +aa(lp1123 +g20 +aI202 +aI-584 +aa(lp1124 +g10 +aa(lp1125 +g8 +aI386 +aI0 +aa(lp1126 +g10 +aa(lp1127 +g8 +aI386 +aI0 +aasV+ +(lp1128 +(lp1129 +g8 +aI441 +aI-428 +aa(lp1130 +g20 +aI441 +aI-190 +aa(lp1131 +g20 +aI345 +aI-190 +aa(lp1132 +g20 +aI345 +aI-428 +aa(lp1133 +g20 +aI108 +aI-428 +aa(lp1134 +g20 +aI108 +aI-523 +aa(lp1135 +g20 +aI345 +aI-523 +aa(lp1136 +g20 +aI345 +aI-761 +aa(lp1137 +g20 +aI441 +aI-761 +aa(lp1138 +g20 +aI441 +aI-523 +aa(lp1139 +g20 +aI679 +aI-523 +aa(lp1140 +g20 +aI679 +aI-428 +aa(lp1141 +g10 +aa(lp1142 +g8 +aI745 +aI0 +aa(lp1143 +g10 +aa(lp1144 +g8 +aI745 +aI0 +aasV/ +(lp1145 +(lp1146 +g8 +aI-33 +aI161 +aa(lp1147 +g20 +aI-137 +aI161 +aa(lp1148 +g20 +aI430 +aI-1012 +aa(lp1149 +g20 +aI534 +aI-1012 +aa(lp1150 +g10 +aa(lp1151 +g8 +aI384 +aI0 +aa(lp1152 +g10 +aa(lp1153 +g8 +aI384 +aI0 +aasV3 +(lp1154 +(lp1155 +g8 +aI297 +aI-80 +aa(lp1156 +g15 +aI361 +aI-93 +aI319 +aI-80 +aI341 +aI-85 +aa(lp1157 +g15 +aI417 +aI-133 +aI382 +aI-102 +aI401 +aI-115 +aa(lp1158 +g15 +aI456 +aI-198 +aI433 +aI-150 +aI446 +aI-172 +aa(lp1159 +g15 +aI470 +aI-289 +aI465 +aI-224 +aI470 +aI-255 +aa(lp1160 +g15 +aI421 +aI-408 +aI470 +aI-341 +aI454 +aI-380 +aa(lp1161 +g15 +aI282 +aI-450 +aI388 +aI-436 +aI342 +aI-450 +aa(lp1162 +g20 +aI225 +aI-450 +aa(lp1163 +g20 +aI238 +aI-532 +aa(lp1164 +g20 +aI281 +aI-532 +aa(lp1165 +g15 +aI384 +aI-549 +aI318 +aI-532 +aI353 +aI-538 +aa(lp1166 +g15 +aI467 +aI-597 +aI416 +aI-560 +aI443 +aI-577 +aa(lp1167 +g15 +aI521 +aI-672 +aI490 +aI-618 +aI508 +aI-643 +aa(lp1168 +g15 +aI541 +aI-769 +aI534 +aI-701 +aI541 +aI-733 +aa(lp1169 +g15 +aI535 +aI-814 +aI541 +aI-785 +aI539 +aI-800 +aa(lp1170 +g15 +aI518 +aI-851 +aI531 +aI-829 +aI526 +aI-841 +aa(lp1171 +g15 +aI490 +aI-875 +aI511 +aI-861 +aI502 +aI-869 +aa(lp1172 +g15 +aI449 +aI-883 +aI479 +aI-880 +aI465 +aI-883 +aa(lp1173 +g15 +aI387 +aI-867 +aI424 +aI-883 +aI404 +aI-878 +aa(lp1174 +g15 +aI343 +aI-823 +aI369 +aI-856 +aI355 +aI-841 +aa(lp1175 +g15 +aI315 +aI-760 +aI332 +aI-805 +aI322 +aI-784 +aa(lp1176 +g15 +aI297 +aI-685 +aI307 +aI-736 +aI301 +aI-711 +aa(lp1177 +g15 +aI237 +aI-689 +aI276 +aI-685 +aI256 +aI-686 +aa(lp1178 +g15 +aI190 +aI-703 +aI219 +aI-692 +aI203 +aI-696 +aa(lp1179 +g15 +aI158 +aI-729 +aI176 +aI-709 +aI166 +aI-718 +aa(lp1180 +g15 +aI146 +aI-770 +aI150 +aI-740 +aI146 +aI-753 +aa(lp1181 +g15 +aI172 +aI-846 +aI146 +aI-797 +aI155 +aI-823 +aa(lp1182 +g15 +aI242 +aI-908 +aI189 +aI-870 +aI212 +aI-891 +aa(lp1183 +g15 +aI346 +aI-950 +aI271 +aI-926 +aI306 +aI-940 +aa(lp1184 +g15 +aI473 +aI-965 +aI385 +aI-960 +aI428 +aI-965 +aa(lp1185 +g15 +aI584 +aI-952 +aI514 +aI-965 +aI551 +aI-960 +aa(lp1186 +g15 +aI671 +aI-915 +aI618 +aI-943 +aI647 +aI-931 +aa(lp1187 +g15 +aI727 +aI-855 +aI695 +aI-898 +aI714 +aI-878 +aa(lp1188 +g15 +aI746 +aI-774 +aI740 +aI-831 +aI746 +aI-804 +aa(lp1189 +g15 +aI730 +aI-682 +aI746 +aI-743 +aI741 +aI-712 +aa(lp1190 +g15 +aI680 +aI-600 +aI719 +aI-652 +aI702 +aI-625 +aa(lp1191 +g15 +aI596 +aI-535 +aI657 +aI-575 +aI629 +aI-553 +aa(lp1192 +g15 +aI478 +aI-495 +aI562 +aI-516 +aI523 +aI-503 +aa(lp1193 +g15 +aI561 +aI-475 +aI509 +aI-492 +aI537 +aI-485 +aa(lp1194 +g15 +aI624 +aI-435 +aI586 +aI-465 +aI607 +aI-452 +aa(lp1195 +g15 +aI664 +aI-376 +aI641 +aI-419 +aI655 +aI-399 +aa(lp1196 +g15 +aI678 +aI-299 +aI673 +aI-354 +aI678 +aI-328 +aa(lp1197 +g15 +aI661 +aI-194 +aI678 +aI-260 +aI672 +aI-225 +aa(lp1198 +g15 +aI615 +aI-113 +aI650 +aI-163 +aI634 +aI-136 +aa(lp1199 +g15 +aI546 +aI-54 +aI595 +aI-90 +aI572 +aI-70 +aa(lp1200 +g15 +aI463 +aI-15 +aI520 +aI-38 +aI493 +aI-25 +aa(lp1201 +g15 +aI372 +aI6 +aI434 +aI-5 +aI403 +aI2 +aa(lp1202 +g15 +aI279 +aI13 +aI340 +aI11 +aI309 +aI13 +aa(lp1203 +g15 +aI148 +aI-1 +aI227 +aI13 +aI183 +aI8 +aa(lp1204 +g15 +aI61 +aI-38 +aI112 +aI-10 +aI83 +aI-23 +aa(lp1205 +g15 +aI13 +aI-90 +aI39 +aI-54 +aI23 +aI-71 +aa(lp1206 +g15 +aI-1 +aI-147 +aI3 +aI-109 +aI-1 +aI-128 +aa(lp1207 +g15 +aI37 +aI-230 +aI-1 +aI-182 +aI11 +aI-210 +aa(lp1208 +g15 +aI145 +aI-260 +aI63 +aI-250 +aI99 +aI-260 +aa(lp1209 +g15 +aI154 +aI-188 +aI145 +aI-234 +aI148 +aI-210 +aa(lp1210 +g15 +aI182 +aI-132 +aI160 +aI-166 +aI169 +aI-147 +aa(lp1211 +g15 +aI229 +aI-94 +aI194 +aI-116 +aI210 +aI-103 +aa(lp1212 +g15 +aI297 +aI-80 +aI248 +aI-85 +aI271 +aI-80 +aa(lp1213 +g10 +aa(lp1214 +g8 +aI745 +aI0 +aa(lp1215 +g10 +aa(lp1216 +g8 +aI745 +aI0 +aasV7 +(lp1217 +(lp1218 +g8 +aI138 +aI0 +aa(lp1219 +g20 +aI665 +aI-806 +aa(lp1220 +g20 +aI322 +aI-806 +aa(lp1221 +g15 +aI263 +aI-788 +aI298 +aI-806 +aI278 +aI-800 +aa(lp1222 +g15 +aI230 +aI-738 +aI247 +aI-777 +aI236 +aI-760 +aa(lp1223 +g20 +aI212 +aI-671 +aa(lp1224 +g20 +aI130 +aI-671 +aa(lp1225 +g20 +aI185 +aI-951 +aa(lp1226 +g20 +aI821 +aI-951 +aa(lp1227 +g20 +aI806 +aI-872 +aa(lp1228 +g20 +aI251 +aI0 +aa(lp1229 +g10 +aa(lp1230 +g8 +aI745 +aI0 +aa(lp1231 +g10 +aa(lp1232 +g8 +aI745 +aI0 +aasV; +(lp1233 +(lp1234 +g8 +aI278 +aI-82 +aa(lp1235 +g15 +aI260 +aI14 +aI278 +aI-48 +aI272 +aI-16 +aa(lp1236 +g15 +aI204 +aI96 +aI247 +aI44 +aI229 +aI72 +aa(lp1237 +g15 +aI112 +aI160 +aI180 +aI121 +aI149 +aI142 +aa(lp1238 +g15 +aI-14 +aI201 +aI76 +aI178 +aI33 +aI192 +aa(lp1239 +g20 +aI0 +aI131 +aa(lp1240 +g15 +aI137 +aI20 +aI91 +aI109 +aI137 +aI72 +aa(lp1241 +g15 +aI131 +aI-3 +aI137 +aI11 +aI135 +aI3 +aa(lp1242 +g15 +aI117 +aI-21 +aI128 +aI-9 +aI123 +aI-15 +aa(lp1243 +g15 +aI99 +aI-37 +aI112 +aI-26 +aI106 +aI-32 +aa(lp1244 +g15 +aI82 +aI-55 +aI93 +aI-42 +aI87 +aI-48 +aa(lp1245 +g15 +aI68 +aI-78 +aI76 +aI-61 +aI71 +aI-69 +aa(lp1246 +g15 +aI62 +aI-111 +aI64 +aI-87 +aI62 +aI-98 +aa(lp1247 +g15 +aI70 +aI-149 +aI62 +aI-125 +aI65 +aI-138 +aa(lp1248 +g15 +aI92 +aI-178 +aI76 +aI-161 +aI83 +aI-170 +aa(lp1249 +g15 +aI124 +aI-197 +aI101 +aI-186 +aI112 +aI-193 +aa(lp1250 +g15 +aI162 +aI-203 +aI136 +aI-201 +aI149 +aI-203 +aa(lp1251 +g15 +aI208 +aI-195 +aI178 +aI-203 +aI193 +aI-200 +aa(lp1252 +g15 +aI244 +aI-171 +aI222 +aI-189 +aI234 +aI-181 +aa(lp1253 +g15 +aI269 +aI-133 +aI255 +aI-161 +aI263 +aI-148 +aa(lp1254 +g15 +aI278 +aI-82 +aI275 +aI-119 +aI278 +aI-101 +aa(lp1255 +g10 +aa(lp1256 +g8 +aI399 +aI-625 +aa(lp1257 +g15 +aI389 +aI-568 +aI399 +aI-602 +aI396 +aI-583 +aa(lp1258 +g15 +aI362 +aI-531 +aI382 +aI-552 +aI374 +aI-540 +aa(lp1259 +g15 +aI325 +aI-510 +aI351 +aI-521 +aI339 +aI-515 +aa(lp1260 +g15 +aI283 +aI-504 +aI311 +aI-506 +aI297 +aI-504 +aa(lp1261 +g15 +aI205 +aI-528 +aI251 +aI-504 +aI225 +aI-512 +aa(lp1262 +g15 +aI175 +aI-601 +aI185 +aI-543 +aI175 +aI-568 +aa(lp1263 +g15 +aI183 +aI-649 +aI175 +aI-618 +aI178 +aI-635 +aa(lp1264 +g15 +aI207 +aI-687 +aI189 +aI-664 +aI197 +aI-677 +aa(lp1265 +g15 +aI244 +aI-712 +aI217 +aI-698 +aI229 +aI-706 +aa(lp1266 +g15 +aI292 +aI-720 +aI258 +aI-717 +aI274 +aI-720 +aa(lp1267 +g15 +aI334 +aI-715 +aI307 +aI-720 +aI321 +aI-718 +aa(lp1268 +g15 +aI369 +aI-697 +aI348 +aI-711 +aI359 +aI-705 +aa(lp1269 +g15 +aI391 +aI-667 +aI378 +aI-689 +aI386 +aI-679 +aa(lp1270 +g15 +aI399 +aI-625 +aI397 +aI-655 +aI399 +aI-641 +aa(lp1271 +g10 +aa(lp1272 +g8 +aI477 +aI0 +aa(lp1273 +g10 +aa(lp1274 +g8 +aI477 +aI0 +aasV? +(lp1275 +(lp1276 +g8 +aI730 +aI-743 +aa(lp1277 +g15 +aI705 +aI-637 +aI730 +aI-705 +aI722 +aI-669 +aa(lp1278 +g15 +aI635 +aI-550 +aI688 +aI-605 +aI664 +aI-576 +aa(lp1279 +g15 +aI530 +aI-479 +aI605 +aI-524 +aI570 +aI-500 +aa(lp1280 +g15 +aI398 +aI-422 +aI489 +aI-458 +aI445 +aI-439 +aa(lp1281 +g20 +aI350 +aI-303 +aa(lp1282 +g20 +aI265 +aI-303 +aa(lp1283 +g20 +aI262 +aI-468 +aa(lp1284 +g15 +aI369 +aI-516 +aI301 +aI-483 +aI337 +aI-499 +aa(lp1285 +g15 +aI451 +aI-574 +aI401 +aI-533 +aI428 +aI-552 +aa(lp1286 +g15 +aI504 +aI-649 +aI474 +aI-596 +aI491 +aI-621 +aa(lp1287 +g15 +aI522 +aI-746 +aI516 +aI-677 +aI522 +aI-709 +aa(lp1288 +g15 +aI515 +aI-804 +aI522 +aI-768 +aI520 +aI-787 +aa(lp1289 +g15 +aI495 +aI-847 +aI510 +aI-821 +aI503 +aI-836 +aa(lp1290 +g15 +aI464 +aI-874 +aI486 +aI-859 +aI476 +aI-868 +aa(lp1291 +g15 +aI426 +aI-883 +aI452 +aI-880 +aI439 +aI-883 +aa(lp1292 +g15 +aI372 +aI-867 +aI405 +aI-883 +aI387 +aI-878 +aa(lp1293 +g15 +aI335 +aI-824 +aI357 +aI-856 +aI345 +aI-842 +aa(lp1294 +g15 +aI311 +aI-761 +aI325 +aI-806 +aI317 +aI-785 +aa(lp1295 +g15 +aI298 +aI-689 +aI306 +aI-738 +aI301 +aI-714 +aa(lp1296 +g15 +aI134 +aI-791 +aI189 +aI-689 +aI134 +aI-723 +aa(lp1297 +g15 +aI156 +aI-859 +aI134 +aI-815 +aI141 +aI-838 +aa(lp1298 +g15 +aI217 +aI-914 +aI170 +aI-880 +aI191 +aI-898 +aa(lp1299 +g15 +aI314 +aI-951 +aI244 +aI-929 +aI276 +aI-942 +aa(lp1300 +g15 +aI442 +aI-965 +aI352 +aI-960 +aI395 +aI-965 +aa(lp1301 +g15 +aI562 +aI-952 +aI486 +aI-965 +aI526 +aI-960 +aa(lp1302 +g15 +aI652 +aI-911 +aI598 +aI-943 +aI628 +aI-929 +aa(lp1303 +g15 +aI710 +aI-842 +aI677 +aI-893 +aI696 +aI-870 +aa(lp1304 +g15 +aI730 +aI-743 +aI723 +aI-814 +aI730 +aI-781 +aa(lp1305 +g10 +aa(lp1306 +g8 +aI391 +aI-108 +aa(lp1307 +g15 +aI381 +aI-52 +aI391 +aI-86 +aI388 +aI-68 +aa(lp1308 +g15 +aI355 +aI-15 +aI375 +aI-37 +aI366 +aI-24 +aa(lp1309 +g15 +aI317 +aI4 +aI344 +aI-6 +aI331 +aI0 +aa(lp1310 +g15 +aI276 +aI10 +aI303 +aI8 +aI289 +aI10 +aa(lp1311 +g15 +aI197 +aI-12 +aI243 +aI10 +aI217 +aI3 +aa(lp1312 +g15 +aI167 +aI-84 +aI177 +aI-28 +aI167 +aI-52 +aa(lp1313 +g15 +aI176 +aI-134 +aI167 +aI-103 +aI170 +aI-119 +aa(lp1314 +g15 +aI199 +aI-172 +aI181 +aI-149 +aI189 +aI-161 +aa(lp1315 +g15 +aI236 +aI-196 +aI209 +aI-182 +aI221 +aI-190 +aa(lp1316 +g15 +aI283 +aI-204 +aI250 +aI-201 +aI266 +aI-204 +aa(lp1317 +g15 +aI326 +aI-198 +aI299 +aI-204 +aI313 +aI-202 +aa(lp1318 +g15 +aI361 +aI-181 +aI339 +aI-194 +aI351 +aI-189 +aa(lp1319 +g15 +aI383 +aI-151 +aI370 +aI-173 +aI378 +aI-163 +aa(lp1320 +g15 +aI391 +aI-108 +aI389 +aI-139 +aI391 +aI-124 +aa(lp1321 +g10 +aa(lp1322 +g8 +aI713 +aI0 +aa(lp1323 +g10 +aa(lp1324 +g8 +aI713 +aI0 +aasVC +(lp1325 +(lp1326 +g8 +aI535 +aI-98 +aa(lp1327 +g15 +aI619 +aI-108 +aI566 +aI-98 +aI594 +aI-101 +aa(lp1328 +g15 +aI685 +aI-136 +aI643 +aI-115 +aI666 +aI-125 +aa(lp1329 +g15 +aI736 +aI-175 +aI705 +aI-148 +aI722 +aI-161 +aa(lp1330 +g15 +aI776 +aI-219 +aI751 +aI-189 +aI764 +aI-204 +aa(lp1331 +g15 +aI791 +aI-201 +aI781 +aI-215 +aI786 +aI-209 +aa(lp1332 +g15 +aI798 +aI-174 +aI796 +aI-193 +aI798 +aI-184 +aa(lp1333 +g15 +aI778 +aI-107 +aI798 +aI-151 +aI792 +aI-129 +aa(lp1334 +g15 +aI719 +aI-46 +aI765 +aI-84 +aI745 +aI-64 +aa(lp1335 +g15 +aI621 +aI-3 +aI692 +aI-28 +aI660 +aI-14 +aa(lp1336 +g15 +aI488 +aI13 +aI583 +aI7 +aI538 +aI13 +aa(lp1337 +g15 +aI317 +aI-10 +aI424 +aI13 +aI367 +aI5 +aa(lp1338 +g15 +aI190 +aI-79 +aI267 +aI-26 +aI224 +aI-49 +aa(lp1339 +g15 +aI111 +aI-192 +aI155 +aI-110 +aI129 +aI-148 +aa(lp1340 +g15 +aI83 +aI-344 +aI93 +aI-237 +aI83 +aI-287 +aa(lp1341 +g15 +aI102 +aI-502 +aI83 +aI-397 +aI90 +aI-450 +aa(lp1342 +g15 +aI157 +aI-649 +aI115 +aI-553 +aI133 +aI-602 +aa(lp1343 +g15 +aI245 +aI-777 +aI181 +aI-695 +aI210 +aI-738 +aa(lp1344 +g15 +aI362 +aI-879 +aI279 +aI-816 +aI318 +aI-850 +aa(lp1345 +g15 +aI505 +aI-946 +aI405 +aI-907 +aI453 +aI-930 +aa(lp1346 +g15 +aI673 +aI-970 +aI557 +aI-962 +aI613 +aI-970 +aa(lp1347 +g15 +aI789 +aI-958 +aI717 +aI-970 +aI756 +aI-966 +aa(lp1348 +g15 +aI872 +aI-926 +aI822 +aI-951 +aI850 +aI-940 +aa(lp1349 +g15 +aI921 +aI-876 +aI893 +aI-913 +aI910 +aI-896 +aa(lp1350 +g15 +aI937 +aI-811 +aI932 +aI-857 +aI937 +aI-835 +aa(lp1351 +g15 +aI923 +aI-759 +aI937 +aI-791 +aI932 +aI-774 +aa(lp1352 +g15 +aI883 +aI-722 +aI913 +aI-745 +aI900 +aI-732 +aa(lp1353 +g15 +aI824 +aI-699 +aI867 +aI-712 +aI847 +aI-704 +aa(lp1354 +g15 +aI749 +aI-691 +aI801 +aI-694 +aI776 +aI-691 +aa(lp1355 +g15 +aI745 +aI-753 +aI749 +aI-710 +aI748 +aI-730 +aa(lp1356 +g15 +aI729 +aI-816 +aI742 +aI-776 +aI737 +aI-797 +aa(lp1357 +g15 +aI695 +aI-865 +aI721 +aI-836 +aI710 +aI-852 +aa(lp1358 +g15 +aI636 +aI-884 +aI680 +aI-878 +aI660 +aI-884 +aa(lp1359 +g15 +aI538 +aI-860 +aI600 +aI-884 +aI568 +aI-876 +aa(lp1360 +g15 +aI457 +aI-795 +aI509 +aI-844 +aI481 +aI-823 +aa(lp1361 +g15 +aI392 +aI-699 +aI432 +aI-767 +aI411 +aI-735 +aa(lp1362 +g15 +aI344 +aI-583 +aI373 +aI-662 +aI357 +aI-624 +aa(lp1363 +g15 +aI315 +aI-459 +aI331 +aI-543 +aI322 +aI-501 +aa(lp1364 +g15 +aI305 +aI-336 +aI308 +aI-417 +aI305 +aI-376 +aa(lp1365 +g15 +aI363 +aI-160 +aI305 +aI-260 +aI324 +aI-202 +aa(lp1366 +g15 +aI535 +aI-98 +aI401 +aI-119 +aI459 +aI-98 +aa(lp1367 +g10 +aa(lp1368 +g8 +aI890 +aI0 +aa(lp1369 +g10 +aa(lp1370 +g8 +aI890 +aI0 +aasVG +(lp1371 +(lp1372 +g8 +aI1005 +aI-383 +aa(lp1373 +g20 +aI1003 +aI-383 +aa(lp1374 +g15 +aI961 +aI-380 +aI989 +aI-383 +aI974 +aI-382 +aa(lp1375 +g15 +aI924 +aI-369 +aI947 +aI-378 +aI935 +aI-374 +aa(lp1376 +g15 +aI895 +aI-344 +aI913 +aI-363 +aI903 +aI-355 +aa(lp1377 +g15 +aI877 +aI-302 +aI886 +aI-333 +aI881 +aI-319 +aa(lp1378 +g20 +aI826 +aI-47 +aa(lp1379 +g15 +aI747 +aI-20 +aI799 +aI-37 +aI773 +aI-28 +aa(lp1380 +g15 +aI668 +aI-1 +aI721 +aI-13 +aI695 +aI-6 +aa(lp1381 +g15 +aI586 +aI9 +aI642 +aI3 +aI614 +aI7 +aa(lp1382 +g15 +aI497 +aI13 +aI558 +aI12 +aI528 +aI13 +aa(lp1383 +g15 +aI317 +aI-11 +aI428 +aI13 +aI368 +aI5 +aa(lp1384 +g15 +aI188 +aI-82 +aI265 +aI-27 +aI222 +aI-51 +aa(lp1385 +g15 +aI110 +aI-194 +aI153 +aI-113 +aI127 +aI-150 +aa(lp1386 +g15 +aI83 +aI-343 +aI92 +aI-238 +aI83 +aI-288 +aa(lp1387 +g15 +aI104 +aI-508 +aI83 +aI-400 +aI90 +aI-455 +aa(lp1388 +g15 +aI162 +aI-657 +aI117 +aI-562 +aI136 +aI-611 +aa(lp1389 +g15 +aI254 +aI-783 +aI187 +aI-703 +aI218 +aI-745 +aa(lp1390 +g15 +aI377 +aI-880 +aI291 +aI-821 +aI332 +aI-853 +aa(lp1391 +g15 +aI527 +aI-942 +aI423 +aI-907 +aI473 +aI-928 +aa(lp1392 +g15 +aI701 +aI-965 +aI582 +aI-957 +aI639 +aI-965 +aa(lp1393 +g15 +aI834 +aI-951 +aI752 +aI-965 +aI796 +aI-960 +aa(lp1394 +g15 +aI929 +aI-915 +aI872 +aI-942 +aI903 +aI-930 +aa(lp1395 +g15 +aI985 +aI-864 +aI954 +aI-900 +aI972 +aI-883 +aa(lp1396 +g15 +aI1003 +aI-806 +aI997 +aI-845 +aI1003 +aI-826 +aa(lp1397 +g15 +aI988 +aI-757 +aI1003 +aI-788 +aI998 +aI-772 +aa(lp1398 +g15 +aI947 +aI-718 +aI978 +aI-742 +aI964 +aI-729 +aa(lp1399 +g15 +aI885 +aI-692 +aI929 +aI-707 +aI909 +aI-698 +aa(lp1400 +g15 +aI810 +aI-682 +aI862 +aI-685 +aI837 +aI-682 +aa(lp1401 +g15 +aI801 +aI-760 +aI810 +aI-710 +aI807 +aI-736 +aa(lp1402 +g15 +aI774 +aI-823 +aI795 +aI-784 +aI786 +aI-805 +aa(lp1403 +g15 +aI727 +aI-864 +aI762 +aI-840 +aI746 +aI-854 +aa(lp1404 +g15 +aI660 +aI-879 +aI708 +aI-874 +aI686 +aI-879 +aa(lp1405 +g15 +aI563 +aI-858 +aI626 +aI-879 +aI593 +aI-872 +aa(lp1406 +g15 +aI477 +aI-800 +aI532 +aI-845 +aI503 +aI-825 +aa(lp1407 +g15 +aI405 +aI-712 +aI450 +aI-776 +aI426 +aI-746 +aa(lp1408 +g15 +aI350 +aI-599 +aI383 +aI-678 +aI365 +aI-640 +aa(lp1409 +g15 +aI315 +aI-469 +aI335 +aI-559 +aI323 +aI-515 +aa(lp1410 +g15 +aI302 +aI-327 +aI306 +aI-423 +aI302 +aI-375 +aa(lp1411 +g15 +aI313 +aI-225 +aI302 +aI-290 +aI306 +aI-256 +aa(lp1412 +g15 +aI349 +aI-146 +aI321 +aI-195 +aI333 +aI-168 +aa(lp1413 +g15 +aI411 +aI-95 +aI365 +aI-124 +aI386 +aI-107 +aa(lp1414 +g15 +aI503 +aI-77 +aI437 +aI-83 +aI467 +aI-77 +aa(lp1415 +g15 +aI566 +aI-82 +aI524 +aI-77 +aI545 +aI-78 +aa(lp1416 +g15 +aI622 +aI-95 +aI587 +aI-85 +aI606 +aI-90 +aa(lp1417 +g20 +aI666 +aI-293 +aa(lp1418 +g15 +aI674 +aI-338 +aI671 +aI-316 +aI674 +aI-331 +aa(lp1419 +g15 +aI667 +aI-361 +aI674 +aI-347 +aI672 +aI-355 +aa(lp1420 +g15 +aI647 +aI-375 +aI662 +aI-367 +aI655 +aI-372 +aa(lp1421 +g15 +aI617 +aI-382 +aI638 +aI-378 +aI628 +aI-380 +aa(lp1422 +g15 +aI578 +aI-383 +aI605 +aI-383 +aI592 +aI-383 +aa(lp1423 +g20 +aI561 +aI-383 +aa(lp1424 +g20 +aI576 +aI-453 +aa(lp1425 +g20 +aI1020 +aI-453 +aa(lp1426 +g10 +aa(lp1427 +g8 +aI1061 +aI0 +aa(lp1428 +g10 +aa(lp1429 +g8 +aI1061 +aI0 +aasVK +(lp1430 +(lp1431 +g8 +aI674 +aI-722 +aa(lp1432 +g15 +aI719 +aI-765 +aI692 +aI-738 +aI707 +aI-752 +aa(lp1433 +g15 +aI746 +aI-800 +aI730 +aI-778 +aI739 +aI-789 +aa(lp1434 +g15 +aI760 +aI-827 +aI753 +aI-810 +aI757 +aI-819 +aa(lp1435 +g15 +aI764 +aI-847 +aI763 +aI-834 +aI764 +aI-841 +aa(lp1436 +g15 +aI751 +aI-873 +aI764 +aI-859 +aI759 +aI-867 +aa(lp1437 +g15 +aI705 +aI-882 +aI742 +aI-879 +aI727 +aI-882 +aa(lp1438 +g20 +aI720 +aI-951 +aa(lp1439 +g20 +aI1080 +aI-951 +aa(lp1440 +g20 +aI1065 +aI-882 +aa(lp1441 +g15 +aI1013 +aI-875 +aI1047 +aI-882 +aI1030 +aI-880 +aa(lp1442 +g15 +aI963 +aI-855 +aI997 +aI-871 +aI980 +aI-864 +aa(lp1443 +g15 +aI910 +aI-821 +aI946 +aI-846 +aI928 +aI-835 +aa(lp1444 +g15 +aI850 +aI-771 +aI892 +aI-807 +aI872 +aI-790 +aa(lp1445 +g20 +aI634 +aI-580 +aa(lp1446 +g20 +aI790 +aI-205 +aa(lp1447 +g15 +aI819 +aI-142 +aI801 +aI-181 +aI811 +aI-160 +aa(lp1448 +g15 +aI847 +aI-100 +aI828 +aI-125 +aI837 +aI-111 +aa(lp1449 +g15 +aI877 +aI-77 +aI856 +aI-90 +aI866 +aI-82 +aa(lp1450 +g15 +aI917 +aI-70 +aI888 +aI-72 +aI902 +aI-70 +aa(lp1451 +g20 +aI921 +aI-70 +aa(lp1452 +g20 +aI908 +aI0 +aa(lp1453 +g20 +aI838 +aI0 +aa(lp1454 +g15 +aI728 +aI-7 +aI794 +aI0 +aI757 +aI-2 +aa(lp1455 +g15 +aI653 +aI-36 +aI698 +aI-13 +aI674 +aI-22 +aa(lp1456 +g15 +aI602 +aI-92 +aI633 +aI-50 +aI616 +aI-69 +aa(lp1457 +g15 +aI559 +aI-183 +aI588 +aI-116 +aI574 +aI-146 +aa(lp1458 +g20 +aI461 +aI-438 +aa(lp1459 +g20 +aI382 +aI-382 +aa(lp1460 +g20 +aI333 +aI-146 +aa(lp1461 +g15 +aI330 +aI-129 +aI332 +aI-141 +aI331 +aI-135 +aa(lp1462 +g15 +aI328 +aI-115 +aI328 +aI-123 +aI328 +aI-118 +aa(lp1463 +g15 +aI335 +aI-92 +aI328 +aI-105 +aI330 +aI-98 +aa(lp1464 +g15 +aI355 +aI-78 +aI340 +aI-86 +aI346 +aI-81 +aa(lp1465 +g15 +aI386 +aI-72 +aI364 +aI-75 +aI374 +aI-73 +aa(lp1466 +g15 +aI425 +aI-70 +aI398 +aI-71 +aI411 +aI-70 +aa(lp1467 +g20 +aI442 +aI-70 +aa(lp1468 +g20 +aI427 +aI0 +aa(lp1469 +g20 +aI-30 +aI0 +aa(lp1470 +g20 +aI-16 +aI-70 +aa(lp1471 +g20 +aI1 +aI-70 +aa(lp1472 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp1473 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp1474 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp1475 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp1476 +g20 +aI259 +aI-789 +aa(lp1477 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp1478 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp1479 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp1480 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp1481 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp1482 +g20 +aI154 +aI-881 +aa(lp1483 +g20 +aI169 +aI-951 +aa(lp1484 +g20 +aI629 +aI-951 +aa(lp1485 +g20 +aI614 +aI-881 +aa(lp1486 +g20 +aI597 +aI-881 +aa(lp1487 +g15 +aI555 +aI-878 +aI582 +aI-881 +aI568 +aI-880 +aa(lp1488 +g15 +aI517 +aI-866 +aI541 +aI-876 +aI528 +aI-872 +aa(lp1489 +g15 +aI488 +aI-841 +aI506 +aI-861 +aI496 +aI-852 +aa(lp1490 +g15 +aI470 +aI-799 +aI480 +aI-831 +aI474 +aI-817 +aa(lp1491 +g20 +aI404 +aI-483 +aa(lp1492 +g10 +aa(lp1493 +g8 +aI988 +aI0 +aa(lp1494 +g10 +aa(lp1495 +g8 +aI988 +aI0 +aasVO +(lp1496 +(lp1497 +g8 +aI83 +aI-354 +aa(lp1498 +g15 +aI99 +aI-488 +aI83 +aI-396 +aI89 +aI-441 +aa(lp1499 +g15 +aI147 +aI-626 +aI110 +aI-535 +aI126 +aI-581 +aa(lp1500 +g15 +aI227 +aI-756 +aI169 +aI-672 +aI195 +aI-715 +aa(lp1501 +g15 +aI337 +aI-864 +aI258 +aI-797 +aI295 +aI-833 +aa(lp1502 +g15 +aI479 +aI-938 +aI379 +aI-895 +aI426 +aI-920 +aa(lp1503 +g15 +aI651 +aI-966 +aI531 +aI-957 +aI589 +aI-966 +aa(lp1504 +g15 +aI791 +aI-944 +aI700 +aI-966 +aI747 +aI-959 +aa(lp1505 +g15 +aI909 +aI-878 +aI836 +aI-930 +aI875 +aI-908 +aa(lp1506 +g15 +aI990 +aI-764 +aI943 +aI-848 +aI970 +aI-810 +aa(lp1507 +g15 +aI1020 +aI-599 +aI1010 +aI-718 +aI1020 +aI-663 +aa(lp1508 +g15 +aI1004 +aI-468 +aI1020 +aI-559 +aI1015 +aI-515 +aa(lp1509 +g15 +aI958 +aI-330 +aI994 +aI-422 +aI979 +aI-376 +aa(lp1510 +g15 +aI881 +aI-200 +aI938 +aI-285 +aI912 +aI-241 +aa(lp1511 +g15 +aI771 +aI-89 +aI850 +aI-158 +aI813 +aI-121 +aa(lp1512 +g15 +aI629 +aI-13 +aI729 +aI-57 +aI682 +aI-32 +aa(lp1513 +g15 +aI455 +aI15 +aI577 +aI5 +aI519 +aI15 +aa(lp1514 +g15 +aI308 +aI-8 +aI403 +aI15 +aI354 +aI7 +aa(lp1515 +g15 +aI191 +aI-78 +aI263 +aI-24 +aI224 +aI-47 +aa(lp1516 +g15 +aI112 +aI-194 +aI157 +aI-110 +aI131 +aI-148 +aa(lp1517 +g15 +aI83 +aI-354 +aI93 +aI-240 +aI83 +aI-294 +aa(lp1518 +g10 +aa(lp1519 +g8 +aI301 +aI-322 +aa(lp1520 +g15 +aI315 +aI-209 +aI301 +aI-278 +aI306 +aI-240 +aa(lp1521 +g15 +aI353 +aI-132 +aI324 +aI-178 +aI337 +aI-152 +aa(lp1522 +g15 +aI411 +aI-87 +aI370 +aI-111 +aI389 +aI-96 +aa(lp1523 +g15 +aI482 +aI-73 +aI433 +aI-77 +aI457 +aI-73 +aa(lp1524 +g15 +aI583 +aI-99 +aI519 +aI-73 +aI552 +aI-82 +aa(lp1525 +g15 +aI664 +aI-171 +aI613 +aI-117 +aI640 +aI-141 +aa(lp1526 +g15 +aI726 +aI-273 +aI687 +aI-200 +aI708 +aI-234 +aa(lp1527 +g15 +aI769 +aI-392 +aI743 +aI-311 +aI758 +aI-351 +aa(lp1528 +g15 +aI795 +aI-516 +aI781 +aI-434 +aI789 +aI-475 +aa(lp1529 +g15 +aI804 +aI-630 +aI801 +aI-557 +aI804 +aI-595 +aa(lp1530 +g15 +aI790 +aI-742 +aI804 +aI-673 +aI799 +aI-711 +aa(lp1531 +g15 +aI752 +aI-819 +aI781 +aI-773 +aI768 +aI-799 +aa(lp1532 +g15 +aI695 +aI-865 +aI737 +aI-840 +aI718 +aI-855 +aa(lp1533 +g15 +aI623 +aI-879 +aI673 +aI-874 +aI649 +aI-879 +aa(lp1534 +g15 +aI523 +aI-853 +aI586 +aI-879 +aI553 +aI-870 +aa(lp1535 +g15 +aI442 +aI-781 +aI492 +aI-835 +aI465 +aI-811 +aa(lp1536 +g15 +aI379 +aI-679 +aI418 +aI-752 +aI397 +aI-717 +aa(lp1537 +g15 +aI335 +aI-559 +aI361 +aI-641 +aI347 +aI-601 +aa(lp1538 +g15 +aI309 +aI-436 +aI324 +aI-518 +aI315 +aI-477 +aa(lp1539 +g15 +aI301 +aI-322 +aI304 +aI-395 +aI301 +aI-357 +aa(lp1540 +g10 +aa(lp1541 +g8 +aI1055 +aI0 +aa(lp1542 +g10 +aa(lp1543 +g8 +aI1055 +aI0 +aasVS +(lp1544 +(lp1545 +g8 +aI348 +aI13 +aa(lp1546 +g15 +aI203 +aI-1 +aI293 +aI13 +aI245 +aI8 +aa(lp1547 +g15 +aI100 +aI-42 +aI162 +aI-11 +aI128 +aI-25 +aa(lp1548 +g15 +aI39 +aI-104 +aI73 +aI-59 +aI53 +aI-80 +aa(lp1549 +g15 +aI18 +aI-181 +aI25 +aI-127 +aI18 +aI-153 +aa(lp1550 +g15 +aI31 +aI-235 +aI18 +aI-202 +aI23 +aI-220 +aa(lp1551 +g15 +aI67 +aI-274 +aI40 +aI-251 +aI51 +aI-264 +aa(lp1552 +g15 +aI122 +aI-298 +aI82 +aI-285 +aI101 +aI-293 +aa(lp1553 +g15 +aI192 +aI-306 +aI143 +aI-303 +aI166 +aI-306 +aa(lp1554 +g15 +aI205 +aI-200 +aI192 +aI-265 +aI196 +aI-230 +aa(lp1555 +g15 +aI241 +aI-125 +aI213 +aI-170 +aI225 +aI-145 +aa(lp1556 +g15 +aI297 +aI-81 +aI257 +aI-105 +aI275 +aI-91 +aa(lp1557 +g15 +aI369 +aI-67 +aI319 +aI-72 +aI343 +aI-67 +aa(lp1558 +g15 +aI436 +aI-77 +aI394 +aI-67 +aI416 +aI-70 +aa(lp1559 +g15 +aI486 +aI-107 +aI455 +aI-85 +aI472 +aI-94 +aa(lp1560 +g15 +aI517 +aI-150 +aI499 +aI-119 +aI510 +aI-134 +aa(lp1561 +g15 +aI527 +aI-204 +aI524 +aI-167 +aI527 +aI-185 +aa(lp1562 +g15 +aI521 +aI-256 +aI527 +aI-223 +aI525 +aI-240 +aa(lp1563 +g15 +aI496 +aI-301 +aI516 +aI-271 +aI508 +aI-286 +aa(lp1564 +g15 +aI445 +aI-346 +aI483 +aI-316 +aI467 +aI-331 +aa(lp1565 +g15 +aI363 +aI-396 +aI424 +aI-361 +aI397 +aI-378 +aa(lp1566 +g15 +aI272 +aI-455 +aI329 +aI-415 +aI298 +aI-435 +aa(lp1567 +g15 +aI206 +aI-521 +aI246 +aI-475 +aI224 +aI-497 +aa(lp1568 +g15 +aI166 +aI-598 +aI189 +aI-544 +aI175 +aI-570 +aa(lp1569 +g15 +aI153 +aI-692 +aI158 +aI-626 +aI153 +aI-657 +aa(lp1570 +g15 +aI177 +aI-802 +aI153 +aI-732 +aI161 +aI-769 +aa(lp1571 +g15 +aI246 +aI-889 +aI193 +aI-836 +aI216 +aI-865 +aa(lp1572 +g15 +aI355 +aI-945 +aI276 +aI-913 +aI312 +aI-931 +aa(lp1573 +g15 +aI498 +aI-965 +aI398 +aI-958 +aI445 +aI-965 +aa(lp1574 +g15 +aI628 +aI-953 +aI548 +aI-965 +aI591 +aI-961 +aa(lp1575 +g15 +aI720 +aI-921 +aI665 +aI-945 +aI695 +aI-934 +aa(lp1576 +g15 +aI775 +aI-873 +aI744 +aI-907 +aI763 +aI-892 +aa(lp1577 +g15 +aI793 +aI-815 +aI787 +aI-855 +aI793 +aI-836 +aa(lp1578 +g15 +aI752 +aI-730 +aI793 +aI-779 +aI779 +aI-750 +aa(lp1579 +g15 +aI618 +aI-699 +aI725 +aI-709 +aI680 +aI-699 +aa(lp1580 +g15 +aI612 +aI-761 +aI618 +aI-719 +aI616 +aI-740 +aa(lp1581 +g15 +aI591 +aI-821 +aI608 +aI-783 +aI601 +aI-803 +aa(lp1582 +g15 +aI551 +aI-866 +aI581 +aI-839 +aI568 +aI-854 +aa(lp1583 +g15 +aI486 +aI-883 +aI534 +aI-877 +aI513 +aI-883 +aa(lp1584 +g15 +aI433 +aI-875 +aI469 +aI-883 +aI451 +aI-880 +aa(lp1585 +g15 +aI386 +aI-849 +aI416 +aI-869 +aI400 +aI-861 +aa(lp1586 +g15 +aI352 +aI-807 +aI372 +aI-838 +aI361 +aI-824 +aa(lp1587 +g15 +aI339 +aI-746 +aI344 +aI-790 +aI339 +aI-769 +aa(lp1588 +g15 +aI350 +aI-686 +aI339 +aI-722 +aI343 +aI-702 +aa(lp1589 +g15 +aI384 +aI-640 +aI358 +aI-669 +aI369 +aI-654 +aa(lp1590 +g15 +aI439 +aI-599 +aI398 +aI-626 +aI417 +aI-612 +aa(lp1591 +g15 +aI517 +aI-555 +aI461 +aI-586 +aI487 +aI-571 +aa(lp1592 +g15 +aI666 +aI-434 +aI584 +aI-519 +aI634 +aI-478 +aa(lp1593 +g15 +aI714 +aI-283 +aI698 +aI-390 +aI714 +aI-340 +aa(lp1594 +g15 +aI689 +aI-157 +aI714 +aI-236 +aI706 +aI-193 +aa(lp1595 +g15 +aI615 +aI-64 +aI671 +aI-120 +aI647 +aI-89 +aa(lp1596 +g15 +aI500 +aI-6 +aI583 +aI-38 +aI545 +aI-19 +aa(lp1597 +g15 +aI348 +aI13 +aI454 +aI6 +aI404 +aI13 +aa(lp1598 +g10 +aa(lp1599 +g8 +aI781 +aI0 +aa(lp1600 +g10 +aa(lp1601 +g8 +aI781 +aI0 +aasVW +(lp1602 +(lp1603 +g8 +aI1541 +aI-881 +aa(lp1604 +g20 +aI1509 +aI-881 +aa(lp1605 +g15 +aI1474 +aI-877 +aI1496 +aI-881 +aI1484 +aI-879 +aa(lp1606 +g15 +aI1446 +aI-862 +aI1464 +aI-874 +aI1455 +aI-869 +aa(lp1607 +g15 +aI1421 +aI-832 +aI1438 +aI-855 +aI1430 +aI-845 +aa(lp1608 +g15 +aI1394 +aI-783 +aI1413 +aI-819 +aI1404 +aI-803 +aa(lp1609 +g20 +aI1021 +aI0 +aa(lp1610 +g20 +aI869 +aI0 +aa(lp1611 +g20 +aI777 +aI-635 +aa(lp1612 +g20 +aI453 +aI0 +aa(lp1613 +g20 +aI287 +aI0 +aa(lp1614 +g20 +aI216 +aI-816 +aa(lp1615 +g15 +aI207 +aI-849 +aI214 +aI-830 +aI211 +aI-841 +aa(lp1616 +g15 +aI188 +aI-869 +aI202 +aI-857 +aI196 +aI-864 +aa(lp1617 +g15 +aI162 +aI-878 +aI180 +aI-874 +aI172 +aI-877 +aa(lp1618 +g15 +aI132 +aI-881 +aI153 +aI-880 +aI143 +aI-881 +aa(lp1619 +g20 +aI114 +aI-881 +aa(lp1620 +g20 +aI129 +aI-951 +aa(lp1621 +g20 +aI565 +aI-951 +aa(lp1622 +g20 +aI550 +aI-881 +aa(lp1623 +g20 +aI520 +aI-881 +aa(lp1624 +g15 +aI451 +aI-870 +aI491 +aI-881 +aI468 +aI-877 +aa(lp1625 +g15 +aI426 +aI-827 +aI434 +aI-863 +aI426 +aI-848 +aa(lp1626 +g15 +aI427 +aI-802 +aI426 +aI-820 +aI426 +aI-811 +aa(lp1627 +g15 +aI429 +aI-769 +aI427 +aI-792 +aI428 +aI-781 +aa(lp1628 +g20 +aI454 +aI-437 +aa(lp1629 +g15 +aI458 +aI-390 +aI455 +aI-425 +aI457 +aI-409 +aa(lp1630 +g15 +aI461 +aI-329 +aI459 +aI-371 +aI460 +aI-350 +aa(lp1631 +g15 +aI464 +aI-266 +aI462 +aI-308 +aI463 +aI-287 +aa(lp1632 +g15 +aI465 +aI-214 +aI465 +aI-246 +aI465 +aI-228 +aa(lp1633 +g15 +aI497 +aI-292 +aI474 +aI-240 +aI485 +aI-266 +aa(lp1634 +g15 +aI535 +aI-371 +aI509 +aI-319 +aI522 +aI-345 +aa(lp1635 +g20 +aI833 +aI-942 +aa(lp1636 +g20 +aI930 +aI-942 +aa(lp1637 +g20 +aI1006 +aI-433 +aa(lp1638 +g15 +aI1022 +aI-312 +aI1012 +aI-391 +aI1017 +aI-350 +aa(lp1639 +g15 +aI1029 +aI-211 +aI1027 +aI-273 +aI1029 +aI-240 +aa(lp1640 +g15 +aI1048 +aI-263 +aI1034 +aI-226 +aI1040 +aI-243 +aa(lp1641 +g15 +aI1072 +aI-325 +aI1055 +aI-282 +aI1063 +aI-303 +aa(lp1642 +g15 +aI1100 +aI-392 +aI1081 +aI-347 +aI1090 +aI-369 +aa(lp1643 +g15 +aI1130 +aI-458 +aI1110 +aI-414 +aI1120 +aI-436 +aa(lp1644 +g20 +aI1278 +aI-776 +aa(lp1645 +g15 +aI1293 +aI-814 +aI1284 +aI-789 +aI1289 +aI-802 +aa(lp1646 +g15 +aI1298 +aI-847 +aI1296 +aI-827 +aI1298 +aI-838 +aa(lp1647 +g15 +aI1281 +aI-874 +aI1298 +aI-860 +aI1292 +aI-869 +aa(lp1648 +g15 +aI1225 +aI-881 +aI1269 +aI-878 +aI1250 +aI-881 +aa(lp1649 +g20 +aI1194 +aI-881 +aa(lp1650 +g20 +aI1207 +aI-951 +aa(lp1651 +g20 +aI1555 +aI-951 +aa(lp1652 +g10 +aa(lp1653 +g8 +aI1422 +aI0 +aa(lp1654 +g10 +aa(lp1655 +g8 +aI1422 +aI0 +aasV[ +(lp1656 +(lp1657 +g8 +aI27 +aI171 +aa(lp1658 +g20 +aI279 +aI-1012 +aa(lp1659 +g20 +aI649 +aI-1012 +aa(lp1660 +g20 +aI634 +aI-942 +aa(lp1661 +g20 +aI577 +aI-942 +aa(lp1662 +g15 +aI534 +aI-939 +aI562 +aI-942 +aI548 +aI-941 +aa(lp1663 +g15 +aI496 +aI-925 +aI521 +aI-936 +aI508 +aI-932 +aa(lp1664 +g15 +aI466 +aI-896 +aI485 +aI-918 +aI474 +aI-909 +aa(lp1665 +g15 +aI446 +aI-845 +aI457 +aI-884 +aI450 +aI-867 +aa(lp1666 +g20 +aI266 +aI4 +aa(lp1667 +g15 +aI263 +aI22 +aI265 +aI11 +aI264 +aI17 +aa(lp1668 +g15 +aI262 +aI37 +aI262 +aI27 +aI262 +aI32 +aa(lp1669 +g15 +aI269 +aI70 +aI262 +aI51 +aI264 +aI62 +aa(lp1670 +g15 +aI289 +aI89 +aI274 +aI79 +aI280 +aI85 +aa(lp1671 +g15 +aI319 +aI98 +aI297 +aI93 +aI307 +aI96 +aa(lp1672 +g15 +aI354 +aI100 +aI330 +aI99 +aI342 +aI100 +aa(lp1673 +g20 +aI412 +aI100 +aa(lp1674 +g20 +aI397 +aI171 +aa(lp1675 +g10 +aa(lp1676 +g8 +aI552 +aI0 +aa(lp1677 +g10 +aa(lp1678 +g8 +aI552 +aI0 +aasV_ +(lp1679 +(lp1680 +g8 +aI502 +aI189 +aa(lp1681 +g20 +aI-121 +aI189 +aa(lp1682 +g20 +aI-104 +aI111 +aa(lp1683 +g20 +aI520 +aI111 +aa(lp1684 +g10 +aa(lp1685 +g8 +aI611 +aI0 +aa(lp1686 +g10 +aa(lp1687 +g8 +aI611 +aI0 +aasVc +(lp1688 +(lp1689 +g8 +aI404 +aI-87 +aa(lp1690 +g15 +aI467 +aI-96 +aI427 +aI-87 +aI448 +aI-90 +aa(lp1691 +g15 +aI518 +aI-121 +aI486 +aI-103 +aI503 +aI-111 +aa(lp1692 +g15 +aI559 +aI-157 +aI534 +aI-132 +aI547 +aI-144 +aa(lp1693 +g15 +aI590 +aI-196 +aI570 +aI-170 +aI581 +aI-183 +aa(lp1694 +g15 +aI604 +aI-173 +aI596 +aI-191 +aI600 +aI-183 +aa(lp1695 +g15 +aI610 +aI-138 +aI608 +aI-163 +aI610 +aI-151 +aa(lp1696 +g15 +aI595 +aI-85 +aI610 +aI-120 +aI605 +aI-103 +aa(lp1697 +g15 +aI547 +aI-36 +aI585 +aI-67 +aI569 +aI-50 +aa(lp1698 +g15 +aI466 +aI0 +aI526 +aI-21 +aI499 +aI-9 +aa(lp1699 +g15 +aI348 +aI13 +aI433 +aI8 +aI393 +aI13 +aa(lp1700 +g15 +aI234 +aI-3 +aI307 +aI13 +aI269 +aI7 +aa(lp1701 +g15 +aI140 +aI-54 +aI198 +aI-14 +aI166 +aI-31 +aa(lp1702 +g15 +aI76 +aI-140 +aI113 +aI-77 +aI92 +aI-106 +aa(lp1703 +g15 +aI53 +aI-261 +aI61 +aI-175 +aI53 +aI-215 +aa(lp1704 +g15 +aI65 +aI-365 +aI53 +aI-294 +aI57 +aI-329 +aa(lp1705 +g15 +aI102 +aI-470 +aI74 +aI-400 +aI86 +aI-436 +aa(lp1706 +g15 +aI164 +aI-568 +aI119 +aI-505 +aI139 +aI-537 +aa(lp1707 +g15 +aI250 +aI-650 +aI188 +aI-599 +aI217 +aI-627 +aa(lp1708 +g15 +aI359 +aI-706 +aI282 +aI-674 +aI319 +aI-692 +aa(lp1709 +g15 +aI492 +aI-727 +aI399 +aI-720 +aI444 +aI-727 +aa(lp1710 +g15 +aI587 +aI-716 +aI529 +aI-727 +aI560 +aI-723 +aa(lp1711 +g15 +aI653 +aI-685 +aI614 +aI-708 +aI636 +aI-698 +aa(lp1712 +g15 +aI691 +aI-640 +aI670 +aI-672 +aI683 +aI-657 +aa(lp1713 +g15 +aI703 +aI-586 +aI699 +aI-623 +aI703 +aI-605 +aa(lp1714 +g15 +aI694 +aI-545 +aI703 +aI-572 +aI700 +aI-558 +aa(lp1715 +g15 +aI666 +aI-509 +aI689 +aI-532 +aI679 +aI-520 +aa(lp1716 +g15 +aI616 +aI-483 +aI653 +aI-499 +aI636 +aI-490 +aa(lp1717 +g15 +aI541 +aI-474 +aI595 +aI-477 +aI570 +aI-474 +aa(lp1718 +g15 +aI534 +aI-540 +aI541 +aI-497 +aI538 +aI-519 +aa(lp1719 +g15 +aI516 +aI-596 +aI530 +aI-561 +aI524 +aI-580 +aa(lp1720 +g15 +aI486 +aI-633 +aI508 +aI-612 +aI497 +aI-624 +aa(lp1721 +g15 +aI444 +aI-647 +aI474 +aI-642 +aI460 +aI-647 +aa(lp1722 +g15 +aI390 +aI-628 +aI424 +aI-647 +aI407 +aI-640 +aa(lp1723 +g15 +aI344 +aI-577 +aI373 +aI-615 +aI358 +aI-598 +aa(lp1724 +g15 +aI307 +aI-505 +aI330 +aI-556 +aI318 +aI-532 +aa(lp1725 +g15 +aI280 +aI-421 +aI296 +aI-477 +aI287 +aI-449 +aa(lp1726 +g15 +aI263 +aI-335 +aI272 +aI-392 +aI266 +aI-363 +aa(lp1727 +g15 +aI257 +aI-259 +aI259 +aI-307 +aI257 +aI-282 +aa(lp1728 +g15 +aI294 +aI-132 +aI257 +aI-205 +aI269 +aI-162 +aa(lp1729 +g15 +aI404 +aI-87 +aI319 +aI-102 +aI355 +aI-87 +aa(lp1730 +g10 +aa(lp1731 +g8 +aI703 +aI0 +aa(lp1732 +g10 +aa(lp1733 +g8 +aI703 +aI0 +aasVg +(lp1734 +(lp1735 +g8 +aI118 +aI-438 +aa(lp1736 +g15 +aI138 +aI-535 +aI118 +aI-469 +aI125 +aI-501 +aa(lp1737 +g15 +aI200 +aI-629 +aI152 +aI-569 +aI173 +aI-601 +aa(lp1738 +g15 +aI304 +aI-699 +aI228 +aI-657 +aI263 +aI-681 +aa(lp1739 +g15 +aI451 +aI-727 +aI346 +aI-718 +aI395 +aI-727 +aa(lp1740 +g15 +aI534 +aI-717 +aI481 +aI-727 +aI509 +aI-724 +aa(lp1741 +g15 +aI602 +aI-685 +aI560 +aI-710 +aI583 +aI-699 +aa(lp1742 +g15 +aI634 +aI-720 +aI612 +aI-697 +aI623 +aI-709 +aa(lp1743 +g15 +aI670 +aI-749 +aI646 +aI-731 +aI657 +aI-741 +aa(lp1744 +g15 +aI710 +aI-768 +aI683 +aI-757 +aI696 +aI-763 +aa(lp1745 +g15 +aI757 +aI-775 +aI725 +aI-773 +aI740 +aI-775 +aa(lp1746 +g15 +aI817 +aI-755 +aI784 +aI-775 +aI804 +aI-768 +aa(lp1747 +g15 +aI835 +aI-704 +aI829 +aI-742 +aI835 +aI-725 +aa(lp1748 +g15 +aI831 +aI-671 +aI835 +aI-693 +aI834 +aI-682 +aa(lp1749 +g15 +aI817 +aI-640 +aI828 +aI-660 +aI824 +aI-649 +aa(lp1750 +g15 +aI791 +aI-618 +aI811 +aI-631 +aI802 +aI-624 +aa(lp1751 +g15 +aI750 +aI-610 +aI780 +aI-613 +aI766 +aI-610 +aa(lp1752 +g15 +aI738 +aI-652 +aI750 +aI-628 +aI746 +aI-642 +aa(lp1753 +g15 +aI703 +aI-667 +aI730 +aI-662 +aI718 +aI-667 +aa(lp1754 +g15 +aI670 +aI-661 +aI691 +aI-667 +aI680 +aI-665 +aa(lp1755 +g15 +aI642 +aI-643 +aI660 +aI-656 +aI651 +aI-650 +aa(lp1756 +g15 +aI666 +aI-595 +aI652 +aI-630 +aI660 +aI-614 +aa(lp1757 +g15 +aI675 +aI-536 +aI672 +aI-576 +aI675 +aI-557 +aa(lp1758 +g15 +aI667 +aI-475 +aI675 +aI-517 +aI672 +aI-496 +aa(lp1759 +g15 +aI641 +aI-411 +aI661 +aI-453 +aI653 +aI-432 +aa(lp1760 +g15 +aI598 +aI-350 +aI630 +aI-390 +aI616 +aI-370 +aa(lp1761 +g15 +aI537 +aI-299 +aI581 +aI-331 +aI560 +aI-314 +aa(lp1762 +g15 +aI455 +aI-264 +aI513 +aI-284 +aI486 +aI-273 +aa(lp1763 +g15 +aI354 +aI-251 +aI425 +aI-255 +aI391 +aI-251 +aa(lp1764 +g15 +aI339 +aI-251 +aI350 +aI-251 +aI345 +aI-251 +aa(lp1765 +g15 +aI320 +aI-252 +aI333 +aI-252 +aI326 +aI-252 +aa(lp1766 +g15 +aI301 +aI-253 +aI313 +aI-252 +aI307 +aI-253 +aa(lp1767 +g15 +aI286 +aI-255 +aI295 +aI-253 +aI290 +aI-254 +aa(lp1768 +g15 +aI234 +aI-223 +aI265 +aI-246 +aI248 +aI-235 +aa(lp1769 +g15 +aI213 +aI-185 +aI220 +aI-211 +aI213 +aI-198 +aa(lp1770 +g15 +aI219 +aI-166 +aI213 +aI-177 +aI215 +aI-171 +aa(lp1771 +g15 +aI234 +aI-155 +aI222 +aI-162 +aI227 +aI-158 +aa(lp1772 +g15 +aI256 +aI-148 +aI240 +aI-152 +aI247 +aI-150 +aa(lp1773 +g15 +aI285 +aI-144 +aI265 +aI-146 +aI274 +aI-145 +aa(lp1774 +g20 +aI434 +aI-130 +aa(lp1775 +g15 +aI586 +aI-77 +aI500 +aI-124 +aI550 +aI-106 +aa(lp1776 +g15 +aI641 +aI51 +aI623 +aI-48 +aI641 +aI-5 +aa(lp1777 +g15 +aI613 +aI161 +aI641 +aI91 +aI632 +aI128 +aa(lp1778 +g15 +aI532 +aI246 +aI595 +aI194 +aI568 +aI223 +aa(lp1779 +g15 +aI402 +aI301 +aI497 +aI269 +aI454 +aI288 +aa(lp1780 +g15 +aI226 +aI320 +aI351 +aI314 +aI292 +aI320 +aa(lp1781 +g15 +aI87 +aI308 +aI172 +aI320 +aI125 +aI316 +aa(lp1782 +g15 +aI-6 +aI274 +aI49 +aI300 +aI17 +aI289 +aa(lp1783 +g15 +aI-60 +aI220 +aI-30 +aI259 +aI-48 +aI241 +aa(lp1784 +g15 +aI-77 +aI150 +aI-71 +aI199 +aI-77 +aI176 +aa(lp1785 +g15 +aI-59 +aI87 +aI-77 +aI127 +aI-71 +aI106 +aa(lp1786 +g15 +aI-11 +aI37 +aI-47 +aI67 +aI-31 +aI51 +aa(lp1787 +g15 +aI56 +aI1 +aI8 +aI23 +aI31 +aI11 +aa(lp1788 +g15 +aI136 +aI-19 +aI82 +aI-7 +aI108 +aI-14 +aa(lp1789 +g15 +aI110 +aI-37 +aI127 +aI-24 +aI118 +aI-30 +aa(lp1790 +g15 +aI88 +aI-63 +aI102 +aI-45 +aI95 +aI-53 +aa(lp1791 +g15 +aI73 +aI-94 +aI82 +aI-73 +aI77 +aI-83 +aa(lp1792 +g15 +aI67 +aI-129 +aI69 +aI-105 +aI67 +aI-117 +aa(lp1793 +g15 +aI76 +aI-168 +aI67 +aI-142 +aI70 +aI-156 +aa(lp1794 +g15 +aI102 +aI-203 +aI81 +aI-180 +aI90 +aI-192 +aa(lp1795 +g15 +aI147 +aI-239 +aI113 +aI-215 +aI128 +aI-227 +aa(lp1796 +g15 +aI212 +aI-278 +aI165 +aI-251 +aI187 +aI-264 +aa(lp1797 +g15 +aI143 +aI-340 +aI182 +aI-292 +aI159 +aI-312 +aa(lp1798 +g15 +aI118 +aI-438 +aI126 +aI-367 +aI118 +aI-400 +aa(lp1799 +g10 +aa(lp1800 +g8 +aI469 +aI113 +aa(lp1801 +g15 +aI440 +aI55 +aI469 +aI88 +aI459 +aI69 +aa(lp1802 +g15 +aI342 +aI29 +aI421 +aI42 +aI388 +aI33 +aa(lp1803 +g20 +aI223 +aI19 +aa(lp1804 +g15 +aI168 +aI34 +aI204 +aI21 +aI186 +aI26 +aa(lp1805 +g15 +aI123 +aI61 +aI151 +aI41 +aI136 +aI50 +aa(lp1806 +g15 +aI92 +aI98 +aI110 +aI72 +aI100 +aI84 +aa(lp1807 +g15 +aI81 +aI141 +aI85 +aI112 +aI81 +aI126 +aa(lp1808 +g15 +aI88 +aI180 +aI81 +aI155 +aI83 +aI168 +aa(lp1809 +g15 +aI114 +aI211 +aI93 +aI192 +aI102 +aI202 +aa(lp1810 +g15 +aI165 +aI232 +aI127 +aI220 +aI144 +aI227 +aa(lp1811 +g15 +aI246 +aI240 +aI187 +aI238 +aI214 +aI240 +aa(lp1812 +g15 +aI347 +aI230 +aI285 +aI240 +aI319 +aI237 +aa(lp1813 +g15 +aI416 +aI202 +aI375 +aI223 +aI398 +aI213 +aa(lp1814 +g15 +aI456 +aI161 +aI434 +aI190 +aI447 +aI176 +aa(lp1815 +g15 +aI469 +aI113 +aI465 +aI146 +aI469 +aI130 +aa(lp1816 +g10 +aa(lp1817 +g8 +aI358 +aI-332 +aa(lp1818 +g15 +aI401 +aI-343 +aI374 +aI-332 +aI388 +aI-336 +aa(lp1819 +g15 +aI436 +aI-373 +aI414 +aI-351 +aI426 +aI-361 +aa(lp1820 +g15 +aI464 +aI-414 +aI447 +aI-385 +aI456 +aI-399 +aa(lp1821 +g15 +aI483 +aI-462 +aI472 +aI-429 +aI478 +aI-445 +aa(lp1822 +g15 +aI494 +aI-510 +aI488 +aI-478 +aI492 +aI-495 +aa(lp1823 +g15 +aI498 +aI-554 +aI497 +aI-526 +aI498 +aI-541 +aa(lp1824 +g15 +aI480 +aI-622 +aI498 +aI-585 +aI492 +aI-608 +aa(lp1825 +g15 +aI426 +aI-644 +aI467 +aI-637 +aI449 +aI-644 +aa(lp1826 +g15 +aI365 +aI-621 +aI403 +aI-644 +aI383 +aI-637 +aa(lp1827 +g15 +aI322 +aI-565 +aI348 +aI-606 +aI333 +aI-587 +aa(lp1828 +g15 +aI295 +aI-493 +aI310 +aI-542 +aI301 +aI-518 +aa(lp1829 +g15 +aI286 +aI-424 +aI289 +aI-467 +aI286 +aI-445 +aa(lp1830 +g15 +aI305 +aI-354 +aI286 +aI-392 +aI292 +aI-368 +aa(lp1831 +g15 +aI358 +aI-332 +aI317 +aI-340 +aI335 +aI-332 +aa(lp1832 +g10 +aa(lp1833 +g8 +aI773 +aI0 +aa(lp1834 +g10 +aa(lp1835 +g8 +aI773 +aI0 +aasVk +(lp1836 +(lp1837 +g8 +aI285 +aI-265 +aa(lp1838 +g20 +aI227 +aI0 +aa(lp1839 +g20 +aI27 +aI0 +aa(lp1840 +g20 +aI203 +aI-828 +aa(lp1841 +g15 +aI207 +aI-846 +aI205 +aI-834 +aI206 +aI-840 +aa(lp1842 +g15 +aI210 +aI-863 +aI208 +aI-852 +aI210 +aI-858 +aa(lp1843 +g15 +aI212 +aI-877 +aI211 +aI-869 +aI212 +aI-873 +aa(lp1844 +g15 +aI213 +aI-886 +aI213 +aI-881 +aI213 +aI-884 +aa(lp1845 +g15 +aI209 +aI-915 +aI213 +aI-898 +aI212 +aI-908 +aa(lp1846 +g15 +aI197 +aI-932 +aI207 +aI-922 +aI202 +aI-928 +aa(lp1847 +g15 +aI175 +aI-940 +aI191 +aI-936 +aI184 +aI-939 +aa(lp1848 +g15 +aI142 +aI-942 +aI166 +aI-941 +aI155 +aI-942 +aa(lp1849 +g20 +aI114 +aI-942 +aa(lp1850 +g20 +aI126 +aI-1012 +aa(lp1851 +g20 +aI449 +aI-1012 +aa(lp1852 +g20 +aI378 +aI-687 +aa(lp1853 +g15 +aI358 +aI-593 +aI371 +aI-652 +aI364 +aI-621 +aa(lp1854 +g15 +aI340 +aI-515 +aI352 +aI-566 +aI346 +aI-539 +aa(lp1855 +g15 +aI322 +aI-440 +aI334 +aI-490 +aI328 +aI-465 +aa(lp1856 +g15 +aI301 +aI-359 +aI316 +aI-416 +aI309 +aI-389 +aa(lp1857 +g20 +aI509 +aI-547 +aa(lp1858 +g15 +aI535 +aI-573 +aI519 +aI-557 +aI528 +aI-565 +aa(lp1859 +g15 +aI550 +aI-592 +aI541 +aI-580 +aI546 +aI-586 +aa(lp1860 +g15 +aI557 +aI-606 +aI554 +aI-597 +aI556 +aI-602 +aa(lp1861 +g15 +aI559 +aI-618 +aI559 +aI-610 +aI559 +aI-614 +aa(lp1862 +g15 +aI543 +aI-639 +aI559 +aI-627 +aI554 +aI-634 +aa(lp1863 +g15 +aI497 +aI-647 +aI532 +aI-644 +aI517 +aI-647 +aa(lp1864 +g20 +aI510 +aI-714 +aa(lp1865 +g20 +aI846 +aI-714 +aa(lp1866 +g20 +aI833 +aI-647 +aa(lp1867 +g15 +aI736 +aI-620 +aI802 +aI-647 +aI770 +aI-638 +aa(lp1868 +g15 +aI621 +aI-534 +aI702 +aI-602 +aI664 +aI-573 +aa(lp1869 +g20 +aI514 +aI-435 +aa(lp1870 +g20 +aI614 +aI-218 +aa(lp1871 +g15 +aI656 +aI-142 +aI628 +aI-187 +aI642 +aI-161 +aa(lp1872 +g15 +aI694 +aI-97 +aI669 +aI-123 +aI682 +aI-108 +aa(lp1873 +g15 +aI726 +aI-76 +aI705 +aI-87 +aI716 +aI-79 +aa(lp1874 +g15 +aI753 +aI-70 +aI736 +aI-72 +aI745 +aI-70 +aa(lp1875 +g20 +aI758 +aI-70 +aa(lp1876 +g20 +aI744 +aI0 +aa(lp1877 +g20 +aI675 +aI0 +aa(lp1878 +g15 +aI588 +aI-6 +aI643 +aI0 +aI614 +aI-1 +aa(lp1879 +g15 +aI520 +aI-28 +aI562 +aI-10 +aI540 +aI-18 +aa(lp1880 +g15 +aI470 +aI-67 +aI501 +aI-38 +aI484 +aI-51 +aa(lp1881 +g15 +aI436 +aI-125 +aI456 +aI-83 +aI445 +aI-102 +aa(lp1882 +g20 +aI357 +aI-311 +aa(lp1883 +g10 +aa(lp1884 +g8 +aI796 +aI0 +aa(lp1885 +g10 +aa(lp1886 +g8 +aI796 +aI0 +aasVo +(lp1887 +(lp1888 +g8 +aI53 +aI-266 +aa(lp1889 +g15 +aI65 +aI-369 +aI53 +aI-299 +aI57 +aI-334 +aa(lp1890 +g15 +aI100 +aI-474 +aI72 +aI-405 +aI84 +aI-440 +aa(lp1891 +g15 +aI160 +aI-572 +aI116 +aI-509 +aI136 +aI-541 +aa(lp1892 +g15 +aI244 +aI-652 +aI184 +aI-602 +aI212 +aI-629 +aa(lp1893 +g15 +aI354 +aI-707 +aI276 +aI-675 +aI313 +aI-693 +aa(lp1894 +g15 +aI490 +aI-727 +aI395 +aI-720 +aI440 +aI-727 +aa(lp1895 +g15 +aI598 +aI-711 +aI529 +aI-727 +aI565 +aI-722 +aa(lp1896 +g15 +aI687 +aI-661 +aI632 +aI-700 +aI662 +aI-684 +aa(lp1897 +g15 +aI747 +aI-574 +aI712 +aI-639 +aI732 +aI-610 +aa(lp1898 +g15 +aI769 +aI-447 +aI762 +aI-539 +aI769 +aI-496 +aa(lp1899 +g15 +aI758 +aI-346 +aI769 +aI-415 +aI765 +aI-381 +aa(lp1900 +g15 +aI724 +aI-242 +aI751 +aI-311 +aI739 +aI-276 +aa(lp1901 +g15 +aI665 +aI-145 +aI708 +aI-208 +aI689 +aI-176 +aa(lp1902 +g15 +aI582 +aI-63 +aI642 +aI-114 +aI614 +aI-86 +aa(lp1903 +g15 +aI472 +aI-7 +aI549 +aI-39 +aI513 +aI-21 +aa(lp1904 +g15 +aI335 +aI13 +aI431 +aI6 +aI386 +aI13 +aa(lp1905 +g15 +aI221 +aI-3 +aI294 +aI13 +aI256 +aI7 +aa(lp1906 +g15 +aI132 +aI-55 +aI186 +aI-15 +aI156 +aI-32 +aa(lp1907 +g15 +aI74 +aI-143 +aI107 +aI-79 +aI88 +aI-108 +aa(lp1908 +g15 +aI53 +aI-266 +aI60 +aI-178 +aI53 +aI-219 +aa(lp1909 +g10 +aa(lp1910 +g8 +aI360 +aI-82 +aa(lp1911 +g15 +aI424 +aI-102 +aI383 +aI-82 +aI405 +aI-89 +aa(lp1912 +g15 +aI476 +aI-156 +aI444 +aI-116 +aI461 +aI-134 +aa(lp1913 +g15 +aI516 +aI-233 +aI492 +aI-179 +aI505 +aI-204 +aa(lp1914 +g15 +aI544 +aI-321 +aI528 +aI-261 +aI537 +aI-291 +aa(lp1915 +g15 +aI560 +aI-411 +aI551 +aI-352 +aI557 +aI-382 +aa(lp1916 +g15 +aI566 +aI-490 +aI564 +aI-440 +aI566 +aI-466 +aa(lp1917 +g15 +aI539 +aI-603 +aI566 +aI-542 +aI557 +aI-580 +aa(lp1918 +g15 +aI465 +aI-638 +aI521 +aI-626 +aI496 +aI-638 +aa(lp1919 +g15 +aI402 +aI-618 +aI442 +aI-638 +aI422 +aI-631 +aa(lp1920 +g15 +aI351 +aI-566 +aI383 +aI-605 +aI366 +aI-588 +aa(lp1921 +g15 +aI310 +aI-492 +aI335 +aI-544 +aI322 +aI-520 +aa(lp1922 +g15 +aI280 +aI-405 +aI298 +aI-464 +aI288 +aI-435 +aa(lp1923 +g15 +aI263 +aI-315 +aI272 +aI-375 +aI266 +aI-345 +aa(lp1924 +g15 +aI257 +aI-233 +aI259 +aI-285 +aI257 +aI-258 +aa(lp1925 +g15 +aI284 +aI-117 +aI257 +aI-179 +aI266 +aI-140 +aa(lp1926 +g15 +aI360 +aI-82 +aI302 +aI-93 +aI327 +aI-82 +aa(lp1927 +g10 +aa(lp1928 +g8 +aI824 +aI0 +aa(lp1929 +g10 +aa(lp1930 +g8 +aI824 +aI0 +aasVs +(lp1931 +(lp1932 +g8 +aI297 +aI-65 +aa(lp1933 +g15 +aI348 +aI-72 +aI315 +aI-65 +aI332 +aI-68 +aa(lp1934 +g15 +aI388 +aI-92 +aI363 +aI-77 +aI377 +aI-83 +aa(lp1935 +g15 +aI415 +aI-123 +aI399 +aI-100 +aI408 +aI-111 +aa(lp1936 +g15 +aI425 +aI-166 +aI421 +aI-135 +aI425 +aI-150 +aa(lp1937 +g15 +aI416 +aI-206 +aI425 +aI-181 +aI422 +aI-194 +aa(lp1938 +g15 +aI388 +aI-239 +aI410 +aI-218 +aI401 +aI-229 +aa(lp1939 +g15 +aI342 +aI-269 +aI376 +aI-249 +aI361 +aI-259 +aa(lp1940 +g15 +aI274 +aI-303 +aI323 +aI-279 +aI300 +aI-290 +aa(lp1941 +g15 +aI204 +aI-342 +aI248 +aI-315 +aI225 +aI-328 +aa(lp1942 +g15 +aI150 +aI-388 +aI183 +aI-356 +aI165 +aI-371 +aa(lp1943 +g15 +aI116 +aI-445 +aI135 +aI-405 +aI124 +aI-424 +aa(lp1944 +g15 +aI104 +aI-515 +aI108 +aI-466 +aI104 +aI-489 +aa(lp1945 +g15 +aI125 +aI-603 +aI104 +aI-548 +aI111 +aI-577 +aa(lp1946 +g15 +aI184 +aI-670 +aI138 +aI-629 +aI158 +aI-651 +aa(lp1947 +g15 +aI279 +aI-712 +aI210 +aI-688 +aI242 +aI-702 +aa(lp1948 +g15 +aI405 +aI-727 +aI316 +aI-722 +aI358 +aI-727 +aa(lp1949 +g15 +aI519 +aI-716 +aI450 +aI-727 +aI488 +aI-723 +aa(lp1950 +g15 +aI594 +aI-689 +aI550 +aI-710 +aI575 +aI-700 +aa(lp1951 +g15 +aI636 +aI-649 +aI614 +aI-677 +aI627 +aI-664 +aa(lp1952 +g15 +aI649 +aI-602 +aI644 +aI-634 +aI649 +aI-618 +aa(lp1953 +g15 +aI608 +aI-524 +aI649 +aI-566 +aI635 +aI-540 +aa(lp1954 +g15 +aI496 +aI-500 +aI580 +aI-508 +aI543 +aI-500 +aa(lp1955 +g15 +aI490 +aI-554 +aI496 +aI-518 +aI494 +aI-536 +aa(lp1956 +g15 +aI473 +aI-603 +aI487 +aI-572 +aI481 +aI-588 +aa(lp1957 +g15 +aI441 +aI-639 +aI465 +aI-618 +aI454 +aI-630 +aa(lp1958 +g15 +aI393 +aI-653 +aI428 +aI-648 +aI412 +aI-653 +aa(lp1959 +g15 +aI346 +aI-645 +aI375 +aI-653 +aI360 +aI-650 +aa(lp1960 +g15 +aI311 +aI-625 +aI333 +aI-640 +aI321 +aI-633 +aa(lp1961 +g15 +aI289 +aI-595 +aI301 +aI-617 +aI294 +aI-607 +aa(lp1962 +g15 +aI281 +aI-559 +aI283 +aI-584 +aI281 +aI-572 +aa(lp1963 +g15 +aI290 +aI-521 +aI281 +aI-544 +aI284 +aI-531 +aa(lp1964 +g15 +aI317 +aI-490 +aI295 +aI-510 +aI305 +aI-499 +aa(lp1965 +g15 +aI364 +aI-462 +aI329 +aI-480 +aI345 +aI-471 +aa(lp1966 +g15 +aI432 +aI-430 +aI383 +aI-452 +aI406 +aI-442 +aa(lp1967 +g15 +aI506 +aI-389 +aI460 +aI-417 +aI485 +aI-403 +aa(lp1968 +g15 +aI558 +aI-341 +aI527 +aI-374 +aI544 +aI-358 +aa(lp1969 +g15 +aI588 +aI-285 +aI571 +aI-324 +aI582 +aI-305 +aa(lp1970 +g15 +aI598 +aI-218 +aI595 +aI-265 +aI598 +aI-243 +aa(lp1971 +g15 +aI578 +aI-121 +aI598 +aI-182 +aI592 +aI-149 +aa(lp1972 +g15 +aI516 +aI-48 +aI564 +aI-92 +aI544 +aI-68 +aa(lp1973 +g15 +aI415 +aI-2 +aI489 +aI-28 +aI455 +aI-13 +aa(lp1974 +g15 +aI274 +aI13 +aI374 +aI8 +aI328 +aI13 +aa(lp1975 +g15 +aI170 +aI3 +aI236 +aI13 +aI201 +aI10 +aa(lp1976 +g15 +aI91 +aI-24 +aI139 +aI-2 +aI113 +aI-12 +aa(lp1977 +g15 +aI40 +aI-71 +aI69 +aI-37 +aI52 +aI-52 +aa(lp1978 +g15 +aI22 +aI-133 +aI28 +aI-89 +aI22 +aI-110 +aa(lp1979 +g15 +aI35 +aI-185 +aI22 +aI-153 +aI26 +aI-171 +aa(lp1980 +g15 +aI67 +aI-220 +aI43 +aI-200 +aI54 +aI-211 +aa(lp1981 +g15 +aI112 +aI-240 +aI80 +aI-229 +aI95 +aI-235 +aa(lp1982 +g15 +aI165 +aI-246 +aI130 +aI-244 +aI147 +aI-246 +aa(lp1983 +g15 +aI172 +aI-177 +aI165 +aI-222 +aI167 +aI-199 +aa(lp1984 +g15 +aI195 +aI-120 +aI177 +aI-156 +aI184 +aI-137 +aa(lp1985 +g15 +aI236 +aI-80 +aI205 +aI-103 +aI219 +aI-90 +aa(lp1986 +g15 +aI297 +aI-65 +aI252 +aI-70 +aI273 +aI-65 +aa(lp1987 +g10 +aa(lp1988 +g8 +aI685 +aI0 +aa(lp1989 +g10 +aa(lp1990 +g8 +aI685 +aI0 +aasVw +(lp1991 +(lp1992 +g8 +aI1136 +aI-614 +aa(lp1993 +g15 +aI1106 +aI-468 +aI1136 +aI-568 +aI1126 +aI-519 +aa(lp1994 +g15 +aI1028 +aI-311 +aI1087 +aI-417 +aI1061 +aI-364 +aa(lp1995 +g15 +aI916 +aI-152 +aI996 +aI-258 +aI958 +aI-205 +aa(lp1996 +g15 +aI786 +aI0 +aI874 +aI-100 +aI831 +aI-49 +aa(lp1997 +g20 +aI623 +aI13 +aa(lp1998 +g15 +aI622 +aI-75 +aI623 +aI-13 +aI623 +aI-43 +aa(lp1999 +g15 +aI620 +aI-174 +aI622 +aI-107 +aI621 +aI-140 +aa(lp2000 +g15 +aI618 +aI-275 +aI620 +aI-207 +aI619 +aI-241 +aa(lp2001 +g15 +aI616 +aI-372 +aI618 +aI-309 +aI617 +aI-341 +aa(lp2002 +g15 +aI613 +aI-457 +aI615 +aI-403 +aI614 +aI-431 +aa(lp2003 +g15 +aI611 +aI-524 +aI613 +aI-483 +aI612 +aI-506 +aa(lp2004 +g15 +aI492 +aI-268 +aI577 +aI-442 +aI537 +aI-356 +aa(lp2005 +g15 +aI337 +aI-3 +aI448 +aI-179 +aI396 +aI-91 +aa(lp2006 +g20 +aI162 +aI8 +aa(lp2007 +g20 +aI149 +aI-546 +aa(lp2008 +g15 +aI141 +aI-595 +aI148 +aI-566 +aI146 +aI-583 +aa(lp2009 +g15 +aI122 +aI-625 +aI136 +aI-608 +aI130 +aI-618 +aa(lp2010 +g15 +aI93 +aI-639 +aI114 +aI-632 +aI104 +aI-637 +aa(lp2011 +g15 +aI57 +aI-643 +aI82 +aI-642 +aI70 +aI-643 +aa(lp2012 +g20 +aI49 +aI-643 +aa(lp2013 +g20 +aI70 +aI-714 +aa(lp2014 +g20 +aI328 +aI-714 +aa(lp2015 +g15 +aI335 +aI-581 +aI330 +aI-670 +aI333 +aI-625 +aa(lp2016 +g15 +aI340 +aI-458 +aI337 +aI-537 +aI339 +aI-496 +aa(lp2017 +g15 +aI343 +aI-354 +aI341 +aI-419 +aI342 +aI-385 +aa(lp2018 +g15 +aI345 +aI-282 +aI344 +aI-324 +aI345 +aI-299 +aa(lp2019 +g15 +aI344 +aI-200 +aI345 +aI-248 +aI344 +aI-221 +aa(lp2020 +g15 +aI343 +aI-166 +aI343 +aI-179 +aI343 +aI-168 +aa(lp2021 +g20 +aI353 +aI-166 +aa(lp2022 +g15 +aI419 +aI-281 +aI375 +aI-201 +aI397 +aI-239 +aa(lp2023 +g15 +aI485 +aI-412 +aI442 +aI-323 +aI463 +aI-366 +aa(lp2024 +g15 +aI549 +aI-555 +aI507 +aI-458 +aI528 +aI-506 +aa(lp2025 +g15 +aI609 +aI-702 +aI570 +aI-604 +aI590 +aI-652 +aa(lp2026 +g20 +aI772 +aI-707 +aa(lp2027 +g15 +aI779 +aI-625 +aI774 +aI-685 +aI777 +aI-657 +aa(lp2028 +g15 +aI786 +aI-522 +aI782 +aI-593 +aI784 +aI-559 +aa(lp2029 +g15 +aI792 +aI-411 +aI788 +aI-486 +aI790 +aI-449 +aa(lp2030 +g15 +aI797 +aI-302 +aI794 +aI-372 +aI796 +aI-336 +aa(lp2031 +g15 +aI801 +aI-210 +aI799 +aI-268 +aI800 +aI-237 +aa(lp2032 +g15 +aI802 +aI-146 +aI802 +aI-182 +aI802 +aI-161 +aa(lp2033 +g20 +aI811 +aI-146 +aa(lp2034 +g15 +aI908 +aI-276 +aI850 +aI-194 +aI883 +aI-237 +aa(lp2035 +g15 +aI969 +aI-383 +aI934 +aI-315 +aI954 +aI-350 +aa(lp2036 +g15 +aI1001 +aI-470 +aI984 +aI-415 +aI995 +aI-444 +aa(lp2037 +g15 +aI1010 +aI-542 +aI1007 +aI-496 +aI1010 +aI-520 +aa(lp2038 +g15 +aI1004 +aI-577 +aI1010 +aI-555 +aI1008 +aI-567 +aa(lp2039 +g15 +aI989 +aI-604 +aI1000 +aI-588 +aI995 +aI-597 +aa(lp2040 +g15 +aI968 +aI-622 +aI983 +aI-612 +aI976 +aI-618 +aa(lp2041 +g15 +aI944 +aI-633 +aI960 +aI-627 +aI952 +aI-630 +aa(lp2042 +g15 +aI954 +aI-676 +aI945 +aI-649 +aI948 +aI-664 +aa(lp2043 +g15 +aI976 +aI-705 +aI960 +aI-688 +aI967 +aI-698 +aa(lp2044 +g15 +aI1007 +aI-722 +aI985 +aI-713 +aI995 +aI-718 +aa(lp2045 +g15 +aI1042 +aI-727 +aI1018 +aI-725 +aI1030 +aI-727 +aa(lp2046 +g15 +aI1111 +aI-698 +aI1072 +aI-727 +aI1095 +aI-717 +aa(lp2047 +g15 +aI1136 +aI-614 +aI1127 +aI-678 +aI1136 +aI-650 +aa(lp2048 +g10 +aa(lp2049 +g8 +aI1166 +aI0 +aa(lp2050 +g10 +aa(lp2051 +g8 +aI1166 +aI0 +aasV{ +(lp2052 +(lp2053 +g8 +aI317 +aI167 +aa(lp2054 +g15 +aI174 +aI128 +aI253 +aI167 +aI206 +aI154 +aa(lp2055 +g15 +aI126 +aI21 +aI142 +aI103 +aI126 +aI67 +aa(lp2056 +g15 +aI127 +aI8 +aI126 +aI18 +aI127 +aI13 +aa(lp2057 +g15 +aI128 +aI-8 +aI127 +aI4 +aI128 +aI-1 +aa(lp2058 +g15 +aI132 +aI-34 +aI129 +aI-15 +aI131 +aI-24 +aa(lp2059 +g15 +aI139 +aI-71 +aI134 +aI-44 +aI136 +aI-57 +aa(lp2060 +g20 +aI179 +aI-258 +aa(lp2061 +g15 +aI184 +aI-294 +aI182 +aI-270 +aI184 +aI-282 +aa(lp2062 +g15 +aI174 +aI-337 +aI184 +aI-311 +aI180 +aI-326 +aa(lp2063 +g15 +aI146 +aI-364 +aI167 +aI-348 +aI158 +aI-357 +aa(lp2064 +g15 +aI104 +aI-378 +aI134 +aI-371 +aI120 +aI-375 +aa(lp2065 +g15 +aI52 +aI-383 +aI88 +aI-381 +aI70 +aI-382 +aa(lp2066 +g20 +aI69 +aI-465 +aa(lp2067 +g15 +aI131 +aI-471 +aI91 +aI-465 +aI112 +aI-467 +aa(lp2068 +g15 +aI185 +aI-490 +aI151 +aI-474 +aI169 +aI-481 +aa(lp2069 +g15 +aI225 +aI-527 +aI201 +aI-499 +aI214 +aI-512 +aa(lp2070 +g15 +aI250 +aI-588 +aI237 +aI-543 +aI245 +aI-563 +aa(lp2071 +g20 +aI298 +aI-817 +aa(lp2072 +g15 +aI328 +aI-904 +aI305 +aI-851 +aI315 +aI-880 +aa(lp2073 +g15 +aI379 +aI-965 +aI341 +aI-929 +aI358 +aI-949 +aa(lp2074 +g15 +aI457 +aI-1000 +aI400 +aI-981 +aI426 +aI-993 +aa(lp2075 +g15 +aI567 +aI-1012 +aI488 +aI-1008 +aI525 +aI-1012 +aa(lp2076 +g20 +aI694 +aI-1012 +aa(lp2077 +g20 +aI679 +aI-942 +aa(lp2078 +g20 +aI628 +aI-942 +aa(lp2079 +g15 +aI579 +aI-933 +aI609 +aI-942 +aI592 +aI-939 +aa(lp2080 +g15 +aI545 +aI-909 +aI566 +aI-928 +aI555 +aI-919 +aa(lp2081 +g15 +aI522 +aI-868 +aI536 +aI-898 +aI528 +aI-884 +aa(lp2082 +g15 +aI506 +aI-812 +aI516 +aI-852 +aI511 +aI-833 +aa(lp2083 +g20 +aI457 +aI-586 +aa(lp2084 +g15 +aI402 +aI-486 +aI448 +aI-545 +aI430 +aI-512 +aa(lp2085 +g15 +aI278 +aI-430 +aI374 +aI-461 +aI332 +aI-442 +aa(lp2086 +g20 +aI276 +aI-419 +aa(lp2087 +g15 +aI364 +aI-373 +aI316 +aI-408 +aI346 +aI-393 +aa(lp2088 +g15 +aI393 +aI-299 +aI383 +aI-353 +aI393 +aI-329 +aa(lp2089 +g15 +aI389 +aI-261 +aI393 +aI-287 +aI391 +aI-275 +aa(lp2090 +g20 +aI339 +aI-34 +aa(lp2091 +g15 +aI334 +aI-2 +aI337 +aI-22 +aI335 +aI-12 +aa(lp2092 +g15 +aI333 +aI25 +aI333 +aI7 +aI333 +aI17 +aa(lp2093 +g15 +aI350 +aI78 +aI333 +aI48 +aI338 +aI66 +aa(lp2094 +g15 +aI408 +aI96 +aI361 +aI90 +aI380 +aI96 +aa(lp2095 +g20 +aI460 +aI96 +aa(lp2096 +g20 +aI444 +aI167 +aa(lp2097 +g10 +aa(lp2098 +g8 +aI589 +aI0 +aa(lp2099 +g10 +aa(lp2100 +g8 +aI589 +aI0 +aasV" +(lp2101 +(lp2102 +g8 +aI525 +aI-951 +aa(lp2103 +g20 +aI733 +aI-951 +aa(lp2104 +g20 +aI594 +aI-584 +aa(lp2105 +g20 +aI506 +aI-584 +aa(lp2106 +g10 +aa(lp2107 +g8 +aI234 +aI-951 +aa(lp2108 +g20 +aI442 +aI-951 +aa(lp2109 +g20 +aI290 +aI-584 +aa(lp2110 +g20 +aI202 +aI-584 +aa(lp2111 +g10 +aa(lp2112 +g8 +aI677 +aI0 +aa(lp2113 +g10 +aa(lp2114 +g8 +aI677 +aI0 +aasV& +(lp2115 +(lp2116 +g8 +aI722 +aI0 +aa(lp2117 +g20 +aI656 +aI-91 +aa(lp2118 +g15 +aI527 +aI-15 +aI619 +aI-60 +aI576 +aI-34 +aa(lp2119 +g15 +aI357 +aI13 +aI478 +aI3 +aI422 +aI13 +aa(lp2120 +g15 +aI218 +aI-5 +aI303 +aI13 +aI257 +aI7 +aa(lp2121 +g15 +aI121 +aI-58 +aI179 +aI-17 +aI146 +aI-35 +aa(lp2122 +g15 +aI64 +aI-137 +aI95 +aI-80 +aI76 +aI-107 +aa(lp2123 +g15 +aI45 +aI-237 +aI51 +aI-167 +aI45 +aI-201 +aa(lp2124 +g15 +aI69 +aI-350 +aI45 +aI-281 +aI53 +aI-319 +aa(lp2125 +g15 +aI132 +aI-432 +aI84 +aI-382 +aI105 +aI-409 +aa(lp2126 +g15 +aI224 +aI-491 +aI158 +aI-455 +aI189 +aI-475 +aa(lp2127 +g15 +aI335 +aI-537 +aI259 +aI-508 +aI296 +aI-523 +aa(lp2128 +g15 +aI289 +aI-638 +aI315 +aI-572 +aI300 +aI-605 +aa(lp2129 +g15 +aI273 +aI-735 +aI278 +aI-671 +aI273 +aI-703 +aa(lp2130 +g15 +aI293 +aI-835 +aI273 +aI-773 +aI280 +aI-806 +aa(lp2131 +g15 +aI351 +aI-907 +aI307 +aI-864 +aI326 +aI-888 +aa(lp2132 +g15 +aI445 +aI-950 +aI377 +aI-926 +aI408 +aI-940 +aa(lp2133 +g15 +aI572 +aI-965 +aI482 +aI-960 +aI524 +aI-965 +aa(lp2134 +g15 +aI678 +aI-951 +aI613 +aI-965 +aI648 +aI-960 +aa(lp2135 +g15 +aI751 +aI-914 +aI707 +aI-942 +aI732 +aI-930 +aa(lp2136 +g15 +aI795 +aI-859 +aI771 +aI-899 +aI785 +aI-880 +aa(lp2137 +g15 +aI809 +aI-791 +aI804 +aI-838 +aI809 +aI-816 +aa(lp2138 +g15 +aI795 +aI-710 +aI809 +aI-761 +aI804 +aI-734 +aa(lp2139 +g15 +aI750 +aI-646 +aI786 +aI-687 +aI771 +aI-666 +aa(lp2140 +g15 +aI670 +aI-591 +aI730 +aI-627 +aI703 +aI-608 +aa(lp2141 +g15 +aI549 +aI-535 +aI637 +aI-573 +aI597 +aI-554 +aa(lp2142 +g20 +aI713 +aI-319 +aa(lp2143 +g15 +aI752 +aI-418 +aI728 +aI-351 +aI741 +aI-384 +aa(lp2144 +g15 +aI778 +aI-517 +aI763 +aI-451 +aI772 +aI-484 +aa(lp2145 +g20 +aI789 +aI-567 +aa(lp2146 +g20 +aI1055 +aI-567 +aa(lp2147 +g20 +aI1041 +aI-496 +aa(lp2148 +g20 +aI1029 +aI-496 +aa(lp2149 +g15 +aI985 +aI-494 +aI1014 +aI-496 +aI999 +aI-496 +aa(lp2150 +g15 +aI943 +aI-482 +aI970 +aI-492 +aI956 +aI-488 +aa(lp2151 +g15 +aI904 +aI-455 +aI929 +aI-476 +aI916 +aI-466 +aa(lp2152 +g15 +aI870 +aI-407 +aI892 +aI-443 +aI880 +aI-427 +aa(lp2153 +g15 +aI827 +aI-324 +aI856 +aI-381 +aI842 +aI-354 +aa(lp2154 +g15 +aI776 +aI-235 +aI812 +aI-295 +aI795 +aI-265 +aa(lp2155 +g20 +aI860 +aI-125 +aa(lp2156 +g15 +aI910 +aI-84 +aI873 +aI-106 +aI890 +aI-93 +aa(lp2157 +g15 +aI983 +aI-70 +aI930 +aI-75 +aI955 +aI-70 +aa(lp2158 +g20 +aI993 +aI-70 +aa(lp2159 +g20 +aI978 +aI0 +aa(lp2160 +g10 +aa(lp2161 +g8 +aI241 +aI-247 +aa(lp2162 +g15 +aI251 +aI-178 +aI241 +aI-222 +aI245 +aI-199 +aa(lp2163 +g15 +aI282 +aI-124 +aI258 +aI-157 +aI269 +aI-139 +aa(lp2164 +g15 +aI332 +aI-88 +aI296 +aI-109 +aI312 +aI-97 +aa(lp2165 +g15 +aI398 +aI-75 +aI351 +aI-80 +aI373 +aI-75 +aa(lp2166 +g15 +aI512 +aI-99 +aI440 +aI-75 +aI477 +aI-83 +aa(lp2167 +g15 +aI604 +aI-163 +aI546 +aI-115 +aI576 +aI-136 +aa(lp2168 +g20 +aI386 +aI-465 +aa(lp2169 +g15 +aI319 +aI-419 +aI360 +aI-450 +aI337 +aI-435 +aa(lp2170 +g15 +aI274 +aI-369 +aI300 +aI-403 +aI285 +aI-387 +aa(lp2171 +g15 +aI249 +aI-313 +aI262 +aI-352 +aI254 +aI-333 +aa(lp2172 +g15 +aI241 +aI-247 +aI244 +aI-292 +aI241 +aI-271 +aa(lp2173 +g10 +aa(lp2174 +g8 +aI657 +aI-772 +aa(lp2175 +g15 +aI633 +aI-855 +aI657 +aI-808 +aI649 +aI-835 +aa(lp2176 +g15 +aI562 +aI-884 +aI617 +aI-875 +aI594 +aI-884 +aa(lp2177 +g15 +aI518 +aI-875 +aI546 +aI-884 +aI532 +aI-881 +aa(lp2178 +g15 +aI484 +aI-849 +aI505 +aI-869 +aI493 +aI-860 +aa(lp2179 +g15 +aI461 +aI-805 +aI474 +aI-837 +aI466 +aI-822 +aa(lp2180 +g15 +aI453 +aI-746 +aI455 +aI-788 +aI453 +aI-768 +aa(lp2181 +g15 +aI466 +aI-673 +aI453 +aI-720 +aI457 +aI-696 +aa(lp2182 +g15 +aI505 +aI-599 +aI474 +aI-650 +aI487 +aI-625 +aa(lp2183 +g15 +aI575 +aI-634 +aI532 +aI-611 +aI555 +aI-623 +aa(lp2184 +g15 +aI622 +aI-672 +aI594 +aI-646 +aI610 +aI-659 +aa(lp2185 +g15 +aI649 +aI-717 +aI634 +aI-686 +aI643 +aI-701 +aa(lp2186 +g15 +aI657 +aI-772 +aI654 +aI-733 +aI657 +aI-752 +aa(lp2187 +g10 +aa(lp2188 +g8 +aI1067 +aI0 +aa(lp2189 +g10 +aa(lp2190 +g8 +aI1067 +aI0 +aasV* +(lp2191 +(lp2192 +g8 +aI192 +aI-860 +aa(lp2193 +g20 +aI278 +aI-980 +aa(lp2194 +g20 +aI442 +aI-798 +aa(lp2195 +g20 +aI445 +aI-1019 +aa(lp2196 +g20 +aI591 +aI-989 +aa(lp2197 +g20 +aI500 +aI-788 +aa(lp2198 +g20 +aI723 +aI-883 +aa(lp2199 +g20 +aI754 +aI-741 +aa(lp2200 +g20 +aI541 +aI-732 +aa(lp2201 +g20 +aI733 +aI-636 +aa(lp2202 +g20 +aI646 +aI-521 +aa(lp2203 +g20 +aI479 +aI-698 +aa(lp2204 +g20 +aI481 +aI-476 +aa(lp2205 +g20 +aI335 +aI-507 +aa(lp2206 +g20 +aI423 +aI-711 +aa(lp2207 +g20 +aI201 +aI-614 +aa(lp2208 +g20 +aI169 +aI-755 +aa(lp2209 +g20 +aI384 +aI-766 +aa(lp2210 +g10 +aa(lp2211 +g8 +aI824 +aI0 +aa(lp2212 +g10 +aa(lp2213 +g8 +aI824 +aI0 +aasV. +(lp2214 +(lp2215 +g8 +aI282 +aI-108 +aa(lp2216 +g15 +aI272 +aI-52 +aI282 +aI-86 +aI279 +aI-68 +aa(lp2217 +g15 +aI245 +aI-15 +aI265 +aI-37 +aI256 +aI-24 +aa(lp2218 +g15 +aI208 +aI4 +aI234 +aI-6 +aI222 +aI0 +aa(lp2219 +g15 +aI166 +aI10 +aI194 +aI8 +aI180 +aI10 +aa(lp2220 +g15 +aI88 +aI-12 +aI134 +aI10 +aI108 +aI3 +aa(lp2221 +g15 +aI58 +aI-84 +aI68 +aI-28 +aI58 +aI-52 +aa(lp2222 +g15 +aI66 +aI-134 +aI58 +aI-103 +aI61 +aI-119 +aa(lp2223 +g15 +aI90 +aI-172 +aI72 +aI-149 +aI79 +aI-161 +aa(lp2224 +g15 +aI126 +aI-196 +aI100 +aI-182 +aI112 +aI-190 +aa(lp2225 +g15 +aI174 +aI-204 +aI140 +aI-201 +aI156 +aI-204 +aa(lp2226 +g15 +aI217 +aI-198 +aI189 +aI-204 +aI203 +aI-202 +aa(lp2227 +g15 +aI251 +aI-181 +aI230 +aI-194 +aI241 +aI-189 +aa(lp2228 +g15 +aI274 +aI-151 +aI261 +aI-173 +aI268 +aI-163 +aa(lp2229 +g15 +aI282 +aI-108 +aI279 +aI-139 +aI282 +aI-124 +aa(lp2230 +g10 +aa(lp2231 +g8 +aI405 +aI0 +aa(lp2232 +g10 +aa(lp2233 +g8 +aI405 +aI0 +aasV2 +(lp2234 +(lp2235 +g8 +aI-18 +aI0 +aa(lp2236 +g20 +aI9 +aI-136 +aa(lp2237 +g20 +aI320 +aI-399 +aa(lp2238 +g15 +aI431 +aI-504 +aI365 +aI-437 +aI402 +aI-472 +aa(lp2239 +g15 +aI500 +aI-593 +aI460 +aI-535 +aI483 +aI-565 +aa(lp2240 +g15 +aI535 +aI-675 +aI517 +aI-621 +aI529 +aI-648 +aa(lp2241 +g15 +aI545 +aI-756 +aI542 +aI-701 +aI545 +aI-728 +aa(lp2242 +g15 +aI539 +aI-807 +aI545 +aI-774 +aI543 +aI-791 +aa(lp2243 +g15 +aI521 +aI-846 +aI535 +aI-822 +aI529 +aI-835 +aa(lp2244 +g15 +aI491 +aI-872 +aI513 +aI-857 +aI503 +aI-866 +aa(lp2245 +g15 +aI451 +aI-882 +aI479 +aI-879 +aI466 +aI-882 +aa(lp2246 +g15 +aI392 +aI-864 +aI429 +aI-882 +aI410 +aI-876 +aa(lp2247 +g15 +aI348 +aI-816 +aI375 +aI-853 +aI361 +aI-837 +aa(lp2248 +g15 +aI319 +aI-745 +aI336 +aI-796 +aI327 +aI-772 +aa(lp2249 +g15 +aI306 +aI-657 +aI312 +aI-718 +aI308 +aI-688 +aa(lp2250 +g15 +aI245 +aI-663 +aI284 +aI-657 +aI264 +aI-659 +aa(lp2251 +g15 +aI196 +aI-684 +aI226 +aI-668 +aI210 +aI-675 +aa(lp2252 +g15 +aI165 +aI-720 +aI183 +aI-694 +aI172 +aI-706 +aa(lp2253 +g15 +aI153 +aI-771 +aI157 +aI-735 +aI153 +aI-752 +aa(lp2254 +g15 +aI174 +aI-846 +aI153 +aI-798 +aI160 +aI-823 +aa(lp2255 +g15 +aI234 +aI-908 +aI187 +aI-869 +aI207 +aI-890 +aa(lp2256 +g15 +aI331 +aI-949 +aI260 +aI-925 +aI292 +aI-939 +aa(lp2257 +g15 +aI465 +aI-965 +aI370 +aI-959 +aI415 +aI-965 +aa(lp2258 +g15 +aI586 +aI-952 +aI511 +aI-965 +aI551 +aI-960 +aa(lp2259 +g15 +aI675 +aI-915 +aI621 +aI-943 +aI651 +aI-931 +aa(lp2260 +g15 +aI729 +aI-856 +aI699 +aI-899 +aI717 +aI-879 +aa(lp2261 +g15 +aI748 +aI-779 +aI741 +aI-833 +aI748 +aI-808 +aa(lp2262 +g15 +aI729 +aI-692 +aI748 +aI-749 +aI741 +aI-721 +aa(lp2263 +g15 +aI675 +aI-605 +aI717 +aI-664 +aI699 +aI-634 +aa(lp2264 +g15 +aI585 +aI-510 +aI651 +aI-575 +aI621 +aI-543 +aa(lp2265 +g15 +aI460 +aI-403 +aI549 +aI-478 +aI507 +aI-442 +aa(lp2266 +g20 +aI139 +aI-146 +aa(lp2267 +g20 +aI450 +aI-146 +aa(lp2268 +g15 +aI504 +aI-155 +aI471 +aI-146 +aI489 +aI-149 +aa(lp2269 +g15 +aI542 +aI-180 +aI519 +aI-161 +aI532 +aI-170 +aa(lp2270 +g15 +aI569 +aI-215 +aI553 +aI-190 +aI562 +aI-202 +aa(lp2271 +g15 +aI589 +aI-255 +aI576 +aI-228 +aI583 +aI-241 +aa(lp2272 +g20 +aI598 +aI-279 +aa(lp2273 +g20 +aI677 +aI-279 +aa(lp2274 +g20 +aI611 +aI0 +aa(lp2275 +g10 +aa(lp2276 +g8 +aI745 +aI0 +aa(lp2277 +g10 +aa(lp2278 +g8 +aI745 +aI0 +aasV6 +(lp2279 +(lp2280 +g8 +aI539 +aI-886 +aa(lp2281 +g15 +aI389 +aI-794 +aI482 +aI-886 +aI432 +aI-855 +aa(lp2282 +g15 +aI283 +aI-517 +aI346 +aI-733 +aI311 +aI-641 +aa(lp2283 +g15 +aI318 +aI-540 +aI293 +aI-524 +aI305 +aI-532 +aa(lp2284 +g15 +aI362 +aI-561 +aI331 +aI-548 +aI346 +aI-555 +aa(lp2285 +g15 +aI415 +aI-577 +aI378 +aI-568 +aI396 +aI-573 +aa(lp2286 +g15 +aI478 +aI-583 +aI435 +aI-581 +aI455 +aI-583 +aa(lp2287 +g15 +aI579 +aI-564 +aI517 +aI-583 +aI550 +aI-577 +aa(lp2288 +g15 +aI649 +aI-513 +aI607 +aI-552 +aI630 +aI-535 +aa(lp2289 +g15 +aI690 +aI-438 +aI667 +aI-492 +aI681 +aI-466 +aa(lp2290 +g15 +aI703 +aI-347 +aI699 +aI-409 +aI703 +aI-379 +aa(lp2291 +g15 +aI681 +aI-212 +aI703 +aI-300 +aI696 +aI-255 +aa(lp2292 +g15 +aI615 +aI-97 +aI667 +aI-169 +aI645 +aI-130 +aa(lp2293 +g15 +aI503 +aI-16 +aI585 +aI-63 +aI548 +aI-36 +aa(lp2294 +g15 +aI345 +aI13 +aI458 +aI3 +aI405 +aI13 +aa(lp2295 +g15 +aI237 +aI-6 +aI306 +aI13 +aI270 +aI6 +aa(lp2296 +g15 +aI149 +aI-66 +aI203 +aI-19 +aI174 +aI-39 +aa(lp2297 +g15 +aI89 +aI-167 +aI123 +aI-93 +aI104 +aI-127 +aa(lp2298 +g15 +aI67 +aI-308 +aI74 +aI-207 +aI67 +aI-254 +aa(lp2299 +g15 +aI83 +aI-472 +aI67 +aI-364 +aI72 +aI-419 +aa(lp2300 +g15 +aI127 +aI-626 +aI93 +aI-526 +aI108 +aI-577 +aa(lp2301 +g15 +aI200 +aI-761 +aI147 +aI-675 +aI171 +aI-720 +aa(lp2302 +g15 +aI298 +aI-868 +aI229 +aI-802 +aI261 +aI-838 +aa(lp2303 +g15 +aI420 +aI-939 +aI335 +aI-899 +aI375 +aI-922 +aa(lp2304 +g15 +aI563 +aI-965 +aI464 +aI-956 +aI512 +aI-965 +aa(lp2305 +g15 +aI659 +aI-953 +aI600 +aI-965 +aI632 +aI-961 +aa(lp2306 +g15 +aI729 +aI-923 +aI687 +aI-946 +aI710 +aI-936 +aa(lp2307 +g15 +aI771 +aI-879 +aI747 +aI-910 +aI761 +aI-896 +aa(lp2308 +g15 +aI785 +aI-827 +aI780 +aI-863 +aI785 +aI-845 +aa(lp2309 +g15 +aI741 +aI-744 +aI785 +aI-792 +aI770 +aI-764 +aa(lp2310 +g15 +aI618 +aI-714 +aI712 +aI-724 +aI671 +aI-714 +aa(lp2311 +g15 +aI616 +aI-777 +aI618 +aI-736 +aI617 +aI-757 +aa(lp2312 +g15 +aI605 +aI-832 +aI614 +aI-798 +aI611 +aI-816 +aa(lp2313 +g15 +aI582 +aI-871 +aI600 +aI-848 +aI592 +aI-861 +aa(lp2314 +g15 +aI539 +aI-886 +aI571 +aI-881 +aI557 +aI-886 +aa(lp2315 +g10 +aa(lp2316 +g8 +aI417 +aI-502 +aa(lp2317 +g15 +aI374 +aI-495 +aI402 +aI-502 +aI388 +aI-500 +aa(lp2318 +g15 +aI333 +aI-480 +aI360 +aI-491 +aI347 +aI-486 +aa(lp2319 +g15 +aI297 +aI-457 +aI320 +aI-473 +aI308 +aI-466 +aa(lp2320 +g15 +aI266 +aI-433 +aI286 +aI-449 +aI276 +aI-441 +aa(lp2321 +g15 +aI250 +aI-266 +aI256 +aI-368 +aI250 +aI-312 +aa(lp2322 +g15 +aI281 +aI-119 +aI250 +aI-199 +aI260 +aI-150 +aa(lp2323 +g15 +aI363 +aI-73 +aI301 +aI-88 +aI329 +aI-73 +aa(lp2324 +g15 +aI425 +aI-93 +aI386 +aI-73 +aI407 +aI-79 +aa(lp2325 +g15 +aI473 +aI-148 +aI444 +aI-106 +aI460 +aI-125 +aa(lp2326 +g15 +aI505 +aI-232 +aI487 +aI-172 +aI497 +aI-200 +aa(lp2327 +g15 +aI516 +aI-336 +aI512 +aI-264 +aI516 +aI-299 +aa(lp2328 +g15 +aI491 +aI-459 +aI516 +aI-390 +aI507 +aI-431 +aa(lp2329 +g15 +aI417 +aI-502 +aI474 +aI-488 +aI449 +aI-502 +aa(lp2330 +g10 +aa(lp2331 +g8 +aI745 +aI0 +aa(lp2332 +g10 +aa(lp2333 +g8 +aI745 +aI0 +aasV: +(lp2334 +(lp2335 +g8 +aI282 +aI-108 +aa(lp2336 +g15 +aI272 +aI-52 +aI282 +aI-86 +aI279 +aI-68 +aa(lp2337 +g15 +aI245 +aI-15 +aI265 +aI-37 +aI256 +aI-24 +aa(lp2338 +g15 +aI208 +aI4 +aI234 +aI-6 +aI222 +aI0 +aa(lp2339 +g15 +aI166 +aI10 +aI194 +aI8 +aI180 +aI10 +aa(lp2340 +g15 +aI88 +aI-12 +aI134 +aI10 +aI108 +aI3 +aa(lp2341 +g15 +aI58 +aI-84 +aI68 +aI-28 +aI58 +aI-52 +aa(lp2342 +g15 +aI66 +aI-134 +aI58 +aI-103 +aI61 +aI-119 +aa(lp2343 +g15 +aI90 +aI-172 +aI72 +aI-149 +aI79 +aI-161 +aa(lp2344 +g15 +aI126 +aI-196 +aI100 +aI-182 +aI112 +aI-190 +aa(lp2345 +g15 +aI174 +aI-204 +aI140 +aI-201 +aI156 +aI-204 +aa(lp2346 +g15 +aI217 +aI-198 +aI189 +aI-204 +aI203 +aI-202 +aa(lp2347 +g15 +aI251 +aI-181 +aI230 +aI-194 +aI241 +aI-189 +aa(lp2348 +g15 +aI274 +aI-151 +aI261 +aI-173 +aI268 +aI-163 +aa(lp2349 +g15 +aI282 +aI-108 +aI279 +aI-139 +aI282 +aI-124 +aa(lp2350 +g10 +aa(lp2351 +g8 +aI399 +aI-625 +aa(lp2352 +g15 +aI389 +aI-568 +aI399 +aI-602 +aI396 +aI-583 +aa(lp2353 +g15 +aI362 +aI-531 +aI382 +aI-552 +aI374 +aI-540 +aa(lp2354 +g15 +aI325 +aI-510 +aI351 +aI-521 +aI339 +aI-515 +aa(lp2355 +g15 +aI283 +aI-504 +aI311 +aI-506 +aI297 +aI-504 +aa(lp2356 +g15 +aI205 +aI-528 +aI251 +aI-504 +aI225 +aI-512 +aa(lp2357 +g15 +aI175 +aI-601 +aI185 +aI-543 +aI175 +aI-568 +aa(lp2358 +g15 +aI183 +aI-649 +aI175 +aI-618 +aI178 +aI-635 +aa(lp2359 +g15 +aI207 +aI-687 +aI189 +aI-664 +aI197 +aI-677 +aa(lp2360 +g15 +aI244 +aI-712 +aI217 +aI-698 +aI229 +aI-706 +aa(lp2361 +g15 +aI292 +aI-720 +aI258 +aI-717 +aI274 +aI-720 +aa(lp2362 +g15 +aI334 +aI-715 +aI307 +aI-720 +aI321 +aI-718 +aa(lp2363 +g15 +aI369 +aI-697 +aI348 +aI-711 +aI359 +aI-705 +aa(lp2364 +g15 +aI391 +aI-667 +aI378 +aI-689 +aI386 +aI-679 +aa(lp2365 +g15 +aI399 +aI-625 +aI397 +aI-655 +aI399 +aI-641 +aa(lp2366 +g10 +aa(lp2367 +g8 +aI477 +aI0 +aa(lp2368 +g10 +aa(lp2369 +g8 +aI477 +aI0 +aasV> +(lp2370 +(lp2371 +g8 +aI108 +aI-138 +aa(lp2372 +g20 +aI108 +aI-243 +aa(lp2373 +g20 +aI537 +aI-475 +aa(lp2374 +g20 +aI108 +aI-710 +aa(lp2375 +g20 +aI108 +aI-815 +aa(lp2376 +g20 +aI679 +aI-503 +aa(lp2377 +g20 +aI679 +aI-448 +aa(lp2378 +g10 +aa(lp2379 +g8 +aI745 +aI0 +aa(lp2380 +g10 +aa(lp2381 +g8 +aI745 +aI0 +aasVB +(lp2382 +(lp2383 +g8 +aI-16 +aI-70 +aa(lp2384 +g20 +aI1 +aI-70 +aa(lp2385 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp2386 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp2387 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp2388 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp2389 +g20 +aI259 +aI-791 +aa(lp2390 +g15 +aI265 +aI-817 +aI261 +aI-800 +aI263 +aI-809 +aa(lp2391 +g15 +aI268 +aI-835 +aI267 +aI-826 +aI268 +aI-832 +aa(lp2392 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp2393 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp2394 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp2395 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp2396 +g20 +aI154 +aI-881 +aa(lp2397 +g20 +aI169 +aI-951 +aa(lp2398 +g20 +aI582 +aI-951 +aa(lp2399 +g15 +aI816 +aI-900 +aI685 +aI-951 +aI763 +aI-934 +aa(lp2400 +g15 +aI894 +aI-751 +aI868 +aI-867 +aI894 +aI-817 +aa(lp2401 +g15 +aI877 +aI-655 +aI894 +aI-715 +aI888 +aI-682 +aa(lp2402 +g15 +aI832 +aI-583 +aI866 +aI-627 +aI851 +aI-603 +aa(lp2403 +g15 +aI763 +aI-533 +aI812 +aI-563 +aI789 +aI-546 +aa(lp2404 +g15 +aI677 +aI-503 +aI736 +aI-520 +aI707 +aI-510 +aa(lp2405 +g20 +aI675 +aI-498 +aa(lp2406 +g15 +aI741 +aI-476 +aI699 +aI-493 +aI721 +aI-486 +aa(lp2407 +g15 +aI792 +aI-436 +aI761 +aI-465 +aI778 +aI-452 +aa(lp2408 +g15 +aI826 +aI-378 +aI807 +aI-419 +aI818 +aI-400 +aa(lp2409 +g15 +aI838 +aI-303 +aI834 +aI-356 +aI838 +aI-331 +aa(lp2410 +g15 +aI813 +aI-174 +aI838 +aI-254 +aI830 +aI-211 +aa(lp2411 +g15 +aI740 +aI-78 +aI797 +aI-136 +aI773 +aI-104 +aa(lp2412 +g15 +aI620 +aI-19 +aI708 +aI-52 +aI668 +aI-33 +aa(lp2413 +g15 +aI454 +aI0 +aI572 +aI-6 +aI517 +aI0 +aa(lp2414 +g20 +aI-30 +aI0 +aa(lp2415 +g10 +aa(lp2416 +g8 +aI318 +aI-80 +aa(lp2417 +g20 +aI410 +aI-80 +aa(lp2418 +g15 +aI506 +aI-95 +aI448 +aI-80 +aI480 +aI-85 +aa(lp2419 +g15 +aI570 +aI-140 +aI533 +aI-105 +aI554 +aI-120 +aa(lp2420 +g15 +aI607 +aI-212 +aI587 +aI-159 +aI599 +aI-183 +aa(lp2421 +g15 +aI618 +aI-312 +aI614 +aI-241 +aI618 +aI-274 +aa(lp2422 +g15 +aI585 +aI-421 +aI618 +aI-361 +aI607 +aI-397 +aa(lp2423 +g15 +aI482 +aI-456 +aI563 +aI-444 +aI528 +aI-456 +aa(lp2424 +g20 +aI398 +aI-456 +aa(lp2425 +g10 +aa(lp2426 +g8 +aI416 +aI-539 +aa(lp2427 +g20 +aI490 +aI-539 +aa(lp2428 +g15 +aI627 +aI-588 +aI553 +aI-539 +aI599 +aI-555 +aa(lp2429 +g15 +aI669 +aI-728 +aI655 +aI-621 +aI669 +aI-667 +aa(lp2430 +g15 +aI637 +aI-834 +aI669 +aI-776 +aI658 +aI-811 +aa(lp2431 +g15 +aI544 +aI-869 +aI616 +aI-858 +aI585 +aI-869 +aa(lp2432 +g20 +aI485 +aI-869 +aa(lp2433 +g10 +aa(lp2434 +g8 +aI895 +aI0 +aa(lp2435 +g10 +aa(lp2436 +g8 +aI895 +aI0 +aasVF +(lp2437 +(lp2438 +g8 +aI334 +aI-157 +aa(lp2439 +g15 +aI329 +aI-131 +aI332 +aI-147 +aI330 +aI-138 +aa(lp2440 +g15 +aI328 +aI-115 +aI328 +aI-124 +aI328 +aI-118 +aa(lp2441 +g15 +aI335 +aI-92 +aI328 +aI-105 +aI330 +aI-98 +aa(lp2442 +g15 +aI355 +aI-78 +aI340 +aI-86 +aI346 +aI-81 +aa(lp2443 +g15 +aI386 +aI-72 +aI364 +aI-75 +aI374 +aI-73 +aa(lp2444 +g15 +aI425 +aI-70 +aI398 +aI-71 +aI411 +aI-70 +aa(lp2445 +g20 +aI442 +aI-70 +aa(lp2446 +g20 +aI427 +aI0 +aa(lp2447 +g20 +aI-30 +aI0 +aa(lp2448 +g20 +aI-16 +aI-70 +aa(lp2449 +g20 +aI1 +aI-70 +aa(lp2450 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp2451 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp2452 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp2453 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp2454 +g20 +aI259 +aI-789 +aa(lp2455 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp2456 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp2457 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp2458 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp2459 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp2460 +g20 +aI154 +aI-881 +aa(lp2461 +g20 +aI169 +aI-951 +aa(lp2462 +g20 +aI902 +aI-951 +aa(lp2463 +g20 +aI856 +aI-703 +aa(lp2464 +g20 +aI761 +aI-703 +aa(lp2465 +g15 +aI763 +aI-726 +aI761 +aI-710 +aI762 +aI-718 +aa(lp2466 +g15 +aI765 +aI-750 +aI764 +aI-735 +aI765 +aI-742 +aa(lp2467 +g15 +aI767 +aI-770 +aI766 +aI-758 +aI767 +aI-764 +aa(lp2468 +g15 +aI768 +aI-780 +aI768 +aI-775 +aI768 +aI-779 +aa(lp2469 +g15 +aI763 +aI-815 +aI768 +aI-793 +aI766 +aI-805 +aa(lp2470 +g15 +aI746 +aI-844 +aI759 +aI-826 +aI753 +aI-836 +aa(lp2471 +g15 +aI715 +aI-863 +aI738 +aI-852 +aI727 +aI-858 +aa(lp2472 +g15 +aI667 +aI-869 +aI702 +aI-867 +aI686 +aI-869 +aa(lp2473 +g20 +aI486 +aI-869 +aa(lp2474 +g20 +aI409 +aI-506 +aa(lp2475 +g20 +aI725 +aI-506 +aa(lp2476 +g20 +aI709 +aI-427 +aa(lp2477 +g20 +aI393 +aI-427 +aa(lp2478 +g10 +aa(lp2479 +g8 +aI828 +aI0 +aa(lp2480 +g10 +aa(lp2481 +g8 +aI828 +aI0 +aasVJ +(lp2482 +(lp2483 +g8 +aI301 +aI4 +aa(lp2484 +g15 +aI244 +aI145 +aI290 +aI58 +aI271 +aI105 +aa(lp2485 +g15 +aI151 +aI243 +aI218 +aI185 +aI187 +aI217 +aa(lp2486 +g15 +aI31 +aI301 +aI115 +aI269 +aI75 +aI289 +aa(lp2487 +g15 +aI-101 +aI320 +aI-11 +aI314 +aI-55 +aI320 +aa(lp2488 +g15 +aI-161 +aI316 +aI-125 +aI320 +aI-145 +aI319 +aa(lp2489 +g15 +aI-210 +aI305 +aI-178 +aI314 +aI-194 +aI310 +aa(lp2490 +g20 +aI-192 +aI232 +aa(lp2491 +g15 +aI-172 +aI237 +aI-186 +aI234 +aI-180 +aI236 +aa(lp2492 +g15 +aI-150 +aI241 +aI-165 +aI239 +aI-158 +aI240 +aa(lp2493 +g15 +aI-126 +aI243 +aI-142 +aI242 +aI-134 +aI243 +aa(lp2494 +g15 +aI-105 +aI244 +aI-119 +aI244 +aI-111 +aI244 +aa(lp2495 +g15 +aI-41 +aI232 +aI-82 +aI244 +aI-61 +aI240 +aa(lp2496 +g15 +aI12 +aI191 +aI-21 +aI223 +aI-3 +aI210 +aa(lp2497 +g15 +aI56 +aI117 +aI28 +aI172 +aI43 +aI147 +aa(lp2498 +g15 +aI90 +aI4 +aI69 +aI86 +aI80 +aI49 +aa(lp2499 +g20 +aI262 +aI-804 +aa(lp2500 +g15 +aI266 +aI-821 +aI264 +aI-809 +aI265 +aI-815 +aa(lp2501 +g15 +aI268 +aI-835 +aI267 +aI-827 +aI268 +aI-832 +aa(lp2502 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp2503 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp2504 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp2505 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp2506 +g20 +aI154 +aI-881 +aa(lp2507 +g20 +aI169 +aI-951 +aa(lp2508 +g20 +aI629 +aI-951 +aa(lp2509 +g20 +aI614 +aI-881 +aa(lp2510 +g20 +aI597 +aI-881 +aa(lp2511 +g15 +aI555 +aI-878 +aI582 +aI-881 +aI568 +aI-880 +aa(lp2512 +g15 +aI517 +aI-866 +aI541 +aI-876 +aI528 +aI-872 +aa(lp2513 +g15 +aI488 +aI-841 +aI506 +aI-861 +aI496 +aI-852 +aa(lp2514 +g15 +aI470 +aI-799 +aI480 +aI-831 +aI474 +aI-817 +aa(lp2515 +g10 +aa(lp2516 +g8 +aI534 +aI0 +aa(lp2517 +g10 +aa(lp2518 +g8 +aI534 +aI0 +aasVN +(lp2519 +(lp2520 +g8 +aI712 +aI0 +aa(lp2521 +g20 +aI350 +aI-754 +aa(lp2522 +g20 +aI225 +aI-157 +aa(lp2523 +g15 +aI220 +aI-131 +aI223 +aI-147 +aI221 +aI-138 +aa(lp2524 +g15 +aI218 +aI-115 +aI219 +aI-124 +aI218 +aI-118 +aa(lp2525 +g15 +aI225 +aI-92 +aI218 +aI-105 +aI221 +aI-98 +aa(lp2526 +g15 +aI246 +aI-78 +aI230 +aI-86 +aI237 +aI-81 +aa(lp2527 +g15 +aI277 +aI-72 +aI254 +aI-75 +aI265 +aI-73 +aa(lp2528 +g15 +aI315 +aI-70 +aI288 +aI-71 +aI301 +aI-70 +aa(lp2529 +g20 +aI320 +aI-70 +aa(lp2530 +g20 +aI305 +aI0 +aa(lp2531 +g20 +aI-30 +aI0 +aa(lp2532 +g20 +aI-16 +aI-70 +aa(lp2533 +g20 +aI1 +aI-70 +aa(lp2534 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp2535 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp2536 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp2537 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp2538 +g20 +aI259 +aI-789 +aa(lp2539 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp2540 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp2541 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp2542 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp2543 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp2544 +g20 +aI154 +aI-881 +aa(lp2545 +g20 +aI169 +aI-951 +aa(lp2546 +g20 +aI465 +aI-951 +aa(lp2547 +g20 +aI790 +aI-267 +aa(lp2548 +g20 +aI902 +aI-794 +aa(lp2549 +g15 +aI909 +aI-835 +aI907 +aI-814 +aI909 +aI-828 +aa(lp2550 +g15 +aI902 +aI-858 +aI909 +aI-845 +aI907 +aI-852 +aa(lp2551 +g15 +aI881 +aI-872 +aI897 +aI-864 +aI890 +aI-869 +aa(lp2552 +g15 +aI850 +aI-879 +aI872 +aI-876 +aI862 +aI-878 +aa(lp2553 +g15 +aI811 +aI-881 +aI838 +aI-880 +aI825 +aI-881 +aa(lp2554 +g20 +aI807 +aI-881 +aa(lp2555 +g20 +aI822 +aI-951 +aa(lp2556 +g20 +aI1158 +aI-951 +aa(lp2557 +g20 +aI1143 +aI-881 +aa(lp2558 +g20 +aI1126 +aI-881 +aa(lp2559 +g15 +aI1086 +aI-878 +aI1113 +aI-881 +aI1099 +aI-880 +aa(lp2560 +g15 +aI1050 +aI-866 +aI1073 +aI-876 +aI1060 +aI-872 +aa(lp2561 +g15 +aI1021 +aI-842 +aI1039 +aI-861 +aI1029 +aI-853 +aa(lp2562 +g15 +aI1003 +aI-800 +aI1013 +aI-832 +aI1007 +aI-818 +aa(lp2563 +g20 +aI834 +aI0 +aa(lp2564 +g10 +aa(lp2565 +g8 +aI1050 +aI0 +aa(lp2566 +g10 +aa(lp2567 +g8 +aI1050 +aI0 +aasVR +(lp2568 +(lp2569 +g8 +aI404 +aI-490 +aa(lp2570 +g20 +aI486 +aI-490 +aa(lp2571 +g15 +aI566 +aI-502 +aI515 +aI-490 +aI541 +aI-494 +aa(lp2572 +g15 +aI629 +aI-541 +aI590 +aI-511 +aI611 +aI-523 +aa(lp2573 +g15 +aI672 +aI-609 +aI647 +aI-559 +aI662 +aI-581 +aa(lp2574 +g15 +aI688 +aI-711 +aI682 +aI-637 +aI688 +aI-671 +aa(lp2575 +g15 +aI680 +aI-787 +aI688 +aI-741 +aI685 +aI-766 +aa(lp2576 +g15 +aI656 +aI-837 +aI675 +aI-807 +aI667 +aI-824 +aa(lp2577 +g15 +aI615 +aI-864 +aI645 +aI-849 +aI631 +aI-859 +aa(lp2578 +g15 +aI557 +aI-872 +aI598 +aI-869 +aI579 +aI-872 +aa(lp2579 +g20 +aI489 +aI-872 +aa(lp2580 +g10 +aa(lp2581 +g8 +aI597 +aI-951 +aa(lp2582 +g15 +aI835 +aI-896 +aI703 +aI-951 +aI783 +aI-932 +aa(lp2583 +g15 +aI914 +aI-728 +aI888 +aI-859 +aI914 +aI-803 +aa(lp2584 +g15 +aI892 +aI-613 +aI914 +aI-683 +aI907 +aI-645 +aa(lp2585 +g15 +aI836 +aI-533 +aI878 +aI-581 +aI859 +aI-555 +aa(lp2586 +g15 +aI760 +aI-482 +aI814 +aI-512 +aI788 +aI-495 +aa(lp2587 +g15 +aI677 +aI-453 +aI732 +aI-470 +aI704 +aI-460 +aa(lp2588 +g20 +aI769 +aI-205 +aa(lp2589 +g15 +aI796 +aI-142 +aI778 +aI-180 +aI787 +aI-159 +aa(lp2590 +g15 +aI823 +aI-100 +aI804 +aI-124 +aI814 +aI-110 +aa(lp2591 +g15 +aI855 +aI-77 +aI833 +aI-89 +aI844 +aI-81 +aa(lp2592 +g15 +aI895 +aI-70 +aI867 +aI-72 +aI880 +aI-70 +aa(lp2593 +g20 +aI901 +aI-70 +aa(lp2594 +g20 +aI886 +aI0 +aa(lp2595 +g20 +aI873 +aI0 +aa(lp2596 +g15 +aI752 +aI-5 +aI826 +aI0 +aI786 +aI-1 +aa(lp2597 +g15 +aI664 +aI-27 +aI718 +aI-9 +aI689 +aI-16 +aa(lp2598 +g15 +aI604 +aI-74 +aI640 +aI-38 +aI620 +aI-54 +aa(lp2599 +g15 +aI565 +aI-151 +aI588 +aI-93 +aI575 +aI-119 +aa(lp2600 +g20 +aI481 +aI-412 +aa(lp2601 +g20 +aI389 +aI-412 +aa(lp2602 +g20 +aI337 +aI-168 +aa(lp2603 +g15 +aI330 +aI-132 +aI333 +aI-152 +aI331 +aI-140 +aa(lp2604 +g15 +aI328 +aI-115 +aI328 +aI-124 +aI328 +aI-118 +aa(lp2605 +g15 +aI335 +aI-92 +aI328 +aI-105 +aI330 +aI-98 +aa(lp2606 +g15 +aI355 +aI-78 +aI340 +aI-86 +aI346 +aI-81 +aa(lp2607 +g15 +aI386 +aI-72 +aI364 +aI-75 +aI374 +aI-73 +aa(lp2608 +g15 +aI425 +aI-70 +aI398 +aI-71 +aI411 +aI-70 +aa(lp2609 +g20 +aI469 +aI-70 +aa(lp2610 +g20 +aI454 +aI0 +aa(lp2611 +g20 +aI-30 +aI0 +aa(lp2612 +g20 +aI-16 +aI-70 +aa(lp2613 +g20 +aI1 +aI-70 +aa(lp2614 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp2615 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp2616 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp2617 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp2618 +g20 +aI259 +aI-789 +aa(lp2619 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp2620 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp2621 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp2622 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp2623 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp2624 +g20 +aI154 +aI-881 +aa(lp2625 +g20 +aI169 +aI-951 +aa(lp2626 +g10 +aa(lp2627 +g8 +aI942 +aI0 +aa(lp2628 +g10 +aa(lp2629 +g8 +aI942 +aI0 +aasVV +(lp2630 +(lp2631 +g8 +aI429 +aI-827 +aa(lp2632 +g15 +aI430 +aI-803 +aI429 +aI-820 +aI429 +aI-812 +aa(lp2633 +g15 +aI432 +aI-782 +aI430 +aI-795 +aI431 +aI-788 +aa(lp2634 +g20 +aI474 +aI-430 +aa(lp2635 +g15 +aI479 +aI-376 +aI476 +aI-414 +aI477 +aI-396 +aa(lp2636 +g15 +aI482 +aI-313 +aI481 +aI-355 +aI482 +aI-334 +aa(lp2637 +g15 +aI484 +aI-253 +aI483 +aI-292 +aI483 +aI-272 +aa(lp2638 +g15 +aI485 +aI-207 +aI484 +aI-234 +aI485 +aI-219 +aa(lp2639 +g15 +aI501 +aI-245 +aI490 +aI-219 +aI495 +aI-232 +aa(lp2640 +g15 +aI518 +aI-284 +aI507 +aI-259 +aI513 +aI-272 +aa(lp2641 +g15 +aI533 +aI-319 +aI523 +aI-297 +aI529 +aI-309 +aa(lp2642 +g15 +aI546 +aI-345 +aI538 +aI-330 +aI542 +aI-339 +aa(lp2643 +g20 +aI786 +aI-776 +aa(lp2644 +g15 +aI805 +aI-816 +aI795 +aI-792 +aI801 +aI-805 +aa(lp2645 +g15 +aI810 +aI-847 +aI808 +aI-827 +aI810 +aI-838 +aa(lp2646 +g15 +aI791 +aI-874 +aI810 +aI-860 +aI804 +aI-869 +aa(lp2647 +g15 +aI733 +aI-881 +aI777 +aI-878 +aI758 +aI-881 +aa(lp2648 +g20 +aI702 +aI-881 +aa(lp2649 +g20 +aI716 +aI-951 +aa(lp2650 +g20 +aI1063 +aI-951 +aa(lp2651 +g20 +aI1049 +aI-881 +aa(lp2652 +g20 +aI1017 +aI-881 +aa(lp2653 +g15 +aI984 +aI-877 +aI1004 +aI-881 +aI993 +aI-879 +aa(lp2654 +g15 +aI957 +aI-865 +aI974 +aI-875 +aI965 +aI-871 +aa(lp2655 +g15 +aI932 +aI-838 +aI949 +aI-858 +aI941 +aI-849 +aa(lp2656 +g15 +aI904 +aI-791 +aI924 +aI-826 +aI915 +aI-810 +aa(lp2657 +g20 +aI460 +aI0 +aa(lp2658 +g20 +aI326 +aI0 +aa(lp2659 +g20 +aI214 +aI-816 +aa(lp2660 +g15 +aI204 +aI-849 +aI212 +aI-830 +aI209 +aI-841 +aa(lp2661 +g15 +aI185 +aI-869 +aI199 +aI-857 +aI193 +aI-864 +aa(lp2662 +g15 +aI161 +aI-878 +aI178 +aI-874 +aI170 +aI-877 +aa(lp2663 +g15 +aI130 +aI-881 +aI151 +aI-880 +aI141 +aI-881 +aa(lp2664 +g20 +aI113 +aI-881 +aa(lp2665 +g20 +aI128 +aI-951 +aa(lp2666 +g20 +aI567 +aI-951 +aa(lp2667 +g20 +aI553 +aI-881 +aa(lp2668 +g20 +aI522 +aI-881 +aa(lp2669 +g15 +aI454 +aI-870 +aI494 +aI-881 +aI471 +aI-877 +aa(lp2670 +g15 +aI429 +aI-827 +aI437 +aI-863 +aI429 +aI-848 +aa(lp2671 +g10 +aa(lp2672 +g8 +aI930 +aI0 +aa(lp2673 +g10 +aa(lp2674 +g8 +aI930 +aI0 +aasVZ +(lp2675 +(lp2676 +g8 +aI926 +aI-883 +aa(lp2677 +g20 +aI268 +aI-80 +aa(lp2678 +g20 +aI542 +aI-80 +aa(lp2679 +g15 +aI599 +aI-88 +aI562 +aI-80 +aI581 +aI-83 +aa(lp2680 +g15 +aI648 +aI-113 +aI617 +aI-93 +aI633 +aI-102 +aa(lp2681 +g15 +aI688 +aI-158 +aI663 +aI-124 +aI676 +aI-139 +aa(lp2682 +g15 +aI717 +aI-226 +aI699 +aI-176 +aI709 +aI-199 +aa(lp2683 +g20 +aI731 +aI-274 +aa(lp2684 +g20 +aI828 +aI-274 +aa(lp2685 +g20 +aI764 +aI0 +aa(lp2686 +g20 +aI-2 +aI0 +aa(lp2687 +g20 +aI9 +aI-65 +aa(lp2688 +g20 +aI666 +aI-869 +aa(lp2689 +g20 +aI434 +aI-869 +aa(lp2690 +g15 +aI337 +aI-842 +aI394 +aI-869 +aI362 +aI-860 +aa(lp2691 +g15 +aI283 +aI-754 +aI313 +aI-824 +aI295 +aI-794 +aa(lp2692 +g20 +aI261 +aI-676 +aa(lp2693 +g20 +aI165 +aI-676 +aa(lp2694 +g20 +aI230 +aI-951 +aa(lp2695 +g20 +aI940 +aI-951 +aa(lp2696 +g10 +aa(lp2697 +g8 +aI888 +aI0 +aa(lp2698 +g10 +aa(lp2699 +g8 +aI888 +aI0 +aasV^ +(lp2700 +(lp2701 +g8 +aI370 +aI-951 +aa(lp2702 +g20 +aI427 +aI-951 +aa(lp2703 +g20 +aI710 +aI-349 +aa(lp2704 +g20 +aI606 +aI-349 +aa(lp2705 +g20 +aI398 +aI-806 +aa(lp2706 +g20 +aI193 +aI-349 +aa(lp2707 +g20 +aI89 +aI-349 +aa(lp2708 +g10 +aa(lp2709 +g8 +aI745 +aI0 +aa(lp2710 +g10 +aa(lp2711 +g8 +aI745 +aI0 +aasVb +(lp2712 +(lp2713 +g8 +aI205 +aI-828 +aa(lp2714 +g15 +aI208 +aI-846 +aI206 +aI-834 +aI207 +aI-840 +aa(lp2715 +g15 +aI212 +aI-863 +aI210 +aI-852 +aI211 +aI-858 +aa(lp2716 +g15 +aI214 +aI-877 +aI213 +aI-869 +aI213 +aI-873 +aa(lp2717 +g15 +aI214 +aI-886 +aI214 +aI-881 +aI214 +aI-884 +aa(lp2718 +g15 +aI210 +aI-915 +aI214 +aI-898 +aI213 +aI-908 +aa(lp2719 +g15 +aI198 +aI-932 +aI208 +aI-922 +aI204 +aI-928 +aa(lp2720 +g15 +aI176 +aI-940 +aI192 +aI-936 +aI185 +aI-939 +aa(lp2721 +g15 +aI143 +aI-942 +aI167 +aI-941 +aI156 +aI-942 +aa(lp2722 +g20 +aI113 +aI-942 +aa(lp2723 +g20 +aI125 +aI-1012 +aa(lp2724 +g20 +aI449 +aI-1012 +aa(lp2725 +g20 +aI395 +aI-759 +aa(lp2726 +g15 +aI387 +aI-728 +aI394 +aI-751 +aI391 +aI-740 +aa(lp2727 +g15 +aI375 +aI-687 +aI384 +aI-715 +aI379 +aI-701 +aa(lp2728 +g15 +aI360 +aI-641 +aI370 +aI-672 +aI365 +aI-657 +aa(lp2729 +g15 +aI345 +aI-597 +aI354 +aI-626 +aI349 +aI-611 +aa(lp2730 +g15 +aI332 +aI-560 +aI340 +aI-583 +aI335 +aI-571 +aa(lp2731 +g15 +aI322 +aI-534 +aI328 +aI-548 +aI325 +aI-540 +aa(lp2732 +g20 +aI329 +aI-534 +aa(lp2733 +g15 +aI379 +aI-619 +aI345 +aI-566 +aI362 +aI-594 +aa(lp2734 +g15 +aI436 +aI-679 +aI396 +aI-643 +aI415 +aI-663 +aa(lp2735 +g15 +aI502 +aI-715 +aI456 +aI-695 +aI478 +aI-707 +aa(lp2736 +g15 +aI582 +aI-727 +aI526 +aI-723 +aI553 +aI-727 +aa(lp2737 +g15 +aI660 +aI-711 +aI610 +aI-727 +aI636 +aI-722 +aa(lp2738 +g15 +aI722 +aI-665 +aI684 +aI-701 +aI705 +aI-686 +aa(lp2739 +g15 +aI762 +aI-590 +aI739 +aI-645 +aI752 +aI-620 +aa(lp2740 +g15 +aI777 +aI-486 +aI772 +aI-560 +aI777 +aI-525 +aa(lp2741 +g15 +aI764 +aI-374 +aI777 +aI-450 +aI773 +aI-413 +aa(lp2742 +g15 +aI725 +aI-260 +aI755 +aI-335 +aI742 +aI-298 +aa(lp2743 +g15 +aI663 +aI-155 +aI708 +aI-223 +aI688 +aI-188 +aa(lp2744 +g15 +aI579 +aI-68 +aI639 +aI-122 +aI611 +aI-93 +aa(lp2745 +g15 +aI473 +aI-8 +aI547 +aI-43 +aI511 +aI-23 +aa(lp2746 +g15 +aI348 +aI13 +aI434 +aI6 +aI393 +aI13 +aa(lp2747 +g15 +aI295 +aI9 +aI330 +aI13 +aI312 +aI12 +aa(lp2748 +g15 +aI248 +aI0 +aI278 +aI6 +aI262 +aI3 +aa(lp2749 +g15 +aI208 +aI-15 +aI233 +aI-5 +aI220 +aI-10 +aa(lp2750 +g15 +aI178 +aI-34 +aI196 +aI-21 +aI186 +aI-27 +aa(lp2751 +g20 +aI102 +aI4 +aa(lp2752 +g20 +aI27 +aI4 +aa(lp2753 +g10 +aa(lp2754 +g8 +aI574 +aI-476 +aa(lp2755 +g15 +aI569 +aI-543 +aI574 +aI-503 +aI573 +aI-525 +aa(lp2756 +g15 +aI554 +aI-588 +aI565 +aI-562 +aI560 +aI-576 +aa(lp2757 +g15 +aI531 +aI-612 +aI547 +aI-599 +aI539 +aI-607 +aa(lp2758 +g15 +aI503 +aI-620 +aI522 +aI-618 +aI513 +aI-620 +aa(lp2759 +g15 +aI456 +aI-605 +aI487 +aI-620 +aI471 +aI-615 +aa(lp2760 +g15 +aI413 +aI-567 +aI441 +aI-596 +aI426 +aI-583 +aa(lp2761 +g15 +aI375 +aI-515 +aI399 +aI-552 +aI386 +aI-534 +aa(lp2762 +g15 +aI344 +aI-457 +aI363 +aI-496 +aI353 +aI-476 +aa(lp2763 +g15 +aI322 +aI-402 +aI335 +aI-438 +aI328 +aI-420 +aa(lp2764 +g15 +aI309 +aI-360 +aI316 +aI-385 +aI311 +aI-371 +aa(lp2765 +g20 +aI254 +aI-108 +aa(lp2766 +g15 +aI291 +aI-82 +aI264 +aI-98 +aI276 +aI-89 +aa(lp2767 +g15 +aI341 +aI-71 +aI305 +aI-75 +aI322 +aI-71 +aa(lp2768 +g15 +aI412 +aI-92 +aI367 +aI-71 +aI391 +aI-78 +aa(lp2769 +g15 +aI471 +aI-146 +aI434 +aI-105 +aI453 +aI-124 +aa(lp2770 +g15 +aI516 +aI-222 +aI488 +aI-168 +aI503 +aI-194 +aa(lp2771 +g15 +aI548 +aI-310 +aI529 +aI-251 +aI540 +aI-280 +aa(lp2772 +g15 +aI568 +aI-398 +aI557 +aI-340 +aI564 +aI-370 +aa(lp2773 +g15 +aI574 +aI-476 +aI572 +aI-427 +aI574 +aI-453 +aa(lp2774 +g10 +aa(lp2775 +g8 +aI830 +aI0 +aa(lp2776 +g10 +aa(lp2777 +g8 +aI830 +aI0 +aasVf +(lp2778 +(lp2779 +g8 +aI566 +aI-623 +aa(lp2780 +g20 +aI397 +aI-623 +aa(lp2781 +g20 +aI270 +aI-27 +aa(lp2782 +g15 +aI232 +aI96 +aI260 +aI19 +aI247 +aI61 +aa(lp2783 +g15 +aI178 +aI188 +aI216 +aI132 +aI198 +aI163 +aa(lp2784 +g15 +aI114 +aI253 +aI158 +aI214 +aI137 +aI236 +aa(lp2785 +g15 +aI43 +aI293 +aI91 +aI269 +aI67 +aI283 +aa(lp2786 +g15 +aI-30 +aI314 +aI19 +aI303 +aI-5 +aI310 +aa(lp2787 +g15 +aI-104 +aI320 +aI-55 +aI318 +aI-80 +aI320 +aa(lp2788 +g15 +aI-125 +aI319 +aI-110 +aI320 +aI-117 +aI320 +aa(lp2789 +g15 +aI-148 +aI317 +aI-133 +aI319 +aI-141 +aI318 +aa(lp2790 +g15 +aI-169 +aI313 +aI-155 +aI316 +aI-162 +aI314 +aa(lp2791 +g15 +aI-185 +aI309 +aI-175 +aI312 +aI-181 +aI311 +aa(lp2792 +g20 +aI-169 +aI232 +aa(lp2793 +g15 +aI-140 +aI238 +aI-161 +aI234 +aI-152 +aI236 +aa(lp2794 +g15 +aI-108 +aI241 +aI-128 +aI240 +aI-118 +aI241 +aa(lp2795 +g15 +aI-50 +aI230 +aI-86 +aI241 +aI-67 +aI238 +aa(lp2796 +g15 +aI-5 +aI193 +aI-33 +aI223 +aI-18 +aI211 +aa(lp2797 +g15 +aI30 +aI122 +aI7 +aI175 +aI19 +aI152 +aa(lp2798 +g15 +aI59 +aI12 +aI40 +aI93 +aI50 +aI56 +aa(lp2799 +g20 +aI194 +aI-623 +aa(lp2800 +g20 +aI73 +aI-623 +aa(lp2801 +g20 +aI86 +aI-686 +aa(lp2802 +g20 +aI214 +aI-714 +aa(lp2803 +g20 +aI225 +aI-763 +aa(lp2804 +g15 +aI266 +aI-878 +aI235 +aI-807 +aI249 +aI-846 +aa(lp2805 +g15 +aI331 +aI-960 +aI284 +aI-911 +aI305 +aI-938 +aa(lp2806 +g15 +aI421 +aI-1009 +aI356 +aI-982 +aI387 +aI-999 +aa(lp2807 +g15 +aI541 +aI-1026 +aI456 +aI-1020 +aI495 +aI-1026 +aa(lp2808 +g15 +aI631 +aI-1017 +aI575 +aI-1026 +aI605 +aI-1023 +aa(lp2809 +g15 +aI697 +aI-992 +aI658 +aI-1011 +aI680 +aI-1002 +aa(lp2810 +g15 +aI737 +aI-955 +aI715 +aI-981 +aI728 +aI-969 +aa(lp2811 +g15 +aI750 +aI-910 +aI746 +aI-941 +aI750 +aI-926 +aa(lp2812 +g15 +aI711 +aI-841 +aI750 +aI-880 +aI737 +aI-857 +aa(lp2813 +g15 +aI597 +aI-816 +aI685 +aI-824 +aI647 +aI-816 +aa(lp2814 +g15 +aI594 +aI-865 +aI597 +aI-833 +aI596 +aI-849 +aa(lp2815 +g15 +aI584 +aI-907 +aI592 +aI-881 +aI589 +aI-895 +aa(lp2816 +g15 +aI565 +aI-936 +aI579 +aI-919 +aI573 +aI-929 +aa(lp2817 +g15 +aI535 +aI-947 +aI557 +aI-943 +aI547 +aI-947 +aa(lp2818 +g15 +aI471 +aI-911 +aI507 +aI-947 +aI486 +aI-935 +aa(lp2819 +g15 +aI434 +aI-799 +aI456 +aI-886 +aI444 +aI-849 +aa(lp2820 +g20 +aI417 +aI-714 +aa(lp2821 +g20 +aI585 +aI-714 +aa(lp2822 +g10 +aa(lp2823 +g8 +aI538 +aI0 +aa(lp2824 +g10 +aa(lp2825 +g8 +aI538 +aI0 +aasVj +(lp2826 +(lp2827 +g8 +aI311 +aI-834 +aa(lp2828 +g15 +aI270 +aI-839 +aI297 +aI-834 +aI283 +aI-835 +aa(lp2829 +g15 +aI237 +aI-854 +aI258 +aI-842 +aI247 +aI-847 +aa(lp2830 +g15 +aI215 +aI-880 +aI228 +aI-861 +aI221 +aI-869 +aa(lp2831 +g15 +aI207 +aI-916 +aI210 +aI-890 +aI207 +aI-902 +aa(lp2832 +g15 +aI217 +aI-966 +aI207 +aI-936 +aI211 +aI-952 +aa(lp2833 +g15 +aI244 +aI-1000 +aI224 +aI-980 +aI233 +aI-991 +aa(lp2834 +g15 +aI284 +aI-1020 +aI256 +aI-1009 +aI269 +aI-1015 +aa(lp2835 +g15 +aI332 +aI-1026 +aI299 +aI-1024 +aI315 +aI-1026 +aa(lp2836 +g15 +aI372 +aI-1021 +aI346 +aI-1026 +aI359 +aI-1024 +aa(lp2837 +g15 +aI406 +aI-1006 +aI385 +aI-1018 +aI396 +aI-1013 +aa(lp2838 +g15 +aI430 +aI-980 +aI416 +aI-999 +aI424 +aI-990 +aa(lp2839 +g15 +aI438 +aI-942 +aI435 +aI-969 +aI438 +aI-957 +aa(lp2840 +g15 +aI428 +aI-894 +aI438 +aI-924 +aI435 +aI-908 +aa(lp2841 +g15 +aI399 +aI-860 +aI420 +aI-880 +aI411 +aI-869 +aa(lp2842 +g15 +aI358 +aI-840 +aI387 +aI-851 +aI373 +aI-845 +aa(lp2843 +g15 +aI311 +aI-834 +aI343 +aI-836 +aI327 +aI-834 +aa(lp2844 +g10 +aa(lp2845 +g8 +aI404 +aI-714 +aa(lp2846 +g20 +aI249 +aI10 +aa(lp2847 +g15 +aI200 +aI159 +aI237 +aI70 +aI220 +aI119 +aa(lp2848 +g15 +aI129 +aI255 +aI180 +aI199 +aI156 +aI231 +aa(lp2849 +g15 +aI42 +aI305 +aI103 +aI278 +aI74 +aI295 +aa(lp2850 +g15 +aI-54 +aI320 +aI11 +aI315 +aI-20 +aI320 +aa(lp2851 +g15 +aI-127 +aI316 +aI-82 +aI320 +aI-107 +aI319 +aa(lp2852 +g15 +aI-186 +aI304 +aI-148 +aI313 +aI-167 +aI309 +aa(lp2853 +g20 +aI-170 +aI234 +aa(lp2854 +g15 +aI-142 +aI241 +aI-164 +aI236 +aI-154 +aI239 +aa(lp2855 +g15 +aI-110 +aI244 +aI-130 +aI243 +aI-120 +aI244 +aa(lp2856 +g15 +aI-56 +aI233 +aI-89 +aI244 +aI-71 +aI240 +aa(lp2857 +g15 +aI-14 +aI194 +aI-40 +aI225 +aI-27 +aI212 +aa(lp2858 +g15 +aI17 +aI122 +aI-2 +aI176 +aI8 +aI152 +aa(lp2859 +g15 +aI46 +aI10 +aI27 +aI92 +aI37 +aI55 +aa(lp2860 +g20 +aI161 +aI-530 +aa(lp2861 +g15 +aI165 +aI-547 +aI162 +aI-535 +aI163 +aI-541 +aa(lp2862 +g15 +aI167 +aI-564 +aI166 +aI-553 +aI167 +aI-559 +aa(lp2863 +g15 +aI169 +aI-578 +aI168 +aI-570 +aI169 +aI-575 +aa(lp2864 +g15 +aI170 +aI-587 +aI170 +aI-582 +aI170 +aI-585 +aa(lp2865 +g15 +aI166 +aI-616 +aI170 +aI-599 +aI169 +aI-609 +aa(lp2866 +g15 +aI154 +aI-633 +aI164 +aI-624 +aI159 +aI-629 +aa(lp2867 +g15 +aI132 +aI-641 +aI148 +aI-637 +aI141 +aI-640 +aa(lp2868 +g15 +aI100 +aI-643 +aI123 +aI-642 +aI112 +aI-643 +aa(lp2869 +g20 +aI76 +aI-643 +aa(lp2870 +g20 +aI87 +aI-714 +aa(lp2871 +g10 +aa(lp2872 +g8 +aI450 +aI0 +aa(lp2873 +g10 +aa(lp2874 +g8 +aI450 +aI0 +aasVn +(lp2875 +(lp2876 +g8 +aI511 +aI-123 +aa(lp2877 +g15 +aI533 +aI-282 +aI511 +aI-161 +aI518 +aI-214 +aa(lp2878 +g20 +aI554 +aI-387 +aa(lp2879 +g15 +aI561 +aI-419 +aI556 +aI-396 +aI558 +aI-406 +aa(lp2880 +g15 +aI569 +aI-458 +aI563 +aI-432 +aI566 +aI-445 +aa(lp2881 +g15 +aI575 +aI-499 +aI571 +aI-472 +aI573 +aI-486 +aa(lp2882 +g15 +aI578 +aI-536 +aI577 +aI-513 +aI578 +aI-525 +aa(lp2883 +g15 +aI576 +aI-562 +aI578 +aI-544 +aI578 +aI-553 +aa(lp2884 +g15 +aI568 +aI-587 +aI574 +aI-571 +aI572 +aI-580 +aa(lp2885 +g15 +aI551 +aI-605 +aI563 +aI-594 +aI558 +aI-600 +aa(lp2886 +g15 +aI522 +aI-612 +aI543 +aI-610 +aI534 +aI-612 +aa(lp2887 +g15 +aI477 +aI-597 +aI507 +aI-612 +aI492 +aI-607 +aa(lp2888 +g15 +aI434 +aI-557 +aI462 +aI-587 +aI448 +aI-573 +aa(lp2889 +g15 +aI394 +aI-499 +aI420 +aI-540 +aI407 +aI-521 +aa(lp2890 +g15 +aI360 +aI-433 +aI381 +aI-478 +aI370 +aI-456 +aa(lp2891 +g15 +aI333 +aI-367 +aI350 +aI-411 +aI341 +aI-389 +aa(lp2892 +g15 +aI317 +aI-308 +aI326 +aI-345 +aI320 +aI-326 +aa(lp2893 +g20 +aI249 +aI0 +aa(lp2894 +g20 +aI49 +aI0 +aa(lp2895 +g20 +aI161 +aI-530 +aa(lp2896 +g15 +aI165 +aI-547 +aI162 +aI-535 +aI163 +aI-541 +aa(lp2897 +g15 +aI167 +aI-564 +aI166 +aI-553 +aI167 +aI-559 +aa(lp2898 +g15 +aI169 +aI-578 +aI168 +aI-570 +aI169 +aI-575 +aa(lp2899 +g15 +aI170 +aI-587 +aI170 +aI-582 +aI170 +aI-585 +aa(lp2900 +g15 +aI166 +aI-616 +aI170 +aI-599 +aI169 +aI-609 +aa(lp2901 +g15 +aI154 +aI-633 +aI164 +aI-624 +aI159 +aI-629 +aa(lp2902 +g15 +aI132 +aI-641 +aI148 +aI-637 +aI141 +aI-640 +aa(lp2903 +g15 +aI100 +aI-643 +aI123 +aI-642 +aI112 +aI-643 +aa(lp2904 +g20 +aI76 +aI-643 +aa(lp2905 +g20 +aI87 +aI-714 +aa(lp2906 +g20 +aI384 +aI-714 +aa(lp2907 +g20 +aI369 +aI-571 +aa(lp2908 +g20 +aI377 +aI-571 +aa(lp2909 +g15 +aI430 +aI-640 +aI394 +aI-598 +aI412 +aI-621 +aa(lp2910 +g15 +aI488 +aI-689 +aI448 +aI-660 +aI467 +aI-676 +aa(lp2911 +g15 +aI556 +aI-717 +aI509 +aI-702 +aI531 +aI-711 +aa(lp2912 +g15 +aI637 +aI-727 +aI580 +aI-724 +aI607 +aI-727 +aa(lp2913 +g15 +aI708 +aI-715 +aI665 +aI-727 +aI689 +aI-723 +aa(lp2914 +g15 +aI755 +aI-681 +aI727 +aI-706 +aI743 +aI-695 +aa(lp2915 +g15 +aI781 +aI-632 +aI767 +aI-667 +aI776 +aI-651 +aa(lp2916 +g15 +aI789 +aI-574 +aI786 +aI-614 +aI789 +aI-594 +aa(lp2917 +g15 +aI786 +aI-538 +aI789 +aI-563 +aI788 +aI-551 +aa(lp2918 +g15 +aI780 +aI-499 +aI785 +aI-525 +aI783 +aI-512 +aa(lp2919 +g15 +aI773 +aI-460 +aI778 +aI-486 +aI775 +aI-473 +aa(lp2920 +g15 +aI765 +aI-423 +aI770 +aI-447 +aI767 +aI-435 +aa(lp2921 +g20 +aI735 +aI-280 +aa(lp2922 +g15 +aI722 +aI-212 +aI730 +aI-256 +aI726 +aI-233 +aa(lp2923 +g15 +aI717 +aI-153 +aI719 +aI-191 +aI717 +aI-171 +aa(lp2924 +g15 +aI729 +aI-108 +aI717 +aI-133 +aI721 +aI-118 +aa(lp2925 +g15 +aI764 +aI-92 +aI737 +aI-97 +aI749 +aI-92 +aa(lp2926 +g15 +aI802 +aI-100 +aI778 +aI-92 +aI790 +aI-95 +aa(lp2927 +g15 +aI842 +aI-123 +aI813 +aI-105 +aI827 +aI-113 +aa(lp2928 +g20 +aI874 +aI-78 +aa(lp2929 +g15 +aI838 +aI-44 +aI863 +aI-67 +aI851 +aI-55 +aa(lp2930 +g15 +aI793 +aI-15 +aI825 +aI-33 +aI810 +aI-23 +aa(lp2931 +g15 +aI737 +aI5 +aI776 +aI-6 +aI758 +aI0 +aa(lp2932 +g15 +aI670 +aI13 +aI717 +aI10 +aI694 +aI13 +aa(lp2933 +g15 +aI552 +aI-22 +aI619 +aI13 +aI580 +aI1 +aa(lp2934 +g15 +aI511 +aI-123 +aI525 +aI-46 +aI511 +aI-80 +aa(lp2935 +g10 +aa(lp2936 +g8 +aI895 +aI0 +aa(lp2937 +g10 +aa(lp2938 +g8 +aI895 +aI0 +aasVr +(lp2939 +(lp2940 +g8 +aI170 +aI-597 +aa(lp2941 +g15 +aI154 +aI-632 +aI170 +aI-613 +aI165 +aI-625 +aa(lp2942 +g15 +aI100 +aI-643 +aI143 +aI-639 +aI125 +aI-643 +aa(lp2943 +g20 +aI76 +aI-643 +aa(lp2944 +g20 +aI87 +aI-714 +aa(lp2945 +g20 +aI382 +aI-714 +aa(lp2946 +g20 +aI354 +aI-531 +aa(lp2947 +g20 +aI361 +aI-531 +aa(lp2948 +g15 +aI407 +aI-616 +aI376 +aI-563 +aI391 +aI-591 +aa(lp2949 +g15 +aI458 +aI-677 +aI422 +aI-640 +aI439 +aI-660 +aa(lp2950 +g15 +aI520 +aI-714 +aI476 +aI-693 +aI497 +aI-706 +aa(lp2951 +g15 +aI602 +aI-727 +aI544 +aI-723 +aI571 +aI-727 +aa(lp2952 +g15 +aI708 +aI-700 +aI650 +aI-727 +aI685 +aI-718 +aa(lp2953 +g15 +aI742 +aI-623 +aI731 +aI-682 +aI742 +aI-657 +aa(lp2954 +g15 +aI702 +aI-520 +aI742 +aI-577 +aI729 +aI-542 +aa(lp2955 +g15 +aI585 +aI-486 +aI675 +aI-497 +aI636 +aI-486 +aa(lp2956 +g15 +aI582 +aI-540 +aI585 +aI-506 +aI584 +aI-524 +aa(lp2957 +g15 +aI571 +aI-582 +aI580 +aI-557 +aI576 +aI-571 +aa(lp2958 +g15 +aI551 +aI-608 +aI566 +aI-594 +aI560 +aI-602 +aa(lp2959 +g15 +aI520 +aI-618 +aI543 +aI-614 +aI532 +aI-618 +aa(lp2960 +g15 +aI480 +aI-602 +aI507 +aI-618 +aI494 +aI-612 +aa(lp2961 +g15 +aI438 +aI-560 +aI466 +aI-592 +aI452 +aI-578 +aa(lp2962 +g15 +aI398 +aI-497 +aI424 +aI-542 +aI411 +aI-521 +aa(lp2963 +g15 +aI360 +aI-417 +aI384 +aI-472 +aI372 +aI-446 +aa(lp2964 +g15 +aI326 +aI-326 +aI347 +aI-388 +aI336 +aI-358 +aa(lp2965 +g15 +aI301 +aI-230 +aI316 +aI-294 +aI308 +aI-262 +aa(lp2966 +g20 +aI250 +aI0 +aa(lp2967 +g20 +aI49 +aI0 +aa(lp2968 +g20 +aI162 +aI-535 +aa(lp2969 +g15 +aI167 +aI-564 +aI164 +aI-542 +aI165 +aI-552 +aa(lp2970 +g15 +aI170 +aI-597 +aI169 +aI-576 +aI170 +aI-587 +aa(lp2971 +g10 +aa(lp2972 +g8 +aI734 +aI0 +aa(lp2973 +g10 +aa(lp2974 +g8 +aI734 +aI0 +aasVv +(lp2975 +(lp2976 +g8 +aI126 +aI-573 +aa(lp2977 +g15 +aI115 +aI-607 +aI124 +aI-587 +aI120 +aI-598 +aa(lp2978 +g15 +aI96 +aI-629 +aI110 +aI-616 +aI104 +aI-623 +aa(lp2979 +g15 +aI69 +aI-640 +aI89 +aI-634 +aI80 +aI-638 +aa(lp2980 +g15 +aI34 +aI-643 +aI59 +aI-642 +aI47 +aI-643 +aa(lp2981 +g20 +aI21 +aI-643 +aa(lp2982 +g20 +aI37 +aI-714 +aa(lp2983 +g20 +aI298 +aI-714 +aa(lp2984 +g20 +aI360 +aI-319 +aa(lp2985 +g15 +aI374 +aI-199 +aI366 +aI-274 +aI371 +aI-234 +aa(lp2986 +g15 +aI381 +aI-112 +aI376 +aI-163 +aI379 +aI-134 +aa(lp2987 +g20 +aI385 +aI-112 +aa(lp2988 +g15 +aI472 +aI-213 +aI415 +aI-144 +aI444 +aI-177 +aa(lp2989 +g15 +aI546 +aI-322 +aI500 +aI-249 +aI524 +aI-285 +aa(lp2990 +g15 +aI597 +aI-427 +aI567 +aI-358 +aI584 +aI-393 +aa(lp2991 +g15 +aI615 +aI-519 +aI609 +aI-461 +aI615 +aI-492 +aa(lp2992 +g15 +aI590 +aI-585 +aI615 +aI-549 +aI607 +aI-571 +aa(lp2993 +g15 +aI527 +aI-606 +aI573 +aI-599 +aI552 +aI-606 +aa(lp2994 +g15 +aI557 +aI-693 +aI527 +aI-642 +aI537 +aI-671 +aa(lp2995 +g15 +aI638 +aI-726 +aI577 +aI-715 +aI604 +aI-726 +aa(lp2996 +g15 +aI677 +aI-719 +aI652 +aI-726 +aI665 +aI-723 +aa(lp2997 +g15 +aI709 +aI-697 +aI689 +aI-714 +aI700 +aI-707 +aa(lp2998 +g15 +aI731 +aI-659 +aI718 +aI-687 +aI725 +aI-674 +aa(lp2999 +g15 +aI738 +aI-602 +aI736 +aI-643 +aI738 +aI-624 +aa(lp3000 +g15 +aI722 +aI-493 +aI738 +aI-567 +aI733 +aI-531 +aa(lp3001 +g15 +aI677 +aI-380 +aI710 +aI-455 +aI695 +aI-418 +aa(lp3002 +g15 +aI613 +aI-268 +aI658 +aI-342 +aI637 +aI-304 +aa(lp3003 +g15 +aI540 +aI-163 +aI590 +aI-231 +aI565 +aI-196 +aa(lp3004 +g15 +aI464 +aI-72 +aI514 +aI-131 +aI489 +aI-100 +aa(lp3005 +g15 +aI397 +aI0 +aI440 +aI-44 +aI417 +aI-20 +aa(lp3006 +g20 +aI221 +aI12 +aa(lp3007 +g10 +aa(lp3008 +g8 +aI781 +aI0 +aa(lp3009 +g10 +aa(lp3010 +g8 +aI781 +aI0 +aasVz +(lp3011 +(lp3012 +g8 +aI465 +aI-90 +aa(lp3013 +g15 +aI505 +aI-100 +aI480 +aI-90 +aI494 +aI-93 +aa(lp3014 +g15 +aI536 +aI-128 +aI517 +aI-107 +aI527 +aI-117 +aa(lp3015 +g15 +aI560 +aI-167 +aI545 +aI-140 +aI553 +aI-153 +aa(lp3016 +g15 +aI580 +aI-210 +aI567 +aI-181 +aI574 +aI-196 +aa(lp3017 +g20 +aI593 +aI-241 +aa(lp3018 +g20 +aI670 +aI-241 +aa(lp3019 +g20 +aI613 +aI0 +aa(lp3020 +g20 +aI0 +aI0 +aa(lp3021 +g20 +aI14 +aI-67 +aa(lp3022 +g20 +aI460 +aI-623 +aa(lp3023 +g20 +aI290 +aI-623 +aa(lp3024 +g15 +aI245 +aI-614 +aI272 +aI-623 +aI257 +aI-620 +aa(lp3025 +g15 +aI213 +aI-590 +aI233 +aI-608 +aI222 +aI-600 +aa(lp3026 +g15 +aI187 +aI-552 +aI203 +aI-579 +aI195 +aI-567 +aa(lp3027 +g15 +aI164 +aI-503 +aI180 +aI-537 +aI172 +aI-521 +aa(lp3028 +g20 +aI161 +aI-498 +aa(lp3029 +g20 +aI80 +aI-498 +aa(lp3030 +g20 +aI138 +aI-714 +aa(lp3031 +g20 +aI710 +aI-714 +aa(lp3032 +g20 +aI695 +aI-644 +aa(lp3033 +g20 +aI249 +aI-90 +aa(lp3034 +g10 +aa(lp3035 +g8 +aI744 +aI0 +aa(lp3036 +g10 +aa(lp3037 +g8 +aI744 +aI0 +aasV~ +(lp3038 +(lp3039 +g8 +aI343 +aI-431 +aa(lp3040 +g15 +aI301 +aI-449 +aI327 +aI-438 +aI313 +aI-444 +aa(lp3041 +g15 +aI269 +aI-460 +aI289 +aI-453 +aI278 +aI-457 +aa(lp3042 +g15 +aI241 +aI-466 +aI259 +aI-462 +aI250 +aI-464 +aa(lp3043 +g15 +aI213 +aI-467 +aI232 +aI-467 +aI223 +aI-467 +aa(lp3044 +g15 +aI175 +aI-461 +aI200 +aI-467 +aI188 +aI-465 +aa(lp3045 +g15 +aI137 +aI-444 +aI162 +aI-457 +aI149 +aI-451 +aa(lp3046 +g15 +aI99 +aI-419 +aI124 +aI-437 +aI111 +aI-429 +aa(lp3047 +g15 +aI65 +aI-388 +aI87 +aI-410 +aI75 +aI-399 +aa(lp3048 +g20 +aI65 +aI-491 +aa(lp3049 +g15 +aI226 +aI-562 +aI108 +aI-538 +aI162 +aI-562 +aa(lp3050 +g15 +aI261 +aI-560 +aI239 +aI-562 +aI250 +aI-561 +aa(lp3051 +g15 +aI295 +aI-554 +aI272 +aI-559 +aI283 +aI-557 +aa(lp3052 +g15 +aI335 +aI-542 +aI307 +aI-551 +aI321 +aI-547 +aa(lp3053 +g15 +aI388 +aI-521 +aI350 +aI-536 +aI367 +aI-529 +aa(lp3054 +g15 +aI430 +aI-503 +aI404 +aI-514 +aI418 +aI-508 +aa(lp3055 +g15 +aI463 +aI-492 +aI441 +aI-498 +aI453 +aI-494 +aa(lp3056 +g15 +aI491 +aI-486 +aI473 +aI-489 +aI482 +aI-487 +aa(lp3057 +g15 +aI518 +aI-484 +aI500 +aI-485 +aI509 +aI-484 +aa(lp3058 +g15 +aI556 +aI-490 +aI531 +aI-484 +aI543 +aI-486 +aa(lp3059 +g15 +aI595 +aI-507 +aI569 +aI-494 +aI582 +aI-500 +aa(lp3060 +g15 +aI632 +aI-532 +aI607 +aI-514 +aI620 +aI-523 +aa(lp3061 +g15 +aI666 +aI-563 +aI644 +aI-542 +aI655 +aI-552 +aa(lp3062 +g20 +aI666 +aI-461 +aa(lp3063 +g15 +aI594 +aI-408 +aI644 +aI-437 +aI620 +aI-420 +aa(lp3064 +g15 +aI505 +aI-390 +aI567 +aI-396 +aI538 +aI-390 +aa(lp3065 +g15 +aI470 +aI-391 +aI492 +aI-390 +aI480 +aI-390 +aa(lp3066 +g15 +aI435 +aI-397 +aI459 +aI-392 +aI447 +aI-394 +aa(lp3067 +g15 +aI396 +aI-410 +aI423 +aI-401 +aI410 +aI-405 +aa(lp3068 +g15 +aI343 +aI-431 +aI381 +aI-416 +aI364 +aI-423 +aa(lp3069 +g10 +aa(lp3070 +g8 +aI748 +aI0 +aa(lp3071 +g10 +aa(lp3072 +g8 +aI748 +aI0 +aasV! +(lp3073 +(lp3074 +g8 +aI279 +aI-951 +aa(lp3075 +g20 +aI511 +aI-951 +aa(lp3076 +g20 +aI281 +aI-303 +aa(lp3077 +g20 +aI203 +aI-303 +aa(lp3078 +g10 +aa(lp3079 +g8 +aI326 +aI-108 +aa(lp3080 +g15 +aI316 +aI-52 +aI326 +aI-86 +aI323 +aI-68 +aa(lp3081 +g15 +aI290 +aI-15 +aI310 +aI-37 +aI301 +aI-24 +aa(lp3082 +g15 +aI252 +aI4 +aI278 +aI-6 +aI266 +aI0 +aa(lp3083 +g15 +aI210 +aI10 +aI238 +aI8 +aI224 +aI10 +aa(lp3084 +g15 +aI132 +aI-12 +aI178 +aI10 +aI152 +aI3 +aa(lp3085 +g15 +aI102 +aI-84 +aI112 +aI-28 +aI102 +aI-52 +aa(lp3086 +g15 +aI111 +aI-134 +aI102 +aI-103 +aI105 +aI-119 +aa(lp3087 +g15 +aI134 +aI-172 +aI116 +aI-149 +aI124 +aI-161 +aa(lp3088 +g15 +aI170 +aI-196 +aI144 +aI-182 +aI156 +aI-190 +aa(lp3089 +g15 +aI218 +aI-204 +aI184 +aI-201 +aI200 +aI-204 +aa(lp3090 +g15 +aI261 +aI-198 +aI233 +aI-204 +aI248 +aI-202 +aa(lp3091 +g15 +aI295 +aI-181 +aI274 +aI-194 +aI286 +aI-189 +aa(lp3092 +g15 +aI318 +aI-151 +aI305 +aI-173 +aI313 +aI-163 +aa(lp3093 +g15 +aI326 +aI-108 +aI324 +aI-139 +aI326 +aI-124 +aa(lp3094 +g10 +aa(lp3095 +g8 +aI526 +aI0 +aa(lp3096 +g10 +aa(lp3097 +g8 +aI526 +aI0 +aasV% +(lp3098 +(lp3099 +g8 +aI342 +aI0 +aa(lp3100 +g20 +aI238 +aI0 +aa(lp3101 +g20 +aI899 +aI-951 +aa(lp3102 +g20 +aI1000 +aI-951 +aa(lp3103 +g10 +aa(lp3104 +g8 +aI95 +aI-567 +aa(lp3105 +g15 +aI103 +aI-654 +aI95 +aI-595 +aI98 +aI-624 +aa(lp3106 +g15 +aI127 +aI-744 +aI108 +aI-684 +aI116 +aI-714 +aa(lp3107 +g15 +aI169 +aI-828 +aI138 +aI-773 +aI152 +aI-801 +aa(lp3108 +g15 +aI228 +aI-898 +aI185 +aI-855 +aI205 +aI-878 +aa(lp3109 +g15 +aI305 +aI-947 +aI250 +aI-919 +aI276 +aI-935 +aa(lp3110 +g15 +aI402 +aI-965 +aI334 +aI-959 +aI366 +aI-965 +aa(lp3111 +g15 +aI489 +aI-950 +aI436 +aI-965 +aI465 +aI-960 +aa(lp3112 +g15 +aI549 +aI-908 +aI513 +aI-940 +aI533 +aI-926 +aa(lp3113 +g15 +aI584 +aI-845 +aI565 +aI-890 +aI576 +aI-869 +aa(lp3114 +g15 +aI595 +aI-766 +aI591 +aI-820 +aI595 +aI-794 +aa(lp3115 +g15 +aI587 +aI-683 +aI595 +aI-740 +aI592 +aI-713 +aa(lp3116 +g15 +aI563 +aI-595 +aI582 +aI-654 +aI574 +aI-624 +aa(lp3117 +g15 +aI521 +aI-511 +aI552 +aI-566 +aI538 +aI-538 +aa(lp3118 +g15 +aI461 +aI-440 +aI504 +aI-485 +aI484 +aI-461 +aa(lp3119 +g15 +aI382 +aI-391 +aI438 +aI-420 +aI411 +aI-403 +aa(lp3120 +g15 +aI283 +aI-372 +aI352 +aI-378 +aI319 +aI-372 +aa(lp3121 +g15 +aI206 +aI-385 +aI255 +aI-372 +aI229 +aI-376 +aa(lp3122 +g15 +aI146 +aI-422 +aI182 +aI-393 +aI163 +aI-406 +aa(lp3123 +g15 +aI109 +aI-483 +aI130 +aI-439 +aI117 +aI-459 +aa(lp3124 +g15 +aI95 +aI-567 +aI100 +aI-507 +aI95 +aI-535 +aa(lp3125 +g10 +aa(lp3126 +g8 +aI398 +aI-895 +aa(lp3127 +g15 +aI350 +aI-877 +aI381 +aI-895 +aI365 +aI-889 +aa(lp3128 +g15 +aI311 +aI-830 +aI336 +aI-865 +aI322 +aI-850 +aa(lp3129 +g15 +aI280 +aI-765 +aI299 +aI-811 +aI289 +aI-790 +aa(lp3130 +g15 +aI258 +aI-691 +aI271 +aI-741 +aI263 +aI-716 +aa(lp3131 +g15 +aI244 +aI-618 +aI252 +aI-666 +aI247 +aI-642 +aa(lp3132 +g15 +aI240 +aI-556 +aI241 +aI-594 +aI240 +aI-574 +aa(lp3133 +g15 +aI253 +aI-472 +aI240 +aI-521 +aI244 +aI-493 +aa(lp3134 +g15 +aI298 +aI-440 +aI261 +aI-451 +aI277 +aI-440 +aa(lp3135 +g15 +aI346 +aI-458 +aI316 +aI-440 +aI332 +aI-446 +aa(lp3136 +g15 +aI386 +aI-505 +aI361 +aI-470 +aI374 +aI-486 +aa(lp3137 +g15 +aI416 +aI-570 +aI397 +aI-524 +aI408 +aI-546 +aa(lp3138 +g15 +aI439 +aI-645 +aI425 +aI-595 +aI433 +aI-620 +aa(lp3139 +g15 +aI452 +aI-718 +aI444 +aI-670 +aI449 +aI-694 +aa(lp3140 +g15 +aI457 +aI-780 +aI455 +aI-742 +aI457 +aI-763 +aa(lp3141 +g15 +aI444 +aI-864 +aI457 +aI-816 +aI452 +aI-844 +aa(lp3142 +g15 +aI398 +aI-895 +aI435 +aI-884 +aI420 +aI-894 +aa(lp3143 +g10 +aa(lp3144 +g8 +aI649 +aI-181 +aa(lp3145 +g15 +aI656 +aI-268 +aI649 +aI-208 +aI651 +aI-238 +aa(lp3146 +g15 +aI681 +aI-358 +aI662 +aI-298 +aI670 +aI-328 +aa(lp3147 +g15 +aI722 +aI-442 +aI692 +aI-387 +aI706 +aI-415 +aa(lp3148 +g15 +aI781 +aI-512 +aI739 +aI-468 +aI758 +aI-492 +aa(lp3149 +g15 +aI859 +aI-560 +aI804 +aI-532 +aI830 +aI-548 +aa(lp3150 +g15 +aI955 +aI-578 +aI887 +aI-572 +aI920 +aI-578 +aa(lp3151 +g15 +aI1042 +aI-563 +aI989 +aI-578 +aI1018 +aI-573 +aa(lp3152 +g15 +aI1102 +aI-521 +aI1067 +aI-553 +aI1087 +aI-539 +aa(lp3153 +g15 +aI1137 +aI-458 +aI1118 +aI-503 +aI1130 +aI-482 +aa(lp3154 +g15 +aI1149 +aI-379 +aI1145 +aI-434 +aI1149 +aI-407 +aa(lp3155 +g15 +aI1140 +aI-297 +aI1149 +aI-354 +aI1146 +aI-326 +aa(lp3156 +g15 +aI1116 +aI-209 +aI1135 +aI-268 +aI1127 +aI-238 +aa(lp3157 +g15 +aI1074 +aI-125 +aI1105 +aI-180 +aI1091 +aI-152 +aa(lp3158 +g15 +aI1014 +aI-54 +aI1057 +aI-98 +aI1037 +aI-75 +aa(lp3159 +g15 +aI935 +aI-5 +aI991 +aI-33 +aI965 +aI-17 +aa(lp3160 +g15 +aI837 +aI13 +aI906 +aI7 +aI873 +aI13 +aa(lp3161 +g15 +aI759 +aI0 +aI808 +aI13 +aI782 +aI9 +aa(lp3162 +g15 +aI700 +aI-36 +aI736 +aI-7 +aI716 +aI-20 +aa(lp3163 +g15 +aI662 +aI-97 +aI683 +aI-52 +aI671 +aI-72 +aa(lp3164 +g15 +aI649 +aI-181 +aI653 +aI-121 +aI649 +aI-149 +aa(lp3165 +g10 +aa(lp3166 +g8 +aI951 +aI-508 +aa(lp3167 +g15 +aI903 +aI-490 +aI934 +aI-508 +aI918 +aI-502 +aa(lp3168 +g15 +aI864 +aI-444 +aI889 +aI-478 +aI876 +aI-463 +aa(lp3169 +g15 +aI833 +aI-379 +aI852 +aI-425 +aI842 +aI-403 +aa(lp3170 +g15 +aI811 +aI-304 +aI824 +aI-354 +aI817 +aI-330 +aa(lp3171 +g15 +aI798 +aI-231 +aI805 +aI-279 +aI801 +aI-255 +aa(lp3172 +g15 +aI793 +aI-170 +aI795 +aI-207 +aI793 +aI-187 +aa(lp3173 +g15 +aI806 +aI-85 +aI793 +aI-134 +aI797 +aI-106 +aa(lp3174 +g15 +aI852 +aI-54 +aI815 +aI-64 +aI830 +aI-54 +aa(lp3175 +g15 +aI900 +aI-72 +aI869 +aI-54 +aI885 +aI-60 +aa(lp3176 +g15 +aI939 +aI-118 +aI914 +aI-84 +aI927 +aI-99 +aa(lp3177 +g15 +aI970 +aI-184 +aI951 +aI-137 +aI961 +aI-159 +aa(lp3178 +g15 +aI992 +aI-258 +aI979 +aI-208 +aI986 +aI-233 +aa(lp3179 +g15 +aI1005 +aI-331 +aI998 +aI-283 +aI1002 +aI-308 +aa(lp3180 +g15 +aI1010 +aI-394 +aI1008 +aI-355 +aI1010 +aI-376 +aa(lp3181 +g15 +aI997 +aI-477 +aI1010 +aI-429 +aI1006 +aI-457 +aa(lp3182 +g15 +aI951 +aI-508 +aI989 +aI-497 +aI973 +aI-507 +aa(lp3183 +g10 +aa(lp3184 +g8 +aI1194 +aI0 +aa(lp3185 +g10 +aa(lp3186 +g8 +aI1194 +aI0 +aasV) +(lp3187 +(lp3188 +g8 +aI294 +aI-659 +aa(lp3189 +g15 +aI289 +aI-741 +aI294 +aI-687 +aI292 +aI-714 +aa(lp3190 +g15 +aI269 +aI-819 +aI285 +aI-769 +aI278 +aI-795 +aa(lp3191 +g15 +aI233 +aI-889 +aI260 +aI-844 +aI248 +aI-867 +aa(lp3192 +g15 +aI178 +aI-944 +aI218 +aI-910 +aI200 +aI-929 +aa(lp3193 +g20 +aI195 +aI-1030 +aa(lp3194 +g15 +aI334 +aI-957 +aI249 +aI-1011 +aI295 +aI-987 +aa(lp3195 +g15 +aI428 +aI-857 +aI372 +aI-928 +aI404 +aI-894 +aa(lp3196 +g15 +aI482 +aI-734 +aI453 +aI-819 +aI471 +aI-778 +aa(lp3197 +g15 +aI500 +aI-597 +aI494 +aI-690 +aI500 +aI-644 +aa(lp3198 +g15 +aI484 +aI-430 +aI500 +aI-542 +aI494 +aI-486 +aa(lp3199 +g15 +aI438 +aI-267 +aI474 +aI-374 +aI459 +aI-320 +aa(lp3200 +g15 +aI361 +aI-115 +aI418 +aI-214 +aI392 +aI-163 +aa(lp3201 +g15 +aI253 +aI16 +aI331 +aI-67 +aI295 +aI-23 +aa(lp3202 +g15 +aI113 +aI118 +aI212 +aI55 +aI165 +aI89 +aa(lp3203 +g15 +aI-58 +aI186 +aI61 +aI148 +aI4 +aI170 +aa(lp3204 +g20 +aI-45 +aI100 +aa(lp3205 +g15 +aI43 +aI37 +aI-12 +aI82 +aI17 +aI61 +aa(lp3206 +g15 +aI113 +aI-38 +aI70 +aI13 +aI93 +aI-11 +aa(lp3207 +g15 +aI167 +aI-122 +aI134 +aI-65 +aI152 +aI-93 +aa(lp3208 +g15 +aI206 +aI-209 +aI182 +aI-151 +aI195 +aI-180 +aa(lp3209 +g15 +aI234 +aI-292 +aI217 +aI-237 +aI227 +aI-265 +aa(lp3210 +g15 +aI254 +aI-367 +aI242 +aI-319 +aI248 +aI-344 +aa(lp3211 +g15 +aI287 +aI-539 +aI271 +aI-434 +aI281 +aI-492 +aa(lp3212 +g15 +aI294 +aI-659 +aI292 +aI-587 +aI294 +aI-627 +aa(lp3213 +g10 +aa(lp3214 +g8 +aI533 +aI0 +aa(lp3215 +g10 +aa(lp3216 +g8 +aI533 +aI0 +aasV- +(lp3217 +(lp3218 +g8 +aI13 +aI-293 +aa(lp3219 +g20 +aI44 +aI-433 +aa(lp3220 +g20 +aI390 +aI-433 +aa(lp3221 +g20 +aI360 +aI-293 +aa(lp3222 +g10 +aa(lp3223 +g8 +aI413 +aI0 +aa(lp3224 +g10 +aa(lp3225 +g8 +aI413 +aI0 +aasV1 +(lp3226 +(lp3227 +g8 +aI630 +aI-956 +aa(lp3228 +g20 +aI461 +aI-161 +aa(lp3229 +g15 +aI456 +aI-137 +aI460 +aI-155 +aI458 +aI-147 +aa(lp3230 +g15 +aI453 +aI-114 +aI454 +aI-127 +aI453 +aI-119 +aa(lp3231 +g15 +aI460 +aI-91 +aI453 +aI-104 +aI455 +aI-96 +aa(lp3232 +g15 +aI481 +aI-77 +aI465 +aI-85 +aI472 +aI-80 +aa(lp3233 +g15 +aI513 +aI-71 +aI490 +aI-74 +aI501 +aI-72 +aa(lp3234 +g15 +aI553 +aI-70 +aI525 +aI-70 +aI539 +aI-70 +aa(lp3235 +g20 +aI618 +aI-70 +aa(lp3236 +g20 +aI604 +aI0 +aa(lp3237 +g20 +aI53 +aI0 +aa(lp3238 +g20 +aI67 +aI-70 +aa(lp3239 +g20 +aI146 +aI-70 +aa(lp3240 +g15 +aI223 +aI-89 +aI178 +aI-70 +aI203 +aI-76 +aa(lp3241 +g15 +aI262 +aI-157 +aI242 +aI-102 +aI255 +aI-124 +aa(lp3242 +g20 +aI365 +aI-642 +aa(lp3243 +g15 +aI381 +aI-715 +aI370 +aI-669 +aI376 +aI-693 +aa(lp3244 +g15 +aI395 +aI-773 +aI386 +aI-737 +aI391 +aI-757 +aa(lp3245 +g15 +aI409 +aI-825 +aI400 +aI-792 +aI405 +aI-809 +aa(lp3246 +g20 +aI404 +aI-825 +aa(lp3247 +g15 +aI346 +aI-766 +aI383 +aI-803 +aI364 +aI-783 +aa(lp3248 +g15 +aI297 +aI-723 +aI329 +aI-749 +aI312 +aI-735 +aa(lp3249 +g15 +aI253 +aI-695 +aI282 +aI-711 +aI267 +aI-702 +aa(lp3250 +g15 +aI210 +aI-686 +aI239 +aI-689 +aI225 +aI-686 +aa(lp3251 +g15 +aI164 +aI-712 +aI191 +aI-686 +aI176 +aI-694 +aa(lp3252 +g15 +aI146 +aI-784 +aI152 +aI-729 +aI146 +aI-753 +aa(lp3253 +g15 +aI193 +aI-798 +aI161 +aI-788 +aI177 +aI-793 +aa(lp3254 +g15 +aI244 +aI-817 +aI209 +aI-803 +aI226 +aI-810 +aa(lp3255 +g15 +aI303 +aI-846 +aI263 +aI-825 +aI282 +aI-835 +aa(lp3256 +g15 +aI373 +aI-887 +aI324 +aI-857 +aI347 +aI-871 +aa(lp3257 +g20 +aI481 +aI-956 +aa(lp3258 +g10 +aa(lp3259 +g8 +aI745 +aI0 +aa(lp3260 +g10 +aa(lp3261 +g8 +aI745 +aI0 +aasV5 +(lp3262 +(lp3263 +g8 +aI282 +aI-79 +aa(lp3264 +g15 +aI361 +aI-94 +aI311 +aI-79 +aI337 +aI-84 +aa(lp3265 +g15 +aI422 +aI-139 +aI385 +aI-104 +aI405 +aI-119 +aa(lp3266 +g15 +aI460 +aI-214 +aI438 +aI-159 +aI451 +aI-184 +aa(lp3267 +g15 +aI474 +aI-319 +aI470 +aI-244 +aI474 +aI-279 +aa(lp3268 +g15 +aI462 +aI-394 +aI474 +aI-348 +aI470 +aI-373 +aa(lp3269 +g15 +aI428 +aI-448 +aI453 +aI-415 +aI442 +aI-433 +aa(lp3270 +g15 +aI377 +aI-480 +aI414 +aI-462 +aI397 +aI-473 +aa(lp3271 +g15 +aI313 +aI-490 +aI357 +aI-486 +aI336 +aI-490 +aa(lp3272 +g15 +aI269 +aI-487 +aI297 +aI-490 +aI282 +aI-489 +aa(lp3273 +g15 +aI233 +aI-480 +aI256 +aI-486 +aI244 +aI-483 +aa(lp3274 +g15 +aI203 +aI-471 +aI222 +aI-478 +aI212 +aI-475 +aa(lp3275 +g15 +aI175 +aI-461 +aI193 +aI-468 +aI184 +aI-464 +aa(lp3276 +g20 +aI119 +aI-489 +aa(lp3277 +g20 +aI255 +aI-951 +aa(lp3278 +g20 +aI759 +aI-951 +aa(lp3279 +g20 +aI721 +aI-709 +aa(lp3280 +g20 +aI639 +aI-709 +aa(lp3281 +g15 +aI642 +aI-745 +aI640 +aI-720 +aI641 +aI-732 +aa(lp3282 +g15 +aI643 +aI-772 +aI643 +aI-758 +aI643 +aI-767 +aa(lp3283 +g15 +aI630 +aI-797 +aI643 +aI-782 +aI639 +aI-790 +aa(lp3284 +g15 +aI578 +aI-806 +aI621 +aI-803 +aI603 +aI-806 +aa(lp3285 +g20 +aI310 +aI-806 +aa(lp3286 +g20 +aI231 +aI-556 +aa(lp3287 +g15 +aI289 +aI-571 +aI248 +aI-561 +aI267 +aI-566 +aa(lp3288 +g15 +aI370 +aI-578 +aI310 +aI-575 +aI337 +aI-578 +aa(lp3289 +g15 +aI495 +aI-562 +aI416 +aI-578 +aI458 +aI-572 +aa(lp3290 +g15 +aI590 +aI-514 +aI532 +aI-551 +aI564 +aI-535 +aa(lp3291 +g15 +aI651 +aI-436 +aI617 +aI-493 +aI637 +aI-467 +aa(lp3292 +g15 +aI673 +aI-328 +aI666 +aI-405 +aI673 +aI-369 +aa(lp3293 +g15 +aI645 +aI-193 +aI673 +aI-280 +aI663 +aI-235 +aa(lp3294 +g15 +aI564 +aI-84 +aI626 +aI-151 +aI599 +aI-115 +aa(lp3295 +g15 +aI436 +aI-12 +aI529 +aI-53 +aI487 +aI-29 +aa(lp3296 +g15 +aI265 +aI13 +aI386 +aI4 +aI329 +aI13 +aa(lp3297 +g15 +aI147 +aI1 +aI219 +aI13 +aI179 +aI9 +aa(lp3298 +g15 +aI69 +aI-32 +aI115 +aI-7 +aI89 +aI-18 +aa(lp3299 +g15 +aI26 +aI-81 +aI49 +aI-46 +aI35 +aI-63 +aa(lp3300 +g15 +aI13 +aI-142 +aI17 +aI-100 +aI13 +aI-120 +aa(lp3301 +g15 +aI20 +aI-183 +aI13 +aI-156 +aI15 +aI-170 +aa(lp3302 +g15 +aI43 +aI-217 +aI25 +aI-196 +aI33 +aI-207 +aa(lp3303 +g15 +aI82 +aI-240 +aI53 +aI-227 +aI66 +aI-234 +aa(lp3304 +g15 +aI137 +aI-248 +aI97 +aI-246 +aI116 +aI-248 +aa(lp3305 +g15 +aI144 +aI-190 +aI137 +aI-229 +aI140 +aI-210 +aa(lp3306 +g15 +aI166 +aI-135 +aI148 +aI-170 +aI155 +aI-152 +aa(lp3307 +g15 +aI210 +aI-95 +aI176 +aI-119 +aI191 +aI-105 +aa(lp3308 +g15 +aI282 +aI-79 +aI228 +aI-84 +aI253 +aI-79 +aa(lp3309 +g10 +aa(lp3310 +g8 +aI745 +aI0 +aa(lp3311 +g10 +aa(lp3312 +g8 +aI745 +aI0 +aasV9 +(lp3313 +(lp3314 +g8 +aI254 +aI-70 +aa(lp3315 +g15 +aI342 +aI-95 +aI287 +aI-70 +aI316 +aI-78 +aa(lp3316 +g15 +aI415 +aI-170 +aI369 +aI-112 +aI393 +aI-137 +aa(lp3317 +g15 +aI475 +aI-290 +aI436 +aI-202 +aI457 +aI-242 +aa(lp3318 +g15 +aI527 +aI-456 +aI493 +aI-338 +aI511 +aI-394 +aa(lp3319 +g15 +aI490 +aI-422 +aI516 +aI-444 +aI504 +aI-433 +aa(lp3320 +g15 +aI444 +aI-393 +aI476 +aI-411 +aI461 +aI-402 +aa(lp3321 +g15 +aI390 +aI-373 +aI428 +aI-385 +aI410 +aI-378 +aa(lp3322 +g15 +aI326 +aI-366 +aI371 +aI-368 +aI349 +aI-366 +aa(lp3323 +g15 +aI231 +aI-382 +aI291 +aI-366 +aI259 +aI-371 +aa(lp3324 +g15 +aI161 +aI-428 +aI203 +aI-393 +aI180 +aI-409 +aa(lp3325 +g15 +aI118 +aI-498 +aI142 +aI-448 +aI128 +aI-471 +aa(lp3326 +g15 +aI104 +aI-587 +aI109 +aI-525 +aI104 +aI-555 +aa(lp3327 +g15 +aI134 +aI-740 +aI104 +aI-642 +aI114 +aI-693 +aa(lp3328 +g15 +aI216 +aI-859 +aI154 +aI-786 +aI181 +aI-826 +aa(lp3329 +g15 +aI335 +aI-937 +aI250 +aI-893 +aI290 +aI-918 +aa(lp3330 +g15 +aI479 +aI-965 +aI380 +aI-955 +aI429 +aI-965 +aa(lp3331 +g15 +aI588 +aI-947 +aI519 +aI-965 +aI555 +aI-959 +aa(lp3332 +g15 +aI670 +aI-896 +aI620 +aI-935 +aI648 +aI-918 +aa(lp3333 +g15 +aI723 +aI-814 +aI693 +aI-874 +aI711 +aI-846 +aa(lp3334 +g15 +aI741 +aI-702 +aI735 +aI-781 +aI741 +aI-744 +aa(lp3335 +g15 +aI740 +aI-662 +aI741 +aI-691 +aI741 +aI-678 +aa(lp3336 +g15 +aI736 +aI-612 +aI739 +aI-647 +aI737 +aI-630 +aa(lp3337 +g15 +aI728 +aI-554 +aI734 +aI-593 +aI731 +aI-574 +aa(lp3338 +g15 +aI716 +aI-494 +aI724 +aI-534 +aI720 +aI-514 +aa(lp3339 +g15 +aI680 +aI-367 +aI706 +aI-451 +aI694 +aI-409 +aa(lp3340 +g15 +aI627 +aI-248 +aI665 +aI-325 +aI648 +aI-286 +aa(lp3341 +g15 +aI558 +aI-144 +aI607 +aI-211 +aI584 +aI-176 +aa(lp3342 +g15 +aI472 +aI-61 +aI533 +aI-111 +aI504 +aI-84 +aa(lp3343 +g15 +aI366 +aI-6 +aI439 +aI-37 +aI404 +aI-19 +aa(lp3344 +g15 +aI240 +aI13 +aI327 +aI6 +aI285 +aI13 +aa(lp3345 +g15 +aI148 +aI2 +aI204 +aI13 +aI174 +aI9 +aa(lp3346 +g15 +aI85 +aI-27 +aI122 +aI-4 +aI101 +aI-14 +aa(lp3347 +g15 +aI48 +aI-70 +aI68 +aI-39 +aI56 +aI-54 +aa(lp3348 +g15 +aI37 +aI-123 +aI41 +aI-87 +aI37 +aI-104 +aa(lp3349 +g15 +aI64 +aI-191 +aI37 +aI-153 +aI46 +aI-176 +aa(lp3350 +g15 +aI141 +aI-215 +aI83 +aI-207 +aI108 +aI-215 +aa(lp3351 +g15 +aI148 +aI-164 +aI141 +aI-198 +aI144 +aI-181 +aa(lp3352 +g15 +aI168 +aI-117 +aI152 +aI-146 +aI159 +aI-131 +aa(lp3353 +g15 +aI203 +aI-83 +aI177 +aI-103 +aI189 +aI-92 +aa(lp3354 +g15 +aI254 +aI-70 +aI217 +aI-74 +aI234 +aI-70 +aa(lp3355 +g10 +aa(lp3356 +g8 +aI394 +aI-462 +aa(lp3357 +g15 +aI443 +aI-472 +aI411 +aI-462 +aI428 +aI-466 +aa(lp3358 +g15 +aI484 +aI-495 +aI458 +aI-478 +aI471 +aI-486 +aa(lp3359 +g15 +aI519 +aI-528 +aI497 +aI-505 +aI509 +aI-516 +aa(lp3360 +g15 +aI546 +aI-565 +aI529 +aI-540 +aI539 +aI-553 +aa(lp3361 +g15 +aI554 +aI-601 +aI549 +aI-576 +aI551 +aI-588 +aa(lp3362 +g15 +aI560 +aI-640 +aI556 +aI-614 +aI558 +aI-627 +aa(lp3363 +g15 +aI564 +aI-678 +aI562 +aI-653 +aI563 +aI-666 +aa(lp3364 +g15 +aI566 +aI-710 +aI565 +aI-690 +aI566 +aI-701 +aa(lp3365 +g15 +aI559 +aI-785 +aI566 +aI-739 +aI564 +aI-764 +aa(lp3366 +g15 +aI538 +aI-837 +aI554 +aI-806 +aI547 +aI-823 +aa(lp3367 +g15 +aI507 +aI-866 +aI529 +aI-850 +aI519 +aI-860 +aa(lp3368 +g15 +aI468 +aI-875 +aI495 +aI-872 +aI482 +aI-875 +aa(lp3369 +g15 +aI398 +aI-851 +aI442 +aI-875 +aI419 +aI-867 +aa(lp3370 +g15 +aI344 +aI-786 +aI377 +aI-834 +aI359 +aI-813 +aa(lp3371 +g15 +aI308 +aI-695 +aI329 +aI-759 +aI317 +aI-729 +aa(lp3372 +g15 +aI296 +aI-593 +aI300 +aI-662 +aI296 +aI-628 +aa(lp3373 +g15 +aI322 +aI-495 +aI296 +aI-550 +aI305 +aI-517 +aa(lp3374 +g15 +aI394 +aI-462 +aI340 +aI-473 +aI364 +aI-462 +aa(lp3375 +g10 +aa(lp3376 +g8 +aI745 +aI0 +aa(lp3377 +g10 +aa(lp3378 +g8 +aI745 +aI0 +aasV= +(lp3379 +(lp3380 +g8 +aI685 +aI-392 +aa(lp3381 +g20 +aI685 +aI-299 +aa(lp3382 +g20 +aI108 +aI-299 +aa(lp3383 +g20 +aI108 +aI-392 +aa(lp3384 +g10 +aa(lp3385 +g8 +aI685 +aI-651 +aa(lp3386 +g20 +aI685 +aI-558 +aa(lp3387 +g20 +aI108 +aI-558 +aa(lp3388 +g20 +aI108 +aI-651 +aa(lp3389 +g10 +aa(lp3390 +g8 +aI745 +aI0 +aa(lp3391 +g10 +aa(lp3392 +g8 +aI745 +aI0 +aasVA +(lp3393 +(lp3394 +g8 +aI285 +aI-312 +aa(lp3395 +g20 +aI220 +aI-192 +aa(lp3396 +g15 +aI200 +aI-150 +aI211 +aI-176 +aI204 +aI-162 +aa(lp3397 +g15 +aI194 +aI-118 +aI196 +aI-138 +aI194 +aI-127 +aa(lp3398 +g15 +aI212 +aI-81 +aI194 +aI-101 +aI200 +aI-89 +aa(lp3399 +g15 +aI269 +aI-70 +aI225 +aI-74 +aI243 +aI-70 +aa(lp3400 +g20 +aI296 +aI-70 +aa(lp3401 +g20 +aI281 +aI0 +aa(lp3402 +g20 +aI-65 +aI0 +aa(lp3403 +g20 +aI-50 +aI-70 +aa(lp3404 +g20 +aI-22 +aI-70 +aa(lp3405 +g15 +aI9 +aI-74 +aI-10 +aI-70 +aI0 +aI-71 +aa(lp3406 +g15 +aI36 +aI-90 +aI18 +aI-77 +aI27 +aI-82 +aa(lp3407 +g15 +aI63 +aI-122 +aI45 +aI-98 +aI54 +aI-109 +aa(lp3408 +g15 +aI95 +aI-174 +aI72 +aI-136 +aI83 +aI-153 +aa(lp3409 +g20 +aI548 +aI-951 +aa(lp3410 +g20 +aI730 +aI-951 +aa(lp3411 +g20 +aI842 +aI-166 +aa(lp3412 +g15 +aI851 +aI-127 +aI844 +aI-152 +aI847 +aI-139 +aa(lp3413 +g15 +aI865 +aI-97 +aI854 +aI-116 +aI859 +aI-105 +aa(lp3414 +g15 +aI888 +aI-77 +aI871 +aI-89 +aI879 +aI-82 +aa(lp3415 +g15 +aI923 +aI-70 +aI898 +aI-72 +aI909 +aI-70 +aa(lp3416 +g20 +aI947 +aI-70 +aa(lp3417 +g20 +aI933 +aI0 +aa(lp3418 +g20 +aI493 +aI0 +aa(lp3419 +g20 +aI507 +aI-70 +aa(lp3420 +g20 +aI538 +aI-70 +aa(lp3421 +g15 +aI606 +aI-83 +aI567 +aI-70 +aI589 +aI-74 +aa(lp3422 +g15 +aI632 +aI-126 +aI623 +aI-92 +aI632 +aI-106 +aa(lp3423 +g15 +aI631 +aI-148 +aI632 +aI-133 +aI631 +aI-141 +aa(lp3424 +g15 +aI629 +aI-168 +aI631 +aI-155 +aI630 +aI-162 +aa(lp3425 +g20 +aI609 +aI-312 +aa(lp3426 +g10 +aa(lp3427 +g8 +aI576 +aI-618 +aa(lp3428 +g15 +aI569 +aI-673 +aI574 +aI-637 +aI571 +aI-655 +aa(lp3429 +g15 +aI564 +aI-722 +aI568 +aI-690 +aI566 +aI-706 +aa(lp3430 +g15 +aI560 +aI-769 +aI563 +aI-738 +aI561 +aI-754 +aa(lp3431 +g15 +aI558 +aI-816 +aI559 +aI-784 +aI559 +aI-800 +aa(lp3432 +g15 +aI539 +aI-772 +aI552 +aI-800 +aI545 +aI-785 +aa(lp3433 +g15 +aI518 +aI-730 +aI532 +aI-758 +aI525 +aI-744 +aa(lp3434 +g15 +aI493 +aI-685 +aI510 +aI-716 +aI502 +aI-701 +aa(lp3435 +g15 +aI462 +aI-630 +aI484 +aI-669 +aI474 +aI-651 +aa(lp3436 +g20 +aI330 +aI-394 +aa(lp3437 +g20 +aI600 +aI-394 +aa(lp3438 +g10 +aa(lp3439 +g8 +aI1003 +aI0 +aa(lp3440 +g10 +aa(lp3441 +g8 +aI1003 +aI0 +aasVE +(lp3442 +(lp3443 +g8 +aI-16 +aI-70 +aa(lp3444 +g20 +aI1 +aI-70 +aa(lp3445 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp3446 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp3447 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp3448 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp3449 +g20 +aI262 +aI-804 +aa(lp3450 +g15 +aI266 +aI-821 +aI264 +aI-809 +aI265 +aI-815 +aa(lp3451 +g15 +aI268 +aI-835 +aI267 +aI-827 +aI268 +aI-832 +aa(lp3452 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp3453 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp3454 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp3455 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp3456 +g20 +aI154 +aI-881 +aa(lp3457 +g20 +aI169 +aI-951 +aa(lp3458 +g20 +aI893 +aI-951 +aa(lp3459 +g20 +aI846 +aI-703 +aa(lp3460 +g20 +aI751 +aI-703 +aa(lp3461 +g15 +aI753 +aI-719 +aI752 +aI-706 +aI752 +aI-711 +aa(lp3462 +g15 +aI755 +aI-744 +aI754 +aI-727 +aI754 +aI-735 +aa(lp3463 +g15 +aI757 +aI-767 +aI756 +aI-752 +aI756 +aI-760 +aa(lp3464 +g15 +aI758 +aI-780 +aI758 +aI-774 +aI758 +aI-779 +aa(lp3465 +g15 +aI753 +aI-815 +aI758 +aI-792 +aI756 +aI-804 +aa(lp3466 +g15 +aI736 +aI-843 +aI749 +aI-826 +aI744 +aI-835 +aa(lp3467 +g15 +aI708 +aI-863 +aI729 +aI-852 +aI719 +aI-858 +aa(lp3468 +g15 +aI664 +aI-869 +aI696 +aI-867 +aI681 +aI-869 +aa(lp3469 +g20 +aI486 +aI-869 +aa(lp3470 +g20 +aI416 +aI-536 +aa(lp3471 +g20 +aI718 +aI-536 +aa(lp3472 +g20 +aI701 +aI-456 +aa(lp3473 +g20 +aI398 +aI-456 +aa(lp3474 +g20 +aI318 +aI-80 +aa(lp3475 +g20 +aI529 +aI-80 +aa(lp3476 +g15 +aI585 +aI-89 +aI550 +aI-80 +aI568 +aI-83 +aa(lp3477 +g15 +aI628 +aI-113 +aI601 +aI-95 +aI616 +aI-103 +aa(lp3478 +g15 +aI659 +aI-148 +aI640 +aI-123 +aI650 +aI-135 +aa(lp3479 +g15 +aI679 +aI-190 +aI667 +aI-161 +aI674 +aI-175 +aa(lp3480 +g20 +aI701 +aI-247 +aa(lp3481 +g20 +aI796 +aI-247 +aa(lp3482 +g20 +aI734 +aI0 +aa(lp3483 +g20 +aI-30 +aI0 +aa(lp3484 +g10 +aa(lp3485 +g8 +aI843 +aI0 +aa(lp3486 +g10 +aa(lp3487 +g8 +aI843 +aI0 +aasVI +(lp3488 +(lp3489 +g8 +aI-30 +aI0 +aa(lp3490 +g20 +aI-16 +aI-70 +aa(lp3491 +g20 +aI1 +aI-70 +aa(lp3492 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp3493 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp3494 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp3495 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp3496 +g20 +aI262 +aI-804 +aa(lp3497 +g15 +aI266 +aI-821 +aI264 +aI-809 +aI265 +aI-815 +aa(lp3498 +g15 +aI268 +aI-835 +aI267 +aI-827 +aI268 +aI-832 +aa(lp3499 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp3500 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp3501 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp3502 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp3503 +g20 +aI154 +aI-881 +aa(lp3504 +g20 +aI169 +aI-951 +aa(lp3505 +g20 +aI629 +aI-951 +aa(lp3506 +g20 +aI614 +aI-881 +aa(lp3507 +g20 +aI597 +aI-881 +aa(lp3508 +g15 +aI555 +aI-878 +aI582 +aI-881 +aI568 +aI-880 +aa(lp3509 +g15 +aI517 +aI-866 +aI541 +aI-876 +aI528 +aI-872 +aa(lp3510 +g15 +aI488 +aI-841 +aI506 +aI-861 +aI496 +aI-852 +aa(lp3511 +g15 +aI470 +aI-799 +aI480 +aI-831 +aI474 +aI-817 +aa(lp3512 +g20 +aI333 +aI-146 +aa(lp3513 +g15 +aI330 +aI-129 +aI332 +aI-141 +aI331 +aI-135 +aa(lp3514 +g15 +aI328 +aI-115 +aI328 +aI-123 +aI328 +aI-118 +aa(lp3515 +g15 +aI335 +aI-92 +aI328 +aI-105 +aI330 +aI-98 +aa(lp3516 +g15 +aI355 +aI-78 +aI340 +aI-86 +aI346 +aI-81 +aa(lp3517 +g15 +aI386 +aI-72 +aI364 +aI-75 +aI374 +aI-73 +aa(lp3518 +g15 +aI425 +aI-70 +aI398 +aI-71 +aI411 +aI-70 +aa(lp3519 +g20 +aI442 +aI-70 +aa(lp3520 +g20 +aI427 +aI0 +aa(lp3521 +g10 +aa(lp3522 +g8 +aI534 +aI0 +aa(lp3523 +g10 +aa(lp3524 +g8 +aI534 +aI0 +aasVM +(lp3525 +(lp3526 +g8 +aI1365 +aI-951 +aa(lp3527 +g20 +aI1350 +aI-881 +aa(lp3528 +g20 +aI1333 +aI-881 +aa(lp3529 +g15 +aI1291 +aI-878 +aI1319 +aI-881 +aI1305 +aI-880 +aa(lp3530 +g15 +aI1254 +aI-866 +aI1278 +aI-876 +aI1265 +aI-872 +aa(lp3531 +g15 +aI1225 +aI-841 +aI1243 +aI-861 +aI1233 +aI-852 +aa(lp3532 +g15 +aI1207 +aI-799 +aI1217 +aI-831 +aI1211 +aI-817 +aa(lp3533 +g20 +aI1070 +aI-146 +aa(lp3534 +g15 +aI1066 +aI-129 +aI1069 +aI-141 +aI1067 +aI-135 +aa(lp3535 +g15 +aI1065 +aI-115 +aI1065 +aI-123 +aI1065 +aI-118 +aa(lp3536 +g15 +aI1072 +aI-92 +aI1065 +aI-105 +aI1067 +aI-98 +aa(lp3537 +g15 +aI1092 +aI-78 +aI1077 +aI-86 +aI1083 +aI-81 +aa(lp3538 +g15 +aI1122 +aI-72 +aI1100 +aI-75 +aI1110 +aI-73 +aa(lp3539 +g15 +aI1161 +aI-70 +aI1134 +aI-71 +aI1147 +aI-70 +aa(lp3540 +g20 +aI1178 +aI-70 +aa(lp3541 +g20 +aI1164 +aI0 +aa(lp3542 +g20 +aI709 +aI0 +aa(lp3543 +g20 +aI723 +aI-70 +aa(lp3544 +g20 +aI741 +aI-70 +aa(lp3545 +g15 +aI783 +aI-73 +aI755 +aI-70 +aI769 +aI-71 +aa(lp3546 +g15 +aI819 +aI-84 +aI796 +aI-74 +aI808 +aI-78 +aa(lp3547 +g15 +aI848 +aI-108 +aI831 +aI-90 +aI840 +aI-98 +aa(lp3548 +g15 +aI866 +aI-151 +aI857 +aI-119 +aI863 +aI-133 +aa(lp3549 +g20 +aI1007 +aI-819 +aa(lp3550 +g20 +aI566 +aI0 +aa(lp3551 +g20 +aI474 +aI0 +aa(lp3552 +g20 +aI366 +aI-819 +aa(lp3553 +g20 +aI225 +aI-157 +aa(lp3554 +g15 +aI220 +aI-131 +aI223 +aI-147 +aI221 +aI-138 +aa(lp3555 +g15 +aI218 +aI-115 +aI219 +aI-124 +aI218 +aI-118 +aa(lp3556 +g15 +aI225 +aI-92 +aI218 +aI-105 +aI221 +aI-98 +aa(lp3557 +g15 +aI246 +aI-78 +aI230 +aI-86 +aI237 +aI-81 +aa(lp3558 +g15 +aI277 +aI-72 +aI254 +aI-75 +aI265 +aI-73 +aa(lp3559 +g15 +aI315 +aI-70 +aI288 +aI-71 +aI301 +aI-70 +aa(lp3560 +g20 +aI320 +aI-70 +aa(lp3561 +g20 +aI305 +aI0 +aa(lp3562 +g20 +aI-30 +aI0 +aa(lp3563 +g20 +aI-16 +aI-70 +aa(lp3564 +g20 +aI1 +aI-70 +aa(lp3565 +g15 +aI41 +aI-73 +aI15 +aI-70 +aI28 +aI-71 +aa(lp3566 +g15 +aI78 +aI-84 +aI55 +aI-74 +aI67 +aI-78 +aa(lp3567 +g15 +aI106 +aI-108 +aI88 +aI-89 +aI98 +aI-97 +aa(lp3568 +g15 +aI123 +aI-149 +aI114 +aI-118 +aI120 +aI-132 +aa(lp3569 +g20 +aI259 +aI-789 +aa(lp3570 +g15 +aI268 +aI-835 +aI265 +aI-812 +aI268 +aI-828 +aa(lp3571 +g15 +aI261 +aI-858 +aI268 +aI-845 +aI265 +aI-852 +aa(lp3572 +g15 +aI241 +aI-872 +aI256 +aI-864 +aI249 +aI-869 +aa(lp3573 +g15 +aI210 +aI-879 +aI232 +aI-876 +aI222 +aI-878 +aa(lp3574 +g15 +aI171 +aI-881 +aI198 +aI-880 +aI185 +aI-881 +aa(lp3575 +g20 +aI154 +aI-881 +aa(lp3576 +g20 +aI169 +aI-951 +aa(lp3577 +g20 +aI541 +aI-951 +aa(lp3578 +g20 +aI630 +aI-303 +aa(lp3579 +g20 +aI979 +aI-951 +aa(lp3580 +g10 +aa(lp3581 +g8 +aI1269 +aI0 +aa(lp3582 +g10 +aa(lp3583 +g8 +aI1269 +aI0 +aasVQ +(lp3584 +(lp3585 +g8 +aI82 +aI-354 +aa(lp3586 +g15 +aI98 +aI-488 +aI82 +aI-396 +aI87 +aI-441 +aa(lp3587 +g15 +aI146 +aI-626 +aI109 +aI-535 +aI125 +aI-581 +aa(lp3588 +g15 +aI225 +aI-756 +aI167 +aI-672 +aI194 +aI-715 +aa(lp3589 +g15 +aI336 +aI-864 +aI257 +aI-797 +aI294 +aI-833 +aa(lp3590 +g15 +aI477 +aI-938 +aI378 +aI-895 +aI425 +aI-920 +aa(lp3591 +g15 +aI650 +aI-966 +aI530 +aI-957 +aI587 +aI-966 +aa(lp3592 +g15 +aI790 +aI-944 +aI699 +aI-966 +aI746 +aI-959 +aa(lp3593 +g15 +aI908 +aI-878 +aI835 +aI-930 +aI874 +aI-908 +aa(lp3594 +g15 +aI988 +aI-764 +aI942 +aI-848 +aI968 +aI-810 +aa(lp3595 +g15 +aI1018 +aI-599 +aI1008 +aI-718 +aI1018 +aI-663 +aa(lp3596 +g15 +aI1006 +aI-484 +aI1018 +aI-563 +aI1014 +aI-524 +aa(lp3597 +g15 +aI971 +aI-363 +aI998 +aI-444 +aI986 +aI-403 +aa(lp3598 +g15 +aI910 +aI-244 +aI955 +aI-322 +aI935 +aI-283 +aa(lp3599 +g15 +aI825 +aI-138 +aI886 +aI-206 +aI858 +aI-170 +aa(lp3600 +g15 +aI716 +aI-53 +aI793 +aI-106 +aI756 +aI-77 +aa(lp3601 +g15 +aI581 +aI0 +aI675 +aI-29 +aI630 +aI-11 +aa(lp3602 +g15 +aI595 +aI121 +aI582 +aI49 +aI587 +aI89 +aa(lp3603 +g15 +aI626 +aI195 +aI602 +aI152 +aI613 +aI177 +aa(lp3604 +g15 +aI674 +aI232 +aI640 +aI213 +aI656 +aI225 +aa(lp3605 +g15 +aI734 +aI243 +aI692 +aI239 +aI712 +aI243 +aa(lp3606 +g20 +aI755 +aI243 +aa(lp3607 +g20 +aI738 +aI320 +aa(lp3608 +g20 +aI642 +aI320 +aa(lp3609 +g15 +aI531 +aI302 +aI602 +aI320 +aI565 +aI314 +aa(lp3610 +g15 +aI441 +aI246 +aI496 +aI290 +aI467 +aI272 +aa(lp3611 +g15 +aI381 +aI148 +aI416 +aI221 +aI396 +aI188 +aa(lp3612 +g15 +aI357 +aI4 +aI366 +aI108 +aI358 +aI60 +aa(lp3613 +g15 +aI246 +aI-36 +aI317 +aI-3 +aI280 +aI-17 +aa(lp3614 +g15 +aI159 +aI-111 +aI212 +aI-56 +aI183 +aI-81 +aa(lp3615 +g15 +aI102 +aI-217 +aI135 +aI-141 +aI116 +aI-176 +aa(lp3616 +g15 +aI82 +aI-354 +aI89 +aI-257 +aI82 +aI-303 +aa(lp3617 +g10 +aa(lp3618 +g8 +aI300 +aI-322 +aa(lp3619 +g15 +aI314 +aI-209 +aI300 +aI-278 +aI304 +aI-240 +aa(lp3620 +g15 +aI352 +aI-132 +aI323 +aI-178 +aI336 +aI-152 +aa(lp3621 +g15 +aI410 +aI-87 +aI368 +aI-111 +aI388 +aI-96 +aa(lp3622 +g15 +aI481 +aI-73 +aI432 +aI-77 +aI455 +aI-73 +aa(lp3623 +g15 +aI581 +aI-99 +aI518 +aI-73 +aI551 +aI-82 +aa(lp3624 +g15 +aI662 +aI-171 +aI611 +aI-117 +aI638 +aI-141 +aa(lp3625 +g15 +aI724 +aI-273 +aI686 +aI-200 +aI707 +aI-234 +aa(lp3626 +g15 +aI768 +aI-392 +aI742 +aI-311 +aI757 +aI-351 +aa(lp3627 +g15 +aI794 +aI-516 +aI780 +aI-434 +aI788 +aI-475 +aa(lp3628 +g15 +aI802 +aI-630 +aI799 +aI-557 +aI802 +aI-595 +aa(lp3629 +g15 +aI789 +aI-742 +aI802 +aI-673 +aI798 +aI-711 +aa(lp3630 +g15 +aI751 +aI-819 +aI779 +aI-773 +aI767 +aI-799 +aa(lp3631 +g15 +aI694 +aI-865 +aI735 +aI-840 +aI716 +aI-855 +aa(lp3632 +g15 +aI622 +aI-879 +aI672 +aI-874 +aI648 +aI-879 +aa(lp3633 +g15 +aI521 +aI-853 +aI585 +aI-879 +aI551 +aI-870 +aa(lp3634 +g15 +aI440 +aI-781 +aI491 +aI-835 +aI464 +aI-811 +aa(lp3635 +g15 +aI378 +aI-679 +aI416 +aI-752 +aI396 +aI-717 +aa(lp3636 +g15 +aI334 +aI-559 +aI360 +aI-641 +aI345 +aI-601 +aa(lp3637 +g15 +aI308 +aI-436 +aI322 +aI-518 +aI314 +aI-477 +aa(lp3638 +g15 +aI300 +aI-322 +aI302 +aI-395 +aI300 +aI-357 +aa(lp3639 +g10 +aa(lp3640 +g8 +aI1049 +aI0 +aa(lp3641 +g10 +aa(lp3642 +g8 +aI1049 +aI0 +aasVU +(lp3643 +(lp3644 +g8 +aI502 +aI-80 +aa(lp3645 +g15 +aI604 +aI-98 +aI542 +aI-80 +aI577 +aI-86 +aa(lp3646 +g15 +aI674 +aI-147 +aI632 +aI-110 +aI655 +aI-126 +aa(lp3647 +g15 +aI719 +aI-220 +aI693 +aI-167 +aI708 +aI-192 +aa(lp3648 +g15 +aI746 +aI-314 +aI730 +aI-249 +aI739 +aI-280 +aa(lp3649 +g20 +aI849 +aI-795 +aa(lp3650 +g15 +aI853 +aI-818 +aI850 +aI-803 +aI852 +aI-810 +aa(lp3651 +g15 +aI854 +aI-835 +aI854 +aI-826 +aI854 +aI-832 +aa(lp3652 +g15 +aI847 +aI-858 +aI854 +aI-845 +aI852 +aI-852 +aa(lp3653 +g15 +aI827 +aI-872 +aI842 +aI-864 +aI836 +aI-869 +aa(lp3654 +g15 +aI797 +aI-879 +aI819 +aI-876 +aI809 +aI-878 +aa(lp3655 +g15 +aI758 +aI-881 +aI785 +aI-880 +aI772 +aI-881 +aa(lp3656 +g20 +aI741 +aI-881 +aa(lp3657 +g20 +aI755 +aI-951 +aa(lp3658 +g20 +aI1106 +aI-951 +aa(lp3659 +g20 +aI1091 +aI-881 +aa(lp3660 +g20 +aI1074 +aI-881 +aa(lp3661 +g15 +aI1033 +aI-878 +aI1060 +aI-881 +aI1046 +aI-880 +aa(lp3662 +g15 +aI996 +aI-866 +aI1019 +aI-876 +aI1007 +aI-872 +aa(lp3663 +g15 +aI967 +aI-841 +aI984 +aI-861 +aI975 +aI-852 +aa(lp3664 +g15 +aI949 +aI-799 +aI959 +aI-831 +aI953 +aI-817 +aa(lp3665 +g20 +aI842 +aI-293 +aa(lp3666 +g15 +aI795 +aI-161 +aI832 +aI-243 +aI816 +aI-199 +aa(lp3667 +g15 +aI717 +aI-64 +aI775 +aI-122 +aI749 +aI-90 +aa(lp3668 +g15 +aI604 +aI-6 +aI685 +aI-39 +aI647 +aI-19 +aa(lp3669 +g15 +aI454 +aI13 +aI560 +aI6 +aI510 +aI13 +aa(lp3670 +g15 +aI316 +aI-1 +aI402 +aI13 +aI356 +aI8 +aa(lp3671 +g15 +aI215 +aI-46 +aI276 +aI-12 +aI242 +aI-26 +aa(lp3672 +g15 +aI153 +aI-119 +aI188 +aI-66 +aI167 +aI-90 +aa(lp3673 +g15 +aI132 +aI-216 +aI139 +aI-147 +aI132 +aI-180 +aa(lp3674 +g15 +aI133 +aI-243 +aI132 +aI-223 +aI132 +aI-232 +aa(lp3675 +g15 +aI136 +aI-275 +aI134 +aI-253 +aI135 +aI-264 +aa(lp3676 +g15 +aI141 +aI-307 +aI138 +aI-286 +aI139 +aI-297 +aa(lp3677 +g15 +aI146 +aI-335 +aI143 +aI-318 +aI144 +aI-327 +aa(lp3678 +g20 +aI244 +aI-789 +aa(lp3679 +g15 +aI251 +aI-835 +aI249 +aI-813 +aI251 +aI-828 +aa(lp3680 +g15 +aI244 +aI-858 +aI251 +aI-845 +aI249 +aI-852 +aa(lp3681 +g15 +aI224 +aI-872 +aI240 +aI-864 +aI233 +aI-869 +aa(lp3682 +g15 +aI194 +aI-879 +aI216 +aI-876 +aI206 +aI-878 +aa(lp3683 +g15 +aI156 +aI-881 +aI182 +aI-880 +aI170 +aI-881 +aa(lp3684 +g20 +aI138 +aI-881 +aa(lp3685 +g20 +aI153 +aI-951 +aa(lp3686 +g20 +aI614 +aI-951 +aa(lp3687 +g20 +aI600 +aI-881 +aa(lp3688 +g20 +aI582 +aI-881 +aa(lp3689 +g15 +aI540 +aI-878 +aI567 +aI-881 +aI553 +aI-880 +aa(lp3690 +g15 +aI502 +aI-867 +aI526 +aI-876 +aI513 +aI-872 +aa(lp3691 +g15 +aI473 +aI-843 +aI491 +aI-861 +aI481 +aI-853 +aa(lp3692 +g15 +aI455 +aI-802 +aI465 +aI-832 +aI459 +aI-819 +aa(lp3693 +g20 +aI354 +aI-332 +aa(lp3694 +g15 +aI349 +aI-306 +aI353 +aI-325 +aI351 +aI-316 +aa(lp3695 +g15 +aI344 +aI-277 +aI347 +aI-297 +aI345 +aI-287 +aa(lp3696 +g15 +aI340 +aI-246 +aI342 +aI-267 +aI341 +aI-256 +aa(lp3697 +g15 +aI338 +aI-216 +aI339 +aI-235 +aI338 +aI-226 +aa(lp3698 +g15 +aI380 +aI-115 +aI338 +aI-172 +aI352 +aI-138 +aa(lp3699 +g15 +aI502 +aI-80 +aI407 +aI-92 +aI448 +aI-80 +aa(lp3700 +g10 +aa(lp3701 +g8 +aI996 +aI0 +aa(lp3702 +g10 +aa(lp3703 +g8 +aI996 +aI0 +aasVY +(lp3704 +(lp3705 +g8 +aI147 +aI0 +aa(lp3706 +g20 +aI162 +aI-70 +aa(lp3707 +g20 +aI198 +aI-70 +aa(lp3708 +g15 +aI238 +aI-73 +aI212 +aI-70 +aI225 +aI-71 +aa(lp3709 +g15 +aI274 +aI-85 +aI251 +aI-75 +aI263 +aI-79 +aa(lp3710 +g15 +aI302 +aI-109 +aI285 +aI-91 +aI294 +aI-99 +aa(lp3711 +g15 +aI320 +aI-151 +aI310 +aI-119 +aI316 +aI-133 +aa(lp3712 +g20 +aI358 +aI-336 +aa(lp3713 +g20 +aI214 +aI-810 +aa(lp3714 +g15 +aI202 +aI-843 +aI210 +aI-823 +aI206 +aI-834 +aa(lp3715 +g15 +aI188 +aI-865 +aI198 +aI-852 +aI193 +aI-859 +aa(lp3716 +g15 +aI166 +aI-877 +aI182 +aI-870 +aI175 +aI-874 +aa(lp3717 +g15 +aI134 +aI-881 +aI158 +aI-879 +aI147 +aI-881 +aa(lp3718 +g20 +aI117 +aI-881 +aa(lp3719 +g20 +aI132 +aI-951 +aa(lp3720 +g20 +aI565 +aI-951 +aa(lp3721 +g20 +aI550 +aI-881 +aa(lp3722 +g20 +aI490 +aI-881 +aa(lp3723 +g15 +aI447 +aI-870 +aI470 +aI-881 +aI456 +aI-877 +aa(lp3724 +g15 +aI434 +aI-841 +aI439 +aI-863 +aI434 +aI-854 +aa(lp3725 +g15 +aI438 +aI-808 +aI434 +aI-834 +aI436 +aI-822 +aa(lp3726 +g15 +aI450 +aI-755 +aI441 +aI-793 +aI445 +aI-775 +aa(lp3727 +g20 +aI498 +aI-567 +aa(lp3728 +g15 +aI508 +aI-525 +aI501 +aI-554 +aI504 +aI-540 +aa(lp3729 +g15 +aI517 +aI-481 +aI511 +aI-510 +aI515 +aI-496 +aa(lp3730 +g15 +aI525 +aI-438 +aI520 +aI-466 +aI523 +aI-452 +aa(lp3731 +g15 +aI529 +aI-400 +aI527 +aI-423 +aI528 +aI-411 +aa(lp3732 +g15 +aI567 +aI-468 +aI537 +aI-418 +aI550 +aI-440 +aa(lp3733 +g15 +aI626 +aI-558 +aI583 +aI-495 +aI603 +aI-525 +aa(lp3734 +g20 +aI758 +aI-746 +aa(lp3735 +g15 +aI786 +aI-795 +aI769 +aI-761 +aI778 +aI-777 +aa(lp3736 +g15 +aI798 +aI-844 +aI794 +aI-813 +aI798 +aI-829 +aa(lp3737 +g15 +aI780 +aI-871 +aI798 +aI-856 +aI792 +aI-865 +aa(lp3738 +g15 +aI717 +aI-881 +aI767 +aI-878 +aI746 +aI-881 +aa(lp3739 +g20 +aI689 +aI-881 +aa(lp3740 +g20 +aI705 +aI-951 +aa(lp3741 +g20 +aI1054 +aI-951 +aa(lp3742 +g20 +aI1039 +aI-881 +aa(lp3743 +g20 +aI1014 +aI-881 +aa(lp3744 +g15 +aI987 +aI-877 +aI1004 +aI-881 +aI995 +aI-879 +aa(lp3745 +g15 +aI961 +aI-863 +aI978 +aI-874 +aI970 +aI-869 +aa(lp3746 +g15 +aI933 +aI-836 +aI952 +aI-856 +aI943 +aI-847 +aa(lp3747 +g15 +aI901 +aI-794 +aI924 +aI-825 +aI913 +aI-811 +aa(lp3748 +g20 +aI570 +aI-335 +aa(lp3749 +g20 +aI530 +aI-146 +aa(lp3750 +g15 +aI527 +aI-129 +aI529 +aI-141 +aI528 +aI-135 +aa(lp3751 +g15 +aI525 +aI-115 +aI526 +aI-123 +aI525 +aI-118 +aa(lp3752 +g15 +aI532 +aI-92 +aI525 +aI-105 +aI527 +aI-98 +aa(lp3753 +g15 +aI552 +aI-78 +aI537 +aI-86 +aI544 +aI-81 +aa(lp3754 +g15 +aI583 +aI-72 +aI561 +aI-75 +aI571 +aI-73 +aa(lp3755 +g15 +aI622 +aI-70 +aI595 +aI-71 +aI608 +aI-70 +aa(lp3756 +g20 +aI654 +aI-70 +aa(lp3757 +g20 +aI639 +aI0 +aa(lp3758 +g10 +aa(lp3759 +g8 +aI923 +aI0 +aa(lp3760 +g10 +aa(lp3761 +g8 +aI923 +aI0 +aasV] +(lp3762 +(lp3763 +g8 +aI549 +aI-1012 +aa(lp3764 +g20 +aI297 +aI171 +aa(lp3765 +g20 +aI-70 +aI171 +aa(lp3766 +g20 +aI-55 +aI100 +aa(lp3767 +g20 +aI1 +aI100 +aa(lp3768 +g15 +aI43 +aI97 +aI16 +aI100 +aI30 +aI99 +aa(lp3769 +g15 +aI81 +aI84 +aI57 +aI95 +aI70 +aI90 +aa(lp3770 +g15 +aI111 +aI54 +aI92 +aI77 +aI102 +aI67 +aa(lp3771 +g15 +aI130 +aI4 +aI120 +aI42 +aI126 +aI25 +aa(lp3772 +g20 +aI310 +aI-845 +aa(lp3773 +g15 +aI314 +aI-879 +aI313 +aI-859 +aI314 +aI-870 +aa(lp3774 +g15 +aI307 +aI-912 +aI314 +aI-893 +aI312 +aI-904 +aa(lp3775 +g15 +aI287 +aI-931 +aI302 +aI-920 +aI296 +aI-926 +aa(lp3776 +g15 +aI258 +aI-940 +aI279 +aI-936 +aI269 +aI-939 +aa(lp3777 +g15 +aI222 +aI-942 +aI247 +aI-941 +aI235 +aI-942 +aa(lp3778 +g20 +aI165 +aI-942 +aa(lp3779 +g20 +aI179 +aI-1012 +aa(lp3780 +g10 +aa(lp3781 +g8 +aI552 +aI0 +aa(lp3782 +g10 +aa(lp3783 +g8 +aI552 +aI0 +aasVa +(lp3784 +(lp3785 +g8 +aI630 +aI13 +aa(lp3786 +g15 +aI535 +aI-13 +aI591 +aI13 +aI559 +aI4 +aa(lp3787 +g15 +aI500 +aI-92 +aI511 +aI-31 +aI500 +aI-57 +aa(lp3788 +g15 +aI501 +aI-133 +aI500 +aI-106 +aI500 +aI-120 +aa(lp3789 +g15 +aI509 +aI-179 +aI503 +aI-146 +aI505 +aI-161 +aa(lp3790 +g20 +aI500 +aI-179 +aa(lp3791 +g15 +aI450 +aI-96 +aI483 +aI-148 +aI467 +aI-120 +aa(lp3792 +g15 +aI396 +aI-36 +aI434 +aI-72 +aI416 +aI-52 +aa(lp3793 +g15 +aI329 +aI0 +aI376 +aI-20 +aI354 +aI-7 +aa(lp3794 +g15 +aI244 +aI13 +aI305 +aI9 +aI276 +aI13 +aa(lp3795 +g15 +aI160 +aI-5 +aI212 +aI13 +aI184 +aI7 +aa(lp3796 +g15 +aI101 +aI-56 +aI136 +aI-17 +aI117 +aI-34 +aa(lp3797 +g15 +aI65 +aI-133 +aI85 +aI-77 +aI73 +aI-103 +aa(lp3798 +g15 +aI53 +aI-230 +aI57 +aI-163 +aI53 +aI-195 +aa(lp3799 +g15 +aI65 +aI-339 +aI53 +aI-264 +aI57 +aI-301 +aa(lp3800 +g15 +aI101 +aI-451 +aI73 +aI-377 +aI85 +aI-414 +aa(lp3801 +g15 +aI161 +aI-556 +aI117 +aI-488 +aI137 +aI-523 +aa(lp3802 +g15 +aI243 +aI-644 +aI184 +aI-590 +aI212 +aI-619 +aa(lp3803 +g15 +aI347 +aI-704 +aI274 +aI-669 +aI308 +aI-689 +aa(lp3804 +g15 +aI472 +aI-727 +aI385 +aI-719 +aI426 +aI-727 +aa(lp3805 +g15 +aI525 +aI-723 +aI489 +aI-727 +aI507 +aI-726 +aa(lp3806 +g15 +aI576 +aI-712 +aI543 +aI-720 +aI560 +aI-716 +aa(lp3807 +g15 +aI623 +aI-697 +aI593 +aI-708 +aI608 +aI-703 +aa(lp3808 +g15 +aI660 +aI-681 +aI637 +aI-692 +aI650 +aI-686 +aa(lp3809 +g20 +aI730 +aI-713 +aa(lp3810 +g20 +aI801 +aI-713 +aa(lp3811 +g20 +aI713 +aI-297 +aa(lp3812 +g15 +aI707 +aI-267 +aI711 +aI-289 +aI709 +aI-279 +aa(lp3813 +g15 +aI699 +aI-229 +aI704 +aI-255 +aI701 +aI-242 +aa(lp3814 +g15 +aI693 +aI-189 +aI697 +aI-215 +aI695 +aI-202 +aa(lp3815 +g15 +aI690 +aI-157 +aI691 +aI-176 +aI690 +aI-165 +aa(lp3816 +g15 +aI703 +aI-107 +aI690 +aI-134 +aI695 +aI-118 +aa(lp3817 +g15 +aI737 +aI-91 +aI712 +aI-96 +aI723 +aI-91 +aa(lp3818 +g15 +aI773 +aI-99 +aI750 +aI-91 +aI762 +aI-94 +aa(lp3819 +g15 +aI811 +aI-119 +aI785 +aI-104 +aI797 +aI-111 +aa(lp3820 +g20 +aI841 +aI-65 +aa(lp3821 +g15 +aI802 +aI-38 +aI829 +aI-57 +aI817 +aI-48 +aa(lp3822 +g15 +aI754 +aI-13 +aI788 +aI-29 +aI772 +aI-21 +aa(lp3823 +g15 +aI697 +aI5 +aI737 +aI-5 +aI718 +aI0 +aa(lp3824 +g15 +aI630 +aI13 +aI676 +aI10 +aI654 +aI13 +aa(lp3825 +g10 +aa(lp3826 +g8 +aI255 +aI-228 +aa(lp3827 +g15 +aI261 +aI-164 +aI255 +aI-203 +aI257 +aI-181 +aa(lp3828 +g15 +aI276 +aI-122 +aI265 +aI-146 +aI270 +aI-132 +aa(lp3829 +g15 +aI299 +aI-99 +aI282 +aI-111 +aI290 +aI-104 +aa(lp3830 +g15 +aI328 +aI-92 +aI308 +aI-94 +aI317 +aI-92 +aa(lp3831 +g15 +aI388 +aI-118 +aI347 +aI-92 +aI367 +aI-101 +aa(lp3832 +g15 +aI447 +aI-184 +aI409 +aI-134 +aI429 +aI-157 +aa(lp3833 +g15 +aI496 +aI-278 +aI465 +aI-212 +aI481 +aI-243 +aa(lp3834 +g15 +aI529 +aI-383 +aI510 +aI-312 +aI521 +aI-348 +aa(lp3835 +g20 +aI576 +aI-605 +aa(lp3836 +g15 +aI540 +aI-633 +aI567 +aI-617 +aI555 +aI-626 +aa(lp3837 +g15 +aI490 +aI-642 +aI524 +aI-639 +aI508 +aI-642 +aa(lp3838 +g15 +aI419 +aI-621 +aI464 +aI-642 +aI441 +aI-635 +aa(lp3839 +g15 +aI361 +aI-567 +aI398 +aI-608 +aI378 +aI-590 +aa(lp3840 +g15 +aI315 +aI-491 +aI343 +aI-545 +aI328 +aI-519 +aa(lp3841 +g15 +aI282 +aI-401 +aI302 +aI-462 +aI291 +aI-432 +aa(lp3842 +g15 +aI262 +aI-310 +aI273 +aI-371 +aI266 +aI-340 +aa(lp3843 +g15 +aI255 +aI-228 +aI258 +aI-280 +aI255 +aI-253 +aa(lp3844 +g10 +aa(lp3845 +g8 +aI886 +aI0 +aa(lp3846 +g10 +aa(lp3847 +g8 +aI886 +aI0 +aasVe +(lp3848 +(lp3849 +g8 +aI402 +aI-87 +aa(lp3850 +g15 +aI464 +aI-96 +aI424 +aI-87 +aI444 +aI-90 +aa(lp3851 +g15 +aI518 +aI-121 +aI483 +aI-103 +aI501 +aI-111 +aa(lp3852 +g15 +aI563 +aI-156 +aI535 +aI-131 +aI550 +aI-143 +aa(lp3853 +g15 +aI597 +aI-195 +aI576 +aI-168 +aI588 +aI-182 +aa(lp3854 +g15 +aI610 +aI-170 +aI602 +aI-188 +aI606 +aI-180 +aa(lp3855 +g15 +aI614 +aI-138 +aI613 +aI-160 +aI614 +aI-149 +aa(lp3856 +g15 +aI598 +aI-87 +aI614 +aI-122 +aI609 +aI-105 +aa(lp3857 +g15 +aI551 +aI-38 +aI588 +aI-69 +aI572 +aI-53 +aa(lp3858 +g15 +aI469 +aI-1 +aI529 +aI-23 +aI502 +aI-10 +aa(lp3859 +g15 +aI350 +aI13 +aI435 +aI8 +aI396 +aI13 +aa(lp3860 +g15 +aI235 +aI-3 +aI310 +aI13 +aI271 +aI7 +aa(lp3861 +g15 +aI140 +aI-54 +aI199 +aI-14 +aI168 +aI-31 +aa(lp3862 +g15 +aI76 +aI-140 +aI113 +aI-77 +aI92 +aI-105 +aa(lp3863 +g15 +aI53 +aI-261 +aI61 +aI-175 +aI53 +aI-215 +aa(lp3864 +g15 +aI66 +aI-365 +aI53 +aI-294 +aI57 +aI-329 +aa(lp3865 +g15 +aI105 +aI-471 +aI75 +aI-401 +aI87 +aI-436 +aa(lp3866 +g15 +aI168 +aI-569 +aI122 +aI-505 +aI143 +aI-538 +aa(lp3867 +g15 +aI257 +aI-651 +aI194 +aI-600 +aI223 +aI-627 +aa(lp3868 +g15 +aI369 +aI-706 +aI290 +aI-674 +aI328 +aI-693 +aa(lp3869 +g15 +aI505 +aI-727 +aI410 +aI-720 +aI456 +aI-727 +aa(lp3870 +g15 +aI653 +aI-686 +aI569 +aI-727 +aI618 +aI-713 +aa(lp3871 +g15 +aI706 +aI-570 +aI688 +aI-658 +aI706 +aI-619 +aa(lp3872 +g15 +aI676 +aI-466 +aI706 +aI-534 +aI696 +aI-499 +aa(lp3873 +g15 +aI593 +aI-380 +aI656 +aI-434 +aI628 +aI-405 +aa(lp3874 +g15 +aI468 +aI-320 +aI558 +aI-355 +aI516 +aI-335 +aa(lp3875 +g15 +aI309 +aI-298 +aI419 +aI-305 +aI366 +aI-298 +aa(lp3876 +g15 +aI285 +aI-298 +aI301 +aI-298 +aI293 +aI-298 +aa(lp3877 +g15 +aI259 +aI-299 +aI276 +aI-298 +aI268 +aI-298 +aa(lp3878 +g15 +aI257 +aI-273 +aI258 +aI-290 +aI257 +aI-282 +aa(lp3879 +g15 +aI257 +aI-248 +aI257 +aI-264 +aI257 +aI-256 +aa(lp3880 +g15 +aI293 +aI-129 +aI257 +aI-197 +aI269 +aI-157 +aa(lp3881 +g15 +aI402 +aI-87 +aI317 +aI-101 +aI353 +aI-87 +aa(lp3882 +g10 +aa(lp3883 +g8 +aI449 +aI-647 +aa(lp3884 +g15 +aI387 +aI-622 +aI427 +aI-647 +aI406 +aI-639 +aa(lp3885 +g15 +aI334 +aI-559 +aI367 +aI-606 +aI350 +aI-585 +aa(lp3886 +g15 +aI294 +aI-471 +aI319 +aI-533 +aI305 +aI-504 +aa(lp3887 +g15 +aI269 +aI-375 +aI282 +aI-439 +aI274 +aI-407 +aa(lp3888 +g20 +aI281 +aI-375 +aa(lp3889 +g15 +aI373 +aI-388 +aI314 +aI-375 +aI344 +aI-380 +aa(lp3890 +g15 +aI447 +aI-426 +aI401 +aI-397 +aI426 +aI-410 +aa(lp3891 +g15 +aI497 +aI-484 +aI468 +aI-442 +aI485 +aI-462 +aa(lp3892 +g15 +aI514 +aI-560 +aI509 +aI-507 +aI514 +aI-532 +aa(lp3893 +g15 +aI497 +aI-624 +aI514 +aI-588 +aI509 +aI-609 +aa(lp3894 +g15 +aI449 +aI-647 +aI486 +aI-639 +aI470 +aI-647 +aa(lp3895 +g10 +aa(lp3896 +g8 +aI713 +aI0 +aa(lp3897 +g10 +aa(lp3898 +g8 +aI713 +aI0 +aasVi +(lp3899 +(lp3900 +g8 +aI404 +aI-714 +aa(lp3901 +g20 +aI311 +aI-280 +aa(lp3902 +g15 +aI298 +aI-212 +aI306 +aI-256 +aI302 +aI-233 +aa(lp3903 +g15 +aI293 +aI-153 +aI295 +aI-191 +aI293 +aI-171 +aa(lp3904 +g15 +aI305 +aI-108 +aI293 +aI-133 +aI297 +aI-118 +aa(lp3905 +g15 +aI339 +aI-92 +aI313 +aI-97 +aI325 +aI-92 +aa(lp3906 +g15 +aI378 +aI-100 +aI353 +aI-92 +aI366 +aI-95 +aa(lp3907 +g15 +aI418 +aI-123 +aI389 +aI-105 +aI403 +aI-113 +aa(lp3908 +g20 +aI450 +aI-78 +aa(lp3909 +g15 +aI414 +aI-44 +aI440 +aI-67 +aI428 +aI-55 +aa(lp3910 +g15 +aI369 +aI-15 +aI401 +aI-33 +aI386 +aI-23 +aa(lp3911 +g15 +aI313 +aI5 +aI352 +aI-6 +aI333 +aI0 +aa(lp3912 +g15 +aI246 +aI13 +aI293 +aI10 +aI271 +aI13 +aa(lp3913 +g15 +aI128 +aI-22 +aI195 +aI13 +aI156 +aI1 +aa(lp3914 +g15 +aI87 +aI-123 +aI101 +aI-46 +aI87 +aI-80 +aa(lp3915 +g15 +aI93 +aI-191 +aI87 +aI-142 +aI89 +aI-165 +aa(lp3916 +g15 +aI109 +aI-282 +aI96 +aI-218 +aI101 +aI-248 +aa(lp3917 +g20 +aI161 +aI-530 +aa(lp3918 +g15 +aI165 +aI-547 +aI162 +aI-535 +aI163 +aI-541 +aa(lp3919 +g15 +aI167 +aI-564 +aI166 +aI-553 +aI167 +aI-559 +aa(lp3920 +g15 +aI169 +aI-578 +aI168 +aI-570 +aI169 +aI-575 +aa(lp3921 +g15 +aI170 +aI-587 +aI170 +aI-582 +aI170 +aI-585 +aa(lp3922 +g15 +aI166 +aI-616 +aI170 +aI-599 +aI169 +aI-609 +aa(lp3923 +g15 +aI154 +aI-633 +aI164 +aI-624 +aI159 +aI-629 +aa(lp3924 +g15 +aI132 +aI-641 +aI148 +aI-637 +aI141 +aI-640 +aa(lp3925 +g15 +aI100 +aI-643 +aI123 +aI-642 +aI112 +aI-643 +aa(lp3926 +g20 +aI76 +aI-643 +aa(lp3927 +g20 +aI87 +aI-714 +aa(lp3928 +g10 +aa(lp3929 +g8 +aI311 +aI-834 +aa(lp3930 +g15 +aI270 +aI-839 +aI297 +aI-834 +aI283 +aI-835 +aa(lp3931 +g15 +aI237 +aI-854 +aI258 +aI-842 +aI247 +aI-847 +aa(lp3932 +g15 +aI215 +aI-880 +aI228 +aI-861 +aI221 +aI-869 +aa(lp3933 +g15 +aI207 +aI-916 +aI210 +aI-890 +aI207 +aI-902 +aa(lp3934 +g15 +aI217 +aI-966 +aI207 +aI-936 +aI211 +aI-952 +aa(lp3935 +g15 +aI244 +aI-1000 +aI224 +aI-980 +aI233 +aI-991 +aa(lp3936 +g15 +aI284 +aI-1020 +aI256 +aI-1009 +aI269 +aI-1015 +aa(lp3937 +g15 +aI332 +aI-1026 +aI299 +aI-1024 +aI315 +aI-1026 +aa(lp3938 +g15 +aI372 +aI-1021 +aI346 +aI-1026 +aI359 +aI-1024 +aa(lp3939 +g15 +aI406 +aI-1006 +aI385 +aI-1018 +aI396 +aI-1013 +aa(lp3940 +g15 +aI430 +aI-980 +aI416 +aI-999 +aI424 +aI-990 +aa(lp3941 +g15 +aI438 +aI-942 +aI435 +aI-969 +aI438 +aI-957 +aa(lp3942 +g15 +aI428 +aI-894 +aI438 +aI-924 +aI435 +aI-908 +aa(lp3943 +g15 +aI399 +aI-860 +aI420 +aI-880 +aI411 +aI-869 +aa(lp3944 +g15 +aI358 +aI-840 +aI387 +aI-851 +aI373 +aI-845 +aa(lp3945 +g15 +aI311 +aI-834 +aI343 +aI-836 +aI327 +aI-834 +aa(lp3946 +g10 +aa(lp3947 +g8 +aI472 +aI0 +aa(lp3948 +g10 +aa(lp3949 +g8 +aI472 +aI0 +aasVm +(lp3950 +(lp3951 +g8 +aI1066 +aI9 +aa(lp3952 +g15 +aI949 +aI-26 +aI1015 +aI9 +aI976 +aI-2 +aa(lp3953 +g15 +aI908 +aI-127 +aI921 +aI-51 +aI908 +aI-84 +aa(lp3954 +g15 +aI913 +aI-195 +aI908 +aI-146 +aI909 +aI-169 +aa(lp3955 +g15 +aI929 +aI-286 +aI916 +aI-221 +aI921 +aI-252 +aa(lp3956 +g20 +aI951 +aI-391 +aa(lp3957 +g15 +aI959 +aI-423 +aI953 +aI-400 +aI956 +aI-410 +aa(lp3958 +g15 +aI967 +aI-462 +aI962 +aI-435 +aI964 +aI-449 +aa(lp3959 +g15 +aI973 +aI-503 +aI969 +aI-476 +aI971 +aI-490 +aa(lp3960 +g15 +aI975 +aI-540 +aI975 +aI-517 +aI975 +aI-529 +aa(lp3961 +g15 +aI973 +aI-566 +aI975 +aI-548 +aI975 +aI-557 +aa(lp3962 +g15 +aI965 +aI-591 +aI972 +aI-575 +aI969 +aI-583 +aa(lp3963 +g15 +aI949 +aI-609 +aI961 +aI-598 +aI956 +aI-604 +aa(lp3964 +g15 +aI922 +aI-616 +aI942 +aI-614 +aI933 +aI-616 +aa(lp3965 +g15 +aI879 +aI-601 +aI908 +aI-616 +aI893 +aI-611 +aa(lp3966 +g15 +aI838 +aI-562 +aI865 +aI-591 +aI851 +aI-578 +aa(lp3967 +g15 +aI800 +aI-506 +aI825 +aI-546 +aI812 +aI-527 +aa(lp3968 +g15 +aI767 +aI-441 +aI788 +aI-485 +aI777 +aI-463 +aa(lp3969 +g15 +aI742 +aI-376 +aI758 +aI-419 +aI749 +aI-397 +aa(lp3970 +g15 +aI727 +aI-317 +aI735 +aI-354 +aI730 +aI-335 +aa(lp3971 +g20 +aI717 +aI-261 +aa(lp3972 +g15 +aI711 +aI-224 +aI715 +aI-252 +aI713 +aI-240 +aa(lp3973 +g15 +aI703 +aI-173 +aI708 +aI-208 +aI706 +aI-191 +aa(lp3974 +g15 +aI695 +aI-117 +aI701 +aI-155 +aI698 +aI-136 +aa(lp3975 +g15 +aI689 +aI-64 +aI693 +aI-98 +aI691 +aI-80 +aa(lp3976 +g15 +aI684 +aI-22 +aI687 +aI-48 +aI685 +aI-34 +aa(lp3977 +g15 +aI682 +aI0 +aI683 +aI-10 +aI682 +aI-3 +aa(lp3978 +g20 +aI475 +aI0 +aa(lp3979 +g15 +aI478 +aI-26 +aI475 +aI-4 +aI476 +aI-13 +aa(lp3980 +g15 +aI484 +aI-72 +aI479 +aI-39 +aI481 +aI-55 +aa(lp3981 +g15 +aI493 +aI-129 +aI486 +aI-90 +aI490 +aI-109 +aa(lp3982 +g15 +aI503 +aI-190 +aI496 +aI-150 +aI500 +aI-170 +aa(lp3983 +g15 +aI514 +aI-249 +aI507 +aI-211 +aI510 +aI-230 +aa(lp3984 +g15 +aI524 +aI-297 +aI517 +aI-267 +aI521 +aI-283 +aa(lp3985 +g20 +aI544 +aI-390 +aa(lp3986 +g15 +aI550 +aI-421 +aI546 +aI-398 +aI548 +aI-408 +aa(lp3987 +g15 +aI557 +aI-460 +aI552 +aI-434 +aI555 +aI-447 +aa(lp3988 +g15 +aI563 +aI-502 +aI560 +aI-474 +aI562 +aI-488 +aa(lp3989 +g15 +aI566 +aI-539 +aI565 +aI-516 +aI566 +aI-528 +aa(lp3990 +g15 +aI565 +aI-564 +aI566 +aI-547 +aI565 +aI-555 +aa(lp3991 +g15 +aI559 +aI-588 +aI564 +aI-573 +aI562 +aI-581 +aa(lp3992 +g15 +aI546 +aI-605 +aI556 +aI-595 +aI552 +aI-601 +aa(lp3993 +g15 +aI522 +aI-612 +aI540 +aI-610 +aI532 +aI-612 +aa(lp3994 +g15 +aI478 +aI-599 +aI508 +aI-612 +aI493 +aI-608 +aa(lp3995 +g15 +aI436 +aI-562 +aI464 +aI-590 +aI450 +aI-577 +aa(lp3996 +g15 +aI398 +aI-510 +aI423 +aI-547 +aI410 +aI-530 +aa(lp3997 +g15 +aI365 +aI-450 +aI386 +aI-491 +aI375 +aI-471 +aa(lp3998 +g15 +aI340 +aI-389 +aI355 +aI-429 +aI347 +aI-409 +aa(lp3999 +g15 +aI324 +aI-334 +aI333 +aI-369 +aI327 +aI-350 +aa(lp4000 +g20 +aI249 +aI0 +aa(lp4001 +g20 +aI49 +aI0 +aa(lp4002 +g20 +aI161 +aI-530 +aa(lp4003 +g15 +aI165 +aI-547 +aI162 +aI-535 +aI163 +aI-541 +aa(lp4004 +g15 +aI167 +aI-564 +aI166 +aI-553 +aI167 +aI-559 +aa(lp4005 +g15 +aI169 +aI-578 +aI168 +aI-570 +aI169 +aI-575 +aa(lp4006 +g15 +aI170 +aI-587 +aI170 +aI-582 +aI170 +aI-585 +aa(lp4007 +g15 +aI166 +aI-616 +aI170 +aI-599 +aI169 +aI-609 +aa(lp4008 +g15 +aI154 +aI-633 +aI164 +aI-624 +aI159 +aI-629 +aa(lp4009 +g15 +aI132 +aI-641 +aI148 +aI-637 +aI141 +aI-640 +aa(lp4010 +g15 +aI100 +aI-643 +aI123 +aI-642 +aI112 +aI-643 +aa(lp4011 +g20 +aI76 +aI-643 +aa(lp4012 +g20 +aI87 +aI-714 +aa(lp4013 +g20 +aI397 +aI-714 +aa(lp4014 +g20 +aI371 +aI-578 +aa(lp4015 +g20 +aI381 +aI-578 +aa(lp4016 +g15 +aI435 +aI-647 +aI398 +aI-605 +aI416 +aI-628 +aa(lp4017 +g15 +aI493 +aI-693 +aI453 +aI-665 +aI473 +aI-681 +aa(lp4018 +g15 +aI558 +aI-719 +aI513 +aI-705 +aI535 +aI-713 +aa(lp4019 +g15 +aI632 +aI-727 +aI581 +aI-724 +aI605 +aI-727 +aa(lp4020 +g15 +aI701 +aI-715 +aI659 +aI-727 +aI683 +aI-723 +aa(lp4021 +g15 +aI746 +aI-683 +aI720 +aI-707 +aI735 +aI-697 +aa(lp4022 +g15 +aI771 +aI-637 +aI758 +aI-670 +aI766 +aI-654 +aa(lp4023 +g15 +aI778 +aI-582 +aI776 +aI-620 +aI778 +aI-601 +aa(lp4024 +g20 +aI778 +aI-571 +aa(lp4025 +g20 +aI786 +aI-571 +aa(lp4026 +g15 +aI837 +aI-641 +aI802 +aI-598 +aI819 +aI-621 +aa(lp4027 +g15 +aI894 +aI-691 +aI855 +aI-661 +aI874 +aI-678 +aa(lp4028 +g15 +aI960 +aI-721 +aI914 +aI-704 +aI937 +aI-714 +aa(lp4029 +g15 +aI1039 +aI-731 +aI984 +aI-727 +aI1011 +aI-731 +aa(lp4030 +g15 +aI1108 +aI-718 +aI1067 +aI-731 +aI1090 +aI-727 +aa(lp4031 +g15 +aI1154 +aI-685 +aI1127 +aI-710 +aI1142 +aI-699 +aa(lp4032 +g15 +aI1179 +aI-636 +aI1166 +aI-671 +aI1174 +aI-655 +aa(lp4033 +g15 +aI1186 +aI-578 +aI1184 +aI-618 +aI1186 +aI-598 +aa(lp4034 +g15 +aI1184 +aI-542 +aI1186 +aI-567 +aI1185 +aI-554 +aa(lp4035 +g15 +aI1178 +aI-503 +aI1182 +aI-529 +aI1180 +aI-516 +aa(lp4036 +g15 +aI1170 +aI-464 +aI1175 +aI-490 +aI1173 +aI-477 +aa(lp4037 +g15 +aI1162 +aI-427 +aI1167 +aI-451 +aI1164 +aI-439 +aa(lp4038 +g20 +aI1132 +aI-284 +aa(lp4039 +g15 +aI1118 +aI-216 +aI1126 +aI-260 +aI1121 +aI-238 +aa(lp4040 +g15 +aI1113 +aI-157 +aI1115 +aI-195 +aI1113 +aI-175 +aa(lp4041 +g15 +aI1125 +aI-112 +aI1113 +aI-137 +aI1117 +aI-122 +aa(lp4042 +g15 +aI1160 +aI-97 +aI1133 +aI-102 +aI1145 +aI-97 +aa(lp4043 +g15 +aI1198 +aI-105 +aI1174 +aI-97 +aI1186 +aI-99 +aa(lp4044 +g15 +aI1238 +aI-127 +aI1209 +aI-110 +aI1223 +aI-117 +aa(lp4045 +g20 +aI1270 +aI-82 +aa(lp4046 +g15 +aI1234 +aI-48 +aI1259 +aI-70 +aI1247 +aI-59 +aa(lp4047 +g15 +aI1189 +aI-19 +aI1220 +aI-37 +aI1205 +aI-27 +aa(lp4048 +g15 +aI1133 +aI1 +aI1172 +aI-10 +aI1153 +aI-3 +aa(lp4049 +g15 +aI1066 +aI9 +aI1113 +aI6 +aI1090 +aI9 +aa(lp4050 +g10 +aa(lp4051 +g8 +aI1292 +aI0 +aa(lp4052 +g10 +aa(lp4053 +g8 +aI1292 +aI0 +aasVq +(lp4054 +(lp4055 +g8 +aI255 +aI-233 +aa(lp4056 +g15 +aI261 +aI-168 +aI255 +aI-208 +aI257 +aI-186 +aa(lp4057 +g15 +aI276 +aI-125 +aI265 +aI-151 +aI270 +aI-136 +aa(lp4058 +g15 +aI299 +aI-100 +aI282 +aI-113 +aI290 +aI-105 +aa(lp4059 +g15 +aI328 +aI-92 +aI308 +aI-95 +aI317 +aI-92 +aa(lp4060 +g15 +aI368 +aI-104 +aI341 +aI-92 +aI355 +aI-96 +aa(lp4061 +g15 +aI409 +aI-137 +aI382 +aI-112 +aI396 +aI-123 +aa(lp4062 +g15 +aI448 +aI-187 +aI422 +aI-151 +aI435 +aI-168 +aa(lp4063 +g15 +aI482 +aI-248 +aI460 +aI-206 +aI471 +aI-227 +aa(lp4064 +g15 +aI509 +aI-316 +aI492 +aI-270 +aI501 +aI-293 +aa(lp4065 +g15 +aI527 +aI-384 +aI517 +aI-339 +aI523 +aI-362 +aa(lp4066 +g20 +aI576 +aI-605 +aa(lp4067 +g15 +aI544 +aI-631 +aI570 +aI-614 +aI559 +aI-623 +aa(lp4068 +g15 +aI489 +aI-642 +aI529 +aI-638 +aI510 +aI-642 +aa(lp4069 +g15 +aI417 +aI-621 +aI463 +aI-642 +aI439 +aI-635 +aa(lp4070 +g15 +aI358 +aI-566 +aI395 +aI-607 +aI376 +aI-589 +aa(lp4071 +g15 +aI313 +aI-488 +aI341 +aI-543 +aI326 +aI-517 +aa(lp4072 +g15 +aI281 +aI-399 +aI300 +aI-459 +aI290 +aI-429 +aa(lp4073 +g15 +aI262 +aI-311 +aI273 +aI-369 +aI266 +aI-339 +aa(lp4074 +g15 +aI255 +aI-233 +aI258 +aI-282 +aI255 +aI-256 +aa(lp4075 +g10 +aa(lp4076 +g8 +aI458 +aI53 +aa(lp4077 +g15 +aI464 +aI28 +aI460 +aI46 +aI462 +aI38 +aa(lp4078 +g15 +aI471 +aI-5 +aI466 +aI17 +aI468 +aI6 +aa(lp4079 +g15 +aI479 +aI-43 +aI473 +aI-17 +aI476 +aI-30 +aa(lp4080 +g15 +aI487 +aI-82 +aI482 +aI-56 +aI485 +aI-69 +aa(lp4081 +g15 +aI509 +aI-179 +aI494 +aI-113 +aI501 +aI-145 +aa(lp4082 +g20 +aI501 +aI-179 +aa(lp4083 +g15 +aI454 +aI-100 +aI486 +aI-150 +aI470 +aI-123 +aa(lp4084 +g15 +aI400 +aI-39 +aI438 +aI-76 +aI420 +aI-56 +aa(lp4085 +g15 +aI332 +aI0 +aI380 +aI-22 +aI358 +aI-9 +aa(lp4086 +g15 +aI242 +aI13 +aI307 +aI8 +aI277 +aI13 +aa(lp4087 +g15 +aI165 +aI-2 +aI214 +aI13 +aI188 +aI8 +aa(lp4088 +g15 +aI106 +aI-48 +aI142 +aI-12 +aI122 +aI-27 +aa(lp4089 +g15 +aI67 +aI-124 +aI89 +aI-68 +aI76 +aI-94 +aa(lp4090 +g15 +aI53 +aI-230 +aI58 +aI-154 +aI53 +aI-190 +aa(lp4091 +g15 +aI66 +aI-339 +aI53 +aI-264 +aI57 +aI-301 +aa(lp4092 +g15 +aI102 +aI-451 +aI74 +aI-377 +aI86 +aI-414 +aa(lp4093 +g15 +aI162 +aI-556 +aI118 +aI-488 +aI138 +aI-523 +aa(lp4094 +g15 +aI243 +aI-644 +aI186 +aI-590 +aI213 +aI-619 +aa(lp4095 +g15 +aI344 +aI-704 +aI273 +aI-669 +aI307 +aI-689 +aa(lp4096 +g15 +aI462 +aI-727 +aI380 +aI-719 +aI420 +aI-727 +aa(lp4097 +g15 +aI520 +aI-723 +aI482 +aI-727 +aI501 +aI-726 +aa(lp4098 +g15 +aI573 +aI-713 +aI538 +aI-720 +aI556 +aI-717 +aa(lp4099 +g15 +aI620 +aI-699 +aI590 +aI-709 +aI606 +aI-704 +aa(lp4100 +g15 +aI658 +aI-683 +aI634 +aI-694 +aI647 +aI-689 +aa(lp4101 +g20 +aI737 +aI-727 +aa(lp4102 +g20 +aI804 +aI-727 +aa(lp4103 +g20 +aI621 +aI136 +aa(lp4104 +g15 +aI614 +aI172 +aI618 +aI147 +aI616 +aI159 +aa(lp4105 +g15 +aI611 +aI204 +aI612 +aI184 +aI611 +aI195 +aa(lp4106 +g15 +aI628 +aI239 +aI611 +aI220 +aI617 +aI231 +aa(lp4107 +g15 +aI682 +aI249 +aI639 +aI246 +aI657 +aI249 +aa(lp4108 +g20 +aI733 +aI249 +aa(lp4109 +g20 +aI721 +aI320 +aa(lp4110 +g20 +aI405 +aI320 +aa(lp4111 +g10 +aa(lp4112 +g8 +aI841 +aI0 +aa(lp4113 +g10 +aa(lp4114 +g8 +aI841 +aI0 +aasVu +(lp4115 +(lp4116 +g8 +aI516 +aI-114 +aa(lp4117 +g15 +aI516 +aI-127 +aI516 +aI-118 +aI516 +aI-122 +aa(lp4118 +g15 +aI518 +aI-144 +aI517 +aI-133 +aI517 +aI-138 +aa(lp4119 +g15 +aI520 +aI-160 +aI519 +aI-149 +aI519 +aI-155 +aa(lp4120 +g15 +aI522 +aI-172 +aI521 +aI-165 +aI521 +aI-169 +aa(lp4121 +g20 +aI511 +aI-172 +aa(lp4122 +g15 +aI454 +aI-97 +aI492 +aI-144 +aI472 +aI-119 +aa(lp4123 +g15 +aI393 +aI-38 +aI435 +aI-74 +aI415 +aI-55 +aa(lp4124 +g15 +aI324 +aI-1 +aI372 +aI-22 +aI349 +aI-10 +aa(lp4125 +g15 +aI240 +aI12 +aI300 +aI7 +aI271 +aI12 +aa(lp4126 +g15 +aI167 +aI0 +aI211 +aI12 +aI187 +aI8 +aa(lp4127 +g15 +aI121 +aI-32 +aI148 +aI-7 +aI132 +aI-18 +aa(lp4128 +g15 +aI95 +aI-79 +aI109 +aI-45 +aI100 +aI-61 +aa(lp4129 +g15 +aI87 +aI-135 +aI90 +aI-97 +aI87 +aI-116 +aa(lp4130 +g15 +aI95 +aI-208 +aI87 +aI-157 +aI90 +aI-182 +aa(lp4131 +g15 +aI110 +aI-282 +aI100 +aI-235 +aI105 +aI-259 +aa(lp4132 +g20 +aI158 +aI-517 +aa(lp4133 +g15 +aI167 +aI-566 +aI162 +aI-535 +aI165 +aI-551 +aa(lp4134 +g15 +aI170 +aI-599 +aI169 +aI-581 +aI170 +aI-592 +aa(lp4135 +g15 +aI154 +aI-634 +aI170 +aI-617 +aI165 +aI-629 +aa(lp4136 +g15 +aI100 +aI-643 +aI143 +aI-640 +aI125 +aI-643 +aa(lp4137 +g20 +aI76 +aI-643 +aa(lp4138 +g20 +aI87 +aI-714 +aa(lp4139 +g20 +aI408 +aI-714 +aa(lp4140 +g20 +aI320 +aI-315 +aa(lp4141 +g15 +aI312 +aI-280 +aI317 +aI-304 +aI315 +aI-293 +aa(lp4142 +g15 +aI305 +aI-241 +aI309 +aI-267 +aI307 +aI-254 +aa(lp4143 +g15 +aI299 +aI-203 +aI303 +aI-228 +aI301 +aI-215 +aa(lp4144 +g15 +aI297 +aI-174 +aI298 +aI-192 +aI297 +aI-182 +aa(lp4145 +g15 +aI309 +aI-127 +aI297 +aI-154 +aI301 +aI-138 +aa(lp4146 +g15 +aI354 +aI-110 +aI318 +aI-115 +aI333 +aI-110 +aa(lp4147 +g15 +aI415 +aI-136 +aI374 +aI-110 +aI394 +aI-119 +aa(lp4148 +g15 +aI474 +aI-204 +aI435 +aI-154 +aI455 +aI-176 +aa(lp4149 +g15 +aI524 +aI-298 +aI493 +aI-232 +aI509 +aI-264 +aa(lp4150 +g15 +aI558 +aI-400 +aI539 +aI-333 +aI550 +aI-367 +aa(lp4151 +g20 +aI629 +aI-714 +aa(lp4152 +g20 +aI828 +aI-714 +aa(lp4153 +g20 +aI737 +aI-280 +aa(lp4154 +g15 +aI723 +aI-212 +aI731 +aI-256 +aI727 +aI-233 +aa(lp4155 +g15 +aI718 +aI-153 +aI720 +aI-191 +aI718 +aI-171 +aa(lp4156 +g15 +aI730 +aI-108 +aI718 +aI-133 +aI722 +aI-118 +aa(lp4157 +g15 +aI765 +aI-92 +aI738 +aI-97 +aI750 +aI-92 +aa(lp4158 +g15 +aI803 +aI-100 +aI779 +aI-92 +aI792 +aI-95 +aa(lp4159 +g15 +aI843 +aI-123 +aI815 +aI-105 +aI828 +aI-113 +aa(lp4160 +g20 +aI876 +aI-78 +aa(lp4161 +g15 +aI839 +aI-44 +aI865 +aI-67 +aI853 +aI-55 +aa(lp4162 +g15 +aI794 +aI-15 +aI826 +aI-33 +aI811 +aI-23 +aa(lp4163 +g15 +aI738 +aI5 +aI777 +aI-6 +aI759 +aI0 +aa(lp4164 +g15 +aI671 +aI13 +aI718 +aI10 +aI696 +aI13 +aa(lp4165 +g15 +aI597 +aI3 +aI642 +aI13 +aI617 +aI10 +aa(lp4166 +g15 +aI550 +aI-23 +aI578 +aI-3 +aI562 +aI-12 +aa(lp4167 +g15 +aI524 +aI-64 +aI537 +aI-35 +aI529 +aI-48 +aa(lp4168 +g15 +aI516 +aI-114 +aI518 +aI-79 +aI516 +aI-96 +aa(lp4169 +g10 +aa(lp4170 +g8 +aI897 +aI0 +aa(lp4171 +g10 +aa(lp4172 +g8 +aI897 +aI0 +aasVy +(lp4173 +(lp4174 +g8 +aI104 +aI-573 +aa(lp4175 +g15 +aI71 +aI-628 +aI96 +aI-599 +aI86 +aI-617 +aa(lp4176 +g15 +aI11 +aI-643 +aI57 +aI-638 +aI37 +aI-643 +aa(lp4177 +g20 +aI-1 +aI-643 +aa(lp4178 +g20 +aI14 +aI-714 +aa(lp4179 +g20 +aI276 +aI-714 +aa(lp4180 +g20 +aI363 +aI-368 +aa(lp4181 +g15 +aI377 +aI-307 +aI368 +aI-351 +aI372 +aI-331 +aa(lp4182 +g15 +aI391 +aI-238 +aI382 +aI-284 +aI386 +aI-261 +aa(lp4183 +g15 +aI402 +aI-173 +aI395 +aI-214 +aI399 +aI-193 +aa(lp4184 +g15 +aI408 +aI-126 +aI405 +aI-152 +aI407 +aI-137 +aa(lp4185 +g20 +aI412 +aI-126 +aa(lp4186 +g15 +aI486 +aI-233 +aI438 +aI-162 +aI463 +aI-197 +aa(lp4187 +g15 +aI548 +aI-339 +aI510 +aI-269 +aI530 +aI-304 +aa(lp4188 +g15 +aI590 +aI-436 +aI566 +aI-373 +aI579 +aI-405 +aa(lp4189 +g15 +aI605 +aI-521 +aI600 +aI-467 +aI605 +aI-495 +aa(lp4190 +g15 +aI583 +aI-589 +aI605 +aI-550 +aI598 +aI-573 +aa(lp4191 +g15 +aI522 +aI-612 +aI569 +aI-605 +aI548 +aI-612 +aa(lp4192 +g15 +aI530 +aI-660 +aI522 +aI-630 +aI525 +aI-645 +aa(lp4193 +g15 +aI553 +aI-696 +aI536 +aI-674 +aI543 +aI-686 +aa(lp4194 +g15 +aI587 +aI-719 +aI562 +aI-706 +aI574 +aI-713 +aa(lp4195 +g15 +aI629 +aI-727 +aI600 +aI-724 +aI614 +aI-727 +aa(lp4196 +g15 +aI711 +aI-697 +aI665 +aI-727 +aI692 +aI-717 +aa(lp4197 +g15 +aI738 +aI-614 +aI729 +aI-677 +aI738 +aI-649 +aa(lp4198 +g15 +aI721 +aI-504 +aI738 +aI-579 +aI733 +aI-542 +aa(lp4199 +g15 +aI671 +aI-381 +aI709 +aI-465 +aI692 +aI-424 +aa(lp4200 +g15 +aI592 +aI-243 +aI649 +aI-337 +aI623 +aI-291 +aa(lp4201 +g15 +aI486 +aI-88 +aI561 +aI-194 +aI526 +aI-142 +aa(lp4202 +g15 +aI396 +aI35 +aI454 +aI-43 +aI424 +aI-2 +aa(lp4203 +g15 +aI313 +aI137 +aI368 +aI73 +aI340 +aI107 +aa(lp4204 +g15 +aI230 +aI217 +aI286 +aI168 +aI258 +aI194 +aa(lp4205 +g15 +aI141 +aI274 +aI202 +aI240 +aI173 +aI259 +aa(lp4206 +g15 +aI38 +aI309 +aI110 +aI290 +aI75 +aI301 +aa(lp4207 +g15 +aI-85 +aI320 +aI1 +aI316 +aI-39 +aI320 +aa(lp4208 +g15 +aI-159 +aI314 +aI-110 +aI320 +aI-135 +aI318 +aa(lp4209 +g15 +aI-223 +aI296 +aI-183 +aI309 +aI-205 +aI304 +aa(lp4210 +g20 +aI-203 +aI221 +aa(lp4211 +g15 +aI-159 +aI233 +aI-193 +aI225 +aI-178 +aI229 +aa(lp4212 +g15 +aI-90 +aI239 +aI-140 +aI237 +aI-117 +aI239 +aa(lp4213 +g15 +aI21 +aI223 +aI-49 +aI239 +aI-12 +aI233 +aa(lp4214 +g15 +aI115 +aI179 +aI55 +aI212 +aI86 +aI197 +aa(lp4215 +g15 +aI196 +aI114 +aI144 +aI160 +aI171 +aI139 +aa(lp4216 +g15 +aI270 +aI34 +aI222 +aI89 +aI246 +aI63 +aa(lp4217 +g10 +aa(lp4218 +g8 +aI781 +aI0 +aa(lp4219 +g10 +aa(lp4220 +g8 +aI781 +aI0 +aasV} +(lp4221 +(lp4222 +g8 +aI305 +aI-1014 +aa(lp4223 +g15 +aI448 +aI-976 +aI369 +aI-1014 +aI416 +aI-1001 +aa(lp4224 +g15 +aI496 +aI-868 +aI480 +aI-950 +aI496 +aI-914 +aa(lp4225 +g15 +aI495 +aI-855 +aI496 +aI-864 +aI495 +aI-860 +aa(lp4226 +g15 +aI493 +aI-838 +aI495 +aI-850 +aI494 +aI-845 +aa(lp4227 +g15 +aI489 +aI-812 +aI492 +aI-831 +aI491 +aI-822 +aa(lp4228 +g15 +aI482 +aI-775 +aI487 +aI-802 +aI485 +aI-790 +aa(lp4229 +g20 +aI442 +aI-588 +aa(lp4230 +g15 +aI438 +aI-552 +aI440 +aI-575 +aI438 +aI-563 +aa(lp4231 +g15 +aI448 +aI-509 +aI438 +aI-535 +aI442 +aI-520 +aa(lp4232 +g15 +aI476 +aI-482 +aI455 +aI-498 +aI464 +aI-489 +aa(lp4233 +g15 +aI518 +aI-468 +aI488 +aI-476 +aI502 +aI-471 +aa(lp4234 +g15 +aI570 +aI-463 +aI534 +aI-465 +aI552 +aI-464 +aa(lp4235 +g20 +aI553 +aI-382 +aa(lp4236 +g15 +aI490 +aI-375 +aI531 +aI-381 +aI510 +aI-379 +aa(lp4237 +g15 +aI437 +aI-356 +aI471 +aI-372 +aI453 +aI-366 +aa(lp4238 +g15 +aI396 +aI-319 +aI421 +aI-347 +aI408 +aI-335 +aa(lp4239 +g15 +aI371 +aI-258 +aI385 +aI-303 +aI376 +aI-283 +aa(lp4240 +g20 +aI324 +aI-28 +aa(lp4241 +g15 +aI294 +aI58 +aI317 +aI4 +aI307 +aI33 +aa(lp4242 +g15 +aI242 +aI118 +aI281 +aI82 +aI264 +aI102 +aa(lp4243 +g15 +aI164 +aI154 +aI221 +aI134 +aI195 +aI146 +aa(lp4244 +g15 +aI54 +aI165 +aI133 +aI161 +aI97 +aI165 +aa(lp4245 +g20 +aI-72 +aI165 +aa(lp4246 +g20 +aI-57 +aI94 +aa(lp4247 +g20 +aI-5 +aI94 +aa(lp4248 +g15 +aI43 +aI86 +aI13 +aI94 +aI30 +aI92 +aa(lp4249 +g15 +aI77 +aI61 +aI56 +aI80 +aI67 +aI72 +aa(lp4250 +g15 +aI99 +aI21 +aI86 +aI50 +aI94 +aI37 +aa(lp4251 +g15 +aI115 +aI-34 +aI105 +aI5 +aI111 +aI-13 +aa(lp4252 +g20 +aI165 +aI-260 +aa(lp4253 +g15 +aI220 +aI-359 +aI174 +aI-300 +aI192 +aI-334 +aa(lp4254 +g15 +aI343 +aI-416 +aI248 +aI-385 +aI289 +aI-404 +aa(lp4255 +g20 +aI346 +aI-427 +aa(lp4256 +g15 +aI257 +aI-473 +aI306 +aI-438 +aI276 +aI-453 +aa(lp4257 +g15 +aI229 +aI-547 +aI238 +aI-493 +aI229 +aI-518 +aa(lp4258 +g15 +aI233 +aI-584 +aI229 +aI-559 +aI230 +aI-571 +aa(lp4259 +g20 +aI282 +aI-812 +aa(lp4260 +g15 +aI287 +aI-844 +aI285 +aI-823 +aI286 +aI-834 +aa(lp4261 +g15 +aI289 +aI-872 +aI288 +aI-854 +aI289 +aI-863 +aa(lp4262 +g15 +aI272 +aI-925 +aI289 +aI-895 +aI283 +aI-913 +aa(lp4263 +g15 +aI214 +aI-943 +aI261 +aI-937 +aI242 +aI-943 +aa(lp4264 +g20 +aI162 +aI-943 +aa(lp4265 +g20 +aI178 +aI-1014 +aa(lp4266 +g10 +aa(lp4267 +g8 +aI589 +aI0 +aa(lp4268 +g10 +aa(lp4269 +g8 +aI589 +aI0 +aassS'bold' +p4270 +(dp4271 +V +(lp4272 +(lp4273 +g8 +aI346 +aI0 +aa(lp4274 +g10 +aa(lp4275 +g8 +aI346 +aI0 +aasV$ +(lp4276 +(lp4277 +g8 +aI416 +aI-1012 +aa(lp4278 +g20 +aI416 +aI-911 +aa(lp4279 +g15 +aI518 +aI-898 +aI455 +aI-910 +aI489 +aI-906 +aa(lp4280 +g15 +aI589 +aI-869 +aI546 +aI-891 +aI570 +aI-881 +aa(lp4281 +g15 +aI630 +aI-828 +aI607 +aI-857 +aI621 +aI-843 +aa(lp4282 +g15 +aI643 +aI-778 +aI639 +aI-812 +aI643 +aI-795 +aa(lp4283 +g15 +aI607 +aI-708 +aI643 +aI-749 +aI631 +aI-726 +aa(lp4284 +g15 +aI497 +aI-681 +aI583 +aI-690 +aI546 +aI-681 +aa(lp4285 +g15 +aI492 +aI-723 +aI497 +aI-694 +aI495 +aI-708 +aa(lp4286 +g15 +aI478 +aI-767 +aI489 +aI-738 +aI485 +aI-753 +aa(lp4287 +g15 +aI453 +aI-805 +aI472 +aI-781 +aI463 +aI-794 +aa(lp4288 +g15 +aI416 +aI-832 +aI443 +aI-817 +aI430 +aI-826 +aa(lp4289 +g20 +aI416 +aI-573 +aa(lp4290 +g15 +aI430 +aI-566 +aI418 +aI-571 +aI423 +aI-569 +aa(lp4291 +g15 +aI449 +aI-559 +aI438 +aI-564 +aI444 +aI-561 +aa(lp4292 +g15 +aI554 +aI-509 +aI490 +aI-543 +aI524 +aI-526 +aa(lp4293 +g15 +aI625 +aI-454 +aI583 +aI-493 +aI606 +aI-474 +aa(lp4294 +g15 +aI665 +aI-389 +aI643 +aI-434 +aI657 +aI-413 +aa(lp4295 +g15 +aI678 +aI-312 +aI674 +aI-366 +aI678 +aI-340 +aa(lp4296 +g15 +aI660 +aI-218 +aI678 +aI-278 +aI672 +aI-247 +aa(lp4297 +g15 +aI609 +aI-142 +aI648 +aI-189 +aI631 +aI-164 +aa(lp4298 +g15 +aI526 +aI-87 +aI586 +aI-119 +aI559 +aI-101 +aa(lp4299 +g15 +aI416 +aI-59 +aI494 +aI-73 +aI457 +aI-64 +aa(lp4300 +g20 +aI416 +aI105 +aa(lp4301 +g20 +aI341 +aI105 +aa(lp4302 +g20 +aI341 +aI-56 +aa(lp4303 +g15 +aI212 +aI-76 +aI290 +aI-58 +aI247 +aI-64 +aa(lp4304 +g15 +aI126 +aI-120 +aI177 +aI-88 +aI148 +aI-102 +aa(lp4305 +g15 +aI79 +aI-179 +aI104 +aI-138 +aI88 +aI-158 +aa(lp4306 +g15 +aI65 +aI-243 +aI69 +aI-201 +aI65 +aI-222 +aa(lp4307 +g15 +aI75 +aI-293 +aI65 +aI-263 +aI68 +aI-279 +aa(lp4308 +g15 +aI104 +aI-326 +aI83 +aI-306 +aI92 +aI-317 +aa(lp4309 +g15 +aI144 +aI-344 +aI115 +aI-334 +aI129 +aI-340 +aa(lp4310 +g15 +aI190 +aI-350 +aI159 +aI-348 +aI174 +aI-350 +aa(lp4311 +g15 +aI201 +aI-261 +aI190 +aI-317 +aI194 +aI-287 +aa(lp4312 +g15 +aI232 +aI-194 +aI208 +aI-235 +aI218 +aI-212 +aa(lp4313 +g15 +aI279 +aI-149 +aI245 +aI-176 +aI261 +aI-161 +aa(lp4314 +g15 +aI341 +aI-127 +aI298 +aI-138 +aI318 +aI-131 +aa(lp4315 +g20 +aI341 +aI-415 +aa(lp4316 +g20 +aI318 +aI-424 +aa(lp4317 +g15 +aI211 +aI-477 +aI275 +aI-442 +aI240 +aI-459 +aa(lp4318 +g15 +aI142 +aI-534 +aI183 +aI-495 +aI160 +aI-514 +aa(lp4319 +g15 +aI105 +aI-599 +aI125 +aI-554 +aI112 +aI-576 +aa(lp4320 +g15 +aI94 +aI-677 +aI98 +aI-623 +aI94 +aI-649 +aa(lp4321 +g15 +aI112 +aI-766 +aI94 +aI-710 +aI100 +aI-739 +aa(lp4322 +g15 +aI163 +aI-836 +aI124 +aI-792 +aI141 +aI-816 +aa(lp4323 +g15 +aI241 +aI-885 +aI185 +aI-856 +aI211 +aI-872 +aa(lp4324 +g15 +aI341 +aI-910 +aI271 +aI-898 +aI304 +aI-906 +aa(lp4325 +g20 +aI341 +aI-1012 +aa(lp4326 +g10 +aa(lp4327 +g8 +aI520 +aI-252 +aa(lp4328 +g15 +aI494 +aI-325 +aI520 +aI-281 +aI511 +aI-305 +aa(lp4329 +g15 +aI416 +aI-382 +aI476 +aI-345 +aI450 +aI-364 +aa(lp4330 +g20 +aI416 +aI-130 +aa(lp4331 +g15 +aI493 +aI-174 +aI449 +aI-137 +aI475 +aI-152 +aa(lp4332 +g15 +aI520 +aI-252 +aI511 +aI-196 +aI520 +aI-222 +aa(lp4333 +g10 +aa(lp4334 +g8 +aI250 +aI-733 +aa(lp4335 +g15 +aI254 +aI-700 +aI250 +aI-722 +aI251 +aI-710 +aa(lp4336 +g15 +aI268 +aI-668 +aI257 +aI-689 +aI261 +aI-678 +aa(lp4337 +g15 +aI296 +aI-638 +aI275 +aI-658 +aI285 +aI-648 +aa(lp4338 +g15 +aI341 +aI-608 +aI308 +aI-628 +aI323 +aI-618 +aa(lp4339 +g20 +aI341 +aI-839 +aa(lp4340 +g15 +aI276 +aI-805 +aI315 +aI-834 +aI293 +aI-823 +aa(lp4341 +g15 +aI250 +aI-733 +aI259 +aI-788 +aI250 +aI-764 +aa(lp4342 +g10 +aa(lp4343 +g8 +aI745 +aI0 +aa(lp4344 +g10 +aa(lp4345 +g8 +aI745 +aI0 +aasV( +(lp4346 +(lp4347 +g8 +aI290 +aI-423 +aa(lp4348 +g15 +aI298 +aI-267 +aI290 +aI-370 +aI293 +aI-318 +aa(lp4349 +g15 +aI328 +aI-122 +aI303 +aI-216 +aI314 +aI-168 +aa(lp4350 +g15 +aI389 +aI2 +aI343 +aI-77 +aI363 +aI-35 +aa(lp4351 +g15 +aI490 +aI100 +aI416 +aI40 +aI449 +aI73 +aa(lp4352 +g20 +aI490 +aI186 +aa(lp4353 +g15 +aI300 +aI80 +aI416 +aI156 +aI353 +aI121 +aa(lp4354 +g15 +aI172 +aI-55 +aI248 +aI40 +aI205 +aI-4 +aa(lp4355 +g15 +aI99 +aI-223 +aI138 +aI-106 +aI114 +aI-162 +aa(lp4356 +g15 +aI76 +aI-423 +aI83 +aI-284 +aI76 +aI-351 +aa(lp4357 +g15 +aI99 +aI-622 +aI76 +aI-494 +aI83 +aI-561 +aa(lp4358 +g15 +aI172 +aI-789 +aI114 +aI-683 +aI138 +aI-738 +aa(lp4359 +g15 +aI300 +aI-924 +aI205 +aI-839 +aI248 +aI-884 +aa(lp4360 +g15 +aI490 +aI-1028 +aI353 +aI-964 +aI416 +aI-999 +aa(lp4361 +g20 +aI490 +aI-944 +aa(lp4362 +g15 +aI389 +aI-846 +aI449 +aI-917 +aI416 +aI-884 +aa(lp4363 +g15 +aI328 +aI-722 +aI363 +aI-808 +aI343 +aI-767 +aa(lp4364 +g15 +aI298 +aI-578 +aI314 +aI-677 +aI303 +aI-629 +aa(lp4365 +g15 +aI290 +aI-423 +aI293 +aI-528 +aI290 +aI-476 +aa(lp4366 +g10 +aa(lp4367 +g8 +aI533 +aI0 +aa(lp4368 +g10 +aa(lp4369 +g8 +aI533 +aI0 +aasV, +(lp4370 +(lp4371 +g8 +aI298 +aI-55 +aa(lp4372 +g15 +aI285 +aI26 +aI298 +aI-27 +aI294 +aI0 +aa(lp4373 +g15 +aI244 +aI100 +aI277 +aI52 +aI263 +aI77 +aa(lp4374 +g15 +aI170 +aI160 +aI225 +aI122 +aI200 +aI142 +aa(lp4375 +g15 +aI59 +aI205 +aI140 +aI178 +aI103 +aI193 +aa(lp4376 +g20 +aI59 +aI136 +aa(lp4377 +g15 +aI111 +aI115 +aI79 +aI129 +aI96 +aI122 +aa(lp4378 +g15 +aI147 +aI93 +aI125 +aI108 +aI137 +aI101 +aa(lp4379 +g15 +aI169 +aI66 +aI157 +aI85 +aI164 +aI76 +aa(lp4380 +g15 +aI177 +aI32 +aI174 +aI56 +aI177 +aI45 +aa(lp4381 +g15 +aI169 +aI11 +aI177 +aI24 +aI174 +aI17 +aa(lp4382 +g15 +aI152 +aI-3 +aI165 +aI6 +aI159 +aI1 +aa(lp4383 +g15 +aI128 +aI-18 +aI144 +aI-8 +aI137 +aI-13 +aa(lp4384 +g15 +aI105 +aI-37 +aI120 +aI-23 +aI112 +aI-29 +aa(lp4385 +g15 +aI87 +aI-66 +aI97 +aI-45 +aI92 +aI-54 +aa(lp4386 +g15 +aI80 +aI-110 +aI82 +aI-77 +aI80 +aI-92 +aa(lp4387 +g15 +aI107 +aI-178 +aI80 +aI-140 +aI89 +aI-162 +aa(lp4388 +g15 +aI175 +aI-202 +aI125 +aI-194 +aI148 +aI-202 +aa(lp4389 +g15 +aI265 +aI-162 +aI213 +aI-202 +aI243 +aI-189 +aa(lp4390 +g15 +aI298 +aI-55 +aI287 +aI-136 +aI298 +aI-101 +aa(lp4391 +g10 +aa(lp4392 +g8 +aI391 +aI0 +aa(lp4393 +g10 +aa(lp4394 +g8 +aI391 +aI0 +aasV0 +(lp4395 +(lp4396 +g8 +aI699 +aI-476 +aa(lp4397 +g15 +aI681 +aI-276 +aI699 +aI-403 +aI693 +aI-336 +aa(lp4398 +g15 +aI623 +aI-121 +aI669 +aI-215 +aI650 +aI-164 +aa(lp4399 +g15 +aI522 +aI-21 +aI597 +aI-78 +aI563 +aI-45 +aa(lp4400 +g15 +aI373 +aI13 +aI480 +aI1 +aI431 +aI13 +aa(lp4401 +g15 +aI219 +aI-21 +aI312 +aI13 +aI261 +aI1 +aa(lp4402 +g15 +aI118 +aI-121 +aI177 +aI-45 +aI143 +aI-78 +aa(lp4403 +g15 +aI62 +aI-276 +aI92 +aI-164 +aI73 +aI-216 +aa(lp4404 +g15 +aI45 +aI-478 +aI51 +aI-337 +aI45 +aI-404 +aa(lp4405 +g15 +aI62 +aI-678 +aI45 +aI-551 +aI51 +aI-618 +aa(lp4406 +g15 +aI118 +aI-832 +aI73 +aI-738 +aI92 +aI-789 +aa(lp4407 +g15 +aI219 +aI-930 +aI143 +aI-874 +aI177 +aI-907 +aa(lp4408 +g15 +aI374 +aI-965 +aI261 +aI-953 +aI313 +aI-965 +aa(lp4409 +g15 +aI522 +aI-930 +aI432 +aI-965 +aI481 +aI-953 +aa(lp4410 +g15 +aI624 +aI-832 +aI564 +aI-907 +aI597 +aI-874 +aa(lp4411 +g15 +aI681 +aI-678 +aI650 +aI-789 +aI669 +aI-738 +aa(lp4412 +g15 +aI699 +aI-476 +aI693 +aI-618 +aI699 +aI-550 +aa(lp4413 +g10 +aa(lp4414 +g8 +aI251 +aI-476 +aa(lp4415 +g15 +aI257 +aI-306 +aI251 +aI-412 +aI253 +aI-356 +aa(lp4416 +g15 +aI275 +aI-179 +aI260 +aI-256 +aI266 +aI-214 +aa(lp4417 +g15 +aI312 +aI-100 +aI284 +aI-145 +aI296 +aI-118 +aa(lp4418 +g15 +aI373 +aI-73 +aI328 +aI-82 +aI348 +aI-73 +aa(lp4419 +g15 +aI433 +aI-100 +aI397 +aI-73 +aI417 +aI-82 +aa(lp4420 +g15 +aI470 +aI-179 +aI449 +aI-118 +aI461 +aI-145 +aa(lp4421 +g15 +aI488 +aI-306 +aI479 +aI-214 +aI485 +aI-256 +aa(lp4422 +g15 +aI493 +aI-476 +aI491 +aI-356 +aI493 +aI-412 +aa(lp4423 +g15 +aI488 +aI-647 +aI493 +aI-540 +aI491 +aI-597 +aa(lp4424 +g15 +aI470 +aI-772 +aI485 +aI-696 +aI479 +aI-738 +aa(lp4425 +g15 +aI434 +aI-851 +aI462 +aI-807 +aI449 +aI-833 +aa(lp4426 +g15 +aI374 +aI-878 +aI418 +aI-869 +aI398 +aI-878 +aa(lp4427 +g15 +aI313 +aI-851 +aI349 +aI-878 +aI329 +aI-869 +aa(lp4428 +g15 +aI276 +aI-772 +aI297 +aI-833 +aI285 +aI-807 +aa(lp4429 +g15 +aI257 +aI-647 +aI266 +aI-738 +aI260 +aI-696 +aa(lp4430 +g15 +aI251 +aI-476 +aI253 +aI-597 +aI251 +aI-540 +aa(lp4431 +g10 +aa(lp4432 +g8 +aI745 +aI0 +aa(lp4433 +g10 +aa(lp4434 +g8 +aI745 +aI0 +aasV4 +(lp4435 +(lp4436 +g8 +aI581 +aI-247 +aa(lp4437 +g20 +aI581 +aI-166 +aa(lp4438 +g15 +aI590 +aI-116 +aI581 +aI-145 +aI584 +aI-128 +aa(lp4439 +g15 +aI613 +aI-87 +aI596 +aI-103 +aI603 +aI-93 +aa(lp4440 +g15 +aI648 +aI-73 +aI623 +aI-80 +aI634 +aI-75 +aa(lp4441 +g15 +aI690 +aI-70 +aI661 +aI-71 +aI675 +aI-70 +aa(lp4442 +g20 +aI707 +aI-70 +aa(lp4443 +g20 +aI707 +aI0 +aa(lp4444 +g20 +aI240 +aI0 +aa(lp4445 +g20 +aI240 +aI-70 +aa(lp4446 +g20 +aI277 +aI-70 +aa(lp4447 +g15 +aI319 +aI-73 +aI292 +aI-70 +aI306 +aI-71 +aa(lp4448 +g15 +aI354 +aI-87 +aI333 +aI-75 +aI344 +aI-80 +aa(lp4449 +g15 +aI377 +aI-116 +aI364 +aI-93 +aI372 +aI-103 +aa(lp4450 +g15 +aI386 +aI-166 +aI383 +aI-128 +aI386 +aI-145 +aa(lp4451 +g20 +aI386 +aI-247 +aa(lp4452 +g20 +aI17 +aI-247 +aa(lp4453 +g20 +aI17 +aI-328 +aa(lp4454 +g20 +aI395 +aI-951 +aa(lp4455 +g20 +aI581 +aI-951 +aa(lp4456 +g20 +aI581 +aI-335 +aa(lp4457 +g20 +aI720 +aI-335 +aa(lp4458 +g20 +aI720 +aI-247 +aa(lp4459 +g10 +aa(lp4460 +g8 +aI386 +aI-568 +aa(lp4461 +g15 +aI388 +aI-694 +aI386 +aI-607 +aI387 +aI-649 +aa(lp4462 +g15 +aI395 +aI-825 +aI389 +aI-739 +aI392 +aI-783 +aa(lp4463 +g15 +aI375 +aI-782 +aI391 +aI-814 +aI384 +aI-800 +aa(lp4464 +g15 +aI344 +aI-725 +aI365 +aI-763 +aI355 +aI-745 +aa(lp4465 +g15 +aI313 +aI-671 +aI333 +aI-706 +aI323 +aI-688 +aa(lp4466 +g15 +aI290 +aI-633 +aI303 +aI-653 +aI295 +aI-641 +aa(lp4467 +g20 +aI110 +aI-335 +aa(lp4468 +g20 +aI386 +aI-335 +aa(lp4469 +g10 +aa(lp4470 +g8 +aI745 +aI0 +aa(lp4471 +g10 +aa(lp4472 +g8 +aI745 +aI0 +aasV8 +(lp4473 +(lp4474 +g8 +aI39 +aI-242 +aa(lp4475 +g15 +aI53 +aI-319 +aI39 +aI-271 +aI44 +aI-296 +aa(lp4476 +g15 +aI93 +aI-382 +aI63 +aI-342 +aI76 +aI-363 +aa(lp4477 +g15 +aI155 +aI-434 +aI111 +aI-401 +aI131 +aI-418 +aa(lp4478 +g15 +aI235 +aI-480 +aI180 +aI-450 +aI206 +aI-465 +aa(lp4479 +g15 +aI113 +aI-585 +aI182 +aI-511 +aI142 +aI-546 +aa(lp4480 +g15 +aI70 +aI-722 +aI85 +aI-624 +aI70 +aI-670 +aa(lp4481 +g15 +aI86 +aI-812 +aI70 +aI-753 +aI76 +aI-783 +aa(lp4482 +g15 +aI139 +aI-890 +aI97 +aI-841 +aI115 +aI-867 +aa(lp4483 +g15 +aI235 +aI-944 +aI163 +aI-912 +aI195 +aI-930 +aa(lp4484 +g15 +aI380 +aI-965 +aI274 +aI-958 +aI322 +aI-965 +aa(lp4485 +g15 +aI503 +aI-947 +aI427 +aI-965 +aI468 +aI-959 +aa(lp4486 +g15 +aI592 +aI-898 +aI538 +aI-935 +aI568 +aI-919 +aa(lp4487 +g15 +aI646 +aI-824 +aI616 +aI-877 +aI634 +aI-853 +aa(lp4488 +g15 +aI664 +aI-731 +aI658 +aI-796 +aI664 +aI-765 +aa(lp4489 +g15 +aI651 +aI-661 +aI664 +aI-704 +aI659 +aI-681 +aa(lp4490 +g15 +aI615 +aI-605 +aI642 +aI-640 +aI630 +aI-622 +aa(lp4491 +g15 +aI558 +aI-558 +aI599 +aI-588 +aI580 +aI-573 +aa(lp4492 +g15 +aI483 +aI-515 +aI536 +aI-544 +aI511 +aI-530 +aa(lp4493 +g15 +aI585 +aI-456 +aI523 +aI-496 +aI557 +aI-476 +aa(lp4494 +g15 +aI654 +aI-395 +aI614 +aI-437 +aI637 +aI-416 +aa(lp4495 +g15 +aI693 +aI-327 +aI672 +aI-373 +aI685 +aI-351 +aa(lp4496 +g15 +aI705 +aI-251 +aI701 +aI-303 +aI705 +aI-278 +aa(lp4497 +g15 +aI681 +aI-139 +aI705 +aI-209 +aI697 +aI-171 +aa(lp4498 +g15 +aI614 +aI-56 +aI666 +aI-106 +aI644 +aI-78 +aa(lp4499 +g15 +aI507 +aI-4 +aI585 +aI-33 +aI549 +aI-16 +aa(lp4500 +g15 +aI363 +aI13 +aI465 +aI7 +aI417 +aI13 +aa(lp4501 +g15 +aI219 +aI-6 +aI308 +aI13 +aI260 +aI6 +aa(lp4502 +g15 +aI118 +aI-61 +aI178 +aI-20 +aI144 +aI-38 +aa(lp4503 +g15 +aI58 +aI-142 +aI91 +aI-84 +aI71 +aI-111 +aa(lp4504 +g15 +aI39 +aI-242 +aI46 +aI-174 +aI39 +aI-207 +aa(lp4505 +g10 +aa(lp4506 +g8 +aI370 +aI-62 +aa(lp4507 +g15 +aI432 +aI-74 +aI393 +aI-62 +aI414 +aI-66 +aa(lp4508 +g15 +aI479 +aI-108 +aI451 +aI-82 +aI466 +aI-94 +aa(lp4509 +g15 +aI509 +aI-161 +aI492 +aI-123 +aI502 +aI-141 +aa(lp4510 +g15 +aI520 +aI-228 +aI516 +aI-182 +aI520 +aI-204 +aa(lp4511 +g15 +aI509 +aI-287 +aI520 +aI-250 +aI516 +aI-270 +aa(lp4512 +g15 +aI474 +aI-337 +aI501 +aI-305 +aI490 +aI-321 +aa(lp4513 +g15 +aI413 +aI-382 +aI458 +aI-352 +aI438 +aI-367 +aa(lp4514 +g15 +aI325 +aI-427 +aI389 +aI-396 +aI359 +aI-411 +aa(lp4515 +g15 +aI283 +aI-394 +aI310 +aI-417 +aI296 +aI-406 +aa(lp4516 +g15 +aI250 +aI-352 +aI270 +aI-382 +aI259 +aI-368 +aa(lp4517 +g15 +aI228 +aI-300 +aI240 +aI-337 +aI233 +aI-320 +aa(lp4518 +g15 +aI220 +aI-237 +aI222 +aI-281 +aI220 +aI-260 +aa(lp4519 +g15 +aI230 +aI-165 +aI220 +aI-211 +aI223 +aI-187 +aa(lp4520 +g15 +aI261 +aI-110 +aI237 +aI-144 +aI248 +aI-125 +aa(lp4521 +g15 +aI308 +aI-74 +aI274 +aI-95 +aI290 +aI-83 +aa(lp4522 +g15 +aI370 +aI-62 +aI327 +aI-66 +aI347 +aI-62 +aa(lp4523 +g10 +aa(lp4524 +g8 +aI496 +aI-733 +aa(lp4525 +g15 +aI487 +aI-790 +aI496 +aI-753 +aI493 +aI-771 +aa(lp4526 +g15 +aI464 +aI-839 +aI482 +aI-808 +aI474 +aI-825 +aa(lp4527 +g15 +aI425 +aI-874 +aI453 +aI-853 +aI440 +aI-865 +aa(lp4528 +g15 +aI371 +aI-887 +aI410 +aI-883 +aI392 +aI-887 +aa(lp4529 +g15 +aI323 +aI-876 +aI353 +aI-887 +aI337 +aI-883 +aa(lp4530 +g15 +aI287 +aI-844 +aI309 +aI-868 +aI297 +aI-858 +aa(lp4531 +g15 +aI265 +aI-797 +aI278 +aI-831 +aI270 +aI-815 +aa(lp4532 +g15 +aI258 +aI-738 +aI260 +aI-779 +aI258 +aI-759 +aa(lp4533 +g15 +aI267 +aI-677 +aI258 +aI-715 +aI261 +aI-695 +aa(lp4534 +g15 +aI295 +aI-631 +aI274 +aI-660 +aI283 +aI-644 +aa(lp4535 +g15 +aI340 +aI-593 +aI307 +aI-617 +aI322 +aI-604 +aa(lp4536 +g15 +aI402 +aI-560 +aI358 +aI-582 +aI378 +aI-571 +aa(lp4537 +g15 +aI444 +aI-591 +aI418 +aI-570 +aI432 +aI-580 +aa(lp4538 +g15 +aI473 +aI-628 +aI456 +aI-602 +aI466 +aI-614 +aa(lp4539 +g15 +aI490 +aI-675 +aI481 +aI-642 +aI486 +aI-657 +aa(lp4540 +g15 +aI496 +aI-733 +aI494 +aI-692 +aI496 +aI-711 +aa(lp4541 +g10 +aa(lp4542 +g8 +aI745 +aI0 +aa(lp4543 +g10 +aa(lp4544 +g8 +aI745 +aI0 +aasV< +(lp4545 +(lp4546 +g8 +aI86 +aI-448 +aa(lp4547 +g20 +aI86 +aI-503 +aa(lp4548 +g20 +aI658 +aI-815 +aa(lp4549 +g20 +aI658 +aI-710 +aa(lp4550 +g20 +aI229 +aI-475 +aa(lp4551 +g20 +aI658 +aI-243 +aa(lp4552 +g20 +aI658 +aI-138 +aa(lp4553 +g10 +aa(lp4554 +g8 +aI745 +aI0 +aa(lp4555 +g10 +aa(lp4556 +g8 +aI745 +aI0 +aasV@ +(lp4557 +(lp4558 +g8 +aI1175 +aI-522 +aa(lp4559 +g15 +aI1151 +aI-344 +aI1175 +aI-455 +aI1167 +aI-396 +aa(lp4560 +g15 +aI1088 +aI-212 +aI1135 +aI-292 +aI1114 +aI-248 +aa(lp4561 +g15 +aI1000 +aI-130 +aI1062 +aI-176 +aI1033 +aI-149 +aa(lp4562 +g15 +aI901 +aI-102 +aI967 +aI-111 +aI934 +aI-102 +aa(lp4563 +g15 +aI800 +aI-131 +aI861 +aI-102 +aI828 +aI-112 +aa(lp4564 +g15 +aI737 +aI-227 +aI773 +aI-150 +aI752 +aI-182 +aa(lp4565 +g20 +aI729 +aI-227 +aa(lp4566 +g15 +aI697 +aI-178 +aI720 +aI-210 +aI709 +aI-193 +aa(lp4567 +g15 +aI658 +aI-138 +aI686 +aI-163 +aI672 +aI-150 +aa(lp4568 +g15 +aI608 +aI-112 +aI643 +aI-127 +aI626 +aI-118 +aa(lp4569 +g15 +aI545 +aI-102 +aI589 +aI-105 +aI569 +aI-102 +aa(lp4570 +g15 +aI465 +aI-116 +aI517 +aI-102 +aI491 +aI-106 +aa(lp4571 +g15 +aI398 +aI-157 +aI440 +aI-125 +aI418 +aI-139 +aa(lp4572 +g15 +aI352 +aI-228 +aI379 +aI-176 +aI364 +aI-200 +aa(lp4573 +g15 +aI335 +aI-330 +aI341 +aI-257 +aI335 +aI-291 +aa(lp4574 +g15 +aI344 +aI-407 +aI335 +aI-354 +aI338 +aI-379 +aa(lp4575 +g15 +aI371 +aI-490 +aI350 +aI-435 +aI359 +aI-463 +aa(lp4576 +g15 +aI418 +aI-570 +aI383 +aI-518 +aI399 +aI-545 +aa(lp4577 +g15 +aI486 +aI-639 +aI437 +aI-596 +aI459 +aI-619 +aa(lp4578 +g15 +aI578 +aI-686 +aI513 +aI-658 +aI543 +aI-674 +aa(lp4579 +g15 +aI694 +aI-704 +aI612 +aI-698 +aI651 +aI-704 +aa(lp4580 +g15 +aI774 +aI-692 +aI725 +aI-704 +aI751 +aI-700 +aa(lp4581 +g15 +aI828 +aI-664 +aI796 +aI-685 +aI814 +aI-675 +aa(lp4582 +g20 +aI884 +aI-692 +aa(lp4583 +g20 +aI916 +aI-692 +aa(lp4584 +g20 +aI860 +aI-359 +aa(lp4585 +g15 +aI857 +aI-339 +aI859 +aI-354 +aI858 +aI-347 +aa(lp4586 +g15 +aI854 +aI-314 +aI856 +aI-331 +aI855 +aI-322 +aa(lp4587 +g15 +aI851 +aI-288 +aI853 +aI-305 +aI852 +aI-296 +aa(lp4588 +g15 +aI850 +aI-269 +aI851 +aI-280 +aI850 +aI-274 +aa(lp4589 +g15 +aI856 +aI-224 +aI850 +aI-250 +aI852 +aI-235 +aa(lp4590 +g15 +aI871 +aI-196 +aI860 +aI-212 +aI865 +aI-203 +aa(lp4591 +g15 +aI892 +aI-182 +aI877 +aI-189 +aI884 +aI-185 +aa(lp4592 +g15 +aI914 +aI-179 +aI899 +aI-180 +aI907 +aI-179 +aa(lp4593 +g15 +aI968 +aI-201 +aI932 +aI-179 +aI950 +aI-186 +aa(lp4594 +g15 +aI1017 +aI-266 +aI986 +aI-216 +aI1002 +aI-237 +aa(lp4595 +g15 +aI1053 +aI-371 +aI1032 +aI-294 +aI1044 +aI-329 +aa(lp4596 +g15 +aI1067 +aI-517 +aI1063 +aI-414 +aI1067 +aI-462 +aa(lp4597 +g15 +aI1040 +aI-676 +aI1067 +aI-577 +aI1058 +aI-631 +aa(lp4598 +g15 +aI963 +aI-791 +aI1021 +aI-722 +aI995 +aI-760 +aa(lp4599 +g15 +aI846 +aI-860 +aI930 +aI-822 +aI891 +aI-845 +aa(lp4600 +g15 +aI697 +aI-883 +aI800 +aI-875 +aI751 +aI-883 +aa(lp4601 +g15 +aI572 +aI-866 +aI655 +aI-883 +aI613 +aI-877 +aa(lp4602 +g15 +aI455 +aI-814 +aI531 +aI-854 +aI492 +aI-837 +aa(lp4603 +g15 +aI352 +aI-731 +aI418 +aI-792 +aI384 +aI-764 +aa(lp4604 +g15 +aI271 +aI-619 +aI321 +aI-698 +aI294 +aI-661 +aa(lp4605 +g15 +aI217 +aI-480 +aI248 +aI-577 +aI230 +aI-531 +aa(lp4606 +g15 +aI198 +aI-316 +aI204 +aI-429 +aI198 +aI-375 +aa(lp4607 +g15 +aI233 +aI-115 +aI198 +aI-238 +aI210 +aI-170 +aa(lp4608 +g15 +aI329 +aI20 +aI257 +aI-59 +aI288 +aI-14 +aa(lp4609 +g15 +aI469 +aI97 +aI369 +aI55 +aI416 +aI81 +aa(lp4610 +g15 +aI639 +aI121 +aI523 +aI113 +aI580 +aI121 +aa(lp4611 +g15 +aI745 +aI111 +aI675 +aI121 +aI711 +aI118 +aa(lp4612 +g15 +aI843 +aI86 +aI779 +aI105 +aI812 +aI96 +aa(lp4613 +g15 +aI929 +aI50 +aI873 +aI75 +aI902 +aI64 +aa(lp4614 +g15 +aI1000 +aI9 +aI955 +aI37 +aI979 +aI23 +aa(lp4615 +g20 +aI1031 +aI60 +aa(lp4616 +g15 +aI952 +aI110 +aI1008 +aI78 +aI981 +aI94 +aa(lp4617 +g15 +aI855 +aI151 +aI922 +aI126 +aI890 +aI139 +aa(lp4618 +g15 +aI743 +aI179 +aI820 +aI163 +aI783 +aI172 +aa(lp4619 +g15 +aI621 +aI189 +aI704 +aI186 +aI663 +aI189 +aa(lp4620 +g15 +aI474 +aI175 +aI570 +aI189 +aI521 +aI185 +aa(lp4621 +g15 +aI342 +aI133 +aI427 +aI166 +aI383 +aI152 +aa(lp4622 +g15 +aI230 +aI61 +aI301 +aI114 +aI264 +aI90 +aa(lp4623 +g15 +aI143 +aI-37 +aI196 +aI33 +aI167 +aI0 +aa(lp4624 +g15 +aI87 +aI-166 +aI119 +aI-76 +aI100 +aI-119 +aa(lp4625 +g15 +aI67 +aI-325 +aI74 +aI-214 +aI67 +aI-267 +aa(lp4626 +g15 +aI89 +aI-495 +aI67 +aI-384 +aI74 +aI-441 +aa(lp4627 +g15 +aI151 +aI-646 +aI104 +aI-549 +aI124 +aI-600 +aa(lp4628 +g15 +aI248 +aI-772 +aI178 +aI-692 +aI210 +aI-734 +aa(lp4629 +g15 +aI376 +aI-868 +aI286 +aI-809 +aI329 +aI-841 +aa(lp4630 +g15 +aI530 +aI-929 +aI424 +aI-895 +aI475 +aI-915 +aa(lp4631 +g15 +aI706 +aI-951 +aI586 +aI-944 +aI644 +aI-951 +aa(lp4632 +g15 +aI910 +aI-918 +aI783 +aI-951 +aI851 +aI-940 +aa(lp4633 +g15 +aI1056 +aI-827 +aI968 +aI-896 +aI1017 +aI-865 +aa(lp4634 +g15 +aI1145 +aI-691 +aI1096 +aI-788 +aI1125 +aI-743 +aa(lp4635 +g15 +aI1175 +aI-522 +aI1165 +aI-638 +aI1175 +aI-582 +aa(lp4636 +g10 +aa(lp4637 +g8 +aI500 +aI-316 +aa(lp4638 +g15 +aI523 +aI-214 +aI500 +aI-272 +aI507 +aI-238 +aa(lp4639 +g15 +aI585 +aI-179 +aI539 +aI-191 +aI559 +aI-179 +aa(lp4640 +g15 +aI634 +aI-192 +aI604 +aI-179 +aI620 +aI-183 +aa(lp4641 +g15 +aI668 +aI-229 +aI648 +aI-202 +aI659 +aI-214 +aa(lp4642 +g15 +aI692 +aI-279 +aI678 +aI-244 +aI685 +aI-260 +aa(lp4643 +g15 +aI706 +aI-336 +aI698 +aI-298 +aI702 +aI-317 +aa(lp4644 +g20 +aI759 +aI-608 +aa(lp4645 +g15 +aI748 +aI-624 +aI757 +aI-614 +aI753 +aI-620 +aa(lp4646 +g15 +aI731 +aI-636 +aI743 +aI-629 +aI737 +aI-633 +aa(lp4647 +g15 +aI710 +aI-643 +aI724 +aI-639 +aI717 +aI-642 +aa(lp4648 +g15 +aI689 +aI-646 +aI703 +aI-645 +aI696 +aI-646 +aa(lp4649 +g15 +aI628 +aI-629 +aI666 +aI-646 +aI646 +aI-640 +aa(lp4650 +g15 +aI580 +aI-584 +aI610 +aI-617 +aI594 +aI-602 +aa(lp4651 +g15 +aI544 +aI-521 +aI566 +aI-566 +aI554 +aI-545 +aa(lp4652 +g15 +aI519 +aI-449 +aI534 +aI-497 +aI525 +aI-473 +aa(lp4653 +g15 +aI504 +aI-378 +aI512 +aI-425 +aI507 +aI-401 +aa(lp4654 +g15 +aI500 +aI-316 +aI501 +aI-354 +aI500 +aI-334 +aa(lp4655 +g10 +aa(lp4656 +g8 +aI1227 +aI0 +aa(lp4657 +g10 +aa(lp4658 +g8 +aI1227 +aI0 +aasVD +(lp4659 +(lp4660 +g8 +aI949 +aI-493 +aa(lp4661 +g15 +aI919 +aI-292 +aI949 +aI-420 +aI939 +aI-353 +aa(lp4662 +g15 +aI829 +aI-136 +aI899 +aI-232 +aI869 +aI-180 +aa(lp4663 +g15 +aI681 +aI-35 +aI790 +aI-93 +aI740 +aI-59 +aa(lp4664 +g15 +aI477 +aI0 +aI623 +aI-11 +aI554 +aI0 +aa(lp4665 +g20 +aI37 +aI0 +aa(lp4666 +g20 +aI37 +aI-70 +aa(lp4667 +g20 +aI93 +aI-70 +aa(lp4668 +g15 +aI120 +aI-73 +aI103 +aI-70 +aI112 +aI-71 +aa(lp4669 +g15 +aI141 +aI-85 +aI128 +aI-75 +aI135 +aI-79 +aa(lp4670 +g15 +aI156 +aI-111 +aI148 +aI-91 +aI152 +aI-100 +aa(lp4671 +g15 +aI161 +aI-157 +aI159 +aI-122 +aI161 +aI-138 +aa(lp4672 +g20 +aI161 +aI-799 +aa(lp4673 +g15 +aI156 +aI-842 +aI161 +aI-817 +aI159 +aI-831 +aa(lp4674 +g15 +aI141 +aI-866 +aI152 +aI-852 +aI147 +aI-861 +aa(lp4675 +g15 +aI119 +aI-878 +aI135 +aI-872 +aI128 +aI-876 +aa(lp4676 +g15 +aI93 +aI-881 +aI111 +aI-880 +aI102 +aI-881 +aa(lp4677 +g20 +aI37 +aI-881 +aa(lp4678 +g20 +aI37 +aI-951 +aa(lp4679 +g20 +aI477 +aI-951 +aa(lp4680 +g15 +aI675 +aI-922 +aI550 +aI-951 +aI617 +aI-941 +aa(lp4681 +g15 +aI823 +aI-835 +aI733 +aI-903 +aI783 +aI-874 +aa(lp4682 +g15 +aI916 +aI-692 +aI864 +aI-797 +aI895 +aI-749 +aa(lp4683 +g15 +aI949 +aI-493 +aI938 +aI-634 +aI949 +aI-568 +aa(lp4684 +g10 +aa(lp4685 +g8 +aI723 +aI-493 +aa(lp4686 +g15 +aI653 +aI-776 +aI723 +aI-620 +aI700 +aI-714 +aa(lp4687 +g15 +aI447 +aI-869 +aI607 +aI-838 +aI538 +aI-869 +aa(lp4688 +g20 +aI371 +aI-869 +aa(lp4689 +g20 +aI371 +aI-82 +aa(lp4690 +g20 +aI446 +aI-82 +aa(lp4691 +g15 +aI567 +aI-110 +aI492 +aI-82 +aI532 +aI-91 +aa(lp4692 +g15 +aI653 +aI-192 +aI601 +aI-129 +aI630 +aI-156 +aa(lp4693 +g15 +aI706 +aI-321 +aI677 +aI-227 +aI694 +aI-270 +aa(lp4694 +g15 +aI723 +aI-493 +aI718 +aI-372 +aI723 +aI-429 +aa(lp4695 +g10 +aa(lp4696 +g8 +aI1022 +aI0 +aa(lp4697 +g10 +aa(lp4698 +g8 +aI1022 +aI0 +aasVH +(lp4699 +(lp4700 +g8 +aI594 +aI0 +aa(lp4701 +g20 +aI594 +aI-70 +aa(lp4702 +g20 +aI651 +aI-70 +aa(lp4703 +g15 +aI678 +aI-73 +aI661 +aI-70 +aI670 +aI-71 +aa(lp4704 +g15 +aI700 +aI-85 +aI686 +aI-75 +aI693 +aI-79 +aa(lp4705 +g15 +aI714 +aI-111 +aI706 +aI-91 +aI711 +aI-100 +aa(lp4706 +g15 +aI720 +aI-157 +aI718 +aI-122 +aI720 +aI-138 +aa(lp4707 +g20 +aI720 +aI-455 +aa(lp4708 +g20 +aI371 +aI-455 +aa(lp4709 +g20 +aI371 +aI-157 +aa(lp4710 +g15 +aI377 +aI-111 +aI371 +aI-138 +aI373 +aI-122 +aa(lp4711 +g15 +aI391 +aI-85 +aI380 +aI-100 +aI385 +aI-91 +aa(lp4712 +g15 +aI413 +aI-73 +aI398 +aI-79 +aI405 +aI-75 +aa(lp4713 +g15 +aI440 +aI-70 +aI421 +aI-71 +aI430 +aI-70 +aa(lp4714 +g20 +aI497 +aI-70 +aa(lp4715 +g20 +aI497 +aI0 +aa(lp4716 +g20 +aI37 +aI0 +aa(lp4717 +g20 +aI37 +aI-70 +aa(lp4718 +g20 +aI93 +aI-70 +aa(lp4719 +g15 +aI119 +aI-73 +aI102 +aI-70 +aI111 +aI-71 +aa(lp4720 +g15 +aI141 +aI-85 +aI128 +aI-75 +aI135 +aI-79 +aa(lp4721 +g15 +aI156 +aI-111 +aI147 +aI-91 +aI152 +aI-100 +aa(lp4722 +g15 +aI161 +aI-157 +aI159 +aI-122 +aI161 +aI-138 +aa(lp4723 +g20 +aI161 +aI-799 +aa(lp4724 +g15 +aI155 +aI-841 +aI161 +aI-816 +aI159 +aI-831 +aa(lp4725 +g15 +aI140 +aI-866 +aI152 +aI-852 +aI147 +aI-860 +aa(lp4726 +g15 +aI119 +aI-877 +aI134 +aI-871 +aI127 +aI-875 +aa(lp4727 +g15 +aI93 +aI-880 +aI110 +aI-879 +aI102 +aI-880 +aa(lp4728 +g20 +aI37 +aI-880 +aa(lp4729 +g20 +aI37 +aI-951 +aa(lp4730 +g20 +aI497 +aI-951 +aa(lp4731 +g20 +aI497 +aI-880 +aa(lp4732 +g20 +aI440 +aI-880 +aa(lp4733 +g15 +aI413 +aI-877 +aI430 +aI-880 +aI421 +aI-879 +aa(lp4734 +g15 +aI391 +aI-865 +aI405 +aI-875 +aI398 +aI-871 +aa(lp4735 +g15 +aI377 +aI-839 +aI385 +aI-859 +aI380 +aI-850 +aa(lp4736 +g15 +aI371 +aI-793 +aI373 +aI-828 +aI371 +aI-812 +aa(lp4737 +g20 +aI371 +aI-536 +aa(lp4738 +g20 +aI720 +aI-536 +aa(lp4739 +g20 +aI720 +aI-793 +aa(lp4740 +g15 +aI714 +aI-839 +aI720 +aI-812 +aI718 +aI-828 +aa(lp4741 +g15 +aI700 +aI-865 +aI711 +aI-850 +aI706 +aI-859 +aa(lp4742 +g15 +aI678 +aI-877 +aI693 +aI-871 +aI686 +aI-875 +aa(lp4743 +g15 +aI651 +aI-880 +aI670 +aI-879 +aI661 +aI-880 +aa(lp4744 +g20 +aI594 +aI-880 +aa(lp4745 +g20 +aI594 +aI-951 +aa(lp4746 +g20 +aI1054 +aI-951 +aa(lp4747 +g20 +aI1054 +aI-880 +aa(lp4748 +g20 +aI998 +aI-880 +aa(lp4749 +g15 +aI972 +aI-877 +aI989 +aI-880 +aI980 +aI-879 +aa(lp4750 +g15 +aI950 +aI-865 +aI964 +aI-875 +aI957 +aI-871 +aa(lp4751 +g15 +aI936 +aI-839 +aI944 +aI-859 +aI939 +aI-850 +aa(lp4752 +g15 +aI930 +aI-793 +aI932 +aI-828 +aI930 +aI-812 +aa(lp4753 +g20 +aI930 +aI-149 +aa(lp4754 +g15 +aI936 +aI-107 +aI930 +aI-132 +aI932 +aI-118 +aa(lp4755 +g15 +aI951 +aI-83 +aI940 +aI-97 +aI945 +aI-89 +aa(lp4756 +g15 +aI972 +aI-73 +aI957 +aI-78 +aI964 +aI-74 +aa(lp4757 +g15 +aI998 +aI-70 +aI981 +aI-71 +aI989 +aI-70 +aa(lp4758 +g20 +aI1054 +aI-70 +aa(lp4759 +g20 +aI1054 +aI0 +aa(lp4760 +g10 +aa(lp4761 +g8 +aI1091 +aI0 +aa(lp4762 +g10 +aa(lp4763 +g8 +aI1091 +aI0 +aasVL +(lp4764 +(lp4765 +g8 +aI37 +aI0 +aa(lp4766 +g20 +aI37 +aI-70 +aa(lp4767 +g20 +aI93 +aI-70 +aa(lp4768 +g15 +aI120 +aI-73 +aI103 +aI-70 +aI112 +aI-71 +aa(lp4769 +g15 +aI141 +aI-85 +aI128 +aI-75 +aI135 +aI-79 +aa(lp4770 +g15 +aI156 +aI-111 +aI148 +aI-91 +aI152 +aI-100 +aa(lp4771 +g15 +aI161 +aI-157 +aI159 +aI-122 +aI161 +aI-138 +aa(lp4772 +g20 +aI161 +aI-794 +aa(lp4773 +g15 +aI156 +aI-840 +aI161 +aI-813 +aI159 +aI-828 +aa(lp4774 +g15 +aI141 +aI-866 +aI152 +aI-851 +aI148 +aI-860 +aa(lp4775 +g15 +aI120 +aI-878 +aI135 +aI-872 +aI128 +aI-876 +aa(lp4776 +g15 +aI93 +aI-881 +aI112 +aI-880 +aI103 +aI-881 +aa(lp4777 +g20 +aI37 +aI-881 +aa(lp4778 +g20 +aI37 +aI-951 +aa(lp4779 +g20 +aI497 +aI-951 +aa(lp4780 +g20 +aI497 +aI-881 +aa(lp4781 +g20 +aI441 +aI-881 +aa(lp4782 +g15 +aI415 +aI-878 +aI432 +aI-881 +aI423 +aI-880 +aa(lp4783 +g15 +aI393 +aI-866 +aI406 +aI-876 +aI399 +aI-872 +aa(lp4784 +g15 +aI378 +aI-842 +aI387 +aI-861 +aI382 +aI-852 +aa(lp4785 +g15 +aI373 +aI-799 +aI374 +aI-831 +aI373 +aI-817 +aa(lp4786 +g20 +aI373 +aI-80 +aa(lp4787 +g20 +aI621 +aI-80 +aa(lp4788 +g15 +aI694 +aI-110 +aI652 +aI-80 +aI676 +aI-90 +aa(lp4789 +g15 +aI731 +aI-196 +aI711 +aI-130 +aI723 +aI-159 +aa(lp4790 +g20 +aI753 +aI-297 +aa(lp4791 +g20 +aI828 +aI-297 +aa(lp4792 +g20 +aI818 +aI0 +aa(lp4793 +g10 +aa(lp4794 +g8 +aI871 +aI0 +aa(lp4795 +g10 +aa(lp4796 +g8 +aI871 +aI0 +aasVP +(lp4797 +(lp4798 +g8 +aI810 +aI-668 +aa(lp4799 +g15 +aI789 +aI-553 +aI810 +aI-628 +aI803 +aI-590 +aa(lp4800 +g15 +aI722 +aI-455 +aI775 +aI-516 +aI753 +aI-484 +aa(lp4801 +g15 +aI600 +aI-388 +aI690 +aI-427 +aI650 +aI-405 +aa(lp4802 +g15 +aI417 +aI-363 +aI550 +aI-371 +aI489 +aI-363 +aa(lp4803 +g20 +aI371 +aI-363 +aa(lp4804 +g20 +aI371 +aI-149 +aa(lp4805 +g15 +aI377 +aI-107 +aI371 +aI-132 +aI373 +aI-118 +aa(lp4806 +g15 +aI393 +aI-83 +aI381 +aI-97 +aI386 +aI-89 +aa(lp4807 +g15 +aI416 +aI-73 +aI399 +aI-78 +aI407 +aI-74 +aa(lp4808 +g15 +aI442 +aI-70 +aI424 +aI-71 +aI433 +aI-70 +aa(lp4809 +g20 +aI524 +aI-70 +aa(lp4810 +g20 +aI524 +aI0 +aa(lp4811 +g20 +aI37 +aI0 +aa(lp4812 +g20 +aI37 +aI-70 +aa(lp4813 +g20 +aI93 +aI-70 +aa(lp4814 +g15 +aI120 +aI-73 +aI103 +aI-70 +aI112 +aI-71 +aa(lp4815 +g15 +aI141 +aI-85 +aI128 +aI-75 +aI135 +aI-79 +aa(lp4816 +g15 +aI156 +aI-111 +aI148 +aI-91 +aI152 +aI-100 +aa(lp4817 +g15 +aI161 +aI-157 +aI159 +aI-122 +aI161 +aI-138 +aa(lp4818 +g20 +aI161 +aI-799 +aa(lp4819 +g15 +aI156 +aI-842 +aI161 +aI-817 +aI159 +aI-831 +aa(lp4820 +g15 +aI141 +aI-866 +aI152 +aI-852 +aI147 +aI-861 +aa(lp4821 +g15 +aI119 +aI-878 +aI135 +aI-872 +aI128 +aI-876 +aa(lp4822 +g15 +aI93 +aI-881 +aI111 +aI-880 +aI102 +aI-881 +aa(lp4823 +g20 +aI37 +aI-881 +aa(lp4824 +g20 +aI37 +aI-951 +aa(lp4825 +g20 +aI446 +aI-951 +aa(lp4826 +g15 +aI607 +aI-931 +aI508 +aI-951 +aI561 +aI-944 +aa(lp4827 +g15 +aI721 +aI-875 +aI652 +aI-918 +aI690 +aI-900 +aa(lp4828 +g15 +aI788 +aI-786 +aI751 +aI-851 +aI773 +aI-821 +aa(lp4829 +g15 +aI810 +aI-668 +aI803 +aI-751 +aI810 +aI-712 +aa(lp4830 +g10 +aa(lp4831 +g8 +aI371 +aI-440 +aa(lp4832 +g20 +aI404 +aI-440 +aa(lp4833 +g15 +aI488 +aI-453 +aI437 +aI-440 +aI465 +aI-445 +aa(lp4834 +g15 +aI544 +aI-492 +aI511 +aI-461 +aI530 +aI-474 +aa(lp4835 +g15 +aI576 +aI-561 +aI559 +aI-510 +aI569 +aI-533 +aa(lp4836 +g15 +aI586 +aI-663 +aI583 +aI-589 +aI586 +aI-623 +aa(lp4837 +g15 +aI577 +aI-756 +aI586 +aI-699 +aI583 +aI-730 +aa(lp4838 +g15 +aI549 +aI-821 +aI571 +aI-782 +aI562 +aI-804 +aa(lp4839 +g15 +aI499 +aI-859 +aI537 +aI-838 +aI520 +aI-851 +aa(lp4840 +g15 +aI423 +aI-872 +aI479 +aI-868 +aI453 +aI-872 +aa(lp4841 +g20 +aI371 +aI-872 +aa(lp4842 +g10 +aa(lp4843 +g8 +aI850 +aI0 +aa(lp4844 +g10 +aa(lp4845 +g8 +aI850 +aI0 +aasVT +(lp4846 +(lp4847 +g8 +aI541 +aI-157 +aa(lp4848 +g15 +aI546 +aI-111 +aI541 +aI-138 +aI542 +aI-122 +aa(lp4849 +g15 +aI560 +aI-85 +aI549 +aI-100 +aI554 +aI-91 +aa(lp4850 +g15 +aI582 +aI-73 +aI567 +aI-79 +aI574 +aI-75 +aa(lp4851 +g15 +aI609 +aI-70 +aI590 +aI-71 +aI599 +aI-70 +aa(lp4852 +g20 +aI665 +aI-70 +aa(lp4853 +g20 +aI665 +aI0 +aa(lp4854 +g20 +aI205 +aI0 +aa(lp4855 +g20 +aI205 +aI-70 +aa(lp4856 +g20 +aI261 +aI-70 +aa(lp4857 +g15 +aI288 +aI-73 +aI271 +aI-70 +aI280 +aI-71 +aa(lp4858 +g15 +aI309 +aI-85 +aI296 +aI-75 +aI303 +aI-79 +aa(lp4859 +g15 +aI324 +aI-111 +aI315 +aI-91 +aI320 +aI-100 +aa(lp4860 +g15 +aI329 +aI-157 +aI327 +aI-122 +aI329 +aI-138 +aa(lp4861 +g20 +aI329 +aI-869 +aa(lp4862 +g20 +aI222 +aI-869 +aa(lp4863 +g15 +aI172 +aI-863 +aI202 +aI-869 +aI185 +aI-867 +aa(lp4864 +g15 +aI139 +aI-844 +aI159 +aI-859 +aI148 +aI-852 +aa(lp4865 +g15 +aI120 +aI-815 +aI131 +aI-836 +aI124 +aI-827 +aa(lp4866 +g15 +aI111 +aI-775 +aI116 +aI-803 +aI113 +aI-790 +aa(lp4867 +g20 +aI102 +aI-692 +aa(lp4868 +g20 +aI13 +aI-692 +aa(lp4869 +g20 +aI20 +aI-951 +aa(lp4870 +g20 +aI850 +aI-951 +aa(lp4871 +g20 +aI857 +aI-692 +aa(lp4872 +g20 +aI768 +aI-692 +aa(lp4873 +g20 +aI758 +aI-775 +aa(lp4874 +g15 +aI749 +aI-815 +aI756 +aI-790 +aI753 +aI-803 +aa(lp4875 +g15 +aI730 +aI-844 +aI745 +aI-827 +aI739 +aI-836 +aa(lp4876 +g15 +aI697 +aI-863 +aI722 +aI-852 +aI711 +aI-859 +aa(lp4877 +g15 +aI647 +aI-869 +aI684 +aI-867 +aI667 +aI-869 +aa(lp4878 +g20 +aI541 +aI-869 +aa(lp4879 +g10 +aa(lp4880 +g8 +aI870 +aI0 +aa(lp4881 +g10 +aa(lp4882 +g8 +aI870 +aI0 +aasVX +(lp4883 +(lp4884 +g8 +aI697 +aI-841 +aa(lp4885 +g15 +aI691 +aI-861 +aI697 +aI-849 +aI695 +aI-856 +aa(lp4886 +g15 +aI675 +aI-873 +aI687 +aI-866 +aI682 +aI-870 +aa(lp4887 +g15 +aI651 +aI-879 +aI668 +aI-876 +aI660 +aI-878 +aa(lp4888 +g15 +aI622 +aI-881 +aI642 +aI-880 +aI632 +aI-881 +aa(lp4889 +g20 +aI618 +aI-881 +aa(lp4890 +g20 +aI618 +aI-951 +aa(lp4891 +g20 +aI930 +aI-951 +aa(lp4892 +g20 +aI930 +aI-881 +aa(lp4893 +g20 +aI918 +aI-881 +aa(lp4894 +g15 +aI883 +aI-876 +aI905 +aI-881 +aI893 +aI-879 +aa(lp4895 +g15 +aI852 +aI-859 +aI873 +aI-872 +aI862 +aI-867 +aa(lp4896 +g15 +aI821 +aI-830 +aI842 +aI-852 +aI832 +aI-842 +aa(lp4897 +g15 +aI786 +aI-784 +aI811 +aI-818 +aI799 +aI-802 +aa(lp4898 +g20 +aI593 +aI-521 +aa(lp4899 +g20 +aI838 +aI-140 +aa(lp4900 +g15 +aI892 +aI-85 +aI855 +aI-113 +aI873 +aI-94 +aa(lp4901 +g15 +aI945 +aI-70 +aI911 +aI-75 +aI928 +aI-70 +aa(lp4902 +g20 +aI962 +aI-70 +aa(lp4903 +g20 +aI962 +aI0 +aa(lp4904 +g20 +aI522 +aI0 +aa(lp4905 +g20 +aI522 +aI-70 +aa(lp4906 +g20 +aI529 +aI-70 +aa(lp4907 +g15 +aI609 +aI-114 +aI582 +aI-70 +aI609 +aI-85 +aa(lp4908 +g15 +aI608 +aI-129 +aI609 +aI-119 +aI608 +aI-124 +aa(lp4909 +g15 +aI601 +aI-146 +aI607 +aI-133 +aI605 +aI-139 +aa(lp4910 +g15 +aI588 +aI-170 +aI598 +aI-152 +aI594 +aI-160 +aa(lp4911 +g15 +aI565 +aI-205 +aI582 +aI-179 +aI575 +aI-191 +aa(lp4912 +g20 +aI442 +aI-391 +aa(lp4913 +g20 +aI298 +aI-196 +aa(lp4914 +g15 +aI275 +aI-158 +aI290 +aI-185 +aI282 +aI-172 +aa(lp4915 +g15 +aI264 +aI-115 +aI268 +aI-143 +aI264 +aI-129 +aa(lp4916 +g15 +aI282 +aI-81 +aI264 +aI-100 +aI270 +aI-89 +aa(lp4917 +g15 +aI345 +aI-70 +aI294 +aI-74 +aI315 +aI-70 +aa(lp4918 +g20 +aI349 +aI-70 +aa(lp4919 +g20 +aI349 +aI0 +aa(lp4920 +g20 +aI13 +aI0 +aa(lp4921 +g20 +aI13 +aI-70 +aa(lp4922 +g20 +aI21 +aI-70 +aa(lp4923 +g15 +aI63 +aI-77 +aI37 +aI-70 +aI51 +aI-72 +aa(lp4924 +g15 +aI97 +aI-95 +aI75 +aI-81 +aI87 +aI-87 +aa(lp4925 +g15 +aI128 +aI-124 +aI108 +aI-103 +aI118 +aI-113 +aa(lp4926 +g15 +aI160 +aI-163 +aI138 +aI-136 +aI149 +aI-149 +aa(lp4927 +g20 +aI393 +aI-467 +aa(lp4928 +g20 +aI173 +aI-810 +aa(lp4929 +g15 +aI151 +aI-841 +aI165 +aI-821 +aI158 +aI-832 +aa(lp4930 +g15 +aI127 +aI-863 +aI144 +aI-849 +aI136 +aI-857 +aa(lp4931 +g15 +aI97 +aI-876 +aI118 +aI-869 +aI108 +aI-873 +aa(lp4932 +g15 +aI58 +aI-881 +aI86 +aI-879 +aI73 +aI-881 +aa(lp4933 +g20 +aI41 +aI-881 +aa(lp4934 +g20 +aI41 +aI-951 +aa(lp4935 +g20 +aI482 +aI-951 +aa(lp4936 +g20 +aI482 +aI-881 +aa(lp4937 +g20 +aI478 +aI-881 +aa(lp4938 +g15 +aI440 +aI-878 +aI463 +aI-881 +aI450 +aI-880 +aa(lp4939 +g15 +aI416 +aI-869 +aI430 +aI-876 +aI422 +aI-873 +aa(lp4940 +g15 +aI403 +aI-856 +aI409 +aI-865 +aI405 +aI-861 +aa(lp4941 +g15 +aI399 +aI-841 +aI400 +aI-852 +aI399 +aI-847 +aa(lp4942 +g15 +aI409 +aI-807 +aI399 +aI-832 +aI403 +aI-821 +aa(lp4943 +g15 +aI434 +aI-763 +aI416 +aI-793 +aI424 +aI-779 +aa(lp4944 +g20 +aI545 +aI-598 +aa(lp4945 +g20 +aI661 +aI-760 +aa(lp4946 +g15 +aI685 +aI-801 +aI669 +aI-772 +aI677 +aI-786 +aa(lp4947 +g15 +aI697 +aI-841 +aI693 +aI-816 +aI697 +aI-829 +aa(lp4948 +g10 +aa(lp4949 +g8 +aI975 +aI0 +aa(lp4950 +g10 +aa(lp4951 +g8 +aI975 +aI0 +aasV\u005C +(lp4952 +(lp4953 +g8 +aI0 +aI-1012 +aa(lp4954 +g20 +aI94 +aI-1012 +aa(lp4955 +g20 +aI384 +aI161 +aa(lp4956 +g20 +aI287 +aI161 +aa(lp4957 +g10 +aa(lp4958 +g8 +aI384 +aI0 +aa(lp4959 +g10 +aa(lp4960 +g8 +aI384 +aI0 +aasV` +(lp4961 +(lp4962 +g8 +aI464 +aI-807 +aa(lp4963 +g15 +aI394 +aI-852 +aI443 +aI-819 +aI420 +aI-834 +aa(lp4964 +g15 +aI321 +aI-908 +aI369 +aI-870 +aI344 +aI-889 +aa(lp4965 +g15 +aI257 +aI-963 +aI297 +aI-927 +aI276 +aI-945 +aa(lp4966 +g15 +aI216 +aI-1007 +aI238 +aI-980 +aI224 +aI-995 +aa(lp4967 +g20 +aI216 +aI-1021 +aa(lp4968 +g20 +aI425 +aI-1021 +aa(lp4969 +g15 +aI451 +aI-972 +aI432 +aI-1006 +aI440 +aI-990 +aa(lp4970 +g15 +aI486 +aI-919 +aI462 +aI-954 +aI474 +aI-937 +aa(lp4971 +g15 +aI522 +aI-868 +aI497 +aI-902 +aI509 +aI-885 +aa(lp4972 +g15 +aI554 +aI-825 +aI534 +aI-852 +aI545 +aI-837 +aa(lp4973 +g20 +aI554 +aI-807 +aa(lp4974 +g10 +aa(lp4975 +g8 +aI769 +aI0 +aa(lp4976 +g10 +aa(lp4977 +g8 +aI769 +aI0 +aasVd +(lp4978 +(lp4979 +g8 +aI730 +aI-163 +aa(lp4980 +g15 +aI739 +aI-114 +aI730 +aI-143 +aI733 +aI-126 +aa(lp4981 +g15 +aI763 +aI-86 +aI745 +aI-102 +aI753 +aI-93 +aa(lp4982 +g15 +aI799 +aI-73 +aI774 +aI-80 +aI785 +aI-75 +aa(lp4983 +g15 +aI841 +aI-70 +aI812 +aI-71 +aI826 +aI-70 +aa(lp4984 +g20 +aI846 +aI-70 +aa(lp4985 +g20 +aI846 +aI0 +aa(lp4986 +g20 +aI587 +aI0 +aa(lp4987 +g20 +aI550 +aI-103 +aa(lp4988 +g20 +aI538 +aI-103 +aa(lp4989 +g15 +aI504 +aI-54 +aI528 +aI-85 +aI517 +aI-69 +aa(lp4990 +g15 +aI459 +aI-18 +aI491 +aI-40 +aI476 +aI-28 +aa(lp4991 +g15 +aI403 +aI5 +aI443 +aI-7 +aI424 +aI0 +aa(lp4992 +g15 +aI333 +aI13 +aI382 +aI10 +aI359 +aI13 +aa(lp4993 +g15 +aI217 +aI-8 +aI289 +aI13 +aI251 +aI6 +aa(lp4994 +g15 +aI131 +aI-75 +aI183 +aI-22 +aI155 +aI-45 +aa(lp4995 +g15 +aI79 +aI-190 +aI108 +aI-105 +aI91 +aI-143 +aa(lp4996 +g15 +aI61 +aI-355 +aI67 +aI-236 +aI61 +aI-291 +aa(lp4997 +g15 +aI79 +aI-522 +aI61 +aI-419 +aI67 +aI-475 +aa(lp4998 +g15 +aI131 +aI-639 +aI91 +aI-569 +aI108 +aI-608 +aa(lp4999 +g15 +aI216 +aI-707 +aI154 +aI-669 +aI182 +aI-692 +aa(lp5000 +g15 +aI330 +aI-730 +aI249 +aI-722 +aI287 +aI-730 +aa(lp5001 +g15 +aI398 +aI-721 +aI355 +aI-730 +aI378 +aI-727 +aa(lp5002 +g15 +aI453 +aI-699 +aI418 +aI-716 +aI437 +aI-709 +aa(lp5003 +g15 +aI496 +aI-666 +aI469 +aI-690 +aI484 +aI-679 +aa(lp5004 +g15 +aI529 +aI-623 +aI509 +aI-653 +aI520 +aI-638 +aa(lp5005 +g20 +aI538 +aI-623 +aa(lp5006 +g15 +aI533 +aI-692 +aI536 +aI-647 +aI534 +aI-671 +aa(lp5007 +g15 +aI531 +aI-720 +aI532 +aI-702 +aI532 +aI-711 +aa(lp5008 +g15 +aI529 +aI-747 +aI530 +aI-730 +aI530 +aI-739 +aa(lp5009 +g15 +aI528 +aI-770 +aI528 +aI-756 +aI528 +aI-763 +aa(lp5010 +g15 +aI527 +aI-786 +aI528 +aI-776 +aI527 +aI-782 +aa(lp5011 +g20 +aI527 +aI-859 +aa(lp5012 +g15 +aI519 +aI-903 +aI527 +aI-877 +aI525 +aI-892 +aa(lp5013 +g15 +aI495 +aI-928 +aI513 +aI-914 +aI505 +aI-922 +aa(lp5014 +g15 +aI461 +aI-939 +aI486 +aI-934 +aI474 +aI-937 +aa(lp5015 +g15 +aI419 +aI-942 +aI448 +aI-941 +aI434 +aI-942 +aa(lp5016 +g20 +aI409 +aI-942 +aa(lp5017 +g20 +aI409 +aI-1012 +aa(lp5018 +g20 +aI730 +aI-1012 +aa(lp5019 +g10 +aa(lp5020 +g8 +aI390 +aI-86 +aa(lp5021 +g15 +aI456 +aI-102 +aI417 +aI-86 +aI439 +aI-91 +aa(lp5022 +g15 +aI499 +aI-153 +aI474 +aI-113 +aI488 +aI-130 +aa(lp5023 +g15 +aI521 +aI-238 +aI509 +aI-175 +aI517 +aI-204 +aa(lp5024 +g15 +aI527 +aI-358 +aI525 +aI-272 +aI527 +aI-312 +aa(lp5025 +g15 +aI521 +aI-475 +aI527 +aI-402 +aI525 +aI-441 +aa(lp5026 +g15 +aI499 +aI-561 +aI517 +aI-509 +aI509 +aI-537 +aa(lp5027 +g15 +aI456 +aI-613 +aI488 +aI-584 +aI474 +aI-601 +aa(lp5028 +g15 +aI390 +aI-631 +aI439 +aI-625 +aI417 +aI-631 +aa(lp5029 +g15 +aI333 +aI-613 +aI368 +aI-631 +aI349 +aI-625 +aa(lp5030 +g15 +aI295 +aI-560 +aI317 +aI-601 +aI305 +aI-584 +aa(lp5031 +g15 +aI273 +aI-474 +aI285 +aI-537 +aI278 +aI-508 +aa(lp5032 +g15 +aI266 +aI-356 +aI269 +aI-440 +aI266 +aI-401 +aa(lp5033 +g15 +aI295 +aI-153 +aI266 +aI-266 +aI276 +aI-198 +aa(lp5034 +g15 +aI390 +aI-86 +aI314 +aI-108 +aI345 +aI-86 +aa(lp5035 +g10 +aa(lp5036 +g8 +aI865 +aI0 +aa(lp5037 +g10 +aa(lp5038 +g8 +aI865 +aI0 +aasVh +(lp5039 +(lp5040 +g8 +aI558 +aI0 +aa(lp5041 +g20 +aI558 +aI-438 +aa(lp5042 +g15 +aI553 +aI-514 +aI558 +aI-466 +aI556 +aI-492 +aa(lp5043 +g15 +aI534 +aI-571 +aI549 +aI-537 +aI543 +aI-555 +aa(lp5044 +g15 +aI501 +aI-605 +aI526 +aI-586 +aI515 +aI-597 +aa(lp5045 +g15 +aI451 +aI-618 +aI487 +aI-614 +aI471 +aI-618 +aa(lp5046 +g15 +aI396 +aI-601 +aI429 +aI-618 +aI411 +aI-612 +aa(lp5047 +g15 +aI361 +aI-555 +aI381 +aI-589 +aI369 +aI-574 +aa(lp5048 +g15 +aI341 +aI-490 +aI352 +aI-536 +aI345 +aI-515 +aa(lp5049 +g15 +aI335 +aI-411 +aI337 +aI-465 +aI335 +aI-439 +aa(lp5050 +g20 +aI335 +aI-157 +aa(lp5051 +g15 +aI342 +aI-112 +aI335 +aI-138 +aI338 +aI-123 +aa(lp5052 +g15 +aI361 +aI-85 +aI347 +aI-100 +aI353 +aI-92 +aa(lp5053 +g15 +aI392 +aI-73 +aI370 +aI-79 +aI380 +aI-75 +aa(lp5054 +g15 +aI432 +aI-70 +aI404 +aI-71 +aI417 +aI-70 +aa(lp5055 +g20 +aI436 +aI-70 +aa(lp5056 +g20 +aI436 +aI0 +aa(lp5057 +g20 +aI26 +aI0 +aa(lp5058 +g20 +aI26 +aI-70 +aa(lp5059 +g20 +aI29 +aI-70 +aa(lp5060 +g15 +aI70 +aI-73 +aI44 +aI-70 +aI58 +aI-71 +aa(lp5061 +g15 +aI103 +aI-86 +aI83 +aI-75 +aI94 +aI-79 +aa(lp5062 +g15 +aI125 +aI-114 +aI113 +aI-92 +aI120 +aI-101 +aa(lp5063 +g15 +aI133 +aI-162 +aI130 +aI-126 +aI133 +aI-142 +aa(lp5064 +g20 +aI133 +aI-860 +aa(lp5065 +g15 +aI124 +aI-903 +aI133 +aI-878 +aI130 +aI-892 +aa(lp5066 +g15 +aI100 +aI-928 +aI117 +aI-914 +aI109 +aI-922 +aa(lp5067 +g15 +aI69 +aI-939 +aI90 +aI-934 +aI80 +aI-937 +aa(lp5068 +g15 +aI38 +aI-942 +aI58 +aI-941 +aI47 +aI-942 +aa(lp5069 +g20 +aI22 +aI-942 +aa(lp5070 +g20 +aI22 +aI-1012 +aa(lp5071 +g20 +aI335 +aI-1012 +aa(lp5072 +g20 +aI335 +aI-793 +aa(lp5073 +g15 +aI334 +aI-737 +aI335 +aI-775 +aI335 +aI-757 +aa(lp5074 +g15 +aI330 +aI-681 +aI333 +aI-717 +aI332 +aI-698 +aa(lp5075 +g15 +aI325 +aI-623 +aI328 +aI-661 +aI327 +aI-642 +aa(lp5076 +g20 +aI337 +aI-623 +aa(lp5077 +g15 +aI379 +aI-682 +aI350 +aI-648 +aI364 +aI-668 +aa(lp5078 +g15 +aI427 +aI-714 +aI394 +aI-696 +aI410 +aI-707 +aa(lp5079 +g15 +aI481 +aI-728 +aI444 +aI-721 +aI462 +aI-726 +aa(lp5080 +g15 +aI541 +aI-731 +aI500 +aI-730 +aI520 +aI-731 +aa(lp5081 +g15 +aI633 +aI-716 +aI575 +aI-731 +aI606 +aI-726 +aa(lp5082 +g15 +aI702 +aI-670 +aI660 +aI-706 +aI683 +aI-690 +aa(lp5083 +g15 +aI746 +aI-590 +aI721 +aI-649 +aI736 +aI-622 +aa(lp5084 +g15 +aI761 +aI-474 +aI756 +aI-558 +aI761 +aI-519 +aa(lp5085 +g20 +aI761 +aI-164 +aa(lp5086 +g15 +aI766 +aI-115 +aI761 +aI-144 +aI762 +aI-127 +aa(lp5087 +g15 +aI783 +aI-86 +aI770 +aI-102 +aI775 +aI-93 +aa(lp5088 +g15 +aI811 +aI-73 +aI790 +aI-80 +aI799 +aI-75 +aa(lp5089 +g15 +aI850 +aI-70 +aI822 +aI-71 +aI835 +aI-70 +aa(lp5090 +g20 +aI854 +aI-70 +aa(lp5091 +g20 +aI854 +aI0 +aa(lp5092 +g10 +aa(lp5093 +g8 +aI889 +aI0 +aa(lp5094 +g10 +aa(lp5095 +g8 +aI889 +aI0 +aasVl +(lp5096 +(lp5097 +g8 +aI38 +aI-70 +aa(lp5098 +g15 +aI69 +aI-73 +aI48 +aI-70 +aI58 +aI-71 +aa(lp5099 +g15 +aI100 +aI-85 +aI81 +aI-75 +aI91 +aI-79 +aa(lp5100 +g15 +aI124 +aI-111 +aI109 +aI-91 +aI117 +aI-100 +aa(lp5101 +g15 +aI133 +aI-157 +aI130 +aI-122 +aI133 +aI-138 +aa(lp5102 +g20 +aI133 +aI-860 +aa(lp5103 +g15 +aI124 +aI-903 +aI133 +aI-878 +aI130 +aI-892 +aa(lp5104 +g15 +aI100 +aI-928 +aI117 +aI-914 +aI109 +aI-922 +aa(lp5105 +g15 +aI69 +aI-939 +aI90 +aI-934 +aI80 +aI-937 +aa(lp5106 +g15 +aI38 +aI-942 +aI58 +aI-941 +aI47 +aI-942 +aa(lp5107 +g20 +aI22 +aI-942 +aa(lp5108 +g20 +aI22 +aI-1012 +aa(lp5109 +g20 +aI335 +aI-1012 +aa(lp5110 +g20 +aI335 +aI-157 +aa(lp5111 +g15 +aI345 +aI-111 +aI335 +aI-138 +aI339 +aI-122 +aa(lp5112 +g15 +aI368 +aI-85 +aI351 +aI-100 +aI359 +aI-91 +aa(lp5113 +g15 +aI399 +aI-73 +aI378 +aI-79 +aI388 +aI-75 +aa(lp5114 +g15 +aI430 +aI-70 +aI411 +aI-71 +aI421 +aI-70 +aa(lp5115 +g20 +aI446 +aI-70 +aa(lp5116 +g20 +aI446 +aI0 +aa(lp5117 +g20 +aI22 +aI0 +aa(lp5118 +g20 +aI22 +aI-70 +aa(lp5119 +g10 +aa(lp5120 +g8 +aI469 +aI0 +aa(lp5121 +g10 +aa(lp5122 +g8 +aI469 +aI0 +aasVp +(lp5123 +(lp5124 +g8 +aI33 +aI249 +aa(lp5125 +g15 +aI64 +aI246 +aI43 +aI249 +aI53 +aI248 +aa(lp5126 +g15 +aI95 +aI234 +aI75 +aI244 +aI86 +aI240 +aa(lp5127 +g15 +aI118 +aI208 +aI104 +aI228 +aI112 +aI220 +aa(lp5128 +g15 +aI128 +aI163 +aI125 +aI197 +aI128 +aI182 +aa(lp5129 +g20 +aI128 +aI-550 +aa(lp5130 +g15 +aI121 +aI-599 +aI128 +aI-570 +aI125 +aI-587 +aa(lp5131 +g15 +aI102 +aI-627 +aI116 +aI-611 +aI110 +aI-620 +aa(lp5132 +g15 +aI73 +aI-640 +aI94 +aI-633 +aI84 +aI-638 +aa(lp5133 +g15 +aI38 +aI-643 +aI62 +aI-642 +aI50 +aI-643 +aa(lp5134 +g20 +aI29 +aI-643 +aa(lp5135 +g20 +aI29 +aI-714 +aa(lp5136 +g20 +aI290 +aI-714 +aa(lp5137 +g20 +aI314 +aI-610 +aa(lp5138 +g20 +aI320 +aI-610 +aa(lp5139 +g15 +aI353 +aI-657 +aI329 +aI-627 +aI341 +aI-643 +aa(lp5140 +g15 +aI398 +aI-694 +aI366 +aI-672 +aI381 +aI-684 +aa(lp5141 +g15 +aI454 +aI-718 +aI414 +aI-705 +aI433 +aI-713 +aa(lp5142 +g15 +aI524 +aI-727 +aI475 +aI-724 +aI498 +aI-727 +aa(lp5143 +g15 +aI641 +aI-705 +aI568 +aI-727 +aI607 +aI-720 +aa(lp5144 +g15 +aI727 +aI-637 +aI675 +aI-691 +aI704 +aI-668 +aa(lp5145 +g15 +aI779 +aI-521 +aI750 +aI-607 +aI767 +aI-568 +aa(lp5146 +g15 +aI797 +aI-354 +aI791 +aI-474 +aI797 +aI-419 +aa(lp5147 +g15 +aI779 +aI-188 +aI797 +aI-290 +aI791 +aI-234 +aa(lp5148 +g15 +aI728 +aI-72 +aI768 +aI-141 +aI750 +aI-102 +aa(lp5149 +g15 +aI644 +aI-5 +aI705 +aI-42 +aI677 +aI-19 +aa(lp5150 +g15 +aI529 +aI16 +aI611 +aI9 +aI572 +aI16 +aa(lp5151 +g15 +aI405 +aI-12 +aI478 +aI16 +aI437 +aI7 +aa(lp5152 +g15 +aI329 +aI-90 +aI373 +aI-31 +aI348 +aI-57 +aa(lp5153 +g20 +aI320 +aI-90 +aa(lp5154 +g15 +aI325 +aI-30 +aI322 +aI-69 +aI323 +aI-49 +aa(lp5155 +g15 +aI329 +aI22 +aI326 +aI-13 +aI328 +aI3 +aa(lp5156 +g15 +aI330 +aI71 +aI330 +aI41 +aI330 +aI57 +aa(lp5157 +g20 +aI330 +aI163 +aa(lp5158 +g15 +aI340 +aI208 +aI330 +aI182 +aI333 +aI197 +aa(lp5159 +g15 +aI363 +aI234 +aI346 +aI220 +aI354 +aI228 +aa(lp5160 +g15 +aI394 +aI246 +aI372 +aI240 +aI383 +aI244 +aa(lp5161 +g15 +aI425 +aI249 +aI405 +aI248 +aI415 +aI249 +aa(lp5162 +g20 +aI454 +aI249 +aa(lp5163 +g20 +aI454 +aI320 +aa(lp5164 +g20 +aI17 +aI320 +aa(lp5165 +g20 +aI17 +aI249 +aa(lp5166 +g10 +aa(lp5167 +g8 +aI466 +aI-82 +aa(lp5168 +g15 +aI562 +aI-149 +aI511 +aI-82 +aI543 +aI-104 +aa(lp5169 +g15 +aI591 +aI-353 +aI582 +aI-194 +aI591 +aI-262 +aa(lp5170 +g15 +aI562 +aI-556 +aI591 +aI-441 +aI582 +aI-509 +aa(lp5171 +g15 +aI468 +aI-627 +aI543 +aI-604 +aI511 +aI-627 +aa(lp5172 +g15 +aI401 +aI-609 +aI441 +aI-627 +aI419 +aI-621 +aa(lp5173 +g15 +aI359 +aI-557 +aI383 +aI-597 +aI369 +aI-580 +aa(lp5174 +g15 +aI337 +aI-471 +aI348 +aI-533 +aI341 +aI-505 +aa(lp5175 +g15 +aI330 +aI-354 +aI332 +aI-437 +aI330 +aI-398 +aa(lp5176 +g15 +aI337 +aI-234 +aI330 +aI-308 +aI332 +aI-268 +aa(lp5177 +g15 +aI359 +aI-149 +aI341 +aI-200 +aI348 +aI-171 +aa(lp5178 +g15 +aI401 +aI-98 +aI369 +aI-126 +aI383 +aI-109 +aa(lp5179 +g15 +aI466 +aI-82 +aI418 +aI-87 +aI440 +aI-82 +aa(lp5180 +g10 +aa(lp5181 +g8 +aI860 +aI0 +aa(lp5182 +g10 +aa(lp5183 +g8 +aI860 +aI0 +aasVt +(lp5184 +(lp5185 +g8 +aI418 +aI-93 +aa(lp5186 +g15 +aI468 +aI-97 +aI435 +aI-93 +aI452 +aI-95 +aa(lp5187 +g15 +aI513 +aI-106 +aI484 +aI-99 +aI499 +aI-102 +aa(lp5188 +g20 +aI513 +aI-19 +aa(lp5189 +g15 +aI484 +aI-8 +aI506 +aI-16 +aI496 +aI-12 +aa(lp5190 +g15 +aI443 +aI2 +aI472 +aI-4 +aI458 +aI-1 +aa(lp5191 +g15 +aI389 +aI10 +aI427 +aI5 +aI409 +aI8 +aa(lp5192 +g15 +aI324 +aI13 +aI369 +aI12 +aI347 +aI13 +aa(lp5193 +g15 +aI242 +aI2 +aI294 +aI13 +aI267 +aI9 +aa(lp5194 +g15 +aI180 +aI-33 +aI218 +aI-4 +aI197 +aI-16 +aa(lp5195 +g15 +aI141 +aI-98 +aI164 +aI-49 +aI151 +aI-71 +aa(lp5196 +g15 +aI128 +aI-196 +aI132 +aI-124 +aI128 +aI-157 +aa(lp5197 +g20 +aI128 +aI-623 +aa(lp5198 +g20 +aI27 +aI-623 +aa(lp5199 +g20 +aI27 +aI-691 +aa(lp5200 +g15 +aI104 +aI-708 +aI56 +aI-691 +aI82 +aI-697 +aa(lp5201 +g15 +aI158 +aI-747 +aI127 +aI-719 +aI145 +aI-732 +aa(lp5202 +g15 +aI220 +aI-879 +aI186 +aI-776 +aI206 +aI-820 +aa(lp5203 +g20 +aI330 +aI-879 +aa(lp5204 +g20 +aI330 +aI-714 +aa(lp5205 +g20 +aI501 +aI-714 +aa(lp5206 +g20 +aI501 +aI-623 +aa(lp5207 +g20 +aI330 +aI-623 +aa(lp5208 +g20 +aI330 +aI-210 +aa(lp5209 +g15 +aI351 +aI-121 +aI330 +aI-170 +aI337 +aI-140 +aa(lp5210 +g15 +aI418 +aI-93 +aI364 +aI-103 +aI387 +aI-93 +aa(lp5211 +g10 +aa(lp5212 +g8 +aI539 +aI0 +aa(lp5213 +g10 +aa(lp5214 +g8 +aI539 +aI0 +aasVx +(lp5215 +(lp5216 +g8 +aI580 +aI-603 +aa(lp5217 +g15 +aI561 +aI-635 +aI580 +aI-619 +aI573 +aI-630 +aa(lp5218 +g15 +aI511 +aI-643 +aI549 +aI-640 +aI532 +aI-643 +aa(lp5219 +g20 +aI507 +aI-643 +aa(lp5220 +g20 +aI507 +aI-714 +aa(lp5221 +g20 +aI815 +aI-714 +aa(lp5222 +g20 +aI815 +aI-643 +aa(lp5223 +g20 +aI804 +aI-643 +aa(lp5224 +g15 +aI769 +aI-639 +aI791 +aI-643 +aI779 +aI-642 +aa(lp5225 +g15 +aI738 +aI-626 +aI759 +aI-637 +aI748 +aI-633 +aa(lp5226 +g15 +aI707 +aI-600 +aI728 +aI-620 +aI717 +aI-611 +aa(lp5227 +g15 +aI669 +aI-558 +aI696 +aI-589 +aI683 +aI-575 +aa(lp5228 +g20 +aI531 +aI-390 +aa(lp5229 +g20 +aI727 +aI-140 +aa(lp5230 +g15 +aI784 +aI-86 +aI748 +aI-115 +aI767 +aI-97 +aa(lp5231 +g15 +aI834 +aI-70 +aI801 +aI-75 +aI818 +aI-70 +aa(lp5232 +g20 +aI852 +aI-70 +aa(lp5233 +g20 +aI852 +aI0 +aa(lp5234 +g20 +aI427 +aI0 +aa(lp5235 +g20 +aI427 +aI-70 +aa(lp5236 +g20 +aI434 +aI-70 +aa(lp5237 +g15 +aI514 +aI-114 +aI488 +aI-70 +aI514 +aI-85 +aa(lp5238 +g15 +aI513 +aI-129 +aI514 +aI-119 +aI514 +aI-124 +aa(lp5239 +g15 +aI505 +aI-147 +aI511 +aI-134 +aI509 +aI-141 +aa(lp5240 +g15 +aI490 +aI-172 +aI502 +aI-154 +aI497 +aI-163 +aa(lp5241 +g15 +aI464 +aI-205 +aI483 +aI-181 +aI475 +aI-192 +aa(lp5242 +g20 +aI388 +aI-298 +aa(lp5243 +g20 +aI294 +aI-182 +aa(lp5244 +g15 +aI274 +aI-149 +aI286 +aI-171 +aI279 +aI-160 +aa(lp5245 +g15 +aI266 +aI-115 +aI269 +aI-138 +aI266 +aI-126 +aa(lp5246 +g15 +aI285 +aI-81 +aI266 +aI-100 +aI273 +aI-89 +aa(lp5247 +g15 +aI349 +aI-70 +aI298 +aI-74 +aI319 +aI-70 +aa(lp5248 +g20 +aI353 +aI-70 +aa(lp5249 +g20 +aI353 +aI0 +aa(lp5250 +g20 +aI14 +aI0 +aa(lp5251 +g20 +aI14 +aI-70 +aa(lp5252 +g20 +aI26 +aI-70 +aa(lp5253 +g15 +aI69 +aI-74 +aI42 +aI-70 +aI56 +aI-71 +aa(lp5254 +g15 +aI103 +aI-88 +aI81 +aI-77 +aI92 +aI-82 +aa(lp5255 +g15 +aI135 +aI-114 +aI113 +aI-95 +aI124 +aI-103 +aa(lp5256 +g15 +aI171 +aI-155 +aI146 +aI-125 +aI158 +aI-139 +aa(lp5257 +g20 +aI339 +aI-358 +aa(lp5258 +g20 +aI171 +aI-573 +aa(lp5259 +g15 +aI115 +aI-625 +aI153 +aI-596 +aI134 +aI-614 +aa(lp5260 +g15 +aI57 +aI-643 +aI97 +aI-637 +aI77 +aI-643 +aa(lp5261 +g20 +aI39 +aI-643 +aa(lp5262 +g20 +aI39 +aI-714 +aa(lp5263 +g20 +aI458 +aI-714 +aa(lp5264 +g20 +aI458 +aI-643 +aa(lp5265 +g20 +aI454 +aI-643 +aa(lp5266 +g15 +aI416 +aI-640 +aI439 +aI-643 +aI426 +aI-642 +aa(lp5267 +g15 +aI393 +aI-632 +aI407 +aI-638 +aI399 +aI-635 +aa(lp5268 +g15 +aI382 +aI-619 +aI388 +aI-628 +aI384 +aI-624 +aa(lp5269 +g15 +aI378 +aI-605 +aI379 +aI-615 +aI378 +aI-610 +aa(lp5270 +g15 +aI386 +aI-577 +aI378 +aI-595 +aI381 +aI-586 +aa(lp5271 +g15 +aI409 +aI-543 +aI390 +aI-568 +aI398 +aI-557 +aa(lp5272 +g20 +aI483 +aI-452 +aa(lp5273 +g20 +aI546 +aI-528 +aa(lp5274 +g15 +aI571 +aI-567 +aI557 +aI-542 +aI565 +aI-555 +aa(lp5275 +g15 +aI580 +aI-603 +aI577 +aI-579 +aI580 +aI-591 +aa(lp5276 +g10 +aa(lp5277 +g8 +aI861 +aI0 +aa(lp5278 +g10 +aa(lp5279 +g8 +aI861 +aI0 +aasV| +(lp5280 +(lp5281 +g8 +aI419 +aI320 +aa(lp5282 +g20 +aI324 +aI320 +aa(lp5283 +g20 +aI324 +aI-1012 +aa(lp5284 +g20 +aI419 +aI-1012 +aa(lp5285 +g10 +aa(lp5286 +g8 +aI745 +aI0 +aa(lp5287 +g10 +aa(lp5288 +g8 +aI745 +aI0 +aasV# +(lp5289 +(lp5290 +g8 +aI665 +aI-358 +aa(lp5291 +g20 +aI665 +aI-266 +aa(lp5292 +g20 +aI498 +aI-266 +aa(lp5293 +g20 +aI449 +aI0 +aa(lp5294 +g20 +aI354 +aI0 +aa(lp5295 +g20 +aI404 +aI-266 +aa(lp5296 +g20 +aI265 +aI-266 +aa(lp5297 +g20 +aI214 +aI0 +aa(lp5298 +g20 +aI119 +aI0 +aa(lp5299 +g20 +aI170 +aI-266 +aa(lp5300 +g20 +aI37 +aI-266 +aa(lp5301 +g20 +aI37 +aI-358 +aa(lp5302 +g20 +aI188 +aI-358 +aa(lp5303 +g20 +aI234 +aI-599 +aa(lp5304 +g20 +aI80 +aI-599 +aa(lp5305 +g20 +aI80 +aI-692 +aa(lp5306 +g20 +aI251 +aI-692 +aa(lp5307 +g20 +aI298 +aI-951 +aa(lp5308 +g20 +aI394 +aI-951 +aa(lp5309 +g20 +aI346 +aI-692 +aa(lp5310 +g20 +aI485 +aI-692 +aa(lp5311 +g20 +aI534 +aI-951 +aa(lp5312 +g20 +aI629 +aI-951 +aa(lp5313 +g20 +aI580 +aI-692 +aa(lp5314 +g20 +aI707 +aI-692 +aa(lp5315 +g20 +aI707 +aI-599 +aa(lp5316 +g20 +aI562 +aI-599 +aa(lp5317 +g20 +aI517 +aI-358 +aa(lp5318 +g10 +aa(lp5319 +g8 +aI282 +aI-358 +aa(lp5320 +g20 +aI422 +aI-358 +aa(lp5321 +g20 +aI469 +aI-599 +aa(lp5322 +g20 +aI329 +aI-599 +aa(lp5323 +g10 +aa(lp5324 +g8 +aI745 +aI0 +aa(lp5325 +g10 +aa(lp5326 +g8 +aI745 +aI0 +aasV' +(lp5327 +(lp5328 +g8 +aI89 +aI-951 +aa(lp5329 +g20 +aI297 +aI-951 +aa(lp5330 +g20 +aI237 +aI-584 +aa(lp5331 +g20 +aI149 +aI-584 +aa(lp5332 +g10 +aa(lp5333 +g8 +aI386 +aI0 +aa(lp5334 +g10 +aa(lp5335 +g8 +aI386 +aI0 +aasV+ +(lp5336 +(lp5337 +g8 +aI419 +aI-428 +aa(lp5338 +g20 +aI419 +aI-190 +aa(lp5339 +g20 +aI324 +aI-190 +aa(lp5340 +g20 +aI324 +aI-428 +aa(lp5341 +g20 +aI86 +aI-428 +aa(lp5342 +g20 +aI86 +aI-523 +aa(lp5343 +g20 +aI324 +aI-523 +aa(lp5344 +g20 +aI324 +aI-761 +aa(lp5345 +g20 +aI419 +aI-761 +aa(lp5346 +g20 +aI419 +aI-523 +aa(lp5347 +g20 +aI658 +aI-523 +aa(lp5348 +g20 +aI658 +aI-428 +aa(lp5349 +g10 +aa(lp5350 +g8 +aI745 +aI0 +aa(lp5351 +g10 +aa(lp5352 +g8 +aI745 +aI0 +aasV/ +(lp5353 +(lp5354 +g8 +aI95 +aI163 +aa(lp5355 +g20 +aI0 +aI161 +aa(lp5356 +g20 +aI290 +aI-1012 +aa(lp5357 +g20 +aI384 +aI-1012 +aa(lp5358 +g10 +aa(lp5359 +g8 +aI384 +aI0 +aa(lp5360 +g10 +aa(lp5361 +g8 +aI384 +aI0 +aasV3 +(lp5362 +(lp5363 +g8 +aI324 +aI13 +aa(lp5364 +g15 +aI194 +aI0 +aI273 +aI13 +aI230 +aI9 +aa(lp5365 +g15 +aI105 +aI-34 +aI158 +aI-8 +aI128 +aI-19 +aa(lp5366 +g15 +aI53 +aI-85 +aI81 +aI-49 +aI64 +aI-66 +aa(lp5367 +g15 +aI37 +aI-146 +aI42 +aI-105 +aI37 +aI-125 +aa(lp5368 +g15 +aI46 +aI-190 +aI37 +aI-162 +aI40 +aI-177 +aa(lp5369 +g15 +aI70 +aI-223 +aI52 +aI-203 +aI60 +aI-214 +aa(lp5370 +g15 +aI107 +aI-243 +aI81 +aI-232 +aI93 +aI-239 +aa(lp5371 +g15 +aI150 +aI-250 +aI120 +aI-248 +aI135 +aI-250 +aa(lp5372 +g15 +aI162 +aI-175 +aI150 +aI-221 +aI154 +aI-197 +aa(lp5373 +g15 +aI195 +aI-122 +aI170 +aI-154 +aI181 +aI-136 +aa(lp5374 +g15 +aI247 +aI-90 +aI210 +aI-108 +aI227 +aI-97 +aa(lp5375 +g15 +aI314 +aI-79 +aI267 +aI-83 +aI290 +aI-79 +aa(lp5376 +g15 +aI376 +aI-88 +aI336 +aI-79 +aI356 +aI-82 +aa(lp5377 +g15 +aI429 +aI-119 +aI396 +aI-94 +aI413 +aI-105 +aa(lp5378 +g15 +aI465 +aI-180 +aI444 +aI-134 +aI456 +aI-154 +aa(lp5379 +g15 +aI478 +aI-275 +aI474 +aI-205 +aI478 +aI-237 +aa(lp5380 +g15 +aI465 +aI-345 +aI478 +aI-301 +aI474 +aI-324 +aa(lp5381 +g15 +aI425 +aI-400 +aI456 +aI-367 +aI443 +aI-385 +aa(lp5382 +g15 +aI360 +aI-437 +aI407 +aI-416 +aI386 +aI-428 +aa(lp5383 +g15 +aI272 +aI-450 +aI335 +aI-445 +aI305 +aI-450 +aa(lp5384 +g20 +aI189 +aI-450 +aa(lp5385 +g20 +aI189 +aI-532 +aa(lp5386 +g20 +aI277 +aI-532 +aa(lp5387 +g15 +aI352 +aI-546 +aI305 +aI-532 +aI330 +aI-537 +aa(lp5388 +g15 +aI404 +aI-586 +aI373 +aI-556 +aI391 +aI-569 +aa(lp5389 +g15 +aI436 +aI-648 +aI418 +aI-604 +aI429 +aI-624 +aa(lp5390 +g15 +aI446 +aI-728 +aI443 +aI-673 +aI446 +aI-699 +aa(lp5391 +g15 +aI418 +aI-842 +aI446 +aI-777 +aI437 +aI-815 +aa(lp5392 +g15 +aI335 +aI-883 +aI399 +aI-869 +aI372 +aI-883 +aa(lp5393 +g15 +aI277 +aI-866 +aI312 +aI-883 +aI292 +aI-877 +aa(lp5394 +g15 +aI242 +aI-819 +aI262 +aI-854 +aI251 +aI-838 +aa(lp5395 +g15 +aI225 +aI-752 +aI234 +aI-799 +aI228 +aI-777 +aa(lp5396 +g15 +aI221 +aI-676 +aI222 +aI-728 +aI221 +aI-702 +aa(lp5397 +g15 +aI93 +aI-705 +aI165 +aI-676 +aI123 +aI-686 +aa(lp5398 +g15 +aI48 +aI-795 +aI63 +aI-724 +aI48 +aI-754 +aa(lp5399 +g15 +aI66 +aI-861 +aI48 +aI-819 +aI54 +aI-841 +aa(lp5400 +g15 +aI122 +aI-915 +aI79 +aI-882 +aI97 +aI-900 +aa(lp5401 +g15 +aI214 +aI-952 +aI147 +aI-931 +aI177 +aI-943 +aa(lp5402 +g15 +aI342 +aI-965 +aI251 +aI-960 +aI293 +aI-965 +aa(lp5403 +g15 +aI470 +aI-950 +aI389 +aI-965 +aI432 +aI-960 +aa(lp5404 +g15 +aI567 +aI-908 +aI508 +aI-941 +aI540 +aI-927 +aa(lp5405 +g15 +aI628 +aI-840 +aI594 +aI-889 +aI614 +aI-866 +aa(lp5406 +g15 +aI650 +aI-747 +aI643 +aI-813 +aI650 +aI-782 +aa(lp5407 +g15 +aI634 +aI-664 +aI650 +aI-717 +aI645 +aI-690 +aa(lp5408 +g15 +aI591 +aI-597 +aI624 +aI-639 +aI610 +aI-617 +aa(lp5409 +g15 +aI527 +aI-544 +aI573 +aI-577 +aI552 +aI-559 +aa(lp5410 +g15 +aI446 +aI-507 +aI502 +aI-529 +aI475 +aI-517 +aa(lp5411 +g15 +aI528 +aI-484 +aI473 +aI-502 +aI500 +aI-494 +aa(lp5412 +g15 +aI605 +aI-440 +aI556 +aI-473 +aI582 +aI-459 +aa(lp5413 +g15 +aI662 +aI-372 +aI628 +aI-422 +aI647 +aI-399 +aa(lp5414 +g15 +aI684 +aI-274 +aI676 +aI-345 +aI684 +aI-312 +aa(lp5415 +g15 +aI653 +aI-137 +aI684 +aI-220 +aI674 +aI-174 +aa(lp5416 +g15 +aI573 +aI-48 +aI633 +aI-100 +aI606 +aI-71 +aa(lp5417 +g15 +aI458 +aI0 +aI539 +aI-26 +aI501 +aI-10 +aa(lp5418 +g15 +aI324 +aI13 +aI414 +aI8 +aI370 +aI13 +aa(lp5419 +g10 +aa(lp5420 +g8 +aI745 +aI0 +aa(lp5421 +g10 +aa(lp5422 +g8 +aI745 +aI0 +aasV7 +(lp5423 +(lp5424 +g8 +aI220 +aI0 +aa(lp5425 +g20 +aI574 +aI-806 +aa(lp5426 +g20 +aI223 +aI-806 +aa(lp5427 +g15 +aI168 +aI-788 +aI199 +aI-806 +aI181 +aI-800 +aa(lp5428 +g15 +aI146 +aI-738 +aI156 +aI-777 +aI149 +aI-760 +aa(lp5429 +g20 +aI138 +aI-671 +aa(lp5430 +g20 +aI58 +aI-671 +aa(lp5431 +g20 +aI65 +aI-951 +aa(lp5432 +g20 +aI701 +aI-951 +aa(lp5433 +g20 +aI701 +aI-886 +aa(lp5434 +g20 +aI333 +aI0 +aa(lp5435 +g10 +aa(lp5436 +g8 +aI745 +aI0 +aa(lp5437 +g10 +aa(lp5438 +g8 +aI745 +aI0 +aasV; +(lp5439 +(lp5440 +g8 +aI298 +aI-55 +aa(lp5441 +g15 +aI285 +aI26 +aI298 +aI-27 +aI294 +aI0 +aa(lp5442 +g15 +aI244 +aI100 +aI277 +aI52 +aI263 +aI77 +aa(lp5443 +g15 +aI170 +aI160 +aI225 +aI122 +aI200 +aI142 +aa(lp5444 +g15 +aI59 +aI205 +aI140 +aI178 +aI103 +aI193 +aa(lp5445 +g20 +aI59 +aI136 +aa(lp5446 +g15 +aI111 +aI115 +aI79 +aI129 +aI96 +aI122 +aa(lp5447 +g15 +aI147 +aI93 +aI125 +aI108 +aI137 +aI101 +aa(lp5448 +g15 +aI169 +aI66 +aI157 +aI85 +aI164 +aI76 +aa(lp5449 +g15 +aI177 +aI32 +aI174 +aI56 +aI177 +aI45 +aa(lp5450 +g15 +aI169 +aI11 +aI177 +aI24 +aI174 +aI17 +aa(lp5451 +g15 +aI152 +aI-3 +aI165 +aI6 +aI159 +aI1 +aa(lp5452 +g15 +aI128 +aI-18 +aI144 +aI-8 +aI137 +aI-13 +aa(lp5453 +g15 +aI105 +aI-37 +aI120 +aI-23 +aI112 +aI-29 +aa(lp5454 +g15 +aI87 +aI-66 +aI97 +aI-45 +aI92 +aI-54 +aa(lp5455 +g15 +aI80 +aI-110 +aI82 +aI-77 +aI80 +aI-92 +aa(lp5456 +g15 +aI107 +aI-178 +aI80 +aI-140 +aI89 +aI-162 +aa(lp5457 +g15 +aI175 +aI-202 +aI125 +aI-194 +aI148 +aI-202 +aa(lp5458 +g15 +aI265 +aI-162 +aI213 +aI-202 +aI243 +aI-189 +aa(lp5459 +g15 +aI298 +aI-55 +aI287 +aI-136 +aI298 +aI-101 +aa(lp5460 +g10 +aa(lp5461 +g8 +aI93 +aI-619 +aa(lp5462 +g15 +aI101 +aI-670 +aI93 +aI-639 +aI95 +aI-656 +aa(lp5463 +g15 +aI124 +aI-703 +aI107 +aI-684 +aI114 +aI-695 +aa(lp5464 +g15 +aI159 +aI-720 +aI134 +aI-711 +aI146 +aI-717 +aa(lp5465 +g15 +aI202 +aI-726 +aI172 +aI-724 +aI187 +aI-726 +aa(lp5466 +g15 +aI244 +aI-720 +aI217 +aI-726 +aI231 +aI-724 +aa(lp5467 +g15 +aI279 +aI-703 +aI257 +aI-717 +aI269 +aI-711 +aa(lp5468 +g15 +aI303 +aI-670 +aI289 +aI-695 +aI297 +aI-684 +aa(lp5469 +g15 +aI311 +aI-619 +aI308 +aI-656 +aI311 +aI-639 +aa(lp5470 +g15 +aI303 +aI-568 +aI311 +aI-599 +aI308 +aI-582 +aa(lp5471 +g15 +aI279 +aI-536 +aI297 +aI-555 +aI289 +aI-544 +aa(lp5472 +g15 +aI244 +aI-518 +aI269 +aI-527 +aI257 +aI-521 +aa(lp5473 +g15 +aI202 +aI-512 +aI231 +aI-514 +aI217 +aI-512 +aa(lp5474 +g15 +aI159 +aI-518 +aI187 +aI-512 +aI172 +aI-514 +aa(lp5475 +g15 +aI124 +aI-536 +aI146 +aI-521 +aI134 +aI-527 +aa(lp5476 +g15 +aI101 +aI-568 +aI114 +aI-544 +aI107 +aI-555 +aa(lp5477 +g15 +aI93 +aI-619 +aI95 +aI-582 +aI93 +aI-599 +aa(lp5478 +g10 +aa(lp5479 +g8 +aI391 +aI0 +aa(lp5480 +g10 +aa(lp5481 +g8 +aI391 +aI0 +aasV? +(lp5482 +(lp5483 +g8 +aI660 +aI-719 +aa(lp5484 +g15 +aI643 +aI-623 +aI660 +aI-684 +aI654 +aI-652 +aa(lp5485 +g15 +aI593 +aI-546 +aI632 +aI-595 +aI615 +aI-569 +aa(lp5486 +g15 +aI510 +aI-481 +aI571 +aI-522 +aI543 +aI-501 +aa(lp5487 +g15 +aI394 +aI-424 +aI477 +aI-461 +aI438 +aI-442 +aa(lp5488 +g20 +aI367 +aI-303 +aa(lp5489 +g20 +aI286 +aI-303 +aa(lp5490 +g20 +aI259 +aI-467 +aa(lp5491 +g15 +aI353 +aI-521 +aI297 +aI-482 +aI329 +aI-500 +aa(lp5492 +g15 +aI411 +aI-587 +aI377 +aI-541 +aI397 +aI-564 +aa(lp5493 +g15 +aI440 +aI-662 +aI425 +aI-611 +aI434 +aI-636 +aa(lp5494 +g15 +aI447 +aI-741 +aI445 +aI-688 +aI447 +aI-714 +aa(lp5495 +g15 +aI442 +aI-799 +aI447 +aI-762 +aI445 +aI-781 +aa(lp5496 +g15 +aI423 +aI-844 +aI438 +aI-816 +aI431 +aI-832 +aa(lp5497 +g15 +aI390 +aI-874 +aI415 +aI-857 +aI404 +aI-867 +aa(lp5498 +g15 +aI343 +aI-884 +aI377 +aI-881 +aI361 +aI-884 +aa(lp5499 +g15 +aI293 +aI-871 +aI323 +aI-884 +aI307 +aI-880 +aa(lp5500 +g15 +aI261 +aI-834 +aI280 +aI-862 +aI269 +aI-850 +aa(lp5501 +g15 +aI243 +aI-781 +aI252 +aI-819 +aI246 +aI-801 +aa(lp5502 +g15 +aI237 +aI-716 +aI239 +aI-761 +aI237 +aI-739 +aa(lp5503 +g15 +aI162 +aI-722 +aI210 +aI-716 +aI185 +aI-718 +aa(lp5504 +g15 +aI102 +aI-740 +aI139 +aI-726 +aI119 +aI-732 +aa(lp5505 +g15 +aI63 +aI-769 +aI85 +aI-747 +aI72 +aI-757 +aa(lp5506 +g15 +aI49 +aI-810 +aI54 +aI-780 +aI49 +aI-794 +aa(lp5507 +g15 +aI66 +aI-870 +aI49 +aI-831 +aI55 +aI-852 +aa(lp5508 +g15 +aI118 +aI-920 +aI77 +aI-889 +aI94 +aI-906 +aa(lp5509 +g15 +aI206 +aI-952 +aI141 +aI-934 +aI170 +aI-944 +aa(lp5510 +g15 +aI333 +aI-965 +aI241 +aI-961 +aI284 +aI-965 +aa(lp5511 +g15 +aI463 +aI-948 +aI380 +aI-965 +aI423 +aI-959 +aa(lp5512 +g15 +aI567 +aI-900 +aI503 +aI-937 +aI537 +aI-921 +aa(lp5513 +g15 +aI635 +aI-823 +aI596 +aI-879 +aI618 +aI-853 +aa(lp5514 +g15 +aI660 +aI-719 +aI651 +aI-792 +aI660 +aI-758 +aa(lp5515 +g10 +aa(lp5516 +g8 +aI216 +aI-95 +aa(lp5517 +g15 +aI224 +aI-146 +aI216 +aI-115 +aI218 +aI-132 +aa(lp5518 +g15 +aI247 +aI-179 +aI230 +aI-160 +aI237 +aI-170 +aa(lp5519 +g15 +aI282 +aI-196 +aI257 +aI-187 +aI269 +aI-193 +aa(lp5520 +g15 +aI325 +aI-202 +aI296 +aI-200 +aI310 +aI-202 +aa(lp5521 +g15 +aI367 +aI-196 +aI340 +aI-202 +aI354 +aI-200 +aa(lp5522 +g15 +aI402 +aI-179 +aI380 +aI-193 +aI392 +aI-187 +aa(lp5523 +g15 +aI426 +aI-146 +aI412 +aI-170 +aI420 +aI-160 +aa(lp5524 +g15 +aI434 +aI-95 +aI431 +aI-132 +aI434 +aI-115 +aa(lp5525 +g15 +aI426 +aI-45 +aI434 +aI-75 +aI431 +aI-58 +aa(lp5526 +g15 +aI402 +aI-12 +aI420 +aI-31 +aI412 +aI-20 +aa(lp5527 +g15 +aI367 +aI5 +aI392 +aI-4 +aI380 +aI1 +aa(lp5528 +g15 +aI325 +aI10 +aI354 +aI9 +aI340 +aI10 +aa(lp5529 +g15 +aI282 +aI5 +aI310 +aI10 +aI296 +aI9 +aa(lp5530 +g15 +aI247 +aI-12 +aI269 +aI1 +aI257 +aI-4 +aa(lp5531 +g15 +aI224 +aI-45 +aI237 +aI-20 +aI230 +aI-31 +aa(lp5532 +g15 +aI216 +aI-95 +aI218 +aI-58 +aI216 +aI-75 +aa(lp5533 +g10 +aa(lp5534 +g8 +aI733 +aI0 +aa(lp5535 +g10 +aa(lp5536 +g8 +aI733 +aI0 +aasVC +(lp5537 +(lp5538 +g8 +aI566 +aI-92 +aa(lp5539 +g15 +aI653 +aI-104 +aI598 +aI-92 +aI627 +aI-96 +aa(lp5540 +g15 +aI721 +aI-133 +aI678 +aI-111 +aI701 +aI-121 +aa(lp5541 +g15 +aI773 +aI-174 +aI741 +aI-145 +aI758 +aI-159 +aa(lp5542 +g15 +aI813 +aI-219 +aI788 +aI-189 +aI801 +aI-204 +aa(lp5543 +g15 +aI829 +aI-195 +aI820 +aI-214 +aI825 +aI-206 +aa(lp5544 +g15 +aI835 +aI-162 +aI833 +aI-184 +aI835 +aI-173 +aa(lp5545 +g15 +aI820 +aI-103 +aI835 +aI-143 +aI830 +aI-124 +aa(lp5546 +g15 +aI770 +aI-46 +aI810 +aI-82 +aI794 +aI-63 +aa(lp5547 +g15 +aI677 +aI-3 +aI747 +aI-29 +aI716 +aI-14 +aa(lp5548 +g15 +aI534 +aI13 +aI639 +aI7 +aI591 +aI13 +aa(lp5549 +g15 +aI332 +aI-21 +aI457 +aI13 +aI389 +aI1 +aa(lp5550 +g15 +aI188 +aI-121 +aI274 +aI-45 +aI226 +aI-78 +aa(lp5551 +g15 +aI102 +aI-276 +aI149 +aI-164 +aI121 +aI-215 +aa(lp5552 +g15 +aI73 +aI-476 +aI83 +aI-336 +aI73 +aI-403 +aa(lp5553 +g15 +aI102 +aI-674 +aI73 +aI-548 +aI83 +aI-614 +aa(lp5554 +g15 +aI189 +aI-828 +aI122 +aI-734 +aI151 +aI-786 +aa(lp5555 +g15 +aI333 +aI-929 +aI228 +aI-871 +aI276 +aI-905 +aa(lp5556 +g15 +aI533 +aI-965 +aI391 +aI-953 +aI457 +aI-965 +aa(lp5557 +g15 +aI666 +aI-952 +aI584 +aI-965 +aI629 +aI-961 +aa(lp5558 +g15 +aI761 +aI-920 +aI704 +aI-944 +aI736 +aI-934 +aa(lp5559 +g15 +aI818 +aI-870 +aI786 +aI-906 +aI805 +aI-889 +aa(lp5560 +g15 +aI837 +aI-810 +aI830 +aI-852 +aI837 +aI-831 +aa(lp5561 +g15 +aI826 +aI-764 +aI837 +aI-793 +aI833 +aI-778 +aa(lp5562 +g15 +aI794 +aI-727 +aI819 +aI-750 +aI808 +aI-737 +aa(lp5563 +g15 +aI742 +aI-702 +aI780 +aI-716 +aI763 +aI-708 +aa(lp5564 +g15 +aI670 +aI-694 +aI721 +aI-697 +aI697 +aI-694 +aa(lp5565 +g15 +aI663 +aI-760 +aI670 +aI-716 +aI668 +aI-738 +aa(lp5566 +g15 +aI638 +aI-819 +aI658 +aI-782 +aI650 +aI-802 +aa(lp5567 +g15 +aI593 +aI-863 +aI627 +aI-837 +aI612 +aI-852 +aa(lp5568 +g15 +aI524 +aI-879 +aI575 +aI-874 +aI551 +aI-879 +aa(lp5569 +g15 +aI417 +aI-853 +aI481 +aI-879 +aI446 +aI-870 +aa(lp5570 +g15 +aI347 +aI-774 +aI388 +aI-835 +aI364 +aI-809 +aa(lp5571 +g15 +aI309 +aI-648 +aI329 +aI-740 +aI317 +aI-698 +aa(lp5572 +g15 +aI297 +aI-476 +aI301 +aI-598 +aI297 +aI-540 +aa(lp5573 +g15 +aI311 +aI-308 +aI297 +aI-412 +aI302 +aI-356 +aa(lp5574 +g15 +aI358 +aI-188 +aI321 +aI-259 +aI336 +aI-219 +aa(lp5575 +g15 +aI441 +aI-116 +aI379 +aI-156 +aI407 +aI-132 +aa(lp5576 +g15 +aI566 +aI-92 +aI475 +aI-100 +aI516 +aI-92 +aa(lp5577 +g10 +aa(lp5578 +g8 +aI890 +aI0 +aa(lp5579 +g10 +aa(lp5580 +g8 +aI890 +aI0 +aasVG +(lp5581 +(lp5582 +g8 +aI563 +aI13 +aa(lp5583 +g15 +aI347 +aI-21 +aI481 +aI13 +aI409 +aI1 +aa(lp5584 +g15 +aI194 +aI-121 +aI286 +aI-45 +aI235 +aI-78 +aa(lp5585 +g15 +aI103 +aI-276 +aI153 +aI-164 +aI123 +aI-215 +aa(lp5586 +g15 +aI73 +aI-476 +aI83 +aI-336 +aI73 +aI-403 +aa(lp5587 +g15 +aI105 +aI-674 +aI73 +aI-548 +aI84 +aI-614 +aa(lp5588 +g15 +aI199 +aI-828 +aI126 +aI-734 +aI158 +aI-786 +aa(lp5589 +g15 +aI355 +aI-929 +aI241 +aI-871 +aI293 +aI-905 +aa(lp5590 +g15 +aI570 +aI-965 +aI417 +aI-953 +aI489 +aI-965 +aa(lp5591 +g15 +aI716 +aI-952 +aI626 +aI-965 +aI675 +aI-961 +aa(lp5592 +g15 +aI820 +aI-920 +aI757 +aI-944 +aI792 +aI-934 +aa(lp5593 +g15 +aI883 +aI-870 +aI848 +aI-906 +aI869 +aI-889 +aa(lp5594 +g15 +aI904 +aI-810 +aI897 +aI-852 +aI904 +aI-831 +aa(lp5595 +g15 +aI893 +aI-766 +aI904 +aI-794 +aI900 +aI-779 +aa(lp5596 +g15 +aI860 +aI-730 +aI885 +aI-752 +aI874 +aI-740 +aa(lp5597 +g15 +aI805 +aI-705 +aI845 +aI-719 +aI827 +aI-711 +aa(lp5598 +g15 +aI731 +aI-696 +aI784 +aI-699 +aI759 +aI-696 +aa(lp5599 +g15 +aI722 +aI-771 +aI731 +aI-723 +aI728 +aI-748 +aa(lp5600 +g15 +aI691 +aI-828 +aI715 +aI-793 +aI705 +aI-812 +aa(lp5601 +g15 +aI639 +aI-866 +aI678 +aI-845 +aI660 +aI-857 +aa(lp5602 +g15 +aI566 +aI-879 +aI619 +aI-875 +aI594 +aI-879 +aa(lp5603 +g15 +aI442 +aI-853 +aI517 +aI-879 +aI476 +aI-870 +aa(lp5604 +g15 +aI359 +aI-774 +aI408 +aI-835 +aI380 +aI-809 +aa(lp5605 +g15 +aI312 +aI-648 +aI337 +aI-740 +aI321 +aI-698 +aa(lp5606 +g15 +aI297 +aI-476 +aI302 +aI-598 +aI297 +aI-540 +aa(lp5607 +g15 +aI312 +aI-305 +aI297 +aI-412 +aI302 +aI-355 +aa(lp5608 +g15 +aI362 +aI-180 +aI323 +aI-256 +aI339 +aI-214 +aa(lp5609 +g15 +aI450 +aI-103 +aI385 +aI-146 +aI414 +aI-120 +aa(lp5610 +g15 +aI583 +aI-77 +aI487 +aI-85 +aI531 +aI-77 +aa(lp5611 +g15 +aI633 +aI-78 +aI600 +aI-77 +aI616 +aI-77 +aa(lp5612 +g15 +aI681 +aI-86 +aI649 +aI-80 +aI666 +aI-82 +aa(lp5613 +g20 +aI681 +aI-282 +aa(lp5614 +g15 +aI657 +aI-356 +aI681 +aI-317 +aI673 +aI-342 +aa(lp5615 +g15 +aI586 +aI-377 +aI641 +aI-370 +aI617 +aI-377 +aa(lp5616 +g20 +aI569 +aI-377 +aa(lp5617 +g20 +aI569 +aI-447 +aa(lp5618 +g20 +aI988 +aI-447 +aa(lp5619 +g20 +aI988 +aI-377 +aa(lp5620 +g20 +aI970 +aI-377 +aa(lp5621 +g15 +aI935 +aI-372 +aI957 +aI-377 +aI945 +aI-375 +aa(lp5622 +g15 +aI910 +aI-355 +aI925 +aI-369 +aI917 +aI-363 +aa(lp5623 +g15 +aI896 +aI-324 +aI904 +aI-347 +aI899 +aI-337 +aa(lp5624 +g15 +aI891 +aI-276 +aI893 +aI-311 +aI891 +aI-295 +aa(lp5625 +g20 +aI891 +aI-58 +aa(lp5626 +g15 +aI734 +aI-4 +aI839 +aI-34 +aI787 +aI-16 +aa(lp5627 +g15 +aI563 +aI13 +aI681 +aI7 +aI624 +aI13 +aa(lp5628 +g10 +aa(lp5629 +g8 +aI1025 +aI0 +aa(lp5630 +g10 +aa(lp5631 +g8 +aI1025 +aI0 +aasVK +(lp5632 +(lp5633 +g8 +aI578 +aI-709 +aa(lp5634 +g15 +aI614 +aI-750 +aI593 +aI-724 +aI605 +aI-738 +aa(lp5635 +g15 +aI638 +aI-785 +aI624 +aI-762 +aI632 +aI-774 +aa(lp5636 +g15 +aI651 +aI-815 +aI644 +aI-795 +aI648 +aI-805 +aa(lp5637 +g15 +aI654 +aI-843 +aI653 +aI-824 +aI654 +aI-834 +aa(lp5638 +g15 +aI638 +aI-873 +aI654 +aI-858 +aI649 +aI-868 +aa(lp5639 +g15 +aI580 +aI-882 +aI626 +aI-879 +aI607 +aI-882 +aa(lp5640 +g20 +aI580 +aI-951 +aa(lp5641 +g20 +aI941 +aI-951 +aa(lp5642 +g20 +aI941 +aI-882 +aa(lp5643 +g15 +aI889 +aI-873 +aI923 +aI-882 +aI905 +aI-879 +aa(lp5644 +g15 +aI841 +aI-849 +aI873 +aI-868 +aI857 +aI-860 +aa(lp5645 +g15 +aI795 +aI-812 +aI826 +aI-839 +aI810 +aI-827 +aa(lp5646 +g15 +aI749 +aI-765 +aI780 +aI-798 +aI764 +aI-782 +aa(lp5647 +g20 +aI573 +aI-571 +aa(lp5648 +g20 +aI821 +aI-177 +aa(lp5649 +g15 +aI859 +aI-126 +aI834 +aI-157 +aI847 +aI-139 +aa(lp5650 +g15 +aI895 +aI-93 +aI870 +aI-112 +aI883 +aI-101 +aa(lp5651 +g15 +aI932 +aI-75 +aI907 +aI-85 +aI919 +aI-79 +aa(lp5652 +g15 +aI973 +aI-70 +aI944 +aI-72 +aI958 +aI-70 +aa(lp5653 +g20 +aI978 +aI-70 +aa(lp5654 +g20 +aI978 +aI0 +aa(lp5655 +g20 +aI906 +aI0 +aa(lp5656 +g15 +aI817 +aI-2 +aI873 +aI0 +aI843 +aI0 +aa(lp5657 +g15 +aI750 +aI-12 +aI792 +aI-4 +aI769 +aI-8 +aa(lp5658 +g15 +aI700 +aI-29 +aI731 +aI-16 +aI714 +aI-22 +aa(lp5659 +g15 +aI664 +aI-52 +aI686 +aI-35 +aI674 +aI-43 +aa(lp5660 +g15 +aI635 +aI-83 +aI653 +aI-62 +aI644 +aI-72 +aa(lp5661 +g15 +aI610 +aI-121 +aI627 +aI-95 +aI618 +aI-108 +aa(lp5662 +g20 +aI430 +aI-428 +aa(lp5663 +g20 +aI371 +aI-382 +aa(lp5664 +g20 +aI371 +aI-157 +aa(lp5665 +g15 +aI377 +aI-111 +aI371 +aI-138 +aI373 +aI-122 +aa(lp5666 +g15 +aI391 +aI-85 +aI380 +aI-100 +aI385 +aI-91 +aa(lp5667 +g15 +aI414 +aI-73 +aI398 +aI-79 +aI405 +aI-75 +aa(lp5668 +g15 +aI441 +aI-70 +aI422 +aI-71 +aI431 +aI-70 +aa(lp5669 +g20 +aI497 +aI-70 +aa(lp5670 +g20 +aI497 +aI0 +aa(lp5671 +g20 +aI37 +aI0 +aa(lp5672 +g20 +aI37 +aI-70 +aa(lp5673 +g20 +aI93 +aI-70 +aa(lp5674 +g15 +aI119 +aI-73 +aI102 +aI-70 +aI111 +aI-71 +aa(lp5675 +g15 +aI141 +aI-83 +aI128 +aI-74 +aI135 +aI-78 +aa(lp5676 +g15 +aI156 +aI-107 +aI147 +aI-89 +aI152 +aI-97 +aa(lp5677 +g15 +aI161 +aI-149 +aI159 +aI-118 +aI161 +aI-132 +aa(lp5678 +g20 +aI161 +aI-799 +aa(lp5679 +g15 +aI156 +aI-842 +aI161 +aI-817 +aI159 +aI-831 +aa(lp5680 +g15 +aI141 +aI-866 +aI152 +aI-852 +aI147 +aI-861 +aa(lp5681 +g15 +aI119 +aI-878 +aI135 +aI-872 +aI128 +aI-876 +aa(lp5682 +g15 +aI93 +aI-881 +aI111 +aI-880 +aI102 +aI-881 +aa(lp5683 +g20 +aI37 +aI-881 +aa(lp5684 +g20 +aI37 +aI-951 +aa(lp5685 +g20 +aI497 +aI-951 +aa(lp5686 +g20 +aI497 +aI-881 +aa(lp5687 +g20 +aI441 +aI-881 +aa(lp5688 +g15 +aI414 +aI-878 +aI431 +aI-881 +aI422 +aI-880 +aa(lp5689 +g15 +aI391 +aI-866 +aI405 +aI-876 +aI398 +aI-872 +aa(lp5690 +g15 +aI377 +aI-840 +aI385 +aI-860 +aI380 +aI-851 +aa(lp5691 +g15 +aI371 +aI-794 +aI373 +aI-828 +aI371 +aI-813 +aa(lp5692 +g20 +aI371 +aI-483 +aa(lp5693 +g10 +aa(lp5694 +g8 +aI978 +aI0 +aa(lp5695 +g10 +aa(lp5696 +g8 +aI978 +aI0 +aasVO +(lp5697 +(lp5698 +g8 +aI975 +aI-476 +aa(lp5699 +g15 +aI946 +aI-276 +aI975 +aI-403 +aI966 +aI-336 +aa(lp5700 +g15 +aI859 +aI-121 +aI926 +aI-215 +aI897 +aI-164 +aa(lp5701 +g15 +aI717 +aI-21 +aI820 +aI-78 +aI773 +aI-45 +aa(lp5702 +g15 +aI525 +aI13 +aI662 +aI1 +aI597 +aI13 +aa(lp5703 +g15 +aI326 +aI-21 +aI449 +aI13 +aI383 +aI1 +aa(lp5704 +g15 +aI185 +aI-121 +aI269 +aI-45 +aI222 +aI-78 +aa(lp5705 +g15 +aI101 +aI-276 +aI148 +aI-164 +aI120 +aI-216 +aa(lp5706 +g15 +aI73 +aI-478 +aI82 +aI-337 +aI73 +aI-404 +aa(lp5707 +g15 +aI101 +aI-678 +aI73 +aI-551 +aI82 +aI-618 +aa(lp5708 +g15 +aI185 +aI-832 +aI120 +aI-739 +aI148 +aI-790 +aa(lp5709 +g15 +aI327 +aI-931 +aI223 +aI-875 +aI270 +aI-908 +aa(lp5710 +g15 +aI526 +aI-966 +aI383 +aI-954 +aI450 +aI-966 +aa(lp5711 +g15 +aI718 +aI-931 +aI598 +aI-966 +aI662 +aI-954 +aa(lp5712 +g15 +aI859 +aI-832 +aI774 +aI-908 +aI821 +aI-875 +aa(lp5713 +g15 +aI946 +aI-678 +aI897 +aI-789 +aI926 +aI-738 +aa(lp5714 +g15 +aI975 +aI-476 +aI966 +aI-618 +aI975 +aI-550 +aa(lp5715 +g10 +aa(lp5716 +g8 +aI297 +aI-476 +aa(lp5717 +g15 +aI309 +aI-306 +aI297 +aI-412 +aI301 +aI-356 +aa(lp5718 +g15 +aI349 +aI-179 +aI318 +aI-256 +aI331 +aI-214 +aa(lp5719 +g15 +aI420 +aI-100 +aI367 +aI-145 +aI391 +aI-118 +aa(lp5720 +g15 +aI525 +aI-73 +aI449 +aI-82 +aI484 +aI-73 +aa(lp5721 +g15 +aI631 +aI-100 +aI567 +aI-73 +aI602 +aI-82 +aa(lp5722 +g15 +aI701 +aI-179 +aI660 +aI-118 +aI683 +aI-145 +aa(lp5723 +g15 +aI739 +aI-306 +aI718 +aI-214 +aI731 +aI-256 +aa(lp5724 +g15 +aI751 +aI-476 +aI747 +aI-356 +aI751 +aI-412 +aa(lp5725 +g15 +aI739 +aI-647 +aI751 +aI-540 +aI747 +aI-597 +aa(lp5726 +g15 +aI701 +aI-773 +aI731 +aI-697 +aI718 +aI-739 +aa(lp5727 +g15 +aI631 +aI-852 +aI683 +aI-808 +aI660 +aI-834 +aa(lp5728 +g15 +aI526 +aI-879 +aI602 +aI-870 +aI567 +aI-879 +aa(lp5729 +g15 +aI420 +aI-852 +aI485 +aI-879 +aI449 +aI-870 +aa(lp5730 +g15 +aI349 +aI-773 +aI391 +aI-834 +aI367 +aI-808 +aa(lp5731 +g15 +aI309 +aI-647 +aI331 +aI-739 +aI318 +aI-697 +aa(lp5732 +g15 +aI297 +aI-476 +aI301 +aI-597 +aI297 +aI-540 +aa(lp5733 +g10 +aa(lp5734 +g8 +aI1049 +aI0 +aa(lp5735 +g10 +aa(lp5736 +g8 +aI1049 +aI0 +aasVS +(lp5737 +(lp5738 +g8 +aI352 +aI13 +aa(lp5739 +g15 +aI202 +aI-3 +aI292 +aI13 +aI242 +aI7 +aa(lp5740 +g15 +aI106 +aI-47 +aI162 +aI-14 +aI130 +aI-29 +aa(lp5741 +g15 +aI55 +aI-106 +aI82 +aI-64 +aI65 +aI-84 +aa(lp5742 +g15 +aI39 +aI-172 +aI44 +aI-129 +aI39 +aI-151 +aa(lp5743 +g15 +aI52 +aI-230 +aI39 +aI-195 +aI43 +aI-215 +aa(lp5744 +g15 +aI86 +aI-269 +aI60 +aI-246 +aI72 +aI-259 +aa(lp5745 +g15 +aI134 +aI-290 +aI100 +aI-279 +aI116 +aI-286 +aa(lp5746 +g15 +aI190 +aI-297 +aI152 +aI-294 +aI171 +aI-297 +aa(lp5747 +g15 +aI204 +aI-196 +aI190 +aI-258 +aI195 +aI-225 +aa(lp5748 +g15 +aI242 +aI-124 +aI213 +aI-167 +aI226 +aI-143 +aa(lp5749 +g15 +aI299 +aI-80 +aI258 +aI-104 +aI277 +aI-90 +aa(lp5750 +g15 +aI373 +aI-65 +aI322 +aI-70 +aI346 +aI-65 +aa(lp5751 +g15 +aI442 +aI-77 +aI399 +aI-65 +aI422 +aI-69 +aa(lp5752 +g15 +aI494 +aI-107 +aI463 +aI-84 +aI480 +aI-94 +aa(lp5753 +g15 +aI527 +aI-153 +aI509 +aI-120 +aI519 +aI-135 +aa(lp5754 +g15 +aI538 +aI-210 +aI534 +aI-171 +aI538 +aI-190 +aa(lp5755 +g15 +aI524 +aI-270 +aI538 +aI-233 +aI533 +aI-253 +aa(lp5756 +g15 +aI483 +aI-319 +aI515 +aI-288 +aI501 +aI-304 +aa(lp5757 +g15 +aI413 +aI-362 +aI464 +aI-334 +aI441 +aI-348 +aa(lp5758 +g15 +aI315 +aI-406 +aI385 +aI-376 +aI353 +aI-390 +aa(lp5759 +g15 +aI198 +aI-465 +aI269 +aI-425 +aI230 +aI-445 +aa(lp5760 +g15 +aI121 +aI-530 +aI166 +aI-485 +aI140 +aI-507 +aa(lp5761 +g15 +aI79 +aI-606 +aI101 +aI-554 +aI87 +aI-579 +aa(lp5762 +g15 +aI66 +aI-696 +aI70 +aI-634 +aI66 +aI-664 +aa(lp5763 +g15 +aI91 +aI-807 +aI66 +aI-737 +aI74 +aI-774 +aa(lp5764 +g15 +aI159 +aI-892 +aI107 +aI-840 +aI130 +aI-868 +aa(lp5765 +g15 +aI263 +aI-946 +aI188 +aI-915 +aI223 +aI-933 +aa(lp5766 +g15 +aI393 +aI-965 +aI302 +aI-958 +aI346 +aI-965 +aa(lp5767 +g15 +aI520 +aI-952 +aI442 +aI-965 +aI484 +aI-961 +aa(lp5768 +g15 +aI608 +aI-920 +aI555 +aI-944 +aI585 +aI-934 +aa(lp5769 +g15 +aI660 +aI-870 +aI631 +aI-906 +aI648 +aI-889 +aa(lp5770 +g15 +aI677 +aI-810 +aI671 +aI-852 +aI677 +aI-831 +aa(lp5771 +g15 +aI666 +aI-766 +aI677 +aI-794 +aI673 +aI-779 +aa(lp5772 +g15 +aI636 +aI-731 +aI660 +aI-753 +aI650 +aI-741 +aa(lp5773 +g15 +aI584 +aI-707 +aI622 +aI-721 +aI605 +aI-713 +aa(lp5774 +g15 +aI513 +aI-699 +aI564 +aI-702 +aI540 +aI-699 +aa(lp5775 +g15 +aI505 +aI-759 +aI513 +aI-718 +aI510 +aI-738 +aa(lp5776 +g15 +aI481 +aI-819 +aI500 +aI-781 +aI492 +aI-801 +aa(lp5777 +g15 +aI437 +aI-865 +aI469 +aI-837 +aI455 +aI-853 +aa(lp5778 +g15 +aI371 +aI-883 +aI419 +aI-877 +aI397 +aI-883 +aa(lp5779 +g15 +aI320 +aI-875 +aI353 +aI-883 +aI337 +aI-881 +aa(lp5780 +g15 +aI278 +aI-852 +aI304 +aI-870 +aI290 +aI-862 +aa(lp5781 +g15 +aI250 +aI-813 +aI267 +aI-841 +aI257 +aI-829 +aa(lp5782 +g15 +aI240 +aI-760 +aI243 +aI-798 +aI240 +aI-780 +aa(lp5783 +g15 +aI249 +aI-707 +aI240 +aI-741 +aI243 +aI-724 +aa(lp5784 +g15 +aI282 +aI-659 +aI255 +aI-691 +aI266 +aI-675 +aa(lp5785 +g15 +aI349 +aI-611 +aI299 +aI-643 +aI321 +aI-627 +aa(lp5786 +g15 +aI460 +aI-560 +aI378 +aI-596 +aI415 +aI-578 +aa(lp5787 +g15 +aI576 +aI-503 +aI505 +aI-542 +aI544 +aI-522 +aa(lp5788 +g15 +aI655 +aI-440 +aI608 +aI-483 +aI635 +aI-462 +aa(lp5789 +g15 +aI700 +aI-367 +aI676 +aI-418 +aI691 +aI-393 +aa(lp5790 +g15 +aI714 +aI-278 +aI710 +aI-340 +aI714 +aI-310 +aa(lp5791 +g15 +aI689 +aI-160 +aI714 +aI-235 +aI706 +aI-195 +aa(lp5792 +g15 +aI616 +aI-67 +aI672 +aI-124 +aI648 +aI-93 +aa(lp5793 +g15 +aI502 +aI-8 +aI584 +aI-42 +aI546 +aI-22 +aa(lp5794 +g15 +aI352 +aI13 +aI457 +aI6 +aI407 +aI13 +aa(lp5795 +g10 +aa(lp5796 +g8 +aI781 +aI0 +aa(lp5797 +g10 +aa(lp5798 +g8 +aI781 +aI0 +aasVW +(lp5799 +(lp5800 +g8 +aI805 +aI-942 +aa(lp5801 +g20 +aI989 +aI-433 +aa(lp5802 +g15 +aI1011 +aI-369 +aI997 +aI-412 +aI1004 +aI-391 +aa(lp5803 +g15 +aI1029 +aI-308 +aI1018 +aI-348 +aI1024 +aI-327 +aa(lp5804 +g15 +aI1044 +aI-254 +aI1035 +aI-288 +aI1040 +aI-270 +aa(lp5805 +g15 +aI1054 +aI-211 +aI1049 +aI-237 +aI1052 +aI-223 +aa(lp5806 +g15 +aI1065 +aI-265 +aI1058 +aI-227 +aI1061 +aI-245 +aa(lp5807 +g15 +aI1078 +aI-326 +aI1069 +aI-284 +aI1073 +aI-305 +aa(lp5808 +g15 +aI1092 +aI-392 +aI1083 +aI-348 +aI1087 +aI-370 +aa(lp5809 +g15 +aI1108 +aI-458 +aI1097 +aI-415 +aI1102 +aI-437 +aa(lp5810 +g20 +aI1178 +aI-746 +aa(lp5811 +g15 +aI1182 +aI-764 +aI1179 +aI-751 +aI1181 +aI-757 +aa(lp5812 +g15 +aI1186 +aI-785 +aI1184 +aI-771 +aI1185 +aI-778 +aa(lp5813 +g15 +aI1189 +aI-803 +aI1188 +aI-791 +aI1189 +aI-798 +aa(lp5814 +g15 +aI1190 +aI-817 +aI1190 +aI-809 +aI1190 +aI-814 +aa(lp5815 +g15 +aI1170 +aI-866 +aI1190 +aI-840 +aI1183 +aI-857 +aa(lp5816 +g15 +aI1105 +aI-881 +aI1156 +aI-876 +aI1134 +aI-881 +aa(lp5817 +g20 +aI1074 +aI-881 +aa(lp5818 +g20 +aI1074 +aI-951 +aa(lp5819 +g20 +aI1422 +aI-951 +aa(lp5820 +g20 +aI1422 +aI-881 +aa(lp5821 +g20 +aI1397 +aI-881 +aa(lp5822 +g15 +aI1362 +aI-877 +aI1384 +aI-881 +aI1372 +aI-879 +aa(lp5823 +g15 +aI1335 +aI-861 +aI1352 +aI-874 +aI1343 +aI-869 +aa(lp5824 +g15 +aI1314 +aI-830 +aI1328 +aI-854 +aI1321 +aI-843 +aa(lp5825 +g15 +aI1296 +aI-776 +aI1308 +aI-816 +aI1302 +aI-799 +aa(lp5826 +g20 +aI1089 +aI0 +aa(lp5827 +g20 +aI937 +aI0 +aa(lp5828 +g20 +aI713 +aI-625 +aa(lp5829 +g20 +aI521 +aI0 +aa(lp5830 +g20 +aI356 +aI0 +aa(lp5831 +g20 +aI111 +aI-810 +aa(lp5832 +g15 +aI97 +aI-844 +aI108 +aI-823 +aI103 +aI-835 +aa(lp5833 +g15 +aI77 +aI-866 +aI92 +aI-853 +aI85 +aI-860 +aa(lp5834 +g15 +aI51 +aI-877 +aI70 +aI-871 +aI61 +aI-875 +aa(lp5835 +g15 +aI17 +aI-881 +aI41 +aI-879 +aI30 +aI-881 +aa(lp5836 +g20 +aI0 +aI-881 +aa(lp5837 +g20 +aI0 +aI-951 +aa(lp5838 +g20 +aI445 +aI-951 +aa(lp5839 +g20 +aI445 +aI-881 +aa(lp5840 +g20 +aI414 +aI-881 +aa(lp5841 +g15 +aI354 +aI-865 +aI387 +aI-881 +aI367 +aI-875 +aa(lp5842 +g15 +aI334 +aI-816 +aI341 +aI-855 +aI334 +aI-838 +aa(lp5843 +g15 +aI338 +aI-784 +aI334 +aI-809 +aI336 +aI-798 +aa(lp5844 +g15 +aI348 +aI-744 +aI341 +aI-770 +aI344 +aI-757 +aa(lp5845 +g20 +aI437 +aI-437 +aa(lp5846 +g15 +aI452 +aI-382 +aI442 +aI-420 +aI447 +aI-401 +aa(lp5847 +g15 +aI468 +aI-322 +aI458 +aI-362 +aI463 +aI-342 +aa(lp5848 +g15 +aI481 +aI-263 +aI472 +aI-301 +aI477 +aI-282 +aa(lp5849 +g15 +aI489 +aI-214 +aI485 +aI-245 +aI487 +aI-228 +aa(lp5850 +g15 +aI509 +aI-294 +aI495 +aI-243 +aI502 +aI-269 +aa(lp5851 +g15 +aI531 +aI-371 +aI516 +aI-319 +aI524 +aI-345 +aa(lp5852 +g20 +aI707 +aI-942 +aa(lp5853 +g10 +aa(lp5854 +g8 +aI1422 +aI0 +aa(lp5855 +g10 +aa(lp5856 +g8 +aI1422 +aI0 +aasV[ +(lp5857 +(lp5858 +g8 +aI133 +aI171 +aa(lp5859 +g20 +aI133 +aI-1012 +aa(lp5860 +g20 +aI502 +aI-1012 +aa(lp5861 +g20 +aI502 +aI-942 +aa(lp5862 +g20 +aI445 +aI-942 +aa(lp5863 +g15 +aI402 +aI-939 +aI430 +aI-942 +aI416 +aI-941 +aa(lp5864 +g15 +aI368 +aI-925 +aI389 +aI-936 +aI377 +aI-932 +aa(lp5865 +g15 +aI344 +aI-896 +aI358 +aI-918 +aI350 +aI-909 +aa(lp5866 +g15 +aI335 +aI-845 +aI338 +aI-884 +aI335 +aI-867 +aa(lp5867 +g20 +aI335 +aI4 +aa(lp5868 +g15 +aI344 +aI54 +aI335 +aI25 +aI338 +aI42 +aa(lp5869 +g15 +aI368 +aI84 +aI350 +aI67 +aI358 +aI77 +aa(lp5870 +g15 +aI402 +aI97 +aI377 +aI90 +aI389 +aI95 +aa(lp5871 +g15 +aI445 +aI100 +aI416 +aI99 +aI430 +aI100 +aa(lp5872 +g20 +aI502 +aI100 +aa(lp5873 +g20 +aI502 +aI171 +aa(lp5874 +g10 +aa(lp5875 +g8 +aI552 +aI0 +aa(lp5876 +g10 +aa(lp5877 +g8 +aI552 +aI0 +aasV_ +(lp5878 +(lp5879 +g8 +aI618 +aI189 +aa(lp5880 +g20 +aI-6 +aI189 +aa(lp5881 +g20 +aI-6 +aI111 +aa(lp5882 +g20 +aI618 +aI111 +aa(lp5883 +g10 +aa(lp5884 +g8 +aI611 +aI0 +aa(lp5885 +g10 +aa(lp5886 +g8 +aI611 +aI0 +aasVc +(lp5887 +(lp5888 +g8 +aI393 +aI13 +aa(lp5889 +g15 +aI258 +aI-5 +aI344 +aI13 +aI299 +aI7 +aa(lp5890 +g15 +aI154 +aI-67 +aI218 +aI-17 +aI183 +aI-38 +aa(lp5891 +g15 +aI86 +aI-181 +aI125 +aI-96 +aI102 +aI-134 +aa(lp5892 +g15 +aI62 +aI-354 +aI70 +aI-228 +aI62 +aI-286 +aa(lp5893 +g15 +aI87 +aI-534 +aI62 +aI-426 +aI70 +aI-486 +aa(lp5894 +g15 +aI156 +aI-650 +aI104 +aI-582 +aI127 +aI-621 +aa(lp5895 +g15 +aI260 +aI-712 +aI185 +aI-679 +aI220 +aI-700 +aa(lp5896 +g15 +aI389 +aI-731 +aI300 +aI-725 +aI343 +aI-731 +aa(lp5897 +g15 +aI503 +aI-720 +aI432 +aI-731 +aI470 +aI-727 +aa(lp5898 +g15 +aI585 +aI-690 +aI536 +aI-713 +aI563 +aI-703 +aa(lp5899 +g15 +aI636 +aI-646 +aI608 +aI-678 +aI624 +aI-663 +aa(lp5900 +g15 +aI653 +aI-591 +aI647 +aI-629 +aI653 +aI-610 +aa(lp5901 +g15 +aI646 +aI-549 +aI653 +aI-577 +aI651 +aI-563 +aa(lp5902 +g15 +aI619 +aI-513 +aI641 +aI-535 +aI632 +aI-523 +aa(lp5903 +g15 +aI566 +aI-487 +aI606 +aI-502 +aI589 +aI-494 +aa(lp5904 +g15 +aI481 +aI-478 +aI544 +aI-481 +aI515 +aI-478 +aa(lp5905 +g15 +aI476 +aI-543 +aI481 +aI-501 +aI479 +aI-522 +aa(lp5906 +g15 +aI462 +aI-598 +aI474 +aI-564 +aI469 +aI-582 +aa(lp5907 +g15 +aI436 +aI-635 +aI456 +aI-614 +aI447 +aI-626 +aa(lp5908 +g15 +aI394 +aI-649 +aI425 +aI-645 +aI411 +aI-649 +aa(lp5909 +g15 +aI342 +aI-635 +aI374 +aI-649 +aI357 +aI-645 +aa(lp5910 +g15 +aI302 +aI-588 +aI326 +aI-626 +aI313 +aI-610 +aa(lp5911 +g15 +aI277 +aI-497 +aI291 +aI-565 +aI282 +aI-535 +aa(lp5912 +g15 +aI268 +aI-355 +aI271 +aI-459 +aI268 +aI-412 +aa(lp5913 +g15 +aI305 +aI-153 +aI268 +aI-265 +aI280 +aI-197 +aa(lp5914 +g15 +aI426 +aI-86 +aI330 +aI-108 +aI370 +aI-86 +aa(lp5915 +g15 +aI491 +aI-94 +aI449 +aI-86 +aI471 +aI-88 +aa(lp5916 +g15 +aI546 +aI-117 +aI511 +aI-99 +aI529 +aI-107 +aa(lp5917 +g15 +aI589 +aI-151 +aI562 +aI-126 +aI577 +aI-138 +aa(lp5918 +g15 +aI619 +aI-194 +aI601 +aI-164 +aI611 +aI-179 +aa(lp5919 +g15 +aI643 +aI-167 +aI630 +aI-187 +aI638 +aI-178 +aa(lp5920 +g15 +aI651 +aI-133 +aI649 +aI-156 +aI651 +aI-145 +aa(lp5921 +g15 +aI636 +aI-81 +aI651 +aI-116 +aI646 +aI-98 +aa(lp5922 +g15 +aI590 +aI-34 +aI626 +aI-64 +aI611 +aI-48 +aa(lp5923 +g15 +aI509 +aI0 +aI569 +aI-20 +aI542 +aI-8 +aa(lp5924 +g15 +aI393 +aI13 +aI477 +aI9 +aI438 +aI13 +aa(lp5925 +g10 +aa(lp5926 +g8 +aI702 +aI0 +aa(lp5927 +g10 +aa(lp5928 +g8 +aI702 +aI0 +aasVg +(lp5929 +(lp5930 +g8 +aI740 +aI-689 +aa(lp5931 +g15 +aI735 +aI-660 +aI740 +aI-679 +aI738 +aI-669 +aa(lp5932 +g15 +aI720 +aI-635 +aI732 +aI-650 +aI727 +aI-642 +aa(lp5933 +g15 +aI691 +aI-619 +aI713 +aI-628 +aI703 +aI-623 +aa(lp5934 +g15 +aI645 +aI-612 +aI678 +aI-614 +aI663 +aI-612 +aa(lp5935 +g15 +aI640 +aI-636 +aI645 +aI-621 +aI643 +aI-629 +aa(lp5936 +g15 +aI629 +aI-654 +aI638 +aI-643 +aI634 +aI-649 +aa(lp5937 +g15 +aI613 +aI-665 +aI624 +aI-659 +aI619 +aI-662 +aa(lp5938 +g15 +aI594 +aI-668 +aI607 +aI-667 +aI600 +aI-668 +aa(lp5939 +g15 +aI570 +aI-664 +aI587 +aI-668 +aI579 +aI-667 +aa(lp5940 +g15 +aI550 +aI-654 +aI562 +aI-661 +aI555 +aI-657 +aa(lp5941 +g15 +aI576 +aI-620 +aI559 +aI-644 +aI568 +aI-633 +aa(lp5942 +g15 +aI596 +aI-578 +aI583 +aI-607 +aI590 +aI-593 +aa(lp5943 +g15 +aI610 +aI-533 +aI602 +aI-564 +aI607 +aI-548 +aa(lp5944 +g15 +aI615 +aI-484 +aI614 +aI-517 +aI615 +aI-501 +aa(lp5945 +g15 +aI599 +aI-391 +aI615 +aI-451 +aI610 +aI-420 +aa(lp5946 +g15 +aI550 +aI-317 +aI589 +aI-363 +aI572 +aI-338 +aa(lp5947 +g15 +aI466 +aI-269 +aI528 +aI-297 +aI500 +aI-280 +aa(lp5948 +g15 +aI346 +aI-251 +aI432 +aI-257 +aI392 +aI-251 +aa(lp5949 +g15 +aI328 +aI-251 +aI341 +aI-251 +aI335 +aI-251 +aa(lp5950 +g15 +aI305 +aI-252 +aI320 +aI-252 +aI313 +aI-252 +aa(lp5951 +g15 +aI284 +aI-253 +aI298 +aI-252 +aI291 +aI-253 +aa(lp5952 +g15 +aI269 +aI-255 +aI278 +aI-254 +aI273 +aI-254 +aa(lp5953 +g15 +aI252 +aI-244 +aI263 +aI-252 +aI258 +aI-248 +aa(lp5954 +g15 +aI236 +aI-228 +aI246 +aI-239 +aI241 +aI-234 +aa(lp5955 +g15 +aI225 +aI-209 +aI232 +aI-223 +aI228 +aI-216 +aa(lp5956 +g15 +aI221 +aI-187 +aI222 +aI-202 +aI221 +aI-195 +aa(lp5957 +g15 +aI238 +aI-155 +aI221 +aI-172 +aI227 +aI-162 +aa(lp5958 +g15 +aI283 +aI-144 +aI250 +aI-148 +aI265 +aI-144 +aa(lp5959 +g20 +aI445 +aI-144 +aa(lp5960 +g15 +aI559 +aI-130 +aI489 +aI-144 +aI527 +aI-140 +aa(lp5961 +g15 +aI639 +aI-90 +aI592 +aI-121 +aI618 +aI-108 +aa(lp5962 +g15 +aI686 +aI-26 +aI660 +aI-73 +aI676 +aI-51 +aa(lp5963 +g15 +aI701 +aI59 +aI696 +aI-1 +aI701 +aI27 +aa(lp5964 +g15 +aI677 +aI169 +aI701 +aI100 +aI693 +aI137 +aa(lp5965 +g15 +aI606 +aI251 +aI662 +aI201 +aI638 +aI229 +aa(lp5966 +g15 +aI486 +aI302 +aI574 +aI273 +aI534 +aI290 +aa(lp5967 +g15 +aI314 +aI320 +aI437 +aI314 +aI380 +aI320 +aa(lp5968 +g15 +aI79 +aI273 +aI209 +aI320 +aI131 +aI305 +aa(lp5969 +g15 +aI2 +aI135 +aI28 +aI242 +aI2 +aI195 +aa(lp5970 +g15 +aI48 +aI25 +aI2 +aI87 +aI18 +aI50 +aa(lp5971 +g15 +aI182 +aI-19 +aI79 +aI0 +aI124 +aI-14 +aa(lp5972 +g15 +aI147 +aI-37 +aI170 +aI-24 +aI158 +aI-30 +aa(lp5973 +g15 +aI115 +aI-62 +aI135 +aI-44 +aI125 +aI-52 +aa(lp5974 +g15 +aI93 +aI-95 +aI106 +aI-72 +aI99 +aI-83 +aa(lp5975 +g15 +aI85 +aI-138 +aI88 +aI-108 +aI85 +aI-122 +aa(lp5976 +g15 +aI94 +aI-179 +aI85 +aI-152 +aI88 +aI-166 +aa(lp5977 +g15 +aI118 +aI-215 +aI99 +aI-191 +aI108 +aI-203 +aa(lp5978 +g15 +aI155 +aI-247 +aI128 +aI-226 +aI141 +aI-237 +aa(lp5979 +g15 +aI203 +aI-278 +aI170 +aI-258 +aI186 +aI-268 +aa(lp5980 +g15 +aI149 +aI-307 +aI184 +aI-285 +aI166 +aI-294 +aa(lp5981 +g15 +aI106 +aI-351 +aI132 +aI-319 +aI118 +aI-334 +aa(lp5982 +g15 +aI78 +aI-411 +aI94 +aI-369 +aI85 +aI-388 +aa(lp5983 +g15 +aI67 +aI-484 +aI71 +aI-433 +aI67 +aI-457 +aa(lp5984 +g15 +aI135 +aI-666 +aI67 +aI-562 +aI90 +aI-623 +aa(lp5985 +g15 +aI346 +aI-731 +aI181 +aI-709 +aI251 +aI-731 +aa(lp5986 +g15 +aI434 +aI-719 +aI378 +aI-731 +aI407 +aI-727 +aa(lp5987 +g15 +aI505 +aI-690 +aI461 +aI-711 +aI485 +aI-701 +aa(lp5988 +g15 +aI529 +aI-715 +aI512 +aI-698 +aI520 +aI-706 +aa(lp5989 +g15 +aI559 +aI-739 +aI538 +aI-724 +aI548 +aI-732 +aa(lp5990 +g15 +aI597 +aI-758 +aI571 +aI-747 +aI583 +aI-753 +aa(lp5991 +g15 +aI643 +aI-765 +aI611 +aI-762 +aI626 +aI-765 +aa(lp5992 +g15 +aI685 +aI-758 +aI659 +aI-765 +aI673 +aI-763 +aa(lp5993 +g15 +aI715 +aI-742 +aI697 +aI-754 +aI707 +aI-749 +aa(lp5994 +g15 +aI734 +aI-718 +aI723 +aI-735 +aI729 +aI-727 +aa(lp5995 +g15 +aI740 +aI-689 +aI738 +aI-709 +aI740 +aI-699 +aa(lp5996 +g10 +aa(lp5997 +g8 +aI160 +aI132 +aa(lp5998 +g15 +aI200 +aI214 +aI160 +aI169 +aI173 +aI196 +aa(lp5999 +g15 +aI317 +aI240 +aI226 +aI231 +aI265 +aI240 +aa(lp6000 +g15 +aI487 +aI206 +aI395 +aI240 +aI452 +aI229 +aa(lp6001 +g15 +aI541 +aI107 +aI523 +aI184 +aI541 +aI151 +aa(lp6002 +g15 +aI514 +aI47 +aI541 +aI79 +aI532 +aI59 +aa(lp6003 +g15 +aI433 +aI31 +aI496 +aI36 +aI469 +aI31 +aa(lp6004 +g20 +aI278 +aI31 +aa(lp6005 +g15 +aI237 +aI34 +aI265 +aI31 +aI251 +aI32 +aa(lp6006 +g15 +aI199 +aI49 +aI223 +aI37 +aI211 +aI41 +aa(lp6007 +g15 +aI171 +aI80 +aI188 +aI56 +aI178 +aI66 +aa(lp6008 +g15 +aI160 +aI132 +aI163 +aI93 +aI160 +aI110 +aa(lp6009 +g10 +aa(lp6010 +g8 +aI249 +aI-484 +aa(lp6011 +g15 +aI254 +aI-421 +aI249 +aI-461 +aI250 +aI-439 +aa(lp6012 +g15 +aI270 +aI-372 +aI257 +aI-402 +aI262 +aI-386 +aa(lp6013 +g15 +aI298 +aI-341 +aI277 +aI-359 +aI287 +aI-348 +aa(lp6014 +g15 +aI342 +aI-330 +aI310 +aI-333 +aI325 +aI-330 +aa(lp6015 +g15 +aI386 +aI-341 +aI360 +aI-330 +aI374 +aI-333 +aa(lp6016 +g15 +aI414 +aI-372 +aI398 +aI-348 +aI407 +aI-358 +aa(lp6017 +g15 +aI429 +aI-421 +aI421 +aI-385 +aI426 +aI-402 +aa(lp6018 +g15 +aI433 +aI-486 +aI432 +aI-441 +aI433 +aI-462 +aa(lp6019 +g15 +aI429 +aI-553 +aI433 +aI-511 +aI432 +aI-533 +aa(lp6020 +g15 +aI413 +aI-605 +aI425 +aI-574 +aI420 +aI-591 +aa(lp6021 +g15 +aI385 +aI-639 +aI406 +aI-619 +aI397 +aI-631 +aa(lp6022 +g15 +aI341 +aI-651 +aI373 +aI-647 +aI358 +aI-651 +aa(lp6023 +g15 +aI297 +aI-638 +aI323 +aI-651 +aI309 +aI-647 +aa(lp6024 +g15 +aI269 +aI-604 +aI285 +aI-630 +aI276 +aI-619 +aa(lp6025 +g15 +aI253 +aI-551 +aI262 +aI-589 +aI256 +aI-572 +aa(lp6026 +g15 +aI249 +aI-484 +aI250 +aI-531 +aI249 +aI-508 +aa(lp6027 +g10 +aa(lp6028 +g8 +aI746 +aI0 +aa(lp6029 +g10 +aa(lp6030 +g8 +aI746 +aI0 +aasVk +(lp6031 +(lp6032 +g8 +aI848 +aI0 +aa(lp6033 +g20 +aI829 +aI0 +aa(lp6034 +g15 +aI707 +aI-2 +aI780 +aI0 +aI740 +aI0 +aa(lp6035 +g15 +aI621 +aI-17 +aI674 +aI-4 +aI645 +aI-9 +aa(lp6036 +g15 +aI559 +aI-53 +aI597 +aI-25 +aI577 +aI-37 +aa(lp6037 +g15 +aI507 +aI-118 +aI542 +aI-69 +aI525 +aI-90 +aa(lp6038 +g20 +aI389 +aI-304 +aa(lp6039 +g20 +aI335 +aI-265 +aa(lp6040 +g20 +aI335 +aI-157 +aa(lp6041 +g15 +aI345 +aI-111 +aI335 +aI-138 +aI339 +aI-122 +aa(lp6042 +g15 +aI368 +aI-85 +aI351 +aI-100 +aI359 +aI-91 +aa(lp6043 +g15 +aI399 +aI-73 +aI378 +aI-79 +aI388 +aI-75 +aa(lp6044 +g15 +aI430 +aI-70 +aI411 +aI-71 +aI421 +aI-70 +aa(lp6045 +g20 +aI446 +aI-70 +aa(lp6046 +g20 +aI446 +aI0 +aa(lp6047 +g20 +aI22 +aI0 +aa(lp6048 +g20 +aI22 +aI-70 +aa(lp6049 +g20 +aI38 +aI-70 +aa(lp6050 +g15 +aI69 +aI-73 +aI48 +aI-70 +aI58 +aI-71 +aa(lp6051 +g15 +aI100 +aI-85 +aI81 +aI-75 +aI91 +aI-79 +aa(lp6052 +g15 +aI124 +aI-111 +aI109 +aI-91 +aI117 +aI-100 +aa(lp6053 +g15 +aI133 +aI-157 +aI130 +aI-122 +aI133 +aI-138 +aa(lp6054 +g20 +aI133 +aI-860 +aa(lp6055 +g15 +aI124 +aI-903 +aI133 +aI-878 +aI130 +aI-892 +aa(lp6056 +g15 +aI100 +aI-928 +aI117 +aI-914 +aI109 +aI-922 +aa(lp6057 +g15 +aI69 +aI-939 +aI90 +aI-934 +aI80 +aI-937 +aa(lp6058 +g15 +aI38 +aI-942 +aI58 +aI-941 +aI47 +aI-942 +aa(lp6059 +g20 +aI22 +aI-942 +aa(lp6060 +g20 +aI22 +aI-1012 +aa(lp6061 +g20 +aI335 +aI-1012 +aa(lp6062 +g20 +aI335 +aI-498 +aa(lp6063 +g15 +aI334 +aI-456 +aI335 +aI-486 +aI335 +aI-472 +aa(lp6064 +g15 +aI332 +aI-411 +aI334 +aI-440 +aI333 +aI-425 +aa(lp6065 +g15 +aI329 +aI-359 +aI331 +aI-394 +aI330 +aI-376 +aa(lp6066 +g20 +aI497 +aI-547 +aa(lp6067 +g15 +aI526 +aI-587 +aI512 +aI-564 +aI521 +aI-577 +aa(lp6068 +g15 +aI533 +aI-611 +aI530 +aI-596 +aI533 +aI-605 +aa(lp6069 +g15 +aI515 +aI-637 +aI533 +aI-622 +aI527 +aI-631 +aa(lp6070 +g15 +aI464 +aI-647 +aI503 +aI-644 +aI486 +aI-647 +aa(lp6071 +g20 +aI464 +aI-714 +aa(lp6072 +g20 +aI800 +aI-714 +aa(lp6073 +g20 +aI800 +aI-647 +aa(lp6074 +g15 +aI709 +aI-620 +aI769 +aI-647 +aI739 +aI-638 +aa(lp6075 +g15 +aI611 +aI-534 +aI679 +aI-602 +aI647 +aI-573 +aa(lp6076 +g20 +aI527 +aI-438 +aa(lp6077 +g20 +aI705 +aI-174 +aa(lp6078 +g15 +aI776 +aI-95 +aI728 +aI-138 +aI752 +aI-112 +aa(lp6079 +g15 +aI843 +aI-70 +aI799 +aI-78 +aI822 +aI-70 +aa(lp6080 +g20 +aI848 +aI-70 +aa(lp6081 +g10 +aa(lp6082 +g8 +aI848 +aI0 +aa(lp6083 +g10 +aa(lp6084 +g8 +aI848 +aI0 +aasVo +(lp6085 +(lp6086 +g8 +aI754 +aI-359 +aa(lp6087 +g15 +aI666 +aI-78 +aI754 +aI-234 +aI725 +aI-140 +aa(lp6088 +g15 +aI406 +aI13 +aI607 +aI-17 +aI521 +aI13 +aa(lp6089 +g15 +aI263 +aI-9 +aI353 +aI13 +aI305 +aI5 +aa(lp6090 +g15 +aI154 +aI-78 +aI220 +aI-25 +aI184 +aI-48 +aa(lp6091 +g15 +aI86 +aI-195 +aI124 +aI-109 +aI102 +aI-148 +aa(lp6092 +g15 +aI62 +aI-359 +aI70 +aI-242 +aI62 +aI-297 +aa(lp6093 +g15 +aI150 +aI-639 +aI62 +aI-485 +aI91 +aI-578 +aa(lp6094 +g15 +aI410 +aI-731 +aI209 +aI-700 +aI296 +aI-731 +aa(lp6095 +g15 +aI554 +aI-708 +aI464 +aI-731 +aI512 +aI-723 +aa(lp6096 +g15 +aI662 +aI-639 +aI596 +aI-693 +aI632 +aI-670 +aa(lp6097 +g15 +aI730 +aI-523 +aI692 +aI-608 +aI714 +aI-569 +aa(lp6098 +g15 +aI754 +aI-359 +aI746 +aI-476 +aI754 +aI-422 +aa(lp6099 +g10 +aa(lp6100 +g8 +aI269 +aI-359 +aa(lp6101 +g15 +aI277 +aI-234 +aI269 +aI-312 +aI272 +aI-270 +aa(lp6102 +g15 +aI301 +aI-144 +aI282 +aI-198 +aI290 +aI-168 +aa(lp6103 +g15 +aI344 +aI-89 +aI312 +aI-119 +aI326 +aI-101 +aa(lp6104 +g15 +aI409 +aI-70 +aI362 +aI-76 +aI383 +aI-70 +aa(lp6105 +g15 +aI474 +aI-89 +aI435 +aI-70 +aI456 +aI-76 +aa(lp6106 +g15 +aI517 +aI-144 +aI491 +aI-101 +aI506 +aI-119 +aa(lp6107 +g15 +aI541 +aI-234 +aI528 +aI-168 +aI536 +aI-198 +aa(lp6108 +g15 +aI548 +aI-359 +aI545 +aI-270 +aI548 +aI-312 +aa(lp6109 +g15 +aI540 +aI-484 +aI548 +aI-407 +aI545 +aI-449 +aa(lp6110 +g15 +aI516 +aI-574 +aI535 +aI-520 +aI527 +aI-550 +aa(lp6111 +g15 +aI473 +aI-628 +aI505 +aI-598 +aI491 +aI-616 +aa(lp6112 +g15 +aI408 +aI-646 +aI455 +aI-640 +aI433 +aI-646 +aa(lp6113 +g15 +aI343 +aI-628 +aI382 +aI-646 +aI360 +aI-640 +aa(lp6114 +g15 +aI300 +aI-574 +aI325 +aI-616 +aI310 +aI-598 +aa(lp6115 +g15 +aI276 +aI-484 +aI289 +aI-550 +aI281 +aI-520 +aa(lp6116 +g15 +aI269 +aI-359 +aI271 +aI-449 +aI269 +aI-407 +aa(lp6117 +g10 +aa(lp6118 +g8 +aI817 +aI0 +aa(lp6119 +g10 +aa(lp6120 +g8 +aI817 +aI0 +aasVs +(lp6121 +(lp6122 +g8 +aI307 +aI13 +aa(lp6123 +g15 +aI184 +aI1 +aI259 +aI13 +aI218 +aI9 +aa(lp6124 +g15 +aI101 +aI-30 +aI150 +aI-6 +aI122 +aI-16 +aa(lp6125 +g15 +aI54 +aI-80 +aI79 +aI-44 +aI64 +aI-61 +aa(lp6126 +g15 +aI39 +aI-142 +aI44 +aI-99 +aI39 +aI-119 +aa(lp6127 +g15 +aI52 +aI-194 +aI39 +aI-163 +aI43 +aI-181 +aa(lp6128 +g15 +aI84 +aI-225 +aI60 +aI-207 +aI71 +aI-218 +aa(lp6129 +g15 +aI125 +aI-240 +aI97 +aI-232 +aI110 +aI-237 +aa(lp6130 +g15 +aI164 +aI-243 +aI139 +aI-242 +aI152 +aI-243 +aa(lp6131 +g15 +aI174 +aI-168 +aI164 +aI-215 +aI167 +aI-190 +aa(lp6132 +g15 +aI203 +aI-112 +aI181 +aI-146 +aI191 +aI-127 +aa(lp6133 +g15 +aI249 +aI-77 +aI216 +aI-97 +aI231 +aI-85 +aa(lp6134 +g15 +aI307 +aI-64 +aI266 +aI-68 +aI286 +aI-64 +aa(lp6135 +g15 +aI367 +aI-71 +aI330 +aI-64 +aI350 +aI-67 +aa(lp6136 +g15 +aI408 +aI-91 +aI384 +aI-76 +aI397 +aI-83 +aa(lp6137 +g15 +aI432 +aI-120 +aI419 +aI-100 +aI427 +aI-109 +aa(lp6138 +g15 +aI440 +aI-155 +aI437 +aI-132 +aI440 +aI-143 +aa(lp6139 +g15 +aI431 +aI-195 +aI440 +aI-170 +aI437 +aI-183 +aa(lp6140 +g15 +aI404 +aI-227 +aI426 +aI-206 +aI417 +aI-217 +aa(lp6141 +g15 +aI354 +aI-257 +aI392 +aI-237 +aI375 +aI-247 +aa(lp6142 +g15 +aI276 +aI-288 +aI333 +aI-267 +aI307 +aI-277 +aa(lp6143 +g15 +aI180 +aI-328 +aI240 +aI-301 +aI208 +aI-314 +aa(lp6144 +g15 +aI111 +aI-376 +aI153 +aI-342 +aI129 +aI-358 +aa(lp6145 +g15 +aI68 +aI-438 +aI92 +aI-394 +aI77 +aI-415 +aa(lp6146 +g15 +aI53 +aI-518 +aI58 +aI-461 +aI53 +aI-488 +aa(lp6147 +g15 +aI73 +aI-611 +aI53 +aI-554 +aI60 +aI-585 +aa(lp6148 +g15 +aI132 +aI-677 +aI87 +aI-638 +aI106 +aI-660 +aa(lp6149 +g15 +aI222 +aI-716 +aI157 +aI-695 +aI187 +aI-708 +aa(lp6150 +g15 +aI339 +aI-730 +aI257 +aI-725 +aI296 +aI-730 +aa(lp6151 +g15 +aI447 +aI-719 +aI381 +aI-730 +aI417 +aI-726 +aa(lp6152 +g15 +aI519 +aI-690 +aI476 +aI-712 +aI500 +aI-702 +aa(lp6153 +g15 +aI560 +aI-651 +aI538 +aI-679 +aI551 +aI-665 +aa(lp6154 +g15 +aI573 +aI-606 +aI569 +aI-636 +aI573 +aI-621 +aa(lp6155 +g15 +aI541 +aI-537 +aI573 +aI-576 +aI563 +aI-553 +aa(lp6156 +g15 +aI437 +aI-514 +aI520 +aI-522 +aI486 +aI-514 +aa(lp6157 +g15 +aI407 +aI-617 +aI437 +aI-558 +aI427 +aI-593 +aa(lp6158 +g15 +aI320 +aI-654 +aI388 +aI-642 +aI358 +aI-654 +aa(lp6159 +g15 +aI278 +aI-649 +aI305 +aI-654 +aI292 +aI-652 +aa(lp6160 +g15 +aI244 +aI-633 +aI265 +aI-645 +aI254 +aI-640 +aa(lp6161 +g15 +aI221 +aI-607 +aI234 +aI-626 +aI226 +aI-618 +aa(lp6162 +g15 +aI212 +aI-571 +aI215 +aI-597 +aI212 +aI-585 +aa(lp6163 +g15 +aI220 +aI-533 +aI212 +aI-557 +aI214 +aI-544 +aa(lp6164 +g15 +aI249 +aI-501 +aI225 +aI-522 +aI235 +aI-511 +aa(lp6165 +g15 +aI304 +aI-470 +aI262 +aI-490 +aI281 +aI-480 +aa(lp6166 +g15 +aI394 +aI-435 +aI328 +aI-459 +aI358 +aI-448 +aa(lp6167 +g15 +aI476 +aI-400 +aI424 +aI-425 +aI451 +aI-413 +aa(lp6168 +g15 +aI540 +aI-354 +aI501 +aI-387 +aI522 +aI-371 +aa(lp6169 +g15 +aI582 +aI-296 +aI558 +aI-337 +aI572 +aI-318 +aa(lp6170 +g15 +aI597 +aI-220 +aI592 +aI-274 +aI597 +aI-249 +aa(lp6171 +g15 +aI578 +aI-121 +aI597 +aI-184 +aI591 +aI-151 +aa(lp6172 +g15 +aI522 +aI-48 +aI565 +aI-92 +aI546 +aI-68 +aa(lp6173 +g15 +aI430 +aI-2 +aI497 +aI-28 +aI467 +aI-13 +aa(lp6174 +g15 +aI307 +aI13 +aI394 +aI8 +aI353 +aI13 +aa(lp6175 +g10 +aa(lp6176 +g8 +aI650 +aI0 +aa(lp6177 +g10 +aa(lp6178 +g8 +aI650 +aI0 +aasVw +(lp6179 +(lp6180 +g8 +aI658 +aI-707 +aa(lp6181 +g20 +aI789 +aI-314 +aa(lp6182 +g15 +aI812 +aI-232 +aI799 +aI-281 +aI807 +aI-254 +aa(lp6183 +g15 +aI824 +aI-174 +aI817 +aI-209 +aI821 +aI-190 +aa(lp6184 +g20 +aI828 +aI-174 +aa(lp6185 +g15 +aI834 +aI-205 +aI830 +aI-185 +aI832 +aI-195 +aa(lp6186 +g15 +aI841 +aI-237 +aI836 +aI-215 +aI838 +aI-226 +aa(lp6187 +g15 +aI850 +aI-272 +aI844 +aI-248 +aI847 +aI-259 +aa(lp6188 +g15 +aI863 +aI-316 +aI854 +aI-285 +aI858 +aI-300 +aa(lp6189 +g20 +aI922 +aI-511 +aa(lp6190 +g15 +aI931 +aI-547 +aI925 +aI-522 +aI928 +aI-534 +aa(lp6191 +g15 +aI934 +aI-578 +aI933 +aI-560 +aI934 +aI-570 +aa(lp6192 +g15 +aI913 +aI-627 +aI934 +aI-600 +aI927 +aI-617 +aa(lp6193 +g15 +aI846 +aI-643 +aI898 +aI-638 +aI876 +aI-643 +aa(lp6194 +g20 +aI837 +aI-643 +aa(lp6195 +g20 +aI837 +aI-714 +aa(lp6196 +g20 +aI1142 +aI-714 +aa(lp6197 +g20 +aI1142 +aI-643 +aa(lp6198 +g20 +aI1125 +aI-643 +aa(lp6199 +g15 +aI1091 +aI-639 +aI1112 +aI-643 +aI1101 +aI-642 +aa(lp6200 +g15 +aI1066 +aI-624 +aI1082 +aI-636 +aI1073 +aI-631 +aa(lp6201 +g15 +aI1045 +aI-592 +aI1059 +aI-616 +aI1052 +aI-605 +aa(lp6202 +g15 +aI1025 +aI-539 +aI1039 +aI-578 +aI1032 +aI-560 +aa(lp6203 +g20 +aI853 +aI0 +aa(lp6204 +g20 +aI709 +aI0 +aa(lp6205 +g20 +aI563 +aI-442 +aa(lp6206 +g20 +aI410 +aI0 +aa(lp6207 +g20 +aI265 +aI0 +aa(lp6208 +g20 +aI94 +aI-573 +aa(lp6209 +g15 +aI78 +aI-607 +aI89 +aI-587 +aI84 +aI-598 +aa(lp6210 +g15 +aI59 +aI-629 +aI73 +aI-616 +aI66 +aI-623 +aa(lp6211 +g15 +aI33 +aI-640 +aI51 +aI-634 +aI43 +aI-638 +aa(lp6212 +g15 +aI0 +aI-643 +aI24 +aI-642 +aI13 +aI-643 +aa(lp6213 +g20 +aI-3 +aI-643 +aa(lp6214 +g20 +aI-3 +aI-714 +aa(lp6215 +g20 +aI386 +aI-714 +aa(lp6216 +g20 +aI386 +aI-643 +aa(lp6217 +g20 +aI369 +aI-643 +aa(lp6218 +g15 +aI308 +aI-632 +aI342 +aI-643 +aI322 +aI-639 +aa(lp6219 +g15 +aI289 +aI-587 +aI295 +aI-624 +aI289 +aI-609 +aa(lp6220 +g15 +aI292 +aI-560 +aI289 +aI-580 +aI290 +aI-571 +aa(lp6221 +g15 +aI300 +aI-530 +aI295 +aI-550 +aI297 +aI-540 +aa(lp6222 +g20 +aI349 +aI-356 +aa(lp6223 +g15 +aI361 +aI-307 +aI353 +aI-340 +aI358 +aI-324 +aa(lp6224 +g15 +aI373 +aI-258 +aI365 +aI-290 +aI369 +aI-274 +aa(lp6225 +g15 +aI382 +aI-212 +aI376 +aI-241 +aI379 +aI-226 +aa(lp6226 +g15 +aI389 +aI-174 +aI385 +aI-198 +aI387 +aI-185 +aa(lp6227 +g20 +aI393 +aI-174 +aa(lp6228 +g15 +aI409 +aI-242 +aI397 +aI-196 +aI402 +aI-219 +aa(lp6229 +g15 +aI436 +aI-327 +aI415 +aI-266 +aI424 +aI-294 +aa(lp6230 +g20 +aI572 +aI-707 +aa(lp6231 +g10 +aa(lp6232 +g8 +aI1141 +aI0 +aa(lp6233 +g10 +aa(lp6234 +g8 +aI1141 +aI0 +aasV{ +(lp6235 +(lp6236 +g8 +aI422 +aI167 +aa(lp6237 +g15 +aI323 +aI153 +aI385 +aI167 +aI352 +aI162 +aa(lp6238 +g15 +aI252 +aI114 +aI295 +aI144 +aI271 +aI131 +aa(lp6239 +g15 +aI209 +aI51 +aI233 +aI96 +aI219 +aI76 +aa(lp6240 +g15 +aI194 +aI-30 +aI199 +aI27 +aI194 +aI0 +aa(lp6241 +g20 +aI194 +aI-258 +aa(lp6242 +g15 +aI182 +aI-320 +aI194 +aI-283 +aI190 +aI-304 +aa(lp6243 +g15 +aI149 +aI-357 +aI174 +aI-336 +aI163 +aI-348 +aa(lp6244 +g15 +aI100 +aI-376 +aI135 +aI-366 +aI119 +aI-373 +aa(lp6245 +g15 +aI39 +aI-383 +aI81 +aI-380 +aI61 +aI-382 +aa(lp6246 +g20 +aI39 +aI-465 +aa(lp6247 +g15 +aI100 +aI-471 +aI61 +aI-465 +aI81 +aI-468 +aa(lp6248 +g15 +aI149 +aI-490 +aI119 +aI-475 +aI135 +aI-481 +aa(lp6249 +g15 +aI182 +aI-527 +aI163 +aI-499 +aI174 +aI-512 +aa(lp6250 +g15 +aI194 +aI-588 +aI190 +aI-543 +aI194 +aI-563 +aa(lp6251 +g20 +aI194 +aI-817 +aa(lp6252 +g15 +aI252 +aI-962 +aI194 +aI-880 +aI213 +aI-928 +aa(lp6253 +g15 +aI422 +aI-1012 +aI290 +aI-995 +aI347 +aI-1012 +aa(lp6254 +g20 +aI549 +aI-1012 +aa(lp6255 +g20 +aI549 +aI-942 +aa(lp6256 +g20 +aI497 +aI-942 +aa(lp6257 +g15 +aI450 +aI-933 +aI478 +aI-942 +aI462 +aI-939 +aa(lp6258 +g15 +aI421 +aI-909 +aI438 +aI-928 +aI428 +aI-919 +aa(lp6259 +g15 +aI406 +aI-868 +aI414 +aI-898 +aI409 +aI-884 +aa(lp6260 +g15 +aI402 +aI-812 +aI403 +aI-852 +aI402 +aI-833 +aa(lp6261 +g20 +aI402 +aI-586 +aa(lp6262 +g15 +aI367 +aI-486 +aI402 +aI-545 +aI390 +aI-512 +aa(lp6263 +g15 +aI255 +aI-430 +aI344 +aI-461 +aI307 +aI-442 +aa(lp6264 +g20 +aI255 +aI-419 +aa(lp6265 +g15 +aI367 +aI-361 +aI307 +aI-406 +aI344 +aI-387 +aa(lp6266 +g15 +aI402 +aI-261 +aI390 +aI-335 +aI402 +aI-302 +aa(lp6267 +g20 +aI402 +aI-34 +aa(lp6268 +g15 +aI406 +aI21 +aI402 +aI-13 +aI403 +aI5 +aa(lp6269 +g15 +aI421 +aI62 +aI409 +aI37 +aI414 +aI51 +aa(lp6270 +g15 +aI450 +aI87 +aI428 +aI73 +aI438 +aI82 +aa(lp6271 +g15 +aI497 +aI96 +aI462 +aI93 +aI478 +aI96 +aa(lp6272 +g20 +aI549 +aI96 +aa(lp6273 +g20 +aI549 +aI167 +aa(lp6274 +g10 +aa(lp6275 +g8 +aI589 +aI0 +aa(lp6276 +g10 +aa(lp6277 +g8 +aI589 +aI0 +aasV" +(lp6278 +(lp6279 +g8 +aI380 +aI-951 +aa(lp6280 +g20 +aI587 +aI-951 +aa(lp6281 +g20 +aI541 +aI-584 +aa(lp6282 +g20 +aI453 +aI-584 +aa(lp6283 +g10 +aa(lp6284 +g8 +aI89 +aI-951 +aa(lp6285 +g20 +aI297 +aI-951 +aa(lp6286 +g20 +aI237 +aI-584 +aa(lp6287 +g20 +aI149 +aI-584 +aa(lp6288 +g10 +aa(lp6289 +g8 +aI677 +aI0 +aa(lp6290 +g10 +aa(lp6291 +g8 +aI677 +aI0 +aasV& +(lp6292 +(lp6293 +g8 +aI786 +aI0 +aa(lp6294 +g20 +aI694 +aI-97 +aa(lp6295 +g15 +aI639 +aI-52 +aI678 +aI-80 +aI659 +aI-65 +aa(lp6296 +g15 +aI572 +aI-17 +aI619 +aI-38 +aI597 +aI-27 +aa(lp6297 +g15 +aI493 +aI5 +aI548 +aI-7 +aI522 +aI0 +aa(lp6298 +g15 +aI401 +aI13 +aI465 +aI10 +aI434 +aI13 +aa(lp6299 +g15 +aI255 +aI-5 +aI346 +aI13 +aI297 +aI7 +aa(lp6300 +g15 +aI149 +aI-61 +aI213 +aI-18 +aI178 +aI-37 +aa(lp6301 +g15 +aI84 +aI-150 +aI121 +aI-85 +aI99 +aI-115 +aa(lp6302 +g15 +aI62 +aI-270 +aI69 +aI-185 +aI62 +aI-225 +aa(lp6303 +g15 +aI81 +aI-370 +aI62 +aI-309 +aI68 +aI-342 +aa(lp6304 +g15 +aI130 +aI-441 +aI93 +aI-397 +aI110 +aI-421 +aa(lp6305 +g15 +aI203 +aI-493 +aI151 +aI-462 +aI175 +aI-479 +aa(lp6306 +g15 +aI290 +aI-532 +aI231 +aI-507 +aI259 +aI-520 +aa(lp6307 +g15 +aI245 +aI-592 +aI273 +aI-553 +aI257 +aI-573 +aa(lp6308 +g15 +aI213 +aI-648 +aI232 +aI-611 +aI221 +aI-629 +aa(lp6309 +g15 +aI195 +aI-705 +aI205 +aI-667 +aI199 +aI-686 +aa(lp6310 +g15 +aI189 +aI-769 +aI191 +aI-725 +aI189 +aI-746 +aa(lp6311 +g15 +aI206 +aI-849 +aI189 +aI-798 +aI195 +aI-825 +aa(lp6312 +g15 +aI256 +aI-911 +aI217 +aI-873 +aI234 +aI-893 +aa(lp6313 +g15 +aI340 +aI-951 +aI279 +aI-928 +aI307 +aI-941 +aa(lp6314 +g15 +aI457 +aI-965 +aI373 +aI-960 +aI412 +aI-965 +aa(lp6315 +g15 +aI569 +aI-950 +aI500 +aI-965 +aI537 +aI-960 +aa(lp6316 +g15 +aI648 +aI-909 +aI601 +aI-940 +aI627 +aI-926 +aa(lp6317 +g15 +aI696 +aI-848 +aI669 +aI-891 +aI685 +aI-871 +aa(lp6318 +g15 +aI712 +aI-775 +aI706 +aI-825 +aI712 +aI-801 +aa(lp6319 +g15 +aI699 +aI-702 +aI712 +aI-748 +aI708 +aI-724 +aa(lp6320 +g15 +aI662 +aI-642 +aI691 +aI-680 +aI679 +aI-660 +aa(lp6321 +g15 +aI599 +aI-590 +aI645 +aI-624 +aI624 +aI-606 +aa(lp6322 +g15 +aI509 +aI-542 +aI573 +aI-574 +aI543 +aI-558 +aa(lp6323 +g15 +aI518 +aI-532 +aI511 +aI-539 +aI514 +aI-535 +aa(lp6324 +g20 +aI707 +aI-334 +aa(lp6325 +g15 +aI718 +aI-425 +aI713 +aI-364 +aI717 +aI-395 +aa(lp6326 +g15 +aI721 +aI-508 +aI720 +aI-455 +aI721 +aI-483 +aa(lp6327 +g20 +aI721 +aI-567 +aa(lp6328 +g20 +aI1013 +aI-567 +aa(lp6329 +g20 +aI1013 +aI-496 +aa(lp6330 +g20 +aI992 +aI-496 +aa(lp6331 +g15 +aI948 +aI-494 +aI977 +aI-496 +aI962 +aI-496 +aa(lp6332 +g15 +aI909 +aI-482 +aI934 +aI-492 +aI921 +aI-488 +aa(lp6333 +g15 +aI877 +aI-454 +aI897 +aI-476 +aI886 +aI-466 +aa(lp6334 +g15 +aI854 +aI-406 +aI867 +aI-443 +aI860 +aI-426 +aa(lp6335 +g15 +aI830 +aI-327 +aI847 +aI-381 +aI839 +aI-355 +aa(lp6336 +g15 +aI796 +aI-242 +aI821 +aI-299 +aI809 +aI-271 +aa(lp6337 +g20 +aI929 +aI-103 +aa(lp6338 +g15 +aI975 +aI-77 +aI941 +aI-90 +aI957 +aI-81 +aa(lp6339 +g15 +aI1038 +aI-70 +aI993 +aI-72 +aI1014 +aI-70 +aa(lp6340 +g20 +aI1050 +aI-70 +aa(lp6341 +g20 +aI1050 +aI0 +aa(lp6342 +g10 +aa(lp6343 +g8 +aI258 +aI-263 +aa(lp6344 +g15 +aI271 +aI-189 +aI258 +aI-237 +aI262 +aI-212 +aa(lp6345 +g15 +aI306 +aI-130 +aI279 +aI-167 +aI291 +aI-147 +aa(lp6346 +g15 +aI362 +aI-90 +aI321 +aI-113 +aI340 +aI-100 +aa(lp6347 +g15 +aI434 +aI-75 +aI384 +aI-80 +aI408 +aI-75 +aa(lp6348 +g15 +aI554 +aI-98 +aI482 +aI-75 +aI522 +aI-83 +aa(lp6349 +g15 +aI636 +aI-161 +aI587 +aI-114 +aI614 +aI-134 +aa(lp6350 +g20 +aI350 +aI-465 +aa(lp6351 +g15 +aI305 +aI-422 +aI332 +aI-451 +aI316 +aI-437 +aa(lp6352 +g15 +aI276 +aI-374 +aI293 +aI-407 +aI283 +aI-391 +aa(lp6353 +g15 +aI262 +aI-322 +aI269 +aI-358 +aI264 +aI-340 +aa(lp6354 +g15 +aI258 +aI-263 +aI259 +aI-303 +aI258 +aI-284 +aa(lp6355 +g10 +aa(lp6356 +g8 +aI550 +aI-774 +aa(lp6357 +g15 +aI546 +aI-817 +aI550 +aI-789 +aI549 +aI-804 +aa(lp6358 +g15 +aI531 +aI-853 +aI543 +aI-831 +aI538 +aI-843 +aa(lp6359 +g15 +aI503 +aI-876 +aI524 +aI-863 +aI515 +aI-870 +aa(lp6360 +g15 +aI457 +aI-884 +aI491 +aI-882 +aI475 +aI-884 +aa(lp6361 +g15 +aI418 +aI-876 +aI442 +aI-884 +aI429 +aI-882 +aa(lp6362 +g15 +aI391 +aI-853 +aI407 +aI-870 +aI398 +aI-863 +aa(lp6363 +g15 +aI375 +aI-817 +aI384 +aI-843 +aI379 +aI-831 +aa(lp6364 +g15 +aI370 +aI-772 +aI372 +aI-803 +aI370 +aI-789 +aa(lp6365 +g15 +aI375 +aI-729 +aI370 +aI-757 +aI372 +aI-743 +aa(lp6366 +g15 +aI390 +aI-688 +aI379 +aI-715 +aI384 +aI-701 +aa(lp6367 +g15 +aI416 +aI-646 +aI397 +aI-674 +aI406 +aI-660 +aa(lp6368 +g15 +aI453 +aI-602 +aI427 +aI-632 +aI439 +aI-618 +aa(lp6369 +g15 +aI500 +aI-635 +aI471 +aI-612 +aI487 +aI-623 +aa(lp6370 +g15 +aI529 +aI-673 +aI512 +aI-647 +aI522 +aI-660 +aa(lp6371 +g15 +aI545 +aI-718 +aI537 +aI-687 +aI542 +aI-702 +aa(lp6372 +g15 +aI550 +aI-774 +aI549 +aI-735 +aI550 +aI-753 +aa(lp6373 +g10 +aa(lp6374 +g8 +aI1067 +aI0 +aa(lp6375 +g10 +aa(lp6376 +g8 +aI1067 +aI0 +aasV* +(lp6377 +(lp6378 +g8 +aI46 +aI-804 +aa(lp6379 +g20 +aI106 +aI-939 +aa(lp6380 +g20 +aI305 +aI-795 +aa(lp6381 +g20 +aI261 +aI-1012 +aa(lp6382 +g20 +aI410 +aI-1012 +aa(lp6383 +g20 +aI362 +aI-798 +aa(lp6384 +g20 +aI562 +aI-937 +aa(lp6385 +g20 +aI622 +aI-803 +aa(lp6386 +g20 +aI414 +aI-751 +aa(lp6387 +g20 +aI622 +aI-698 +aa(lp6388 +g20 +aI562 +aI-565 +aa(lp6389 +g20 +aI362 +aI-704 +aa(lp6390 +g20 +aI409 +aI-489 +aa(lp6391 +g20 +aI261 +aI-489 +aa(lp6392 +g20 +aI304 +aI-705 +aa(lp6393 +g20 +aI106 +aI-564 +aa(lp6394 +g20 +aI46 +aI-696 +aa(lp6395 +g20 +aI254 +aI-751 +aa(lp6396 +g10 +aa(lp6397 +g8 +aI669 +aI0 +aa(lp6398 +g10 +aa(lp6399 +g8 +aI669 +aI0 +aasV. +(lp6400 +(lp6401 +g8 +aI93 +aI-95 +aa(lp6402 +g15 +aI101 +aI-146 +aI93 +aI-115 +aI95 +aI-132 +aa(lp6403 +g15 +aI124 +aI-179 +aI107 +aI-160 +aI114 +aI-170 +aa(lp6404 +g15 +aI159 +aI-196 +aI134 +aI-187 +aI146 +aI-193 +aa(lp6405 +g15 +aI202 +aI-202 +aI172 +aI-200 +aI187 +aI-202 +aa(lp6406 +g15 +aI244 +aI-196 +aI217 +aI-202 +aI231 +aI-200 +aa(lp6407 +g15 +aI279 +aI-179 +aI257 +aI-193 +aI269 +aI-187 +aa(lp6408 +g15 +aI303 +aI-146 +aI289 +aI-170 +aI297 +aI-160 +aa(lp6409 +g15 +aI311 +aI-95 +aI308 +aI-132 +aI311 +aI-115 +aa(lp6410 +g15 +aI303 +aI-45 +aI311 +aI-75 +aI308 +aI-58 +aa(lp6411 +g15 +aI279 +aI-12 +aI297 +aI-31 +aI289 +aI-20 +aa(lp6412 +g15 +aI244 +aI5 +aI269 +aI-4 +aI257 +aI1 +aa(lp6413 +g15 +aI202 +aI10 +aI231 +aI9 +aI217 +aI10 +aa(lp6414 +g15 +aI159 +aI5 +aI187 +aI10 +aI172 +aI9 +aa(lp6415 +g15 +aI124 +aI-12 +aI146 +aI1 +aI134 +aI-4 +aa(lp6416 +g15 +aI101 +aI-45 +aI114 +aI-20 +aI107 +aI-31 +aa(lp6417 +g15 +aI93 +aI-95 +aI95 +aI-58 +aI93 +aI-75 +aa(lp6418 +g10 +aa(lp6419 +g8 +aI405 +aI0 +aa(lp6420 +g10 +aa(lp6421 +g8 +aI405 +aI0 +aasV2 +(lp6422 +(lp6423 +g8 +aI650 +aI-743 +aa(lp6424 +g15 +aI643 +aI-683 +aI650 +aI-722 +aI648 +aI-702 +aa(lp6425 +g15 +aI620 +aI-622 +aI638 +aI-663 +aI631 +aI-643 +aa(lp6426 +g15 +aI578 +aI-556 +aI610 +aI-601 +aI596 +aI-579 +aa(lp6427 +g15 +aI514 +aI-479 +aI561 +aI-533 +aI539 +aI-507 +aa(lp6428 +g15 +aI424 +aI-386 +aI488 +aI-451 +aI458 +aI-420 +aa(lp6429 +g15 +aI306 +aI-272 +aI390 +aI-353 +aI351 +aI-315 +aa(lp6430 +g20 +aI173 +aI-146 +aa(lp6431 +g20 +aI483 +aI-146 +aa(lp6432 +g15 +aI553 +aI-169 +aI511 +aI-146 +aI534 +aI-153 +aa(lp6433 +g15 +aI594 +aI-238 +aI573 +aI-185 +aI586 +aI-208 +aa(lp6434 +g20 +aI605 +aI-279 +aa(lp6435 +g20 +aI684 +aI-279 +aa(lp6436 +g20 +aI677 +aI0 +aa(lp6437 +g20 +aI46 +aI0 +aa(lp6438 +g20 +aI46 +aI-136 +aa(lp6439 +g20 +aI244 +aI-338 +aa(lp6440 +g15 +aI345 +aI-452 +aI285 +aI-380 +aI319 +aI-418 +aa(lp6441 +g15 +aI408 +aI-549 +aI372 +aI-485 +aI393 +aI-518 +aa(lp6442 +g15 +aI440 +aI-640 +aI423 +aI-579 +aI434 +aI-610 +aa(lp6443 +g15 +aI449 +aI-737 +aI446 +aI-670 +aI449 +aI-702 +aa(lp6444 +g15 +aI421 +aI-848 +aI449 +aI-787 +aI439 +aI-825 +aa(lp6445 +g15 +aI345 +aI-883 +aI403 +aI-871 +aI377 +aI-883 +aa(lp6446 +g15 +aI250 +aI-825 +aI299 +aI-883 +aI268 +aI-864 +aa(lp6447 +g15 +aI222 +aI-653 +aI231 +aI-786 +aI222 +aI-729 +aa(lp6448 +g15 +aI153 +aI-660 +aI197 +aI-653 +aI174 +aI-655 +aa(lp6449 +g15 +aI99 +aI-683 +aI132 +aI-665 +aI114 +aI-672 +aa(lp6450 +g15 +aI64 +aI-723 +aI84 +aI-693 +aI72 +aI-707 +aa(lp6451 +g15 +aI52 +aI-784 +aI56 +aI-740 +aI52 +aI-760 +aa(lp6452 +g15 +aI70 +aI-853 +aI52 +aI-809 +aI58 +aI-832 +aa(lp6453 +g15 +aI125 +aI-911 +aI83 +aI-875 +aI101 +aI-894 +aa(lp6454 +g15 +aI217 +aI-950 +aI149 +aI-927 +aI180 +aI-940 +aa(lp6455 +g15 +aI345 +aI-965 +aI253 +aI-960 +aI296 +aI-965 +aa(lp6456 +g15 +aI476 +aI-949 +aI394 +aI-965 +aI438 +aI-959 +aa(lp6457 +g15 +aI572 +aI-905 +aI514 +aI-939 +aI546 +aI-924 +aa(lp6458 +g15 +aI630 +aI-836 +aI598 +aI-886 +aI617 +aI-863 +aa(lp6459 +g15 +aI650 +aI-743 +aI643 +aI-808 +aI650 +aI-777 +aa(lp6460 +g10 +aa(lp6461 +g8 +aI745 +aI0 +aa(lp6462 +g10 +aa(lp6463 +g8 +aI745 +aI0 +aasV6 +(lp6464 +(lp6465 +g8 +aI427 +aI-886 +aa(lp6466 +g15 +aI357 +aI-862 +aI401 +aI-886 +aI378 +aI-878 +aa(lp6467 +g15 +aI302 +aI-794 +aI336 +aI-847 +aI317 +aI-824 +aa(lp6468 +g15 +aI265 +aI-684 +aI287 +aI-764 +aI274 +aI-727 +aa(lp6469 +g15 +aI248 +aI-534 +aI256 +aI-640 +aI250 +aI-590 +aa(lp6470 +g15 +aI279 +aI-551 +aI257 +aI-540 +aI267 +aI-546 +aa(lp6471 +g15 +aI319 +aI-567 +aI291 +aI-557 +aI304 +aI-563 +aa(lp6472 +g15 +aI370 +aI-579 +aI334 +aI-572 +aI351 +aI-576 +aa(lp6473 +g15 +aI432 +aI-583 +aI388 +aI-582 +aI409 +aI-583 +aa(lp6474 +g15 +aI541 +aI-564 +aI472 +aI-583 +aI509 +aI-577 +aa(lp6475 +g15 +aI625 +aI-510 +aI574 +aI-552 +aI602 +aI-533 +aa(lp6476 +g15 +aI679 +aI-423 +aI649 +aI-486 +aI667 +aI-457 +aa(lp6477 +g15 +aI698 +aI-307 +aI692 +aI-389 +aI698 +aI-350 +aa(lp6478 +g15 +aI679 +aI-176 +aI698 +aI-259 +aI692 +aI-216 +aa(lp6479 +g15 +aI620 +aI-75 +aI666 +aI-137 +aI646 +aI-103 +aa(lp6480 +g15 +aI524 +aI-9 +aI594 +aI-47 +aI562 +aI-25 +aa(lp6481 +g15 +aI390 +aI13 +aI486 +aI5 +aI441 +aI13 +aa(lp6482 +g15 +aI255 +aI-13 +aI341 +aI13 +aI296 +aI4 +aa(lp6483 +g15 +aI151 +aI-96 +aI214 +aI-31 +aI180 +aI-59 +aa(lp6484 +g15 +aI83 +aI-237 +aI122 +aI-133 +aI100 +aI-180 +aa(lp6485 +g15 +aI59 +aI-439 +aI67 +aI-294 +aI59 +aI-361 +aa(lp6486 +g15 +aI83 +aI-645 +aI59 +aI-513 +aI67 +aI-581 +aa(lp6487 +g15 +aI153 +aI-812 +aI98 +aI-709 +aI121 +aI-764 +aa(lp6488 +g15 +aI272 +aI-924 +aI184 +aI-859 +aI224 +aI-896 +aa(lp6489 +g15 +aI440 +aI-965 +aI319 +aI-951 +aI375 +aI-965 +aa(lp6490 +g15 +aI549 +aI-952 +aI483 +aI-965 +aI519 +aI-960 +aa(lp6491 +g15 +aI622 +aI-919 +aI579 +aI-944 +aI603 +aI-933 +aa(lp6492 +g15 +aI663 +aI-872 +aI641 +aI-906 +aI654 +aI-890 +aa(lp6493 +g15 +aI675 +aI-817 +aI671 +aI-855 +aI675 +aI-837 +aa(lp6494 +g15 +aI667 +aI-778 +aI675 +aI-804 +aI672 +aI-791 +aa(lp6495 +g15 +aI639 +aI-745 +aI661 +aI-766 +aI652 +aI-755 +aa(lp6496 +g15 +aI590 +aI-722 +aI627 +aI-736 +aI611 +aI-728 +aa(lp6497 +g15 +aI516 +aI-714 +aI570 +aI-717 +aI545 +aI-714 +aa(lp6498 +g15 +aI512 +aI-774 +aI516 +aI-734 +aI514 +aI-754 +aa(lp6499 +g15 +aI498 +aI-830 +aI509 +aI-795 +aI505 +aI-813 +aa(lp6500 +g15 +aI471 +aI-870 +aI492 +aI-846 +aI483 +aI-860 +aa(lp6501 +g15 +aI427 +aI-886 +aI460 +aI-881 +aI445 +aI-886 +aa(lp6502 +g10 +aa(lp6503 +g8 +aI382 +aI-502 +aa(lp6504 +g15 +aI344 +aI-496 +aI370 +aI-502 +aI357 +aI-500 +aa(lp6505 +g15 +aI305 +aI-481 +aI330 +aI-492 +aI318 +aI-488 +aa(lp6506 +g15 +aI271 +aI-461 +aI293 +aI-475 +aI282 +aI-469 +aa(lp6507 +g15 +aI248 +aI-438 +aI261 +aI-453 +aI253 +aI-446 +aa(lp6508 +g15 +aI260 +aI-273 +aI248 +aI-374 +aI252 +aI-319 +aa(lp6509 +g15 +aI291 +aI-160 +aI267 +aI-227 +aI278 +aI-189 +aa(lp6510 +g15 +aI337 +aI-95 +aI304 +aI-130 +aI319 +aI-109 +aa(lp6511 +g15 +aI394 +aI-74 +aI355 +aI-81 +aI374 +aI-74 +aa(lp6512 +g15 +aI475 +aI-126 +aI428 +aI-74 +aI455 +aI-91 +aa(lp6513 +g15 +aI505 +aI-294 +aI495 +aI-161 +aI505 +aI-217 +aa(lp6514 +g15 +aI472 +aI-452 +aI505 +aI-366 +aI494 +aI-419 +aa(lp6515 +g15 +aI382 +aI-502 +aI450 +aI-485 +aI421 +aI-502 +aa(lp6516 +g10 +aa(lp6517 +g8 +aI745 +aI0 +aa(lp6518 +g10 +aa(lp6519 +g8 +aI745 +aI0 +aasV: +(lp6520 +(lp6521 +g8 +aI93 +aI-95 +aa(lp6522 +g15 +aI101 +aI-146 +aI93 +aI-115 +aI95 +aI-132 +aa(lp6523 +g15 +aI124 +aI-179 +aI107 +aI-160 +aI114 +aI-170 +aa(lp6524 +g15 +aI159 +aI-196 +aI134 +aI-187 +aI146 +aI-193 +aa(lp6525 +g15 +aI202 +aI-202 +aI172 +aI-200 +aI187 +aI-202 +aa(lp6526 +g15 +aI244 +aI-196 +aI217 +aI-202 +aI231 +aI-200 +aa(lp6527 +g15 +aI279 +aI-179 +aI257 +aI-193 +aI269 +aI-187 +aa(lp6528 +g15 +aI303 +aI-146 +aI289 +aI-170 +aI297 +aI-160 +aa(lp6529 +g15 +aI311 +aI-95 +aI308 +aI-132 +aI311 +aI-115 +aa(lp6530 +g15 +aI303 +aI-45 +aI311 +aI-75 +aI308 +aI-58 +aa(lp6531 +g15 +aI279 +aI-12 +aI297 +aI-31 +aI289 +aI-20 +aa(lp6532 +g15 +aI244 +aI5 +aI269 +aI-4 +aI257 +aI1 +aa(lp6533 +g15 +aI202 +aI10 +aI231 +aI9 +aI217 +aI10 +aa(lp6534 +g15 +aI159 +aI5 +aI187 +aI10 +aI172 +aI9 +aa(lp6535 +g15 +aI124 +aI-12 +aI146 +aI1 +aI134 +aI-4 +aa(lp6536 +g15 +aI101 +aI-45 +aI114 +aI-20 +aI107 +aI-31 +aa(lp6537 +g15 +aI93 +aI-95 +aI95 +aI-58 +aI93 +aI-75 +aa(lp6538 +g10 +aa(lp6539 +g8 +aI93 +aI-619 +aa(lp6540 +g15 +aI101 +aI-670 +aI93 +aI-639 +aI95 +aI-656 +aa(lp6541 +g15 +aI124 +aI-703 +aI107 +aI-684 +aI114 +aI-695 +aa(lp6542 +g15 +aI159 +aI-720 +aI134 +aI-711 +aI146 +aI-717 +aa(lp6543 +g15 +aI202 +aI-726 +aI172 +aI-724 +aI187 +aI-726 +aa(lp6544 +g15 +aI244 +aI-720 +aI217 +aI-726 +aI231 +aI-724 +aa(lp6545 +g15 +aI279 +aI-703 +aI257 +aI-717 +aI269 +aI-711 +aa(lp6546 +g15 +aI303 +aI-670 +aI289 +aI-695 +aI297 +aI-684 +aa(lp6547 +g15 +aI311 +aI-619 +aI308 +aI-656 +aI311 +aI-639 +aa(lp6548 +g15 +aI303 +aI-568 +aI311 +aI-599 +aI308 +aI-582 +aa(lp6549 +g15 +aI279 +aI-536 +aI297 +aI-555 +aI289 +aI-544 +aa(lp6550 +g15 +aI244 +aI-518 +aI269 +aI-527 +aI257 +aI-521 +aa(lp6551 +g15 +aI202 +aI-512 +aI231 +aI-514 +aI217 +aI-512 +aa(lp6552 +g15 +aI159 +aI-518 +aI187 +aI-512 +aI172 +aI-514 +aa(lp6553 +g15 +aI124 +aI-536 +aI146 +aI-521 +aI134 +aI-527 +aa(lp6554 +g15 +aI101 +aI-568 +aI114 +aI-544 +aI107 +aI-555 +aa(lp6555 +g15 +aI93 +aI-619 +aI95 +aI-582 +aI93 +aI-599 +aa(lp6556 +g10 +aa(lp6557 +g8 +aI405 +aI0 +aa(lp6558 +g10 +aa(lp6559 +g8 +aI405 +aI0 +aasV> +(lp6560 +(lp6561 +g8 +aI86 +aI-138 +aa(lp6562 +g20 +aI86 +aI-243 +aa(lp6563 +g20 +aI516 +aI-475 +aa(lp6564 +g20 +aI86 +aI-710 +aa(lp6565 +g20 +aI86 +aI-815 +aa(lp6566 +g20 +aI658 +aI-503 +aa(lp6567 +g20 +aI658 +aI-448 +aa(lp6568 +g10 +aa(lp6569 +g8 +aI745 +aI0 +aa(lp6570 +g10 +aa(lp6571 +g8 +aI745 +aI0 +aasVB +(lp6572 +(lp6573 +g8 +aI807 +aI-709 +aa(lp6574 +g15 +aI795 +aI-632 +aI807 +aI-679 +aI803 +aI-653 +aa(lp6575 +g15 +aI761 +aI-575 +aI787 +aI-610 +aI776 +aI-591 +aa(lp6576 +g15 +aI708 +aI-534 +aI746 +aI-559 +aI729 +aI-545 +aa(lp6577 +g15 +aI639 +aI-506 +aI688 +aI-523 +aI665 +aI-513 +aa(lp6578 +g20 +aI639 +aI-499 +aa(lp6579 +g15 +aI724 +aI-467 +aI670 +aI-491 +aI698 +aI-480 +aa(lp6580 +g15 +aI790 +aI-417 +aI749 +aI-453 +aI771 +aI-436 +aa(lp6581 +g15 +aI833 +aI-348 +aI808 +aI-397 +aI822 +aI-374 +aa(lp6582 +g15 +aI848 +aI-260 +aI843 +aI-322 +aI848 +aI-293 +aa(lp6583 +g15 +aI752 +aI-64 +aI848 +aI-172 +aI816 +aI-107 +aa(lp6584 +g15 +aI466 +aI0 +aI688 +aI-21 +aI593 +aI0 +aa(lp6585 +g20 +aI37 +aI0 +aa(lp6586 +g20 +aI37 +aI-70 +aa(lp6587 +g20 +aI91 +aI-70 +aa(lp6588 +g15 +aI119 +aI-73 +aI101 +aI-70 +aI111 +aI-71 +aa(lp6589 +g15 +aI141 +aI-85 +aI127 +aI-75 +aI135 +aI-79 +aa(lp6590 +g15 +aI155 +aI-111 +aI147 +aI-91 +aI152 +aI-100 +aa(lp6591 +g15 +aI161 +aI-157 +aI159 +aI-122 +aI161 +aI-138 +aa(lp6592 +g20 +aI161 +aI-795 +aa(lp6593 +g15 +aI155 +aI-839 +aI161 +aI-813 +aI159 +aI-827 +aa(lp6594 +g15 +aI140 +aI-864 +aI152 +aI-850 +aI147 +aI-858 +aa(lp6595 +g15 +aI118 +aI-877 +aI134 +aI-870 +aI127 +aI-875 +aa(lp6596 +g15 +aI91 +aI-881 +aI110 +aI-879 +aI101 +aI-881 +aa(lp6597 +g20 +aI37 +aI-881 +aa(lp6598 +g20 +aI37 +aI-951 +aa(lp6599 +g20 +aI426 +aI-951 +aa(lp6600 +g15 +aI712 +aI-892 +aI553 +aI-951 +aI648 +aI-931 +aa(lp6601 +g15 +aI807 +aI-709 +aI776 +aI-853 +aI807 +aI-792 +aa(lp6602 +g10 +aa(lp6603 +g8 +aI371 +aI-80 +aa(lp6604 +g20 +aI460 +aI-80 +aa(lp6605 +g15 +aI535 +aI-90 +aI489 +aI-80 +aI514 +aI-84 +aa(lp6606 +g15 +aI586 +aI-122 +aI556 +aI-97 +aI573 +aI-107 +aa(lp6607 +g15 +aI614 +aI-179 +aI599 +aI-136 +aI609 +aI-155 +aa(lp6608 +g15 +aI623 +aI-265 +aI620 +aI-202 +aI623 +aI-231 +aa(lp6609 +g15 +aI615 +aI-350 +aI623 +aI-297 +aI621 +aI-326 +aa(lp6610 +g15 +aI589 +aI-409 +aI610 +aI-374 +aI601 +aI-394 +aa(lp6611 +g15 +aI539 +aI-444 +aI576 +aI-425 +aI560 +aI-437 +aa(lp6612 +g15 +aI462 +aI-456 +aI519 +aI-452 +aI493 +aI-456 +aa(lp6613 +g20 +aI371 +aI-456 +aa(lp6614 +g10 +aa(lp6615 +g8 +aI371 +aI-537 +aa(lp6616 +g20 +aI422 +aI-537 +aa(lp6617 +g15 +aI500 +aI-547 +aI453 +aI-537 +aI479 +aI-541 +aa(lp6618 +g15 +aI549 +aI-577 +aI520 +aI-554 +aI537 +aI-564 +aa(lp6619 +g15 +aI576 +aI-631 +aI562 +aI-591 +aI570 +aI-609 +aa(lp6620 +g15 +aI583 +aI-709 +aI581 +aI-652 +aI583 +aI-678 +aa(lp6621 +g15 +aI575 +aI-785 +aI583 +aI-739 +aI581 +aI-764 +aa(lp6622 +g15 +aI546 +aI-834 +aI569 +aI-805 +aI559 +aI-822 +aa(lp6623 +g15 +aI496 +aI-861 +aI533 +aI-847 +aI516 +aI-856 +aa(lp6624 +g15 +aI419 +aI-869 +aI475 +aI-867 +aI449 +aI-869 +aa(lp6625 +g20 +aI371 +aI-869 +aa(lp6626 +g10 +aa(lp6627 +g8 +aI895 +aI0 +aa(lp6628 +g10 +aa(lp6629 +g8 +aI895 +aI0 +aasVF +(lp6630 +(lp6631 +g8 +aI689 +aI-705 +aa(lp6632 +g20 +aI682 +aI-770 +aa(lp6633 +g15 +aI650 +aI-846 +aI678 +aI-805 +aI667 +aI-830 +aa(lp6634 +g15 +aI583 +aI-869 +aI633 +aI-862 +aI611 +aI-869 +aa(lp6635 +g20 +aI371 +aI-869 +aa(lp6636 +g20 +aI371 +aI-506 +aa(lp6637 +g20 +aI688 +aI-506 +aa(lp6638 +g20 +aI688 +aI-427 +aa(lp6639 +g20 +aI371 +aI-427 +aa(lp6640 +g20 +aI371 +aI-157 +aa(lp6641 +g15 +aI377 +aI-111 +aI371 +aI-138 +aI373 +aI-122 +aa(lp6642 +g15 +aI391 +aI-85 +aI380 +aI-100 +aI385 +aI-91 +aa(lp6643 +g15 +aI414 +aI-73 +aI398 +aI-79 +aI405 +aI-75 +aa(lp6644 +g15 +aI441 +aI-70 +aI422 +aI-71 +aI431 +aI-70 +aa(lp6645 +g20 +aI524 +aI-70 +aa(lp6646 +g20 +aI524 +aI0 +aa(lp6647 +g20 +aI37 +aI0 +aa(lp6648 +g20 +aI37 +aI-70 +aa(lp6649 +g20 +aI93 +aI-70 +aa(lp6650 +g15 +aI119 +aI-73 +aI102 +aI-70 +aI111 +aI-71 +aa(lp6651 +g15 +aI141 +aI-83 +aI128 +aI-74 +aI135 +aI-78 +aa(lp6652 +g15 +aI156 +aI-107 +aI147 +aI-89 +aI152 +aI-97 +aa(lp6653 +g15 +aI161 +aI-149 +aI159 +aI-118 +aI161 +aI-132 +aa(lp6654 +g20 +aI161 +aI-799 +aa(lp6655 +g15 +aI156 +aI-842 +aI161 +aI-817 +aI159 +aI-831 +aa(lp6656 +g15 +aI141 +aI-866 +aI152 +aI-852 +aI147 +aI-861 +aa(lp6657 +g15 +aI119 +aI-878 +aI135 +aI-872 +aI128 +aI-876 +aa(lp6658 +g15 +aI93 +aI-881 +aI111 +aI-880 +aI102 +aI-881 +aa(lp6659 +g20 +aI37 +aI-881 +aa(lp6660 +g20 +aI37 +aI-951 +aa(lp6661 +g20 +aI776 +aI-951 +aa(lp6662 +g20 +aI782 +aI-705 +aa(lp6663 +g10 +aa(lp6664 +g8 +aI828 +aI0 +aa(lp6665 +g10 +aa(lp6666 +g8 +aI828 +aI0 +aasVJ +(lp6667 +(lp6668 +g8 +aI475 +aI-881 +aa(lp6669 +g20 +aI419 +aI-881 +aa(lp6670 +g15 +aI392 +aI-878 +aI410 +aI-881 +aI401 +aI-880 +aa(lp6671 +g15 +aI371 +aI-866 +aI384 +aI-876 +aI377 +aI-872 +aa(lp6672 +g15 +aI356 +aI-840 +aI365 +aI-860 +aI360 +aI-851 +aa(lp6673 +g15 +aI350 +aI-794 +aI352 +aI-828 +aI350 +aI-813 +aa(lp6674 +g20 +aI350 +aI3 +aa(lp6675 +g15 +aI337 +aI110 +aI350 +aI43 +aI346 +aI79 +aa(lp6676 +g15 +aI299 +aI192 +aI328 +aI141 +aI315 +aI169 +aa(lp6677 +g15 +aI241 +aI252 +aI283 +aI216 +aI264 +aI236 +aa(lp6678 +g15 +aI168 +aI292 +aI219 +aI269 +aI195 +aI282 +aa(lp6679 +g15 +aI85 +aI313 +aI142 +aI302 +aI114 +aI309 +aa(lp6680 +g15 +aI-3 +aI320 +aI56 +aI318 +aI26 +aI320 +aa(lp6681 +g20 +aI-52 +aI320 +aa(lp6682 +g20 +aI-52 +aI243 +aa(lp6683 +g20 +aI-27 +aI243 +aa(lp6684 +g15 +aI34 +aI231 +aI-6 +aI243 +aI13 +aI239 +aa(lp6685 +g15 +aI87 +aI191 +aI54 +aI223 +aI72 +aI209 +aa(lp6686 +g15 +aI125 +aI117 +aI103 +aI172 +aI116 +aI147 +aa(lp6687 +g15 +aI139 +aI4 +aI135 +aI86 +aI139 +aI49 +aa(lp6688 +g20 +aI139 +aI-799 +aa(lp6689 +g15 +aI134 +aI-842 +aI139 +aI-817 +aI138 +aI-831 +aa(lp6690 +g15 +aI120 +aI-866 +aI131 +aI-852 +aI126 +aI-861 +aa(lp6691 +g15 +aI98 +aI-878 +aI113 +aI-872 +aI106 +aI-876 +aa(lp6692 +g15 +aI72 +aI-881 +aI90 +aI-880 +aI81 +aI-881 +aa(lp6693 +g20 +aI16 +aI-881 +aa(lp6694 +g20 +aI16 +aI-951 +aa(lp6695 +g20 +aI475 +aI-951 +aa(lp6696 +g10 +aa(lp6697 +g8 +aI490 +aI0 +aa(lp6698 +g10 +aa(lp6699 +g8 +aI490 +aI0 +aasVN +(lp6700 +(lp6701 +g8 +aI781 +aI0 +aa(lp6702 +g20 +aI261 +aI-733 +aa(lp6703 +g20 +aI261 +aI-157 +aa(lp6704 +g15 +aI266 +aI-111 +aI261 +aI-138 +aI262 +aI-122 +aa(lp6705 +g15 +aI281 +aI-85 +aI270 +aI-100 +aI275 +aI-91 +aa(lp6706 +g15 +aI303 +aI-73 +aI287 +aI-79 +aI294 +aI-75 +aa(lp6707 +g15 +aI329 +aI-70 +aI311 +aI-71 +aI320 +aI-70 +aa(lp6708 +g20 +aI385 +aI-70 +aa(lp6709 +g20 +aI385 +aI0 +aa(lp6710 +g20 +aI37 +aI0 +aa(lp6711 +g20 +aI37 +aI-70 +aa(lp6712 +g20 +aI93 +aI-70 +aa(lp6713 +g15 +aI119 +aI-73 +aI102 +aI-70 +aI111 +aI-71 +aa(lp6714 +g15 +aI141 +aI-85 +aI128 +aI-75 +aI135 +aI-79 +aa(lp6715 +g15 +aI156 +aI-111 +aI147 +aI-91 +aI152 +aI-100 +aa(lp6716 +g15 +aI161 +aI-157 +aI159 +aI-122 +aI161 +aI-138 +aa(lp6717 +g20 +aI161 +aI-799 +aa(lp6718 +g15 +aI155 +aI-842 +aI161 +aI-817 +aI159 +aI-831 +aa(lp6719 +g15 +aI140 +aI-866 +aI152 +aI-852 +aI147 +aI-861 +aa(lp6720 +g15 +aI119 +aI-878 +aI134 +aI-872 +aI127 +aI-876 +aa(lp6721 +g15 +aI93 +aI-881 +aI110 +aI-880 +aI102 +aI-881 +aa(lp6722 +g20 +aI37 +aI-881 +aa(lp6723 +g20 +aI37 +aI-951 +aa(lp6724 +g20 +aI333 +aI-951 +aa(lp6725 +g20 +aI804 +aI-286 +aa(lp6726 +g20 +aI804 +aI-799 +aa(lp6727 +g15 +aI798 +aI-842 +aI804 +aI-817 +aI802 +aI-831 +aa(lp6728 +g15 +aI783 +aI-866 +aI794 +aI-852 +aI789 +aI-861 +aa(lp6729 +g15 +aI761 +aI-878 +aI777 +aI-872 +aI769 +aI-876 +aa(lp6730 +g15 +aI735 +aI-881 +aI753 +aI-880 +aI744 +aI-881 +aa(lp6731 +g20 +aI679 +aI-881 +aa(lp6732 +g20 +aI679 +aI-951 +aa(lp6733 +g20 +aI1027 +aI-951 +aa(lp6734 +g20 +aI1027 +aI-881 +aa(lp6735 +g20 +aI972 +aI-881 +aa(lp6736 +g15 +aI945 +aI-878 +aI962 +aI-881 +aI954 +aI-880 +aa(lp6737 +g15 +aI924 +aI-866 +aI937 +aI-876 +aI930 +aI-872 +aa(lp6738 +g15 +aI909 +aI-840 +aI917 +aI-860 +aI912 +aI-851 +aa(lp6739 +g15 +aI904 +aI-794 +aI906 +aI-828 +aI904 +aI-813 +aa(lp6740 +g20 +aI904 +aI0 +aa(lp6741 +g10 +aa(lp6742 +g8 +aI1050 +aI0 +aa(lp6743 +g10 +aa(lp6744 +g8 +aI1050 +aI0 +aasVR +(lp6745 +(lp6746 +g8 +aI37 +aI-70 +aa(lp6747 +g20 +aI93 +aI-70 +aa(lp6748 +g15 +aI119 +aI-73 +aI102 +aI-70 +aI110 +aI-71 +aa(lp6749 +g15 +aI140 +aI-83 +aI127 +aI-74 +aI134 +aI-78 +aa(lp6750 +g15 +aI155 +aI-107 +aI147 +aI-89 +aI152 +aI-97 +aa(lp6751 +g15 +aI161 +aI-149 +aI159 +aI-118 +aI161 +aI-132 +aa(lp6752 +g20 +aI161 +aI-799 +aa(lp6753 +g15 +aI155 +aI-842 +aI161 +aI-817 +aI159 +aI-831 +aa(lp6754 +g15 +aI140 +aI-866 +aI152 +aI-852 +aI147 +aI-861 +aa(lp6755 +g15 +aI119 +aI-878 +aI134 +aI-872 +aI127 +aI-876 +aa(lp6756 +g15 +aI93 +aI-881 +aI110 +aI-880 +aI102 +aI-881 +aa(lp6757 +g20 +aI37 +aI-881 +aa(lp6758 +g20 +aI37 +aI-951 +aa(lp6759 +g20 +aI466 +aI-951 +aa(lp6760 +g15 +aI743 +aI-888 +aI592 +aI-951 +aI685 +aI-930 +aa(lp6761 +g15 +aI832 +aI-704 +aI802 +aI-846 +aI832 +aI-784 +aa(lp6762 +g15 +aI816 +aI-610 +aI832 +aI-669 +aI826 +aI-638 +aa(lp6763 +g15 +aI775 +aI-539 +aI805 +aI-583 +aI792 +aI-559 +aa(lp6764 +g15 +aI716 +aI-487 +aI757 +aI-518 +aI738 +aI-501 +aa(lp6765 +g15 +aI650 +aI-452 +aI695 +aI-473 +aI672 +aI-461 +aa(lp6766 +g20 +aI809 +aI-179 +aa(lp6767 +g15 +aI842 +aI-130 +aI820 +aI-160 +aI831 +aI-143 +aa(lp6768 +g15 +aI874 +aI-96 +aI852 +aI-116 +aI863 +aI-105 +aa(lp6769 +g15 +aI906 +aI-76 +aI884 +aI-87 +aI895 +aI-80 +aa(lp6770 +g15 +aI942 +aI-70 +aI918 +aI-72 +aI930 +aI-70 +aa(lp6771 +g20 +aI947 +aI-70 +aa(lp6772 +g20 +aI947 +aI0 +aa(lp6773 +g20 +aI904 +aI0 +aa(lp6774 +g15 +aI799 +aI-4 +aI864 +aI0 +aI829 +aI-1 +aa(lp6775 +g15 +aI721 +aI-22 +aI770 +aI-7 +aI744 +aI-13 +aa(lp6776 +g15 +aI663 +aI-58 +aI699 +aI-30 +aI680 +aI-43 +aa(lp6777 +g15 +aI618 +aI-119 +aI647 +aI-74 +aI632 +aI-94 +aa(lp6778 +g20 +aI460 +aI-412 +aa(lp6779 +g20 +aI371 +aI-412 +aa(lp6780 +g20 +aI371 +aI-149 +aa(lp6781 +g15 +aI377 +aI-107 +aI371 +aI-132 +aI373 +aI-118 +aa(lp6782 +g15 +aI392 +aI-83 +aI380 +aI-97 +aI385 +aI-89 +aa(lp6783 +g15 +aI414 +aI-73 +aI398 +aI-78 +aI405 +aI-74 +aa(lp6784 +g15 +aI440 +aI-70 +aI422 +aI-71 +aI430 +aI-70 +aa(lp6785 +g20 +aI497 +aI-70 +aa(lp6786 +g20 +aI497 +aI0 +aa(lp6787 +g20 +aI37 +aI0 +aa(lp6788 +g10 +aa(lp6789 +g8 +aI371 +aI-490 +aa(lp6790 +g20 +aI446 +aI-490 +aa(lp6791 +g15 +aI523 +aI-502 +aI477 +aI-490 +aI503 +aI-494 +aa(lp6792 +g15 +aI573 +aI-539 +aI544 +aI-511 +aI560 +aI-523 +aa(lp6793 +g15 +aI599 +aI-600 +aI585 +aI-555 +aI594 +aI-576 +aa(lp6794 +g15 +aI608 +aI-686 +aI605 +aI-625 +aI608 +aI-653 +aa(lp6795 +g15 +aI598 +aI-772 +aI608 +aI-720 +aI605 +aI-748 +aa(lp6796 +g15 +aI570 +aI-829 +aI592 +aI-795 +aI583 +aI-814 +aa(lp6797 +g15 +aI519 +aI-862 +aI557 +aI-844 +aI540 +aI-855 +aa(lp6798 +g15 +aI444 +aI-872 +aI498 +aI-869 +aI473 +aI-872 +aa(lp6799 +g20 +aI371 +aI-872 +aa(lp6800 +g10 +aa(lp6801 +g8 +aI942 +aI0 +aa(lp6802 +g10 +aa(lp6803 +g8 +aI942 +aI0 +aasVV +(lp6804 +(lp6805 +g8 +aI930 +aI-881 +aa(lp6806 +g20 +aI866 +aI-881 +aa(lp6807 +g15 +aI850 +aI-877 +aI860 +aI-881 +aI855 +aI-879 +aa(lp6808 +g15 +aI835 +aI-862 +aI845 +aI-874 +aI840 +aI-869 +aa(lp6809 +g15 +aI820 +aI-832 +aI831 +aI-855 +aI826 +aI-845 +aa(lp6810 +g15 +aI802 +aI-783 +aI815 +aI-820 +aI809 +aI-803 +aa(lp6811 +g20 +aI530 +aI0 +aa(lp6812 +g20 +aI397 +aI0 +aa(lp6813 +g20 +aI113 +aI-816 +aa(lp6814 +g15 +aI96 +aI-848 +aI108 +aI-829 +aI103 +aI-839 +aa(lp6815 +g15 +aI75 +aI-868 +aI89 +aI-856 +aI82 +aI-863 +aa(lp6816 +g15 +aI52 +aI-878 +aI67 +aI-872 +aI59 +aI-876 +aa(lp6817 +g15 +aI30 +aI-881 +aI44 +aI-880 +aI37 +aI-881 +aa(lp6818 +g20 +aI0 +aI-881 +aa(lp6819 +g20 +aI0 +aI-951 +aa(lp6820 +g20 +aI440 +aI-951 +aa(lp6821 +g20 +aI440 +aI-881 +aa(lp6822 +g20 +aI378 +aI-881 +aa(lp6823 +g15 +aI360 +aI-878 +aI372 +aI-881 +aI366 +aI-880 +aa(lp6824 +g15 +aI343 +aI-871 +aI353 +aI-877 +aI348 +aI-874 +aa(lp6825 +g15 +aI331 +aI-857 +aI338 +aI-867 +aI334 +aI-863 +aa(lp6826 +g15 +aI326 +aI-836 +aI328 +aI-851 +aI326 +aI-845 +aa(lp6827 +g15 +aI330 +aI-807 +aI326 +aI-828 +aI328 +aI-818 +aa(lp6828 +g15 +aI338 +aI-779 +aI333 +aI-796 +aI335 +aI-786 +aa(lp6829 +g20 +aI474 +aI-368 +aa(lp6830 +g15 +aI485 +aI-333 +aI478 +aI-358 +aI481 +aI-346 +aa(lp6831 +g15 +aI496 +aI-291 +aI489 +aI-320 +aI492 +aI-305 +aa(lp6832 +g15 +aI505 +aI-247 +aI499 +aI-276 +aI502 +aI-261 +aa(lp6833 +g15 +aI511 +aI-207 +aI508 +aI-232 +aI510 +aI-219 +aa(lp6834 +g15 +aI518 +aI-237 +aI513 +aI-214 +aI515 +aI-224 +aa(lp6835 +g15 +aI529 +aI-279 +aI521 +aI-250 +aI525 +aI-264 +aa(lp6836 +g15 +aI543 +aI-324 +aI534 +aI-294 +aI538 +aI-309 +aa(lp6837 +g15 +aI555 +aI-364 +aI547 +aI-339 +aI552 +aI-352 +aa(lp6838 +g20 +aI693 +aI-770 +aa(lp6839 +g15 +aI698 +aI-786 +aI695 +aI-775 +aI696 +aI-780 +aa(lp6840 +g15 +aI704 +aI-804 +aI700 +aI-792 +aI702 +aI-798 +aa(lp6841 +g15 +aI708 +aI-821 +aI705 +aI-810 +aI706 +aI-816 +aa(lp6842 +g15 +aI709 +aI-835 +aI709 +aI-827 +aI709 +aI-832 +aa(lp6843 +g15 +aI694 +aI-869 +aI709 +aI-850 +aI704 +aI-861 +aa(lp6844 +g15 +aI656 +aI-881 +aI685 +aI-877 +aI672 +aI-881 +aa(lp6845 +g20 +aI586 +aI-881 +aa(lp6846 +g20 +aI586 +aI-951 +aa(lp6847 +g20 +aI930 +aI-951 +aa(lp6848 +g10 +aa(lp6849 +g8 +aI930 +aI0 +aa(lp6850 +g10 +aa(lp6851 +g8 +aI930 +aI0 +aasVZ +(lp6852 +(lp6853 +g8 +aI800 +aI-883 +aa(lp6854 +g20 +aI298 +aI-80 +aa(lp6855 +g20 +aI586 +aI-80 +aa(lp6856 +g15 +aI653 +aI-92 +aI613 +aI-80 +aI636 +aI-84 +aa(lp6857 +g15 +aI694 +aI-122 +aI671 +aI-99 +aI684 +aI-110 +aa(lp6858 +g15 +aI717 +aI-165 +aI705 +aI-135 +aI712 +aI-149 +aa(lp6859 +g15 +aI726 +aI-214 +aI721 +aI-181 +aI724 +aI-197 +aa(lp6860 +g20 +aI733 +aI-274 +aa(lp6861 +g20 +aI829 +aI-274 +aa(lp6862 +g20 +aI822 +aI0 +aa(lp6863 +g20 +aI55 +aI0 +aa(lp6864 +g20 +aI55 +aI-65 +aa(lp6865 +g20 +aI555 +aI-869 +aa(lp6866 +g20 +aI293 +aI-869 +aa(lp6867 +g15 +aI242 +aI-861 +aI272 +aI-869 +aI255 +aI-867 +aa(lp6868 +g15 +aI209 +aI-837 +aI228 +aI-855 +aI217 +aI-847 +aa(lp6869 +g15 +aI192 +aI-798 +aI201 +aI-826 +aI196 +aI-813 +aa(lp6870 +g15 +aI184 +aI-748 +aI188 +aI-783 +aI185 +aI-767 +aa(lp6871 +g20 +aI177 +aI-676 +aa(lp6872 +g20 +aI81 +aI-676 +aa(lp6873 +g20 +aI87 +aI-951 +aa(lp6874 +g20 +aI800 +aI-951 +aa(lp6875 +g10 +aa(lp6876 +g8 +aI888 +aI0 +aa(lp6877 +g10 +aa(lp6878 +g8 +aI888 +aI0 +aasV^ +(lp6879 +(lp6880 +g8 +aI342 +aI-951 +aa(lp6881 +g20 +aI399 +aI-951 +aa(lp6882 +g20 +aI682 +aI-349 +aa(lp6883 +g20 +aI578 +aI-349 +aa(lp6884 +g20 +aI370 +aI-806 +aa(lp6885 +g20 +aI165 +aI-349 +aa(lp6886 +g20 +aI61 +aI-349 +aa(lp6887 +g10 +aa(lp6888 +g8 +aI745 +aI0 +aa(lp6889 +g10 +aa(lp6890 +g8 +aI745 +aI0 +aasVb +(lp6891 +(lp6892 +g8 +aI802 +aI-359 +aa(lp6893 +g15 +aI784 +aI-192 +aI802 +aI-294 +aI796 +aI-239 +aa(lp6894 +g15 +aI732 +aI-76 +aI772 +aI-145 +aI755 +aI-106 +aa(lp6895 +g15 +aI646 +aI-8 +aI709 +aI-45 +aI680 +aI-22 +aa(lp6896 +g15 +aI529 +aI13 +aI612 +aI6 +aI573 +aI13 +aa(lp6897 +g15 +aI459 +aI5 +aI503 +aI13 +aI480 +aI10 +aa(lp6898 +g15 +aI403 +aI-19 +aI438 +aI0 +aI420 +aI-8 +aa(lp6899 +g15 +aI359 +aI-56 +aI386 +aI-29 +aI371 +aI-41 +aa(lp6900 +g15 +aI325 +aI-103 +aI346 +aI-70 +aI335 +aI-86 +aa(lp6901 +g20 +aI313 +aI-103 +aa(lp6902 +g20 +aI276 +aI0 +aa(lp6903 +g20 +aI22 +aI0 +aa(lp6904 +g20 +aI22 +aI-70 +aa(lp6905 +g20 +aI31 +aI-70 +aa(lp6906 +g15 +aI69 +aI-73 +aI44 +aI-70 +aI56 +aI-71 +aa(lp6907 +g15 +aI101 +aI-86 +aI81 +aI-75 +aI92 +aI-80 +aa(lp6908 +g15 +aI124 +aI-114 +aI111 +aI-93 +aI118 +aI-102 +aa(lp6909 +g15 +aI133 +aI-163 +aI130 +aI-126 +aI133 +aI-143 +aa(lp6910 +g20 +aI133 +aI-853 +aa(lp6911 +g15 +aI125 +aI-898 +aI133 +aI-872 +aI130 +aI-887 +aa(lp6912 +g15 +aI102 +aI-925 +aI119 +aI-910 +aI111 +aI-919 +aa(lp6913 +g15 +aI68 +aI-939 +aI92 +aI-932 +aI81 +aI-936 +aa(lp6914 +g15 +aI27 +aI-942 +aI55 +aI-941 +aI42 +aI-942 +aa(lp6915 +g20 +aI22 +aI-942 +aa(lp6916 +g20 +aI22 +aI-1012 +aa(lp6917 +g20 +aI335 +aI-1012 +aa(lp6918 +g20 +aI335 +aI-784 +aa(lp6919 +g15 +aI334 +aI-735 +aI335 +aI-770 +aI335 +aI-754 +aa(lp6920 +g15 +aI330 +aI-683 +aI333 +aI-717 +aI332 +aI-699 +aa(lp6921 +g15 +aI325 +aI-623 +aI328 +aI-663 +aI327 +aI-643 +aa(lp6922 +g20 +aI334 +aI-623 +aa(lp6923 +g15 +aI411 +aI-701 +aI353 +aI-656 +aI379 +aI-682 +aa(lp6924 +g15 +aI534 +aI-730 +aI443 +aI-720 +aI484 +aI-730 +aa(lp6925 +g15 +aI649 +aI-708 +aI577 +aI-730 +aI616 +aI-722 +aa(lp6926 +g15 +aI733 +aI-641 +aI682 +aI-693 +aI710 +aI-671 +aa(lp6927 +g15 +aI785 +aI-525 +aI756 +aI-610 +aI773 +aI-572 +aa(lp6928 +g15 +aI802 +aI-359 +aI796 +aI-479 +aI802 +aI-423 +aa(lp6929 +g10 +aa(lp6930 +g8 +aI472 +aI-631 +aa(lp6931 +g15 +aI406 +aI-615 +aI445 +aI-631 +aI423 +aI-626 +aa(lp6932 +g15 +aI364 +aI-564 +aI388 +aI-604 +aI375 +aI-587 +aa(lp6933 +g15 +aI342 +aI-479 +aI354 +aI-542 +aI346 +aI-513 +aa(lp6934 +g15 +aI335 +aI-359 +aI338 +aI-445 +aI335 +aI-405 +aa(lp6935 +g15 +aI342 +aI-242 +aI335 +aI-315 +aI338 +aI-276 +aa(lp6936 +g15 +aI364 +aI-156 +aI346 +aI-208 +aI354 +aI-179 +aa(lp6937 +g15 +aI406 +aI-104 +aI375 +aI-133 +aI389 +aI-115 +aa(lp6938 +g15 +aI473 +aI-86 +aI424 +aI-92 +aI446 +aI-86 +aa(lp6939 +g15 +aI568 +aI-157 +aI517 +aI-86 +aI548 +aI-109 +aa(lp6940 +g15 +aI597 +aI-360 +aI587 +aI-204 +aI597 +aI-272 +aa(lp6941 +g15 +aI568 +aI-564 +aI597 +aI-451 +aI587 +aI-519 +aa(lp6942 +g15 +aI472 +aI-631 +aI548 +aI-609 +aI516 +aI-631 +aa(lp6943 +g10 +aa(lp6944 +g8 +aI865 +aI0 +aa(lp6945 +g10 +aa(lp6946 +g8 +aI865 +aI0 +aasVf +(lp6947 +(lp6948 +g8 +aI25 +aI0 +aa(lp6949 +g20 +aI25 +aI-70 +aa(lp6950 +g20 +aI54 +aI-70 +aa(lp6951 +g15 +aI85 +aI-73 +aI64 +aI-70 +aI74 +aI-71 +aa(lp6952 +g15 +aI116 +aI-85 +aI96 +aI-75 +aI106 +aI-79 +aa(lp6953 +g15 +aI139 +aI-111 +aI125 +aI-91 +aI133 +aI-100 +aa(lp6954 +g15 +aI149 +aI-157 +aI145 +aI-122 +aI149 +aI-138 +aa(lp6955 +g20 +aI149 +aI-623 +aa(lp6956 +g20 +aI30 +aI-623 +aa(lp6957 +g20 +aI30 +aI-714 +aa(lp6958 +g20 +aI149 +aI-714 +aa(lp6959 +g20 +aI149 +aI-763 +aa(lp6960 +g15 +aI165 +aI-874 +aI149 +aI-805 +aI154 +aI-841 +aa(lp6961 +g15 +aI214 +aI-956 +aI175 +aI-906 +aI192 +aI-933 +aa(lp6962 +g15 +aI299 +aI-1007 +aI236 +aI-978 +aI265 +aI-995 +aa(lp6963 +g15 +aI421 +aI-1024 +aI333 +aI-1019 +aI374 +aI-1024 +aa(lp6964 +g15 +aI528 +aI-1017 +aI464 +aI-1024 +aI499 +aI-1022 +aa(lp6965 +g15 +aI597 +aI-996 +aI557 +aI-1012 +aI580 +aI-1005 +aa(lp6966 +g15 +aI633 +aI-965 +aI613 +aI-987 +aI625 +aI-977 +aa(lp6967 +g15 +aI643 +aI-927 +aI640 +aI-953 +aI643 +aI-941 +aa(lp6968 +g15 +aI603 +aI-861 +aI643 +aI-897 +aI630 +aI-875 +aa(lp6969 +g15 +aI479 +aI-840 +aI576 +aI-847 +aI534 +aI-840 +aa(lp6970 +g15 +aI476 +aI-875 +aI479 +aI-851 +aI478 +aI-863 +aa(lp6971 +g15 +aI465 +aI-911 +aI474 +aI-888 +aI470 +aI-900 +aa(lp6972 +g15 +aI444 +aI-938 +aI460 +aI-921 +aI453 +aI-930 +aa(lp6973 +g15 +aI413 +aI-948 +aI436 +aI-945 +aI425 +aI-948 +aa(lp6974 +g15 +aI385 +aI-939 +aI402 +aI-948 +aI393 +aI-945 +aa(lp6975 +g15 +aI366 +aI-911 +aI377 +aI-934 +aI371 +aI-924 +aa(lp6976 +g15 +aI355 +aI-862 +aI361 +aI-899 +aI357 +aI-882 +aa(lp6977 +g15 +aI352 +aI-787 +aI353 +aI-841 +aI352 +aI-816 +aa(lp6978 +g20 +aI352 +aI-714 +aa(lp6979 +g20 +aI535 +aI-714 +aa(lp6980 +g20 +aI535 +aI-623 +aa(lp6981 +g20 +aI352 +aI-623 +aa(lp6982 +g20 +aI352 +aI-157 +aa(lp6983 +g15 +aI361 +aI-111 +aI352 +aI-138 +aI355 +aI-122 +aa(lp6984 +g15 +aI385 +aI-85 +aI367 +aI-100 +aI375 +aI-91 +aa(lp6985 +g15 +aI415 +aI-73 +aI394 +aI-79 +aI404 +aI-75 +aa(lp6986 +g15 +aI446 +aI-70 +aI426 +aI-71 +aI437 +aI-70 +aa(lp6987 +g20 +aI509 +aI-70 +aa(lp6988 +g20 +aI509 +aI0 +aa(lp6989 +g10 +aa(lp6990 +g8 +aI542 +aI0 +aa(lp6991 +g10 +aa(lp6992 +g8 +aI542 +aI0 +aasVj +(lp6993 +(lp6994 +g8 +aI335 +aI-714 +aa(lp6995 +g20 +aI335 +aI10 +aa(lp6996 +g15 +aI310 +aI160 +aI335 +aI70 +aI327 +aI120 +aa(lp6997 +g15 +aI241 +aI255 +aI294 +aI199 +aI270 +aI231 +aa(lp6998 +g15 +aI135 +aI305 +aI211 +aI278 +aI176 +aI295 +aa(lp6999 +g15 +aI0 +aI320 +aI94 +aI315 +aI49 +aI320 +aa(lp7000 +g20 +aI-26 +aI320 +aa(lp7001 +g20 +aI-26 +aI238 +aa(lp7002 +g20 +aI-17 +aI238 +aa(lp7003 +g15 +aI47 +aI226 +aI6 +aI238 +aI28 +aI234 +aa(lp7004 +g15 +aI94 +aI187 +aI66 +aI218 +aI81 +aI205 +aa(lp7005 +g15 +aI123 +aI114 +aI107 +aI169 +aI117 +aI144 +aa(lp7006 +g15 +aI133 +aI0 +aI130 +aI84 +aI133 +aI46 +aa(lp7007 +g20 +aI133 +aI-555 +aa(lp7008 +g15 +aI125 +aI-601 +aI133 +aI-574 +aI130 +aI-589 +aa(lp7009 +g15 +aI101 +aI-628 +aI119 +aI-612 +aI111 +aI-621 +aa(lp7010 +g15 +aI67 +aI-640 +aI92 +aI-634 +aI80 +aI-638 +aa(lp7011 +g15 +aI26 +aI-643 +aI54 +aI-642 +aI41 +aI-643 +aa(lp7012 +g20 +aI22 +aI-643 +aa(lp7013 +g20 +aI22 +aI-714 +aa(lp7014 +g10 +aa(lp7015 +g8 +aI115 +aI-930 +aa(lp7016 +g15 +aI124 +aI-974 +aI115 +aI-947 +aI118 +aI-962 +aa(lp7017 +g15 +aI148 +aI-1003 +aI130 +aI-986 +aI138 +aI-996 +aa(lp7018 +g15 +aI184 +aI-1020 +aI158 +aI-1011 +aI170 +aI-1017 +aa(lp7019 +g15 +aI229 +aI-1026 +aI198 +aI-1024 +aI213 +aI-1026 +aa(lp7020 +g15 +aI272 +aI-1020 +aI244 +aI-1026 +aI258 +aI-1024 +aa(lp7021 +g15 +aI309 +aI-1003 +aI286 +aI-1017 +aI298 +aI-1011 +aa(lp7022 +g15 +aI334 +aI-974 +aI319 +aI-996 +aI328 +aI-986 +aa(lp7023 +g15 +aI343 +aI-930 +aI340 +aI-962 +aI343 +aI-947 +aa(lp7024 +g15 +aI334 +aI-887 +aI343 +aI-914 +aI340 +aI-899 +aa(lp7025 +g15 +aI309 +aI-857 +aI328 +aI-875 +aI319 +aI-865 +aa(lp7026 +g15 +aI272 +aI-840 +aI298 +aI-849 +aI286 +aI-843 +aa(lp7027 +g15 +aI229 +aI-834 +aI258 +aI-836 +aI244 +aI-834 +aa(lp7028 +g15 +aI184 +aI-840 +aI213 +aI-834 +aI198 +aI-836 +aa(lp7029 +g15 +aI148 +aI-857 +aI170 +aI-843 +aI158 +aI-849 +aa(lp7030 +g15 +aI124 +aI-887 +aI138 +aI-865 +aI130 +aI-875 +aa(lp7031 +g15 +aI115 +aI-930 +aI118 +aI-899 +aI115 +aI-914 +aa(lp7032 +g10 +aa(lp7033 +g8 +aI460 +aI0 +aa(lp7034 +g10 +aa(lp7035 +g8 +aI460 +aI0 +aasVn +(lp7036 +(lp7037 +g8 +aI558 +aI0 +aa(lp7038 +g20 +aI558 +aI-438 +aa(lp7039 +g15 +aI553 +aI-514 +aI558 +aI-466 +aI556 +aI-492 +aa(lp7040 +g15 +aI534 +aI-571 +aI549 +aI-537 +aI543 +aI-555 +aa(lp7041 +g15 +aI501 +aI-605 +aI526 +aI-586 +aI515 +aI-597 +aa(lp7042 +g15 +aI451 +aI-618 +aI487 +aI-614 +aI471 +aI-618 +aa(lp7043 +g15 +aI396 +aI-601 +aI429 +aI-618 +aI411 +aI-612 +aa(lp7044 +g15 +aI361 +aI-555 +aI381 +aI-589 +aI369 +aI-574 +aa(lp7045 +g15 +aI341 +aI-490 +aI352 +aI-536 +aI345 +aI-515 +aa(lp7046 +g15 +aI335 +aI-411 +aI337 +aI-465 +aI335 +aI-439 +aa(lp7047 +g20 +aI335 +aI-157 +aa(lp7048 +g15 +aI342 +aI-112 +aI335 +aI-138 +aI338 +aI-123 +aa(lp7049 +g15 +aI361 +aI-85 +aI347 +aI-100 +aI353 +aI-92 +aa(lp7050 +g15 +aI392 +aI-73 +aI370 +aI-79 +aI380 +aI-75 +aa(lp7051 +g15 +aI432 +aI-70 +aI404 +aI-71 +aI417 +aI-70 +aa(lp7052 +g20 +aI436 +aI-70 +aa(lp7053 +g20 +aI436 +aI0 +aa(lp7054 +g20 +aI26 +aI0 +aa(lp7055 +g20 +aI26 +aI-70 +aa(lp7056 +g20 +aI29 +aI-70 +aa(lp7057 +g15 +aI70 +aI-73 +aI44 +aI-70 +aI58 +aI-71 +aa(lp7058 +g15 +aI103 +aI-86 +aI83 +aI-75 +aI94 +aI-79 +aa(lp7059 +g15 +aI125 +aI-114 +aI113 +aI-92 +aI120 +aI-101 +aa(lp7060 +g15 +aI133 +aI-162 +aI130 +aI-126 +aI133 +aI-142 +aa(lp7061 +g20 +aI133 +aI-556 +aa(lp7062 +g15 +aI126 +aI-601 +aI133 +aI-575 +aI131 +aI-590 +aa(lp7063 +g15 +aI107 +aI-628 +aI122 +aI-613 +aI115 +aI-621 +aa(lp7064 +g15 +aI76 +aI-640 +aI98 +aI-634 +aI88 +aI-638 +aa(lp7065 +g15 +aI37 +aI-643 +aI65 +aI-642 +aI51 +aI-643 +aa(lp7066 +g20 +aI33 +aI-643 +aa(lp7067 +g20 +aI33 +aI-714 +aa(lp7068 +g20 +aI313 +aI-714 +aa(lp7069 +g20 +aI330 +aI-619 +aa(lp7070 +g20 +aI337 +aI-619 +aa(lp7071 +g15 +aI379 +aI-679 +aI350 +aI-644 +aI364 +aI-664 +aa(lp7072 +g15 +aI427 +aI-713 +aI394 +aI-693 +aI410 +aI-705 +aa(lp7073 +g15 +aI481 +aI-728 +aI444 +aI-720 +aI462 +aI-725 +aa(lp7074 +g15 +aI541 +aI-731 +aI500 +aI-730 +aI520 +aI-731 +aa(lp7075 +g15 +aI633 +aI-716 +aI575 +aI-731 +aI606 +aI-726 +aa(lp7076 +g15 +aI702 +aI-670 +aI660 +aI-706 +aI683 +aI-690 +aa(lp7077 +g15 +aI746 +aI-590 +aI721 +aI-649 +aI736 +aI-622 +aa(lp7078 +g15 +aI761 +aI-474 +aI756 +aI-558 +aI761 +aI-519 +aa(lp7079 +g20 +aI761 +aI-164 +aa(lp7080 +g15 +aI766 +aI-115 +aI761 +aI-144 +aI762 +aI-127 +aa(lp7081 +g15 +aI783 +aI-86 +aI770 +aI-102 +aI775 +aI-93 +aa(lp7082 +g15 +aI811 +aI-73 +aI790 +aI-80 +aI799 +aI-75 +aa(lp7083 +g15 +aI850 +aI-70 +aI822 +aI-71 +aI835 +aI-70 +aa(lp7084 +g20 +aI854 +aI-70 +aa(lp7085 +g20 +aI854 +aI0 +aa(lp7086 +g10 +aa(lp7087 +g8 +aI889 +aI0 +aa(lp7088 +g10 +aa(lp7089 +g8 +aI889 +aI0 +aasVr +(lp7090 +(lp7091 +g8 +aI472 +aI0 +aa(lp7092 +g20 +aI26 +aI0 +aa(lp7093 +g20 +aI26 +aI-70 +aa(lp7094 +g20 +aI30 +aI-70 +aa(lp7095 +g15 +aI72 +aI-73 +aI45 +aI-70 +aI59 +aI-71 +aa(lp7096 +g15 +aI104 +aI-87 +aI84 +aI-75 +aI95 +aI-80 +aa(lp7097 +g15 +aI125 +aI-116 +aI113 +aI-93 +aI120 +aI-103 +aa(lp7098 +g15 +aI133 +aI-166 +aI130 +aI-128 +aI133 +aI-145 +aa(lp7099 +g20 +aI133 +aI-552 +aa(lp7100 +g15 +aI126 +aI-600 +aI133 +aI-572 +aI131 +aI-588 +aa(lp7101 +g15 +aI107 +aI-627 +aI122 +aI-612 +aI115 +aI-621 +aa(lp7102 +g15 +aI76 +aI-640 +aI98 +aI-634 +aI88 +aI-638 +aa(lp7103 +g15 +aI37 +aI-643 +aI65 +aI-642 +aI51 +aI-643 +aa(lp7104 +g20 +aI33 +aI-643 +aa(lp7105 +g20 +aI33 +aI-714 +aa(lp7106 +g20 +aI302 +aI-714 +aa(lp7107 +g20 +aI329 +aI-610 +aa(lp7108 +g20 +aI335 +aI-610 +aa(lp7109 +g15 +aI364 +aI-662 +aI344 +aI-630 +aI354 +aI-647 +aa(lp7110 +g15 +aI402 +aI-700 +aI375 +aI-677 +aI387 +aI-690 +aa(lp7111 +g15 +aI453 +aI-722 +aI416 +aI-710 +aI433 +aI-717 +aa(lp7112 +g15 +aI524 +aI-730 +aI473 +aI-727 +aI496 +aI-730 +aa(lp7113 +g15 +aI639 +aI-702 +aI576 +aI-730 +aI615 +aI-720 +aa(lp7114 +g15 +aI677 +aI-621 +aI664 +aI-683 +aI677 +aI-657 +aa(lp7115 +g15 +aI632 +aI-526 +aI677 +aI-581 +aI662 +aI-549 +aa(lp7116 +g15 +aI507 +aI-493 +aI603 +aI-504 +aI561 +aI-493 +aa(lp7117 +g15 +aI504 +aI-541 +aI507 +aI-511 +aI506 +aI-527 +aa(lp7118 +g15 +aI494 +aI-575 +aI502 +aI-555 +aI499 +aI-566 +aa(lp7119 +g15 +aI474 +aI-596 +aI489 +aI-584 +aI482 +aI-591 +aa(lp7120 +g15 +aI442 +aI-603 +aI465 +aI-601 +aI455 +aI-603 +aa(lp7121 +g15 +aI402 +aI-591 +aI427 +aI-603 +aI413 +aI-599 +aa(lp7122 +g15 +aI373 +aI-561 +aI391 +aI-584 +aI381 +aI-574 +aa(lp7123 +g15 +aI354 +aI-519 +aI365 +aI-549 +aI359 +aI-535 +aa(lp7124 +g15 +aI342 +aI-472 +aI349 +aI-504 +aI345 +aI-488 +aa(lp7125 +g15 +aI337 +aI-427 +aI339 +aI-456 +aI338 +aI-441 +aa(lp7126 +g15 +aI335 +aI-390 +aI336 +aI-412 +aI335 +aI-400 +aa(lp7127 +g20 +aI335 +aI-159 +aa(lp7128 +g15 +aI343 +aI-112 +aI335 +aI-140 +aI338 +aI-124 +aa(lp7129 +g15 +aI362 +aI-85 +aI347 +aI-100 +aI354 +aI-91 +aa(lp7130 +g15 +aI392 +aI-73 +aI370 +aI-79 +aI380 +aI-75 +aa(lp7131 +g15 +aI429 +aI-70 +aI403 +aI-71 +aI416 +aI-70 +aa(lp7132 +g20 +aI472 +aI-70 +aa(lp7133 +g10 +aa(lp7134 +g8 +aI697 +aI0 +aa(lp7135 +g10 +aa(lp7136 +g8 +aI697 +aI0 +aasVv +(lp7137 +(lp7138 +g8 +aI807 +aI-643 +aa(lp7139 +g20 +aI781 +aI-643 +aa(lp7140 +g15 +aI756 +aI-640 +aI772 +aI-643 +aI763 +aI-642 +aa(lp7141 +g15 +aI736 +aI-626 +aI749 +aI-638 +aI742 +aI-633 +aa(lp7142 +g15 +aI716 +aI-597 +aI729 +aI-620 +aI722 +aI-610 +aa(lp7143 +g15 +aI694 +aI-546 +aI709 +aI-584 +aI702 +aI-567 +aa(lp7144 +g20 +aI501 +aI0 +aa(lp7145 +g20 +aI325 +aI0 +aa(lp7146 +g20 +aI106 +aI-579 +aa(lp7147 +g15 +aI90 +aI-610 +aI101 +aI-592 +aI96 +aI-602 +aa(lp7148 +g15 +aI68 +aI-630 +aI83 +aI-619 +aI76 +aI-625 +aa(lp7149 +g15 +aI38 +aI-640 +aI59 +aI-635 +aI49 +aI-638 +aa(lp7150 +g15 +aI0 +aI-643 +aI27 +aI-642 +aI14 +aI-643 +aa(lp7151 +g20 +aI0 +aI-714 +aa(lp7152 +g20 +aI413 +aI-714 +aa(lp7153 +g20 +aI413 +aI-643 +aa(lp7154 +g20 +aI357 +aI-643 +aa(lp7155 +g15 +aI325 +aI-632 +aI343 +aI-643 +aI333 +aI-639 +aa(lp7156 +g15 +aI313 +aI-601 +aI317 +aI-625 +aI313 +aI-614 +aa(lp7157 +g15 +aI317 +aI-569 +aI313 +aI-590 +aI314 +aI-579 +aa(lp7158 +g15 +aI325 +aI-542 +aI320 +aI-558 +aI322 +aI-549 +aa(lp7159 +g20 +aI414 +aI-289 +aa(lp7160 +g15 +aI443 +aI-204 +aI425 +aI-261 +aI435 +aI-233 +aa(lp7161 +g15 +aI461 +aI-127 +aI451 +aI-175 +aI457 +aI-150 +aa(lp7162 +g15 +aI470 +aI-164 +aI463 +aI-138 +aI466 +aI-150 +aa(lp7163 +g15 +aI482 +aI-204 +aI474 +aI-178 +aI478 +aI-191 +aa(lp7164 +g15 +aI493 +aI-241 +aI486 +aI-218 +aI489 +aI-230 +aa(lp7165 +g15 +aI500 +aI-263 +aI496 +aI-251 +aI498 +aI-259 +aa(lp7166 +g20 +aI590 +aI-531 +aa(lp7167 +g15 +aI601 +aI-568 +aI594 +aI-543 +aI598 +aI-555 +aa(lp7168 +g15 +aI605 +aI-605 +aI604 +aI-580 +aI605 +aI-592 +aa(lp7169 +g15 +aI590 +aI-635 +aI605 +aI-619 +aI600 +aI-629 +aa(lp7170 +g15 +aI553 +aI-643 +aI581 +aI-640 +aI568 +aI-643 +aa(lp7171 +g20 +aI514 +aI-643 +aa(lp7172 +g20 +aI514 +aI-714 +aa(lp7173 +g20 +aI807 +aI-714 +aa(lp7174 +g10 +aa(lp7175 +g8 +aI807 +aI0 +aa(lp7176 +g10 +aa(lp7177 +g8 +aI807 +aI0 +aasVz +(lp7178 +(lp7179 +g8 +aI490 +aI-90 +aa(lp7180 +g15 +aI525 +aI-95 +aI504 +aI-90 +aI515 +aI-91 +aa(lp7181 +g15 +aI549 +aI-114 +aI534 +aI-99 +aI542 +aI-106 +aa(lp7182 +g15 +aI566 +aI-148 +aI555 +aI-123 +aI561 +aI-134 +aa(lp7183 +g15 +aI578 +aI-198 +aI570 +aI-161 +aI574 +aI-178 +aa(lp7184 +g20 +aI586 +aI-241 +aa(lp7185 +g20 +aI665 +aI-241 +aa(lp7186 +g20 +aI658 +aI0 +aa(lp7187 +g20 +aI24 +aI0 +aa(lp7188 +g20 +aI24 +aI-54 +aa(lp7189 +g20 +aI417 +aI-623 +aa(lp7190 +g20 +aI222 +aI-623 +aa(lp7191 +g15 +aI196 +aI-619 +aI212 +aI-623 +aI203 +aI-621 +aa(lp7192 +g15 +aI176 +aI-604 +aI189 +aI-616 +aI182 +aI-611 +aa(lp7193 +g15 +aI160 +aI-575 +aI170 +aI-596 +aI165 +aI-587 +aa(lp7194 +g15 +aI146 +aI-530 +aI156 +aI-563 +aI151 +aI-548 +aa(lp7195 +g20 +aI138 +aI-498 +aa(lp7196 +g20 +aI58 +aI-498 +aa(lp7197 +g20 +aI74 +aI-714 +aa(lp7198 +g20 +aI650 +aI-714 +aa(lp7199 +g20 +aI650 +aI-657 +aa(lp7200 +g20 +aI255 +aI-90 +aa(lp7201 +g10 +aa(lp7202 +g8 +aI705 +aI0 +aa(lp7203 +g10 +aa(lp7204 +g8 +aI705 +aI0 +aasV~ +(lp7205 +(lp7206 +g8 +aI352 +aI-431 +aa(lp7207 +g15 +aI309 +aI-449 +aI336 +aI-438 +aI322 +aI-444 +aa(lp7208 +g15 +aI277 +aI-460 +aI297 +aI-453 +aI286 +aI-457 +aa(lp7209 +g15 +aI249 +aI-466 +aI267 +aI-462 +aI257 +aI-464 +aa(lp7210 +g15 +aI221 +aI-467 +aI240 +aI-467 +aI230 +aI-467 +aa(lp7211 +g15 +aI183 +aI-461 +aI209 +aI-467 +aI196 +aI-465 +aa(lp7212 +g15 +aI144 +aI-444 +aI170 +aI-457 +aI157 +aI-451 +aa(lp7213 +g15 +aI107 +aI-420 +aI132 +aI-437 +aI119 +aI-429 +aa(lp7214 +g15 +aI73 +aI-388 +aI95 +aI-410 +aI83 +aI-400 +aa(lp7215 +g20 +aI73 +aI-491 +aa(lp7216 +g15 +aI234 +aI-562 +aI116 +aI-538 +aI170 +aI-562 +aa(lp7217 +g15 +aI269 +aI-560 +aI246 +aI-562 +aI258 +aI-561 +aa(lp7218 +g15 +aI303 +aI-554 +aI280 +aI-559 +aI291 +aI-557 +aa(lp7219 +g15 +aI343 +aI-542 +aI315 +aI-551 +aI328 +aI-547 +aa(lp7220 +g15 +aI395 +aI-521 +aI357 +aI-536 +aI375 +aI-529 +aa(lp7221 +g15 +aI438 +aI-503 +aI411 +aI-514 +aI425 +aI-508 +aa(lp7222 +g15 +aI471 +aI-492 +aI450 +aI-498 +aI461 +aI-494 +aa(lp7223 +g15 +aI499 +aI-486 +aI481 +aI-489 +aI490 +aI-487 +aa(lp7224 +g15 +aI526 +aI-484 +aI508 +aI-485 +aI517 +aI-484 +aa(lp7225 +g15 +aI564 +aI-490 +aI539 +aI-484 +aI551 +aI-486 +aa(lp7226 +g15 +aI603 +aI-507 +aI577 +aI-494 +aI590 +aI-500 +aa(lp7227 +g15 +aI640 +aI-532 +aI615 +aI-514 +aI628 +aI-523 +aa(lp7228 +g15 +aI674 +aI-563 +aI652 +aI-542 +aI664 +aI-552 +aa(lp7229 +g20 +aI674 +aI-461 +aa(lp7230 +g15 +aI513 +aI-390 +aI631 +aI-413 +aI578 +aI-390 +aa(lp7231 +g15 +aI478 +aI-391 +aI500 +aI-390 +aI488 +aI-390 +aa(lp7232 +g15 +aI444 +aI-397 +aI467 +aI-392 +aI456 +aI-394 +aa(lp7233 +g15 +aI404 +aI-410 +aI432 +aI-401 +aI419 +aI-405 +aa(lp7234 +g15 +aI352 +aI-431 +aI390 +aI-416 +aI372 +aI-423 +aa(lp7235 +g10 +aa(lp7236 +g8 +aI748 +aI0 +aa(lp7237 +g10 +aa(lp7238 +g8 +aI748 +aI0 +aasV! +(lp7239 +(lp7240 +g8 +aI138 +aI-951 +aa(lp7241 +g20 +aI370 +aI-951 +aa(lp7242 +g20 +aI292 +aI-303 +aa(lp7243 +g20 +aI217 +aI-303 +aa(lp7244 +g10 +aa(lp7245 +g8 +aI146 +aI-95 +aa(lp7246 +g15 +aI154 +aI-146 +aI146 +aI-115 +aI149 +aI-132 +aa(lp7247 +g15 +aI178 +aI-179 +aI160 +aI-160 +aI168 +aI-170 +aa(lp7248 +g15 +aI212 +aI-196 +aI187 +aI-187 +aI199 +aI-193 +aa(lp7249 +g15 +aI255 +aI-202 +aI226 +aI-200 +aI240 +aI-202 +aa(lp7250 +g15 +aI297 +aI-196 +aI270 +aI-202 +aI284 +aI-200 +aa(lp7251 +g15 +aI332 +aI-179 +aI311 +aI-193 +aI322 +aI-187 +aa(lp7252 +g15 +aI356 +aI-146 +aI342 +aI-170 +aI350 +aI-160 +aa(lp7253 +g15 +aI365 +aI-95 +aI362 +aI-132 +aI365 +aI-115 +aa(lp7254 +g15 +aI356 +aI-45 +aI365 +aI-75 +aI362 +aI-58 +aa(lp7255 +g15 +aI332 +aI-12 +aI350 +aI-31 +aI342 +aI-20 +aa(lp7256 +g15 +aI297 +aI5 +aI322 +aI-4 +aI311 +aI1 +aa(lp7257 +g15 +aI255 +aI10 +aI284 +aI9 +aI270 +aI10 +aa(lp7258 +g15 +aI212 +aI5 +aI240 +aI10 +aI226 +aI9 +aa(lp7259 +g15 +aI178 +aI-12 +aI199 +aI1 +aI187 +aI-4 +aa(lp7260 +g15 +aI154 +aI-45 +aI168 +aI-20 +aI160 +aI-31 +aa(lp7261 +g15 +aI146 +aI-95 +aI149 +aI-58 +aI146 +aI-75 +aa(lp7262 +g10 +aa(lp7263 +g8 +aI509 +aI0 +aa(lp7264 +g10 +aa(lp7265 +g8 +aI509 +aI0 +aasV% +(lp7266 +(lp7267 +g8 +aI525 +aI-670 +aa(lp7268 +g15 +aI510 +aI-548 +aI525 +aI-625 +aI520 +aI-584 +aa(lp7269 +g15 +aI465 +aI-454 +aI500 +aI-511 +aI485 +aI-480 +aa(lp7270 +g15 +aI390 +aI-394 +aI446 +aI-428 +aI421 +aI-408 +aa(lp7271 +g15 +aI285 +aI-372 +aI360 +aI-379 +aI325 +aI-372 +aa(lp7272 +g15 +aI176 +aI-394 +aI243 +aI-372 +aI206 +aI-379 +aa(lp7273 +g15 +aI101 +aI-454 +aI146 +aI-408 +aI121 +aI-428 +aa(lp7274 +g15 +aI59 +aI-548 +aI82 +aI-480 +aI68 +aI-511 +aa(lp7275 +g15 +aI45 +aI-670 +aI50 +aI-584 +aI45 +aI-625 +aa(lp7276 +g15 +aI59 +aI-791 +aI45 +aI-714 +aI50 +aI-755 +aa(lp7277 +g15 +aI102 +aI-884 +aI68 +aI-827 +aI82 +aI-858 +aa(lp7278 +g15 +aI177 +aI-944 +aI121 +aI-910 +aI146 +aI-930 +aa(lp7279 +g15 +aI286 +aI-965 +aI207 +aI-958 +aI243 +aI-965 +aa(lp7280 +g15 +aI391 +aI-944 +aI326 +aI-965 +aI361 +aI-958 +aa(lp7281 +g15 +aI466 +aI-884 +aI421 +aI-930 +aI446 +aI-910 +aa(lp7282 +g15 +aI510 +aI-791 +aI486 +aI-858 +aI500 +aI-827 +aa(lp7283 +g15 +aI525 +aI-670 +aI520 +aI-755 +aI525 +aI-714 +aa(lp7284 +g10 +aa(lp7285 +g8 +aI195 +aI-670 +aa(lp7286 +g15 +aI200 +aI-572 +aI195 +aI-633 +aI197 +aI-601 +aa(lp7287 +g15 +aI216 +aI-500 +aI204 +aI-544 +aI209 +aI-520 +aa(lp7288 +g15 +aI243 +aI-455 +aI223 +aI-480 +aI232 +aI-465 +aa(lp7289 +g15 +aI285 +aI-439 +aI255 +aI-444 +aI269 +aI-439 +aa(lp7290 +g15 +aI327 +aI-455 +aI302 +aI-439 +aI316 +aI-444 +aa(lp7291 +g15 +aI354 +aI-500 +aI338 +aI-465 +aI347 +aI-480 +aa(lp7292 +g15 +aI368 +aI-572 +aI361 +aI-520 +aI365 +aI-544 +aa(lp7293 +g15 +aI373 +aI-670 +aI371 +aI-601 +aI373 +aI-633 +aa(lp7294 +g15 +aI368 +aI-765 +aI373 +aI-705 +aI371 +aI-737 +aa(lp7295 +g15 +aI354 +aI-836 +aI365 +aI-793 +aI361 +aI-817 +aa(lp7296 +g15 +aI327 +aI-881 +aI347 +aI-856 +aI338 +aI-871 +aa(lp7297 +g15 +aI286 +aI-896 +aI316 +aI-891 +aI302 +aI-896 +aa(lp7298 +g15 +aI244 +aI-881 +aI269 +aI-896 +aI255 +aI-891 +aa(lp7299 +g15 +aI216 +aI-836 +aI232 +aI-871 +aI223 +aI-856 +aa(lp7300 +g15 +aI200 +aI-765 +aI209 +aI-817 +aI204 +aI-793 +aa(lp7301 +g15 +aI195 +aI-670 +aI197 +aI-737 +aI195 +aI-705 +aa(lp7302 +g10 +aa(lp7303 +g8 +aI423 +aI0 +aa(lp7304 +g20 +aI320 +aI0 +aa(lp7305 +g20 +aI779 +aI-951 +aa(lp7306 +g20 +aI882 +aI-951 +aa(lp7307 +g10 +aa(lp7308 +g8 +aI1162 +aI-283 +aa(lp7309 +g15 +aI1147 +aI-161 +aI1162 +aI-238 +aI1157 +aI-198 +aa(lp7310 +g15 +aI1103 +aI-67 +aI1137 +aI-125 +aI1122 +aI-93 +aa(lp7311 +g15 +aI1028 +aI-7 +aI1083 +aI-41 +aI1058 +aI-21 +aa(lp7312 +g15 +aI922 +aI13 +aI998 +aI6 +aI962 +aI13 +aa(lp7313 +g15 +aI813 +aI-7 +aI880 +aI13 +aI844 +aI6 +aa(lp7314 +g15 +aI739 +aI-67 +aI783 +aI-21 +aI758 +aI-41 +aa(lp7315 +g15 +aI696 +aI-161 +aI719 +aI-93 +aI705 +aI-125 +aa(lp7316 +g15 +aI682 +aI-283 +aI687 +aI-198 +aI682 +aI-238 +aa(lp7317 +g15 +aI696 +aI-404 +aI682 +aI-328 +aI687 +aI-368 +aa(lp7318 +g15 +aI739 +aI-497 +aI705 +aI-441 +aI720 +aI-472 +aa(lp7319 +g15 +aI814 +aI-557 +aI759 +aI-523 +aI784 +aI-543 +aa(lp7320 +g15 +aI923 +aI-578 +aI844 +aI-571 +aI881 +aI-578 +aa(lp7321 +g15 +aI1028 +aI-557 +aI963 +aI-578 +aI998 +aI-571 +aa(lp7322 +g15 +aI1103 +aI-497 +aI1058 +aI-543 +aI1083 +aI-523 +aa(lp7323 +g15 +aI1148 +aI-404 +aI1123 +aI-472 +aI1138 +aI-441 +aa(lp7324 +g15 +aI1162 +aI-283 +aI1157 +aI-368 +aI1162 +aI-328 +aa(lp7325 +g10 +aa(lp7326 +g8 +aI833 +aI-283 +aa(lp7327 +g15 +aI838 +aI-186 +aI833 +aI-246 +aI834 +aI-214 +aa(lp7328 +g15 +aI853 +aI-113 +aI841 +aI-157 +aI846 +aI-133 +aa(lp7329 +g15 +aI881 +aI-68 +aI860 +aI-94 +aI869 +aI-78 +aa(lp7330 +g15 +aI922 +aI-52 +aI892 +aI-58 +aI906 +aI-52 +aa(lp7331 +g15 +aI964 +aI-68 +aI939 +aI-52 +aI953 +aI-58 +aa(lp7332 +g15 +aI991 +aI-113 +aI975 +aI-78 +aI984 +aI-94 +aa(lp7333 +g15 +aI1006 +aI-186 +aI998 +aI-133 +aI1003 +aI-157 +aa(lp7334 +g15 +aI1010 +aI-283 +aI1009 +aI-214 +aI1010 +aI-246 +aa(lp7335 +g15 +aI1006 +aI-378 +aI1010 +aI-318 +aI1009 +aI-350 +aa(lp7336 +g15 +aI991 +aI-450 +aI1003 +aI-406 +aI998 +aI-430 +aa(lp7337 +g15 +aI965 +aI-494 +aI985 +aI-469 +aI976 +aI-484 +aa(lp7338 +g15 +aI923 +aI-509 +aI954 +aI-504 +aI940 +aI-509 +aa(lp7339 +g15 +aI881 +aI-494 +aI907 +aI-509 +aI893 +aI-504 +aa(lp7340 +g15 +aI853 +aI-450 +aI870 +aI-484 +aI861 +aI-469 +aa(lp7341 +g15 +aI838 +aI-378 +aI846 +aI-430 +aI841 +aI-406 +aa(lp7342 +g15 +aI833 +aI-283 +aI834 +aI-350 +aI833 +aI-318 +aa(lp7343 +g10 +aa(lp7344 +g8 +aI1207 +aI0 +aa(lp7345 +g10 +aa(lp7346 +g8 +aI1207 +aI0 +aasV) +(lp7347 +(lp7348 +g8 +aI242 +aI-423 +aa(lp7349 +g15 +aI234 +aI-578 +aI242 +aI-476 +aI240 +aI-528 +aa(lp7350 +g15 +aI204 +aI-722 +aI229 +aI-629 +aI219 +aI-677 +aa(lp7351 +g15 +aI143 +aI-846 +aI190 +aI-767 +aI169 +aI-808 +aa(lp7352 +g15 +aI42 +aI-944 +aI117 +aI-884 +aI84 +aI-917 +aa(lp7353 +g20 +aI42 +aI-1028 +aa(lp7354 +g15 +aI233 +aI-924 +aI117 +aI-999 +aI180 +aI-964 +aa(lp7355 +g15 +aI361 +aI-789 +aI285 +aI-884 +aI328 +aI-839 +aa(lp7356 +g15 +aI434 +aI-622 +aI394 +aI-738 +aI419 +aI-683 +aa(lp7357 +g15 +aI457 +aI-423 +aI449 +aI-561 +aI457 +aI-494 +aa(lp7358 +g15 +aI434 +aI-223 +aI457 +aI-351 +aI449 +aI-284 +aa(lp7359 +g15 +aI361 +aI-55 +aI419 +aI-162 +aI394 +aI-106 +aa(lp7360 +g15 +aI233 +aI80 +aI328 +aI-4 +aI285 +aI40 +aa(lp7361 +g15 +aI42 +aI186 +aI180 +aI121 +aI117 +aI156 +aa(lp7362 +g20 +aI42 +aI100 +aa(lp7363 +g15 +aI143 +aI2 +aI84 +aI73 +aI117 +aI40 +aa(lp7364 +g15 +aI204 +aI-122 +aI169 +aI-35 +aI190 +aI-77 +aa(lp7365 +g15 +aI234 +aI-267 +aI219 +aI-168 +aI229 +aI-216 +aa(lp7366 +g15 +aI242 +aI-423 +aI240 +aI-318 +aI242 +aI-370 +aa(lp7367 +g10 +aa(lp7368 +g8 +aI533 +aI0 +aa(lp7369 +g10 +aa(lp7370 +g8 +aI533 +aI0 +aasV- +(lp7371 +(lp7372 +g8 +aI33 +aI-293 +aa(lp7373 +g20 +aI33 +aI-433 +aa(lp7374 +g20 +aI380 +aI-433 +aa(lp7375 +g20 +aI380 +aI-293 +aa(lp7376 +g10 +aa(lp7377 +g8 +aI413 +aI0 +aa(lp7378 +g10 +aa(lp7379 +g8 +aI413 +aI0 +aasV1 +(lp7380 +(lp7381 +g8 +aI129 +aI0 +aa(lp7382 +g20 +aI129 +aI-70 +aa(lp7383 +g20 +aI238 +aI-70 +aa(lp7384 +g15 +aI268 +aI-74 +aI250 +aI-70 +aI259 +aI-71 +aa(lp7385 +g15 +aI289 +aI-88 +aI276 +aI-77 +aI283 +aI-82 +aa(lp7386 +g15 +aI301 +aI-115 +aI294 +aI-95 +aI298 +aI-104 +aa(lp7387 +g15 +aI305 +aI-157 +aI304 +aI-126 +aI305 +aI-140 +aa(lp7388 +g20 +aI305 +aI-825 +aa(lp7389 +g15 +aI257 +aI-768 +aI288 +aI-804 +aI272 +aI-785 +aa(lp7390 +g15 +aI214 +aI-724 +aI242 +aI-751 +aI228 +aI-736 +aa(lp7391 +g15 +aI173 +aI-696 +aI200 +aI-712 +aI186 +aI-703 +aa(lp7392 +g15 +aI133 +aI-686 +aI160 +aI-689 +aI146 +aI-686 +aa(lp7393 +g15 +aI103 +aI-693 +aI122 +aI-686 +aI112 +aI-688 +aa(lp7394 +g15 +aI78 +aI-713 +aI93 +aI-697 +aI85 +aI-704 +aa(lp7395 +g15 +aI62 +aI-744 +aI71 +aI-721 +aI66 +aI-732 +aa(lp7396 +g15 +aI55 +aI-784 +aI58 +aI-756 +aI55 +aI-769 +aa(lp7397 +g15 +aI98 +aI-797 +aI69 +aI-788 +aI83 +aI-792 +aa(lp7398 +g15 +aI145 +aI-816 +aI113 +aI-802 +aI128 +aI-808 +aa(lp7399 +g15 +aI199 +aI-846 +aI162 +aI-824 +aI180 +aI-834 +aa(lp7400 +g15 +aI261 +aI-887 +aI218 +aI-857 +aI238 +aI-871 +aa(lp7401 +g20 +aI354 +aI-956 +aa(lp7402 +g20 +aI503 +aI-956 +aa(lp7403 +g20 +aI503 +aI-157 +aa(lp7404 +g15 +aI506 +aI-119 +aI503 +aI-143 +aI504 +aI-130 +aa(lp7405 +g15 +aI517 +aI-92 +aI508 +aI-109 +aI512 +aI-100 +aa(lp7406 +g15 +aI538 +aI-76 +aI522 +aI-85 +aI529 +aI-79 +aa(lp7407 +g15 +aI572 +aI-70 +aI546 +aI-72 +aI558 +aI-70 +aa(lp7408 +g20 +aI679 +aI-70 +aa(lp7409 +g20 +aI679 +aI0 +aa(lp7410 +g10 +aa(lp7411 +g8 +aI745 +aI0 +aa(lp7412 +g10 +aa(lp7413 +g8 +aI745 +aI0 +aasV5 +(lp7414 +(lp7415 +g8 +aI306 +aI-79 +aa(lp7416 +g15 +aI369 +aI-90 +aI328 +aI-79 +aI349 +aI-83 +aa(lp7417 +g15 +aI421 +aI-124 +aI389 +aI-96 +aI406 +aI-108 +aa(lp7418 +g15 +aI457 +aI-190 +aI436 +aI-141 +aI448 +aI-163 +aa(lp7419 +g15 +aI470 +aI-293 +aI466 +aI-218 +aI470 +aI-252 +aa(lp7420 +g15 +aI423 +aI-441 +aI470 +aI-359 +aI454 +aI-409 +aa(lp7421 +g15 +aI289 +aI-490 +aI391 +aI-474 +aI346 +aI-490 +aa(lp7422 +g15 +aI243 +aI-488 +aI272 +aI-490 +aI256 +aI-489 +aa(lp7423 +g15 +aI205 +aI-482 +aI229 +aI-487 +aI216 +aI-485 +aa(lp7424 +g15 +aI171 +aI-475 +aI193 +aI-480 +aI182 +aI-477 +aa(lp7425 +g15 +aI141 +aI-466 +aI161 +aI-472 +aI151 +aI-469 +aa(lp7426 +g20 +aI80 +aI-490 +aa(lp7427 +g20 +aI122 +aI-951 +aa(lp7428 +g20 +aI626 +aI-951 +aa(lp7429 +g20 +aI633 +aI-709 +aa(lp7430 +g20 +aI557 +aI-709 +aa(lp7431 +g20 +aI546 +aI-754 +aa(lp7432 +g15 +aI539 +aI-775 +aI544 +aI-761 +aI542 +aI-768 +aa(lp7433 +g15 +aI528 +aI-791 +aI537 +aI-781 +aI533 +aI-786 +aa(lp7434 +g15 +aI511 +aI-801 +aI524 +aI-795 +aI518 +aI-798 +aa(lp7435 +g15 +aI485 +aI-804 +aI504 +aI-803 +aI495 +aI-804 +aa(lp7436 +g20 +aI207 +aI-804 +aa(lp7437 +g15 +aI206 +aI-793 +aI207 +aI-804 +aI207 +aI-800 +aa(lp7438 +g15 +aI204 +aI-765 +aI206 +aI-786 +aI205 +aI-776 +aa(lp7439 +g15 +aI201 +aI-725 +aI203 +aI-753 +aI202 +aI-740 +aa(lp7440 +g15 +aI197 +aI-680 +aI199 +aI-710 +aI198 +aI-695 +aa(lp7441 +g20 +aI186 +aI-558 +aa(lp7442 +g15 +aI213 +aI-565 +aI193 +aI-560 +aI202 +aI-563 +aa(lp7443 +g15 +aI250 +aI-572 +aI224 +aI-568 +aI236 +aI-570 +aa(lp7444 +g15 +aI291 +aI-576 +aI263 +aI-574 +aI276 +aI-575 +aa(lp7445 +g15 +aI333 +aI-578 +aI305 +aI-577 +aI319 +aI-578 +aa(lp7446 +g15 +aI473 +aI-560 +aI384 +aI-578 +aI431 +aI-572 +aa(lp7447 +g15 +aI581 +aI-507 +aI515 +aI-548 +aI551 +aI-530 +aa(lp7448 +g15 +aI650 +aI-418 +aI610 +aI-483 +aI633 +aI-453 +aa(lp7449 +g15 +aI674 +aI-293 +aI666 +aI-382 +aI674 +aI-340 +aa(lp7450 +g15 +aI642 +aI-147 +aI674 +aI-235 +aI663 +aI-186 +aa(lp7451 +g15 +aI561 +aI-52 +aI621 +aI-108 +aI594 +aI-76 +aa(lp7452 +g15 +aI449 +aI-1 +aI527 +aI-29 +aI490 +aI-12 +aa(lp7453 +g15 +aI326 +aI13 +aI407 +aI8 +aI367 +aI13 +aa(lp7454 +g15 +aI199 +aI0 +aI276 +aI13 +aI234 +aI9 +aa(lp7455 +g15 +aI115 +aI-35 +aI165 +aI-8 +aI136 +aI-20 +aa(lp7456 +g15 +aI68 +aI-87 +aI93 +aI-50 +aI77 +aI-67 +aa(lp7457 +g15 +aI53 +aI-147 +aI58 +aI-106 +aI53 +aI-126 +aa(lp7458 +g15 +aI82 +aI-216 +aI53 +aI-178 +aI63 +aI-201 +aa(lp7459 +g15 +aI160 +aI-239 +aI101 +aI-232 +aI127 +aI-239 +aa(lp7460 +g15 +aI167 +aI-182 +aI160 +aI-220 +aI162 +aI-201 +aa(lp7461 +g15 +aI192 +aI-131 +aI172 +aI-163 +aI180 +aI-146 +aa(lp7462 +g15 +aI237 +aI-93 +aI203 +aI-115 +aI218 +aI-103 +aa(lp7463 +g15 +aI306 +aI-79 +aI256 +aI-84 +aI279 +aI-79 +aa(lp7464 +g10 +aa(lp7465 +g8 +aI745 +aI0 +aa(lp7466 +g10 +aa(lp7467 +g8 +aI745 +aI0 +aasV9 +(lp7468 +(lp7469 +g8 +aI302 +aI13 +aa(lp7470 +g15 +aI200 +aI0 +aI262 +aI13 +aI228 +aI9 +aa(lp7471 +g15 +aI132 +aI-33 +aI172 +aI-7 +aI150 +aI-18 +aa(lp7472 +g15 +aI95 +aI-81 +aI115 +aI-47 +aI102 +aI-63 +aa(lp7473 +g15 +aI83 +aI-136 +aI87 +aI-99 +aI83 +aI-117 +aa(lp7474 +g15 +aI99 +aI-186 +aI83 +aI-156 +aI89 +aI-172 +aa(lp7475 +g15 +aI149 +aI-213 +aI110 +aI-199 +aI126 +aI-208 +aa(lp7476 +g15 +aI172 +aI-157 +aI155 +aI-193 +aI163 +aI-174 +aa(lp7477 +g15 +aI205 +aI-111 +aI181 +aI-139 +aI192 +aI-124 +aa(lp7478 +g15 +aI250 +aI-81 +aI218 +aI-99 +aI233 +aI-88 +aa(lp7479 +g15 +aI309 +aI-70 +aI267 +aI-74 +aI287 +aI-70 +aa(lp7480 +g15 +aI447 +aI-167 +aI369 +aI-70 +aI415 +aI-102 +aa(lp7481 +g15 +aI502 +aI-456 +aI479 +aI-232 +aI498 +aI-328 +aa(lp7482 +g15 +aI467 +aI-420 +aI492 +aI-443 +aI480 +aI-431 +aa(lp7483 +g15 +aI424 +aI-392 +aI454 +aI-409 +aI440 +aI-400 +aa(lp7484 +g15 +aI371 +aI-372 +aI408 +aI-383 +aI390 +aI-377 +aa(lp7485 +g15 +aI307 +aI-366 +aI352 +aI-368 +aI330 +aI-366 +aa(lp7486 +g15 +aI202 +aI-383 +aI269 +aI-366 +aI234 +aI-372 +aa(lp7487 +g15 +aI120 +aI-436 +aI170 +aI-395 +aI143 +aI-413 +aa(lp7488 +g15 +aI66 +aI-523 +aI96 +aI-459 +aI78 +aI-488 +aa(lp7489 +g15 +aI46 +aI-642 +aI53 +aI-557 +aI46 +aI-597 +aa(lp7490 +g15 +aI67 +aI-773 +aI46 +aI-690 +aI53 +aI-734 +aa(lp7491 +g15 +aI127 +aI-875 +aI81 +aI-813 +aI101 +aI-847 +aa(lp7492 +g15 +aI223 +aI-941 +aI154 +aI-903 +aI186 +aI-925 +aa(lp7493 +g15 +aI352 +aI-965 +aI261 +aI-957 +aI304 +aI-965 +aa(lp7494 +g15 +aI485 +aI-939 +aI400 +aI-965 +aI444 +aI-956 +aa(lp7495 +g15 +aI591 +aI-858 +aI526 +aI-921 +aI561 +aI-894 +aa(lp7496 +g15 +aI660 +aI-718 +aI621 +aI-821 +aI644 +aI-775 +aa(lp7497 +g15 +aI685 +aI-517 +aI677 +aI-662 +aI685 +aI-595 +aa(lp7498 +g15 +aI664 +aI-310 +aI685 +aI-443 +aI678 +aI-374 +aa(lp7499 +g15 +aI596 +aI-141 +aI649 +aI-245 +aI627 +aI-189 +aa(lp7500 +g15 +aI478 +aI-28 +aI566 +aI-93 +aI526 +aI-55 +aa(lp7501 +g15 +aI302 +aI13 +aI429 +aI0 +aI371 +aI13 +aa(lp7502 +g10 +aa(lp7503 +g8 +aI365 +aI-462 +aa(lp7504 +g15 +aI447 +aI-486 +aI397 +aI-462 +aI424 +aI-470 +aa(lp7505 +g15 +aI502 +aI-551 +aI470 +aI-503 +aI489 +aI-524 +aa(lp7506 +g15 +aI491 +aI-698 +aI502 +aI-608 +aI498 +aI-657 +aa(lp7507 +g15 +aI461 +aI-798 +aI484 +aI-738 +aI474 +aI-772 +aa(lp7508 +g15 +aI417 +aI-856 +aI449 +aI-824 +aI434 +aI-844 +aa(lp7509 +g15 +aI360 +aI-875 +aI399 +aI-869 +aI380 +aI-875 +aa(lp7510 +g15 +aI271 +aI-819 +aI321 +aI-875 +aI292 +aI-857 +aa(lp7511 +g15 +aI240 +aI-649 +aI250 +aI-781 +aI240 +aI-725 +aa(lp7512 +g15 +aI271 +aI-509 +aI240 +aI-588 +aI250 +aI-541 +aa(lp7513 +g15 +aI365 +aI-462 +aI292 +aI-478 +aI323 +aI-462 +aa(lp7514 +g10 +aa(lp7515 +g8 +aI745 +aI0 +aa(lp7516 +g10 +aa(lp7517 +g8 +aI745 +aI0 +aasV= +(lp7518 +(lp7519 +g8 +aI661 +aI-392 +aa(lp7520 +g20 +aI661 +aI-299 +aa(lp7521 +g20 +aI83 +aI-299 +aa(lp7522 +g20 +aI83 +aI-392 +aa(lp7523 +g10 +aa(lp7524 +g8 +aI661 +aI-651 +aa(lp7525 +g20 +aI661 +aI-558 +aa(lp7526 +g20 +aI83 +aI-558 +aa(lp7527 +g20 +aI83 +aI-651 +aa(lp7528 +g10 +aa(lp7529 +g8 +aI745 +aI0 +aa(lp7530 +g10 +aa(lp7531 +g8 +aI745 +aI0 +aasVA +(lp7532 +(lp7533 +g8 +aI290 +aI-312 +aa(lp7534 +g20 +aI251 +aI-198 +aa(lp7535 +g15 +aI241 +aI-160 +aI248 +aI-187 +aI244 +aI-174 +aa(lp7536 +g15 +aI235 +aI-121 +aI237 +aI-145 +aI235 +aI-132 +aa(lp7537 +g15 +aI240 +aI-99 +aI235 +aI-113 +aI237 +aI-105 +aa(lp7538 +g15 +aI254 +aI-83 +aI244 +aI-92 +aI248 +aI-87 +aa(lp7539 +g15 +aI273 +aI-73 +aI260 +aI-79 +aI266 +aI-75 +aa(lp7540 +g15 +aI296 +aI-70 +aI280 +aI-71 +aI288 +aI-70 +aa(lp7541 +g20 +aI352 +aI-70 +aa(lp7542 +g20 +aI352 +aI0 +aa(lp7543 +g20 +aI5 +aI0 +aa(lp7544 +g20 +aI5 +aI-70 +aa(lp7545 +g20 +aI21 +aI-70 +aa(lp7546 +g15 +aI53 +aI-74 +aI33 +aI-70 +aI43 +aI-71 +aa(lp7547 +g15 +aI81 +aI-89 +aI63 +aI-77 +aI72 +aI-81 +aa(lp7548 +g15 +aI105 +aI-118 +aI89 +aI-96 +aI97 +aI-106 +aa(lp7549 +g15 +aI128 +aI-167 +aI112 +aI-131 +aI120 +aI-147 +aa(lp7550 +g20 +aI417 +aI-951 +aa(lp7551 +g20 +aI600 +aI-951 +aa(lp7552 +g20 +aI878 +aI-166 +aa(lp7553 +g15 +aI899 +aI-119 +aI885 +aI-147 +aI892 +aI-132 +aa(lp7554 +g15 +aI922 +aI-90 +aI906 +aI-107 +aI914 +aI-97 +aa(lp7555 +g15 +aI949 +aI-75 +aI931 +aI-83 +aI940 +aI-78 +aa(lp7556 +g15 +aI979 +aI-70 +aI959 +aI-72 +aI969 +aI-70 +aa(lp7557 +g20 +aI1003 +aI-70 +aa(lp7558 +g20 +aI1003 +aI0 +aa(lp7559 +g20 +aI563 +aI0 +aa(lp7560 +g20 +aI563 +aI-70 +aa(lp7561 +g20 +aI615 +aI-70 +aa(lp7562 +g15 +aI636 +aI-73 +aI622 +aI-70 +aI629 +aI-71 +aa(lp7563 +g15 +aI654 +aI-82 +aI643 +aI-75 +aI649 +aI-78 +aa(lp7564 +g15 +aI667 +aI-98 +aI660 +aI-86 +aI664 +aI-91 +aa(lp7565 +g15 +aI673 +aI-121 +aI671 +aI-105 +aI673 +aI-112 +aa(lp7566 +g15 +aI669 +aI-153 +aI673 +aI-132 +aI671 +aI-143 +aa(lp7567 +g15 +aI661 +aI-179 +aI666 +aI-163 +aI664 +aI-171 +aa(lp7568 +g20 +aI614 +aI-312 +aa(lp7569 +g10 +aa(lp7570 +g8 +aI517 +aI-612 +aa(lp7571 +g15 +aI502 +aI-660 +aI512 +aI-628 +aI507 +aI-643 +aa(lp7572 +g15 +aI487 +aI-711 +aI497 +aI-677 +aI492 +aI-694 +aa(lp7573 +g15 +aI473 +aI-763 +aI482 +aI-729 +aI478 +aI-746 +aa(lp7574 +g15 +aI461 +aI-812 +aI469 +aI-780 +aI465 +aI-797 +aa(lp7575 +g15 +aI447 +aI-768 +aI457 +aI-799 +aI453 +aI-784 +aa(lp7576 +g15 +aI431 +aI-718 +aI442 +aI-752 +aI437 +aI-735 +aa(lp7577 +g15 +aI413 +aI-668 +aI425 +aI-702 +aI419 +aI-685 +aa(lp7578 +g15 +aI397 +aI-619 +aI407 +aI-651 +aI402 +aI-634 +aa(lp7579 +g20 +aI318 +aI-394 +aa(lp7580 +g20 +aI587 +aI-394 +aa(lp7581 +g10 +aa(lp7582 +g8 +aI1003 +aI0 +aa(lp7583 +g10 +aa(lp7584 +g8 +aI1003 +aI0 +aasVE +(lp7585 +(lp7586 +g8 +aI373 +aI-80 +aa(lp7587 +g20 +aI639 +aI-80 +aa(lp7588 +g15 +aI674 +aI-88 +aI653 +aI-80 +aI664 +aI-83 +aa(lp7589 +g15 +aI699 +aI-109 +aI684 +aI-93 +aI692 +aI-100 +aa(lp7590 +g15 +aI715 +aI-141 +aI706 +aI-118 +aI711 +aI-129 +aa(lp7591 +g15 +aI725 +aI-182 +aI719 +aI-154 +aI723 +aI-167 +aa(lp7592 +g20 +aI735 +aI-244 +aa(lp7593 +g20 +aI828 +aI-244 +aa(lp7594 +g20 +aI818 +aI0 +aa(lp7595 +g20 +aI37 +aI0 +aa(lp7596 +g20 +aI37 +aI-70 +aa(lp7597 +g20 +aI93 +aI-70 +aa(lp7598 +g15 +aI119 +aI-73 +aI102 +aI-70 +aI111 +aI-71 +aa(lp7599 +g15 +aI141 +aI-83 +aI128 +aI-74 +aI135 +aI-78 +aa(lp7600 +g15 +aI156 +aI-107 +aI147 +aI-89 +aI152 +aI-97 +aa(lp7601 +g15 +aI161 +aI-149 +aI159 +aI-118 +aI161 +aI-132 +aa(lp7602 +g20 +aI161 +aI-794 +aa(lp7603 +g15 +aI156 +aI-840 +aI161 +aI-813 +aI159 +aI-828 +aa(lp7604 +g15 +aI141 +aI-866 +aI152 +aI-851 +aI148 +aI-860 +aa(lp7605 +g15 +aI120 +aI-878 +aI135 +aI-872 +aI128 +aI-876 +aa(lp7606 +g15 +aI93 +aI-881 +aI112 +aI-880 +aI103 +aI-881 +aa(lp7607 +g20 +aI37 +aI-881 +aa(lp7608 +g20 +aI37 +aI-951 +aa(lp7609 +g20 +aI777 +aI-951 +aa(lp7610 +g20 +aI782 +aI-705 +aa(lp7611 +g20 +aI689 +aI-705 +aa(lp7612 +g20 +aI682 +aI-769 +aa(lp7613 +g15 +aI658 +aI-843 +aI679 +aI-801 +aI671 +aI-826 +aa(lp7614 +g15 +aI597 +aI-869 +aI645 +aI-861 +aI625 +aI-869 +aa(lp7615 +g20 +aI373 +aI-869 +aa(lp7616 +g20 +aI373 +aI-536 +aa(lp7617 +g20 +aI689 +aI-536 +aa(lp7618 +g20 +aI689 +aI-456 +aa(lp7619 +g20 +aI373 +aI-456 +aa(lp7620 +g10 +aa(lp7621 +g8 +aI870 +aI0 +aa(lp7622 +g10 +aa(lp7623 +g8 +aI870 +aI0 +aasVI +(lp7624 +(lp7625 +g8 +aI37 +aI0 +aa(lp7626 +g20 +aI37 +aI-70 +aa(lp7627 +g20 +aI93 +aI-70 +aa(lp7628 +g15 +aI120 +aI-73 +aI103 +aI-70 +aI112 +aI-71 +aa(lp7629 +g15 +aI141 +aI-85 +aI128 +aI-75 +aI135 +aI-79 +aa(lp7630 +g15 +aI156 +aI-111 +aI148 +aI-91 +aI152 +aI-100 +aa(lp7631 +g15 +aI161 +aI-157 +aI159 +aI-122 +aI161 +aI-138 +aa(lp7632 +g20 +aI161 +aI-793 +aa(lp7633 +g15 +aI156 +aI-839 +aI161 +aI-812 +aI159 +aI-828 +aa(lp7634 +g15 +aI141 +aI-865 +aI152 +aI-850 +aI148 +aI-859 +aa(lp7635 +g15 +aI120 +aI-877 +aI135 +aI-871 +aI128 +aI-875 +aa(lp7636 +g15 +aI93 +aI-880 +aI112 +aI-879 +aI103 +aI-880 +aa(lp7637 +g20 +aI37 +aI-880 +aa(lp7638 +g20 +aI37 +aI-951 +aa(lp7639 +g20 +aI497 +aI-951 +aa(lp7640 +g20 +aI497 +aI-880 +aa(lp7641 +g20 +aI441 +aI-880 +aa(lp7642 +g15 +aI414 +aI-877 +aI431 +aI-880 +aI422 +aI-879 +aa(lp7643 +g15 +aI392 +aI-865 +aI405 +aI-875 +aI398 +aI-871 +aa(lp7644 +g15 +aI378 +aI-839 +aI386 +aI-859 +aI381 +aI-850 +aa(lp7645 +g15 +aI373 +aI-793 +aI374 +aI-828 +aI373 +aI-812 +aa(lp7646 +g20 +aI373 +aI-157 +aa(lp7647 +g15 +aI378 +aI-111 +aI373 +aI-138 +aI374 +aI-122 +aa(lp7648 +g15 +aI392 +aI-85 +aI381 +aI-100 +aI386 +aI-91 +aa(lp7649 +g15 +aI414 +aI-73 +aI398 +aI-79 +aI405 +aI-75 +aa(lp7650 +g15 +aI441 +aI-70 +aI422 +aI-71 +aI431 +aI-70 +aa(lp7651 +g20 +aI497 +aI-70 +aa(lp7652 +g20 +aI497 +aI0 +aa(lp7653 +g10 +aa(lp7654 +g8 +aI534 +aI0 +aa(lp7655 +g10 +aa(lp7656 +g8 +aI534 +aI0 +aasVM +(lp7657 +(lp7658 +g8 +aI805 +aI0 +aa(lp7659 +g20 +aI805 +aI-70 +aa(lp7660 +g20 +aI818 +aI-70 +aa(lp7661 +g15 +aI855 +aI-73 +aI832 +aI-70 +aI844 +aI-71 +aa(lp7662 +g15 +aI881 +aI-83 +aI865 +aI-74 +aI874 +aI-78 +aa(lp7663 +g15 +aI897 +aI-105 +aI888 +aI-88 +aI893 +aI-96 +aa(lp7664 +g15 +aI902 +aI-144 +aI900 +aI-115 +aI902 +aI-128 +aa(lp7665 +g20 +aI902 +aI-819 +aa(lp7666 +g20 +aI633 +aI0 +aa(lp7667 +g20 +aI542 +aI0 +aa(lp7668 +g20 +aI261 +aI-819 +aa(lp7669 +g20 +aI261 +aI-157 +aa(lp7670 +g15 +aI267 +aI-111 +aI261 +aI-138 +aI263 +aI-122 +aa(lp7671 +g15 +aI287 +aI-85 +aI272 +aI-100 +aI278 +aI-91 +aa(lp7672 +g15 +aI318 +aI-73 +aI295 +aI-79 +aI306 +aI-75 +aa(lp7673 +g15 +aI360 +aI-70 +aI330 +aI-71 +aI344 +aI-70 +aa(lp7674 +g20 +aI367 +aI-70 +aa(lp7675 +g20 +aI367 +aI0 +aa(lp7676 +g20 +aI37 +aI0 +aa(lp7677 +g20 +aI37 +aI-70 +aa(lp7678 +g20 +aI93 +aI-70 +aa(lp7679 +g15 +aI119 +aI-73 +aI102 +aI-70 +aI111 +aI-71 +aa(lp7680 +g15 +aI141 +aI-83 +aI128 +aI-74 +aI135 +aI-78 +aa(lp7681 +g15 +aI156 +aI-107 +aI147 +aI-89 +aI152 +aI-97 +aa(lp7682 +g15 +aI161 +aI-149 +aI159 +aI-118 +aI161 +aI-132 +aa(lp7683 +g20 +aI161 +aI-799 +aa(lp7684 +g15 +aI156 +aI-842 +aI161 +aI-817 +aI159 +aI-831 +aa(lp7685 +g15 +aI141 +aI-866 +aI152 +aI-852 +aI147 +aI-861 +aa(lp7686 +g15 +aI119 +aI-878 +aI135 +aI-872 +aI128 +aI-876 +aa(lp7687 +g15 +aI93 +aI-881 +aI111 +aI-880 +aI102 +aI-881 +aa(lp7688 +g20 +aI37 +aI-881 +aa(lp7689 +g20 +aI37 +aI-951 +aa(lp7690 +g20 +aI421 +aI-951 +aa(lp7691 +g20 +aI642 +aI-307 +aa(lp7692 +g20 +aI854 +aI-951 +aa(lp7693 +g20 +aI1231 +aI-951 +aa(lp7694 +g20 +aI1231 +aI-881 +aa(lp7695 +g20 +aI1175 +aI-881 +aa(lp7696 +g15 +aI1149 +aI-878 +aI1166 +aI-881 +aI1157 +aI-880 +aa(lp7697 +g15 +aI1127 +aI-866 +aI1140 +aI-876 +aI1133 +aI-872 +aa(lp7698 +g15 +aI1113 +aI-840 +aI1121 +aI-860 +aI1116 +aI-851 +aa(lp7699 +g15 +aI1108 +aI-794 +aI1109 +aI-828 +aI1108 +aI-813 +aa(lp7700 +g20 +aI1108 +aI-157 +aa(lp7701 +g15 +aI1113 +aI-111 +aI1108 +aI-138 +aI1109 +aI-122 +aa(lp7702 +g15 +aI1127 +aI-85 +aI1116 +aI-100 +aI1121 +aI-91 +aa(lp7703 +g15 +aI1149 +aI-73 +aI1133 +aI-79 +aI1140 +aI-75 +aa(lp7704 +g15 +aI1175 +aI-70 +aI1157 +aI-71 +aI1166 +aI-70 +aa(lp7705 +g20 +aI1231 +aI-70 +aa(lp7706 +g20 +aI1231 +aI0 +aa(lp7707 +g10 +aa(lp7708 +g8 +aI1269 +aI0 +aa(lp7709 +g10 +aa(lp7710 +g8 +aI1269 +aI0 +aasVQ +(lp7711 +(lp7712 +g8 +aI975 +aI-476 +aa(lp7713 +g15 +aI954 +aI-303 +aI975 +aI-414 +aI968 +aI-356 +aa(lp7714 +g15 +aI892 +aI-163 +aI940 +aI-251 +aI919 +aI-204 +aa(lp7715 +g15 +aI791 +aI-60 +aI865 +aI-122 +aI831 +aI-88 +aa(lp7716 +g15 +aI651 +aI0 +aI750 +aI-32 +aI704 +aI-12 +aa(lp7717 +g15 +aI675 +aI121 +aI655 +aI49 +aI663 +aI89 +aa(lp7718 +g15 +aI720 +aI195 +aI687 +aI152 +aI702 +aI177 +aa(lp7719 +g15 +aI778 +aI232 +aI737 +aI213 +aI757 +aI225 +aa(lp7720 +g15 +aI843 +aI243 +aI799 +aI239 +aI821 +aI243 +aa(lp7721 +g20 +aI865 +aI243 +aa(lp7722 +g20 +aI865 +aI320 +aa(lp7723 +g20 +aI769 +aI320 +aa(lp7724 +g15 +aI651 +aI303 +aI729 +aI320 +aI690 +aI314 +aa(lp7725 +g15 +aI545 +aI247 +aI612 +aI291 +aI577 +aI272 +aa(lp7726 +g15 +aI467 +aI149 +aI514 +aI222 +aI488 +aI189 +aa(lp7727 +g15 +aI429 +aI5 +aI446 +aI110 +aI433 +aI62 +aa(lp7728 +g15 +aI272 +aI-48 +aI369 +aI-3 +aI316 +aI-21 +aa(lp7729 +g15 +aI161 +aI-151 +aI227 +aI-75 +aI190 +aI-110 +aa(lp7730 +g15 +aI95 +aI-297 +aI131 +aI-193 +aI109 +aI-241 +aa(lp7731 +g15 +aI73 +aI-478 +aI80 +aI-352 +aI73 +aI-412 +aa(lp7732 +g15 +aI101 +aI-678 +aI73 +aI-551 +aI82 +aI-618 +aa(lp7733 +g15 +aI185 +aI-832 +aI120 +aI-739 +aI148 +aI-790 +aa(lp7734 +g15 +aI327 +aI-931 +aI223 +aI-875 +aI270 +aI-908 +aa(lp7735 +g15 +aI526 +aI-966 +aI383 +aI-954 +aI450 +aI-966 +aa(lp7736 +g15 +aI718 +aI-931 +aI598 +aI-966 +aI662 +aI-954 +aa(lp7737 +g15 +aI859 +aI-832 +aI774 +aI-908 +aI821 +aI-875 +aa(lp7738 +g15 +aI946 +aI-678 +aI897 +aI-789 +aI926 +aI-738 +aa(lp7739 +g15 +aI975 +aI-476 +aI966 +aI-618 +aI975 +aI-550 +aa(lp7740 +g10 +aa(lp7741 +g8 +aI297 +aI-476 +aa(lp7742 +g15 +aI309 +aI-306 +aI297 +aI-412 +aI301 +aI-356 +aa(lp7743 +g15 +aI349 +aI-179 +aI318 +aI-256 +aI331 +aI-214 +aa(lp7744 +g15 +aI420 +aI-100 +aI367 +aI-145 +aI391 +aI-118 +aa(lp7745 +g15 +aI525 +aI-73 +aI449 +aI-82 +aI484 +aI-73 +aa(lp7746 +g15 +aI631 +aI-100 +aI567 +aI-73 +aI602 +aI-82 +aa(lp7747 +g15 +aI701 +aI-179 +aI660 +aI-118 +aI683 +aI-145 +aa(lp7748 +g15 +aI739 +aI-306 +aI718 +aI-214 +aI731 +aI-256 +aa(lp7749 +g15 +aI751 +aI-476 +aI747 +aI-356 +aI751 +aI-412 +aa(lp7750 +g15 +aI739 +aI-647 +aI751 +aI-540 +aI747 +aI-597 +aa(lp7751 +g15 +aI701 +aI-773 +aI731 +aI-697 +aI718 +aI-739 +aa(lp7752 +g15 +aI631 +aI-852 +aI683 +aI-808 +aI660 +aI-834 +aa(lp7753 +g15 +aI526 +aI-879 +aI602 +aI-870 +aI567 +aI-879 +aa(lp7754 +g15 +aI420 +aI-852 +aI485 +aI-879 +aI449 +aI-870 +aa(lp7755 +g15 +aI349 +aI-773 +aI391 +aI-834 +aI367 +aI-808 +aa(lp7756 +g15 +aI309 +aI-647 +aI331 +aI-739 +aI318 +aI-697 +aa(lp7757 +g15 +aI297 +aI-476 +aI301 +aI-597 +aI297 +aI-540 +aa(lp7758 +g10 +aa(lp7759 +g8 +aI1049 +aI0 +aa(lp7760 +g10 +aa(lp7761 +g8 +aI1049 +aI0 +aasVU +(lp7762 +(lp7763 +g8 +aI974 +aI-881 +aa(lp7764 +g20 +aI917 +aI-881 +aa(lp7765 +g15 +aI891 +aI-878 +aI908 +aI-881 +aI899 +aI-880 +aa(lp7766 +g15 +aI869 +aI-866 +aI883 +aI-876 +aI875 +aI-872 +aa(lp7767 +g15 +aI854 +aI-840 +aI863 +aI-860 +aI858 +aI-851 +aa(lp7768 +g15 +aI849 +aI-794 +aI851 +aI-828 +aI849 +aI-813 +aa(lp7769 +g20 +aI849 +aI-274 +aa(lp7770 +g15 +aI830 +aI-153 +aI849 +aI-229 +aI843 +aI-189 +aa(lp7771 +g15 +aI770 +aI-63 +aI817 +aI-118 +aI797 +aI-88 +aa(lp7772 +g15 +aI666 +aI-6 +aI743 +aI-38 +aI708 +aI-19 +aa(lp7773 +g15 +aI516 +aI13 +aI624 +aI6 +aI574 +aI13 +aa(lp7774 +g15 +aI360 +aI-3 +aI458 +aI13 +aI406 +aI7 +aa(lp7775 +g15 +aI244 +aI-56 +aI314 +aI-14 +aI275 +aI-31 +aa(lp7776 +g15 +aI171 +aI-150 +aI212 +aI-80 +aI188 +aI-111 +aa(lp7777 +g15 +aI146 +aI-289 +aI154 +aI-188 +aI146 +aI-235 +aa(lp7778 +g20 +aI146 +aI-799 +aa(lp7779 +g15 +aI140 +aI-842 +aI146 +aI-817 +aI144 +aI-831 +aa(lp7780 +g15 +aI125 +aI-866 +aI137 +aI-852 +aI132 +aI-861 +aa(lp7781 +g15 +aI104 +aI-878 +aI119 +aI-872 +aI112 +aI-876 +aa(lp7782 +g15 +aI78 +aI-881 +aI96 +aI-880 +aI87 +aI-881 +aa(lp7783 +g20 +aI21 +aI-881 +aa(lp7784 +g20 +aI21 +aI-951 +aa(lp7785 +g20 +aI481 +aI-951 +aa(lp7786 +g20 +aI481 +aI-881 +aa(lp7787 +g20 +aI425 +aI-881 +aa(lp7788 +g15 +aI399 +aI-878 +aI416 +aI-881 +aI407 +aI-880 +aa(lp7789 +g15 +aI377 +aI-866 +aI390 +aI-876 +aI383 +aI-872 +aa(lp7790 +g15 +aI362 +aI-840 +aI370 +aI-860 +aI366 +aI-851 +aa(lp7791 +g15 +aI357 +aI-794 +aI359 +aI-828 +aI357 +aI-813 +aa(lp7792 +g20 +aI357 +aI-279 +aa(lp7793 +g15 +aI371 +aI-185 +aI357 +aI-242 +aI362 +aI-210 +aa(lp7794 +g15 +aI411 +aI-124 +aI380 +aI-160 +aI394 +aI-139 +aa(lp7795 +g15 +aI473 +aI-91 +aI428 +aI-108 +aI449 +aI-97 +aa(lp7796 +g15 +aI555 +aI-80 +aI498 +aI-84 +aI525 +aI-80 +aa(lp7797 +g15 +aI636 +aI-92 +aI585 +aI-80 +aI612 +aI-84 +aa(lp7798 +g15 +aI696 +aI-127 +aI659 +aI-99 +aI680 +aI-111 +aa(lp7799 +g15 +aI735 +aI-189 +aI713 +aI-143 +aI726 +aI-164 +aa(lp7800 +g15 +aI749 +aI-276 +aI744 +aI-213 +aI749 +aI-243 +aa(lp7801 +g20 +aI749 +aI-799 +aa(lp7802 +g15 +aI744 +aI-842 +aI749 +aI-817 +aI747 +aI-831 +aa(lp7803 +g15 +aI729 +aI-866 +aI740 +aI-852 +aI735 +aI-861 +aa(lp7804 +g15 +aI707 +aI-878 +aI723 +aI-872 +aI715 +aI-876 +aa(lp7805 +g15 +aI681 +aI-881 +aI699 +aI-880 +aI690 +aI-881 +aa(lp7806 +g20 +aI625 +aI-881 +aa(lp7807 +g20 +aI625 +aI-951 +aa(lp7808 +g20 +aI974 +aI-951 +aa(lp7809 +g10 +aa(lp7810 +g8 +aI996 +aI0 +aa(lp7811 +g10 +aa(lp7812 +g8 +aI996 +aI0 +aasVY +(lp7813 +(lp7814 +g8 +aI218 +aI0 +aa(lp7815 +g20 +aI218 +aI-70 +aa(lp7816 +g20 +aI281 +aI-70 +aa(lp7817 +g15 +aI311 +aI-72 +aI292 +aI-70 +aI302 +aI-71 +aa(lp7818 +g15 +aI335 +aI-82 +aI320 +aI-73 +aI328 +aI-77 +aa(lp7819 +g15 +aI352 +aI-106 +aI342 +aI-87 +aI348 +aI-96 +aa(lp7820 +g15 +aI358 +aI-151 +aI356 +aI-117 +aI358 +aI-132 +aa(lp7821 +g20 +aI358 +aI-336 +aa(lp7822 +g20 +aI111 +aI-810 +aa(lp7823 +g15 +aI93 +aI-843 +aI105 +aI-823 +aI99 +aI-834 +aa(lp7824 +g15 +aI74 +aI-865 +aI87 +aI-852 +aI81 +aI-859 +aa(lp7825 +g15 +aI50 +aI-877 +aI67 +aI-870 +aI59 +aI-874 +aa(lp7826 +g15 +aI17 +aI-881 +aI41 +aI-879 +aI30 +aI-881 +aa(lp7827 +g20 +aI0 +aI-881 +aa(lp7828 +g20 +aI0 +aI-951 +aa(lp7829 +g20 +aI446 +aI-951 +aa(lp7830 +g20 +aI446 +aI-881 +aa(lp7831 +g20 +aI423 +aI-881 +aa(lp7832 +g15 +aI363 +aI-864 +aI396 +aI-881 +aI376 +aI-875 +aa(lp7833 +g15 +aI343 +aI-821 +aI350 +aI-853 +aI343 +aI-839 +aa(lp7834 +g15 +aI349 +aI-784 +aI343 +aI-809 +aI345 +aI-797 +aa(lp7835 +g15 +aI363 +aI-747 +aI354 +aI-771 +aI358 +aI-758 +aa(lp7836 +g20 +aI462 +aI-551 +aa(lp7837 +g15 +aI497 +aI-476 +aI476 +aI-523 +aI488 +aI-498 +aa(lp7838 +g15 +aI521 +aI-412 +aI505 +aI-455 +aI514 +aI-433 +aa(lp7839 +g15 +aI553 +aI-489 +aI530 +aI-436 +aI541 +aI-461 +aa(lp7840 +g15 +aI593 +aI-575 +aI564 +aI-517 +aI578 +aI-545 +aa(lp7841 +g20 +aI670 +aI-735 +aa(lp7842 +g15 +aI689 +aI-784 +aI680 +aI-754 +aI686 +aI-771 +aa(lp7843 +g15 +aI693 +aI-815 +aI691 +aI-797 +aI693 +aI-807 +aa(lp7844 +g15 +aI671 +aI-865 +aI693 +aI-838 +aI686 +aI-855 +aa(lp7845 +g15 +aI605 +aI-881 +aI657 +aI-875 +aI634 +aI-881 +aa(lp7846 +g20 +aI574 +aI-881 +aa(lp7847 +g20 +aI574 +aI-951 +aa(lp7848 +g20 +aI923 +aI-951 +aa(lp7849 +g20 +aI923 +aI-881 +aa(lp7850 +g20 +aI898 +aI-881 +aa(lp7851 +g15 +aI869 +aI-876 +aI887 +aI-881 +aI877 +aI-879 +aa(lp7852 +g15 +aI846 +aI-860 +aI861 +aI-873 +aI853 +aI-868 +aa(lp7853 +g15 +aI824 +aI-828 +aI839 +aI-852 +aI832 +aI-841 +aa(lp7854 +g15 +aI797 +aI-776 +aI816 +aI-814 +aI807 +aI-797 +aa(lp7855 +g20 +aI570 +aI-335 +aa(lp7856 +g20 +aI570 +aI-153 +aa(lp7857 +g15 +aI576 +aI-107 +aI570 +aI-133 +aI572 +aI-118 +aa(lp7858 +g15 +aI592 +aI-82 +aI580 +aI-96 +aI586 +aI-88 +aa(lp7859 +g15 +aI616 +aI-72 +aI599 +aI-77 +aI607 +aI-73 +aa(lp7860 +g15 +aI645 +aI-70 +aI625 +aI-71 +aI634 +aI-70 +aa(lp7861 +g20 +aI710 +aI-70 +aa(lp7862 +g20 +aI710 +aI0 +aa(lp7863 +g10 +aa(lp7864 +g8 +aI923 +aI0 +aa(lp7865 +g10 +aa(lp7866 +g8 +aI923 +aI0 +aasV] +(lp7867 +(lp7868 +g8 +aI418 +aI-1012 +aa(lp7869 +g20 +aI418 +aI171 +aa(lp7870 +g20 +aI49 +aI171 +aa(lp7871 +g20 +aI49 +aI100 +aa(lp7872 +g20 +aI106 +aI100 +aa(lp7873 +g15 +aI149 +aI97 +aI121 +aI100 +aI136 +aI99 +aa(lp7874 +g15 +aI183 +aI84 +aI162 +aI95 +aI174 +aI90 +aa(lp7875 +g15 +aI207 +aI54 +aI193 +aI77 +aI201 +aI67 +aa(lp7876 +g15 +aI216 +aI4 +aI213 +aI42 +aI216 +aI25 +aa(lp7877 +g20 +aI216 +aI-845 +aa(lp7878 +g15 +aI207 +aI-896 +aI216 +aI-867 +aI213 +aI-884 +aa(lp7879 +g15 +aI183 +aI-925 +aI201 +aI-909 +aI193 +aI-918 +aa(lp7880 +g15 +aI149 +aI-939 +aI174 +aI-932 +aI162 +aI-936 +aa(lp7881 +g15 +aI106 +aI-942 +aI136 +aI-941 +aI121 +aI-942 +aa(lp7882 +g20 +aI49 +aI-942 +aa(lp7883 +g20 +aI49 +aI-1012 +aa(lp7884 +g10 +aa(lp7885 +g8 +aI552 +aI0 +aa(lp7886 +g10 +aa(lp7887 +g8 +aI552 +aI0 +aasVa +(lp7888 +(lp7889 +g8 +aI266 +aI-198 +aa(lp7890 +g15 +aI285 +aI-112 +aI266 +aI-159 +aI273 +aI-131 +aa(lp7891 +g15 +aI342 +aI-83 +aI297 +aI-93 +aI316 +aI-83 +aa(lp7892 +g15 +aI394 +aI-95 +aI361 +aI-83 +aI378 +aI-87 +aa(lp7893 +g15 +aI433 +aI-129 +aI409 +aI-103 +aI422 +aI-114 +aa(lp7894 +g15 +aI459 +aI-183 +aI444 +aI-144 +aI453 +aI-162 +aa(lp7895 +g15 +aI468 +aI-254 +aI465 +aI-204 +aI468 +aI-228 +aa(lp7896 +g20 +aI468 +aI-354 +aa(lp7897 +g20 +aI408 +aI-350 +aa(lp7898 +g15 +aI341 +aI-337 +aI381 +aI-349 +aI359 +aI-344 +aa(lp7899 +g15 +aI297 +aI-308 +aI322 +aI-330 +aI308 +aI-320 +aa(lp7900 +g15 +aI274 +aI-261 +aI286 +aI-295 +aI278 +aI-280 +aa(lp7901 +g15 +aI266 +aI-198 +aI269 +aI-243 +aI266 +aI-222 +aa(lp7902 +g10 +aa(lp7903 +g8 +aI385 +aI-649 +aa(lp7904 +g15 +aI342 +aI-639 +aI368 +aI-649 +aI354 +aI-646 +aa(lp7905 +g15 +aI315 +aI-609 +aI331 +aI-632 +aI322 +aI-622 +aa(lp7906 +g15 +aI300 +aI-563 +aI308 +aI-596 +aI303 +aI-581 +aa(lp7907 +g15 +aI296 +aI-506 +aI297 +aI-546 +aI296 +aI-526 +aa(lp7908 +g15 +aI161 +aI-526 +aI236 +aI-506 +aI191 +aI-512 +aa(lp7909 +g15 +aI115 +aI-595 +aI130 +aI-539 +aI115 +aI-562 +aa(lp7910 +g15 +aI137 +aI-657 +aI115 +aI-619 +aI123 +aI-640 +aa(lp7911 +g15 +aI196 +aI-700 +aI152 +aI-675 +aI171 +aI-689 +aa(lp7912 +g15 +aI284 +aI-723 +aI221 +aI-710 +aI250 +aI-718 +aa(lp7913 +g15 +aI390 +aI-731 +aI317 +aI-728 +aI352 +aI-731 +aa(lp7914 +g15 +aI513 +aI-719 +aI437 +aI-731 +aI478 +aI-727 +aa(lp7915 +g15 +aI600 +aI-680 +aI548 +aI-711 +aI577 +aI-698 +aa(lp7916 +g15 +aI652 +aI-610 +aI623 +aI-662 +aI641 +aI-639 +aa(lp7917 +g15 +aI670 +aI-504 +aI664 +aI-581 +aI670 +aI-546 +aa(lp7918 +g20 +aI670 +aI-164 +aa(lp7919 +g15 +aI674 +aI-119 +aI670 +aI-146 +aI671 +aI-131 +aa(lp7920 +g15 +aI688 +aI-90 +aI677 +aI-107 +aI682 +aI-97 +aa(lp7921 +g15 +aI712 +aI-75 +aI694 +aI-83 +aI702 +aI-78 +aa(lp7922 +g15 +aI750 +aI-70 +aI723 +aI-72 +aI735 +aI-70 +aa(lp7923 +g20 +aI755 +aI-70 +aa(lp7924 +g20 +aI755 +aI0 +aa(lp7925 +g20 +aI507 +aI0 +aa(lp7926 +g20 +aI479 +aI-91 +aa(lp7927 +g20 +aI468 +aI-91 +aa(lp7928 +g15 +aI426 +aI-44 +aI453 +aI-73 +aI439 +aI-58 +aa(lp7929 +g15 +aI384 +aI-11 +aI413 +aI-31 +aI399 +aI-20 +aa(lp7930 +g15 +aI334 +aI7 +aI370 +aI-3 +aI353 +aI3 +aa(lp7931 +g15 +aI269 +aI13 +aI316 +aI11 +aI294 +aI13 +aa(lp7932 +g15 +aI187 +aI0 +aI240 +aI13 +aI212 +aI9 +aa(lp7933 +g15 +aI120 +aI-39 +aI161 +aI-8 +aI139 +aI-21 +aa(lp7934 +g15 +aI76 +aI-107 +aI101 +aI-57 +aI87 +aI-80 +aa(lp7935 +g15 +aI59 +aI-203 +aI65 +aI-134 +aI59 +aI-166 +aa(lp7936 +g15 +aI134 +aI-364 +aI59 +aI-275 +aI84 +aI-329 +aa(lp7937 +g15 +aI358 +aI-420 +aI184 +aI-398 +aI258 +aI-417 +aa(lp7938 +g20 +aI468 +aI-424 +aa(lp7939 +g20 +aI468 +aI-498 +aa(lp7940 +g15 +aI465 +aI-559 +aI468 +aI-520 +aI467 +aI-540 +aa(lp7941 +g15 +aI454 +aI-607 +aI463 +aI-578 +aI460 +aI-594 +aa(lp7942 +g15 +aI429 +aI-638 +aI448 +aI-621 +aI440 +aI-631 +aa(lp7943 +g15 +aI385 +aI-649 +aI418 +aI-646 +aI403 +aI-649 +aa(lp7944 +g10 +aa(lp7945 +g8 +aI798 +aI0 +aa(lp7946 +g10 +aa(lp7947 +g8 +aI798 +aI0 +aasVe +(lp7948 +(lp7949 +g8 +aI395 +aI-644 +aa(lp7950 +g15 +aI306 +aI-589 +aI358 +aI-644 +aI328 +aI-626 +aa(lp7951 +g15 +aI270 +aI-427 +aI285 +aI-552 +aI273 +aI-498 +aa(lp7952 +g20 +aI501 +aI-427 +aa(lp7953 +g15 +aI495 +aI-518 +aI501 +aI-461 +aI499 +aI-491 +aa(lp7954 +g15 +aI476 +aI-586 +aI491 +aI-545 +aI485 +aI-568 +aa(lp7955 +g15 +aI444 +aI-629 +aI468 +aI-605 +aI457 +aI-619 +aa(lp7956 +g15 +aI395 +aI-644 +aI431 +aI-639 +aI414 +aI-644 +aa(lp7957 +g10 +aa(lp7958 +g8 +aI408 +aI13 +aa(lp7959 +g15 +aI258 +aI-11 +aI351 +aI13 +aI301 +aI5 +aa(lp7960 +g15 +aI150 +aI-82 +aI215 +aI-27 +aI179 +aI-51 +aa(lp7961 +g15 +aI84 +aI-197 +aI121 +aI-114 +aI99 +aI-152 +aa(lp7962 +g15 +aI62 +aI-353 +aI69 +aI-243 +aI62 +aI-294 +aa(lp7963 +g15 +aI84 +aI-517 +aI62 +aI-415 +aI69 +aI-470 +aa(lp7964 +g15 +aI149 +aI-636 +aI99 +aI-565 +aI120 +aI-604 +aa(lp7965 +g15 +aI252 +aI-707 +aI177 +aI-667 +aI211 +aI-691 +aa(lp7966 +g15 +aI393 +aI-731 +aI293 +aI-723 +aI340 +aI-731 +aa(lp7967 +g15 +aI523 +aI-710 +aI441 +aI-731 +aI484 +aI-724 +aa(lp7968 +g15 +aI621 +aI-649 +aI562 +aI-697 +aI594 +aI-676 +aa(lp7969 +g15 +aI683 +aI-549 +aI648 +aI-623 +aI669 +aI-589 +aa(lp7970 +g15 +aI705 +aI-410 +aI697 +aI-509 +aI705 +aI-463 +aa(lp7971 +g20 +aI705 +aI-341 +aa(lp7972 +g20 +aI268 +aI-341 +aa(lp7973 +g15 +aI282 +aI-226 +aI269 +aI-297 +aI274 +aI-258 +aa(lp7974 +g15 +aI318 +aI-147 +aI291 +aI-194 +aI303 +aI-168 +aa(lp7975 +g15 +aI372 +aI-101 +aI333 +aI-126 +aI351 +aI-111 +aa(lp7976 +g15 +aI446 +aI-86 +aI394 +aI-91 +aI418 +aI-86 +aa(lp7977 +g15 +aI510 +aI-94 +aI469 +aI-86 +aI490 +aI-88 +aa(lp7978 +g15 +aI563 +aI-117 +aI529 +aI-99 +aI547 +aI-107 +aa(lp7979 +g15 +aI605 +aI-151 +aI579 +aI-126 +aI593 +aI-138 +aa(lp7980 +g15 +aI634 +aI-194 +aI617 +aI-164 +aI626 +aI-179 +aa(lp7981 +g15 +aI670 +aI-129 +aI658 +aI-181 +aI670 +aI-159 +aa(lp7982 +g15 +aI654 +aI-74 +aI670 +aI-110 +aI665 +aI-91 +aa(lp7983 +g15 +aI606 +aI-29 +aI644 +aI-57 +aI628 +aI-42 +aa(lp7984 +g15 +aI525 +aI1 +aI585 +aI-16 +aI557 +aI-6 +aa(lp7985 +g15 +aI408 +aI13 +aI492 +aI9 +aI453 +aI13 +aa(lp7986 +g10 +aa(lp7987 +g8 +aI761 +aI0 +aa(lp7988 +g10 +aa(lp7989 +g8 +aI761 +aI0 +aasVi +(lp7990 +(lp7991 +g8 +aI114 +aI-930 +aa(lp7992 +g15 +aI123 +aI-974 +aI114 +aI-947 +aI117 +aI-962 +aa(lp7993 +g15 +aI147 +aI-1003 +aI129 +aI-986 +aI137 +aI-996 +aa(lp7994 +g15 +aI183 +aI-1020 +aI157 +aI-1011 +aI169 +aI-1017 +aa(lp7995 +g15 +aI227 +aI-1026 +aI196 +aI-1024 +aI211 +aI-1026 +aa(lp7996 +g15 +aI271 +aI-1020 +aI243 +aI-1026 +aI257 +aI-1024 +aa(lp7997 +g15 +aI307 +aI-1003 +aI285 +aI-1017 +aI297 +aI-1011 +aa(lp7998 +g15 +aI333 +aI-974 +aI318 +aI-996 +aI326 +aI-986 +aa(lp7999 +g15 +aI342 +aI-930 +aI339 +aI-962 +aI342 +aI-947 +aa(lp8000 +g15 +aI333 +aI-887 +aI342 +aI-914 +aI339 +aI-899 +aa(lp8001 +g15 +aI307 +aI-857 +aI326 +aI-875 +aI318 +aI-865 +aa(lp8002 +g15 +aI271 +aI-840 +aI297 +aI-849 +aI285 +aI-843 +aa(lp8003 +g15 +aI227 +aI-834 +aI257 +aI-836 +aI243 +aI-834 +aa(lp8004 +g15 +aI183 +aI-840 +aI211 +aI-834 +aI196 +aI-836 +aa(lp8005 +g15 +aI147 +aI-857 +aI169 +aI-843 +aI157 +aI-849 +aa(lp8006 +g15 +aI123 +aI-887 +aI137 +aI-865 +aI129 +aI-875 +aa(lp8007 +g15 +aI114 +aI-930 +aI117 +aI-899 +aI114 +aI-914 +aa(lp8008 +g10 +aa(lp8009 +g8 +aI38 +aI-70 +aa(lp8010 +g15 +aI69 +aI-73 +aI48 +aI-70 +aI58 +aI-71 +aa(lp8011 +g15 +aI100 +aI-85 +aI81 +aI-75 +aI91 +aI-79 +aa(lp8012 +g15 +aI124 +aI-111 +aI109 +aI-91 +aI117 +aI-100 +aa(lp8013 +g15 +aI133 +aI-157 +aI130 +aI-122 +aI133 +aI-138 +aa(lp8014 +g20 +aI133 +aI-562 +aa(lp8015 +g15 +aI124 +aI-604 +aI133 +aI-579 +aI130 +aI-594 +aa(lp8016 +g15 +aI100 +aI-629 +aI117 +aI-615 +aI109 +aI-623 +aa(lp8017 +g15 +aI69 +aI-640 +aI90 +aI-635 +aI80 +aI-639 +aa(lp8018 +g15 +aI38 +aI-643 +aI58 +aI-642 +aI47 +aI-643 +aa(lp8019 +g20 +aI22 +aI-643 +aa(lp8020 +g20 +aI22 +aI-714 +aa(lp8021 +g20 +aI335 +aI-714 +aa(lp8022 +g20 +aI335 +aI-157 +aa(lp8023 +g15 +aI345 +aI-111 +aI335 +aI-138 +aI339 +aI-122 +aa(lp8024 +g15 +aI368 +aI-85 +aI351 +aI-100 +aI359 +aI-91 +aa(lp8025 +g15 +aI399 +aI-73 +aI378 +aI-79 +aI388 +aI-75 +aa(lp8026 +g15 +aI430 +aI-70 +aI411 +aI-71 +aI421 +aI-70 +aa(lp8027 +g20 +aI446 +aI-70 +aa(lp8028 +g20 +aI446 +aI0 +aa(lp8029 +g20 +aI22 +aI0 +aa(lp8030 +g20 +aI22 +aI-70 +aa(lp8031 +g10 +aa(lp8032 +g8 +aI469 +aI0 +aa(lp8033 +g10 +aa(lp8034 +g8 +aI469 +aI0 +aasVm +(lp8035 +(lp8036 +g8 +aI558 +aI0 +aa(lp8037 +g20 +aI558 +aI-438 +aa(lp8038 +g15 +aI553 +aI-514 +aI558 +aI-466 +aI556 +aI-492 +aa(lp8039 +g15 +aI534 +aI-571 +aI549 +aI-537 +aI543 +aI-555 +aa(lp8040 +g15 +aI501 +aI-605 +aI526 +aI-586 +aI515 +aI-597 +aa(lp8041 +g15 +aI451 +aI-618 +aI487 +aI-614 +aI471 +aI-618 +aa(lp8042 +g15 +aI396 +aI-601 +aI429 +aI-618 +aI411 +aI-612 +aa(lp8043 +g15 +aI361 +aI-555 +aI381 +aI-589 +aI369 +aI-574 +aa(lp8044 +g15 +aI341 +aI-490 +aI352 +aI-536 +aI345 +aI-515 +aa(lp8045 +g15 +aI335 +aI-411 +aI337 +aI-465 +aI335 +aI-439 +aa(lp8046 +g20 +aI335 +aI-157 +aa(lp8047 +g15 +aI342 +aI-112 +aI335 +aI-138 +aI338 +aI-123 +aa(lp8048 +g15 +aI361 +aI-85 +aI347 +aI-100 +aI353 +aI-92 +aa(lp8049 +g15 +aI392 +aI-73 +aI370 +aI-79 +aI380 +aI-75 +aa(lp8050 +g15 +aI432 +aI-70 +aI404 +aI-71 +aI417 +aI-70 +aa(lp8051 +g20 +aI436 +aI-70 +aa(lp8052 +g20 +aI436 +aI0 +aa(lp8053 +g20 +aI26 +aI0 +aa(lp8054 +g20 +aI26 +aI-70 +aa(lp8055 +g20 +aI29 +aI-70 +aa(lp8056 +g15 +aI70 +aI-73 +aI44 +aI-70 +aI58 +aI-71 +aa(lp8057 +g15 +aI103 +aI-86 +aI83 +aI-75 +aI94 +aI-79 +aa(lp8058 +g15 +aI125 +aI-114 +aI113 +aI-92 +aI120 +aI-101 +aa(lp8059 +g15 +aI133 +aI-162 +aI130 +aI-126 +aI133 +aI-142 +aa(lp8060 +g20 +aI133 +aI-560 +aa(lp8061 +g15 +aI126 +aI-605 +aI133 +aI-579 +aI131 +aI-594 +aa(lp8062 +g15 +aI107 +aI-632 +aI122 +aI-616 +aI115 +aI-625 +aa(lp8063 +g15 +aI76 +aI-644 +aI98 +aI-638 +aI88 +aI-642 +aa(lp8064 +g15 +aI37 +aI-647 +aI65 +aI-646 +aI51 +aI-647 +aa(lp8065 +g20 +aI33 +aI-647 +aa(lp8066 +g20 +aI33 +aI-714 +aa(lp8067 +g20 +aI313 +aI-714 +aa(lp8068 +g20 +aI330 +aI-619 +aa(lp8069 +g20 +aI337 +aI-619 +aa(lp8070 +g15 +aI379 +aI-679 +aI350 +aI-644 +aI364 +aI-664 +aa(lp8071 +g15 +aI427 +aI-713 +aI394 +aI-693 +aI410 +aI-705 +aa(lp8072 +g15 +aI481 +aI-728 +aI444 +aI-720 +aI462 +aI-725 +aa(lp8073 +g15 +aI541 +aI-731 +aI500 +aI-730 +aI520 +aI-731 +aa(lp8074 +g15 +aI666 +aI-704 +aI590 +aI-731 +aI631 +aI-722 +aa(lp8075 +g15 +aI742 +aI-619 +aI701 +aI-687 +aI726 +aI-658 +aa(lp8076 +g20 +aI754 +aI-619 +aa(lp8077 +g15 +aI798 +aI-679 +aI768 +aI-644 +aI782 +aI-664 +aa(lp8078 +g15 +aI849 +aI-713 +aI814 +aI-693 +aI831 +aI-705 +aa(lp8079 +g15 +aI905 +aI-728 +aI867 +aI-720 +aI886 +aI-725 +aa(lp8080 +g15 +aI966 +aI-731 +aI925 +aI-730 +aI945 +aI-731 +aa(lp8081 +g15 +aI1059 +aI-716 +aI1001 +aI-731 +aI1031 +aI-726 +aa(lp8082 +g15 +aI1128 +aI-670 +aI1086 +aI-706 +aI1109 +aI-690 +aa(lp8083 +g15 +aI1171 +aI-590 +aI1147 +aI-649 +aI1161 +aI-622 +aa(lp8084 +g15 +aI1186 +aI-474 +aI1181 +aI-558 +aI1186 +aI-519 +aa(lp8085 +g20 +aI1186 +aI-164 +aa(lp8086 +g15 +aI1192 +aI-115 +aI1186 +aI-144 +aI1188 +aI-127 +aa(lp8087 +g15 +aI1208 +aI-86 +aI1196 +aI-102 +aI1201 +aI-93 +aa(lp8088 +g15 +aI1236 +aI-73 +aI1216 +aI-80 +aI1225 +aI-75 +aa(lp8089 +g15 +aI1276 +aI-70 +aI1248 +aI-71 +aI1261 +aI-70 +aa(lp8090 +g20 +aI1279 +aI-70 +aa(lp8091 +g20 +aI1279 +aI0 +aa(lp8092 +g20 +aI983 +aI0 +aa(lp8093 +g20 +aI983 +aI-438 +aa(lp8094 +g15 +aI959 +aI-571 +aI983 +aI-495 +aI975 +aI-539 +aa(lp8095 +g15 +aI877 +aI-618 +aI944 +aI-602 +aI916 +aI-618 +aa(lp8096 +g15 +aI824 +aI-602 +aI856 +aI-618 +aI838 +aI-612 +aa(lp8097 +g15 +aI788 +aI-561 +aI809 +aI-592 +aI797 +aI-578 +aa(lp8098 +g15 +aI767 +aI-500 +aI778 +aI-544 +aI771 +aI-523 +aa(lp8099 +g15 +aI761 +aI-427 +aI763 +aI-477 +aI761 +aI-452 +aa(lp8100 +g20 +aI761 +aI-164 +aa(lp8101 +g15 +aI766 +aI-115 +aI761 +aI-144 +aI762 +aI-127 +aa(lp8102 +g15 +aI783 +aI-86 +aI770 +aI-102 +aI775 +aI-93 +aa(lp8103 +g15 +aI811 +aI-73 +aI790 +aI-80 +aI799 +aI-75 +aa(lp8104 +g15 +aI850 +aI-70 +aI822 +aI-71 +aI835 +aI-70 +aa(lp8105 +g20 +aI854 +aI-70 +aa(lp8106 +g20 +aI854 +aI0 +aa(lp8107 +g10 +aa(lp8108 +g8 +aI1314 +aI0 +aa(lp8109 +g10 +aa(lp8110 +g8 +aI1314 +aI0 +aasVq +(lp8111 +(lp8112 +g8 +aI395 +aI320 +aa(lp8113 +g20 +aI395 +aI249 +aa(lp8114 +g20 +aI419 +aI249 +aa(lp8115 +g15 +aI461 +aI247 +aI434 +aI249 +aI448 +aI248 +aa(lp8116 +g15 +aI495 +aI236 +aI474 +aI245 +aI486 +aI241 +aa(lp8117 +g15 +aI519 +aI211 +aI505 +aI230 +aI513 +aI222 +aa(lp8118 +g15 +aI527 +aI167 +aI525 +aI199 +aI527 +aI185 +aa(lp8119 +g20 +aI527 +aI69 +aa(lp8120 +g15 +aI528 +aI53 +aI527 +aI65 +aI528 +aI60 +aa(lp8121 +g15 +aI529 +aI31 +aI528 +aI47 +aI528 +aI39 +aa(lp8122 +g15 +aI531 +aI4 +aI530 +aI22 +aI530 +aI14 +aa(lp8123 +g15 +aI533 +aI-22 +aI532 +aI-4 +aI532 +aI-13 +aa(lp8124 +g15 +aI538 +aI-92 +aI534 +aI-44 +aI536 +aI-67 +aa(lp8125 +g20 +aI529 +aI-92 +aa(lp8126 +g15 +aI496 +aI-50 +aI520 +aI-77 +aI509 +aI-63 +aa(lp8127 +g15 +aI453 +aI-16 +aI484 +aI-37 +aI469 +aI-26 +aa(lp8128 +g15 +aI398 +aI5 +aI437 +aI-7 +aI418 +aI0 +aa(lp8129 +g15 +aI330 +aI13 +aI378 +aI10 +aI355 +aI13 +aa(lp8130 +g15 +aI216 +aI-8 +aI287 +aI13 +aI249 +aI6 +aa(lp8131 +g15 +aI131 +aI-75 +aI182 +aI-22 +aI154 +aI-45 +aa(lp8132 +g15 +aI79 +aI-191 +aI108 +aI-106 +aI91 +aI-144 +aa(lp8133 +g15 +aI61 +aI-358 +aI67 +aI-238 +aI61 +aI-294 +aa(lp8134 +g15 +aI79 +aI-523 +aI61 +aI-422 +aI67 +aI-477 +aa(lp8135 +g15 +aI131 +aI-638 +aI91 +aI-570 +aI108 +aI-608 +aa(lp8136 +g15 +aI217 +aI-705 +aI155 +aI-668 +aI183 +aI-691 +aa(lp8137 +g15 +aI333 +aI-727 +aI251 +aI-720 +aI289 +aI-727 +aa(lp8138 +g15 +aI403 +aI-719 +aI359 +aI-727 +aI382 +aI-724 +aa(lp8139 +g15 +aI459 +aI-695 +aI424 +aI-713 +aI443 +aI-706 +aa(lp8140 +g15 +aI504 +aI-659 +aI476 +aI-685 +aI491 +aI-673 +aa(lp8141 +g15 +aI538 +aI-610 +aI517 +aI-644 +aI528 +aI-628 +aa(lp8142 +g20 +aI550 +aI-610 +aa(lp8143 +g20 +aI577 +aI-714 +aa(lp8144 +g20 +aI846 +aI-714 +aa(lp8145 +g20 +aI846 +aI-643 +aa(lp8146 +g20 +aI841 +aI-643 +aa(lp8147 +g15 +aI799 +aI-640 +aI826 +aI-643 +aI812 +aI-642 +aa(lp8148 +g15 +aI763 +aI-627 +aI785 +aI-638 +aI774 +aI-633 +aa(lp8149 +g15 +aI739 +aI-599 +aI753 +aI-620 +aI745 +aI-611 +aa(lp8150 +g15 +aI730 +aI-550 +aI733 +aI-587 +aI730 +aI-570 +aa(lp8151 +g20 +aI730 +aI167 +aa(lp8152 +g15 +aI739 +aI211 +aI730 +aI185 +aI733 +aI199 +aa(lp8153 +g15 +aI762 +aI236 +aI745 +aI222 +aI752 +aI230 +aa(lp8154 +g15 +aI796 +aI247 +aI772 +aI241 +aI783 +aI245 +aa(lp8155 +g15 +aI838 +aI249 +aI809 +aI248 +aI823 +aI249 +aa(lp8156 +g20 +aI862 +aI249 +aa(lp8157 +g20 +aI862 +aI320 +aa(lp8158 +g10 +aa(lp8159 +g8 +aI390 +aI-627 +aa(lp8160 +g15 +aI295 +aI-560 +aI345 +aI-627 +aI314 +aI-605 +aa(lp8161 +g15 +aI266 +aI-356 +aI276 +aI-515 +aI266 +aI-447 +aa(lp8162 +g15 +aI295 +aI-154 +aI266 +aI-267 +aI276 +aI-200 +aa(lp8163 +g15 +aI390 +aI-84 +aI314 +aI-107 +aI345 +aI-84 +aa(lp8164 +g15 +aI456 +aI-102 +aI417 +aI-84 +aI439 +aI-90 +aa(lp8165 +g15 +aI499 +aI-154 +aI474 +aI-114 +aI488 +aI-131 +aa(lp8166 +g15 +aI521 +aI-238 +aI509 +aI-176 +aI517 +aI-205 +aa(lp8167 +g15 +aI527 +aI-355 +aI525 +aI-272 +aI527 +aI-311 +aa(lp8168 +g15 +aI521 +aI-475 +aI527 +aI-401 +aI525 +aI-441 +aa(lp8169 +g15 +aI499 +aI-560 +aI517 +aI-509 +aI509 +aI-538 +aa(lp8170 +g15 +aI456 +aI-611 +aI488 +aI-583 +aI474 +aI-600 +aa(lp8171 +g15 +aI390 +aI-627 +aI439 +aI-622 +aI417 +aI-627 +aa(lp8172 +g10 +aa(lp8173 +g8 +aI863 +aI0 +aa(lp8174 +g10 +aa(lp8175 +g8 +aI863 +aI0 +aasVu +(lp8176 +(lp8177 +g8 +aI590 +aI0 +aa(lp8178 +g20 +aI561 +aI-93 +aa(lp8179 +g20 +aI554 +aI-93 +aa(lp8180 +g15 +aI511 +aI-38 +aI541 +aI-70 +aI526 +aI-52 +aa(lp8181 +g15 +aI460 +aI-5 +aI495 +aI-24 +aI478 +aI-13 +aa(lp8182 +g15 +aI404 +aI9 +aI443 +aI1 +aI424 +aI6 +aa(lp8183 +g15 +aI343 +aI13 +aI384 +aI12 +aI364 +aI13 +aa(lp8184 +g15 +aI183 +aI-50 +aI274 +aI13 +aI221 +aI-8 +aa(lp8185 +g15 +aI128 +aI-250 +aI146 +aI-93 +aI128 +aI-160 +aa(lp8186 +g20 +aI128 +aI-549 +aa(lp8187 +g15 +aI123 +aI-596 +aI128 +aI-568 +aI126 +aI-584 +aa(lp8188 +g15 +aI106 +aI-625 +aI119 +aI-608 +aI114 +aI-618 +aa(lp8189 +g15 +aI78 +aI-639 +aI99 +aI-632 +aI89 +aI-636 +aa(lp8190 +g15 +aI37 +aI-643 +aI66 +aI-642 +aI53 +aI-643 +aa(lp8191 +g20 +aI34 +aI-643 +aa(lp8192 +g20 +aI34 +aI-714 +aa(lp8193 +g20 +aI330 +aI-714 +aa(lp8194 +g20 +aI330 +aI-287 +aa(lp8195 +g15 +aI335 +aI-209 +aI330 +aI-258 +aI332 +aI-232 +aa(lp8196 +g15 +aI352 +aI-150 +aI338 +aI-186 +aI344 +aI-167 +aa(lp8197 +g15 +aI383 +aI-113 +aI360 +aI-134 +aI370 +aI-122 +aa(lp8198 +g15 +aI432 +aI-99 +aI396 +aI-104 +aI412 +aI-99 +aa(lp8199 +g15 +aI487 +aI-113 +aI453 +aI-99 +aI471 +aI-104 +aa(lp8200 +g15 +aI525 +aI-154 +aI502 +aI-123 +aI515 +aI-136 +aa(lp8201 +g15 +aI546 +aI-217 +aI534 +aI-171 +aI541 +aI-193 +aa(lp8202 +g15 +aI553 +aI-302 +aI551 +aI-242 +aI553 +aI-271 +aa(lp8203 +g20 +aI553 +aI-558 +aa(lp8204 +g15 +aI545 +aI-604 +aI553 +aI-577 +aI550 +aI-593 +aa(lp8205 +g15 +aI524 +aI-630 +aI540 +aI-615 +aI533 +aI-624 +aa(lp8206 +g15 +aI494 +aI-641 +aI516 +aI-635 +aI505 +aI-639 +aa(lp8207 +g15 +aI457 +aI-643 +aI482 +aI-642 +aI470 +aI-643 +aa(lp8208 +g20 +aI453 +aI-643 +aa(lp8209 +g20 +aI453 +aI-714 +aa(lp8210 +g20 +aI755 +aI-714 +aa(lp8211 +g20 +aI755 +aI-154 +aa(lp8212 +g15 +aI762 +aI-108 +aI755 +aI-134 +aI758 +aI-119 +aa(lp8213 +g15 +aI781 +aI-83 +aI767 +aI-97 +aI773 +aI-89 +aa(lp8214 +g15 +aI809 +aI-72 +aI789 +aI-77 +aI798 +aI-74 +aa(lp8215 +g15 +aI845 +aI-70 +aI820 +aI-71 +aI832 +aI-70 +aa(lp8216 +g20 +aI856 +aI-70 +aa(lp8217 +g20 +aI856 +aI0 +aa(lp8218 +g10 +aa(lp8219 +g8 +aI889 +aI0 +aa(lp8220 +g10 +aa(lp8221 +g8 +aI889 +aI0 +aasVy +(lp8222 +(lp8223 +g8 +aI772 +aI-714 +aa(lp8224 +g20 +aI772 +aI-643 +aa(lp8225 +g15 +aI736 +aI-638 +aI758 +aI-643 +aI746 +aI-641 +aa(lp8226 +g15 +aI708 +aI-622 +aI726 +aI-635 +aI717 +aI-630 +aa(lp8227 +g15 +aI686 +aI-592 +aI700 +aI-615 +aI693 +aI-605 +aa(lp8228 +g15 +aI665 +aI-546 +aI679 +aI-580 +aI672 +aI-565 +aa(lp8229 +g15 +aI616 +aI-411 +aI649 +aI-502 +aI633 +aI-457 +aa(lp8230 +g15 +aI565 +aI-272 +aI599 +aI-364 +aI582 +aI-318 +aa(lp8231 +g15 +aI513 +aI-134 +aI548 +aI-226 +aI531 +aI-180 +aa(lp8232 +g15 +aI464 +aI0 +aI496 +aI-88 +aI480 +aI-43 +aa(lp8233 +g15 +aI419 +aI113 +aI448 +aI43 +aI433 +aI81 +aa(lp8234 +g15 +aI375 +aI198 +aI406 +aI146 +aI391 +aI174 +aa(lp8235 +g15 +aI324 +aI257 +aI360 +aI222 +aI343 +aI241 +aa(lp8236 +g15 +aI259 +aI295 +aI306 +aI273 +aI284 +aI285 +aa(lp8237 +g15 +aI173 +aI314 +aI235 +aI304 +aI206 +aI311 +aa(lp8238 +g15 +aI58 +aI320 +aI140 +aI318 +aI102 +aI320 +aa(lp8239 +g20 +aI35 +aI320 +aa(lp8240 +g20 +aI35 +aI243 +aa(lp8241 +g15 +aI154 +aI226 +aI82 +aI243 +aI121 +aI237 +aa(lp8242 +g15 +aI236 +aI178 +aI186 +aI215 +aI214 +aI199 +aa(lp8243 +g15 +aI292 +aI103 +aI259 +aI157 +aI278 +aI132 +aa(lp8244 +g15 +aI330 +aI6 +aI307 +aI74 +aI319 +aI42 +aa(lp8245 +g20 +aI90 +aI-579 +aa(lp8246 +g15 +aI72 +aI-609 +aI85 +aI-592 +aI79 +aI-602 +aa(lp8247 +g15 +aI52 +aI-626 +aI66 +aI-616 +aI59 +aI-622 +aa(lp8248 +g15 +aI27 +aI-633 +aI44 +aI-630 +aI36 +aI-632 +aa(lp8249 +g15 +aI0 +aI-635 +aI19 +aI-635 +aI9 +aI-635 +aa(lp8250 +g20 +aI0 +aI-714 +aa(lp8251 +g20 +aI380 +aI-714 +aa(lp8252 +g20 +aI380 +aI-643 +aa(lp8253 +g15 +aI318 +aI-633 +aI354 +aI-643 +aI333 +aI-640 +aa(lp8254 +g15 +aI296 +aI-593 +aI303 +aI-626 +aI296 +aI-613 +aa(lp8255 +g15 +aI300 +aI-567 +aI296 +aI-586 +aI297 +aI-577 +aa(lp8256 +g15 +aI309 +aI-542 +aI303 +aI-557 +aI306 +aI-549 +aa(lp8257 +g15 +aI333 +aI-481 +aI317 +aI-523 +aI325 +aI-503 +aa(lp8258 +g15 +aI358 +aI-415 +aI342 +aI-459 +aI350 +aI-437 +aa(lp8259 +g15 +aI381 +aI-352 +aI366 +aI-393 +aI374 +aI-372 +aa(lp8260 +g15 +aI401 +aI-298 +aI388 +aI-332 +aI395 +aI-314 +aa(lp8261 +g15 +aI417 +aI-252 +aI407 +aI-281 +aI412 +aI-266 +aa(lp8262 +g15 +aI428 +aI-215 +aI421 +aI-238 +aI425 +aI-226 +aa(lp8263 +g15 +aI434 +aI-184 +aI430 +aI-204 +aI433 +aI-194 +aa(lp8264 +g15 +aI438 +aI-157 +aI436 +aI-175 +aI437 +aI-166 +aa(lp8265 +g15 +aI444 +aI-187 +aI439 +aI-166 +aI441 +aI-176 +aa(lp8266 +g15 +aI452 +aI-219 +aI446 +aI-198 +aI449 +aI-209 +aa(lp8267 +g15 +aI461 +aI-246 +aI455 +aI-229 +aI458 +aI-238 +aa(lp8268 +g15 +aI468 +aI-263 +aI464 +aI-254 +aI466 +aI-260 +aa(lp8269 +g20 +aI555 +aI-524 +aa(lp8270 +g15 +aI560 +aI-540 +aI557 +aI-529 +aI559 +aI-534 +aa(lp8271 +g15 +aI565 +aI-558 +aI562 +aI-546 +aI563 +aI-552 +aa(lp8272 +g15 +aI568 +aI-575 +aI566 +aI-564 +aI567 +aI-570 +aa(lp8273 +g15 +aI569 +aI-590 +aI568 +aI-581 +aI569 +aI-586 +aa(lp8274 +g15 +aI543 +aI-632 +aI569 +aI-610 +aI560 +aI-624 +aa(lp8275 +g15 +aI472 +aI-643 +aI526 +aI-639 +aI502 +aI-643 +aa(lp8276 +g20 +aI472 +aI-714 +aa(lp8277 +g10 +aa(lp8278 +g8 +aI772 +aI0 +aa(lp8279 +g10 +aa(lp8280 +g8 +aI772 +aI0 +aasV} +(lp8281 +(lp8282 +g8 +aI39 +aI167 +aa(lp8283 +g20 +aI39 +aI96 +aa(lp8284 +g20 +aI91 +aI96 +aa(lp8285 +g15 +aI138 +aI87 +aI110 +aI96 +aI126 +aI93 +aa(lp8286 +g15 +aI167 +aI62 +aI150 +aI82 +aI160 +aI73 +aa(lp8287 +g15 +aI182 +aI21 +aI174 +aI51 +aI179 +aI37 +aa(lp8288 +g15 +aI186 +aI-34 +aI185 +aI5 +aI186 +aI-13 +aa(lp8289 +g20 +aI186 +aI-261 +aa(lp8290 +g15 +aI221 +aI-361 +aI186 +aI-302 +aI198 +aI-335 +aa(lp8291 +g15 +aI333 +aI-419 +aI244 +aI-387 +aI282 +aI-406 +aa(lp8292 +g20 +aI333 +aI-430 +aa(lp8293 +g15 +aI221 +aI-486 +aI281 +aI-442 +aI244 +aI-461 +aa(lp8294 +g15 +aI186 +aI-586 +aI198 +aI-512 +aI186 +aI-545 +aa(lp8295 +g20 +aI186 +aI-812 +aa(lp8296 +g15 +aI182 +aI-868 +aI186 +aI-833 +aI185 +aI-852 +aa(lp8297 +g15 +aI167 +aI-909 +aI179 +aI-884 +aI174 +aI-898 +aa(lp8298 +g15 +aI138 +aI-933 +aI160 +aI-919 +aI150 +aI-928 +aa(lp8299 +g15 +aI91 +aI-942 +aI126 +aI-939 +aI110 +aI-942 +aa(lp8300 +g20 +aI39 +aI-942 +aa(lp8301 +g20 +aI39 +aI-1012 +aa(lp8302 +g20 +aI166 +aI-1012 +aa(lp8303 +g15 +aI336 +aI-962 +aI241 +aI-1012 +aI298 +aI-995 +aa(lp8304 +g15 +aI394 +aI-817 +aI375 +aI-928 +aI394 +aI-880 +aa(lp8305 +g20 +aI394 +aI-588 +aa(lp8306 +g15 +aI406 +aI-527 +aI394 +aI-563 +aI398 +aI-543 +aa(lp8307 +g15 +aI439 +aI-490 +aI414 +aI-512 +aI425 +aI-499 +aa(lp8308 +g15 +aI488 +aI-471 +aI453 +aI-481 +aI469 +aI-475 +aa(lp8309 +g15 +aI549 +aI-465 +aI507 +aI-468 +aI527 +aI-465 +aa(lp8310 +g20 +aI549 +aI-383 +aa(lp8311 +g15 +aI488 +aI-376 +aI527 +aI-382 +aI507 +aI-380 +aa(lp8312 +g15 +aI439 +aI-357 +aI469 +aI-373 +aI453 +aI-366 +aa(lp8313 +g15 +aI406 +aI-320 +aI425 +aI-348 +aI414 +aI-336 +aa(lp8314 +g15 +aI394 +aI-258 +aI398 +aI-304 +aI394 +aI-283 +aa(lp8315 +g20 +aI394 +aI-30 +aa(lp8316 +g15 +aI379 +aI51 +aI394 +aI0 +aI389 +aI27 +aa(lp8317 +g15 +aI336 +aI114 +aI370 +aI76 +aI355 +aI96 +aa(lp8318 +g15 +aI265 +aI153 +aI317 +aI131 +aI293 +aI144 +aa(lp8319 +g15 +aI166 +aI167 +aI236 +aI162 +aI203 +aI167 +aa(lp8320 +g10 +aa(lp8321 +g8 +aI589 +aI0 +aa(lp8322 +g10 +aa(lp8323 +g8 +aI589 +aI0 +aassS'italic' +p8324 +(dp8325 +V +(lp8326 +(lp8327 +g8 +aI346 +aI0 +aa(lp8328 +g10 +aa(lp8329 +g8 +aI346 +aI0 +aasV$ +(lp8330 +(lp8331 +g8 +aI268 +aI-49 +aa(lp8332 +g15 +aI94 +aI-106 +aI194 +aI-54 +aI136 +aI-73 +aa(lp8333 +g15 +aI31 +aI-228 +aI52 +aI-139 +aI31 +aI-180 +aa(lp8334 +g15 +aI64 +aI-308 +aI31 +aI-262 +aI42 +aI-288 +aa(lp8335 +g15 +aI134 +aI-338 +aI86 +aI-328 +aI110 +aI-338 +aa(lp8336 +g15 +aI174 +aI-189 +aI134 +aI-279 +aI147 +aI-230 +aa(lp8337 +g15 +aI281 +aI-115 +aI200 +aI-149 +aI236 +aI-124 +aa(lp8338 +g20 +aI350 +aI-442 +aa(lp8339 +g15 +aI174 +aI-670 +aI233 +aI-500 +aI174 +aI-576 +aa(lp8340 +g15 +aI247 +aI-841 +aI174 +aI-742 +aI198 +aI-799 +aa(lp8341 +g15 +aI451 +aI-911 +aI295 +aI-884 +aI363 +aI-907 +aa(lp8342 +g20 +aI473 +aI-1012 +aa(lp8343 +g20 +aI539 +aI-1012 +aa(lp8344 +g20 +aI518 +aI-911 +aa(lp8345 +g15 +aI710 +aI-778 +aI646 +aI-900 +aI710 +aI-855 +aa(lp8346 +g15 +aI602 +aI-686 +aI710 +aI-716 +aI674 +aI-686 +aa(lp8347 +g15 +aI505 +aI-851 +aI602 +aI-781 +aI570 +aI-837 +aa(lp8348 +g20 +aI437 +aI-531 +aa(lp8349 +g20 +aI451 +aI-523 +aa(lp8350 +g15 +aI604 +aI-410 +aI532 +aI-479 +aI583 +aI-442 +aa(lp8351 +g15 +aI637 +aI-304 +aI626 +aI-378 +aI637 +aI-343 +aa(lp8352 +g15 +aI556 +aI-125 +aI637 +aI-231 +aI610 +aI-172 +aa(lp8353 +g15 +aI333 +aI-47 +aI503 +aI-79 +aI428 +aI-53 +aa(lp8354 +g20 +aI301 +aI105 +aa(lp8355 +g20 +aI234 +aI105 +aa(lp8356 +g10 +aa(lp8357 +g8 +aI377 +aI-562 +aa(lp8358 +g20 +aI438 +aI-853 +aa(lp8359 +g15 +aI298 +aI-689 +aI345 +aI-837 +aI298 +aI-782 +aa(lp8360 +g15 +aI377 +aI-562 +aI298 +aI-637 +aI325 +aI-595 +aa(lp8361 +g10 +aa(lp8362 +g8 +aI412 +aI-412 +aa(lp8363 +g20 +aI348 +aI-112 +aa(lp8364 +g15 +aI467 +aI-164 +aI398 +aI-117 +aI438 +aI-134 +aa(lp8365 +g15 +aI510 +aI-275 +aI495 +aI-194 +aI510 +aI-231 +aa(lp8366 +g15 +aI412 +aI-412 +aI510 +aI-332 +aI477 +aI-378 +aa(lp8367 +g10 +aa(lp8368 +g8 +aI745 +aI0 +aa(lp8369 +g10 +aa(lp8370 +g8 +aI745 +aI0 +aasV( +(lp8371 +(lp8372 +g8 +aI305 +aI109 +aa(lp8373 +g20 +aI292 +aI171 +aa(lp8374 +g15 +aI55 +aI-247 +aI134 +aI102 +aI55 +aI-37 +aa(lp8375 +g15 +aI185 +aI-733 +aI55 +aI-426 +aI99 +aI-588 +aa(lp8376 +g15 +aI544 +aI-1012 +aI271 +aI-877 +aI391 +aI-970 +aa(lp8377 +g20 +aI530 +aI-952 +aa(lp8378 +g15 +aI263 +aI-615 +aI407 +aI-885 +aI318 +aI-773 +aa(lp8379 +g15 +aI181 +aI-185 +aI209 +aI-457 +aI181 +aI-314 +aa(lp8380 +g15 +aI305 +aI109 +aI181 +aI-45 +aI222 +aI52 +aa(lp8381 +g10 +aa(lp8382 +g8 +aI461 +aI0 +aa(lp8383 +g10 +aa(lp8384 +g8 +aI461 +aI0 +aasV, +(lp8385 +(lp8386 +g8 +aI-37 +aI195 +aa(lp8387 +g20 +aI-31 +aI139 +aa(lp8388 +g15 +aI104 +aI27 +aI58 +aI118 +aI104 +aI81 +aa(lp8389 +g15 +aI61 +aI-23 +aI104 +aI11 +aI89 +aI-5 +aa(lp8390 +g15 +aI17 +aI-91 +aI32 +aI-41 +aI17 +aI-64 +aa(lp8391 +g15 +aI40 +aI-148 +aI17 +aI-115 +aI25 +aI-134 +aa(lp8392 +g15 +aI100 +aI-170 +aI55 +aI-162 +aI75 +aI-170 +aa(lp8393 +g15 +aI174 +aI-140 +aI130 +aI-170 +aI154 +aI-160 +aa(lp8394 +g15 +aI203 +aI-60 +aI194 +aI-120 +aI203 +aI-94 +aa(lp8395 +g15 +aI141 +aI104 +aI203 +aI4 +aI183 +aI59 +aa(lp8396 +g15 +aI-37 +aI195 +aI100 +aI149 +aI41 +aI179 +aa(lp8397 +g10 +aa(lp8398 +g8 +aI333 +aI0 +aa(lp8399 +g10 +aa(lp8400 +g8 +aI333 +aI0 +aasV0 +(lp8401 +(lp8402 +g8 +aI453 +aI-966 +aa(lp8403 +g15 +aI638 +aI-886 +aI531 +aI-966 +aI592 +aI-939 +aa(lp8404 +g15 +aI706 +aI-661 +aI683 +aI-832 +aI706 +aI-757 +aa(lp8405 +g15 +aI597 +aI-194 +aI706 +aI-489 +aI670 +aI-334 +aa(lp8406 +g15 +aI310 +aI15 +aI525 +aI-54 +aI429 +aI15 +aa(lp8407 +g15 +aI122 +aI-69 +aI231 +aI15 +aI168 +aI-13 +aa(lp8408 +g15 +aI53 +aI-307 +aI76 +aI-126 +aI53 +aI-205 +aa(lp8409 +g15 +aI164 +aI-765 +aI53 +aI-478 +aI90 +aI-631 +aa(lp8410 +g15 +aI453 +aI-966 +aI237 +aI-899 +aI334 +aI-966 +aa(lp8411 +g10 +aa(lp8412 +g8 +aI321 +aI-58 +aa(lp8413 +g15 +aI507 +aI-250 +aI398 +aI-58 +aI460 +aI-122 +aa(lp8414 +g15 +aI577 +aI-686 +aI554 +aI-378 +aI577 +aI-524 +aa(lp8415 +g15 +aI440 +aI-894 +aI577 +aI-824 +aI531 +aI-894 +aa(lp8416 +g15 +aI253 +aI-700 +aI362 +aI-894 +aI300 +aI-829 +aa(lp8417 +g15 +aI182 +aI-269 +aI206 +aI-571 +aI182 +aI-427 +aa(lp8418 +g15 +aI321 +aI-58 +aI182 +aI-128 +aI229 +aI-58 +aa(lp8419 +g10 +aa(lp8420 +g8 +aI745 +aI0 +aa(lp8421 +g10 +aa(lp8422 +g8 +aI745 +aI0 +aasV4 +(lp8423 +(lp8424 +g8 +aI170 +aI0 +aa(lp8425 +g20 +aI181 +aI-55 +aa(lp8426 +g20 +aI240 +aI-55 +aa(lp8427 +g15 +aI332 +aI-79 +aI282 +aI-55 +aI312 +aI-63 +aa(lp8428 +g15 +aI370 +aI-151 +aI351 +aI-95 +aI363 +aI-119 +aa(lp8429 +g20 +aI391 +aI-260 +aa(lp8430 +g20 +aI-18 +aI-260 +aa(lp8431 +g20 +aI-6 +aI-315 +aa(lp8432 +g20 +aI539 +aI-951 +aa(lp8433 +g20 +aI667 +aI-951 +aa(lp8434 +g20 +aI535 +aI-335 +aa(lp8435 +g20 +aI701 +aI-335 +aa(lp8436 +g20 +aI685 +aI-260 +aa(lp8437 +g20 +aI520 +aI-260 +aa(lp8438 +g20 +aI497 +aI-146 +aa(lp8439 +g15 +aI492 +aI-108 +aI493 +aI-128 +aI492 +aI-116 +aa(lp8440 +g15 +aI587 +aI-55 +aI492 +aI-73 +aI524 +aI-55 +aa(lp8441 +g20 +aI618 +aI-55 +aa(lp8442 +g20 +aI606 +aI0 +aa(lp8443 +g10 +aa(lp8444 +g8 +aI460 +aI-584 +aa(lp8445 +g15 +aI525 +aI-843 +aI481 +aI-685 +aI503 +aI-771 +aa(lp8446 +g15 +aI408 +aI-690 +aI488 +aI-787 +aI449 +aI-736 +aa(lp8447 +g20 +aI105 +aI-335 +aa(lp8448 +g20 +aI408 +aI-335 +aa(lp8449 +g10 +aa(lp8450 +g8 +aI745 +aI0 +aa(lp8451 +g10 +aa(lp8452 +g8 +aI745 +aI0 +aasV8 +(lp8453 +(lp8454 +g8 +aI277 +aI-486 +aa(lp8455 +g15 +aI146 +aI-707 +aI190 +aI-549 +aI146 +aI-622 +aa(lp8456 +g15 +aI228 +aI-897 +aI146 +aI-788 +aI173 +aI-851 +aa(lp8457 +g15 +aI465 +aI-965 +aI283 +aI-942 +aI362 +aI-965 +aa(lp8458 +g15 +aI644 +aI-911 +aI541 +aI-965 +aI600 +aI-947 +aa(lp8459 +g15 +aI710 +aI-770 +aI688 +aI-875 +aI710 +aI-828 +aa(lp8460 +g15 +aI658 +aI-622 +aI710 +aI-713 +aI693 +aI-663 +aa(lp8461 +g15 +aI478 +aI-507 +aI623 +aI-580 +aI563 +aI-542 +aa(lp8462 +g15 +aI647 +aI-269 +aI591 +aI-441 +aI647 +aI-362 +aa(lp8463 +g15 +aI553 +aI-59 +aI647 +aI-178 +aI616 +aI-108 +aa(lp8464 +g15 +aI296 +aI13 +aI490 +aI-10 +aI404 +aI13 +aa(lp8465 +g15 +aI90 +aI-50 +aI210 +aI13 +aI141 +aI-7 +aa(lp8466 +g15 +aI13 +aI-215 +aI38 +aI-92 +aI13 +aI-147 +aa(lp8467 +g15 +aI71 +aI-370 +aI13 +aI-277 +aI32 +aI-328 +aa(lp8468 +g15 +aI277 +aI-486 +aI110 +aI-412 +aI179 +aI-450 +aa(lp8469 +g10 +aa(lp8470 +g8 +aI414 +aI-539 +aa(lp8471 +g15 +aI591 +aI-760 +aI532 +aI-589 +aI591 +aI-663 +aa(lp8472 +g15 +aI555 +aI-861 +aI591 +aI-804 +aI579 +aI-837 +aa(lp8473 +g15 +aI454 +aI-897 +aI531 +aI-885 +aI497 +aI-897 +aa(lp8474 +g15 +aI323 +aI-849 +aI400 +aI-897 +aI356 +aI-881 +aa(lp8475 +g15 +aI274 +aI-722 +aI291 +aI-817 +aI274 +aI-775 +aa(lp8476 +g15 +aI414 +aI-539 +aI274 +aI-650 +aI321 +aI-589 +aa(lp8477 +g10 +aa(lp8478 +g8 +aI338 +aI-451 +aa(lp8479 +g15 +aI141 +aI-213 +aI207 +aI-403 +aI141 +aI-323 +aa(lp8480 +g15 +aI187 +aI-94 +aI141 +aI-163 +aI156 +aI-123 +aa(lp8481 +g15 +aI313 +aI-51 +aI218 +aI-66 +aI260 +aI-51 +aa(lp8482 +g15 +aI464 +aI-101 +aI375 +aI-51 +aI425 +aI-68 +aa(lp8483 +g15 +aI521 +aI-237 +aI502 +aI-134 +aI521 +aI-179 +aa(lp8484 +g15 +aI477 +aI-355 +aI521 +aI-283 +aI506 +aI-322 +aa(lp8485 +g15 +aI338 +aI-451 +aI447 +aI-388 +aI401 +aI-420 +aa(lp8486 +g10 +aa(lp8487 +g8 +aI745 +aI0 +aa(lp8488 +g10 +aa(lp8489 +g8 +aI745 +aI0 +aasV< +(lp8490 +(lp8491 +g8 +aI97 +aI-452 +aa(lp8492 +g20 +aI97 +aI-499 +aa(lp8493 +g20 +aI669 +aI-807 +aa(lp8494 +g20 +aI669 +aI-718 +aa(lp8495 +g20 +aI221 +aI-475 +aa(lp8496 +g20 +aI669 +aI-235 +aa(lp8497 +g20 +aI669 +aI-146 +aa(lp8498 +g10 +aa(lp8499 +g8 +aI745 +aI0 +aa(lp8500 +g10 +aa(lp8501 +g8 +aI745 +aI0 +aasV@ +(lp8502 +(lp8503 +g8 +aI738 +aI-223 +aa(lp8504 +g20 +aI731 +aI-223 +aa(lp8505 +g15 +aI552 +aI-102 +aI689 +aI-142 +aI629 +aI-102 +aa(lp8506 +g15 +aI405 +aI-162 +aI491 +aI-102 +aI442 +aI-122 +aa(lp8507 +g15 +aI349 +aI-330 +aI368 +aI-203 +aI349 +aI-259 +aa(lp8508 +g15 +aI441 +aI-588 +aI349 +aI-424 +aI380 +aI-510 +aa(lp8509 +g15 +aI689 +aI-704 +aI502 +aI-665 +aI585 +aI-704 +aa(lp8510 +g15 +aI814 +aI-664 +aI738 +aI-704 +aI780 +aI-691 +aa(lp8511 +g20 +aI867 +aI-692 +aa(lp8512 +g20 +aI899 +aI-692 +aa(lp8513 +g20 +aI832 +aI-353 +aa(lp8514 +g15 +aI822 +aI-263 +aI825 +aI-322 +aI822 +aI-292 +aa(lp8515 +g15 +aI844 +aI-197 +aI822 +aI-236 +aI830 +aI-214 +aa(lp8516 +g15 +aI904 +aI-172 +aI859 +aI-181 +aI879 +aI-172 +aa(lp8517 +g15 +aI1023 +aI-272 +aI948 +aI-172 +aI987 +aI-205 +aa(lp8518 +g15 +aI1076 +aI-526 +aI1058 +aI-338 +aI1076 +aI-422 +aa(lp8519 +g15 +aI974 +aI-787 +aI1076 +aI-636 +aI1042 +aI-724 +aa(lp8520 +g15 +aI698 +aI-883 +aI906 +aI-851 +aI814 +aI-883 +aa(lp8521 +g15 +aI341 +aI-717 +aI560 +aI-883 +aI441 +aI-828 +aa(lp8522 +g15 +aI192 +aI-293 +aI241 +aI-606 +aI192 +aI-465 +aa(lp8523 +g15 +aI298 +aI12 +aI192 +aI-160 +aI227 +aI-58 +aa(lp8524 +g15 +aI589 +aI120 +aI368 +aI84 +aI465 +aI120 +aa(lp8525 +g15 +aI927 +aI9 +aI711 +aI120 +aI824 +aI83 +aa(lp8526 +g20 +aI958 +aI57 +aa(lp8527 +g15 +aI576 +aI189 +aI839 +aI145 +aI712 +aI189 +aa(lp8528 +g15 +aI216 +aI63 +aI423 +aI189 +aI303 +aI147 +aa(lp8529 +g15 +aI86 +aI-289 +aI129 +aI-21 +aI86 +aI-138 +aa(lp8530 +g15 +aI262 +aI-763 +aI86 +aI-480 +aI145 +aI-638 +aa(lp8531 +g15 +aI706 +aI-951 +aI379 +aI-888 +aI527 +aI-951 +aa(lp8532 +g15 +aI1036 +aI-834 +aI846 +aI-951 +aI956 +aI-912 +aa(lp8533 +g15 +aI1157 +aI-522 +aI1117 +aI-756 +aI1157 +aI-652 +aa(lp8534 +g15 +aI1076 +aI-221 +aI1157 +aI-401 +aI1130 +aI-301 +aa(lp8535 +g15 +aI895 +aI-102 +aI1022 +aI-142 +aI962 +aI-102 +aa(lp8536 +g15 +aI738 +aI-223 +aI818 +aI-102 +aI766 +aI-142 +aa(lp8537 +g10 +aa(lp8538 +g8 +aI769 +aI-610 +aa(lp8539 +g15 +aI694 +aI-649 +aI756 +aI-636 +aI731 +aI-649 +aa(lp8540 +g15 +aI533 +aI-540 +aI627 +aI-649 +aI574 +aI-613 +aa(lp8541 +g15 +aI473 +aI-311 +aI493 +aI-467 +aI473 +aI-391 +aa(lp8542 +g15 +aI501 +aI-206 +aI473 +aI-264 +aI482 +aI-229 +aa(lp8543 +g15 +aI574 +aI-172 +aI520 +aI-184 +aI544 +aI-172 +aa(lp8544 +g15 +aI718 +aI-339 +aI649 +aI-172 +aI697 +aI-228 +aa(lp8545 +g10 +aa(lp8546 +g8 +aI1227 +aI0 +aa(lp8547 +g10 +aa(lp8548 +g8 +aI1227 +aI0 +aasVD +(lp8549 +(lp8550 +g8 +aI-17 +aI-55 +aa(lp8551 +g20 +aI0 +aI-55 +aa(lp8552 +g15 +aI130 +aI-151 +aI73 +aI-55 +aI117 +aI-87 +aa(lp8553 +g20 +aI269 +aI-804 +aa(lp8554 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp8555 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp8556 +g20 +aI161 +aI-895 +aa(lp8557 +g20 +aI173 +aI-951 +aa(lp8558 +g20 +aI546 +aI-951 +aa(lp8559 +g15 +aI826 +aI-857 +aI667 +aI-951 +aI761 +aI-920 +aa(lp8560 +g15 +aI925 +aI-588 +aI892 +aI-794 +aI925 +aI-705 +aa(lp8561 +g15 +aI779 +aI-166 +aI925 +aI-418 +aI876 +aI-277 +aa(lp8562 +g15 +aI391 +aI0 +aI683 +aI-55 +aI553 +aI0 +aa(lp8563 +g20 +aI-27 +aI0 +aa(lp8564 +g10 +aa(lp8565 +g8 +aI362 +aI-67 +aa(lp8566 +g15 +aI667 +aI-215 +aI491 +aI-67 +aI592 +aI-116 +aa(lp8567 +g15 +aI779 +aI-603 +aI742 +aI-313 +aI779 +aI-443 +aa(lp8568 +g15 +aI526 +aI-884 +aI779 +aI-791 +aI695 +aI-884 +aa(lp8569 +g20 +aI421 +aI-884 +aa(lp8570 +g20 +aI246 +aI-67 +aa(lp8571 +g10 +aa(lp8572 +g8 +aI966 +aI0 +aa(lp8573 +g10 +aa(lp8574 +g8 +aI966 +aI0 +aasVH +(lp8575 +(lp8576 +g8 +aI539 +aI0 +aa(lp8577 +g20 +aI550 +aI-55 +aa(lp8578 +g20 +aI567 +aI-55 +aa(lp8579 +g15 +aI660 +aI-79 +aI610 +aI-55 +aI641 +aI-63 +aa(lp8580 +g15 +aI698 +aI-151 +aI679 +aI-95 +aI692 +aI-119 +aa(lp8581 +g20 +aI764 +aI-463 +aa(lp8582 +g20 +aI330 +aI-463 +aa(lp8583 +g20 +aI264 +aI-146 +aa(lp8584 +g15 +aI258 +aI-108 +aI260 +aI-127 +aI258 +aI-114 +aa(lp8585 +g15 +aI354 +aI-55 +aI258 +aI-73 +aI290 +aI-55 +aa(lp8586 +g20 +aI371 +aI-55 +aa(lp8587 +g20 +aI360 +aI0 +aa(lp8588 +g20 +aI-27 +aI0 +aa(lp8589 +g20 +aI-17 +aI-55 +aa(lp8590 +g20 +aI0 +aI-55 +aa(lp8591 +g15 +aI92 +aI-79 +aI42 +aI-55 +aI73 +aI-63 +aa(lp8592 +g15 +aI130 +aI-151 +aI111 +aI-96 +aI123 +aI-119 +aa(lp8593 +g20 +aI269 +aI-804 +aa(lp8594 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp8595 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp8596 +g20 +aI161 +aI-895 +aa(lp8597 +g20 +aI173 +aI-951 +aa(lp8598 +g20 +aI561 +aI-951 +aa(lp8599 +g20 +aI549 +aI-895 +aa(lp8600 +g20 +aI531 +aI-895 +aa(lp8601 +g15 +aI440 +aI-871 +aI489 +aI-895 +aI458 +aI-887 +aa(lp8602 +g15 +aI402 +aI-799 +aI421 +aI-855 +aI408 +aI-831 +aa(lp8603 +g20 +aI345 +aI-530 +aa(lp8604 +g20 +aI778 +aI-530 +aa(lp8605 +g20 +aI837 +aI-804 +aa(lp8606 +g15 +aI842 +aI-841 +aI840 +aI-821 +aI842 +aI-833 +aa(lp8607 +g15 +aI746 +aI-895 +aI842 +aI-877 +aI810 +aI-895 +aa(lp8608 +g20 +aI729 +aI-895 +aa(lp8609 +g20 +aI741 +aI-951 +aa(lp8610 +g20 +aI1129 +aI-951 +aa(lp8611 +g20 +aI1117 +aI-895 +aa(lp8612 +g20 +aI1100 +aI-895 +aa(lp8613 +g15 +aI1008 +aI-870 +aI1057 +aI-895 +aI1027 +aI-887 +aa(lp8614 +g15 +aI970 +aI-799 +aI989 +aI-854 +aI977 +aI-830 +aa(lp8615 +g20 +aI832 +aI-146 +aa(lp8616 +g15 +aI826 +aI-108 +aI828 +aI-129 +aI826 +aI-117 +aa(lp8617 +g15 +aI922 +aI-55 +aI826 +aI-73 +aI858 +aI-55 +aa(lp8618 +g20 +aI940 +aI-55 +aa(lp8619 +g20 +aI927 +aI0 +aa(lp8620 +g10 +aa(lp8621 +g8 +aI1057 +aI0 +aa(lp8622 +g10 +aa(lp8623 +g8 +aI1057 +aI0 +aasVL +(lp8624 +(lp8625 +g8 +aI-14 +aI-55 +aa(lp8626 +g20 +aI2 +aI-55 +aa(lp8627 +g15 +aI92 +aI-79 +aI44 +aI-55 +aI74 +aI-63 +aa(lp8628 +g15 +aI130 +aI-151 +aI110 +aI-96 +aI123 +aI-119 +aa(lp8629 +g20 +aI269 +aI-804 +aa(lp8630 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp8631 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp8632 +g20 +aI161 +aI-895 +aa(lp8633 +g20 +aI173 +aI-951 +aa(lp8634 +g20 +aI561 +aI-951 +aa(lp8635 +g20 +aI549 +aI-895 +aa(lp8636 +g20 +aI531 +aI-895 +aa(lp8637 +g15 +aI441 +aI-872 +aI489 +aI-895 +aI459 +aI-887 +aa(lp8638 +g15 +aI404 +aI-804 +aI423 +aI-857 +aI410 +aI-835 +aa(lp8639 +g20 +aI246 +aI-65 +aa(lp8640 +g20 +aI509 +aI-65 +aa(lp8641 +g15 +aI651 +aI-186 +aI577 +aI-65 +aI624 +aI-106 +aa(lp8642 +g20 +aI686 +aI-286 +aa(lp8643 +g20 +aI755 +aI-286 +aa(lp8644 +g20 +aI686 +aI0 +aa(lp8645 +g20 +aI-26 +aI0 +aa(lp8646 +g10 +aa(lp8647 +g8 +aI830 +aI0 +aa(lp8648 +g10 +aa(lp8649 +g8 +aI830 +aI0 +aasVP +(lp8650 +(lp8651 +g8 +aI-26 +aI0 +aa(lp8652 +g20 +aI-14 +aI-55 +aa(lp8653 +g20 +aI2 +aI-55 +aa(lp8654 +g15 +aI93 +aI-79 +aI44 +aI-55 +aI74 +aI-63 +aa(lp8655 +g15 +aI130 +aI-151 +aI111 +aI-95 +aI124 +aI-119 +aa(lp8656 +g20 +aI269 +aI-804 +aa(lp8657 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp8658 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp8659 +g20 +aI161 +aI-895 +aa(lp8660 +g20 +aI173 +aI-951 +aa(lp8661 +g20 +aI514 +aI-951 +aa(lp8662 +g15 +aI738 +aI-884 +aI611 +aI-951 +aI685 +aI-929 +aa(lp8663 +g15 +aI818 +aI-694 +aI791 +aI-839 +aI818 +aI-776 +aa(lp8664 +g15 +aI716 +aI-456 +aI818 +aI-593 +aI784 +aI-513 +aa(lp8665 +g15 +aI410 +aI-369 +aI648 +aI-398 +aI546 +aI-369 +aa(lp8666 +g20 +aI311 +aI-369 +aa(lp8667 +g20 +aI264 +aI-146 +aa(lp8668 +g15 +aI258 +aI-108 +aI260 +aI-127 +aI258 +aI-115 +aa(lp8669 +g15 +aI354 +aI-55 +aI258 +aI-73 +aI290 +aI-55 +aa(lp8670 +g20 +aI398 +aI-55 +aa(lp8671 +g20 +aI386 +aI0 +aa(lp8672 +g10 +aa(lp8673 +g8 +aI325 +aI-433 +aa(lp8674 +g20 +aI395 +aI-433 +aa(lp8675 +g15 +aI677 +aI-692 +aI583 +aI-433 +aI677 +aI-519 +aa(lp8676 +g15 +aI482 +aI-887 +aI677 +aI-822 +aI612 +aI-887 +aa(lp8677 +g20 +aI421 +aI-887 +aa(lp8678 +g10 +aa(lp8679 +g8 +aI826 +aI0 +aa(lp8680 +g10 +aa(lp8681 +g8 +aI826 +aI0 +aasVT +(lp8682 +(lp8683 +g8 +aI427 +aI-146 +aa(lp8684 +g15 +aI422 +aI-108 +aI424 +aI-129 +aI422 +aI-117 +aa(lp8685 +g15 +aI518 +aI-55 +aI422 +aI-73 +aI454 +aI-55 +aa(lp8686 +g20 +aI549 +aI-55 +aa(lp8687 +g20 +aI537 +aI0 +aa(lp8688 +g20 +aI122 +aI0 +aa(lp8689 +g20 +aI134 +aI-55 +aa(lp8690 +g20 +aI165 +aI-55 +aa(lp8691 +g15 +aI258 +aI-78 +aI210 +aI-55 +aI241 +aI-63 +aa(lp8692 +g15 +aI293 +aI-144 +aI275 +aI-94 +aI287 +aI-116 +aa(lp8693 +g20 +aI450 +aI-884 +aa(lp8694 +g20 +aI322 +aI-884 +aa(lp8695 +g15 +aI189 +aI-775 +aI259 +aI-884 +aI215 +aI-848 +aa(lp8696 +g20 +aI170 +aI-718 +aa(lp8697 +g20 +aI101 +aI-718 +aa(lp8698 +g20 +aI157 +aI-951 +aa(lp8699 +g20 +aI908 +aI-951 +aa(lp8700 +g20 +aI865 +aI-718 +aa(lp8701 +g20 +aI796 +aI-718 +aa(lp8702 +g15 +aI802 +aI-799 +aI800 +aI-753 +aI802 +aI-780 +aa(lp8703 +g15 +aI714 +aI-884 +aI802 +aI-856 +aI773 +aI-884 +aa(lp8704 +g20 +aI585 +aI-884 +aa(lp8705 +g10 +aa(lp8706 +g8 +aI817 +aI0 +aa(lp8707 +g10 +aa(lp8708 +g8 +aI817 +aI0 +aasVX +(lp8709 +(lp8710 +g8 +aI949 +aI-895 +aa(lp8711 +g20 +aI937 +aI-895 +aa(lp8712 +g15 +aI872 +aI-875 +aI913 +aI-895 +aI891 +aI-888 +aa(lp8713 +g15 +aI786 +aI-795 +aI852 +aI-862 +aI824 +aI-836 +aa(lp8714 +g20 +aI534 +aI-517 +aa(lp8715 +g20 +aI694 +aI-126 +aa(lp8716 +g15 +aI786 +aI-55 +aI714 +aI-79 +aI744 +aI-55 +aa(lp8717 +g20 +aI804 +aI-55 +aa(lp8718 +g20 +aI792 +aI0 +aa(lp8719 +g20 +aI432 +aI0 +aa(lp8720 +g20 +aI444 +aI-55 +aa(lp8721 +g20 +aI458 +aI-55 +aa(lp8722 +g15 +aI521 +aI-68 +aI485 +aI-55 +aI506 +aI-59 +aa(lp8723 +g15 +aI544 +aI-102 +aI536 +aI-77 +aI544 +aI-88 +aa(lp8724 +g15 +aI518 +aI-194 +aI544 +aI-120 +aI535 +aI-151 +aa(lp8725 +g20 +aI432 +aI-406 +aa(lp8726 +g20 +aI233 +aI-185 +aa(lp8727 +g15 +aI179 +aI-91 +aI197 +aI-145 +aI179 +aI-114 +aa(lp8728 +g15 +aI258 +aI-55 +aI179 +aI-67 +aI205 +aI-55 +aa(lp8729 +g20 +aI262 +aI-55 +aa(lp8730 +g20 +aI250 +aI0 +aa(lp8731 +g20 +aI-65 +aI0 +aa(lp8732 +g20 +aI-53 +aI-55 +aa(lp8733 +g20 +aI-48 +aI-55 +aa(lp8734 +g15 +aI29 +aI-78 +aI-19 +aI-55 +aI6 +aI-63 +aa(lp8735 +g15 +aI109 +aI-151 +aI52 +aI-93 +aI78 +aI-117 +aa(lp8736 +g20 +aI404 +aI-472 +aa(lp8737 +g20 +aI261 +aI-827 +aa(lp8738 +g15 +aI157 +aI-895 +aI242 +aI-872 +aI208 +aI-895 +aa(lp8739 +g20 +aI139 +aI-895 +aa(lp8740 +g20 +aI151 +aI-951 +aa(lp8741 +g20 +aI513 +aI-951 +aa(lp8742 +g20 +aI501 +aI-895 +aa(lp8743 +g20 +aI470 +aI-895 +aa(lp8744 +g15 +aI408 +aI-858 +aI429 +aI-895 +aI408 +aI-883 +aa(lp8745 +g15 +aI432 +aI-778 +aI408 +aI-845 +aI416 +aI-818 +aa(lp8746 +g20 +aI507 +aI-583 +aa(lp8747 +g20 +aI674 +aI-775 +aa(lp8748 +g15 +aI725 +aI-862 +aI708 +aI-814 +aI725 +aI-843 +aa(lp8749 +g15 +aI661 +aI-895 +aI725 +aI-884 +aI703 +aI-895 +aa(lp8750 +g20 +aI657 +aI-895 +aa(lp8751 +g20 +aI669 +aI-951 +aa(lp8752 +g20 +aI961 +aI-951 +aa(lp8753 +g10 +aa(lp8754 +g8 +aI880 +aI0 +aa(lp8755 +g10 +aa(lp8756 +g8 +aI880 +aI0 +aasV\u005C +(lp8757 +(lp8758 +g8 +aI150 +aI-1012 +aa(lp8759 +g20 +aI227 +aI-1012 +aa(lp8760 +g20 +aI285 +aI161 +aa(lp8761 +g20 +aI206 +aI161 +aa(lp8762 +g10 +aa(lp8763 +g8 +aI384 +aI0 +aa(lp8764 +g10 +aa(lp8765 +g8 +aI384 +aI0 +aasV` +(lp8766 +(lp8767 +g8 +aI539 +aI-807 +aa(lp8768 +g15 +aI367 +aI-1007 +aI472 +aI-872 +aI415 +aI-939 +aa(lp8769 +g20 +aI371 +aI-1021 +aa(lp8770 +g20 +aI505 +aI-1021 +aa(lp8771 +g15 +aI594 +aI-825 +aI531 +aI-953 +aI560 +aI-888 +aa(lp8772 +g20 +aI590 +aI-807 +aa(lp8773 +g10 +aa(lp8774 +g8 +aI769 +aI0 +aa(lp8775 +g10 +aa(lp8776 +g8 +aI769 +aI0 +aasVd +(lp8777 +(lp8778 +g8 +aI486 +aI-200 +aa(lp8779 +g20 +aI478 +aI-200 +aa(lp8780 +g15 +aI229 +aI13 +aI414 +aI-57 +aI331 +aI13 +aa(lp8781 +g15 +aI102 +aI-50 +aI174 +aI13 +aI132 +aI-7 +aa(lp8782 +g15 +aI57 +aI-230 +aI72 +aI-93 +aI57 +aI-153 +aa(lp8783 +g15 +aI171 +aI-570 +aI57 +aI-352 +aI95 +aI-465 +aa(lp8784 +g15 +aI454 +aI-727 +aI247 +aI-675 +aI342 +aI-727 +aa(lp8785 +g15 +aI585 +aI-695 +aI504 +aI-727 +aI547 +aI-716 +aa(lp8786 +g15 +aI600 +aI-770 +aI592 +aI-736 +aI597 +aI-761 +aa(lp8787 +g20 +aI613 +aI-834 +aa(lp8788 +g15 +aI622 +aI-894 +aI619 +aI-864 +aI622 +aI-884 +aa(lp8789 +g15 +aI529 +aI-956 +aI622 +aI-935 +aI591 +aI-956 +aa(lp8790 +g20 +aI518 +aI-956 +aa(lp8791 +g20 +aI530 +aI-1012 +aa(lp8792 +g20 +aI776 +aI-1012 +aa(lp8793 +g20 +aI621 +aI-286 +aa(lp8794 +g15 +aI601 +aI-138 +aI608 +aI-224 +aI601 +aI-175 +aa(lp8795 +g15 +aI645 +aI-70 +aI601 +aI-93 +aI616 +aI-70 +aa(lp8796 +g15 +aI741 +aI-105 +aI670 +aI-70 +aI702 +aI-82 +aa(lp8797 +g20 +aI765 +aI-65 +aa(lp8798 +g15 +aI577 +aI13 +aI701 +aI-13 +aI639 +aI13 +aa(lp8799 +g15 +aI473 +aI-97 +aI508 +aI13 +aI473 +aI-23 +aa(lp8800 +g15 +aI486 +aI-200 +aI473 +aI-125 +aI477 +aI-159 +aa(lp8801 +g10 +aa(lp8802 +g8 +aI562 +aI-619 +aa(lp8803 +g15 +aI461 +aI-667 +aI542 +aI-651 +aI508 +aI-667 +aa(lp8804 +g15 +aI270 +aI-522 +aI385 +aI-667 +aI321 +aI-619 +aa(lp8805 +g15 +aI193 +aI-224 +aI219 +aI-426 +aI193 +aI-326 +aa(lp8806 +g15 +aI277 +aI-70 +aI193 +aI-121 +aI221 +aI-70 +aa(lp8807 +g15 +aI416 +aI-168 +aI321 +aI-70 +aI368 +aI-103 +aa(lp8808 +g15 +aI513 +aI-383 +aI465 +aI-234 +aI497 +aI-305 +aa(lp8809 +g10 +aa(lp8810 +g8 +aI772 +aI0 +aa(lp8811 +g10 +aa(lp8812 +g8 +aI772 +aI0 +aasVh +(lp8813 +(lp8814 +g8 +aI306 +aI-546 +aa(lp8815 +g15 +aI553 +aI-726 +aI380 +aI-666 +aI462 +aI-726 +aa(lp8816 +g15 +aI695 +aI-578 +aI648 +aI-726 +aI695 +aI-676 +aa(lp8817 +g15 +aI671 +aI-431 +aI695 +aI-550 +aI687 +aI-501 +aa(lp8818 +g20 +aI637 +aI-274 +aa(lp8819 +g15 +aI619 +aI-134 +aI625 +aI-220 +aI619 +aI-174 +aa(lp8820 +g15 +aI666 +aI-70 +aI619 +aI-91 +aI635 +aI-70 +aa(lp8821 +g15 +aI751 +aI-101 +aI692 +aI-70 +aI720 +aI-80 +aa(lp8822 +g20 +aI776 +aI-62 +aa(lp8823 +g15 +aI613 +aI13 +aI717 +aI-11 +aI663 +aI13 +aa(lp8824 +g15 +aI525 +aI-22 +aI576 +aI13 +aI546 +aI1 +aa(lp8825 +g15 +aI492 +aI-119 +aI503 +aI-46 +aI492 +aI-78 +aa(lp8826 +g15 +aI517 +aI-299 +aI492 +aI-160 +aI500 +aI-220 +aa(lp8827 +g20 +aI548 +aI-437 +aa(lp8828 +g15 +aI567 +aI-562 +aI561 +aI-491 +aI567 +aI-532 +aa(lp8829 +g15 +aI506 +aI-640 +aI567 +aI-614 +aI547 +aI-640 +aa(lp8830 +g15 +aI353 +aI-539 +aI457 +aI-640 +aI406 +aI-607 +aa(lp8831 +g15 +aI254 +aI-340 +aI301 +aI-472 +aI268 +aI-405 +aa(lp8832 +g20 +aI182 +aI0 +aa(lp8833 +g20 +aI58 +aI0 +aa(lp8834 +g20 +aI231 +aI-823 +aa(lp8835 +g15 +aI244 +aI-894 +aI240 +aI-862 +aI244 +aI-886 +aa(lp8836 +g15 +aI150 +aI-956 +aI244 +aI-935 +aI212 +aI-956 +aa(lp8837 +g20 +aI139 +aI-956 +aa(lp8838 +g20 +aI151 +aI-1012 +aa(lp8839 +g20 +aI397 +aI-1012 +aa(lp8840 +g20 +aI345 +aI-767 +aa(lp8841 +g15 +aI292 +aI-546 +aI329 +aI-694 +aI311 +aI-621 +aa(lp8842 +g10 +aa(lp8843 +g8 +aI798 +aI0 +aa(lp8844 +g10 +aa(lp8845 +g8 +aI798 +aI0 +aasVl +(lp8846 +(lp8847 +g8 +aI134 +aI-956 +aa(lp8848 +g20 +aI146 +aI-1012 +aa(lp8849 +g20 +aI398 +aI-1012 +aa(lp8850 +g20 +aI244 +aI-286 +aa(lp8851 +g15 +aI223 +aI-138 +aI230 +aI-222 +aI223 +aI-173 +aa(lp8852 +g15 +aI268 +aI-70 +aI223 +aI-93 +aI238 +aI-70 +aa(lp8853 +g15 +aI363 +aI-105 +aI293 +aI-70 +aI325 +aI-82 +aa(lp8854 +g20 +aI388 +aI-65 +aa(lp8855 +g15 +aI207 +aI13 +aI326 +aI-13 +aI266 +aI13 +aa(lp8856 +g15 +aI128 +aI-21 +aI175 +aI13 +aI149 +aI1 +aa(lp8857 +g15 +aI97 +aI-112 +aI107 +aI-45 +aI97 +aI-75 +aa(lp8858 +g15 +aI126 +aI-322 +aI97 +aI-154 +aI107 +aI-224 +aa(lp8859 +g20 +aI235 +aI-834 +aa(lp8860 +g15 +aI244 +aI-894 +aI241 +aI-860 +aI244 +aI-880 +aa(lp8861 +g15 +aI150 +aI-956 +aI244 +aI-935 +aI212 +aI-956 +aa(lp8862 +g10 +aa(lp8863 +g8 +aI405 +aI0 +aa(lp8864 +g10 +aa(lp8865 +g8 +aI405 +aI0 +aasVp +(lp8866 +(lp8867 +g8 +aI253 +aI264 +aa(lp8868 +g20 +aI241 +aI320 +aa(lp8869 +g20 +aI-9 +aI320 +aa(lp8870 +g20 +aI167 +aI-524 +aa(lp8871 +g15 +aI179 +aI-595 +aI175 +aI-562 +aI179 +aI-585 +aa(lp8872 +g15 +aI86 +aI-658 +aI179 +aI-637 +aI148 +aI-658 +aa(lp8873 +g20 +aI76 +aI-658 +aa(lp8874 +g20 +aI87 +aI-714 +aa(lp8875 +g20 +aI324 +aI-714 +aa(lp8876 +g20 +aI292 +aI-536 +aa(lp8877 +g20 +aI298 +aI-536 +aa(lp8878 +g15 +aI542 +aI-727 +aI363 +aI-663 +aI444 +aI-727 +aa(lp8879 +g15 +aI668 +aI-665 +aI597 +aI-727 +aI638 +aI-706 +aa(lp8880 +g15 +aI712 +aI-486 +aI697 +aI-624 +aI712 +aI-564 +aa(lp8881 +g15 +aI600 +aI-147 +aI712 +aI-367 +aI675 +aI-253 +aa(lp8882 +g15 +aI314 +aI13 +aI526 +aI-40 +aI430 +aI13 +aa(lp8883 +g15 +aI184 +aI-17 +aI263 +aI13 +aI220 +aI3 +aa(lp8884 +g15 +aI173 +aI47 +aI180 +aI11 +aI176 +aI33 +aa(lp8885 +g20 +aI154 +aI128 +aa(lp8886 +g15 +aI142 +aI202 +aI146 +aI165 +aI142 +aI190 +aa(lp8887 +g15 +aI235 +aI264 +aI142 +aI244 +aI173 +aI264 +aa(lp8888 +g10 +aa(lp8889 +g8 +aI205 +aI-93 +aa(lp8890 +g15 +aI310 +aI-46 +aI233 +aI-62 +aI268 +aI-46 +aa(lp8891 +g15 +aI499 +aI-191 +aI384 +aI-46 +aI447 +aI-94 +aa(lp8892 +g15 +aI576 +aI-487 +aI550 +aI-288 +aI576 +aI-387 +aa(lp8893 +g15 +aI492 +aI-643 +aI576 +aI-591 +aI548 +aI-643 +aa(lp8894 +g15 +aI352 +aI-547 +aI446 +aI-643 +aI399 +aI-611 +aa(lp8895 +g15 +aI259 +aI-347 +aI305 +aI-483 +aI274 +aI-416 +aa(lp8896 +g10 +aa(lp8897 +g8 +aI769 +aI0 +aa(lp8898 +g10 +aa(lp8899 +g8 +aI769 +aI0 +aasVt +(lp8900 +(lp8901 +g8 +aI401 +aI-99 +aa(lp8902 +g20 +aI423 +aI-50 +aa(lp8903 +g15 +aI244 +aI13 +aI363 +aI-7 +aI304 +aI13 +aa(lp8904 +g15 +aI98 +aI-142 +aI147 +aI13 +aI98 +aI-38 +aa(lp8905 +g15 +aI111 +aI-254 +aI98 +aI-175 +aI103 +aI-212 +aa(lp8906 +g20 +aI193 +aI-638 +aa(lp8907 +g20 +aI91 +aI-638 +aa(lp8908 +g20 +aI104 +aI-691 +aa(lp8909 +g15 +aI307 +aI-878 +aI190 +aI-691 +aI258 +aI-753 +aa(lp8910 +g20 +aI369 +aI-878 +aa(lp8911 +g20 +aI334 +aI-714 +aa(lp8912 +g20 +aI496 +aI-714 +aa(lp8913 +g20 +aI479 +aI-638 +aa(lp8914 +g20 +aI318 +aI-638 +aa(lp8915 +g20 +aI237 +aI-258 +aa(lp8916 +g15 +aI221 +aI-143 +aI226 +aI-206 +aI221 +aI-168 +aa(lp8917 +g15 +aI292 +aI-70 +aI221 +aI-94 +aI245 +aI-70 +aa(lp8918 +g15 +aI401 +aI-99 +aI328 +aI-70 +aI364 +aI-80 +aa(lp8919 +g10 +aa(lp8920 +g8 +aI490 +aI0 +aa(lp8921 +g10 +aa(lp8922 +g8 +aI490 +aI0 +aasVx +(lp8923 +(lp8924 +g8 +aI-26 +aI0 +aa(lp8925 +g20 +aI-11 +aI-55 +aa(lp8926 +g20 +aI5 +aI-55 +aa(lp8927 +g15 +aI68 +aI-72 +aI29 +aI-55 +aI50 +aI-61 +aa(lp8928 +g15 +aI143 +aI-147 +aI86 +aI-83 +aI111 +aI-108 +aa(lp8929 +g20 +aI314 +aI-354 +aa(lp8930 +g20 +aI227 +aI-562 +aa(lp8931 +g15 +aI185 +aI-641 +aI210 +aI-603 +aI196 +aI-629 +aa(lp8932 +g15 +aI132 +aI-658 +aI174 +aI-652 +aI156 +aI-658 +aa(lp8933 +g20 +aI114 +aI-658 +aa(lp8934 +g20 +aI125 +aI-714 +aa(lp8935 +g20 +aI302 +aI-714 +aa(lp8936 +g20 +aI404 +aI-444 +aa(lp8937 +g20 +aI581 +aI-714 +aa(lp8938 +g20 +aI751 +aI-714 +aa(lp8939 +g20 +aI730 +aI-658 +aa(lp8940 +g20 +aI713 +aI-658 +aa(lp8941 +g15 +aI648 +aI-639 +aI687 +aI-658 +aI665 +aI-652 +aa(lp8942 +g15 +aI574 +aI-562 +aI630 +aI-626 +aI606 +aI-601 +aa(lp8943 +g20 +aI434 +aI-382 +aa(lp8944 +g20 +aI526 +aI-151 +aa(lp8945 +g15 +aI566 +aI-73 +aI542 +aI-111 +aI555 +aI-85 +aa(lp8946 +g15 +aI622 +aI-55 +aI577 +aI-61 +aI596 +aI-55 +aa(lp8947 +g20 +aI639 +aI-55 +aa(lp8948 +g20 +aI629 +aI0 +aa(lp8949 +g20 +aI450 +aI0 +aa(lp8950 +g20 +aI342 +aI-293 +aa(lp8951 +g20 +aI142 +aI0 +aa(lp8952 +g10 +aa(lp8953 +g8 +aI727 +aI0 +aa(lp8954 +g10 +aa(lp8955 +g8 +aI727 +aI0 +aasV| +(lp8956 +(lp8957 +g8 +aI422 +aI320 +aa(lp8958 +g20 +aI342 +aI320 +aa(lp8959 +g20 +aI342 +aI-1012 +aa(lp8960 +g20 +aI422 +aI-1012 +aa(lp8961 +g10 +aa(lp8962 +g8 +aI745 +aI0 +aa(lp8963 +g10 +aa(lp8964 +g8 +aI745 +aI0 +aasV# +(lp8965 +(lp8966 +g8 +aI675 +aI-349 +aa(lp8967 +g20 +aI666 +aI-270 +aa(lp8968 +g20 +aI498 +aI-270 +aa(lp8969 +g20 +aI419 +aI0 +aa(lp8970 +g20 +aI339 +aI0 +aa(lp8971 +g20 +aI418 +aI-270 +aa(lp8972 +g20 +aI233 +aI-270 +aa(lp8973 +g20 +aI154 +aI0 +aa(lp8974 +g20 +aI74 +aI0 +aa(lp8975 +g20 +aI153 +aI-270 +aa(lp8976 +g20 +aI44 +aI-270 +aa(lp8977 +g20 +aI53 +aI-349 +aa(lp8978 +g20 +aI177 +aI-349 +aa(lp8979 +g20 +aI254 +aI-610 +aa(lp8980 +g20 +aI95 +aI-610 +aa(lp8981 +g20 +aI104 +aI-689 +aa(lp8982 +g20 +aI277 +aI-689 +aa(lp8983 +g20 +aI353 +aI-951 +aa(lp8984 +g20 +aI434 +aI-951 +aa(lp8985 +g20 +aI357 +aI-689 +aa(lp8986 +g20 +aI542 +aI-689 +aa(lp8987 +g20 +aI619 +aI-951 +aa(lp8988 +g20 +aI699 +aI-951 +aa(lp8989 +g20 +aI622 +aI-689 +aa(lp8990 +g20 +aI726 +aI-689 +aa(lp8991 +g20 +aI718 +aI-610 +aa(lp8992 +g20 +aI600 +aI-610 +aa(lp8993 +g20 +aI524 +aI-349 +aa(lp8994 +g10 +aa(lp8995 +g8 +aI258 +aI-349 +aa(lp8996 +g20 +aI444 +aI-349 +aa(lp8997 +g20 +aI520 +aI-610 +aa(lp8998 +g20 +aI334 +aI-610 +aa(lp8999 +g10 +aa(lp9000 +g8 +aI745 +aI0 +aa(lp9001 +g10 +aa(lp9002 +g8 +aI745 +aI0 +aasV' +(lp9003 +(lp9004 +g8 +aI195 +aI-951 +aa(lp9005 +g20 +aI337 +aI-951 +aa(lp9006 +g20 +aI230 +aI-638 +aa(lp9007 +g20 +aI169 +aI-638 +aa(lp9008 +g10 +aa(lp9009 +g8 +aI293 +aI0 +aa(lp9010 +g10 +aa(lp9011 +g8 +aI293 +aI0 +aasV+ +(lp9012 +(lp9013 +g8 +aI422 +aI-437 +aa(lp9014 +g20 +aI422 +aI-190 +aa(lp9015 +g20 +aI342 +aI-190 +aa(lp9016 +g20 +aI342 +aI-437 +aa(lp9017 +g20 +aI97 +aI-437 +aa(lp9018 +g20 +aI97 +aI-515 +aa(lp9019 +g20 +aI342 +aI-515 +aa(lp9020 +g20 +aI342 +aI-761 +aa(lp9021 +g20 +aI422 +aI-761 +aa(lp9022 +g20 +aI422 +aI-515 +aa(lp9023 +g20 +aI669 +aI-515 +aa(lp9024 +g20 +aI669 +aI-437 +aa(lp9025 +g10 +aa(lp9026 +g8 +aI745 +aI0 +aa(lp9027 +g10 +aa(lp9028 +g8 +aI745 +aI0 +aasV/ +(lp9029 +(lp9030 +g8 +aI-39 +aI161 +aa(lp9031 +g20 +aI-123 +aI161 +aa(lp9032 +g20 +aI423 +aI-1012 +aa(lp9033 +g20 +aI507 +aI-1012 +aa(lp9034 +g10 +aa(lp9035 +g8 +aI384 +aI0 +aa(lp9036 +g10 +aa(lp9037 +g8 +aI384 +aI0 +aasV3 +(lp9038 +(lp9039 +g8 +aI235 +aI-458 +aa(lp9040 +g20 +aI249 +aI-526 +aa(lp9041 +g20 +aI292 +aI-526 +aa(lp9042 +g15 +aI478 +aI-595 +aI367 +aI-526 +aI430 +aI-549 +aa(lp9043 +g15 +aI552 +aI-776 +aI527 +aI-642 +aI552 +aI-702 +aa(lp9044 +g15 +aI438 +aI-897 +aI552 +aI-857 +aI514 +aI-897 +aa(lp9045 +g15 +aI249 +aI-699 +aI339 +aI-897 +aI276 +aI-831 +aa(lp9046 +g15 +aI150 +aI-784 +aI183 +aI-699 +aI150 +aI-727 +aa(lp9047 +g15 +aI233 +aI-913 +aI150 +aI-836 +aI178 +aI-879 +aa(lp9048 +g15 +aI444 +aI-965 +aI288 +aI-947 +aI358 +aI-965 +aa(lp9049 +g15 +aI623 +aI-913 +aI519 +aI-965 +aI579 +aI-947 +aa(lp9050 +g15 +aI689 +aI-774 +aI667 +aI-879 +aI689 +aI-832 +aa(lp9051 +g15 +aI617 +aI-597 +aI689 +aI-706 +aI665 +aI-647 +aa(lp9052 +g15 +aI421 +aI-500 +aI569 +aI-547 +aI504 +aI-515 +aa(lp9053 +g15 +aI569 +aI-436 +aI485 +aI-494 +aI534 +aI-472 +aa(lp9054 +g15 +aI621 +aI-299 +aI603 +aI-400 +aI621 +aI-354 +aa(lp9055 +g15 +aI517 +aI-67 +aI621 +aI-199 +aI586 +aI-122 +aa(lp9056 +g15 +aI254 +aI13 +aI448 +aI-13 +aI360 +aI13 +aa(lp9057 +g15 +aI61 +aI-24 +aI169 +aI13 +aI104 +aI0 +aa(lp9058 +g15 +aI-3 +aI-126 +aI17 +aI-50 +aI-3 +aI-83 +aa(lp9059 +g15 +aI24 +aI-197 +aI-3 +aI-156 +aI5 +aI-179 +aa(lp9060 +g15 +aI97 +aI-224 +aI42 +aI-215 +aI67 +aI-224 +aa(lp9061 +g15 +aI141 +aI-105 +aI97 +aI-176 +aI112 +aI-136 +aa(lp9062 +g15 +aI264 +aI-59 +aI170 +aI-74 +aI211 +aI-59 +aa(lp9063 +g15 +aI420 +aI-119 +aI327 +aI-59 +aI379 +aI-79 +aa(lp9064 +g15 +aI481 +aI-284 +aI460 +aI-160 +aI481 +aI-215 +aa(lp9065 +g15 +aI431 +aI-412 +aI481 +aI-339 +aI464 +aI-382 +aa(lp9066 +g15 +aI293 +aI-458 +aI399 +aI-443 +aI353 +aI-458 +aa(lp9067 +g10 +aa(lp9068 +g8 +aI745 +aI0 +aa(lp9069 +g10 +aa(lp9070 +g8 +aI745 +aI0 +aasV7 +(lp9071 +(lp9072 +g8 +aI143 +aI0 +aa(lp9073 +g20 +aI637 +aI-844 +aa(lp9074 +g20 +aI286 +aI-844 +aa(lp9075 +g15 +aI194 +aI-776 +aI237 +aI-844 +aI207 +aI-822 +aa(lp9076 +g20 +aI175 +aI-710 +aa(lp9077 +g20 +aI119 +aI-710 +aa(lp9078 +g20 +aI177 +aI-951 +aa(lp9079 +g20 +aI773 +aI-951 +aa(lp9080 +g20 +aI765 +aI-912 +aa(lp9081 +g20 +aI244 +aI0 +aa(lp9082 +g10 +aa(lp9083 +g8 +aI745 +aI0 +aa(lp9084 +g10 +aa(lp9085 +g8 +aI745 +aI0 +aasV; +(lp9086 +(lp9087 +g8 +aI248 +aI-536 +aa(lp9088 +g15 +aI165 +aI-618 +aI192 +aI-536 +aI165 +aI-563 +aa(lp9089 +g15 +aI189 +aI-692 +aI165 +aI-648 +aI173 +aI-673 +aa(lp9090 +g15 +aI253 +aI-720 +aI204 +aI-711 +aI226 +aI-720 +aa(lp9091 +g15 +aI335 +aI-639 +aI308 +aI-720 +aI335 +aI-693 +aa(lp9092 +g15 +aI312 +aI-564 +aI335 +aI-607 +aI328 +aI-582 +aa(lp9093 +g15 +aI248 +aI-536 +aI296 +aI-545 +aI274 +aI-536 +aa(lp9094 +g10 +aa(lp9095 +g8 +aI24 +aI195 +aa(lp9096 +g20 +aI29 +aI139 +aa(lp9097 +g15 +aI165 +aI27 +aI120 +aI118 +aI165 +aI81 +aa(lp9098 +g15 +aI122 +aI-23 +aI165 +aI11 +aI151 +aI-5 +aa(lp9099 +g15 +aI78 +aI-91 +aI93 +aI-41 +aI78 +aI-64 +aa(lp9100 +g15 +aI101 +aI-148 +aI78 +aI-115 +aI86 +aI-134 +aa(lp9101 +g15 +aI161 +aI-170 +aI116 +aI-162 +aI136 +aI-170 +aa(lp9102 +g15 +aI236 +aI-139 +aI191 +aI-170 +aI216 +aI-160 +aa(lp9103 +g15 +aI265 +aI-60 +aI255 +aI-119 +aI265 +aI-93 +aa(lp9104 +g15 +aI202 +aI104 +aI265 +aI4 +aI244 +aI59 +aa(lp9105 +g15 +aI24 +aI195 +aI160 +aI149 +aI101 +aI179 +aa(lp9106 +g10 +aa(lp9107 +g8 +aI381 +aI0 +aa(lp9108 +g10 +aa(lp9109 +g8 +aI381 +aI0 +aasV? +(lp9110 +(lp9111 +g8 +aI367 +aI-422 +aa(lp9112 +g20 +aI334 +aI-267 +aa(lp9113 +g20 +aI253 +aI-267 +aa(lp9114 +g20 +aI294 +aI-465 +aa(lp9115 +g15 +aI565 +aI-754 +aI475 +aI-531 +aI565 +aI-628 +aa(lp9116 +g15 +aI529 +aI-858 +aI565 +aI-797 +aI553 +aI-832 +aa(lp9117 +g15 +aI436 +aI-897 +aI506 +aI-884 +aI475 +aI-897 +aa(lp9118 +g15 +aI270 +aI-709 +aI344 +aI-897 +aI289 +aI-835 +aa(lp9119 +g15 +aI174 +aI-788 +aI206 +aI-709 +aI174 +aI-735 +aa(lp9120 +g15 +aI249 +aI-913 +aI174 +aI-838 +aI199 +aI-879 +aa(lp9121 +g15 +aI444 +aI-965 +aI298 +aI-948 +aI363 +aI-965 +aa(lp9122 +g15 +aI695 +aI-743 +aI611 +aI-965 +aI695 +aI-891 +aa(lp9123 +g15 +aI367 +aI-422 +aI695 +aI-608 +aI586 +aI-501 +aa(lp9124 +g10 +aa(lp9125 +g8 +aI264 +aI10 +aa(lp9126 +g15 +aI181 +aI-70 +aI209 +aI10 +aI181 +aI-16 +aa(lp9127 +g15 +aI205 +aI-144 +aI181 +aI-101 +aI189 +aI-126 +aa(lp9128 +g15 +aI269 +aI-172 +aI221 +aI-163 +aI242 +aI-172 +aa(lp9129 +g15 +aI330 +aI-150 +aI295 +aI-172 +aI315 +aI-165 +aa(lp9130 +g15 +aI352 +aI-91 +aI344 +aI-135 +aI352 +aI-116 +aa(lp9131 +g15 +aI328 +aI-16 +aI352 +aI-59 +aI344 +aI-34 +aa(lp9132 +g15 +aI264 +aI10 +aI312 +aI1 +aI291 +aI10 +aa(lp9133 +g10 +aa(lp9134 +g8 +aI666 +aI0 +aa(lp9135 +g10 +aa(lp9136 +g8 +aI666 +aI0 +aasVC +(lp9137 +(lp9138 +g8 +aI698 +aI-194 +aa(lp9139 +g15 +aI716 +aI-149 +aI710 +aI-185 +aI716 +aI-171 +aa(lp9140 +g15 +aI641 +aI-36 +aI716 +aI-107 +aI691 +aI-69 +aa(lp9141 +g15 +aI437 +aI13 +aI592 +aI-3 +aI524 +aI13 +aa(lp9142 +g15 +aI166 +aI-79 +aI321 +aI13 +aI231 +aI-17 +aa(lp9143 +g15 +aI69 +aI-343 +aI101 +aI-141 +aI69 +aI-229 +aa(lp9144 +g15 +aI226 +aI-780 +aI69 +aI-511 +aI121 +aI-657 +aa(lp9145 +g15 +aI618 +aI-965 +aI331 +aI-903 +aI462 +aI-965 +aa(lp9146 +g15 +aI800 +aI-925 +aI696 +aI-965 +aI756 +aI-951 +aa(lp9147 +g15 +aI865 +aI-816 +aI843 +aI-898 +aI865 +aI-862 +aa(lp9148 +g15 +aI829 +aI-741 +aI865 +aI-784 +aI853 +aI-759 +aa(lp9149 +g15 +aI734 +aI-713 +aI805 +aI-722 +aI773 +aI-713 +aa(lp9150 +g15 +aI601 +aI-894 +aI734 +aI-833 +aI690 +aI-894 +aa(lp9151 +g15 +aI325 +aI-714 +aI491 +aI-894 +aI399 +aI-834 +aa(lp9152 +g15 +aI214 +aI-322 +aI251 +aI-595 +aI214 +aI-464 +aa(lp9153 +g15 +aI451 +aI-73 +aI214 +aI-156 +aI293 +aI-73 +aa(lp9154 +g15 +aI698 +aI-194 +aI554 +aI-73 +aI636 +aI-113 +aa(lp9155 +g10 +aa(lp9156 +g8 +aI835 +aI0 +aa(lp9157 +g10 +aa(lp9158 +g8 +aI835 +aI0 +aasVG +(lp9159 +(lp9160 +g8 +aI930 +aI-439 +aa(lp9161 +g20 +aI918 +aI-383 +aa(lp9162 +g20 +aI913 +aI-383 +aa(lp9163 +g15 +aI835 +aI-359 +aI877 +aI-383 +aI851 +aI-375 +aa(lp9164 +g15 +aI800 +aI-287 +aI818 +aI-344 +aI807 +aI-319 +aa(lp9165 +g20 +aI749 +aI-47 +aa(lp9166 +g15 +aI447 +aI13 +aI655 +aI-6 +aI554 +aI13 +aa(lp9167 +g15 +aI167 +aI-79 +aI326 +aI13 +aI232 +aI-17 +aa(lp9168 +g15 +aI69 +aI-343 +aI101 +aI-142 +aI69 +aI-230 +aa(lp9169 +g15 +aI231 +aI-786 +aI69 +aI-519 +aI123 +aI-667 +aa(lp9170 +g15 +aI642 +aI-965 +aI340 +aI-905 +aI477 +aI-965 +aa(lp9171 +g15 +aI849 +aI-924 +aI731 +aI-965 +aI800 +aI-951 +aa(lp9172 +g15 +aI923 +aI-821 +aI899 +aI-897 +aI923 +aI-863 +aa(lp9173 +g15 +aI884 +aI-743 +aI923 +aI-788 +aI910 +aI-762 +aa(lp9174 +g15 +aI782 +aI-715 +aI857 +aI-725 +aI823 +aI-715 +aa(lp9175 +g15 +aI738 +aI-847 +aI782 +aI-772 +aI768 +aI-817 +aa(lp9176 +g15 +aI614 +aI-894 +aI709 +aI-878 +aI668 +aI-894 +aa(lp9177 +g15 +aI332 +aI-723 +aI504 +aI-894 +aI410 +aI-837 +aa(lp9178 +g15 +aI214 +aI-322 +aI254 +aI-610 +aI214 +aI-476 +aa(lp9179 +g15 +aI472 +aI-62 +aI214 +aI-148 +aI300 +aI-62 +aa(lp9180 +g15 +aI622 +aI-80 +aI521 +aI-62 +aI572 +aI-68 +aa(lp9181 +g20 +aI666 +aI-293 +aa(lp9182 +g15 +aI671 +aI-330 +aI670 +aI-309 +aI671 +aI-322 +aa(lp9183 +g15 +aI576 +aI-383 +aI671 +aI-365 +aI639 +aI-383 +aa(lp9184 +g20 +aI563 +aI-383 +aa(lp9185 +g20 +aI576 +aI-439 +aa(lp9186 +g10 +aa(lp9187 +g8 +aI951 +aI0 +aa(lp9188 +g10 +aa(lp9189 +g8 +aI951 +aI0 +aasVK +(lp9190 +(lp9191 +g8 +aI-17 +aI-55 +aa(lp9192 +g20 +aI0 +aI-55 +aa(lp9193 +g15 +aI92 +aI-79 +aI42 +aI-55 +aI73 +aI-63 +aa(lp9194 +g15 +aI130 +aI-151 +aI111 +aI-96 +aI123 +aI-119 +aa(lp9195 +g20 +aI269 +aI-804 +aa(lp9196 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp9197 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp9198 +g20 +aI161 +aI-895 +aa(lp9199 +g20 +aI173 +aI-951 +aa(lp9200 +g20 +aI561 +aI-951 +aa(lp9201 +g20 +aI549 +aI-895 +aa(lp9202 +g20 +aI531 +aI-895 +aa(lp9203 +g15 +aI440 +aI-871 +aI489 +aI-895 +aI458 +aI-887 +aa(lp9204 +g15 +aI402 +aI-799 +aI421 +aI-855 +aI408 +aI-831 +aa(lp9205 +g20 +aI345 +aI-530 +aa(lp9206 +g20 +aI321 +aI-431 +aa(lp9207 +g20 +aI665 +aI-747 +aa(lp9208 +g15 +aI765 +aI-867 +aI732 +aI-808 +aI765 +aI-848 +aa(lp9209 +g15 +aI706 +aI-896 +aI765 +aI-886 +aI745 +aI-896 +aa(lp9210 +g20 +aI717 +aI-951 +aa(lp9211 +g20 +aI1011 +aI-951 +aa(lp9212 +g20 +aI1001 +aI-896 +aa(lp9213 +g15 +aI924 +aI-873 +aI978 +aI-896 +aI952 +aI-888 +aa(lp9214 +g15 +aI796 +aI-771 +aI896 +aI-858 +aI853 +aI-824 +aa(lp9215 +g20 +aI553 +aI-551 +aa(lp9216 +g20 +aI714 +aI-162 +aa(lp9217 +g15 +aI841 +aI-55 +aI744 +aI-91 +aI786 +aI-55 +aa(lp9218 +g20 +aI845 +aI-55 +aa(lp9219 +g20 +aI833 +aI0 +aa(lp9220 +g20 +aI814 +aI0 +aa(lp9221 +g15 +aI657 +aI-21 +aI744 +aI0 +aI691 +aI-6 +aa(lp9222 +g15 +aI574 +aI-123 +aI623 +aI-35 +aI595 +aI-69 +aa(lp9223 +g20 +aI445 +aI-452 +aa(lp9224 +g20 +aI307 +aI-356 +aa(lp9225 +g20 +aI264 +aI-146 +aa(lp9226 +g15 +aI258 +aI-108 +aI260 +aI-126 +aI258 +aI-114 +aa(lp9227 +g15 +aI354 +aI-55 +aI258 +aI-73 +aI290 +aI-55 +aa(lp9228 +g20 +aI371 +aI-55 +aa(lp9229 +g20 +aI360 +aI0 +aa(lp9230 +g20 +aI-27 +aI0 +aa(lp9231 +g10 +aa(lp9232 +g8 +aI933 +aI0 +aa(lp9233 +g10 +aa(lp9234 +g8 +aI933 +aI0 +aasVO +(lp9235 +(lp9236 +g8 +aI602 +aI-966 +aa(lp9237 +g15 +aI852 +aI-869 +aI706 +aI-966 +aI789 +aI-934 +aa(lp9238 +g15 +aI947 +aI-599 +aI916 +aI-805 +aI947 +aI-715 +aa(lp9239 +g15 +aI799 +aI-177 +aI947 +aI-447 +aI898 +aI-306 +aa(lp9240 +g15 +aI418 +aI15 +aI700 +aI-49 +aI573 +aI15 +aa(lp9241 +g15 +aI164 +aI-84 +aI313 +aI15 +aI228 +aI-17 +aa(lp9242 +g15 +aI69 +aI-354 +aI100 +aI-151 +aI69 +aI-241 +aa(lp9243 +g15 +aI218 +aI-774 +aI69 +aI-507 +aI118 +aI-647 +aa(lp9244 +g15 +aI602 +aI-966 +aI318 +aI-902 +aI446 +aI-966 +aa(lp9245 +g10 +aa(lp9246 +g8 +aI426 +aI-58 +aa(lp9247 +g15 +aI696 +aI-242 +aI537 +aI-58 +aI627 +aI-119 +aa(lp9248 +g15 +aI801 +aI-635 +aI766 +aI-364 +aI801 +aI-495 +aa(lp9249 +g15 +aI746 +aI-827 +aI801 +aI-718 +aI783 +aI-782 +aa(lp9250 +g15 +aI591 +aI-894 +aI709 +aI-871 +aI658 +aI-894 +aa(lp9251 +g15 +aI319 +aI-709 +aI480 +aI-894 +aI390 +aI-832 +aa(lp9252 +g15 +aI214 +aI-316 +aI249 +aI-586 +aI214 +aI-455 +aa(lp9253 +g15 +aI271 +aI-124 +aI214 +aI-233 +aI233 +aI-169 +aa(lp9254 +g15 +aI426 +aI-58 +aI309 +aI-80 +aI360 +aI-58 +aa(lp9255 +g10 +aa(lp9256 +g8 +aI989 +aI0 +aa(lp9257 +g10 +aa(lp9258 +g8 +aI989 +aI0 +aasVS +(lp9259 +(lp9260 +g8 +aI111 +aI-278 +aa(lp9261 +g15 +aI166 +aI-113 +aI111 +aI-210 +aI129 +aI-155 +aa(lp9262 +g15 +aI314 +aI-51 +aI202 +aI-72 +aI251 +aI-51 +aa(lp9263 +g15 +aI462 +aI-97 +aI376 +aI-51 +aI425 +aI-67 +aa(lp9264 +g15 +aI517 +aI-223 +aI499 +aI-128 +aI517 +aI-170 +aa(lp9265 +g15 +aI486 +aI-330 +aI517 +aI-265 +aI507 +aI-301 +aa(lp9266 +g15 +aI349 +aI-433 +aI464 +aI-359 +aI419 +aI-393 +aa(lp9267 +g15 +aI201 +aI-560 +aI278 +aI-474 +aI229 +aI-516 +aa(lp9268 +g15 +aI160 +aI-707 +aI173 +aI-603 +aI160 +aI-652 +aa(lp9269 +g15 +aI247 +aI-893 +aI160 +aI-784 +aI189 +aI-846 +aa(lp9270 +g15 +aI483 +aI-965 +aI305 +aI-941 +aI384 +aI-965 +aa(lp9271 +g15 +aI668 +aI-924 +aI560 +aI-965 +aI622 +aI-951 +aa(lp9272 +g15 +aI737 +aI-821 +aI714 +aI-897 +aI737 +aI-863 +aa(lp9273 +g15 +aI619 +aI-728 +aI737 +aI-759 +aI698 +aI-728 +aa(lp9274 +g15 +aI582 +aI-852 +aI619 +aI-780 +aI607 +aI-822 +aa(lp9275 +g15 +aI473 +aI-897 +aI557 +aI-882 +aI521 +aI-897 +aa(lp9276 +g15 +aI343 +aI-852 +aI420 +aI-897 +aI376 +aI-882 +aa(lp9277 +g15 +aI292 +aI-730 +aI309 +aI-822 +aI292 +aI-781 +aa(lp9278 +g15 +aI319 +aI-632 +aI292 +aI-692 +aI301 +aI-659 +aa(lp9279 +g15 +aI457 +aI-526 +aI337 +aI-604 +aI383 +aI-569 +aa(lp9280 +g15 +aI608 +aI-404 +aI526 +aI-485 +aI577 +aI-444 +aa(lp9281 +g15 +aI654 +aI-266 +aI639 +aI-364 +aI654 +aI-318 +aa(lp9282 +g15 +aI562 +aI-60 +aI654 +aI-178 +aI624 +aI-109 +aa(lp9283 +g15 +aI305 +aI13 +aI500 +aI-11 +aI415 +aI13 +aa(lp9284 +g15 +aI89 +aI-40 +aI214 +aI13 +aI142 +aI-4 +aa(lp9285 +g15 +aI9 +aI-176 +aI35 +aI-76 +aI9 +aI-121 +aa(lp9286 +g15 +aI38 +aI-250 +aI9 +aI-207 +aI18 +aI-232 +aa(lp9287 +g15 +aI111 +aI-278 +aI57 +aI-268 +aI82 +aI-278 +aa(lp9288 +g10 +aa(lp9289 +g8 +aI725 +aI0 +aa(lp9290 +g10 +aa(lp9291 +g8 +aI725 +aI0 +aasVW +(lp9292 +(lp9293 +g8 +aI1246 +aI-772 +aa(lp9294 +g15 +aI1272 +aI-847 +aI1263 +aI-806 +aI1272 +aI-831 +aa(lp9295 +g15 +aI1197 +aI-895 +aI1272 +aI-879 +aI1247 +aI-895 +aa(lp9296 +g20 +aI1165 +aI-895 +aa(lp9297 +g20 +aI1175 +aI-951 +aa(lp9298 +g20 +aI1501 +aI-951 +aa(lp9299 +g20 +aI1489 +aI-895 +aa(lp9300 +g20 +aI1464 +aI-895 +aa(lp9301 +g15 +aI1396 +aI-874 +aI1435 +aI-895 +aI1413 +aI-888 +aa(lp9302 +g15 +aI1341 +aI-791 +aI1380 +aI-860 +aI1361 +aI-833 +aa(lp9303 +g20 +aI947 +aI0 +aa(lp9304 +g20 +aI825 +aI0 +aa(lp9305 +g20 +aI765 +aI-738 +aa(lp9306 +g20 +aI406 +aI0 +aa(lp9307 +g20 +aI285 +aI0 +aa(lp9308 +g20 +aI216 +aI-825 +aa(lp9309 +g15 +aI196 +aI-878 +aI213 +aI-848 +aI207 +aI-866 +aa(lp9310 +g15 +aI136 +aI-895 +aI185 +aI-889 +aI165 +aI-895 +aa(lp9311 +g20 +aI118 +aI-895 +aa(lp9312 +g20 +aI130 +aI-951 +aa(lp9313 +g20 +aI493 +aI-951 +aa(lp9314 +g20 +aI481 +aI-895 +aa(lp9315 +g20 +aI450 +aI-895 +aa(lp9316 +g15 +aI354 +aI-827 +aI386 +aI-895 +aI354 +aI-872 +aa(lp9317 +g15 +aI357 +aI-782 +aI354 +aI-809 +aI355 +aI-794 +aa(lp9318 +g20 +aI389 +aI-355 +aa(lp9319 +g15 +aI398 +aI-130 +aI395 +aI-274 +aI398 +aI-199 +aa(lp9320 +g15 +aI507 +aI-369 +aI435 +aI-218 +aI472 +aI-297 +aa(lp9321 +g20 +aI787 +aI-942 +aa(lp9322 +g20 +aI884 +aI-942 +aa(lp9323 +g20 +aI927 +aI-364 +aa(lp9324 +g15 +aI934 +aI-130 +aI934 +aI-277 +aI936 +aI-199 +aa(lp9325 +g15 +aI1034 +aI-349 +aI973 +aI-221 +aI1007 +aI-294 +aa(lp9326 +g10 +aa(lp9327 +g8 +aI1393 +aI0 +aa(lp9328 +g10 +aa(lp9329 +g8 +aI1393 +aI0 +aasV[ +(lp9330 +(lp9331 +g8 +aI6 +aI171 +aa(lp9332 +g20 +aI258 +aI-1012 +aa(lp9333 +g20 +aI555 +aI-1012 +aa(lp9334 +g20 +aI544 +aI-956 +aa(lp9335 +g20 +aI486 +aI-956 +aa(lp9336 +g15 +aI396 +aI-933 +aI445 +aI-956 +aI415 +aI-948 +aa(lp9337 +g15 +aI357 +aI-860 +aI377 +aI-917 +aI364 +aI-893 +aa(lp9338 +g20 +aI167 +aI24 +aa(lp9339 +g15 +aI162 +aI61 +aI164 +aI40 +aI162 +aI52 +aa(lp9340 +g15 +aI258 +aI115 +aI162 +aI97 +aI194 +aI115 +aa(lp9341 +g20 +aI315 +aI115 +aa(lp9342 +g20 +aI304 +aI171 +aa(lp9343 +g10 +aa(lp9344 +g8 +aI478 +aI0 +aa(lp9345 +g10 +aa(lp9346 +g8 +aI478 +aI0 +aasV_ +(lp9347 +(lp9348 +g8 +aI502 +aI189 +aa(lp9349 +g20 +aI-121 +aI189 +aa(lp9350 +g20 +aI-104 +aI111 +aa(lp9351 +g20 +aI520 +aI111 +aa(lp9352 +g10 +aa(lp9353 +g8 +aI611 +aI0 +aa(lp9354 +g10 +aa(lp9355 +g8 +aI611 +aI0 +aasVc +(lp9356 +(lp9357 +g8 +aI534 +aI-166 +aa(lp9358 +g15 +aI548 +aI-133 +aI543 +aI-160 +aI548 +aI-149 +aa(lp9359 +g15 +aI485 +aI-33 +aI548 +aI-97 +aI527 +aI-64 +aa(lp9360 +g15 +aI317 +aI13 +aI443 +aI-2 +aI387 +aI13 +aa(lp9361 +g15 +aI128 +aI-60 +aI239 +aI13 +aI176 +aI-11 +aa(lp9362 +g15 +aI57 +aI-261 +aI81 +aI-109 +aI57 +aI-176 +aa(lp9363 +g15 +aI169 +aI-581 +aI57 +aI-378 +aI94 +aI-484 +aa(lp9364 +g15 +aI454 +aI-727 +aI245 +aI-678 +aI339 +aI-727 +aa(lp9365 +g15 +aI597 +aI-690 +aI515 +aI-727 +aI563 +aI-715 +aa(lp9366 +g15 +aI649 +aI-599 +aI631 +aI-666 +aI649 +aI-636 +aa(lp9367 +g15 +aI616 +aI-532 +aI649 +aI-572 +aI638 +aI-550 +aa(lp9368 +g15 +aI530 +aI-506 +aI595 +aI-514 +aI566 +aI-506 +aa(lp9369 +g15 +aI503 +aI-620 +aI530 +aI-553 +aI521 +aI-591 +aa(lp9370 +g15 +aI427 +aI-663 +aI485 +aI-649 +aI459 +aI-663 +aa(lp9371 +g15 +aI265 +aI-524 +aI365 +aI-663 +aI311 +aI-617 +aa(lp9372 +g15 +aI195 +aI-251 +aI219 +aI-431 +aI195 +aI-340 +aa(lp9373 +g15 +aI342 +aI-70 +aI195 +aI-130 +aI244 +aI-70 +aa(lp9374 +g15 +aI534 +aI-166 +aI420 +aI-70 +aI484 +aI-102 +aa(lp9375 +g10 +aa(lp9376 +g8 +aI649 +aI0 +aa(lp9377 +g10 +aa(lp9378 +g8 +aI649 +aI0 +aasVg +(lp9379 +(lp9380 +g8 +aI586 +aI-685 +aa(lp9381 +g15 +aI730 +aI-779 +aI628 +aI-748 +aI676 +aI-779 +aa(lp9382 +g15 +aI797 +aI-718 +aI775 +aI-779 +aI797 +aI-759 +aa(lp9383 +g15 +aI718 +aI-635 +aI797 +aI-663 +aI771 +aI-635 +aa(lp9384 +g15 +aI681 +aI-683 +aI718 +aI-667 +aI706 +aI-683 +aa(lp9385 +g15 +aI615 +aI-653 +aI664 +aI-683 +aI642 +aI-673 +aa(lp9386 +g15 +aI645 +aI-550 +aI635 +aI-625 +aI645 +aI-591 +aa(lp9387 +g15 +aI561 +aI-344 +aI645 +aI-475 +aI617 +aI-407 +aa(lp9388 +g15 +aI339 +aI-251 +aI505 +aI-282 +aI431 +aI-251 +aa(lp9389 +g15 +aI297 +aI-254 +aI319 +aI-251 +aI305 +aI-252 +aa(lp9390 +g15 +aI202 +aI-170 +aI234 +aI-228 +aI202 +aI-200 +aa(lp9391 +g15 +aI270 +aI-130 +aI202 +aI-147 +aI225 +aI-134 +aa(lp9392 +g20 +aI398 +aI-116 +aa(lp9393 +g15 +aI605 +aI57 +aI536 +aI-101 +aI605 +aI-43 +aa(lp9394 +g15 +aI511 +aI251 +aI605 +aI140 +aI574 +aI205 +aa(lp9395 +g15 +aI244 +aI320 +aI449 +aI297 +aI360 +aI320 +aa(lp9396 +g15 +aI-46 +aI146 +aI50 +aI320 +aI-46 +aI262 +aa(lp9397 +g15 +aI11 +aI24 +aI-46 +aI99 +aI-27 +aI58 +aa(lp9398 +g15 +aI170 +aI-45 +aI50 +aI-8 +aI103 +aI-32 +aa(lp9399 +g15 +aI106 +aI-136 +aI128 +aI-65 +aI106 +aI-96 +aa(lp9400 +g15 +aI133 +aI-206 +aI106 +aI-164 +aI115 +aI-187 +aa(lp9401 +g15 +aI233 +aI-272 +aI150 +aI-225 +aI184 +aI-247 +aa(lp9402 +g15 +aI139 +aI-430 +aI171 +aI-302 +aI139 +aI-354 +aa(lp9403 +g15 +aI224 +aI-635 +aI139 +aI-505 +aI168 +aI-573 +aa(lp9404 +g15 +aI449 +aI-727 +aI281 +aI-696 +aI356 +aI-727 +aa(lp9405 +g15 +aI586 +aI-685 +aI506 +aI-727 +aI551 +aI-713 +aa(lp9406 +g10 +aa(lp9407 +g8 +aI354 +aI-315 +aa(lp9408 +g15 +aI477 +aI-391 +aI405 +aI-315 +aI446 +aI-340 +aa(lp9409 +g15 +aI524 +aI-556 +aI508 +aI-441 +aI524 +aI-496 +aa(lp9410 +g15 +aI432 +aI-666 +aI524 +aI-629 +aI493 +aI-666 +aa(lp9411 +g15 +aI308 +aI-589 +aI380 +aI-666 +aI338 +aI-640 +aa(lp9412 +g15 +aI262 +aI-424 +aI277 +aI-538 +aI262 +aI-483 +aa(lp9413 +g15 +aI354 +aI-315 +aI262 +aI-351 +aI293 +aI-315 +aa(lp9414 +g10 +aa(lp9415 +g8 +aI365 +aI-3 +aa(lp9416 +g20 +aI235 +aI-15 +aa(lp9417 +g15 +aI178 +aI-2 +aI229 +aI-16 +aI209 +aI-11 +aa(lp9418 +g15 +aI95 +aI47 +aI146 +aI6 +aI118 +aI23 +aa(lp9419 +g15 +aI61 +aI139 +aI72 +aI72 +aI61 +aI103 +aa(lp9420 +g15 +aI249 +aI255 +aI61 +aI216 +aI123 +aI255 +aa(lp9421 +g15 +aI428 +aI211 +aI327 +aI255 +aI387 +aI240 +aa(lp9422 +g15 +aI489 +aI94 +aI469 +aI182 +aI489 +aI143 +aa(lp9423 +g15 +aI365 +aI-3 +aI489 +aI36 +aI448 +aI3 +aa(lp9424 +g10 +aa(lp9425 +g8 +aI741 +aI0 +aa(lp9426 +g10 +aa(lp9427 +g8 +aI741 +aI0 +aasVk +(lp9428 +(lp9429 +g8 +aI451 +aI-511 +aa(lp9430 +g15 +aI550 +aI-636 +aI517 +aI-568 +aI550 +aI-610 +aa(lp9431 +g15 +aI490 +aI-657 +aI550 +aI-650 +aI530 +aI-657 +aa(lp9432 +g20 +aI502 +aI-713 +aa(lp9433 +g20 +aI797 +aI-713 +aa(lp9434 +g20 +aI785 +aI-657 +aa(lp9435 +g15 +aI570 +aI-532 +aI733 +aI-657 +aI662 +aI-615 +aa(lp9436 +g20 +aI450 +aI-422 +aa(lp9437 +g20 +aI572 +aI-158 +aa(lp9438 +g15 +aI707 +aI-46 +aI606 +aI-83 +aI651 +aI-46 +aa(lp9439 +g20 +aI695 +aI9 +aa(lp9440 +g15 +aI533 +aI-16 +aI622 +aI9 +aI567 +aI0 +aa(lp9441 +g15 +aI445 +aI-127 +aI498 +aI-33 +aI469 +aI-70 +aa(lp9442 +g20 +aI358 +aI-340 +aa(lp9443 +g20 +aI237 +aI-263 +aa(lp9444 +g20 +aI182 +aI0 +aa(lp9445 +g20 +aI58 +aI0 +aa(lp9446 +g20 +aI231 +aI-823 +aa(lp9447 +g15 +aI244 +aI-894 +aI240 +aI-862 +aI244 +aI-886 +aa(lp9448 +g15 +aI150 +aI-956 +aI244 +aI-935 +aI212 +aI-956 +aa(lp9449 +g20 +aI139 +aI-956 +aa(lp9450 +g20 +aI151 +aI-1012 +aa(lp9451 +g20 +aI397 +aI-1012 +aa(lp9452 +g20 +aI345 +aI-767 +aa(lp9453 +g15 +aI241 +aI-328 +aI297 +aI-543 +aI262 +aI-397 +aa(lp9454 +g10 +aa(lp9455 +g8 +aI758 +aI0 +aa(lp9456 +g10 +aa(lp9457 +g8 +aI758 +aI0 +aasVo +(lp9458 +(lp9459 +g8 +aI454 +aI-727 +aa(lp9460 +g15 +aI639 +aI-656 +aI532 +aI-727 +aI594 +aI-703 +aa(lp9461 +g15 +aI707 +aI-451 +aI685 +aI-609 +aI707 +aI-540 +aa(lp9462 +g15 +aI598 +aI-130 +aI707 +aI-332 +aI671 +aI-225 +aa(lp9463 +g15 +aI313 +aI13 +aI526 +aI-34 +aI431 +aI13 +aa(lp9464 +g15 +aI125 +aI-59 +aI232 +aI13 +aI170 +aI-10 +aa(lp9465 +g15 +aI57 +aI-261 +aI79 +aI-108 +aI57 +aI-175 +aa(lp9466 +g15 +aI166 +aI-584 +aI57 +aI-381 +aI93 +aI-489 +aa(lp9467 +g15 +aI454 +aI-727 +aI240 +aI-679 +aI335 +aI-727 +aa(lp9468 +g10 +aa(lp9469 +g8 +aI328 +aI-51 +aa(lp9470 +g15 +aI503 +aI-182 +aI401 +aI-51 +aI459 +aI-95 +aa(lp9471 +g15 +aI569 +aI-471 +aI547 +aI-269 +aI569 +aI-365 +aa(lp9472 +g15 +aI438 +aI-657 +aI569 +aI-595 +aI525 +aI-657 +aa(lp9473 +g15 +aI263 +aI-526 +aI366 +aI-657 +aI307 +aI-613 +aa(lp9474 +g15 +aI195 +aI-235 +aI218 +aI-438 +aI195 +aI-341 +aa(lp9475 +g15 +aI328 +aI-51 +aI195 +aI-112 +aI240 +aI-51 +aa(lp9476 +g10 +aa(lp9477 +g8 +aI765 +aI0 +aa(lp9478 +g10 +aa(lp9479 +g8 +aI765 +aI0 +aasVs +(lp9480 +(lp9481 +g8 +aI482 +aI-517 +aa(lp9482 +g15 +aI450 +aI-624 +aI482 +aI-561 +aI471 +aI-597 +aa(lp9483 +g15 +aI362 +aI-664 +aI429 +aI-651 +aI400 +aI-664 +aa(lp9484 +g15 +aI267 +aI-632 +aI322 +aI-664 +aI291 +aI-654 +aa(lp9485 +g15 +aI233 +aI-550 +aI244 +aI-611 +aI233 +aI-583 +aa(lp9486 +g15 +aI266 +aI-474 +aI233 +aI-520 +aI244 +aI-495 +aa(lp9487 +g15 +aI369 +aI-412 +aI288 +aI-453 +aI322 +aI-433 +aa(lp9488 +g15 +aI529 +aI-205 +aI475 +aI-365 +aI529 +aI-296 +aa(lp9489 +g15 +aI453 +aI-47 +aI529 +aI-140 +aI504 +aI-87 +aa(lp9490 +g15 +aI253 +aI13 +aI403 +aI-6 +aI336 +aI13 +aa(lp9491 +g15 +aI92 +aI-27 +aI185 +aI13 +aI132 +aI0 +aa(lp9492 +g15 +aI33 +aI-136 +aI53 +aI-54 +aI33 +aI-90 +aa(lp9493 +g15 +aI56 +aI-202 +aI33 +aI-165 +aI41 +aI-187 +aa(lp9494 +g15 +aI117 +aI-224 +aI72 +aI-217 +aI92 +aI-224 +aa(lp9495 +g15 +aI157 +aI-96 +aI117 +aI-169 +aI130 +aI-126 +aa(lp9496 +g15 +aI269 +aI-50 +aI183 +aI-65 +aI221 +aI-50 +aa(lp9497 +g15 +aI413 +aI-174 +aI365 +aI-50 +aI413 +aI-91 +aa(lp9498 +g15 +aI382 +aI-254 +aI413 +aI-205 +aI403 +aI-232 +aa(lp9499 +g15 +aI278 +aI-321 +aI362 +aI-276 +aI327 +aI-298 +aa(lp9500 +g15 +aI150 +aI-415 +aI214 +aI-351 +aI171 +aI-382 +aa(lp9501 +g15 +aI117 +aI-527 +aI128 +aI-447 +aI117 +aI-485 +aa(lp9502 +g15 +aI188 +aI-670 +aI117 +aI-585 +aI140 +aI-633 +aa(lp9503 +g15 +aI374 +aI-726 +aI236 +aI-707 +aI297 +aI-726 +aa(lp9504 +g15 +aI527 +aI-689 +aI439 +aI-726 +aI490 +aI-713 +aa(lp9505 +g15 +aI582 +aI-599 +aI564 +aI-665 +aI582 +aI-635 +aa(lp9506 +g15 +aI482 +aI-517 +aI582 +aI-544 +aI549 +aI-517 +aa(lp9507 +g10 +aa(lp9508 +g8 +aI618 +aI0 +aa(lp9509 +g10 +aa(lp9510 +g8 +aI618 +aI0 +aasVw +(lp9511 +(lp9512 +g8 +aI160 +aI12 +aa(lp9513 +g20 +aI150 +aI-562 +aa(lp9514 +g15 +aI131 +aI-633 +aI149 +aI-593 +aI143 +aI-617 +aa(lp9515 +g15 +aI62 +aI-658 +aI119 +aI-650 +aI96 +aI-658 +aa(lp9516 +g20 +aI49 +aI-658 +aa(lp9517 +g20 +aI67 +aI-714 +aa(lp9518 +g20 +aI268 +aI-714 +aa(lp9519 +g15 +aI272 +aI-106 +aI270 +aI-526 +aI272 +aI-324 +aa(lp9520 +g20 +aI277 +aI-106 +aa(lp9521 +g15 +aI574 +aI-702 +aI393 +aI-309 +aI492 +aI-508 +aa(lp9522 +g20 +aI685 +aI-707 +aa(lp9523 +g15 +aI713 +aI-97 +aI704 +aI-473 +aI713 +aI-269 +aa(lp9524 +g20 +aI722 +aI-97 +aa(lp9525 +g15 +aI902 +aI-361 +aI795 +aI-186 +aI855 +aI-274 +aa(lp9526 +g15 +aI973 +aI-568 +aI949 +aI-448 +aI973 +aI-517 +aa(lp9527 +g15 +aI916 +aI-648 +aI973 +aI-609 +aI954 +aI-636 +aa(lp9528 +g15 +aI994 +aI-727 +aI923 +aI-701 +aI950 +aI-727 +aa(lp9529 +g15 +aI1065 +aI-627 +aI1041 +aI-727 +aI1065 +aI-694 +aa(lp9530 +g15 +aI730 +aI0 +aI1065 +aI-499 +aI953 +aI-290 +aa(lp9531 +g20 +aI598 +aI13 +aa(lp9532 +g20 +aI578 +aI-563 +aa(lp9533 +g15 +aI297 +aI-3 +aI538 +aI-467 +aI444 +aI-280 +aa(lp9534 +g10 +aa(lp9535 +g8 +aI1091 +aI0 +aa(lp9536 +g10 +aa(lp9537 +g8 +aI1091 +aI0 +aasV{ +(lp9538 +(lp9539 +g8 +aI440 +aI171 +aa(lp9540 +g15 +aI298 +aI120 +aI379 +aI171 +aI332 +aI154 +aa(lp9541 +g15 +aI248 +aI-21 +aI264 +aI87 +aI248 +aI40 +aa(lp9542 +g20 +aI248 +aI-252 +aa(lp9543 +g15 +aI90 +aI-394 +aI248 +aI-343 +aI195 +aI-391 +aa(lp9544 +g20 +aI90 +aI-450 +aa(lp9545 +g15 +aI248 +aI-590 +aI195 +aI-452 +aI248 +aI-498 +aa(lp9546 +g20 +aI248 +aI-822 +aa(lp9547 +g15 +aI440 +aI-1012 +aI248 +aI-949 +aI312 +aI-1012 +aa(lp9548 +g20 +aI527 +aI-1012 +aa(lp9549 +g20 +aI527 +aI-955 +aa(lp9550 +g20 +aI488 +aI-955 +aa(lp9551 +g15 +aI378 +aI-815 +aI415 +aI-955 +aI378 +aI-908 +aa(lp9552 +g20 +aI378 +aI-587 +aa(lp9553 +g15 +aI230 +aI-423 +aI378 +aI-494 +aI329 +aI-439 +aa(lp9554 +g20 +aI230 +aI-422 +aa(lp9555 +g15 +aI378 +aI-256 +aI329 +aI-405 +aI378 +aI-350 +aa(lp9556 +g20 +aI378 +aI-26 +aa(lp9557 +g15 +aI488 +aI113 +aI378 +aI67 +aI415 +aI113 +aa(lp9558 +g20 +aI527 +aI113 +aa(lp9559 +g20 +aI527 +aI171 +aa(lp9560 +g10 +aa(lp9561 +g8 +aI570 +aI0 +aa(lp9562 +g10 +aa(lp9563 +g8 +aI570 +aI0 +aasV" +(lp9564 +(lp9565 +g8 +aI451 +aI-951 +aa(lp9566 +g20 +aI593 +aI-951 +aa(lp9567 +g20 +aI486 +aI-638 +aa(lp9568 +g20 +aI425 +aI-638 +aa(lp9569 +g10 +aa(lp9570 +g8 +aI201 +aI-951 +aa(lp9571 +g20 +aI342 +aI-951 +aa(lp9572 +g20 +aI235 +aI-638 +aa(lp9573 +g20 +aI174 +aI-638 +aa(lp9574 +g10 +aa(lp9575 +g8 +aI544 +aI0 +aa(lp9576 +g10 +aa(lp9577 +g8 +aI544 +aI0 +aasV& +(lp9578 +(lp9579 +g8 +aI713 +aI0 +aa(lp9580 +g20 +aI633 +aI-110 +aa(lp9581 +g15 +aI338 +aI13 +aI553 +aI-27 +aI454 +aI13 +aa(lp9582 +g15 +aI124 +aI-54 +aI246 +aI13 +aI175 +aI-9 +aa(lp9583 +g15 +aI46 +aI-235 +aI72 +aI-99 +aI46 +aI-160 +aa(lp9584 +g15 +aI109 +aI-410 +aI46 +aI-304 +aI67 +aI-362 +aa(lp9585 +g15 +aI326 +aI-539 +aI151 +aI-458 +aI223 +aI-501 +aa(lp9586 +g15 +aI262 +aI-735 +aI283 +aI-611 +aI262 +aI-677 +aa(lp9587 +g15 +aI334 +aI-905 +aI262 +aI-809 +aI286 +aI-865 +aa(lp9588 +g15 +aI546 +aI-965 +aI383 +aI-945 +aI453 +aI-965 +aa(lp9589 +g15 +aI713 +aI-918 +aI618 +aI-965 +aI674 +aI-949 +aa(lp9590 +g15 +aI772 +aI-791 +aI752 +aI-886 +aI772 +aI-844 +aa(lp9591 +g15 +aI723 +aI-651 +aI772 +aI-734 +aI755 +aI-687 +aa(lp9592 +g15 +aI481 +aI-528 +aI690 +aI-616 +aI610 +aI-575 +aa(lp9593 +g20 +aI667 +aI-272 +aa(lp9594 +g15 +aI751 +aI-508 +aI705 +aI-344 +aI733 +aI-422 +aa(lp9595 +g20 +aI762 +aI-560 +aa(lp9596 +g20 +aI1002 +aI-560 +aa(lp9597 +g20 +aI990 +aI-504 +aa(lp9598 +g20 +aI978 +aI-504 +aa(lp9599 +g15 +aI882 +aI-484 +aI934 +aI-504 +aI902 +aI-498 +aa(lp9600 +g15 +aI838 +aI-446 +aI862 +aI-471 +aI847 +aI-458 +aa(lp9601 +g15 +aI772 +aI-316 +aI829 +aI-434 +aI807 +aI-390 +aa(lp9602 +g15 +aI713 +aI-211 +aI755 +aI-281 +aI735 +aI-246 +aa(lp9603 +g20 +aI786 +aI-111 +aa(lp9604 +g15 +aI917 +aI-55 +aI813 +aI-74 +aI857 +aI-55 +aa(lp9605 +g20 +aI929 +aI-55 +aa(lp9606 +g20 +aI917 +aI0 +aa(lp9607 +g10 +aa(lp9608 +g8 +aI444 +aI-582 +aa(lp9609 +g15 +aI603 +aI-667 +aI519 +aI-610 +aI572 +aI-638 +aa(lp9610 +g15 +aI650 +aI-782 +aI634 +aI-695 +aI650 +aI-733 +aa(lp9611 +g15 +aI619 +aI-867 +aI650 +aI-817 +aI640 +aI-845 +aa(lp9612 +g15 +aI537 +aI-899 +aI598 +aI-888 +aI571 +aI-899 +aa(lp9613 +g15 +aI390 +aI-744 +aI439 +aI-899 +aI390 +aI-847 +aa(lp9614 +g15 +aI444 +aI-582 +aI390 +aI-695 +aI408 +aI-641 +aa(lp9615 +g10 +aa(lp9616 +g8 +aI591 +aI-167 +aa(lp9617 +g20 +aI365 +aI-481 +aa(lp9618 +g15 +aI219 +aI-380 +aI295 +aI-450 +aI247 +aI-416 +aa(lp9619 +g15 +aI178 +aI-238 +aI192 +aI-344 +aI178 +aI-297 +aa(lp9620 +g15 +aI224 +aI-110 +aI178 +aI-186 +aI193 +aI-144 +aa(lp9621 +g15 +aI352 +aI-60 +aI255 +aI-77 +aI298 +aI-60 +aa(lp9622 +g15 +aI591 +aI-167 +aI444 +aI-60 +aI524 +aI-96 +aa(lp9623 +g10 +aa(lp9624 +g8 +aI989 +aI0 +aa(lp9625 +g10 +aa(lp9626 +g8 +aI989 +aI0 +aasV* +(lp9627 +(lp9628 +g8 +aI182 +aI-881 +aa(lp9629 +g20 +aI250 +aI-974 +aa(lp9630 +g20 +aI423 +aI-804 +aa(lp9631 +g20 +aI434 +aI-1019 +aa(lp9632 +g20 +aI548 +aI-995 +aa(lp9633 +g20 +aI468 +aI-797 +aa(lp9634 +g20 +aI695 +aI-877 +aa(lp9635 +g20 +aI720 +aI-765 +aa(lp9636 +g20 +aI485 +aI-747 +aa(lp9637 +g20 +aI692 +aI-636 +aa(lp9638 +g20 +aI625 +aI-546 +aa(lp9639 +g20 +aI449 +aI-710 +aa(lp9640 +g20 +aI441 +aI-496 +aa(lp9641 +g20 +aI328 +aI-521 +aa(lp9642 +g20 +aI405 +aI-719 +aa(lp9643 +g20 +aI178 +aI-638 +aa(lp9644 +g20 +aI154 +aI-750 +aa(lp9645 +g20 +aI388 +aI-769 +aa(lp9646 +g10 +aa(lp9647 +g8 +aI666 +aI0 +aa(lp9648 +g10 +aa(lp9649 +g8 +aI666 +aI0 +aasV. +(lp9650 +(lp9651 +g8 +aI141 +aI10 +aa(lp9652 +g15 +aI58 +aI-70 +aI86 +aI10 +aI58 +aI-16 +aa(lp9653 +g15 +aI82 +aI-144 +aI58 +aI-101 +aI66 +aI-126 +aa(lp9654 +g15 +aI146 +aI-172 +aI98 +aI-163 +aI119 +aI-172 +aa(lp9655 +g15 +aI229 +aI-91 +aI201 +aI-172 +aI229 +aI-145 +aa(lp9656 +g15 +aI205 +aI-16 +aI229 +aI-60 +aI221 +aI-35 +aa(lp9657 +g15 +aI141 +aI10 +aI189 +aI1 +aI168 +aI10 +aa(lp9658 +g10 +aa(lp9659 +g8 +aI381 +aI0 +aa(lp9660 +g10 +aa(lp9661 +g8 +aI381 +aI0 +aasV2 +(lp9662 +(lp9663 +g8 +aI-22 +aI0 +aa(lp9664 +g20 +aI5 +aI-107 +aa(lp9665 +g20 +aI318 +aI-390 +aa(lp9666 +g15 +aI492 +aI-584 +aI401 +aI-464 +aI459 +aI-529 +aa(lp9667 +g15 +aI542 +aI-763 +aI526 +aI-638 +aI542 +aI-698 +aa(lp9668 +g15 +aI509 +aI-861 +aI542 +aI-805 +aI531 +aI-837 +aa(lp9669 +g15 +aI419 +aI-897 +aI487 +aI-885 +aI457 +aI-897 +aa(lp9670 +g15 +aI230 +aI-696 +aI317 +aI-897 +aI254 +aI-830 +aa(lp9671 +g15 +aI136 +aI-782 +aI167 +aI-696 +aI136 +aI-725 +aa(lp9672 +g15 +aI216 +aI-910 +aI136 +aI-831 +aI162 +aI-874 +aa(lp9673 +g15 +aI426 +aI-965 +aI270 +aI-946 +aI340 +aI-965 +aa(lp9674 +g15 +aI612 +aI-914 +aI506 +aI-965 +aI568 +aI-948 +aa(lp9675 +g15 +aI678 +aI-770 +aI656 +aI-880 +aI678 +aI-832 +aa(lp9676 +g15 +aI621 +aI-606 +aI678 +aI-717 +aI659 +aI-662 +aa(lp9677 +g15 +aI401 +aI-375 +aI583 +aI-550 +aI510 +aI-473 +aa(lp9678 +g20 +aI101 +aI-106 +aa(lp9679 +g20 +aI410 +aI-106 +aa(lp9680 +g15 +aI485 +aI-126 +aI439 +aI-106 +aI464 +aI-112 +aa(lp9681 +g15 +aI542 +aI-205 +aI505 +aI-139 +aI525 +aI-165 +aa(lp9682 +g20 +aI552 +aI-227 +aa(lp9683 +g20 +aI608 +aI-227 +aa(lp9684 +g20 +aI554 +aI0 +aa(lp9685 +g10 +aa(lp9686 +g8 +aI745 +aI0 +aa(lp9687 +g10 +aa(lp9688 +g8 +aI745 +aI0 +aasV6 +(lp9689 +(lp9690 +g8 +aI234 +aI-508 +aa(lp9691 +g15 +aI430 +aI-578 +aI300 +aI-555 +aI365 +aI-578 +aa(lp9692 +g15 +aI596 +aI-514 +aI501 +aI-578 +aI556 +aI-557 +aa(lp9693 +g15 +aI656 +aI-344 +aI636 +aI-472 +aI656 +aI-415 +aa(lp9694 +g15 +aI568 +aI-88 +aI656 +aI-241 +aI627 +aI-155 +aa(lp9695 +g15 +aI330 +aI13 +aI510 +aI-20 +aI430 +aI13 +aa(lp9696 +g15 +aI149 +aI-72 +aI255 +aI13 +aI195 +aI-15 +aa(lp9697 +g15 +aI80 +aI-308 +aI103 +aI-129 +aI80 +aI-208 +aa(lp9698 +g15 +aI209 +aI-771 +aI80 +aI-488 +aI123 +aI-642 +aa(lp9699 +g15 +aI535 +aI-965 +aI295 +aI-900 +aI404 +aI-965 +aa(lp9700 +g15 +aI685 +aI-930 +aI599 +aI-965 +aI649 +aI-953 +aa(lp9701 +g15 +aI740 +aI-844 +aI722 +aI-907 +aI740 +aI-878 +aa(lp9702 +g15 +aI623 +aI-744 +aI740 +aI-778 +aI701 +aI-744 +aa(lp9703 +g15 +aI600 +aI-868 +aI623 +aI-805 +aI616 +aI-846 +aa(lp9704 +g15 +aI533 +aI-900 +aI585 +aI-889 +aI563 +aI-900 +aa(lp9705 +g15 +aI234 +aI-508 +aI399 +aI-900 +aI299 +aI-769 +aa(lp9706 +g10 +aa(lp9707 +g8 +aI220 +aI-433 +aa(lp9708 +g15 +aI201 +aI-259 +aI207 +aI-361 +aI201 +aI-304 +aa(lp9709 +g15 +aI338 +aI-59 +aI201 +aI-126 +aI246 +aI-59 +aa(lp9710 +g15 +aI471 +aI-137 +aI392 +aI-59 +aI436 +aI-85 +aa(lp9711 +g15 +aI524 +aI-336 +aI506 +aI-189 +aI524 +aI-256 +aa(lp9712 +g15 +aI404 +aI-509 +aI524 +aI-452 +aI484 +aI-509 +aa(lp9713 +g15 +aI220 +aI-433 +aI344 +aI-509 +aI283 +aI-484 +aa(lp9714 +g10 +aa(lp9715 +g8 +aI745 +aI0 +aa(lp9716 +g10 +aa(lp9717 +g8 +aI745 +aI0 +aasV: +(lp9718 +(lp9719 +g8 +aI245 +aI-536 +aa(lp9720 +g15 +aI162 +aI-618 +aI190 +aI-536 +aI162 +aI-563 +aa(lp9721 +g15 +aI186 +aI-692 +aI162 +aI-648 +aI170 +aI-673 +aa(lp9722 +g15 +aI250 +aI-720 +aI202 +aI-711 +aI223 +aI-720 +aa(lp9723 +g15 +aI333 +aI-639 +aI305 +aI-720 +aI333 +aI-693 +aa(lp9724 +g15 +aI309 +aI-564 +aI333 +aI-607 +aI325 +aI-582 +aa(lp9725 +g15 +aI245 +aI-536 +aI293 +aI-545 +aI272 +aI-536 +aa(lp9726 +g10 +aa(lp9727 +g8 +aI125 +aI10 +aa(lp9728 +g15 +aI42 +aI-70 +aI70 +aI10 +aI42 +aI-16 +aa(lp9729 +g15 +aI66 +aI-144 +aI42 +aI-101 +aI50 +aI-126 +aa(lp9730 +g15 +aI130 +aI-172 +aI82 +aI-163 +aI103 +aI-172 +aa(lp9731 +g15 +aI191 +aI-150 +aI156 +aI-172 +aI177 +aI-165 +aa(lp9732 +g15 +aI213 +aI-91 +aI206 +aI-135 +aI213 +aI-116 +aa(lp9733 +g15 +aI189 +aI-16 +aI213 +aI-59 +aI205 +aI-34 +aa(lp9734 +g15 +aI125 +aI10 +aI173 +aI1 +aI152 +aI10 +aa(lp9735 +g10 +aa(lp9736 +g8 +aI382 +aI0 +aa(lp9737 +g10 +aa(lp9738 +g8 +aI382 +aI0 +aasV> +(lp9739 +(lp9740 +g8 +aI97 +aI-146 +aa(lp9741 +g20 +aI97 +aI-235 +aa(lp9742 +g20 +aI545 +aI-475 +aa(lp9743 +g20 +aI97 +aI-718 +aa(lp9744 +g20 +aI97 +aI-807 +aa(lp9745 +g20 +aI669 +aI-499 +aa(lp9746 +g20 +aI669 +aI-452 +aa(lp9747 +g10 +aa(lp9748 +g8 +aI745 +aI0 +aa(lp9749 +g10 +aa(lp9750 +g8 +aI745 +aI0 +aasVB +(lp9751 +(lp9752 +g8 +aI-17 +aI-55 +aa(lp9753 +g20 +aI0 +aI-55 +aa(lp9754 +g15 +aI130 +aI-151 +aI73 +aI-55 +aI117 +aI-87 +aa(lp9755 +g20 +aI269 +aI-804 +aa(lp9756 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp9757 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp9758 +g20 +aI161 +aI-895 +aa(lp9759 +g20 +aI173 +aI-951 +aa(lp9760 +g20 +aI518 +aI-951 +aa(lp9761 +g15 +aI830 +aI-751 +aI726 +aI-951 +aI830 +aI-884 +aa(lp9762 +g15 +aI613 +aI-503 +aI830 +aI-619 +aI758 +aI-537 +aa(lp9763 +g20 +aI611 +aI-498 +aa(lp9764 +g15 +aI774 +aI-303 +aI720 +aI-476 +aI774 +aI-411 +aa(lp9765 +g15 +aI676 +aI-78 +aI774 +aI-205 +aI741 +aI-130 +aa(lp9766 +g15 +aI390 +aI0 +aI610 +aI-25 +aI515 +aI0 +aa(lp9767 +g20 +aI-27 +aI0 +aa(lp9768 +g10 +aa(lp9769 +g8 +aI345 +aI-531 +aa(lp9770 +g20 +aI447 +aI-531 +aa(lp9771 +g15 +aI685 +aI-733 +aI606 +aI-531 +aI685 +aI-598 +aa(lp9772 +g15 +aI501 +aI-884 +aI685 +aI-834 +aI624 +aI-884 +aa(lp9773 +g20 +aI421 +aI-884 +aa(lp9774 +g10 +aa(lp9775 +g8 +aI246 +aI-65 +aa(lp9776 +g20 +aI376 +aI-65 +aa(lp9777 +g15 +aI630 +aI-312 +aI546 +aI-65 +aI630 +aI-148 +aa(lp9778 +g15 +aI444 +aI-465 +aI630 +aI-414 +aI568 +aI-465 +aa(lp9779 +g20 +aI332 +aI-465 +aa(lp9780 +g10 +aa(lp9781 +g8 +aI871 +aI0 +aa(lp9782 +g10 +aa(lp9783 +g8 +aI871 +aI0 +aasVF +(lp9784 +(lp9785 +g8 +aI-17 +aI-55 +aa(lp9786 +g20 +aI0 +aI-55 +aa(lp9787 +g15 +aI89 +aI-77 +aI41 +aI-55 +aI71 +aI-62 +aa(lp9788 +g15 +aI129 +aI-144 +aI108 +aI-91 +aI121 +aI-113 +aa(lp9789 +g20 +aI269 +aI-804 +aa(lp9790 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp9791 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp9792 +g20 +aI161 +aI-895 +aa(lp9793 +g20 +aI173 +aI-951 +aa(lp9794 +g20 +aI845 +aI-951 +aa(lp9795 +g20 +aI802 +aI-718 +aa(lp9796 +g20 +aI733 +aI-718 +aa(lp9797 +g20 +aI735 +aI-741 +aa(lp9798 +g15 +aI737 +aI-765 +aI736 +aI-749 +aI736 +aI-757 +aa(lp9799 +g15 +aI740 +aI-795 +aI739 +aI-779 +aI740 +aI-790 +aa(lp9800 +g15 +aI639 +aI-884 +aI740 +aI-855 +aI706 +aI-884 +aa(lp9801 +g20 +aI421 +aI-884 +aa(lp9802 +g20 +aI338 +aI-499 +aa(lp9803 +g20 +aI660 +aI-499 +aa(lp9804 +g20 +aI646 +aI-434 +aa(lp9805 +g20 +aI325 +aI-434 +aa(lp9806 +g20 +aI265 +aI-151 +aa(lp9807 +g15 +aI261 +aI-118 +aI262 +aI-136 +aI261 +aI-125 +aa(lp9808 +g15 +aI353 +aI-55 +aI261 +aI-76 +aI291 +aI-55 +aa(lp9809 +g20 +aI397 +aI-55 +aa(lp9810 +g20 +aI386 +aI0 +aa(lp9811 +g20 +aI-27 +aI0 +aa(lp9812 +g10 +aa(lp9813 +g8 +aI786 +aI0 +aa(lp9814 +g10 +aa(lp9815 +g8 +aI786 +aI0 +aasVJ +(lp9816 +(lp9817 +g8 +aI554 +aI-951 +aa(lp9818 +g20 +aI542 +aI-895 +aa(lp9819 +g20 +aI525 +aI-895 +aa(lp9820 +g15 +aI433 +aI-871 +aI482 +aI-895 +aI452 +aI-887 +aa(lp9821 +g15 +aI395 +aI-799 +aI414 +aI-855 +aI402 +aI-831 +aa(lp9822 +g20 +aI222 +aI10 +aa(lp9823 +g15 +aI111 +aI247 +aI199 +aI119 +aI162 +aI198 +aa(lp9824 +g15 +aI-97 +aI320 +aI60 +aI296 +aI-9 +aI320 +aa(lp9825 +g15 +aI-206 +aI305 +aI-137 +aI320 +aI-173 +aI315 +aa(lp9826 +g20 +aI-188 +aI245 +aa(lp9827 +g15 +aI-101 +aI257 +aI-166 +aI253 +aI-137 +aI257 +aa(lp9828 +g15 +aI18 +aI199 +aI-49 +aI257 +aI-9 +aI238 +aa(lp9829 +g15 +aI89 +aI12 +aI47 +aI161 +aI70 +aI98 +aa(lp9830 +g20 +aI262 +aI-804 +aa(lp9831 +g15 +aI268 +aI-841 +aI266 +aI-823 +aI268 +aI-835 +aa(lp9832 +g15 +aI171 +aI-895 +aI268 +aI-877 +aI236 +aI-895 +aa(lp9833 +g20 +aI154 +aI-895 +aa(lp9834 +g20 +aI166 +aI-951 +aa(lp9835 +g10 +aa(lp9836 +g8 +aI475 +aI0 +aa(lp9837 +g10 +aa(lp9838 +g8 +aI475 +aI0 +aasVN +(lp9839 +(lp9840 +g8 +aI863 +aI-804 +aa(lp9841 +g15 +aI869 +aI-841 +aI867 +aI-821 +aI869 +aI-833 +aa(lp9842 +g15 +aI773 +aI-895 +aI869 +aI-877 +aI837 +aI-895 +aa(lp9843 +g20 +aI755 +aI-895 +aa(lp9844 +g20 +aI768 +aI-951 +aa(lp9845 +g20 +aI1102 +aI-951 +aa(lp9846 +g20 +aI1090 +aI-895 +aa(lp9847 +g20 +aI1073 +aI-895 +aa(lp9848 +g15 +aI982 +aI-870 +aI1031 +aI-895 +aI1000 +aI-887 +aa(lp9849 +g15 +aI944 +aI-799 +aI963 +aI-854 +aI950 +aI-830 +aa(lp9850 +g20 +aI774 +aI0 +aa(lp9851 +g20 +aI688 +aI0 +aa(lp9852 +g20 +aI345 +aI-780 +aa(lp9853 +g20 +aI210 +aI-146 +aa(lp9854 +g15 +aI205 +aI-108 +aI207 +aI-127 +aI205 +aI-114 +aa(lp9855 +g15 +aI301 +aI-55 +aI205 +aI-73 +aI237 +aI-55 +aa(lp9856 +g20 +aI318 +aI-55 +aa(lp9857 +g20 +aI306 +aI0 +aa(lp9858 +g20 +aI-26 +aI0 +aa(lp9859 +g20 +aI-14 +aI-55 +aa(lp9860 +g20 +aI2 +aI-55 +aa(lp9861 +g15 +aI92 +aI-79 +aI44 +aI-55 +aI74 +aI-63 +aa(lp9862 +g15 +aI130 +aI-151 +aI110 +aI-96 +aI123 +aI-119 +aa(lp9863 +g20 +aI269 +aI-804 +aa(lp9864 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp9865 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp9866 +g20 +aI161 +aI-895 +aa(lp9867 +g20 +aI173 +aI-951 +aa(lp9868 +g20 +aI416 +aI-951 +aa(lp9869 +g20 +aI738 +aI-215 +aa(lp9870 +g10 +aa(lp9871 +g8 +aI1017 +aI0 +aa(lp9872 +g10 +aa(lp9873 +g8 +aI1017 +aI0 +aasVR +(lp9874 +(lp9875 +g8 +aI300 +aI-419 +aa(lp9876 +g20 +aI241 +aI-146 +aa(lp9877 +g15 +aI235 +aI-108 +aI237 +aI-127 +aI235 +aI-115 +aa(lp9878 +g15 +aI332 +aI-55 +aI235 +aI-73 +aI267 +aI-55 +aa(lp9879 +g20 +aI376 +aI-55 +aa(lp9880 +g20 +aI363 +aI0 +aa(lp9881 +g20 +aI-49 +aI0 +aa(lp9882 +g20 +aI-37 +aI-55 +aa(lp9883 +g20 +aI-20 +aI-55 +aa(lp9884 +g15 +aI71 +aI-78 +aI24 +aI-55 +aI54 +aI-63 +aa(lp9885 +g15 +aI106 +aI-144 +aI89 +aI-94 +aI100 +aI-116 +aa(lp9886 +g20 +aI246 +aI-804 +aa(lp9887 +g15 +aI251 +aI-841 +aI250 +aI-821 +aI251 +aI-833 +aa(lp9888 +g15 +aI156 +aI-895 +aI251 +aI-877 +aI220 +aI-895 +aa(lp9889 +g20 +aI138 +aI-895 +aa(lp9890 +g20 +aI150 +aI-951 +aa(lp9891 +g20 +aI500 +aI-951 +aa(lp9892 +g15 +aI805 +aI-724 +aI703 +aI-951 +aI805 +aI-875 +aa(lp9893 +g15 +aI558 +aI-446 +aI805 +aI-578 +aI723 +aI-485 +aa(lp9894 +g20 +aI654 +aI-161 +aa(lp9895 +g15 +aI702 +aI-74 +aI670 +aI-115 +aI686 +aI-86 +aa(lp9896 +g15 +aI764 +aI-55 +aI718 +aI-61 +aI739 +aI-55 +aa(lp9897 +g20 +aI774 +aI-55 +aa(lp9898 +g20 +aI764 +aI0 +aa(lp9899 +g20 +aI746 +aI0 +aa(lp9900 +g15 +aI584 +aI-29 +aI670 +aI0 +aI616 +aI-9 +aa(lp9901 +g15 +aI509 +aI-155 +aI552 +aI-50 +aI527 +aI-91 +aa(lp9902 +g20 +aI432 +aI-419 +aa(lp9903 +g10 +aa(lp9904 +g8 +aI313 +aI-481 +aa(lp9905 +g20 +aI416 +aI-481 +aa(lp9906 +g15 +aI599 +aI-542 +aI495 +aI-481 +aI556 +aI-502 +aa(lp9907 +g15 +aI664 +aI-716 +aI642 +aI-583 +aI664 +aI-641 +aa(lp9908 +g15 +aI624 +aI-846 +aI664 +aI-776 +aI650 +aI-819 +aa(lp9909 +g15 +aI489 +aI-887 +aI598 +aI-873 +aI553 +aI-887 +aa(lp9910 +g20 +aI398 +aI-887 +aa(lp9911 +g10 +aa(lp9912 +g8 +aI862 +aI0 +aa(lp9913 +g10 +aa(lp9914 +g8 +aI862 +aI0 +aasVV +(lp9915 +(lp9916 +g8 +aI416 +aI-130 +aa(lp9917 +g15 +aI524 +aI-349 +aI449 +aI-207 +aI485 +aI-280 +aa(lp9918 +g20 +aI761 +aI-772 +aa(lp9919 +g15 +aI786 +aI-847 +aI777 +aI-803 +aI786 +aI-828 +aa(lp9920 +g15 +aI712 +aI-895 +aI786 +aI-879 +aI761 +aI-895 +aa(lp9921 +g20 +aI681 +aI-895 +aa(lp9922 +g20 +aI692 +aI-951 +aa(lp9923 +g20 +aI1021 +aI-951 +aa(lp9924 +g20 +aI1009 +aI-895 +aa(lp9925 +g20 +aI983 +aI-895 +aa(lp9926 +g15 +aI916 +aI-872 +aI953 +aI-895 +aI931 +aI-887 +aa(lp9927 +g15 +aI861 +aI-791 +aI901 +aI-857 +aI883 +aI-830 +aa(lp9928 +g20 +aI417 +aI0 +aa(lp9929 +g20 +aI320 +aI0 +aa(lp9930 +g20 +aI206 +aI-825 +aa(lp9931 +g15 +aI184 +aI-880 +aI202 +aI-851 +aI195 +aI-869 +aa(lp9932 +g15 +aI126 +aI-895 +aI173 +aI-890 +aI154 +aI-895 +aa(lp9933 +g20 +aI109 +aI-895 +aa(lp9934 +g20 +aI121 +aI-951 +aa(lp9935 +g20 +aI483 +aI-951 +aa(lp9936 +g20 +aI473 +aI-895 +aa(lp9937 +g20 +aI442 +aI-895 +aa(lp9938 +g15 +aI373 +aI-877 +aI414 +aI-895 +aI390 +aI-889 +aa(lp9939 +g15 +aI346 +aI-827 +aI355 +aI-865 +aI346 +aI-848 +aa(lp9940 +g15 +aI349 +aI-782 +aI346 +aI-812 +aI347 +aI-797 +aa(lp9941 +g20 +aI402 +aI-349 +aa(lp9942 +g15 +aI416 +aI-130 +aI411 +aI-274 +aI416 +aI-201 +aa(lp9943 +g10 +aa(lp9944 +g8 +aI899 +aI0 +aa(lp9945 +g10 +aa(lp9946 +g8 +aI899 +aI0 +aasVZ +(lp9947 +(lp9948 +g8 +aI830 +aI-896 +aa(lp9949 +g20 +aI158 +aI-65 +aa(lp9950 +g20 +aI514 +aI-65 +aa(lp9951 +g15 +aI649 +aI-175 +aI580 +aI-65 +aI625 +aI-102 +aa(lp9952 +g20 +aI667 +aI-232 +aa(lp9953 +g20 +aI737 +aI-232 +aa(lp9954 +g20 +aI681 +aI0 +aa(lp9955 +g20 +aI-22 +aI0 +aa(lp9956 +g20 +aI-11 +aI-52 +aa(lp9957 +g20 +aI658 +aI-884 +aa(lp9958 +g20 +aI348 +aI-884 +aa(lp9959 +g15 +aI214 +aI-775 +aI282 +aI-884 +aI238 +aI-848 +aa(lp9960 +g20 +aI195 +aI-718 +aa(lp9961 +g20 +aI126 +aI-718 +aa(lp9962 +g20 +aI182 +aI-951 +aa(lp9963 +g20 +aI841 +aI-951 +aa(lp9964 +g10 +aa(lp9965 +g8 +aI806 +aI0 +aa(lp9966 +g10 +aa(lp9967 +g8 +aI806 +aI0 +aasV^ +(lp9968 +(lp9969 +g8 +aI359 +aI-951 +aa(lp9970 +g20 +aI406 +aI-951 +aa(lp9971 +g20 +aI686 +aI-354 +aa(lp9972 +g20 +aI597 +aI-354 +aa(lp9973 +g20 +aI382 +aI-828 +aa(lp9974 +g20 +aI167 +aI-354 +aa(lp9975 +g20 +aI78 +aI-354 +aa(lp9976 +g10 +aa(lp9977 +g8 +aI745 +aI0 +aa(lp9978 +g10 +aa(lp9979 +g8 +aI745 +aI0 +aasVb +(lp9980 +(lp9981 +g8 +aI138 +aI-34 +aa(lp9982 +g20 +aI78 +aI4 +aa(lp9983 +g20 +aI35 +aI4 +aa(lp9984 +g20 +aI212 +aI-823 +aa(lp9985 +g15 +aI223 +aI-894 +aI220 +aI-860 +aI223 +aI-883 +aa(lp9986 +g15 +aI130 +aI-956 +aI223 +aI-935 +aI192 +aI-956 +aa(lp9987 +g20 +aI119 +aI-956 +aa(lp9988 +g20 +aI132 +aI-1012 +aa(lp9989 +g20 +aI384 +aI-1012 +aa(lp9990 +g20 +aI320 +aI-713 +aa(lp9991 +g15 +aI272 +aI-536 +aI311 +aI-670 +aI295 +aI-611 +aa(lp9992 +g20 +aI278 +aI-536 +aa(lp9993 +g15 +aI522 +aI-727 +aI344 +aI-663 +aI425 +aI-727 +aa(lp9994 +g15 +aI647 +aI-666 +aI575 +aI-727 +aI617 +aI-707 +aa(lp9995 +g15 +aI692 +aI-486 +aI677 +aI-625 +aI692 +aI-565 +aa(lp9996 +g15 +aI577 +aI-143 +aI692 +aI-362 +aI653 +aI-248 +aa(lp9997 +g15 +aI294 +aI13 +aI501 +aI-38 +aI406 +aI13 +aa(lp9998 +g15 +aI138 +aI-34 +aI231 +aI13 +aI179 +aI-2 +aa(lp9999 +g10 +aa(lp10000 +g8 +aI185 +aI-93 +aa(lp10001 +g15 +aI289 +aI-46 +aI212 +aI-62 +aI246 +aI-46 +aa(lp10002 +g15 +aI480 +aI-194 +aI366 +aI-46 +aI430 +aI-95 +aa(lp10003 +g15 +aI555 +aI-487 +aI530 +aI-292 +aI555 +aI-390 +aa(lp10004 +g15 +aI472 +aI-643 +aI555 +aI-591 +aI527 +aI-643 +aa(lp10005 +g15 +aI329 +aI-542 +aI423 +aI-643 +aI375 +aI-609 +aa(lp10006 +g15 +aI242 +aI-358 +aI283 +aI-474 +aI254 +aI-413 +aa(lp10007 +g10 +aa(lp10008 +g8 +aI749 +aI0 +aa(lp10009 +g10 +aa(lp10010 +g8 +aI749 +aI0 +aasVf +(lp10011 +(lp10012 +g8 +aI468 +aI-638 +aa(lp10013 +g20 +aI318 +aI-638 +aa(lp10014 +g20 +aI179 +aI10 +aa(lp10015 +g15 +aI78 +aI246 +aI156 +aI118 +aI123 +aI196 +aa(lp10016 +g15 +aI-109 +aI320 +aI34 +aI295 +aI-28 +aI320 +aa(lp10017 +g15 +aI-186 +aI309 +aI-134 +aI320 +aI-160 +aI317 +aa(lp10018 +g20 +aI-174 +aI248 +aa(lp10019 +g15 +aI-113 +aI257 +aI-152 +aI254 +aI-131 +aI257 +aa(lp10020 +g15 +aI-11 +aI202 +aI-70 +aI257 +aI-36 +aI239 +aa(lp10021 +g15 +aI54 +aI12 +aI13 +aI165 +aI35 +aI102 +aa(lp10022 +g20 +aI194 +aI-638 +aa(lp10023 +g20 +aI73 +aI-638 +aa(lp10024 +g20 +aI81 +aI-686 +aa(lp10025 +g20 +aI209 +aI-714 +aa(lp10026 +g20 +aI223 +aI-787 +aa(lp10027 +g15 +aI477 +aI-1026 +aI255 +aI-946 +aI339 +aI-1026 +aa(lp10028 +g15 +aI605 +aI-999 +aI534 +aI-1026 +aI576 +aI-1017 +aa(lp10029 +g15 +aI649 +aI-927 +aI634 +aI-981 +aI649 +aI-957 +aa(lp10030 +g15 +aI538 +aI-840 +aI649 +aI-869 +aI612 +aI-840 +aa(lp10031 +g15 +aI470 +aI-965 +aI538 +aI-923 +aI515 +aI-965 +aa(lp10032 +g15 +aI394 +aI-924 +aI438 +aI-965 +aI412 +aI-951 +aa(lp10033 +g15 +aI352 +aI-799 +aI376 +aI-897 +aI362 +aI-856 +aa(lp10034 +g20 +aI334 +aI-714 +aa(lp10035 +g20 +aI482 +aI-714 +aa(lp10036 +g10 +aa(lp10037 +g8 +aI423 +aI0 +aa(lp10038 +g10 +aa(lp10039 +g8 +aI423 +aI0 +aasVj +(lp10040 +(lp10041 +g8 +aI300 +aI-847 +aa(lp10042 +g15 +aI225 +aI-920 +aI250 +aI-847 +aI225 +aI-872 +aa(lp10043 +g15 +aI247 +aI-988 +aI225 +aI-948 +aI232 +aI-971 +aa(lp10044 +g15 +aI305 +aI-1014 +aI261 +aI-1005 +aI281 +aI-1014 +aa(lp10045 +g15 +aI380 +aI-940 +aI355 +aI-1014 +aI380 +aI-989 +aa(lp10046 +g15 +aI357 +aI-871 +aI380 +aI-910 +aI372 +aI-887 +aa(lp10047 +g15 +aI300 +aI-847 +aI342 +aI-855 +aI323 +aI-847 +aa(lp10048 +g10 +aa(lp10049 +g8 +aI-186 +aI309 +aa(lp10050 +g20 +aI-174 +aI248 +aa(lp10051 +g15 +aI-113 +aI257 +aI-152 +aI254 +aI-131 +aI257 +aa(lp10052 +g15 +aI-8 +aI198 +aI-68 +aI257 +aI-33 +aI237 +aa(lp10053 +g15 +aI55 +aI10 +aI17 +aI158 +aI38 +aI95 +aa(lp10054 +g20 +aI178 +aI-567 +aa(lp10055 +g15 +aI182 +aI-602 +aI181 +aI-581 +aI182 +aI-593 +aa(lp10056 +g15 +aI101 +aI-658 +aI182 +aI-639 +aI155 +aI-658 +aa(lp10057 +g20 +aI83 +aI-658 +aa(lp10058 +g20 +aI95 +aI-714 +aa(lp10059 +g20 +aI334 +aI-714 +aa(lp10060 +g20 +aI181 +aI10 +aa(lp10061 +g15 +aI80 +aI245 +aI159 +aI116 +aI125 +aI194 +aa(lp10062 +g15 +aI-109 +aI320 +aI35 +aI295 +aI-27 +aI320 +aa(lp10063 +g15 +aI-186 +aI309 +aI-134 +aI320 +aI-160 +aI317 +aa(lp10064 +g10 +aa(lp10065 +g8 +aI388 +aI0 +aa(lp10066 +g10 +aa(lp10067 +g8 +aI388 +aI0 +aasVn +(lp10068 +(lp10069 +g8 +aI182 +aI0 +aa(lp10070 +g20 +aI58 +aI0 +aa(lp10071 +g20 +aI170 +aI-535 +aa(lp10072 +g15 +aI178 +aI-595 +aI175 +aI-560 +aI178 +aI-580 +aa(lp10073 +g15 +aI85 +aI-658 +aI178 +aI-637 +aI147 +aI-658 +aa(lp10074 +g20 +aI74 +aI-658 +aa(lp10075 +g20 +aI86 +aI-714 +aa(lp10076 +g20 +aI333 +aI-714 +aa(lp10077 +g20 +aI297 +aI-546 +aa(lp10078 +g20 +aI310 +aI-546 +aa(lp10079 +g15 +aI553 +aI-726 +aI382 +aI-666 +aI463 +aI-726 +aa(lp10080 +g15 +aI695 +aI-578 +aI648 +aI-726 +aI695 +aI-676 +aa(lp10081 +g15 +aI671 +aI-431 +aI695 +aI-550 +aI687 +aI-501 +aa(lp10082 +g20 +aI637 +aI-274 +aa(lp10083 +g15 +aI619 +aI-134 +aI625 +aI-220 +aI619 +aI-174 +aa(lp10084 +g15 +aI666 +aI-70 +aI619 +aI-91 +aI635 +aI-70 +aa(lp10085 +g15 +aI751 +aI-101 +aI692 +aI-70 +aI720 +aI-80 +aa(lp10086 +g20 +aI776 +aI-62 +aa(lp10087 +g15 +aI613 +aI13 +aI717 +aI-11 +aI663 +aI13 +aa(lp10088 +g15 +aI525 +aI-22 +aI576 +aI13 +aI546 +aI1 +aa(lp10089 +g15 +aI492 +aI-119 +aI503 +aI-46 +aI492 +aI-78 +aa(lp10090 +g15 +aI517 +aI-299 +aI492 +aI-160 +aI500 +aI-220 +aa(lp10091 +g20 +aI548 +aI-437 +aa(lp10092 +g15 +aI567 +aI-562 +aI561 +aI-491 +aI567 +aI-532 +aa(lp10093 +g15 +aI506 +aI-640 +aI567 +aI-614 +aI547 +aI-640 +aa(lp10094 +g15 +aI354 +aI-540 +aI457 +aI-640 +aI406 +aI-607 +aa(lp10095 +g15 +aI254 +aI-340 +aI302 +aI-473 +aI269 +aI-407 +aa(lp10096 +g10 +aa(lp10097 +g8 +aI798 +aI0 +aa(lp10098 +g10 +aa(lp10099 +g8 +aI798 +aI0 +aasVr +(lp10100 +(lp10101 +g8 +aI520 +aI-534 +aa(lp10102 +g15 +aI466 +aI-639 +aI520 +aI-604 +aI502 +aI-639 +aa(lp10103 +g15 +aI335 +aI-517 +aI425 +aI-639 +aI381 +aI-598 +aa(lp10104 +g15 +aI233 +aI-242 +aI289 +aI-436 +aI255 +aI-344 +aa(lp10105 +g20 +aI182 +aI0 +aa(lp10106 +g20 +aI58 +aI0 +aa(lp10107 +g20 +aI170 +aI-535 +aa(lp10108 +g15 +aI178 +aI-595 +aI175 +aI-560 +aI178 +aI-580 +aa(lp10109 +g15 +aI72 +aI-658 +aI178 +aI-637 +aI143 +aI-658 +aa(lp10110 +g20 +aI61 +aI-658 +aa(lp10111 +g20 +aI73 +aI-714 +aa(lp10112 +g20 +aI309 +aI-714 +aa(lp10113 +g20 +aI281 +aI-522 +aa(lp10114 +g20 +aI294 +aI-522 +aa(lp10115 +g15 +aI400 +aI-684 +aI330 +aI-601 +aI365 +aI-655 +aa(lp10116 +g15 +aI521 +aI-727 +aI435 +aI-713 +aI475 +aI-727 +aa(lp10117 +g15 +aI630 +aI-635 +aI594 +aI-727 +aI630 +aI-696 +aa(lp10118 +g15 +aI520 +aI-534 +aI630 +aI-567 +aI593 +aI-534 +aa(lp10119 +g10 +aa(lp10120 +g8 +aI623 +aI0 +aa(lp10121 +g10 +aa(lp10122 +g8 +aI623 +aI0 +aasVv +(lp10123 +(lp10124 +g8 +aI128 +aI-587 +aa(lp10125 +g15 +aI35 +aI-658 +aI120 +aI-634 +aI90 +aI-658 +aa(lp10126 +g20 +aI22 +aI-658 +aa(lp10127 +g20 +aI33 +aI-714 +aa(lp10128 +g20 +aI233 +aI-714 +aa(lp10129 +g20 +aI294 +aI-319 +aa(lp10130 +g15 +aI325 +aI-83 +aI310 +aI-219 +aI320 +aI-140 +aa(lp10131 +g20 +aI329 +aI-83 +aa(lp10132 +g15 +aI501 +aI-307 +aI395 +aI-147 +aI453 +aI-221 +aa(lp10133 +g15 +aI574 +aI-512 +aI550 +aI-392 +aI574 +aI-460 +aa(lp10134 +g15 +aI552 +aI-586 +aI574 +aI-543 +aI567 +aI-568 +aa(lp10135 +g15 +aI492 +aI-614 +aI536 +aI-605 +aI516 +aI-614 +aa(lp10136 +g15 +aI518 +aI-691 +aI492 +aI-646 +aI500 +aI-672 +aa(lp10137 +g15 +aI582 +aI-720 +aI535 +aI-711 +aI557 +aI-720 +aa(lp10138 +g15 +aI673 +aI-597 +aI643 +aI-720 +aI673 +aI-679 +aa(lp10139 +g15 +aI581 +aI-313 +aI673 +aI-516 +aI642 +aI-421 +aa(lp10140 +g15 +aI341 +aI0 +aI519 +aI-205 +aI439 +aI-101 +aa(lp10141 +g20 +aI221 +aI12 +aa(lp10142 +g10 +aa(lp10143 +g8 +aI717 +aI0 +aa(lp10144 +g10 +aa(lp10145 +g8 +aI717 +aI0 +aasVz +(lp10146 +(lp10147 +g8 +aI401 +aI-75 +aa(lp10148 +g15 +aI459 +aI-95 +aI422 +aI-75 +aI441 +aI-82 +aa(lp10149 +g15 +aI514 +aI-185 +aI476 +aI-109 +aI495 +aI-139 +aa(lp10150 +g20 +aI527 +aI-215 +aa(lp10151 +g20 +aI583 +aI-215 +aa(lp10152 +g20 +aI531 +aI0 +aa(lp10153 +g20 +aI-1 +aI0 +aa(lp10154 +g20 +aI9 +aI-52 +aa(lp10155 +g20 +aI462 +aI-638 +aa(lp10156 +g20 +aI293 +aI-638 +aa(lp10157 +g15 +aI222 +aI-616 +aI262 +aI-638 +aI239 +aI-630 +aa(lp10158 +g15 +aI167 +aI-530 +aI205 +aI-601 +aI187 +aI-572 +aa(lp10159 +g20 +aI165 +aI-524 +aa(lp10160 +g20 +aI109 +aI-524 +aa(lp10161 +g20 +aI162 +aI-714 +aa(lp10162 +g20 +aI629 +aI-714 +aa(lp10163 +g20 +aI618 +aI-659 +aa(lp10164 +g20 +aI164 +aI-75 +aa(lp10165 +g10 +aa(lp10166 +g8 +aI681 +aI0 +aa(lp10167 +g10 +aa(lp10168 +g8 +aI681 +aI0 +aasV~ +(lp10169 +(lp10170 +g8 +aI162 +aI-358 +aa(lp10171 +g20 +aI83 +aI-358 +aa(lp10172 +g15 +aI251 +aI-591 +aI96 +aI-513 +aI152 +aI-591 +aa(lp10173 +g15 +aI413 +aI-503 +aI292 +aI-591 +aI346 +aI-562 +aa(lp10174 +g15 +aI522 +aI-437 +aI459 +aI-459 +aI496 +aI-437 +aa(lp10175 +g15 +aI577 +aI-477 +aI547 +aI-437 +aI565 +aI-450 +aa(lp10176 +g15 +aI604 +aI-591 +aI589 +aI-504 +aI598 +aI-542 +aa(lp10177 +g20 +aI684 +aI-591 +aa(lp10178 +g15 +aI516 +aI-358 +aI667 +aI-435 +aI611 +aI-358 +aa(lp10179 +g15 +aI361 +aI-442 +aI474 +aI-358 +aI422 +aI-386 +aa(lp10180 +g15 +aI246 +aI-512 +aI310 +aI-489 +aI271 +aI-512 +aa(lp10181 +g15 +aI188 +aI-474 +aI220 +aI-512 +aI201 +aI-499 +aa(lp10182 +g15 +aI162 +aI-358 +aI176 +aI-449 +aI167 +aI-410 +aa(lp10183 +g10 +aa(lp10184 +g8 +aI748 +aI0 +aa(lp10185 +g10 +aa(lp10186 +g8 +aI748 +aI0 +aasV! +(lp10187 +(lp10188 +g8 +aI266 +aI-951 +aa(lp10189 +g20 +aI421 +aI-951 +aa(lp10190 +g20 +aI229 +aI-267 +aa(lp10191 +g20 +aI167 +aI-267 +aa(lp10192 +g10 +aa(lp10193 +g8 +aI162 +aI10 +aa(lp10194 +g15 +aI80 +aI-70 +aI107 +aI10 +aI80 +aI-16 +aa(lp10195 +g15 +aI103 +aI-144 +aI80 +aI-101 +aI87 +aI-126 +aa(lp10196 +g15 +aI167 +aI-172 +aI119 +aI-163 +aI141 +aI-172 +aa(lp10197 +g15 +aI250 +aI-91 +aI223 +aI-172 +aI250 +aI-145 +aa(lp10198 +g15 +aI226 +aI-16 +aI250 +aI-59 +aI242 +aI-34 +aa(lp10199 +g15 +aI162 +aI10 +aI211 +aI1 +aI189 +aI10 +aa(lp10200 +g10 +aa(lp10201 +g8 +aI444 +aI0 +aa(lp10202 +g10 +aa(lp10203 +g8 +aI444 +aI0 +aasV% +(lp10204 +(lp10205 +g8 +aI367 +aI-963 +aa(lp10206 +g15 +aI545 +aI-751 +aI486 +aI-963 +aI545 +aI-892 +aa(lp10207 +g15 +aI467 +aI-495 +aI545 +aI-661 +aI519 +aI-576 +aa(lp10208 +g15 +aI259 +aI-373 +aI414 +aI-414 +aI345 +aI-373 +aa(lp10209 +g15 +aI133 +aI-428 +aI205 +aI-373 +aI163 +aI-392 +aa(lp10210 +g15 +aI87 +aI-586 +aI102 +aI-464 +aI87 +aI-517 +aa(lp10211 +g15 +aI164 +aI-845 +aI87 +aI-679 +aI113 +aI-766 +aa(lp10212 +g15 +aI367 +aI-963 +aI215 +aI-924 +aI283 +aI-963 +aa(lp10213 +g10 +aa(lp10214 +g8 +aI193 +aI-565 +aa(lp10215 +g15 +aI265 +aI-428 +aI193 +aI-474 +aI217 +aI-428 +aa(lp10216 +g15 +aI386 +aI-544 +aI313 +aI-428 +aI354 +aI-467 +aa(lp10217 +g15 +aI434 +aI-772 +aI418 +aI-621 +aI434 +aI-697 +aa(lp10218 +g15 +aI362 +aI-910 +aI434 +aI-864 +aI410 +aI-910 +aa(lp10219 +g15 +aI241 +aI-795 +aI314 +aI-910 +aI274 +aI-871 +aa(lp10220 +g15 +aI193 +aI-565 +aI209 +aI-718 +aI193 +aI-641 +aa(lp10221 +g10 +aa(lp10222 +g8 +aI321 +aI0 +aa(lp10223 +g20 +aI222 +aI0 +aa(lp10224 +g20 +aI891 +aI-951 +aa(lp10225 +g20 +aI985 +aI-951 +aa(lp10226 +g10 +aa(lp10227 +g8 +aI957 +aI-578 +aa(lp10228 +g15 +aI1134 +aI-366 +aI1075 +aI-578 +aI1134 +aI-507 +aa(lp10229 +g15 +aI1056 +aI-110 +aI1134 +aI-276 +aI1108 +aI-190 +aa(lp10230 +g15 +aI849 +aI10 +aI1004 +aI-29 +aI935 +aI10 +aa(lp10231 +g15 +aI677 +aI-200 +aI734 +aI10 +aI677 +aI-59 +aa(lp10232 +g15 +aI753 +aI-459 +aI677 +aI-294 +aI702 +aI-380 +aa(lp10233 +g15 +aI957 +aI-578 +aI805 +aI-538 +aI872 +aI-578 +aa(lp10234 +g10 +aa(lp10235 +g8 +aI782 +aI-181 +aa(lp10236 +g15 +aI854 +aI-43 +aI782 +aI-89 +aI806 +aI-43 +aa(lp10237 +g15 +aI975 +aI-158 +aI902 +aI-43 +aI943 +aI-82 +aa(lp10238 +g15 +aI1024 +aI-387 +aI1007 +aI-235 +aI1024 +aI-311 +aa(lp10239 +g15 +aI951 +aI-524 +aI1024 +aI-479 +aI1000 +aI-524 +aa(lp10240 +g15 +aI831 +aI-410 +aI903 +aI-524 +aI863 +aI-486 +aa(lp10241 +g15 +aI782 +aI-181 +aI798 +aI-333 +aI782 +aI-257 +aa(lp10242 +g10 +aa(lp10243 +g8 +aI1194 +aI0 +aa(lp10244 +g10 +aa(lp10245 +g8 +aI1194 +aI0 +aasV) +(lp10246 +(lp10247 +g8 +aI173 +aI-940 +aa(lp10248 +g20 +aI186 +aI-1002 +aa(lp10249 +g15 +aI422 +aI-583 +aI343 +aI-933 +aI422 +aI-794 +aa(lp10250 +g15 +aI292 +aI-96 +aI422 +aI-403 +aI379 +aI-240 +aa(lp10251 +g15 +aI-65 +aI182 +aI205 +aI48 +aI86 +aI141 +aa(lp10252 +g20 +aI-52 +aI121 +aa(lp10253 +g15 +aI215 +aI-216 +aI71 +aI55 +aI160 +aI-57 +aa(lp10254 +g15 +aI297 +aI-646 +aI270 +aI-375 +aI297 +aI-518 +aa(lp10255 +g15 +aI173 +aI-940 +aI297 +aI-784 +aI256 +aI-883 +aa(lp10256 +g10 +aa(lp10257 +g8 +aI461 +aI0 +aa(lp10258 +g10 +aa(lp10259 +g8 +aI461 +aI0 +aasV- +(lp10260 +(lp10261 +g8 +aI18 +aI-312 +aa(lp10262 +g20 +aI39 +aI-412 +aa(lp10263 +g20 +aI386 +aI-412 +aa(lp10264 +g20 +aI365 +aI-312 +aa(lp10265 +g10 +aa(lp10266 +g8 +aI413 +aI0 +aa(lp10267 +g10 +aa(lp10268 +g8 +aI413 +aI0 +aasV1 +(lp10269 +(lp10270 +g8 +aI567 +aI-956 +aa(lp10271 +g20 +aI395 +aI-146 +aa(lp10272 +g15 +aI390 +aI-108 +aI392 +aI-129 +aI390 +aI-117 +aa(lp10273 +g15 +aI486 +aI-55 +aI390 +aI-73 +aI422 +aI-55 +aa(lp10274 +g20 +aI558 +aI-55 +aa(lp10275 +g20 +aI546 +aI0 +aa(lp10276 +g20 +aI50 +aI0 +aa(lp10277 +g20 +aI61 +aI-55 +aa(lp10278 +g20 +aI132 +aI-55 +aa(lp10279 +g15 +aI223 +aI-79 +aI174 +aI-55 +aI204 +aI-63 +aa(lp10280 +g15 +aI262 +aI-151 +aI243 +aI-95 +aI255 +aI-119 +aa(lp10281 +g20 +aI366 +aI-642 +aa(lp10282 +g15 +aI416 +aI-851 +aI381 +aI-713 +aI398 +aI-783 +aa(lp10283 +g20 +aI410 +aI-851 +aa(lp10284 +g15 +aI285 +aI-741 +aI354 +aI-796 +aI313 +aI-759 +aa(lp10285 +g15 +aI209 +aI-713 +aI258 +aI-722 +aI233 +aI-713 +aa(lp10286 +g15 +aI156 +aI-784 +aI174 +aI-713 +aI156 +aI-736 +aa(lp10287 +g15 +aI374 +aI-887 +aI217 +aI-799 +aI289 +aI-833 +aa(lp10288 +g20 +aI482 +aI-956 +aa(lp10289 +g10 +aa(lp10290 +g8 +aI745 +aI0 +aa(lp10291 +g10 +aa(lp10292 +g8 +aI745 +aI0 +aasV5 +(lp10293 +(lp10294 +g8 +aI167 +aI-466 +aa(lp10295 +g20 +aI122 +aI-475 +aa(lp10296 +g20 +aI265 +aI-951 +aa(lp10297 +g20 +aI710 +aI-951 +aa(lp10298 +g20 +aI674 +aI-750 +aa(lp10299 +g20 +aI618 +aI-750 +aa(lp10300 +g15 +aI622 +aI-812 +aI621 +aI-784 +aI622 +aI-804 +aa(lp10301 +g15 +aI561 +aI-844 +aI622 +aI-833 +aI601 +aI-844 +aa(lp10302 +g20 +aI302 +aI-844 +aa(lp10303 +g20 +aI214 +aI-547 +aa(lp10304 +g15 +aI342 +aI-568 +aI257 +aI-561 +aI300 +aI-568 +aa(lp10305 +g15 +aI548 +aI-503 +aI430 +aI-568 +aI498 +aI-546 +aa(lp10306 +g15 +aI622 +aI-323 +aI597 +aI-460 +aI622 +aI-400 +aa(lp10307 +g15 +aI518 +aI-80 +aI622 +aI-224 +aI587 +aI-143 +aa(lp10308 +g15 +aI244 +aI13 +aI449 +aI-17 +aI357 +aI13 +aa(lp10309 +g15 +aI10 +aI-119 +aI88 +aI13 +aI10 +aI-30 +aa(lp10310 +g15 +aI110 +aI-202 +aI10 +aI-174 +aI43 +aI-202 +aa(lp10311 +g15 +aI255 +aI-59 +aI113 +aI-106 +aI162 +aI-59 +aa(lp10312 +g15 +aI423 +aI-126 +aI327 +aI-59 +aI383 +aI-81 +aa(lp10313 +g15 +aI483 +aI-314 +aI463 +aI-171 +aI483 +aI-233 +aa(lp10314 +g15 +aI437 +aI-447 +aI483 +aI-371 +aI468 +aI-415 +aa(lp10315 +g15 +aI313 +aI-495 +aI406 +aI-479 +aI364 +aI-495 +aa(lp10316 +g15 +aI167 +aI-466 +aI265 +aI-495 +aI217 +aI-485 +aa(lp10317 +g10 +aa(lp10318 +g8 +aI745 +aI0 +aa(lp10319 +g10 +aa(lp10320 +g8 +aI745 +aI0 +aasV9 +(lp10321 +(lp10322 +g8 +aI526 +aI-456 +aa(lp10323 +g15 +aI322 +aI-366 +aI468 +aI-396 +aI400 +aI-366 +aa(lp10324 +g15 +aI158 +aI-426 +aI253 +aI-366 +aI199 +aI-386 +aa(lp10325 +g15 +aI97 +aI-587 +aI117 +aI-466 +aI97 +aI-520 +aa(lp10326 +g15 +aI200 +aI-857 +aI97 +aI-695 +aI131 +aI-786 +aa(lp10327 +g15 +aI449 +aI-965 +aI268 +aI-929 +aI351 +aI-965 +aa(lp10328 +g15 +aI627 +aI-896 +aI524 +aI-965 +aI583 +aI-942 +aa(lp10329 +g15 +aI693 +aI-702 +aI671 +aI-850 +aI693 +aI-785 +aa(lp10330 +g15 +aI570 +aI-216 +aI693 +aI-531 +aI652 +aI-369 +aa(lp10331 +g15 +aI233 +aI13 +aI489 +aI-63 +aI376 +aI13 +aa(lp10332 +g15 +aI46 +aI-106 +aI108 +aI13 +aI46 +aI-26 +aa(lp10333 +g15 +aI67 +aI-161 +aI46 +aI-128 +aI53 +aI-146 +aa(lp10334 +g15 +aI125 +aI-183 +aI81 +aI-176 +aI100 +aI-183 +aa(lp10335 +g15 +aI159 +aI-87 +aI127 +aI-143 +aI138 +aI-111 +aa(lp10336 +g15 +aI244 +aI-51 +aI180 +aI-63 +aI208 +aI-51 +aa(lp10337 +g15 +aI402 +aI-146 +aI305 +aI-51 +aI358 +aI-83 +aa(lp10338 +g15 +aI526 +aI-456 +aI446 +aI-209 +aI488 +aI-312 +aa(lp10339 +g10 +aa(lp10340 +g8 +aI548 +aI-552 +aa(lp10341 +g15 +aI569 +aI-710 +aI562 +aI-610 +aI569 +aI-663 +aa(lp10342 +g15 +aI445 +aI-891 +aI569 +aI-831 +aI527 +aI-891 +aa(lp10343 +g15 +aI293 +aI-797 +aI386 +aI-891 +aI336 +aI-860 +aa(lp10344 +g15 +aI230 +aI-583 +aI251 +aI-735 +aI230 +aI-663 +aa(lp10345 +g15 +aI264 +aI-476 +aI230 +aI-536 +aI241 +aI-500 +aa(lp10346 +g15 +aI356 +aI-439 +aI287 +aI-451 +aI317 +aI-439 +aa(lp10347 +g15 +aI548 +aI-552 +aI427 +aI-439 +aI491 +aI-477 +aa(lp10348 +g10 +aa(lp10349 +g8 +aI745 +aI0 +aa(lp10350 +g10 +aa(lp10351 +g8 +aI745 +aI0 +aasV= +(lp10352 +(lp10353 +g8 +aI669 +aI-646 +aa(lp10354 +g20 +aI669 +aI-567 +aa(lp10355 +g20 +aI97 +aI-567 +aa(lp10356 +g20 +aI97 +aI-646 +aa(lp10357 +g10 +aa(lp10358 +g8 +aI669 +aI-383 +aa(lp10359 +g20 +aI669 +aI-304 +aa(lp10360 +g20 +aI97 +aI-304 +aa(lp10361 +g20 +aI97 +aI-383 +aa(lp10362 +g10 +aa(lp10363 +g8 +aI745 +aI0 +aa(lp10364 +g10 +aa(lp10365 +g8 +aI745 +aI0 +aasVA +(lp10366 +(lp10367 +g8 +aI265 +aI-317 +aa(lp10368 +g20 +aI185 +aI-177 +aa(lp10369 +g15 +aI160 +aI-103 +aI168 +aI-148 +aI160 +aI-123 +aa(lp10370 +g15 +aI234 +aI-55 +aI160 +aI-71 +aI184 +aI-55 +aa(lp10371 +g20 +aI265 +aI-55 +aa(lp10372 +g20 +aI254 +aI0 +aa(lp10373 +g20 +aI-74 +aI0 +aa(lp10374 +g20 +aI-63 +aI-55 +aa(lp10375 +g20 +aI-38 +aI-55 +aa(lp10376 +g15 +aI21 +aI-74 +aI-14 +aI-55 +aI5 +aI-61 +aa(lp10377 +g15 +aI85 +aI-159 +aI37 +aI-86 +aI58 +aI-114 +aa(lp10378 +g20 +aI549 +aI-951 +aa(lp10379 +g20 +aI653 +aI-951 +aa(lp10380 +g20 +aI779 +aI-126 +aa(lp10381 +g15 +aI802 +aI-70 +aI784 +aI-98 +aI791 +aI-79 +aa(lp10382 +g15 +aI858 +aI-55 +aI813 +aI-60 +aI832 +aI-55 +aa(lp10383 +g20 +aI876 +aI-55 +aa(lp10384 +g20 +aI865 +aI0 +aa(lp10385 +g20 +aI502 +aI0 +aa(lp10386 +g20 +aI513 +aI-55 +aa(lp10387 +g20 +aI544 +aI-55 +aa(lp10388 +g15 +aI639 +aI-123 +aI608 +aI-55 +aI639 +aI-78 +aa(lp10389 +g15 +aI637 +aI-168 +aI639 +aI-141 +aI639 +aI-156 +aa(lp10390 +g20 +aI615 +aI-317 +aa(lp10391 +g10 +aa(lp10392 +g8 +aI573 +aI-618 +aa(lp10393 +g15 +aI552 +aI-828 +aI560 +aI-712 +aI552 +aI-782 +aa(lp10394 +g15 +aI447 +aI-630 +aI531 +aI-780 +aI496 +aI-714 +aa(lp10395 +g20 +aI305 +aI-384 +aa(lp10396 +g20 +aI606 +aI-384 +aa(lp10397 +g10 +aa(lp10398 +g8 +aI940 +aI0 +aa(lp10399 +g10 +aa(lp10400 +g8 +aI940 +aI0 +aasVE +(lp10401 +(lp10402 +g8 +aI246 +aI-65 +aa(lp10403 +g20 +aI503 +aI-65 +aa(lp10404 +g15 +aI654 +aI-175 +aI578 +aI-65 +aI629 +aI-102 +aa(lp10405 +g20 +aI675 +aI-232 +aa(lp10406 +g20 +aI745 +aI-232 +aa(lp10407 +g20 +aI686 +aI0 +aa(lp10408 +g20 +aI-27 +aI0 +aa(lp10409 +g20 +aI-17 +aI-55 +aa(lp10410 +g20 +aI0 +aI-55 +aa(lp10411 +g15 +aI94 +aI-79 +aI45 +aI-55 +aI76 +aI-63 +aa(lp10412 +g15 +aI129 +aI-144 +aI111 +aI-95 +aI123 +aI-116 +aa(lp10413 +g20 +aI268 +aI-799 +aa(lp10414 +g15 +aI272 +aI-831 +aI270 +aI-811 +aI272 +aI-822 +aa(lp10415 +g15 +aI253 +aI-879 +aI272 +aI-852 +aI266 +aI-868 +aa(lp10416 +g15 +aI178 +aI-895 +aI241 +aI-889 +aI216 +aI-895 +aa(lp10417 +g20 +aI161 +aI-895 +aa(lp10418 +g20 +aI173 +aI-951 +aa(lp10419 +g20 +aI845 +aI-951 +aa(lp10420 +g20 +aI802 +aI-718 +aa(lp10421 +g20 +aI733 +aI-718 +aa(lp10422 +g20 +aI736 +aI-759 +aa(lp10423 +g15 +aI740 +aI-795 +aI739 +aI-780 +aI740 +aI-792 +aa(lp10424 +g15 +aI645 +aI-884 +aI740 +aI-855 +aI708 +aI-884 +aa(lp10425 +g20 +aI421 +aI-884 +aa(lp10426 +g20 +aI345 +aI-530 +aa(lp10427 +g20 +aI666 +aI-530 +aa(lp10428 +g20 +aI653 +aI-465 +aa(lp10429 +g20 +aI332 +aI-465 +aa(lp10430 +g10 +aa(lp10431 +g8 +aI830 +aI0 +aa(lp10432 +g10 +aa(lp10433 +g8 +aI830 +aI0 +aasVI +(lp10434 +(lp10435 +g8 +aI561 +aI-951 +aa(lp10436 +g20 +aI549 +aI-895 +aa(lp10437 +g20 +aI531 +aI-895 +aa(lp10438 +g15 +aI440 +aI-871 +aI489 +aI-895 +aI458 +aI-887 +aa(lp10439 +g15 +aI402 +aI-799 +aI421 +aI-855 +aI408 +aI-831 +aa(lp10440 +g20 +aI264 +aI-146 +aa(lp10441 +g15 +aI258 +aI-108 +aI260 +aI-127 +aI258 +aI-114 +aa(lp10442 +g15 +aI354 +aI-55 +aI258 +aI-73 +aI290 +aI-55 +aa(lp10443 +g20 +aI371 +aI-55 +aa(lp10444 +g20 +aI360 +aI0 +aa(lp10445 +g20 +aI-27 +aI0 +aa(lp10446 +g20 +aI-17 +aI-55 +aa(lp10447 +g20 +aI0 +aI-55 +aa(lp10448 +g15 +aI130 +aI-151 +aI73 +aI-55 +aI117 +aI-87 +aa(lp10449 +g20 +aI269 +aI-804 +aa(lp10450 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp10451 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp10452 +g20 +aI161 +aI-895 +aa(lp10453 +g20 +aI173 +aI-951 +aa(lp10454 +g10 +aa(lp10455 +g8 +aI489 +aI0 +aa(lp10456 +g10 +aa(lp10457 +g8 +aI489 +aI0 +aasVM +(lp10458 +(lp10459 +g8 +aI766 +aI0 +aa(lp10460 +g20 +aI778 +aI-55 +aa(lp10461 +g20 +aI782 +aI-55 +aa(lp10462 +g15 +aI861 +aI-76 +aI820 +aI-55 +aI846 +aI-62 +aa(lp10463 +g15 +aI895 +aI-139 +aI877 +aI-90 +aI888 +aI-111 +aa(lp10464 +g20 +aI1048 +aI-851 +aa(lp10465 +g20 +aI561 +aI0 +aa(lp10466 +g20 +aI489 +aI0 +aa(lp10467 +g20 +aI360 +aI-851 +aa(lp10468 +g20 +aI210 +aI-146 +aa(lp10469 +g15 +aI205 +aI-108 +aI207 +aI-127 +aI205 +aI-114 +aa(lp10470 +g15 +aI301 +aI-55 +aI205 +aI-73 +aI237 +aI-55 +aa(lp10471 +g20 +aI318 +aI-55 +aa(lp10472 +g20 +aI306 +aI0 +aa(lp10473 +g20 +aI-26 +aI0 +aa(lp10474 +g20 +aI-14 +aI-55 +aa(lp10475 +g20 +aI2 +aI-55 +aa(lp10476 +g15 +aI94 +aI-78 +aI46 +aI-55 +aI77 +aI-63 +aa(lp10477 +g15 +aI129 +aI-144 +aI111 +aI-94 +aI123 +aI-116 +aa(lp10478 +g20 +aI269 +aI-804 +aa(lp10479 +g15 +aI274 +aI-841 +aI273 +aI-821 +aI274 +aI-833 +aa(lp10480 +g15 +aI178 +aI-895 +aI274 +aI-877 +aI242 +aI-895 +aa(lp10481 +g20 +aI161 +aI-895 +aa(lp10482 +g20 +aI173 +aI-951 +aa(lp10483 +g20 +aI475 +aI-951 +aa(lp10484 +g20 +aI589 +aI-191 +aa(lp10485 +g20 +aI1025 +aI-951 +aa(lp10486 +g20 +aI1322 +aI-951 +aa(lp10487 +g20 +aI1310 +aI-895 +aa(lp10488 +g20 +aI1293 +aI-895 +aa(lp10489 +g15 +aI1201 +aI-870 +aI1251 +aI-895 +aI1220 +aI-887 +aa(lp10490 +g15 +aI1164 +aI-799 +aI1183 +aI-854 +aI1170 +aI-830 +aa(lp10491 +g20 +aI1025 +aI-146 +aa(lp10492 +g15 +aI1020 +aI-108 +aI1021 +aI-129 +aI1020 +aI-117 +aa(lp10493 +g15 +aI1115 +aI-55 +aI1020 +aI-73 +aI1052 +aI-55 +aa(lp10494 +g20 +aI1133 +aI-55 +aa(lp10495 +g20 +aI1121 +aI0 +aa(lp10496 +g10 +aa(lp10497 +g8 +aI1250 +aI0 +aa(lp10498 +g10 +aa(lp10499 +g8 +aI1250 +aI0 +aasVQ +(lp10500 +(lp10501 +g8 +aI489 +aI9 +aa(lp10502 +g15 +aI529 +aI182 +aI493 +aI88 +aI506 +aI146 +aa(lp10503 +g15 +aI633 +aI236 +aI552 +aI218 +aI587 +aI236 +aa(lp10504 +g15 +aI723 +aI224 +aI665 +aI236 +aI695 +aI232 +aa(lp10505 +g20 +aI733 +aI280 +aa(lp10506 +g15 +aI601 +aI301 +aI688 +aI294 +aI644 +aI301 +aa(lp10507 +g15 +aI345 +aI8 +aI437 +aI301 +aI352 +aI204 +aa(lp10508 +g15 +aI142 +aI-110 +aI258 +aI-6 +aI191 +aI-46 +aa(lp10509 +g15 +aI69 +aI-354 +aI93 +aI-175 +aI69 +aI-256 +aa(lp10510 +g15 +aI218 +aI-774 +aI69 +aI-507 +aI118 +aI-647 +aa(lp10511 +g15 +aI602 +aI-966 +aI318 +aI-902 +aI446 +aI-966 +aa(lp10512 +g15 +aI852 +aI-869 +aI706 +aI-966 +aI789 +aI-934 +aa(lp10513 +g15 +aI947 +aI-599 +aI916 +aI-805 +aI947 +aI-715 +aa(lp10514 +g15 +aI823 +aI-210 +aI947 +aI-464 +aI906 +aI-334 +aa(lp10515 +g15 +aI489 +aI9 +aI740 +aI-85 +aI629 +aI-12 +aa(lp10516 +g10 +aa(lp10517 +g8 +aI426 +aI-58 +aa(lp10518 +g15 +aI696 +aI-242 +aI537 +aI-58 +aI627 +aI-119 +aa(lp10519 +g15 +aI801 +aI-635 +aI766 +aI-364 +aI801 +aI-495 +aa(lp10520 +g15 +aI746 +aI-827 +aI801 +aI-718 +aI783 +aI-782 +aa(lp10521 +g15 +aI591 +aI-894 +aI709 +aI-871 +aI658 +aI-894 +aa(lp10522 +g15 +aI319 +aI-709 +aI480 +aI-894 +aI390 +aI-832 +aa(lp10523 +g15 +aI214 +aI-316 +aI249 +aI-586 +aI214 +aI-455 +aa(lp10524 +g15 +aI271 +aI-124 +aI214 +aI-233 +aI233 +aI-169 +aa(lp10525 +g15 +aI426 +aI-58 +aI309 +aI-80 +aI360 +aI-58 +aa(lp10526 +g10 +aa(lp10527 +g8 +aI989 +aI0 +aa(lp10528 +g10 +aa(lp10529 +g8 +aI989 +aI0 +aasVU +(lp10530 +(lp10531 +g8 +aI133 +aI-895 +aa(lp10532 +g20 +aI145 +aI-951 +aa(lp10533 +g20 +aI533 +aI-951 +aa(lp10534 +g20 +aI522 +aI-895 +aa(lp10535 +g20 +aI505 +aI-895 +aa(lp10536 +g15 +aI414 +aI-871 +aI463 +aI-895 +aI433 +aI-887 +aa(lp10537 +g15 +aI374 +aI-799 +aI394 +aI-855 +aI381 +aI-831 +aa(lp10538 +g20 +aI274 +aI-328 +aa(lp10539 +g15 +aI258 +aI-204 +aI263 +aI-277 +aI258 +aI-236 +aa(lp10540 +g15 +aI450 +aI-65 +aI258 +aI-112 +aI322 +aI-65 +aa(lp10541 +g15 +aI621 +aI-114 +aI522 +aI-65 +aI579 +aI-82 +aa(lp10542 +g15 +aI709 +aI-274 +aI663 +aI-146 +aI693 +aI-199 +aa(lp10543 +g20 +aI822 +aI-804 +aa(lp10544 +g15 +aI828 +aI-841 +aI826 +aI-820 +aI828 +aI-833 +aa(lp10545 +g15 +aI731 +aI-895 +aI828 +aI-877 +aI796 +aI-895 +aa(lp10546 +g20 +aI714 +aI-895 +aa(lp10547 +g20 +aI726 +aI-951 +aa(lp10548 +g20 +aI1061 +aI-951 +aa(lp10549 +g20 +aI1050 +aI-895 +aa(lp10550 +g20 +aI1033 +aI-895 +aa(lp10551 +g15 +aI942 +aI-871 +aI991 +aI-895 +aI961 +aI-887 +aa(lp10552 +g15 +aI902 +aI-799 +aI922 +aI-855 +aI909 +aI-831 +aa(lp10553 +g20 +aI790 +aI-271 +aa(lp10554 +g15 +aI430 +aI13 +aI749 +aI-81 +aI630 +aI13 +aa(lp10555 +g15 +aI206 +aI-46 +aI332 +aI13 +aI257 +aI-6 +aa(lp10556 +g15 +aI128 +aI-216 +aI154 +aI-86 +aI128 +aI-143 +aa(lp10557 +g15 +aI142 +aI-335 +aI128 +aI-253 +aI133 +aI-292 +aa(lp10558 +g20 +aI241 +aI-804 +aa(lp10559 +g15 +aI246 +aI-841 +aI245 +aI-821 +aI246 +aI-833 +aa(lp10560 +g15 +aI150 +aI-895 +aI246 +aI-877 +aI214 +aI-895 +aa(lp10561 +g10 +aa(lp10562 +g8 +aI973 +aI0 +aa(lp10563 +g10 +aa(lp10564 +g8 +aI973 +aI0 +aasVY +(lp10565 +(lp10566 +g8 +aI474 +aI-951 +aa(lp10567 +g20 +aI462 +aI-895 +aa(lp10568 +g20 +aI395 +aI-895 +aa(lp10569 +g15 +aI341 +aI-859 +aI359 +aI-895 +aI341 +aI-883 +aa(lp10570 +g15 +aI358 +aI-782 +aI341 +aI-842 +aI347 +aI-816 +aa(lp10571 +g20 +aI418 +aI-603 +aa(lp10572 +g15 +aI454 +aI-443 +aI439 +aI-540 +aI451 +aI-486 +aa(lp10573 +g15 +aI554 +aI-583 +aI463 +aI-460 +aI496 +aI-506 +aa(lp10574 +g20 +aI681 +aI-752 +aa(lp10575 +g15 +aI730 +aI-860 +aI714 +aI-796 +aI730 +aI-832 +aa(lp10576 +g15 +aI666 +aI-895 +aI730 +aI-883 +aI709 +aI-895 +aa(lp10577 +g20 +aI617 +aI-895 +aa(lp10578 +g20 +aI629 +aI-951 +aa(lp10579 +g20 +aI958 +aI-951 +aa(lp10580 +g20 +aI946 +aI-895 +aa(lp10581 +g20 +aI921 +aI-895 +aa(lp10582 +g15 +aI870 +aI-874 +aI904 +aI-895 +aI887 +aI-888 +aa(lp10583 +g15 +aI800 +aI-794 +aI854 +aI-861 +aI830 +aI-834 +aa(lp10584 +g20 +aI489 +aI-387 +aa(lp10585 +g20 +aI437 +aI-146 +aa(lp10586 +g15 +aI432 +aI-108 +aI434 +aI-129 +aI432 +aI-117 +aa(lp10587 +g15 +aI527 +aI-55 +aI432 +aI-73 +aI464 +aI-55 +aa(lp10588 +g20 +aI558 +aI-55 +aa(lp10589 +g20 +aI546 +aI0 +aa(lp10590 +g20 +aI132 +aI0 +aa(lp10591 +g20 +aI143 +aI-55 +aa(lp10592 +g20 +aI174 +aI-55 +aa(lp10593 +g15 +aI267 +aI-78 +aI219 +aI-55 +aI250 +aI-63 +aa(lp10594 +g15 +aI302 +aI-144 +aI284 +aI-94 +aI296 +aI-116 +aa(lp10595 +g20 +aI354 +aI-390 +aa(lp10596 +g20 +aI199 +aI-825 +aa(lp10597 +g15 +aI170 +aI-881 +aI189 +aI-853 +aI180 +aI-872 +aa(lp10598 +g15 +aI119 +aI-895 +aI160 +aI-890 +aI143 +aI-895 +aa(lp10599 +g20 +aI102 +aI-895 +aa(lp10600 +g20 +aI114 +aI-951 +aa(lp10601 +g10 +aa(lp10602 +g8 +aI833 +aI0 +aa(lp10603 +g10 +aa(lp10604 +g8 +aI833 +aI0 +aasV] +(lp10605 +(lp10606 +g8 +aI-62 +aI171 +aa(lp10607 +g20 +aI-50 +aI115 +aa(lp10608 +g20 +aI6 +aI115 +aa(lp10609 +g15 +aI97 +aI90 +aI48 +aI115 +aI78 +aI107 +aa(lp10610 +g15 +aI134 +aI19 +aI115 +aI74 +aI128 +aI51 +aa(lp10611 +g20 +aI324 +aI-866 +aa(lp10612 +g15 +aI329 +aI-903 +aI327 +aI-882 +aI329 +aI-894 +aa(lp10613 +g15 +aI233 +aI-956 +aI329 +aI-939 +aI297 +aI-956 +aa(lp10614 +g20 +aI175 +aI-956 +aa(lp10615 +g20 +aI188 +aI-1012 +aa(lp10616 +g20 +aI485 +aI-1012 +aa(lp10617 +g20 +aI233 +aI171 +aa(lp10618 +g10 +aa(lp10619 +g8 +aI479 +aI0 +aa(lp10620 +g10 +aa(lp10621 +g8 +aI479 +aI0 +aasVa +(lp10622 +(lp10623 +g8 +aI486 +aI-200 +aa(lp10624 +g20 +aI478 +aI-200 +aa(lp10625 +g15 +aI229 +aI13 +aI414 +aI-57 +aI331 +aI13 +aa(lp10626 +g15 +aI102 +aI-50 +aI174 +aI13 +aI132 +aI-7 +aa(lp10627 +g15 +aI57 +aI-230 +aI72 +aI-93 +aI57 +aI-153 +aa(lp10628 +g15 +aI171 +aI-570 +aI57 +aI-352 +aI95 +aI-465 +aa(lp10629 +g15 +aI454 +aI-727 +aI247 +aI-675 +aI342 +aI-727 +aa(lp10630 +g15 +aI610 +aI-679 +aI514 +aI-727 +aI566 +aI-711 +aa(lp10631 +g20 +aI669 +aI-713 +aa(lp10632 +g20 +aI712 +aI-713 +aa(lp10633 +g20 +aI621 +aI-286 +aa(lp10634 +g15 +aI601 +aI-138 +aI608 +aI-224 +aI601 +aI-175 +aa(lp10635 +g15 +aI645 +aI-70 +aI601 +aI-93 +aI616 +aI-70 +aa(lp10636 +g15 +aI741 +aI-105 +aI670 +aI-70 +aI702 +aI-82 +aa(lp10637 +g20 +aI765 +aI-65 +aa(lp10638 +g15 +aI577 +aI13 +aI701 +aI-13 +aI639 +aI13 +aa(lp10639 +g15 +aI473 +aI-97 +aI508 +aI13 +aI473 +aI-23 +aa(lp10640 +g15 +aI486 +aI-200 +aI473 +aI-125 +aI477 +aI-159 +aa(lp10641 +g10 +aa(lp10642 +g8 +aI562 +aI-619 +aa(lp10643 +g15 +aI461 +aI-667 +aI542 +aI-651 +aI508 +aI-667 +aa(lp10644 +g15 +aI270 +aI-522 +aI385 +aI-667 +aI321 +aI-619 +aa(lp10645 +g15 +aI193 +aI-224 +aI219 +aI-426 +aI193 +aI-326 +aa(lp10646 +g15 +aI277 +aI-70 +aI193 +aI-121 +aI221 +aI-70 +aa(lp10647 +g15 +aI416 +aI-168 +aI321 +aI-70 +aI368 +aI-103 +aa(lp10648 +g15 +aI513 +aI-383 +aI465 +aI-234 +aI497 +aI-305 +aa(lp10649 +g10 +aa(lp10650 +g8 +aI772 +aI0 +aa(lp10651 +g10 +aa(lp10652 +g8 +aI772 +aI0 +aasVe +(lp10653 +(lp10654 +g8 +aI534 +aI-166 +aa(lp10655 +g15 +aI548 +aI-133 +aI543 +aI-160 +aI548 +aI-149 +aa(lp10656 +g15 +aI485 +aI-33 +aI548 +aI-97 +aI527 +aI-64 +aa(lp10657 +g15 +aI317 +aI13 +aI443 +aI-2 +aI387 +aI13 +aa(lp10658 +g15 +aI128 +aI-60 +aI239 +aI13 +aI176 +aI-11 +aa(lp10659 +g15 +aI57 +aI-261 +aI81 +aI-109 +aI57 +aI-176 +aa(lp10660 +g15 +aI169 +aI-581 +aI57 +aI-378 +aI94 +aI-484 +aa(lp10661 +g15 +aI454 +aI-727 +aI245 +aI-678 +aI339 +aI-727 +aa(lp10662 +g15 +aI585 +aI-687 +aI510 +aI-727 +aI554 +aI-713 +aa(lp10663 +g15 +aI632 +aI-574 +aI616 +aI-660 +aI632 +aI-622 +aa(lp10664 +g15 +aI519 +aI-386 +aI632 +aI-502 +aI594 +aI-439 +aa(lp10665 +g15 +aI245 +aI-306 +aI444 +aI-332 +aI353 +aI-306 +aa(lp10666 +g20 +aI222 +aI-306 +aa(lp10667 +g15 +aI198 +aI-307 +aI214 +aI-306 +aI206 +aI-306 +aa(lp10668 +g15 +aI195 +aI-251 +aI196 +aI-295 +aI195 +aI-276 +aa(lp10669 +g15 +aI342 +aI-70 +aI195 +aI-130 +aI244 +aI-70 +aa(lp10670 +g15 +aI534 +aI-166 +aI418 +aI-70 +aI482 +aI-102 +aa(lp10671 +g10 +aa(lp10672 +g8 +aI210 +aI-368 +aa(lp10673 +g20 +aI223 +aI-368 +aa(lp10674 +g15 +aI418 +aI-425 +aI302 +aI-368 +aI367 +aI-387 +aa(lp10675 +g15 +aI494 +aI-574 +aI469 +aI-464 +aI494 +aI-513 +aa(lp10676 +g15 +aI417 +aI-663 +aI494 +aI-633 +aI468 +aI-663 +aa(lp10677 +g15 +aI296 +aI-582 +aI374 +aI-663 +aI334 +aI-636 +aa(lp10678 +g15 +aI210 +aI-368 +aI259 +aI-528 +aI230 +aI-457 +aa(lp10679 +g10 +aa(lp10680 +g8 +aI657 +aI0 +aa(lp10681 +g10 +aa(lp10682 +g8 +aI657 +aI0 +aasVi +(lp10683 +(lp10684 +g8 +aI298 +aI-847 +aa(lp10685 +g15 +aI223 +aI-920 +aI248 +aI-847 +aI223 +aI-872 +aa(lp10686 +g15 +aI245 +aI-988 +aI223 +aI-948 +aI231 +aI-971 +aa(lp10687 +g15 +aI304 +aI-1014 +aI260 +aI-1005 +aI279 +aI-1014 +aa(lp10688 +g15 +aI378 +aI-940 +aI353 +aI-1014 +aI378 +aI-989 +aa(lp10689 +g15 +aI356 +aI-871 +aI378 +aI-910 +aI371 +aI-887 +aa(lp10690 +g15 +aI298 +aI-847 +aI341 +aI-855 +aI322 +aI-847 +aa(lp10691 +g10 +aa(lp10692 +g8 +aI82 +aI-658 +aa(lp10693 +g20 +aI94 +aI-714 +aa(lp10694 +g20 +aI333 +aI-714 +aa(lp10695 +g20 +aI242 +aI-286 +aa(lp10696 +g15 +aI222 +aI-138 +aI229 +aI-222 +aI222 +aI-172 +aa(lp10697 +g15 +aI266 +aI-70 +aI222 +aI-93 +aI237 +aI-70 +aa(lp10698 +g15 +aI362 +aI-105 +aI292 +aI-70 +aI324 +aI-82 +aa(lp10699 +g20 +aI386 +aI-65 +aa(lp10700 +g15 +aI206 +aI13 +aI325 +aI-13 +aI264 +aI13 +aa(lp10701 +g15 +aI126 +aI-22 +aI173 +aI13 +aI146 +aI1 +aa(lp10702 +g15 +aI95 +aI-112 +aI105 +aI-46 +aI95 +aI-76 +aa(lp10703 +g15 +aI125 +aI-322 +aI95 +aI-152 +aI105 +aI-222 +aa(lp10704 +g20 +aI177 +aI-567 +aa(lp10705 +g15 +aI181 +aI-602 +aI180 +aI-581 +aI181 +aI-593 +aa(lp10706 +g15 +aI100 +aI-658 +aI181 +aI-639 +aI154 +aI-658 +aa(lp10707 +g10 +aa(lp10708 +g8 +aI405 +aI0 +aa(lp10709 +g10 +aa(lp10710 +g8 +aI405 +aI0 +aasVm +(lp10711 +(lp10712 +g8 +aI598 +aI0 +aa(lp10713 +g20 +aI472 +aI0 +aa(lp10714 +g15 +aI488 +aI-137 +aI472 +aI-19 +aI477 +aI-65 +aa(lp10715 +g15 +aI517 +aI-299 +aI500 +aI-210 +aI509 +aI-264 +aa(lp10716 +g20 +aI548 +aI-437 +aa(lp10717 +g15 +aI567 +aI-562 +aI561 +aI-491 +aI567 +aI-532 +aa(lp10718 +g15 +aI506 +aI-640 +aI567 +aI-614 +aI547 +aI-640 +aa(lp10719 +g15 +aI353 +aI-539 +aI457 +aI-640 +aI406 +aI-607 +aa(lp10720 +g15 +aI254 +aI-340 +aI301 +aI-472 +aI268 +aI-405 +aa(lp10721 +g20 +aI182 +aI0 +aa(lp10722 +g20 +aI58 +aI0 +aa(lp10723 +g20 +aI170 +aI-535 +aa(lp10724 +g15 +aI178 +aI-595 +aI175 +aI-560 +aI178 +aI-580 +aa(lp10725 +g15 +aI85 +aI-658 +aI178 +aI-637 +aI147 +aI-658 +aa(lp10726 +g20 +aI74 +aI-658 +aa(lp10727 +g20 +aI86 +aI-714 +aa(lp10728 +g20 +aI333 +aI-714 +aa(lp10729 +g20 +aI297 +aI-546 +aa(lp10730 +g20 +aI310 +aI-546 +aa(lp10731 +g15 +aI553 +aI-726 +aI382 +aI-666 +aI463 +aI-726 +aa(lp10732 +g15 +aI695 +aI-578 +aI648 +aI-726 +aI695 +aI-676 +aa(lp10733 +g15 +aI693 +aI-546 +aI695 +aI-567 +aI695 +aI-556 +aa(lp10734 +g20 +aI706 +aI-546 +aa(lp10735 +g15 +aI949 +aI-726 +aI778 +aI-666 +aI859 +aI-726 +aa(lp10736 +g15 +aI1091 +aI-578 +aI1044 +aI-726 +aI1091 +aI-676 +aa(lp10737 +g15 +aI1067 +aI-431 +aI1091 +aI-550 +aI1083 +aI-501 +aa(lp10738 +g20 +aI1033 +aI-274 +aa(lp10739 +g15 +aI1016 +aI-134 +aI1021 +aI-222 +aI1016 +aI-175 +aa(lp10740 +g15 +aI1062 +aI-70 +aI1016 +aI-91 +aI1031 +aI-70 +aa(lp10741 +g15 +aI1147 +aI-101 +aI1088 +aI-70 +aI1116 +aI-80 +aa(lp10742 +g20 +aI1171 +aI-62 +aa(lp10743 +g15 +aI1009 +aI13 +aI1115 +aI-11 +aI1061 +aI13 +aa(lp10744 +g15 +aI921 +aI-22 +aI972 +aI13 +aI943 +aI1 +aa(lp10745 +g15 +aI888 +aI-119 +aI899 +aI-46 +aI888 +aI-78 +aa(lp10746 +g15 +aI913 +aI-299 +aI888 +aI-160 +aI896 +aI-220 +aa(lp10747 +g20 +aI936 +aI-403 +aa(lp10748 +g15 +aI964 +aI-562 +aI954 +aI-489 +aI964 +aI-542 +aa(lp10749 +g15 +aI902 +aI-640 +aI964 +aI-614 +aI943 +aI-640 +aa(lp10750 +g15 +aI761 +aI-553 +aI856 +aI-640 +aI809 +aI-611 +aa(lp10751 +g15 +aI658 +aI-369 +aI712 +aI-494 +aI678 +aI-433 +aa(lp10752 +g20 +aI637 +aI-274 +aa(lp10753 +g15 +aI613 +aI-131 +aI631 +aI-249 +aI623 +aI-202 +aa(lp10754 +g15 +aI598 +aI0 +aI603 +aI-60 +aI598 +aI-16 +aa(lp10755 +g10 +aa(lp10756 +g8 +aI1194 +aI0 +aa(lp10757 +g10 +aa(lp10758 +g8 +aI1194 +aI0 +aasVq +(lp10759 +(lp10760 +g8 +aI478 +aI-200 +aa(lp10761 +g15 +aI229 +aI13 +aI413 +aI-57 +aI330 +aI13 +aa(lp10762 +g15 +aI102 +aI-50 +aI175 +aI13 +aI133 +aI-7 +aa(lp10763 +g15 +aI57 +aI-230 +aI72 +aI-93 +aI57 +aI-153 +aa(lp10764 +g15 +aI171 +aI-570 +aI57 +aI-352 +aI95 +aI-465 +aa(lp10765 +g15 +aI454 +aI-727 +aI247 +aI-675 +aI342 +aI-727 +aa(lp10766 +g15 +aI602 +aI-691 +aI509 +aI-727 +aI559 +aI-715 +aa(lp10767 +g20 +aI635 +aI-709 +aa(lp10768 +g15 +aI669 +aI-727 +aI656 +aI-721 +aI667 +aI-727 +aa(lp10769 +g20 +aI716 +aI-727 +aa(lp10770 +g20 +aI531 +aI141 +aa(lp10771 +g15 +aI524 +aI201 +aI526 +aI166 +aI524 +aI186 +aa(lp10772 +g15 +aI615 +aI264 +aI524 +aI243 +aI554 +aI264 +aa(lp10773 +g20 +aI626 +aI264 +aa(lp10774 +g20 +aI614 +aI320 +aa(lp10775 +g20 +aI371 +aI320 +aa(lp10776 +g20 +aI427 +aI53 +aa(lp10777 +g15 +aI486 +aI-200 +aI431 +aI36 +aI450 +aI-47 +aa(lp10778 +g10 +aa(lp10779 +g8 +aI562 +aI-619 +aa(lp10780 +g15 +aI461 +aI-667 +aI542 +aI-651 +aI509 +aI-667 +aa(lp10781 +g15 +aI269 +aI-520 +aI384 +aI-667 +aI320 +aI-618 +aa(lp10782 +g15 +aI193 +aI-223 +aI218 +aI-422 +aI193 +aI-323 +aa(lp10783 +g15 +aI277 +aI-70 +aI193 +aI-121 +aI221 +aI-70 +aa(lp10784 +g15 +aI415 +aI-167 +aI321 +aI-70 +aI367 +aI-102 +aa(lp10785 +g15 +aI513 +aI-383 +aI463 +aI-231 +aI496 +aI-303 +aa(lp10786 +g10 +aa(lp10787 +g8 +aI746 +aI0 +aa(lp10788 +g10 +aa(lp10789 +g8 +aI746 +aI0 +aasVu +(lp10790 +(lp10791 +g8 +aI87 +aI-714 +aa(lp10792 +g20 +aI335 +aI-714 +aa(lp10793 +g20 +aI248 +aI-315 +aa(lp10794 +g15 +aI221 +aI-154 +aI230 +aI-234 +aI221 +aI-180 +aa(lp10795 +g15 +aI286 +aI-73 +aI221 +aI-100 +aI243 +aI-73 +aa(lp10796 +g15 +aI433 +aI-171 +aI332 +aI-73 +aI381 +aI-105 +aa(lp10797 +g15 +aI537 +aI-382 +aI486 +aI-237 +aI521 +aI-307 +aa(lp10798 +g20 +aI606 +aI-714 +aa(lp10799 +g20 +aI735 +aI-714 +aa(lp10800 +g20 +aI643 +aI-286 +aa(lp10801 +g15 +aI623 +aI-138 +aI630 +aI-223 +aI623 +aI-173 +aa(lp10802 +g15 +aI667 +aI-70 +aI623 +aI-93 +aI638 +aI-70 +aa(lp10803 +g15 +aI753 +aI-99 +aI693 +aI-70 +aI721 +aI-80 +aa(lp10804 +g20 +aI777 +aI-60 +aa(lp10805 +g15 +aI608 +aI13 +aI720 +aI-11 +aI664 +aI13 +aa(lp10806 +g15 +aI527 +aI-22 +aI574 +aI13 +aI547 +aI1 +aa(lp10807 +g15 +aI496 +aI-112 +aI506 +aI-46 +aI496 +aI-76 +aa(lp10808 +g15 +aI502 +aI-191 +aI496 +aI-135 +aI498 +aI-162 +aa(lp10809 +g20 +aI492 +aI-191 +aa(lp10810 +g15 +aI362 +aI-30 +aI444 +aI-112 +aI400 +aI-58 +aa(lp10811 +g15 +aI234 +aI12 +aI324 +aI-1 +aI282 +aI12 +aa(lp10812 +g15 +aI91 +aI-135 +aI139 +aI12 +aI91 +aI-37 +aa(lp10813 +g15 +aI115 +aI-282 +aI91 +aI-163 +aI99 +aI-212 +aa(lp10814 +g20 +aI167 +aI-515 +aa(lp10815 +g15 +aI179 +aI-595 +aI175 +aI-550 +aI179 +aI-577 +aa(lp10816 +g15 +aI86 +aI-658 +aI179 +aI-637 +aI148 +aI-658 +aa(lp10817 +g20 +aI76 +aI-658 +aa(lp10818 +g10 +aa(lp10819 +g8 +aI798 +aI0 +aa(lp10820 +g10 +aa(lp10821 +g8 +aI798 +aI0 +aasVy +(lp10822 +(lp10823 +g8 +aI106 +aI-587 +aa(lp10824 +g15 +aI74 +aI-642 +aI98 +aI-613 +aI88 +aI-631 +aa(lp10825 +g15 +aI14 +aI-658 +aI61 +aI-653 +aI41 +aI-658 +aa(lp10826 +g20 +aI1 +aI-658 +aa(lp10827 +g20 +aI11 +aI-714 +aa(lp10828 +g20 +aI206 +aI-714 +aa(lp10829 +g20 +aI310 +aI-354 +aa(lp10830 +g15 +aI366 +aI-112 +aI342 +aI-242 +aI361 +aI-162 +aa(lp10831 +g20 +aI370 +aI-112 +aa(lp10832 +g15 +aI550 +aI-555 +aI490 +aI-295 +aI550 +aI-443 +aa(lp10833 +g15 +aI485 +aI-627 +aI550 +aI-603 +aI528 +aI-627 +aa(lp10834 +g15 +aI511 +aI-699 +aI485 +aI-657 +aI493 +aI-681 +aa(lp10835 +g15 +aI572 +aI-726 +aI528 +aI-717 +aI548 +aI-726 +aa(lp10836 +g15 +aI662 +aI-614 +aI632 +aI-726 +aI662 +aI-688 +aa(lp10837 +g15 +aI483 +aI-161 +aI662 +aI-506 +aI602 +aI-356 +aa(lp10838 +g15 +aI194 +aI225 +aI363 +aI32 +aI267 +aI161 +aa(lp10839 +g15 +aI-90 +aI320 +aI122 +aI288 +aI27 +aI320 +aa(lp10840 +g15 +aI-216 +aI296 +aI-137 +aI320 +aI-179 +aI312 +aa(lp10841 +g20 +aI-195 +aI229 +aa(lp10842 +g15 +aI-91 +aI244 +aI-164 +aI239 +aI-129 +aI244 +aa(lp10843 +g15 +aI282 +aI1 +aI35 +aI244 +aI160 +aI163 +aa(lp10844 +g10 +aa(lp10845 +g8 +aI703 +aI0 +aa(lp10846 +g10 +aa(lp10847 +g8 +aI703 +aI0 +aasV} +(lp10848 +(lp10849 +g8 +aI83 +aI113 +aa(lp10850 +g20 +aI123 +aI113 +aa(lp10851 +g15 +aI233 +aI-26 +aI196 +aI113 +aI233 +aI67 +aa(lp10852 +g20 +aI233 +aI-256 +aa(lp10853 +g15 +aI381 +aI-422 +aI233 +aI-350 +aI282 +aI-405 +aa(lp10854 +g20 +aI381 +aI-423 +aa(lp10855 +g15 +aI233 +aI-587 +aI282 +aI-439 +aI233 +aI-494 +aa(lp10856 +g20 +aI233 +aI-815 +aa(lp10857 +g15 +aI123 +aI-955 +aI233 +aI-908 +aI196 +aI-955 +aa(lp10858 +g20 +aI83 +aI-955 +aa(lp10859 +g20 +aI83 +aI-1012 +aa(lp10860 +g20 +aI171 +aI-1012 +aa(lp10861 +g15 +aI363 +aI-822 +aI299 +aI-1012 +aI363 +aI-949 +aa(lp10862 +g20 +aI363 +aI-590 +aa(lp10863 +g15 +aI521 +aI-450 +aI363 +aI-498 +aI416 +aI-452 +aa(lp10864 +g20 +aI521 +aI-394 +aa(lp10865 +g15 +aI363 +aI-252 +aI416 +aI-391 +aI363 +aI-343 +aa(lp10866 +g20 +aI363 +aI-21 +aa(lp10867 +g15 +aI313 +aI120 +aI363 +aI40 +aI347 +aI87 +aa(lp10868 +g15 +aI171 +aI171 +aI279 +aI154 +aI232 +aI171 +aa(lp10869 +g20 +aI83 +aI171 +aa(lp10870 +g10 +aa(lp10871 +g8 +aI570 +aI0 +aa(lp10872 +g10 +aa(lp10873 +g8 +aI570 +aI0 +aassS'normal' +p10874 +(dp10875 +V +(lp10876 +(lp10877 +g8 +aI346 +aI0 +aa(lp10878 +g10 +aa(lp10879 +g8 +aI346 +aI0 +aasV$ +(lp10880 +(lp10881 +g8 +aI404 +aI-911 +aa(lp10882 +g15 +aI506 +aI-898 +aI444 +aI-910 +aI478 +aI-906 +aa(lp10883 +g15 +aI574 +aI-866 +aI534 +aI-890 +aI557 +aI-879 +aa(lp10884 +g15 +aI613 +aI-819 +aI592 +aI-853 +aI605 +aI-837 +aa(lp10885 +g15 +aI625 +aI-761 +aI621 +aI-802 +aI625 +aI-782 +aa(lp10886 +g15 +aI597 +aI-697 +aI625 +aI-733 +aI616 +aI-711 +aa(lp10887 +g15 +aI520 +aI-675 +aI577 +aI-682 +aI552 +aI-675 +aa(lp10888 +g15 +aI515 +aI-734 +aI520 +aI-694 +aI518 +aI-714 +aa(lp10889 +g15 +aI497 +aI-788 +aI512 +aI-753 +aI506 +aI-772 +aa(lp10890 +g15 +aI462 +aI-829 +aI489 +aI-804 +aI477 +aI-818 +aa(lp10891 +g15 +aI404 +aI-850 +aI447 +aI-840 +aI427 +aI-847 +aa(lp10892 +g20 +aI404 +aI-539 +aa(lp10893 +g15 +aI510 +aI-487 +aI444 +aI-521 +aI479 +aI-504 +aa(lp10894 +g15 +aI587 +aI-430 +aI541 +aI-469 +aI567 +aI-451 +aa(lp10895 +g15 +aI635 +aI-363 +aI608 +aI-410 +aI624 +aI-388 +aa(lp10896 +g15 +aI651 +aI-279 +aI646 +aI-339 +aI651 +aI-311 +aa(lp10897 +g15 +aI587 +aI-123 +aI651 +aI-212 +aI630 +aI-160 +aa(lp10898 +g15 +aI404 +aI-55 +aI544 +aI-86 +aI483 +aI-63 +aa(lp10899 +g20 +aI404 +aI105 +aa(lp10900 +g20 +aI337 +aI105 +aa(lp10901 +g20 +aI337 +aI-52 +aa(lp10902 +g15 +aI270 +aI-55 +aI315 +aI-52 +aI292 +aI-53 +aa(lp10903 +g15 +aI204 +aI-65 +aI247 +aI-57 +aI225 +aI-61 +aa(lp10904 +g15 +aI142 +aI-82 +aI182 +aI-70 +aI162 +aI-75 +aa(lp10905 +g15 +aI87 +aI-107 +aI122 +aI-89 +aI104 +aI-98 +aa(lp10906 +g20 +aI87 +aI-312 +aa(lp10907 +g20 +aI143 +aI-312 +aa(lp10908 +g15 +aI157 +aI-240 +aI143 +aI-287 +aI148 +aI-263 +aa(lp10909 +g15 +aI197 +aI-178 +aI167 +aI-217 +aI180 +aI-196 +aa(lp10910 +g15 +aI258 +aI-132 +aI214 +aI-159 +aI235 +aI-144 +aa(lp10911 +g15 +aI337 +aI-111 +aI282 +aI-120 +aI308 +aI-113 +aa(lp10912 +g20 +aI337 +aI-440 +aa(lp10913 +g15 +aI231 +aI-496 +aI295 +aI-459 +aI260 +aI-478 +aa(lp10914 +g15 +aI161 +aI-553 +aI202 +aI-514 +aI179 +aI-533 +aa(lp10915 +g15 +aI122 +aI-619 +aI143 +aI-574 +aI130 +aI-595 +aa(lp10916 +g15 +aI110 +aI-698 +aI114 +aI-642 +aI110 +aI-669 +aa(lp10917 +g15 +aI126 +aI-779 +aI110 +aI-728 +aI115 +aI-755 +aa(lp10918 +g15 +aI171 +aI-842 +aI137 +aI-803 +aI152 +aI-824 +aa(lp10919 +g15 +aI243 +aI-886 +aI191 +aI-860 +aI215 +aI-875 +aa(lp10920 +g15 +aI337 +aI-909 +aI271 +aI-897 +aI302 +aI-905 +aa(lp10921 +g20 +aI337 +aI-1012 +aa(lp10922 +g20 +aI404 +aI-1012 +aa(lp10923 +g10 +aa(lp10924 +g8 +aI529 +aI-259 +aa(lp10925 +g15 +aI522 +aI-307 +aI529 +aI-277 +aI527 +aI-293 +aa(lp10926 +g15 +aI501 +aI-346 +aI518 +aI-321 +aI511 +aI-334 +aa(lp10927 +g15 +aI462 +aI-380 +aI491 +aI-358 +aI478 +aI-369 +aa(lp10928 +g15 +aI404 +aI-411 +aI446 +aI-390 +aI427 +aI-401 +aa(lp10929 +g20 +aI404 +aI-115 +aa(lp10930 +g15 +aI496 +aI-163 +aI444 +aI-122 +aI475 +aI-138 +aa(lp10931 +g15 +aI529 +aI-259 +aI518 +aI-189 +aI529 +aI-221 +aa(lp10932 +g10 +aa(lp10933 +g8 +aI230 +aI-709 +aa(lp10934 +g15 +aI237 +aI-660 +aI230 +aI-690 +aI232 +aI-674 +aa(lp10935 +g15 +aI257 +aI-622 +aI241 +aI-645 +aI248 +aI-633 +aa(lp10936 +g15 +aI291 +aI-593 +aI266 +aI-611 +aI278 +aI-601 +aa(lp10937 +g15 +aI337 +aI-568 +aI304 +aI-584 +aI319 +aI-576 +aa(lp10938 +g20 +aI337 +aI-847 +aa(lp10939 +g15 +aI291 +aI-829 +aI319 +aI-843 +aI304 +aI-837 +aa(lp10940 +g15 +aI257 +aI-798 +aI277 +aI-820 +aI266 +aI-810 +aa(lp10941 +g15 +aI237 +aI-758 +aI248 +aI-786 +aI241 +aI-773 +aa(lp10942 +g15 +aI230 +aI-709 +aI232 +aI-742 +aI230 +aI-726 +aa(lp10943 +g10 +aa(lp10944 +g8 +aI745 +aI0 +aa(lp10945 +g10 +aa(lp10946 +g8 +aI745 +aI0 +aasV( +(lp10947 +(lp10948 +g8 +aI214 +aI-422 +aa(lp10949 +g15 +aI221 +aI-265 +aI214 +aI-369 +aI216 +aI-316 +aa(lp10950 +g15 +aI248 +aI-118 +aI225 +aI-213 +aI234 +aI-164 +aa(lp10951 +g15 +aI309 +aI9 +aI261 +aI-72 +aI282 +aI-29 +aa(lp10952 +g15 +aI418 +aI109 +aI336 +aI48 +aI373 +aI82 +aa(lp10953 +g20 +aI418 +aI171 +aa(lp10954 +g15 +aI261 +aI82 +aI357 +aI146 +aI305 +aI117 +aa(lp10955 +g15 +aI155 +aI-41 +aI218 +aI47 +aI182 +aI6 +aa(lp10956 +g15 +aI95 +aI-207 +aI127 +aI-89 +aI107 +aI-144 +aa(lp10957 +g15 +aI76 +aI-422 +aI82 +aI-270 +aI76 +aI-341 +aa(lp10958 +g15 +aI95 +aI-635 +aI76 +aI-502 +aI82 +aI-573 +aa(lp10959 +g15 +aI155 +aI-800 +aI107 +aI-698 +aI127 +aI-753 +aa(lp10960 +g15 +aI261 +aI-924 +aI182 +aI-848 +aI218 +aI-889 +aa(lp10961 +g15 +aI418 +aI-1012 +aI305 +aI-958 +aI357 +aI-988 +aa(lp10962 +g20 +aI418 +aI-952 +aa(lp10963 +g15 +aI309 +aI-852 +aI373 +aI-924 +aI336 +aI-891 +aa(lp10964 +g15 +aI248 +aI-725 +aI282 +aI-813 +aI261 +aI-771 +aa(lp10965 +g15 +aI221 +aI-578 +aI234 +aI-679 +aI225 +aI-630 +aa(lp10966 +g15 +aI214 +aI-422 +aI216 +aI-527 +aI214 +aI-475 +aa(lp10967 +g10 +aa(lp10968 +g8 +aI461 +aI0 +aa(lp10969 +g10 +aa(lp10970 +g8 +aI461 +aI0 +aasV, +(lp10971 +(lp10972 +g8 +aI258 +aI-55 +aa(lp10973 +g15 +aI246 +aI26 +aI258 +aI-27 +aI254 +aI0 +aa(lp10974 +g15 +aI208 +aI100 +aI238 +aI52 +aI226 +aI77 +aa(lp10975 +g15 +aI140 +aI160 +aI191 +aI122 +aI168 +aI142 +aa(lp10976 +g15 +aI39 +aI205 +aI113 +aI178 +aI79 +aI193 +aa(lp10977 +g20 +aI39 +aI149 +aa(lp10978 +g15 +aI136 +aI98 +aI83 +aI135 +aI115 +aI118 +aa(lp10979 +g15 +aI166 +aI29 +aI156 +aI78 +aI166 +aI55 +aa(lp10980 +g15 +aI159 +aI7 +aI166 +aI21 +aI164 +aI13 +aa(lp10981 +g15 +aI141 +aI-7 +aI154 +aI2 +aI148 +aI-3 +aa(lp10982 +g15 +aI117 +aI-21 +aI133 +aI-12 +aI126 +aI-16 +aa(lp10983 +g15 +aI94 +aI-36 +aI109 +aI-25 +aI101 +aI-30 +aa(lp10984 +g15 +aI76 +aI-59 +aI87 +aI-42 +aI80 +aI-50 +aa(lp10985 +g15 +aI69 +aI-92 +aI71 +aI-68 +aI69 +aI-79 +aa(lp10986 +g15 +aI94 +aI-151 +aI69 +aI-118 +aI77 +aI-137 +aa(lp10987 +g15 +aI156 +aI-171 +aI110 +aI-164 +aI131 +aI-171 +aa(lp10988 +g15 +aI195 +aI-163 +aI170 +aI-171 +aI183 +aI-168 +aa(lp10989 +g15 +aI227 +aI-141 +aI207 +aI-158 +aI218 +aI-151 +aa(lp10990 +g15 +aI250 +aI-105 +aI237 +aI-132 +aI244 +aI-119 +aa(lp10991 +g15 +aI258 +aI-55 +aI255 +aI-90 +aI258 +aI-74 +aa(lp10992 +g10 +aa(lp10993 +g8 +aI333 +aI0 +aa(lp10994 +g10 +aa(lp10995 +g8 +aI333 +aI0 +aasV0 +(lp10996 +(lp10997 +g8 +aI685 +aI-476 +aa(lp10998 +g15 +aI666 +aI-276 +aI685 +aI-403 +aI679 +aI-336 +aa(lp10999 +g15 +aI608 +aI-121 +aI653 +aI-215 +aI634 +aI-164 +aa(lp11000 +g15 +aI510 +aI-21 +aI582 +aI-78 +aI549 +aI-45 +aa(lp11001 +g15 +aI373 +aI13 +aI471 +aI1 +aI425 +aI13 +aa(lp11002 +g15 +aI231 +aI-21 +aI318 +aI13 +aI271 +aI1 +aa(lp11003 +g15 +aI134 +aI-121 +aI192 +aI-45 +aI159 +aI-78 +aa(lp11004 +g15 +aI78 +aI-276 +aI109 +aI-164 +aI90 +aI-216 +aa(lp11005 +g15 +aI59 +aI-478 +aI65 +aI-337 +aI59 +aI-404 +aa(lp11006 +g15 +aI78 +aI-678 +aI59 +aI-551 +aI65 +aI-618 +aa(lp11007 +g15 +aI134 +aI-832 +aI90 +aI-738 +aI109 +aI-789 +aa(lp11008 +g15 +aI232 +aI-930 +aI159 +aI-874 +aI192 +aI-907 +aa(lp11009 +g15 +aI374 +aI-965 +aI271 +aI-953 +aI319 +aI-965 +aa(lp11010 +g15 +aI510 +aI-930 +aI426 +aI-965 +aI471 +aI-953 +aa(lp11011 +g15 +aI608 +aI-832 +aI549 +aI-907 +aI582 +aI-874 +aa(lp11012 +g15 +aI666 +aI-678 +aI634 +aI-789 +aI653 +aI-738 +aa(lp11013 +g15 +aI685 +aI-476 +aI679 +aI-618 +aI685 +aI-550 +aa(lp11014 +g10 +aa(lp11015 +g8 +aI198 +aI-476 +aa(lp11016 +g15 +aI207 +aI-300 +aI198 +aI-410 +aI201 +aI-351 +aa(lp11017 +g15 +aI237 +aI-168 +aI213 +aI-248 +aI223 +aI-204 +aa(lp11018 +g15 +aI291 +aI-86 +aI250 +aI-132 +aI268 +aI-105 +aa(lp11019 +g15 +aI373 +aI-58 +aI313 +aI-67 +aI340 +aI-58 +aa(lp11020 +g15 +aI455 +aI-86 +aI405 +aI-58 +aI432 +aI-67 +aa(lp11021 +g15 +aI508 +aI-168 +aI477 +aI-105 +aI495 +aI-132 +aa(lp11022 +g15 +aI538 +aI-300 +aI522 +aI-204 +aI532 +aI-248 +aa(lp11023 +g15 +aI546 +aI-476 +aI543 +aI-351 +aI546 +aI-410 +aa(lp11024 +g15 +aI538 +aI-653 +aI546 +aI-542 +aI543 +aI-601 +aa(lp11025 +g15 +aI508 +aI-784 +aI532 +aI-704 +aI522 +aI-748 +aa(lp11026 +g15 +aI455 +aI-865 +aI495 +aI-819 +aI477 +aI-846 +aa(lp11027 +g15 +aI374 +aI-892 +aI433 +aI-883 +aI406 +aI-892 +aa(lp11028 +g15 +aI291 +aI-865 +aI341 +aI-892 +aI314 +aI-883 +aa(lp11029 +g15 +aI237 +aI-784 +aI269 +aI-846 +aI251 +aI-819 +aa(lp11030 +g15 +aI207 +aI-653 +aI223 +aI-748 +aI213 +aI-704 +aa(lp11031 +g15 +aI198 +aI-476 +aI201 +aI-601 +aI198 +aI-542 +aa(lp11032 +g10 +aa(lp11033 +g8 +aI745 +aI0 +aa(lp11034 +g10 +aa(lp11035 +g8 +aI745 +aI0 +aasV4 +(lp11036 +(lp11037 +g8 +aI561 +aI-260 +aa(lp11038 +g20 +aI561 +aI-151 +aa(lp11039 +g15 +aI569 +aI-101 +aI561 +aI-130 +aI564 +aI-113 +aa(lp11040 +g15 +aI593 +aI-72 +aI575 +aI-88 +aI583 +aI-78 +aa(lp11041 +g15 +aI628 +aI-58 +aI603 +aI-65 +aI614 +aI-60 +aa(lp11042 +g15 +aI670 +aI-55 +aI641 +aI-56 +aI655 +aI-55 +aa(lp11043 +g20 +aI688 +aI-55 +aa(lp11044 +g20 +aI688 +aI0 +aa(lp11045 +g20 +aI286 +aI0 +aa(lp11046 +g20 +aI286 +aI-55 +aa(lp11047 +g20 +aI324 +aI-55 +aa(lp11048 +g15 +aI366 +aI-58 +aI339 +aI-55 +aI353 +aI-56 +aa(lp11049 +g15 +aI401 +aI-72 +aI380 +aI-60 +aI391 +aI-65 +aa(lp11050 +g15 +aI424 +aI-101 +aI411 +aI-78 +aI418 +aI-88 +aa(lp11051 +g15 +aI433 +aI-151 +aI430 +aI-113 +aI433 +aI-130 +aa(lp11052 +g20 +aI433 +aI-260 +aa(lp11053 +g20 +aI22 +aI-260 +aa(lp11054 +g20 +aI22 +aI-315 +aa(lp11055 +g20 +aI434 +aI-951 +aa(lp11056 +g20 +aI561 +aI-951 +aa(lp11057 +g20 +aI561 +aI-335 +aa(lp11058 +g20 +aI726 +aI-335 +aa(lp11059 +g20 +aI726 +aI-260 +aa(lp11060 +g10 +aa(lp11061 +g8 +aI433 +aI-582 +aa(lp11062 +g15 +aI434 +aI-646 +aI433 +aI-601 +aI433 +aI-623 +aa(lp11063 +g15 +aI435 +aI-718 +aI434 +aI-670 +aI435 +aI-693 +aa(lp11064 +g15 +aI438 +aI-790 +aI436 +aI-742 +aI437 +aI-766 +aa(lp11065 +g15 +aI442 +aI-858 +aI439 +aI-814 +aI440 +aI-837 +aa(lp11066 +g15 +aI429 +aI-833 +aI439 +aI-852 +aI435 +aI-844 +aa(lp11067 +g15 +aI410 +aI-799 +aI424 +aI-823 +aI417 +aI-812 +aa(lp11068 +g15 +aI387 +aI-759 +aI403 +aI-787 +aI395 +aI-773 +aa(lp11069 +g15 +aI363 +aI-719 +aI379 +aI-746 +aI371 +aI-732 +aa(lp11070 +g15 +aI341 +aI-682 +aI355 +aI-706 +aI348 +aI-693 +aa(lp11071 +g15 +aI322 +aI-653 +aI334 +aI-670 +aI328 +aI-661 +aa(lp11072 +g20 +aI118 +aI-335 +aa(lp11073 +g20 +aI433 +aI-335 +aa(lp11074 +g10 +aa(lp11075 +g8 +aI745 +aI0 +aa(lp11076 +g10 +aa(lp11077 +g8 +aI745 +aI0 +aasV8 +(lp11078 +(lp11079 +g8 +aI61 +aI-238 +aa(lp11080 +g15 +aI76 +aI-322 +aI61 +aI-270 +aI66 +aI-298 +aa(lp11081 +g15 +aI119 +aI-387 +aI86 +aI-346 +aI100 +aI-368 +aa(lp11082 +g15 +aI183 +aI-438 +aI137 +aI-406 +aI158 +aI-423 +aa(lp11083 +g15 +aI264 +aI-481 +aI208 +aI-453 +aI235 +aI-468 +aa(lp11084 +g15 +aI194 +aI-528 +aI239 +aI-496 +aI215 +aI-511 +aa(lp11085 +g15 +aI139 +aI-583 +aI173 +aI-545 +aI155 +aI-563 +aa(lp11086 +g15 +aI104 +aI-648 +aI124 +aI-603 +aI112 +aI-625 +aa(lp11087 +g15 +aI91 +aI-726 +aI96 +aI-672 +aI91 +aI-698 +aa(lp11088 +g15 +aI108 +aI-815 +aI91 +aI-756 +aI97 +aI-786 +aa(lp11089 +g15 +aI158 +aI-891 +aI118 +aI-843 +aI135 +aI-869 +aa(lp11090 +g15 +aI248 +aI-944 +aI181 +aI-913 +aI211 +aI-931 +aa(lp11091 +g15 +aI380 +aI-965 +aI285 +aI-958 +aI328 +aI-965 +aa(lp11092 +g15 +aI491 +aI-947 +aI421 +aI-965 +aI458 +aI-959 +aa(lp11093 +g15 +aI573 +aI-899 +aI524 +aI-936 +aI551 +aI-920 +aa(lp11094 +g15 +aI625 +aI-827 +aI596 +aI-879 +aI613 +aI-855 +aa(lp11095 +g15 +aI642 +aI-735 +aI636 +aI-799 +aI642 +aI-768 +aa(lp11096 +g15 +aI629 +aI-658 +aI642 +aI-706 +aI638 +aI-680 +aa(lp11097 +g15 +aI593 +aI-598 +aI620 +aI-636 +aI608 +aI-616 +aa(lp11098 +g15 +aI536 +aI-551 +aI577 +aI-581 +aI558 +aI-565 +aa(lp11099 +g15 +aI462 +aI-509 +aI514 +aI-537 +aI489 +aI-523 +aa(lp11100 +g15 +aI553 +aI-459 +aI495 +aI-494 +aI525 +aI-477 +aa(lp11101 +g15 +aI623 +aI-401 +aI580 +aI-442 +aI603 +aI-422 +aa(lp11102 +g15 +aI668 +aI-334 +aI642 +aI-381 +aI657 +aI-358 +aa(lp11103 +g15 +aI684 +aI-254 +aI678 +aI-309 +aI684 +aI-283 +aa(lp11104 +g15 +aI661 +aI-141 +aI684 +aI-212 +aI676 +aI-174 +aa(lp11105 +g15 +aI597 +aI-56 +aI646 +aI-107 +aI624 +aI-79 +aa(lp11106 +g15 +aI496 +aI-4 +aI569 +aI-33 +aI535 +aI-16 +aa(lp11107 +g15 +aI363 +aI13 +aI456 +aI7 +aI412 +aI13 +aa(lp11108 +g15 +aI232 +aI-6 +aI314 +aI13 +aI270 +aI6 +aa(lp11109 +g15 +aI137 +aI-59 +aI194 +aI-19 +aI163 +aI-36 +aa(lp11110 +g15 +aI80 +aI-139 +aI112 +aI-82 +aI93 +aI-109 +aa(lp11111 +g15 +aI61 +aI-238 +aI67 +aI-170 +aI61 +aI-203 +aa(lp11112 +g10 +aa(lp11113 +g8 +aI370 +aI-47 +aa(lp11114 +g15 +aI449 +aI-61 +aI399 +aI-47 +aI425 +aI-52 +aa(lp11115 +g15 +aI510 +aI-97 +aI473 +aI-69 +aI493 +aI-82 +aa(lp11116 +g15 +aI548 +aI-153 +aI526 +aI-113 +aI539 +aI-132 +aa(lp11117 +g15 +aI562 +aI-224 +aI557 +aI-175 +aI562 +aI-199 +aa(lp11118 +g15 +aI550 +aI-287 +aI562 +aI-247 +aI558 +aI-268 +aa(lp11119 +g15 +aI509 +aI-343 +aI541 +aI-306 +aI528 +aI-325 +aa(lp11120 +g15 +aI437 +aI-396 +aI491 +aI-361 +aI466 +aI-379 +aa(lp11121 +g15 +aI328 +aI-450 +aI407 +aI-413 +aI371 +aI-431 +aa(lp11122 +g15 +aI227 +aI-362 +aI286 +aI-427 +aI252 +aI-398 +aa(lp11123 +g15 +aI190 +aI-232 +aI203 +aI-326 +aI190 +aI-282 +aa(lp11124 +g15 +aI202 +aI-157 +aI190 +aI-204 +aI194 +aI-179 +aa(lp11125 +g15 +aI236 +aI-98 +aI209 +aI-134 +aI221 +aI-115 +aa(lp11126 +g15 +aI292 +aI-61 +aI250 +aI-82 +aI269 +aI-69 +aa(lp11127 +g15 +aI370 +aI-47 +aI314 +aI-52 +aI340 +aI-47 +aa(lp11128 +g10 +aa(lp11129 +g8 +aI524 +aI-738 +aa(lp11130 +g15 +aI515 +aI-798 +aI524 +aI-758 +aI521 +aI-778 +aa(lp11131 +g15 +aI489 +aI-850 +aI510 +aI-817 +aI501 +aI-835 +aa(lp11132 +g15 +aI443 +aI-887 +aI477 +aI-866 +aI462 +aI-878 +aa(lp11133 +g15 +aI371 +aI-901 +aI423 +aI-897 +aI399 +aI-901 +aa(lp11134 +g15 +aI305 +aI-889 +aI347 +aI-901 +aI324 +aI-897 +aa(lp11135 +g15 +aI257 +aI-856 +aI286 +aI-881 +aI270 +aI-870 +aa(lp11136 +g15 +aI227 +aI-806 +aI244 +aI-842 +aI234 +aI-825 +aa(lp11137 +g15 +aI217 +aI-742 +aI220 +aI-786 +aI217 +aI-765 +aa(lp11138 +g15 +aI228 +aI-677 +aI217 +aI-718 +aI221 +aI-697 +aa(lp11139 +g15 +aI262 +aI-625 +aI236 +aI-658 +aI247 +aI-641 +aa(lp11140 +g15 +aI319 +aI-581 +aI277 +aI-610 +aI296 +aI-595 +aa(lp11141 +g15 +aI397 +aI-540 +aI341 +aI-568 +aI367 +aI-554 +aa(lp11142 +g15 +aI459 +aI-579 +aI422 +aI-553 +aI443 +aI-566 +aa(lp11143 +g15 +aI498 +aI-622 +aI475 +aI-592 +aI488 +aI-607 +aa(lp11144 +g15 +aI518 +aI-675 +aI507 +aI-638 +aI514 +aI-656 +aa(lp11145 +g15 +aI524 +aI-738 +aI522 +aI-693 +aI524 +aI-715 +aa(lp11146 +g10 +aa(lp11147 +g8 +aI745 +aI0 +aa(lp11148 +g10 +aa(lp11149 +g8 +aI745 +aI0 +aasV< +(lp11150 +(lp11151 +g8 +aI86 +aI-452 +aa(lp11152 +g20 +aI86 +aI-499 +aa(lp11153 +g20 +aI658 +aI-807 +aa(lp11154 +g20 +aI658 +aI-718 +aa(lp11155 +g20 +aI210 +aI-475 +aa(lp11156 +g20 +aI658 +aI-235 +aa(lp11157 +g20 +aI658 +aI-146 +aa(lp11158 +g10 +aa(lp11159 +g8 +aI745 +aI0 +aa(lp11160 +g10 +aa(lp11161 +g8 +aI745 +aI0 +aasV@ +(lp11162 +(lp11163 +g8 +aI1157 +aI-522 +aa(lp11164 +g15 +aI1134 +aI-348 +aI1157 +aI-458 +aI1149 +aI-400 +aa(lp11165 +g15 +aI1072 +aI-215 +aI1118 +aI-296 +aI1098 +aI-252 +aa(lp11166 +g15 +aI988 +aI-131 +aI1047 +aI-179 +aI1019 +aI-151 +aa(lp11167 +g15 +aI895 +aI-102 +aI957 +aI-112 +aI926 +aI-102 +aa(lp11168 +g15 +aI797 +aI-134 +aI856 +aI-102 +aI823 +aI-113 +aa(lp11169 +g15 +aI738 +aI-223 +aI770 +aI-155 +aI751 +aI-185 +aa(lp11170 +g20 +aI731 +aI-223 +aa(lp11171 +g15 +aI700 +aI-175 +aI722 +aI-206 +aI712 +aI-190 +aa(lp11172 +g15 +aI661 +aI-136 +aI689 +aI-160 +aI676 +aI-147 +aa(lp11173 +g15 +aI612 +aI-111 +aI647 +aI-126 +aI630 +aI-117 +aa(lp11174 +g15 +aI552 +aI-102 +aI594 +aI-105 +aI574 +aI-102 +aa(lp11175 +g15 +aI474 +aI-116 +aI525 +aI-102 +aI499 +aI-106 +aa(lp11176 +g15 +aI410 +aI-157 +aI450 +aI-125 +aI428 +aI-139 +aa(lp11177 +g15 +aI366 +aI-228 +aI392 +aI-176 +aI377 +aI-200 +aa(lp11178 +g15 +aI349 +aI-330 +aI355 +aI-257 +aI349 +aI-291 +aa(lp11179 +g15 +aI357 +aI-407 +aI349 +aI-354 +aI352 +aI-379 +aa(lp11180 +g15 +aI383 +aI-490 +aI363 +aI-435 +aI371 +aI-463 +aa(lp11181 +g15 +aI427 +aI-570 +aI394 +aI-518 +aI409 +aI-545 +aa(lp11182 +g15 +aI492 +aI-639 +aI445 +aI-596 +aI467 +aI-619 +aa(lp11183 +g15 +aI579 +aI-686 +aI517 +aI-658 +aI546 +aI-674 +aa(lp11184 +g15 +aI689 +aI-704 +aI611 +aI-698 +aI648 +aI-704 +aa(lp11185 +g15 +aI763 +aI-692 +aI718 +aI-704 +aI742 +aI-700 +aa(lp11186 +g15 +aI814 +aI-664 +aI783 +aI-685 +aI800 +aI-675 +aa(lp11187 +g20 +aI867 +aI-692 +aa(lp11188 +g20 +aI899 +aI-692 +aa(lp11189 +g20 +aI832 +aI-353 +aa(lp11190 +g15 +aI827 +aI-321 +aI830 +aI-342 +aI829 +aI-332 +aa(lp11191 +g15 +aI824 +aI-293 +aI826 +aI-313 +aI825 +aI-303 +aa(lp11192 +g15 +aI822 +aI-263 +aI823 +aI-282 +aI822 +aI-272 +aa(lp11193 +g15 +aI829 +aI-223 +aI822 +aI-248 +aI825 +aI-234 +aa(lp11194 +g15 +aI847 +aI-194 +aI834 +aI-211 +aI840 +aI-202 +aa(lp11195 +g15 +aI873 +aI-177 +aI855 +aI-186 +aI863 +aI-181 +aa(lp11196 +g15 +aI904 +aI-172 +aI883 +aI-174 +aI893 +aI-172 +aa(lp11197 +g15 +aI964 +aI-196 +aI923 +aI-172 +aI943 +aI-180 +aa(lp11198 +g15 +aI1019 +aI-264 +aI984 +aI-211 +aI1003 +aI-234 +aa(lp11199 +g15 +aI1060 +aI-375 +aI1036 +aI-295 +aI1049 +aI-332 +aa(lp11200 +g15 +aI1076 +aI-526 +aI1070 +aI-419 +aI1076 +aI-469 +aa(lp11201 +g15 +aI1048 +aI-680 +aI1076 +aI-584 +aI1066 +aI-635 +aa(lp11202 +g15 +aI970 +aI-792 +aI1029 +aI-724 +aI1003 +aI-762 +aa(lp11203 +g15 +aI851 +aI-860 +aI937 +aI-822 +aI897 +aI-845 +aa(lp11204 +g15 +aI698 +aI-883 +aI805 +aI-875 +aI754 +aI-883 +aa(lp11205 +g15 +aI570 +aI-865 +aI655 +aI-883 +aI612 +aI-877 +aa(lp11206 +g15 +aI451 +aI-811 +aI528 +aI-853 +aI489 +aI-835 +aa(lp11207 +g15 +aI347 +aI-725 +aI414 +aI-788 +aI379 +aI-759 +aa(lp11208 +g15 +aI265 +aI-608 +aI316 +aI-691 +aI288 +aI-652 +aa(lp11209 +g15 +aI211 +aI-463 +aI242 +aI-564 +aI224 +aI-516 +aa(lp11210 +g15 +aI192 +aI-293 +aI198 +aI-410 +aI192 +aI-353 +aa(lp11211 +g15 +aI223 +aI-103 +aI192 +aI-218 +aI202 +aI-155 +aa(lp11212 +g15 +aI310 +aI24 +aI245 +aI-51 +aI273 +aI-8 +aa(lp11213 +g15 +aI436 +aI97 +aI346 +aI58 +aI388 +aI82 +aa(lp11214 +g15 +aI589 +aI120 +aI484 +aI112 +aI535 +aI120 +aa(lp11215 +g15 +aI692 +aI110 +aI625 +aI120 +aI660 +aI117 +aa(lp11216 +g15 +aI784 +aI85 +aI725 +aI104 +aI755 +aI96 +aa(lp11217 +g15 +aI862 +aI50 +aI812 +aI75 +aI838 +aI63 +aa(lp11218 +g15 +aI927 +aI9 +aI887 +aI37 +aI908 +aI23 +aa(lp11219 +g20 +aI958 +aI57 +aa(lp11220 +g15 +aI884 +aI106 +aI936 +aI74 +aI912 +aI90 +aa(lp11221 +g15 +aI795 +aI148 +aI857 +aI122 +aI827 +aI136 +aa(lp11222 +g15 +aI693 +aI178 +aI763 +aI160 +aI729 +aI170 +aa(lp11223 +g15 +aI576 +aI189 +aI656 +aI186 +aI617 +aI189 +aa(lp11224 +g15 +aI378 +aI160 +aI504 +aI189 +aI438 +aI180 +aa(lp11225 +g15 +aI224 +aI70 +aI319 +aI140 +aI267 +aI110 +aa(lp11226 +g15 +aI123 +aI-78 +aI181 +aI30 +aI147 +aI-19 +aa(lp11227 +g15 +aI86 +aI-289 +aI98 +aI-138 +aI86 +aI-209 +aa(lp11228 +g15 +aI107 +aI-469 +aI86 +aI-352 +aI93 +aI-412 +aa(lp11229 +g15 +aI166 +aI-629 +aI120 +aI-526 +aI140 +aI-580 +aa(lp11230 +g15 +aI260 +aI-762 +aI192 +aI-678 +aI223 +aI-722 +aa(lp11231 +g15 +aI384 +aI-863 +aI296 +aI-801 +aI338 +aI-835 +aa(lp11232 +g15 +aI534 +aI-928 +aI430 +aI-891 +aI480 +aI-913 +aa(lp11233 +g15 +aI706 +aI-951 +aI588 +aI-943 +aI645 +aI-951 +aa(lp11234 +g15 +aI902 +aI-918 +aI781 +aI-951 +aI846 +aI-940 +aa(lp11235 +g15 +aI1044 +aI-827 +aI959 +aI-896 +aI1006 +aI-865 +aa(lp11236 +g15 +aI1129 +aI-691 +aI1082 +aI-788 +aI1110 +aI-743 +aa(lp11237 +g15 +aI1157 +aI-522 +aI1148 +aI-638 +aI1157 +aI-582 +aa(lp11238 +g10 +aa(lp11239 +g8 +aI473 +aI-311 +aa(lp11240 +g15 +aI501 +aI-206 +aI473 +aI-264 +aI482 +aI-229 +aa(lp11241 +g15 +aI574 +aI-172 +aI520 +aI-184 +aI544 +aI-172 +aa(lp11242 +g15 +aI633 +aI-187 +aI597 +aI-172 +aI616 +aI-177 +aa(lp11243 +g15 +aI675 +aI-225 +aI649 +aI-197 +aI663 +aI-209 +aa(lp11244 +g15 +aI702 +aI-278 +aI686 +aI-241 +aI695 +aI-258 +aa(lp11245 +g15 +aI718 +aI-339 +aI709 +aI-298 +aI714 +aI-318 +aa(lp11246 +g20 +aI769 +aI-610 +aa(lp11247 +g15 +aI739 +aI-639 +aI763 +aI-622 +aI754 +aI-632 +aa(lp11248 +g15 +aI694 +aI-649 +aI725 +aI-646 +aI710 +aI-649 +aa(lp11249 +g15 +aI622 +aI-632 +aI668 +aI-649 +aI644 +aI-644 +aa(lp11250 +g15 +aI566 +aI-587 +aI601 +aI-621 +aI582 +aI-606 +aa(lp11251 +g15 +aI524 +aI-523 +aI549 +aI-568 +aI535 +aI-547 +aa(lp11252 +g15 +aI495 +aI-449 +aI512 +aI-499 +aI502 +aI-474 +aa(lp11253 +g15 +aI478 +aI-375 +aI487 +aI-424 +aI481 +aI-399 +aa(lp11254 +g15 +aI473 +aI-311 +aI475 +aI-351 +aI473 +aI-330 +aa(lp11255 +g10 +aa(lp11256 +g8 +aI1227 +aI0 +aa(lp11257 +g10 +aa(lp11258 +g8 +aI1227 +aI0 +aasVD +(lp11259 +(lp11260 +g8 +aI893 +aI-476 +aa(lp11261 +g15 +aI865 +aI-279 +aI893 +aI-403 +aI884 +aI-337 +aa(lp11262 +g15 +aI784 +aI-128 +aI847 +aI-220 +aI820 +aI-170 +aa(lp11263 +g15 +aI649 +aI-33 +aI748 +aI-87 +aI703 +aI-55 +aa(lp11264 +g15 +aI458 +aI0 +aI594 +aI-10 +aI531 +aI0 +aa(lp11265 +g20 +aI50 +aI0 +aa(lp11266 +g20 +aI50 +aI-55 +aa(lp11267 +g20 +aI67 +aI-55 +aa(lp11268 +g15 +aI110 +aI-58 +aI82 +aI-55 +aI97 +aI-56 +aa(lp11269 +g15 +aI145 +aI-72 +aI123 +aI-60 +aI135 +aI-65 +aa(lp11270 +g15 +aI168 +aI-101 +aI155 +aI-78 +aI162 +aI-88 +aa(lp11271 +g15 +aI177 +aI-151 +aI174 +aI-113 +aI177 +aI-130 +aa(lp11272 +g20 +aI177 +aI-804 +aa(lp11273 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp11274 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp11275 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp11276 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp11277 +g20 +aI50 +aI-895 +aa(lp11278 +g20 +aI50 +aI-951 +aa(lp11279 +g20 +aI458 +aI-951 +aa(lp11280 +g15 +aI642 +aI-919 +aI527 +aI-951 +aI588 +aI-940 +aa(lp11281 +g15 +aI778 +aI-827 +aI696 +aI-898 +aI741 +aI-868 +aa(lp11282 +g15 +aI863 +aI-678 +aI816 +aI-787 +aI844 +aI-737 +aa(lp11283 +g15 +aI893 +aI-476 +aI883 +aI-619 +aI893 +aI-552 +aa(lp11284 +g10 +aa(lp11285 +g8 +aI427 +aI-67 +aa(lp11286 +g15 +aI566 +aI-94 +aI480 +aI-67 +aI527 +aI-76 +aa(lp11287 +g15 +aI666 +aI-173 +aI606 +aI-112 +aI639 +aI-138 +aa(lp11288 +g15 +aI725 +aI-301 +aI692 +aI-208 +aI712 +aI-250 +aa(lp11289 +g15 +aI745 +aI-476 +aI738 +aI-352 +aI745 +aI-410 +aa(lp11290 +g15 +aI666 +aI-780 +aI745 +aI-609 +aI719 +aI-710 +aa(lp11291 +g15 +aI429 +aI-884 +aI613 +aI-850 +aI534 +aI-884 +aa(lp11292 +g20 +aI311 +aI-884 +aa(lp11293 +g20 +aI311 +aI-67 +aa(lp11294 +g10 +aa(lp11295 +g8 +aI969 +aI0 +aa(lp11296 +g10 +aa(lp11297 +g8 +aI969 +aI0 +aasVH +(lp11298 +(lp11299 +g8 +aI618 +aI0 +aa(lp11300 +g20 +aI618 +aI-55 +aa(lp11301 +g20 +aI636 +aI-55 +aa(lp11302 +g15 +aI678 +aI-58 +aI651 +aI-55 +aI665 +aI-56 +aa(lp11303 +g15 +aI713 +aI-72 +aI691 +aI-60 +aI703 +aI-65 +aa(lp11304 +g15 +aI736 +aI-101 +aI722 +aI-78 +aI730 +aI-88 +aa(lp11305 +g15 +aI745 +aI-151 +aI742 +aI-113 +aI745 +aI-130 +aa(lp11306 +g20 +aI745 +aI-463 +aa(lp11307 +g20 +aI311 +aI-463 +aa(lp11308 +g20 +aI311 +aI-151 +aa(lp11309 +g15 +aI320 +aI-101 +aI311 +aI-130 +aI314 +aI-113 +aa(lp11310 +g15 +aI344 +aI-72 +aI326 +aI-88 +aI334 +aI-78 +aa(lp11311 +g15 +aI378 +aI-58 +aI353 +aI-65 +aI365 +aI-60 +aa(lp11312 +g15 +aI421 +aI-55 +aI392 +aI-56 +aI406 +aI-55 +aa(lp11313 +g20 +aI438 +aI-55 +aa(lp11314 +g20 +aI438 +aI0 +aa(lp11315 +g20 +aI50 +aI0 +aa(lp11316 +g20 +aI50 +aI-55 +aa(lp11317 +g20 +aI67 +aI-55 +aa(lp11318 +g15 +aI110 +aI-58 +aI82 +aI-55 +aI97 +aI-56 +aa(lp11319 +g15 +aI145 +aI-72 +aI123 +aI-60 +aI135 +aI-65 +aa(lp11320 +g15 +aI168 +aI-101 +aI155 +aI-78 +aI162 +aI-88 +aa(lp11321 +g15 +aI177 +aI-151 +aI174 +aI-113 +aI177 +aI-130 +aa(lp11322 +g20 +aI177 +aI-804 +aa(lp11323 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp11324 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp11325 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp11326 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp11327 +g20 +aI50 +aI-895 +aa(lp11328 +g20 +aI50 +aI-951 +aa(lp11329 +g20 +aI438 +aI-951 +aa(lp11330 +g20 +aI438 +aI-895 +aa(lp11331 +g20 +aI421 +aI-895 +aa(lp11332 +g15 +aI378 +aI-892 +aI406 +aI-895 +aI392 +aI-894 +aa(lp11333 +g15 +aI344 +aI-878 +aI365 +aI-889 +aI353 +aI-885 +aa(lp11334 +g15 +aI320 +aI-849 +aI334 +aI-872 +aI326 +aI-862 +aa(lp11335 +g15 +aI311 +aI-799 +aI314 +aI-837 +aI311 +aI-820 +aa(lp11336 +g20 +aI311 +aI-530 +aa(lp11337 +g20 +aI745 +aI-530 +aa(lp11338 +g20 +aI745 +aI-799 +aa(lp11339 +g15 +aI736 +aI-849 +aI745 +aI-820 +aI742 +aI-837 +aa(lp11340 +g15 +aI713 +aI-878 +aI730 +aI-862 +aI722 +aI-872 +aa(lp11341 +g15 +aI678 +aI-892 +aI703 +aI-885 +aI691 +aI-889 +aa(lp11342 +g15 +aI636 +aI-895 +aI665 +aI-894 +aI651 +aI-895 +aa(lp11343 +g20 +aI618 +aI-895 +aa(lp11344 +g20 +aI618 +aI-951 +aa(lp11345 +g20 +aI1006 +aI-951 +aa(lp11346 +g20 +aI1006 +aI-895 +aa(lp11347 +g20 +aI989 +aI-895 +aa(lp11348 +g15 +aI946 +aI-892 +aI974 +aI-895 +aI960 +aI-894 +aa(lp11349 +g15 +aI912 +aI-878 +aI933 +aI-889 +aI922 +aI-885 +aa(lp11350 +g15 +aI888 +aI-849 +aI902 +aI-872 +aI894 +aI-862 +aa(lp11351 +g15 +aI880 +aI-799 +aI883 +aI-837 +aI880 +aI-820 +aa(lp11352 +g20 +aI880 +aI-144 +aa(lp11353 +g15 +aI888 +aI-97 +aI880 +aI-125 +aI883 +aI-109 +aa(lp11354 +g15 +aI912 +aI-70 +aI894 +aI-85 +aI902 +aI-76 +aa(lp11355 +g15 +aI947 +aI-58 +aI922 +aI-64 +aI934 +aI-60 +aa(lp11356 +g15 +aI989 +aI-55 +aI960 +aI-56 +aI974 +aI-55 +aa(lp11357 +g20 +aI1006 +aI-55 +aa(lp11358 +g20 +aI1006 +aI0 +aa(lp11359 +g10 +aa(lp11360 +g8 +aI1057 +aI0 +aa(lp11361 +g10 +aa(lp11362 +g8 +aI1057 +aI0 +aasVL +(lp11363 +(lp11364 +g8 +aI50 +aI0 +aa(lp11365 +g20 +aI50 +aI-55 +aa(lp11366 +g20 +aI67 +aI-55 +aa(lp11367 +g15 +aI110 +aI-58 +aI82 +aI-55 +aI97 +aI-56 +aa(lp11368 +g15 +aI145 +aI-72 +aI123 +aI-60 +aI135 +aI-65 +aa(lp11369 +g15 +aI168 +aI-101 +aI155 +aI-78 +aI162 +aI-88 +aa(lp11370 +g15 +aI177 +aI-151 +aI174 +aI-113 +aI177 +aI-130 +aa(lp11371 +g20 +aI177 +aI-799 +aa(lp11372 +g15 +aI168 +aI-849 +aI177 +aI-820 +aI174 +aI-837 +aa(lp11373 +g15 +aI145 +aI-878 +aI162 +aI-862 +aI155 +aI-872 +aa(lp11374 +g15 +aI110 +aI-892 +aI135 +aI-885 +aI123 +aI-889 +aa(lp11375 +g15 +aI67 +aI-895 +aI97 +aI-894 +aI82 +aI-895 +aa(lp11376 +g20 +aI50 +aI-895 +aa(lp11377 +g20 +aI50 +aI-951 +aa(lp11378 +g20 +aI438 +aI-951 +aa(lp11379 +g20 +aI438 +aI-895 +aa(lp11380 +g20 +aI421 +aI-895 +aa(lp11381 +g15 +aI379 +aI-892 +aI406 +aI-895 +aI392 +aI-894 +aa(lp11382 +g15 +aI344 +aI-879 +aI365 +aI-890 +aI354 +aI-886 +aa(lp11383 +g15 +aI320 +aI-852 +aI334 +aI-873 +aI326 +aI-864 +aa(lp11384 +g15 +aI311 +aI-804 +aI314 +aI-840 +aI311 +aI-824 +aa(lp11385 +g20 +aI311 +aI-65 +aa(lp11386 +g20 +aI574 +aI-65 +aa(lp11387 +g15 +aI625 +aI-76 +aI594 +aI-65 +aI611 +aI-69 +aa(lp11388 +g15 +aI660 +aI-104 +aI640 +aI-83 +aI651 +aI-93 +aa(lp11389 +g15 +aI681 +aI-143 +aI669 +aI-116 +aI676 +aI-129 +aa(lp11390 +g15 +aI692 +aI-186 +aI686 +aI-157 +aI690 +aI-172 +aa(lp11391 +g20 +aI705 +aI-286 +aa(lp11392 +g20 +aI774 +aI-286 +aa(lp11393 +g20 +aI765 +aI0 +aa(lp11394 +g10 +aa(lp11395 +g8 +aI830 +aI0 +aa(lp11396 +g10 +aa(lp11397 +g8 +aI830 +aI0 +aasVP +(lp11398 +(lp11399 +g8 +aI50 +aI0 +aa(lp11400 +g20 +aI50 +aI-55 +aa(lp11401 +g20 +aI67 +aI-55 +aa(lp11402 +g15 +aI110 +aI-58 +aI82 +aI-55 +aI97 +aI-56 +aa(lp11403 +g15 +aI145 +aI-72 +aI123 +aI-60 +aI135 +aI-65 +aa(lp11404 +g15 +aI168 +aI-101 +aI155 +aI-78 +aI162 +aI-88 +aa(lp11405 +g15 +aI177 +aI-151 +aI174 +aI-113 +aI177 +aI-130 +aa(lp11406 +g20 +aI177 +aI-804 +aa(lp11407 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp11408 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp11409 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp11410 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp11411 +g20 +aI50 +aI-895 +aa(lp11412 +g20 +aI50 +aI-951 +aa(lp11413 +g20 +aI425 +aI-951 +aa(lp11414 +g15 +aI570 +aI-932 +aI481 +aI-951 +aI529 +aI-944 +aa(lp11415 +g15 +aI673 +aI-876 +aI612 +aI-919 +aI646 +aI-900 +aa(lp11416 +g15 +aI733 +aI-789 +aI700 +aI-852 +aI720 +aI-823 +aa(lp11417 +g15 +aI753 +aI-672 +aI746 +aI-754 +aI753 +aI-716 +aa(lp11418 +g15 +aI734 +aI-558 +aI753 +aI-633 +aI747 +aI-595 +aa(lp11419 +g15 +aI673 +aI-462 +aI722 +aI-522 +aI702 +aI-490 +aa(lp11420 +g15 +aI563 +aI-395 +aI645 +aI-434 +aI608 +aI-411 +aa(lp11421 +g15 +aI395 +aI-369 +aI517 +aI-378 +aI461 +aI-369 +aa(lp11422 +g20 +aI311 +aI-369 +aa(lp11423 +g20 +aI311 +aI-144 +aa(lp11424 +g15 +aI320 +aI-97 +aI311 +aI-125 +aI314 +aI-109 +aa(lp11425 +g15 +aI344 +aI-70 +aI326 +aI-85 +aI334 +aI-76 +aa(lp11426 +g15 +aI379 +aI-58 +aI354 +aI-64 +aI365 +aI-60 +aa(lp11427 +g15 +aI421 +aI-55 +aI392 +aI-56 +aI406 +aI-55 +aa(lp11428 +g20 +aI465 +aI-55 +aa(lp11429 +g20 +aI465 +aI0 +aa(lp11430 +g10 +aa(lp11431 +g8 +aI311 +aI-433 +aa(lp11432 +g20 +aI382 +aI-433 +aa(lp11433 +g15 +aI486 +aI-445 +aI423 +aI-433 +aI457 +aI-437 +aa(lp11434 +g15 +aI556 +aI-486 +aI514 +aI-454 +aI538 +aI-467 +aa(lp11435 +g15 +aI596 +aI-559 +aI574 +aI-505 +aI588 +aI-530 +aa(lp11436 +g15 +aI609 +aI-667 +aI605 +aI-589 +aI609 +aI-625 +aa(lp11437 +g15 +aI598 +aI-764 +aI609 +aI-704 +aI605 +aI-737 +aa(lp11438 +g15 +aI562 +aI-833 +aI590 +aI-792 +aI578 +aI-815 +aa(lp11439 +g15 +aI498 +aI-874 +aI546 +aI-851 +aI524 +aI-865 +aa(lp11440 +g15 +aI402 +aI-887 +aI472 +aI-883 +aI440 +aI-887 +aa(lp11441 +g20 +aI311 +aI-887 +aa(lp11442 +g10 +aa(lp11443 +g8 +aI805 +aI0 +aa(lp11444 +g10 +aa(lp11445 +g8 +aI805 +aI0 +aasVT +(lp11446 +(lp11447 +g8 +aI474 +aI-151 +aa(lp11448 +g15 +aI483 +aI-101 +aI474 +aI-130 +aI477 +aI-113 +aa(lp11449 +g15 +aI506 +aI-72 +aI489 +aI-88 +aI497 +aI-78 +aa(lp11450 +g15 +aI541 +aI-58 +aI516 +aI-65 +aI528 +aI-60 +aa(lp11451 +g15 +aI583 +aI-55 +aI555 +aI-56 +aI569 +aI-55 +aa(lp11452 +g20 +aI614 +aI-55 +aa(lp11453 +g20 +aI614 +aI0 +aa(lp11454 +g20 +aI199 +aI0 +aa(lp11455 +g20 +aI199 +aI-55 +aa(lp11456 +g20 +aI230 +aI-55 +aa(lp11457 +g15 +aI272 +aI-58 +aI245 +aI-55 +aI259 +aI-56 +aa(lp11458 +g15 +aI307 +aI-70 +aI285 +aI-60 +aI297 +aI-64 +aa(lp11459 +g15 +aI331 +aI-97 +aI317 +aI-76 +aI325 +aI-85 +aa(lp11460 +g15 +aI339 +aI-144 +aI336 +aI-109 +aI339 +aI-125 +aa(lp11461 +g20 +aI339 +aI-884 +aa(lp11462 +g20 +aI212 +aI-884 +aa(lp11463 +g15 +aI163 +aI-876 +aI192 +aI-884 +aI176 +aI-882 +aa(lp11464 +g15 +aI130 +aI-852 +aI149 +aI-870 +aI138 +aI-862 +aa(lp11465 +g15 +aI111 +aI-817 +aI122 +aI-842 +aI115 +aI-830 +aa(lp11466 +g15 +aI102 +aI-775 +aI107 +aI-804 +aI104 +aI-790 +aa(lp11467 +g20 +aI95 +aI-718 +aa(lp11468 +g20 +aI26 +aI-718 +aa(lp11469 +g20 +aI33 +aI-951 +aa(lp11470 +g20 +aI783 +aI-951 +aa(lp11471 +g20 +aI790 +aI-718 +aa(lp11472 +g20 +aI721 +aI-718 +aa(lp11473 +g20 +aI714 +aI-775 +aa(lp11474 +g15 +aI705 +aI-817 +aI713 +aI-790 +aI710 +aI-804 +aa(lp11475 +g15 +aI686 +aI-852 +aI701 +aI-830 +aI695 +aI-842 +aa(lp11476 +g15 +aI654 +aI-876 +aI678 +aI-862 +aI667 +aI-870 +aa(lp11477 +g15 +aI604 +aI-884 +aI640 +aI-882 +aI624 +aI-884 +aa(lp11478 +g20 +aI474 +aI-884 +aa(lp11479 +g10 +aa(lp11480 +g8 +aI817 +aI0 +aa(lp11481 +g10 +aa(lp11482 +g8 +aI817 +aI0 +aasVX +(lp11483 +(lp11484 +g8 +aI621 +aI-856 +aa(lp11485 +g15 +aI615 +aI-876 +aI621 +aI-864 +aI619 +aI-871 +aa(lp11486 +g15 +aI600 +aI-887 +aI611 +aI-881 +aI606 +aI-885 +aa(lp11487 +g15 +aI578 +aI-893 +aI594 +aI-890 +aI586 +aI-892 +aa(lp11488 +g15 +aI549 +aI-895 +aI569 +aI-894 +aI559 +aI-895 +aa(lp11489 +g20 +aI545 +aI-895 +aa(lp11490 +g20 +aI545 +aI-951 +aa(lp11491 +g20 +aI837 +aI-951 +aa(lp11492 +g20 +aI837 +aI-895 +aa(lp11493 +g20 +aI825 +aI-895 +aa(lp11494 +g15 +aI790 +aI-890 +aI812 +aI-895 +aI800 +aI-893 +aa(lp11495 +g15 +aI759 +aI-874 +aI779 +aI-887 +aI769 +aI-882 +aa(lp11496 +g15 +aI728 +aI-845 +aI749 +aI-867 +aI738 +aI-857 +aa(lp11497 +g15 +aI693 +aI-799 +aI717 +aI-833 +aI705 +aI-817 +aa(lp11498 +g20 +aI500 +aI-521 +aa(lp11499 +g20 +aI745 +aI-126 +aa(lp11500 +g15 +aI800 +aI-71 +aI764 +aI-100 +aI783 +aI-82 +aa(lp11501 +g15 +aI852 +aI-55 +aI818 +aI-60 +aI835 +aI-55 +aa(lp11502 +g20 +aI869 +aI-55 +aa(lp11503 +g20 +aI869 +aI0 +aa(lp11504 +g20 +aI509 +aI0 +aa(lp11505 +g20 +aI509 +aI-55 +aa(lp11506 +g20 +aI516 +aI-55 +aa(lp11507 +g15 +aI595 +aI-99 +aI569 +aI-55 +aI595 +aI-70 +aa(lp11508 +g15 +aI594 +aI-114 +aI595 +aI-104 +aI595 +aI-109 +aa(lp11509 +g15 +aI587 +aI-131 +aI592 +aI-118 +aI590 +aI-124 +aa(lp11510 +g15 +aI574 +aI-155 +aI584 +aI-137 +aI580 +aI-145 +aa(lp11511 +g15 +aI552 +aI-191 +aI568 +aI-164 +aI561 +aI-176 +aa(lp11512 +g20 +aI419 +aI-403 +aa(lp11513 +g20 +aI272 +aI-185 +aa(lp11514 +g15 +aI260 +aI-165 +aI268 +aI-179 +aI264 +aI-173 +aa(lp11515 +g15 +aI249 +aI-143 +aI256 +aI-158 +aI252 +aI-151 +aa(lp11516 +g15 +aI240 +aI-119 +aI245 +aI-135 +aI243 +aI-127 +aa(lp11517 +g15 +aI237 +aI-97 +aI238 +aI-111 +aI237 +aI-104 +aa(lp11518 +g15 +aI258 +aI-64 +aI237 +aI-82 +aI244 +aI-71 +aa(lp11519 +g15 +aI324 +aI-55 +aI272 +aI-58 +aI294 +aI-55 +aa(lp11520 +g20 +aI328 +aI-55 +aa(lp11521 +g20 +aI328 +aI0 +aa(lp11522 +g20 +aI10 +aI0 +aa(lp11523 +g20 +aI10 +aI-55 +aa(lp11524 +g20 +aI18 +aI-55 +aa(lp11525 +g15 +aI60 +aI-60 +aI34 +aI-55 +aI48 +aI-57 +aa(lp11526 +g15 +aI94 +aI-76 +aI72 +aI-63 +aI83 +aI-68 +aa(lp11527 +g15 +aI124 +aI-105 +aI104 +aI-83 +aI114 +aI-93 +aa(lp11528 +g15 +aI157 +aI-148 +aI134 +aI-116 +aI145 +aI-131 +aa(lp11529 +g20 +aI380 +aI-467 +aa(lp11530 +g20 +aI160 +aI-825 +aa(lp11531 +g15 +aI105 +aI-879 +aI144 +aI-850 +aI125 +aI-868 +aa(lp11532 +g15 +aI45 +aI-895 +aI85 +aI-890 +aI65 +aI-895 +aa(lp11533 +g20 +aI27 +aI-895 +aa(lp11534 +g20 +aI27 +aI-951 +aa(lp11535 +g20 +aI389 +aI-951 +aa(lp11536 +g20 +aI389 +aI-895 +aa(lp11537 +g20 +aI385 +aI-895 +aa(lp11538 +g15 +aI347 +aI-892 +aI370 +aI-895 +aI357 +aI-894 +aa(lp11539 +g15 +aI324 +aI-884 +aI337 +aI-890 +aI329 +aI-887 +aa(lp11540 +g15 +aI312 +aI-871 +aI318 +aI-880 +aI314 +aI-876 +aa(lp11541 +g15 +aI309 +aI-856 +aI310 +aI-867 +aI309 +aI-862 +aa(lp11542 +g15 +aI310 +aI-843 +aI309 +aI-852 +aI309 +aI-847 +aa(lp11543 +g15 +aI314 +aI-827 +aI310 +aI-838 +aI312 +aI-833 +aa(lp11544 +g15 +aI323 +aI-807 +aI316 +aI-822 +aI319 +aI-815 +aa(lp11545 +g15 +aI341 +aI-778 +aI328 +aI-799 +aI333 +aI-789 +aa(lp11546 +g20 +aI461 +aI-583 +aa(lp11547 +g20 +aI587 +aI-775 +aa(lp11548 +g15 +aI611 +aI-818 +aI597 +aI-790 +aI605 +aI-805 +aa(lp11549 +g15 +aI621 +aI-856 +aI618 +aI-832 +aI621 +aI-844 +aa(lp11550 +g10 +aa(lp11551 +g8 +aI880 +aI0 +aa(lp11552 +g10 +aa(lp11553 +g8 +aI880 +aI0 +aasV\u005C +(lp11554 +(lp11555 +g8 +aI0 +aI-1012 +aa(lp11556 +g20 +aI77 +aI-1012 +aa(lp11557 +g20 +aI384 +aI161 +aa(lp11558 +g20 +aI305 +aI161 +aa(lp11559 +g10 +aa(lp11560 +g8 +aI384 +aI0 +aa(lp11561 +g10 +aa(lp11562 +g8 +aI384 +aI0 +aasV` +(lp11563 +(lp11564 +g8 +aI514 +aI-807 +aa(lp11565 +g20 +aI464 +aI-807 +aa(lp11566 +g15 +aI406 +aI-852 +aI446 +aI-819 +aI427 +aI-834 +aa(lp11567 +g15 +aI345 +aI-908 +aI385 +aI-870 +aI365 +aI-889 +aa(lp11568 +g15 +aI292 +aI-963 +aI326 +aI-927 +aI308 +aI-945 +aa(lp11569 +g15 +aI255 +aI-1007 +aI276 +aI-980 +aI264 +aI-995 +aa(lp11570 +g20 +aI255 +aI-1021 +aa(lp11571 +g20 +aI398 +aI-1021 +aa(lp11572 +g15 +aI422 +aI-972 +aI405 +aI-1006 +aI413 +aI-990 +aa(lp11573 +g15 +aI452 +aI-919 +aI432 +aI-954 +aI442 +aI-937 +aa(lp11574 +g15 +aI484 +aI-868 +aI462 +aI-902 +aI473 +aI-885 +aa(lp11575 +g15 +aI514 +aI-825 +aI495 +aI-852 +aI505 +aI-837 +aa(lp11576 +g10 +aa(lp11577 +g8 +aI769 +aI0 +aa(lp11578 +g10 +aa(lp11579 +g8 +aI769 +aI0 +aasVd +(lp11580 +(lp11581 +g8 +aI674 +aI-146 +aa(lp11582 +g15 +aI683 +aI-98 +aI674 +aI-126 +aI677 +aI-110 +aa(lp11583 +g15 +aI707 +aI-71 +aI689 +aI-86 +aI697 +aI-77 +aa(lp11584 +g15 +aI741 +aI-58 +aI717 +aI-64 +aI728 +aI-60 +aa(lp11585 +g15 +aI783 +aI-55 +aI755 +aI-56 +aI769 +aI-55 +aa(lp11586 +g20 +aI794 +aI-55 +aa(lp11587 +g20 +aI794 +aI0 +aa(lp11588 +g20 +aI569 +aI0 +aa(lp11589 +g20 +aI554 +aI-119 +aa(lp11590 +g20 +aI549 +aI-119 +aa(lp11591 +g15 +aI515 +aI-64 +aI539 +aI-98 +aI528 +aI-80 +aa(lp11592 +g15 +aI471 +aI-22 +aI502 +aI-48 +aI487 +aI-34 +aa(lp11593 +g15 +aI415 +aI4 +aI454 +aI-11 +aI436 +aI-2 +aa(lp11594 +g15 +aI345 +aI13 +aI394 +aI10 +aI371 +aI13 +aa(lp11595 +g15 +aI228 +aI-8 +aI301 +aI13 +aI262 +aI6 +aa(lp11596 +g15 +aI143 +aI-75 +aI194 +aI-22 +aI166 +aI-45 +aa(lp11597 +g15 +aI91 +aI-190 +aI120 +aI-105 +aI102 +aI-143 +aa(lp11598 +g15 +aI73 +aI-355 +aI79 +aI-236 +aI73 +aI-291 +aa(lp11599 +g15 +aI91 +aI-522 +aI73 +aI-419 +aI79 +aI-475 +aa(lp11600 +g15 +aI143 +aI-638 +aI102 +aI-569 +aI120 +aI-607 +aa(lp11601 +g15 +aI228 +aI-705 +aI166 +aI-668 +aI194 +aI-691 +aa(lp11602 +g15 +aI345 +aI-727 +aI262 +aI-720 +aI301 +aI-727 +aa(lp11603 +g15 +aI414 +aI-718 +aI370 +aI-727 +aI393 +aI-724 +aa(lp11604 +g15 +aI471 +aI-694 +aI435 +aI-713 +aI454 +aI-705 +aa(lp11605 +g15 +aI515 +aI-657 +aI487 +aI-684 +aI502 +aI-672 +aa(lp11606 +g15 +aI549 +aI-610 +aI528 +aI-643 +aI539 +aI-627 +aa(lp11607 +g20 +aI557 +aI-610 +aa(lp11608 +g15 +aI553 +aI-671 +aI555 +aI-631 +aI554 +aI-652 +aa(lp11609 +g15 +aI550 +aI-720 +aI552 +aI-687 +aI551 +aI-704 +aa(lp11610 +g15 +aI549 +aI-756 +aI549 +aI-736 +aI549 +aI-748 +aa(lp11611 +g20 +aI549 +aI-866 +aa(lp11612 +g15 +aI540 +aI-913 +aI549 +aI-885 +aI546 +aI-901 +aa(lp11613 +g15 +aI516 +aI-940 +aI534 +aI-925 +aI526 +aI-934 +aa(lp11614 +g15 +aI482 +aI-953 +aI506 +aI-947 +aI495 +aI-951 +aa(lp11615 +g15 +aI440 +aI-956 +aI468 +aI-955 +aI454 +aI-956 +aa(lp11616 +g20 +aI429 +aI-956 +aa(lp11617 +g20 +aI429 +aI-1012 +aa(lp11618 +g20 +aI674 +aI-1012 +aa(lp11619 +g10 +aa(lp11620 +g8 +aI367 +aI-71 +aa(lp11621 +g15 +aI454 +aI-89 +aI402 +aI-71 +aI431 +aI-77 +aa(lp11622 +g15 +aI510 +aI-141 +aI477 +aI-100 +aI496 +aI-118 +aa(lp11623 +g15 +aI540 +aI-230 +aI524 +aI-164 +aI534 +aI-194 +aa(lp11624 +g15 +aI549 +aI-355 +aI546 +aI-265 +aI549 +aI-307 +aa(lp11625 +g15 +aI540 +aI-478 +aI549 +aI-402 +aI546 +aI-443 +aa(lp11626 +g15 +aI510 +aI-568 +aI534 +aI-514 +aI524 +aI-544 +aa(lp11627 +g15 +aI454 +aI-623 +aI496 +aI-592 +aI477 +aI-610 +aa(lp11628 +g15 +aI366 +aI-642 +aI430 +aI-635 +aI401 +aI-642 +aa(lp11629 +g15 +aI291 +aI-623 +aI337 +aI-642 +aI312 +aI-635 +aa(lp11630 +g15 +aI240 +aI-567 +aI270 +aI-610 +aI253 +aI-592 +aa(lp11631 +g15 +aI211 +aI-477 +aI227 +aI-543 +aI217 +aI-513 +aa(lp11632 +g15 +aI202 +aI-354 +aI205 +aI-441 +aI202 +aI-400 +aa(lp11633 +g15 +aI240 +aI-142 +aI202 +aI-259 +aI215 +aI-189 +aa(lp11634 +g15 +aI367 +aI-71 +aI266 +aI-95 +aI308 +aI-71 +aa(lp11635 +g10 +aa(lp11636 +g8 +aI818 +aI0 +aa(lp11637 +g10 +aa(lp11638 +g8 +aI818 +aI0 +aasVh +(lp11639 +(lp11640 +g8 +aI382 +aI-55 +aa(lp11641 +g20 +aI382 +aI0 +aa(lp11642 +g20 +aI24 +aI0 +aa(lp11643 +g20 +aI24 +aI-55 +aa(lp11644 +g20 +aI34 +aI-55 +aa(lp11645 +g15 +aI77 +aI-58 +aI49 +aI-55 +aI63 +aI-56 +aa(lp11646 +g15 +aI111 +aI-72 +aI90 +aI-60 +aI101 +aI-65 +aa(lp11647 +g15 +aI135 +aI-101 +aI121 +aI-78 +aI129 +aI-88 +aa(lp11648 +g15 +aI143 +aI-151 +aI140 +aI-113 +aI143 +aI-130 +aa(lp11649 +g20 +aI143 +aI-866 +aa(lp11650 +g15 +aI135 +aI-913 +aI143 +aI-885 +aI140 +aI-901 +aa(lp11651 +g15 +aI111 +aI-940 +aI129 +aI-925 +aI121 +aI-934 +aa(lp11652 +g15 +aI76 +aI-953 +aI101 +aI-947 +aI89 +aI-951 +aa(lp11653 +g15 +aI34 +aI-956 +aI63 +aI-955 +aI49 +aI-956 +aa(lp11654 +g20 +aI24 +aI-956 +aa(lp11655 +g20 +aI24 +aI-1012 +aa(lp11656 +g20 +aI269 +aI-1012 +aa(lp11657 +g20 +aI269 +aI-719 +aa(lp11658 +g15 +aI268 +aI-681 +aI269 +aI-707 +aI269 +aI-694 +aa(lp11659 +g15 +aI266 +aI-644 +aI268 +aI-668 +aI267 +aI-656 +aa(lp11660 +g15 +aI264 +aI-606 +aI266 +aI-631 +aI265 +aI-618 +aa(lp11661 +g20 +aI270 +aI-606 +aa(lp11662 +g15 +aI466 +aI-727 +aI310 +aI-687 +aI376 +aI-727 +aa(lp11663 +g15 +aI567 +aI-712 +aI504 +aI-727 +aI538 +aI-722 +aa(lp11664 +g15 +aI641 +aI-665 +aI596 +aI-701 +aI621 +aI-686 +aa(lp11665 +g15 +aI686 +aI-584 +aI661 +aI-644 +aI676 +aI-617 +aa(lp11666 +g15 +aI702 +aI-466 +aI697 +aI-551 +aI702 +aI-511 +aa(lp11667 +g20 +aI702 +aI-151 +aa(lp11668 +g15 +aI710 +aI-101 +aI702 +aI-130 +aI705 +aI-113 +aa(lp11669 +g15 +aI731 +aI-72 +aI715 +aI-88 +aI722 +aI-78 +aa(lp11670 +g15 +aI764 +aI-58 +aI740 +aI-65 +aI751 +aI-60 +aa(lp11671 +g15 +aI805 +aI-55 +aI776 +aI-56 +aI790 +aI-55 +aa(lp11672 +g20 +aI809 +aI-55 +aa(lp11673 +g20 +aI809 +aI0 +aa(lp11674 +g20 +aI577 +aI0 +aa(lp11675 +g20 +aI577 +aI-459 +aa(lp11676 +g15 +aI569 +aI-537 +aI577 +aI-488 +aI574 +aI-514 +aa(lp11677 +g15 +aI544 +aI-594 +aI564 +aI-559 +aI556 +aI-578 +aa(lp11678 +g15 +aI499 +aI-630 +aI533 +aI-610 +aI518 +aI-622 +aa(lp11679 +g15 +aI430 +aI-642 +aI480 +aI-638 +aI457 +aI-642 +aa(lp11680 +g15 +aI359 +aI-626 +aI403 +aI-642 +aI379 +aI-637 +aa(lp11681 +g15 +aI308 +aI-583 +aI338 +aI-616 +aI322 +aI-602 +aa(lp11682 +g15 +aI279 +aI-514 +aI295 +aI-564 +aI285 +aI-541 +aa(lp11683 +g15 +aI269 +aI-425 +aI272 +aI-488 +aI269 +aI-458 +aa(lp11684 +g20 +aI269 +aI-144 +aa(lp11685 +g15 +aI278 +aI-97 +aI269 +aI-125 +aI272 +aI-109 +aa(lp11686 +g15 +aI302 +aI-70 +aI284 +aI-85 +aI292 +aI-76 +aa(lp11687 +g15 +aI336 +aI-58 +aI312 +aI-64 +aI323 +aI-60 +aa(lp11688 +g15 +aI378 +aI-55 +aI350 +aI-56 +aI364 +aI-55 +aa(lp11689 +g10 +aa(lp11690 +g8 +aI846 +aI0 +aa(lp11691 +g10 +aa(lp11692 +g8 +aI846 +aI0 +aasVl +(lp11693 +(lp11694 +g8 +aI34 +aI-55 +aa(lp11695 +g15 +aI77 +aI-58 +aI49 +aI-55 +aI63 +aI-56 +aa(lp11696 +g15 +aI111 +aI-72 +aI90 +aI-60 +aI101 +aI-65 +aa(lp11697 +g15 +aI135 +aI-101 +aI121 +aI-78 +aI129 +aI-88 +aa(lp11698 +g15 +aI143 +aI-151 +aI140 +aI-113 +aI143 +aI-130 +aa(lp11699 +g20 +aI143 +aI-866 +aa(lp11700 +g15 +aI135 +aI-913 +aI143 +aI-885 +aI140 +aI-901 +aa(lp11701 +g15 +aI111 +aI-940 +aI129 +aI-925 +aI121 +aI-934 +aa(lp11702 +g15 +aI76 +aI-953 +aI101 +aI-947 +aI89 +aI-951 +aa(lp11703 +g15 +aI34 +aI-956 +aI63 +aI-955 +aI49 +aI-956 +aa(lp11704 +g20 +aI17 +aI-956 +aa(lp11705 +g20 +aI17 +aI-1012 +aa(lp11706 +g20 +aI269 +aI-1012 +aa(lp11707 +g20 +aI269 +aI-151 +aa(lp11708 +g15 +aI277 +aI-101 +aI269 +aI-130 +aI272 +aI-113 +aa(lp11709 +g15 +aI301 +aI-72 +aI283 +aI-88 +aI291 +aI-78 +aa(lp11710 +g15 +aI336 +aI-58 +aI311 +aI-65 +aI323 +aI-60 +aa(lp11711 +g15 +aI378 +aI-55 +aI349 +aI-56 +aI363 +aI-55 +aa(lp11712 +g20 +aI395 +aI-55 +aa(lp11713 +g20 +aI395 +aI0 +aa(lp11714 +g20 +aI17 +aI0 +aa(lp11715 +g20 +aI17 +aI-55 +aa(lp11716 +g10 +aa(lp11717 +g8 +aI413 +aI0 +aa(lp11718 +g10 +aa(lp11719 +g8 +aI413 +aI0 +aasVp +(lp11720 +(lp11721 +g8 +aI450 +aI-642 +aa(lp11722 +g15 +aI363 +aI-624 +aI415 +aI-642 +aI386 +aI-636 +aa(lp11723 +g15 +aI307 +aI-572 +aI340 +aI-613 +aI321 +aI-595 +aa(lp11724 +g15 +aI278 +aI-483 +aI294 +aI-549 +aI284 +aI-519 +aa(lp11725 +g15 +aI269 +aI-358 +aI272 +aI-448 +aI269 +aI-406 +aa(lp11726 +g15 +aI278 +aI-235 +aI269 +aI-311 +aI272 +aI-270 +aa(lp11727 +g15 +aI308 +aI-145 +aI284 +aI-199 +aI294 +aI-169 +aa(lp11728 +g15 +aI364 +aI-90 +aI322 +aI-121 +aI341 +aI-102 +aa(lp11729 +g15 +aI451 +aI-71 +aI387 +aI-77 +aI416 +aI-71 +aa(lp11730 +g15 +aI527 +aI-90 +aI481 +aI-71 +aI506 +aI-77 +aa(lp11731 +g15 +aI577 +aI-145 +aI547 +aI-102 +aI564 +aI-121 +aa(lp11732 +g15 +aI606 +aI-235 +aI591 +aI-169 +aI600 +aI-199 +aa(lp11733 +g15 +aI615 +aI-359 +aI612 +aI-271 +aI615 +aI-312 +aa(lp11734 +g15 +aI606 +aI-483 +aI615 +aI-406 +aI612 +aI-448 +aa(lp11735 +g15 +aI577 +aI-571 +aI600 +aI-518 +aI591 +aI-548 +aa(lp11736 +g15 +aI526 +aI-624 +aI564 +aI-595 +aI547 +aI-612 +aa(lp11737 +g15 +aI450 +aI-642 +aI505 +aI-636 +aI480 +aI-642 +aa(lp11738 +g10 +aa(lp11739 +g8 +aI745 +aI-358 +aa(lp11740 +g15 +aI727 +aI-191 +aI745 +aI-294 +aI739 +aI-238 +aa(lp11741 +g15 +aI675 +aI-75 +aI715 +aI-144 +aI698 +aI-106 +aa(lp11742 +g15 +aI589 +aI-8 +aI652 +aI-45 +aI623 +aI-22 +aa(lp11743 +g15 +aI473 +aI13 +aI555 +aI6 +aI517 +aI13 +aa(lp11744 +g15 +aI403 +aI5 +aI447 +aI13 +aI424 +aI10 +aa(lp11745 +g15 +aI347 +aI-19 +aI382 +aI0 +aI364 +aI-8 +aa(lp11746 +g15 +aI303 +aI-56 +aI330 +aI-29 +aI315 +aI-41 +aa(lp11747 +g15 +aI269 +aI-103 +aI290 +aI-70 +aI279 +aI-86 +aa(lp11748 +g20 +aI264 +aI-103 +aa(lp11749 +g15 +aI266 +aI-39 +aI265 +aI-80 +aI266 +aI-59 +aa(lp11750 +g15 +aI267 +aI-13 +aI267 +aI-31 +aI267 +aI-22 +aa(lp11751 +g15 +aI268 +aI11 +aI268 +aI-4 +aI268 +aI3 +aa(lp11752 +g15 +aI269 +aI32 +aI268 +aI19 +aI268 +aI26 +aa(lp11753 +g15 +aI269 +aI47 +aI269 +aI38 +aI269 +aI43 +aa(lp11754 +g20 +aI269 +aI174 +aa(lp11755 +g15 +aI278 +aI222 +aI269 +aI194 +aI272 +aI210 +aa(lp11756 +g15 +aI302 +aI249 +aI284 +aI234 +aI292 +aI243 +aa(lp11757 +g15 +aI336 +aI261 +aI312 +aI255 +aI323 +aI259 +aa(lp11758 +g15 +aI378 +aI264 +aI350 +aI263 +aI364 +aI264 +aa(lp11759 +g20 +aI382 +aI264 +aa(lp11760 +g20 +aI382 +aI320 +aa(lp11761 +g20 +aI24 +aI320 +aa(lp11762 +g20 +aI24 +aI264 +aa(lp11763 +g20 +aI34 +aI264 +aa(lp11764 +g15 +aI77 +aI261 +aI49 +aI264 +aI63 +aI263 +aa(lp11765 +g15 +aI111 +aI248 +aI90 +aI259 +aI101 +aI254 +aa(lp11766 +g15 +aI135 +aI218 +aI121 +aI241 +aI129 +aI231 +aa(lp11767 +g15 +aI143 +aI168 +aI140 +aI206 +aI143 +aI189 +aa(lp11768 +g20 +aI143 +aI-567 +aa(lp11769 +g15 +aI135 +aI-614 +aI143 +aI-586 +aI140 +aI-602 +aa(lp11770 +g15 +aI111 +aI-642 +aI129 +aI-626 +aI121 +aI-635 +aa(lp11771 +g15 +aI76 +aI-655 +aI101 +aI-648 +aI89 +aI-652 +aa(lp11772 +g15 +aI34 +aI-658 +aI63 +aI-657 +aI49 +aI-658 +aa(lp11773 +g20 +aI17 +aI-658 +aa(lp11774 +g20 +aI17 +aI-714 +aa(lp11775 +g20 +aI250 +aI-714 +aa(lp11776 +g20 +aI264 +aI-593 +aa(lp11777 +g20 +aI269 +aI-593 +aa(lp11778 +g15 +aI303 +aI-649 +aI279 +aI-614 +aI290 +aI-632 +aa(lp11779 +g15 +aI347 +aI-691 +aI315 +aI-665 +aI330 +aI-679 +aa(lp11780 +g15 +aI402 +aI-717 +aI363 +aI-702 +aI382 +aI-711 +aa(lp11781 +g15 +aI473 +aI-727 +aI423 +aI-724 +aI447 +aI-727 +aa(lp11782 +g15 +aI589 +aI-705 +aI517 +aI-727 +aI555 +aI-720 +aa(lp11783 +g15 +aI675 +aI-638 +aI623 +aI-691 +aI652 +aI-668 +aa(lp11784 +g15 +aI727 +aI-523 +aI698 +aI-608 +aI715 +aI-570 +aa(lp11785 +g15 +aI745 +aI-358 +aI739 +aI-477 +aI745 +aI-422 +aa(lp11786 +g10 +aa(lp11787 +g8 +aI818 +aI0 +aa(lp11788 +g10 +aa(lp11789 +g8 +aI818 +aI0 +aasVt +(lp11790 +(lp11791 +g8 +aI353 +aI-56 +aa(lp11792 +g15 +aI397 +aI-59 +aI369 +aI-56 +aI384 +aI-57 +aa(lp11793 +g15 +aI438 +aI-65 +aI411 +aI-61 +aI424 +aI-63 +aa(lp11794 +g20 +aI438 +aI-7 +aa(lp11795 +g15 +aI416 +aI0 +aI433 +aI-4 +aI425 +aI-2 +aa(lp11796 +g15 +aI387 +aI7 +aI407 +aI3 +aI397 +aI5 +aa(lp11797 +g15 +aI353 +aI11 +aI376 +aI9 +aI365 +aI10 +aa(lp11798 +g15 +aI320 +aI13 +aI341 +aI12 +aI330 +aI13 +aa(lp11799 +g15 +aI233 +aI2 +aI286 +aI13 +aI257 +aI9 +aa(lp11800 +g15 +aI173 +aI-32 +aI208 +aI-4 +aI188 +aI-16 +aa(lp11801 +g15 +aI138 +aI-95 +aI157 +aI-48 +aI145 +aI-69 +aa(lp11802 +g15 +aI126 +aI-192 +aI130 +aI-122 +aI126 +aI-154 +aa(lp11803 +g20 +aI126 +aI-638 +aa(lp11804 +g20 +aI25 +aI-638 +aa(lp11805 +g20 +aI25 +aI-691 +aa(lp11806 +g15 +aI78 +aI-701 +aI41 +aI-691 +aI59 +aI-694 +aa(lp11807 +g15 +aI129 +aI-733 +aI97 +aI-707 +aI114 +aI-718 +aa(lp11808 +g15 +aI166 +aI-792 +aI144 +aI-750 +aI157 +aI-770 +aa(lp11809 +g15 +aI190 +aI-878 +aI175 +aI-815 +aI183 +aI-844 +aa(lp11810 +g20 +aI251 +aI-878 +aa(lp11811 +g20 +aI251 +aI-714 +aa(lp11812 +g20 +aI426 +aI-714 +aa(lp11813 +g20 +aI426 +aI-638 +aa(lp11814 +g20 +aI251 +aI-638 +aa(lp11815 +g20 +aI251 +aI-189 +aa(lp11816 +g15 +aI279 +aI-88 +aI251 +aI-143 +aI261 +aI-110 +aa(lp11817 +g15 +aI353 +aI-56 +aI298 +aI-67 +aI322 +aI-56 +aa(lp11818 +g10 +aa(lp11819 +g8 +aI469 +aI0 +aa(lp11820 +g10 +aa(lp11821 +g8 +aI469 +aI0 +aasVx +(lp11822 +(lp11823 +g8 +aI511 +aI-619 +aa(lp11824 +g15 +aI491 +aI-650 +aI511 +aI-635 +aI504 +aI-645 +aa(lp11825 +g15 +aI440 +aI-658 +aI477 +aI-655 +aI460 +aI-658 +aa(lp11826 +g20 +aI436 +aI-658 +aa(lp11827 +g20 +aI436 +aI-714 +aa(lp11828 +g20 +aI727 +aI-714 +aa(lp11829 +g20 +aI727 +aI-658 +aa(lp11830 +g20 +aI716 +aI-658 +aa(lp11831 +g15 +aI680 +aI-655 +aI703 +aI-658 +aI691 +aI-657 +aa(lp11832 +g15 +aI649 +aI-642 +aI670 +aI-652 +aI659 +aI-648 +aa(lp11833 +g15 +aI617 +aI-616 +aI639 +aI-636 +aI628 +aI-628 +aa(lp11834 +g15 +aI581 +aI-573 +aI606 +aI-605 +aI594 +aI-590 +aa(lp11835 +g20 +aI444 +aI-390 +aa(lp11836 +g20 +aI639 +aI-126 +aa(lp11837 +g15 +aI695 +aI-71 +aI659 +aI-100 +aI678 +aI-82 +aa(lp11838 +g15 +aI746 +aI-55 +aI713 +aI-60 +aI730 +aI-55 +aa(lp11839 +g20 +aI764 +aI-55 +aa(lp11840 +g20 +aI764 +aI0 +aa(lp11841 +g20 +aI419 +aI0 +aa(lp11842 +g20 +aI419 +aI-55 +aa(lp11843 +g20 +aI426 +aI-55 +aa(lp11844 +g15 +aI506 +aI-99 +aI479 +aI-55 +aI506 +aI-70 +aa(lp11845 +g15 +aI504 +aI-114 +aI506 +aI-104 +aI505 +aI-109 +aa(lp11846 +g15 +aI496 +aI-132 +aI503 +aI-119 +aI500 +aI-125 +aa(lp11847 +g15 +aI481 +aI-156 +aI492 +aI-138 +aI487 +aI-146 +aa(lp11848 +g15 +aI455 +aI-191 +aI474 +aI-165 +aI466 +aI-177 +aa(lp11849 +g20 +aI366 +aI-311 +aa(lp11850 +g20 +aI273 +aI-181 +aa(lp11851 +g15 +aI261 +aI-162 +aI269 +aI-175 +aI265 +aI-169 +aa(lp11852 +g15 +aI249 +aI-141 +aI256 +aI-156 +aI252 +aI-148 +aa(lp11853 +g15 +aI240 +aI-119 +aI245 +aI-134 +aI243 +aI-126 +aa(lp11854 +g15 +aI237 +aI-97 +aI238 +aI-111 +aI237 +aI-104 +aa(lp11855 +g15 +aI256 +aI-64 +aI237 +aI-82 +aI243 +aI-71 +aa(lp11856 +g15 +aI320 +aI-55 +aI269 +aI-58 +aI290 +aI-55 +aa(lp11857 +g20 +aI324 +aI-55 +aa(lp11858 +g20 +aI324 +aI0 +aa(lp11859 +g20 +aI6 +aI0 +aa(lp11860 +g20 +aI6 +aI-55 +aa(lp11861 +g20 +aI18 +aI-55 +aa(lp11862 +g15 +aI61 +aI-59 +aI34 +aI-55 +aI49 +aI-56 +aa(lp11863 +g15 +aI95 +aI-73 +aI73 +aI-62 +aI84 +aI-66 +aa(lp11864 +g15 +aI128 +aI-99 +aI106 +aI-79 +aI117 +aI-88 +aa(lp11865 +g15 +aI164 +aI-140 +aI139 +aI-110 +aI151 +aI-124 +aa(lp11866 +g20 +aI332 +aI-358 +aa(lp11867 +g20 +aI164 +aI-587 +aa(lp11868 +g15 +aI107 +aI-640 +aI144 +aI-610 +aI125 +aI-628 +aa(lp11869 +g15 +aI49 +aI-658 +aI88 +aI-652 +aI69 +aI-658 +aa(lp11870 +g20 +aI31 +aI-658 +aa(lp11871 +g20 +aI31 +aI-714 +aa(lp11872 +g20 +aI370 +aI-714 +aa(lp11873 +g20 +aI370 +aI-658 +aa(lp11874 +g20 +aI366 +aI-658 +aa(lp11875 +g15 +aI328 +aI-655 +aI351 +aI-658 +aI338 +aI-657 +aa(lp11876 +g15 +aI305 +aI-647 +aI318 +aI-653 +aI310 +aI-650 +aa(lp11877 +g15 +aI293 +aI-634 +aI299 +aI-643 +aI295 +aI-639 +aa(lp11878 +g15 +aI290 +aI-619 +aI291 +aI-629 +aI290 +aI-624 +aa(lp11879 +g15 +aI298 +aI-592 +aI290 +aI-610 +aI293 +aI-601 +aa(lp11880 +g15 +aI321 +aI-558 +aI303 +aI-583 +aI311 +aI-572 +aa(lp11881 +g20 +aI409 +aI-438 +aa(lp11882 +g20 +aI478 +aI-537 +aa(lp11883 +g15 +aI502 +aI-580 +aI488 +aI-553 +aI496 +aI-567 +aa(lp11884 +g15 +aI511 +aI-619 +aI508 +aI-594 +aI511 +aI-607 +aa(lp11885 +g10 +aa(lp11886 +g8 +aI770 +aI0 +aa(lp11887 +g10 +aa(lp11888 +g8 +aI770 +aI0 +aasV| +(lp11889 +(lp11890 +g8 +aI412 +aI320 +aa(lp11891 +g20 +aI332 +aI320 +aa(lp11892 +g20 +aI332 +aI-1012 +aa(lp11893 +g20 +aI412 +aI-1012 +aa(lp11894 +g10 +aa(lp11895 +g8 +aI745 +aI0 +aa(lp11896 +g10 +aa(lp11897 +g8 +aI745 +aI0 +aasV# +(lp11898 +(lp11899 +g8 +aI258 +aI-349 +aa(lp11900 +g20 +aI444 +aI-349 +aa(lp11901 +g20 +aI493 +aI-610 +aa(lp11902 +g20 +aI307 +aI-610 +aa(lp11903 +g10 +aa(lp11904 +g8 +aI675 +aI-349 +aa(lp11905 +g20 +aI675 +aI-270 +aa(lp11906 +g20 +aI507 +aI-270 +aa(lp11907 +g20 +aI457 +aI0 +aa(lp11908 +g20 +aI377 +aI0 +aa(lp11909 +g20 +aI427 +aI-270 +aa(lp11910 +g20 +aI242 +aI-270 +aa(lp11911 +g20 +aI192 +aI0 +aa(lp11912 +g20 +aI111 +aI0 +aa(lp11913 +g20 +aI162 +aI-270 +aa(lp11914 +g20 +aI53 +aI-270 +aa(lp11915 +g20 +aI53 +aI-349 +aa(lp11916 +g20 +aI177 +aI-349 +aa(lp11917 +g20 +aI227 +aI-610 +aa(lp11918 +g20 +aI69 +aI-610 +aa(lp11919 +g20 +aI69 +aI-689 +aa(lp11920 +g20 +aI242 +aI-689 +aa(lp11921 +g20 +aI290 +aI-951 +aa(lp11922 +g20 +aI371 +aI-951 +aa(lp11923 +g20 +aI322 +aI-689 +aa(lp11924 +g20 +aI507 +aI-689 +aa(lp11925 +g20 +aI557 +aI-951 +aa(lp11926 +g20 +aI637 +aI-951 +aa(lp11927 +g20 +aI587 +aI-689 +aa(lp11928 +g20 +aI692 +aI-689 +aa(lp11929 +g20 +aI692 +aI-610 +aa(lp11930 +g20 +aI573 +aI-610 +aa(lp11931 +g20 +aI524 +aI-349 +aa(lp11932 +g10 +aa(lp11933 +g8 +aI745 +aI0 +aa(lp11934 +g10 +aa(lp11935 +g8 +aI745 +aI0 +aasV' +(lp11936 +(lp11937 +g8 +aI76 +aI-951 +aa(lp11938 +g20 +aI217 +aI-951 +aa(lp11939 +g20 +aI177 +aI-638 +aa(lp11940 +g20 +aI115 +aI-638 +aa(lp11941 +g10 +aa(lp11942 +g8 +aI293 +aI0 +aa(lp11943 +g10 +aa(lp11944 +g8 +aI293 +aI0 +aasV+ +(lp11945 +(lp11946 +g8 +aI412 +aI-437 +aa(lp11947 +g20 +aI412 +aI-190 +aa(lp11948 +g20 +aI332 +aI-190 +aa(lp11949 +g20 +aI332 +aI-437 +aa(lp11950 +g20 +aI86 +aI-437 +aa(lp11951 +g20 +aI86 +aI-515 +aa(lp11952 +g20 +aI332 +aI-515 +aa(lp11953 +g20 +aI332 +aI-761 +aa(lp11954 +g20 +aI412 +aI-761 +aa(lp11955 +g20 +aI412 +aI-515 +aa(lp11956 +g20 +aI658 +aI-515 +aa(lp11957 +g20 +aI658 +aI-437 +aa(lp11958 +g10 +aa(lp11959 +g8 +aI745 +aI0 +aa(lp11960 +g10 +aa(lp11961 +g8 +aI745 +aI0 +aasV/ +(lp11962 +(lp11963 +g8 +aI78 +aI161 +aa(lp11964 +g20 +aI0 +aI161 +aa(lp11965 +g20 +aI306 +aI-1012 +aa(lp11966 +g20 +aI384 +aI-1012 +aa(lp11967 +g10 +aa(lp11968 +g8 +aI384 +aI0 +aa(lp11969 +g10 +aa(lp11970 +g8 +aI384 +aI0 +aasV3 +(lp11971 +(lp11972 +g8 +aI330 +aI-58 +aa(lp11973 +g15 +aI406 +aI-69 +aI357 +aI-58 +aI382 +aI-61 +aa(lp11974 +g15 +aI469 +aI-105 +aI430 +aI-76 +aI451 +aI-88 +aa(lp11975 +g15 +aI513 +aI-172 +aI487 +aI-122 +aI502 +aI-144 +aa(lp11976 +g15 +aI529 +aI-272 +aI523 +aI-199 +aI529 +aI-233 +aa(lp11977 +g15 +aI512 +aI-349 +aI529 +aI-301 +aI523 +aI-326 +aa(lp11978 +g15 +aI464 +aI-407 +aI501 +aI-372 +aI485 +aI-391 +aa(lp11979 +g15 +aI388 +aI-445 +aI444 +aI-423 +aI418 +aI-436 +aa(lp11980 +g15 +aI287 +aI-458 +aI358 +aI-454 +aI325 +aI-458 +aa(lp11981 +g20 +aI245 +aI-458 +aa(lp11982 +g20 +aI245 +aI-526 +aa(lp11983 +g20 +aI287 +aI-526 +aa(lp11984 +g15 +aI370 +aI-540 +aI317 +aI-526 +aI344 +aI-531 +aa(lp11985 +g15 +aI436 +aI-582 +aI395 +aI-550 +aI417 +aI-564 +aa(lp11986 +g15 +aI481 +aI-647 +aI455 +aI-600 +aI470 +aI-621 +aa(lp11987 +g15 +aI497 +aI-732 +aI491 +aI-672 +aI497 +aI-700 +aa(lp11988 +g15 +aI489 +aI-802 +aI497 +aI-758 +aI494 +aI-781 +aa(lp11989 +g15 +aI464 +aI-854 +aI484 +aI-822 +aI476 +aI-840 +aa(lp11990 +g15 +aI420 +aI-886 +aI453 +aI-868 +aI438 +aI-879 +aa(lp11991 +g15 +aI354 +aI-897 +aI402 +aI-894 +aI380 +aI-897 +aa(lp11992 +g15 +aI280 +aI-881 +aI324 +aI-897 +aI299 +aI-892 +aa(lp11993 +g15 +aI235 +aI-838 +aI261 +aI-870 +aI246 +aI-856 +aa(lp11994 +g15 +aI213 +aI-774 +aI224 +aI-819 +aI217 +aI-798 +aa(lp11995 +g15 +aI207 +aI-699 +aI209 +aI-751 +aI207 +aI-725 +aa(lp11996 +g15 +aI162 +aI-703 +aI191 +aI-699 +aI176 +aI-700 +aa(lp11997 +g15 +aI126 +aI-717 +aI148 +aI-705 +aI136 +aI-710 +aa(lp11998 +g15 +aI101 +aI-744 +aI115 +aI-724 +aI107 +aI-732 +aa(lp11999 +g15 +aI93 +aI-786 +aI96 +aI-755 +aI93 +aI-769 +aa(lp12000 +g15 +aI109 +aI-857 +aI93 +aI-811 +aI98 +aI-835 +aa(lp12001 +g15 +aI159 +aI-914 +aI120 +aI-879 +aI137 +aI-898 +aa(lp12002 +g15 +aI241 +aI-951 +aI181 +aI-930 +aI208 +aI-942 +aa(lp12003 +g15 +aI354 +aI-965 +aI274 +aI-960 +aI311 +aI-965 +aa(lp12004 +g15 +aI469 +aI-950 +aI396 +aI-965 +aI435 +aI-960 +aa(lp12005 +g15 +aI557 +aI-909 +aI503 +aI-941 +aI533 +aI-927 +aa(lp12006 +g15 +aI614 +aI-842 +aI582 +aI-891 +aI601 +aI-869 +aa(lp12007 +g15 +aI634 +aI-752 +aI628 +aI-816 +aI634 +aI-786 +aa(lp12008 +g15 +aI618 +aI-668 +aI634 +aI-722 +aI629 +aI-694 +aa(lp12009 +g15 +aI574 +aI-596 +aI608 +aI-641 +aI593 +aI-617 +aa(lp12010 +g15 +aI506 +aI-541 +aI555 +aI-574 +aI532 +aI-556 +aa(lp12011 +g15 +aI421 +aI-507 +aI480 +aI-526 +aI452 +aI-514 +aa(lp12012 +g15 +aI473 +aI-498 +aI437 +aI-505 +aI455 +aI-502 +aa(lp12013 +g15 +aI529 +aI-480 +aI492 +aI-494 +aI511 +aI-488 +aa(lp12014 +g15 +aI581 +aI-451 +aI547 +aI-472 +aI564 +aI-463 +aa(lp12015 +g15 +aI625 +aI-408 +aI598 +aI-439 +aI613 +aI-425 +aa(lp12016 +g15 +aI656 +aI-349 +aI638 +aI-391 +aI648 +aI-371 +aa(lp12017 +g15 +aI667 +aI-271 +aI664 +aI-327 +aI667 +aI-301 +aa(lp12018 +g15 +aI653 +aI-175 +aI667 +aI-236 +aI663 +aI-204 +aa(lp12019 +g15 +aI614 +aI-102 +aI644 +aI-147 +aI630 +aI-123 +aa(lp12020 +g15 +aI555 +aI-48 +aI597 +aI-81 +aI578 +aI-63 +aa(lp12021 +g15 +aI485 +aI-12 +aI533 +aI-33 +aI510 +aI-21 +aa(lp12022 +g15 +aI407 +aI7 +aI459 +aI-3 +aI434 +aI3 +aa(lp12023 +g15 +aI329 +aI13 +aI381 +aI11 +aI355 +aI13 +aa(lp12024 +g15 +aI216 +aI1 +aI285 +aI13 +aI247 +aI9 +aa(lp12025 +g15 +aI137 +aI-30 +aI184 +aI-6 +aI158 +aI-17 +aa(lp12026 +g15 +aI92 +aI-77 +aI117 +aI-44 +aI101 +aI-59 +aa(lp12027 +g15 +aI77 +aI-134 +aI82 +aI-96 +aI77 +aI-114 +aa(lp12028 +g15 +aI100 +aI-197 +aI77 +aI-161 +aI85 +aI-182 +aa(lp12029 +g15 +aI161 +aI-219 +aI115 +aI-212 +aI135 +aI-219 +aa(lp12030 +g15 +aI172 +aI-154 +aI161 +aI-196 +aI165 +aI-174 +aa(lp12031 +g15 +aI205 +aI-103 +aI180 +aI-135 +aI191 +aI-118 +aa(lp12032 +g15 +aI258 +aI-70 +aI220 +aI-89 +aI237 +aI-78 +aa(lp12033 +g15 +aI330 +aI-58 +aI279 +aI-62 +aI303 +aI-58 +aa(lp12034 +g10 +aa(lp12035 +g8 +aI745 +aI0 +aa(lp12036 +g10 +aa(lp12037 +g8 +aI745 +aI0 +aasV7 +(lp12038 +(lp12039 +g8 +aI253 +aI0 +aa(lp12040 +g20 +aI567 +aI-843 +aa(lp12041 +g20 +aI217 +aI-843 +aa(lp12042 +g15 +aI139 +aI-775 +aI169 +aI-843 +aI143 +aI-820 +aa(lp12043 +g20 +aI134 +aI-709 +aa(lp12044 +g20 +aI78 +aI-709 +aa(lp12045 +g20 +aI85 +aI-950 +aa(lp12046 +g20 +aI681 +aI-950 +aa(lp12047 +g20 +aI681 +aI-911 +aa(lp12048 +g20 +aI353 +aI0 +aa(lp12049 +g10 +aa(lp12050 +g8 +aI745 +aI0 +aa(lp12051 +g10 +aa(lp12052 +g8 +aI745 +aI0 +aasV; +(lp12053 +(lp12054 +g8 +aI258 +aI-55 +aa(lp12055 +g15 +aI246 +aI26 +aI258 +aI-27 +aI254 +aI0 +aa(lp12056 +g15 +aI208 +aI100 +aI238 +aI52 +aI226 +aI77 +aa(lp12057 +g15 +aI140 +aI160 +aI191 +aI122 +aI168 +aI142 +aa(lp12058 +g15 +aI39 +aI205 +aI113 +aI178 +aI79 +aI193 +aa(lp12059 +g20 +aI39 +aI149 +aa(lp12060 +g15 +aI136 +aI98 +aI83 +aI135 +aI115 +aI118 +aa(lp12061 +g15 +aI166 +aI29 +aI156 +aI78 +aI166 +aI55 +aa(lp12062 +g15 +aI159 +aI7 +aI166 +aI21 +aI164 +aI13 +aa(lp12063 +g15 +aI141 +aI-7 +aI154 +aI2 +aI148 +aI-3 +aa(lp12064 +g15 +aI117 +aI-21 +aI133 +aI-12 +aI126 +aI-16 +aa(lp12065 +g15 +aI94 +aI-36 +aI109 +aI-25 +aI101 +aI-30 +aa(lp12066 +g15 +aI76 +aI-59 +aI87 +aI-42 +aI80 +aI-50 +aa(lp12067 +g15 +aI69 +aI-92 +aI71 +aI-68 +aI69 +aI-79 +aa(lp12068 +g15 +aI94 +aI-151 +aI69 +aI-118 +aI77 +aI-137 +aa(lp12069 +g15 +aI156 +aI-171 +aI110 +aI-164 +aI131 +aI-171 +aa(lp12070 +g15 +aI195 +aI-163 +aI170 +aI-171 +aI183 +aI-168 +aa(lp12071 +g15 +aI227 +aI-141 +aI207 +aI-158 +aI218 +aI-151 +aa(lp12072 +g15 +aI250 +aI-105 +aI237 +aI-132 +aI244 +aI-119 +aa(lp12073 +g15 +aI258 +aI-55 +aI255 +aI-90 +aI258 +aI-74 +aa(lp12074 +g10 +aa(lp12075 +g8 +aI83 +aI-630 +aa(lp12076 +g15 +aI90 +aI-673 +aI83 +aI-647 +aI86 +aI-662 +aa(lp12077 +g15 +aI108 +aI-701 +aI94 +aI-685 +aI100 +aI-694 +aa(lp12078 +g15 +aI135 +aI-716 +aI115 +aI-708 +aI124 +aI-713 +aa(lp12079 +g15 +aI167 +aI-720 +aI145 +aI-719 +aI156 +aI-720 +aa(lp12080 +g15 +aI200 +aI-716 +aI179 +aI-720 +aI189 +aI-719 +aa(lp12081 +g15 +aI226 +aI-701 +aI210 +aI-713 +aI219 +aI-708 +aa(lp12082 +g15 +aI245 +aI-673 +aI234 +aI-694 +aI240 +aI-685 +aa(lp12083 +g15 +aI251 +aI-630 +aI249 +aI-662 +aI251 +aI-647 +aa(lp12084 +g15 +aI245 +aI-587 +aI251 +aI-613 +aI249 +aI-599 +aa(lp12085 +g15 +aI226 +aI-559 +aI240 +aI-575 +aI234 +aI-566 +aa(lp12086 +g15 +aI200 +aI-543 +aI219 +aI-551 +aI210 +aI-546 +aa(lp12087 +g15 +aI167 +aI-539 +aI189 +aI-540 +aI179 +aI-539 +aa(lp12088 +g15 +aI135 +aI-543 +aI156 +aI-539 +aI145 +aI-540 +aa(lp12089 +g15 +aI108 +aI-559 +aI124 +aI-546 +aI115 +aI-551 +aa(lp12090 +g15 +aI90 +aI-587 +aI100 +aI-566 +aI94 +aI-575 +aa(lp12091 +g15 +aI83 +aI-630 +aI86 +aI-599 +aI83 +aI-613 +aa(lp12092 +g10 +aa(lp12093 +g8 +aI333 +aI0 +aa(lp12094 +g10 +aa(lp12095 +g8 +aI333 +aI0 +aasV? +(lp12096 +(lp12097 +g8 +aI339 +aI-267 +aa(lp12098 +g20 +aI258 +aI-267 +aa(lp12099 +g20 +aI258 +aI-470 +aa(lp12100 +g15 +aI355 +aI-524 +aI297 +aI-485 +aI329 +aI-503 +aa(lp12101 +g15 +aI418 +aI-591 +aI382 +aI-545 +aI403 +aI-567 +aa(lp12102 +g15 +aI452 +aI-667 +aI434 +aI-615 +aI446 +aI-640 +aa(lp12103 +g15 +aI462 +aI-746 +aI459 +aI-693 +aI462 +aI-719 +aa(lp12104 +g15 +aI454 +aI-809 +aI462 +aI-769 +aI460 +aI-790 +aa(lp12105 +g15 +aI428 +aI-857 +aI448 +aI-827 +aI440 +aI-844 +aa(lp12106 +g15 +aI383 +aI-888 +aI416 +aI-870 +aI401 +aI-880 +aa(lp12107 +g15 +aI317 +aI-899 +aI364 +aI-895 +aI342 +aI-899 +aa(lp12108 +g15 +aI247 +aI-885 +aI289 +aI-899 +aI265 +aI-894 +aa(lp12109 +g15 +aI201 +aI-848 +aI228 +aI-876 +aI212 +aI-864 +aa(lp12110 +g15 +aI175 +aI-794 +aI189 +aI-832 +aI180 +aI-814 +aa(lp12111 +g15 +aI167 +aI-728 +aI170 +aI-773 +aI167 +aI-751 +aa(lp12112 +g15 +aI123 +aI-734 +aI151 +aI-728 +aI137 +aI-730 +aa(lp12113 +g15 +aI88 +aI-750 +aI110 +aI-737 +aI98 +aI-743 +aa(lp12114 +g15 +aI65 +aI-777 +aI79 +aI-757 +aI71 +aI-766 +aa(lp12115 +g15 +aI57 +aI-815 +aI60 +aI-788 +aI57 +aI-800 +aa(lp12116 +g15 +aI71 +aI-874 +aI57 +aI-836 +aI62 +aI-856 +aa(lp12117 +g15 +aI117 +aI-922 +aI81 +aI-892 +aI96 +aI-908 +aa(lp12118 +g15 +aI195 +aI-953 +aI138 +aI-935 +aI164 +aI-946 +aa(lp12119 +g15 +aI306 +aI-965 +aI226 +aI-961 +aI263 +aI-965 +aa(lp12120 +g15 +aI423 +aI-948 +aI348 +aI-965 +aI387 +aI-959 +aa(lp12121 +g15 +aI515 +aI-901 +aI458 +aI-937 +aI489 +aI-922 +aa(lp12122 +g15 +aI576 +aI-825 +aI541 +aI-880 +aI562 +aI-855 +aa(lp12123 +g15 +aI598 +aI-723 +aI591 +aI-795 +aI598 +aI-761 +aa(lp12124 +g15 +aI581 +aI-623 +aI598 +aI-687 +aI593 +aI-653 +aa(lp12125 +g15 +aI531 +aI-541 +aI570 +aI-593 +aI553 +aI-566 +aa(lp12126 +g15 +aI449 +aI-474 +aI509 +aI-517 +aI481 +aI-494 +aa(lp12127 +g15 +aI339 +aI-418 +aI417 +aI-453 +aI381 +aI-435 +aa(lp12128 +g10 +aa(lp12129 +g8 +aI213 +aI-80 +aa(lp12130 +g15 +aI220 +aI-124 +aI213 +aI-98 +aI215 +aI-112 +aa(lp12131 +g15 +aI237 +aI-151 +aI224 +aI-135 +aI230 +aI-144 +aa(lp12132 +g15 +aI264 +aI-166 +aI245 +aI-158 +aI254 +aI-163 +aa(lp12133 +g15 +aI297 +aI-171 +aI274 +aI-169 +aI285 +aI-171 +aa(lp12134 +g15 +aI329 +aI-166 +aI308 +aI-171 +aI319 +aI-169 +aa(lp12135 +g15 +aI356 +aI-151 +aI339 +aI-163 +aI348 +aI-158 +aa(lp12136 +g15 +aI374 +aI-124 +aI364 +aI-144 +aI370 +aI-135 +aa(lp12137 +g15 +aI381 +aI-80 +aI379 +aI-112 +aI381 +aI-98 +aa(lp12138 +g15 +aI374 +aI-37 +aI381 +aI-64 +aI379 +aI-49 +aa(lp12139 +g15 +aI356 +aI-9 +aI370 +aI-26 +aI364 +aI-16 +aa(lp12140 +g15 +aI329 +aI5 +aI348 +aI-3 +aI339 +aI1 +aa(lp12141 +g15 +aI297 +aI9 +aI319 +aI8 +aI308 +aI9 +aa(lp12142 +g15 +aI264 +aI5 +aI285 +aI9 +aI274 +aI8 +aa(lp12143 +g15 +aI237 +aI-9 +aI254 +aI1 +aI245 +aI-3 +aa(lp12144 +g15 +aI220 +aI-37 +aI230 +aI-16 +aI224 +aI-26 +aa(lp12145 +g15 +aI213 +aI-80 +aI215 +aI-49 +aI213 +aI-64 +aa(lp12146 +g10 +aa(lp12147 +g8 +aI666 +aI0 +aa(lp12148 +g10 +aa(lp12149 +g8 +aI666 +aI0 +aasVC +(lp12150 +(lp12151 +g8 +aI503 +aI-965 +aa(lp12152 +g15 +aI622 +aI-953 +aI549 +aI-965 +aI589 +aI-961 +aa(lp12153 +g15 +aI706 +aI-922 +aI656 +aI-946 +aI684 +aI-935 +aa(lp12154 +g15 +aI756 +aI-874 +aI729 +aI-908 +aI745 +aI-892 +aa(lp12155 +g15 +aI773 +aI-815 +aI767 +aI-856 +aI773 +aI-836 +aa(lp12156 +g15 +aI764 +aI-776 +aI773 +aI-800 +aI770 +aI-788 +aa(lp12157 +g15 +aI740 +aI-747 +aI758 +aI-765 +aI750 +aI-755 +aa(lp12158 +g15 +aI703 +aI-728 +aI729 +aI-739 +aI717 +aI-733 +aa(lp12159 +g15 +aI657 +aI-722 +aI689 +aI-724 +aI674 +aI-722 +aa(lp12160 +g15 +aI649 +aI-784 +aI657 +aI-743 +aI654 +aI-763 +aa(lp12161 +g15 +aI622 +aI-839 +aI643 +aI-804 +aI635 +aI-822 +aa(lp12162 +g15 +aI574 +aI-878 +aI610 +aI-855 +aI594 +aI-868 +aa(lp12163 +g15 +aI501 +aI-894 +aI554 +aI-888 +aI530 +aI-894 +aa(lp12164 +g15 +aI373 +aI-866 +aI450 +aI-894 +aI408 +aI-884 +aa(lp12165 +g15 +aI287 +aI-785 +aI337 +aI-847 +aI309 +aI-821 +aa(lp12166 +g15 +aI238 +aI-654 +aI264 +aI-750 +aI248 +aI-706 +aa(lp12167 +g15 +aI223 +aI-476 +aI228 +aI-602 +aI223 +aI-543 +aa(lp12168 +g15 +aI239 +aI-313 +aI223 +aI-417 +aI229 +aI-362 +aa(lp12169 +g15 +aI289 +aI-186 +aI250 +aI-263 +aI266 +aI-221 +aa(lp12170 +g15 +aI375 +aI-103 +aI311 +aI-150 +aI340 +aI-123 +aa(lp12171 +g15 +aI501 +aI-74 +aI410 +aI-84 +aI452 +aI-74 +aa(lp12172 +g15 +aI587 +aI-83 +aI533 +aI-74 +aI562 +aI-77 +aa(lp12173 +g15 +aI653 +aI-108 +aI612 +aI-90 +aI634 +aI-98 +aa(lp12174 +g15 +aI704 +aI-145 +aI672 +aI-119 +aI689 +aI-131 +aa(lp12175 +g15 +aI742 +aI-187 +aI718 +aI-158 +aI731 +aI-172 +aa(lp12176 +g15 +aI761 +aI-168 +aI750 +aI-182 +aI756 +aI-176 +aa(lp12177 +g15 +aI768 +aI-135 +aI765 +aI-159 +aI768 +aI-149 +aa(lp12178 +g15 +aI750 +aI-83 +aI768 +aI-118 +aI762 +aI-101 +aa(lp12179 +g15 +aI698 +aI-36 +aI739 +aI-66 +aI722 +aI-50 +aa(lp12180 +g15 +aI609 +aI0 +aI675 +aI-21 +aI645 +aI-9 +aa(lp12181 +g15 +aI481 +aI13 +aI573 +aI8 +aI530 +aI13 +aa(lp12182 +g15 +aI305 +aI-21 +aI414 +aI13 +aI356 +aI1 +aa(lp12183 +g15 +aI179 +aI-121 +aI255 +aI-45 +aI213 +aI-78 +aa(lp12184 +g15 +aI102 +aI-276 +aI145 +aI-164 +aI119 +aI-215 +aa(lp12185 +g15 +aI76 +aI-476 +aI84 +aI-336 +aI76 +aI-403 +aa(lp12186 +g15 +aI103 +aI-674 +aI76 +aI-548 +aI85 +aI-614 +aa(lp12187 +g15 +aI184 +aI-828 +aI121 +aI-734 +aI148 +aI-786 +aa(lp12188 +g15 +aI318 +aI-929 +aI220 +aI-871 +aI264 +aI-905 +aa(lp12189 +g15 +aI503 +aI-965 +aI371 +aI-953 +aI433 +aI-965 +aa(lp12190 +g10 +aa(lp12191 +g8 +aI818 +aI0 +aa(lp12192 +g10 +aa(lp12193 +g8 +aI818 +aI0 +aasVG +(lp12194 +(lp12195 +g8 +aI534 +aI13 +aa(lp12196 +g15 +aI332 +aI-21 +aI457 +aI13 +aI389 +aI1 +aa(lp12197 +g15 +aI189 +aI-121 +aI274 +aI-45 +aI227 +aI-78 +aa(lp12198 +g15 +aI104 +aI-276 +aI151 +aI-164 +aI122 +aI-215 +aa(lp12199 +g15 +aI76 +aI-476 +aI85 +aI-336 +aI76 +aI-403 +aa(lp12200 +g15 +aI105 +aI-674 +aI76 +aI-548 +aI86 +aI-614 +aa(lp12201 +g15 +aI194 +aI-828 +aI125 +aI-734 +aI155 +aI-786 +aa(lp12202 +g15 +aI340 +aI-929 +aI233 +aI-871 +aI282 +aI-905 +aa(lp12203 +g15 +aI542 +aI-965 +aI398 +aI-953 +aI466 +aI-965 +aa(lp12204 +g15 +aI672 +aI-953 +aI592 +aI-965 +aI635 +aI-961 +aa(lp12205 +g15 +aI763 +aI-922 +aI708 +aI-946 +aI739 +aI-935 +aa(lp12206 +g15 +aI819 +aI-874 +aI788 +aI-908 +aI806 +aI-892 +aa(lp12207 +g15 +aI837 +aI-815 +aI831 +aI-856 +aI837 +aI-836 +aa(lp12208 +g15 +aI827 +aI-776 +aI837 +aI-800 +aI833 +aI-788 +aa(lp12209 +g15 +aI801 +aI-747 +aI820 +aI-765 +aI812 +aI-755 +aa(lp12210 +g15 +aI762 +aI-728 +aI790 +aI-739 +aI777 +aI-733 +aa(lp12211 +g15 +aI713 +aI-722 +aI747 +aI-724 +aI730 +aI-722 +aa(lp12212 +g15 +aI704 +aI-784 +aI713 +aI-743 +aI710 +aI-763 +aa(lp12213 +g15 +aI674 +aI-839 +aI698 +aI-804 +aI688 +aI-822 +aa(lp12214 +g15 +aI619 +aI-878 +aI660 +aI-855 +aI642 +aI-868 +aa(lp12215 +g15 +aI537 +aI-894 +aI597 +aI-888 +aI569 +aI-894 +aa(lp12216 +g15 +aI392 +aI-866 +aI480 +aI-894 +aI432 +aI-884 +aa(lp12217 +g15 +aI295 +aI-785 +aI353 +aI-847 +aI320 +aI-821 +aa(lp12218 +g15 +aI240 +aI-654 +aI270 +aI-750 +aI252 +aI-706 +aa(lp12219 +g15 +aI223 +aI-476 +aI229 +aI-602 +aI223 +aI-543 +aa(lp12220 +g15 +aI241 +aI-299 +aI223 +aI-410 +aI229 +aI-351 +aa(lp12221 +g15 +aI298 +aI-169 +aI253 +aI-248 +aI272 +aI-204 +aa(lp12222 +g15 +aI401 +aI-89 +aI325 +aI-134 +aI359 +aI-107 +aa(lp12223 +g15 +aI555 +aI-62 +aI443 +aI-71 +aI495 +aI-62 +aa(lp12224 +g15 +aI630 +aI-65 +aI581 +aI-62 +aI606 +aI-63 +aa(lp12225 +g15 +aI694 +aI-78 +aI654 +aI-68 +aI675 +aI-72 +aa(lp12226 +g20 +aI694 +aI-293 +aa(lp12227 +g15 +aI685 +aI-340 +aI694 +aI-312 +aI691 +aI-328 +aa(lp12228 +g15 +aI662 +aI-367 +aI680 +aI-352 +aI672 +aI-361 +aa(lp12229 +g15 +aI627 +aI-380 +aI652 +aI-374 +aI640 +aI-378 +aa(lp12230 +g15 +aI585 +aI-383 +aI614 +aI-382 +aI600 +aI-383 +aa(lp12231 +g20 +aI580 +aI-383 +aa(lp12232 +g20 +aI580 +aI-439 +aa(lp12233 +g20 +aI926 +aI-439 +aa(lp12234 +g20 +aI926 +aI-383 +aa(lp12235 +g20 +aI921 +aI-383 +aa(lp12236 +g15 +aI885 +aI-380 +aI908 +aI-383 +aI896 +aI-382 +aa(lp12237 +g15 +aI856 +aI-367 +aI874 +aI-378 +aI864 +aI-373 +aa(lp12238 +g15 +aI836 +aI-337 +aI847 +aI-360 +aI841 +aI-350 +aa(lp12239 +g15 +aI829 +aI-287 +aI831 +aI-324 +aI829 +aI-308 +aa(lp12240 +g20 +aI829 +aI-47 +aa(lp12241 +g15 +aI691 +aI-1 +aI784 +aI-26 +aI738 +aI-11 +aa(lp12242 +g15 +aI534 +aI13 +aI644 +aI8 +aI591 +aI13 +aa(lp12243 +g10 +aa(lp12244 +g8 +aI951 +aI0 +aa(lp12245 +g10 +aa(lp12246 +g8 +aI951 +aI0 +aasVK +(lp12247 +(lp12248 +g8 +aI587 +aI-739 +aa(lp12249 +g15 +aI623 +aI-783 +aI602 +aI-756 +aI614 +aI-770 +aa(lp12250 +g15 +aI646 +aI-818 +aI633 +aI-796 +aI640 +aI-808 +aa(lp12251 +g15 +aI657 +aI-845 +aI651 +aI-828 +aI655 +aI-838 +aa(lp12252 +g15 +aI661 +aI-867 +aI660 +aI-853 +aI661 +aI-860 +aa(lp12253 +g15 +aI645 +aI-890 +aI661 +aI-878 +aI656 +aI-886 +aa(lp12254 +g15 +aI595 +aI-896 +aI634 +aI-894 +aI617 +aI-896 +aa(lp12255 +g20 +aI595 +aI-951 +aa(lp12256 +g20 +aI890 +aI-951 +aa(lp12257 +g20 +aI890 +aI-896 +aa(lp12258 +g15 +aI846 +aI-887 +aI875 +aI-896 +aI860 +aI-893 +aa(lp12259 +g15 +aI804 +aI-863 +aI832 +aI-882 +aI818 +aI-873 +aa(lp12260 +g15 +aI760 +aI-824 +aI790 +aI-852 +aI775 +aI-839 +aa(lp12261 +g15 +aI712 +aI-771 +aI745 +aI-808 +aI729 +aI-791 +aa(lp12262 +g20 +aI518 +aI-554 +aa(lp12263 +g20 +aI800 +aI-162 +aa(lp12264 +g15 +aI874 +aI-82 +aI825 +aI-127 +aI850 +aI-100 +aa(lp12265 +g15 +aI946 +aI-55 +aI897 +aI-64 +aI921 +aI-55 +aa(lp12266 +g20 +aI949 +aI-55 +aa(lp12267 +g20 +aI949 +aI0 +aa(lp12268 +g20 +aI934 +aI0 +aa(lp12269 +g15 +aI824 +aI-4 +aI890 +aI0 +aI853 +aI-1 +aa(lp12270 +g15 +aI752 +aI-23 +aI796 +aI-8 +aI772 +aI-14 +aa(lp12271 +g15 +aI701 +aI-60 +aI733 +aI-32 +aI716 +aI-45 +aa(lp12272 +g15 +aI654 +aI-119 +aI686 +aI-75 +aI671 +aI-95 +aa(lp12273 +g20 +aI425 +aI-448 +aa(lp12274 +g20 +aI311 +aI-356 +aa(lp12275 +g20 +aI311 +aI-151 +aa(lp12276 +g15 +aI320 +aI-101 +aI311 +aI-130 +aI314 +aI-113 +aa(lp12277 +g15 +aI344 +aI-72 +aI326 +aI-88 +aI334 +aI-78 +aa(lp12278 +g15 +aI378 +aI-58 +aI353 +aI-65 +aI365 +aI-60 +aa(lp12279 +g15 +aI421 +aI-55 +aI392 +aI-56 +aI406 +aI-55 +aa(lp12280 +g20 +aI438 +aI-55 +aa(lp12281 +g20 +aI438 +aI0 +aa(lp12282 +g20 +aI50 +aI0 +aa(lp12283 +g20 +aI50 +aI-55 +aa(lp12284 +g20 +aI67 +aI-55 +aa(lp12285 +g15 +aI109 +aI-58 +aI82 +aI-55 +aI96 +aI-56 +aa(lp12286 +g15 +aI144 +aI-70 +aI122 +aI-60 +aI134 +aI-64 +aa(lp12287 +g15 +aI168 +aI-97 +aI154 +aI-76 +aI162 +aI-85 +aa(lp12288 +g15 +aI177 +aI-144 +aI174 +aI-109 +aI177 +aI-125 +aa(lp12289 +g20 +aI177 +aI-804 +aa(lp12290 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp12291 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp12292 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp12293 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp12294 +g20 +aI50 +aI-895 +aa(lp12295 +g20 +aI50 +aI-951 +aa(lp12296 +g20 +aI438 +aI-951 +aa(lp12297 +g20 +aI438 +aI-895 +aa(lp12298 +g20 +aI421 +aI-895 +aa(lp12299 +g15 +aI378 +aI-892 +aI406 +aI-895 +aI392 +aI-894 +aa(lp12300 +g15 +aI344 +aI-878 +aI365 +aI-889 +aI353 +aI-885 +aa(lp12301 +g15 +aI320 +aI-849 +aI334 +aI-872 +aI326 +aI-862 +aa(lp12302 +g15 +aI311 +aI-799 +aI314 +aI-837 +aI311 +aI-820 +aa(lp12303 +g20 +aI311 +aI-423 +aa(lp12304 +g10 +aa(lp12305 +g8 +aI933 +aI0 +aa(lp12306 +g10 +aa(lp12307 +g8 +aI933 +aI0 +aasVO +(lp12308 +(lp12309 +g8 +aI913 +aI-476 +aa(lp12310 +g15 +aI886 +aI-276 +aI913 +aI-403 +aI904 +aI-336 +aa(lp12311 +g15 +aI805 +aI-121 +aI867 +aI-215 +aI840 +aI-164 +aa(lp12312 +g15 +aI673 +aI-21 +aI769 +aI-78 +aI725 +aI-45 +aa(lp12313 +g15 +aI494 +aI13 +aI621 +aI1 +aI562 +aI13 +aa(lp12314 +g15 +aI309 +aI-21 +aI424 +aI13 +aI362 +aI1 +aa(lp12315 +g15 +aI179 +aI-121 +aI257 +aI-45 +aI213 +aI-78 +aa(lp12316 +g15 +aI100 +aI-276 +aI144 +aI-164 +aI118 +aI-216 +aa(lp12317 +g15 +aI74 +aI-478 +aI83 +aI-337 +aI74 +aI-404 +aa(lp12318 +g15 +aI100 +aI-678 +aI74 +aI-551 +aI83 +aI-618 +aa(lp12319 +g15 +aI179 +aI-832 +aI118 +aI-739 +aI144 +aI-790 +aa(lp12320 +g15 +aI310 +aI-931 +aI213 +aI-875 +aI257 +aI-908 +aa(lp12321 +g15 +aI496 +aI-966 +aI363 +aI-954 +aI425 +aI-966 +aa(lp12322 +g15 +aI674 +aI-931 +aI563 +aI-966 +aI622 +aI-954 +aa(lp12323 +g15 +aI805 +aI-832 +aI726 +aI-908 +aI769 +aI-875 +aa(lp12324 +g15 +aI886 +aI-678 +aI840 +aI-789 +aI867 +aI-738 +aa(lp12325 +g15 +aI913 +aI-476 +aI904 +aI-618 +aI913 +aI-550 +aa(lp12326 +g10 +aa(lp12327 +g8 +aI222 +aI-476 +aa(lp12328 +g15 +aI237 +aI-300 +aI222 +aI-410 +aI227 +aI-351 +aa(lp12329 +g15 +aI284 +aI-168 +aI247 +aI-248 +aI262 +aI-204 +aa(lp12330 +g15 +aI368 +aI-86 +aI306 +aI-132 +aI334 +aI-105 +aa(lp12331 +g15 +aI494 +aI-58 +aI403 +aI-67 +aI445 +aI-58 +aa(lp12332 +g15 +aI620 +aI-86 +aI544 +aI-58 +aI586 +aI-67 +aa(lp12333 +g15 +aI704 +aI-168 +aI655 +aI-105 +aI683 +aI-132 +aa(lp12334 +g15 +aI751 +aI-300 +aI726 +aI-204 +aI741 +aI-248 +aa(lp12335 +g15 +aI765 +aI-476 +aI760 +aI-351 +aI765 +aI-410 +aa(lp12336 +g15 +aI751 +aI-653 +aI765 +aI-542 +aI760 +aI-601 +aa(lp12337 +g15 +aI704 +aI-784 +aI741 +aI-705 +aI726 +aI-749 +aa(lp12338 +g15 +aI621 +aI-866 +aI683 +aI-820 +aI655 +aI-847 +aa(lp12339 +g15 +aI496 +aI-894 +aI587 +aI-884 +aI545 +aI-894 +aa(lp12340 +g15 +aI369 +aI-866 +aI446 +aI-894 +aI404 +aI-884 +aa(lp12341 +g15 +aI284 +aI-784 +aI335 +aI-847 +aI306 +aI-820 +aa(lp12342 +g15 +aI237 +aI-653 +aI262 +aI-749 +aI247 +aI-705 +aa(lp12343 +g15 +aI222 +aI-476 +aI227 +aI-601 +aI222 +aI-542 +aa(lp12344 +g10 +aa(lp12345 +g8 +aI989 +aI0 +aa(lp12346 +g10 +aa(lp12347 +g8 +aI989 +aI0 +aasVS +(lp12348 +(lp12349 +g8 +aI329 +aI13 +aa(lp12350 +g15 +aI214 +aI0 +aI286 +aI13 +aI247 +aI8 +aa(lp12351 +g15 +aI131 +aI-38 +aI181 +aI-9 +aI153 +aI-22 +aa(lp12352 +g15 +aI80 +aI-97 +aI108 +aI-54 +aI92 +aI-74 +aa(lp12353 +g15 +aI63 +aI-174 +aI69 +aI-120 +aI63 +aI-146 +aa(lp12354 +g15 +aI88 +aI-239 +aI63 +aI-200 +aI72 +aI-222 +aa(lp12355 +g15 +aI160 +aI-263 +aI105 +aI-255 +aI129 +aI-263 +aa(lp12356 +g15 +aI172 +aI-183 +aI161 +aI-236 +aI165 +aI-209 +aa(lp12357 +g15 +aI205 +aI-116 +aI180 +aI-158 +aI190 +aI-135 +aa(lp12358 +g15 +aI259 +aI-69 +aI219 +aI-96 +aI237 +aI-80 +aa(lp12359 +g15 +aI339 +aI-51 +aI281 +aI-57 +aI308 +aI-51 +aa(lp12360 +g15 +aI480 +aI-94 +aI399 +aI-51 +aI446 +aI-66 +aa(lp12361 +g15 +aI530 +aI-219 +aI513 +aI-123 +aI530 +aI-165 +aa(lp12362 +g15 +aI520 +aI-284 +aI530 +aI-243 +aI527 +aI-265 +aa(lp12363 +g15 +aI485 +aI-335 +aI513 +aI-302 +aI501 +aI-319 +aa(lp12364 +g15 +aI422 +aI-381 +aI469 +aI-351 +aI448 +aI-366 +aa(lp12365 +g15 +aI324 +aI-427 +aI395 +aI-395 +aI363 +aI-411 +aa(lp12366 +g15 +aI216 +aI-481 +aI282 +aI-444 +aI246 +aI-462 +aa(lp12367 +g15 +aI139 +aI-546 +aI185 +aI-500 +aI159 +aI-522 +aa(lp12368 +g15 +aI93 +aI-625 +aI118 +aI-569 +aI103 +aI-596 +aa(lp12369 +g15 +aI78 +aI-723 +aI83 +aI-654 +aI78 +aI-687 +aa(lp12370 +g15 +aI100 +aI-825 +aI78 +aI-761 +aI86 +aI-795 +aa(lp12371 +g15 +aI161 +aI-901 +aI115 +aI-855 +aI135 +aI-880 +aa(lp12372 +g15 +aI253 +aI-948 +aI187 +aI-922 +aI218 +aI-937 +aa(lp12373 +g15 +aI370 +aI-965 +aI289 +aI-959 +aI328 +aI-965 +aa(lp12374 +g15 +aI476 +aI-952 +aI410 +aI-965 +aI445 +aI-960 +aa(lp12375 +g15 +aI554 +aI-919 +aI507 +aI-944 +aI533 +aI-933 +aa(lp12376 +g15 +aI603 +aI-871 +aI575 +aI-905 +aI592 +aI-889 +aa(lp12377 +g15 +aI619 +aI-815 +aI614 +aI-853 +aI619 +aI-834 +aa(lp12378 +g15 +aI591 +aI-750 +aI619 +aI-786 +aI610 +aI-765 +aa(lp12379 +g15 +aI514 +aI-728 +aI572 +aI-735 +aI547 +aI-728 +aa(lp12380 +g15 +aI507 +aI-790 +aI514 +aI-749 +aI512 +aI-770 +aa(lp12381 +g15 +aI482 +aI-844 +aI502 +aI-810 +aI494 +aI-828 +aa(lp12382 +g15 +aI436 +aI-883 +aI470 +aI-860 +aI455 +aI-873 +aa(lp12383 +g15 +aI365 +aI-897 +aI417 +aI-892 +aI393 +aI-897 +aa(lp12384 +g15 +aI296 +aI-887 +aI339 +aI-897 +aI316 +aI-894 +aa(lp12385 +g15 +aI245 +aI-856 +aI276 +aI-880 +aI259 +aI-869 +aa(lp12386 +g15 +aI213 +aI-808 +aI231 +aI-843 +aI220 +aI-827 +aa(lp12387 +g15 +aI202 +aI-746 +aI206 +aI-790 +aI202 +aI-769 +aa(lp12388 +g15 +aI212 +aI-676 +aI202 +aI-719 +aI205 +aI-696 +aa(lp12389 +g15 +aI247 +aI-621 +aI219 +aI-656 +aI231 +aI-637 +aa(lp12390 +g15 +aI311 +aI-575 +aI263 +aI-605 +aI285 +aI-589 +aa(lp12391 +g15 +aI409 +aI-530 +aI338 +aI-560 +aI370 +aI-545 +aa(lp12392 +g15 +aI513 +aI-479 +aI448 +aI-514 +aI483 +aI-497 +aa(lp12393 +g15 +aI591 +aI-419 +aI544 +aI-461 +aI570 +aI-441 +aa(lp12394 +g15 +aI640 +aI-346 +aI613 +aI-397 +aI629 +aI-373 +aa(lp12395 +g15 +aI657 +aI-254 +aI651 +aI-319 +aI657 +aI-288 +aa(lp12396 +g15 +aI634 +aI-141 +aI657 +aI-212 +aI649 +aI-174 +aa(lp12397 +g15 +aI568 +aI-56 +aI619 +aI-107 +aI597 +aI-79 +aa(lp12398 +g15 +aI464 +aI-4 +aI539 +aI-33 +aI505 +aI-16 +aa(lp12399 +g15 +aI329 +aI13 +aI424 +aI7 +aI379 +aI13 +aa(lp12400 +g10 +aa(lp12401 +g8 +aI725 +aI0 +aa(lp12402 +g10 +aa(lp12403 +g8 +aI725 +aI0 +aasVW +(lp12404 +(lp12405 +g8 +aI768 +aI-942 +aa(lp12406 +g20 +aI934 +aI-364 +aa(lp12407 +g15 +aI968 +aI-237 +aI947 +aI-320 +aI958 +aI-278 +aa(lp12408 +g15 +aI992 +aI-130 +aI978 +aI-196 +aI986 +aI-161 +aa(lp12409 +g15 +aI1014 +aI-231 +aI998 +aI-162 +aI1006 +aI-196 +aa(lp12410 +g15 +aI1045 +aI-349 +aI1023 +aI-267 +aI1033 +aI-306 +aa(lp12411 +g20 +aI1162 +aI-760 +aa(lp12412 +g15 +aI1167 +aI-778 +aI1164 +aI-765 +aI1165 +aI-771 +aa(lp12413 +g15 +aI1171 +aI-797 +aI1169 +aI-784 +aI1170 +aI-791 +aa(lp12414 +g15 +aI1175 +aI-815 +aI1173 +aI-804 +aI1174 +aI-810 +aa(lp12415 +g15 +aI1177 +aI-830 +aI1176 +aI-821 +aI1177 +aI-826 +aa(lp12416 +g15 +aI1155 +aI-880 +aI1177 +aI-853 +aI1169 +aI-869 +aa(lp12417 +g15 +aI1089 +aI-895 +aI1140 +aI-890 +aI1118 +aI-895 +aa(lp12418 +g20 +aI1058 +aI-895 +aa(lp12419 +g20 +aI1058 +aI-951 +aa(lp12420 +g20 +aI1384 +aI-951 +aa(lp12421 +g20 +aI1384 +aI-895 +aa(lp12422 +g20 +aI1358 +aI-895 +aa(lp12423 +g15 +aI1324 +aI-891 +aI1345 +aI-895 +aI1334 +aI-894 +aa(lp12424 +g15 +aI1298 +aI-876 +aI1314 +aI-888 +aI1305 +aI-883 +aa(lp12425 +g15 +aI1276 +aI-845 +aI1290 +aI-869 +aI1283 +aI-858 +aa(lp12426 +g15 +aI1257 +aI-791 +aI1270 +aI-831 +aI1263 +aI-814 +aa(lp12427 +g20 +aI1031 +aI0 +aa(lp12428 +g20 +aI912 +aI0 +aa(lp12429 +g20 +aI694 +aI-746 +aa(lp12430 +g20 +aI490 +aI0 +aa(lp12431 +g20 +aI367 +aI0 +aa(lp12432 +g20 +aI123 +aI-825 +aa(lp12433 +g15 +aI109 +aI-859 +aI119 +aI-838 +aI114 +aI-850 +aa(lp12434 +g15 +aI89 +aI-881 +aI103 +aI-868 +aI97 +aI-875 +aa(lp12435 +g15 +aI63 +aI-892 +aI82 +aI-886 +aI73 +aI-889 +aa(lp12436 +g15 +aI29 +aI-895 +aI53 +aI-894 +aI42 +aI-895 +aa(lp12437 +g20 +aI11 +aI-895 +aa(lp12438 +g20 +aI11 +aI-951 +aa(lp12439 +g20 +aI378 +aI-951 +aa(lp12440 +g20 +aI378 +aI-895 +aa(lp12441 +g20 +aI348 +aI-895 +aa(lp12442 +g15 +aI288 +aI-880 +aI321 +aI-895 +aI301 +aI-890 +aa(lp12443 +g15 +aI268 +aI-831 +aI274 +aI-869 +aI268 +aI-853 +aa(lp12444 +g15 +aI271 +aI-808 +aI268 +aI-824 +aI269 +aI-816 +aa(lp12445 +g15 +aI278 +aI-782 +aI273 +aI-800 +aI276 +aI-792 +aa(lp12446 +g20 +aI401 +aI-355 +aa(lp12447 +g15 +aI432 +aI-236 +aI412 +aI-315 +aI422 +aI-275 +aa(lp12448 +g15 +aI458 +aI-130 +aI442 +aI-198 +aI451 +aI-162 +aa(lp12449 +g15 +aI482 +aI-244 +aI465 +aI-165 +aI473 +aI-202 +aa(lp12450 +g15 +aI513 +aI-369 +aI490 +aI-285 +aI501 +aI-327 +aa(lp12451 +g20 +aI671 +aI-942 +aa(lp12452 +g10 +aa(lp12453 +g8 +aI1395 +aI0 +aa(lp12454 +g10 +aa(lp12455 +g8 +aI1395 +aI0 +aasV[ +(lp12456 +(lp12457 +g8 +aI133 +aI171 +aa(lp12458 +g20 +aI133 +aI-1012 +aa(lp12459 +g20 +aI430 +aI-1012 +aa(lp12460 +g20 +aI430 +aI-956 +aa(lp12461 +g20 +aI373 +aI-956 +aa(lp12462 +g15 +aI331 +aI-953 +aI358 +aI-956 +aI344 +aI-955 +aa(lp12463 +g15 +aI296 +aI-939 +aI317 +aI-951 +aI306 +aI-946 +aa(lp12464 +g15 +aI272 +aI-911 +aI286 +aI-933 +aI278 +aI-923 +aa(lp12465 +g15 +aI264 +aI-860 +aI267 +aI-898 +aI264 +aI-881 +aa(lp12466 +g20 +aI264 +aI19 +aa(lp12467 +g15 +aI272 +aI69 +aI264 +aI40 +aI267 +aI56 +aa(lp12468 +g15 +aI296 +aI98 +aI278 +aI82 +aI286 +aI91 +aa(lp12469 +g15 +aI331 +aI111 +aI306 +aI105 +aI317 +aI109 +aa(lp12470 +g15 +aI373 +aI115 +aI344 +aI113 +aI358 +aI115 +aa(lp12471 +g20 +aI430 +aI115 +aa(lp12472 +g20 +aI430 +aI171 +aa(lp12473 +g10 +aa(lp12474 +g8 +aI478 +aI0 +aa(lp12475 +g10 +aa(lp12476 +g8 +aI478 +aI0 +aasV_ +(lp12477 +(lp12478 +g8 +aI618 +aI189 +aa(lp12479 +g20 +aI-6 +aI189 +aa(lp12480 +g20 +aI-6 +aI111 +aa(lp12481 +g20 +aI618 +aI111 +aa(lp12482 +g10 +aa(lp12483 +g8 +aI611 +aI0 +aa(lp12484 +g10 +aa(lp12485 +g8 +aI611 +aI0 +aasVc +(lp12486 +(lp12487 +g8 +aI377 +aI13 +aa(lp12488 +g15 +aI255 +aI-7 +aI333 +aI13 +aI292 +aI6 +aa(lp12489 +g15 +aI158 +aI-71 +aI217 +aI-20 +aI185 +aI-42 +aa(lp12490 +g15 +aI96 +aI-185 +aI131 +aI-101 +aI111 +aI-139 +aa(lp12491 +g15 +aI73 +aI-353 +aI81 +aI-231 +aI73 +aI-287 +aa(lp12492 +g15 +aI96 +aI-531 +aI73 +aI-424 +aI81 +aI-483 +aa(lp12493 +g15 +aI158 +aI-647 +aI111 +aI-579 +aI131 +aI-618 +aa(lp12494 +g15 +aI252 +aI-709 +aI185 +aI-676 +aI216 +aI-697 +aa(lp12495 +g15 +aI370 +aI-727 +aI289 +aI-721 +aI328 +aI-727 +aa(lp12496 +g15 +aI453 +aI-719 +aI398 +aI-727 +aI425 +aI-724 +aa(lp12497 +g15 +aI527 +aI-694 +aI481 +aI-713 +aI505 +aI-705 +aa(lp12498 +g15 +aI582 +aI-651 +aI550 +aI-682 +aI568 +aI-668 +aa(lp12499 +g15 +aI602 +aI-591 +aI595 +aI-634 +aI602 +aI-614 +aa(lp12500 +g15 +aI572 +aI-526 +aI602 +aI-560 +aI592 +aI-538 +aa(lp12501 +g15 +aI483 +aI-507 +aI552 +aI-513 +aI523 +aI-507 +aa(lp12502 +g15 +aI478 +aI-566 +aI483 +aI-528 +aI481 +aI-547 +aa(lp12503 +g15 +aI460 +aI-615 +aI475 +aI-585 +aI469 +aI-601 +aa(lp12504 +g15 +aI426 +aI-648 +aI452 +aI-629 +aI440 +aI-640 +aa(lp12505 +g15 +aI370 +aI-661 +aI411 +aI-656 +aI393 +aI-661 +aa(lp12506 +g15 +aI301 +aI-646 +aI344 +aI-661 +aI321 +aI-656 +aa(lp12507 +g15 +aI248 +aI-597 +aI280 +aI-637 +aI262 +aI-620 +aa(lp12508 +g15 +aI214 +aI-502 +aI233 +aI-573 +aI222 +aI-542 +aa(lp12509 +g15 +aI202 +aI-354 +aI206 +aI-463 +aI202 +aI-413 +aa(lp12510 +g15 +aI249 +aI-142 +aI202 +aI-259 +aI218 +aI-189 +aa(lp12511 +g15 +aI404 +aI-73 +aI281 +aI-96 +aI332 +aI-73 +aa(lp12512 +g15 +aI512 +aI-99 +aI445 +aI-73 +aI481 +aI-81 +aa(lp12513 +g15 +aI581 +aI-166 +aI543 +aI-116 +aI566 +aI-138 +aa(lp12514 +g15 +aI597 +aI-145 +aI587 +aI-161 +aI593 +aI-154 +aa(lp12515 +g15 +aI604 +aI-114 +aI601 +aI-136 +aI604 +aI-126 +aa(lp12516 +g15 +aI589 +aI-68 +aI604 +aI-98 +aI599 +aI-83 +aa(lp12517 +g15 +aI547 +aI-27 +aI580 +aI-53 +aI566 +aI-39 +aa(lp12518 +g15 +aI476 +aI2 +aI528 +aI-15 +aI504 +aI-5 +aa(lp12519 +g15 +aI377 +aI13 +aI448 +aI9 +aI415 +aI13 +aa(lp12520 +g10 +aa(lp12521 +g8 +aI656 +aI0 +aa(lp12522 +g10 +aa(lp12523 +g8 +aI656 +aI0 +aasVg +(lp12524 +(lp12525 +g8 +aI701 +aI-686 +aa(lp12526 +g15 +aI696 +aI-659 +aI701 +aI-676 +aI699 +aI-667 +aa(lp12527 +g15 +aI684 +aI-637 +aI694 +aI-650 +aI689 +aI-643 +aa(lp12528 +g15 +aI662 +aI-622 +aI678 +aI-630 +aI671 +aI-625 +aa(lp12529 +g15 +aI630 +aI-616 +aI653 +aI-618 +aI643 +aI-616 +aa(lp12530 +g15 +aI628 +aI-632 +aI630 +aI-621 +aI630 +aI-627 +aa(lp12531 +g15 +aI622 +aI-647 +aI627 +aI-637 +aI625 +aI-642 +aa(lp12532 +g15 +aI608 +aI-658 +aI618 +aI-651 +aI614 +aI-655 +aa(lp12533 +g15 +aI586 +aI-662 +aI603 +aI-660 +aI595 +aI-662 +aa(lp12534 +g15 +aI555 +aI-658 +aI575 +aI-662 +aI565 +aI-661 +aa(lp12535 +g15 +aI529 +aI-646 +aI546 +aI-655 +aI537 +aI-651 +aa(lp12536 +g15 +aI566 +aI-579 +aI544 +aI-627 +aI556 +aI-605 +aa(lp12537 +g15 +aI581 +aI-484 +aI576 +aI-554 +aI581 +aI-522 +aa(lp12538 +g15 +aI566 +aI-393 +aI581 +aI-451 +aI576 +aI-421 +aa(lp12539 +g15 +aI521 +aI-320 +aI556 +aI-365 +aI541 +aI-340 +aa(lp12540 +g15 +aI446 +aI-272 +aI502 +aI-300 +aI477 +aI-284 +aa(lp12541 +g15 +aI341 +aI-255 +aI416 +aI-261 +aI381 +aI-255 +aa(lp12542 +g15 +aI323 +aI-255 +aI335 +aI-255 +aI330 +aI-255 +aa(lp12543 +g15 +aI304 +aI-256 +aI317 +aI-255 +aI310 +aI-256 +aa(lp12544 +g15 +aI285 +aI-257 +aI297 +aI-256 +aI291 +aI-257 +aa(lp12545 +g15 +aI272 +aI-259 +aI280 +aI-258 +aI275 +aI-258 +aa(lp12546 +g15 +aI247 +aI-244 +aI263 +aI-254 +aI255 +aI-250 +aa(lp12547 +g15 +aI226 +aI-227 +aI239 +aI-239 +aI232 +aI-233 +aa(lp12548 +g15 +aI212 +aI-205 +aI221 +aI-220 +aI216 +aI-213 +aa(lp12549 +g15 +aI207 +aI-177 +aI209 +aI-197 +aI207 +aI-187 +aa(lp12550 +g15 +aI213 +aI-151 +aI207 +aI-167 +aI209 +aI-158 +aa(lp12551 +g15 +aI231 +aI-136 +aI217 +aI-145 +aI223 +aI-140 +aa(lp12552 +g15 +aI257 +aI-129 +aI238 +aI-132 +aI247 +aI-130 +aa(lp12553 +g15 +aI290 +aI-127 +aI267 +aI-128 +aI278 +aI-127 +aa(lp12554 +g20 +aI441 +aI-127 +aa(lp12555 +g15 +aI542 +aI-112 +aI481 +aI-127 +aI515 +aI-122 +aa(lp12556 +g15 +aI611 +aI-71 +aI570 +aI-102 +aI593 +aI-89 +aa(lp12557 +g15 +aI649 +aI-8 +aI628 +aI-53 +aI641 +aI-32 +aa(lp12558 +g15 +aI661 +aI71 +aI657 +aI16 +aI661 +aI42 +aa(lp12559 +g15 +aI640 +aI174 +aI661 +aI109 +aI654 +aI144 +aa(lp12560 +g15 +aI575 +aI253 +aI626 +aI205 +aI604 +aI231 +aa(lp12561 +g15 +aI465 +aI303 +aI546 +aI274 +aI509 +aI291 +aa(lp12562 +g15 +aI307 +aI320 +aI420 +aI314 +aI368 +aI320 +aa(lp12563 +g15 +aI99 +aI269 +aI215 +aI320 +aI145 +aI303 +aa(lp12564 +g15 +aI30 +aI126 +aI53 +aI235 +aI30 +aI187 +aa(lp12565 +g15 +aI44 +aI57 +aI30 +aI100 +aI35 +aI77 +aa(lp12566 +g15 +aI81 +aI7 +aI53 +aI38 +aI65 +aI21 +aa(lp12567 +g15 +aI134 +aI-26 +aI96 +aI-6 +aI114 +aI-17 +aa(lp12568 +g15 +aI197 +aI-45 +aI154 +aI-34 +aI175 +aI-41 +aa(lp12569 +g15 +aI170 +aI-60 +aI188 +aI-49 +aI179 +aI-54 +aa(lp12570 +g15 +aI147 +aI-84 +aI161 +aI-67 +aI154 +aI-75 +aa(lp12571 +g15 +aI130 +aI-115 +aI140 +aI-93 +aI134 +aI-103 +aa(lp12572 +g15 +aI123 +aI-154 +aI125 +aI-127 +aI123 +aI-140 +aa(lp12573 +g15 +aI144 +aI-223 +aI123 +aI-180 +aI130 +aI-203 +aa(lp12574 +g15 +aI210 +aI-279 +aI158 +aI-242 +aI180 +aI-261 +aa(lp12575 +g15 +aI159 +aI-311 +aI191 +aI-287 +aI174 +aI-298 +aa(lp12576 +g15 +aI122 +aI-358 +aI144 +aI-325 +aI132 +aI-341 +aa(lp12577 +g15 +aI98 +aI-416 +aI111 +aI-376 +aI104 +aI-395 +aa(lp12578 +g15 +aI90 +aI-480 +aI93 +aI-437 +aI90 +aI-458 +aa(lp12579 +g15 +aI106 +aI-584 +aI90 +aI-519 +aI95 +aI-553 +aa(lp12580 +g15 +aI152 +aI-661 +aI116 +aI-614 +aI132 +aI-640 +aa(lp12581 +g15 +aI231 +aI-710 +aI173 +aI-682 +aI199 +aI-699 +aa(lp12582 +g15 +aI341 +aI-727 +aI262 +aI-721 +aI299 +aI-727 +aa(lp12583 +g15 +aI388 +aI-723 +aI357 +aI-727 +aI373 +aI-726 +aa(lp12584 +g15 +aI431 +aI-714 +aI404 +aI-721 +aI418 +aI-718 +aa(lp12585 +g15 +aI467 +aI-700 +aI445 +aI-709 +aI457 +aI-705 +aa(lp12586 +g15 +aI493 +aI-683 +aI478 +aI-694 +aI486 +aI-689 +aa(lp12587 +g15 +aI516 +aI-706 +aI500 +aI-690 +aI507 +aI-698 +aa(lp12588 +g15 +aI545 +aI-730 +aI524 +aI-715 +aI534 +aI-723 +aa(lp12589 +g15 +aI581 +aI-748 +aI556 +aI-737 +aI568 +aI-743 +aa(lp12590 +g15 +aI622 +aI-755 +aI593 +aI-753 +aI607 +aI-755 +aa(lp12591 +g15 +aI657 +aI-749 +aI635 +aI-755 +aI647 +aI-753 +aa(lp12592 +g15 +aI681 +aI-734 +aI666 +aI-746 +aI675 +aI-741 +aa(lp12593 +g15 +aI696 +aI-712 +aI688 +aI-728 +aI693 +aI-721 +aa(lp12594 +g15 +aI701 +aI-686 +aI699 +aI-704 +aI701 +aI-695 +aa(lp12595 +g10 +aa(lp12596 +g8 +aI138 +aI117 +aa(lp12597 +g15 +aI146 +aI172 +aI138 +aI137 +aI141 +aI155 +aa(lp12598 +g15 +aI173 +aI215 +aI151 +aI189 +aI160 +aI203 +aa(lp12599 +g15 +aI226 +aI244 +aI186 +aI228 +aI204 +aI237 +aa(lp12600 +g15 +aI310 +aI255 +aI248 +aI251 +aI276 +aI255 +aa(lp12601 +g15 +aI428 +aI242 +aI358 +aI255 +aI397 +aI250 +aa(lp12602 +g15 +aI502 +aI209 +aI459 +aI234 +aI484 +aI223 +aa(lp12603 +g15 +aI541 +aI158 +aI520 +aI195 +aI533 +aI178 +aa(lp12604 +g15 +aI552 +aI93 +aI548 +aI138 +aI552 +aI116 +aa(lp12605 +g15 +aI543 +aI43 +aI552 +aI73 +aI549 +aI56 +aa(lp12606 +g15 +aI517 +aI11 +aI537 +aI29 +aI528 +aI19 +aa(lp12607 +g15 +aI474 +aI-4 +aI505 +aI4 +aI491 +aI-1 +aa(lp12608 +g15 +aI416 +aI-8 +aI457 +aI-7 +aI438 +aI-8 +aa(lp12609 +g20 +aI285 +aI-8 +aa(lp12610 +g15 +aI230 +aI-3 +aI266 +aI-8 +aI248 +aI-7 +aa(lp12611 +g15 +aI183 +aI14 +aI213 +aI0 +aI197 +aI5 +aa(lp12612 +g15 +aI151 +aI53 +aI170 +aI23 +aI159 +aI36 +aa(lp12613 +g15 +aI138 +aI117 +aI142 +aI69 +aI138 +aI91 +aa(lp12614 +g10 +aa(lp12615 +g8 +aI216 +aI-484 +aa(lp12616 +g15 +aI244 +aI-359 +aI216 +aI-427 +aI225 +aI-386 +aa(lp12617 +g15 +aI337 +aI-319 +aI263 +aI-333 +aI294 +aI-319 +aa(lp12618 +g15 +aI392 +aI-329 +aI358 +aI-319 +aI377 +aI-323 +aa(lp12619 +g15 +aI429 +aI-359 +aI407 +aI-336 +aI419 +aI-346 +aa(lp12620 +g15 +aI449 +aI-411 +aI438 +aI-373 +aI445 +aI-390 +aa(lp12621 +g15 +aI455 +aI-486 +aI453 +aI-432 +aI455 +aI-457 +aa(lp12622 +g15 +aI428 +aI-619 +aI455 +aI-546 +aI446 +aI-590 +aa(lp12623 +g15 +aI335 +aI-662 +aI410 +aI-647 +aI379 +aI-662 +aa(lp12624 +g15 +aI243 +aI-618 +aI292 +aI-662 +aI262 +aI-647 +aa(lp12625 +g15 +aI216 +aI-484 +aI225 +aI-589 +aI216 +aI-544 +aa(lp12626 +g10 +aa(lp12627 +g8 +aI717 +aI0 +aa(lp12628 +g10 +aa(lp12629 +g8 +aI717 +aI0 +aasVk +(lp12630 +(lp12631 +g8 +aI451 +aI-428 +aa(lp12632 +g20 +aI629 +aI-164 +aa(lp12633 +g15 +aI698 +aI-83 +aI652 +aI-129 +aI675 +aI-102 +aa(lp12634 +g15 +aI777 +aI-55 +aI721 +aI-64 +aI747 +aI-55 +aa(lp12635 +g20 +aI781 +aI-55 +aa(lp12636 +g20 +aI781 +aI0 +aa(lp12637 +g20 +aI762 +aI0 +aa(lp12638 +g15 +aI666 +aI-3 +aI723 +aI0 +aI691 +aI0 +aa(lp12639 +g15 +aI602 +aI-20 +aI642 +aI-5 +aI620 +aI-11 +aa(lp12640 +g15 +aI552 +aI-59 +aI583 +aI-28 +aI567 +aI-41 +aa(lp12641 +g15 +aI501 +aI-129 +aI536 +aI-76 +aI519 +aI-99 +aa(lp12642 +g20 +aI367 +aI-338 +aa(lp12643 +g20 +aI269 +aI-265 +aa(lp12644 +g20 +aI269 +aI-144 +aa(lp12645 +g15 +aI278 +aI-97 +aI269 +aI-125 +aI272 +aI-109 +aa(lp12646 +g15 +aI302 +aI-70 +aI284 +aI-85 +aI292 +aI-76 +aa(lp12647 +g15 +aI336 +aI-58 +aI312 +aI-64 +aI323 +aI-60 +aa(lp12648 +g15 +aI378 +aI-55 +aI350 +aI-56 +aI364 +aI-55 +aa(lp12649 +g20 +aI382 +aI-55 +aa(lp12650 +g20 +aI382 +aI0 +aa(lp12651 +g20 +aI24 +aI0 +aa(lp12652 +g20 +aI24 +aI-55 +aa(lp12653 +g20 +aI34 +aI-55 +aa(lp12654 +g15 +aI77 +aI-58 +aI49 +aI-55 +aI63 +aI-56 +aa(lp12655 +g15 +aI111 +aI-72 +aI90 +aI-60 +aI101 +aI-65 +aa(lp12656 +g15 +aI135 +aI-101 +aI121 +aI-78 +aI129 +aI-88 +aa(lp12657 +g15 +aI143 +aI-151 +aI140 +aI-113 +aI143 +aI-130 +aa(lp12658 +g20 +aI143 +aI-866 +aa(lp12659 +g15 +aI135 +aI-913 +aI143 +aI-885 +aI140 +aI-901 +aa(lp12660 +g15 +aI111 +aI-940 +aI129 +aI-925 +aI121 +aI-934 +aa(lp12661 +g15 +aI76 +aI-953 +aI101 +aI-947 +aI89 +aI-951 +aa(lp12662 +g15 +aI34 +aI-956 +aI63 +aI-955 +aI49 +aI-956 +aa(lp12663 +g20 +aI24 +aI-956 +aa(lp12664 +g20 +aI24 +aI-1012 +aa(lp12665 +g20 +aI269 +aI-1012 +aa(lp12666 +g20 +aI269 +aI-498 +aa(lp12667 +g15 +aI268 +aI-451 +aI269 +aI-486 +aI269 +aI-470 +aa(lp12668 +g15 +aI266 +aI-396 +aI268 +aI-432 +aI267 +aI-414 +aa(lp12669 +g15 +aI264 +aI-330 +aI266 +aI-375 +aI265 +aI-353 +aa(lp12670 +g20 +aI430 +aI-512 +aa(lp12671 +g15 +aI466 +aI-554 +aI445 +aI-528 +aI457 +aI-542 +aa(lp12672 +g15 +aI488 +aI-586 +aI475 +aI-567 +aI483 +aI-577 +aa(lp12673 +g15 +aI500 +aI-611 +aI494 +aI-595 +aI498 +aI-604 +aa(lp12674 +g15 +aI503 +aI-631 +aI502 +aI-618 +aI503 +aI-625 +aa(lp12675 +g15 +aI487 +aI-653 +aI503 +aI-642 +aI498 +aI-650 +aa(lp12676 +g15 +aI438 +aI-658 +aI477 +aI-656 +aI460 +aI-658 +aa(lp12677 +g20 +aI438 +aI-714 +aa(lp12678 +g20 +aI733 +aI-714 +aa(lp12679 +g20 +aI733 +aI-658 +aa(lp12680 +g15 +aI642 +aI-625 +aI702 +aI-658 +aI671 +aI-647 +aa(lp12681 +g15 +aI545 +aI-534 +aI612 +aI-604 +aI580 +aI-573 +aa(lp12682 +g10 +aa(lp12683 +g8 +aI779 +aI0 +aa(lp12684 +g10 +aa(lp12685 +g8 +aI779 +aI0 +aasVo +(lp12686 +(lp12687 +g8 +aI695 +aI-358 +aa(lp12688 +g15 +aI616 +aI-78 +aI695 +aI-232 +aI669 +aI-139 +aa(lp12689 +g15 +aI382 +aI13 +aI563 +aI-17 +aI485 +aI13 +aa(lp12690 +g15 +aI253 +aI-9 +aI334 +aI13 +aI291 +aI5 +aa(lp12691 +g15 +aI155 +aI-78 +aI215 +aI-24 +aI182 +aI-47 +aa(lp12692 +g15 +aI94 +aI-194 +aI129 +aI-109 +aI108 +aI-147 +aa(lp12693 +g15 +aI73 +aI-358 +aI80 +aI-241 +aI73 +aI-295 +aa(lp12694 +g15 +aI152 +aI-636 +aI73 +aI-482 +aI99 +aI-575 +aa(lp12695 +g15 +aI386 +aI-727 +aI205 +aI-697 +aI283 +aI-727 +aa(lp12696 +g15 +aI516 +aI-704 +aI434 +aI-727 +aI478 +aI-719 +aa(lp12697 +g15 +aI613 +aI-636 +aI554 +aI-689 +aI586 +aI-667 +aa(lp12698 +g15 +aI674 +aI-521 +aI640 +aI-605 +aI660 +aI-567 +aa(lp12699 +g15 +aI695 +aI-358 +aI688 +aI-475 +aI695 +aI-420 +aa(lp12700 +g10 +aa(lp12701 +g8 +aI202 +aI-358 +aa(lp12702 +g15 +aI212 +aI-227 +aI202 +aI-308 +aI205 +aI-265 +aa(lp12703 +g15 +aI243 +aI-132 +aI218 +aI-189 +aI229 +aI-158 +aa(lp12704 +g15 +aI300 +aI-75 +aI258 +aI-107 +aI277 +aI-88 +aa(lp12705 +g15 +aI385 +aI-55 +aI323 +aI-62 +aI351 +aI-55 +aa(lp12706 +g15 +aI470 +aI-75 +aI418 +aI-55 +aI447 +aI-62 +aa(lp12707 +g15 +aI526 +aI-132 +aI493 +aI-88 +aI511 +aI-107 +aa(lp12708 +g15 +aI556 +aI-227 +aI540 +aI-158 +aI550 +aI-189 +aa(lp12709 +g15 +aI566 +aI-358 +aI563 +aI-265 +aI566 +aI-308 +aa(lp12710 +g15 +aI556 +aI-488 +aI566 +aI-407 +aI563 +aI-451 +aa(lp12711 +g15 +aI525 +aI-581 +aI550 +aI-525 +aI539 +aI-556 +aa(lp12712 +g15 +aI469 +aI-638 +aI511 +aI-606 +aI492 +aI-625 +aa(lp12713 +g15 +aI384 +aI-657 +aI445 +aI-650 +aI417 +aI-657 +aa(lp12714 +g15 +aI299 +aI-638 +aI350 +aI-657 +aI322 +aI-650 +aa(lp12715 +g15 +aI243 +aI-581 +aI276 +aI-625 +aI257 +aI-606 +aa(lp12716 +g15 +aI212 +aI-488 +aI229 +aI-556 +aI218 +aI-525 +aa(lp12717 +g15 +aI202 +aI-358 +aI205 +aI-451 +aI202 +aI-407 +aa(lp12718 +g10 +aa(lp12719 +g8 +aI769 +aI0 +aa(lp12720 +g10 +aa(lp12721 +g8 +aI769 +aI0 +aasVs +(lp12722 +(lp12723 +g8 +aI279 +aI13 +aa(lp12724 +g15 +aI189 +aI4 +aI246 +aI13 +aI216 +aI10 +aa(lp12725 +g15 +aI119 +aI-22 +aI162 +aI-1 +aI138 +aI-10 +aa(lp12726 +g15 +aI75 +aI-66 +aI100 +aI-33 +aI85 +aI-48 +aa(lp12727 +g15 +aI59 +aI-127 +aI65 +aI-83 +aI59 +aI-104 +aa(lp12728 +g15 +aI68 +aI-172 +aI59 +aI-145 +aI62 +aI-160 +aa(lp12729 +g15 +aI90 +aI-200 +aI74 +aI-184 +aI81 +aI-193 +aa(lp12730 +g15 +aI117 +aI-215 +aI98 +aI-207 +aI107 +aI-212 +aa(lp12731 +g15 +aI143 +aI-219 +aI127 +aI-218 +aI136 +aI-219 +aa(lp12732 +g15 +aI151 +aI-153 +aI143 +aI-196 +aI146 +aI-174 +aa(lp12733 +g15 +aI175 +aI-100 +aI155 +aI-133 +aI163 +aI-115 +aa(lp12734 +g15 +aI219 +aI-63 +aI186 +aI-84 +aI201 +aI-72 +aa(lp12735 +g15 +aI287 +aI-50 +aI238 +aI-54 +aI260 +aI-50 +aa(lp12736 +g15 +aI350 +aI-59 +aI311 +aI-50 +aI332 +aI-53 +aa(lp12737 +g15 +aI396 +aI-83 +aI369 +aI-64 +aI384 +aI-73 +aa(lp12738 +g15 +aI425 +aI-122 +aI409 +aI-94 +aI418 +aI-107 +aa(lp12739 +g15 +aI434 +aI-171 +aI431 +aI-137 +aI434 +aI-153 +aa(lp12740 +g15 +aI427 +aI-214 +aI434 +aI-187 +aI432 +aI-202 +aa(lp12741 +g15 +aI401 +aI-247 +aI422 +aI-226 +aI413 +aI-237 +aa(lp12742 +g15 +aI350 +aI-279 +aI388 +aI-258 +aI372 +aI-268 +aa(lp12743 +g15 +aI270 +aI-316 +aI329 +aI-290 +aI302 +aI-302 +aa(lp12744 +g15 +aI181 +aI-360 +aI236 +aI-331 +aI206 +aI-346 +aa(lp12745 +g15 +aI118 +aI-406 +aI155 +aI-374 +aI134 +aI-389 +aa(lp12746 +g15 +aI81 +aI-462 +aI101 +aI-422 +aI89 +aI-441 +aa(lp12747 +g15 +aI69 +aI-537 +aI73 +aI-483 +aI69 +aI-508 +aa(lp12748 +g15 +aI86 +aI-618 +aI69 +aI-568 +aI74 +aI-595 +aa(lp12749 +g15 +aI138 +aI-677 +aI98 +aI-642 +aI115 +aI-661 +aa(lp12750 +g15 +aI217 +aI-713 +aI160 +aI-693 +aI186 +aI-705 +aa(lp12751 +g15 +aI320 +aI-726 +aI248 +aI-721 +aI282 +aI-726 +aa(lp12752 +g15 +aI404 +aI-716 +aI351 +aI-726 +aI379 +aI-722 +aa(lp12753 +g15 +aI465 +aI-689 +aI428 +aI-709 +aI449 +aI-701 +aa(lp12754 +g15 +aI502 +aI-650 +aI481 +aI-678 +aI494 +aI-665 +aa(lp12755 +g15 +aI514 +aI-603 +aI510 +aI-635 +aI514 +aI-620 +aa(lp12756 +g15 +aI489 +aI-545 +aI514 +aI-579 +aI506 +aI-559 +aa(lp12757 +g15 +aI418 +aI-523 +aI473 +aI-530 +aI449 +aI-523 +aa(lp12758 +g15 +aI390 +aI-627 +aI418 +aI-568 +aI409 +aI-603 +aa(lp12759 +g15 +aI304 +aI-664 +aI372 +aI-652 +aI343 +aI-664 +aa(lp12760 +g15 +aI246 +aI-657 +aI281 +aI-664 +aI262 +aI-662 +aa(lp12761 +g15 +aI206 +aI-634 +aI230 +aI-651 +aI216 +aI-644 +aa(lp12762 +g15 +aI184 +aI-601 +aI196 +aI-625 +aI189 +aI-614 +aa(lp12763 +g15 +aI177 +aI-558 +aI179 +aI-588 +aI177 +aI-573 +aa(lp12764 +g15 +aI186 +aI-514 +aI177 +aI-541 +aI180 +aI-526 +aa(lp12765 +g15 +aI215 +aI-480 +aI192 +aI-501 +aI201 +aI-490 +aa(lp12766 +g15 +aI266 +aI-449 +aI228 +aI-469 +aI245 +aI-459 +aa(lp12767 +g15 +aI342 +aI-416 +aI287 +aI-439 +aI312 +aI-429 +aa(lp12768 +g15 +aI432 +aI-373 +aI377 +aI-402 +aI407 +aI-387 +aa(lp12769 +g15 +aI495 +aI-326 +aI458 +aI-358 +aI478 +aI-343 +aa(lp12770 +g15 +aI531 +aI-269 +aI511 +aI-309 +aI523 +aI-290 +aa(lp12771 +g15 +aI542 +aI-195 +aI539 +aI-247 +aI542 +aI-223 +aa(lp12772 +g15 +aI524 +aI-104 +aI542 +aI-160 +aI536 +aI-130 +aa(lp12773 +g15 +aI470 +aI-38 +aI511 +aI-78 +aI493 +aI-56 +aa(lp12774 +g15 +aI387 +aI0 +aI447 +aI-21 +aI420 +aI-8 +aa(lp12775 +g15 +aI279 +aI13 +aI355 +aI9 +aI319 +aI13 +aa(lp12776 +g10 +aa(lp12777 +g8 +aI601 +aI0 +aa(lp12778 +g10 +aa(lp12779 +g8 +aI601 +aI0 +aasVw +(lp12780 +(lp12781 +g8 +aI634 +aI-710 +aa(lp12782 +g20 +aI768 +aI-315 +aa(lp12783 +g15 +aI784 +aI-263 +aI773 +aI-299 +aI778 +aI-281 +aa(lp12784 +g15 +aI801 +aI-208 +aI790 +aI-245 +aI796 +aI-226 +aa(lp12785 +g15 +aI815 +aI-157 +aI806 +aI-190 +aI811 +aI-173 +aa(lp12786 +g15 +aI825 +aI-116 +aI820 +aI-141 +aI823 +aI-128 +aa(lp12787 +g20 +aI829 +aI-116 +aa(lp12788 +g15 +aI848 +aI-198 +aI833 +aI-138 +aI839 +aI-166 +aa(lp12789 +g15 +aI881 +aI-311 +aI856 +aI-230 +aI868 +aI-268 +aa(lp12790 +g20 +aI947 +aI-526 +aa(lp12791 +g15 +aI956 +aI-562 +aI951 +aI-537 +aI954 +aI-549 +aa(lp12792 +g15 +aI960 +aI-592 +aI959 +aI-575 +aI960 +aI-585 +aa(lp12793 +g15 +aI938 +aI-642 +aI960 +aI-615 +aI953 +aI-632 +aa(lp12794 +g15 +aI871 +aI-658 +aI923 +aI-653 +aI901 +aI-658 +aa(lp12795 +g20 +aI862 +aI-658 +aa(lp12796 +g20 +aI862 +aI-714 +aa(lp12797 +g20 +aI1147 +aI-714 +aa(lp12798 +g20 +aI1147 +aI-658 +aa(lp12799 +g20 +aI1130 +aI-658 +aa(lp12800 +g15 +aI1097 +aI-654 +aI1117 +aI-658 +aI1106 +aI-657 +aa(lp12801 +g15 +aI1071 +aI-639 +aI1087 +aI-651 +aI1078 +aI-646 +aa(lp12802 +g15 +aI1050 +aI-607 +aI1063 +aI-631 +aI1056 +aI-621 +aa(lp12803 +g15 +aI1030 +aI-554 +aI1043 +aI-594 +aI1037 +aI-576 +aa(lp12804 +g20 +aI858 +aI0 +aa(lp12805 +g20 +aI751 +aI0 +aa(lp12806 +g20 +aI593 +aI-468 +aa(lp12807 +g20 +aI569 +aI-556 +aa(lp12808 +g20 +aI380 +aI0 +aa(lp12809 +g20 +aI274 +aI0 +aa(lp12810 +g20 +aI100 +aI-587 +aa(lp12811 +g15 +aI83 +aI-621 +aI95 +aI-601 +aI89 +aI-612 +aa(lp12812 +g15 +aI64 +aI-643 +aI78 +aI-631 +aI71 +aI-638 +aa(lp12813 +g15 +aI39 +aI-655 +aI57 +aI-649 +aI48 +aI-652 +aa(lp12814 +g15 +aI5 +aI-658 +aI29 +aI-657 +aI18 +aI-658 +aa(lp12815 +g20 +aI1 +aI-658 +aa(lp12816 +g20 +aI1 +aI-714 +aa(lp12817 +g20 +aI330 +aI-714 +aa(lp12818 +g20 +aI330 +aI-658 +aa(lp12819 +g20 +aI313 +aI-658 +aa(lp12820 +g15 +aI253 +aI-646 +aI286 +aI-658 +aI266 +aI-654 +aa(lp12821 +g15 +aI233 +aI-602 +aI239 +aI-638 +aI233 +aI-624 +aa(lp12822 +g15 +aI236 +aI-575 +aI233 +aI-595 +aI234 +aI-586 +aa(lp12823 +g15 +aI244 +aI-545 +aI239 +aI-565 +aI241 +aI-555 +aa(lp12824 +g20 +aI306 +aI-321 +aa(lp12825 +g15 +aI320 +aI-268 +aI310 +aI-305 +aI315 +aI-287 +aa(lp12826 +g15 +aI333 +aI-211 +aI325 +aI-249 +aI329 +aI-230 +aa(lp12827 +g15 +aI345 +aI-158 +aI337 +aI-192 +aI341 +aI-174 +aa(lp12828 +g15 +aI353 +aI-116 +aI348 +aI-141 +aI351 +aI-128 +aa(lp12829 +g20 +aI357 +aI-116 +aa(lp12830 +g15 +aI366 +aI-156 +aI359 +aI-128 +aI362 +aI-141 +aa(lp12831 +g15 +aI379 +aI-204 +aI369 +aI-171 +aI374 +aI-187 +aa(lp12832 +g15 +aI395 +aI-256 +aI384 +aI-221 +aI389 +aI-238 +aa(lp12833 +g15 +aI412 +aI-307 +aI400 +aI-274 +aI406 +aI-291 +aa(lp12834 +g20 +aI550 +aI-710 +aa(lp12835 +g10 +aa(lp12836 +g8 +aI1149 +aI0 +aa(lp12837 +g10 +aa(lp12838 +g8 +aI1149 +aI0 +aasV{ +(lp12839 +(lp12840 +g8 +aI416 +aI171 +aa(lp12841 +g15 +aI333 +aI157 +aI384 +aI171 +aI357 +aI166 +aa(lp12842 +g15 +aI272 +aI118 +aI308 +aI148 +aI288 +aI135 +aa(lp12843 +g15 +aI236 +aI58 +aI256 +aI102 +aI244 +aI82 +aa(lp12844 +g15 +aI223 +aI-21 +aI228 +aI35 +aI223 +aI8 +aa(lp12845 +g20 +aI223 +aI-252 +aa(lp12846 +g15 +aI211 +aI-320 +aI223 +aI-280 +aI219 +aI-302 +aa(lp12847 +g15 +aI178 +aI-363 +aI203 +aI-338 +aI192 +aI-352 +aa(lp12848 +g15 +aI128 +aI-385 +aI164 +aI-373 +aI147 +aI-381 +aa(lp12849 +g15 +aI66 +aI-394 +aI109 +aI-390 +aI88 +aI-393 +aa(lp12850 +g20 +aI66 +aI-450 +aa(lp12851 +g15 +aI128 +aI-457 +aI88 +aI-450 +aI109 +aI-453 +aa(lp12852 +g15 +aI178 +aI-480 +aI147 +aI-462 +aI164 +aI-469 +aa(lp12853 +g15 +aI211 +aI-522 +aI192 +aI-490 +aI203 +aI-505 +aa(lp12854 +g15 +aI223 +aI-590 +aI219 +aI-540 +aI223 +aI-563 +aa(lp12855 +g20 +aI223 +aI-822 +aa(lp12856 +g15 +aI272 +aI-963 +aI223 +aI-883 +aI240 +aI-930 +aa(lp12857 +g15 +aI416 +aI-1012 +aI304 +aI-996 +aI352 +aI-1012 +aa(lp12858 +g20 +aI503 +aI-1012 +aa(lp12859 +g20 +aI503 +aI-955 +aa(lp12860 +g20 +aI464 +aI-955 +aa(lp12861 +g15 +aI379 +aI-920 +aI424 +aI-955 +aI396 +aI-943 +aa(lp12862 +g15 +aI354 +aI-815 +aI363 +aI-896 +aI354 +aI-861 +aa(lp12863 +g20 +aI354 +aI-587 +aa(lp12864 +g15 +aI318 +aI-479 +aI354 +aI-544 +aI342 +aI-507 +aa(lp12865 +g15 +aI206 +aI-423 +aI293 +aI-450 +aI256 +aI-431 +aa(lp12866 +g20 +aI206 +aI-422 +aa(lp12867 +g15 +aI319 +aI-366 +aI257 +aI-413 +aI295 +aI-394 +aa(lp12868 +g15 +aI354 +aI-256 +aI342 +aI-337 +aI354 +aI-300 +aa(lp12869 +g20 +aI354 +aI-26 +aa(lp12870 +g15 +aI379 +aI77 +aI354 +aI19 +aI363 +aI54 +aa(lp12871 +g15 +aI464 +aI113 +aI396 +aI101 +aI424 +aI113 +aa(lp12872 +g20 +aI503 +aI113 +aa(lp12873 +g20 +aI503 +aI171 +aa(lp12874 +g10 +aa(lp12875 +g8 +aI570 +aI0 +aa(lp12876 +g10 +aa(lp12877 +g8 +aI570 +aI0 +aasV" +(lp12878 +(lp12879 +g8 +aI326 +aI-951 +aa(lp12880 +g20 +aI468 +aI-951 +aa(lp12881 +g20 +aI427 +aI-638 +aa(lp12882 +g20 +aI366 +aI-638 +aa(lp12883 +g10 +aa(lp12884 +g8 +aI76 +aI-951 +aa(lp12885 +g20 +aI217 +aI-951 +aa(lp12886 +g20 +aI177 +aI-638 +aa(lp12887 +g20 +aI115 +aI-638 +aa(lp12888 +g10 +aa(lp12889 +g8 +aI544 +aI0 +aa(lp12890 +g10 +aa(lp12891 +g8 +aI544 +aI0 +aasV& +(lp12892 +(lp12893 +g8 +aI764 +aI0 +aa(lp12894 +g20 +aI653 +aI-116 +aa(lp12895 +g15 +aI600 +aI-65 +aI637 +aI-98 +aI619 +aI-81 +aa(lp12896 +g15 +aI536 +aI-24 +aI581 +aI-49 +aI559 +aI-36 +aa(lp12897 +g15 +aI458 +aI3 +aI513 +aI-12 +aI487 +aI-3 +aa(lp12898 +g15 +aI365 +aI13 +aI430 +aI10 +aI399 +aI13 +aa(lp12899 +g15 +aI225 +aI-6 +aI311 +aI13 +aI265 +aI6 +aa(lp12900 +g15 +aI126 +aI-63 +aI185 +aI-20 +aI152 +aI-39 +aa(lp12901 +g15 +aI67 +aI-151 +aI100 +aI-88 +aI80 +aI-117 +aa(lp12902 +g15 +aI48 +aI-266 +aI54 +aI-186 +aI48 +aI-224 +aa(lp12903 +g15 +aI63 +aI-365 +aI48 +aI-304 +aI53 +aI-337 +aa(lp12904 +g15 +aI106 +aI-439 +aI73 +aI-393 +aI87 +aI-417 +aa(lp12905 +g15 +aI173 +aI-494 +aI124 +aI-460 +aI147 +aI-478 +aa(lp12906 +g15 +aI261 +aI-539 +aI199 +aI-511 +aI228 +aI-525 +aa(lp12907 +g15 +aI216 +aI-596 +aI244 +aI-559 +aI229 +aI-578 +aa(lp12908 +g15 +aI184 +aI-651 +aI203 +aI-615 +aI193 +aI-633 +aa(lp12909 +g15 +aI165 +aI-707 +aI176 +aI-670 +aI169 +aI-688 +aa(lp12910 +g15 +aI158 +aI-769 +aI161 +aI-726 +aI158 +aI-747 +aa(lp12911 +g15 +aI173 +aI-849 +aI158 +aI-798 +aI163 +aI-825 +aa(lp12912 +g15 +aI218 +aI-911 +aI182 +aI-873 +aI197 +aI-893 +aa(lp12913 +g15 +aI296 +aI-951 +aI238 +aI-928 +aI264 +aI-941 +aa(lp12914 +g15 +aI410 +aI-965 +aI328 +aI-960 +aI366 +aI-965 +aa(lp12915 +g15 +aI519 +aI-950 +aI453 +aI-965 +aI489 +aI-960 +aa(lp12916 +g15 +aI592 +aI-909 +aI549 +aI-940 +aI573 +aI-926 +aa(lp12917 +g15 +aI633 +aI-848 +aI611 +aI-891 +aI625 +aI-871 +aa(lp12918 +g15 +aI646 +aI-775 +aI642 +aI-825 +aI646 +aI-801 +aa(lp12919 +g15 +aI634 +aI-699 +aI646 +aI-746 +aI642 +aI-721 +aa(lp12920 +g15 +aI594 +aI-638 +aI625 +aI-677 +aI612 +aI-656 +aa(lp12921 +g15 +aI525 +aI-585 +aI576 +aI-619 +aI553 +aI-601 +aa(lp12922 +g15 +aI421 +aI-534 +aI496 +aI-568 +aI462 +aI-551 +aa(lp12923 +g20 +aI664 +aI-276 +aa(lp12924 +g15 +aI679 +aI-337 +aI670 +aI-296 +aI675 +aI-317 +aa(lp12925 +g15 +aI688 +aI-398 +aI682 +aI-358 +aI686 +aI-378 +aa(lp12926 +g15 +aI693 +aI-456 +aI690 +aI-418 +aI692 +aI-437 +aa(lp12927 +g15 +aI694 +aI-508 +aI694 +aI-475 +aI694 +aI-492 +aa(lp12928 +g20 +aI694 +aI-560 +aa(lp12929 +g20 +aI934 +aI-560 +aa(lp12930 +g20 +aI934 +aI-504 +aa(lp12931 +g20 +aI922 +aI-504 +aa(lp12932 +g15 +aI878 +aI-502 +aI907 +aI-504 +aI893 +aI-503 +aa(lp12933 +g15 +aI838 +aI-490 +aI864 +aI-500 +aI851 +aI-496 +aa(lp12934 +g15 +aI805 +aI-462 +aI826 +aI-483 +aI815 +aI-474 +aa(lp12935 +g15 +aI782 +aI-414 +aI795 +aI-450 +aI788 +aI-434 +aa(lp12936 +g15 +aI755 +aI-321 +aI774 +aI-385 +aI765 +aI-354 +aa(lp12937 +g15 +aI717 +aI-220 +aI745 +aI-287 +aI732 +aI-254 +aa(lp12938 +g20 +aI841 +aI-88 +aa(lp12939 +g15 +aI861 +aI-72 +aI847 +aI-82 +aI854 +aI-76 +aa(lp12940 +g15 +aI885 +aI-62 +aI868 +aI-68 +aI876 +aI-64 +aa(lp12941 +g15 +aI918 +aI-56 +aI895 +aI-59 +aI906 +aI-57 +aa(lp12942 +g15 +aI965 +aI-55 +aI931 +aI-55 +aI947 +aI-55 +aa(lp12943 +g20 +aI977 +aI-55 +aa(lp12944 +g20 +aI977 +aI0 +aa(lp12945 +g10 +aa(lp12946 +g8 +aI377 +aI-60 +aa(lp12947 +g15 +aI450 +aI-68 +aI403 +aI-60 +aI427 +aI-63 +aa(lp12948 +g15 +aI511 +aI-91 +aI472 +aI-74 +aI493 +aI-81 +aa(lp12949 +g15 +aI563 +aI-125 +aI530 +aI-100 +aI547 +aI-112 +aa(lp12950 +g15 +aI605 +aI-168 +aI578 +aI-138 +aI592 +aI-153 +aa(lp12951 +g20 +aI310 +aI-484 +aa(lp12952 +g15 +aI255 +aI-447 +aI290 +aI-473 +aI271 +aI-460 +aa(lp12953 +g15 +aI213 +aI-399 +aI239 +aI-433 +aI225 +aI-417 +aa(lp12954 +g15 +aI187 +aI-338 +aI202 +aI-381 +aI193 +aI-361 +aa(lp12955 +g15 +aI178 +aI-261 +aI181 +aI-316 +aI178 +aI-290 +aa(lp12956 +g15 +aI192 +aI-175 +aI178 +aI-229 +aI183 +aI-200 +aa(lp12957 +g15 +aI233 +aI-112 +aI202 +aI-150 +aI215 +aI-129 +aa(lp12958 +g15 +aI296 +aI-73 +aI250 +aI-95 +aI271 +aI-82 +aa(lp12959 +g15 +aI377 +aI-60 +aI320 +aI-65 +aI347 +aI-60 +aa(lp12960 +g10 +aa(lp12961 +g8 +aI529 +aI-774 +aa(lp12962 +g15 +aI522 +aI-823 +aI529 +aI-792 +aI527 +aI-808 +aa(lp12963 +g15 +aI501 +aI-863 +aI518 +aI-838 +aI511 +aI-852 +aa(lp12964 +g15 +aI463 +aI-889 +aI491 +aI-874 +aI479 +aI-883 +aa(lp12965 +g15 +aI405 +aI-899 +aI447 +aI-896 +aI428 +aI-899 +aa(lp12966 +g15 +aI314 +aI-864 +aI366 +aI-899 +aI335 +aI-887 +aa(lp12967 +g15 +aI282 +aI-772 +aI293 +aI-841 +aI282 +aI-811 +aa(lp12968 +g15 +aI287 +aI-725 +aI282 +aI-756 +aI284 +aI-740 +aa(lp12969 +g15 +aI304 +aI-681 +aI291 +aI-710 +aI296 +aI-696 +aa(lp12970 +g15 +aI333 +aI-636 +aI311 +aI-666 +aI321 +aI-651 +aa(lp12971 +g15 +aI376 +aI-584 +aI345 +aI-620 +aI359 +aI-603 +aa(lp12972 +g15 +aI444 +aI-620 +aI402 +aI-596 +aI425 +aI-608 +aa(lp12973 +g15 +aI492 +aI-661 +aI463 +aI-633 +aI479 +aI-647 +aa(lp12974 +g15 +aI520 +aI-711 +aI504 +aI-676 +aI514 +aI-693 +aa(lp12975 +g15 +aI529 +aI-774 +aI526 +aI-730 +aI529 +aI-750 +aa(lp12976 +g10 +aa(lp12977 +g8 +aI989 +aI0 +aa(lp12978 +g10 +aa(lp12979 +g8 +aI989 +aI0 +aasV* +(lp12980 +(lp12981 +g8 +aI54 +aI-825 +aa(lp12982 +g20 +aI101 +aI-930 +aa(lp12983 +g20 +aI306 +aI-800 +aa(lp12984 +g20 +aI272 +aI-1012 +aa(lp12985 +g20 +aI388 +aI-1012 +aa(lp12986 +g20 +aI350 +aI-802 +aa(lp12987 +g20 +aI557 +aI-927 +aa(lp12988 +g20 +aI604 +aI-823 +aa(lp12989 +g20 +aI378 +aI-758 +aa(lp12990 +g20 +aI604 +aI-692 +aa(lp12991 +g20 +aI557 +aI-590 +aa(lp12992 +g20 +aI350 +aI-714 +aa(lp12993 +g20 +aI388 +aI-503 +aa(lp12994 +g20 +aI272 +aI-503 +aa(lp12995 +g20 +aI305 +aI-714 +aa(lp12996 +g20 +aI101 +aI-587 +aa(lp12997 +g20 +aI54 +aI-691 +aa(lp12998 +g20 +aI278 +aI-758 +aa(lp12999 +g10 +aa(lp13000 +g8 +aI666 +aI0 +aa(lp13001 +g10 +aa(lp13002 +g8 +aI666 +aI0 +aasV. +(lp13003 +(lp13004 +g8 +aI106 +aI-80 +aa(lp13005 +g15 +aI113 +aI-124 +aI106 +aI-98 +aI108 +aI-112 +aa(lp13006 +g15 +aI131 +aI-151 +aI117 +aI-135 +aI123 +aI-144 +aa(lp13007 +g15 +aI157 +aI-166 +aI138 +aI-158 +aI147 +aI-163 +aa(lp13008 +g15 +aI190 +aI-171 +aI168 +aI-169 +aI179 +aI-171 +aa(lp13009 +g15 +aI222 +aI-166 +aI202 +aI-171 +aI212 +aI-169 +aa(lp13010 +g15 +aI249 +aI-151 +aI233 +aI-163 +aI242 +aI-158 +aa(lp13011 +g15 +aI267 +aI-124 +aI257 +aI-144 +aI263 +aI-135 +aa(lp13012 +g15 +aI274 +aI-80 +aI272 +aI-112 +aI274 +aI-98 +aa(lp13013 +g15 +aI267 +aI-37 +aI274 +aI-64 +aI272 +aI-49 +aa(lp13014 +g15 +aI249 +aI-9 +aI263 +aI-26 +aI257 +aI-16 +aa(lp13015 +g15 +aI222 +aI5 +aI242 +aI-3 +aI233 +aI1 +aa(lp13016 +g15 +aI190 +aI9 +aI212 +aI8 +aI202 +aI9 +aa(lp13017 +g15 +aI157 +aI5 +aI179 +aI9 +aI168 +aI8 +aa(lp13018 +g15 +aI131 +aI-9 +aI147 +aI1 +aI138 +aI-3 +aa(lp13019 +g15 +aI113 +aI-37 +aI123 +aI-16 +aI117 +aI-26 +aa(lp13020 +g15 +aI106 +aI-80 +aI108 +aI-49 +aI106 +aI-64 +aa(lp13021 +g10 +aa(lp13022 +g8 +aI381 +aI0 +aa(lp13023 +g10 +aa(lp13024 +g8 +aI381 +aI0 +aasV2 +(lp13025 +(lp13026 +g8 +aI614 +aI-742 +aa(lp13027 +g15 +aI599 +aI-651 +aI614 +aI-711 +aI609 +aI-680 +aa(lp13028 +g15 +aI555 +aI-560 +aI589 +aI-621 +aI575 +aI-591 +aa(lp13029 +g15 +aI486 +aI-463 +aI536 +aI-529 +aI513 +aI-497 +aa(lp13030 +g15 +aI391 +aI-355 +aI458 +aI-430 +aI427 +aI-394 +aa(lp13031 +g20 +aI166 +aI-106 +aa(lp13032 +g20 +aI474 +aI-106 +aa(lp13033 +g15 +aI524 +aI-114 +aI494 +aI-106 +aI511 +aI-109 +aa(lp13034 +g15 +aI555 +aI-136 +aI537 +aI-120 +aI547 +aI-127 +aa(lp13035 +g15 +aI575 +aI-168 +aI564 +aI-146 +aI570 +aI-156 +aa(lp13036 +g15 +aI586 +aI-205 +aI579 +aI-180 +aI583 +aI-192 +aa(lp13037 +g20 +aI591 +aI-230 +aa(lp13038 +g20 +aI647 +aI-230 +aa(lp13039 +g20 +aI641 +aI0 +aa(lp13040 +g20 +aI67 +aI0 +aa(lp13041 +g20 +aI67 +aI-97 +aa(lp13042 +g20 +aI290 +aI-354 +aa(lp13043 +g15 +aI379 +aI-465 +aI325 +aI-395 +aI355 +aI-432 +aa(lp13044 +g15 +aI438 +aI-557 +aI403 +aI-497 +aI423 +aI-528 +aa(lp13045 +g15 +aI470 +aI-641 +aI452 +aI-586 +aI463 +aI-614 +aa(lp13046 +g15 +aI479 +aI-728 +aI476 +aI-669 +aI479 +aI-698 +aa(lp13047 +g15 +aI471 +aI-798 +aI479 +aI-754 +aI477 +aI-777 +aa(lp13048 +g15 +aI446 +aI-851 +aI466 +aI-818 +aI458 +aI-836 +aa(lp13049 +g15 +aI404 +aI-885 +aI435 +aI-866 +aI421 +aI-877 +aa(lp13050 +g15 +aI343 +aI-897 +aI387 +aI-893 +aI367 +aI-897 +aa(lp13051 +g15 +aI269 +aI-881 +aI313 +aI-897 +aI288 +aI-892 +aa(lp13052 +g15 +aI225 +aI-838 +aI250 +aI-870 +aI236 +aI-856 +aa(lp13053 +g15 +aI203 +aI-774 +aI214 +aI-819 +aI207 +aI-798 +aa(lp13054 +g15 +aI197 +aI-699 +aI199 +aI-751 +aI197 +aI-725 +aa(lp13055 +g15 +aI152 +aI-703 +aI181 +aI-699 +aI166 +aI-700 +aa(lp13056 +g15 +aI115 +aI-717 +aI138 +aI-705 +aI126 +aI-710 +aa(lp13057 +g15 +aI91 +aI-744 +aI105 +aI-724 +aI97 +aI-732 +aa(lp13058 +g15 +aI82 +aI-786 +aI85 +aI-755 +aI82 +aI-769 +aa(lp13059 +g15 +aI99 +aI-857 +aI82 +aI-811 +aI88 +aI-835 +aa(lp13060 +g15 +aI148 +aI-914 +aI110 +aI-879 +aI126 +aI-898 +aa(lp13061 +g15 +aI230 +aI-951 +aI170 +aI-930 +aI197 +aI-942 +aa(lp13062 +g15 +aI343 +aI-965 +aI263 +aI-960 +aI300 +aI-965 +aa(lp13063 +g15 +aI457 +aI-949 +aI385 +aI-965 +aI423 +aI-959 +aa(lp13064 +g15 +aI542 +aI-904 +aI490 +aI-938 +aI518 +aI-923 +aa(lp13065 +g15 +aI596 +aI-834 +aI565 +aI-884 +aI583 +aI-861 +aa(lp13066 +g15 +aI614 +aI-742 +aI608 +aI-806 +aI614 +aI-776 +aa(lp13067 +g10 +aa(lp13068 +g8 +aI745 +aI0 +aa(lp13069 +g10 +aa(lp13070 +g8 +aI745 +aI0 +aasV6 +(lp13071 +(lp13072 +g8 +aI429 +aI-900 +aa(lp13073 +g15 +aI277 +aI-801 +aI362 +aI-900 +aI311 +aI-867 +aa(lp13074 +g15 +aI218 +aI-508 +aI243 +aI-736 +aI223 +aI-638 +aa(lp13075 +g15 +aI254 +aI-535 +aI229 +aI-517 +aI241 +aI-526 +aa(lp13076 +g15 +aI298 +aI-557 +aI268 +aI-543 +aI282 +aI-550 +aa(lp13077 +g15 +aI349 +aI-572 +aI313 +aI-563 +aI330 +aI-568 +aa(lp13078 +g15 +aI409 +aI-578 +aI367 +aI-576 +aI387 +aI-578 +aa(lp13079 +g15 +aI520 +aI-559 +aI450 +aI-578 +aI487 +aI-572 +aa(lp13080 +g15 +aI604 +aI-505 +aI553 +aI-546 +aI581 +aI-528 +aa(lp13081 +g15 +aI658 +aI-419 +aI627 +aI-481 +aI645 +aI-453 +aa(lp13082 +g15 +aI677 +aI-304 +aI670 +aI-385 +aI677 +aI-347 +aa(lp13083 +g15 +aI657 +aI-175 +aI677 +aI-258 +aI670 +aI-215 +aa(lp13084 +g15 +aI601 +aI-75 +aI645 +aI-136 +aI626 +aI-103 +aa(lp13085 +g15 +aI512 +aI-9 +aI577 +aI-47 +aI547 +aI-25 +aa(lp13086 +g15 +aI390 +aI13 +aI476 +aI5 +aI436 +aI13 +aa(lp13087 +g15 +aI267 +aI-14 +aI346 +aI13 +aI305 +aI4 +aa(lp13088 +g15 +aI169 +aI-101 +aI229 +aI-32 +aI197 +aI-61 +aa(lp13089 +g15 +aI104 +aI-254 +aI142 +aI-141 +aI120 +aI-192 +aa(lp13090 +g15 +aI81 +aI-479 +aI89 +aI-316 +aI81 +aI-391 +aa(lp13091 +g15 +aI90 +aI-603 +aI81 +aI-521 +aI84 +aI-562 +aa(lp13092 +g15 +aI119 +aI-717 +aI97 +aI-643 +aI106 +aI-681 +aa(lp13093 +g15 +aI166 +aI-817 +aI131 +aI-753 +aI147 +aI-786 +aa(lp13094 +g15 +aI234 +aI-895 +aI185 +aI-847 +aI208 +aI-873 +aa(lp13095 +g15 +aI321 +aI-946 +aI259 +aI-917 +aI289 +aI-934 +aa(lp13096 +g15 +aI429 +aI-965 +aI354 +aI-958 +aI389 +aI-965 +aa(lp13097 +g15 +aI526 +aI-953 +aI466 +aI-965 +aI498 +aI-961 +aa(lp13098 +g15 +aI595 +aI-922 +aI553 +aI-945 +aI576 +aI-935 +aa(lp13099 +g15 +aI635 +aI-877 +aI613 +aI-909 +aI626 +aI-894 +aa(lp13100 +g15 +aI649 +aI-825 +aI644 +aI-860 +aI649 +aI-842 +aa(lp13101 +g15 +aI623 +aI-765 +aI649 +aI-799 +aI640 +aI-779 +aa(lp13102 +g15 +aI546 +aI-744 +aI605 +aI-751 +aI580 +aI-744 +aa(lp13103 +g15 +aI540 +aI-805 +aI546 +aI-766 +aI544 +aI-786 +aa(lp13104 +g15 +aI520 +aI-855 +aI536 +aI-824 +aI529 +aI-841 +aa(lp13105 +g15 +aI483 +aI-888 +aI510 +aI-869 +aI498 +aI-880 +aa(lp13106 +g15 +aI429 +aI-900 +aI468 +aI-896 +aI450 +aI-900 +aa(lp13107 +g10 +aa(lp13108 +g8 +aI382 +aI-509 +aa(lp13109 +g15 +aI332 +aI-503 +aI365 +aI-509 +aI348 +aI-507 +aa(lp13110 +g15 +aI287 +aI-485 +aI316 +aI-498 +aI301 +aI-492 +aa(lp13111 +g15 +aI248 +aI-460 +aI273 +aI-478 +aI260 +aI-470 +aa(lp13112 +g15 +aI217 +aI-433 +aI236 +aI-451 +aI226 +aI-442 +aa(lp13113 +g15 +aI231 +aI-261 +aI218 +aI-366 +aI222 +aI-309 +aa(lp13114 +g15 +aI266 +aI-146 +aI239 +aI-214 +aI251 +aI-175 +aa(lp13115 +g15 +aI322 +aI-80 +aI282 +aI-116 +aI300 +aI-94 +aa(lp13116 +g15 +aI394 +aI-59 +aI343 +aI-66 +aI368 +aI-59 +aa(lp13117 +g15 +aI503 +aI-115 +aI442 +aI-59 +aI478 +aI-77 +aa(lp13118 +g15 +aI541 +aI-291 +aI528 +aI-152 +aI541 +aI-211 +aa(lp13119 +g15 +aI500 +aI-457 +aI541 +aI-367 +aI527 +aI-423 +aa(lp13120 +g15 +aI382 +aI-509 +aI473 +aI-492 +aI434 +aI-509 +aa(lp13121 +g10 +aa(lp13122 +g8 +aI745 +aI0 +aa(lp13123 +g10 +aa(lp13124 +g8 +aI745 +aI0 +aasV: +(lp13125 +(lp13126 +g8 +aI108 +aI-80 +aa(lp13127 +g15 +aI114 +aI-124 +aI108 +aI-98 +aI110 +aI-112 +aa(lp13128 +g15 +aI132 +aI-151 +aI118 +aI-135 +aI124 +aI-144 +aa(lp13129 +g15 +aI159 +aI-166 +aI140 +aI-158 +aI148 +aI-163 +aa(lp13130 +g15 +aI192 +aI-171 +aI169 +aI-169 +aI180 +aI-171 +aa(lp13131 +g15 +aI224 +aI-166 +aI203 +aI-171 +aI214 +aI-169 +aa(lp13132 +g15 +aI250 +aI-151 +aI234 +aI-163 +aI243 +aI-158 +aa(lp13133 +g15 +aI269 +aI-124 +aI258 +aI-144 +aI264 +aI-135 +aa(lp13134 +g15 +aI276 +aI-80 +aI273 +aI-112 +aI276 +aI-98 +aa(lp13135 +g15 +aI269 +aI-37 +aI276 +aI-64 +aI273 +aI-49 +aa(lp13136 +g15 +aI250 +aI-9 +aI264 +aI-26 +aI258 +aI-16 +aa(lp13137 +g15 +aI224 +aI5 +aI243 +aI-3 +aI234 +aI1 +aa(lp13138 +g15 +aI192 +aI9 +aI214 +aI8 +aI203 +aI9 +aa(lp13139 +g15 +aI159 +aI5 +aI180 +aI9 +aI169 +aI8 +aa(lp13140 +g15 +aI132 +aI-9 +aI148 +aI1 +aI140 +aI-3 +aa(lp13141 +g15 +aI114 +aI-37 +aI124 +aI-16 +aI118 +aI-26 +aa(lp13142 +g15 +aI108 +aI-80 +aI110 +aI-49 +aI108 +aI-64 +aa(lp13143 +g10 +aa(lp13144 +g8 +aI108 +aI-630 +aa(lp13145 +g15 +aI114 +aI-673 +aI108 +aI-647 +aI110 +aI-662 +aa(lp13146 +g15 +aI132 +aI-701 +aI118 +aI-685 +aI124 +aI-694 +aa(lp13147 +g15 +aI159 +aI-716 +aI140 +aI-708 +aI148 +aI-713 +aa(lp13148 +g15 +aI192 +aI-720 +aI169 +aI-719 +aI180 +aI-720 +aa(lp13149 +g15 +aI224 +aI-716 +aI203 +aI-720 +aI214 +aI-719 +aa(lp13150 +g15 +aI250 +aI-701 +aI234 +aI-713 +aI243 +aI-708 +aa(lp13151 +g15 +aI269 +aI-673 +aI258 +aI-694 +aI264 +aI-685 +aa(lp13152 +g15 +aI276 +aI-630 +aI273 +aI-662 +aI276 +aI-647 +aa(lp13153 +g15 +aI269 +aI-587 +aI276 +aI-613 +aI273 +aI-599 +aa(lp13154 +g15 +aI250 +aI-559 +aI264 +aI-575 +aI258 +aI-566 +aa(lp13155 +g15 +aI224 +aI-543 +aI243 +aI-551 +aI234 +aI-546 +aa(lp13156 +g15 +aI192 +aI-539 +aI214 +aI-540 +aI203 +aI-539 +aa(lp13157 +g15 +aI159 +aI-543 +aI180 +aI-539 +aI169 +aI-540 +aa(lp13158 +g15 +aI132 +aI-559 +aI148 +aI-546 +aI140 +aI-551 +aa(lp13159 +g15 +aI114 +aI-587 +aI124 +aI-566 +aI118 +aI-575 +aa(lp13160 +g15 +aI108 +aI-630 +aI110 +aI-599 +aI108 +aI-613 +aa(lp13161 +g10 +aa(lp13162 +g8 +aI382 +aI0 +aa(lp13163 +g10 +aa(lp13164 +g8 +aI382 +aI0 +aasV> +(lp13165 +(lp13166 +g8 +aI86 +aI-146 +aa(lp13167 +g20 +aI86 +aI-235 +aa(lp13168 +g20 +aI534 +aI-475 +aa(lp13169 +g20 +aI86 +aI-718 +aa(lp13170 +g20 +aI86 +aI-807 +aa(lp13171 +g20 +aI658 +aI-499 +aa(lp13172 +g20 +aI658 +aI-452 +aa(lp13173 +g10 +aa(lp13174 +g8 +aI745 +aI0 +aa(lp13175 +g10 +aa(lp13176 +g8 +aI745 +aI0 +aasVB +(lp13177 +(lp13178 +g8 +aI750 +aI-713 +aa(lp13179 +g15 +aI737 +aI-634 +aI750 +aI-683 +aI746 +aI-656 +aa(lp13180 +g15 +aI703 +aI-575 +aI729 +aI-611 +aI717 +aI-591 +aa(lp13181 +g15 +aI650 +aI-532 +aI688 +aI-558 +aI670 +aI-543 +aa(lp13182 +g15 +aI585 +aI-503 +aI630 +aI-520 +aI608 +aI-511 +aa(lp13183 +g20 +aI585 +aI-498 +aa(lp13184 +g15 +aI668 +aI-471 +aI615 +aI-493 +aI643 +aI-484 +aa(lp13185 +g15 +aI733 +aI-422 +aI693 +aI-458 +aI715 +aI-442 +aa(lp13186 +g15 +aI775 +aI-350 +aI751 +aI-402 +aI765 +aI-378 +aa(lp13187 +g15 +aI790 +aI-256 +aI785 +aI-323 +aI790 +aI-291 +aa(lp13188 +g15 +aI705 +aI-63 +aI790 +aI-170 +aI762 +aI-106 +aa(lp13189 +g15 +aI447 +aI0 +aI649 +aI-20 +aI563 +aI0 +aa(lp13190 +g20 +aI50 +aI0 +aa(lp13191 +g20 +aI50 +aI-55 +aa(lp13192 +g20 +aI67 +aI-55 +aa(lp13193 +g15 +aI110 +aI-58 +aI82 +aI-55 +aI97 +aI-56 +aa(lp13194 +g15 +aI145 +aI-72 +aI123 +aI-60 +aI135 +aI-65 +aa(lp13195 +g15 +aI168 +aI-101 +aI155 +aI-78 +aI162 +aI-88 +aa(lp13196 +g15 +aI177 +aI-151 +aI174 +aI-113 +aI177 +aI-130 +aa(lp13197 +g20 +aI177 +aI-804 +aa(lp13198 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp13199 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp13200 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp13201 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp13202 +g20 +aI50 +aI-895 +aa(lp13203 +g20 +aI50 +aI-951 +aa(lp13204 +g20 +aI408 +aI-951 +aa(lp13205 +g15 +aI666 +aI-893 +aI523 +aI-951 +aI609 +aI-932 +aa(lp13206 +g15 +aI750 +aI-713 +aI722 +aI-855 +aI750 +aI-795 +aa(lp13207 +g10 +aa(lp13208 +g8 +aI311 +aI-65 +aa(lp13209 +g20 +aI441 +aI-65 +aa(lp13210 +g15 +aI537 +aI-76 +aI479 +aI-65 +aI511 +aI-69 +aa(lp13211 +g15 +aI600 +aI-109 +aI563 +aI-83 +aI584 +aI-94 +aa(lp13212 +g15 +aI636 +aI-170 +aI617 +aI-125 +aI629 +aI-145 +aa(lp13213 +g15 +aI647 +aI-260 +aI644 +aI-194 +aI647 +aI-225 +aa(lp13214 +g15 +aI638 +aI-351 +aI647 +aI-295 +aI644 +aI-325 +aa(lp13215 +g15 +aI604 +aI-414 +aI631 +aI-376 +aI620 +aI-397 +aa(lp13216 +g15 +aI541 +aI-452 +aI588 +aI-431 +aI567 +aI-444 +aa(lp13217 +g15 +aI444 +aI-465 +aI515 +aI-460 +aI483 +aI-465 +aa(lp13218 +g20 +aI311 +aI-465 +aa(lp13219 +g10 +aa(lp13220 +g8 +aI311 +aI-531 +aa(lp13221 +g20 +aI404 +aI-531 +aa(lp13222 +g15 +aI501 +aI-541 +aI443 +aI-531 +aI475 +aI-534 +aa(lp13223 +g15 +aI564 +aI-574 +aI527 +aI-548 +aI548 +aI-559 +aa(lp13224 +g15 +aI597 +aI-630 +aI580 +aI-588 +aI591 +aI-607 +aa(lp13225 +g15 +aI608 +aI-713 +aI604 +aI-653 +aI608 +aI-680 +aa(lp13226 +g15 +aI597 +aI-794 +aI608 +aI-745 +aI604 +aI-772 +aa(lp13227 +g15 +aI561 +aI-847 +aI589 +aI-816 +aI577 +aI-834 +aa(lp13228 +g15 +aI497 +aI-876 +aI544 +aI-861 +aI523 +aI-870 +aa(lp13229 +g15 +aI401 +aI-884 +aI470 +aI-882 +aI438 +aI-884 +aa(lp13230 +g20 +aI311 +aI-884 +aa(lp13231 +g10 +aa(lp13232 +g8 +aI871 +aI0 +aa(lp13233 +g10 +aa(lp13234 +g8 +aI871 +aI0 +aasVF +(lp13235 +(lp13236 +g8 +aI311 +aI-884 +aa(lp13237 +g20 +aI311 +aI-499 +aa(lp13238 +g20 +aI633 +aI-499 +aa(lp13239 +g20 +aI633 +aI-434 +aa(lp13240 +g20 +aI311 +aI-434 +aa(lp13241 +g20 +aI311 +aI-151 +aa(lp13242 +g15 +aI320 +aI-101 +aI311 +aI-130 +aI314 +aI-113 +aa(lp13243 +g15 +aI344 +aI-72 +aI326 +aI-88 +aI334 +aI-78 +aa(lp13244 +g15 +aI378 +aI-58 +aI353 +aI-65 +aI365 +aI-60 +aa(lp13245 +g15 +aI421 +aI-55 +aI392 +aI-56 +aI406 +aI-55 +aa(lp13246 +g20 +aI465 +aI-55 +aa(lp13247 +g20 +aI465 +aI0 +aa(lp13248 +g20 +aI50 +aI0 +aa(lp13249 +g20 +aI50 +aI-55 +aa(lp13250 +g20 +aI67 +aI-55 +aa(lp13251 +g15 +aI109 +aI-58 +aI82 +aI-55 +aI96 +aI-56 +aa(lp13252 +g15 +aI144 +aI-70 +aI122 +aI-60 +aI134 +aI-64 +aa(lp13253 +g15 +aI168 +aI-97 +aI154 +aI-76 +aI162 +aI-85 +aa(lp13254 +g15 +aI177 +aI-144 +aI174 +aI-109 +aI177 +aI-125 +aa(lp13255 +g20 +aI177 +aI-804 +aa(lp13256 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp13257 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp13258 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp13259 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp13260 +g20 +aI50 +aI-895 +aa(lp13261 +g20 +aI50 +aI-951 +aa(lp13262 +g20 +aI722 +aI-951 +aa(lp13263 +g20 +aI729 +aI-718 +aa(lp13264 +g20 +aI660 +aI-718 +aa(lp13265 +g20 +aI653 +aI-775 +aa(lp13266 +g15 +aI643 +aI-818 +aI651 +aI-790 +aI648 +aI-804 +aa(lp13267 +g15 +aI620 +aI-852 +aI638 +aI-831 +aI630 +aI-842 +aa(lp13268 +g15 +aI583 +aI-876 +aI611 +aI-862 +aI598 +aI-870 +aa(lp13269 +g15 +aI530 +aI-884 +aI569 +aI-882 +aI551 +aI-884 +aa(lp13270 +g10 +aa(lp13271 +g8 +aI786 +aI0 +aa(lp13272 +g10 +aa(lp13273 +g8 +aI786 +aI0 +aasVJ +(lp13274 +(lp13275 +g8 +aI-14 +aI257 +aa(lp13276 +g20 +aI-2 +aI257 +aa(lp13277 +g15 +aI73 +aI245 +aI26 +aI257 +aI51 +aI253 +aa(lp13278 +g15 +aI130 +aI205 +aI96 +aI237 +aI115 +aI224 +aa(lp13279 +g15 +aI165 +aI129 +aI145 +aI186 +aI157 +aI161 +aa(lp13280 +g15 +aI177 +aI12 +aI173 +aI98 +aI177 +aI59 +aa(lp13281 +g20 +aI177 +aI-804 +aa(lp13282 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp13283 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp13284 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp13285 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp13286 +g20 +aI50 +aI-895 +aa(lp13287 +g20 +aI50 +aI-951 +aa(lp13288 +g20 +aI438 +aI-951 +aa(lp13289 +g20 +aI438 +aI-895 +aa(lp13290 +g20 +aI421 +aI-895 +aa(lp13291 +g15 +aI378 +aI-892 +aI406 +aI-895 +aI392 +aI-894 +aa(lp13292 +g15 +aI344 +aI-878 +aI365 +aI-889 +aI353 +aI-885 +aa(lp13293 +g15 +aI320 +aI-849 +aI334 +aI-872 +aI326 +aI-862 +aa(lp13294 +g15 +aI311 +aI-799 +aI314 +aI-837 +aI311 +aI-820 +aa(lp13295 +g20 +aI311 +aI10 +aa(lp13296 +g15 +aI288 +aI160 +aI311 +aI70 +aI304 +aI120 +aa(lp13297 +g15 +aI223 +aI255 +aI272 +aI199 +aI251 +aI231 +aa(lp13298 +g15 +aI127 +aI305 +aI196 +aI278 +aI164 +aI295 +aa(lp13299 +g15 +aI7 +aI320 +aI90 +aI315 +aI50 +aI320 +aa(lp13300 +g20 +aI-14 +aI320 +aa(lp13301 +g10 +aa(lp13302 +g8 +aI475 +aI0 +aa(lp13303 +g10 +aa(lp13304 +g8 +aI475 +aI0 +aasVN +(lp13305 +(lp13306 +g8 +aI758 +aI0 +aa(lp13307 +g20 +aI258 +aI-767 +aa(lp13308 +g20 +aI258 +aI-151 +aa(lp13309 +g15 +aI267 +aI-101 +aI258 +aI-130 +aI261 +aI-113 +aa(lp13310 +g15 +aI290 +aI-72 +aI273 +aI-88 +aI280 +aI-78 +aa(lp13311 +g15 +aI325 +aI-58 +aI300 +aI-65 +aI312 +aI-60 +aa(lp13312 +g15 +aI367 +aI-55 +aI338 +aI-56 +aI353 +aI-55 +aa(lp13313 +g20 +aI385 +aI-55 +aa(lp13314 +g20 +aI385 +aI0 +aa(lp13315 +g20 +aI50 +aI0 +aa(lp13316 +g20 +aI50 +aI-55 +aa(lp13317 +g20 +aI67 +aI-55 +aa(lp13318 +g15 +aI110 +aI-58 +aI82 +aI-55 +aI97 +aI-56 +aa(lp13319 +g15 +aI145 +aI-72 +aI123 +aI-60 +aI135 +aI-65 +aa(lp13320 +g15 +aI168 +aI-101 +aI155 +aI-78 +aI162 +aI-88 +aa(lp13321 +g15 +aI177 +aI-151 +aI174 +aI-113 +aI177 +aI-130 +aa(lp13322 +g20 +aI177 +aI-804 +aa(lp13323 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp13324 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp13325 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp13326 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp13327 +g20 +aI50 +aI-895 +aa(lp13328 +g20 +aI50 +aI-951 +aa(lp13329 +g20 +aI294 +aI-951 +aa(lp13330 +g20 +aI772 +aI-214 +aa(lp13331 +g20 +aI772 +aI-804 +aa(lp13332 +g15 +aI763 +aI-852 +aI772 +aI-824 +aI769 +aI-840 +aa(lp13333 +g15 +aI739 +aI-879 +aI757 +aI-864 +aI749 +aI-873 +aa(lp13334 +g15 +aI704 +aI-892 +aI729 +aI-886 +aI717 +aI-890 +aa(lp13335 +g15 +aI662 +aI-895 +aI691 +aI-894 +aI677 +aI-895 +aa(lp13336 +g20 +aI645 +aI-895 +aa(lp13337 +g20 +aI645 +aI-951 +aa(lp13338 +g20 +aI979 +aI-951 +aa(lp13339 +g20 +aI979 +aI-895 +aa(lp13340 +g20 +aI962 +aI-895 +aa(lp13341 +g15 +aI920 +aI-892 +aI947 +aI-895 +aI933 +aI-894 +aa(lp13342 +g15 +aI885 +aI-878 +aI907 +aI-889 +aI895 +aI-885 +aa(lp13343 +g15 +aI861 +aI-849 +aI875 +aI-872 +aI867 +aI-862 +aa(lp13344 +g15 +aI853 +aI-799 +aI856 +aI-837 +aI853 +aI-820 +aa(lp13345 +g20 +aI853 +aI0 +aa(lp13346 +g10 +aa(lp13347 +g8 +aI1017 +aI0 +aa(lp13348 +g10 +aa(lp13349 +g8 +aI1017 +aI0 +aasVR +(lp13350 +(lp13351 +g8 +aI738 +aI-162 +aa(lp13352 +g15 +aI804 +aI-82 +aI761 +aI-126 +aI783 +aI-100 +aa(lp13353 +g15 +aI878 +aI-55 +aI825 +aI-64 +aI850 +aI-55 +aa(lp13354 +g20 +aI882 +aI-55 +aa(lp13355 +g20 +aI882 +aI0 +aa(lp13356 +g20 +aI863 +aI0 +aa(lp13357 +g15 +aI761 +aI-4 +aI822 +aI0 +aI788 +aI-1 +aa(lp13358 +g15 +aI693 +aI-21 +aI734 +aI-7 +aI712 +aI-13 +aa(lp13359 +g15 +aI645 +aI-58 +aI674 +aI-30 +aI658 +aI-42 +aa(lp13360 +g15 +aI602 +aI-119 +aI632 +aI-73 +aI618 +aI-94 +aa(lp13361 +g20 +aI422 +aI-419 +aa(lp13362 +g20 +aI311 +aI-419 +aa(lp13363 +g20 +aI311 +aI-144 +aa(lp13364 +g15 +aI320 +aI-97 +aI311 +aI-125 +aI314 +aI-109 +aa(lp13365 +g15 +aI344 +aI-70 +aI326 +aI-85 +aI334 +aI-76 +aa(lp13366 +g15 +aI379 +aI-58 +aI354 +aI-64 +aI365 +aI-60 +aa(lp13367 +g15 +aI421 +aI-55 +aI392 +aI-56 +aI406 +aI-55 +aa(lp13368 +g20 +aI438 +aI-55 +aa(lp13369 +g20 +aI438 +aI0 +aa(lp13370 +g20 +aI50 +aI0 +aa(lp13371 +g20 +aI50 +aI-55 +aa(lp13372 +g20 +aI67 +aI-55 +aa(lp13373 +g15 +aI109 +aI-58 +aI82 +aI-55 +aI96 +aI-56 +aa(lp13374 +g15 +aI144 +aI-70 +aI122 +aI-60 +aI134 +aI-64 +aa(lp13375 +g15 +aI168 +aI-97 +aI154 +aI-76 +aI162 +aI-85 +aa(lp13376 +g15 +aI177 +aI-144 +aI174 +aI-109 +aI177 +aI-125 +aa(lp13377 +g20 +aI177 +aI-804 +aa(lp13378 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp13379 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp13380 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp13381 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp13382 +g20 +aI50 +aI-895 +aa(lp13383 +g20 +aI50 +aI-951 +aa(lp13384 +g20 +aI409 +aI-951 +aa(lp13385 +g15 +aI667 +aI-887 +aI524 +aI-951 +aI610 +aI-929 +aa(lp13386 +g15 +aI751 +aI-694 +aI723 +aI-844 +aI751 +aI-780 +aa(lp13387 +g15 +aI734 +aI-600 +aI751 +aI-658 +aI746 +aI-627 +aa(lp13388 +g15 +aI689 +aI-531 +aI723 +aI-574 +aI708 +aI-550 +aa(lp13389 +g15 +aI626 +aI-482 +aI670 +aI-511 +aI649 +aI-495 +aa(lp13390 +g15 +aI555 +aI-451 +aI602 +aI-469 +aI579 +aI-459 +aa(lp13391 +g10 +aa(lp13392 +g8 +aI311 +aI-481 +aa(lp13393 +g20 +aI405 +aI-481 +aa(lp13394 +g15 +aI503 +aI-494 +aI444 +aI-481 +aI477 +aI-486 +aa(lp13395 +g15 +aI565 +aI-534 +aI529 +aI-503 +aI550 +aI-516 +aa(lp13396 +g15 +aI599 +aI-599 +aI581 +aI-551 +aI592 +aI-573 +aa(lp13397 +g15 +aI609 +aI-690 +aI606 +aI-625 +aI609 +aI-655 +aa(lp13398 +g15 +aI598 +aI-781 +aI609 +aI-725 +aI605 +aI-756 +aa(lp13399 +g15 +aI562 +aI-842 +aI590 +aI-806 +aI578 +aI-826 +aa(lp13400 +g15 +aI498 +aI-876 +aI546 +aI-858 +aI524 +aI-869 +aa(lp13401 +g15 +aI402 +aI-887 +aI472 +aI-883 +aI440 +aI-887 +aa(lp13402 +g20 +aI311 +aI-887 +aa(lp13403 +g10 +aa(lp13404 +g8 +aI874 +aI0 +aa(lp13405 +g10 +aa(lp13406 +g8 +aI874 +aI0 +aasVV +(lp13407 +(lp13408 +g8 +aI399 +aI0 +aa(lp13409 +g20 +aI111 +aI-825 +aa(lp13410 +g15 +aI96 +aI-859 +aI107 +aI-838 +aI101 +aI-850 +aa(lp13411 +g15 +aI76 +aI-881 +aI90 +aI-868 +aI84 +aI-875 +aa(lp13412 +g15 +aI51 +aI-892 +aI69 +aI-886 +aI60 +aI-889 +aa(lp13413 +g15 +aI17 +aI-895 +aI41 +aI-894 +aI30 +aI-895 +aa(lp13414 +g20 +aI0 +aI-895 +aa(lp13415 +g20 +aI0 +aI-951 +aa(lp13416 +g20 +aI366 +aI-951 +aa(lp13417 +g20 +aI366 +aI-895 +aa(lp13418 +g20 +aI335 +aI-895 +aa(lp13419 +g15 +aI275 +aI-880 +aI309 +aI-895 +aI288 +aI-890 +aa(lp13420 +g15 +aI255 +aI-831 +aI262 +aI-869 +aI255 +aI-853 +aa(lp13421 +g15 +aI258 +aI-808 +aI255 +aI-824 +aI256 +aI-816 +aa(lp13422 +g15 +aI266 +aI-782 +aI260 +aI-800 +aI263 +aI-792 +aa(lp13423 +g20 +aI413 +aI-349 +aa(lp13424 +g15 +aI447 +aI-234 +aI426 +aI-309 +aI438 +aI-271 +aa(lp13425 +g15 +aI473 +aI-130 +aI457 +aI-197 +aI465 +aI-162 +aa(lp13426 +g15 +aI498 +aI-232 +aI480 +aI-162 +aI488 +aI-196 +aa(lp13427 +g15 +aI534 +aI-349 +aI507 +aI-268 +aI519 +aI-307 +aa(lp13428 +g20 +aI681 +aI-772 +aa(lp13429 +g15 +aI690 +aI-804 +aI685 +aI-783 +aI687 +aI-794 +aa(lp13430 +g15 +aI693 +aI-830 +aI692 +aI-814 +aI693 +aI-822 +aa(lp13431 +g15 +aI671 +aI-880 +aI693 +aI-853 +aI686 +aI-869 +aa(lp13432 +g15 +aI605 +aI-895 +aI657 +aI-890 +aI634 +aI-895 +aa(lp13433 +g20 +aI574 +aI-895 +aa(lp13434 +g20 +aI574 +aI-951 +aa(lp13435 +g20 +aI899 +aI-951 +aa(lp13436 +g20 +aI899 +aI-895 +aa(lp13437 +g20 +aI874 +aI-895 +aa(lp13438 +g15 +aI840 +aI-891 +aI861 +aI-895 +aI850 +aI-894 +aa(lp13439 +g15 +aI815 +aI-876 +aI831 +aI-888 +aI823 +aI-883 +aa(lp13440 +g15 +aI794 +aI-844 +aI807 +aI-868 +aI800 +aI-858 +aa(lp13441 +g15 +aI773 +aI-791 +aI787 +aI-831 +aI780 +aI-813 +aa(lp13442 +g20 +aI497 +aI0 +aa(lp13443 +g10 +aa(lp13444 +g8 +aI899 +aI0 +aa(lp13445 +g10 +aa(lp13446 +g8 +aI899 +aI0 +aasVZ +(lp13447 +(lp13448 +g8 +aI712 +aI-896 +aa(lp13449 +g20 +aI210 +aI-65 +aa(lp13450 +g20 +aI546 +aI-65 +aa(lp13451 +g15 +aI597 +aI-74 +aI566 +aI-65 +aI583 +aI-68 +aa(lp13452 +g15 +aI629 +aI-98 +aI610 +aI-80 +aI621 +aI-88 +aa(lp13453 +g15 +aI648 +aI-133 +aI637 +aI-108 +aI644 +aI-120 +aa(lp13454 +g15 +aI657 +aI-175 +aI652 +aI-146 +aI655 +aI-160 +aa(lp13455 +g20 +aI664 +aI-232 +aa(lp13456 +g20 +aI733 +aI-232 +aa(lp13457 +g20 +aI726 +aI0 +aa(lp13458 +g20 +aI48 +aI0 +aa(lp13459 +g20 +aI48 +aI-52 +aa(lp13460 +g20 +aI548 +aI-884 +aa(lp13461 +g20 +aI258 +aI-884 +aa(lp13462 +g15 +aI209 +aI-876 +aI238 +aI-884 +aI222 +aI-882 +aa(lp13463 +g15 +aI177 +aI-852 +aI196 +aI-870 +aI185 +aI-862 +aa(lp13464 +g15 +aI158 +aI-817 +aI168 +aI-842 +aI162 +aI-830 +aa(lp13465 +g15 +aI149 +aI-775 +aI153 +aI-804 +aI150 +aI-790 +aa(lp13466 +g20 +aI142 +aI-718 +aa(lp13467 +g20 +aI73 +aI-718 +aa(lp13468 +g20 +aI80 +aI-951 +aa(lp13469 +g20 +aI712 +aI-951 +aa(lp13470 +g10 +aa(lp13471 +g8 +aI789 +aI0 +aa(lp13472 +g10 +aa(lp13473 +g8 +aI789 +aI0 +aasV^ +(lp13474 +(lp13475 +g8 +aI348 +aI-951 +aa(lp13476 +g20 +aI394 +aI-951 +aa(lp13477 +g20 +aI675 +aI-354 +aa(lp13478 +g20 +aI586 +aI-354 +aa(lp13479 +g20 +aI370 +aI-828 +aa(lp13480 +g20 +aI157 +aI-354 +aa(lp13481 +g20 +aI67 +aI-354 +aa(lp13482 +g10 +aa(lp13483 +g8 +aI745 +aI0 +aa(lp13484 +g10 +aa(lp13485 +g8 +aI745 +aI0 +aasVb +(lp13486 +(lp13487 +g8 +aI745 +aI-358 +aa(lp13488 +g15 +aI727 +aI-191 +aI745 +aI-294 +aI739 +aI-238 +aa(lp13489 +g15 +aI675 +aI-75 +aI715 +aI-144 +aI698 +aI-106 +aa(lp13490 +g15 +aI589 +aI-8 +aI652 +aI-45 +aI623 +aI-22 +aa(lp13491 +g15 +aI473 +aI13 +aI555 +aI6 +aI517 +aI13 +aa(lp13492 +g15 +aI403 +aI5 +aI447 +aI13 +aI424 +aI10 +aa(lp13493 +g15 +aI347 +aI-19 +aI382 +aI0 +aI364 +aI-8 +aa(lp13494 +g15 +aI303 +aI-56 +aI330 +aI-29 +aI315 +aI-41 +aa(lp13495 +g15 +aI269 +aI-103 +aI290 +aI-70 +aI279 +aI-86 +aa(lp13496 +g20 +aI261 +aI-103 +aa(lp13497 +g20 +aI237 +aI0 +aa(lp13498 +g20 +aI24 +aI0 +aa(lp13499 +g20 +aI24 +aI-55 +aa(lp13500 +g20 +aI34 +aI-55 +aa(lp13501 +g15 +aI77 +aI-58 +aI49 +aI-55 +aI63 +aI-56 +aa(lp13502 +g15 +aI111 +aI-72 +aI90 +aI-60 +aI101 +aI-65 +aa(lp13503 +g15 +aI135 +aI-101 +aI121 +aI-78 +aI129 +aI-88 +aa(lp13504 +g15 +aI143 +aI-151 +aI140 +aI-113 +aI143 +aI-130 +aa(lp13505 +g20 +aI143 +aI-866 +aa(lp13506 +g15 +aI135 +aI-913 +aI143 +aI-885 +aI140 +aI-901 +aa(lp13507 +g15 +aI111 +aI-940 +aI129 +aI-925 +aI121 +aI-934 +aa(lp13508 +g15 +aI76 +aI-953 +aI101 +aI-947 +aI89 +aI-951 +aa(lp13509 +g15 +aI34 +aI-956 +aI63 +aI-955 +aI49 +aI-956 +aa(lp13510 +g20 +aI24 +aI-956 +aa(lp13511 +g20 +aI24 +aI-1012 +aa(lp13512 +g20 +aI269 +aI-1012 +aa(lp13513 +g20 +aI269 +aI-767 +aa(lp13514 +g15 +aI268 +aI-715 +aI269 +aI-752 +aI269 +aI-735 +aa(lp13515 +g15 +aI266 +aI-658 +aI268 +aI-695 +aI267 +aI-676 +aa(lp13516 +g15 +aI264 +aI-593 +aI266 +aI-637 +aI265 +aI-616 +aa(lp13517 +g20 +aI269 +aI-593 +aa(lp13518 +g15 +aI303 +aI-649 +aI279 +aI-614 +aI290 +aI-632 +aa(lp13519 +g15 +aI347 +aI-691 +aI315 +aI-665 +aI330 +aI-679 +aa(lp13520 +g15 +aI402 +aI-717 +aI363 +aI-702 +aI382 +aI-711 +aa(lp13521 +g15 +aI473 +aI-727 +aI423 +aI-724 +aI447 +aI-727 +aa(lp13522 +g15 +aI589 +aI-705 +aI517 +aI-727 +aI555 +aI-720 +aa(lp13523 +g15 +aI675 +aI-638 +aI623 +aI-691 +aI652 +aI-668 +aa(lp13524 +g15 +aI727 +aI-523 +aI698 +aI-608 +aI715 +aI-570 +aa(lp13525 +g15 +aI745 +aI-358 +aI739 +aI-477 +aI745 +aI-422 +aa(lp13526 +g10 +aa(lp13527 +g8 +aI450 +aI-642 +aa(lp13528 +g15 +aI363 +aI-624 +aI415 +aI-642 +aI386 +aI-636 +aa(lp13529 +g15 +aI307 +aI-572 +aI340 +aI-613 +aI321 +aI-595 +aa(lp13530 +g15 +aI278 +aI-483 +aI294 +aI-549 +aI284 +aI-519 +aa(lp13531 +g15 +aI269 +aI-358 +aI272 +aI-448 +aI269 +aI-406 +aa(lp13532 +g15 +aI278 +aI-235 +aI269 +aI-311 +aI272 +aI-270 +aa(lp13533 +g15 +aI308 +aI-145 +aI284 +aI-199 +aI294 +aI-169 +aa(lp13534 +g15 +aI364 +aI-90 +aI322 +aI-121 +aI341 +aI-102 +aa(lp13535 +g15 +aI451 +aI-71 +aI387 +aI-77 +aI416 +aI-71 +aa(lp13536 +g15 +aI527 +aI-90 +aI481 +aI-71 +aI506 +aI-77 +aa(lp13537 +g15 +aI577 +aI-145 +aI547 +aI-102 +aI564 +aI-121 +aa(lp13538 +g15 +aI606 +aI-235 +aI591 +aI-169 +aI600 +aI-199 +aa(lp13539 +g15 +aI615 +aI-359 +aI612 +aI-271 +aI615 +aI-312 +aa(lp13540 +g15 +aI606 +aI-483 +aI615 +aI-406 +aI612 +aI-448 +aa(lp13541 +g15 +aI577 +aI-571 +aI600 +aI-518 +aI591 +aI-548 +aa(lp13542 +g15 +aI526 +aI-624 +aI564 +aI-595 +aI547 +aI-612 +aa(lp13543 +g15 +aI450 +aI-642 +aI505 +aI-636 +aI480 +aI-642 +aa(lp13544 +g10 +aa(lp13545 +g8 +aI818 +aI0 +aa(lp13546 +g10 +aa(lp13547 +g8 +aI818 +aI0 +aasVf +(lp13548 +(lp13549 +g8 +aI447 +aI-55 +aa(lp13550 +g20 +aI447 +aI0 +aa(lp13551 +g20 +aI35 +aI0 +aa(lp13552 +g20 +aI35 +aI-55 +aa(lp13553 +g20 +aI53 +aI-55 +aa(lp13554 +g15 +aI96 +aI-58 +aI68 +aI-55 +aI82 +aI-56 +aa(lp13555 +g15 +aI130 +aI-72 +aI109 +aI-60 +aI120 +aI-65 +aa(lp13556 +g15 +aI153 +aI-101 +aI140 +aI-78 +aI148 +aI-88 +aa(lp13557 +g15 +aI162 +aI-151 +aI159 +aI-113 +aI162 +aI-130 +aa(lp13558 +g20 +aI162 +aI-651 +aa(lp13559 +g20 +aI41 +aI-651 +aa(lp13560 +g20 +aI41 +aI-714 +aa(lp13561 +g20 +aI162 +aI-714 +aa(lp13562 +g20 +aI162 +aI-780 +aa(lp13563 +g15 +aI179 +aI-886 +aI162 +aI-820 +aI168 +aI-855 +aa(lp13564 +g15 +aI225 +aI-963 +aI189 +aI-916 +aI205 +aI-942 +aa(lp13565 +g15 +aI300 +aI-1010 +aI246 +aI-983 +aI271 +aI-999 +aa(lp13566 +g15 +aI398 +aI-1026 +aI329 +aI-1020 +aI361 +aI-1026 +aa(lp13567 +g15 +aI486 +aI-1019 +aI433 +aI-1026 +aI462 +aI-1023 +aa(lp13568 +g15 +aI543 +aI-1000 +aI510 +aI-1014 +aI529 +aI-1008 +aa(lp13569 +g15 +aI575 +aI-970 +aI558 +aI-991 +aI569 +aI-982 +aa(lp13570 +g15 +aI585 +aI-933 +aI582 +aI-959 +aI585 +aI-947 +aa(lp13571 +g15 +aI577 +aI-900 +aI585 +aI-920 +aI582 +aI-910 +aa(lp13572 +g15 +aI554 +aI-877 +aI571 +aI-891 +aI564 +aI-883 +aa(lp13573 +g15 +aI519 +aI-863 +aI544 +aI-871 +aI533 +aI-866 +aa(lp13574 +g15 +aI475 +aI-858 +aI506 +aI-859 +aI491 +aI-858 +aa(lp13575 +g15 +aI471 +aI-897 +aI475 +aI-871 +aI474 +aI-884 +aa(lp13576 +g15 +aI457 +aI-931 +aI468 +aI-910 +aI464 +aI-921 +aa(lp13577 +g15 +aI430 +aI-955 +aI450 +aI-941 +aI441 +aI-949 +aa(lp13578 +g15 +aI388 +aI-965 +aI419 +aI-962 +aI404 +aI-965 +aa(lp13579 +g15 +aI340 +aI-953 +aI368 +aI-965 +aI352 +aI-961 +aa(lp13580 +g15 +aI309 +aI-921 +aI327 +aI-946 +aI317 +aI-935 +aa(lp13581 +g15 +aI292 +aI-867 +aI301 +aI-906 +aI295 +aI-888 +aa(lp13582 +g15 +aI287 +aI-793 +aI289 +aI-846 +aI287 +aI-821 +aa(lp13583 +g20 +aI287 +aI-714 +aa(lp13584 +g20 +aI475 +aI-714 +aa(lp13585 +g20 +aI475 +aI-651 +aa(lp13586 +g20 +aI287 +aI-651 +aa(lp13587 +g20 +aI287 +aI-151 +aa(lp13588 +g15 +aI296 +aI-101 +aI287 +aI-130 +aI290 +aI-113 +aa(lp13589 +g15 +aI319 +aI-72 +aI302 +aI-88 +aI310 +aI-78 +aa(lp13590 +g15 +aI354 +aI-58 +aI329 +aI-65 +aI341 +aI-60 +aa(lp13591 +g15 +aI397 +aI-55 +aI368 +aI-56 +aI382 +aI-55 +aa(lp13592 +g10 +aa(lp13593 +g8 +aI492 +aI0 +aa(lp13594 +g10 +aa(lp13595 +g8 +aI492 +aI0 +aasVj +(lp13596 +(lp13597 +g8 +aI269 +aI-714 +aa(lp13598 +g20 +aI269 +aI10 +aa(lp13599 +g15 +aI250 +aI160 +aI269 +aI70 +aI263 +aI120 +aa(lp13600 +g15 +aI195 +aI255 +aI236 +aI199 +aI218 +aI231 +aa(lp13601 +g15 +aI111 +aI305 +aI171 +aI278 +aI143 +aI295 +aa(lp13602 +g15 +aI5 +aI320 +aI79 +aI315 +aI43 +aI320 +aa(lp13603 +g20 +aI-16 +aI320 +aa(lp13604 +g20 +aI-16 +aI257 +aa(lp13605 +g20 +aI-6 +aI257 +aa(lp13606 +g15 +aI57 +aI245 +aI17 +aI257 +aI38 +aI253 +aa(lp13607 +g15 +aI104 +aI205 +aI75 +aI237 +aI91 +aI224 +aa(lp13608 +g15 +aI133 +aI129 +aI117 +aI186 +aI127 +aI161 +aa(lp13609 +g15 +aI143 +aI12 +aI140 +aI98 +aI143 +aI59 +aa(lp13610 +g20 +aI143 +aI-567 +aa(lp13611 +g15 +aI135 +aI-614 +aI143 +aI-586 +aI140 +aI-602 +aa(lp13612 +g15 +aI111 +aI-642 +aI129 +aI-626 +aI121 +aI-635 +aa(lp13613 +g15 +aI76 +aI-655 +aI101 +aI-648 +aI89 +aI-652 +aa(lp13614 +g15 +aI34 +aI-658 +aI63 +aI-657 +aI49 +aI-658 +aa(lp13615 +g20 +aI30 +aI-658 +aa(lp13616 +g20 +aI30 +aI-714 +aa(lp13617 +g10 +aa(lp13618 +g8 +aI125 +aI-930 +aa(lp13619 +g15 +aI131 +aI-969 +aI125 +aI-946 +aI127 +aI-959 +aa(lp13620 +g15 +aI147 +aI-994 +aI135 +aI-980 +aI140 +aI-988 +aa(lp13621 +g15 +aI171 +aI-1008 +aI154 +aI-1001 +aI162 +aI-1006 +aa(lp13622 +g15 +aI201 +aI-1012 +aI180 +aI-1011 +aI190 +aI-1012 +aa(lp13623 +g15 +aI230 +aI-1008 +aI211 +aI-1012 +aI221 +aI-1011 +aa(lp13624 +g15 +aI254 +aI-994 +aI240 +aI-1006 +aI248 +aI-1001 +aa(lp13625 +g15 +aI271 +aI-969 +aI261 +aI-988 +aI267 +aI-980 +aa(lp13626 +g15 +aI277 +aI-930 +aI275 +aI-959 +aI277 +aI-946 +aa(lp13627 +g15 +aI271 +aI-891 +aI277 +aI-914 +aI275 +aI-901 +aa(lp13628 +g15 +aI254 +aI-866 +aI267 +aI-881 +aI261 +aI-872 +aa(lp13629 +g15 +aI230 +aI-852 +aI248 +aI-859 +aI240 +aI-854 +aa(lp13630 +g15 +aI201 +aI-847 +aI221 +aI-849 +aI211 +aI-847 +aa(lp13631 +g15 +aI171 +aI-852 +aI190 +aI-847 +aI180 +aI-849 +aa(lp13632 +g15 +aI147 +aI-866 +aI162 +aI-854 +aI154 +aI-859 +aa(lp13633 +g15 +aI131 +aI-891 +aI140 +aI-872 +aI135 +aI-881 +aa(lp13634 +g15 +aI125 +aI-930 +aI127 +aI-901 +aI125 +aI-914 +aa(lp13635 +g10 +aa(lp13636 +g8 +aI399 +aI0 +aa(lp13637 +g10 +aa(lp13638 +g8 +aI399 +aI0 +aasVn +(lp13639 +(lp13640 +g8 +aI395 +aI-55 +aa(lp13641 +g20 +aI395 +aI0 +aa(lp13642 +g20 +aI37 +aI0 +aa(lp13643 +g20 +aI37 +aI-55 +aa(lp13644 +g20 +aI48 +aI-55 +aa(lp13645 +g15 +aI90 +aI-58 +aI63 +aI-55 +aI77 +aI-56 +aa(lp13646 +g15 +aI125 +aI-72 +aI104 +aI-60 +aI115 +aI-65 +aa(lp13647 +g15 +aI148 +aI-101 +aI135 +aI-78 +aI142 +aI-88 +aa(lp13648 +g15 +aI157 +aI-151 +aI154 +aI-113 +aI157 +aI-130 +aa(lp13649 +g20 +aI157 +aI-567 +aa(lp13650 +g15 +aI148 +aI-614 +aI157 +aI-586 +aI154 +aI-602 +aa(lp13651 +g15 +aI125 +aI-642 +aI142 +aI-626 +aI134 +aI-635 +aa(lp13652 +g15 +aI90 +aI-655 +aI115 +aI-648 +aI103 +aI-652 +aa(lp13653 +g15 +aI48 +aI-658 +aI76 +aI-657 +aI62 +aI-658 +aa(lp13654 +g20 +aI44 +aI-658 +aa(lp13655 +g20 +aI44 +aI-714 +aa(lp13656 +g20 +aI259 +aI-714 +aa(lp13657 +g20 +aI277 +aI-606 +aa(lp13658 +g20 +aI283 +aI-606 +aa(lp13659 +g15 +aI327 +aI-667 +aI297 +aI-631 +aI312 +aI-651 +aa(lp13660 +g15 +aI376 +aI-704 +aI343 +aI-683 +aI359 +aI-695 +aa(lp13661 +g15 +aI431 +aI-722 +aI393 +aI-713 +aI412 +aI-719 +aa(lp13662 +g15 +aI492 +aI-727 +aI450 +aI-725 +aI470 +aI-727 +aa(lp13663 +g15 +aI586 +aI-712 +aI527 +aI-727 +aI558 +aI-722 +aa(lp13664 +g15 +aI656 +aI-665 +aI613 +aI-701 +aI637 +aI-686 +aa(lp13665 +g15 +aI700 +aI-584 +aI675 +aI-644 +aI690 +aI-617 +aa(lp13666 +g15 +aI716 +aI-466 +aI711 +aI-551 +aI716 +aI-511 +aa(lp13667 +g20 +aI716 +aI-151 +aa(lp13668 +g15 +aI723 +aI-101 +aI716 +aI-130 +aI718 +aI-113 +aa(lp13669 +g15 +aI744 +aI-72 +aI728 +aI-88 +aI735 +aI-78 +aa(lp13670 +g15 +aI777 +aI-58 +aI753 +aI-65 +aI764 +aI-60 +aa(lp13671 +g15 +aI818 +aI-55 +aI789 +aI-56 +aI803 +aI-55 +aa(lp13672 +g20 +aI822 +aI-55 +aa(lp13673 +g20 +aI822 +aI0 +aa(lp13674 +g20 +aI590 +aI0 +aa(lp13675 +g20 +aI590 +aI-459 +aa(lp13676 +g15 +aI582 +aI-537 +aI590 +aI-488 +aI587 +aI-514 +aa(lp13677 +g15 +aI557 +aI-594 +aI577 +aI-559 +aI569 +aI-578 +aa(lp13678 +g15 +aI512 +aI-630 +aI546 +aI-610 +aI531 +aI-622 +aa(lp13679 +g15 +aI444 +aI-642 +aI493 +aI-638 +aI470 +aI-642 +aa(lp13680 +g15 +aI367 +aI-624 +aI413 +aI-642 +aI388 +aI-636 +aa(lp13681 +g15 +aI317 +aI-577 +aI346 +aI-612 +aI330 +aI-596 +aa(lp13682 +g15 +aI290 +aI-508 +aI305 +aI-557 +aI296 +aI-534 +aa(lp13683 +g15 +aI282 +aI-425 +aI285 +aI-481 +aI282 +aI-454 +aa(lp13684 +g20 +aI282 +aI-144 +aa(lp13685 +g15 +aI291 +aI-97 +aI282 +aI-125 +aI285 +aI-109 +aa(lp13686 +g15 +aI315 +aI-70 +aI297 +aI-85 +aI305 +aI-76 +aa(lp13687 +g15 +aI349 +aI-58 +aI325 +aI-64 +aI336 +aI-60 +aa(lp13688 +g15 +aI391 +aI-55 +aI363 +aI-56 +aI377 +aI-55 +aa(lp13689 +g10 +aa(lp13690 +g8 +aI860 +aI0 +aa(lp13691 +g10 +aa(lp13692 +g8 +aI860 +aI0 +aasVr +(lp13693 +(lp13694 +g8 +aI429 +aI0 +aa(lp13695 +g20 +aI44 +aI0 +aa(lp13696 +g20 +aI44 +aI-55 +aa(lp13697 +g20 +aI48 +aI-55 +aa(lp13698 +g15 +aI90 +aI-58 +aI63 +aI-55 +aI77 +aI-56 +aa(lp13699 +g15 +aI125 +aI-72 +aI104 +aI-60 +aI115 +aI-65 +aa(lp13700 +g15 +aI148 +aI-101 +aI135 +aI-78 +aI142 +aI-88 +aa(lp13701 +g15 +aI157 +aI-151 +aI154 +aI-113 +aI157 +aI-130 +aa(lp13702 +g20 +aI157 +aI-567 +aa(lp13703 +g15 +aI148 +aI-614 +aI157 +aI-586 +aI154 +aI-602 +aa(lp13704 +g15 +aI125 +aI-642 +aI142 +aI-626 +aI134 +aI-635 +aa(lp13705 +g15 +aI90 +aI-655 +aI115 +aI-648 +aI103 +aI-652 +aa(lp13706 +g15 +aI48 +aI-658 +aI76 +aI-657 +aI62 +aI-658 +aa(lp13707 +g20 +aI44 +aI-658 +aa(lp13708 +g20 +aI44 +aI-714 +aa(lp13709 +g20 +aI249 +aI-714 +aa(lp13710 +g20 +aI274 +aI-582 +aa(lp13711 +g20 +aI281 +aI-582 +aa(lp13712 +g15 +aI307 +aI-638 +aI289 +aI-602 +aI298 +aI-620 +aa(lp13713 +g15 +aI341 +aI-684 +aI317 +aI-656 +aI328 +aI-671 +aa(lp13714 +g15 +aI390 +aI-716 +aI354 +aI-698 +aI371 +aI-708 +aa(lp13715 +g15 +aI464 +aI-727 +aI410 +aI-723 +aI434 +aI-727 +aa(lp13716 +g15 +aI572 +aI-702 +aI512 +aI-727 +aI548 +aI-718 +aa(lp13717 +g15 +aI608 +aI-630 +aI596 +aI-685 +aI608 +aI-661 +aa(lp13718 +g15 +aI601 +aI-591 +aI608 +aI-616 +aI605 +aI-603 +aa(lp13719 +g15 +aI579 +aI-561 +aI596 +aI-580 +aI589 +aI-570 +aa(lp13720 +g15 +aI541 +aI-542 +aI569 +aI-553 +aI556 +aI-546 +aa(lp13721 +g15 +aI483 +aI-535 +aI525 +aI-537 +aI506 +aI-535 +aa(lp13722 +g15 +aI468 +aI-615 +aI483 +aI-572 +aI478 +aI-598 +aa(lp13723 +g15 +aI413 +aI-639 +aI457 +aI-631 +aI439 +aI-639 +aa(lp13724 +g15 +aI369 +aI-625 +aI396 +aI-639 +aI382 +aI-634 +aa(lp13725 +g15 +aI334 +aI-588 +aI356 +aI-616 +aI344 +aI-603 +aa(lp13726 +g15 +aI310 +aI-535 +aI325 +aI-573 +aI316 +aI-555 +aa(lp13727 +g15 +aI293 +aI-473 +aI303 +aI-515 +aI298 +aI-494 +aa(lp13728 +g15 +aI285 +aI-411 +aI289 +aI-452 +aI286 +aI-431 +aa(lp13729 +g15 +aI282 +aI-354 +aI283 +aI-390 +aI282 +aI-371 +aa(lp13730 +g20 +aI282 +aI-144 +aa(lp13731 +g15 +aI291 +aI-97 +aI282 +aI-125 +aI285 +aI-109 +aa(lp13732 +g15 +aI315 +aI-70 +aI297 +aI-85 +aI305 +aI-76 +aa(lp13733 +g15 +aI349 +aI-58 +aI325 +aI-64 +aI336 +aI-60 +aa(lp13734 +g15 +aI391 +aI-55 +aI363 +aI-56 +aI377 +aI-55 +aa(lp13735 +g20 +aI429 +aI-55 +aa(lp13736 +g10 +aa(lp13737 +g8 +aI628 +aI0 +aa(lp13738 +g10 +aa(lp13739 +g8 +aI628 +aI0 +aasVv +(lp13740 +(lp13741 +g8 +aI5 +aI-658 +aa(lp13742 +g20 +aI5 +aI-714 +aa(lp13743 +g20 +aI338 +aI-714 +aa(lp13744 +g20 +aI338 +aI-658 +aa(lp13745 +g20 +aI321 +aI-658 +aa(lp13746 +g15 +aI261 +aI-642 +aI294 +aI-658 +aI274 +aI-653 +aa(lp13747 +g15 +aI241 +aI-593 +aI248 +aI-632 +aI241 +aI-616 +aa(lp13748 +g15 +aI244 +aI-571 +aI241 +aI-586 +aI242 +aI-579 +aa(lp13749 +g15 +aI251 +aI-545 +aI245 +aI-563 +aI248 +aI-555 +aa(lp13750 +g20 +aI342 +aI-293 +aa(lp13751 +g15 +aI360 +aI-241 +aI348 +aI-277 +aI353 +aI-260 +aa(lp13752 +g15 +aI377 +aI-185 +aI366 +aI-222 +aI371 +aI-203 +aa(lp13753 +g15 +aI391 +aI-133 +aI382 +aI-167 +aI387 +aI-150 +aa(lp13754 +g15 +aI401 +aI-92 +aI396 +aI-117 +aI399 +aI-103 +aa(lp13755 +g20 +aI405 +aI-92 +aa(lp13756 +g15 +aI416 +aI-128 +aI407 +aI-102 +aI411 +aI-114 +aa(lp13757 +g15 +aI433 +aI-174 +aI421 +aI-142 +aI426 +aI-157 +aa(lp13758 +g15 +aI452 +aI-225 +aI439 +aI-191 +aI446 +aI-208 +aa(lp13759 +g15 +aI472 +aI-275 +aI459 +aI-242 +aI465 +aI-259 +aa(lp13760 +g20 +aI567 +aI-535 +aa(lp13761 +g15 +aI577 +aI-566 +aI572 +aI-546 +aI575 +aI-556 +aa(lp13762 +g15 +aI580 +aI-592 +aI579 +aI-576 +aI580 +aI-585 +aa(lp13763 +g15 +aI558 +aI-642 +aI580 +aI-615 +aI572 +aI-632 +aa(lp13764 +g15 +aI492 +aI-658 +aI543 +aI-653 +aI521 +aI-658 +aa(lp13765 +g20 +aI482 +aI-658 +aa(lp13766 +g20 +aI482 +aI-714 +aa(lp13767 +g20 +aI768 +aI-714 +aa(lp13768 +g20 +aI768 +aI-658 +aa(lp13769 +g20 +aI751 +aI-658 +aa(lp13770 +g15 +aI718 +aI-654 +aI738 +aI-658 +aI727 +aI-656 +aa(lp13771 +g15 +aI694 +aI-638 +aI709 +aI-651 +aI701 +aI-646 +aa(lp13772 +g15 +aI672 +aI-606 +aI686 +aI-630 +aI679 +aI-619 +aa(lp13773 +g15 +aI650 +aI-554 +aI666 +aI-592 +aI658 +aI-575 +aa(lp13774 +g20 +aI440 +aI0 +aa(lp13775 +g20 +aI318 +aI0 +aa(lp13776 +g20 +aI104 +aI-587 +aa(lp13777 +g15 +aI87 +aI-621 +aI98 +aI-601 +aI93 +aI-612 +aa(lp13778 +g15 +aI68 +aI-643 +aI82 +aI-631 +aI75 +aI-638 +aa(lp13779 +g15 +aI42 +aI-655 +aI60 +aI-649 +aI52 +aI-652 +aa(lp13780 +g15 +aI9 +aI-658 +aI33 +aI-657 +aI22 +aI-658 +aa(lp13781 +g10 +aa(lp13782 +g8 +aI772 +aI0 +aa(lp13783 +g10 +aa(lp13784 +g8 +aI772 +aI0 +aasVz +(lp13785 +(lp13786 +g8 +aI453 +aI-75 +aa(lp13787 +g15 +aI491 +aI-84 +aI468 +aI-75 +aI481 +aI-78 +aa(lp13788 +g15 +aI517 +aI-108 +aI502 +aI-90 +aI510 +aI-98 +aa(lp13789 +g15 +aI533 +aI-143 +aI523 +aI-118 +aI529 +aI-130 +aa(lp13790 +g15 +aI544 +aI-185 +aI537 +aI-156 +aI541 +aI-170 +aa(lp13791 +g20 +aI550 +aI-215 +aa(lp13792 +g20 +aI606 +aI-215 +aa(lp13793 +g20 +aI600 +aI0 +aa(lp13794 +g20 +aI55 +aI0 +aa(lp13795 +g20 +aI55 +aI-52 +aa(lp13796 +g20 +aI442 +aI-638 +aa(lp13797 +g20 +aI234 +aI-638 +aa(lp13798 +g15 +aI191 +aI-631 +aI217 +aI-638 +aI202 +aI-635 +aa(lp13799 +g15 +aI163 +aI-610 +aI180 +aI-626 +aI170 +aI-619 +aa(lp13800 +g15 +aI146 +aI-577 +aI156 +aI-601 +aI150 +aI-590 +aa(lp13801 +g15 +aI132 +aI-530 +aI141 +aI-563 +aI136 +aI-547 +aa(lp13802 +g20 +aI130 +aI-524 +aa(lp13803 +g20 +aI74 +aI-524 +aa(lp13804 +g20 +aI87 +aI-714 +aa(lp13805 +g20 +aI598 +aI-714 +aa(lp13806 +g20 +aI598 +aI-659 +aa(lp13807 +g20 +aI210 +aI-75 +aa(lp13808 +g10 +aa(lp13809 +g8 +aI681 +aI0 +aa(lp13810 +g10 +aa(lp13811 +g8 +aI681 +aI0 +aasV~ +(lp13812 +(lp13813 +g8 +aI505 +aI-358 +aa(lp13814 +g15 +aI464 +aI-366 +aI492 +aI-358 +aI478 +aI-360 +aa(lp13815 +g15 +aI423 +aI-386 +aI450 +aI-371 +aI437 +aI-378 +aa(lp13816 +g15 +aI384 +aI-413 +aI409 +aI-395 +aI396 +aI-404 +aa(lp13817 +g15 +aI350 +aI-442 +aI372 +aI-423 +aI360 +aI-433 +aa(lp13818 +g15 +aI321 +aI-468 +aI340 +aI-451 +aI331 +aI-460 +aa(lp13819 +g15 +aI293 +aI-491 +aI312 +aI-477 +aI302 +aI-484 +aa(lp13820 +g15 +aI264 +aI-506 +aI283 +aI-497 +aI274 +aI-502 +aa(lp13821 +g15 +aI235 +aI-512 +aI255 +aI-510 +aI245 +aI-512 +aa(lp13822 +g15 +aI177 +aI-474 +aI209 +aI-512 +aI190 +aI-499 +aa(lp13823 +g15 +aI151 +aI-358 +aI165 +aI-449 +aI156 +aI-410 +aa(lp13824 +g20 +aI73 +aI-358 +aa(lp13825 +g15 +aI85 +aI-441 +aI76 +aI-386 +aI80 +aI-413 +aa(lp13826 +g15 +aI111 +aI-516 +aI91 +aI-469 +aI99 +aI-494 +aa(lp13827 +g15 +aI161 +aI-570 +aI124 +aI-538 +aI140 +aI-556 +aa(lp13828 +g15 +aI241 +aI-591 +aI181 +aI-584 +aI208 +aI-591 +aa(lp13829 +g15 +aI285 +aI-582 +aI256 +aI-591 +aI271 +aI-588 +aa(lp13830 +g15 +aI328 +aI-561 +aI300 +aI-577 +aI314 +aI-570 +aa(lp13831 +g15 +aI368 +aI-532 +aI342 +aI-552 +aI355 +aI-543 +aa(lp13832 +g15 +aI402 +aI-503 +aI380 +aI-522 +aI391 +aI-512 +aa(lp13833 +g15 +aI430 +aI-478 +aI411 +aI-494 +aI421 +aI-486 +aa(lp13834 +g15 +aI457 +aI-457 +aI439 +aI-470 +aI448 +aI-463 +aa(lp13835 +g15 +aI484 +aI-442 +aI466 +aI-451 +aI475 +aI-446 +aa(lp13836 +g15 +aI511 +aI-437 +aI493 +aI-438 +aI502 +aI-437 +aa(lp13837 +g15 +aI566 +aI-477 +aI536 +aI-437 +aI554 +aI-450 +aa(lp13838 +g15 +aI593 +aI-591 +aI578 +aI-503 +aI587 +aI-541 +aa(lp13839 +g20 +aI673 +aI-591 +aa(lp13840 +g15 +aI659 +aI-508 +aI670 +aI-563 +aI665 +aI-535 +aa(lp13841 +g15 +aI631 +aI-433 +aI653 +aI-480 +aI644 +aI-455 +aa(lp13842 +g15 +aI583 +aI-379 +aI619 +aI-411 +aI603 +aI-392 +aa(lp13843 +g15 +aI505 +aI-358 +aI562 +aI-365 +aI536 +aI-358 +aa(lp13844 +g10 +aa(lp13845 +g8 +aI748 +aI0 +aa(lp13846 +g10 +aa(lp13847 +g8 +aI748 +aI0 +aasV! +(lp13848 +(lp13849 +g8 +aI143 +aI-951 +aa(lp13850 +g20 +aI298 +aI-951 +aa(lp13851 +g20 +aI251 +aI-267 +aa(lp13852 +g20 +aI190 +aI-267 +aa(lp13853 +g10 +aa(lp13854 +g8 +aI137 +aI-80 +aa(lp13855 +g15 +aI143 +aI-124 +aI137 +aI-98 +aI139 +aI-112 +aa(lp13856 +g15 +aI161 +aI-151 +aI148 +aI-135 +aI154 +aI-144 +aa(lp13857 +g15 +aI188 +aI-166 +aI169 +aI-158 +aI178 +aI-163 +aa(lp13858 +g15 +aI221 +aI-171 +aI198 +aI-169 +aI209 +aI-171 +aa(lp13859 +g15 +aI253 +aI-166 +aI232 +aI-171 +aI243 +aI-169 +aa(lp13860 +g15 +aI280 +aI-151 +aI263 +aI-163 +aI272 +aI-158 +aa(lp13861 +g15 +aI298 +aI-124 +aI287 +aI-144 +aI293 +aI-135 +aa(lp13862 +g15 +aI305 +aI-80 +aI303 +aI-112 +aI305 +aI-98 +aa(lp13863 +g15 +aI298 +aI-37 +aI305 +aI-64 +aI303 +aI-49 +aa(lp13864 +g15 +aI280 +aI-9 +aI293 +aI-26 +aI287 +aI-16 +aa(lp13865 +g15 +aI253 +aI5 +aI272 +aI-3 +aI263 +aI1 +aa(lp13866 +g15 +aI221 +aI9 +aI243 +aI8 +aI232 +aI9 +aa(lp13867 +g15 +aI188 +aI5 +aI209 +aI9 +aI198 +aI8 +aa(lp13868 +g15 +aI161 +aI-9 +aI178 +aI1 +aI169 +aI-3 +aa(lp13869 +g15 +aI143 +aI-37 +aI154 +aI-16 +aI148 +aI-26 +aa(lp13870 +g15 +aI137 +aI-80 +aI139 +aI-49 +aI137 +aI-64 +aa(lp13871 +g10 +aa(lp13872 +g8 +aI444 +aI0 +aa(lp13873 +g10 +aa(lp13874 +g8 +aI444 +aI0 +aasV% +(lp13875 +(lp13876 +g8 +aI497 +aI-670 +aa(lp13877 +g15 +aI483 +aI-548 +aI497 +aI-625 +aI492 +aI-584 +aa(lp13878 +g15 +aI442 +aI-454 +aI474 +aI-511 +aI460 +aI-480 +aa(lp13879 +g15 +aI374 +aI-394 +aI424 +aI-428 +aI401 +aI-408 +aa(lp13880 +g15 +aI278 +aI-372 +aI347 +aI-379 +aI315 +aI-372 +aa(lp13881 +g15 +aI180 +aI-394 +aI240 +aI-372 +aI207 +aI-379 +aa(lp13882 +g15 +aI111 +aI-454 +aI152 +aI-408 +aI129 +aI-428 +aa(lp13883 +g15 +aI72 +aI-548 +aI94 +aI-480 +aI81 +aI-511 +aa(lp13884 +g15 +aI59 +aI-670 +aI64 +aI-584 +aI59 +aI-625 +aa(lp13885 +g15 +aI72 +aI-791 +aI59 +aI-714 +aI64 +aI-755 +aa(lp13886 +g15 +aI111 +aI-884 +aI81 +aI-827 +aI94 +aI-858 +aa(lp13887 +g15 +aI180 +aI-944 +aI129 +aI-910 +aI152 +aI-930 +aa(lp13888 +g15 +aI279 +aI-965 +aI208 +aI-958 +aI241 +aI-965 +aa(lp13889 +g15 +aI375 +aI-944 +aI316 +aI-965 +aI348 +aI-958 +aa(lp13890 +g15 +aI443 +aI-884 +aI402 +aI-930 +aI425 +aI-910 +aa(lp13891 +g15 +aI483 +aI-791 +aI461 +aI-858 +aI474 +aI-827 +aa(lp13892 +g15 +aI497 +aI-670 +aI492 +aI-755 +aI497 +aI-714 +aa(lp13893 +g10 +aa(lp13894 +g8 +aI179 +aI-670 +aa(lp13895 +g15 +aI184 +aI-567 +aI179 +aI-631 +aI181 +aI-597 +aa(lp13896 +g15 +aI201 +aI-491 +aI188 +aI-537 +aI194 +aI-511 +aa(lp13897 +g15 +aI232 +aI-443 +aI209 +aI-470 +aI219 +aI-454 +aa(lp13898 +g15 +aI278 +aI-427 +aI245 +aI-432 +aI260 +aI-427 +aa(lp13899 +g15 +aI324 +aI-443 +aI296 +aI-427 +aI312 +aI-432 +aa(lp13900 +g15 +aI355 +aI-491 +aI337 +aI-454 +aI347 +aI-470 +aa(lp13901 +g15 +aI371 +aI-567 +aI362 +aI-511 +aI368 +aI-537 +aa(lp13902 +g15 +aI376 +aI-670 +aI374 +aI-597 +aI376 +aI-631 +aa(lp13903 +g15 +aI371 +aI-771 +aI376 +aI-707 +aI374 +aI-741 +aa(lp13904 +g15 +aI355 +aI-846 +aI368 +aI-800 +aI362 +aI-825 +aa(lp13905 +g15 +aI325 +aI-893 +aI347 +aI-866 +aI337 +aI-882 +aa(lp13906 +g15 +aI279 +aI-909 +aI313 +aI-903 +aI298 +aI-909 +aa(lp13907 +g15 +aI233 +aI-893 +aI261 +aI-909 +aI246 +aI-903 +aa(lp13908 +g15 +aI202 +aI-846 +aI220 +aI-882 +aI210 +aI-866 +aa(lp13909 +g15 +aI184 +aI-771 +aI194 +aI-825 +aI188 +aI-800 +aa(lp13910 +g15 +aI179 +aI-670 +aI181 +aI-741 +aI179 +aI-707 +aa(lp13911 +g10 +aa(lp13912 +g8 +aI1134 +aI-283 +aa(lp13913 +g15 +aI1121 +aI-161 +aI1134 +aI-238 +aI1130 +aI-198 +aa(lp13914 +g15 +aI1080 +aI-67 +aI1111 +aI-125 +aI1098 +aI-93 +aa(lp13915 +g15 +aI1011 +aI-7 +aI1061 +aI-41 +aI1039 +aI-21 +aa(lp13916 +g15 +aI916 +aI13 +aI984 +aI6 +aI952 +aI13 +aa(lp13917 +g15 +aI817 +aI-7 +aI877 +aI13 +aI844 +aI6 +aa(lp13918 +g15 +aI749 +aI-67 +aI789 +aI-21 +aI766 +aI-41 +aa(lp13919 +g15 +aI709 +aI-161 +aI731 +aI-93 +aI718 +aI-125 +aa(lp13920 +g15 +aI697 +aI-283 +aI701 +aI-198 +aI697 +aI-238 +aa(lp13921 +g15 +aI709 +aI-404 +aI697 +aI-328 +aI701 +aI-368 +aa(lp13922 +g15 +aI749 +aI-497 +aI718 +aI-441 +aI731 +aI-472 +aa(lp13923 +g15 +aI817 +aI-557 +aI767 +aI-523 +aI789 +aI-543 +aa(lp13924 +g15 +aI917 +aI-578 +aI845 +aI-571 +aI878 +aI-578 +aa(lp13925 +g15 +aI1012 +aI-557 +aI953 +aI-578 +aI985 +aI-571 +aa(lp13926 +g15 +aI1080 +aI-497 +aI1039 +aI-543 +aI1062 +aI-523 +aa(lp13927 +g15 +aI1121 +aI-404 +aI1098 +aI-472 +aI1111 +aI-441 +aa(lp13928 +g15 +aI1134 +aI-283 +aI1130 +aI-368 +aI1134 +aI-328 +aa(lp13929 +g10 +aa(lp13930 +g8 +aI817 +aI-283 +aa(lp13931 +g15 +aI822 +aI-180 +aI817 +aI-245 +aI818 +aI-211 +aa(lp13932 +g15 +aI839 +aI-104 +aI825 +aI-150 +aI831 +aI-125 +aa(lp13933 +g15 +aI869 +aI-56 +aI847 +aI-83 +aI857 +aI-67 +aa(lp13934 +g15 +aI916 +aI-40 +aI882 +aI-45 +aI897 +aI-40 +aa(lp13935 +g15 +aI962 +aI-56 +aI934 +aI-40 +aI949 +aI-45 +aa(lp13936 +g15 +aI992 +aI-104 +aI974 +aI-67 +aI984 +aI-83 +aa(lp13937 +g15 +aI1008 +aI-180 +aI999 +aI-125 +aI1004 +aI-150 +aa(lp13938 +g15 +aI1013 +aI-283 +aI1011 +aI-211 +aI1013 +aI-245 +aa(lp13939 +g15 +aI1008 +aI-384 +aI1013 +aI-321 +aI1011 +aI-354 +aa(lp13940 +g15 +aI992 +aI-459 +aI1004 +aI-413 +aI999 +aI-438 +aa(lp13941 +g15 +aI962 +aI-506 +aI984 +aI-480 +aI975 +aI-495 +aa(lp13942 +g15 +aI917 +aI-522 +aI950 +aI-517 +aI935 +aI-522 +aa(lp13943 +g15 +aI870 +aI-506 +aI899 +aI-522 +aI883 +aI-517 +aa(lp13944 +g15 +aI839 +aI-459 +aI857 +aI-495 +aI847 +aI-480 +aa(lp13945 +g15 +aI822 +aI-384 +aI831 +aI-438 +aI825 +aI-413 +aa(lp13946 +g15 +aI817 +aI-283 +aI818 +aI-354 +aI817 +aI-321 +aa(lp13947 +g10 +aa(lp13948 +g8 +aI401 +aI0 +aa(lp13949 +g20 +aI313 +aI0 +aa(lp13950 +g20 +aI789 +aI-951 +aa(lp13951 +g20 +aI876 +aI-951 +aa(lp13952 +g10 +aa(lp13953 +g8 +aI1194 +aI0 +aa(lp13954 +g10 +aa(lp13955 +g8 +aI1194 +aI0 +aasV) +(lp13956 +(lp13957 +g8 +aI246 +aI-422 +aa(lp13958 +g15 +aI240 +aI-578 +aI246 +aI-475 +aI244 +aI-527 +aa(lp13959 +g15 +aI213 +aI-725 +aI236 +aI-630 +aI227 +aI-679 +aa(lp13960 +g15 +aI151 +aI-852 +aI199 +aI-771 +aI178 +aI-813 +aa(lp13961 +g15 +aI42 +aI-952 +aI124 +aI-891 +aI88 +aI-924 +aa(lp13962 +g20 +aI42 +aI-1012 +aa(lp13963 +g15 +aI199 +aI-924 +aI104 +aI-988 +aI156 +aI-958 +aa(lp13964 +g15 +aI305 +aI-800 +aI243 +aI-889 +aI278 +aI-848 +aa(lp13965 +g15 +aI366 +aI-635 +aI333 +aI-753 +aI353 +aI-698 +aa(lp13966 +g15 +aI385 +aI-422 +aI379 +aI-573 +aI385 +aI-502 +aa(lp13967 +g15 +aI366 +aI-207 +aI385 +aI-341 +aI379 +aI-270 +aa(lp13968 +g15 +aI305 +aI-41 +aI353 +aI-144 +aI333 +aI-89 +aa(lp13969 +g15 +aI199 +aI82 +aI278 +aI6 +aI243 +aI47 +aa(lp13970 +g15 +aI42 +aI171 +aI156 +aI117 +aI104 +aI146 +aa(lp13971 +g20 +aI42 +aI109 +aa(lp13972 +g15 +aI151 +aI9 +aI88 +aI82 +aI124 +aI48 +aa(lp13973 +g15 +aI213 +aI-118 +aI178 +aI-29 +aI199 +aI-72 +aa(lp13974 +g15 +aI240 +aI-265 +aI227 +aI-164 +aI236 +aI-213 +aa(lp13975 +g15 +aI246 +aI-422 +aI244 +aI-316 +aI246 +aI-369 +aa(lp13976 +g10 +aa(lp13977 +g8 +aI461 +aI0 +aa(lp13978 +g10 +aa(lp13979 +g8 +aI461 +aI0 +aasV- +(lp13980 +(lp13981 +g8 +aI33 +aI-312 +aa(lp13982 +g20 +aI33 +aI-412 +aa(lp13983 +g20 +aI380 +aI-412 +aa(lp13984 +g20 +aI380 +aI-312 +aa(lp13985 +g10 +aa(lp13986 +g8 +aI413 +aI0 +aa(lp13987 +g10 +aa(lp13988 +g8 +aI413 +aI0 +aasV1 +(lp13989 +(lp13990 +g8 +aI128 +aI0 +aa(lp13991 +g20 +aI128 +aI-55 +aa(lp13992 +g20 +aI217 +aI-55 +aa(lp13993 +g15 +aI260 +aI-58 +aI232 +aI-55 +aI246 +aI-56 +aa(lp13994 +g15 +aI294 +aI-72 +aI273 +aI-60 +aI284 +aI-65 +aa(lp13995 +g15 +aI318 +aI-101 +aI304 +aI-78 +aI312 +aI-88 +aa(lp13996 +g15 +aI326 +aI-151 +aI323 +aI-113 +aI326 +aI-130 +aa(lp13997 +g20 +aI326 +aI-851 +aa(lp13998 +g15 +aI278 +aI-795 +aI309 +aI-830 +aI293 +aI-812 +aa(lp13999 +g15 +aI235 +aI-751 +aI263 +aI-778 +aI248 +aI-763 +aa(lp14000 +g15 +aI194 +aI-723 +aI221 +aI-739 +aI207 +aI-729 +aa(lp14001 +g15 +aI154 +aI-713 +aI181 +aI-716 +aI167 +aI-713 +aa(lp14002 +g15 +aI106 +aI-732 +aI135 +aI-713 +aI119 +aI-719 +aa(lp14003 +g15 +aI87 +aI-784 +aI94 +aI-746 +aI87 +aI-763 +aa(lp14004 +g15 +aI128 +aI-797 +aI101 +aI-788 +aI114 +aI-792 +aa(lp14005 +g15 +aI172 +aI-816 +aI142 +aI-802 +aI156 +aI-808 +aa(lp14006 +g15 +aI222 +aI-846 +aI187 +aI-824 +aI204 +aI-834 +aa(lp14007 +g15 +aI282 +aI-887 +aI240 +aI-857 +aI260 +aI-871 +aa(lp14008 +g20 +aI376 +aI-956 +aa(lp14009 +g20 +aI461 +aI-956 +aa(lp14010 +g20 +aI461 +aI-151 +aa(lp14011 +g15 +aI470 +aI-101 +aI461 +aI-130 +aI464 +aI-113 +aa(lp14012 +g15 +aI493 +aI-72 +aI475 +aI-88 +aI483 +aI-78 +aa(lp14013 +g15 +aI528 +aI-58 +aI503 +aI-65 +aI515 +aI-60 +aa(lp14014 +g15 +aI570 +aI-55 +aI541 +aI-56 +aI555 +aI-55 +aa(lp14015 +g20 +aI636 +aI-55 +aa(lp14016 +g20 +aI636 +aI0 +aa(lp14017 +g10 +aa(lp14018 +g8 +aI745 +aI0 +aa(lp14019 +g10 +aa(lp14020 +g8 +aI745 +aI0 +aasV5 +(lp14021 +(lp14022 +g8 +aI318 +aI-64 +aa(lp14023 +g15 +aI394 +aI-76 +aI345 +aI-64 +aI370 +aI-68 +aa(lp14024 +g15 +aI454 +aI-113 +aI417 +aI-83 +aI437 +aI-96 +aa(lp14025 +g15 +aI494 +aI-183 +aI471 +aI-131 +aI485 +aI-154 +aa(lp14026 +g15 +aI509 +aI-289 +aI504 +aI-212 +aI509 +aI-247 +aa(lp14027 +g15 +aI494 +aI-381 +aI509 +aI-325 +aI504 +aI-355 +aa(lp14028 +g15 +aI453 +aI-446 +aI485 +aI-407 +aI471 +aI-429 +aa(lp14029 +g15 +aI389 +aI-485 +aI435 +aI-464 +aI414 +aI-477 +aa(lp14030 +g15 +aI306 +aI-498 +aI365 +aI-494 +aI337 +aI-498 +aa(lp14031 +g15 +aI247 +aI-495 +aI283 +aI-498 +aI263 +aI-497 +aa(lp14032 +g15 +aI202 +aI-488 +aI230 +aI-493 +aI215 +aI-491 +aa(lp14033 +g15 +aI169 +aI-479 +aI189 +aI-485 +aI178 +aI-482 +aa(lp14034 +g15 +aI142 +aI-468 +aI159 +aI-475 +aI150 +aI-472 +aa(lp14035 +g20 +aI110 +aI-478 +aa(lp14036 +g20 +aI153 +aI-950 +aa(lp14037 +g20 +aI598 +aI-950 +aa(lp14038 +g20 +aI605 +aI-748 +aa(lp14039 +g20 +aI549 +aI-748 +aa(lp14040 +g20 +aI544 +aI-788 +aa(lp14041 +g15 +aI538 +aI-813 +aI542 +aI-798 +aI541 +aI-806 +aa(lp14042 +g15 +aI527 +aI-829 +aI536 +aI-819 +aI532 +aI-825 +aa(lp14043 +g15 +aI506 +aI-840 +aI522 +aI-834 +aI515 +aI-837 +aa(lp14044 +g15 +aI472 +aI-843 +aI497 +aI-842 +aI485 +aI-843 +aa(lp14045 +g20 +aI213 +aI-843 +aa(lp14046 +g20 +aI188 +aI-550 +aa(lp14047 +g15 +aI246 +aI-564 +aI201 +aI-555 +aI221 +aI-559 +aa(lp14048 +g15 +aI343 +aI-571 +aI271 +aI-569 +aI304 +aI-571 +aa(lp14049 +g15 +aI463 +aI-554 +aI386 +aI-571 +aI426 +aI-565 +aa(lp14050 +g15 +aI560 +aI-501 +aI500 +aI-542 +aI533 +aI-524 +aa(lp14051 +g15 +aI624 +aI-413 +aI587 +aI-478 +aI609 +aI-448 +aa(lp14052 +g15 +aI647 +aI-289 +aI640 +aI-377 +aI647 +aI-336 +aa(lp14053 +g15 +aI625 +aI-166 +aI647 +aI-244 +aI640 +aI-203 +aa(lp14054 +g15 +aI562 +aI-70 +aI611 +aI-128 +aI590 +aI-96 +aa(lp14055 +g15 +aI461 +aI-8 +aI535 +aI-43 +aI501 +aI-22 +aa(lp14056 +g15 +aI325 +aI13 +aI421 +aI6 +aI376 +aI13 +aa(lp14057 +g15 +aI202 +aI0 +aI276 +aI13 +aI235 +aI9 +aa(lp14058 +g15 +aI125 +aI-31 +aI170 +aI-7 +aI144 +aI-18 +aa(lp14059 +g15 +aI85 +aI-74 +aI106 +aI-44 +aI93 +aI-58 +aa(lp14060 +g15 +aI73 +aI-120 +aI77 +aI-90 +aI73 +aI-105 +aa(lp14061 +g15 +aI94 +aI-178 +aI73 +aI-145 +aI80 +aI-164 +aa(lp14062 +g15 +aI157 +aI-199 +aI107 +aI-192 +aI128 +aI-199 +aa(lp14063 +g15 +aI167 +aI-146 +aI157 +aI-180 +aI160 +aI-162 +aa(lp14064 +g15 +aI197 +aI-103 +aI174 +aI-129 +aI184 +aI-115 +aa(lp14065 +g15 +aI247 +aI-75 +aI210 +aI-91 +aI227 +aI-82 +aa(lp14066 +g15 +aI318 +aI-64 +aI267 +aI-68 +aI291 +aI-64 +aa(lp14067 +g10 +aa(lp14068 +g8 +aI745 +aI0 +aa(lp14069 +g10 +aa(lp14070 +g8 +aI745 +aI0 +aasV9 +(lp14071 +(lp14072 +g8 +aI304 +aI-58 +aa(lp14073 +g15 +aI467 +aI-157 +aI377 +aI-58 +aI432 +aI-91 +aa(lp14074 +g15 +aI526 +aI-456 +aI502 +aI-223 +aI522 +aI-322 +aa(lp14075 +g15 +aI493 +aI-422 +aI517 +aI-444 +aI505 +aI-433 +aa(lp14076 +g15 +aI449 +aI-393 +aI480 +aI-411 +aI465 +aI-402 +aa(lp14077 +g15 +aI395 +aI-373 +aI433 +aI-385 +aI415 +aI-378 +aa(lp14078 +g15 +aI330 +aI-366 +aI375 +aI-368 +aI354 +aI-366 +aa(lp14079 +g15 +aI224 +aI-383 +aI292 +aI-366 +aI256 +aI-371 +aa(lp14080 +g15 +aI140 +aI-433 +aI191 +aI-394 +aI164 +aI-411 +aa(lp14081 +g15 +aI86 +aI-518 +aI117 +aI-456 +aI99 +aI-484 +aa(lp14082 +g15 +aI67 +aI-636 +aI74 +aI-552 +aI67 +aI-591 +aa(lp14083 +g15 +aI87 +aI-769 +aI67 +aI-685 +aI74 +aI-729 +aa(lp14084 +g15 +aI143 +aI-872 +aI100 +aI-809 +aI119 +aI-844 +aa(lp14085 +g15 +aI233 +aI-940 +aI168 +aI-901 +aI198 +aI-924 +aa(lp14086 +g15 +aI353 +aI-965 +aI268 +aI-956 +aI308 +aI-965 +aa(lp14087 +g15 +aI477 +aI-939 +aI398 +aI-965 +aI440 +aI-956 +aa(lp14088 +g15 +aI576 +aI-858 +aI515 +aI-921 +aI548 +aI-894 +aa(lp14089 +g15 +aI640 +aI-718 +aI603 +aI-821 +aI625 +aI-775 +aa(lp14090 +g15 +aI664 +aI-517 +aI656 +aI-662 +aI664 +aI-595 +aa(lp14091 +g15 +aI655 +aI-380 +aI664 +aI-470 +aI661 +aI-425 +aa(lp14092 +g15 +aI627 +aI-254 +aI649 +aI-336 +aI640 +aI-294 +aa(lp14093 +g15 +aI580 +aI-146 +aI615 +aI-215 +aI599 +aI-179 +aa(lp14094 +g15 +aI511 +aI-60 +aI561 +aI-113 +aI538 +aI-84 +aa(lp14095 +g15 +aI419 +aI-4 +aI484 +aI-36 +aI453 +aI-17 +aa(lp14096 +g15 +aI302 +aI15 +aI384 +aI8 +aI345 +aI15 +aa(lp14097 +g15 +aI208 +aI5 +aI264 +aI15 +aI233 +aI12 +aa(lp14098 +g15 +aI149 +aI-21 +aI183 +aI-1 +aI163 +aI-10 +aa(lp14099 +g15 +aI118 +aI-58 +aI134 +aI-31 +aI124 +aI-44 +aa(lp14100 +g15 +aI109 +aI-99 +aI112 +aI-72 +aI109 +aI-85 +aa(lp14101 +g15 +aI121 +aI-141 +aI109 +aI-116 +aI113 +aI-130 +aa(lp14102 +g15 +aI149 +aI-163 +aI129 +aI-152 +aI139 +aI-160 +aa(lp14103 +g15 +aI171 +aI-123 +aI155 +aI-149 +aI162 +aI-136 +aa(lp14104 +g15 +aI204 +aI-89 +aI180 +aI-110 +aI191 +aI-99 +aa(lp14105 +g15 +aI248 +aI-66 +aI216 +aI-79 +aI231 +aI-72 +aa(lp14106 +g15 +aI304 +aI-58 +aI264 +aI-60 +aI283 +aI-58 +aa(lp14107 +g10 +aa(lp14108 +g8 +aI360 +aI-444 +aa(lp14109 +g15 +aI419 +aI-454 +aI381 +aI-445 +aI401 +aI-448 +aa(lp14110 +g15 +aI467 +aI-477 +aI437 +aI-460 +aI453 +aI-467 +aa(lp14111 +g15 +aI503 +aI-511 +aI481 +aI-487 +aI493 +aI-498 +aa(lp14112 +g15 +aI527 +aI-552 +aI513 +aI-524 +aI521 +aI-538 +aa(lp14113 +g20 +aI527 +aI-555 +aa(lp14114 +g15 +aI513 +aI-706 +aI527 +aI-614 +aI522 +aI-664 +aa(lp14115 +g15 +aI477 +aI-811 +aI504 +aI-749 +aI493 +aI-784 +aa(lp14116 +g15 +aI423 +aI-871 +aI462 +aI-838 +aI444 +aI-858 +aa(lp14117 +g15 +aI353 +aI-891 +aI402 +aI-884 +aI379 +aI-891 +aa(lp14118 +g15 +aI243 +aI-829 +aI306 +aI-891 +aI269 +aI-870 +aa(lp14119 +g15 +aI205 +aI-649 +aI217 +aI-788 +aI205 +aI-728 +aa(lp14120 +g15 +aI214 +aI-556 +aI205 +aI-613 +aI208 +aI-582 +aa(lp14121 +g15 +aI244 +aI-492 +aI221 +aI-530 +aI231 +aI-508 +aa(lp14122 +g15 +aI292 +aI-456 +aI257 +aI-475 +aI273 +aI-463 +aa(lp14123 +g15 +aI360 +aI-444 +aI311 +aI-448 +aI334 +aI-444 +aa(lp14124 +g10 +aa(lp14125 +g8 +aI745 +aI0 +aa(lp14126 +g10 +aa(lp14127 +g8 +aI745 +aI0 +aasV= +(lp14128 +(lp14129 +g8 +aI658 +aI-383 +aa(lp14130 +g20 +aI658 +aI-304 +aa(lp14131 +g20 +aI86 +aI-304 +aa(lp14132 +g20 +aI86 +aI-383 +aa(lp14133 +g10 +aa(lp14134 +g8 +aI658 +aI-646 +aa(lp14135 +g20 +aI658 +aI-567 +aa(lp14136 +g20 +aI86 +aI-567 +aa(lp14137 +g20 +aI86 +aI-646 +aa(lp14138 +g10 +aa(lp14139 +g8 +aI745 +aI0 +aa(lp14140 +g10 +aa(lp14141 +g8 +aI745 +aI0 +aasVA +(lp14142 +(lp14143 +g8 +aI269 +aI-317 +aa(lp14144 +g20 +aI218 +aI-177 +aa(lp14145 +g15 +aI209 +aI-147 +aI214 +aI-167 +aI211 +aI-157 +aa(lp14146 +g15 +aI206 +aI-120 +aI207 +aI-136 +aI206 +aI-128 +aa(lp14147 +g15 +aI228 +aI-71 +aI206 +aI-98 +aI213 +aI-81 +aa(lp14148 +g15 +aI294 +aI-55 +aI242 +aI-60 +aI264 +aI-55 +aa(lp14149 +g20 +aI325 +aI-55 +aa(lp14150 +g20 +aI325 +aI0 +aa(lp14151 +g20 +aI0 +aI0 +aa(lp14152 +g20 +aI0 +aI-55 +aa(lp14153 +g20 +aI25 +aI-55 +aa(lp14154 +g15 +aI58 +aI-59 +aI38 +aI-55 +aI49 +aI-56 +aa(lp14155 +g15 +aI83 +aI-75 +aI67 +aI-62 +aI75 +aI-67 +aa(lp14156 +g15 +aI104 +aI-107 +aI90 +aI-83 +aI97 +aI-94 +aa(lp14157 +g15 +aI126 +aI-159 +aI111 +aI-121 +aI118 +aI-138 +aa(lp14158 +g20 +aI422 +aI-951 +aa(lp14159 +g20 +aI526 +aI-951 +aa(lp14160 +g20 +aI828 +aI-126 +aa(lp14161 +g15 +aI844 +aI-91 +aI833 +aI-112 +aI838 +aI-101 +aa(lp14162 +g15 +aI863 +aI-70 +aI849 +aI-82 +aI855 +aI-75 +aa(lp14163 +g15 +aI888 +aI-58 +aI870 +aI-64 +aI879 +aI-60 +aa(lp14164 +g15 +aI922 +aI-55 +aI898 +aI-56 +aI909 +aI-55 +aa(lp14165 +g20 +aI940 +aI-55 +aa(lp14166 +g20 +aI940 +aI0 +aa(lp14167 +g20 +aI573 +aI0 +aa(lp14168 +g20 +aI573 +aI-55 +aa(lp14169 +g20 +aI604 +aI-55 +aa(lp14170 +g15 +aI684 +aI-119 +aI657 +aI-55 +aI684 +aI-76 +aa(lp14171 +g15 +aI681 +aI-142 +aI684 +aI-126 +aI683 +aI-134 +aa(lp14172 +g15 +aI673 +aI-168 +aI679 +aI-149 +aI676 +aI-158 +aa(lp14173 +g20 +aI619 +aI-317 +aa(lp14174 +g10 +aa(lp14175 +g8 +aI513 +aI-618 +aa(lp14176 +g15 +aI474 +aI-729 +aI499 +aI-657 +aI486 +aI-694 +aa(lp14177 +g15 +aI446 +aI-828 +aI463 +aI-763 +aI453 +aI-796 +aa(lp14178 +g15 +aI435 +aI-782 +aI443 +aI-812 +aI439 +aI-797 +aa(lp14179 +g15 +aI422 +aI-736 +aI431 +aI-767 +aI427 +aI-752 +aa(lp14180 +g15 +aI406 +aI-687 +aI417 +aI-720 +aI412 +aI-704 +aa(lp14181 +g15 +aI385 +aI-630 +aI400 +aI-670 +aI393 +aI-651 +aa(lp14182 +g20 +aI294 +aI-384 +aa(lp14183 +g20 +aI595 +aI-384 +aa(lp14184 +g10 +aa(lp14185 +g8 +aI940 +aI0 +aa(lp14186 +g10 +aa(lp14187 +g8 +aI940 +aI0 +aasVE +(lp14188 +(lp14189 +g8 +aI311 +aI-65 +aa(lp14190 +g20 +aI569 +aI-65 +aa(lp14191 +g15 +aI623 +aI-74 +aI590 +aI-65 +aI608 +aI-68 +aa(lp14192 +g15 +aI660 +aI-98 +aI638 +aI-80 +aI650 +aI-88 +aa(lp14193 +g15 +aI684 +aI-133 +aI670 +aI-108 +aI678 +aI-120 +aa(lp14194 +g15 +aI695 +aI-175 +aI689 +aI-146 +aI693 +aI-160 +aa(lp14195 +g20 +aI705 +aI-232 +aa(lp14196 +g20 +aI774 +aI-232 +aa(lp14197 +g20 +aI765 +aI0 +aa(lp14198 +g20 +aI50 +aI0 +aa(lp14199 +g20 +aI50 +aI-55 +aa(lp14200 +g20 +aI67 +aI-55 +aa(lp14201 +g15 +aI109 +aI-58 +aI82 +aI-55 +aI96 +aI-56 +aa(lp14202 +g15 +aI144 +aI-70 +aI122 +aI-60 +aI134 +aI-64 +aa(lp14203 +g15 +aI168 +aI-97 +aI154 +aI-76 +aI162 +aI-85 +aa(lp14204 +g15 +aI177 +aI-144 +aI174 +aI-109 +aI177 +aI-125 +aa(lp14205 +g20 +aI177 +aI-799 +aa(lp14206 +g15 +aI168 +aI-849 +aI177 +aI-820 +aI174 +aI-837 +aa(lp14207 +g15 +aI145 +aI-878 +aI162 +aI-862 +aI155 +aI-872 +aa(lp14208 +g15 +aI110 +aI-892 +aI135 +aI-885 +aI123 +aI-889 +aa(lp14209 +g15 +aI67 +aI-895 +aI97 +aI-894 +aI82 +aI-895 +aa(lp14210 +g20 +aI50 +aI-895 +aa(lp14211 +g20 +aI50 +aI-951 +aa(lp14212 +g20 +aI722 +aI-951 +aa(lp14213 +g20 +aI729 +aI-718 +aa(lp14214 +g20 +aI660 +aI-718 +aa(lp14215 +g20 +aI653 +aI-775 +aa(lp14216 +g15 +aI643 +aI-817 +aI651 +aI-790 +aI648 +aI-804 +aa(lp14217 +g15 +aI622 +aI-852 +aI638 +aI-830 +aI631 +aI-842 +aa(lp14218 +g15 +aI586 +aI-876 +aI612 +aI-862 +aI601 +aI-870 +aa(lp14219 +g15 +aI535 +aI-884 +aI572 +aI-882 +aI555 +aI-884 +aa(lp14220 +g20 +aI311 +aI-884 +aa(lp14221 +g20 +aI311 +aI-530 +aa(lp14222 +g20 +aI633 +aI-530 +aa(lp14223 +g20 +aI633 +aI-465 +aa(lp14224 +g20 +aI311 +aI-465 +aa(lp14225 +g10 +aa(lp14226 +g8 +aI830 +aI0 +aa(lp14227 +g10 +aa(lp14228 +g8 +aI830 +aI0 +aasVI +(lp14229 +(lp14230 +g8 +aI50 +aI0 +aa(lp14231 +g20 +aI50 +aI-55 +aa(lp14232 +g20 +aI67 +aI-55 +aa(lp14233 +g15 +aI110 +aI-58 +aI82 +aI-55 +aI97 +aI-56 +aa(lp14234 +g15 +aI145 +aI-72 +aI123 +aI-60 +aI135 +aI-65 +aa(lp14235 +g15 +aI168 +aI-101 +aI155 +aI-78 +aI162 +aI-88 +aa(lp14236 +g15 +aI177 +aI-151 +aI174 +aI-113 +aI177 +aI-130 +aa(lp14237 +g20 +aI177 +aI-799 +aa(lp14238 +g15 +aI168 +aI-849 +aI177 +aI-820 +aI174 +aI-837 +aa(lp14239 +g15 +aI145 +aI-878 +aI162 +aI-862 +aI155 +aI-872 +aa(lp14240 +g15 +aI110 +aI-892 +aI135 +aI-885 +aI123 +aI-889 +aa(lp14241 +g15 +aI67 +aI-895 +aI97 +aI-894 +aI82 +aI-895 +aa(lp14242 +g20 +aI50 +aI-895 +aa(lp14243 +g20 +aI50 +aI-951 +aa(lp14244 +g20 +aI438 +aI-951 +aa(lp14245 +g20 +aI438 +aI-895 +aa(lp14246 +g20 +aI421 +aI-895 +aa(lp14247 +g15 +aI378 +aI-892 +aI406 +aI-895 +aI392 +aI-894 +aa(lp14248 +g15 +aI344 +aI-878 +aI365 +aI-889 +aI353 +aI-885 +aa(lp14249 +g15 +aI320 +aI-849 +aI334 +aI-872 +aI326 +aI-862 +aa(lp14250 +g15 +aI311 +aI-799 +aI314 +aI-837 +aI311 +aI-820 +aa(lp14251 +g20 +aI311 +aI-151 +aa(lp14252 +g15 +aI320 +aI-101 +aI311 +aI-130 +aI314 +aI-113 +aa(lp14253 +g15 +aI344 +aI-72 +aI326 +aI-88 +aI334 +aI-78 +aa(lp14254 +g15 +aI378 +aI-58 +aI353 +aI-65 +aI365 +aI-60 +aa(lp14255 +g15 +aI421 +aI-55 +aI392 +aI-56 +aI406 +aI-55 +aa(lp14256 +g20 +aI438 +aI-55 +aa(lp14257 +g20 +aI438 +aI0 +aa(lp14258 +g10 +aa(lp14259 +g8 +aI489 +aI0 +aa(lp14260 +g10 +aa(lp14261 +g8 +aI489 +aI0 +aasVM +(lp14262 +(lp14263 +g8 +aI845 +aI0 +aa(lp14264 +g20 +aI845 +aI-55 +aa(lp14265 +g20 +aI849 +aI-55 +aa(lp14266 +g15 +aI888 +aI-58 +aI863 +aI-55 +aI876 +aI-56 +aa(lp14267 +g15 +aI917 +aI-70 +aI899 +aI-60 +aI909 +aI-64 +aa(lp14268 +g15 +aI936 +aI-95 +aI925 +aI-76 +aI932 +aI-84 +aa(lp14269 +g15 +aI945 +aI-139 +aI941 +aI-106 +aI944 +aI-121 +aa(lp14270 +g20 +aI945 +aI-851 +aa(lp14271 +g20 +aI639 +aI0 +aa(lp14272 +g20 +aI567 +aI0 +aa(lp14273 +g20 +aI258 +aI-849 +aa(lp14274 +g20 +aI258 +aI-151 +aa(lp14275 +g15 +aI264 +aI-101 +aI258 +aI-130 +aI260 +aI-113 +aa(lp14276 +g15 +aI284 +aI-72 +aI269 +aI-88 +aI275 +aI-78 +aa(lp14277 +g15 +aI314 +aI-58 +aI292 +aI-65 +aI302 +aI-60 +aa(lp14278 +g15 +aI354 +aI-55 +aI326 +aI-56 +aI340 +aI-55 +aa(lp14279 +g20 +aI358 +aI-55 +aa(lp14280 +g20 +aI358 +aI0 +aa(lp14281 +g20 +aI50 +aI0 +aa(lp14282 +g20 +aI50 +aI-55 +aa(lp14283 +g20 +aI67 +aI-55 +aa(lp14284 +g15 +aI109 +aI-58 +aI82 +aI-55 +aI96 +aI-56 +aa(lp14285 +g15 +aI144 +aI-70 +aI122 +aI-60 +aI134 +aI-64 +aa(lp14286 +g15 +aI168 +aI-97 +aI154 +aI-76 +aI162 +aI-85 +aa(lp14287 +g15 +aI177 +aI-144 +aI174 +aI-109 +aI177 +aI-125 +aa(lp14288 +g20 +aI177 +aI-804 +aa(lp14289 +g15 +aI168 +aI-852 +aI177 +aI-824 +aI174 +aI-840 +aa(lp14290 +g15 +aI144 +aI-879 +aI162 +aI-864 +aI154 +aI-873 +aa(lp14291 +g15 +aI109 +aI-892 +aI134 +aI-886 +aI122 +aI-890 +aa(lp14292 +g15 +aI67 +aI-895 +aI96 +aI-894 +aI82 +aI-895 +aa(lp14293 +g20 +aI50 +aI-895 +aa(lp14294 +g20 +aI50 +aI-951 +aa(lp14295 +g20 +aI354 +aI-951 +aa(lp14296 +g20 +aI630 +aI-189 +aa(lp14297 +g20 +aI904 +aI-951 +aa(lp14298 +g20 +aI1199 +aI-951 +aa(lp14299 +g20 +aI1199 +aI-895 +aa(lp14300 +g20 +aI1182 +aI-895 +aa(lp14301 +g15 +aI1140 +aI-892 +aI1167 +aI-895 +aI1153 +aI-894 +aa(lp14302 +g15 +aI1105 +aI-878 +aI1127 +aI-889 +aI1115 +aI-885 +aa(lp14303 +g15 +aI1082 +aI-849 +aI1095 +aI-872 +aI1087 +aI-862 +aa(lp14304 +g15 +aI1073 +aI-799 +aI1076 +aI-837 +aI1073 +aI-820 +aa(lp14305 +g20 +aI1073 +aI-151 +aa(lp14306 +g15 +aI1082 +aI-101 +aI1073 +aI-130 +aI1076 +aI-113 +aa(lp14307 +g15 +aI1105 +aI-72 +aI1087 +aI-88 +aI1095 +aI-78 +aa(lp14308 +g15 +aI1140 +aI-58 +aI1115 +aI-65 +aI1127 +aI-60 +aa(lp14309 +g15 +aI1182 +aI-55 +aI1153 +aI-56 +aI1167 +aI-55 +aa(lp14310 +g20 +aI1199 +aI-55 +aa(lp14311 +g20 +aI1199 +aI0 +aa(lp14312 +g10 +aa(lp14313 +g8 +aI1250 +aI0 +aa(lp14314 +g10 +aa(lp14315 +g8 +aI1250 +aI0 +aasVQ +(lp14316 +(lp14317 +g8 +aI913 +aI-476 +aa(lp14318 +g15 +aI891 +aI-297 +aI913 +aI-411 +aI906 +aI-351 +aa(lp14319 +g15 +aI828 +aI-152 +aI877 +aI-242 +aI856 +aI-194 +aa(lp14320 +g15 +aI724 +aI-49 +aI800 +aI-110 +aI765 +aI-76 +aa(lp14321 +g15 +aI583 +aI5 +aI683 +aI-22 +aI636 +aI-3 +aa(lp14322 +g15 +aI606 +aI119 +aI587 +aI51 +aI595 +aI89 +aa(lp14323 +g15 +aI647 +aI193 +aI616 +aI150 +aI630 +aI175 +aa(lp14324 +g15 +aI707 +aI232 +aI664 +aI211 +aI684 +aI225 +aa(lp14325 +g15 +aI781 +aI244 +aI729 +aI240 +aI754 +aI244 +aa(lp14326 +g20 +aI802 +aI244 +aa(lp14327 +g20 +aI802 +aI307 +aa(lp14328 +g20 +aI745 +aI307 +aa(lp14329 +g15 +aI640 +aI293 +aI710 +aI307 +aI675 +aI302 +aa(lp14330 +g15 +aI544 +aI244 +aI605 +aI283 +aI573 +aI267 +aa(lp14331 +g15 +aI472 +aI153 +aI516 +aI222 +aI492 +aI191 +aa(lp14332 +g15 +aI437 +aI10 +aI453 +aI115 +aI441 +aI68 +aa(lp14333 +g15 +aI277 +aI-37 +aI376 +aI4 +aI323 +aI-11 +aa(lp14334 +g15 +aI164 +aI-139 +aI232 +aI-63 +aI194 +aI-97 +aa(lp14335 +g15 +aI97 +aI-288 +aI134 +aI-182 +aI112 +aI-231 +aa(lp14336 +g15 +aI74 +aI-478 +aI82 +aI-346 +aI74 +aI-409 +aa(lp14337 +g15 +aI100 +aI-678 +aI74 +aI-551 +aI83 +aI-618 +aa(lp14338 +g15 +aI179 +aI-832 +aI118 +aI-739 +aI144 +aI-790 +aa(lp14339 +g15 +aI310 +aI-931 +aI213 +aI-875 +aI257 +aI-908 +aa(lp14340 +g15 +aI496 +aI-966 +aI363 +aI-954 +aI425 +aI-966 +aa(lp14341 +g15 +aI674 +aI-931 +aI563 +aI-966 +aI622 +aI-954 +aa(lp14342 +g15 +aI805 +aI-832 +aI726 +aI-908 +aI769 +aI-875 +aa(lp14343 +g15 +aI886 +aI-678 +aI840 +aI-789 +aI867 +aI-738 +aa(lp14344 +g15 +aI913 +aI-476 +aI904 +aI-618 +aI913 +aI-550 +aa(lp14345 +g10 +aa(lp14346 +g8 +aI222 +aI-476 +aa(lp14347 +g15 +aI237 +aI-300 +aI222 +aI-410 +aI227 +aI-351 +aa(lp14348 +g15 +aI284 +aI-168 +aI247 +aI-248 +aI262 +aI-204 +aa(lp14349 +g15 +aI368 +aI-86 +aI306 +aI-132 +aI334 +aI-105 +aa(lp14350 +g15 +aI494 +aI-58 +aI403 +aI-67 +aI445 +aI-58 +aa(lp14351 +g15 +aI620 +aI-86 +aI544 +aI-58 +aI586 +aI-67 +aa(lp14352 +g15 +aI704 +aI-168 +aI655 +aI-105 +aI683 +aI-132 +aa(lp14353 +g15 +aI751 +aI-300 +aI726 +aI-204 +aI741 +aI-248 +aa(lp14354 +g15 +aI765 +aI-476 +aI760 +aI-351 +aI765 +aI-410 +aa(lp14355 +g15 +aI751 +aI-653 +aI765 +aI-542 +aI760 +aI-601 +aa(lp14356 +g15 +aI704 +aI-784 +aI741 +aI-705 +aI726 +aI-749 +aa(lp14357 +g15 +aI621 +aI-866 +aI683 +aI-820 +aI655 +aI-847 +aa(lp14358 +g15 +aI496 +aI-894 +aI587 +aI-884 +aI545 +aI-894 +aa(lp14359 +g15 +aI369 +aI-866 +aI446 +aI-894 +aI404 +aI-884 +aa(lp14360 +g15 +aI284 +aI-784 +aI335 +aI-847 +aI306 +aI-820 +aa(lp14361 +g15 +aI237 +aI-653 +aI262 +aI-749 +aI247 +aI-705 +aa(lp14362 +g15 +aI222 +aI-476 +aI227 +aI-601 +aI222 +aI-542 +aa(lp14363 +g10 +aa(lp14364 +g8 +aI989 +aI0 +aa(lp14365 +g10 +aa(lp14366 +g8 +aI989 +aI0 +aasVU +(lp14367 +(lp14368 +g8 +aI482 +aI13 +aa(lp14369 +g15 +aI341 +aI-3 +aI429 +aI13 +aI382 +aI7 +aa(lp14370 +g15 +aI235 +aI-55 +aI299 +aI-14 +aI264 +aI-31 +aa(lp14371 +g15 +aI169 +aI-148 +aI206 +aI-79 +aI184 +aI-110 +aa(lp14372 +g15 +aI146 +aI-287 +aI154 +aI-186 +aI146 +aI-233 +aa(lp14373 +g20 +aI146 +aI-804 +aa(lp14374 +g15 +aI137 +aI-852 +aI146 +aI-824 +aI143 +aI-840 +aa(lp14375 +g15 +aI113 +aI-879 +aI131 +aI-864 +aI123 +aI-873 +aa(lp14376 +g15 +aI79 +aI-892 +aI103 +aI-886 +aI92 +aI-890 +aa(lp14377 +g15 +aI37 +aI-895 +aI65 +aI-894 +aI51 +aI-895 +aa(lp14378 +g20 +aI20 +aI-895 +aa(lp14379 +g20 +aI20 +aI-951 +aa(lp14380 +g20 +aI408 +aI-951 +aa(lp14381 +g20 +aI408 +aI-895 +aa(lp14382 +g20 +aI390 +aI-895 +aa(lp14383 +g15 +aI348 +aI-892 +aI375 +aI-895 +aI361 +aI-894 +aa(lp14384 +g15 +aI313 +aI-878 +aI334 +aI-889 +aI323 +aI-885 +aa(lp14385 +g15 +aI290 +aI-849 +aI303 +aI-872 +aI295 +aI-862 +aa(lp14386 +g15 +aI281 +aI-799 +aI284 +aI-837 +aI281 +aI-820 +aa(lp14387 +g20 +aI281 +aI-279 +aa(lp14388 +g15 +aI297 +aI-180 +aI281 +aI-240 +aI286 +aI-207 +aa(lp14389 +g15 +aI344 +aI-114 +aI308 +aI-153 +aI324 +aI-131 +aa(lp14390 +g15 +aI414 +aI-77 +aI363 +aI-97 +aI387 +aI-85 +aa(lp14391 +g15 +aI503 +aI-65 +aI441 +aI-69 +aI471 +aI-65 +aa(lp14392 +g15 +aI603 +aI-81 +aI542 +aI-65 +aI575 +aI-71 +aa(lp14393 +g15 +aI673 +aI-124 +aI631 +aI-91 +aI655 +aI-106 +aa(lp14394 +g15 +aI714 +aI-190 +aI691 +aI-143 +aI705 +aI-165 +aa(lp14395 +g15 +aI727 +aI-274 +aI723 +aI-216 +aI727 +aI-243 +aa(lp14396 +g20 +aI727 +aI-804 +aa(lp14397 +g15 +aI719 +aI-852 +aI727 +aI-824 +aI724 +aI-840 +aa(lp14398 +g15 +aI695 +aI-879 +aI713 +aI-864 +aI705 +aI-873 +aa(lp14399 +g15 +aI660 +aI-892 +aI685 +aI-886 +aI673 +aI-890 +aa(lp14400 +g15 +aI618 +aI-895 +aI647 +aI-894 +aI633 +aI-895 +aa(lp14401 +g20 +aI601 +aI-895 +aa(lp14402 +g20 +aI601 +aI-951 +aa(lp14403 +g20 +aI936 +aI-951 +aa(lp14404 +g20 +aI936 +aI-895 +aa(lp14405 +g20 +aI918 +aI-895 +aa(lp14406 +g15 +aI876 +aI-892 +aI903 +aI-895 +aI889 +aI-894 +aa(lp14407 +g15 +aI841 +aI-878 +aI862 +aI-889 +aI851 +aI-885 +aa(lp14408 +g15 +aI818 +aI-849 +aI831 +aI-872 +aI823 +aI-862 +aa(lp14409 +g15 +aI809 +aI-799 +aI812 +aI-837 +aI809 +aI-820 +aa(lp14410 +g20 +aI809 +aI-271 +aa(lp14411 +g15 +aI788 +aI-152 +aI809 +aI-227 +aI802 +aI-187 +aa(lp14412 +g15 +aI725 +aI-62 +aI773 +aI-116 +aI753 +aI-86 +aa(lp14413 +g15 +aI623 +aI-6 +aI698 +aI-37 +aI663 +aI-19 +aa(lp14414 +g15 +aI482 +aI13 +aI582 +aI6 +aI535 +aI13 +aa(lp14415 +g10 +aa(lp14416 +g8 +aI955 +aI0 +aa(lp14417 +g10 +aa(lp14418 +g8 +aI955 +aI0 +aasVY +(lp14419 +(lp14420 +g8 +aI212 +aI0 +aa(lp14421 +g20 +aI212 +aI-55 +aa(lp14422 +g20 +aI242 +aI-55 +aa(lp14423 +g15 +aI284 +aI-58 +aI257 +aI-55 +aI271 +aI-56 +aa(lp14424 +g15 +aI319 +aI-70 +aI298 +aI-60 +aI309 +aI-64 +aa(lp14425 +g15 +aI343 +aI-97 +aI329 +aI-76 +aI337 +aI-85 +aa(lp14426 +g15 +aI352 +aI-144 +aI349 +aI-109 +aI352 +aI-125 +aa(lp14427 +g20 +aI352 +aI-396 +aa(lp14428 +g20 +aI105 +aI-825 +aa(lp14429 +g15 +aI84 +aI-857 +aI98 +aI-837 +aI91 +aI-848 +aa(lp14430 +g15 +aI64 +aI-879 +aI78 +aI-866 +aI71 +aI-873 +aa(lp14431 +g15 +aI40 +aI-891 +aI56 +aI-884 +aI49 +aI-888 +aa(lp14432 +g15 +aI10 +aI-895 +aI31 +aI-894 +aI21 +aI-895 +aa(lp14433 +g20 +aI-6 +aI-895 +aa(lp14434 +g20 +aI-6 +aI-951 +aa(lp14435 +g20 +aI360 +aI-951 +aa(lp14436 +g20 +aI360 +aI-895 +aa(lp14437 +g20 +aI310 +aI-895 +aa(lp14438 +g15 +aI280 +aI-892 +aI298 +aI-895 +aI288 +aI-894 +aa(lp14439 +g15 +aI263 +aI-883 +aI273 +aI-889 +aI267 +aI-886 +aa(lp14440 +g15 +aI254 +aI-869 +aI258 +aI-879 +aI255 +aI-874 +aa(lp14441 +g15 +aI251 +aI-853 +aI252 +aI-864 +aI251 +aI-858 +aa(lp14442 +g15 +aI260 +aI-815 +aI251 +aI-840 +aI254 +aI-827 +aa(lp14443 +g15 +aI276 +aI-782 +aI265 +aI-802 +aI270 +aI-791 +aa(lp14444 +g20 +aI374 +aI-603 +aa(lp14445 +g15 +aI414 +aI-522 +aI389 +aI-576 +aI403 +aI-549 +aa(lp14446 +g15 +aI441 +aI-451 +aI424 +aI-495 +aI434 +aI-472 +aa(lp14447 +g15 +aI456 +aI-483 +aI445 +aI-460 +aI450 +aI-471 +aa(lp14448 +g15 +aI475 +aI-520 +aI461 +aI-494 +aI468 +aI-507 +aa(lp14449 +g15 +aI498 +aI-561 +aI482 +aI-533 +aI490 +aI-547 +aa(lp14450 +g15 +aI521 +aI-603 +aI505 +aI-575 +aI513 +aI-589 +aa(lp14451 +g20 +aI606 +aI-756 +aa(lp14452 +g15 +aI625 +aI-800 +aI615 +aI-771 +aI621 +aI-786 +aa(lp14453 +g15 +aI630 +aI-836 +aI629 +aI-813 +aI630 +aI-825 +aa(lp14454 +g15 +aI610 +aI-880 +aI630 +aI-856 +aI623 +aI-870 +aa(lp14455 +g15 +aI550 +aI-895 +aI596 +aI-890 +aI576 +aI-895 +aa(lp14456 +g20 +aI511 +aI-895 +aa(lp14457 +g20 +aI511 +aI-951 +aa(lp14458 +g20 +aI837 +aI-951 +aa(lp14459 +g20 +aI837 +aI-895 +aa(lp14460 +g20 +aI821 +aI-895 +aa(lp14461 +g15 +aI794 +aI-890 +aI812 +aI-895 +aI803 +aI-893 +aa(lp14462 +g15 +aI768 +aI-873 +aI786 +aI-887 +aI777 +aI-881 +aa(lp14463 +g15 +aI741 +aI-841 +aI760 +aI-865 +aI751 +aI-854 +aa(lp14464 +g15 +aI710 +aI-791 +aI732 +aI-828 +aI722 +aI-811 +aa(lp14465 +g20 +aI486 +aI-396 +aa(lp14466 +g20 +aI486 +aI-151 +aa(lp14467 +g15 +aI495 +aI-101 +aI486 +aI-130 +aI489 +aI-113 +aa(lp14468 +g15 +aI518 +aI-72 +aI501 +aI-88 +aI508 +aI-78 +aa(lp14469 +g15 +aI553 +aI-58 +aI528 +aI-65 +aI540 +aI-60 +aa(lp14470 +g15 +aI595 +aI-55 +aI566 +aI-56 +aI580 +aI-55 +aa(lp14471 +g20 +aI626 +aI-55 +aa(lp14472 +g20 +aI626 +aI0 +aa(lp14473 +g10 +aa(lp14474 +g8 +aI833 +aI0 +aa(lp14475 +g10 +aa(lp14476 +g8 +aI833 +aI0 +aasV] +(lp14477 +(lp14478 +g8 +aI49 +aI171 +aa(lp14479 +g20 +aI49 +aI115 +aa(lp14480 +g20 +aI106 +aI115 +aa(lp14481 +g15 +aI149 +aI111 +aI121 +aI115 +aI136 +aI113 +aa(lp14482 +g15 +aI183 +aI98 +aI162 +aI109 +aI174 +aI105 +aa(lp14483 +g15 +aI207 +aI69 +aI193 +aI91 +aI201 +aI82 +aa(lp14484 +g15 +aI216 +aI19 +aI213 +aI56 +aI216 +aI40 +aa(lp14485 +g20 +aI216 +aI-860 +aa(lp14486 +g15 +aI207 +aI-911 +aI216 +aI-881 +aI213 +aI-898 +aa(lp14487 +g15 +aI183 +aI-939 +aI201 +aI-923 +aI193 +aI-933 +aa(lp14488 +g15 +aI149 +aI-953 +aI174 +aI-946 +aI162 +aI-951 +aa(lp14489 +g15 +aI106 +aI-956 +aI136 +aI-955 +aI121 +aI-956 +aa(lp14490 +g20 +aI49 +aI-956 +aa(lp14491 +g20 +aI49 +aI-1012 +aa(lp14492 +g20 +aI346 +aI-1012 +aa(lp14493 +g20 +aI346 +aI171 +aa(lp14494 +g10 +aa(lp14495 +g8 +aI479 +aI0 +aa(lp14496 +g10 +aa(lp14497 +g8 +aI479 +aI0 +aasVa +(lp14498 +(lp14499 +g8 +aI195 +aI-192 +aa(lp14500 +g15 +aI222 +aI-99 +aI195 +aI-151 +aI204 +aI-120 +aa(lp14501 +g15 +aI304 +aI-68 +aI239 +aI-78 +aI267 +aI-68 +aa(lp14502 +g15 +aI377 +aI-81 +aI330 +aI-68 +aI355 +aI-72 +aa(lp14503 +g15 +aI433 +aI-118 +aI399 +aI-90 +aI417 +aI-102 +aa(lp14504 +g15 +aI468 +aI-177 +aI448 +aI-134 +aI460 +aI-154 +aa(lp14505 +g15 +aI481 +aI-254 +aI476 +aI-200 +aI481 +aI-225 +aa(lp14506 +g20 +aI481 +aI-362 +aa(lp14507 +g20 +aI395 +aI-358 +aa(lp14508 +g15 +aI301 +aI-344 +aI358 +aI-356 +aI326 +aI-351 +aa(lp14509 +g15 +aI239 +aI-312 +aI275 +aI-336 +aI255 +aI-326 +aa(lp14510 +g15 +aI206 +aI-261 +aI223 +aI-298 +aI212 +aI-281 +aa(lp14511 +g15 +aI195 +aI-192 +aI199 +aI-241 +aI195 +aI-218 +aa(lp14512 +g10 +aa(lp14513 +g8 +aI357 +aI-661 +aa(lp14514 +g15 +aI295 +aI-650 +aI331 +aI-661 +aI311 +aI-657 +aa(lp14515 +g15 +aI258 +aI-619 +aI279 +aI-643 +aI267 +aI-633 +aa(lp14516 +g15 +aI240 +aI-573 +aI249 +aI-606 +aI243 +aI-591 +aa(lp14517 +g15 +aI235 +aI-515 +aI237 +aI-555 +aI235 +aI-536 +aa(lp14518 +g15 +aI151 +aI-534 +aI198 +aI-515 +aI170 +aI-522 +aa(lp14519 +g15 +aI122 +aI-599 +aI132 +aI-547 +aI122 +aI-568 +aa(lp14520 +g15 +aI141 +aI-658 +aI122 +aI-622 +aI128 +aI-642 +aa(lp14521 +g15 +aI193 +aI-697 +aI153 +aI-674 +aI171 +aI-687 +aa(lp14522 +g15 +aI269 +aI-720 +aI214 +aI-707 +aI240 +aI-715 +aa(lp14523 +g15 +aI362 +aI-727 +aI298 +aI-725 +aI329 +aI-727 +aa(lp14524 +g15 +aI469 +aI-715 +aI403 +aI-727 +aI439 +aI-723 +aa(lp14525 +g15 +aI545 +aI-675 +aI499 +aI-707 +aI525 +aI-694 +aa(lp14526 +g15 +aI591 +aI-604 +aI565 +aI-657 +aI581 +aI-633 +aa(lp14527 +g15 +aI606 +aI-496 +aI601 +aI-575 +aI606 +aI-539 +aa(lp14528 +g20 +aI606 +aI-151 +aa(lp14529 +g15 +aI611 +aI-105 +aI606 +aI-132 +aI608 +aI-117 +aa(lp14530 +g15 +aI625 +aI-75 +aI614 +aI-92 +aI619 +aI-83 +aa(lp14531 +g15 +aI651 +aI-60 +aI632 +aI-68 +aI640 +aI-63 +aa(lp14532 +g15 +aI689 +aI-55 +aI662 +aI-57 +aI674 +aI-55 +aa(lp14533 +g20 +aI693 +aI-55 +aa(lp14534 +g20 +aI693 +aI0 +aa(lp14535 +g20 +aI513 +aI0 +aa(lp14536 +g20 +aI492 +aI-114 +aa(lp14537 +g20 +aI481 +aI-114 +aa(lp14538 +g15 +aI440 +aI-62 +aI467 +aI-95 +aI453 +aI-78 +aa(lp14539 +g15 +aI397 +aI-22 +aI427 +aI-47 +aI413 +aI-33 +aa(lp14540 +g15 +aI344 +aI4 +aI382 +aI-11 +aI364 +aI-2 +aa(lp14541 +g15 +aI273 +aI13 +aI324 +aI10 +aI301 +aI13 +aa(lp14542 +g15 +aI191 +aI0 +aI243 +aI13 +aI216 +aI9 +aa(lp14543 +g15 +aI125 +aI-38 +aI165 +aI-7 +aI143 +aI-20 +aa(lp14544 +g15 +aI82 +aI-104 +aI106 +aI-55 +aI92 +aI-77 +aa(lp14545 +g15 +aI66 +aI-199 +aI71 +aI-131 +aI66 +aI-162 +aa(lp14546 +g15 +aI141 +aI-356 +aI66 +aI-270 +aI91 +aI-322 +aa(lp14547 +g15 +aI370 +aI-412 +aI192 +aI-391 +aI268 +aI-409 +aa(lp14548 +g20 +aI481 +aI-416 +aa(lp14549 +g20 +aI481 +aI-496 +aa(lp14550 +g15 +aI477 +aI-563 +aI481 +aI-520 +aI479 +aI-542 +aa(lp14551 +g15 +aI460 +aI-615 +aI474 +aI-583 +aI468 +aI-600 +aa(lp14552 +g15 +aI422 +aI-648 +aI451 +aI-629 +aI439 +aI-640 +aa(lp14553 +g15 +aI357 +aI-661 +aI406 +aI-656 +aI384 +aI-661 +aa(lp14554 +g10 +aa(lp14555 +g8 +aI750 +aI0 +aa(lp14556 +g10 +aa(lp14557 +g8 +aI750 +aI0 +aasVe +(lp14558 +(lp14559 +g8 +aI366 +aI-655 +aa(lp14560 +g15 +aI252 +aI-595 +aI317 +aI-655 +aI278 +aI-635 +aa(lp14561 +g15 +aI205 +aI-419 +aI225 +aI-555 +aI209 +aI-496 +aa(lp14562 +g20 +aI511 +aI-419 +aa(lp14563 +g15 +aI503 +aI-515 +aI511 +aI-454 +aI509 +aI-486 +aa(lp14564 +g15 +aI479 +aI-590 +aI498 +aI-544 +aI490 +aI-569 +aa(lp14565 +g15 +aI434 +aI-638 +aI467 +aI-611 +aI453 +aI-627 +aa(lp14566 +g15 +aI366 +aI-655 +aI416 +aI-650 +aI393 +aI-655 +aa(lp14567 +g10 +aa(lp14568 +g8 +aI382 +aI13 +aa(lp14569 +g15 +aI252 +aI-10 +aI334 +aI13 +aI291 +aI5 +aa(lp14570 +g15 +aI155 +aI-82 +aI214 +aI-27 +aI182 +aI-50 +aa(lp14571 +g15 +aI94 +aI-197 +aI129 +aI-113 +aI108 +aI-151 +aa(lp14572 +g15 +aI73 +aI-351 +aI80 +aI-242 +aI73 +aI-294 +aa(lp14573 +g15 +aI150 +aI-633 +aI73 +aI-476 +aI99 +aI-570 +aa(lp14574 +g15 +aI369 +aI-727 +aI201 +aI-695 +aI274 +aI-727 +aa(lp14575 +g15 +aI485 +aI-707 +aI412 +aI-727 +aI450 +aI-720 +aa(lp14576 +g15 +aI572 +aI-647 +aI519 +aI-693 +aI548 +aI-673 +aa(lp14577 +g15 +aI627 +aI-547 +aI596 +aI-620 +aI614 +aI-587 +aa(lp14578 +g15 +aI646 +aI-409 +aI640 +aI-507 +aI646 +aI-461 +aa(lp14579 +g20 +aI646 +aI-347 +aa(lp14580 +g20 +aI202 +aI-347 +aa(lp14581 +g15 +aI217 +aI-222 +aI203 +aI-299 +aI208 +aI-257 +aa(lp14582 +g15 +aI255 +aI-136 +aI226 +aI-187 +aI238 +aI-158 +aa(lp14583 +g15 +aI317 +aI-86 +aI272 +aI-113 +aI292 +aI-97 +aa(lp14584 +g15 +aI401 +aI-70 +aI341 +aI-75 +aI369 +aI-70 +aa(lp14585 +g15 +aI465 +aI-78 +aI424 +aI-70 +aI445 +aI-73 +aa(lp14586 +g15 +aI518 +aI-99 +aI484 +aI-83 +aI502 +aI-90 +aa(lp14587 +g15 +aI561 +aI-128 +aI534 +aI-107 +aI549 +aI-117 +aa(lp14588 +g15 +aI591 +aI-163 +aI573 +aI-139 +aI583 +aI-151 +aa(lp14589 +g15 +aI609 +aI-147 +aI597 +aI-161 +aI603 +aI-155 +aa(lp14590 +g15 +aI617 +aI-118 +aI614 +aI-139 +aI617 +aI-129 +aa(lp14591 +g15 +aI602 +aI-74 +aI617 +aI-104 +aI612 +aI-90 +aa(lp14592 +g15 +aI559 +aI-32 +aI593 +aI-59 +aI578 +aI-45 +aa(lp14593 +g15 +aI486 +aI0 +aI539 +aI-19 +aI515 +aI-8 +aa(lp14594 +g15 +aI382 +aI13 +aI456 +aI9 +aI422 +aI13 +aa(lp14595 +g10 +aa(lp14596 +g8 +aI713 +aI0 +aa(lp14597 +g10 +aa(lp14598 +g8 +aI713 +aI0 +aasVi +(lp14599 +(lp14600 +g8 +aI48 +aI-55 +aa(lp14601 +g15 +aI90 +aI-58 +aI62 +aI-55 +aI76 +aI-56 +aa(lp14602 +g15 +aI125 +aI-70 +aI103 +aI-60 +aI115 +aI-64 +aa(lp14603 +g15 +aI148 +aI-97 +aI134 +aI-76 +aI142 +aI-85 +aa(lp14604 +g15 +aI157 +aI-144 +aI154 +aI-109 +aI157 +aI-125 +aa(lp14605 +g20 +aI157 +aI-567 +aa(lp14606 +g15 +aI148 +aI-614 +aI157 +aI-586 +aI154 +aI-602 +aa(lp14607 +g15 +aI125 +aI-642 +aI142 +aI-626 +aI134 +aI-635 +aa(lp14608 +g15 +aI90 +aI-655 +aI115 +aI-648 +aI103 +aI-652 +aa(lp14609 +g15 +aI48 +aI-658 +aI76 +aI-657 +aI62 +aI-658 +aa(lp14610 +g20 +aI44 +aI-658 +aa(lp14611 +g20 +aI44 +aI-714 +aa(lp14612 +g20 +aI282 +aI-714 +aa(lp14613 +g20 +aI282 +aI-151 +aa(lp14614 +g15 +aI291 +aI-101 +aI282 +aI-130 +aI285 +aI-113 +aa(lp14615 +g15 +aI314 +aI-72 +aI297 +aI-88 +aI305 +aI-78 +aa(lp14616 +g15 +aI349 +aI-58 +aI324 +aI-65 +aI336 +aI-60 +aa(lp14617 +g15 +aI391 +aI-55 +aI363 +aI-56 +aI377 +aI-55 +aa(lp14618 +g20 +aI409 +aI-55 +aa(lp14619 +g20 +aI409 +aI0 +aa(lp14620 +g20 +aI30 +aI0 +aa(lp14621 +g20 +aI30 +aI-55 +aa(lp14622 +g10 +aa(lp14623 +g8 +aI138 +aI-930 +aa(lp14624 +g15 +aI144 +aI-969 +aI138 +aI-946 +aI140 +aI-959 +aa(lp14625 +g15 +aI160 +aI-994 +aI148 +aI-980 +aI153 +aI-988 +aa(lp14626 +g15 +aI184 +aI-1008 +aI167 +aI-1001 +aI175 +aI-1006 +aa(lp14627 +g15 +aI214 +aI-1012 +aI194 +aI-1011 +aI203 +aI-1012 +aa(lp14628 +g15 +aI244 +aI-1008 +aI225 +aI-1012 +aI235 +aI-1011 +aa(lp14629 +g15 +aI267 +aI-994 +aI253 +aI-1006 +aI261 +aI-1001 +aa(lp14630 +g15 +aI284 +aI-969 +aI274 +aI-988 +aI280 +aI-980 +aa(lp14631 +g15 +aI290 +aI-930 +aI288 +aI-959 +aI290 +aI-946 +aa(lp14632 +g15 +aI284 +aI-891 +aI290 +aI-914 +aI288 +aI-901 +aa(lp14633 +g15 +aI267 +aI-866 +aI280 +aI-881 +aI274 +aI-872 +aa(lp14634 +g15 +aI244 +aI-852 +aI261 +aI-859 +aI253 +aI-854 +aa(lp14635 +g15 +aI214 +aI-847 +aI235 +aI-849 +aI225 +aI-847 +aa(lp14636 +g15 +aI184 +aI-852 +aI203 +aI-847 +aI194 +aI-849 +aa(lp14637 +g15 +aI160 +aI-866 +aI175 +aI-854 +aI167 +aI-859 +aa(lp14638 +g15 +aI144 +aI-891 +aI153 +aI-872 +aI148 +aI-881 +aa(lp14639 +g15 +aI138 +aI-930 +aI140 +aI-901 +aI138 +aI-914 +aa(lp14640 +g10 +aa(lp14641 +g8 +aI426 +aI0 +aa(lp14642 +g10 +aa(lp14643 +g8 +aI426 +aI0 +aasVm +(lp14644 +(lp14645 +g8 +aI395 +aI-55 +aa(lp14646 +g20 +aI395 +aI0 +aa(lp14647 +g20 +aI37 +aI0 +aa(lp14648 +g20 +aI37 +aI-55 +aa(lp14649 +g20 +aI54 +aI-55 +aa(lp14650 +g15 +aI96 +aI-58 +aI69 +aI-55 +aI83 +aI-56 +aa(lp14651 +g15 +aI128 +aI-72 +aI108 +aI-60 +aI119 +aI-65 +aa(lp14652 +g15 +aI150 +aI-101 +aI138 +aI-78 +aI145 +aI-88 +aa(lp14653 +g15 +aI157 +aI-151 +aI155 +aI-113 +aI157 +aI-130 +aa(lp14654 +g20 +aI157 +aI-567 +aa(lp14655 +g15 +aI149 +aI-614 +aI157 +aI-586 +aI154 +aI-602 +aa(lp14656 +g15 +aI128 +aI-642 +aI144 +aI-626 +aI137 +aI-635 +aa(lp14657 +g15 +aI95 +aI-655 +aI119 +aI-648 +aI108 +aI-652 +aa(lp14658 +g15 +aI54 +aI-658 +aI83 +aI-657 +aI69 +aI-658 +aa(lp14659 +g20 +aI50 +aI-658 +aa(lp14660 +g20 +aI50 +aI-714 +aa(lp14661 +g20 +aI259 +aI-714 +aa(lp14662 +g20 +aI277 +aI-606 +aa(lp14663 +g20 +aI283 +aI-606 +aa(lp14664 +g15 +aI326 +aI-667 +aI297 +aI-631 +aI311 +aI-651 +aa(lp14665 +g15 +aI373 +aI-704 +aI340 +aI-683 +aI356 +aI-695 +aa(lp14666 +g15 +aI426 +aI-722 +aI390 +aI-713 +aI407 +aI-719 +aa(lp14667 +g15 +aI485 +aI-727 +aI444 +aI-725 +aI464 +aI-727 +aa(lp14668 +g15 +aI546 +aI-720 +aI506 +aI-727 +aI527 +aI-725 +aa(lp14669 +g15 +aI601 +aI-700 +aI566 +aI-716 +aI584 +aI-709 +aa(lp14670 +g15 +aI646 +aI-662 +aI617 +aI-690 +aI632 +aI-678 +aa(lp14671 +g15 +aI678 +aI-606 +aI659 +aI-647 +aI670 +aI-628 +aa(lp14672 +g20 +aI689 +aI-606 +aa(lp14673 +g15 +aI733 +aI-667 +aI702 +aI-631 +aI717 +aI-651 +aa(lp14674 +g15 +aI782 +aI-704 +aI748 +aI-683 +aI765 +aI-695 +aa(lp14675 +g15 +aI838 +aI-722 +aI800 +aI-713 +aI818 +aI-719 +aa(lp14676 +g15 +aI898 +aI-727 +aI857 +aI-725 +aI877 +aI-727 +aa(lp14677 +g15 +aI989 +aI-712 +aI932 +aI-727 +aI962 +aI-722 +aa(lp14678 +g15 +aI1057 +aI-665 +aI1016 +aI-701 +aI1039 +aI-686 +aa(lp14679 +g15 +aI1100 +aI-584 +aI1076 +aI-644 +aI1090 +aI-617 +aa(lp14680 +g15 +aI1115 +aI-466 +aI1110 +aI-551 +aI1115 +aI-511 +aa(lp14681 +g20 +aI1115 +aI-151 +aa(lp14682 +g15 +aI1123 +aI-101 +aI1115 +aI-130 +aI1118 +aI-113 +aa(lp14683 +g15 +aI1145 +aI-72 +aI1128 +aI-88 +aI1136 +aI-78 +aa(lp14684 +g15 +aI1177 +aI-58 +aI1154 +aI-65 +aI1165 +aI-60 +aa(lp14685 +g15 +aI1218 +aI-55 +aI1190 +aI-56 +aI1203 +aI-55 +aa(lp14686 +g20 +aI1222 +aI-55 +aa(lp14687 +g20 +aI1222 +aI0 +aa(lp14688 +g20 +aI990 +aI0 +aa(lp14689 +g20 +aI990 +aI-459 +aa(lp14690 +g15 +aI983 +aI-537 +aI990 +aI-488 +aI988 +aI-514 +aa(lp14691 +g15 +aI959 +aI-594 +aI978 +aI-559 +aI970 +aI-578 +aa(lp14692 +g15 +aI916 +aI-630 +aI948 +aI-610 +aI933 +aI-622 +aa(lp14693 +g15 +aI850 +aI-642 +aI898 +aI-638 +aI876 +aI-642 +aa(lp14694 +g15 +aI780 +aI-626 +aI823 +aI-642 +aI799 +aI-636 +aa(lp14695 +g15 +aI735 +aI-582 +aI762 +aI-615 +aI746 +aI-601 +aa(lp14696 +g15 +aI709 +aI-519 +aI723 +aI-564 +aI714 +aI-543 +aa(lp14697 +g15 +aI702 +aI-443 +aI704 +aI-495 +aI702 +aI-470 +aa(lp14698 +g20 +aI702 +aI-151 +aa(lp14699 +g15 +aI710 +aI-101 +aI702 +aI-130 +aI705 +aI-113 +aa(lp14700 +g15 +aI731 +aI-72 +aI715 +aI-88 +aI722 +aI-78 +aa(lp14701 +g15 +aI764 +aI-58 +aI740 +aI-65 +aI751 +aI-60 +aa(lp14702 +g15 +aI805 +aI-55 +aI776 +aI-56 +aI790 +aI-55 +aa(lp14703 +g20 +aI809 +aI-55 +aa(lp14704 +g20 +aI809 +aI0 +aa(lp14705 +g20 +aI577 +aI0 +aa(lp14706 +g20 +aI577 +aI-459 +aa(lp14707 +g15 +aI569 +aI-537 +aI577 +aI-488 +aI574 +aI-514 +aa(lp14708 +g15 +aI545 +aI-594 +aI564 +aI-559 +aI556 +aI-578 +aa(lp14709 +g15 +aI502 +aI-630 +aI534 +aI-610 +aI520 +aI-622 +aa(lp14710 +g15 +aI437 +aI-642 +aI484 +aI-638 +aI463 +aI-642 +aa(lp14711 +g15 +aI364 +aI-624 +aI408 +aI-642 +aI384 +aI-636 +aa(lp14712 +g15 +aI316 +aI-577 +aI344 +aI-612 +aI328 +aI-596 +aa(lp14713 +g15 +aI290 +aI-508 +aI304 +aI-557 +aI295 +aI-534 +aa(lp14714 +g15 +aI282 +aI-425 +aI285 +aI-481 +aI282 +aI-454 +aa(lp14715 +g20 +aI282 +aI-144 +aa(lp14716 +g15 +aI291 +aI-97 +aI282 +aI-125 +aI285 +aI-109 +aa(lp14717 +g15 +aI315 +aI-70 +aI297 +aI-85 +aI305 +aI-76 +aa(lp14718 +g15 +aI349 +aI-58 +aI325 +aI-64 +aI336 +aI-60 +aa(lp14719 +g15 +aI391 +aI-55 +aI363 +aI-56 +aI377 +aI-55 +aa(lp14720 +g10 +aa(lp14721 +g8 +aI1259 +aI0 +aa(lp14722 +g10 +aa(lp14723 +g8 +aI1259 +aI0 +aasVq +(lp14724 +(lp14725 +g8 +aI794 +aI320 +aa(lp14726 +g20 +aI395 +aI320 +aa(lp14727 +g20 +aI395 +aI264 +aa(lp14728 +g20 +aI440 +aI264 +aa(lp14729 +g15 +aI482 +aI261 +aI455 +aI264 +aI469 +aI263 +aa(lp14730 +g15 +aI517 +aI248 +aI495 +aI259 +aI507 +aI254 +aa(lp14731 +g15 +aI540 +aI218 +aI527 +aI241 +aI534 +aI231 +aa(lp14732 +g15 +aI549 +aI168 +aI546 +aI206 +aI549 +aI189 +aa(lp14733 +g20 +aI549 +aI53 +aa(lp14734 +g15 +aI550 +aI1 +aI549 +aI38 +aI549 +aI21 +aa(lp14735 +g15 +aI552 +aI-55 +aI550 +aI-18 +aI551 +aI-37 +aa(lp14736 +g15 +aI554 +aI-119 +aI552 +aI-76 +aI553 +aI-97 +aa(lp14737 +g20 +aI549 +aI-119 +aa(lp14738 +g15 +aI515 +aI-64 +aI539 +aI-98 +aI528 +aI-80 +aa(lp14739 +g15 +aI471 +aI-22 +aI502 +aI-48 +aI487 +aI-34 +aa(lp14740 +g15 +aI415 +aI4 +aI454 +aI-11 +aI436 +aI-2 +aa(lp14741 +g15 +aI345 +aI13 +aI394 +aI10 +aI371 +aI13 +aa(lp14742 +g15 +aI228 +aI-8 +aI301 +aI13 +aI262 +aI6 +aa(lp14743 +g15 +aI143 +aI-75 +aI194 +aI-22 +aI166 +aI-45 +aa(lp14744 +g15 +aI91 +aI-190 +aI120 +aI-105 +aI102 +aI-143 +aa(lp14745 +g15 +aI73 +aI-355 +aI79 +aI-236 +aI73 +aI-291 +aa(lp14746 +g15 +aI91 +aI-522 +aI73 +aI-419 +aI79 +aI-475 +aa(lp14747 +g15 +aI143 +aI-638 +aI102 +aI-569 +aI120 +aI-607 +aa(lp14748 +g15 +aI228 +aI-705 +aI166 +aI-668 +aI194 +aI-691 +aa(lp14749 +g15 +aI345 +aI-727 +aI262 +aI-720 +aI301 +aI-727 +aa(lp14750 +g15 +aI414 +aI-718 +aI370 +aI-727 +aI393 +aI-724 +aa(lp14751 +g15 +aI471 +aI-694 +aI435 +aI-713 +aI454 +aI-705 +aa(lp14752 +g15 +aI515 +aI-657 +aI487 +aI-684 +aI502 +aI-672 +aa(lp14753 +g15 +aI549 +aI-610 +aI528 +aI-643 +aI539 +aI-627 +aa(lp14754 +g20 +aI557 +aI-610 +aa(lp14755 +g20 +aI581 +aI-714 +aa(lp14756 +g20 +aI794 +aI-714 +aa(lp14757 +g20 +aI794 +aI-658 +aa(lp14758 +g20 +aI783 +aI-658 +aa(lp14759 +g15 +aI741 +aI-655 +aI769 +aI-658 +aI754 +aI-657 +aa(lp14760 +g15 +aI706 +aI-641 +aI728 +aI-652 +aI716 +aI-648 +aa(lp14761 +g15 +aI683 +aI-612 +aI696 +aI-635 +aI689 +aI-625 +aa(lp14762 +g15 +aI674 +aI-562 +aI677 +aI-599 +aI674 +aI-582 +aa(lp14763 +g20 +aI674 +aI173 +aa(lp14764 +g15 +aI683 +aI220 +aI674 +aI193 +aI677 +aI208 +aa(lp14765 +g15 +aI707 +aI248 +aI689 +aI232 +aI697 +aI241 +aa(lp14766 +g15 +aI741 +aI261 +aI717 +aI255 +aI728 +aI259 +aa(lp14767 +g15 +aI783 +aI264 +aI755 +aI263 +aI769 +aI264 +aa(lp14768 +g20 +aI794 +aI264 +aa(lp14769 +g10 +aa(lp14770 +g8 +aI367 +aI-71 +aa(lp14771 +g15 +aI454 +aI-89 +aI402 +aI-71 +aI431 +aI-77 +aa(lp14772 +g15 +aI510 +aI-141 +aI477 +aI-100 +aI496 +aI-118 +aa(lp14773 +g15 +aI540 +aI-230 +aI524 +aI-164 +aI534 +aI-194 +aa(lp14774 +g15 +aI549 +aI-355 +aI546 +aI-265 +aI549 +aI-307 +aa(lp14775 +g15 +aI540 +aI-478 +aI549 +aI-402 +aI546 +aI-443 +aa(lp14776 +g15 +aI510 +aI-568 +aI534 +aI-514 +aI524 +aI-544 +aa(lp14777 +g15 +aI454 +aI-623 +aI496 +aI-592 +aI477 +aI-610 +aa(lp14778 +g15 +aI366 +aI-642 +aI430 +aI-635 +aI401 +aI-642 +aa(lp14779 +g15 +aI291 +aI-623 +aI337 +aI-642 +aI312 +aI-635 +aa(lp14780 +g15 +aI240 +aI-567 +aI270 +aI-610 +aI253 +aI-592 +aa(lp14781 +g15 +aI211 +aI-477 +aI227 +aI-543 +aI217 +aI-513 +aa(lp14782 +g15 +aI202 +aI-354 +aI205 +aI-441 +aI202 +aI-400 +aa(lp14783 +g15 +aI240 +aI-142 +aI202 +aI-259 +aI215 +aI-189 +aa(lp14784 +g15 +aI367 +aI-71 +aI266 +aI-95 +aI308 +aI-71 +aa(lp14785 +g10 +aa(lp14786 +g8 +aI818 +aI0 +aa(lp14787 +g10 +aa(lp14788 +g8 +aI818 +aI0 +aasVu +(lp14789 +(lp14790 +g8 +aI702 +aI-144 +aa(lp14791 +g15 +aI711 +aI-97 +aI702 +aI-125 +aI705 +aI-109 +aa(lp14792 +g15 +aI735 +aI-70 +aI717 +aI-85 +aI725 +aI-76 +aa(lp14793 +g15 +aI769 +aI-58 +aI745 +aI-64 +aI756 +aI-60 +aa(lp14794 +g15 +aI811 +aI-55 +aI783 +aI-56 +aI797 +aI-55 +aa(lp14795 +g20 +aI815 +aI-55 +aa(lp14796 +g20 +aI815 +aI0 +aa(lp14797 +g20 +aI604 +aI0 +aa(lp14798 +g20 +aI586 +aI-107 +aa(lp14799 +g20 +aI580 +aI-107 +aa(lp14800 +g15 +aI535 +aI-46 +aI566 +aI-82 +aI551 +aI-62 +aa(lp14801 +g15 +aI483 +aI-9 +aI519 +aI-30 +aI501 +aI-18 +aa(lp14802 +g15 +aI426 +aI8 +aI465 +aI0 +aI446 +aI5 +aa(lp14803 +g15 +aI363 +aI13 +aI406 +aI11 +aI385 +aI13 +aa(lp14804 +g15 +aI270 +aI-1 +aI328 +aI13 +aI297 +aI8 +aa(lp14805 +g15 +aI201 +aI-48 +aI242 +aI-11 +aI219 +aI-27 +aa(lp14806 +g15 +aI158 +aI-129 +aI182 +aI-69 +aI168 +aI-96 +aa(lp14807 +g15 +aI143 +aI-247 +aI148 +aI-162 +aI143 +aI-202 +aa(lp14808 +g20 +aI143 +aI-567 +aa(lp14809 +g15 +aI135 +aI-614 +aI143 +aI-586 +aI140 +aI-602 +aa(lp14810 +g15 +aI111 +aI-642 +aI129 +aI-626 +aI121 +aI-635 +aa(lp14811 +g15 +aI76 +aI-655 +aI101 +aI-648 +aI89 +aI-652 +aa(lp14812 +g15 +aI34 +aI-658 +aI63 +aI-657 +aI49 +aI-658 +aa(lp14813 +g20 +aI30 +aI-658 +aa(lp14814 +g20 +aI30 +aI-714 +aa(lp14815 +g20 +aI269 +aI-714 +aa(lp14816 +g20 +aI269 +aI-254 +aa(lp14817 +g15 +aI276 +aI-176 +aI269 +aI-225 +aI271 +aI-199 +aa(lp14818 +g15 +aI299 +aI-119 +aI280 +aI-154 +aI288 +aI-134 +aa(lp14819 +g15 +aI342 +aI-83 +aI309 +aI-103 +aI324 +aI-91 +aa(lp14820 +g15 +aI409 +aI-71 +aI360 +aI-75 +aI382 +aI-71 +aa(lp14821 +g15 +aI485 +aI-87 +aI439 +aI-71 +aI464 +aI-77 +aa(lp14822 +g15 +aI537 +aI-131 +aI506 +aI-97 +aI523 +aI-112 +aa(lp14823 +g15 +aI567 +aI-199 +aI551 +aI-150 +aI561 +aI-172 +aa(lp14824 +g15 +aI577 +aI-287 +aI574 +aI-225 +aI577 +aI-255 +aa(lp14825 +g20 +aI577 +aI-562 +aa(lp14826 +g15 +aI568 +aI-612 +aI577 +aI-582 +aI574 +aI-599 +aa(lp14827 +g15 +aI545 +aI-641 +aI562 +aI-625 +aI555 +aI-635 +aa(lp14828 +g15 +aI510 +aI-655 +aI535 +aI-648 +aI523 +aI-652 +aa(lp14829 +g15 +aI468 +aI-658 +aI497 +aI-657 +aI483 +aI-658 +aa(lp14830 +g20 +aI464 +aI-658 +aa(lp14831 +g20 +aI464 +aI-714 +aa(lp14832 +g20 +aI702 +aI-714 +aa(lp14833 +g10 +aa(lp14834 +g8 +aI846 +aI0 +aa(lp14835 +g10 +aa(lp14836 +g8 +aI846 +aI0 +aasVy +(lp14837 +(lp14838 +g8 +aI753 +aI-714 +aa(lp14839 +g20 +aI753 +aI-658 +aa(lp14840 +g20 +aI749 +aI-658 +aa(lp14841 +g15 +aI715 +aI-654 +aI736 +aI-658 +aI725 +aI-656 +aa(lp14842 +g15 +aI690 +aI-638 +aI706 +aI-651 +aI698 +aI-646 +aa(lp14843 +g15 +aI669 +aI-606 +aI682 +aI-630 +aI675 +aI-619 +aa(lp14844 +g15 +aI647 +aI-554 +aI662 +aI-592 +aI655 +aI-575 +aa(lp14845 +g20 +aI445 +aI5 +aa(lp14846 +g15 +aI401 +aI118 +aI429 +aI48 +aI414 +aI86 +aa(lp14847 +g15 +aI357 +aI202 +aI387 +aI151 +aI372 +aI179 +aa(lp14848 +g15 +aI307 +aI260 +aI342 +aI225 +aI325 +aI245 +aa(lp14849 +g15 +aI246 +aI296 +aI289 +aI275 +aI269 +aI287 +aa(lp14850 +g15 +aI166 +aI315 +aI223 +aI305 +aI196 +aI312 +aa(lp14851 +g15 +aI62 +aI320 +aI136 +aI319 +aI101 +aI320 +aa(lp14852 +g20 +aI50 +aI320 +aa(lp14853 +g20 +aI50 +aI257 +aa(lp14854 +g15 +aI167 +aI237 +aI95 +aI257 +aI134 +aI250 +aa(lp14855 +g15 +aI251 +aI182 +aI199 +aI223 +aI227 +aI205 +aa(lp14856 +g15 +aI310 +aI99 +aI275 +aI158 +aI295 +aI130 +aa(lp14857 +g15 +aI350 +aI-4 +aI326 +aI67 +aI340 +aI32 +aa(lp14858 +g20 +aI104 +aI-587 +aa(lp14859 +g15 +aI86 +aI-621 +aI98 +aI-601 +aI92 +aI-612 +aa(lp14860 +g15 +aI67 +aI-643 +aI80 +aI-630 +aI74 +aI-637 +aa(lp14861 +g15 +aI42 +aI-655 +aI60 +aI-649 +aI51 +aI-652 +aa(lp14862 +g15 +aI9 +aI-658 +aI33 +aI-657 +aI22 +aI-658 +aa(lp14863 +g20 +aI5 +aI-658 +aa(lp14864 +g20 +aI5 +aI-714 +aa(lp14865 +g20 +aI325 +aI-714 +aa(lp14866 +g20 +aI325 +aI-658 +aa(lp14867 +g20 +aI321 +aI-658 +aa(lp14868 +g15 +aI261 +aI-642 +aI294 +aI-658 +aI274 +aI-653 +aa(lp14869 +g15 +aI241 +aI-593 +aI248 +aI-632 +aI241 +aI-616 +aa(lp14870 +g15 +aI243 +aI-571 +aI241 +aI-586 +aI242 +aI-579 +aa(lp14871 +g15 +aI251 +aI-545 +aI245 +aI-563 +aI248 +aI-555 +aa(lp14872 +g20 +aI349 +aI-307 +aa(lp14873 +g15 +aI368 +aI-257 +aI355 +aI-292 +aI362 +aI-275 +aa(lp14874 +g15 +aI387 +aI-204 +aI375 +aI-239 +aI381 +aI-221 +aa(lp14875 +g15 +aI403 +aI-154 +aI393 +aI-186 +aI398 +aI-170 +aa(lp14876 +g15 +aI413 +aI-114 +aI408 +aI-138 +aI411 +aI-125 +aa(lp14877 +g20 +aI417 +aI-114 +aa(lp14878 +g15 +aI437 +aI-185 +aI422 +aI-133 +aI428 +aI-157 +aa(lp14879 +g15 +aI466 +aI-275 +aI445 +aI-213 +aI455 +aI-243 +aa(lp14880 +g20 +aI555 +aI-535 +aa(lp14881 +g15 +aI564 +aI-566 +aI559 +aI-546 +aI562 +aI-556 +aa(lp14882 +g15 +aI567 +aI-592 +aI566 +aI-576 +aI567 +aI-585 +aa(lp14883 +g15 +aI545 +aI-642 +aI567 +aI-615 +aI560 +aI-632 +aa(lp14884 +g15 +aI479 +aI-658 +aI531 +aI-653 +aI509 +aI-658 +aa(lp14885 +g20 +aI475 +aI-658 +aa(lp14886 +g20 +aI475 +aI-714 +aa(lp14887 +g10 +aa(lp14888 +g8 +aI753 +aI0 +aa(lp14889 +g10 +aa(lp14890 +g8 +aI753 +aI0 +aasV} +(lp14891 +(lp14892 +g8 +aI66 +aI113 +aa(lp14893 +g20 +aI106 +aI113 +aa(lp14894 +g15 +aI191 +aI77 +aI146 +aI113 +aI174 +aI101 +aa(lp14895 +g15 +aI216 +aI-26 +aI207 +aI54 +aI216 +aI19 +aa(lp14896 +g20 +aI216 +aI-256 +aa(lp14897 +g15 +aI251 +aI-366 +aI216 +aI-300 +aI227 +aI-337 +aa(lp14898 +g15 +aI363 +aI-422 +aI275 +aI-394 +aI312 +aI-413 +aa(lp14899 +g20 +aI363 +aI-423 +aa(lp14900 +g15 +aI252 +aI-479 +aI314 +aI-431 +aI277 +aI-450 +aa(lp14901 +g15 +aI216 +aI-587 +aI228 +aI-507 +aI216 +aI-544 +aa(lp14902 +g20 +aI216 +aI-815 +aa(lp14903 +g15 +aI191 +aI-920 +aI216 +aI-861 +aI207 +aI-896 +aa(lp14904 +g15 +aI106 +aI-955 +aI174 +aI-943 +aI146 +aI-955 +aa(lp14905 +g20 +aI66 +aI-955 +aa(lp14906 +g20 +aI66 +aI-1012 +aa(lp14907 +g20 +aI154 +aI-1012 +aa(lp14908 +g15 +aI297 +aI-963 +aI217 +aI-1012 +aI265 +aI-996 +aa(lp14909 +g15 +aI346 +aI-822 +aI330 +aI-930 +aI346 +aI-883 +aa(lp14910 +g20 +aI346 +aI-590 +aa(lp14911 +g15 +aI358 +aI-522 +aI346 +aI-563 +aI350 +aI-540 +aa(lp14912 +g15 +aI392 +aI-480 +aI366 +aI-505 +aI378 +aI-490 +aa(lp14913 +g15 +aI442 +aI-457 +aI406 +aI-469 +aI422 +aI-462 +aa(lp14914 +g15 +aI503 +aI-450 +aI461 +aI-453 +aI481 +aI-450 +aa(lp14915 +g20 +aI503 +aI-394 +aa(lp14916 +g15 +aI442 +aI-385 +aI481 +aI-393 +aI461 +aI-390 +aa(lp14917 +g15 +aI392 +aI-363 +aI422 +aI-381 +aI406 +aI-373 +aa(lp14918 +g15 +aI358 +aI-320 +aI378 +aI-352 +aI366 +aI-338 +aa(lp14919 +g15 +aI346 +aI-252 +aI350 +aI-302 +aI346 +aI-280 +aa(lp14920 +g20 +aI346 +aI-21 +aa(lp14921 +g15 +aI333 +aI58 +aI346 +aI8 +aI342 +aI35 +aa(lp14922 +g15 +aI297 +aI118 +aI325 +aI82 +aI313 +aI102 +aa(lp14923 +g15 +aI237 +aI157 +aI281 +aI135 +aI261 +aI148 +aa(lp14924 +g15 +aI154 +aI171 +aI213 +aI166 +aI186 +aI171 +aa(lp14925 +g20 +aI66 +aI171 +aa(lp14926 +g10 +aa(lp14927 +g8 +aI570 +aI0 +aa(lp14928 +g10 +aa(lp14929 +g8 +aI570 +aI0 +aasssS'Arial' +p14930 +(dp14931 +g4270 +(dp14932 +V +(lp14933 +(lp14934 +g8 +aI370 +aI-44 +aa(lp14935 +g10 +aa(lp14936 +g8 +aI370 +aI-44 +aasV$ +(lp14937 +(lp14938 +g8 +aI318 +aI-185 +aa(lp14939 +g20 +aI318 +aI-458 +aa(lp14940 +g15 +aI131 +aI-568 +aI233 +aI-482 +aI170 +aI-519 +aa(lp14941 +g15 +aI71 +aI-748 +aI91 +aI-618 +aI71 +aI-677 +aa(lp14942 +g15 +aI138 +aI-927 +aI71 +aI-819 +aI94 +aI-879 +aa(lp14943 +g15 +aI318 +aI-1011 +aI183 +aI-975 +aI243 +aI-1003 +aa(lp14944 +g20 +aI318 +aI-1075 +aa(lp14945 +g20 +aI412 +aI-1075 +aa(lp14946 +g20 +aI412 +aI-1011 +aa(lp14947 +g15 +aI577 +aI-940 +aI481 +aI-1002 +aI536 +aI-979 +aa(lp14948 +g15 +aI655 +aI-784 +aI618 +aI-901 +aI644 +aI-849 +aa(lp14949 +g20 +aI490 +aI-763 +aa(lp14950 +g15 +aI412 +aI-867 +aI480 +aI-814 +aI454 +aI-849 +aa(lp14951 +g20 +aI412 +aI-612 +aa(lp14952 +g15 +aI625 +aI-503 +aI516 +aI-584 +aI587 +aI-548 +aa(lp14953 +g15 +aI682 +aI-330 +aI663 +aI-458 +aI682 +aI-400 +aa(lp14954 +g15 +aI611 +aI-131 +aI682 +aI-251 +aI658 +aI-185 +aa(lp14955 +g15 +aI412 +aI-32 +aI563 +aI-77 +aI497 +aI-44 +aa(lp14956 +g20 +aI412 +aI89 +aa(lp14957 +g20 +aI318 +aI89 +aa(lp14958 +g20 +aI318 +aI-29 +aa(lp14959 +g15 +aI135 +aI-113 +aI243 +aI-38 +aI182 +aI-66 +aa(lp14960 +g15 +aI45 +aI-312 +aI88 +aI-160 +aI58 +aI-226 +aa(lp14961 +g20 +aI215 +aI-330 +aa(lp14962 +g15 +aI254 +aI-240 +aI222 +aI-295 +aI235 +aI-265 +aa(lp14963 +g15 +aI318 +aI-185 +aI273 +aI-215 +aI294 +aI-197 +aa(lp14964 +g10 +aa(lp14965 +g8 +aI318 +aI-869 +aa(lp14966 +g15 +aI257 +aI-825 +aI292 +aI-860 +aI272 +aI-845 +aa(lp14967 +g15 +aI234 +aI-756 +aI241 +aI-804 +aI234 +aI-781 +aa(lp14968 +g15 +aI255 +aI-691 +aI234 +aI-733 +aI241 +aI-711 +aa(lp14969 +g15 +aI318 +aI-644 +aI269 +aI-672 +aI290 +aI-656 +aa(lp14970 +g10 +aa(lp14971 +g8 +aI412 +aI-176 +aa(lp14972 +g15 +aI492 +aI-221 +aI445 +aI-182 +aI471 +aI-197 +aa(lp14973 +g15 +aI522 +aI-306 +aI512 +aI-245 +aI522 +aI-274 +aa(lp14974 +g15 +aI497 +aI-382 +aI522 +aI-335 +aI514 +aI-360 +aa(lp14975 +g15 +aI412 +aI-430 +aI479 +aI-403 +aI451 +aI-419 +aa(lp14976 +g10 +aa(lp14977 +g8 +aI741 +aI-44 +aa(lp14978 +g10 +aa(lp14979 +g8 +aI741 +aI-44 +aasV( +(lp14980 +(lp14981 +g8 +aI399 +aI236 +aa(lp14982 +g20 +aI273 +aI236 +aa(lp14983 +g15 +aI121 +aI-76 +aI207 +aI135 +aI156 +aI31 +aa(lp14984 +g15 +aI69 +aI-390 +aI87 +aI-184 +aI69 +aI-289 +aa(lp14985 +g15 +aI134 +aI-746 +aI69 +aI-515 +aI91 +aI-634 +aa(lp14986 +g15 +aI276 +aI-1015 +aI171 +aI-843 +aI218 +aI-933 +aa(lp14987 +g20 +aI401 +aI-1015 +aa(lp14988 +g15 +aI278 +aI-679 +aI341 +aI-883 +aI300 +aI-771 +aa(lp14989 +g15 +aI244 +aI-386 +aI255 +aI-587 +aI244 +aI-489 +aa(lp14990 +g15 +aI264 +aI-167 +aI244 +aI-315 +aI251 +aI-242 +aa(lp14991 +g15 +aI319 +aI45 +aI277 +aI-92 +aI296 +aI-21 +aa(lp14992 +g15 +aI399 +aI236 +aI334 +aI89 +aI360 +aI153 +aa(lp14993 +g10 +aa(lp14994 +g8 +aI444 +aI-44 +aa(lp14995 +g10 +aa(lp14996 +g8 +aI444 +aI-44 +aasV, +(lp14997 +(lp14998 +g8 +aI91 +aI-227 +aa(lp14999 +g20 +aI274 +aI-227 +aa(lp15000 +g20 +aI274 +aI-96 +aa(lp15001 +g15 +aI260 +aI28 +aI274 +aI-43 +aI269 +aI-1 +aa(lp15002 +g15 +aI208 +aI111 +aI251 +aI59 +aI234 +aI86 +aa(lp15003 +g15 +aI111 +aI168 +aI183 +aI135 +aI151 +aI154 +aa(lp15004 +g20 +aI76 +aI92 +aa(lp15005 +g15 +aI154 +aI42 +aI113 +aI80 +aI139 +aI64 +aa(lp15006 +g15 +aI179 +aI-44 +aI170 +aI21 +aI178 +aI-7 +aa(lp15007 +g20 +aI91 +aI-44 +aa(lp15008 +g10 +aa(lp15009 +g8 +aI370 +aI-44 +aa(lp15010 +g10 +aa(lp15011 +g8 +aI370 +aI-44 +aasV0 +(lp15012 +(lp15013 +g8 +aI365 +aI-1002 +aa(lp15014 +g15 +aI582 +aI-903 +aI458 +aI-1002 +aI530 +aI-969 +aa(lp15015 +g15 +aI675 +aI-515 +aI644 +aI-825 +aI675 +aI-696 +aa(lp15016 +g15 +aI582 +aI-125 +aI675 +aI-334 +aI644 +aI-204 +aa(lp15017 +g15 +aI365 +aI-28 +aI530 +aI-60 +aI458 +aI-28 +aa(lp15018 +g15 +aI141 +aI-135 +aI273 +aI-28 +aI198 +aI-63 +aa(lp15019 +g15 +aI55 +aI-517 +aI84 +aI-206 +aI55 +aI-333 +aa(lp15020 +g15 +aI149 +aI-905 +aI55 +aI-696 +aI87 +aI-826 +aa(lp15021 +g15 +aI365 +aI-1002 +aI201 +aI-970 +aI273 +aI-1002 +aa(lp15022 +g10 +aa(lp15023 +g8 +aI365 +aI-851 +aa(lp15024 +g15 +aI306 +aI-829 +aI343 +aI-851 +aI324 +aI-844 +aa(lp15025 +g15 +aI266 +aI-754 +aI289 +aI-815 +aI275 +aI-790 +aa(lp15026 +g15 +aI247 +aI-515 +aI253 +aI-706 +aI247 +aI-627 +aa(lp15027 +g15 +aI264 +aI-284 +aI247 +aI-403 +aI253 +aI-326 +aa(lp15028 +g15 +aI306 +aI-200 +aI275 +aI-242 +aI289 +aI-214 +aa(lp15029 +g15 +aI365 +aI-179 +aI324 +aI-186 +aI343 +aI-179 +aa(lp15030 +g15 +aI425 +aI-201 +aI388 +aI-179 +aI407 +aI-186 +aa(lp15031 +g15 +aI465 +aI-276 +aI442 +aI-215 +aI455 +aI-240 +aa(lp15032 +g15 +aI484 +aI-515 +aI478 +aI-323 +aI484 +aI-403 +aa(lp15033 +g15 +aI467 +aI-745 +aI484 +aI-627 +aI478 +aI-704 +aa(lp15034 +g15 +aI424 +aI-829 +aI456 +aI-787 +aI441 +aI-815 +aa(lp15035 +g15 +aI365 +aI-851 +aI407 +aI-844 +aI388 +aI-851 +aa(lp15036 +g10 +aa(lp15037 +g8 +aI741 +aI-44 +aa(lp15038 +g10 +aa(lp15039 +g8 +aI741 +aI-44 +aasV4 +(lp15040 +(lp15041 +g8 +aI415 +aI-44 +aa(lp15042 +g20 +aI415 +aI-236 +aa(lp15043 +g20 +aI24 +aI-236 +aa(lp15044 +g20 +aI24 +aI-396 +aa(lp15045 +g20 +aI438 +aI-1002 +aa(lp15046 +g20 +aI592 +aI-1002 +aa(lp15047 +g20 +aI592 +aI-397 +aa(lp15048 +g20 +aI710 +aI-397 +aa(lp15049 +g20 +aI710 +aI-236 +aa(lp15050 +g20 +aI592 +aI-236 +aa(lp15051 +g20 +aI592 +aI-44 +aa(lp15052 +g10 +aa(lp15053 +g8 +aI415 +aI-397 +aa(lp15054 +g20 +aI415 +aI-723 +aa(lp15055 +g20 +aI195 +aI-397 +aa(lp15056 +g10 +aa(lp15057 +g8 +aI741 +aI-44 +aa(lp15058 +g10 +aa(lp15059 +g8 +aI741 +aI-44 +aasV8 +(lp15060 +(lp15061 +g8 +aI213 +aI-559 +aa(lp15062 +g15 +aI110 +aI-641 +aI166 +aI-579 +aI131 +aI-606 +aa(lp15063 +g15 +aI78 +aI-756 +aI88 +aI-676 +aI78 +aI-715 +aa(lp15064 +g15 +aI152 +aI-933 +aI78 +aI-827 +aI102 +aI-886 +aa(lp15065 +g15 +aI364 +aI-1002 +aI202 +aI-979 +aI273 +aI-1002 +aa(lp15066 +g15 +aI575 +aI-933 +aI455 +aI-1002 +aI525 +aI-979 +aa(lp15067 +g15 +aI651 +aI-756 +aI625 +aI-886 +aI651 +aI-827 +aa(lp15068 +g15 +aI616 +aI-638 +aI651 +aI-712 +aI639 +aI-673 +aa(lp15069 +g15 +aI519 +aI-559 +aI593 +aI-604 +aI561 +aI-577 +aa(lp15070 +g15 +aI640 +aI-466 +aI572 +aI-538 +aI612 +aI-507 +aa(lp15071 +g15 +aI681 +aI-325 +aI667 +aI-425 +aI681 +aI-378 +aa(lp15072 +g15 +aI597 +aI-110 +aI681 +aI-236 +aI653 +aI-165 +aa(lp15073 +g15 +aI373 +aI-27 +aI541 +aI-55 +aI466 +aI-27 +aa(lp15074 +g15 +aI156 +aI-95 +aI286 +aI-27 +aI213 +aI-50 +aa(lp15075 +g15 +aI54 +aI-317 +aI88 +aI-149 +aI54 +aI-223 +aa(lp15076 +g15 +aI92 +aI-459 +aI54 +aI-368 +aI66 +aI-416 +aa(lp15077 +g15 +aI213 +aI-559 +aI118 +aI-502 +aI158 +aI-535 +aa(lp15078 +g10 +aa(lp15079 +g8 +aI251 +aI-743 +aa(lp15080 +g15 +aI282 +aI-658 +aI251 +aI-707 +aI261 +aI-678 +aa(lp15081 +g15 +aI364 +aI-627 +aI302 +aI-637 +aI330 +aI-627 +aa(lp15082 +g15 +aI447 +aI-658 +aI399 +aI-627 +aI427 +aI-638 +aa(lp15083 +g15 +aI479 +aI-744 +aI468 +aI-679 +aI479 +aI-707 +aa(lp15084 +g15 +aI448 +aI-826 +aI479 +aI-778 +aI468 +aI-806 +aa(lp15085 +g15 +aI366 +aI-857 +aI427 +aI-847 +aI400 +aI-857 +aa(lp15086 +g15 +aI282 +aI-826 +aI331 +aI-857 +aI303 +aI-847 +aa(lp15087 +g15 +aI251 +aI-743 +aI261 +aI-805 +aI251 +aI-777 +aa(lp15088 +g10 +aa(lp15089 +g8 +aI234 +aI-334 +aa(lp15090 +g15 +aI273 +aI-216 +aI234 +aI-284 +aI247 +aI-245 +aa(lp15091 +g15 +aI369 +aI-174 +aI298 +aI-188 +aI331 +aI-174 +aa(lp15092 +g15 +aI463 +aI-215 +aI407 +aI-174 +aI438 +aI-188 +aa(lp15093 +g15 +aI500 +aI-332 +aI488 +aI-242 +aI500 +aI-281 +aa(lp15094 +g15 +aI462 +aI-440 +aI500 +aI-377 +aI488 +aI-413 +aa(lp15095 +g15 +aI367 +aI-481 +aI437 +aI-467 +aI405 +aI-481 +aa(lp15096 +g15 +aI267 +aI-435 +aI322 +aI-481 +aI289 +aI-465 +aa(lp15097 +g15 +aI234 +aI-334 +aI245 +aI-404 +aI234 +aI-370 +aa(lp15098 +g10 +aa(lp15099 +g8 +aI741 +aI-44 +aa(lp15100 +g10 +aa(lp15101 +g8 +aI741 +aI-44 +aasV< +(lp15102 +(lp15103 +g8 +aI716 +aI-153 +aa(lp15104 +g20 +aI61 +aI-437 +aa(lp15105 +g20 +aI61 +aI-595 +aa(lp15106 +g20 +aI716 +aI-878 +aa(lp15107 +g20 +aI716 +aI-692 +aa(lp15108 +g20 +aI259 +aI-518 +aa(lp15109 +g20 +aI716 +aI-337 +aa(lp15110 +g10 +aa(lp15111 +g8 +aI778 +aI-44 +aa(lp15112 +g10 +aa(lp15113 +g8 +aI778 +aI-44 +aasV@ +(lp15114 +(lp15115 +g8 +aI1156 +aI-56 +aa(lp15116 +g20 +aI1295 +aI-56 +aa(lp15117 +g15 +aI1095 +aI150 +aI1252 +aI31 +aI1185 +aI100 +aa(lp15118 +g15 +aI719 +aI236 +aI992 +aI207 +aI867 +aI236 +aa(lp15119 +g15 +aI348 +aI163 +aI576 +aI236 +aI452 +aI211 +aa(lp15120 +g15 +aI115 +aI-50 +aI244 +aI115 +aI166 +aI43 +aa(lp15121 +g15 +aI39 +aI-358 +aI65 +aI-145 +aI39 +aI-247 +aa(lp15122 +g15 +aI126 +aI-699 +aI39 +aI-480 +aI68 +aI-594 +aa(lp15123 +g15 +aI363 +aI-936 +aI184 +aI-804 +aI263 +aI-883 +aa(lp15124 +g15 +aI707 +aI-1015 +aI463 +aI-989 +aI578 +aI-1015 +aa(lp15125 +g15 +aI998 +aI-952 +aI816 +aI-1015 +aI913 +aI-994 +aa(lp15126 +g15 +aI1193 +aI-770 +aI1083 +aI-909 +aI1148 +aI-849 +aa(lp15127 +g15 +aI1261 +aI-513 +aI1238 +aI-692 +aI1261 +aI-606 +aa(lp15128 +g15 +aI1158 +aI-213 +aI1261 +aI-403 +aI1226 +aI-303 +aa(lp15129 +g15 +aI830 +aI-44 +aI1073 +aI-100 +aI963 +aI-44 +aa(lp15130 +g15 +aI748 +aI-63 +aI794 +aI-44 +aI766 +aI-50 +aa(lp15131 +g15 +aI712 +aI-118 +aI730 +aI-75 +aI718 +aI-94 +aa(lp15132 +g15 +aI535 +aI-44 +aI661 +aI-69 +aI601 +aI-44 +aa(lp15133 +g15 +aI355 +aI-118 +aI463 +aI-44 +aI403 +aI-69 +aa(lp15134 +g15 +aI284 +aI-317 +aI308 +aI-168 +aI284 +aI-234 +aa(lp15135 +g15 +aI370 +aI-596 +aI284 +aI-419 +aI313 +aI-512 +aa(lp15136 +g15 +aI637 +aI-750 +aI439 +aI-698 +aI528 +aI-750 +aa(lp15137 +g15 +aI808 +aI-661 +aI714 +aI-750 +aI771 +aI-720 +aa(lp15138 +g20 +aI824 +aI-733 +aa(lp15139 +g20 +aI996 +aI-733 +aa(lp15140 +g20 +aI898 +aI-267 +aa(lp15141 +g15 +aI889 +aI-209 +aI892 +aI-237 +aI889 +aI-218 +aa(lp15142 +g15 +aI896 +aI-185 +aI889 +aI-198 +aI891 +aI-190 +aa(lp15143 +g15 +aI914 +aI-177 +aI901 +aI-179 +aI907 +aI-177 +aa(lp15144 +g15 +aI995 +aI-215 +aI935 +aI-177 +aI962 +aI-189 +aa(lp15145 +g15 +aI1102 +aI-347 +aI1039 +aI-248 +aI1075 +aI-292 +aa(lp15146 +g15 +aI1143 +aI-520 +aI1130 +aI-403 +aI1143 +aI-460 +aa(lp15147 +g15 +aI1027 +aI-788 +aI1143 +aI-627 +aI1105 +aI-716 +aa(lp15148 +g15 +aI704 +aI-896 +aI950 +aI-860 +aI842 +aI-896 +aa(lp15149 +g15 +aI405 +aI-824 +aI586 +aI-896 +aI487 +aI-872 +aa(lp15150 +g15 +aI220 +aI-621 +aI323 +aI-776 +aI261 +aI-708 +aa(lp15151 +g15 +aI158 +aI-349 +aI178 +aI-534 +aI158 +aI-443 +aa(lp15152 +g15 +aI227 +aI-99 +aI158 +aI-258 +aI181 +aI-174 +aa(lp15153 +g15 +aI422 +aI64 +aI273 +aI-24 +aI338 +aI30 +aa(lp15154 +g15 +aI708 +aI116 +aI505 +aI99 +aI601 +aI116 +aa(lp15155 +g15 +aI976 +aI73 +aI812 +aI116 +aI901 +aI101 +aa(lp15156 +g15 +aI1156 +aI-56 +aI1051 +aI44 +aI1111 +aI0 +aa(lp15157 +g10 +aa(lp15158 +g8 +aI453 +aI-324 +aa(lp15159 +g15 +aI486 +aI-202 +aI453 +aI-269 +aI464 +aI-228 +aa(lp15160 +g15 +aI569 +aI-163 +aI509 +aI-176 +aI536 +aI-163 +aa(lp15161 +g15 +aI639 +aI-181 +aI594 +aI-163 +aI617 +aI-169 +aa(lp15162 +g15 +aI688 +aI-222 +aI655 +aI-190 +aI672 +aI-204 +aa(lp15163 +g15 +aI747 +aI-338 +aI711 +aI-249 +aI731 +aI-287 +aa(lp15164 +g15 +aI772 +aI-480 +aI764 +aI-389 +aI772 +aI-436 +aa(lp15165 +g15 +aI738 +aI-593 +aI772 +aI-529 +aI761 +aI-567 +aa(lp15166 +g15 +aI652 +aI-632 +aI715 +aI-619 +aI687 +aI-632 +aa(lp15167 +g15 +aI548 +aI-589 +aI615 +aI-632 +aI580 +aI-618 +aa(lp15168 +g15 +aI477 +aI-466 +aI517 +aI-560 +aI493 +aI-519 +aa(lp15169 +g15 +aI453 +aI-324 +aI461 +aI-412 +aI453 +aI-365 +aa(lp15170 +g10 +aa(lp15171 +g8 +aI1300 +aI-44 +aa(lp15172 +g10 +aa(lp15173 +g8 +aI1300 +aI-44 +aasVD +(lp15174 +(lp15175 +g8 +aI96 +aI-998 +aa(lp15176 +g20 +aI448 +aI-998 +aa(lp15177 +g15 +aI630 +aI-980 +aI527 +aI-998 +aI588 +aI-992 +aa(lp15178 +g15 +aI774 +aI-892 +aI686 +aI-964 +aI734 +aI-934 +aa(lp15179 +g15 +aI865 +aI-738 +aI814 +aI-850 +aI844 +aI-799 +aa(lp15180 +g15 +aI896 +aI-512 +aI886 +aI-677 +aI896 +aI-601 +aa(lp15181 +g15 +aI867 +aI-309 +aI896 +aI-433 +aI886 +aI-366 +aa(lp15182 +g15 +aI764 +aI-140 +aI843 +aI-239 +aI809 +aI-183 +aa(lp15183 +g15 +aI629 +aI-64 +aI731 +aI-108 +aI686 +aI-82 +aa(lp15184 +g15 +aI458 +aI-44 +aI587 +aI-51 +aI530 +aI-44 +aa(lp15185 +g20 +aI96 +aI-44 +aa(lp15186 +g10 +aa(lp15187 +g8 +aI289 +aI-837 +aa(lp15188 +g20 +aI289 +aI-205 +aa(lp15189 +g20 +aI432 +aI-205 +aa(lp15190 +g15 +aI549 +aI-214 +aI486 +aI-205 +aI525 +aI-208 +aa(lp15191 +g15 +aI627 +aI-254 +aI580 +aI-222 +aI606 +aI-235 +aa(lp15192 +g15 +aI677 +aI-346 +aI647 +aI-272 +aI664 +aI-303 +aa(lp15193 +g15 +aI697 +aI-521 +aI690 +aI-388 +aI697 +aI-447 +aa(lp15194 +g15 +aI677 +aI-690 +aI697 +aI-594 +aI690 +aI-651 +aa(lp15195 +g15 +aI623 +aI-783 +aI664 +aI-730 +aI646 +aI-761 +aa(lp15196 +g15 +aI533 +aI-828 +aI599 +aI-805 +aI569 +aI-820 +aa(lp15197 +g15 +aI375 +aI-837 +aI506 +aI-834 +aI454 +aI-837 +aa(lp15198 +g10 +aa(lp15199 +g8 +aI962 +aI-44 +aa(lp15200 +g10 +aa(lp15201 +g8 +aI962 +aI-44 +aasVH +(lp15202 +(lp15203 +g8 +aI97 +aI-44 +aa(lp15204 +g20 +aI97 +aI-998 +aa(lp15205 +g20 +aI290 +aI-998 +aa(lp15206 +g20 +aI290 +aI-623 +aa(lp15207 +g20 +aI667 +aI-623 +aa(lp15208 +g20 +aI667 +aI-998 +aa(lp15209 +g20 +aI860 +aI-998 +aa(lp15210 +g20 +aI860 +aI-44 +aa(lp15211 +g20 +aI667 +aI-44 +aa(lp15212 +g20 +aI667 +aI-461 +aa(lp15213 +g20 +aI290 +aI-461 +aa(lp15214 +g20 +aI290 +aI-44 +aa(lp15215 +g10 +aa(lp15216 +g8 +aI962 +aI-44 +aa(lp15217 +g10 +aa(lp15218 +g8 +aI962 +aI-44 +aasVL +(lp15219 +(lp15220 +g8 +aI102 +aI-44 +aa(lp15221 +g20 +aI102 +aI-991 +aa(lp15222 +g20 +aI294 +aI-991 +aa(lp15223 +g20 +aI294 +aI-205 +aa(lp15224 +g20 +aI774 +aI-205 +aa(lp15225 +g20 +aI774 +aI-44 +aa(lp15226 +g10 +aa(lp15227 +g8 +aI814 +aI-44 +aa(lp15228 +g10 +aa(lp15229 +g8 +aI814 +aI-44 +aasVP +(lp15230 +(lp15231 +g8 +aI97 +aI-44 +aa(lp15232 +g20 +aI97 +aI-998 +aa(lp15233 +g20 +aI406 +aI-998 +aa(lp15234 +g15 +aI635 +aI-984 +aI523 +aI-998 +aI599 +aI-994 +aa(lp15235 +g15 +aI772 +aI-891 +aI690 +aI-970 +aI735 +aI-939 +aa(lp15236 +g15 +aI828 +aI-705 +aI809 +aI-843 +aI828 +aI-781 +aa(lp15237 +g15 +aI796 +aI-557 +aI828 +aI-646 +aI817 +aI-597 +aa(lp15238 +g15 +aI715 +aI-463 +aI774 +aI-517 +aI747 +aI-486 +aa(lp15239 +g15 +aI615 +aI-418 +aI682 +aI-440 +aI649 +aI-425 +aa(lp15240 +g15 +aI415 +aI-404 +aI569 +aI-409 +aI502 +aI-404 +aa(lp15241 +g20 +aI289 +aI-404 +aa(lp15242 +g20 +aI289 +aI-44 +aa(lp15243 +g10 +aa(lp15244 +g8 +aI289 +aI-837 +aa(lp15245 +g20 +aI289 +aI-566 +aa(lp15246 +g20 +aI395 +aI-566 +aa(lp15247 +g15 +aI547 +aI-581 +aI471 +aI-566 +aI521 +aI-571 +aa(lp15248 +g15 +aI607 +aI-628 +aI573 +aI-591 +aI593 +aI-607 +aa(lp15249 +g15 +aI629 +aI-702 +aI622 +aI-649 +aI629 +aI-674 +aa(lp15250 +g15 +aI598 +aI-788 +aI629 +aI-737 +aI619 +aI-766 +aa(lp15251 +g15 +aI521 +aI-830 +aI578 +aI-811 +aI552 +aI-825 +aa(lp15252 +g15 +aI382 +aI-837 +aI498 +aI-835 +aI452 +aI-837 +aa(lp15253 +g10 +aa(lp15254 +g8 +aI889 +aI-44 +aa(lp15255 +g10 +aa(lp15256 +g8 +aI889 +aI-44 +aasVT +(lp15257 +(lp15258 +g8 +aI311 +aI-44 +aa(lp15259 +g20 +aI311 +aI-837 +aa(lp15260 +g20 +aI28 +aI-837 +aa(lp15261 +g20 +aI28 +aI-998 +aa(lp15262 +g20 +aI787 +aI-998 +aa(lp15263 +g20 +aI787 +aI-837 +aa(lp15264 +g20 +aI504 +aI-837 +aa(lp15265 +g20 +aI504 +aI-44 +aa(lp15266 +g10 +aa(lp15267 +g8 +aI814 +aI-44 +aa(lp15268 +g10 +aa(lp15269 +g8 +aI814 +aI-44 +aasVX +(lp15270 +(lp15271 +g8 +aI0 +aI-44 +aa(lp15272 +g20 +aI326 +aI-542 +aa(lp15273 +g20 +aI30 +aI-998 +aa(lp15274 +g20 +aI255 +aI-998 +aa(lp15275 +g20 +aI447 +aI-692 +aa(lp15276 +g20 +aI634 +aI-998 +aa(lp15277 +g20 +aI858 +aI-998 +aa(lp15278 +g20 +aI561 +aI-535 +aa(lp15279 +g20 +aI887 +aI-44 +aa(lp15280 +g20 +aI654 +aI-44 +aa(lp15281 +g20 +aI443 +aI-374 +aa(lp15282 +g20 +aI231 +aI-44 +aa(lp15283 +g10 +aa(lp15284 +g8 +aI889 +aI-44 +aa(lp15285 +g10 +aa(lp15286 +g8 +aI889 +aI-44 +aasV\u005C +(lp15287 +(lp15288 +g8 +aI-1 +aI-1015 +aa(lp15289 +g20 +aI132 +aI-1015 +aa(lp15290 +g20 +aI371 +aI-28 +aa(lp15291 +g20 +aI234 +aI-28 +aa(lp15292 +g10 +aa(lp15293 +g8 +aI370 +aI-44 +aa(lp15294 +g10 +aa(lp15295 +g8 +aI370 +aI-44 +aasV` +(lp15296 +(lp15297 +g8 +aI322 +aI-820 +aa(lp15298 +g20 +aI207 +aI-820 +aa(lp15299 +g20 +aI27 +aI-1015 +aa(lp15300 +g20 +aI232 +aI-1015 +aa(lp15301 +g10 +aa(lp15302 +g8 +aI444 +aI-44 +aa(lp15303 +g10 +aa(lp15304 +g8 +aI444 +aI-44 +aasVd +(lp15305 +(lp15306 +g8 +aI729 +aI-44 +aa(lp15307 +g20 +aI559 +aI-44 +aa(lp15308 +g20 +aI559 +aI-146 +aa(lp15309 +g15 +aI459 +aI-57 +aI531 +aI-106 +aI498 +aI-77 +aa(lp15310 +g15 +aI343 +aI-28 +aI421 +aI-38 +aI382 +aI-28 +aa(lp15311 +g15 +aI139 +aI-124 +aI264 +aI-28 +aI196 +aI-60 +aa(lp15312 +g15 +aI54 +aI-392 +aI83 +aI-188 +aI54 +aI-278 +aa(lp15313 +g15 +aI137 +aI-660 +aI54 +aI-509 +aI82 +aI-599 +aa(lp15314 +g15 +aI346 +aI-751 +aI192 +aI-720 +aI262 +aI-751 +aa(lp15315 +g15 +aI546 +aI-655 +aI423 +aI-751 +aI490 +aI-719 +aa(lp15316 +g20 +aI546 +aI-998 +aa(lp15317 +g20 +aI729 +aI-998 +aa(lp15318 +g10 +aa(lp15319 +g8 +aI241 +aI-405 +aa(lp15320 +g15 +aI272 +aI-244 +aI241 +aI-331 +aI251 +aI-277 +aa(lp15321 +g15 +aI395 +aI-173 +aI301 +aI-197 +aI342 +aI-173 +aa(lp15322 +g15 +aI503 +aI-227 +aI437 +aI-173 +aI473 +aI-191 +aa(lp15323 +g15 +aI547 +aI-387 +aI532 +aI-262 +aI547 +aI-316 +aa(lp15324 +g15 +aI504 +aI-559 +aI547 +aI-466 +aI533 +aI-524 +aa(lp15325 +g15 +aI394 +aI-611 +aI475 +aI-594 +aI439 +aI-611 +aa(lp15326 +g15 +aI285 +aI-559 +aI351 +aI-611 +aI314 +aI-594 +aa(lp15327 +g15 +aI241 +aI-405 +aI256 +aI-525 +aI241 +aI-473 +aa(lp15328 +g10 +aa(lp15329 +g8 +aI814 +aI-44 +aa(lp15330 +g10 +aa(lp15331 +g8 +aI814 +aI-44 +aasVh +(lp15332 +(lp15333 +g8 +aI277 +aI-998 +aa(lp15334 +g20 +aI277 +aI-647 +aa(lp15335 +g15 +aI489 +aI-751 +aI337 +aI-716 +aI407 +aI-751 +aa(lp15336 +g15 +aI603 +aI-728 +aI531 +aI-751 +aI569 +aI-743 +aa(lp15337 +g15 +aI680 +aI-668 +aI637 +aI-712 +aI662 +aI-692 +aa(lp15338 +g15 +aI715 +aI-587 +aI697 +aI-643 +aI708 +aI-616 +aa(lp15339 +g15 +aI724 +aI-450 +aI721 +aI-557 +aI724 +aI-512 +aa(lp15340 +g20 +aI724 +aI-44 +aa(lp15341 +g20 +aI541 +aI-44 +aa(lp15342 +g20 +aI541 +aI-409 +aa(lp15343 +g15 +aI531 +aI-547 +aI541 +aI-482 +aI538 +aI-528 +aa(lp15344 +g15 +aI494 +aI-594 +aI524 +aI-567 +aI512 +aI-582 +aa(lp15345 +g15 +aI428 +aI-611 +aI476 +aI-605 +aI454 +aI-611 +aa(lp15346 +g15 +aI347 +aI-589 +aI398 +aI-611 +aI370 +aI-604 +aa(lp15347 +g15 +aI294 +aI-522 +aI323 +aI-574 +aI305 +aI-552 +aa(lp15348 +g15 +aI277 +aI-390 +aI283 +aI-492 +aI277 +aI-448 +aa(lp15349 +g20 +aI277 +aI-44 +aa(lp15350 +g20 +aI95 +aI-44 +aa(lp15351 +g20 +aI95 +aI-998 +aa(lp15352 +g10 +aa(lp15353 +g8 +aI814 +aI-44 +aa(lp15354 +g10 +aa(lp15355 +g8 +aI814 +aI-44 +aasVl +(lp15356 +(lp15357 +g8 +aI95 +aI-44 +aa(lp15358 +g20 +aI95 +aI-998 +aa(lp15359 +g20 +aI278 +aI-998 +aa(lp15360 +g20 +aI278 +aI-44 +aa(lp15361 +g10 +aa(lp15362 +g8 +aI370 +aI-44 +aa(lp15363 +g10 +aa(lp15364 +g8 +aI370 +aI-44 +aasVp +(lp15365 +(lp15366 +g8 +aI90 +aI-735 +aa(lp15367 +g20 +aI261 +aI-735 +aa(lp15368 +g20 +aI261 +aI-634 +aa(lp15369 +g15 +aI350 +aI-718 +aI283 +aI-669 +aI313 +aI-697 +aa(lp15370 +g15 +aI476 +aI-751 +aI388 +aI-740 +aI430 +aI-751 +aa(lp15371 +g15 +aI680 +aI-657 +aI556 +aI-751 +aI624 +aI-720 +aa(lp15372 +g15 +aI764 +aI-394 +aI736 +aI-594 +aI764 +aI-506 +aa(lp15373 +g15 +aI680 +aI-124 +aI764 +aI-278 +aI736 +aI-188 +aa(lp15374 +g15 +aI475 +aI-28 +aI623 +aI-60 +aI555 +aI-28 +aa(lp15375 +g15 +aI371 +aI-51 +aI437 +aI-28 +aI402 +aI-36 +aa(lp15376 +g15 +aI273 +aI-129 +aI340 +aI-66 +aI307 +aI-92 +aa(lp15377 +g20 +aI273 +aI218 +aa(lp15378 +g20 +aI90 +aI218 +aa(lp15379 +g10 +aa(lp15380 +g8 +aI271 +aI-401 +aa(lp15381 +g15 +aI317 +aI-229 +aI271 +aI-324 +aI286 +aI-266 +aa(lp15382 +g15 +aI430 +aI-174 +aI348 +aI-192 +aI386 +aI-174 +aa(lp15383 +g15 +aI536 +aI-225 +aI472 +aI-174 +aI508 +aI-191 +aa(lp15384 +g15 +aI578 +aI-392 +aI564 +aI-259 +aI578 +aI-315 +aa(lp15385 +g15 +aI535 +aI-554 +aI578 +aI-465 +aI564 +aI-519 +aa(lp15386 +g15 +aI427 +aI-606 +aI506 +aI-589 +aI470 +aI-606 +aa(lp15387 +g15 +aI315 +aI-555 +aI382 +aI-606 +aI345 +aI-589 +aa(lp15388 +g15 +aI271 +aI-401 +aI286 +aI-520 +aI271 +aI-469 +aa(lp15389 +g10 +aa(lp15390 +g8 +aI814 +aI-44 +aa(lp15391 +g10 +aa(lp15392 +g8 +aI814 +aI-44 +aasVt +(lp15393 +(lp15394 +g8 +aI412 +aI-735 +aa(lp15395 +g20 +aI412 +aI-590 +aa(lp15396 +g20 +aI287 +aI-590 +aa(lp15397 +g20 +aI287 +aI-311 +aa(lp15398 +g15 +aI291 +aI-212 +aI287 +aI-254 +aI288 +aI-222 +aa(lp15399 +g15 +aI307 +aI-189 +aI293 +aI-203 +aI299 +aI-195 +aa(lp15400 +g15 +aI338 +aI-180 +aI316 +aI-183 +aI326 +aI-180 +aa(lp15401 +g15 +aI412 +aI-198 +aI355 +aI-180 +aI379 +aI-186 +aa(lp15402 +g20 +aI427 +aI-56 +aa(lp15403 +g15 +aI283 +aI-28 +aI385 +aI-37 +aI337 +aI-28 +aa(lp15404 +g15 +aI194 +aI-45 +aI250 +aI-28 +aI220 +aI-34 +aa(lp15405 +g15 +aI135 +aI-88 +aI167 +aI-56 +aI148 +aI-70 +aa(lp15406 +g15 +aI110 +aI-159 +aI123 +aI-105 +aI114 +aI-129 +aa(lp15407 +g15 +aI104 +aI-288 +aI106 +aI-180 +aI104 +aI-223 +aa(lp15408 +g20 +aI104 +aI-590 +aa(lp15409 +g20 +aI20 +aI-590 +aa(lp15410 +g20 +aI20 +aI-735 +aa(lp15411 +g20 +aI104 +aI-735 +aa(lp15412 +g20 +aI104 +aI-873 +aa(lp15413 +g20 +aI287 +aI-979 +aa(lp15414 +g20 +aI287 +aI-735 +aa(lp15415 +g10 +aa(lp15416 +g8 +aI444 +aI-44 +aa(lp15417 +g10 +aa(lp15418 +g8 +aI444 +aI-44 +aasVx +(lp15419 +(lp15420 +g8 +aI7 +aI-44 +aa(lp15421 +g20 +aI257 +aI-400 +aa(lp15422 +g20 +aI18 +aI-735 +aa(lp15423 +g20 +aI241 +aI-735 +aa(lp15424 +g20 +aI363 +aI-545 +aa(lp15425 +g20 +aI492 +aI-735 +aa(lp15426 +g20 +aI707 +aI-735 +aa(lp15427 +g20 +aI473 +aI-408 +aa(lp15428 +g20 +aI729 +aI-44 +aa(lp15429 +g20 +aI504 +aI-44 +aa(lp15430 +g20 +aI363 +aI-258 +aa(lp15431 +g20 +aI222 +aI-44 +aa(lp15432 +g10 +aa(lp15433 +g8 +aI741 +aI-44 +aa(lp15434 +g10 +aa(lp15435 +g8 +aI741 +aI-44 +aasV| +(lp15436 +(lp15437 +g8 +aI114 +aI236 +aa(lp15438 +g20 +aI114 +aI-1015 +aa(lp15439 +g20 +aI259 +aI-1015 +aa(lp15440 +g20 +aI259 +aI236 +aa(lp15441 +g10 +aa(lp15442 +g8 +aI373 +aI-44 +aa(lp15443 +g10 +aa(lp15444 +g8 +aI373 +aI-44 +aasV# +(lp15445 +(lp15446 +g8 +aI100 +aI-282 +aa(lp15447 +g20 +aI11 +aI-282 +aa(lp15448 +g20 +aI11 +aI-425 +aa(lp15449 +g20 +aI128 +aI-425 +aa(lp15450 +g20 +aI167 +aI-617 +aa(lp15451 +g20 +aI11 +aI-617 +aa(lp15452 +g20 +aI11 +aI-761 +aa(lp15453 +g20 +aI197 +aI-761 +aa(lp15454 +g20 +aI248 +aI-1015 +aa(lp15455 +g20 +aI394 +aI-1015 +aa(lp15456 +g20 +aI343 +aI-761 +aa(lp15457 +g20 +aI486 +aI-761 +aa(lp15458 +g20 +aI537 +aI-1015 +aa(lp15459 +g20 +aI688 +aI-1015 +aa(lp15460 +g20 +aI636 +aI-761 +aa(lp15461 +g20 +aI725 +aI-761 +aa(lp15462 +g20 +aI725 +aI-617 +aa(lp15463 +g20 +aI606 +aI-617 +aa(lp15464 +g20 +aI567 +aI-425 +aa(lp15465 +g20 +aI725 +aI-425 +aa(lp15466 +g20 +aI725 +aI-282 +aa(lp15467 +g20 +aI538 +aI-282 +aa(lp15468 +g20 +aI486 +aI-28 +aa(lp15469 +g20 +aI341 +aI-28 +aa(lp15470 +g20 +aI391 +aI-282 +aa(lp15471 +g20 +aI247 +aI-282 +aa(lp15472 +g20 +aI195 +aI-28 +aa(lp15473 +g20 +aI48 +aI-28 +aa(lp15474 +g10 +aa(lp15475 +g8 +aI314 +aI-617 +aa(lp15476 +g20 +aI276 +aI-425 +aa(lp15477 +g20 +aI420 +aI-425 +aa(lp15478 +g20 +aI458 +aI-617 +aa(lp15479 +g10 +aa(lp15480 +g8 +aI741 +aI-44 +aa(lp15481 +g10 +aa(lp15482 +g8 +aI741 +aI-44 +aasV' +(lp15483 +(lp15484 +g8 +aI94 +aI-659 +aa(lp15485 +g20 +aI59 +aI-837 +aa(lp15486 +g20 +aI59 +aI-998 +aa(lp15487 +g20 +aI259 +aI-998 +aa(lp15488 +g20 +aI259 +aI-837 +aa(lp15489 +g20 +aI229 +aI-659 +aa(lp15490 +g10 +aa(lp15491 +g8 +aI317 +aI-44 +aa(lp15492 +g10 +aa(lp15493 +g8 +aI317 +aI-44 +aasV+ +(lp15494 +(lp15495 +g8 +aI305 +aI-181 +aa(lp15496 +g20 +aI305 +aI-429 +aa(lp15497 +g20 +aI55 +aI-429 +aa(lp15498 +g20 +aI55 +aI-601 +aa(lp15499 +g20 +aI305 +aI-601 +aa(lp15500 +g20 +aI305 +aI-849 +aa(lp15501 +g20 +aI472 +aI-849 +aa(lp15502 +g20 +aI472 +aI-601 +aa(lp15503 +g20 +aI722 +aI-601 +aa(lp15504 +g20 +aI722 +aI-429 +aa(lp15505 +g20 +aI472 +aI-429 +aa(lp15506 +g20 +aI472 +aI-181 +aa(lp15507 +g10 +aa(lp15508 +g8 +aI778 +aI-44 +aa(lp15509 +g10 +aa(lp15510 +g8 +aI778 +aI-44 +aasV/ +(lp15511 +(lp15512 +g8 +aI-1 +aI-28 +aa(lp15513 +g20 +aI234 +aI-1015 +aa(lp15514 +g20 +aI371 +aI-1015 +aa(lp15515 +g20 +aI132 +aI-28 +aa(lp15516 +g10 +aa(lp15517 +g8 +aI370 +aI-44 +aa(lp15518 +g10 +aa(lp15519 +g8 +aI370 +aI-44 +aasV3 +(lp15520 +(lp15521 +g8 +aI50 +aI-297 +aa(lp15522 +g20 +aI227 +aI-319 +aa(lp15523 +g15 +aI272 +aI-215 +aI232 +aI-274 +aI248 +aI-239 +aa(lp15524 +g15 +aI362 +aI-179 +aI297 +aI-191 +aI327 +aI-179 +aa(lp15525 +g15 +aI458 +aI-222 +aI400 +aI-179 +aI432 +aI-194 +aa(lp15526 +g15 +aI496 +aI-338 +aI483 +aI-251 +aI496 +aI-290 +aa(lp15527 +g15 +aI459 +aI-448 +aI496 +aI-384 +aI484 +aI-421 +aa(lp15528 +g15 +aI369 +aI-488 +aI434 +aI-475 +aI404 +aI-488 +aa(lp15529 +g15 +aI285 +aI-474 +aI345 +aI-488 +aI317 +aI-483 +aa(lp15530 +g20 +aI305 +aI-623 +aa(lp15531 +g15 +aI418 +aI-656 +aI354 +aI-622 +aI392 +aI-633 +aa(lp15532 +g15 +aI457 +aI-746 +aI444 +aI-678 +aI457 +aI-709 +aa(lp15533 +g15 +aI429 +aI-823 +aI457 +aI-779 +aI448 +aI-804 +aa(lp15534 +g15 +aI352 +aI-852 +aI409 +aI-842 +aI384 +aI-852 +aa(lp15535 +g15 +aI272 +aI-819 +aI321 +aI-852 +aI294 +aI-841 +aa(lp15536 +g15 +aI232 +aI-724 +aI250 +aI-798 +aI237 +aI-766 +aa(lp15537 +g20 +aI63 +aI-753 +aa(lp15538 +g15 +aI116 +aI-891 +aI75 +aI-811 +aI93 +aI-857 +aa(lp15539 +g15 +aI215 +aI-973 +aI140 +aI-926 +aI173 +aI-953 +aa(lp15540 +g15 +aI358 +aI-1002 +aI258 +aI-992 +aI305 +aI-1002 +aa(lp15541 +g15 +aI574 +aI-916 +aI447 +aI-1002 +aI519 +aI-974 +aa(lp15542 +g15 +aI641 +aI-757 +aI618 +aI-869 +aI641 +aI-817 +aa(lp15543 +g15 +aI503 +aI-557 +aI641 +aI-674 +aI595 +aI-607 +aa(lp15544 +g15 +aI635 +aI-478 +aI558 +aI-545 +aI602 +aI-519 +aa(lp15545 +g15 +aI684 +aI-330 +aI667 +aI-437 +aI684 +aI-388 +aa(lp15546 +g15 +aI592 +aI-116 +aI684 +aI-247 +aI653 +aI-175 +aa(lp15547 +g15 +aI363 +aI-28 +aI531 +aI-57 +aI455 +aI-28 +aa(lp15548 +g15 +aI149 +aI-102 +aI277 +aI-28 +aI205 +aI-53 +aa(lp15549 +g15 +aI50 +aI-297 +aI92 +aI-152 +aI59 +aI-217 +aa(lp15550 +g10 +aa(lp15551 +g8 +aI741 +aI-44 +aa(lp15552 +g10 +aa(lp15553 +g8 +aI741 +aI-44 +aasV7 +(lp15554 +(lp15555 +g8 +aI56 +aI-815 +aa(lp15556 +g20 +aI56 +aI-985 +aa(lp15557 +g20 +aI682 +aI-985 +aa(lp15558 +g20 +aI682 +aI-853 +aa(lp15559 +g15 +aI524 +aI-634 +aI630 +aI-802 +aI578 +aI-729 +aa(lp15560 +g15 +aI402 +aI-331 +aI471 +aI-539 +aI430 +aI-438 +aa(lp15561 +g15 +aI361 +aI-44 +aI374 +aI-224 +aI360 +aI-128 +aa(lp15562 +g20 +aI184 +aI-44 +aa(lp15563 +g15 +aI266 +aI-448 +aI187 +aI-176 +aI215 +aI-310 +aa(lp15564 +g15 +aI472 +aI-815 +aI318 +aI-585 +aI386 +aI-707 +aa(lp15565 +g10 +aa(lp15566 +g8 +aI741 +aI-44 +aa(lp15567 +g10 +aa(lp15568 +g8 +aI741 +aI-44 +aasV; +(lp15569 +(lp15570 +g8 +aI125 +aI-552 +aa(lp15571 +g20 +aI125 +aI-735 +aa(lp15572 +g20 +aI308 +aI-735 +aa(lp15573 +g20 +aI308 +aI-552 +aa(lp15574 +g10 +aa(lp15575 +g8 +aI125 +aI-227 +aa(lp15576 +g20 +aI308 +aI-227 +aa(lp15577 +g20 +aI308 +aI-96 +aa(lp15578 +g15 +aI294 +aI28 +aI308 +aI-43 +aI304 +aI-1 +aa(lp15579 +g15 +aI243 +aI111 +aI285 +aI59 +aI268 +aI86 +aa(lp15580 +g15 +aI146 +aI168 +aI217 +aI135 +aI185 +aI154 +aa(lp15581 +g20 +aI110 +aI92 +aa(lp15582 +g15 +aI189 +aI42 +aI147 +aI80 +aI173 +aI63 +aa(lp15583 +g15 +aI214 +aI-44 +aI205 +aI20 +aI213 +aI-8 +aa(lp15584 +g20 +aI125 +aI-44 +aa(lp15585 +g10 +aa(lp15586 +g8 +aI444 +aI-44 +aa(lp15587 +g10 +aa(lp15588 +g8 +aI444 +aI-44 +aasV? +(lp15589 +(lp15590 +g8 +aI488 +aI-290 +aa(lp15591 +g20 +aI322 +aI-290 +aa(lp15592 +g15 +aI322 +aI-334 +aI322 +aI-314 +aI322 +aI-328 +aa(lp15593 +g15 +aI348 +aI-466 +aI322 +aI-387 +aI331 +aI-432 +aa(lp15594 +g15 +aI455 +aI-584 +aI366 +aI-501 +aI402 +aI-540 +aa(lp15595 +g15 +aI551 +aI-669 +aI509 +aI-627 +aI541 +aI-655 +aa(lp15596 +g15 +aI575 +aI-739 +aI567 +aI-690 +aI575 +aI-714 +aa(lp15597 +g15 +aI532 +aI-831 +aI575 +aI-775 +aI561 +aI-805 +aa(lp15598 +g15 +aI417 +aI-869 +aI504 +aI-856 +aI466 +aI-869 +aa(lp15599 +g15 +aI301 +aI-829 +aI371 +aI-869 +aI332 +aI-856 +aa(lp15600 +g15 +aI236 +aI-708 +aI270 +aI-803 +aI248 +aI-762 +aa(lp15601 +g20 +aI69 +aI-729 +aa(lp15602 +g15 +aI168 +aI-927 +aI73 +aI-807 +aI106 +aI-873 +aa(lp15603 +g15 +aI410 +aI-1008 +aI229 +aI-981 +aI310 +aI-1008 +aa(lp15604 +g15 +aI660 +aI-926 +aI515 +aI-1008 +aI598 +aI-981 +aa(lp15605 +g15 +aI753 +aI-734 +aI722 +aI-871 +aI753 +aI-807 +aa(lp15606 +g15 +aI719 +aI-619 +aI753 +aI-694 +aI742 +aI-655 +aa(lp15607 +g15 +aI573 +aI-472 +aI696 +aI-583 +aI648 +aI-534 +aa(lp15608 +g15 +aI501 +aI-395 +aI534 +aI-440 +aI510 +aI-414 +aa(lp15609 +g15 +aI488 +aI-290 +aI492 +aI-375 +aI488 +aI-340 +aa(lp15610 +g10 +aa(lp15611 +g8 +aI322 +aI-44 +aa(lp15612 +g20 +aI322 +aI-227 +aa(lp15613 +g20 +aI505 +aI-227 +aa(lp15614 +g20 +aI505 +aI-44 +aa(lp15615 +g10 +aa(lp15616 +g8 +aI814 +aI-44 +aa(lp15617 +g10 +aa(lp15618 +g8 +aI814 +aI-44 +aasVC +(lp15619 +(lp15620 +g8 +aI707 +aI-395 +aa(lp15621 +g20 +aI894 +aI-336 +aa(lp15622 +g15 +aI751 +aI-104 +aI865 +aI-231 +aI818 +aI-154 +aa(lp15623 +g15 +aI498 +aI-28 +aI685 +aI-53 +aI600 +aI-28 +aa(lp15624 +g15 +aI185 +aI-158 +aI371 +aI-28 +aI267 +aI-71 +aa(lp15625 +g15 +aI63 +aI-513 +aI103 +aI-244 +aI63 +aI-363 +aa(lp15626 +g15 +aI186 +aI-883 +aI63 +aI-672 +aI104 +aI-795 +aa(lp15627 +g15 +aI509 +aI-1015 +aI268 +aI-971 +aI376 +aI-1015 +aa(lp15628 +g15 +aI794 +aI-911 +aI626 +aI-1015 +aI721 +aI-980 +aa(lp15629 +g15 +aI891 +aI-735 +aI837 +aI-870 +aI870 +aI-812 +aa(lp15630 +g20 +aI701 +aI-690 +aa(lp15631 +g15 +aI630 +aI-807 +aI689 +aI-739 +aI666 +aI-778 +aa(lp15632 +g15 +aI500 +aI-850 +aI594 +aI-836 +aI551 +aI-850 +aa(lp15633 +g15 +aI327 +aI-774 +aI429 +aI-850 +aI371 +aI-825 +aa(lp15634 +g15 +aI261 +aI-527 +aI283 +aI-723 +aI261 +aI-641 +aa(lp15635 +g15 +aI326 +aI-269 +aI261 +aI-406 +aI283 +aI-320 +aa(lp15636 +g15 +aI496 +aI-192 +aI370 +aI-218 +aI426 +aI-192 +aa(lp15637 +g15 +aI628 +aI-241 +aI547 +aI-192 +aI591 +aI-209 +aa(lp15638 +g15 +aI707 +aI-395 +aI665 +aI-274 +aI691 +aI-325 +aa(lp15639 +g10 +aa(lp15640 +g8 +aI962 +aI-44 +aa(lp15641 +g10 +aa(lp15642 +g8 +aI962 +aI-44 +aasVG +(lp15643 +(lp15644 +g8 +aI541 +aI-395 +aa(lp15645 +g20 +aI541 +aI-556 +aa(lp15646 +g20 +aI956 +aI-556 +aa(lp15647 +g20 +aI956 +aI-175 +aa(lp15648 +g15 +aI780 +aI-72 +aI916 +aI-136 +aI857 +aI-102 +aa(lp15649 +g15 +aI548 +aI-28 +aI704 +aI-43 +aI626 +aI-28 +aa(lp15650 +g15 +aI287 +aI-90 +aI448 +aI-28 +aI361 +aI-49 +aa(lp15651 +g15 +aI119 +aI-270 +aI212 +aI-132 +aI157 +aI-192 +aa(lp15652 +g15 +aI63 +aI-524 +aI82 +aI-348 +aI63 +aI-433 +aa(lp15653 +g15 +aI126 +aI-789 +aI63 +aI-624 +aI84 +aI-712 +aa(lp15654 +g15 +aI309 +aI-967 +aI167 +aI-867 +aI228 +aI-926 +aa(lp15655 +g15 +aI537 +aI-1015 +aI370 +aI-999 +aI446 +aI-1015 +aa(lp15656 +g15 +aI815 +aI-940 +aI656 +aI-1015 +aI748 +aI-990 +aa(lp15657 +g15 +aI944 +aI-734 +aI882 +aI-890 +aI924 +aI-822 +aa(lp15658 +g20 +aI752 +aI-698 +aa(lp15659 +g15 +aI676 +aI-809 +aI739 +aI-745 +aI713 +aI-782 +aa(lp15660 +g15 +aI537 +aI-850 +aI639 +aI-836 +aI593 +aI-850 +aa(lp15661 +g15 +aI336 +aI-770 +aI453 +aI-850 +aI386 +aI-823 +aa(lp15662 +g15 +aI262 +aI-532 +aI287 +aI-716 +aI262 +aI-637 +aa(lp15663 +g15 +aI337 +aI-277 +aI262 +aI-419 +aI287 +aI-334 +aa(lp15664 +g15 +aI535 +aI-192 +aI388 +aI-221 +aI454 +aI-192 +aa(lp15665 +g15 +aI657 +aI-216 +aI576 +aI-192 +aI616 +aI-200 +aa(lp15666 +g15 +aI761 +aI-274 +aI697 +aI-232 +aI732 +aI-251 +aa(lp15667 +g20 +aI761 +aI-395 +aa(lp15668 +g10 +aa(lp15669 +g8 +aI1037 +aI-44 +aa(lp15670 +g10 +aa(lp15671 +g8 +aI1037 +aI-44 +aasVK +(lp15672 +(lp15673 +g8 +aI99 +aI-44 +aa(lp15674 +g20 +aI99 +aI-998 +aa(lp15675 +g20 +aI292 +aI-998 +aa(lp15676 +g20 +aI292 +aI-575 +aa(lp15677 +g20 +aI681 +aI-998 +aa(lp15678 +g20 +aI940 +aI-998 +aa(lp15679 +g20 +aI581 +aI-627 +aa(lp15680 +g20 +aI960 +aI-44 +aa(lp15681 +g20 +aI710 +aI-44 +aa(lp15682 +g20 +aI448 +aI-492 +aa(lp15683 +g20 +aI292 +aI-332 +aa(lp15684 +g20 +aI292 +aI-44 +aa(lp15685 +g10 +aa(lp15686 +g8 +aI962 +aI-44 +aa(lp15687 +g10 +aa(lp15688 +g8 +aI962 +aI-44 +aasVO +(lp15689 +(lp15690 +g8 +aI57 +aI-515 +aa(lp15691 +g15 +aI101 +aI-760 +aI57 +aI-613 +aI72 +aI-694 +aa(lp15692 +g15 +aI190 +aI-891 +aI123 +aI-809 +aI152 +aI-852 +aa(lp15693 +g15 +aI313 +aI-977 +aI227 +aI-930 +aI269 +aI-958 +aa(lp15694 +g15 +aI519 +aI-1015 +aI373 +aI-1002 +aI441 +aI-1015 +aa(lp15695 +g15 +aI857 +aI-884 +aI660 +aI-1015 +aI772 +aI-971 +aa(lp15696 +g15 +aI983 +aI-520 +aI941 +aI-797 +aI983 +aI-675 +aa(lp15697 +g15 +aI858 +aI-158 +aI983 +aI-366 +aI941 +aI-245 +aa(lp15698 +g15 +aI522 +aI-28 +aI774 +aI-71 +aI662 +aI-28 +aa(lp15699 +g15 +aI183 +aI-158 +aI380 +aI-28 +aI267 +aI-71 +aa(lp15700 +g15 +aI57 +aI-515 +aI99 +aI-244 +aI57 +aI-363 +aa(lp15701 +g10 +aa(lp15702 +g8 +aI256 +aI-522 +aa(lp15703 +g15 +aI331 +aI-276 +aI256 +aI-414 +aI281 +aI-332 +aa(lp15704 +g15 +aI521 +aI-192 +aI381 +aI-220 +aI444 +aI-192 +aa(lp15705 +g15 +aI710 +aI-275 +aI598 +aI-192 +aI661 +aI-220 +aa(lp15706 +g15 +aI784 +aI-524 +aI759 +aI-331 +aI784 +aI-414 +aa(lp15707 +g15 +aI712 +aI-769 +aI784 +aI-634 +aI760 +aI-715 +aa(lp15708 +g15 +aI521 +aI-850 +aI664 +aI-823 +aI600 +aI-850 +aa(lp15709 +g15 +aI329 +aI-768 +aI442 +aI-850 +aI378 +aI-823 +aa(lp15710 +g15 +aI256 +aI-522 +aI280 +aI-714 +aI256 +aI-632 +aa(lp15711 +g10 +aa(lp15712 +g8 +aI1037 +aI-44 +aa(lp15713 +g10 +aa(lp15714 +g8 +aI1037 +aI-44 +aasVS +(lp15715 +(lp15716 +g8 +aI48 +aI-354 +aa(lp15717 +g20 +aI235 +aI-373 +aa(lp15718 +g15 +aI304 +aI-234 +aI246 +aI-310 +aI269 +aI-264 +aa(lp15719 +g15 +aI444 +aI-190 +aI338 +aI-205 +aI385 +aI-190 +aa(lp15720 +g15 +aI584 +aI-229 +aI506 +aI-190 +aI552 +aI-203 +aa(lp15721 +g15 +aI631 +aI-321 +aI615 +aI-255 +aI631 +aI-286 +aa(lp15722 +g15 +aI611 +aI-379 +aI631 +aI-344 +aI624 +aI-363 +aa(lp15723 +g15 +aI542 +aI-420 +aI598 +aI-395 +aI575 +aI-409 +aa(lp15724 +g15 +aI388 +aI-462 +aI519 +aI-428 +aI468 +aI-442 +aa(lp15725 +g15 +aI170 +aI-556 +aI284 +aI-488 +aI212 +aI-519 +aa(lp15726 +g15 +aI82 +aI-748 +aI111 +aI-609 +aI82 +aI-673 +aa(lp15727 +g15 +aI124 +aI-885 +aI82 +aI-797 +aI96 +aI-842 +aa(lp15728 +g15 +aI243 +aI-981 +aI151 +aI-927 +aI191 +aI-959 +aa(lp15729 +g15 +aI430 +aI-1015 +aI295 +aI-1004 +aI357 +aI-1015 +aa(lp15730 +g15 +aI701 +aI-936 +aI550 +aI-1015 +aI640 +aI-988 +aa(lp15731 +g15 +aI796 +aI-726 +aI762 +aI-883 +aI793 +aI-813 +aa(lp15732 +g20 +aI604 +aI-717 +aa(lp15733 +g15 +aI551 +aI-823 +aI595 +aI-766 +aI578 +aI-801 +aa(lp15734 +g15 +aI429 +aI-855 +aI523 +aI-844 +aI483 +aI-855 +aa(lp15735 +g15 +aI297 +aI-821 +aI373 +aI-855 +aI329 +aI-844 +aa(lp15736 +g15 +aI266 +aI-761 +aI277 +aI-806 +aI266 +aI-786 +aa(lp15737 +g15 +aI295 +aI-703 +aI266 +aI-739 +aI276 +aI-720 +aa(lp15738 +g15 +aI472 +aI-640 +aI319 +aI-683 +aI378 +aI-662 +aa(lp15739 +g15 +aI680 +aI-571 +aI566 +aI-618 +aI635 +aI-595 +aa(lp15740 +g15 +aI786 +aI-474 +aI725 +aI-547 +aI760 +aI-515 +aa(lp15741 +g15 +aI824 +aI-322 +aI811 +aI-433 +aI824 +aI-382 +aa(lp15742 +g15 +aI778 +aI-168 +aI824 +aI-267 +aI809 +aI-216 +aa(lp15743 +g15 +aI649 +aI-62 +aI748 +aI-121 +aI705 +aI-85 +aa(lp15744 +g15 +aI442 +aI-27 +aI594 +aI-39 +aI524 +aI-27 +aa(lp15745 +g15 +aI164 +aI-111 +aI321 +aI-27 +aI228 +aI-55 +aa(lp15746 +g15 +aI48 +aI-354 +aI99 +aI-166 +aI60 +aI-248 +aa(lp15747 +g10 +aa(lp15748 +g8 +aI889 +aI-44 +aa(lp15749 +g10 +aa(lp15750 +g8 +aI889 +aI-44 +aasVW +(lp15751 +(lp15752 +g8 +aI232 +aI-44 +aa(lp15753 +g20 +aI4 +aI-998 +aa(lp15754 +g20 +aI201 +aI-998 +aa(lp15755 +g20 +aI345 +aI-343 +aa(lp15756 +g20 +aI520 +aI-998 +aa(lp15757 +g20 +aI749 +aI-998 +aa(lp15758 +g20 +aI916 +aI-332 +aa(lp15759 +g20 +aI1063 +aI-998 +aa(lp15760 +g20 +aI1257 +aI-998 +aa(lp15761 +g20 +aI1025 +aI-44 +aa(lp15762 +g20 +aI820 +aI-44 +aa(lp15763 +g20 +aI630 +aI-757 +aa(lp15764 +g20 +aI441 +aI-44 +aa(lp15765 +g10 +aa(lp15766 +g8 +aI1258 +aI-44 +aa(lp15767 +g10 +aa(lp15768 +g8 +aI1258 +aI-44 +aasV[ +(lp15769 +(lp15770 +g8 +aI95 +aI224 +aa(lp15771 +g20 +aI95 +aI-998 +aa(lp15772 +g20 +aI419 +aI-998 +aa(lp15773 +g20 +aI419 +aI-854 +aa(lp15774 +g20 +aI268 +aI-854 +aa(lp15775 +g20 +aI268 +aI80 +aa(lp15776 +g20 +aI419 +aI80 +aa(lp15777 +g20 +aI419 +aI224 +aa(lp15778 +g10 +aa(lp15779 +g8 +aI444 +aI-44 +aa(lp15780 +g10 +aa(lp15781 +g8 +aI444 +aI-44 +aasV_ +(lp15782 +(lp15783 +g8 +aI-12 +aI219 +aa(lp15784 +g20 +aI-12 +aI100 +aa(lp15785 +g20 +aI748 +aI100 +aa(lp15786 +g20 +aI748 +aI219 +aa(lp15787 +g10 +aa(lp15788 +g8 +aI741 +aI-44 +aa(lp15789 +g10 +aa(lp15790 +g8 +aI741 +aI-44 +aasVc +(lp15791 +(lp15792 +g8 +aI698 +aI-531 +aa(lp15793 +g20 +aI518 +aI-498 +aa(lp15794 +g15 +aI476 +aI-580 +aI512 +aI-534 +aI498 +aI-562 +aa(lp15795 +g15 +aI393 +aI-607 +aI455 +aI-598 +aI427 +aI-607 +aa(lp15796 +g15 +aI284 +aI-560 +aI347 +aI-607 +aI311 +aI-591 +aa(lp15797 +g15 +aI243 +aI-402 +aI257 +aI-528 +aI243 +aI-476 +aa(lp15798 +g15 +aI284 +aI-228 +aI243 +aI-320 +aI257 +aI-262 +aa(lp15799 +g15 +aI395 +aI-177 +aI312 +aI-194 +aI349 +aI-177 +aa(lp15800 +g15 +aI481 +aI-207 +aI430 +aI-177 +aI458 +aI-187 +aa(lp15801 +g15 +aI527 +aI-309 +aI503 +aI-227 +aI518 +aI-261 +aa(lp15802 +g20 +aI707 +aI-278 +aa(lp15803 +g15 +aI600 +aI-91 +aI689 +aI-196 +aI653 +aI-134 +aa(lp15804 +g15 +aI387 +aI-28 +aI547 +aI-49 +aI476 +aI-28 +aa(lp15805 +g15 +aI145 +aI-124 +aI286 +aI-28 +aI205 +aI-60 +aa(lp15806 +g15 +aI55 +aI-389 +aI85 +aI-188 +aI55 +aI-276 +aa(lp15807 +g15 +aI145 +aI-656 +aI55 +aI-503 +aI85 +aI-592 +aa(lp15808 +g15 +aI390 +aI-751 +aI206 +aI-719 +aI287 +aI-751 +aa(lp15809 +g15 +aI591 +aI-697 +aI474 +aI-751 +aI541 +aI-733 +aa(lp15810 +g15 +aI698 +aI-531 +aI641 +aI-660 +aI676 +aI-605 +aa(lp15811 +g10 +aa(lp15812 +g8 +aI741 +aI-44 +aa(lp15813 +g10 +aa(lp15814 +g8 +aI741 +aI-44 +aasVg +(lp15815 +(lp15816 +g8 +aI78 +aI1 +aa(lp15817 +g20 +aI287 +aI26 +aa(lp15818 +g15 +aI311 +aI76 +aI291 +aI50 +aI299 +aI67 +aa(lp15819 +g15 +aI393 +aI96 +aI329 +aI89 +aI356 +aI96 +aa(lp15820 +g15 +aI501 +aI74 +aI441 +aI96 +aI477 +aI89 +aa(lp15821 +g15 +aI537 +aI28 +aI517 +aI65 +aI529 +aI49 +aa(lp15822 +g15 +aI546 +aI-55 +aI543 +aI13 +aI546 +aI-14 +aa(lp15823 +g20 +aI546 +aI-156 +aa(lp15824 +g15 +aI339 +aI-44 +aI491 +aI-81 +aI422 +aI-44 +aa(lp15825 +g15 +aI118 +aI-162 +aI246 +aI-44 +aI172 +aI-83 +aa(lp15826 +g15 +aI54 +aI-394 +aI75 +aI-224 +aI54 +aI-301 +aa(lp15827 +g15 +aI138 +aI-659 +aI54 +aI-509 +aI82 +aI-598 +aa(lp15828 +g15 +aI346 +aI-751 +aI194 +aI-720 +aI263 +aI-751 +aa(lp15829 +g15 +aI557 +aI-638 +aI431 +aI-751 +aI502 +aI-713 +aa(lp15830 +g20 +aI557 +aI-735 +aa(lp15831 +g20 +aI729 +aI-735 +aa(lp15832 +g20 +aI729 +aI-115 +aa(lp15833 +g15 +aI708 +aI67 +aI729 +aI-33 +aI722 +aI27 +aa(lp15834 +g15 +aI652 +aI162 +aI695 +aI107 +aI676 +aI139 +aa(lp15835 +g15 +aI555 +aI216 +aI628 +aI185 +aI595 +aI203 +aa(lp15836 +g15 +aI401 +aI236 +aI514 +aI229 +aI463 +aI236 +aa(lp15837 +g15 +aI151 +aI175 +aI283 +aI236 +aI200 +aI216 +aa(lp15838 +g15 +aI78 +aI23 +aI102 +aI135 +aI78 +aI84 +aa(lp15839 +g15 +aI78 +aI1 +aI78 +aI17 +aI78 +aI9 +aa(lp15840 +g10 +aa(lp15841 +g8 +aI242 +aI-404 +aa(lp15842 +g15 +aI284 +aI-243 +aI242 +aI-331 +aI256 +aI-277 +aa(lp15843 +g15 +aI389 +aI-192 +aI313 +aI-209 +aI348 +aI-192 +aa(lp15844 +g15 +aI503 +aI-244 +aI434 +aI-192 +aI472 +aI-209 +aa(lp15845 +g15 +aI549 +aI-399 +aI534 +aI-279 +aI549 +aI-331 +aa(lp15846 +g15 +aI505 +aI-559 +aI549 +aI-471 +aI534 +aI-524 +aa(lp15847 +g15 +aI393 +aI-611 +aI475 +aI-594 +aI438 +aI-611 +aa(lp15848 +g15 +aI284 +aI-560 +aI349 +aI-611 +aI313 +aI-594 +aa(lp15849 +g15 +aI242 +aI-404 +aI256 +aI-526 +aI242 +aI-474 +aa(lp15850 +g10 +aa(lp15851 +g8 +aI814 +aI-44 +aa(lp15852 +g10 +aa(lp15853 +g8 +aI814 +aI-44 +aasVk +(lp15854 +(lp15855 +g8 +aI89 +aI-44 +aa(lp15856 +g20 +aI89 +aI-998 +aa(lp15857 +g20 +aI272 +aI-998 +aa(lp15858 +g20 +aI272 +aI-492 +aa(lp15859 +g20 +aI486 +aI-735 +aa(lp15860 +g20 +aI711 +aI-735 +aa(lp15861 +g20 +aI475 +aI-483 +aa(lp15862 +g20 +aI728 +aI-44 +aa(lp15863 +g20 +aI531 +aI-44 +aa(lp15864 +g20 +aI357 +aI-354 +aa(lp15865 +g20 +aI272 +aI-265 +aa(lp15866 +g20 +aI272 +aI-44 +aa(lp15867 +g10 +aa(lp15868 +g8 +aI741 +aI-44 +aa(lp15869 +g10 +aa(lp15870 +g8 +aI741 +aI-44 +aasVo +(lp15871 +(lp15872 +g8 +aI53 +aI-399 +aa(lp15873 +g15 +aI98 +aI-576 +aI53 +aI-460 +aI68 +aI-519 +aa(lp15874 +g15 +aI225 +aI-706 +aI128 +aI-633 +aI170 +aI-676 +aa(lp15875 +g15 +aI409 +aI-751 +aI280 +aI-736 +aI341 +aI-751 +aa(lp15876 +g15 +aI666 +aI-649 +aI514 +aI-751 +aI599 +aI-717 +aa(lp15877 +g15 +aI766 +aI-392 +aI733 +aI-581 +aI766 +aI-495 +aa(lp15878 +g15 +aI665 +aI-132 +aI766 +aI-287 +aI733 +aI-200 +aa(lp15879 +g15 +aI410 +aI-28 +aI598 +aI-63 +aI513 +aI-28 +aa(lp15880 +g15 +aI229 +aI-71 +aI347 +aI-28 +aI287 +aI-43 +aa(lp15881 +g15 +aI98 +aI-197 +aI171 +aI-100 +aI128 +aI-142 +aa(lp15882 +g15 +aI53 +aI-399 +aI68 +aI-253 +aI53 +aI-320 +aa(lp15883 +g10 +aa(lp15884 +g8 +aI240 +aI-390 +aa(lp15885 +g15 +aI289 +aI-232 +aI240 +aI-321 +aI257 +aI-269 +aa(lp15886 +g15 +aI410 +aI-177 +aI322 +aI-196 +aI362 +aI-177 +aa(lp15887 +g15 +aI530 +aI-232 +aI457 +aI-177 +aI497 +aI-196 +aa(lp15888 +g15 +aI578 +aI-391 +aI562 +aI-269 +aI578 +aI-322 +aa(lp15889 +g15 +aI530 +aI-547 +aI578 +aI-459 +aI562 +aI-511 +aa(lp15890 +g15 +aI410 +aI-602 +aI497 +aI-584 +aI457 +aI-602 +aa(lp15891 +g15 +aI289 +aI-547 +aI362 +aI-602 +aI322 +aI-584 +aa(lp15892 +g15 +aI240 +aI-390 +aI257 +aI-511 +aI240 +aI-458 +aa(lp15893 +g10 +aa(lp15894 +g8 +aI814 +aI-44 +aa(lp15895 +g10 +aa(lp15896 +g8 +aI814 +aI-44 +aasVs +(lp15897 +(lp15898 +g8 +aI31 +aI-241 +aa(lp15899 +g20 +aI214 +aI-269 +aa(lp15900 +g15 +aI262 +aI-188 +aI222 +aI-234 +aI238 +aI-207 +aa(lp15901 +g15 +aI362 +aI-160 +aI286 +aI-170 +aI319 +aI-160 +aa(lp15902 +g15 +aI469 +aI-187 +aI409 +aI-160 +aI445 +aI-169 +aa(lp15903 +g15 +aI493 +aI-235 +aI485 +aI-199 +aI493 +aI-215 +aa(lp15904 +g15 +aI480 +aI-270 +aI493 +aI-249 +aI489 +aI-261 +aa(lp15905 +g15 +aI419 +aI-294 +aI471 +aI-279 +aI450 +aI-287 +aa(lp15906 +g15 +aI138 +aI-383 +aI271 +aI-327 +aI178 +aI-356 +aa(lp15907 +g15 +aI56 +aI-539 +aI83 +aI-420 +aI56 +aI-472 +aa(lp15908 +g15 +aI127 +aI-690 +aI56 +aI-599 +aI80 +aI-649 +aa(lp15909 +g15 +aI347 +aI-751 +aI174 +aI-731 +aI248 +aI-751 +aa(lp15910 +g15 +aI558 +aI-705 +aI442 +aI-751 +aI512 +aI-736 +aa(lp15911 +g15 +aI653 +aI-568 +aI604 +aI-674 +aI636 +aI-628 +aa(lp15912 +g20 +aI481 +aI-536 +aa(lp15913 +g15 +aI439 +aI-598 +aI473 +aI-563 +aI459 +aI-584 +aa(lp15914 +g15 +aI350 +aI-619 +aI418 +aI-612 +aI389 +aI-619 +aa(lp15915 +g15 +aI247 +aI-599 +aI302 +aI-619 +aI268 +aI-613 +aa(lp15916 +g15 +aI226 +aI-562 +aI233 +aI-590 +aI226 +aI-577 +aa(lp15917 +g15 +aI244 +aI-529 +aI226 +aI-549 +aI232 +aI-538 +aa(lp15918 +g15 +aI415 +aI-478 +aI261 +aI-517 +aI318 +aI-500 +aa(lp15919 +g15 +aI619 +aI-396 +aI513 +aI-455 +aI581 +aI-428 +aa(lp15920 +g15 +aI677 +aI-260 +aI657 +aI-364 +aI677 +aI-318 +aa(lp15921 +g15 +aI597 +aI-97 +aI677 +aI-197 +aI650 +aI-142 +aa(lp15922 +g15 +aI362 +aI-28 +aI544 +aI-51 +aI466 +aI-28 +aa(lp15923 +g15 +aI138 +aI-86 +aI268 +aI-28 +aI193 +aI-47 +aa(lp15924 +g15 +aI31 +aI-241 +aI84 +aI-124 +aI48 +aI-176 +aa(lp15925 +g10 +aa(lp15926 +g8 +aI741 +aI-44 +aa(lp15927 +g10 +aa(lp15928 +g8 +aI741 +aI-44 +aasVw +(lp15929 +(lp15930 +g8 +aI224 +aI-44 +aa(lp15931 +g20 +aI5 +aI-735 +aa(lp15932 +g20 +aI183 +aI-735 +aa(lp15933 +g20 +aI313 +aI-282 +aa(lp15934 +g20 +aI432 +aI-735 +aa(lp15935 +g20 +aI608 +aI-735 +aa(lp15936 +g20 +aI723 +aI-282 +aa(lp15937 +g20 +aI856 +aI-735 +aa(lp15938 +g20 +aI1036 +aI-735 +aa(lp15939 +g20 +aI814 +aI-44 +aa(lp15940 +g20 +aI638 +aI-44 +aa(lp15941 +g20 +aI519 +aI-489 +aa(lp15942 +g20 +aI402 +aI-44 +aa(lp15943 +g10 +aa(lp15944 +g8 +aI1037 +aI-44 +aa(lp15945 +g10 +aa(lp15946 +g8 +aI1037 +aI-44 +aasV{ +(lp15947 +(lp15948 +g8 +aI39 +aI-311 +aa(lp15949 +g20 +aI39 +aI-467 +aa(lp15950 +g15 +aI110 +aI-481 +aI70 +aI-469 +aI94 +aI-474 +aa(lp15951 +g15 +aI152 +aI-521 +aI126 +aI-489 +aI140 +aI-502 +aa(lp15952 +g15 +aI176 +aI-590 +aI164 +aI-539 +aI172 +aI-562 +aa(lp15953 +g15 +aI181 +aI-699 +aI179 +aI-611 +aI181 +aI-647 +aa(lp15954 +g15 +aI193 +aI-875 +aI181 +aI-783 +aI185 +aI-842 +aa(lp15955 +g15 +aI235 +aI-955 +aI201 +aI-908 +aI215 +aI-935 +aa(lp15956 +g15 +aI324 +aI-1003 +aI256 +aI-975 +aI285 +aI-991 +aa(lp15957 +g15 +aI449 +aI-1015 +aI351 +aI-1011 +aI393 +aI-1015 +aa(lp15958 +g20 +aI484 +aI-1015 +aa(lp15959 +g20 +aI484 +aI-859 +aa(lp15960 +g15 +aI391 +aI-851 +aI436 +aI-859 +aI405 +aI-856 +aa(lp15961 +g15 +aI361 +aI-826 +aI377 +aI-845 +aI367 +aI-837 +aa(lp15962 +g15 +aI351 +aI-769 +aI354 +aI-815 +aI351 +aI-796 +aa(lp15963 +g15 +aI345 +aI-614 +aI351 +aI-742 +aI349 +aI-690 +aa(lp15964 +g15 +aI328 +aI-509 +aI343 +aI-571 +aI337 +aI-536 +aa(lp15965 +g15 +aI293 +aI-443 +aI319 +aI-482 +aI308 +aI-460 +aa(lp15966 +g15 +aI229 +aI-389 +aI279 +aI-426 +aI258 +aI-408 +aa(lp15967 +g15 +aI291 +aI-337 +aI254 +aI-374 +aI275 +aI-357 +aa(lp15968 +g15 +aI329 +aI-265 +aI308 +aI-317 +aI320 +aI-294 +aa(lp15969 +g15 +aI346 +aI-152 +aI338 +aI-237 +aI343 +aI-199 +aa(lp15970 +g15 +aI350 +aI-14 +aI349 +aI-80 +aI350 +aI-34 +aa(lp15971 +g15 +aI361 +aI45 +aI350 +aI14 +aI354 +aI34 +aa(lp15972 +g15 +aI392 +aI71 +aI368 +aI56 +aI378 +aI65 +aa(lp15973 +g15 +aI484 +aI79 +aI407 +aI76 +aI437 +aI79 +aa(lp15974 +g20 +aI484 +aI236 +aa(lp15975 +g20 +aI449 +aI236 +aa(lp15976 +g15 +aI315 +aI222 +aI391 +aI236 +aI346 +aI231 +aa(lp15977 +g15 +aI236 +aI175 +aI283 +aI212 +aI257 +aI197 +aa(lp15978 +g15 +aI192 +aI95 +aI214 +aI153 +aI200 +aI127 +aa(lp15979 +g15 +aI181 +aI-55 +aI185 +aI63 +aI181 +aI13 +aa(lp15980 +g15 +aI171 +aI-211 +aI181 +aI-135 +aI178 +aI-187 +aa(lp15981 +g15 +aI127 +aI-285 +aI161 +aI-245 +aI147 +aI-270 +aa(lp15982 +g15 +aI39 +aI-311 +aI108 +aI-300 +aI78 +aI-309 +aa(lp15983 +g10 +aa(lp15984 +g8 +aI518 +aI-44 +aa(lp15985 +g10 +aa(lp15986 +g8 +aI518 +aI-44 +aasV" +(lp15987 +(lp15988 +g8 +aI107 +aI-659 +aa(lp15989 +g20 +aI72 +aI-837 +aa(lp15990 +g20 +aI72 +aI-998 +aa(lp15991 +g20 +aI272 +aI-998 +aa(lp15992 +g20 +aI272 +aI-837 +aa(lp15993 +g20 +aI242 +aI-659 +aa(lp15994 +g10 +aa(lp15995 +g8 +aI401 +aI-659 +aa(lp15996 +g20 +aI366 +aI-837 +aa(lp15997 +g20 +aI366 +aI-998 +aa(lp15998 +g20 +aI565 +aI-998 +aa(lp15999 +g20 +aI565 +aI-837 +aa(lp16000 +g20 +aI535 +aI-659 +aa(lp16001 +g10 +aa(lp16002 +g8 +aI632 +aI-44 +aa(lp16003 +g10 +aa(lp16004 +g8 +aI632 +aI-44 +aasV& +(lp16005 +(lp16006 +g8 +aI941 +aI-160 +aa(lp16007 +g20 +aI830 +aI-19 +aa(lp16008 +g15 +aI674 +aI-129 +aI776 +aI-46 +aI724 +aI-82 +aa(lp16009 +g15 +aI551 +aI-52 +aI635 +aI-94 +aI594 +aI-68 +aa(lp16010 +g15 +aI396 +aI-27 +aI508 +aI-35 +aI456 +aI-27 +aa(lp16011 +g15 +aI128 +aI-127 +aI277 +aI-27 +aI188 +aI-60 +aa(lp16012 +g15 +aI58 +aI-306 +aI81 +aI-179 +aI58 +aI-238 +aa(lp16013 +g15 +aI113 +aI-471 +aI58 +aI-367 +aI76 +aI-422 +aa(lp16014 +g15 +aI276 +aI-598 +aI149 +aI-520 +aI204 +aI-562 +aa(lp16015 +g15 +aI203 +aI-708 +aI244 +aI-637 +aI219 +aI-673 +aa(lp16016 +g15 +aI178 +aI-808 +aI186 +aI-743 +aI178 +aI-776 +aa(lp16017 +g15 +aI247 +aI-954 +aI178 +aI-865 +aI201 +aI-914 +aa(lp16018 +g15 +aI445 +aI-1015 +aI293 +aI-995 +aI359 +aI-1015 +aa(lp16019 +g15 +aI638 +aI-952 +aI527 +aI-1015 +aI592 +aI-994 +aa(lp16020 +g15 +aI708 +aI-797 +aI685 +aI-909 +aI708 +aI-858 +aa(lp16021 +g15 +aI673 +aI-687 +aI708 +aI-759 +aI696 +aI-722 +aa(lp16022 +g15 +aI534 +aI-569 +aI650 +aI-652 +aI604 +aI-613 +aa(lp16023 +g20 +aI667 +aI-394 +aa(lp16024 +g15 +aI707 +aI-503 +aI682 +aI-422 +aI696 +aI-458 +aa(lp16025 +g20 +aI873 +aI-465 +aa(lp16026 +g15 +aI830 +aI-337 +aI856 +aI-407 +aI842 +aI-364 +aa(lp16027 +g15 +aI791 +aI-269 +aI817 +aI-309 +aI804 +aI-287 +aa(lp16028 +g15 +aI870 +aI-206 +aI811 +aI-249 +aI837 +aI-229 +aa(lp16029 +g15 +aI941 +aI-160 +aI902 +aI-183 +aI926 +aI-168 +aa(lp16030 +g10 +aa(lp16031 +g8 +aI443 +aI-679 +aa(lp16032 +g20 +aI492 +aI-717 +aa(lp16033 +g15 +aI547 +aI-801 +aI529 +aI-745 +aI547 +aI-773 +aa(lp16034 +g15 +aI521 +aI-861 +aI547 +aI-825 +aI538 +aI-845 +aa(lp16035 +g15 +aI449 +aI-886 +aI503 +aI-877 +aI479 +aI-886 +aa(lp16036 +g15 +aI381 +aI-864 +aI420 +aI-886 +aI398 +aI-878 +aa(lp16037 +g15 +aI356 +aI-813 +aI365 +aI-849 +aI356 +aI-833 +aa(lp16038 +g15 +aI398 +aI-731 +aI356 +aI-791 +aI370 +aI-764 +aa(lp16039 +g10 +aa(lp16040 +g8 +aI371 +aI-481 +aa(lp16041 +g15 +aI277 +aI-404 +aI329 +aI-460 +aI298 +aI-434 +aa(lp16042 +g15 +aI246 +aI-312 +aI256 +aI-374 +aI246 +aI-343 +aa(lp16043 +g15 +aI284 +aI-215 +aI246 +aI-273 +aI259 +aI-240 +aa(lp16044 +g15 +aI388 +aI-178 +aI310 +aI-191 +aI345 +aI-178 +aa(lp16045 +g15 +aI471 +aI-195 +aI417 +aI-178 +aI444 +aI-184 +aa(lp16046 +g15 +aI557 +aI-251 +aI497 +aI-206 +aI526 +aI-225 +aa(lp16047 +g10 +aa(lp16048 +g8 +aI962 +aI-44 +aa(lp16049 +g10 +aa(lp16050 +g8 +aI962 +aI-44 +aasV* +(lp16051 +(lp16052 +g8 +aI159 +aI-560 +aa(lp16053 +g20 +aI61 +aI-636 +aa(lp16054 +g15 +aI158 +aI-737 +aI92 +aI-671 +aI124 +aI-705 +aa(lp16055 +g15 +aI184 +aI-761 +aI172 +aI-750 +aI180 +aI-758 +aa(lp16056 +g15 +aI91 +aI-783 +aI173 +aI-763 +aI142 +aI-770 +aa(lp16057 +g15 +aI18 +aI-803 +aI54 +aI-792 +aI29 +aI-799 +aa(lp16058 +g20 +aI56 +aI-918 +aa(lp16059 +g15 +aI208 +aI-841 +aI113 +aI-895 +aI164 +aI-869 +aa(lp16060 +g15 +aI193 +aI-1015 +aI198 +aI-912 +aI193 +aI-970 +aa(lp16061 +g20 +aI309 +aI-1015 +aa(lp16062 +g15 +aI291 +aI-840 +aI309 +aI-983 +aI303 +aI-925 +aa(lp16063 +g15 +aI347 +aI-866 +aI300 +aI-844 +aI319 +aI-852 +aa(lp16064 +g15 +aI455 +aI-911 +aI386 +aI-883 +aI422 +aI-899 +aa(lp16065 +g20 +aI490 +aI-793 +aa(lp16066 +g15 +aI322 +aI-761 +aI442 +aI-782 +aI386 +aI-772 +aa(lp16067 +g20 +aI401 +aI-674 +aa(lp16068 +g15 +aI438 +aI-630 +aI416 +aI-656 +aI429 +aI-641 +aa(lp16069 +g20 +aI338 +aI-564 +aa(lp16070 +g20 +aI250 +aI-709 +aa(lp16071 +g15 +aI159 +aI-560 +aI224 +aI-662 +aI193 +aI-613 +aa(lp16072 +g10 +aa(lp16073 +g8 +aI518 +aI-44 +aa(lp16074 +g10 +aa(lp16075 +g8 +aI518 +aI-44 +aasV. +(lp16076 +(lp16077 +g8 +aI95 +aI-44 +aa(lp16078 +g20 +aI95 +aI-227 +aa(lp16079 +g20 +aI278 +aI-227 +aa(lp16080 +g20 +aI278 +aI-44 +aa(lp16081 +g10 +aa(lp16082 +g8 +aI370 +aI-44 +aa(lp16083 +g10 +aa(lp16084 +g8 +aI370 +aI-44 +aasV2 +(lp16085 +(lp16086 +g8 +aI674 +aI-214 +aa(lp16087 +g20 +aI674 +aI-44 +aa(lp16088 +g20 +aI33 +aI-44 +aa(lp16089 +g15 +aI95 +aI-227 +aI40 +aI-108 +aI60 +aI-169 +aa(lp16090 +g15 +aI301 +aI-455 +aI130 +aI-284 +aI199 +aI-360 +aa(lp16091 +g15 +aI453 +aI-612 +aI383 +aI-532 +aI434 +aI-584 +aa(lp16092 +g15 +aI490 +aI-724 +aI478 +aI-649 +aI490 +aI-687 +aa(lp16093 +g15 +aI458 +aI-818 +aI490 +aI-764 +aI479 +aI-796 +aa(lp16094 +g15 +aI367 +aI-851 +aI436 +aI-840 +aI405 +aI-851 +aa(lp16095 +g15 +aI276 +aI-816 +aI328 +aI-851 +aI298 +aI-839 +aa(lp16096 +g15 +aI236 +aI-702 +aI253 +aI-793 +aI240 +aI-755 +aa(lp16097 +g20 +aI54 +aI-720 +aa(lp16098 +g15 +aI156 +aI-937 +aI65 +aI-820 +aI99 +aI-893 +aa(lp16099 +g15 +aI371 +aI-1002 +aI214 +aI-980 +aI285 +aI-1002 +aa(lp16100 +g15 +aI593 +aI-926 +aI465 +aI-1002 +aI539 +aI-977 +aa(lp16101 +g15 +aI674 +aI-737 +aI647 +aI-875 +aI674 +aI-812 +aa(lp16102 +g15 +aI651 +aI-614 +aI674 +aI-694 +aI666 +aI-653 +aa(lp16103 +g15 +aI578 +aI-492 +aI635 +aI-575 +aI611 +aI-534 +aa(lp16104 +g15 +aI458 +aI-370 +aI555 +aI-464 +aI516 +aI-423 +aa(lp16105 +g15 +aI348 +aI-265 +aI400 +aI-317 +aI364 +aI-282 +aa(lp16106 +g15 +aI311 +aI-214 +aI333 +aI-247 +aI320 +aI-230 +aa(lp16107 +g10 +aa(lp16108 +g8 +aI741 +aI-44 +aa(lp16109 +g10 +aa(lp16110 +g8 +aI741 +aI-44 +aasV6 +(lp16111 +(lp16112 +g8 +aI676 +aI-765 +aa(lp16113 +g20 +aI499 +aI-745 +aa(lp16114 +g15 +aI465 +aI-826 +aI495 +aI-782 +aI483 +aI-808 +aa(lp16115 +g15 +aI394 +aI-852 +aI447 +aI-843 +aI423 +aI-852 +aa(lp16116 +g15 +aI296 +aI-800 +aI355 +aI-852 +aI323 +aI-835 +aa(lp16117 +g15 +aI246 +aI-583 +aI269 +aI-765 +aI253 +aI-693 +aa(lp16118 +g15 +aI416 +aI-664 +aI291 +aI-637 +aI348 +aI-664 +aa(lp16119 +g15 +aI612 +aI-577 +aI492 +aI-664 +aI557 +aI-635 +aa(lp16120 +g15 +aI694 +aI-351 +aI666 +aI-518 +aI694 +aI-443 +aa(lp16121 +g15 +aI608 +aI-116 +aI694 +aI-254 +aI665 +aI-175 +aa(lp16122 +g15 +aI387 +aI-28 +aI550 +aI-57 +aI477 +aI-28 +aa(lp16123 +g15 +aI149 +aI-140 +aI291 +aI-28 +aI211 +aI-65 +aa(lp16124 +g15 +aI56 +aI-508 +aI87 +aI-215 +aI56 +aI-338 +aa(lp16125 +g15 +aI153 +aI-886 +aI56 +aI-683 +aI88 +aI-809 +aa(lp16126 +g15 +aI405 +aI-1002 +aI218 +aI-964 +aI302 +aI-1002 +aa(lp16127 +g15 +aI585 +aI-941 +aI478 +aI-1002 +aI538 +aI-982 +aa(lp16128 +g15 +aI676 +aI-765 +aI633 +aI-901 +aI663 +aI-842 +aa(lp16129 +g10 +aa(lp16130 +g8 +aI261 +aI-366 +aa(lp16131 +g15 +aI302 +aI-228 +aI261 +aI-306 +aI275 +aI-260 +aa(lp16132 +g15 +aI396 +aI-179 +aI330 +aI-196 +aI361 +aI-179 +aa(lp16133 +g15 +aI481 +aI-219 +aI430 +aI-179 +aI458 +aI-193 +aa(lp16134 +g15 +aI514 +aI-349 +aI503 +aI-246 +aI514 +aI-289 +aa(lp16135 +g15 +aI478 +aI-486 +aI514 +aI-411 +aI502 +aI-457 +aa(lp16136 +g15 +aI387 +aI-529 +aI454 +aI-515 +aI423 +aI-529 +aa(lp16137 +g15 +aI298 +aI-488 +aI352 +aI-529 +aI322 +aI-515 +aa(lp16138 +g15 +aI261 +aI-366 +aI273 +aI-460 +aI261 +aI-419 +aa(lp16139 +g10 +aa(lp16140 +g8 +aI741 +aI-44 +aa(lp16141 +g10 +aa(lp16142 +g8 +aI741 +aI-44 +aasV: +(lp16143 +(lp16144 +g8 +aI130 +aI-552 +aa(lp16145 +g20 +aI130 +aI-735 +aa(lp16146 +g20 +aI313 +aI-735 +aa(lp16147 +g20 +aI313 +aI-552 +aa(lp16148 +g10 +aa(lp16149 +g8 +aI130 +aI-44 +aa(lp16150 +g20 +aI130 +aI-227 +aa(lp16151 +g20 +aI313 +aI-227 +aa(lp16152 +g20 +aI313 +aI-44 +aa(lp16153 +g10 +aa(lp16154 +g8 +aI444 +aI-44 +aa(lp16155 +g10 +aa(lp16156 +g8 +aI444 +aI-44 +aasV> +(lp16157 +(lp16158 +g8 +aI61 +aI-152 +aa(lp16159 +g20 +aI61 +aI-336 +aa(lp16160 +g20 +aI518 +aI-516 +aa(lp16161 +g20 +aI61 +aI-694 +aa(lp16162 +g20 +aI61 +aI-877 +aa(lp16163 +g20 +aI716 +aI-593 +aa(lp16164 +g20 +aI716 +aI-437 +aa(lp16165 +g10 +aa(lp16166 +g8 +aI778 +aI-44 +aa(lp16167 +g10 +aa(lp16168 +g8 +aI778 +aI-44 +aasVB +(lp16169 +(lp16170 +g8 +aI97 +aI-998 +aa(lp16171 +g20 +aI479 +aI-998 +aa(lp16172 +g15 +aI648 +aI-989 +aI554 +aI-998 +aI611 +aI-995 +aa(lp16173 +g15 +aI747 +aI-950 +aI685 +aI-983 +aI718 +aI-970 +aa(lp16174 +g15 +aI820 +aI-870 +aI777 +aI-930 +aI801 +aI-903 +aa(lp16175 +g15 +aI850 +aI-758 +aI840 +aI-837 +aI850 +aI-799 +aa(lp16176 +g15 +aI814 +aI-635 +aI850 +aI-713 +aI838 +aI-672 +aa(lp16177 +g15 +aI716 +aI-551 +aI790 +aI-598 +aI757 +aI-570 +aa(lp16178 +g15 +aI850 +aI-465 +aI774 +aI-534 +aI819 +aI-505 +aa(lp16179 +g15 +aI897 +aI-321 +aI881 +aI-424 +aI897 +aI-376 +aa(lp16180 +g15 +aI866 +aI-194 +aI897 +aI-277 +aI887 +aI-235 +aa(lp16181 +g15 +aI784 +aI-96 +aI846 +aI-153 +aI819 +aI-120 +aa(lp16182 +g15 +aI654 +aI-50 +aI749 +aI-71 +aI706 +aI-56 +aa(lp16183 +g15 +aI422 +aI-44 +aI622 +aI-47 +aI545 +aI-45 +aa(lp16184 +g20 +aI97 +aI-44 +aa(lp16185 +g10 +aa(lp16186 +g8 +aI290 +aI-840 +aa(lp16187 +g20 +aI290 +aI-619 +aa(lp16188 +g20 +aI416 +aI-619 +aa(lp16189 +g15 +aI556 +aI-622 +aI491 +aI-619 +aI538 +aI-620 +aa(lp16190 +g15 +aI634 +aI-656 +aI589 +aI-626 +aI615 +aI-637 +aa(lp16191 +g15 +aI662 +aI-731 +aI653 +aI-675 +aI662 +aI-700 +aa(lp16192 +g15 +aI638 +aI-803 +aI662 +aI-760 +aI654 +aI-784 +aa(lp16193 +g15 +aI565 +aI-836 +aI622 +aI-821 +aI597 +aI-832 +aa(lp16194 +g15 +aI401 +aI-840 +aI546 +aI-838 +aI491 +aI-840 +aa(lp16195 +g10 +aa(lp16196 +g8 +aI290 +aI-460 +aa(lp16197 +g20 +aI290 +aI-205 +aa(lp16198 +g20 +aI468 +aI-205 +aa(lp16199 +g15 +aI600 +aI-211 +aI538 +aI-205 +aI582 +aI-207 +aa(lp16200 +g15 +aI670 +aI-249 +aI629 +aI-216 +aI652 +aI-229 +aa(lp16201 +g15 +aI697 +aI-330 +aI688 +aI-269 +aI697 +aI-296 +aa(lp16202 +g15 +aI677 +aI-403 +aI697 +aI-358 +aI690 +aI-383 +aa(lp16203 +g15 +aI616 +aI-446 +aI663 +aI-423 +aI643 +aI-437 +aa(lp16204 +g15 +aI445 +aI-460 +aI590 +aI-455 +aI533 +aI-460 +aa(lp16205 +g10 +aa(lp16206 +g8 +aI962 +aI-44 +aa(lp16207 +g10 +aa(lp16208 +g8 +aI962 +aI-44 +aasVF +(lp16209 +(lp16210 +g8 +aI98 +aI-44 +aa(lp16211 +g20 +aI98 +aI-998 +aa(lp16212 +g20 +aI752 +aI-998 +aa(lp16213 +g20 +aI752 +aI-837 +aa(lp16214 +g20 +aI291 +aI-837 +aa(lp16215 +g20 +aI291 +aI-611 +aa(lp16216 +g20 +aI689 +aI-611 +aa(lp16217 +g20 +aI689 +aI-450 +aa(lp16218 +g20 +aI291 +aI-450 +aa(lp16219 +g20 +aI291 +aI-44 +aa(lp16220 +g10 +aa(lp16221 +g8 +aI814 +aI-44 +aa(lp16222 +g10 +aa(lp16223 +g8 +aI814 +aI-44 +aasVJ +(lp16224 +(lp16225 +g8 +aI441 +aI-998 +aa(lp16226 +g20 +aI633 +aI-998 +aa(lp16227 +g20 +aI633 +aI-394 +aa(lp16228 +g15 +aI612 +aI-212 +aI633 +aI-315 +aI626 +aI-254 +aa(lp16229 +g15 +aI511 +aI-78 +aI593 +aI-156 +aI560 +aI-112 +aa(lp16230 +g15 +aI317 +aI-28 +aI462 +aI-44 +aI397 +aI-28 +aa(lp16231 +g15 +aI99 +aI-107 +aI222 +aI-28 +aI150 +aI-54 +aa(lp16232 +g15 +aI22 +aI-339 +aI48 +aI-160 +aI23 +aI-237 +aa(lp16233 +g20 +aI204 +aI-360 +aa(lp16234 +g15 +aI228 +aI-244 +aI206 +aI-305 +aI214 +aI-266 +aa(lp16235 +g15 +aI323 +aI-192 +aI249 +aI-210 +aI281 +aI-192 +aa(lp16236 +g15 +aI414 +aI-229 +aI366 +aI-192 +aI396 +aI-205 +aa(lp16237 +g15 +aI441 +aI-382 +aI432 +aI-254 +aI441 +aI-305 +aa(lp16238 +g10 +aa(lp16239 +g8 +aI741 +aI-44 +aa(lp16240 +g10 +aa(lp16241 +g8 +aI741 +aI-44 +aasVN +(lp16242 +(lp16243 +g8 +aI98 +aI-44 +aa(lp16244 +g20 +aI98 +aI-998 +aa(lp16245 +g20 +aI286 +aI-998 +aa(lp16246 +g20 +aI677 +aI-361 +aa(lp16247 +g20 +aI677 +aI-998 +aa(lp16248 +g20 +aI856 +aI-998 +aa(lp16249 +g20 +aI856 +aI-44 +aa(lp16250 +g20 +aI662 +aI-44 +aa(lp16251 +g20 +aI277 +aI-666 +aa(lp16252 +g20 +aI277 +aI-44 +aa(lp16253 +g10 +aa(lp16254 +g8 +aI962 +aI-44 +aa(lp16255 +g10 +aa(lp16256 +g8 +aI962 +aI-44 +aasVR +(lp16257 +(lp16258 +g8 +aI97 +aI-44 +aa(lp16259 +g20 +aI97 +aI-998 +aa(lp16260 +g20 +aI503 +aI-998 +aa(lp16261 +g15 +aI725 +aI-973 +aI605 +aI-998 +aI679 +aI-990 +aa(lp16262 +g15 +aI836 +aI-881 +aI771 +aI-956 +aI808 +aI-925 +aa(lp16263 +g15 +aI878 +aI-731 +aI864 +aI-837 +aI878 +aI-787 +aa(lp16264 +g15 +aI815 +aI-553 +aI878 +aI-659 +aI857 +aI-600 +aa(lp16265 +g15 +aI626 +aI-465 +aI773 +aI-507 +aI710 +aI-477 +aa(lp16266 +g15 +aI729 +aI-385 +aI667 +aI-441 +aI702 +aI-414 +aa(lp16267 +g15 +aI839 +aI-230 +aI756 +aI-356 +aI793 +aI-304 +aa(lp16268 +g20 +aI955 +aI-44 +aa(lp16269 +g20 +aI725 +aI-44 +aa(lp16270 +g20 +aI585 +aI-252 +aa(lp16271 +g15 +aI484 +aI-392 +aI536 +aI-326 +aI502 +aI-373 +aa(lp16272 +g15 +aI426 +aI-432 +aI466 +aI-411 +aI446 +aI-424 +aa(lp16273 +g15 +aI329 +aI-442 +aI406 +aI-439 +aI373 +aI-442 +aa(lp16274 +g20 +aI290 +aI-442 +aa(lp16275 +g20 +aI290 +aI-44 +aa(lp16276 +g10 +aa(lp16277 +g8 +aI290 +aI-595 +aa(lp16278 +g20 +aI432 +aI-595 +aa(lp16279 +g15 +aI606 +aI-606 +aI525 +aI-595 +aI583 +aI-599 +aa(lp16280 +g15 +aI660 +aI-647 +aI629 +aI-614 +aI647 +aI-628 +aa(lp16281 +g15 +aI679 +aI-718 +aI673 +aI-666 +aI679 +aI-690 +aa(lp16282 +g15 +aI653 +aI-796 +aI679 +aI-751 +aI671 +aI-776 +aa(lp16283 +g15 +aI581 +aI-834 +aI636 +aI-816 +aI612 +aI-828 +aa(lp16284 +g15 +aI440 +aI-837 +aI565 +aI-836 +aI518 +aI-837 +aa(lp16285 +g20 +aI290 +aI-837 +aa(lp16286 +g10 +aa(lp16287 +g8 +aI962 +aI-44 +aa(lp16288 +g10 +aa(lp16289 +g8 +aI962 +aI-44 +aasVV +(lp16290 +(lp16291 +g8 +aI340 +aI-44 +aa(lp16292 +g20 +aI0 +aI-998 +aa(lp16293 +g20 +aI208 +aI-998 +aa(lp16294 +g20 +aI449 +aI-292 +aa(lp16295 +g20 +aI683 +aI-998 +aa(lp16296 +g20 +aI888 +aI-998 +aa(lp16297 +g20 +aI546 +aI-44 +aa(lp16298 +g10 +aa(lp16299 +g8 +aI889 +aI-44 +aa(lp16300 +g10 +aa(lp16301 +g8 +aI889 +aI-44 +aasVZ +(lp16302 +(lp16303 +g8 +aI14 +aI-44 +aa(lp16304 +g20 +aI14 +aI-218 +aa(lp16305 +g20 +aI515 +aI-837 +aa(lp16306 +g20 +aI70 +aI-837 +aa(lp16307 +g20 +aI70 +aI-998 +aa(lp16308 +g20 +aI769 +aI-998 +aa(lp16309 +g20 +aI769 +aI-849 +aa(lp16310 +g20 +aI246 +aI-205 +aa(lp16311 +g20 +aI789 +aI-205 +aa(lp16312 +g20 +aI789 +aI-44 +aa(lp16313 +g10 +aa(lp16314 +g8 +aI814 +aI-44 +aa(lp16315 +g10 +aa(lp16316 +g8 +aI814 +aI-44 +aasV^ +(lp16317 +(lp16318 +g8 +aI74 +aI-494 +aa(lp16319 +g20 +aI319 +aI-1015 +aa(lp16320 +g20 +aI464 +aI-1015 +aa(lp16321 +g20 +aI703 +aI-494 +aa(lp16322 +g20 +aI518 +aI-494 +aa(lp16323 +g20 +aI389 +aI-813 +aa(lp16324 +g20 +aI261 +aI-494 +aa(lp16325 +g10 +aa(lp16326 +g8 +aI778 +aI-44 +aa(lp16327 +g10 +aa(lp16328 +g8 +aI778 +aI-44 +aasVb +(lp16329 +(lp16330 +g8 +aI87 +aI-44 +aa(lp16331 +g20 +aI87 +aI-998 +aa(lp16332 +g20 +aI270 +aI-998 +aa(lp16333 +g20 +aI270 +aI-655 +aa(lp16334 +g15 +aI471 +aI-751 +aI327 +aI-719 +aI394 +aI-751 +aa(lp16335 +g15 +aI680 +aI-660 +aI555 +aI-751 +aI625 +aI-720 +aa(lp16336 +g15 +aI763 +aI-397 +aI735 +aI-599 +aI763 +aI-511 +aa(lp16337 +g15 +aI678 +aI-124 +aI763 +aI-279 +aI734 +aI-188 +aa(lp16338 +g15 +aI473 +aI-28 +aI622 +aI-60 +aI554 +aI-28 +aa(lp16339 +g15 +aI357 +aI-58 +aI434 +aI-28 +aI395 +aI-38 +aa(lp16340 +g15 +aI257 +aI-146 +aI318 +aI-78 +aI285 +aI-107 +aa(lp16341 +g20 +aI257 +aI-44 +aa(lp16342 +g10 +aa(lp16343 +g8 +aI269 +aI-405 +aa(lp16344 +g15 +aI303 +aI-246 +aI269 +aI-333 +aI280 +aI-280 +aa(lp16345 +g15 +aI429 +aI-173 +aI335 +aI-197 +aI377 +aI-173 +aa(lp16346 +g15 +aI532 +aI-225 +aI470 +aI-173 +aI504 +aI-190 +aa(lp16347 +g15 +aI575 +aI-388 +aI561 +aI-259 +aI575 +aI-313 +aa(lp16348 +g15 +aI532 +aI-559 +aI575 +aI-467 +aI561 +aI-524 +aa(lp16349 +g15 +aI422 +aI-611 +aI503 +aI-594 +aI467 +aI-611 +aa(lp16350 +g15 +aI313 +aI-560 +aI378 +aI-611 +aI342 +aI-594 +aa(lp16351 +g15 +aI269 +aI-405 +aI284 +aI-526 +aI269 +aI-474 +aa(lp16352 +g10 +aa(lp16353 +g8 +aI814 +aI-44 +aa(lp16354 +g10 +aa(lp16355 +g8 +aI814 +aI-44 +aasVf +(lp16356 +(lp16357 +g8 +aI15 +aI-735 +aa(lp16358 +g20 +aI117 +aI-735 +aa(lp16359 +g20 +aI117 +aI-787 +aa(lp16360 +g15 +aI135 +aI-918 +aI117 +aI-846 +aI123 +aI-889 +aa(lp16361 +g15 +aI204 +aI-988 +aI148 +aI-946 +aI170 +aI-970 +aa(lp16362 +g15 +aI330 +aI-1015 +aI237 +aI-1006 +aI279 +aI-1015 +aa(lp16363 +g15 +aI483 +aI-991 +aI382 +aI-1015 +aI433 +aI-1007 +aa(lp16364 +g20 +aI458 +aI-864 +aa(lp16365 +g15 +aI374 +aI-874 +aI429 +aI-871 +aI401 +aI-874 +aa(lp16366 +g15 +aI317 +aI-855 +aI347 +aI-874 +aI328 +aI-868 +aa(lp16367 +g15 +aI300 +aI-784 +aI305 +aI-843 +aI300 +aI-819 +aa(lp16368 +g20 +aI300 +aI-735 +aa(lp16369 +g20 +aI436 +aI-735 +aa(lp16370 +g20 +aI436 +aI-591 +aa(lp16371 +g20 +aI300 +aI-591 +aa(lp16372 +g20 +aI300 +aI-44 +aa(lp16373 +g20 +aI117 +aI-44 +aa(lp16374 +g20 +aI117 +aI-591 +aa(lp16375 +g20 +aI15 +aI-591 +aa(lp16376 +g10 +aa(lp16377 +g8 +aI444 +aI-44 +aa(lp16378 +g10 +aa(lp16379 +g8 +aI444 +aI-44 +aasVj +(lp16380 +(lp16381 +g8 +aI91 +aI-829 +aa(lp16382 +g20 +aI91 +aI-998 +aa(lp16383 +g20 +aI274 +aI-998 +aa(lp16384 +g20 +aI274 +aI-829 +aa(lp16385 +g10 +aa(lp16386 +g8 +aI274 +aI-735 +aa(lp16387 +g20 +aI274 +aI-65 +aa(lp16388 +g15 +aI257 +aI120 +aI274 +aI22 +aI268 +aI84 +aa(lp16389 +g15 +aI191 +aI205 +aI245 +aI156 +aI223 +aI185 +aa(lp16390 +g15 +aI65 +aI236 +aI158 +aI225 +aI116 +aI236 +aa(lp16391 +g15 +aI6 +aI231 +aI47 +aI236 +aI27 +aI234 +aa(lp16392 +g15 +aI-61 +aI216 +aI-14 +aI228 +aI-36 +aI223 +aa(lp16393 +g20 +aI-29 +aI60 +aa(lp16394 +g15 +aI-4 +aI64 +aI-20 +aI62 +aI-12 +aI63 +aa(lp16395 +g15 +aI16 +aI66 +aI2 +aI65 +aI9 +aI66 +aa(lp16396 +g15 +aI62 +aI54 +aI34 +aI66 +aI50 +aI62 +aa(lp16397 +g15 +aI85 +aI25 +aI74 +aI46 +aI82 +aI36 +aa(lp16398 +g15 +aI91 +aI-76 +aI89 +aI13 +aI91 +aI-19 +aa(lp16399 +g20 +aI91 +aI-735 +aa(lp16400 +g10 +aa(lp16401 +g8 +aI370 +aI-44 +aa(lp16402 +g10 +aa(lp16403 +g8 +aI370 +aI-44 +aasVn +(lp16404 +(lp16405 +g8 +aI724 +aI-44 +aa(lp16406 +g20 +aI541 +aI-44 +aa(lp16407 +g20 +aI541 +aI-397 +aa(lp16408 +g15 +aI529 +aI-542 +aI541 +aI-471 +aI537 +aI-520 +aa(lp16409 +g15 +aI491 +aI-593 +aI522 +aI-564 +aI509 +aI-581 +aa(lp16410 +g15 +aI428 +aI-611 +aI474 +aI-605 +aI453 +aI-611 +aa(lp16411 +g15 +aI343 +aI-585 +aI396 +aI-611 +aI368 +aI-602 +aa(lp16412 +g15 +aI291 +aI-516 +aI317 +aI-568 +aI300 +aI-545 +aa(lp16413 +g15 +aI277 +aI-357 +aI282 +aI-487 +aI277 +aI-434 +aa(lp16414 +g20 +aI277 +aI-44 +aa(lp16415 +g20 +aI94 +aI-44 +aa(lp16416 +g20 +aI94 +aI-735 +aa(lp16417 +g20 +aI264 +aI-735 +aa(lp16418 +g20 +aI264 +aI-634 +aa(lp16419 +g15 +aI492 +aI-751 +aI324 +aI-712 +aI400 +aI-751 +aa(lp16420 +g15 +aI602 +aI-729 +aI532 +aI-751 +aI569 +aI-744 +aa(lp16421 +g15 +aI678 +aI-674 +aI636 +aI-715 +aI661 +aI-696 +aa(lp16422 +g15 +aI714 +aI-597 +aI695 +aI-651 +aI707 +aI-625 +aa(lp16423 +g15 +aI724 +aI-474 +aI721 +aI-568 +aI724 +aI-527 +aa(lp16424 +g10 +aa(lp16425 +g8 +aI814 +aI-44 +aa(lp16426 +g10 +aa(lp16427 +g8 +aI814 +aI-44 +aasVr +(lp16428 +(lp16429 +g8 +aI270 +aI-44 +aa(lp16430 +g20 +aI87 +aI-44 +aa(lp16431 +g20 +aI87 +aI-735 +aa(lp16432 +g20 +aI257 +aI-735 +aa(lp16433 +g20 +aI257 +aI-637 +aa(lp16434 +g15 +aI336 +aI-729 +aI286 +aI-683 +aI313 +aI-714 +aa(lp16435 +g15 +aI415 +aI-751 +aI359 +aI-744 +aI385 +aI-751 +aa(lp16436 +g15 +aI535 +aI-716 +aI457 +aI-751 +aI497 +aI-739 +aa(lp16437 +g20 +aI479 +aI-557 +aa(lp16438 +g15 +aI393 +aI-587 +aI448 +aI-577 +aI419 +aI-587 +aa(lp16439 +g15 +aI328 +aI-566 +aI367 +aI-587 +aI345 +aI-580 +aa(lp16440 +g15 +aI286 +aI-489 +aI310 +aI-552 +aI296 +aI-526 +aa(lp16441 +g15 +aI270 +aI-257 +aI275 +aI-452 +aI270 +aI-375 +aa(lp16442 +g10 +aa(lp16443 +g8 +aI518 +aI-44 +aa(lp16444 +g10 +aa(lp16445 +g8 +aI518 +aI-44 +aasVv +(lp16446 +(lp16447 +g8 +aI285 +aI-44 +aa(lp16448 +g20 +aI7 +aI-735 +aa(lp16449 +g20 +aI199 +aI-735 +aa(lp16450 +g20 +aI329 +aI-382 +aa(lp16451 +g20 +aI367 +aI-265 +aa(lp16452 +g15 +aI386 +aI-324 +aI377 +aI-295 +aI383 +aI-314 +aa(lp16453 +g15 +aI405 +aI-382 +aI392 +aI-343 +aI398 +aI-363 +aa(lp16454 +g20 +aI537 +aI-735 +aa(lp16455 +g20 +aI725 +aI-735 +aa(lp16456 +g20 +aI450 +aI-44 +aa(lp16457 +g10 +aa(lp16458 +g8 +aI741 +aI-44 +aa(lp16459 +g10 +aa(lp16460 +g8 +aI741 +aI-44 +aasVz +(lp16461 +(lp16462 +g8 +aI22 +aI-44 +aa(lp16463 +g20 +aI22 +aI-187 +aa(lp16464 +g20 +aI281 +aI-484 +aa(lp16465 +g15 +aI375 +aI-588 +aI323 +aI-533 +aI355 +aI-567 +aa(lp16466 +g15 +aI291 +aI-585 +aI354 +aI-586 +aI326 +aI-585 +aa(lp16467 +g20 +aI47 +aI-584 +aa(lp16468 +g20 +aI47 +aI-735 +aa(lp16469 +g20 +aI619 +aI-735 +aa(lp16470 +g20 +aI619 +aI-606 +aa(lp16471 +g20 +aI354 +aI-301 +aa(lp16472 +g20 +aI261 +aI-200 +aa(lp16473 +g15 +aI356 +aI-205 +aI312 +aI-203 +aI343 +aI-205 +aa(lp16474 +g20 +aI639 +aI-205 +aa(lp16475 +g20 +aI639 +aI-44 +aa(lp16476 +g10 +aa(lp16477 +g8 +aI666 +aI-44 +aa(lp16478 +g10 +aa(lp16479 +g8 +aI666 +aI-44 +aasV~ +(lp16480 +(lp16481 +g8 +aI43 +aI-382 +aa(lp16482 +g20 +aI43 +aI-550 +aa(lp16483 +g15 +aI236 +aI-640 +aI98 +aI-610 +aI162 +aI-640 +aa(lp16484 +g15 +aI311 +aI-632 +aI263 +aI-640 +aI288 +aI-638 +aa(lp16485 +g15 +aI435 +aI-588 +aI334 +aI-627 +aI376 +aI-612 +aa(lp16486 +g15 +aI557 +aI-552 +aI495 +aI-564 +aI536 +aI-552 +aa(lp16487 +g15 +aI641 +aI-574 +aI581 +aI-552 +aI609 +aI-559 +aa(lp16488 +g15 +aI735 +aI-646 +aI673 +aI-589 +aI704 +aI-613 +aa(lp16489 +g20 +aI735 +aI-470 +aa(lp16490 +g15 +aI651 +aI-411 +aI715 +aI-449 +aI687 +aI-429 +aa(lp16491 +g15 +aI540 +aI-384 +aI615 +aI-393 +aI578 +aI-384 +aa(lp16492 +g15 +aI476 +aI-392 +aI518 +aI-384 +aI497 +aI-386 +aa(lp16493 +g15 +aI378 +aI-429 +aI456 +aI-397 +aI423 +aI-409 +aa(lp16494 +g15 +aI221 +aI-472 +aI312 +aI-458 +aI259 +aI-472 +aa(lp16495 +g15 +aI43 +aI-382 +aI160 +aI-472 +aI101 +aI-442 +aa(lp16496 +g10 +aa(lp16497 +g8 +aI778 +aI-44 +aa(lp16498 +g10 +aa(lp16499 +g8 +aI778 +aI-44 +aasV! +(lp16500 +(lp16501 +g8 +aI167 +aI-290 +aa(lp16502 +g20 +aI119 +aI-774 +aa(lp16503 +g20 +aI119 +aI-998 +aa(lp16504 +g20 +aI317 +aI-998 +aa(lp16505 +g20 +aI317 +aI-774 +aa(lp16506 +g20 +aI270 +aI-290 +aa(lp16507 +g10 +aa(lp16508 +g8 +aI127 +aI-44 +aa(lp16509 +g20 +aI127 +aI-227 +aa(lp16510 +g20 +aI310 +aI-227 +aa(lp16511 +g20 +aI310 +aI-44 +aa(lp16512 +g10 +aa(lp16513 +g8 +aI444 +aI-44 +aa(lp16514 +g10 +aa(lp16515 +g8 +aI444 +aI-44 +aasV% +(lp16516 +(lp16517 +g8 +aI57 +aI-763 +aa(lp16518 +g15 +aI114 +aI-953 +aI57 +aI-848 +aI76 +aI-912 +aa(lp16519 +g15 +aI266 +aI-1015 +aI151 +aI-994 +aI202 +aI-1015 +aa(lp16520 +g15 +aI422 +aI-953 +aI333 +aI-1015 +aI385 +aI-994 +aa(lp16521 +g15 +aI479 +aI-763 +aI460 +aI-912 +aI479 +aI-849 +aa(lp16522 +g15 +aI422 +aI-573 +aI479 +aI-677 +aI460 +aI-614 +aa(lp16523 +g15 +aI270 +aI-511 +aI385 +aI-531 +aI334 +aI-511 +aa(lp16524 +g15 +aI114 +aI-572 +aI203 +aI-511 +aI151 +aI-531 +aa(lp16525 +g15 +aI57 +aI-763 +aI76 +aI-613 +aI57 +aI-677 +aa(lp16526 +g10 +aa(lp16527 +g8 +aI200 +aI-764 +aa(lp16528 +g15 +aI222 +aI-639 +aI200 +aI-702 +aI207 +aI-660 +aa(lp16529 +g15 +aI266 +aI-616 +aI232 +aI-623 +aI247 +aI-616 +aa(lp16530 +g15 +aI312 +aI-639 +aI286 +aI-616 +aI301 +aI-623 +aa(lp16531 +g15 +aI333 +aI-764 +aI326 +aI-660 +aI333 +aI-702 +aa(lp16532 +g15 +aI312 +aI-888 +aI333 +aI-826 +aI326 +aI-868 +aa(lp16533 +g15 +aI266 +aI-912 +aI301 +aI-904 +aI286 +aI-912 +aa(lp16534 +g15 +aI222 +aI-889 +aI247 +aI-912 +aI232 +aI-905 +aa(lp16535 +g15 +aI200 +aI-764 +aI207 +aI-868 +aI200 +aI-826 +aa(lp16536 +g10 +aa(lp16537 +g8 +aI406 +aI-7 +aa(lp16538 +g20 +aI270 +aI-7 +aa(lp16539 +g20 +aI779 +aI-1015 +aa(lp16540 +g20 +aI910 +aI-1015 +aa(lp16541 +g10 +aa(lp16542 +g8 +aI701 +aI-258 +aa(lp16543 +g15 +aI758 +aI-448 +aI701 +aI-344 +aI720 +aI-407 +aa(lp16544 +g15 +aI912 +aI-510 +aI795 +aI-489 +aI847 +aI-510 +aa(lp16545 +g15 +aI1066 +aI-448 +aI977 +aI-510 +aI1029 +aI-489 +aa(lp16546 +g15 +aI1123 +aI-258 +aI1104 +aI-407 +aI1123 +aI-344 +aa(lp16547 +g15 +aI1066 +aI-67 +aI1123 +aI-172 +aI1104 +aI-109 +aa(lp16548 +g15 +aI914 +aI-6 +aI1029 +aI-26 +aI978 +aI-6 +aa(lp16549 +g15 +aI758 +aI-67 +aI847 +aI-6 +aI795 +aI-26 +aa(lp16550 +g15 +aI701 +aI-258 +aI720 +aI-109 +aI701 +aI-172 +aa(lp16551 +g10 +aa(lp16552 +g8 +aI844 +aI-259 +aa(lp16553 +g15 +aI865 +aI-134 +aI844 +aI-197 +aI851 +aI-155 +aa(lp16554 +g15 +aI910 +aI-110 +aI876 +aI-118 +aI891 +aI-110 +aa(lp16555 +g15 +aI955 +aI-134 +aI930 +aI-110 +aI945 +aI-118 +aa(lp16556 +g15 +aI977 +aI-259 +aI970 +aI-155 +aI977 +aI-197 +aa(lp16557 +g15 +aI956 +aI-384 +aI977 +aI-321 +aI970 +aI-363 +aa(lp16558 +g15 +aI910 +aI-407 +aI945 +aI-399 +aI930 +aI-407 +aa(lp16559 +g15 +aI865 +aI-384 +aI891 +aI-407 +aI876 +aI-399 +aa(lp16560 +g15 +aI844 +aI-259 +aI851 +aI-363 +aI844 +aI-321 +aa(lp16561 +g10 +aa(lp16562 +g8 +aI1185 +aI-44 +aa(lp16563 +g10 +aa(lp16564 +g8 +aI1185 +aI-44 +aasV) +(lp16565 +(lp16566 +g8 +aI44 +aI236 +aa(lp16567 +g15 +aI121 +aI58 +aI80 +aI158 +aI106 +aI99 +aa(lp16568 +g15 +aI162 +aI-84 +aI135 +aI17 +aI149 +aI-30 +aa(lp16569 +g15 +aI190 +aI-237 +aI174 +aI-137 +aI184 +aI-189 +aa(lp16570 +g15 +aI199 +aI-386 +aI196 +aI-285 +aI199 +aI-335 +aa(lp16571 +g15 +aI166 +aI-679 +aI199 +aI-489 +aI188 +aI-587 +aa(lp16572 +g15 +aI43 +aI-1015 +aI143 +aI-771 +aI103 +aI-883 +aa(lp16573 +g20 +aI167 +aI-1015 +aa(lp16574 +g15 +aI320 +aI-718 +aI233 +aI-921 +aI284 +aI-822 +aa(lp16575 +g15 +aI375 +aI-399 +aI356 +aI-613 +aI375 +aI-507 +aa(lp16576 +g15 +aI332 +aI-108 +aI375 +aI-309 +aI360 +aI-211 +aa(lp16577 +g15 +aI171 +aI236 +aI299 +aI8 +aI245 +aI122 +aa(lp16578 +g10 +aa(lp16579 +g8 +aI444 +aI-44 +aa(lp16580 +g10 +aa(lp16581 +g8 +aI444 +aI-44 +aasV- +(lp16582 +(lp16583 +g8 +aI42 +aI-299 +aa(lp16584 +g20 +aI42 +aI-481 +aa(lp16585 +g20 +aI401 +aI-481 +aa(lp16586 +g20 +aI401 +aI-299 +aa(lp16587 +g10 +aa(lp16588 +g8 +aI444 +aI-44 +aa(lp16589 +g10 +aa(lp16590 +g8 +aI444 +aI-44 +aasV1 +(lp16591 +(lp16592 +g8 +aI524 +aI-44 +aa(lp16593 +g20 +aI341 +aI-44 +aa(lp16594 +g20 +aI341 +aI-733 +aa(lp16595 +g15 +aI105 +aI-595 +aI274 +aI-671 +aI196 +aI-625 +aa(lp16596 +g20 +aI105 +aI-761 +aa(lp16597 +g15 +aI261 +aI-850 +aI153 +aI-776 +aI205 +aI-806 +aa(lp16598 +g15 +aI376 +aI-1002 +aI317 +aI-893 +aI355 +aI-944 +aa(lp16599 +g20 +aI524 +aI-1002 +aa(lp16600 +g10 +aa(lp16601 +g8 +aI741 +aI-44 +aa(lp16602 +g10 +aa(lp16603 +g8 +aI741 +aI-44 +aasV5 +(lp16604 +(lp16605 +g8 +aI59 +aI-289 +aa(lp16606 +g20 +aI241 +aI-308 +aa(lp16607 +g15 +aI287 +aI-210 +aI246 +aI-267 +aI262 +aI-234 +aa(lp16608 +g15 +aI376 +aI-174 +aI313 +aI-186 +aI342 +aI-174 +aa(lp16609 +g15 +aI473 +aI-221 +aI414 +aI-174 +aI446 +aI-190 +aa(lp16610 +g15 +aI513 +aI-361 +aI499 +aI-252 +aI513 +aI-299 +aa(lp16611 +g15 +aI473 +aI-493 +aI513 +aI-420 +aI499 +aI-464 +aa(lp16612 +g15 +aI371 +aI-537 +aI447 +aI-522 +aI413 +aI-537 +aa(lp16613 +g15 +aI229 +aI-467 +aI318 +aI-537 +aI271 +aI-514 +aa(lp16614 +g20 +aI81 +aI-489 +aa(lp16615 +g20 +aI175 +aI-985 +aa(lp16616 +g20 +aI658 +aI-985 +aa(lp16617 +g20 +aI658 +aI-814 +aa(lp16618 +g20 +aI313 +aI-814 +aa(lp16619 +g20 +aI285 +aI-652 +aa(lp16620 +g15 +aI410 +aI-683 +aI325 +aI-672 +aI367 +aI-683 +aa(lp16621 +g15 +aI616 +aI-594 +aI491 +aI-683 +aI560 +aI-653 +aa(lp16622 +g15 +aI701 +aI-364 +aI672 +aI-535 +aI701 +aI-458 +aa(lp16623 +g15 +aI632 +aI-154 +aI701 +aI-286 +aI678 +aI-216 +aa(lp16624 +g15 +aI374 +aI-28 +aI570 +aI-70 +aI484 +aI-28 +aa(lp16625 +g15 +aI158 +aI-99 +aI286 +aI-28 +aI214 +aI-51 +aa(lp16626 +g15 +aI59 +aI-289 +aI103 +aI-146 +aI70 +aI-210 +aa(lp16627 +g10 +aa(lp16628 +g8 +aI741 +aI-44 +aa(lp16629 +g10 +aa(lp16630 +g8 +aI741 +aI-44 +aasV9 +(lp16631 +(lp16632 +g8 +aI60 +aI-265 +aa(lp16633 +g20 +aI237 +aI-284 +aa(lp16634 +g15 +aI271 +aI-204 +aI241 +aI-248 +aI253 +aI-221 +aa(lp16635 +g15 +aI343 +aI-178 +aI289 +aI-187 +aI313 +aI-178 +aa(lp16636 +g15 +aI440 +aI-230 +aI381 +aI-178 +aI413 +aI-195 +aa(lp16637 +g15 +aI490 +aI-446 +aI466 +aI-265 +aI483 +aI-337 +aa(lp16638 +g15 +aI318 +aI-366 +aI444 +aI-393 +aI387 +aI-366 +aa(lp16639 +g15 +aI124 +aI-453 +aI243 +aI-366 +aI178 +aI-395 +aa(lp16640 +g15 +aI42 +aI-679 +aI69 +aI-511 +aI42 +aI-586 +aa(lp16641 +g15 +aI128 +aI-913 +aI42 +aI-776 +aI71 +aI-854 +aa(lp16642 +g15 +aI348 +aI-1002 +aI186 +aI-973 +aI259 +aI-1002 +aa(lp16643 +g15 +aI586 +aI-890 +aI445 +aI-1002 +aI524 +aI-965 +aa(lp16644 +g15 +aI679 +aI-521 +aI648 +aI-815 +aI679 +aI-692 +aa(lp16645 +g15 +aI582 +aI-143 +aI679 +aI-346 +aI647 +aI-220 +aa(lp16646 +g15 +aI330 +aI-27 +aI518 +aI-66 +aI433 +aI-27 +aa(lp16647 +g15 +aI149 +aI-87 +aI255 +aI-27 +aI195 +aI-47 +aa(lp16648 +g15 +aI60 +aI-265 +aI103 +aI-126 +aI73 +aI-186 +aa(lp16649 +g10 +aa(lp16650 +g8 +aI474 +aI-664 +aa(lp16651 +g15 +aI433 +aI-802 +aI474 +aI-723 +aI461 +aI-769 +aa(lp16652 +g15 +aI339 +aI-851 +aI406 +aI-834 +aI375 +aI-851 +aa(lp16653 +g15 +aI255 +aI-811 +aI305 +aI-851 +aI277 +aI-837 +aa(lp16654 +g15 +aI222 +aI-679 +aI233 +aI-784 +aI222 +aI-740 +aa(lp16655 +g15 +aI258 +aI-544 +aI222 +aI-618 +aI234 +aI-572 +aa(lp16656 +g15 +aI349 +aI-500 +aI282 +aI-515 +aI313 +aI-500 +aa(lp16657 +g15 +aI438 +aI-542 +aI384 +aI-500 +aI414 +aI-514 +aa(lp16658 +g15 +aI474 +aI-664 +aI462 +aI-570 +aI474 +aI-611 +aa(lp16659 +g10 +aa(lp16660 +g8 +aI741 +aI-44 +aa(lp16661 +g10 +aa(lp16662 +g8 +aI741 +aI-44 +aasV= +(lp16663 +(lp16664 +g8 +aI55 +aI-575 +aa(lp16665 +g20 +aI55 +aI-743 +aa(lp16666 +g20 +aI722 +aI-743 +aa(lp16667 +g20 +aI722 +aI-575 +aa(lp16668 +g10 +aa(lp16669 +g8 +aI55 +aI-286 +aa(lp16670 +g20 +aI55 +aI-455 +aa(lp16671 +g20 +aI722 +aI-455 +aa(lp16672 +g20 +aI722 +aI-286 +aa(lp16673 +g10 +aa(lp16674 +g8 +aI778 +aI-44 +aa(lp16675 +g10 +aa(lp16676 +g8 +aI778 +aI-44 +aasVA +(lp16677 +(lp16678 +g8 +aI957 +aI-44 +aa(lp16679 +g20 +aI748 +aI-44 +aa(lp16680 +g20 +aI664 +aI-261 +aa(lp16681 +g20 +aI283 +aI-261 +aa(lp16682 +g20 +aI204 +aI-44 +aa(lp16683 +g20 +aI0 +aI-44 +aa(lp16684 +g20 +aI371 +aI-998 +aa(lp16685 +g20 +aI575 +aI-998 +aa(lp16686 +g10 +aa(lp16687 +g8 +aI602 +aI-422 +aa(lp16688 +g20 +aI471 +aI-776 +aa(lp16689 +g20 +aI342 +aI-422 +aa(lp16690 +g10 +aa(lp16691 +g8 +aI962 +aI-44 +aa(lp16692 +g10 +aa(lp16693 +g8 +aI962 +aI-44 +aasVE +(lp16694 +(lp16695 +g8 +aI97 +aI-44 +aa(lp16696 +g20 +aI97 +aI-998 +aa(lp16697 +g20 +aI804 +aI-998 +aa(lp16698 +g20 +aI804 +aI-837 +aa(lp16699 +g20 +aI289 +aI-837 +aa(lp16700 +g20 +aI289 +aI-625 +aa(lp16701 +g20 +aI768 +aI-625 +aa(lp16702 +g20 +aI768 +aI-465 +aa(lp16703 +g20 +aI289 +aI-465 +aa(lp16704 +g20 +aI289 +aI-205 +aa(lp16705 +g20 +aI822 +aI-205 +aa(lp16706 +g20 +aI822 +aI-44 +aa(lp16707 +g10 +aa(lp16708 +g8 +aI889 +aI-44 +aa(lp16709 +g10 +aa(lp16710 +g8 +aI889 +aI-44 +aasVI +(lp16711 +(lp16712 +g8 +aI91 +aI-44 +aa(lp16713 +g20 +aI91 +aI-998 +aa(lp16714 +g20 +aI283 +aI-998 +aa(lp16715 +g20 +aI283 +aI-44 +aa(lp16716 +g10 +aa(lp16717 +g8 +aI370 +aI-44 +aa(lp16718 +g10 +aa(lp16719 +g8 +aI370 +aI-44 +aasVM +(lp16720 +(lp16721 +g8 +aI94 +aI-44 +aa(lp16722 +g20 +aI94 +aI-998 +aa(lp16723 +g20 +aI382 +aI-998 +aa(lp16724 +g20 +aI555 +aI-347 +aa(lp16725 +g20 +aI727 +aI-998 +aa(lp16726 +g20 +aI1016 +aI-998 +aa(lp16727 +g20 +aI1016 +aI-44 +aa(lp16728 +g20 +aI837 +aI-44 +aa(lp16729 +g20 +aI837 +aI-795 +aa(lp16730 +g20 +aI647 +aI-44 +aa(lp16731 +g20 +aI462 +aI-44 +aa(lp16732 +g20 +aI273 +aI-795 +aa(lp16733 +g20 +aI273 +aI-44 +aa(lp16734 +g10 +aa(lp16735 +g8 +aI1110 +aI-44 +aa(lp16736 +g10 +aa(lp16737 +g8 +aI1110 +aI-44 +aasVQ +(lp16738 +(lp16739 +g8 +aI865 +aI-165 +aa(lp16740 +g15 +aI1019 +aI-84 +aI912 +aI-131 +aI963 +aI-104 +aa(lp16741 +g20 +aI948 +aI51 +aa(lp16742 +g15 +aI863 +aI15 +aI919 +aI42 +aI891 +aI30 +aa(lp16743 +g15 +aI735 +aI-69 +aI857 +aI12 +aI814 +aI-15 +aa(lp16744 +g15 +aI527 +aI-28 +aI672 +aI-41 +aI603 +aI-28 +aa(lp16745 +g15 +aI182 +aI-157 +aI380 +aI-28 +aI265 +aI-71 +aa(lp16746 +g15 +aI57 +aI-521 +aI99 +aI-244 +aI57 +aI-365 +aa(lp16747 +g15 +aI182 +aI-885 +aI57 +aI-677 +aI99 +aI-798 +aa(lp16748 +g15 +aI522 +aI-1015 +aI266 +aI-971 +aI379 +aI-1015 +aa(lp16749 +g15 +aI858 +aI-885 +aI663 +aI-1015 +aI775 +aI-971 +aa(lp16750 +g15 +aI983 +aI-521 +aI941 +aI-798 +aI983 +aI-677 +aa(lp16751 +g15 +aI948 +aI-304 +aI983 +aI-439 +aI971 +aI-366 +aa(lp16752 +g15 +aI865 +aI-165 +aI931 +aI-256 +aI903 +aI-210 +aa(lp16753 +g10 +aa(lp16754 +g8 +aI710 +aI-274 +aa(lp16755 +g15 +aI765 +aI-379 +aI735 +aI-303 +aI753 +aI-338 +aa(lp16756 +g15 +aI784 +aI-521 +aI778 +aI-420 +aI784 +aI-468 +aa(lp16757 +g15 +aI711 +aI-768 +aI784 +aI-631 +aI760 +aI-714 +aa(lp16758 +g15 +aI520 +aI-850 +aI662 +aI-823 +aI599 +aI-850 +aa(lp16759 +g15 +aI329 +aI-768 +aI442 +aI-850 +aI378 +aI-823 +aa(lp16760 +g15 +aI256 +aI-521 +aI280 +aI-713 +aI256 +aI-631 +aa(lp16761 +g15 +aI329 +aI-271 +aI256 +aI-410 +aI280 +aI-326 +aa(lp16762 +g15 +aI514 +aI-188 +aI378 +aI-215 +aI440 +aI-188 +aa(lp16763 +g15 +aI593 +aI-202 +aI542 +aI-188 +aI569 +aI-192 +aa(lp16764 +g15 +aI474 +aI-261 +aI554 +aI-227 +aI514 +aI-247 +aa(lp16765 +g20 +aI528 +aI-371 +aa(lp16766 +g15 +aI710 +aI-274 +aI592 +aI-350 +aI652 +aI-317 +aa(lp16767 +g10 +aa(lp16768 +g8 +aI1037 +aI-44 +aa(lp16769 +g10 +aa(lp16770 +g8 +aI1037 +aI-44 +aasVU +(lp16771 +(lp16772 +g8 +aI95 +aI-998 +aa(lp16773 +g20 +aI288 +aI-998 +aa(lp16774 +g20 +aI288 +aI-481 +aa(lp16775 +g15 +aI295 +aI-322 +aI288 +aI-399 +aI290 +aI-346 +aa(lp16776 +g15 +aI354 +aI-228 +aI303 +aI-283 +aI323 +aI-252 +aa(lp16777 +g15 +aI481 +aI-192 +aI385 +aI-204 +aI427 +aI-192 +aa(lp16778 +g15 +aI605 +aI-226 +aI536 +aI-192 +aI577 +aI-204 +aa(lp16779 +g15 +aI655 +aI-308 +aI633 +aI-248 +aI649 +aI-276 +aa(lp16780 +g15 +aI664 +aI-470 +aI661 +aI-341 +aI664 +aI-395 +aa(lp16781 +g20 +aI664 +aI-998 +aa(lp16782 +g20 +aI856 +aI-998 +aa(lp16783 +g20 +aI856 +aI-497 +aa(lp16784 +g15 +aI841 +aI-254 +aI856 +aI-382 +aI851 +aI-302 +aa(lp16785 +g15 +aI783 +aI-134 +aI830 +aI-207 +aI811 +aI-167 +aa(lp16786 +g15 +aI671 +aI-57 +aI755 +aI-102 +aI718 +aI-76 +aa(lp16787 +g15 +aI487 +aI-28 +aI624 +aI-37 +aI563 +aI-28 +aa(lp16788 +g15 +aI280 +aI-59 +aI396 +aI-28 +aI327 +aI-38 +aa(lp16789 +g15 +aI168 +aI-141 +aI233 +aI-80 +aI195 +aI-108 +aa(lp16790 +g15 +aI114 +aI-247 +aI141 +aI-175 +aI123 +aI-210 +aa(lp16791 +g15 +aI95 +aI-489 +aI101 +aI-302 +aI95 +aI-382 +aa(lp16792 +g10 +aa(lp16793 +g8 +aI962 +aI-44 +aa(lp16794 +g10 +aa(lp16795 +g8 +aI962 +aI-44 +aasVY +(lp16796 +(lp16797 +g8 +aI347 +aI-44 +aa(lp16798 +g20 +aI347 +aI-446 +aa(lp16799 +g20 +aI-1 +aI-998 +aa(lp16800 +g20 +aI223 +aI-998 +aa(lp16801 +g20 +aI448 +aI-621 +aa(lp16802 +g20 +aI668 +aI-998 +aa(lp16803 +g20 +aI890 +aI-998 +aa(lp16804 +g20 +aI539 +aI-444 +aa(lp16805 +g20 +aI539 +aI-44 +aa(lp16806 +g10 +aa(lp16807 +g8 +aI889 +aI-44 +aa(lp16808 +g10 +aa(lp16809 +g8 +aI889 +aI-44 +aasV] +(lp16810 +(lp16811 +g8 +aI348 +aI-998 +aa(lp16812 +g20 +aI348 +aI224 +aa(lp16813 +g20 +aI24 +aI224 +aa(lp16814 +g20 +aI24 +aI80 +aa(lp16815 +g20 +aI175 +aI80 +aa(lp16816 +g20 +aI175 +aI-856 +aa(lp16817 +g20 +aI24 +aI-856 +aa(lp16818 +g20 +aI24 +aI-998 +aa(lp16819 +g10 +aa(lp16820 +g8 +aI444 +aI-44 +aa(lp16821 +g10 +aa(lp16822 +g8 +aI444 +aI-44 +aasVa +(lp16823 +(lp16824 +g8 +aI232 +aI-524 +aa(lp16825 +g20 +aI66 +aI-554 +aa(lp16826 +g15 +aI162 +aI-703 +aI85 +aI-621 +aI117 +aI-671 +aa(lp16827 +g15 +aI365 +aI-751 +aI208 +aI-735 +aI276 +aI-751 +aa(lp16828 +g15 +aI548 +aI-722 +aI447 +aI-751 +aI508 +aI-741 +aa(lp16829 +g15 +aI632 +aI-648 +aI588 +aI-703 +aI616 +aI-678 +aa(lp16830 +g15 +aI656 +aI-485 +aI648 +aI-619 +aI656 +aI-564 +aa(lp16831 +g20 +aI654 +aI-271 +aa(lp16832 +g15 +aI663 +aI-137 +aI654 +aI-210 +aI657 +aI-166 +aa(lp16833 +g15 +aI696 +aI-44 +aI669 +aI-108 +aI680 +aI-77 +aa(lp16834 +g20 +aI515 +aI-44 +aa(lp16835 +g15 +aI498 +aI-98 +aI510 +aI-56 +aI504 +aI-74 +aa(lp16836 +g15 +aI491 +aI-119 +aI495 +aI-109 +aI492 +aI-116 +aa(lp16837 +g15 +aI391 +aI-51 +aI460 +aI-89 +aI426 +aI-66 +aa(lp16838 +g15 +aI277 +aI-28 +aI355 +aI-36 +aI317 +aI-28 +aa(lp16839 +g15 +aI109 +aI-86 +aI206 +aI-28 +aI150 +aI-48 +aa(lp16840 +g15 +aI47 +aI-233 +aI68 +aI-125 +aI47 +aI-174 +aa(lp16841 +g15 +aI75 +aI-337 +aI47 +aI-272 +aI56 +aI-307 +aa(lp16842 +g15 +aI153 +aI-408 +aI94 +aI-368 +aI120 +aI-391 +aa(lp16843 +g15 +aI299 +aI-450 +aI187 +aI-424 +aI236 +aI-438 +aa(lp16844 +g15 +aI477 +aI-495 +aI384 +aI-466 +aI444 +aI-481 +aa(lp16845 +g20 +aI477 +aI-513 +aa(lp16846 +g15 +aI451 +aI-589 +aI477 +aI-549 +aI468 +aI-574 +aa(lp16847 +g15 +aI352 +aI-611 +aI433 +aI-604 +aI401 +aI-611 +aa(lp16848 +g15 +aI276 +aI-592 +aI320 +aI-611 +aI294 +aI-605 +aa(lp16849 +g15 +aI232 +aI-524 +aI258 +aI-579 +aI243 +aI-557 +aa(lp16850 +g10 +aa(lp16851 +g8 +aI477 +aI-376 +aa(lp16852 +g15 +aI365 +aI-348 +aI453 +aI-368 +aI416 +aI-359 +aa(lp16853 +g15 +aI266 +aI-316 +aI315 +aI-337 +aI281 +aI-327 +aa(lp16854 +g15 +aI230 +aI-252 +aI242 +aI-299 +aI230 +aI-278 +aa(lp16855 +g15 +aI259 +aI-185 +aI230 +aI-226 +aI240 +aI-204 +aa(lp16856 +g15 +aI332 +aI-157 +aI278 +aI-167 +aI302 +aI-157 +aa(lp16857 +g15 +aI426 +aI-190 +aI365 +aI-157 +aI396 +aI-168 +aa(lp16858 +g15 +aI470 +aI-250 +aI448 +aI-206 +aI463 +aI-226 +aa(lp16859 +g15 +aI477 +aI-340 +aI474 +aI-266 +aI477 +aI-296 +aa(lp16860 +g10 +aa(lp16861 +g8 +aI741 +aI-44 +aa(lp16862 +g10 +aa(lp16863 +g8 +aI741 +aI-44 +aasVe +(lp16864 +(lp16865 +g8 +aI496 +aI-264 +aa(lp16866 +g20 +aI678 +aI-233 +aa(lp16867 +g15 +aI567 +aI-81 +aI654 +aI-167 +aI617 +aI-116 +aa(lp16868 +g15 +aI377 +aI-28 +aI516 +aI-46 +aI453 +aI-28 +aa(lp16869 +g15 +aI110 +aI-146 +aI257 +aI-28 +aI168 +aI-68 +aa(lp16870 +g15 +aI42 +aI-384 +aI65 +aI-209 +aI42 +aI-289 +aa(lp16871 +g15 +aI132 +aI-654 +aI42 +aI-499 +aI72 +aI-589 +aa(lp16872 +g15 +aI359 +aI-751 +aI192 +aI-719 +aI267 +aI-751 +aa(lp16873 +g15 +aI602 +aI-649 +aI462 +aI-751 +aI543 +aI-717 +aa(lp16874 +g15 +aI688 +aI-337 +aI662 +aI-581 +aI690 +aI-477 +aa(lp16875 +g20 +aI229 +aI-337 +aa(lp16876 +g15 +aI274 +aI-210 +aI231 +aI-283 +aI245 +aI-240 +aa(lp16877 +g15 +aI379 +aI-165 +aI302 +aI-180 +aI337 +aI-165 +aa(lp16878 +g15 +aI451 +aI-188 +aI408 +aI-165 +aI432 +aI-173 +aa(lp16879 +g15 +aI496 +aI-264 +aI471 +aI-204 +aI486 +aI-229 +aa(lp16880 +g10 +aa(lp16881 +g8 +aI506 +aI-449 +aa(lp16882 +g15 +aI465 +aI-570 +aI505 +aI-502 +aI491 +aI-542 +aa(lp16883 +g15 +aI370 +aI-611 +aI439 +aI-597 +aI407 +aI-611 +aa(lp16884 +g15 +aI271 +aI-567 +aI330 +aI-611 +aI297 +aI-596 +aa(lp16885 +g15 +aI233 +aI-449 +aI245 +aI-538 +aI232 +aI-499 +aa(lp16886 +g10 +aa(lp16887 +g8 +aI741 +aI-44 +aa(lp16888 +g10 +aa(lp16889 +g8 +aI741 +aI-44 +aasVi +(lp16890 +(lp16891 +g8 +aI95 +aI-829 +aa(lp16892 +g20 +aI95 +aI-998 +aa(lp16893 +g20 +aI278 +aI-998 +aa(lp16894 +g20 +aI278 +aI-829 +aa(lp16895 +g10 +aa(lp16896 +g8 +aI95 +aI-44 +aa(lp16897 +g20 +aI95 +aI-735 +aa(lp16898 +g20 +aI278 +aI-735 +aa(lp16899 +g20 +aI278 +aI-44 +aa(lp16900 +g10 +aa(lp16901 +g8 +aI370 +aI-44 +aa(lp16902 +g10 +aa(lp16903 +g8 +aI370 +aI-44 +aasVm +(lp16904 +(lp16905 +g8 +aI82 +aI-735 +aa(lp16906 +g20 +aI250 +aI-735 +aa(lp16907 +g20 +aI250 +aI-641 +aa(lp16908 +g15 +aI466 +aI-751 +aI310 +aI-714 +aI382 +aI-751 +aa(lp16909 +g15 +aI581 +aI-724 +aI510 +aI-751 +aI548 +aI-742 +aa(lp16910 +g15 +aI661 +aI-641 +aI613 +aI-705 +aI640 +aI-678 +aa(lp16911 +g15 +aI759 +aI-724 +aI691 +aI-678 +aI724 +aI-705 +aa(lp16912 +g15 +aI872 +aI-751 +aI794 +aI-742 +aI832 +aI-751 +aa(lp16913 +g15 +aI1001 +aI-720 +aI923 +aI-751 +aI966 +aI-741 +aa(lp16914 +g15 +aI1080 +aI-629 +aI1036 +aI-699 +aI1062 +aI-669 +aa(lp16915 +g15 +aI1098 +aI-486 +aI1092 +aI-600 +aI1098 +aI-552 +aa(lp16916 +g20 +aI1098 +aI-44 +aa(lp16917 +g20 +aI916 +aI-44 +aa(lp16918 +g20 +aI916 +aI-439 +aa(lp16919 +g15 +aI897 +aI-572 +aI916 +aI-508 +aI909 +aI-552 +aa(lp16920 +g15 +aI819 +aI-611 +aI880 +aI-598 +aI854 +aI-611 +aa(lp16921 +g15 +aI746 +aI-588 +aI793 +aI-611 +aI769 +aI-603 +aa(lp16922 +g15 +aI697 +aI-519 +aI724 +aI-572 +aI707 +aI-549 +aa(lp16923 +g15 +aI682 +aI-376 +aI687 +aI-489 +aI682 +aI-441 +aa(lp16924 +g20 +aI682 +aI-44 +aa(lp16925 +g20 +aI500 +aI-44 +aa(lp16926 +g20 +aI500 +aI-423 +aa(lp16927 +g15 +aI490 +aI-553 +aI500 +aI-490 +aI496 +aI-534 +aa(lp16928 +g15 +aI459 +aI-597 +aI483 +aI-573 +aI473 +aI-587 +aa(lp16929 +g15 +aI404 +aI-611 +aI446 +aI-606 +aI427 +aI-611 +aa(lp16930 +g15 +aI328 +aI-588 +aI376 +aI-611 +aI350 +aI-603 +aa(lp16931 +g15 +aI279 +aI-522 +aI305 +aI-573 +aI289 +aI-551 +aa(lp16932 +g15 +aI264 +aI-380 +aI269 +aI-494 +aI264 +aI-446 +aa(lp16933 +g20 +aI264 +aI-44 +aa(lp16934 +g20 +aI82 +aI-44 +aa(lp16935 +g10 +aa(lp16936 +g8 +aI1185 +aI-44 +aa(lp16937 +g10 +aa(lp16938 +g8 +aI1185 +aI-44 +aasVq +(lp16939 +(lp16940 +g8 +aI547 +aI218 +aa(lp16941 +g20 +aI547 +aI-129 +aa(lp16942 +g15 +aI458 +aI-55 +aI523 +aI-98 +aI493 +aI-73 +aa(lp16943 +g15 +aI343 +aI-28 +aI422 +aI-37 +aI384 +aI-28 +aa(lp16944 +g15 +aI149 +aI-117 +aI264 +aI-28 +aI199 +aI-58 +aa(lp16945 +g15 +aI59 +aI-397 +aI89 +aI-186 +aI59 +aI-279 +aa(lp16946 +g15 +aI143 +aI-658 +aI59 +aI-509 +aI87 +aI-595 +aa(lp16947 +g15 +aI352 +aI-751 +aI199 +aI-720 +aI269 +aI-751 +aa(lp16948 +g15 +aI472 +aI-722 +aI398 +aI-751 +aI438 +aI-741 +aa(lp16949 +g15 +aI561 +aI-633 +aI505 +aI-702 +aI535 +aI-673 +aa(lp16950 +g20 +aI561 +aI-735 +aa(lp16951 +g20 +aI730 +aI-735 +aa(lp16952 +g20 +aI730 +aI218 +aa(lp16953 +g10 +aa(lp16954 +g8 +aI553 +aI-398 +aa(lp16955 +g15 +aI510 +aI-556 +aI553 +aI-469 +aI538 +aI-521 +aa(lp16956 +g15 +aI401 +aI-608 +aI481 +aI-590 +aI445 +aI-608 +aa(lp16957 +g15 +aI290 +aI-555 +aI357 +aI-608 +aI320 +aI-590 +aa(lp16958 +g15 +aI246 +aI-388 +aI260 +aI-520 +aI246 +aI-464 +aa(lp16959 +g15 +aI289 +aI-223 +aI246 +aI-312 +aI260 +aI-257 +aa(lp16960 +g15 +aI395 +aI-173 +aI317 +aI-190 +aI353 +aI-173 +aa(lp16961 +g15 +aI505 +aI-229 +aI437 +aI-173 +aI474 +aI-192 +aa(lp16962 +g15 +aI553 +aI-398 +aI537 +aI-267 +aI553 +aI-323 +aa(lp16963 +g10 +aa(lp16964 +g8 +aI814 +aI-44 +aa(lp16965 +g10 +aa(lp16966 +g8 +aI814 +aI-44 +aasVu +(lp16967 +(lp16968 +g8 +aI550 +aI-44 +aa(lp16969 +g20 +aI550 +aI-147 +aa(lp16970 +g15 +aI451 +aI-60 +aI525 +aI-111 +aI492 +aI-81 +aa(lp16971 +g15 +aI321 +aI-28 +aI410 +aI-39 +aI367 +aI-28 +aa(lp16972 +g15 +aI196 +aI-59 +aI275 +aI-28 +aI233 +aI-39 +aa(lp16973 +g15 +aI116 +aI-145 +aI159 +aI-79 +aI133 +aI-108 +aa(lp16974 +g15 +aI91 +aI-298 +aI100 +aI-182 +aI91 +aI-233 +aa(lp16975 +g20 +aI91 +aI-735 +aa(lp16976 +g20 +aI274 +aI-735 +aa(lp16977 +g20 +aI274 +aI-418 +aa(lp16978 +g15 +aI284 +aI-239 +aI274 +aI-320 +aI278 +aI-261 +aa(lp16979 +g15 +aI321 +aI-187 +aI291 +aI-217 +aI303 +aI-200 +aa(lp16980 +g15 +aI389 +aI-168 +aI339 +aI-174 +aI361 +aI-168 +aa(lp16981 +g15 +aI473 +aI-193 +aI420 +aI-168 +aI448 +aI-176 +aa(lp16982 +g15 +aI524 +aI-257 +aI498 +aI-211 +aI514 +aI-232 +aa(lp16983 +g15 +aI537 +aI-444 +aI533 +aI-283 +aI537 +aI-345 +aa(lp16984 +g20 +aI537 +aI-735 +aa(lp16985 +g20 +aI720 +aI-735 +aa(lp16986 +g20 +aI720 +aI-44 +aa(lp16987 +g10 +aa(lp16988 +g8 +aI814 +aI-44 +aa(lp16989 +g10 +aa(lp16990 +g8 +aI814 +aI-44 +aasVy +(lp16991 +(lp16992 +g8 +aI9 +aI-735 +aa(lp16993 +g20 +aI203 +aI-735 +aa(lp16994 +g20 +aI369 +aI-244 +aa(lp16995 +g20 +aI530 +aI-735 +aa(lp16996 +g20 +aI720 +aI-735 +aa(lp16997 +g20 +aI475 +aI-70 +aa(lp16998 +g20 +aI432 +aI49 +aa(lp16999 +g15 +aI386 +aI142 +aI416 +aI90 +aI400 +aI121 +aa(lp17000 +g15 +aI336 +aI194 +aI371 +aI163 +aI355 +aI180 +aa(lp17001 +g15 +aI266 +aI225 +aI317 +aI207 +aI294 +aI217 +aa(lp17002 +g15 +aI173 +aI236 +aI239 +aI232 +aI207 +aI236 +aa(lp17003 +g15 +aI69 +aI225 +aI138 +aI236 +aI103 +aI232 +aa(lp17004 +g20 +aI53 +aI81 +aa(lp17005 +g15 +aI130 +aI90 +aI82 +aI87 +aI107 +aI90 +aa(lp17006 +g15 +aI225 +aI52 +aI173 +aI90 +aI204 +aI77 +aa(lp17007 +g15 +aI272 +aI-42 +aI245 +aI27 +aI261 +aI-3 +aa(lp17008 +g10 +aa(lp17009 +g8 +aI741 +aI-44 +aa(lp17010 +g10 +aa(lp17011 +g8 +aI741 +aI-44 +aasV} +(lp17012 +(lp17013 +g8 +aI474 +aI-311 +aa(lp17014 +g15 +aI402 +aI-297 +aI442 +aI-309 +aI419 +aI-304 +aa(lp17015 +g15 +aI361 +aI-257 +aI386 +aI-289 +aI373 +aI-276 +aa(lp17016 +g15 +aI337 +aI-188 +aI350 +aI-239 +aI342 +aI-216 +aa(lp17017 +g15 +aI332 +aI-80 +aI333 +aI-167 +aI332 +aI-131 +aa(lp17018 +g15 +aI320 +aI96 +aI332 +aI3 +aI328 +aI62 +aa(lp17019 +g15 +aI278 +aI176 +aI313 +aI129 +aI299 +aI156 +aa(lp17020 +g15 +aI188 +aI224 +aI258 +aI196 +aI228 +aI212 +aa(lp17021 +g15 +aI63 +aI236 +aI162 +aI232 +aI120 +aI236 +aa(lp17022 +g20 +aI29 +aI236 +aa(lp17023 +g20 +aI29 +aI79 +aa(lp17024 +g15 +aI120 +aI71 +aI75 +aI79 +aI106 +aI76 +aa(lp17025 +g15 +aI152 +aI45 +aI134 +aI65 +aI145 +aI56 +aa(lp17026 +g15 +aI162 +aI-10 +aI158 +aI34 +aI162 +aI15 +aa(lp17027 +g15 +aI167 +aI-162 +aI162 +aI-37 +aI164 +aI-87 +aa(lp17028 +g15 +aI185 +aI-270 +aI170 +aI-207 +aI175 +aI-243 +aa(lp17029 +g15 +aI223 +aI-339 +aI195 +aI-297 +aI207 +aI-320 +aa(lp17030 +g15 +aI284 +aI-389 +aI239 +aI-358 +aI259 +aI-375 +aa(lp17031 +g15 +aI214 +aI-450 +aI252 +aI-410 +aI228 +aI-430 +aa(lp17032 +g15 +aI172 +aI-560 +aI193 +aI-479 +aI179 +aI-515 +aa(lp17033 +g15 +aI162 +aI-760 +aI167 +aI-590 +aI164 +aI-657 +aa(lp17034 +g15 +aI153 +aI-825 +aI161 +aI-793 +aI158 +aI-814 +aa(lp17035 +g15 +aI124 +aI-850 +aI147 +aI-836 +aI138 +aI-844 +aa(lp17036 +g15 +aI29 +aI-859 +aI109 +aI-856 +aI78 +aI-859 +aa(lp17037 +g20 +aI29 +aI-1015 +aa(lp17038 +g20 +aI63 +aI-1015 +aa(lp17039 +g15 +aI198 +aI-1001 +aI122 +aI-1015 +aI167 +aI-1010 +aa(lp17040 +g15 +aI277 +aI-954 +aI229 +aI-992 +aI256 +aI-976 +aa(lp17041 +g15 +aI320 +aI-874 +aI298 +aI-933 +aI313 +aI-906 +aa(lp17042 +g15 +aI332 +aI-723 +aI328 +aI-842 +aI332 +aI-792 +aa(lp17043 +g15 +aI341 +aI-567 +aI332 +aI-644 +aI335 +aI-592 +aa(lp17044 +g15 +aI385 +aI-493 +aI351 +aI-533 +aI365 +aI-508 +aa(lp17045 +g15 +aI474 +aI-467 +aI404 +aI-478 +aI434 +aI-469 +aa(lp17046 +g10 +aa(lp17047 +g8 +aI518 +aI-44 +aa(lp17048 +g10 +aa(lp17049 +g8 +aI518 +aI-44 +aassg10874 +(dp17050 +V +(lp17051 +(lp17052 +g8 +aI370 +aI-44 +aa(lp17053 +g10 +aa(lp17054 +g8 +aI370 +aI-44 +aasV$ +(lp17055 +(lp17056 +g8 +aI332 +aI92 +aa(lp17057 +g20 +aI332 +aI-24 +aa(lp17058 +g15 +aI189 +aI-63 +aI273 +aI-31 +aI225 +aI-44 +aa(lp17059 +g15 +aI94 +aI-155 +aI152 +aI-82 +aI120 +aI-113 +aa(lp17060 +g15 +aI47 +aI-309 +aI67 +aI-197 +aI51 +aI-248 +aa(lp17061 +g20 +aI165 +aI-331 +aa(lp17062 +g15 +aI213 +aI-192 +aI174 +aI-268 +aI190 +aI-222 +aa(lp17063 +g15 +aI332 +aI-123 +aI246 +aI-151 +aI286 +aI-127 +aa(lp17064 +g20 +aI332 +aI-496 +aa(lp17065 +g15 +aI184 +aI-552 +aI283 +aI-505 +aI234 +aI-524 +aa(lp17066 +g15 +aI97 +aI-638 +aI146 +aI-573 +aI118 +aI-601 +aa(lp17067 +g15 +aI67 +aI-764 +aI77 +aI-675 +aI67 +aI-717 +aa(lp17068 +g15 +aI156 +aI-966 +aI67 +aI-847 +aI97 +aI-915 +aa(lp17069 +g15 +aI332 +aI-1030 +aI195 +aI-1001 +aI254 +aI-1022 +aa(lp17070 +g20 +aI332 +aI-1086 +aa(lp17071 +g20 +aI401 +aI-1086 +aa(lp17072 +g20 +aI401 +aI-1030 +aa(lp17073 +g15 +aI563 +aI-970 +aI469 +aI-1024 +aI523 +aI-1004 +aa(lp17074 +g15 +aI655 +aI-795 +aI614 +aI-928 +aI645 +aI-869 +aa(lp17075 +g20 +aI534 +aI-777 +aa(lp17076 +g15 +aI491 +aI-883 +aI527 +aI-823 +aI513 +aI-858 +aa(lp17077 +g15 +aI401 +aI-931 +aI469 +aI-907 +aI439 +aI-924 +aa(lp17078 +g20 +aI401 +aI-593 +aa(lp17079 +g15 +aI518 +aI-559 +aI460 +aI-579 +aI499 +aI-567 +aa(lp17080 +g15 +aI607 +aI-500 +aI554 +aI-543 +aI584 +aI-523 +aa(lp17081 +g15 +aI660 +aI-418 +aI630 +aI-477 +aI648 +aI-450 +aa(lp17082 +g15 +aI679 +aI-315 +aI672 +aI-387 +aI679 +aI-352 +aa(lp17083 +g15 +aI601 +aI-112 +aI679 +aI-234 +aI653 +aI-167 +aa(lp17084 +g15 +aI401 +aI-25 +aI549 +aI-58 +aI483 +aI-29 +aa(lp17085 +g20 +aI401 +aI92 +aa(lp17086 +g10 +aa(lp17087 +g8 +aI332 +aI-933 +aa(lp17088 +g15 +aI224 +aI-878 +aI286 +aI-926 +aI250 +aI-907 +aa(lp17089 +g15 +aI184 +aI-773 +aI198 +aI-848 +aI184 +aI-813 +aa(lp17090 +g15 +aI218 +aI-673 +aI184 +aI-733 +aI196 +aI-700 +aa(lp17091 +g15 +aI332 +aI-608 +aI240 +aI-646 +aI278 +aI-624 +aa(lp17092 +g10 +aa(lp17093 +g8 +aI401 +aI-123 +aa(lp17094 +g15 +aI513 +aI-182 +aI446 +aI-128 +aI484 +aI-148 +aa(lp17095 +g15 +aI558 +aI-308 +aI543 +aI-216 +aI558 +aI-258 +aa(lp17096 +g15 +aI527 +aI-410 +aI558 +aI-350 +aI548 +aI-384 +aa(lp17097 +g15 +aI401 +aI-479 +aI505 +aI-436 +aI463 +aI-459 +aa(lp17098 +g10 +aa(lp17099 +g8 +aI741 +aI-44 +aa(lp17100 +g10 +aa(lp17101 +g8 +aI741 +aI-44 +aasV( +(lp17102 +(lp17103 +g8 +aI311 +aI236 +aa(lp17104 +g15 +aI147 +aI-50 +aI247 +aI154 +aI192 +aI59 +aa(lp17105 +g15 +aI80 +aI-390 +aI103 +aI-159 +aI80 +aI-272 +aa(lp17106 +g15 +aI130 +aI-687 +aI80 +aI-493 +aI97 +aI-592 +aa(lp17107 +g15 +aI311 +aI-1015 +aI169 +aI-796 +aI230 +aI-906 +aa(lp17108 +g20 +aI395 +aI-1015 +aa(lp17109 +g15 +aI291 +aI-821 +aI343 +aI-924 +aI308 +aI-860 +aa(lp17110 +g15 +aI229 +aI-634 +aI265 +aI-761 +aI244 +aI-699 +aa(lp17111 +g15 +aI201 +aI-389 +aI210 +aI-553 +aI201 +aI-471 +aa(lp17112 +g15 +aI395 +aI236 +aI201 +aI-180 +aI266 +aI27 +aa(lp17113 +g10 +aa(lp17114 +g8 +aI444 +aI-44 +aa(lp17115 +g10 +aa(lp17116 +g8 +aI444 +aI-44 +aasV, +(lp17117 +(lp17118 +g8 +aI118 +aI-44 +aa(lp17119 +g20 +aI118 +aI-177 +aa(lp17120 +g20 +aI251 +aI-177 +aa(lp17121 +g20 +aI251 +aI-44 +aa(lp17122 +g15 +aI225 +aI74 +aI251 +aI4 +aI243 +aI44 +aa(lp17123 +g15 +aI143 +aI144 +aI208 +aI104 +aI180 +aI127 +aa(lp17124 +g20 +aI110 +aI94 +aa(lp17125 +g15 +aI165 +aI46 +aI135 +aI83 +aI153 +aI67 +aa(lp17126 +g15 +aI184 +aI-44 +aI177 +aI25 +aI183 +aI-4 +aa(lp17127 +g10 +aa(lp17128 +g8 +aI370 +aI-44 +aa(lp17129 +g10 +aa(lp17130 +g8 +aI370 +aI-44 +aasV0 +(lp17131 +(lp17132 +g8 +aI55 +aI-515 +aa(lp17133 +g15 +aI90 +aI-787 +aI55 +aI-627 +aI66 +aI-718 +aa(lp17134 +g15 +aI193 +aI-946 +aI113 +aI-856 +aI147 +aI-909 +aa(lp17135 +g15 +aI366 +aI-1002 +aI239 +aI-984 +aI297 +aI-1002 +aa(lp17136 +g15 +aI501 +aI-971 +aI417 +aI-1002 +aI462 +aI-992 +aa(lp17137 +g15 +aI597 +aI-882 +aI539 +aI-951 +aI571 +aI-921 +aa(lp17138 +g15 +aI656 +aI-740 +aI622 +aI-843 +aI641 +aI-796 +aa(lp17139 +g15 +aI677 +aI-515 +aI670 +aI-684 +aI677 +aI-609 +aa(lp17140 +g15 +aI643 +aI-243 +aI677 +aI-403 +aI666 +aI-312 +aa(lp17141 +g15 +aI540 +aI-84 +aI620 +aI-175 +aI585 +aI-122 +aa(lp17142 +g15 +aI366 +aI-28 +aI494 +aI-46 +aI436 +aI-28 +aa(lp17143 +g15 +aI149 +aI-127 +aI274 +aI-28 +aI202 +aI-61 +aa(lp17144 +g15 +aI55 +aI-515 +aI86 +aI-206 +aI55 +aI-335 +aa(lp17145 +g10 +aa(lp17146 +g8 +aI175 +aI-515 +aa(lp17147 +g15 +aI230 +aI-202 +aI175 +aI-358 +aI194 +aI-254 +aa(lp17148 +g15 +aI366 +aI-124 +aI267 +aI-150 +aI312 +aI-124 +aa(lp17149 +g15 +aI502 +aI-202 +aI420 +aI-124 +aI465 +aI-150 +aa(lp17150 +g15 +aI557 +aI-515 +aI538 +aI-254 +aI557 +aI-358 +aa(lp17151 +g15 +aI502 +aI-828 +aI557 +aI-672 +aI538 +aI-776 +aa(lp17152 +g15 +aI365 +aI-905 +aI465 +aI-879 +aI419 +aI-905 +aa(lp17153 +g15 +aI236 +aI-837 +aI311 +aI-905 +aI268 +aI-882 +aa(lp17154 +g15 +aI175 +aI-515 +aI195 +aI-779 +aI175 +aI-671 +aa(lp17155 +g10 +aa(lp17156 +g8 +aI741 +aI-44 +aa(lp17157 +g10 +aa(lp17158 +g8 +aI741 +aI-44 +aasV4 +(lp17159 +(lp17160 +g8 +aI430 +aI-44 +aa(lp17161 +g20 +aI430 +aI-272 +aa(lp17162 +g20 +aI16 +aI-272 +aa(lp17163 +g20 +aI16 +aI-380 +aa(lp17164 +g20 +aI452 +aI-998 +aa(lp17165 +g20 +aI548 +aI-998 +aa(lp17166 +g20 +aI548 +aI-380 +aa(lp17167 +g20 +aI677 +aI-380 +aa(lp17168 +g20 +aI677 +aI-272 +aa(lp17169 +g20 +aI548 +aI-272 +aa(lp17170 +g20 +aI548 +aI-44 +aa(lp17171 +g10 +aa(lp17172 +g8 +aI430 +aI-380 +aa(lp17173 +g20 +aI430 +aI-810 +aa(lp17174 +g20 +aI132 +aI-380 +aa(lp17175 +g10 +aa(lp17176 +g8 +aI741 +aI-44 +aa(lp17177 +g10 +aa(lp17178 +g8 +aI741 +aI-44 +aasV8 +(lp17179 +(lp17180 +g8 +aI235 +aI-562 +aa(lp17181 +g15 +aI127 +aI-638 +aI187 +aI-579 +aI151 +aI-605 +aa(lp17182 +g15 +aI92 +aI-756 +aI104 +aI-671 +aI92 +aI-710 +aa(lp17183 +g15 +aI167 +aI-931 +aI92 +aI-826 +aI117 +aI-884 +aa(lp17184 +g15 +aI366 +aI-1002 +aI217 +aI-979 +aI283 +aI-1002 +aa(lp17185 +g15 +aI567 +aI-930 +aI449 +aI-1002 +aI516 +aI-978 +aa(lp17186 +g15 +aI643 +aI-753 +aI618 +aI-881 +aI643 +aI-822 +aa(lp17187 +g15 +aI609 +aI-637 +aI643 +aI-709 +aI632 +aI-670 +aa(lp17188 +g15 +aI503 +aI-562 +aI585 +aI-605 +aI550 +aI-579 +aa(lp17189 +g15 +aI637 +aI-469 +aI561 +aI-542 +aI606 +aI-512 +aa(lp17190 +g15 +aI682 +aI-317 +aI667 +aI-427 +aI682 +aI-376 +aa(lp17191 +g15 +aI596 +aI-111 +aI682 +aI-235 +aI654 +aI-167 +aa(lp17192 +g15 +aI368 +aI-28 +aI538 +aI-55 +aI462 +aI-28 +aa(lp17193 +g15 +aI140 +aI-111 +aI274 +aI-28 +aI198 +aI-56 +aa(lp17194 +g15 +aI54 +aI-320 +aI82 +aI-167 +aI54 +aI-237 +aa(lp17195 +g15 +aI101 +aI-476 +aI54 +aI-382 +aI69 +aI-434 +aa(lp17196 +g15 +aI235 +aI-562 +aI132 +aI-518 +aI177 +aI-546 +aa(lp17197 +g10 +aa(lp17198 +g8 +aI212 +aI-760 +aa(lp17199 +g15 +aI255 +aI-649 +aI212 +aI-715 +aI226 +aI-678 +aa(lp17200 +g15 +aI369 +aI-606 +aI284 +aI-621 +aI322 +aI-606 +aa(lp17201 +g15 +aI480 +aI-649 +aI414 +aI-606 +aI451 +aI-621 +aa(lp17202 +g15 +aI523 +aI-754 +aI509 +aI-678 +aI523 +aI-712 +aa(lp17203 +g15 +aI478 +aI-862 +aI523 +aI-797 +aI508 +aI-833 +aa(lp17204 +g15 +aI367 +aI-906 +aI449 +aI-891 +aI412 +aI-906 +aa(lp17205 +g15 +aI256 +aI-863 +aI323 +aI-906 +aI286 +aI-892 +aa(lp17206 +g15 +aI212 +aI-760 +aI226 +aI-834 +aI212 +aI-800 +aa(lp17207 +g10 +aa(lp17208 +g8 +aI174 +aI-319 +aa(lp17209 +g15 +aI198 +aI-222 +aI174 +aI-286 +aI182 +aI-254 +aa(lp17210 +g15 +aI268 +aI-150 +aI214 +aI-191 +aI237 +aI-167 +aa(lp17211 +g15 +aI369 +aI-124 +aI300 +aI-133 +aI333 +aI-124 +aa(lp17212 +g15 +aI508 +aI-178 +aI425 +aI-124 +aI472 +aI-142 +aa(lp17213 +g15 +aI563 +aI-315 +aI544 +aI-214 +aI563 +aI-260 +aa(lp17214 +g15 +aI506 +aI-455 +aI563 +aI-372 +aI544 +aI-419 +aa(lp17215 +g15 +aI365 +aI-511 +aI469 +aI-492 +aI422 +aI-511 +aa(lp17216 +g15 +aI228 +aI-456 +aI310 +aI-511 +aI265 +aI-493 +aa(lp17217 +g15 +aI174 +aI-319 +aI192 +aI-420 +aI174 +aI-374 +aa(lp17218 +g10 +aa(lp17219 +g8 +aI741 +aI-44 +aa(lp17220 +g10 +aa(lp17221 +g8 +aI741 +aI-44 +aasV< +(lp17222 +(lp17223 +g8 +aI72 +aI-461 +aa(lp17224 +g20 +aI72 +aI-571 +aa(lp17225 +g20 +aI705 +aI-838 +aa(lp17226 +g20 +aI705 +aI-721 +aa(lp17227 +g20 +aI203 +aI-515 +aa(lp17228 +g20 +aI705 +aI-308 +aa(lp17229 +g20 +aI705 +aI-191 +aa(lp17230 +g10 +aa(lp17231 +g8 +aI778 +aI-44 +aa(lp17232 +g10 +aa(lp17233 +g8 +aI778 +aI-44 +aasV@ +(lp17234 +(lp17235 +g8 +aI755 +aI-150 +aa(lp17236 +g15 +aI661 +aI-72 +aI727 +aI-118 +aI696 +aI-91 +aa(lp17237 +g15 +aI555 +aI-42 +aI626 +aI-52 +aI591 +aI-42 +aa(lp17238 +g15 +aI443 +aI-76 +aI517 +aI-42 +aI479 +aI-53 +aa(lp17239 +g15 +aI354 +aI-180 +aI406 +aI-98 +aI377 +aI-133 +aa(lp17240 +g15 +aI320 +aI-334 +aI331 +aI-227 +aI320 +aI-278 +aa(lp17241 +g15 +aI373 +aI-542 +aI320 +aI-403 +aI337 +aI-472 +aa(lp17242 +g15 +aI505 +aI-698 +aI408 +aI-611 +aI452 +aI-663 +aa(lp17243 +g15 +aI658 +aI-750 +aI557 +aI-732 +aI608 +aI-750 +aa(lp17244 +g15 +aI766 +aI-720 +aI695 +aI-750 +aI731 +aI-740 +aa(lp17245 +g15 +aI854 +aI-630 +aI800 +aI-700 +aI830 +aI-670 +aa(lp17246 +g20 +aI876 +aI-731 +aa(lp17247 +g20 +aI993 +aI-731 +aa(lp17248 +g20 +aI899 +aI-294 +aa(lp17249 +g15 +aI880 +aI-193 +aI886 +aI-233 +aI880 +aI-200 +aa(lp17250 +g15 +aI893 +aI-163 +aI880 +aI-181 +aI884 +aI-171 +aa(lp17251 +g15 +aI925 +aI-150 +aI902 +aI-154 +aI913 +aI-150 +aa(lp17252 +g15 +aI1016 +aI-190 +aI948 +aI-150 +aI978 +aI-163 +aa(lp17253 +g15 +aI1133 +aI-329 +aI1065 +aI-225 +aI1104 +aI-271 +aa(lp17254 +g15 +aI1177 +aI-510 +aI1162 +aI-388 +aI1177 +aI-448 +aa(lp17255 +g15 +aI1121 +aI-713 +aI1177 +aI-583 +aI1158 +aI-650 +aa(lp17256 +g15 +aI955 +aI-864 +aI1084 +aI-776 +aI1028 +aI-826 +aa(lp17257 +g15 +aI711 +aI-921 +aI881 +aI-902 +aI800 +aI-921 +aa(lp17258 +g15 +aI433 +aI-850 +aI610 +aI-921 +aI517 +aI-897 +aa(lp17259 +g15 +aI237 +aI-645 +aI349 +aI-802 +aI284 +aI-734 +aa(lp17260 +g15 +aI168 +aI-360 +aI191 +aI-556 +aI168 +aI-461 +aa(lp17261 +g15 +aI237 +aI-85 +aI168 +aI-253 +aI191 +aI-162 +aa(lp17262 +g15 +aI438 +aI84 +aI284 +aI-8 +aI351 +aI48 +aa(lp17263 +g15 +aI729 +aI139 +aI525 +aI121 +aI622 +aI139 +aa(lp17264 +g15 +aI1014 +aI82 +aI842 +aI139 +aI938 +aI120 +aa(lp17265 +g15 +aI1187 +aI-56 +aI1091 +aI44 +aI1149 +aI-2 +aa(lp17266 +g20 +aI1305 +aI-56 +aa(lp17267 +g15 +aI1191 +aI82 +aI1283 +aI-11 +aI1245 +aI35 +aa(lp17268 +g15 +aI999 +aI194 +aI1137 +aI129 +aI1073 +aI167 +aa(lp17269 +g15 +aI731 +aI236 +aI925 +aI222 +aI835 +aI236 +aa(lp17270 +g15 +aI464 +aI199 +aI634 +aI236 +aI545 +aI223 +aa(lp17271 +g15 +aI256 +aI87 +aI383 +aI174 +aI313 +aI137 +aa(lp17272 +g15 +aI126 +aI-84 +aI199 +aI37 +aI156 +aI-19 +aa(lp17273 +g15 +aI72 +aI-349 +aI90 +aI-166 +aI72 +aI-254 +aa(lp17274 +g15 +aI137 +aI-652 +aI72 +aI-455 +aI93 +aI-556 +aa(lp17275 +g15 +aI362 +aI-922 +aI190 +aI-770 +aI265 +aI-860 +aa(lp17276 +g15 +aI717 +aI-1016 +aI460 +aI-985 +aI578 +aI-1016 +aa(lp17277 +g15 +aI1007 +aI-950 +aI825 +aI-1016 +aI921 +aI-994 +aa(lp17278 +g15 +aI1210 +aI-753 +aI1093 +aI-906 +aI1160 +aI-840 +aa(lp17279 +g15 +aI1273 +aI-508 +aI1252 +aI-678 +aI1273 +aI-596 +aa(lp17280 +g15 +aI1140 +aI-173 +aI1273 +aI-382 +aI1229 +aI-271 +aa(lp17281 +g15 +aI881 +aI-41 +aI1061 +aI-85 +aI975 +aI-41 +aa(lp17282 +g15 +aI808 +aI-55 +aI851 +aI-41 +aI827 +aI-46 +aa(lp17283 +g15 +aI768 +aI-94 +aI790 +aI-64 +aI776 +aI-77 +aa(lp17284 +g15 +aI755 +aI-150 +aI762 +aI-105 +aI758 +aI-124 +aa(lp17285 +g10 +aa(lp17286 +g8 +aI440 +aI-326 +aa(lp17287 +g15 +aI483 +aI-188 +aI440 +aI-267 +aI454 +aI-221 +aa(lp17288 +g15 +aI580 +aI-138 +aI511 +aI-155 +aI543 +aI-138 +aa(lp17289 +g15 +aI656 +aI-160 +aI604 +aI-138 +aI629 +aI-146 +aa(lp17290 +g15 +aI734 +aI-225 +aI683 +aI-175 +aI709 +aI-196 +aa(lp17291 +g15 +aI794 +aI-334 +aI758 +aI-254 +aI778 +aI-290 +aa(lp17292 +g15 +aI817 +aI-466 +aI809 +aI-378 +aI817 +aI-422 +aa(lp17293 +g15 +aI773 +aI-604 +aI817 +aI-526 +aI803 +aI-571 +aa(lp17294 +g15 +aI666 +aI-653 +aI744 +aI-636 +aI708 +aI-653 +aa(lp17295 +g15 +aI588 +aI-632 +aI638 +aI-653 +aI612 +aI-646 +aa(lp17296 +g15 +aI516 +aI-563 +aI563 +aI-617 +aI539 +aI-595 +aa(lp17297 +g15 +aI461 +aI-450 +aI493 +aI-532 +aI475 +aI-494 +aa(lp17298 +g15 +aI440 +aI-326 +aI447 +aI-405 +aI440 +aI-364 +aa(lp17299 +g10 +aa(lp17300 +g8 +aI1353 +aI-44 +aa(lp17301 +g10 +aa(lp17302 +g8 +aI1353 +aI-44 +aasVD +(lp17303 +(lp17304 +g8 +aI102 +aI-44 +aa(lp17305 +g20 +aI102 +aI-998 +aa(lp17306 +g20 +aI431 +aI-998 +aa(lp17307 +g15 +aI601 +aI-985 +aI505 +aI-998 +aI562 +aI-994 +aa(lp17308 +g15 +aI741 +aI-916 +aI656 +aI-972 +aI702 +aI-949 +aa(lp17309 +g15 +aI854 +aI-753 +aI791 +aI-874 +aI829 +aI-819 +aa(lp17310 +g15 +aI891 +aI-526 +aI879 +aI-687 +aI891 +aI-611 +aa(lp17311 +g15 +aI866 +aI-334 +aI891 +aI-454 +aI883 +aI-390 +aa(lp17312 +g15 +aI801 +aI-195 +aI849 +aI-278 +aI827 +aI-231 +aa(lp17313 +g15 +aI714 +aI-108 +aI774 +aI-158 +aI745 +aI-129 +aa(lp17314 +g15 +aI600 +aI-60 +aI683 +aI-87 +aI645 +aI-71 +aa(lp17315 +g15 +aI447 +aI-44 +aI556 +aI-49 +aI504 +aI-44 +aa(lp17316 +g10 +aa(lp17317 +g8 +aI229 +aI-157 +aa(lp17318 +g20 +aI432 +aI-157 +aa(lp17319 +g15 +aI581 +aI-174 +aI495 +aI-157 +aI545 +aI-162 +aa(lp17320 +g15 +aI666 +aI-224 +aI616 +aI-186 +aI645 +aI-202 +aa(lp17321 +g15 +aI736 +aI-344 +aI696 +aI-254 +aI719 +aI-294 +aa(lp17322 +g15 +aI761 +aI-528 +aI753 +aI-395 +aI761 +aI-456 +aa(lp17323 +g15 +aI712 +aI-758 +aI761 +aI-628 +aI745 +aI-705 +aa(lp17324 +g15 +aI593 +aI-866 +aI679 +aI-812 +aI639 +aI-848 +aa(lp17325 +g15 +aI429 +aI-886 +aI559 +aI-879 +aI504 +aI-886 +aa(lp17326 +g20 +aI229 +aI-886 +aa(lp17327 +g10 +aa(lp17328 +g8 +aI962 +aI-44 +aa(lp17329 +g10 +aa(lp17330 +g8 +aI962 +aI-44 +aasVH +(lp17331 +(lp17332 +g8 +aI106 +aI-44 +aa(lp17333 +g20 +aI106 +aI-998 +aa(lp17334 +g20 +aI233 +aI-998 +aa(lp17335 +g20 +aI233 +aI-606 +aa(lp17336 +g20 +aI729 +aI-606 +aa(lp17337 +g20 +aI729 +aI-998 +aa(lp17338 +g20 +aI855 +aI-998 +aa(lp17339 +g20 +aI855 +aI-44 +aa(lp17340 +g20 +aI729 +aI-44 +aa(lp17341 +g20 +aI729 +aI-494 +aa(lp17342 +g20 +aI233 +aI-494 +aa(lp17343 +g20 +aI233 +aI-44 +aa(lp17344 +g10 +aa(lp17345 +g8 +aI962 +aI-44 +aa(lp17346 +g10 +aa(lp17347 +g8 +aI962 +aI-44 +aasVL +(lp17348 +(lp17349 +g8 +aI97 +aI-44 +aa(lp17350 +g20 +aI97 +aI-998 +aa(lp17351 +g20 +aI223 +aI-998 +aa(lp17352 +g20 +aI223 +aI-157 +aa(lp17353 +g20 +aI694 +aI-157 +aa(lp17354 +g20 +aI694 +aI-44 +aa(lp17355 +g10 +aa(lp17356 +g8 +aI741 +aI-44 +aa(lp17357 +g10 +aa(lp17358 +g8 +aI741 +aI-44 +aasVP +(lp17359 +(lp17360 +g8 +aI102 +aI-44 +aa(lp17361 +g20 +aI102 +aI-998 +aa(lp17362 +g20 +aI462 +aI-998 +aa(lp17363 +g15 +aI608 +aI-989 +aI526 +aI-998 +aI574 +aI-995 +aa(lp17364 +g15 +aI725 +aI-945 +aI654 +aI-981 +aI694 +aI-967 +aa(lp17365 +g15 +aI802 +aI-853 +aI757 +aI-923 +aI783 +aI-892 +aa(lp17366 +g15 +aI831 +aI-722 +aI821 +aI-813 +aI831 +aI-770 +aa(lp17367 +g15 +aI753 +aI-516 +aI831 +aI-641 +aI805 +aI-572 +aa(lp17368 +g15 +aI473 +aI-432 +aI702 +aI-460 +aI608 +aI-432 +aa(lp17369 +g20 +aI229 +aI-432 +aa(lp17370 +g20 +aI229 +aI-44 +aa(lp17371 +g10 +aa(lp17372 +g8 +aI229 +aI-545 +aa(lp17373 +g20 +aI475 +aI-545 +aa(lp17374 +g15 +aI649 +aI-590 +aI557 +aI-545 +aI615 +aI-560 +aa(lp17375 +g15 +aI701 +aI-718 +aI684 +aI-621 +aI701 +aI-663 +aa(lp17376 +g15 +aI670 +aI-821 +aI701 +aI-758 +aI691 +aI-793 +aa(lp17377 +g15 +aI591 +aI-877 +aI650 +aI-849 +aI624 +aI-868 +aa(lp17378 +g15 +aI473 +aI-886 +aI569 +aI-883 +aI530 +aI-886 +aa(lp17379 +g20 +aI229 +aI-886 +aa(lp17380 +g10 +aa(lp17381 +g8 +aI889 +aI-44 +aa(lp17382 +g10 +aa(lp17383 +g8 +aI889 +aI-44 +aasVT +(lp17384 +(lp17385 +g8 +aI345 +aI-44 +aa(lp17386 +g20 +aI345 +aI-886 +aa(lp17387 +g20 +aI31 +aI-886 +aa(lp17388 +g20 +aI31 +aI-998 +aa(lp17389 +g20 +aI787 +aI-998 +aa(lp17390 +g20 +aI787 +aI-886 +aa(lp17391 +g20 +aI472 +aI-886 +aa(lp17392 +g20 +aI472 +aI-44 +aa(lp17393 +g10 +aa(lp17394 +g8 +aI814 +aI-44 +aa(lp17395 +g10 +aa(lp17396 +g8 +aI814 +aI-44 +aasVX +(lp17397 +(lp17398 +g8 +aI5 +aI-44 +aa(lp17399 +g20 +aI375 +aI-541 +aa(lp17400 +g20 +aI49 +aI-998 +aa(lp17401 +g20 +aI199 +aI-998 +aa(lp17402 +g20 +aI373 +aI-754 +aa(lp17403 +g15 +aI449 +aI-636 +aI409 +aI-703 +aI434 +aI-664 +aa(lp17404 +g15 +aI525 +aI-745 +aI471 +aI-671 +aI496 +aI-707 +aa(lp17405 +g20 +aI717 +aI-998 +aa(lp17406 +g20 +aI854 +aI-998 +aa(lp17407 +g20 +aI519 +aI-549 +aa(lp17408 +g20 +aI880 +aI-44 +aa(lp17409 +g20 +aI724 +aI-44 +aa(lp17410 +g20 +aI484 +aI-384 +aa(lp17411 +g15 +aI442 +aI-448 +aI470 +aI-404 +aI457 +aI-425 +aa(lp17412 +g15 +aI397 +aI-377 +aI421 +aI-414 +aI406 +aI-390 +aa(lp17413 +g20 +aI157 +aI-44 +aa(lp17414 +g10 +aa(lp17415 +g8 +aI889 +aI-44 +aa(lp17416 +g10 +aa(lp17417 +g8 +aI889 +aI-44 +aasV\u005C +(lp17418 +(lp17419 +g8 +aI276 +aI-28 +aa(lp17420 +g20 +aI0 +aI-1015 +aa(lp17421 +g20 +aI94 +aI-1015 +aa(lp17422 +g20 +aI370 +aI-28 +aa(lp17423 +g10 +aa(lp17424 +g8 +aI370 +aI-44 +aa(lp17425 +g10 +aa(lp17426 +g8 +aI370 +aI-44 +aasV` +(lp17427 +(lp17428 +g8 +aI302 +aI-821 +aa(lp17429 +g20 +aI208 +aI-821 +aa(lp17430 +g20 +aI57 +aI-1004 +aa(lp17431 +g20 +aI214 +aI-1004 +aa(lp17432 +g10 +aa(lp17433 +g8 +aI444 +aI-44 +aa(lp17434 +g10 +aa(lp17435 +g8 +aI444 +aI-44 +aasVd +(lp17436 +(lp17437 +g8 +aI536 +aI-44 +aa(lp17438 +g20 +aI536 +aI-131 +aa(lp17439 +g15 +aI343 +aI-28 +aI492 +aI-63 +aI428 +aI-28 +aa(lp17440 +g15 +aI191 +aI-74 +aI287 +aI-28 +aI237 +aI-44 +aa(lp17441 +g15 +aI83 +aI-201 +aI144 +aI-104 +aI109 +aI-147 +aa(lp17442 +g15 +aI45 +aI-389 +aI58 +aI-256 +aI45 +aI-318 +aa(lp17443 +g15 +aI80 +aI-577 +aI45 +aI-458 +aI57 +aI-521 +aa(lp17444 +g15 +aI183 +aI-706 +aI103 +aI-633 +aI137 +aI-676 +aa(lp17445 +g15 +aI337 +aI-751 +aI229 +aI-736 +aI281 +aI-751 +aa(lp17446 +g15 +aI449 +aI-725 +aI379 +aI-751 +aI416 +aI-742 +aa(lp17447 +g15 +aI528 +aI-656 +aI481 +aI-707 +aI508 +aI-684 +aa(lp17448 +g20 +aI528 +aI-998 +aa(lp17449 +g20 +aI645 +aI-998 +aa(lp17450 +g20 +aI645 +aI-44 +aa(lp17451 +g10 +aa(lp17452 +g8 +aI166 +aI-389 +aa(lp17453 +g15 +aI222 +aI-190 +aI166 +aI-300 +aI184 +aI-234 +aa(lp17454 +g15 +aI354 +aI-125 +aI259 +aI-147 +aI303 +aI-125 +aa(lp17455 +g15 +aI484 +aI-188 +aI405 +aI-125 +aI448 +aI-146 +aa(lp17456 +g15 +aI538 +aI-379 +aI520 +aI-229 +aI538 +aI-293 +aa(lp17457 +g15 +aI483 +aI-588 +aI538 +aI-474 +aI520 +aI-543 +aa(lp17458 +g15 +aI348 +aI-654 +aI447 +aI-632 +aI402 +aI-654 +aa(lp17459 +g15 +aI218 +aI-590 +aI296 +aI-654 +aI253 +aI-633 +aa(lp17460 +g15 +aI166 +aI-389 +aI183 +aI-548 +aI166 +aI-481 +aa(lp17461 +g10 +aa(lp17462 +g8 +aI741 +aI-44 +aa(lp17463 +g10 +aa(lp17464 +g8 +aI741 +aI-44 +aasVh +(lp17465 +(lp17466 +g8 +aI87 +aI-44 +aa(lp17467 +g20 +aI87 +aI-998 +aa(lp17468 +g20 +aI205 +aI-998 +aa(lp17469 +g20 +aI205 +aI-656 +aa(lp17470 +g15 +aI412 +aI-751 +aI259 +aI-719 +aI328 +aI-751 +aa(lp17471 +g15 +aI545 +aI-721 +aI463 +aI-751 +aI507 +aI-741 +aa(lp17472 +g15 +aI626 +aI-637 +aI583 +aI-701 +aI610 +aI-673 +aa(lp17473 +g15 +aI651 +aI-482 +aI642 +aI-601 +aI651 +aI-550 +aa(lp17474 +g20 +aI651 +aI-44 +aa(lp17475 +g20 +aI533 +aI-44 +aa(lp17476 +g20 +aI533 +aI-482 +aa(lp17477 +g15 +aI495 +aI-610 +aI533 +aI-541 +aI521 +aI-583 +aa(lp17478 +g15 +aI388 +aI-650 +aI470 +aI-637 +aI434 +aI-650 +aa(lp17479 +g15 +aI290 +aI-623 +aI353 +aI-650 +aI320 +aI-641 +aa(lp17480 +g15 +aI224 +aI-550 +aI259 +aI-605 +aI237 +aI-581 +aa(lp17481 +g15 +aI205 +aI-422 +aI211 +aI-519 +aI205 +aI-476 +aa(lp17482 +g20 +aI205 +aI-44 +aa(lp17483 +g10 +aa(lp17484 +g8 +aI741 +aI-44 +aa(lp17485 +g10 +aa(lp17486 +g8 +aI741 +aI-44 +aasVl +(lp17487 +(lp17488 +g8 +aI85 +aI-44 +aa(lp17489 +g20 +aI85 +aI-998 +aa(lp17490 +g20 +aI202 +aI-998 +aa(lp17491 +g20 +aI202 +aI-44 +aa(lp17492 +g10 +aa(lp17493 +g8 +aI296 +aI-44 +aa(lp17494 +g10 +aa(lp17495 +g8 +aI296 +aI-44 +aasVp +(lp17496 +(lp17497 +g8 +aI87 +aI220 +aa(lp17498 +g20 +aI87 +aI-735 +aa(lp17499 +g20 +aI194 +aI-735 +aa(lp17500 +g20 +aI194 +aI-646 +aa(lp17501 +g15 +aI279 +aI-725 +aI219 +aI-681 +aI248 +aI-707 +aa(lp17502 +g15 +aI395 +aI-751 +aI311 +aI-742 +aI350 +aI-751 +aa(lp17503 +g15 +aI551 +aI-705 +aI454 +aI-751 +aI506 +aI-736 +aa(lp17504 +g15 +aI653 +aI-577 +aI596 +aI-675 +aI630 +aI-632 +aa(lp17505 +g15 +aI688 +aI-395 +aI676 +aI-521 +aI688 +aI-461 +aa(lp17506 +g15 +aI650 +aI-204 +aI688 +aI-324 +aI675 +aI-260 +aa(lp17507 +g15 +aI539 +aI-74 +aI624 +aI-147 +aI587 +aI-104 +aa(lp17508 +g15 +aI386 +aI-28 +aI490 +aI-43 +aI440 +aI-28 +aa(lp17509 +g15 +aI281 +aI-53 +aI347 +aI-28 +aI312 +aI-37 +aa(lp17510 +g15 +aI205 +aI-116 +aI250 +aI-70 +aI225 +aI-90 +aa(lp17511 +g20 +aI205 +aI220 +aa(lp17512 +g10 +aa(lp17513 +g8 +aI194 +aI-386 +aa(lp17514 +g15 +aI248 +aI-188 +aI194 +aI-297 +aI212 +aI-231 +aa(lp17515 +g15 +aI378 +aI-125 +aI284 +aI-146 +aI327 +aI-125 +aa(lp17516 +g15 +aI512 +aI-191 +aI430 +aI-125 +aI475 +aI-147 +aa(lp17517 +g15 +aI568 +aI-396 +aI549 +aI-235 +aI568 +aI-303 +aa(lp17518 +g15 +aI513 +aI-593 +aI568 +aI-484 +aI550 +aI-550 +aa(lp17519 +g15 +aI384 +aI-659 +aI477 +aI-637 +aI434 +aI-659 +aa(lp17520 +g15 +aI251 +aI-589 +aI334 +aI-659 +aI290 +aI-636 +aa(lp17521 +g15 +aI194 +aI-386 +aI213 +aI-543 +aI194 +aI-475 +aa(lp17522 +g10 +aa(lp17523 +g8 +aI741 +aI-44 +aa(lp17524 +g10 +aa(lp17525 +g8 +aI741 +aI-44 +aasVt +(lp17526 +(lp17527 +g8 +aI343 +aI-149 +aa(lp17528 +g20 +aI360 +aI-45 +aa(lp17529 +g15 +aI272 +aI-35 +aI327 +aI-38 +aI298 +aI-35 +aa(lp17530 +g15 +aI173 +aI-55 +aI229 +aI-35 +aI196 +aI-42 +aa(lp17531 +g15 +aI123 +aI-108 +aI149 +aI-68 +aI133 +aI-86 +aa(lp17532 +g15 +aI109 +aI-246 +aI114 +aI-130 +aI109 +aI-176 +aa(lp17533 +g20 +aI109 +aI-644 +aa(lp17534 +g20 +aI23 +aI-644 +aa(lp17535 +g20 +aI23 +aI-735 +aa(lp17536 +g20 +aI109 +aI-735 +aa(lp17537 +g20 +aI109 +aI-907 +aa(lp17538 +g20 +aI225 +aI-977 +aa(lp17539 +g20 +aI225 +aI-735 +aa(lp17540 +g20 +aI343 +aI-735 +aa(lp17541 +g20 +aI343 +aI-644 +aa(lp17542 +g20 +aI225 +aI-644 +aa(lp17543 +g20 +aI225 +aI-240 +aa(lp17544 +g15 +aI232 +aI-175 +aI225 +aI-206 +aI227 +aI-185 +aa(lp17545 +g15 +aI252 +aI-153 +aI236 +aI-166 +aI242 +aI-158 +aa(lp17546 +g15 +aI292 +aI-144 +aI261 +aI-147 +aI274 +aI-144 +aa(lp17547 +g15 +aI343 +aI-149 +aI305 +aI-144 +aI322 +aI-146 +aa(lp17548 +g10 +aa(lp17549 +g8 +aI370 +aI-44 +aa(lp17550 +g10 +aa(lp17551 +g8 +aI370 +aI-44 +aasVx +(lp17552 +(lp17553 +g8 +aI9 +aI-44 +aa(lp17554 +g20 +aI262 +aI-403 +aa(lp17555 +g20 +aI28 +aI-735 +aa(lp17556 +g20 +aI175 +aI-735 +aa(lp17557 +g20 +aI281 +aI-573 +aa(lp17558 +g15 +aI329 +aI-496 +aI301 +aI-542 +aI317 +aI-517 +aa(lp17559 +g15 +aI382 +aI-572 +aI348 +aI-524 +aI366 +aI-550 +aa(lp17560 +g20 +aI498 +aI-735 +aa(lp17561 +g20 +aI638 +aI-735 +aa(lp17562 +g20 +aI399 +aI-410 +aa(lp17563 +g20 +aI656 +aI-44 +aa(lp17564 +g20 +aI513 +aI-44 +aa(lp17565 +g20 +aI371 +aI-259 +aa(lp17566 +g20 +aI333 +aI-317 +aa(lp17567 +g20 +aI151 +aI-44 +aa(lp17568 +g10 +aa(lp17569 +g8 +aI666 +aI-44 +aa(lp17570 +g10 +aa(lp17571 +g8 +aI666 +aI-44 +aasV| +(lp17572 +(lp17573 +g8 +aI122 +aI236 +aa(lp17574 +g20 +aI122 +aI-1015 +aa(lp17575 +g20 +aI224 +aI-1015 +aa(lp17576 +g20 +aI224 +aI236 +aa(lp17577 +g10 +aa(lp17578 +g8 +aI346 +aI-44 +aa(lp17579 +g10 +aa(lp17580 +g8 +aI346 +aI-44 +aasV# +(lp17581 +(lp17582 +g8 +aI67 +aI-28 +aa(lp17583 +g20 +aI123 +aI-305 +aa(lp17584 +g20 +aI13 +aI-305 +aa(lp17585 +g20 +aI13 +aI-402 +aa(lp17586 +g20 +aI143 +aI-402 +aa(lp17587 +g20 +aI191 +aI-638 +aa(lp17588 +g20 +aI13 +aI-638 +aa(lp17589 +g20 +aI13 +aI-735 +aa(lp17590 +g20 +aI210 +aI-735 +aa(lp17591 +g20 +aI267 +aI-1015 +aa(lp17592 +g20 +aI365 +aI-1015 +aa(lp17593 +g20 +aI308 +aI-735 +aa(lp17594 +g20 +aI513 +aI-735 +aa(lp17595 +g20 +aI570 +aI-1015 +aa(lp17596 +g20 +aI668 +aI-1015 +aa(lp17597 +g20 +aI611 +aI-735 +aa(lp17598 +g20 +aI724 +aI-735 +aa(lp17599 +g20 +aI724 +aI-638 +aa(lp17600 +g20 +aI592 +aI-638 +aa(lp17601 +g20 +aI543 +aI-402 +aa(lp17602 +g20 +aI724 +aI-402 +aa(lp17603 +g20 +aI724 +aI-305 +aa(lp17604 +g20 +aI524 +aI-305 +aa(lp17605 +g20 +aI467 +aI-28 +aa(lp17606 +g20 +aI369 +aI-28 +aa(lp17607 +g20 +aI425 +aI-305 +aa(lp17608 +g20 +aI221 +aI-305 +aa(lp17609 +g20 +aI164 +aI-28 +aa(lp17610 +g10 +aa(lp17611 +g8 +aI240 +aI-402 +aa(lp17612 +g20 +aI445 +aI-402 +aa(lp17613 +g20 +aI494 +aI-638 +aa(lp17614 +g20 +aI289 +aI-638 +aa(lp17615 +g10 +aa(lp17616 +g8 +aI741 +aI-44 +aa(lp17617 +g10 +aa(lp17618 +g8 +aI741 +aI-44 +aasV' +(lp17619 +(lp17620 +g8 +aI88 +aI-660 +aa(lp17621 +g20 +aI58 +aI-839 +aa(lp17622 +g20 +aI58 +aI-998 +aa(lp17623 +g20 +aI192 +aI-998 +aa(lp17624 +g20 +aI192 +aI-839 +aa(lp17625 +g20 +aI160 +aI-660 +aa(lp17626 +g10 +aa(lp17627 +g8 +aI254 +aI-44 +aa(lp17628 +g10 +aa(lp17629 +g8 +aI254 +aI-44 +aasV+ +(lp17630 +(lp17631 +g8 +aI333 +aI-198 +aa(lp17632 +g20 +aI333 +aI-460 +aa(lp17633 +g20 +aI74 +aI-460 +aa(lp17634 +g20 +aI74 +aI-569 +aa(lp17635 +g20 +aI333 +aI-569 +aa(lp17636 +g20 +aI333 +aI-829 +aa(lp17637 +g20 +aI444 +aI-829 +aa(lp17638 +g20 +aI444 +aI-569 +aa(lp17639 +g20 +aI704 +aI-569 +aa(lp17640 +g20 +aI704 +aI-460 +aa(lp17641 +g20 +aI444 +aI-460 +aa(lp17642 +g20 +aI444 +aI-198 +aa(lp17643 +g10 +aa(lp17644 +g8 +aI778 +aI-44 +aa(lp17645 +g10 +aa(lp17646 +g8 +aI778 +aI-44 +aasV/ +(lp17647 +(lp17648 +g8 +aI0 +aI-28 +aa(lp17649 +g20 +aI276 +aI-1015 +aa(lp17650 +g20 +aI370 +aI-1015 +aa(lp17651 +g20 +aI94 +aI-28 +aa(lp17652 +g10 +aa(lp17653 +g8 +aI370 +aI-44 +aa(lp17654 +g10 +aa(lp17655 +g8 +aI370 +aI-44 +aasV3 +(lp17656 +(lp17657 +g8 +aI55 +aI-296 +aa(lp17658 +g20 +aI173 +aI-312 +aa(lp17659 +g15 +aI241 +aI-168 +aI186 +aI-245 +aI209 +aI-197 +aa(lp17660 +g15 +aI360 +aI-124 +aI274 +aI-139 +aI313 +aI-124 +aa(lp17661 +g15 +aI499 +aI-181 +aI415 +aI-124 +aI461 +aI-143 +aa(lp17662 +g15 +aI556 +aI-323 +aI537 +aI-220 +aI556 +aI-267 +aa(lp17663 +g15 +aI503 +aI-456 +aI556 +aI-377 +aI539 +aI-421 +aa(lp17664 +g15 +aI369 +aI-509 +aI468 +aI-491 +aI424 +aI-509 +aa(lp17665 +g15 +aI287 +aI-496 +aI347 +aI-509 +aI320 +aI-504 +aa(lp17666 +g20 +aI300 +aI-599 +aa(lp17667 +g15 +aI319 +aI-597 +aI307 +aI-598 +aI314 +aI-597 +aa(lp17668 +g15 +aI453 +aI-636 +aI368 +aI-597 +aI413 +aI-610 +aa(lp17669 +g15 +aI513 +aI-757 +aI493 +aI-662 +aI513 +aI-703 +aa(lp17670 +g15 +aI470 +aI-864 +aI513 +aI-800 +aI499 +aI-835 +aa(lp17671 +g15 +aI357 +aI-906 +aI440 +aI-892 +aI403 +aI-906 +aa(lp17672 +g15 +aI243 +aI-863 +aI311 +aI-906 +aI273 +aI-892 +aa(lp17673 +g15 +aI184 +aI-734 +aI213 +aI-834 +aI193 +aI-791 +aa(lp17674 +g20 +aI67 +aI-755 +aa(lp17675 +g15 +aI165 +aI-938 +aI82 +aI-833 +aI114 +aI-894 +aa(lp17676 +g15 +aI354 +aI-1002 +aI216 +aI-981 +aI279 +aI-1002 +aa(lp17677 +g15 +aI498 +aI-969 +aI406 +aI-1002 +aI454 +aI-991 +aa(lp17678 +g15 +aI599 +aI-877 +aI542 +aI-946 +aI576 +aI-916 +aa(lp17679 +g15 +aI634 +aI-754 +aI622 +aI-839 +aI634 +aI-798 +aa(lp17680 +g15 +aI600 +aI-642 +aI634 +aI-713 +aI623 +aI-675 +aa(lp17681 +g15 +aI502 +aI-561 +aI578 +aI-608 +aI546 +aI-581 +aa(lp17682 +g15 +aI634 +aI-480 +aI559 +aI-548 +aI602 +aI-521 +aa(lp17683 +g15 +aI680 +aI-326 +aI665 +aI-439 +aI680 +aI-387 +aa(lp17684 +g15 +aI589 +aI-114 +aI680 +aI-243 +aI650 +aI-172 +aa(lp17685 +g15 +aI359 +aI-27 +aI529 +aI-56 +aI452 +aI-27 +aa(lp17686 +g15 +aI150 +aI-102 +aI275 +aI-27 +aI206 +aI-52 +aa(lp17687 +g15 +aI55 +aI-296 +aI95 +aI-152 +aI63 +aI-216 +aa(lp17688 +g10 +aa(lp17689 +g8 +aI741 +aI-44 +aa(lp17690 +g10 +aa(lp17691 +g8 +aI741 +aI-44 +aasV7 +(lp17692 +(lp17693 +g8 +aI63 +aI-873 +aa(lp17694 +g20 +aI63 +aI-986 +aa(lp17695 +g20 +aI680 +aI-986 +aa(lp17696 +g20 +aI680 +aI-895 +aa(lp17697 +g15 +aI500 +aI-637 +aI620 +aI-830 +aI560 +aI-744 +aa(lp17698 +g15 +aI361 +aI-306 +aI440 +aI-530 +aI394 +aI-420 +aa(lp17699 +g15 +aI317 +aI-44 +aI338 +aI-226 +aI323 +aI-139 +aa(lp17700 +g20 +aI196 +aI-44 +aa(lp17701 +g15 +aI240 +aI-316 +aI197 +aI-119 +aI212 +aI-210 +aa(lp17702 +g15 +aI362 +aI-624 +aI269 +aI-422 +aI309 +aI-525 +aa(lp17703 +g15 +aI530 +aI-873 +aI415 +aI-722 +aI471 +aI-806 +aa(lp17704 +g10 +aa(lp17705 +g8 +aI741 +aI-44 +aa(lp17706 +g10 +aa(lp17707 +g8 +aI741 +aI-44 +aasV; +(lp17708 +(lp17709 +g8 +aI118 +aI-602 +aa(lp17710 +g20 +aI118 +aI-735 +aa(lp17711 +g20 +aI251 +aI-735 +aa(lp17712 +g20 +aI251 +aI-602 +aa(lp17713 +g10 +aa(lp17714 +g8 +aI118 +aI-44 +aa(lp17715 +g20 +aI118 +aI-177 +aa(lp17716 +g20 +aI251 +aI-177 +aa(lp17717 +g20 +aI251 +aI-44 +aa(lp17718 +g15 +aI225 +aI74 +aI251 +aI4 +aI243 +aI44 +aa(lp17719 +g15 +aI143 +aI144 +aI208 +aI104 +aI180 +aI127 +aa(lp17720 +g20 +aI110 +aI94 +aa(lp17721 +g15 +aI165 +aI46 +aI135 +aI83 +aI153 +aI67 +aa(lp17722 +g15 +aI184 +aI-44 +aI177 +aI25 +aI183 +aI-4 +aa(lp17723 +g10 +aa(lp17724 +g8 +aI370 +aI-44 +aa(lp17725 +g10 +aa(lp17726 +g8 +aI370 +aI-44 +aasV? +(lp17727 +(lp17728 +g8 +aI307 +aI-279 +aa(lp17729 +g15 +aI306 +aI-314 +aI306 +aI-295 +aI306 +aI-306 +aa(lp17730 +g15 +aI326 +aI-433 +aI306 +aI-360 +aI313 +aI-400 +aa(lp17731 +g15 +aI372 +aI-509 +aI335 +aI-458 +aI351 +aI-484 +aa(lp17732 +g15 +aI456 +aI-591 +aI388 +aI-528 +aI416 +aI-555 +aa(lp17733 +g15 +aI535 +aI-677 +aI497 +aI-627 +aI523 +aI-655 +aa(lp17734 +g15 +aI554 +aI-746 +aI547 +aI-698 +aI554 +aI-721 +aa(lp17735 +g15 +aI500 +aI-867 +aI554 +aI-792 +aI536 +aI-832 +aa(lp17736 +g15 +aI369 +aI-918 +aI465 +aI-901 +aI421 +aI-918 +aa(lp17737 +g15 +aI244 +aI-871 +aI319 +aI-918 +aI278 +aI-903 +aa(lp17738 +g15 +aI179 +aI-725 +aI211 +aI-840 +aI189 +aI-791 +aa(lp17739 +g20 +aI58 +aI-739 +aa(lp17740 +g15 +aI155 +aI-944 +aI69 +aI-828 +aI101 +aI-896 +aa(lp17741 +g15 +aI367 +aI-1015 +aI208 +aI-991 +aI279 +aI-1015 +aa(lp17742 +g15 +aI591 +aI-938 +aI461 +aI-1015 +aI535 +aI-989 +aa(lp17743 +g15 +aI674 +aI-754 +aI646 +aI-888 +aI674 +aI-826 +aa(lp17744 +g15 +aI645 +aI-639 +aI674 +aI-713 +aI664 +aI-674 +aa(lp17745 +g15 +aI530 +aI-511 +aI625 +aI-604 +aI587 +aI-561 +aa(lp17746 +g15 +aI455 +aI-436 +aI492 +aI-477 +aI467 +aI-452 +aa(lp17747 +g15 +aI429 +aI-381 +aI444 +aI-420 +aI435 +aI-401 +aa(lp17748 +g15 +aI419 +aI-279 +aI424 +aI-360 +aI420 +aI-326 +aa(lp17749 +g10 +aa(lp17750 +g8 +aI300 +aI-44 +aa(lp17751 +g20 +aI300 +aI-177 +aa(lp17752 +g20 +aI433 +aI-177 +aa(lp17753 +g20 +aI433 +aI-44 +aa(lp17754 +g10 +aa(lp17755 +g8 +aI741 +aI-44 +aa(lp17756 +g10 +aa(lp17757 +g8 +aI741 +aI-44 +aasVC +(lp17758 +(lp17759 +g8 +aI783 +aI-379 +aa(lp17760 +g20 +aI910 +aI-347 +aa(lp17761 +g15 +aI767 +aI-109 +aI883 +aI-243 +aI836 +aI-164 +aa(lp17762 +g15 +aI514 +aI-28 +aI698 +aI-55 +aI614 +aI-28 +aa(lp17763 +g15 +aI263 +aI-90 +aI412 +aI-28 +aI328 +aI-49 +aa(lp17764 +g15 +aI116 +aI-272 +aI199 +aI-132 +aI150 +aI-193 +aa(lp17765 +g15 +aI66 +aI-528 +aI83 +aI-352 +aI66 +aI-437 +aa(lp17766 +g15 +aI123 +aI-788 +aI66 +aI-628 +aI85 +aI-714 +aa(lp17767 +g15 +aI285 +aI-957 +aI161 +aI-862 +aI215 +aI-919 +aa(lp17768 +g15 +aI516 +aI-1015 +aI355 +aI-995 +aI432 +aI-1015 +aa(lp17769 +g15 +aI757 +aI-942 +aI612 +aI-1015 +aI692 +aI-990 +aa(lp17770 +g15 +aI893 +aI-737 +aI822 +aI-893 +aI868 +aI-825 +aa(lp17771 +g20 +aI769 +aI-707 +aa(lp17772 +g15 +aI673 +aI-859 +aI747 +aI-777 +aI715 +aI-827 +aa(lp17773 +g15 +aI514 +aI-907 +aI631 +aI-891 +aI578 +aI-907 +aa(lp17774 +g15 +aI330 +aI-854 +aI440 +aI-907 +aI379 +aI-889 +aa(lp17775 +g15 +aI226 +aI-712 +aI281 +aI-819 +aI246 +aI-771 +aa(lp17776 +g15 +aI196 +aI-529 +aI206 +aI-653 +aI196 +aI-592 +aa(lp17777 +g15 +aI232 +aI-316 +aI196 +aI-448 +aI208 +aI-377 +aa(lp17778 +g15 +aI342 +aI-181 +aI255 +aI-256 +aI292 +aI-211 +aa(lp17779 +g15 +aI504 +aI-136 +aI392 +aI-151 +aI446 +aI-136 +aa(lp17780 +g15 +aI684 +aI-197 +aI575 +aI-136 +aI635 +aI-156 +aa(lp17781 +g15 +aI783 +aI-379 +aI733 +aI-238 +aI766 +aI-298 +aa(lp17782 +g10 +aa(lp17783 +g8 +aI962 +aI-44 +aa(lp17784 +g10 +aa(lp17785 +g8 +aI962 +aI-44 +aasVG +(lp17786 +(lp17787 +g8 +aI549 +aI-418 +aa(lp17788 +g20 +aI549 +aI-530 +aa(lp17789 +g20 +aI953 +aI-531 +aa(lp17790 +g20 +aI953 +aI-177 +aa(lp17791 +g15 +aI761 +aI-65 +aI891 +aI-127 +aI827 +aI-90 +aa(lp17792 +g15 +aI558 +aI-28 +aI695 +aI-40 +aI628 +aI-28 +aa(lp17793 +g15 +aI303 +aI-88 +aI464 +aI-28 +aI379 +aI-48 +aa(lp17794 +g15 +aI129 +aI-262 +aI226 +aI-128 +aI168 +aI-186 +aa(lp17795 +g15 +aI70 +aI-517 +aI90 +aI-338 +aI70 +aI-423 +aa(lp17796 +g15 +aI129 +aI-777 +aI70 +aI-609 +aI90 +aI-696 +aa(lp17797 +g15 +aI296 +aI-956 +aI168 +aI-857 +aI223 +aI-917 +aa(lp17798 +g15 +aI548 +aI-1015 +aI369 +aI-995 +aI453 +aI-1015 +aa(lp17799 +g15 +aI736 +aI-981 +aI617 +aI-1015 +aI680 +aI-1003 +aa(lp17800 +g15 +aI867 +aI-888 +aI791 +aI-959 +aI835 +aI-928 +aa(lp17801 +g15 +aI939 +aI-731 +aI898 +aI-848 +aI922 +aI-796 +aa(lp17802 +g20 +aI825 +aI-700 +aa(lp17803 +g15 +aI772 +aI-815 +aI811 +aI-749 +aI793 +aI-787 +aa(lp17804 +g15 +aI680 +aI-882 +aI750 +aI-843 +aI720 +aI-865 +aa(lp17805 +g15 +aI549 +aI-907 +aI641 +aI-898 +aI597 +aI-907 +aa(lp17806 +g15 +aI399 +aI-880 +aI491 +aI-907 +aI441 +aI-898 +aa(lp17807 +g15 +aI297 +aI-811 +aI357 +aI-863 +aI323 +aI-840 +aa(lp17808 +g15 +aI237 +aI-716 +aI272 +aI-782 +aI251 +aI-751 +aa(lp17809 +g15 +aI201 +aI-524 +aI213 +aI-657 +aI201 +aI-593 +aa(lp17810 +g15 +aI245 +aI-311 +aI201 +aI-439 +aI215 +aI-368 +aa(lp17811 +g15 +aI373 +aI-183 +aI274 +aI-254 +aI317 +aI-211 +aa(lp17812 +g15 +aI551 +aI-142 +aI429 +aI-155 +aI488 +aI-142 +aa(lp17813 +g15 +aI711 +aI-173 +aI606 +aI-142 +aI659 +aI-152 +aa(lp17814 +g15 +aI830 +aI-241 +aI763 +aI-194 +aI803 +aI-217 +aa(lp17815 +g20 +aI830 +aI-418 +aa(lp17816 +g10 +aa(lp17817 +g8 +aI1037 +aI-44 +aa(lp17818 +g10 +aa(lp17819 +g8 +aI1037 +aI-44 +aasVK +(lp17820 +(lp17821 +g8 +aI97 +aI-44 +aa(lp17822 +g20 +aI97 +aI-998 +aa(lp17823 +g20 +aI223 +aI-998 +aa(lp17824 +g20 +aI223 +aI-525 +aa(lp17825 +g20 +aI697 +aI-998 +aa(lp17826 +g20 +aI869 +aI-998 +aa(lp17827 +g20 +aI468 +aI-612 +aa(lp17828 +g20 +aI886 +aI-44 +aa(lp17829 +g20 +aI720 +aI-44 +aa(lp17830 +g20 +aI380 +aI-527 +aa(lp17831 +g20 +aI223 +aI-375 +aa(lp17832 +g20 +aI223 +aI-44 +aa(lp17833 +g10 +aa(lp17834 +g8 +aI889 +aI-44 +aa(lp17835 +g10 +aa(lp17836 +g8 +aI889 +aI-44 +aasVO +(lp17837 +(lp17838 +g8 +aI64 +aI-509 +aa(lp17839 +g15 +aI192 +aI-881 +aI64 +aI-667 +aI106 +aI-791 +aa(lp17840 +g15 +aI521 +aI-1015 +aI277 +aI-970 +aI386 +aI-1015 +aa(lp17841 +g15 +aI759 +aI-952 +aI609 +aI-1015 +aI689 +aI-994 +aa(lp17842 +g15 +aI921 +aI-776 +aI830 +aI-910 +aI884 +aI-851 +aa(lp17843 +g15 +aI977 +aI-520 +aI958 +aI-701 +aI977 +aI-615 +aa(lp17844 +g15 +aI918 +aI-260 +aI977 +aI-423 +aI957 +aI-336 +aa(lp17845 +g15 +aI752 +aI-87 +aI879 +aI-184 +aI824 +aI-126 +aa(lp17846 +g15 +aI520 +aI-28 +aI680 +aI-47 +aI603 +aI-28 +aa(lp17847 +g15 +aI279 +aI-93 +aI430 +aI-28 +aI350 +aI-49 +aa(lp17848 +g15 +aI119 +aI-271 +aI209 +aI-136 +aI155 +aI-195 +aa(lp17849 +g15 +aI64 +aI-509 +aI82 +aI-346 +aI64 +aI-425 +aa(lp17850 +g10 +aa(lp17851 +g8 +aI194 +aI-507 +aa(lp17852 +g15 +aI287 +aI-235 +aI194 +aI-392 +aI225 +aI-301 +aa(lp17853 +g15 +aI520 +aI-136 +aI349 +aI-169 +aI426 +aI-136 +aa(lp17854 +g15 +aI754 +aI-236 +aI615 +aI-136 +aI693 +aI-169 +aa(lp17855 +g15 +aI847 +aI-521 +aI816 +aI-303 +aI847 +aI-398 +aa(lp17856 +g15 +aI807 +aI-724 +aI847 +aI-598 +aI833 +aI-666 +aa(lp17857 +g15 +aI692 +aI-859 +aI781 +aI-782 +aI742 +aI-827 +aa(lp17858 +g15 +aI522 +aI-907 +aI641 +aI-891 +aI585 +aI-907 +aa(lp17859 +g15 +aI291 +aI-814 +aI432 +aI-907 +aI355 +aI-876 +aa(lp17860 +g15 +aI194 +aI-507 +aI226 +aI-753 +aI194 +aI-651 +aa(lp17861 +g10 +aa(lp17862 +g8 +aI1037 +aI-44 +aa(lp17863 +g10 +aa(lp17864 +g8 +aI1037 +aI-44 +aasVS +(lp17865 +(lp17866 +g8 +aI59 +aI-351 +aa(lp17867 +g20 +aI179 +aI-361 +aa(lp17868 +g15 +aI218 +aI-243 +aI184 +aI-313 +aI197 +aI-274 +aa(lp17869 +g15 +aI314 +aI-169 +aI239 +aI-213 +aI271 +aI-188 +aa(lp17870 +g15 +aI460 +aI-141 +aI357 +aI-150 +aI406 +aI-141 +aa(lp17871 +g15 +aI588 +aI-162 +aI509 +aI-141 +aI551 +aI-148 +aa(lp17872 +g15 +aI670 +aI-221 +aI625 +aI-177 +aI652 +aI-196 +aa(lp17873 +g15 +aI697 +aI-303 +aI688 +aI-246 +aI697 +aI-274 +aa(lp17874 +g15 +aI671 +aI-382 +aI697 +aI-333 +aI689 +aI-359 +aa(lp17875 +g15 +aI585 +aI-438 +aI654 +aI-404 +aI625 +aI-423 +aa(lp17876 +g15 +aI416 +aI-484 +aI560 +aI-448 +aI503 +aI-463 +aa(lp17877 +g15 +aI231 +aI-544 +aI328 +aI-505 +aI266 +aI-525 +aa(lp17878 +g15 +aI129 +aI-633 +aI186 +aI-568 +aI152 +aI-597 +aa(lp17879 +g15 +aI96 +aI-752 +aI107 +aI-668 +aI96 +aI-708 +aa(lp17880 +g15 +aI137 +aI-887 +aI96 +aI-800 +aI110 +aI-845 +aa(lp17881 +g15 +aI257 +aI-982 +aI164 +aI-929 +aI204 +aI-960 +aa(lp17882 +g15 +aI432 +aI-1015 +aI309 +aI-1004 +aI368 +aI-1015 +aa(lp17883 +g15 +aI619 +aI-980 +aI503 +aI-1015 +aI565 +aI-1003 +aa(lp17884 +g15 +aI744 +aI-880 +aI673 +aI-958 +aI715 +aI-924 +aa(lp17885 +g15 +aI791 +aI-729 +aI773 +aI-836 +aI788 +aI-785 +aa(lp17886 +g20 +aI669 +aI-720 +aa(lp17887 +g15 +aI603 +aI-857 +aI663 +aI-781 +aI641 +aI-826 +aa(lp17888 +g15 +aI437 +aI-903 +aI566 +aI-888 +aI510 +aI-903 +aa(lp17889 +g15 +aI270 +aI-861 +aI361 +aI-903 +aI305 +aI-889 +aa(lp17890 +g15 +aI218 +aI-760 +aI235 +aI-833 +aI218 +aI-800 +aa(lp17891 +g15 +aI255 +aI-675 +aI218 +aI-726 +aI230 +aI-698 +aa(lp17892 +g15 +aI445 +aI-607 +aI279 +aI-653 +aI342 +aI-631 +aa(lp17893 +g15 +aI656 +aI-547 +aI548 +aI-584 +aI618 +aI-564 +aa(lp17894 +g15 +aI779 +aI-449 +aI712 +aI-521 +aI753 +aI-489 +aa(lp17895 +g15 +aI819 +aI-313 +aI806 +aI-410 +aI819 +aI-365 +aa(lp17896 +g15 +aI776 +aI-170 +aI819 +aI-263 +aI805 +aI-215 +aa(lp17897 +g15 +aI650 +aI-65 +aI746 +aI-125 +aI705 +aI-90 +aa(lp17898 +g15 +aI466 +aI-28 +aI596 +aI-40 +aI534 +aI-28 +aa(lp17899 +g15 +aI249 +aI-65 +aI380 +aI-28 +aI308 +aI-40 +aa(lp17900 +g15 +aI112 +aI-179 +aI191 +aI-91 +aI145 +aI-128 +aa(lp17901 +g15 +aI59 +aI-351 +aI79 +aI-230 +aI61 +aI-287 +aa(lp17902 +g10 +aa(lp17903 +g8 +aI889 +aI-44 +aa(lp17904 +g10 +aa(lp17905 +g8 +aI889 +aI-44 +aasVW +(lp17906 +(lp17907 +g8 +aI269 +aI-44 +aa(lp17908 +g20 +aI16 +aI-998 +aa(lp17909 +g20 +aI145 +aI-998 +aa(lp17910 +g20 +aI291 +aI-373 +aa(lp17911 +g15 +aI331 +aI-177 +aI306 +aI-307 +aI320 +aI-242 +aa(lp17912 +g15 +aI374 +aI-354 +aI355 +aI-279 +aI370 +aI-338 +aa(lp17913 +g20 +aI555 +aI-998 +aa(lp17914 +g20 +aI708 +aI-998 +aa(lp17915 +g20 +aI845 +aI-515 +aa(lp17916 +g15 +aI919 +aI-177 +aI879 +aI-396 +aI904 +aI-283 +aa(lp17917 +g15 +aI966 +aI-385 +aI931 +aI-238 +aI947 +aI-307 +aa(lp17918 +g20 +aI1116 +aI-998 +aa(lp17919 +g20 +aI1243 +aI-998 +aa(lp17920 +g20 +aI981 +aI-44 +aa(lp17921 +g20 +aI860 +aI-44 +aa(lp17922 +g20 +aI658 +aI-771 +aa(lp17923 +g15 +aI628 +aI-883 +aI641 +aI-832 +aI631 +aI-869 +aa(lp17924 +g15 +aI600 +aI-771 +aI618 +aI-839 +aI609 +aI-802 +aa(lp17925 +g20 +aI398 +aI-44 +aa(lp17926 +g10 +aa(lp17927 +g8 +aI1258 +aI-44 +aa(lp17928 +g10 +aa(lp17929 +g8 +aI1258 +aI-44 +aasV[ +(lp17930 +(lp17931 +g8 +aI90 +aI220 +aa(lp17932 +g20 +aI90 +aI-998 +aa(lp17933 +g20 +aI348 +aI-998 +aa(lp17934 +g20 +aI348 +aI-901 +aa(lp17935 +g20 +aI207 +aI-901 +aa(lp17936 +g20 +aI207 +aI123 +aa(lp17937 +g20 +aI348 +aI123 +aa(lp17938 +g20 +aI348 +aI220 +aa(lp17939 +g10 +aa(lp17940 +g8 +aI370 +aI-44 +aa(lp17941 +g10 +aa(lp17942 +g8 +aI370 +aI-44 +aasV_ +(lp17943 +(lp17944 +g8 +aI-20 +aI220 +aa(lp17945 +g20 +aI-20 +aI135 +aa(lp17946 +g20 +aI756 +aI135 +aa(lp17947 +g20 +aI756 +aI220 +aa(lp17948 +g10 +aa(lp17949 +g8 +aI741 +aI-44 +aa(lp17950 +g10 +aa(lp17951 +g8 +aI741 +aI-44 +aasVc +(lp17952 +(lp17953 +g8 +aI539 +aI-297 +aa(lp17954 +g20 +aI654 +aI-282 +aa(lp17955 +g15 +aI557 +aI-96 +aI641 +aI-203 +aI609 +aI-141 +aa(lp17956 +g15 +aI366 +aI-28 +aI505 +aI-51 +aI442 +aI-28 +aa(lp17957 +g15 +aI138 +aI-121 +aI271 +aI-28 +aI195 +aI-59 +aa(lp17958 +g15 +aI52 +aI-387 +aI80 +aI-183 +aI52 +aI-272 +aa(lp17959 +g15 +aI89 +aI-583 +aI52 +aI-462 +aI64 +aI-527 +aa(lp17960 +g15 +aI202 +aI-709 +aI113 +aI-639 +aI151 +aI-681 +aa(lp17961 +g15 +aI367 +aI-751 +aI252 +aI-737 +aI307 +aI-751 +aa(lp17962 +g15 +aI551 +aI-694 +aI442 +aI-751 +aI503 +aI-732 +aa(lp17963 +g15 +aI643 +aI-532 +aI599 +aI-656 +aI629 +aI-602 +aa(lp17964 +g20 +aI529 +aI-515 +aa(lp17965 +g15 +aI471 +aI-619 +aI518 +aI-561 +aI499 +aI-596 +aa(lp17966 +g15 +aI371 +aI-655 +aI444 +aI-643 +aI410 +aI-655 +aa(lp17967 +g15 +aI227 +aI-591 +aI312 +aI-655 +aI264 +aI-633 +aa(lp17968 +g15 +aI172 +aI-390 +aI190 +aI-549 +aI172 +aI-482 +aa(lp17969 +g15 +aI225 +aI-188 +aI172 +aI-297 +aI190 +aI-230 +aa(lp17970 +g15 +aI365 +aI-125 +aI261 +aI-146 +aI307 +aI-125 +aa(lp17971 +g15 +aI480 +aI-167 +aI411 +aI-125 +aI449 +aI-139 +aa(lp17972 +g15 +aI539 +aI-297 +aI511 +aI-195 +aI530 +aI-239 +aa(lp17973 +g10 +aa(lp17974 +g8 +aI666 +aI-44 +aa(lp17975 +g10 +aa(lp17976 +g8 +aI666 +aI-44 +aasVg +(lp17977 +(lp17978 +g8 +aI66 +aI12 +aa(lp17979 +g20 +aI180 +aI29 +aa(lp17980 +g15 +aI220 +aI106 +aI185 +aI64 +aI198 +aI90 +aa(lp17981 +g15 +aI339 +aI139 +aI249 +aI128 +aI288 +aI139 +aa(lp17982 +g15 +aI464 +aI106 +aI393 +aI139 +aI435 +aI128 +aa(lp17983 +g15 +aI524 +aI15 +aI494 +aI84 +aI514 +aI54 +aa(lp17984 +g15 +aI533 +aI-134 +aI530 +aI-8 +aI533 +aI-58 +aa(lp17985 +g15 +aI341 +aI-44 +aI481 +aI-74 +aI418 +aI-44 +aa(lp17986 +g15 +aI121 +aI-147 +aI246 +aI-44 +aI173 +aI-78 +aa(lp17987 +g15 +aI42 +aI-394 +aI69 +aI-215 +aI42 +aI-298 +aa(lp17988 +g15 +aI78 +aI-576 +aI42 +aI-460 +aI54 +aI-520 +aa(lp17989 +g15 +aI182 +aI-705 +aI102 +aI-632 +aI137 +aI-675 +aa(lp17990 +g15 +aI342 +aI-751 +aI227 +aI-736 +aI281 +aI-751 +aa(lp17991 +g15 +aI544 +aI-652 +aI424 +aI-751 +aI491 +aI-718 +aa(lp17992 +g20 +aI544 +aI-735 +aa(lp17993 +g20 +aI652 +aI-735 +aa(lp17994 +g20 +aI652 +aI-138 +aa(lp17995 +g15 +aI619 +aI90 +aI652 +aI-30 +aI641 +aI45 +aa(lp17996 +g15 +aI515 +aI197 +aI597 +aI135 +aI562 +aI171 +aa(lp17997 +g15 +aI339 +aI236 +aI467 +aI223 +aI409 +aI236 +aa(lp17998 +g15 +aI139 +aI180 +aI257 +aI236 +aI190 +aI217 +aa(lp17999 +g15 +aI66 +aI12 +aI89 +aI143 +aI64 +aI87 +aa(lp18000 +g10 +aa(lp18001 +g8 +aI163 +aI-402 +aa(lp18002 +g15 +aI217 +aI-203 +aI163 +aI-311 +aI181 +aI-245 +aa(lp18003 +g15 +aI352 +aI-141 +aI253 +aI-162 +aI298 +aI-141 +aa(lp18004 +g15 +aI488 +aI-203 +aI406 +aI-141 +aI451 +aI-162 +aa(lp18005 +g15 +aI542 +aI-398 +aI524 +aI-245 +aI542 +aI-310 +aa(lp18006 +g15 +aI486 +aI-590 +aI542 +aI-483 +aI524 +aI-547 +aa(lp18007 +g15 +aI350 +aI-654 +aI449 +aI-632 +aI403 +aI-654 +aa(lp18008 +g15 +aI218 +aI-590 +aI298 +aI-654 +aI254 +aI-633 +aa(lp18009 +g15 +aI163 +aI-402 +aI181 +aI-548 +aI163 +aI-485 +aa(lp18010 +g10 +aa(lp18011 +g8 +aI741 +aI-44 +aa(lp18012 +g10 +aa(lp18013 +g8 +aI741 +aI-44 +aasVk +(lp18014 +(lp18015 +g8 +aI88 +aI-44 +aa(lp18016 +g20 +aI88 +aI-998 +aa(lp18017 +g20 +aI205 +aI-998 +aa(lp18018 +g20 +aI205 +aI-454 +aa(lp18019 +g20 +aI483 +aI-735 +aa(lp18020 +g20 +aI634 +aI-735 +aa(lp18021 +g20 +aI370 +aI-479 +aa(lp18022 +g20 +aI661 +aI-44 +aa(lp18023 +g20 +aI516 +aI-44 +aa(lp18024 +g20 +aI288 +aI-397 +aa(lp18025 +g20 +aI205 +aI-318 +aa(lp18026 +g20 +aI205 +aI-44 +aa(lp18027 +g10 +aa(lp18028 +g8 +aI666 +aI-44 +aa(lp18029 +g10 +aa(lp18030 +g8 +aI666 +aI-44 +aasVo +(lp18031 +(lp18032 +g8 +aI44 +aI-390 +aa(lp18033 +g15 +aI151 +aI-674 +aI44 +aI-518 +aI79 +aI-613 +aa(lp18034 +g15 +aI368 +aI-751 +aI210 +aI-725 +aI282 +aI-751 +aa(lp18035 +g15 +aI601 +aI-658 +aI463 +aI-751 +aI541 +aI-720 +aa(lp18036 +g15 +aI692 +aI-399 +aI661 +aI-595 +aI692 +aI-509 +aa(lp18037 +g15 +aI652 +aI-189 +aI692 +aI-310 +aI678 +aI-240 +aa(lp18038 +g15 +aI535 +aI-71 +aI625 +aI-138 +aI586 +aI-99 +aa(lp18039 +g15 +aI368 +aI-28 +aI484 +aI-42 +aI428 +aI-28 +aa(lp18040 +g15 +aI133 +aI-121 +aI271 +aI-28 +aI193 +aI-59 +aa(lp18041 +g15 +aI44 +aI-390 +aI74 +aI-183 +aI44 +aI-273 +aa(lp18042 +g10 +aa(lp18043 +g8 +aI164 +aI-390 +aa(lp18044 +g15 +aI222 +aI-191 +aI164 +aI-301 +aI184 +aI-235 +aa(lp18045 +g15 +aI368 +aI-125 +aI261 +aI-147 +aI309 +aI-125 +aa(lp18046 +g15 +aI513 +aI-191 +aI426 +aI-125 +aI475 +aI-147 +aa(lp18047 +g15 +aI571 +aI-394 +aI552 +aI-235 +aI571 +aI-303 +aa(lp18048 +g15 +aI513 +aI-588 +aI571 +aI-479 +aI552 +aI-544 +aa(lp18049 +g15 +aI368 +aI-654 +aI474 +aI-632 +aI426 +aI-654 +aa(lp18050 +g15 +aI222 +aI-588 +aI309 +aI-654 +aI261 +aI-632 +aa(lp18051 +g15 +aI164 +aI-390 +aI184 +aI-544 +aI164 +aI-478 +aa(lp18052 +g10 +aa(lp18053 +g8 +aI741 +aI-44 +aa(lp18054 +g10 +aa(lp18055 +g8 +aI741 +aI-44 +aasVs +(lp18056 +(lp18057 +g8 +aI41 +aI-250 +aa(lp18058 +g20 +aI156 +aI-269 +aa(lp18059 +g15 +aI211 +aI-162 +aI163 +aI-222 +aI181 +aI-187 +aa(lp18060 +g15 +aI335 +aI-125 +aI240 +aI-137 +aI282 +aI-125 +aa(lp18061 +g15 +aI455 +aI-158 +aI389 +aI-125 +aI429 +aI-136 +aa(lp18062 +g15 +aI494 +aI-235 +aI481 +aI-179 +aI494 +aI-205 +aa(lp18063 +g15 +aI460 +aI-297 +aI494 +aI-261 +aI483 +aI-282 +aa(lp18064 +g15 +aI340 +aI-337 +aI444 +aI-308 +aI404 +aI-321 +aa(lp18065 +g15 +aI161 +aI-393 +aI254 +aI-359 +aI194 +aI-377 +aa(lp18066 +g15 +aI86 +aI-459 +aI128 +aI-409 +aI103 +aI-431 +aa(lp18067 +g15 +aI60 +aI-552 +aI69 +aI-487 +aI60 +aI-518 +aa(lp18068 +g15 +aI81 +aI-637 +aI60 +aI-583 +aI67 +aI-611 +aa(lp18069 +g15 +aI139 +aI-703 +aI95 +aI-664 +aI115 +aI-685 +aa(lp18070 +g15 +aI213 +aI-737 +aI157 +aI-716 +aI182 +aI-728 +aa(lp18071 +g15 +aI315 +aI-751 +aI245 +aI-746 +aI279 +aI-751 +aa(lp18072 +g15 +aI458 +aI-728 +aI369 +aI-751 +aI416 +aI-743 +aa(lp18073 +g15 +aI548 +aI-664 +aI499 +aI-712 +aI529 +aI-691 +aa(lp18074 +g15 +aI589 +aI-557 +aI568 +aI-637 +aI581 +aI-602 +aa(lp18075 +g20 +aI474 +aI-541 +aa(lp18076 +g15 +aI429 +aI-625 +aI469 +aI-577 +aI454 +aI-605 +aa(lp18077 +g15 +aI323 +aI-655 +aI404 +aI-645 +aI369 +aI-655 +aa(lp18078 +g15 +aI208 +aI-628 +aI269 +aI-655 +aI231 +aI-646 +aa(lp18079 +g15 +aI173 +aI-565 +aI185 +aI-610 +aI173 +aI-589 +aa(lp18080 +g15 +aI188 +aI-524 +aI173 +aI-550 +aI178 +aI-537 +aa(lp18081 +g15 +aI233 +aI-493 +aI197 +aI-512 +aI212 +aI-501 +aa(lp18082 +g15 +aI336 +aI-463 +aI244 +aI-489 +aI279 +aI-479 +aa(lp18083 +g15 +aI510 +aI-409 +aI419 +aI-441 +aI477 +aI-423 +aa(lp18084 +g15 +aI587 +aI-347 +aI542 +aI-395 +aI568 +aI-374 +aa(lp18085 +g15 +aI615 +aI-247 +aI605 +aI-320 +aI615 +aI-287 +aa(lp18086 +g15 +aI581 +aI-137 +aI615 +aI-208 +aI603 +aI-171 +aa(lp18087 +g15 +aI482 +aI-57 +aI558 +aI-102 +aI525 +aI-76 +aa(lp18088 +g15 +aI336 +aI-28 +aI439 +aI-38 +aI390 +aI-28 +aa(lp18089 +g15 +aI131 +aI-84 +aI246 +aI-28 +aI178 +aI-47 +aa(lp18090 +g15 +aI41 +aI-250 +aI84 +aI-122 +aI54 +aI-177 +aa(lp18091 +g10 +aa(lp18092 +g8 +aI666 +aI-44 +aa(lp18093 +g10 +aa(lp18094 +g8 +aI666 +aI-44 +aasVw +(lp18095 +(lp18096 +g8 +aI215 +aI-44 +aa(lp18097 +g20 +aI3 +aI-735 +aa(lp18098 +g20 +aI125 +aI-735 +aa(lp18099 +g20 +aI235 +aI-336 +aa(lp18100 +g20 +aI276 +aI-188 +aa(lp18101 +g15 +aI311 +aI-330 +aI277 +aI-195 +aI289 +aI-243 +aa(lp18102 +g20 +aI421 +aI-735 +aa(lp18103 +g20 +aI542 +aI-735 +aa(lp18104 +g20 +aI645 +aI-334 +aa(lp18105 +g20 +aI680 +aI-202 +aa(lp18106 +g20 +aI720 +aI-336 +aa(lp18107 +g20 +aI838 +aI-735 +aa(lp18108 +g20 +aI952 +aI-735 +aa(lp18109 +g20 +aI736 +aI-44 +aa(lp18110 +g20 +aI614 +aI-44 +aa(lp18111 +g20 +aI504 +aI-458 +aa(lp18112 +g20 +aI477 +aI-576 +aa(lp18113 +g20 +aI337 +aI-44 +aa(lp18114 +g10 +aa(lp18115 +g8 +aI962 +aI-44 +aa(lp18116 +g10 +aa(lp18117 +g8 +aI962 +aI-44 +aasV{ +(lp18118 +(lp18119 +g8 +aI37 +aI-442 +aa(lp18120 +g15 +aI118 +aI-469 +aI70 +aI-443 +aI97 +aI-452 +aa(lp18121 +g15 +aI160 +aI-540 +aI139 +aI-487 +aI153 +aI-510 +aa(lp18122 +g15 +aI171 +aI-694 +aI167 +aI-570 +aI171 +aI-621 +aa(lp18123 +g15 +aI175 +aI-837 +aI172 +aI-766 +aI173 +aI-814 +aa(lp18124 +g15 +aI197 +aI-925 +aI179 +aI-873 +aI186 +aI-903 +aa(lp18125 +g15 +aI236 +aI-978 +aI208 +aI-947 +aI221 +aI-965 +aa(lp18126 +g15 +aI296 +aI-1008 +aI252 +aI-991 +aI272 +aI-1001 +aa(lp18127 +g15 +aI377 +aI-1015 +aI313 +aI-1012 +aI340 +aI-1015 +aa(lp18128 +g20 +aI414 +aI-1015 +aa(lp18129 +g20 +aI414 +aI-912 +aa(lp18130 +g20 +aI393 +aI-912 +aa(lp18131 +g15 +aI304 +aI-888 +aI348 +aI-912 +aI318 +aI-904 +aa(lp18132 +g15 +aI281 +aI-779 +aI289 +aI-872 +aI281 +aI-835 +aa(lp18133 +g15 +aI274 +aI-563 +aI281 +aI-665 +aI279 +aI-593 +aa(lp18134 +g15 +aI234 +aI-456 +aI266 +aI-517 +aI253 +aI-481 +aa(lp18135 +g15 +aI145 +aI-389 +aI215 +aI-431 +aI186 +aI-409 +aa(lp18136 +g15 +aI249 +aI-298 +aI193 +aI-369 +aI228 +aI-339 +aa(lp18137 +g15 +aI281 +aI-96 +aI271 +aI-257 +aI281 +aI-189 +aa(lp18138 +g15 +aI284 +aI54 +aI281 +aI-11 +aI282 +aI38 +aa(lp18139 +g15 +aI310 +aI116 +aI287 +aI84 +aI296 +aI104 +aa(lp18140 +g15 +aI393 +aI133 +aI324 +aI128 +aI352 +aI133 +aa(lp18141 +g20 +aI414 +aI133 +aa(lp18142 +g20 +aI414 +aI236 +aa(lp18143 +g20 +aI377 +aI236 +aa(lp18144 +g15 +aI285 +aI225 +aI335 +aI236 +aI304 +aI232 +aa(lp18145 +g15 +aI216 +aI177 +aI257 +aI215 +aI234 +aI199 +aa(lp18146 +g15 +aI180 +aI92 +aI197 +aI154 +aI186 +aI126 +aa(lp18147 +g15 +aI171 +aI-76 +aI175 +aI57 +aI172 +aI1 +aa(lp18148 +g15 +aI160 +aI-238 +aI171 +aI-154 +aI167 +aI-208 +aa(lp18149 +g15 +aI118 +aI-309 +aI153 +aI-268 +aI139 +aI-292 +aa(lp18150 +g15 +aI37 +aI-336 +aI97 +aI-326 +aI70 +aI-335 +aa(lp18151 +g10 +aa(lp18152 +g8 +aI445 +aI-44 +aa(lp18153 +g10 +aa(lp18154 +g8 +aI445 +aI-44 +aasV" +(lp18155 +(lp18156 +g8 +aI93 +aI-660 +aa(lp18157 +g20 +aI61 +aI-842 +aa(lp18158 +g20 +aI61 +aI-998 +aa(lp18159 +g20 +aI194 +aI-998 +aa(lp18160 +g20 +aI194 +aI-842 +aa(lp18161 +g20 +aI165 +aI-660 +aa(lp18162 +g10 +aa(lp18163 +g8 +aI309 +aI-660 +aa(lp18164 +g20 +aI277 +aI-842 +aa(lp18165 +g20 +aI277 +aI-998 +aa(lp18166 +g20 +aI410 +aI-998 +aa(lp18167 +g20 +aI410 +aI-842 +aa(lp18168 +g20 +aI379 +aI-660 +aa(lp18169 +g10 +aa(lp18170 +g8 +aI473 +aI-44 +aa(lp18171 +g10 +aa(lp18172 +g8 +aI473 +aI-44 +aasV& +(lp18173 +(lp18174 +g8 +aI633 +aI-157 +aa(lp18175 +g15 +aI507 +aI-60 +aI594 +aI-114 +aI552 +aI-81 +aa(lp18176 +g15 +aI359 +aI-28 +aI461 +aI-38 +aI412 +aI-28 +aa(lp18177 +g15 +aI126 +aI-127 +aI261 +aI-28 +aI184 +aI-61 +aa(lp18178 +g15 +aI57 +aI-307 +aI80 +aI-180 +aI57 +aI-241 +aa(lp18179 +g15 +aI114 +aI-467 +aI57 +aI-366 +aI76 +aI-419 +aa(lp18180 +g15 +aI284 +aI-592 +aI152 +aI-514 +aI208 +aI-556 +aa(lp18181 +g15 +aI198 +aI-713 +aI241 +aI-642 +aI212 +aI-682 +aa(lp18182 +g15 +aI177 +aI-802 +aI184 +aI-743 +aI177 +aI-773 +aa(lp18183 +g15 +aI244 +aI-951 +aI177 +aI-859 +aI199 +aI-909 +aa(lp18184 +g15 +aI414 +aI-1015 +aI289 +aI-993 +aI345 +aI-1015 +aa(lp18185 +g15 +aI573 +aI-955 +aI479 +aI-1015 +aI532 +aI-995 +aa(lp18186 +g15 +aI636 +aI-811 +aI615 +aI-915 +aI636 +aI-867 +aa(lp18187 +g15 +aI455 +aI-578 +aI636 +aI-720 +aI575 +aI-643 +aa(lp18188 +g20 +aI626 +aI-360 +aa(lp18189 +g15 +aI672 +aI-493 +aI646 +aI-399 +aI661 +aI-443 +aa(lp18190 +g20 +aI794 +aI-467 +aa(lp18191 +g15 +aI709 +aI-261 +aI773 +aI-384 +aI745 +aI-315 +aa(lp18192 +g15 +aI858 +aI-115 +aI753 +aI-203 +aI803 +aI-154 +aa(lp18193 +g20 +aI779 +aI-22 +aa(lp18194 +g15 +aI633 +aI-157 +aI732 +aI-52 +aI683 +aI-97 +aa(lp18195 +g10 +aa(lp18196 +g8 +aI395 +aI-654 +aa(lp18197 +g15 +aI493 +aI-733 +aI445 +aI-684 +aI478 +aI-710 +aa(lp18198 +g15 +aI516 +aI-808 +aI508 +aI-755 +aI516 +aI-780 +aa(lp18199 +g15 +aI485 +aI-887 +aI516 +aI-840 +aI505 +aI-867 +aa(lp18200 +g15 +aI408 +aI-918 +aI464 +aI-908 +aI439 +aI-918 +aa(lp18201 +g15 +aI329 +aI-888 +aI376 +aI-918 +aI350 +aI-908 +aa(lp18202 +g15 +aI297 +aI-813 +aI308 +aI-867 +aI297 +aI-842 +aa(lp18203 +g15 +aI308 +aI-766 +aI297 +aI-798 +aI301 +aI-783 +aa(lp18204 +g15 +aI343 +aI-715 +aI316 +aI-750 +aI327 +aI-733 +aa(lp18205 +g10 +aa(lp18206 +g8 +aI559 +aI-249 +aa(lp18207 +g20 +aI345 +aI-515 +aa(lp18208 +g15 +aI216 +aI-410 +aI281 +aI-478 +aI238 +aI-442 +aa(lp18209 +g15 +aI183 +aI-314 +aI194 +aI-378 +aI183 +aI-346 +aa(lp18210 +g15 +aI229 +aI-194 +aI183 +aI-276 +aI199 +aI-235 +aa(lp18211 +g15 +aI360 +aI-131 +aI260 +aI-152 +aI304 +aI-131 +aa(lp18212 +g15 +aI469 +aI-164 +aI395 +aI-131 +aI432 +aI-142 +aa(lp18213 +g15 +aI559 +aI-249 +aI507 +aI-186 +aI537 +aI-214 +aa(lp18214 +g10 +aa(lp18215 +g8 +aI889 +aI-44 +aa(lp18216 +g10 +aa(lp18217 +g8 +aI889 +aI-44 +aasV* +(lp18218 +(lp18219 +g8 +aI41 +aI-823 +aa(lp18220 +g20 +aI71 +aI-916 +aa(lp18221 +g15 +aI222 +aI-853 +aI140 +aI-891 +aI190 +aI-870 +aa(lp18222 +g15 +aI208 +aI-1015 +aI213 +aI-931 +aI209 +aI-985 +aa(lp18223 +g20 +aI303 +aI-1015 +aa(lp18224 +g15 +aI288 +aI-853 +aI302 +aI-972 +aI297 +aI-918 +aa(lp18225 +g15 +aI442 +aI-916 +aI333 +aI-876 +aI384 +aI-897 +aa(lp18226 +g20 +aI472 +aI-823 +aa(lp18227 +g15 +aI309 +aI-787 +aI416 +aI-805 +aI362 +aI-793 +aa(lp18228 +g15 +aI421 +aI-664 +aI336 +aI-764 +aI373 +aI-723 +aa(lp18229 +g20 +aI343 +aI-608 +aa(lp18230 +g15 +aI254 +aI-748 +aI318 +aI-643 +aI288 +aI-689 +aa(lp18231 +g15 +aI169 +aI-608 +aI222 +aI-687 +aI194 +aI-641 +aa(lp18232 +g20 +aI93 +aI-664 +aa(lp18233 +g15 +aI201 +aI-787 +aI143 +aI-726 +aI179 +aI-767 +aa(lp18234 +g15 +aI41 +aI-823 +aI145 +aI-798 +aI92 +aI-810 +aa(lp18235 +g10 +aa(lp18236 +g8 +aI518 +aI-44 +aa(lp18237 +g10 +aa(lp18238 +g8 +aI518 +aI-44 +aasV. +(lp18239 +(lp18240 +g8 +aI121 +aI-44 +aa(lp18241 +g20 +aI121 +aI-177 +aa(lp18242 +g20 +aI254 +aI-177 +aa(lp18243 +g20 +aI254 +aI-44 +aa(lp18244 +g10 +aa(lp18245 +g8 +aI370 +aI-44 +aa(lp18246 +g10 +aa(lp18247 +g8 +aI370 +aI-44 +aasV2 +(lp18248 +(lp18249 +g8 +aI671 +aI-157 +aa(lp18250 +g20 +aI671 +aI-44 +aa(lp18251 +g20 +aI40 +aI-44 +aa(lp18252 +g15 +aI54 +aI-125 +aI39 +aI-72 +aI44 +aI-99 +aa(lp18253 +g15 +aI131 +aI-252 +aI70 +aI-168 +aI95 +aI-211 +aa(lp18254 +g15 +aI284 +aI-397 +aI166 +aI-294 +aI217 +aI-342 +aa(lp18255 +g15 +aI494 +aI-599 +aI388 +aI-482 +aI458 +aI-549 +aa(lp18256 +g15 +aI549 +aI-740 +aI531 +aI-649 +aI549 +aI-696 +aa(lp18257 +g15 +aI499 +aI-857 +aI549 +aI-786 +aI532 +aI-826 +aa(lp18258 +g15 +aI369 +aI-905 +aI466 +aI-889 +aI423 +aI-905 +aa(lp18259 +g15 +aI234 +aI-854 +aI313 +aI-905 +aI268 +aI-888 +aa(lp18260 +g15 +aI182 +aI-714 +aI200 +aI-821 +aI183 +aI-774 +aa(lp18261 +g20 +aI62 +aI-726 +aa(lp18262 +g15 +aI155 +aI-932 +aI70 +aI-816 +aI101 +aI-885 +aa(lp18263 +g15 +aI372 +aI-1002 +aI209 +aI-979 +aI281 +aI-1002 +aa(lp18264 +g15 +aI589 +aI-926 +aI463 +aI-1002 +aI536 +aI-977 +aa(lp18265 +g15 +aI669 +aI-737 +aI643 +aI-875 +aI669 +aI-812 +aa(lp18266 +g15 +aI646 +aI-625 +aI669 +aI-699 +aI662 +aI-662 +aa(lp18267 +g15 +aI568 +aI-508 +aI630 +aI-588 +aI604 +aI-549 +aa(lp18268 +g15 +aI388 +aI-340 +aI532 +aI-467 +aI472 +aI-411 +aa(lp18269 +g15 +aI252 +aI-220 +aI317 +aI-281 +aI272 +aI-241 +aa(lp18270 +g15 +aI203 +aI-157 +aI232 +aI-199 +aI216 +aI-178 +aa(lp18271 +g10 +aa(lp18272 +g8 +aI741 +aI-44 +aa(lp18273 +g10 +aa(lp18274 +g8 +aI741 +aI-44 +aasV6 +(lp18275 +(lp18276 +g8 +aI663 +aI-765 +aa(lp18277 +g20 +aI546 +aI-756 +aa(lp18278 +g15 +aI502 +aI-856 +aI536 +aI-802 +aI521 +aI-835 +aa(lp18279 +g15 +aI385 +aI-906 +aI470 +aI-889 +aI431 +aI-906 +aa(lp18280 +g15 +aI287 +aI-875 +aI348 +aI-906 +aI315 +aI-896 +aa(lp18281 +g15 +aI199 +aI-757 +aI250 +aI-848 +aI221 +aI-808 +aa(lp18282 +g15 +aI166 +aI-536 +aI178 +aI-705 +aI167 +aI-632 +aa(lp18283 +g15 +aI270 +aI-632 +aI194 +aI-579 +aI229 +aI-611 +aa(lp18284 +g15 +aI398 +aI-663 +aI310 +aI-653 +aI353 +aI-663 +aa(lp18285 +g15 +aI597 +aI-577 +aI476 +aI-663 +aI543 +aI-634 +aa(lp18286 +g15 +aI680 +aI-354 +aI652 +aI-519 +aI680 +aI-445 +aa(lp18287 +g15 +aI641 +aI-187 +aI680 +aI-294 +aI667 +aI-238 +aa(lp18288 +g15 +aI535 +aI-69 +aI615 +aI-135 +aI580 +aI-96 +aa(lp18289 +g15 +aI381 +aI-28 +aI490 +aI-41 +aI438 +aI-28 +aa(lp18290 +g15 +aI142 +aI-135 +aI283 +aI-28 +aI204 +aI-64 +aa(lp18291 +g15 +aI50 +aI-491 +aI80 +aI-207 +aI50 +aI-326 +aa(lp18292 +g15 +aI152 +aI-893 +aI50 +aI-675 +aI84 +aI-809 +aa(lp18293 +g15 +aI392 +aI-1002 +aI211 +aI-966 +aI291 +aI-1002 +aa(lp18294 +g15 +aI577 +aI-939 +aI467 +aI-1002 +aI529 +aI-981 +aa(lp18295 +g15 +aI663 +aI-765 +aI625 +aI-897 +aI653 +aI-839 +aa(lp18296 +g10 +aa(lp18297 +g8 +aI184 +aI-353 +aa(lp18298 +g15 +aI210 +aI-237 +aI184 +aI-313 +aI193 +aI-274 +aa(lp18299 +g15 +aI282 +aI-153 +aI227 +aI-200 +aI251 +aI-172 +aa(lp18300 +g15 +aI379 +aI-124 +aI313 +aI-134 +aI345 +aI-124 +aa(lp18301 +g15 +aI507 +aI-184 +aI429 +aI-124 +aI471 +aI-144 +aa(lp18302 +g15 +aI560 +aI-347 +aI542 +aI-224 +aI560 +aI-278 +aa(lp18303 +g15 +aI507 +aI-503 +aI560 +aI-413 +aI542 +aI-465 +aa(lp18304 +g15 +aI375 +aI-560 +aI472 +aI-541 +aI428 +aI-560 +aa(lp18305 +g15 +aI240 +aI-503 +aI322 +aI-560 +aI277 +aI-541 +aa(lp18306 +g15 +aI184 +aI-353 +aI203 +aI-465 +aI184 +aI-415 +aa(lp18307 +g10 +aa(lp18308 +g8 +aI741 +aI-44 +aa(lp18309 +g10 +aa(lp18310 +g8 +aI741 +aI-44 +aasV: +(lp18311 +(lp18312 +g8 +aI120 +aI-602 +aa(lp18313 +g20 +aI120 +aI-735 +aa(lp18314 +g20 +aI253 +aI-735 +aa(lp18315 +g20 +aI253 +aI-602 +aa(lp18316 +g10 +aa(lp18317 +g8 +aI120 +aI-44 +aa(lp18318 +g20 +aI120 +aI-177 +aa(lp18319 +g20 +aI253 +aI-177 +aa(lp18320 +g20 +aI253 +aI-44 +aa(lp18321 +g10 +aa(lp18322 +g8 +aI370 +aI-44 +aa(lp18323 +g10 +aa(lp18324 +g8 +aI370 +aI-44 +aasV> +(lp18325 +(lp18326 +g8 +aI705 +aI-461 +aa(lp18327 +g20 +aI72 +aI-191 +aa(lp18328 +g20 +aI72 +aI-308 +aa(lp18329 +g20 +aI573 +aI-515 +aa(lp18330 +g20 +aI72 +aI-721 +aa(lp18331 +g20 +aI72 +aI-838 +aa(lp18332 +g20 +aI705 +aI-571 +aa(lp18333 +g10 +aa(lp18334 +g8 +aI778 +aI-44 +aa(lp18335 +g10 +aa(lp18336 +g8 +aI778 +aI-44 +aasVB +(lp18337 +(lp18338 +g8 +aI97 +aI-44 +aa(lp18339 +g20 +aI97 +aI-998 +aa(lp18340 +g20 +aI455 +aI-998 +aa(lp18341 +g15 +aI631 +aI-969 +aI528 +aI-998 +aI587 +aI-989 +aa(lp18342 +g15 +aI734 +aI-880 +aI675 +aI-950 +aI709 +aI-920 +aa(lp18343 +g15 +aI772 +aI-754 +aI759 +aI-840 +aI772 +aI-798 +aa(lp18344 +g15 +aI738 +aI-639 +aI772 +aI-713 +aI761 +aI-675 +aa(lp18345 +g15 +aI638 +aI-552 +aI716 +aI-603 +aI683 +aI-574 +aa(lp18346 +g15 +aI771 +aI-465 +aI696 +aI-535 +aI740 +aI-506 +aa(lp18347 +g15 +aI818 +aI-321 +aI802 +aI-424 +aI818 +aI-376 +aa(lp18348 +g15 +aI790 +aI-196 +aI818 +aI-276 +aI808 +aI-234 +aa(lp18349 +g15 +aI720 +aI-107 +aI771 +aI-158 +aI747 +aI-128 +aa(lp18350 +g15 +aI615 +aI-60 +aI692 +aI-86 +aI657 +aI-71 +aa(lp18351 +g15 +aI461 +aI-44 +aI573 +aI-49 +aI522 +aI-44 +aa(lp18352 +g10 +aa(lp18353 +g8 +aI223 +aI-597 +aa(lp18354 +g20 +aI430 +aI-597 +aa(lp18355 +g15 +aI550 +aI-608 +aI486 +aI-597 +aI526 +aI-601 +aa(lp18356 +g15 +aI623 +aI-656 +aI582 +aI-618 +aI607 +aI-634 +aa(lp18357 +g15 +aI647 +aI-739 +aI639 +aI-678 +aI647 +aI-706 +aa(lp18358 +g15 +aI625 +aI-823 +aI647 +aI-771 +aI640 +aI-799 +aa(lp18359 +g15 +aI559 +aI-872 +aI609 +aI-847 +aI588 +aI-864 +aa(lp18360 +g15 +aI414 +aI-886 +aI531 +aI-881 +aI483 +aI-886 +aa(lp18361 +g20 +aI223 +aI-886 +aa(lp18362 +g10 +aa(lp18363 +g8 +aI223 +aI-157 +aa(lp18364 +g20 +aI461 +aI-157 +aa(lp18365 +g15 +aI547 +aI-161 +aI502 +aI-157 +aI531 +aI-158 +aa(lp18366 +g15 +aI620 +aI-187 +aI576 +aI-166 +aI600 +aI-175 +aa(lp18367 +g15 +aI668 +aI-240 +aI639 +aI-199 +aI656 +aI-217 +aa(lp18368 +g15 +aI687 +aI-321 +aI681 +aI-263 +aI687 +aI-290 +aa(lp18369 +g15 +aI660 +aI-413 +aI687 +aI-356 +aI678 +aI-387 +aa(lp18370 +g15 +aI584 +aI-469 +aI641 +aI-440 +aI616 +aI-458 +aa(lp18371 +g15 +aI444 +aI-485 +aI551 +aI-479 +aI505 +aI-485 +aa(lp18372 +g20 +aI223 +aI-485 +aa(lp18373 +g10 +aa(lp18374 +g8 +aI889 +aI-44 +aa(lp18375 +g10 +aa(lp18376 +g8 +aI889 +aI-44 +aasVF +(lp18377 +(lp18378 +g8 +aI109 +aI-44 +aa(lp18379 +g20 +aI109 +aI-998 +aa(lp18380 +g20 +aI753 +aI-998 +aa(lp18381 +g20 +aI753 +aI-886 +aa(lp18382 +g20 +aI235 +aI-886 +aa(lp18383 +g20 +aI235 +aI-590 +aa(lp18384 +g20 +aI683 +aI-590 +aa(lp18385 +g20 +aI683 +aI-478 +aa(lp18386 +g20 +aI235 +aI-478 +aa(lp18387 +g20 +aI235 +aI-44 +aa(lp18388 +g10 +aa(lp18389 +g8 +aI814 +aI-44 +aa(lp18390 +g10 +aa(lp18391 +g8 +aI814 +aI-44 +aasVJ +(lp18392 +(lp18393 +g8 +aI38 +aI-315 +aa(lp18394 +g20 +aI152 +aI-330 +aa(lp18395 +g15 +aI193 +aI-181 +aI155 +aI-257 +aI169 +aI-208 +aa(lp18396 +g15 +aI294 +aI-140 +aI217 +aI-154 +aI251 +aI-140 +aa(lp18397 +g15 +aI376 +aI-162 +aI325 +aI-140 +aI353 +aI-148 +aa(lp18398 +g15 +aI423 +aI-221 +aI399 +aI-177 +aI415 +aI-196 +aa(lp18399 +g15 +aI436 +aI-341 +aI432 +aI-246 +aI436 +aI-286 +aa(lp18400 +g20 +aI436 +aI-998 +aa(lp18401 +g20 +aI563 +aI-998 +aa(lp18402 +g20 +aI563 +aI-348 +aa(lp18403 +g15 +aI534 +aI-162 +aI563 +aI-268 +aI553 +aI-206 +aa(lp18404 +g15 +aI442 +aI-62 +aI514 +aI-119 +aI484 +aI-85 +aa(lp18405 +g15 +aI294 +aI-28 +aI400 +aI-39 +aI351 +aI-28 +aa(lp18406 +g15 +aI102 +aI-100 +aI211 +aI-28 +aI147 +aI-52 +aa(lp18407 +g15 +aI38 +aI-315 +aI58 +aI-148 +aI36 +aI-220 +aa(lp18408 +g10 +aa(lp18409 +g8 +aI666 +aI-44 +aa(lp18410 +g10 +aa(lp18411 +g8 +aI666 +aI-44 +aasVN +(lp18412 +(lp18413 +g8 +aI101 +aI-44 +aa(lp18414 +g20 +aI101 +aI-998 +aa(lp18415 +g20 +aI231 +aI-998 +aa(lp18416 +g20 +aI732 +aI-249 +aa(lp18417 +g20 +aI732 +aI-998 +aa(lp18418 +g20 +aI853 +aI-998 +aa(lp18419 +g20 +aI853 +aI-44 +aa(lp18420 +g20 +aI723 +aI-44 +aa(lp18421 +g20 +aI222 +aI-794 +aa(lp18422 +g20 +aI222 +aI-44 +aa(lp18423 +g10 +aa(lp18424 +g8 +aI962 +aI-44 +aa(lp18425 +g10 +aa(lp18426 +g8 +aI962 +aI-44 +aasVR +(lp18427 +(lp18428 +g8 +aI104 +aI-44 +aa(lp18429 +g20 +aI104 +aI-998 +aa(lp18430 +g20 +aI527 +aI-998 +aa(lp18431 +g15 +aI722 +aI-973 +aI613 +aI-998 +aI677 +aI-990 +aa(lp18432 +g15 +aI828 +aI-882 +aI766 +aI-956 +aI801 +aI-925 +aa(lp18433 +g15 +aI867 +aI-738 +aI854 +aI-838 +aI867 +aI-790 +aa(lp18434 +g15 +aI802 +aI-567 +aI867 +aI-670 +aI845 +aI-613 +aa(lp18435 +g15 +aI598 +aI-478 +aI758 +aI-520 +aI690 +aI-491 +aa(lp18436 +g15 +aI675 +aI-431 +aI632 +aI-462 +aI657 +aI-446 +aa(lp18437 +g15 +aI779 +aI-304 +aI712 +aI-397 +aI746 +aI-354 +aa(lp18438 +g20 +aI945 +aI-44 +aa(lp18439 +g20 +aI787 +aI-44 +aa(lp18440 +g20 +aI660 +aI-243 +aa(lp18441 +g15 +aI569 +aI-374 +aI623 +aI-300 +aI593 +aI-344 +aa(lp18442 +g15 +aI505 +aI-438 +aI545 +aI-404 +aI524 +aI-426 +aa(lp18443 +g15 +aI447 +aI-463 +aI486 +aI-450 +aI467 +aI-458 +aa(lp18444 +g15 +aI377 +aI-468 +aI433 +aI-466 +aI410 +aI-468 +aa(lp18445 +g20 +aI231 +aI-468 +aa(lp18446 +g20 +aI231 +aI-44 +aa(lp18447 +g10 +aa(lp18448 +g8 +aI231 +aI-577 +aa(lp18449 +g20 +aI502 +aI-577 +aa(lp18450 +g15 +aI638 +aI-595 +aI560 +aI-577 +aI605 +aI-583 +aa(lp18451 +g15 +aI712 +aI-652 +aI670 +aI-607 +aI695 +aI-626 +aa(lp18452 +g15 +aI737 +aI-738 +aI729 +aI-679 +aI737 +aI-707 +aa(lp18453 +g15 +aI688 +aI-849 +aI737 +aI-783 +aI721 +aI-820 +aa(lp18454 +g15 +aI533 +aI-893 +aI655 +aI-878 +aI603 +aI-893 +aa(lp18455 +g20 +aI231 +aI-893 +aa(lp18456 +g10 +aa(lp18457 +g8 +aI962 +aI-44 +aa(lp18458 +g10 +aa(lp18459 +g8 +aI962 +aI-44 +aasVV +(lp18460 +(lp18461 +g8 +aI375 +aI-44 +aa(lp18462 +g20 +aI5 +aI-998 +aa(lp18463 +g20 +aI142 +aI-998 +aa(lp18464 +g20 +aI390 +aI-305 +aa(lp18465 +g15 +aI440 +aI-149 +aI410 +aI-249 +aI427 +aI-197 +aa(lp18466 +g15 +aI492 +aI-305 +aI455 +aI-201 +aI472 +aI-253 +aa(lp18467 +g20 +aI750 +aI-998 +aa(lp18468 +g20 +aI878 +aI-998 +aa(lp18469 +g20 +aI505 +aI-44 +aa(lp18470 +g10 +aa(lp18471 +g8 +aI889 +aI-44 +aa(lp18472 +g10 +aa(lp18473 +g8 +aI889 +aI-44 +aasVZ +(lp18474 +(lp18475 +g8 +aI26 +aI-44 +aa(lp18476 +g20 +aI26 +aI-161 +aa(lp18477 +g20 +aI515 +aI-772 +aa(lp18478 +g15 +aI614 +aI-886 +aI550 +aI-816 +aI583 +aI-854 +aa(lp18479 +g20 +aI82 +aI-886 +aa(lp18480 +g20 +aI82 +aI-998 +aa(lp18481 +g20 +aI765 +aI-998 +aa(lp18482 +g20 +aI765 +aI-886 +aa(lp18483 +g20 +aI229 +aI-224 +aa(lp18484 +g20 +aI171 +aI-157 +aa(lp18485 +g20 +aI781 +aI-157 +aa(lp18486 +g20 +aI781 +aI-44 +aa(lp18487 +g10 +aa(lp18488 +g8 +aI814 +aI-44 +aa(lp18489 +g10 +aa(lp18490 +g8 +aI814 +aI-44 +aasV^ +(lp18491 +(lp18492 +g8 +aI155 +aI-493 +aa(lp18493 +g20 +aI35 +aI-493 +aa(lp18494 +g20 +aI264 +aI-1015 +aa(lp18495 +g20 +aI359 +aI-1015 +aa(lp18496 +g20 +aI590 +aI-493 +aa(lp18497 +g20 +aI472 +aI-493 +aa(lp18498 +g20 +aI311 +aI-882 +aa(lp18499 +g10 +aa(lp18500 +g8 +aI625 +aI-44 +aa(lp18501 +g10 +aa(lp18502 +g8 +aI625 +aI-44 +aasVb +(lp18503 +(lp18504 +g8 +aI195 +aI-44 +aa(lp18505 +g20 +aI87 +aI-44 +aa(lp18506 +g20 +aI87 +aI-998 +aa(lp18507 +g20 +aI204 +aI-998 +aa(lp18508 +g20 +aI204 +aI-658 +aa(lp18509 +g15 +aI393 +aI-751 +aI253 +aI-720 +aI317 +aI-751 +aa(lp18510 +g15 +aI514 +aI-725 +aI436 +aI-751 +aI476 +aI-742 +aa(lp18511 +g15 +aI608 +aI-653 +aI552 +aI-708 +aI583 +aI-684 +aa(lp18512 +g15 +aI666 +aI-541 +aI632 +aI-622 +aI652 +aI-585 +aa(lp18513 +g15 +aI686 +aI-400 +aI679 +aI-497 +aI686 +aI-450 +aa(lp18514 +g15 +aI598 +aI-125 +aI686 +aI-282 +aI657 +aI-190 +aa(lp18515 +g15 +aI388 +aI-28 +aI540 +aI-61 +aI470 +aI-28 +aa(lp18516 +g15 +aI195 +aI-131 +aI306 +aI-28 +aI242 +aI-62 +aa(lp18517 +g10 +aa(lp18518 +g8 +aI194 +aI-395 +aa(lp18519 +g15 +aI228 +aI-215 +aI194 +aI-312 +aI205 +aI-252 +aa(lp18520 +g15 +aI378 +aI-125 +aI265 +aI-155 +aI315 +aI-125 +aa(lp18521 +g15 +aI511 +aI-191 +aI429 +aI-125 +aI473 +aI-147 +aa(lp18522 +g15 +aI567 +aI-390 +aI548 +aI-236 +aI567 +aI-302 +aa(lp18523 +g15 +aI513 +aI-590 +aI567 +aI-481 +aI549 +aI-547 +aa(lp18524 +g15 +aI383 +aI-655 +aI477 +aI-633 +aI434 +aI-655 +aa(lp18525 +g15 +aI250 +aI-588 +aI332 +aI-655 +aI287 +aI-632 +aa(lp18526 +g15 +aI194 +aI-395 +aI213 +aI-543 +aI194 +aI-479 +aa(lp18527 +g10 +aa(lp18528 +g8 +aI741 +aI-44 +aa(lp18529 +g10 +aa(lp18530 +g8 +aI741 +aI-44 +aasVf +(lp18531 +(lp18532 +g8 +aI115 +aI-44 +aa(lp18533 +g20 +aI115 +aI-644 +aa(lp18534 +g20 +aI12 +aI-644 +aa(lp18535 +g20 +aI12 +aI-735 +aa(lp18536 +g20 +aI115 +aI-735 +aa(lp18537 +g20 +aI115 +aI-809 +aa(lp18538 +g15 +aI128 +aI-912 +aI115 +aI-855 +aI120 +aI-890 +aa(lp18539 +g15 +aI187 +aI-986 +aI139 +aI-943 +aI159 +aI-967 +aa(lp18540 +g15 +aI307 +aI-1015 +aI216 +aI-1005 +aI256 +aI-1015 +aa(lp18541 +g15 +aI416 +aI-1003 +aI340 +aI-1015 +aI376 +aI-1011 +aa(lp18542 +g20 +aI399 +aI-901 +aa(lp18543 +g15 +aI330 +aI-907 +aI374 +aI-905 +aI351 +aI-907 +aa(lp18544 +g15 +aI254 +aI-884 +aI294 +aI-907 +aI269 +aI-900 +aa(lp18545 +g15 +aI232 +aI-799 +aI239 +aI-869 +aI232 +aI-841 +aa(lp18546 +g20 +aI232 +aI-735 +aa(lp18547 +g20 +aI367 +aI-735 +aa(lp18548 +g20 +aI367 +aI-644 +aa(lp18549 +g20 +aI232 +aI-644 +aa(lp18550 +g20 +aI232 +aI-44 +aa(lp18551 +g10 +aa(lp18552 +g8 +aI370 +aI-44 +aa(lp18553 +g10 +aa(lp18554 +g8 +aI370 +aI-44 +aasVj +(lp18555 +(lp18556 +g8 +aI87 +aI-862 +aa(lp18557 +g20 +aI87 +aI-998 +aa(lp18558 +g20 +aI204 +aI-998 +aa(lp18559 +g20 +aI204 +aI-862 +aa(lp18560 +g10 +aa(lp18561 +g8 +aI-61 +aI223 +aa(lp18562 +g20 +aI-39 +aI124 +aa(lp18563 +g15 +aI16 +aI133 +aI-15 +aI130 +aI2 +aI133 +aa(lp18564 +g15 +aI69 +aI109 +aI40 +aI133 +aI57 +aI125 +aa(lp18565 +g15 +aI87 +aI-9 +aI81 +aI93 +aI87 +aI54 +aa(lp18566 +g20 +aI87 +aI-735 +aa(lp18567 +g20 +aI204 +aI-735 +aa(lp18568 +g20 +aI204 +aI-6 +aa(lp18569 +g15 +aI171 +aI171 +aI204 +aI78 +aI193 +aI137 +aa(lp18570 +g15 +aI30 +aI236 +aI143 +aI214 +aI96 +aI236 +aa(lp18571 +g15 +aI-61 +aI223 +aI-1 +aI236 +aI-31 +aI232 +aa(lp18572 +g10 +aa(lp18573 +g8 +aI296 +aI-44 +aa(lp18574 +g10 +aa(lp18575 +g8 +aI296 +aI-44 +aasVn +(lp18576 +(lp18577 +g8 +aI87 +aI-44 +aa(lp18578 +g20 +aI87 +aI-735 +aa(lp18579 +g20 +aI193 +aI-735 +aa(lp18580 +g20 +aI193 +aI-637 +aa(lp18581 +g15 +aI413 +aI-751 +aI244 +aI-713 +aI317 +aI-751 +aa(lp18582 +g15 +aI528 +aI-729 +aI455 +aI-751 +aI493 +aI-743 +aa(lp18583 +g15 +aI606 +aI-670 +aI563 +aI-714 +aI589 +aI-694 +aa(lp18584 +g15 +aI643 +aI-583 +aI624 +aI-645 +aI636 +aI-616 +aa(lp18585 +g15 +aI649 +aI-469 +aI647 +aI-561 +aI649 +aI-523 +aa(lp18586 +g20 +aI649 +aI-44 +aa(lp18587 +g20 +aI532 +aI-44 +aa(lp18588 +g20 +aI532 +aI-465 +aa(lp18589 +g15 +aI518 +aI-572 +aI532 +aI-512 +aI527 +aI-548 +aa(lp18590 +g15 +aI470 +aI-628 +aI509 +aI-595 +aI493 +aI-614 +aa(lp18591 +g15 +aI388 +aI-649 +aI447 +aI-642 +aI419 +aI-649 +aa(lp18592 +g15 +aI259 +aI-602 +aI338 +aI-649 +aI295 +aI-634 +aa(lp18593 +g15 +aI205 +aI-422 +aI223 +aI-570 +aI205 +aI-510 +aa(lp18594 +g20 +aI205 +aI-44 +aa(lp18595 +g10 +aa(lp18596 +g8 +aI741 +aI-44 +aa(lp18597 +g10 +aa(lp18598 +g8 +aI741 +aI-44 +aasVr +(lp18599 +(lp18600 +g8 +aI86 +aI-44 +aa(lp18601 +g20 +aI86 +aI-735 +aa(lp18602 +g20 +aI192 +aI-735 +aa(lp18603 +g20 +aI192 +aI-631 +aa(lp18604 +g15 +aI266 +aI-728 +aI218 +aI-680 +aI243 +aI-712 +aa(lp18605 +g15 +aI341 +aI-751 +aI289 +aI-743 +aI314 +aI-751 +aa(lp18606 +g15 +aI462 +aI-713 +aI381 +aI-751 +aI421 +aI-738 +aa(lp18607 +g20 +aI421 +aI-604 +aa(lp18608 +g15 +aI335 +aI-630 +aI393 +aI-621 +aI364 +aI-630 +aa(lp18609 +g15 +aI266 +aI-607 +aI310 +aI-630 +aI287 +aI-622 +aa(lp18610 +g15 +aI223 +aI-543 +aI246 +aI-591 +aI231 +aI-570 +aa(lp18611 +g15 +aI203 +aI-406 +aI210 +aI-501 +aI203 +aI-455 +aa(lp18612 +g20 +aI203 +aI-44 +aa(lp18613 +g10 +aa(lp18614 +g8 +aI444 +aI-44 +aa(lp18615 +g10 +aa(lp18616 +g8 +aI444 +aI-44 +aasVv +(lp18617 +(lp18618 +g8 +aI279 +aI-44 +aa(lp18619 +g20 +aI16 +aI-735 +aa(lp18620 +g20 +aI140 +aI-735 +aa(lp18621 +g20 +aI289 +aI-321 +aa(lp18622 +g15 +aI333 +aI-182 +aI305 +aI-277 +aI319 +aI-230 +aa(lp18623 +g15 +aI376 +aI-313 +aI343 +aI-218 +aI358 +aI-262 +aa(lp18624 +g20 +aI530 +aI-735 +aa(lp18625 +g20 +aI651 +aI-735 +aa(lp18626 +g20 +aI389 +aI-44 +aa(lp18627 +g10 +aa(lp18628 +g8 +aI666 +aI-44 +aa(lp18629 +g10 +aa(lp18630 +g8 +aI666 +aI-44 +aasVz +(lp18631 +(lp18632 +g8 +aI26 +aI-44 +aa(lp18633 +g20 +aI26 +aI-139 +aa(lp18634 +g20 +aI466 +aI-644 +aa(lp18635 +g15 +aI333 +aI-640 +aI416 +aI-642 +aI372 +aI-640 +aa(lp18636 +g20 +aI52 +aI-640 +aa(lp18637 +g20 +aI52 +aI-735 +aa(lp18638 +g20 +aI617 +aI-735 +aa(lp18639 +g20 +aI617 +aI-658 +aa(lp18640 +g20 +aI242 +aI-219 +aa(lp18641 +g20 +aI170 +aI-139 +aa(lp18642 +g15 +aI318 +aI-145 +aI223 +aI-143 +aI272 +aI-145 +aa(lp18643 +g20 +aI638 +aI-145 +aa(lp18644 +g20 +aI638 +aI-44 +aa(lp18645 +g10 +aa(lp18646 +g8 +aI666 +aI-44 +aa(lp18647 +g10 +aa(lp18648 +g8 +aI666 +aI-44 +aasV~ +(lp18649 +(lp18650 +g8 +aI56 +aI-407 +aa(lp18651 +g20 +aI56 +aI-540 +aa(lp18652 +g15 +aI237 +aI-618 +aI102 +aI-592 +aI162 +aI-618 +aa(lp18653 +g15 +aI319 +aI-607 +aI263 +aI-618 +aI291 +aI-614 +aa(lp18654 +g15 +aI442 +aI-562 +aI348 +aI-599 +aI389 +aI-584 +aa(lp18655 +g15 +aI509 +aI-537 +aI472 +aI-549 +aI494 +aI-541 +aa(lp18656 +g15 +aI554 +aI-531 +aI524 +aI-533 +aI539 +aI-531 +aa(lp18657 +g15 +aI642 +aI-556 +aI582 +aI-531 +aI612 +aI-539 +aa(lp18658 +g15 +aI722 +aI-620 +aI672 +aI-573 +aI699 +aI-595 +aa(lp18659 +g20 +aI722 +aI-482 +aa(lp18660 +g15 +aI638 +aI-425 +aI694 +aI-456 +aI666 +aI-437 +aa(lp18661 +g15 +aI542 +aI-408 +aI609 +aI-414 +aI577 +aI-408 +aa(lp18662 +g15 +aI467 +aI-417 +aI516 +aI-408 +aI491 +aI-411 +aa(lp18663 +g15 +aI355 +aI-461 +aI444 +aI-423 +aI406 +aI-438 +aa(lp18664 +g15 +aI226 +aI-495 +aI303 +aI-484 +aI260 +aI-495 +aa(lp18665 +g15 +aI148 +aI-477 +aI198 +aI-495 +aI172 +aI-489 +aa(lp18666 +g15 +aI56 +aI-407 +aI123 +aI-465 +aI93 +aI-442 +aa(lp18667 +g10 +aa(lp18668 +g8 +aI778 +aI-44 +aa(lp18669 +g10 +aa(lp18670 +g8 +aI778 +aI-44 +aasV! +(lp18671 +(lp18672 +g8 +aI150 +aI-281 +aa(lp18673 +g20 +aI114 +aI-787 +aa(lp18674 +g20 +aI114 +aI-998 +aa(lp18675 +g20 +aI259 +aI-998 +aa(lp18676 +g20 +aI259 +aI-787 +aa(lp18677 +g20 +aI225 +aI-281 +aa(lp18678 +g10 +aa(lp18679 +g8 +aI119 +aI-44 +aa(lp18680 +g20 +aI119 +aI-177 +aa(lp18681 +g20 +aI254 +aI-177 +aa(lp18682 +g20 +aI254 +aI-44 +aa(lp18683 +g10 +aa(lp18684 +g8 +aI370 +aI-44 +aa(lp18685 +g10 +aa(lp18686 +g8 +aI370 +aI-44 +aasV% +(lp18687 +(lp18688 +g8 +aI77 +aI-769 +aa(lp18689 +g15 +aI128 +aI-943 +aI77 +aI-837 +aI94 +aI-895 +aa(lp18690 +g15 +aI277 +aI-1015 +aI163 +aI-991 +aI212 +aI-1015 +aa(lp18691 +g15 +aI426 +aI-951 +aI337 +aI-1015 +aI387 +aI-993 +aa(lp18692 +g15 +aI485 +aI-762 +aI466 +aI-908 +aI485 +aI-845 +aa(lp18693 +g15 +aI426 +aI-576 +aI485 +aI-681 +aI465 +aI-619 +aa(lp18694 +g15 +aI279 +aI-510 +aI386 +aI-532 +aI337 +aI-510 +aa(lp18695 +g15 +aI135 +aI-575 +aI221 +aI-510 +aI173 +aI-532 +aa(lp18696 +g15 +aI77 +aI-769 +aI96 +aI-618 +aI77 +aI-682 +aa(lp18697 +g10 +aa(lp18698 +g8 +aI281 +aI-934 +aa(lp18699 +g15 +aI208 +aI-896 +aI252 +aI-934 +aI227 +aI-921 +aa(lp18700 +g15 +aI179 +aI-757 +aI189 +aI-871 +aI179 +aI-825 +aa(lp18701 +g15 +aI208 +aI-628 +aI179 +aI-696 +aI189 +aI-653 +aa(lp18702 +g15 +aI281 +aI-591 +aI228 +aI-603 +aI252 +aI-591 +aa(lp18703 +g15 +aI354 +aI-629 +aI310 +aI-591 +aI335 +aI-603 +aa(lp18704 +g15 +aI383 +aI-767 +aI373 +aI-654 +aI383 +aI-700 +aa(lp18705 +g15 +aI354 +aI-896 +aI383 +aI-828 +aI373 +aI-872 +aa(lp18706 +g15 +aI281 +aI-934 +aI334 +aI-921 +aI310 +aI-934 +aa(lp18707 +g10 +aa(lp18708 +g8 +aI281 +aI-9 +aa(lp18709 +g20 +aI804 +aI-1015 +aa(lp18710 +g20 +aI899 +aI-1015 +aa(lp18711 +g20 +aI378 +aI-9 +aa(lp18712 +g10 +aa(lp18713 +g8 +aI694 +aI-268 +aa(lp18714 +g15 +aI746 +aI-442 +aI694 +aI-336 +aI711 +aI-395 +aa(lp18715 +g15 +aI895 +aI-513 +aI780 +aI-490 +aI830 +aI-513 +aa(lp18716 +g15 +aI1044 +aI-449 +aI955 +aI-513 +aI1005 +aI-492 +aa(lp18717 +g15 +aI1103 +aI-261 +aI1083 +aI-406 +aI1103 +aI-344 +aa(lp18718 +g15 +aI1043 +aI-74 +aI1103 +aI-180 +aI1083 +aI-118 +aa(lp18719 +g15 +aI896 +aI-9 +aI1004 +aI-31 +aI955 +aI-9 +aa(lp18720 +g15 +aI752 +aI-74 +aI838 +aI-9 +aI790 +aI-30 +aa(lp18721 +g15 +aI694 +aI-268 +aI713 +aI-117 +aI694 +aI-182 +aa(lp18722 +g10 +aa(lp18723 +g8 +aI899 +aI-433 +aa(lp18724 +g15 +aI825 +aI-395 +aI869 +aI-433 +aI845 +aI-420 +aa(lp18725 +g15 +aI796 +aI-256 +aI806 +aI-370 +aI796 +aI-323 +aa(lp18726 +g15 +aI826 +aI-127 +aI796 +aI-195 +aI806 +aI-152 +aa(lp18727 +g15 +aI898 +aI-90 +aI845 +aI-102 +aI869 +aI-90 +aa(lp18728 +g15 +aI972 +aI-127 +aI928 +aI-90 +aI953 +aI-102 +aa(lp18729 +g15 +aI1001 +aI-265 +aI991 +aI-152 +aI1001 +aI-198 +aa(lp18730 +g15 +aI972 +aI-395 +aI1001 +aI-327 +aI991 +aI-370 +aa(lp18731 +g15 +aI899 +aI-433 +aI952 +aI-420 +aI928 +aI-433 +aa(lp18732 +g10 +aa(lp18733 +g8 +aI1185 +aI-44 +aa(lp18734 +g10 +aa(lp18735 +g8 +aI1185 +aI-44 +aasV) +(lp18736 +(lp18737 +g8 +aI164 +aI236 +aa(lp18738 +g20 +aI80 +aI236 +aa(lp18739 +g15 +aI275 +aI-389 +aI210 +aI27 +aI275 +aI-180 +aa(lp18740 +g15 +aI247 +aI-632 +aI275 +aI-471 +aI266 +aI-552 +aa(lp18741 +g15 +aI185 +aI-819 +aI232 +aI-697 +aI212 +aI-759 +aa(lp18742 +g15 +aI80 +aI-1015 +aI168 +aI-858 +aI133 +aI-924 +aa(lp18743 +g20 +aI164 +aI-1015 +aa(lp18744 +g15 +aI345 +aI-687 +aI246 +aI-906 +aI306 +aI-796 +aa(lp18745 +g15 +aI395 +aI-390 +aI379 +aI-592 +aI395 +aI-493 +aa(lp18746 +g15 +aI328 +aI-50 +aI395 +aI-272 +aI373 +aI-159 +aa(lp18747 +g15 +aI164 +aI236 +aI283 +aI59 +aI228 +aI154 +aa(lp18748 +g10 +aa(lp18749 +g8 +aI444 +aI-44 +aa(lp18750 +g10 +aa(lp18751 +g8 +aI444 +aI-44 +aasV- +(lp18752 +(lp18753 +g8 +aI42 +aI-330 +aa(lp18754 +g20 +aI42 +aI-448 +aa(lp18755 +g20 +aI402 +aI-448 +aa(lp18756 +g20 +aI402 +aI-330 +aa(lp18757 +g10 +aa(lp18758 +g8 +aI444 +aI-44 +aa(lp18759 +g10 +aa(lp18760 +g8 +aI444 +aI-44 +aasV1 +(lp18761 +(lp18762 +g8 +aI496 +aI-44 +aa(lp18763 +g20 +aI379 +aI-44 +aa(lp18764 +g20 +aI379 +aI-791 +aa(lp18765 +g15 +aI268 +aI-710 +aI351 +aI-764 +aI314 +aI-737 +aa(lp18766 +g15 +aI145 +aI-649 +aI222 +aI-683 +aI181 +aI-663 +aa(lp18767 +g20 +aI145 +aI-763 +aa(lp18768 +g15 +aI317 +aI-875 +aI210 +aI-794 +aI268 +aI-831 +aa(lp18769 +g15 +aI421 +aI-1002 +aI366 +aI-919 +aI400 +aI-961 +aa(lp18770 +g20 +aI496 +aI-1002 +aa(lp18771 +g10 +aa(lp18772 +g8 +aI741 +aI-44 +aa(lp18773 +g10 +aa(lp18774 +g8 +aI741 +aI-44 +aasV5 +(lp18775 +(lp18776 +g8 +aI55 +aI-294 +aa(lp18777 +g20 +aI178 +aI-304 +aa(lp18778 +g15 +aI241 +aI-169 +aI187 +aI-244 +aI208 +aI-199 +aa(lp18779 +g15 +aI361 +aI-124 +aI275 +aI-139 +aI315 +aI-124 +aa(lp18780 +g15 +aI505 +aI-188 +aI418 +aI-124 +aI466 +aI-145 +aa(lp18781 +g15 +aI563 +aI-357 +aI544 +aI-230 +aI563 +aI-287 +aa(lp18782 +g15 +aI507 +aI-515 +aI563 +aI-424 +aI545 +aI-477 +aa(lp18783 +g15 +aI360 +aI-573 +aI469 +aI-554 +aI420 +aI-573 +aa(lp18784 +g15 +aI257 +aI-548 +aI322 +aI-573 +aI288 +aI-565 +aa(lp18785 +g15 +aI186 +aI-481 +aI227 +aI-530 +aI203 +aI-508 +aa(lp18786 +g20 +aI76 +aI-495 +aa(lp18787 +g20 +aI168 +aI-985 +aa(lp18788 +g20 +aI643 +aI-985 +aa(lp18789 +g20 +aI643 +aI-873 +aa(lp18790 +g20 +aI262 +aI-873 +aa(lp18791 +g20 +aI210 +aI-617 +aa(lp18792 +g15 +aI391 +aI-677 +aI268 +aI-657 +aI328 +aI-677 +aa(lp18793 +g15 +aI602 +aI-590 +aI474 +aI-677 +aI544 +aI-648 +aa(lp18794 +g15 +aI688 +aI-368 +aI659 +aI-532 +aI688 +aI-458 +aa(lp18795 +g15 +aI612 +aI-144 +aI688 +aI-281 +aI662 +aI-206 +aa(lp18796 +g15 +aI361 +aI-28 +aI551 +aI-66 +aI467 +aI-28 +aa(lp18797 +g15 +aI149 +aI-101 +aI275 +aI-28 +aI204 +aI-52 +aa(lp18798 +g15 +aI55 +aI-294 +aI94 +aI-149 +aI63 +aI-214 +aa(lp18799 +g10 +aa(lp18800 +g8 +aI741 +aI-44 +aa(lp18801 +g10 +aa(lp18802 +g8 +aI741 +aI-44 +aasV9 +(lp18803 +(lp18804 +g8 +aI72 +aI-265 +aa(lp18805 +g20 +aI185 +aI-275 +aa(lp18806 +g15 +aI240 +aI-160 +aI195 +aI-222 +aI213 +aI-184 +aa(lp18807 +g15 +aI343 +aI-124 +aI267 +aI-136 +aI301 +aI-124 +aa(lp18808 +g15 +aI438 +aI-149 +aI379 +aI-124 +aI411 +aI-132 +aa(lp18809 +g15 +aI505 +aI-215 +aI465 +aI-165 +aI487 +aI-187 +aa(lp18810 +g15 +aI548 +aI-326 +aI522 +aI-242 +aI537 +aI-280 +aa(lp18811 +g15 +aI566 +aI-470 +aI560 +aI-373 +aI566 +aI-421 +aa(lp18812 +g15 +aI565 +aI-493 +aI566 +aI-475 +aI566 +aI-483 +aa(lp18813 +g15 +aI469 +aI-402 +aI542 +aI-456 +aI510 +aI-426 +aa(lp18814 +g15 +aI337 +aI-368 +aI429 +aI-379 +aI385 +aI-368 +aa(lp18815 +g15 +aI137 +aI-453 +aI258 +aI-368 +aI192 +aI-396 +aa(lp18816 +g15 +aI55 +aI-680 +aI82 +aI-511 +aI55 +aI-586 +aa(lp18817 +g15 +aI140 +aI-914 +aI55 +aI-777 +aI83 +aI-855 +aa(lp18818 +g15 +aI355 +aI-1002 +aI198 +aI-973 +aI269 +aI-1002 +aa(lp18819 +g15 +aI525 +aI-952 +aI417 +aI-1002 +aI474 +aI-986 +aa(lp18820 +g15 +aI642 +aI-809 +aI577 +aI-919 +aI616 +aI-871 +aa(lp18821 +g15 +aI682 +aI-541 +aI669 +aI-747 +aI682 +aI-658 +aa(lp18822 +g15 +aI643 +aI-249 +aI682 +aI-419 +aI669 +aI-322 +aa(lp18823 +g15 +aI525 +aI-84 +aI616 +aI-177 +aI577 +aI-122 +aa(lp18824 +g15 +aI341 +aI-28 +aI472 +aI-47 +aI411 +aI-28 +aa(lp18825 +g15 +aI158 +aI-90 +aI266 +aI-28 +aI205 +aI-48 +aa(lp18826 +g15 +aI72 +aI-265 +aI110 +aI-131 +aI82 +aI-190 +aa(lp18827 +g10 +aa(lp18828 +g8 +aI552 +aI-686 +aa(lp18829 +g15 +aI499 +aI-846 +aI552 +aI-753 +aI534 +aI-807 +aa(lp18830 +g15 +aI369 +aI-905 +aI463 +aI-886 +aI420 +aI-905 +aa(lp18831 +g15 +aI233 +aI-841 +aI317 +aI-905 +aI272 +aI-884 +aa(lp18832 +g15 +aI175 +aI-676 +aI195 +aI-799 +aI175 +aI-744 +aa(lp18833 +g15 +aI230 +aI-528 +aI175 +aI-615 +aI194 +aI-566 +aa(lp18834 +g15 +aI366 +aI-471 +aI267 +aI-490 +aI312 +aI-471 +aa(lp18835 +g15 +aI500 +aI-528 +aI420 +aI-471 +aI465 +aI-490 +aa(lp18836 +g15 +aI552 +aI-686 +aI535 +aI-566 +aI552 +aI-619 +aa(lp18837 +g10 +aa(lp18838 +g8 +aI741 +aI-44 +aa(lp18839 +g10 +aa(lp18840 +g8 +aI741 +aI-44 +aasV= +(lp18841 +(lp18842 +g8 +aI704 +aI-605 +aa(lp18843 +g20 +aI74 +aI-605 +aa(lp18844 +g20 +aI74 +aI-715 +aa(lp18845 +g20 +aI704 +aI-715 +aa(lp18846 +g10 +aa(lp18847 +g8 +aI704 +aI-315 +aa(lp18848 +g20 +aI74 +aI-315 +aa(lp18849 +g20 +aI74 +aI-425 +aa(lp18850 +g20 +aI704 +aI-425 +aa(lp18851 +g10 +aa(lp18852 +g8 +aI778 +aI-44 +aa(lp18853 +g10 +aa(lp18854 +g8 +aI778 +aI-44 +aasVA +(lp18855 +(lp18856 +g8 +aI-1 +aI-44 +aa(lp18857 +g20 +aI364 +aI-998 +aa(lp18858 +g20 +aI500 +aI-998 +aa(lp18859 +g20 +aI891 +aI-44 +aa(lp18860 +g20 +aI747 +aI-44 +aa(lp18861 +g20 +aI636 +aI-333 +aa(lp18862 +g20 +aI236 +aI-333 +aa(lp18863 +g20 +aI132 +aI-44 +aa(lp18864 +g10 +aa(lp18865 +g8 +aI273 +aI-436 +aa(lp18866 +g20 +aI597 +aI-436 +aa(lp18867 +g20 +aI497 +aI-700 +aa(lp18868 +g15 +aI429 +aI-898 +aI467 +aI-780 +aI444 +aI-846 +aa(lp18869 +g15 +aI378 +aI-716 +aI417 +aI-837 +aI400 +aI-776 +aa(lp18870 +g10 +aa(lp18871 +g8 +aI889 +aI-44 +aa(lp18872 +g10 +aa(lp18873 +g8 +aI889 +aI-44 +aasVE +(lp18874 +(lp18875 +g8 +aI105 +aI-44 +aa(lp18876 +g20 +aI105 +aI-998 +aa(lp18877 +g20 +aI795 +aI-998 +aa(lp18878 +g20 +aI795 +aI-886 +aa(lp18879 +g20 +aI231 +aI-886 +aa(lp18880 +g20 +aI231 +aI-593 +aa(lp18881 +g20 +aI759 +aI-593 +aa(lp18882 +g20 +aI759 +aI-481 +aa(lp18883 +g20 +aI231 +aI-481 +aa(lp18884 +g20 +aI231 +aI-157 +aa(lp18885 +g20 +aI817 +aI-157 +aa(lp18886 +g20 +aI817 +aI-44 +aa(lp18887 +g10 +aa(lp18888 +g8 +aI889 +aI-44 +aa(lp18889 +g10 +aa(lp18890 +g8 +aI889 +aI-44 +aasVI +(lp18891 +(lp18892 +g8 +aI124 +aI-44 +aa(lp18893 +g20 +aI124 +aI-998 +aa(lp18894 +g20 +aI250 +aI-998 +aa(lp18895 +g20 +aI250 +aI-44 +aa(lp18896 +g10 +aa(lp18897 +g8 +aI370 +aI-44 +aa(lp18898 +g10 +aa(lp18899 +g8 +aI370 +aI-44 +aasVM +(lp18900 +(lp18901 +g8 +aI98 +aI-44 +aa(lp18902 +g20 +aI98 +aI-998 +aa(lp18903 +g20 +aI289 +aI-998 +aa(lp18904 +g20 +aI514 +aI-323 +aa(lp18905 +g15 +aI560 +aI-181 +aI535 +aI-260 +aI550 +aI-213 +aa(lp18906 +g15 +aI611 +aI-334 +aI571 +aI-216 +aI588 +aI-267 +aa(lp18907 +g20 +aI839 +aI-998 +aa(lp18908 +g20 +aI1009 +aI-998 +aa(lp18909 +g20 +aI1009 +aI-44 +aa(lp18910 +g20 +aI888 +aI-44 +aa(lp18911 +g20 +aI888 +aI-843 +aa(lp18912 +g20 +aI610 +aI-44 +aa(lp18913 +g20 +aI496 +aI-44 +aa(lp18914 +g20 +aI220 +aI-856 +aa(lp18915 +g20 +aI220 +aI-44 +aa(lp18916 +g10 +aa(lp18917 +g8 +aI1110 +aI-44 +aa(lp18918 +g10 +aa(lp18919 +g8 +aI1110 +aI-44 +aasVQ +(lp18920 +(lp18921 +g8 +aI826 +aI-146 +aa(lp18922 +g15 +aI988 +aI-58 +aI884 +aI-106 +aI938 +aI-76 +aa(lp18923 +g20 +aI951 +aI29 +aa(lp18924 +g15 +aI746 +aI-87 +aI882 +aI5 +aI814 +aI-34 +aa(lp18925 +g15 +aI511 +aI-28 +aI675 +aI-47 +aI597 +aI-28 +aa(lp18926 +g15 +aI276 +aI-90 +aI425 +aI-28 +aI347 +aI-49 +aa(lp18927 +g15 +aI114 +aI-266 +aI206 +aI-132 +aI152 +aI-190 +aa(lp18928 +g15 +aI57 +aI-521 +aI76 +aI-341 +aI57 +aI-427 +aa(lp18929 +g15 +aI114 +aI-778 +aI57 +aI-615 +aI76 +aI-701 +aa(lp18930 +g15 +aI277 +aI-955 +aI152 +aI-856 +aI207 +aI-914 +aa(lp18931 +g15 +aI514 +aI-1015 +aI348 +aI-995 +aI427 +aI-1015 +aa(lp18932 +g15 +aI752 +aI-952 +aI602 +aI-1015 +aI681 +aI-994 +aa(lp18933 +g15 +aI914 +aI-777 +aI823 +aI-911 +aI877 +aI-852 +aa(lp18934 +g15 +aI970 +aI-522 +aI951 +aI-701 +aI970 +aI-616 +aa(lp18935 +g15 +aI934 +aI-310 +aI970 +aI-443 +aI958 +aI-373 +aa(lp18936 +g15 +aI826 +aI-146 +aI910 +aI-247 +aI874 +aI-193 +aa(lp18937 +g10 +aa(lp18938 +g8 +aI548 +aI-308 +aa(lp18939 +g15 +aI728 +aI-216 +aI621 +aI-287 +aI681 +aI-257 +aa(lp18940 +g15 +aI839 +aI-522 +aI802 +aI-284 +aI839 +aI-386 +aa(lp18941 +g15 +aI800 +aI-724 +aI839 +aI-599 +aI826 +aI-667 +aa(lp18942 +g15 +aI685 +aI-859 +aI774 +aI-782 +aI735 +aI-827 +aa(lp18943 +g15 +aI514 +aI-907 +aI634 +aI-891 +aI577 +aI-907 +aa(lp18944 +g15 +aI280 +aI-810 +aI420 +aI-907 +aI342 +aI-874 +aa(lp18945 +g15 +aI187 +aI-521 +aI218 +aI-745 +aI187 +aI-649 +aa(lp18946 +g15 +aI279 +aI-235 +aI187 +aI-397 +aI218 +aI-302 +aa(lp18947 +g15 +aI514 +aI-136 +aI341 +aI-169 +aI419 +aI-136 +aa(lp18948 +g15 +aI642 +aI-161 +aI560 +aI-136 +aI602 +aI-144 +aa(lp18949 +g15 +aI517 +aI-216 +aI603 +aI-187 +aI561 +aI-205 +aa(lp18950 +g10 +aa(lp18951 +g8 +aI1037 +aI-44 +aa(lp18952 +g10 +aa(lp18953 +g8 +aI1037 +aI-44 +aasVU +(lp18954 +(lp18955 +g8 +aI729 +aI-998 +aa(lp18956 +g20 +aI855 +aI-998 +aa(lp18957 +g20 +aI855 +aI-447 +aa(lp18958 +g15 +aI822 +aI-218 +aI855 +aI-351 +aI844 +aI-275 +aa(lp18959 +g15 +aI705 +aI-81 +aI801 +aI-162 +aI762 +aI-116 +aa(lp18960 +g15 +aI482 +aI-28 +aI648 +aI-45 +aI574 +aI-28 +aa(lp18961 +g15 +aI263 +aI-74 +aI393 +aI-28 +aI319 +aI-43 +aa(lp18962 +g15 +aI141 +aI-208 +aI206 +aI-105 +aI165 +aI-149 +aa(lp18963 +g15 +aI104 +aI-447 +aI116 +aI-266 +aI104 +aI-346 +aa(lp18964 +g20 +aI104 +aI-998 +aa(lp18965 +g20 +aI231 +aI-998 +aa(lp18966 +g20 +aI231 +aI-448 +aa(lp18967 +g15 +aI254 +aI-264 +aI231 +aI-365 +aI238 +aI-304 +aa(lp18968 +g15 +aI333 +aI-174 +aI269 +aI-225 +aI296 +aI-195 +aa(lp18969 +g15 +aI471 +aI-142 +aI371 +aI-152 +aI417 +aI-142 +aa(lp18970 +g15 +aI669 +aI-205 +aI564 +aI-142 +aI630 +aI-163 +aa(lp18971 +g15 +aI729 +aI-448 +aI709 +aI-247 +aI729 +aI-328 +aa(lp18972 +g10 +aa(lp18973 +g8 +aI962 +aI-44 +aa(lp18974 +g10 +aa(lp18975 +g8 +aI962 +aI-44 +aasVY +(lp18976 +(lp18977 +g8 +aI371 +aI-44 +aa(lp18978 +g20 +aI371 +aI-448 +aa(lp18979 +g20 +aI3 +aI-998 +aa(lp18980 +g20 +aI157 +aI-998 +aa(lp18981 +g20 +aI345 +aI-711 +aa(lp18982 +g15 +aI442 +aI-549 +aI380 +aI-657 +aI412 +aI-603 +aa(lp18983 +g15 +aI546 +aI-718 +aI471 +aI-599 +aI506 +aI-655 +aa(lp18984 +g20 +aI731 +aI-998 +aa(lp18985 +g20 +aI878 +aI-998 +aa(lp18986 +g20 +aI498 +aI-448 +aa(lp18987 +g20 +aI498 +aI-44 +aa(lp18988 +g10 +aa(lp18989 +g8 +aI889 +aI-44 +aa(lp18990 +g10 +aa(lp18991 +g8 +aI889 +aI-44 +aasV] +(lp18992 +(lp18993 +g8 +aI283 +aI220 +aa(lp18994 +g20 +aI25 +aI220 +aa(lp18995 +g20 +aI25 +aI123 +aa(lp18996 +g20 +aI166 +aI123 +aa(lp18997 +g20 +aI166 +aI-901 +aa(lp18998 +g20 +aI25 +aI-901 +aa(lp18999 +g20 +aI25 +aI-998 +aa(lp19000 +g20 +aI283 +aI-998 +aa(lp19001 +g10 +aa(lp19002 +g8 +aI370 +aI-44 +aa(lp19003 +g10 +aa(lp19004 +g8 +aI370 +aI-44 +aasVa +(lp19005 +(lp19006 +g8 +aI539 +aI-129 +aa(lp19007 +g15 +aI413 +aI-51 +aI495 +aI-92 +aI453 +aI-66 +aa(lp19008 +g15 +aI284 +aI-28 +aI373 +aI-36 +aI330 +aI-28 +aa(lp19009 +g15 +aI109 +aI-84 +aI208 +aI-28 +aI150 +aI-47 +aa(lp19010 +g15 +aI48 +aI-226 +aI68 +aI-121 +aI48 +aI-169 +aa(lp19011 +g15 +aI71 +aI-319 +aI48 +aI-260 +aI55 +aI-291 +aa(lp19012 +g15 +aI131 +aI-386 +aI86 +aI-347 +aI106 +aI-369 +aa(lp19013 +g15 +aI216 +aI-425 +aI156 +aI-403 +aI184 +aI-416 +aa(lp19014 +g15 +aI320 +aI-442 +aI239 +aI-431 +aI273 +aI-437 +aa(lp19015 +g15 +aI529 +aI-483 +aI414 +aI-454 +aI484 +aI-467 +aa(lp19016 +g15 +aI529 +aI-513 +aI529 +aI-499 +aI529 +aI-509 +aa(lp19017 +g15 +aI496 +aI-614 +aI529 +aI-561 +aI518 +aI-595 +aa(lp19018 +g15 +aI363 +aI-654 +aI466 +aI-641 +aI422 +aI-654 +aa(lp19019 +g15 +aI241 +aI-625 +aI308 +aI-654 +aI267 +aI-644 +aa(lp19020 +g15 +aI182 +aI-522 +aI214 +aI-606 +aI195 +aI-572 +aa(lp19021 +g20 +aI68 +aI-538 +aa(lp19022 +g15 +aI119 +aI-657 +aI78 +aI-587 +aI95 +aI-627 +aa(lp19023 +g15 +aI223 +aI-727 +aI143 +aI-687 +aI178 +aI-710 +aa(lp19024 +g15 +aI380 +aI-751 +aI268 +aI-743 +aI320 +aI-751 +aa(lp19025 +g15 +aI524 +aI-730 +aI439 +aI-751 +aI487 +aI-744 +aa(lp19026 +g15 +aI605 +aI-678 +aI560 +aI-716 +aI588 +aI-699 +aa(lp19027 +g15 +aI641 +aI-598 +aI622 +aI-657 +aI634 +aI-630 +aa(lp19028 +g15 +aI647 +aI-490 +aI645 +aI-578 +aI647 +aI-542 +aa(lp19029 +g20 +aI647 +aI-334 +aa(lp19030 +g15 +aI655 +aI-127 +aI647 +aI-225 +aI650 +aI-156 +aa(lp19031 +g15 +aI684 +aI-44 +aI660 +aI-98 +aI670 +aI-70 +aa(lp19032 +g20 +aI562 +aI-44 +aa(lp19033 +g15 +aI539 +aI-129 +aI550 +aI-68 +aI542 +aI-97 +aa(lp19034 +g10 +aa(lp19035 +g8 +aI529 +aI-391 +aa(lp19036 +g15 +aI337 +aI-347 +aI486 +aI-374 +aI422 +aI-359 +aa(lp19037 +g15 +aI235 +aI-323 +aI289 +aI-340 +aI255 +aI-332 +aa(lp19038 +g15 +aI189 +aI-285 +aI215 +aI-315 +aI200 +aI-302 +aa(lp19039 +g15 +aI173 +aI-229 +aI178 +aI-268 +aI173 +aI-250 +aa(lp19040 +g15 +aI208 +aI-151 +aI173 +aI-198 +aI185 +aI-172 +aa(lp19041 +g15 +aI312 +aI-120 +aI232 +aI-131 +aI266 +aI-120 +aa(lp19042 +g15 +aI432 +aI-150 +aI357 +aI-120 +aI397 +aI-130 +aa(lp19043 +g15 +aI510 +aI-231 +aI468 +aI-169 +aI493 +aI-197 +aa(lp19044 +g15 +aI529 +aI-348 +aI523 +aI-257 +aI529 +aI-296 +aa(lp19045 +g10 +aa(lp19046 +g8 +aI741 +aI-44 +aa(lp19047 +g10 +aa(lp19048 +g8 +aI741 +aI-44 +aasVe +(lp19049 +(lp19050 +g8 +aI561 +aI-267 +aa(lp19051 +g20 +aI682 +aI-252 +aa(lp19052 +g15 +aI576 +aI-87 +aI663 +aI-181 +aI627 +aI-126 +aa(lp19053 +g15 +aI378 +aI-28 +aI524 +aI-48 +aI458 +aI-28 +aa(lp19054 +g15 +aI137 +aI-122 +aI277 +aI-28 +aI196 +aI-59 +aa(lp19055 +g15 +aI48 +aI-384 +aI78 +aI-184 +aI48 +aI-271 +aa(lp19056 +g15 +aI138 +aI-655 +aI48 +aI-500 +aI78 +aI-590 +aa(lp19057 +g15 +aI371 +aI-751 +aI198 +aI-719 +aI276 +aI-751 +aa(lp19058 +g15 +aI598 +aI-657 +aI464 +aI-751 +aI539 +aI-720 +aa(lp19059 +g15 +aI686 +aI-391 +aI656 +aI-594 +aI686 +aI-505 +aa(lp19060 +g15 +aI685 +aI-360 +aI686 +aI-384 +aI685 +aI-374 +aa(lp19061 +g20 +aI169 +aI-360 +aa(lp19062 +g15 +aI234 +aI-185 +aI174 +aI-284 +aI195 +aI-226 +aa(lp19063 +g15 +aI378 +aI-125 +aI273 +aI-145 +aI321 +aI-125 +aa(lp19064 +g15 +aI488 +aI-159 +aI421 +aI-125 +aI458 +aI-136 +aa(lp19065 +g15 +aI561 +aI-267 +aI519 +aI-181 +aI543 +aI-217 +aa(lp19066 +g10 +aa(lp19067 +g8 +aI176 +aI-456 +aa(lp19068 +g20 +aI562 +aI-456 +aa(lp19069 +g15 +aI518 +aI-587 +aI557 +aI-514 +aI542 +aI-558 +aa(lp19070 +g15 +aI373 +aI-655 +aI480 +aI-632 +aI432 +aI-655 +aa(lp19071 +g15 +aI237 +aI-601 +aI319 +aI-655 +aI273 +aI-637 +aa(lp19072 +g15 +aI176 +aI-456 +aI200 +aI-565 +aI180 +aI-516 +aa(lp19073 +g10 +aa(lp19074 +g8 +aI741 +aI-44 +aa(lp19075 +g10 +aa(lp19076 +g8 +aI741 +aI-44 +aasVi +(lp19077 +(lp19078 +g8 +aI88 +aI-864 +aa(lp19079 +g20 +aI88 +aI-998 +aa(lp19080 +g20 +aI205 +aI-998 +aa(lp19081 +g20 +aI205 +aI-864 +aa(lp19082 +g10 +aa(lp19083 +g8 +aI88 +aI-44 +aa(lp19084 +g20 +aI88 +aI-735 +aa(lp19085 +g20 +aI205 +aI-735 +aa(lp19086 +g20 +aI205 +aI-44 +aa(lp19087 +g10 +aa(lp19088 +g8 +aI296 +aI-44 +aa(lp19089 +g10 +aa(lp19090 +g8 +aI296 +aI-44 +aasVm +(lp19091 +(lp19092 +g8 +aI87 +aI-44 +aa(lp19093 +g20 +aI87 +aI-735 +aa(lp19094 +g20 +aI192 +aI-735 +aa(lp19095 +g20 +aI192 +aI-638 +aa(lp19096 +g15 +aI279 +aI-720 +aI214 +aI-672 +aI243 +aI-699 +aa(lp19097 +g15 +aI402 +aI-751 +aI315 +aI-741 +aI356 +aI-751 +aa(lp19098 +g15 +aI528 +aI-719 +aI453 +aI-751 +aI495 +aI-740 +aa(lp19099 +g15 +aI597 +aI-630 +aI561 +aI-698 +aI584 +aI-668 +aa(lp19100 +g15 +aI811 +aI-751 +aI652 +aI-711 +aI723 +aI-751 +aa(lp19101 +g15 +aI969 +aI-694 +aI879 +aI-751 +aI932 +aI-732 +aa(lp19102 +g15 +aI1024 +aI-519 +aI1006 +aI-656 +aI1024 +aI-598 +aa(lp19103 +g20 +aI1024 +aI-44 +aa(lp19104 +g20 +aI908 +aI-44 +aa(lp19105 +g20 +aI908 +aI-479 +aa(lp19106 +g15 +aI896 +aI-581 +aI908 +aI-526 +aI904 +aI-560 +aa(lp19107 +g15 +aI855 +aI-631 +aI889 +aI-601 +aI875 +aI-618 +aa(lp19108 +g15 +aI785 +aI-649 +aI835 +aI-643 +aI812 +aI-649 +aa(lp19109 +g15 +aI664 +aI-601 +aI736 +aI-649 +aI696 +aI-633 +aa(lp19110 +g15 +aI615 +aI-446 +aI631 +aI-569 +aI615 +aI-517 +aa(lp19111 +g20 +aI615 +aI-44 +aa(lp19112 +g20 +aI498 +aI-44 +aa(lp19113 +g20 +aI498 +aI-493 +aa(lp19114 +g15 +aI470 +aI-610 +aI498 +aI-545 +aI489 +aI-584 +aa(lp19115 +g15 +aI376 +aI-649 +aI450 +aI-636 +aI419 +aI-649 +aa(lp19116 +g15 +aI284 +aI-623 +aI343 +aI-649 +aI312 +aI-641 +aa(lp19117 +g15 +aI223 +aI-547 +aI256 +aI-606 +aI236 +aI-581 +aa(lp19118 +g15 +aI205 +aI-403 +aI211 +aI-514 +aI205 +aI-466 +aa(lp19119 +g20 +aI205 +aI-44 +aa(lp19120 +g10 +aa(lp19121 +g8 +aI1110 +aI-44 +aa(lp19122 +g10 +aa(lp19123 +g8 +aI1110 +aI-44 +aasVq +(lp19124 +(lp19125 +g8 +aI528 +aI220 +aa(lp19126 +g20 +aI528 +aI-118 +aa(lp19127 +g15 +aI452 +aI-54 +aI510 +aI-92 +aI484 +aI-71 +aa(lp19128 +g15 +aI347 +aI-28 +aI419 +aI-37 +aI384 +aI-28 +aa(lp19129 +g15 +aI135 +aI-127 +aI265 +aI-28 +aI194 +aI-61 +aa(lp19130 +g15 +aI46 +aI-396 +aI76 +aI-192 +aI46 +aI-282 +aa(lp19131 +g15 +aI83 +aI-583 +aI46 +aI-466 +aI58 +aI-528 +aa(lp19132 +g15 +aI187 +aI-708 +aI107 +aI-638 +aI142 +aI-680 +aa(lp19133 +g15 +aI338 +aI-751 +aI233 +aI-737 +aI283 +aI-751 +aa(lp19134 +g15 +aI540 +aI-643 +aI424 +aI-751 +aI491 +aI-715 +aa(lp19135 +g20 +aI540 +aI-735 +aa(lp19136 +g20 +aI645 +aI-735 +aa(lp19137 +g20 +aI645 +aI220 +aa(lp19138 +g10 +aa(lp19139 +g8 +aI167 +aI-392 +aa(lp19140 +g15 +aI223 +aI-191 +aI167 +aI-303 +aI185 +aI-236 +aa(lp19141 +g15 +aI357 +aI-125 +aI260 +aI-147 +aI305 +aI-125 +aa(lp19142 +g15 +aI486 +aI-188 +aI407 +aI-125 +aI450 +aI-146 +aa(lp19143 +g15 +aI540 +aI-381 +aI522 +aI-230 +aI540 +aI-295 +aa(lp19144 +g15 +aI483 +aI-589 +aI540 +aI-473 +aI521 +aI-542 +aa(lp19145 +g15 +aI349 +aI-659 +aI445 +aI-635 +aI400 +aI-659 +aa(lp19146 +g15 +aI220 +aI-594 +aI298 +aI-659 +aI255 +aI-637 +aa(lp19147 +g15 +aI167 +aI-392 +aI185 +aI-551 +aI167 +aI-483 +aa(lp19148 +g10 +aa(lp19149 +g8 +aI741 +aI-44 +aa(lp19150 +g10 +aa(lp19151 +g8 +aI741 +aI-44 +aasVu +(lp19152 +(lp19153 +g8 +aI541 +aI-44 +aa(lp19154 +g20 +aI541 +aI-146 +aa(lp19155 +g15 +aI321 +aI-28 +aI487 +aI-67 +aI414 +aI-28 +aa(lp19156 +g15 +aI207 +aI-52 +aI280 +aI-28 +aI242 +aI-36 +aa(lp19157 +g15 +aI128 +aI-111 +aI171 +aI-67 +aI145 +aI-87 +aa(lp19158 +g15 +aI92 +aI-198 +aI111 +aI-134 +aI99 +aI-163 +aa(lp19159 +g15 +aI85 +aI-307 +aI87 +aI-221 +aI85 +aI-257 +aa(lp19160 +g20 +aI85 +aI-735 +aa(lp19161 +g20 +aI202 +aI-735 +aa(lp19162 +g20 +aI202 +aI-352 +aa(lp19163 +g15 +aI209 +aI-228 +aI202 +aI-291 +aI204 +aI-249 +aa(lp19164 +g15 +aI256 +aI-156 +aI217 +aI-197 +aI232 +aI-173 +aa(lp19165 +g15 +aI345 +aI-129 +aI280 +aI-138 +aI309 +aI-129 +aa(lp19166 +g15 +aI444 +aI-156 +aI380 +aI-129 +aI413 +aI-138 +aa(lp19167 +g15 +aI509 +aI-230 +aI474 +aI-174 +aI496 +aI-199 +aa(lp19168 +g15 +aI528 +aI-365 +aI522 +aI-261 +aI528 +aI-306 +aa(lp19169 +g20 +aI528 +aI-735 +aa(lp19170 +g20 +aI645 +aI-735 +aa(lp19171 +g20 +aI645 +aI-44 +aa(lp19172 +g10 +aa(lp19173 +g8 +aI741 +aI-44 +aa(lp19174 +g10 +aa(lp19175 +g8 +aI741 +aI-44 +aasVy +(lp19176 +(lp19177 +g8 +aI82 +aI221 +aa(lp19178 +g20 +aI69 +aI111 +aa(lp19179 +g15 +aI136 +aI122 +aI95 +aI118 +aI117 +aI122 +aa(lp19180 +g15 +aI199 +aI109 +aI162 +aI122 +aI183 +aI117 +aa(lp19181 +g15 +aI237 +aI72 +aI214 +aI100 +aI227 +aI88 +aa(lp19182 +g15 +aI273 +aI-14 +aI245 +aI61 +aI256 +aI31 +aa(lp19183 +g15 +aI283 +aI-43 +aI275 +aI-21 +aI279 +aI-30 +aa(lp19184 +g20 +aI21 +aI-735 +aa(lp19185 +g20 +aI147 +aI-735 +aa(lp19186 +g20 +aI291 +aI-335 +aa(lp19187 +g15 +aI341 +aI-175 +aI310 +aI-284 +aI327 +aI-231 +aa(lp19188 +g15 +aI389 +aI-332 +aI355 +aI-229 +aI371 +aI-281 +aa(lp19189 +g20 +aI537 +aI-735 +aa(lp19190 +g20 +aI654 +aI-735 +aa(lp19191 +g20 +aI391 +aI-32 +aa(lp19192 +g15 +aI326 +aI124 +aI363 +aI43 +aI341 +aI95 +aa(lp19193 +g15 +aI254 +aI209 +aI305 +aI162 +aI281 +aI191 +aa(lp19194 +g15 +aI158 +aI236 +aI227 +aI227 +aI195 +aI236 +aa(lp19195 +g15 +aI82 +aI221 +aI135 +aI236 +aI110 +aI231 +aa(lp19196 +g10 +aa(lp19197 +g8 +aI666 +aI-44 +aa(lp19198 +g10 +aa(lp19199 +g8 +aI666 +aI-44 +aasV} +(lp19200 +(lp19201 +g8 +aI407 +aI-442 +aa(lp19202 +g20 +aI407 +aI-336 +aa(lp19203 +g15 +aI325 +aI-309 +aI374 +aI-335 +aI346 +aI-326 +aa(lp19204 +g15 +aI283 +aI-238 +aI304 +aI-292 +aI290 +aI-268 +aa(lp19205 +g15 +aI272 +aI-85 +aI276 +aI-209 +aI273 +aI-157 +aa(lp19206 +g15 +aI268 +aI57 +aI272 +aI-12 +aI271 +aI34 +aa(lp19207 +g15 +aI247 +aI145 +aI264 +aI94 +aI257 +aI124 +aa(lp19208 +g15 +aI207 +aI198 +aI236 +aI167 +aI223 +aI185 +aa(lp19209 +g15 +aI147 +aI228 +aI192 +aI211 +aI172 +aI222 +aa(lp19210 +g15 +aI67 +aI236 +aI131 +aI233 +aI104 +aI236 +aa(lp19211 +g20 +aI30 +aI236 +aa(lp19212 +g20 +aI30 +aI133 +aa(lp19213 +g20 +aI50 +aI133 +aa(lp19214 +g15 +aI140 +aI109 +aI95 +aI133 +aI125 +aI125 +aa(lp19215 +g15 +aI162 +aI0 +aI155 +aI93 +aI162 +aI56 +aa(lp19216 +g15 +aI168 +aI-206 +aI162 +aI-108 +aI164 +aI-177 +aa(lp19217 +g15 +aI210 +aI-322 +aI175 +aI-254 +aI189 +aI-293 +aa(lp19218 +g15 +aI298 +aI-389 +aI231 +aI-350 +aI260 +aI-373 +aa(lp19219 +g15 +aI193 +aI-484 +aI248 +aI-413 +aI213 +aI-444 +aa(lp19220 +g15 +aI162 +aI-683 +aI172 +aI-523 +aI162 +aI-589 +aa(lp19221 +g15 +aI159 +aI-834 +aI162 +aI-767 +aI161 +aI-818 +aa(lp19222 +g15 +aI133 +aI-895 +aI156 +aI-863 +aI147 +aI-884 +aa(lp19223 +g15 +aI50 +aI-912 +aI119 +aI-907 +aI92 +aI-912 +aa(lp19224 +g20 +aI30 +aI-912 +aa(lp19225 +g20 +aI30 +aI-1015 +aa(lp19226 +g20 +aI67 +aI-1015 +aa(lp19227 +g15 +aI159 +aI-1004 +aI109 +aI-1015 +aI140 +aI-1011 +aa(lp19228 +g15 +aI228 +aI-956 +aI187 +aI-995 +aI210 +aI-979 +aa(lp19229 +g15 +aI263 +aI-871 +aI246 +aI-933 +aI258 +aI-905 +aa(lp19230 +g15 +aI272 +aI-702 +aI269 +aI-836 +aI272 +aI-780 +aa(lp19231 +g15 +aI283 +aI-540 +aI273 +aI-624 +aI276 +aI-570 +aa(lp19232 +g15 +aI325 +aI-470 +aI290 +aI-511 +aI304 +aI-487 +aa(lp19233 +g15 +aI407 +aI-442 +aI346 +aI-452 +aI374 +aI-443 +aa(lp19234 +g10 +aa(lp19235 +g8 +aI445 +aI-44 +aa(lp19236 +g10 +aa(lp19237 +g8 +aI445 +aI-44 +aasssS'Droid Sans' +p19238 +(dp19239 +g4270 +(dp19240 +V +(lp19241 +(lp19242 +g8 +aI346 +aI0 +aa(lp19243 +g10 +aa(lp19244 +g8 +aI346 +aI0 +aasV$ +(lp19245 +(lp19246 +g8 +aI690 +aI-297 +aa(lp19247 +g15 +aI673 +aI-206 +aI690 +aI-264 +aI685 +aI-234 +aa(lp19248 +g15 +aI622 +aI-133 +aI662 +aI-178 +aI644 +aI-154 +aa(lp19249 +g15 +aI537 +aI-82 +aI599 +aI-112 +aI570 +aI-95 +aa(lp19250 +g15 +aI419 +aI-55 +aI503 +aI-68 +aI464 +aI-59 +aa(lp19251 +g20 +aI419 +aI77 +aa(lp19252 +g20 +aI330 +aI77 +aa(lp19253 +g20 +aI330 +aI-52 +aa(lp19254 +g15 +aI251 +aI-58 +aI302 +aI-53 +aI275 +aI-55 +aa(lp19255 +g15 +aI182 +aI-69 +aI226 +aI-60 +aI204 +aI-64 +aa(lp19256 +g15 +aI122 +aI-86 +aI161 +aI-73 +aI141 +aI-79 +aa(lp19257 +g15 +aI65 +aI-108 +aI102 +aI-93 +aI83 +aI-100 +aa(lp19258 +g20 +aI65 +aI-280 +aa(lp19259 +g15 +aI124 +aI-254 +aI83 +aI-271 +aI103 +aI-263 +aa(lp19260 +g15 +aI191 +aI-232 +aI146 +aI-246 +aI168 +aI-239 +aa(lp19261 +g15 +aI261 +aI-215 +aI214 +aI-225 +aI237 +aI-219 +aa(lp19262 +g15 +aI330 +aI-205 +aI285 +aI-210 +aI308 +aI-207 +aa(lp19263 +g20 +aI330 +aI-412 +aa(lp19264 +g15 +aI319 +aI-417 +aI327 +aI-414 +aI323 +aI-415 +aa(lp19265 +g15 +aI309 +aI-421 +aI316 +aI-418 +aI312 +aI-420 +aa(lp19266 +g15 +aI300 +aI-424 +aI305 +aI-422 +aI302 +aI-423 +aa(lp19267 +g15 +aI196 +aI-472 +aI260 +aI-439 +aI226 +aI-455 +aa(lp19268 +g15 +aI122 +aI-527 +aI167 +aI-488 +aI142 +aI-507 +aa(lp19269 +g15 +aI78 +aI-595 +aI102 +aI-547 +aI88 +aI-570 +aa(lp19270 +g15 +aI63 +aI-679 +aI68 +aI-619 +aI63 +aI-647 +aa(lp19271 +g15 +aI82 +aI-768 +aI63 +aI-711 +aI69 +aI-741 +aa(lp19272 +g15 +aI135 +aI-837 +aI94 +aI-794 +aI112 +aI-818 +aa(lp19273 +g15 +aI219 +aI-885 +aI158 +aI-857 +aI186 +aI-873 +aa(lp19274 +g15 +aI330 +aI-910 +aI252 +aI-898 +aI289 +aI-906 +aa(lp19275 +g20 +aI330 +aI-1012 +aa(lp19276 +g20 +aI419 +aI-1012 +aa(lp19277 +g20 +aI419 +aI-914 +aa(lp19278 +g15 +aI535 +aI-897 +aI457 +aI-912 +aI496 +aI-906 +aa(lp19279 +g15 +aI660 +aI-856 +aI575 +aI-889 +aI616 +aI-875 +aa(lp19280 +g20 +aI594 +aI-704 +aa(lp19281 +g15 +aI506 +aI-734 +aI566 +aI-715 +aI536 +aI-726 +aa(lp19282 +g15 +aI419 +aI-751 +aI475 +aI-743 +aI446 +aI-749 +aa(lp19283 +g20 +aI419 +aI-560 +aa(lp19284 +g20 +aI445 +aI-551 +aa(lp19285 +g15 +aI553 +aI-504 +aI486 +aI-536 +aI522 +aI-520 +aa(lp19286 +g15 +aI630 +aI-450 +aI584 +aI-488 +aI609 +aI-470 +aa(lp19287 +g15 +aI675 +aI-383 +aI650 +aI-430 +aI665 +aI-408 +aa(lp19288 +g15 +aI690 +aI-297 +aI685 +aI-358 +aI690 +aI-330 +aa(lp19289 +g10 +aa(lp19290 +g8 +aI494 +aI-293 +aa(lp19291 +g15 +aI490 +aI-320 +aI494 +aI-303 +aI493 +aI-312 +aa(lp19292 +g15 +aI477 +aI-341 +aI487 +aI-328 +aI483 +aI-335 +aa(lp19293 +g15 +aI454 +aI-359 +aI471 +aI-348 +aI463 +aI-354 +aa(lp19294 +g15 +aI419 +aI-377 +aI444 +aI-365 +aI433 +aI-371 +aa(lp19295 +g20 +aI419 +aI-213 +aa(lp19296 +g15 +aI476 +aI-238 +aI445 +aI-216 +aI464 +aI-225 +aa(lp19297 +g15 +aI494 +aI-293 +aI488 +aI-251 +aI494 +aI-269 +aa(lp19298 +g10 +aa(lp19299 +g8 +aI259 +aI-683 +aa(lp19300 +g15 +aI276 +aI-632 +aI259 +aI-663 +aI265 +aI-646 +aa(lp19301 +g15 +aI330 +aI-598 +aI287 +aI-619 +aI305 +aI-607 +aa(lp19302 +g20 +aI330 +aI-750 +aa(lp19303 +g15 +aI277 +aI-730 +aI307 +aI-747 +aI289 +aI-741 +aa(lp19304 +g15 +aI259 +aI-683 +aI265 +aI-720 +aI259 +aI-704 +aa(lp19305 +g10 +aa(lp19306 +g8 +aI734 +aI0 +aa(lp19307 +g10 +aa(lp19308 +g8 +aI734 +aI0 +aasV( +(lp19309 +(lp19310 +g8 +aI53 +aI-364 +aa(lp19311 +g15 +aI65 +aI-525 +aI53 +aI-419 +aI57 +aI-472 +aa(lp19312 +g15 +aI100 +aI-678 +aI72 +aI-577 +aI84 +aI-629 +aa(lp19313 +g15 +aI161 +aI-822 +aI116 +aI-728 +aI137 +aI-776 +aa(lp19314 +g15 +aI249 +aI-951 +aI186 +aI-867 +aI215 +aI-911 +aa(lp19315 +g20 +aI412 +aI-951 +aa(lp19316 +g15 +aI273 +aI-675 +aI350 +aI-867 +aI304 +aI-775 +aa(lp19317 +g15 +aI226 +aI-366 +aI242 +aI-575 +aI226 +aI-471 +aa(lp19318 +g15 +aI238 +aI-211 +aI226 +aI-314 +aI230 +aI-263 +aa(lp19319 +g15 +aI273 +aI-61 +aI246 +aI-160 +aI257 +aI-110 +aa(lp19320 +g15 +aI331 +aI81 +aI289 +aI-12 +aI308 +aI35 +aa(lp19321 +g15 +aI410 +aI211 +aI354 +aI127 +aI380 +aI170 +aa(lp19322 +g20 +aI249 +aI211 +aa(lp19323 +g15 +aI161 +aI85 +aI215 +aI172 +aI186 +aI130 +aa(lp19324 +g15 +aI100 +aI-54 +aI137 +aI41 +aI116 +aI-5 +aa(lp19325 +g15 +aI65 +aI-205 +aI84 +aI-103 +aI72 +aI-153 +aa(lp19326 +g15 +aI53 +aI-364 +aI57 +aI-258 +aI53 +aI-310 +aa(lp19327 +g10 +aa(lp19328 +g8 +aI451 +aI0 +aa(lp19329 +g10 +aa(lp19330 +g8 +aI451 +aI0 +aasV, +(lp19331 +(lp19332 +g8 +aI298 +aI-139 +aa(lp19333 +g15 +aI277 +aI-64 +aI292 +aI-116 +aI285 +aI-91 +aa(lp19334 +g15 +aI249 +aI15 +aI268 +aI-38 +aI259 +aI-11 +aa(lp19335 +g15 +aI217 +aI95 +aI238 +aI42 +aI228 +aI69 +aa(lp19336 +g15 +aI184 +aI172 +aI206 +aI122 +aI195 +aI148 +aa(lp19337 +g20 +aI41 +aI172 +aa(lp19338 +g15 +aI60 +aI89 +aI47 +aI145 +aI53 +aI118 +aa(lp19339 +g15 +aI78 +aI4 +aI66 +aI60 +aI72 +aI32 +aa(lp19340 +g15 +aI94 +aI-79 +aI84 +aI-24 +aI89 +aI-52 +aa(lp19341 +g15 +aI106 +aI-154 +aI99 +aI-106 +aI103 +aI-131 +aa(lp19342 +g20 +aI289 +aI-154 +aa(lp19343 +g10 +aa(lp19344 +g8 +aI386 +aI0 +aa(lp19345 +g10 +aa(lp19346 +g8 +aI386 +aI0 +aasV0 +(lp19347 +(lp19348 +g8 +aI693 +aI-475 +aa(lp19349 +g15 +aI675 +aI-269 +aI693 +aI-398 +aI687 +aI-330 +aa(lp19350 +g15 +aI618 +aI-116 +aI663 +aI-209 +aI644 +aI-158 +aa(lp19351 +g15 +aI516 +aI-19 +aI591 +aI-73 +aI558 +aI-41 +aa(lp19352 +g15 +aI366 +aI13 +aI475 +aI2 +aI425 +aI13 +aa(lp19353 +g15 +aI222 +aI-19 +aI311 +aI13 +aI263 +aI2 +aa(lp19354 +g15 +aI121 +aI-116 +aI181 +aI-41 +aI148 +aI-73 +aa(lp19355 +g15 +aI60 +aI-269 +aI94 +aI-158 +aI74 +aI-209 +aa(lp19356 +g15 +aI41 +aI-475 +aI47 +aI-330 +aI41 +aI-398 +aa(lp19357 +g15 +aI58 +aI-681 +aI41 +aI-552 +aI46 +aI-621 +aa(lp19358 +g15 +aI115 +aI-836 +aI70 +aI-742 +aI89 +aI-794 +aa(lp19359 +g15 +aI216 +aI-932 +aI141 +aI-878 +aI175 +aI-910 +aa(lp19360 +g15 +aI366 +aI-966 +aI258 +aI-955 +aI307 +aI-966 +aa(lp19361 +g15 +aI509 +aI-933 +aI421 +aI-966 +aI468 +aI-955 +aa(lp19362 +g15 +aI611 +aI-836 +aI550 +aI-911 +aI584 +aI-878 +aa(lp19363 +g15 +aI673 +aI-682 +aI639 +aI-794 +aI659 +aI-743 +aa(lp19364 +g15 +aI693 +aI-475 +aI686 +aI-621 +aI693 +aI-552 +aa(lp19365 +g10 +aa(lp19366 +g8 +aI241 +aI-475 +aa(lp19367 +g15 +aI269 +aI-230 +aI241 +aI-366 +aI250 +aI-285 +aa(lp19368 +g15 +aI366 +aI-148 +aI288 +aI-175 +aI320 +aI-148 +aa(lp19369 +g15 +aI463 +aI-230 +aI411 +aI-148 +aI444 +aI-175 +aa(lp19370 +g15 +aI493 +aI-475 +aI483 +aI-284 +aI493 +aI-366 +aa(lp19371 +g15 +aI463 +aI-721 +aI493 +aI-584 +aI483 +aI-666 +aa(lp19372 +g15 +aI366 +aI-803 +aI444 +aI-776 +aI411 +aI-803 +aa(lp19373 +g15 +aI308 +aI-782 +aI343 +aI-803 +aI324 +aI-796 +aa(lp19374 +g15 +aI269 +aI-720 +aI292 +aI-768 +aI279 +aI-748 +aa(lp19375 +g15 +aI248 +aI-618 +aI259 +aI-693 +aI252 +aI-659 +aa(lp19376 +g15 +aI241 +aI-475 +aI243 +aI-577 +aI241 +aI-529 +aa(lp19377 +g10 +aa(lp19378 +g8 +aI734 +aI0 +aa(lp19379 +g10 +aa(lp19380 +g8 +aI734 +aI0 +aasV4 +(lp19381 +(lp19382 +g8 +aI706 +aI-196 +aa(lp19383 +g20 +aI591 +aI-196 +aa(lp19384 +g20 +aI591 +aI0 +aa(lp19385 +g20 +aI395 +aI0 +aa(lp19386 +g20 +aI395 +aI-196 +aa(lp19387 +g20 +aI2 +aI-196 +aa(lp19388 +g20 +aI2 +aI-336 +aa(lp19389 +g20 +aI406 +aI-951 +aa(lp19390 +g20 +aI591 +aI-951 +aa(lp19391 +g20 +aI591 +aI-353 +aa(lp19392 +g20 +aI706 +aI-353 +aa(lp19393 +g10 +aa(lp19394 +g8 +aI395 +aI-353 +aa(lp19395 +g20 +aI395 +aI-514 +aa(lp19396 +g15 +aI396 +aI-538 +aI395 +aI-520 +aI395 +aI-528 +aa(lp19397 +g15 +aI397 +aI-575 +aI396 +aI-549 +aI396 +aI-561 +aa(lp19398 +g15 +aI398 +aI-616 +aI397 +aI-588 +aI398 +aI-602 +aa(lp19399 +g15 +aI400 +aI-657 +aI399 +aI-631 +aI400 +aI-644 +aa(lp19400 +g15 +aI402 +aI-691 +aI401 +aI-670 +aI402 +aI-682 +aa(lp19401 +g15 +aI404 +aI-713 +aI403 +aI-701 +aI403 +aI-708 +aa(lp19402 +g20 +aI398 +aI-713 +aa(lp19403 +g15 +aI372 +aI-655 +aI390 +aI-694 +aI381 +aI-675 +aa(lp19404 +g15 +aI338 +aI-593 +aI362 +aI-634 +aI351 +aI-614 +aa(lp19405 +g20 +aI179 +aI-353 +aa(lp19406 +g10 +aa(lp19407 +g8 +aI734 +aI0 +aa(lp19408 +g10 +aa(lp19409 +g8 +aI734 +aI0 +aasV8 +(lp19410 +(lp19411 +g8 +aI367 +aI-963 +aa(lp19412 +g15 +aI479 +aI-949 +aI407 +aI-963 +aI444 +aI-958 +aa(lp19413 +g15 +aI572 +aI-906 +aI514 +aI-939 +aI545 +aI-925 +aa(lp19414 +g15 +aI635 +aI-834 +aI598 +aI-887 +aI619 +aI-863 +aa(lp19415 +g15 +aI658 +aI-733 +aI651 +aI-806 +aI658 +aI-772 +aa(lp19416 +g15 +aI645 +aI-656 +aI658 +aI-705 +aI654 +aI-679 +aa(lp19417 +g15 +aI610 +aI-592 +aI637 +aI-632 +aI625 +aI-611 +aa(lp19418 +g15 +aI555 +aI-542 +aI594 +aI-574 +aI576 +aI-557 +aa(lp19419 +g15 +aI488 +aI-502 +aI535 +aI-527 +aI512 +aI-514 +aa(lp19420 +g15 +aI562 +aI-457 +aI513 +aI-488 +aI538 +aI-473 +aa(lp19421 +g15 +aI626 +aI-401 +aI586 +aI-440 +aI607 +aI-422 +aa(lp19422 +g15 +aI671 +aI-332 +aI644 +aI-380 +aI659 +aI-357 +aa(lp19423 +g15 +aI688 +aI-246 +aI682 +aI-306 +aI688 +aI-277 +aa(lp19424 +g15 +aI664 +aI-138 +aI688 +aI-206 +aI680 +aI-170 +aa(lp19425 +g15 +aI598 +aI-56 +aI649 +aI-106 +aI627 +aI-79 +aa(lp19426 +g15 +aI497 +aI-4 +aI570 +aI-34 +aI537 +aI-16 +aa(lp19427 +g15 +aI367 +aI13 +aI458 +aI7 +aI415 +aI13 +aa(lp19428 +g15 +aI231 +aI-4 +aI316 +aI13 +aI271 +aI7 +aa(lp19429 +g15 +aI130 +aI-54 +aI191 +aI-15 +aI157 +aI-32 +aa(lp19430 +g15 +aI68 +aI-134 +aI102 +aI-75 +aI82 +aI-102 +aa(lp19431 +g15 +aI46 +aI-241 +aI53 +aI-165 +aI46 +aI-201 +aa(lp19432 +g15 +aI61 +aI-328 +aI46 +aI-273 +aI51 +aI-302 +aa(lp19433 +g15 +aI100 +aI-399 +aI70 +aI-355 +aI83 +aI-378 +aa(lp19434 +g15 +aI158 +aI-454 +aI116 +aI-420 +aI136 +aI-438 +aa(lp19435 +g15 +aI229 +aI-496 +aI180 +aI-470 +aI203 +aI-484 +aa(lp19436 +g15 +aI169 +aI-540 +aI207 +aI-510 +aI187 +aI-525 +aa(lp19437 +g15 +aI120 +aI-593 +aI150 +aI-556 +aI134 +aI-574 +aa(lp19438 +g15 +aI88 +aI-657 +aI107 +aI-612 +aI96 +aI-634 +aa(lp19439 +g15 +aI76 +aI-735 +aI80 +aI-681 +aI76 +aI-707 +aa(lp19440 +g15 +aI99 +aI-834 +aI76 +aI-772 +aI84 +aI-806 +aa(lp19441 +g15 +aI164 +aI-906 +aI115 +aI-862 +aI137 +aI-886 +aa(lp19442 +g15 +aI257 +aI-949 +aI190 +aI-925 +aI222 +aI-939 +aa(lp19443 +g15 +aI367 +aI-963 +aI292 +aI-958 +aI329 +aI-963 +aa(lp19444 +g10 +aa(lp19445 +g8 +aI233 +aI-252 +aa(lp19446 +g15 +aI241 +aI-204 +aI233 +aI-235 +aI235 +aI-219 +aa(lp19447 +g15 +aI266 +aI-167 +aI247 +aI-190 +aI255 +aI-177 +aa(lp19448 +g15 +aI307 +aI-143 +aI277 +aI-157 +aI291 +aI-148 +aa(lp19449 +g15 +aI365 +aI-134 +aI324 +aI-137 +aI343 +aI-134 +aa(lp19450 +g15 +aI467 +aI-166 +aI410 +aI-134 +aI444 +aI-145 +aa(lp19451 +g15 +aI501 +aI-251 +aI490 +aI-188 +aI501 +aI-216 +aa(lp19452 +g15 +aI489 +aI-300 +aI501 +aI-269 +aI497 +aI-286 +aa(lp19453 +g15 +aI460 +aI-341 +aI482 +aI-315 +aI472 +aI-328 +aa(lp19454 +g15 +aI419 +aI-375 +aI448 +aI-353 +aI435 +aI-364 +aa(lp19455 +g15 +aI374 +aI-405 +aI404 +aI-385 +aI389 +aI-395 +aa(lp19456 +g20 +aI360 +aI-414 +aa(lp19457 +g15 +aI307 +aI-383 +aI340 +aI-404 +aI323 +aI-394 +aa(lp19458 +g15 +aI267 +aI-346 +aI292 +aI-372 +aI278 +aI-360 +aa(lp19459 +g15 +aI242 +aI-303 +aI256 +aI-333 +aI248 +aI-319 +aa(lp19460 +g15 +aI233 +aI-252 +aI236 +aI-287 +aI233 +aI-271 +aa(lp19461 +g10 +aa(lp19462 +g8 +aI366 +aI-816 +aa(lp19463 +g15 +aI326 +aI-810 +aI352 +aI-816 +aI338 +aI-814 +aa(lp19464 +g15 +aI294 +aI-791 +aI314 +aI-805 +aI303 +aI-799 +aa(lp19465 +g15 +aI273 +aI-760 +aI285 +aI-782 +aI278 +aI-772 +aa(lp19466 +g15 +aI265 +aI-719 +aI268 +aI-748 +aI265 +aI-734 +aa(lp19467 +g15 +aI273 +aI-672 +aI265 +aI-701 +aI268 +aI-685 +aa(lp19468 +g15 +aI295 +aI-637 +aI279 +aI-659 +aI286 +aI-647 +aa(lp19469 +g15 +aI328 +aI-609 +aI305 +aI-627 +aI316 +aI-617 +aa(lp19470 +g15 +aI367 +aI-586 +aI340 +aI-601 +aI353 +aI-593 +aa(lp19471 +g15 +aI406 +aI-608 +aI381 +aI-593 +aI394 +aI-600 +aa(lp19472 +g15 +aI438 +aI-637 +aI418 +aI-617 +aI429 +aI-626 +aa(lp19473 +g15 +aI460 +aI-673 +aI447 +aI-647 +aI455 +aI-659 +aa(lp19474 +g15 +aI469 +aI-719 +aI466 +aI-686 +aI469 +aI-702 +aa(lp19475 +g15 +aI461 +aI-760 +aI469 +aI-734 +aI466 +aI-748 +aa(lp19476 +g15 +aI440 +aI-791 +aI456 +aI-772 +aI449 +aI-782 +aa(lp19477 +g15 +aI407 +aI-810 +aI430 +aI-799 +aI420 +aI-805 +aa(lp19478 +g15 +aI366 +aI-816 +aI394 +aI-814 +aI381 +aI-816 +aa(lp19479 +g10 +aa(lp19480 +g8 +aI734 +aI0 +aa(lp19481 +g10 +aa(lp19482 +g8 +aI734 +aI0 +aasV< +(lp19483 +(lp19484 +g8 +aI677 +aI-131 +aa(lp19485 +g20 +aI57 +aI-416 +aa(lp19486 +g20 +aI57 +aI-509 +aa(lp19487 +g20 +aI677 +aI-832 +aa(lp19488 +g20 +aI677 +aI-676 +aa(lp19489 +g20 +aI258 +aI-470 +aa(lp19490 +g20 +aI677 +aI-287 +aa(lp19491 +g10 +aa(lp19492 +g8 +aI734 +aI0 +aa(lp19493 +g10 +aa(lp19494 +g8 +aI734 +aI0 +aasV@ +(lp19495 +(lp19496 +g8 +aI1089 +aI-489 +aa(lp19497 +g15 +aI1074 +aI-366 +aI1089 +aI-447 +aI1084 +aI-407 +aa(lp19498 +g15 +aI1029 +aI-258 +aI1064 +aI-326 +aI1049 +aI-290 +aa(lp19499 +g15 +aI954 +aI-180 +aI1009 +aI-226 +aI984 +aI-200 +aa(lp19500 +g15 +aI848 +aI-151 +aI924 +aI-161 +aI889 +aI-151 +aa(lp19501 +g15 +aI801 +aI-157 +aI831 +aI-151 +aI816 +aI-153 +aa(lp19502 +g15 +aI761 +aI-175 +aI787 +aI-161 +aI773 +aI-167 +aa(lp19503 +g15 +aI730 +aI-201 +aI749 +aI-182 +aI739 +aI-191 +aa(lp19504 +g15 +aI709 +aI-235 +aI721 +aI-211 +aI714 +aI-223 +aa(lp19505 +g20 +aI699 +aI-235 +aa(lp19506 +g15 +aI671 +aI-203 +aI691 +aI-224 +aI682 +aI-213 +aa(lp19507 +g15 +aI634 +aI-176 +aI660 +aI-193 +aI648 +aI-184 +aa(lp19508 +g15 +aI590 +aI-158 +aI621 +aI-168 +aI606 +aI-162 +aa(lp19509 +g15 +aI537 +aI-151 +aI573 +aI-153 +aI556 +aI-151 +aa(lp19510 +g15 +aI441 +aI-169 +aI501 +aI-151 +aI469 +aI-157 +aa(lp19511 +g15 +aI370 +aI-222 +aI413 +aI-182 +aI389 +aI-199 +aa(lp19512 +g15 +aI326 +aI-304 +aI351 +aI-245 +aI336 +aI-272 +aa(lp19513 +g15 +aI311 +aI-410 +aI316 +aI-336 +aI311 +aI-371 +aa(lp19514 +g15 +aI332 +aI-533 +aI311 +aI-455 +aI318 +aI-496 +aa(lp19515 +g15 +aI389 +aI-630 +aI345 +aI-570 +aI364 +aI-602 +aa(lp19516 +g15 +aI481 +aI-693 +aI415 +aI-657 +aI445 +aI-678 +aa(lp19517 +g15 +aI602 +aI-715 +aI517 +aI-708 +aI558 +aI-715 +aa(lp19518 +g15 +aI663 +aI-712 +aI622 +aI-715 +aI642 +aI-714 +aa(lp19519 +g15 +aI723 +aI-703 +aI684 +aI-710 +aI704 +aI-707 +aa(lp19520 +g15 +aI777 +aI-692 +aI742 +aI-700 +aI761 +aI-696 +aa(lp19521 +g15 +aI821 +aI-679 +aI794 +aI-687 +aI809 +aI-683 +aa(lp19522 +g20 +aI807 +aI-406 +aa(lp19523 +g15 +aI806 +aI-378 +aI807 +aI-396 +aI806 +aI-387 +aa(lp19524 +g15 +aI806 +aI-360 +aI806 +aI-369 +aI806 +aI-363 +aa(lp19525 +g15 +aI810 +aI-315 +aI806 +aI-342 +aI808 +aI-327 +aa(lp19526 +g15 +aI821 +aI-288 +aI813 +aI-304 +aI817 +aI-295 +aa(lp19527 +g15 +aI837 +aI-274 +aI826 +aI-281 +aI831 +aI-276 +aa(lp19528 +g15 +aI856 +aI-270 +aI843 +aI-271 +aI849 +aI-270 +aa(lp19529 +g15 +aI895 +aI-287 +aI871 +aI-270 +aI884 +aI-276 +aa(lp19530 +g15 +aI923 +aI-335 +aI907 +aI-299 +aI916 +aI-315 +aa(lp19531 +g15 +aI940 +aI-405 +aI931 +aI-355 +aI936 +aI-378 +aa(lp19532 +g15 +aI946 +aI-490 +aI944 +aI-432 +aI946 +aI-460 +aa(lp19533 +g15 +aI921 +aI-638 +aI946 +aI-545 +aI938 +aI-595 +aa(lp19534 +g15 +aI853 +aI-748 +aI905 +aI-682 +aI882 +aI-718 +aa(lp19535 +g15 +aI748 +aI-817 +aI823 +aI-778 +aI789 +aI-801 +aa(lp19536 +g15 +aI617 +aI-840 +aI708 +aI-832 +aI664 +aI-840 +aa(lp19537 +g15 +aI441 +aI-807 +aI550 +aI-840 +aI492 +aI-829 +aa(lp19538 +g15 +aI314 +aI-714 +aI391 +aI-785 +aI348 +aI-754 +aa(lp19539 +g15 +aI237 +aI-573 +aI280 +aI-675 +aI254 +aI-628 +aa(lp19540 +g15 +aI210 +aI-395 +aI219 +aI-519 +aI210 +aI-460 +aa(lp19541 +g15 +aI233 +aI-236 +aI210 +aI-335 +aI218 +aI-282 +aa(lp19542 +g15 +aI301 +aI-119 +aI248 +aI-189 +aI271 +aI-151 +aa(lp19543 +g15 +aI412 +aI-48 +aI331 +aI-88 +aI368 +aI-64 +aa(lp19544 +g15 +aI563 +aI-23 +aI455 +aI-31 +aI506 +aI-23 +aa(lp19545 +g15 +aI638 +aI-28 +aI588 +aI-23 +aI613 +aI-25 +aa(lp19546 +g15 +aI715 +aI-40 +aI664 +aI-31 +aI689 +aI-35 +aa(lp19547 +g15 +aI790 +aI-59 +aI740 +aI-45 +aI765 +aI-52 +aa(lp19548 +g15 +aI860 +aI-83 +aI814 +aI-66 +aI837 +aI-74 +aa(lp19549 +g20 +aI860 +aI41 +aa(lp19550 +g15 +aI724 +aI84 +aI819 +aI59 +aI773 +aI74 +aa(lp19551 +g15 +aI565 +aI100 +aI674 +aI95 +aI621 +aI100 +aa(lp19552 +g15 +aI354 +aI67 +aI486 +aI100 +aI416 +aI89 +aa(lp19553 +g15 +aI197 +aI-29 +aI292 +aI44 +aI240 +aI12 +aa(lp19554 +g15 +aI100 +aI-184 +aI155 +aI-71 +aI122 +aI-123 +aa(lp19555 +g15 +aI66 +aI-391 +aI77 +aI-245 +aI66 +aI-314 +aa(lp19556 +g15 +aI83 +aI-546 +aI66 +aI-445 +aI72 +aI-496 +aa(lp19557 +g15 +aI134 +aI-683 +aI95 +aI-595 +aI112 +aI-641 +aa(lp19558 +g15 +aI215 +aI-798 +aI156 +aI-725 +aI183 +aI-764 +aa(lp19559 +g15 +aI324 +aI-887 +aI247 +aI-833 +aI284 +aI-862 +aa(lp19560 +g15 +aI459 +aI-943 +aI365 +aI-911 +aI410 +aI-930 +aa(lp19561 +g15 +aI617 +aI-963 +aI508 +aI-957 +aI561 +aI-963 +aa(lp19562 +g15 +aI806 +aI-930 +aI685 +aI-963 +aI748 +aI-952 +aa(lp19563 +g15 +aI956 +aI-836 +aI864 +aI-908 +aI914 +aI-877 +aa(lp19564 +g15 +aI1054 +aI-687 +aI997 +aI-795 +aI1030 +aI-745 +aa(lp19565 +g15 +aI1089 +aI-489 +aI1077 +aI-628 +aI1089 +aI-562 +aa(lp19566 +g10 +aa(lp19567 +g8 +aI462 +aI-407 +aa(lp19568 +g15 +aI487 +aI-302 +aI462 +aI-359 +aI471 +aI-324 +aa(lp19569 +g15 +aI553 +aI-270 +aI504 +aI-281 +aI526 +aI-270 +aa(lp19570 +g15 +aI600 +aI-283 +aI571 +aI-270 +aI587 +aI-274 +aa(lp19571 +g15 +aI633 +aI-318 +aI613 +aI-291 +aI624 +aI-303 +aa(lp19572 +g15 +aI652 +aI-374 +aI641 +aI-334 +aI648 +aI-352 +aa(lp19573 +g15 +aI661 +aI-446 +aI657 +aI-395 +aI660 +aI-419 +aa(lp19574 +g20 +aI669 +aI-590 +aa(lp19575 +g15 +aI638 +aI-595 +aI660 +aI-592 +aI650 +aI-593 +aa(lp19576 +g15 +aI602 +aI-597 +aI626 +aI-596 +aI615 +aI-597 +aa(lp19577 +g15 +aI537 +aI-580 +aI577 +aI-597 +aI555 +aI-591 +aa(lp19578 +g15 +aI494 +aI-537 +aI519 +aI-570 +aI505 +aI-555 +aa(lp19579 +g15 +aI470 +aI-477 +aI483 +aI-520 +aI475 +aI-499 +aa(lp19580 +g15 +aI462 +aI-407 +aI465 +aI-454 +aI462 +aI-431 +aa(lp19581 +g10 +aa(lp19582 +g8 +aI1154 +aI0 +aa(lp19583 +g10 +aa(lp19584 +g8 +aI1154 +aI0 +aasVD +(lp19585 +(lp19586 +g8 +aI856 +aI-484 +aa(lp19587 +g15 +aI823 +aI-273 +aI856 +aI-404 +aI845 +aI-333 +aa(lp19588 +g15 +aI728 +aI-121 +aI801 +aI-212 +aI769 +aI-162 +aa(lp19589 +g15 +aI575 +aI-30 +aI686 +aI-81 +aI635 +aI-50 +aa(lp19590 +g15 +aI370 +aI0 +aI515 +aI-9 +aI447 +aI0 +aa(lp19591 +g20 +aI119 +aI0 +aa(lp19592 +g20 +aI119 +aI-951 +aa(lp19593 +g20 +aI398 +aI-951 +aa(lp19594 +g15 +aI587 +aI-921 +aI468 +aI-951 +aI531 +aI-941 +aa(lp19595 +g15 +aI731 +aI-832 +aI643 +aI-901 +aI691 +aI-871 +aa(lp19596 +g15 +aI823 +aI-686 +aI771 +aI-793 +aI802 +aI-744 +aa(lp19597 +g15 +aI856 +aI-484 +aI845 +aI-628 +aI856 +aI-560 +aa(lp19598 +g10 +aa(lp19599 +g8 +aI651 +aI-479 +aa(lp19600 +g15 +aI635 +aI-616 +aI651 +aI-532 +aI646 +aI-577 +aa(lp19601 +g15 +aI589 +aI-711 +aI625 +aI-654 +aI609 +aI-686 +aa(lp19602 +g15 +aI515 +aI-767 +aI569 +aI-736 +aI544 +aI-755 +aa(lp19603 +g15 +aI414 +aI-786 +aI486 +aI-779 +aI452 +aI-786 +aa(lp19604 +g20 +aI321 +aI-786 +aa(lp19605 +g20 +aI321 +aI-166 +aa(lp19606 +g20 +aI395 +aI-166 +aa(lp19607 +g15 +aI587 +aI-244 +aI480 +aI-166 +aI544 +aI-192 +aa(lp19608 +g15 +aI651 +aI-479 +aI630 +aI-296 +aI651 +aI-374 +aa(lp19609 +g10 +aa(lp19610 +g8 +aI933 +aI0 +aa(lp19611 +g10 +aa(lp19612 +g8 +aI933 +aI0 +aasVH +(lp19613 +(lp19614 +g8 +aI846 +aI0 +aa(lp19615 +g20 +aI645 +aI0 +aa(lp19616 +g20 +aI645 +aI-410 +aa(lp19617 +g20 +aI321 +aI-410 +aa(lp19618 +g20 +aI321 +aI0 +aa(lp19619 +g20 +aI119 +aI0 +aa(lp19620 +g20 +aI119 +aI-951 +aa(lp19621 +g20 +aI321 +aI-951 +aa(lp19622 +g20 +aI321 +aI-578 +aa(lp19623 +g20 +aI645 +aI-578 +aa(lp19624 +g20 +aI645 +aI-951 +aa(lp19625 +g20 +aI846 +aI-951 +aa(lp19626 +g10 +aa(lp19627 +g8 +aI966 +aI0 +aa(lp19628 +g10 +aa(lp19629 +g8 +aI966 +aI0 +aasVL +(lp19630 +(lp19631 +g8 +aI119 +aI0 +aa(lp19632 +g20 +aI119 +aI-951 +aa(lp19633 +g20 +aI321 +aI-951 +aa(lp19634 +g20 +aI321 +aI-166 +aa(lp19635 +g20 +aI667 +aI-166 +aa(lp19636 +g20 +aI667 +aI0 +aa(lp19637 +g10 +aa(lp19638 +g8 +aI713 +aI0 +aa(lp19639 +g10 +aa(lp19640 +g8 +aI713 +aI0 +aasVP +(lp19641 +(lp19642 +g8 +aI321 +aI-503 +aa(lp19643 +g20 +aI361 +aI-503 +aa(lp19644 +g15 +aI489 +aI-537 +aI418 +aI-503 +aI461 +aI-514 +aa(lp19645 +g15 +aI533 +aI-647 +aI518 +aI-559 +aI533 +aI-596 +aa(lp19646 +g15 +aI494 +aI-752 +aI533 +aI-694 +aI520 +aI-729 +aa(lp19647 +g15 +aI373 +aI-786 +aI468 +aI-774 +aI428 +aI-786 +aa(lp19648 +g20 +aI321 +aI-786 +aa(lp19649 +g10 +aa(lp19650 +g8 +aI737 +aI-654 +aa(lp19651 +g15 +aI718 +aI-534 +aI737 +aI-612 +aI731 +aI-572 +aa(lp19652 +g15 +aI656 +aI-433 +aI706 +aI-496 +aI685 +aI-462 +aa(lp19653 +g15 +aI542 +aI-364 +aI627 +aI-404 +aI589 +aI-381 +aa(lp19654 +g15 +aI367 +aI-338 +aI495 +aI-346 +aI437 +aI-338 +aa(lp19655 +g20 +aI321 +aI-338 +aa(lp19656 +g20 +aI321 +aI0 +aa(lp19657 +g20 +aI119 +aI0 +aa(lp19658 +g20 +aI119 +aI-951 +aa(lp19659 +g20 +aI384 +aI-951 +aa(lp19660 +g15 +aI542 +aI-930 +aI445 +aI-951 +aI498 +aI-944 +aa(lp19661 +g15 +aI652 +aI-872 +aI587 +aI-917 +aI623 +aI-897 +aa(lp19662 +g15 +aI716 +aI-779 +aI681 +aI-846 +aI702 +aI-815 +aa(lp19663 +g15 +aI737 +aI-654 +aI730 +aI-742 +aI737 +aI-700 +aa(lp19664 +g10 +aa(lp19665 +g8 +aI797 +aI0 +aa(lp19666 +g10 +aa(lp19667 +g8 +aI797 +aI0 +aasVT +(lp19668 +(lp19669 +g8 +aI466 +aI0 +aa(lp19670 +g20 +aI265 +aI0 +aa(lp19671 +g20 +aI265 +aI-783 +aa(lp19672 +g20 +aI26 +aI-783 +aa(lp19673 +g20 +aI26 +aI-951 +aa(lp19674 +g20 +aI705 +aI-951 +aa(lp19675 +g20 +aI705 +aI-783 +aa(lp19676 +g20 +aI466 +aI-783 +aa(lp19677 +g10 +aa(lp19678 +g8 +aI731 +aI0 +aa(lp19679 +g10 +aa(lp19680 +g8 +aI731 +aI0 +aasVX +(lp19681 +(lp19682 +g8 +aI835 +aI0 +aa(lp19683 +g20 +aI605 +aI0 +aa(lp19684 +g20 +aI410 +aI-359 +aa(lp19685 +g20 +aI216 +aI0 +aa(lp19686 +g20 +aI0 +aI0 +aa(lp19687 +g20 +aI289 +aI-490 +aa(lp19688 +g20 +aI20 +aI-951 +aa(lp19689 +g20 +aI242 +aI-951 +aa(lp19690 +g20 +aI421 +aI-608 +aa(lp19691 +g20 +aI595 +aI-951 +aa(lp19692 +g20 +aI813 +aI-951 +aa(lp19693 +g20 +aI541 +aI-479 +aa(lp19694 +g10 +aa(lp19695 +g8 +aI835 +aI0 +aa(lp19696 +g10 +aa(lp19697 +g8 +aI835 +aI0 +aasV\u005C +(lp19698 +(lp19699 +g8 +aI188 +aI-951 +aa(lp19700 +g20 +aI542 +aI0 +aa(lp19701 +g20 +aI362 +aI0 +aa(lp19702 +g20 +aI7 +aI-951 +aa(lp19703 +g10 +aa(lp19704 +g8 +aI550 +aI0 +aa(lp19705 +g10 +aa(lp19706 +g8 +aI550 +aI0 +aasV` +(lp19707 +(lp19708 +g8 +aI419 +aI-807 +aa(lp19709 +g15 +aI366 +aI-852 +aI405 +aI-819 +aI387 +aI-834 +aa(lp19710 +g15 +aI305 +aI-908 +aI346 +aI-870 +aI325 +aI-889 +aa(lp19711 +g15 +aI251 +aI-963 +aI286 +aI-927 +aI267 +aI-945 +aa(lp19712 +g15 +aI216 +aI-1007 +aI234 +aI-980 +aI223 +aI-995 +aa(lp19713 +g20 +aI216 +aI-1021 +aa(lp19714 +g20 +aI438 +aI-1021 +aa(lp19715 +g15 +aI463 +aI-972 +aI445 +aI-1006 +aI453 +aI-990 +aa(lp19716 +g15 +aI492 +aI-919 +aI472 +aI-954 +aI482 +aI-937 +aa(lp19717 +g15 +aI522 +aI-868 +aI502 +aI-902 +aI512 +aI-885 +aa(lp19718 +g15 +aI552 +aI-825 +aI533 +aI-852 +aI542 +aI-837 +aa(lp19719 +g20 +aI552 +aI-807 +aa(lp19720 +g10 +aa(lp19721 +g8 +aI769 +aI0 +aa(lp19722 +g10 +aa(lp19723 +g8 +aI769 +aI0 +aasVd +(lp19724 +(lp19725 +g8 +aI318 +aI13 +aa(lp19726 +g15 +aI216 +aI-10 +aI281 +aI13 +aI246 +aI5 +aa(lp19727 +g15 +aI136 +aI-81 +aI185 +aI-26 +aI158 +aI-50 +aa(lp19728 +g15 +aI84 +aI-199 +aI114 +aI-113 +aI97 +aI-152 +aa(lp19729 +g15 +aI66 +aI-362 +aI72 +aI-246 +aI66 +aI-300 +aa(lp19730 +g15 +aI84 +aI-526 +aI66 +aI-424 +aI72 +aI-479 +aa(lp19731 +g15 +aI137 +aI-645 +aI97 +aI-573 +aI114 +aI-613 +aa(lp19732 +g15 +aI219 +aI-716 +aI160 +aI-676 +aI187 +aI-700 +aa(lp19733 +g15 +aI324 +aI-741 +aI251 +aI-733 +aI286 +aI-741 +aa(lp19734 +g15 +aI388 +aI-732 +aI347 +aI-741 +aI369 +aI-738 +aa(lp19735 +g15 +aI441 +aI-710 +aI408 +aI-727 +aI425 +aI-719 +aa(lp19736 +g15 +aI483 +aI-676 +aI457 +aI-700 +aI471 +aI-689 +aa(lp19737 +g15 +aI516 +aI-634 +aI495 +aI-663 +aI506 +aI-649 +aa(lp19738 +g20 +aI522 +aI-634 +aa(lp19739 +g15 +aI515 +aI-685 +aI520 +aI-651 +aI517 +aI-668 +aa(lp19740 +g15 +aI510 +aI-732 +aI513 +aI-700 +aI511 +aI-716 +aa(lp19741 +g15 +aI507 +aI-779 +aI508 +aI-749 +aI507 +aI-765 +aa(lp19742 +g20 +aI507 +aI-1012 +aa(lp19743 +g20 +aI706 +aI-1012 +aa(lp19744 +g20 +aI706 +aI0 +aa(lp19745 +g20 +aI554 +aI0 +aa(lp19746 +g20 +aI516 +aI-93 +aa(lp19747 +g20 +aI507 +aI-93 +aa(lp19748 +g15 +aI476 +aI-51 +aI498 +aI-79 +aI488 +aI-65 +aa(lp19749 +g15 +aI435 +aI-17 +aI464 +aI-38 +aI451 +aI-27 +aa(lp19750 +g15 +aI383 +aI5 +aI420 +aI-8 +aI403 +aI0 +aa(lp19751 +g15 +aI318 +aI13 +aI364 +aI10 +aI342 +aI13 +aa(lp19752 +g10 +aa(lp19753 +g8 +aI390 +aI-144 +aa(lp19754 +g15 +aI450 +aI-156 +aI414 +aI-144 +aI434 +aI-148 +aa(lp19755 +g15 +aI490 +aI-193 +aI467 +aI-164 +aI480 +aI-176 +aa(lp19756 +g15 +aI513 +aI-254 +aI500 +aI-209 +aI508 +aI-229 +aa(lp19757 +g15 +aI521 +aI-339 +aI518 +aI-278 +aI521 +aI-306 +aa(lp19758 +g20 +aI521 +aI-360 +aa(lp19759 +g15 +aI514 +aI-454 +aI521 +aI-396 +aI519 +aI-427 +aa(lp19760 +g15 +aI493 +aI-523 +aI510 +aI-481 +aI503 +aI-504 +aa(lp19761 +g15 +aI453 +aI-565 +aI483 +aI-541 +aI470 +aI-555 +aa(lp19762 +g15 +aI389 +aI-579 +aI436 +aI-574 +aI414 +aI-579 +aa(lp19763 +g15 +aI297 +aI-523 +aI347 +aI-579 +aI317 +aI-560 +aa(lp19764 +g15 +aI268 +aI-359 +aI277 +aI-485 +aI268 +aI-431 +aa(lp19765 +g15 +aI297 +aI-198 +aI268 +aI-287 +aI278 +aI-234 +aa(lp19766 +g15 +aI390 +aI-144 +aI317 +aI-162 +aI348 +aI-144 +aa(lp19767 +g10 +aa(lp19768 +g8 +aI810 +aI0 +aa(lp19769 +g10 +aa(lp19770 +g8 +aI810 +aI0 +aasVh +(lp19771 +(lp19772 +g8 +aI735 +aI0 +aa(lp19773 +g20 +aI537 +aI0 +aa(lp19774 +g20 +aI537 +aI-424 +aa(lp19775 +g15 +aI512 +aI-542 +aI537 +aI-477 +aI528 +aI-516 +aa(lp19776 +g15 +aI437 +aI-582 +aI496 +aI-569 +aI471 +aI-582 +aa(lp19777 +g15 +aI373 +aI-566 +aI411 +aI-582 +aI390 +aI-577 +aa(lp19778 +g15 +aI331 +aI-520 +aI355 +aI-556 +aI341 +aI-540 +aa(lp19779 +g15 +aI309 +aI-444 +aI320 +aI-499 +aI313 +aI-474 +aa(lp19780 +g15 +aI302 +aI-341 +aI304 +aI-414 +aI302 +aI-380 +aa(lp19781 +g20 +aI302 +aI0 +aa(lp19782 +g20 +aI104 +aI0 +aa(lp19783 +g20 +aI104 +aI-1012 +aa(lp19784 +g20 +aI302 +aI-1012 +aa(lp19785 +g20 +aI302 +aI-806 +aa(lp19786 +g15 +aI301 +aI-748 +aI302 +aI-787 +aI302 +aI-768 +aa(lp19787 +g15 +aI298 +aI-692 +aI300 +aI-728 +aI299 +aI-709 +aa(lp19788 +g15 +aI293 +aI-634 +aI296 +aI-672 +aI294 +aI-653 +aa(lp19789 +g20 +aI304 +aI-634 +aa(lp19790 +g15 +aI385 +aI-716 +aI325 +aI-672 +aI352 +aI-699 +aa(lp19791 +g15 +aI497 +aI-741 +aI418 +aI-732 +aI455 +aI-741 +aa(lp19792 +g15 +aI595 +aI-725 +aI533 +aI-741 +aI566 +aI-735 +aa(lp19793 +g15 +aI670 +aI-677 +aI624 +aI-715 +aI649 +aI-699 +aa(lp19794 +g15 +aI718 +aI-594 +aI691 +aI-656 +aI707 +aI-628 +aa(lp19795 +g15 +aI735 +aI-474 +aI730 +aI-561 +aI735 +aI-521 +aa(lp19796 +g10 +aa(lp19797 +g8 +aI835 +aI0 +aa(lp19798 +g10 +aa(lp19799 +g8 +aI835 +aI0 +aasVl +(lp19800 +(lp19801 +g8 +aI302 +aI0 +aa(lp19802 +g20 +aI104 +aI0 +aa(lp19803 +g20 +aI104 +aI-1012 +aa(lp19804 +g20 +aI302 +aI-1012 +aa(lp19805 +g10 +aa(lp19806 +g8 +aI406 +aI0 +aa(lp19807 +g10 +aa(lp19808 +g8 +aI406 +aI0 +aasVp +(lp19809 +(lp19810 +g8 +aI486 +aI13 +aa(lp19811 +g15 +aI422 +aI5 +aI463 +aI13 +aI441 +aI10 +aa(lp19812 +g15 +aI372 +aI-15 +aI403 +aI0 +aI387 +aI-6 +aa(lp19813 +g15 +aI333 +aI-44 +aI357 +aI-23 +aI344 +aI-33 +aa(lp19814 +g15 +aI302 +aI-79 +aI322 +aI-55 +aI311 +aI-67 +aa(lp19815 +g20 +aI292 +aI-79 +aa(lp19816 +g15 +aI297 +aI-36 +aI294 +aI-64 +aI295 +aI-50 +aa(lp19817 +g15 +aI301 +aI-1 +aI298 +aI-25 +aI300 +aI-13 +aa(lp19818 +g15 +aI302 +aI25 +aI302 +aI10 +aI302 +aI19 +aa(lp19819 +g20 +aI302 +aI320 +aa(lp19820 +g20 +aI104 +aI320 +aa(lp19821 +g20 +aI104 +aI-727 +aa(lp19822 +g20 +aI265 +aI-727 +aa(lp19823 +g20 +aI293 +aI-633 +aa(lp19824 +g20 +aI302 +aI-633 +aa(lp19825 +g15 +aI333 +aI-674 +aI311 +aI-647 +aI322 +aI-661 +aa(lp19826 +g15 +aI374 +aI-708 +aI345 +aI-687 +aI359 +aI-699 +aa(lp19827 +g15 +aI427 +aI-732 +aI390 +aI-718 +aI407 +aI-726 +aa(lp19828 +g15 +aI492 +aI-741 +aI446 +aI-738 +aI468 +aI-741 +aa(lp19829 +g15 +aI595 +aI-716 +aI529 +aI-741 +aI564 +aI-733 +aa(lp19830 +g15 +aI674 +aI-645 +aI625 +aI-700 +aI652 +aI-677 +aa(lp19831 +g15 +aI725 +aI-527 +aI696 +aI-613 +aI713 +aI-574 +aa(lp19832 +g15 +aI744 +aI-364 +aI738 +aI-480 +aI744 +aI-426 +aa(lp19833 +g15 +aI725 +aI-201 +aI744 +aI-302 +aI737 +aI-248 +aa(lp19834 +g15 +aI672 +aI-82 +aI712 +aI-153 +aI694 +aI-114 +aa(lp19835 +g15 +aI590 +aI-10 +aI649 +aI-50 +aI622 +aI-26 +aa(lp19836 +g15 +aI486 +aI13 +aI559 +aI5 +aI524 +aI13 +aa(lp19837 +g10 +aa(lp19838 +g8 +aI425 +aI-582 +aa(lp19839 +g15 +aI368 +aI-570 +aI402 +aI-582 +aI384 +aI-578 +aa(lp19840 +g15 +aI331 +aI-534 +aI353 +aI-562 +aI340 +aI-550 +aa(lp19841 +g15 +aI310 +aI-473 +aI321 +aI-517 +aI314 +aI-497 +aa(lp19842 +g15 +aI302 +aI-387 +aI306 +aI-448 +aI303 +aI-420 +aa(lp19843 +g20 +aI302 +aI-366 +aa(lp19844 +g15 +aI308 +aI-272 +aI302 +aI-330 +aI304 +aI-299 +aa(lp19845 +g15 +aI329 +aI-203 +aI313 +aI-244 +aI319 +aI-222 +aa(lp19846 +g15 +aI367 +aI-161 +aI338 +aI-185 +aI351 +aI-171 +aa(lp19847 +g15 +aI426 +aI-147 +aI383 +aI-152 +aI402 +aI-147 +aa(lp19848 +g15 +aI513 +aI-203 +aI465 +aI-147 +aI494 +aI-166 +aa(lp19849 +g15 +aI541 +aI-367 +aI531 +aI-241 +aI541 +aI-295 +aa(lp19850 +g15 +aI513 +aI-528 +aI541 +aI-439 +aI531 +aI-492 +aa(lp19851 +g15 +aI425 +aI-582 +aI494 +aI-564 +aI465 +aI-582 +aa(lp19852 +g10 +aa(lp19853 +g8 +aI810 +aI0 +aa(lp19854 +g10 +aa(lp19855 +g8 +aI810 +aI0 +aasVt +(lp19856 +(lp19857 +g8 +aI399 +aI-144 +aa(lp19858 +g15 +aI455 +aI-151 +aI419 +aI-144 +aI437 +aI-146 +aa(lp19859 +g15 +aI509 +aI-167 +aI472 +aI-155 +aI490 +aI-161 +aa(lp19860 +g20 +aI509 +aI-19 +aa(lp19861 +g15 +aI439 +aI4 +aI490 +aI-10 +aI467 +aI-2 +aa(lp19862 +g15 +aI349 +aI13 +aI412 +aI10 +aI382 +aI13 +aa(lp19863 +g15 +aI261 +aI2 +aI317 +aI13 +aI288 +aI9 +aa(lp19864 +g15 +aI190 +aI-36 +aI233 +aI-4 +aI210 +aI-17 +aa(lp19865 +g15 +aI142 +aI-110 +aI170 +aI-54 +aI154 +aI-79 +aa(lp19866 +g15 +aI125 +aI-227 +aI131 +aI-141 +aI125 +aI-180 +aa(lp19867 +g20 +aI125 +aI-578 +aa(lp19868 +g20 +aI30 +aI-578 +aa(lp19869 +g20 +aI30 +aI-662 +aa(lp19870 +g20 +aI139 +aI-728 +aa(lp19871 +g20 +aI197 +aI-882 +aa(lp19872 +g20 +aI324 +aI-882 +aa(lp19873 +g20 +aI324 +aI-727 +aa(lp19874 +g20 +aI501 +aI-727 +aa(lp19875 +g20 +aI501 +aI-578 +aa(lp19876 +g20 +aI324 +aI-578 +aa(lp19877 +g20 +aI324 +aI-227 +aa(lp19878 +g15 +aI345 +aI-164 +aI324 +aI-199 +aI331 +aI-178 +aa(lp19879 +g15 +aI399 +aI-144 +aI358 +aI-151 +aI377 +aI-144 +aa(lp19880 +g10 +aa(lp19881 +g8 +aI552 +aI0 +aa(lp19882 +g10 +aa(lp19883 +g8 +aI552 +aI0 +aasVx +(lp19884 +(lp19885 +g8 +aI253 +aI-371 +aa(lp19886 +g20 +aI18 +aI-727 +aa(lp19887 +g20 +aI244 +aI-727 +aa(lp19888 +g20 +aI365 +aI-508 +aa(lp19889 +g20 +aI488 +aI-727 +aa(lp19890 +g20 +aI713 +aI-727 +aa(lp19891 +g20 +aI475 +aI-371 +aa(lp19892 +g20 +aI723 +aI0 +aa(lp19893 +g20 +aI498 +aI0 +aa(lp19894 +g20 +aI365 +aI-235 +aa(lp19895 +g20 +aI231 +aI0 +aa(lp19896 +g20 +aI6 +aI0 +aa(lp19897 +g10 +aa(lp19898 +g8 +aI730 +aI0 +aa(lp19899 +g10 +aa(lp19900 +g8 +aI730 +aI0 +aasV| +(lp19901 +(lp19902 +g8 +aI296 +aI-1008 +aa(lp19903 +g20 +aI438 +aI-1008 +aa(lp19904 +g20 +aI438 +aI303 +aa(lp19905 +g20 +aI296 +aI303 +aa(lp19906 +g10 +aa(lp19907 +g8 +aI734 +aI0 +aa(lp19908 +g10 +aa(lp19909 +g8 +aI734 +aI0 +aasV# +(lp19910 +(lp19911 +g8 +aI650 +aI-549 +aa(lp19912 +g20 +aI619 +aI-397 +aa(lp19913 +g20 +aI787 +aI-397 +aa(lp19914 +g20 +aI787 +aI-263 +aa(lp19915 +g20 +aI594 +aI-263 +aa(lp19916 +g20 +aI544 +aI0 +aa(lp19917 +g20 +aI401 +aI0 +aa(lp19918 +g20 +aI451 +aI-263 +aa(lp19919 +g20 +aI325 +aI-263 +aa(lp19920 +g20 +aI276 +aI0 +aa(lp19921 +g20 +aI136 +aI0 +aa(lp19922 +g20 +aI184 +aI-263 +aa(lp19923 +g20 +aI29 +aI-263 +aa(lp19924 +g20 +aI29 +aI-397 +aa(lp19925 +g20 +aI209 +aI-397 +aa(lp19926 +g20 +aI240 +aI-549 +aa(lp19927 +g20 +aI76 +aI-549 +aa(lp19928 +g20 +aI76 +aI-685 +aa(lp19929 +g20 +aI264 +aI-685 +aa(lp19930 +g20 +aI314 +aI-950 +aa(lp19931 +g20 +aI457 +aI-950 +aa(lp19932 +g20 +aI406 +aI-685 +aa(lp19933 +g20 +aI535 +aI-685 +aa(lp19934 +g20 +aI586 +aI-950 +aa(lp19935 +g20 +aI726 +aI-950 +aa(lp19936 +g20 +aI675 +aI-685 +aa(lp19937 +g20 +aI832 +aI-685 +aa(lp19938 +g20 +aI832 +aI-549 +aa(lp19939 +g10 +aa(lp19940 +g8 +aI350 +aI-397 +aa(lp19941 +g20 +aI478 +aI-397 +aa(lp19942 +g20 +aI509 +aI-549 +aa(lp19943 +g20 +aI381 +aI-549 +aa(lp19944 +g10 +aa(lp19945 +g8 +aI861 +aI0 +aa(lp19946 +g10 +aa(lp19947 +g8 +aI861 +aI0 +aasV' +(lp19948 +(lp19949 +g8 +aI268 +aI-951 +aa(lp19950 +g20 +aI241 +aI-607 +aa(lp19951 +g20 +aI113 +aI-607 +aa(lp19952 +g20 +aI86 +aI-951 +aa(lp19953 +g10 +aa(lp19954 +g8 +aI354 +aI0 +aa(lp19955 +g10 +aa(lp19956 +g8 +aI354 +aI0 +aasV+ +(lp19957 +(lp19958 +g8 +aI296 +aI-397 +aa(lp19959 +g20 +aI57 +aI-397 +aa(lp19960 +g20 +aI57 +aI-540 +aa(lp19961 +g20 +aI296 +aI-540 +aa(lp19962 +g20 +aI296 +aI-780 +aa(lp19963 +g20 +aI438 +aI-780 +aa(lp19964 +g20 +aI438 +aI-540 +aa(lp19965 +g20 +aI677 +aI-540 +aa(lp19966 +g20 +aI677 +aI-397 +aa(lp19967 +g20 +aI438 +aI-397 +aa(lp19968 +g20 +aI438 +aI-161 +aa(lp19969 +g20 +aI296 +aI-161 +aa(lp19970 +g10 +aa(lp19971 +g8 +aI734 +aI0 +aa(lp19972 +g10 +aa(lp19973 +g8 +aI734 +aI0 +aasV/ +(lp19974 +(lp19975 +g8 +aI544 +aI-951 +aa(lp19976 +g20 +aI189 +aI0 +aa(lp19977 +g20 +aI9 +aI0 +aa(lp19978 +g20 +aI363 +aI-951 +aa(lp19979 +g10 +aa(lp19980 +g8 +aI550 +aI0 +aa(lp19981 +g10 +aa(lp19982 +g8 +aI550 +aI0 +aasV3 +(lp19983 +(lp19984 +g8 +aI654 +aI-738 +aa(lp19985 +g15 +aI638 +aI-649 +aI654 +aI-705 +aI649 +aI-675 +aa(lp19986 +g15 +aI595 +aI-580 +aI628 +aI-623 +aI613 +aI-600 +aa(lp19987 +g15 +aI530 +aI-531 +aI576 +aI-560 +aI555 +aI-544 +aa(lp19988 +g15 +aI449 +aI-500 +aI505 +aI-517 +aI478 +aI-507 +aa(lp19989 +g20 +aI449 +aI-496 +aa(lp19990 +g15 +aI623 +aI-426 +aI526 +aI-487 +aI584 +aI-464 +aa(lp19991 +g15 +aI682 +aI-276 +aI663 +aI-389 +aI682 +aI-339 +aa(lp19992 +g15 +aI660 +aI-161 +aI682 +aI-235 +aI675 +aI-196 +aa(lp19993 +g15 +aI591 +aI-69 +aI645 +aI-125 +aI622 +aI-95 +aa(lp19994 +g15 +aI474 +aI-8 +aI560 +aI-43 +aI521 +aI-22 +aa(lp19995 +g15 +aI307 +aI13 +aI427 +aI6 +aI371 +aI13 +aa(lp19996 +g15 +aI163 +aI0 +aI256 +aI13 +aI208 +aI9 +aa(lp19997 +g15 +aI37 +aI-37 +aI118 +aI-7 +aI76 +aI-20 +aa(lp19998 +g20 +aI37 +aI-209 +aa(lp19999 +g15 +aI98 +aI-181 +aI56 +aI-198 +aI77 +aI-189 +aa(lp20000 +g15 +aI164 +aI-161 +aI120 +aI-174 +aI142 +aI-167 +aa(lp20001 +g15 +aI228 +aI-149 +aI185 +aI-156 +aI207 +aI-152 +aa(lp20002 +g15 +aI287 +aI-146 +aI249 +aI-147 +aI269 +aI-146 +aa(lp20003 +g15 +aI380 +aI-156 +aI325 +aI-146 +aI356 +aI-149 +aa(lp20004 +g15 +aI440 +aI-185 +aI405 +aI-163 +aI425 +aI-173 +aa(lp20005 +g15 +aI471 +aI-230 +aI454 +aI-198 +aI465 +aI-213 +aa(lp20006 +g15 +aI481 +aI-288 +aI477 +aI-248 +aI481 +aI-267 +aa(lp20007 +g15 +aI469 +aI-341 +aI481 +aI-308 +aI477 +aI-325 +aa(lp20008 +g15 +aI430 +aI-382 +aI461 +aI-357 +aI448 +aI-370 +aa(lp20009 +g15 +aI359 +aI-407 +aI412 +aI-393 +aI388 +aI-401 +aa(lp20010 +g15 +aI251 +aI-416 +aI330 +aI-413 +aI294 +aI-416 +aa(lp20011 +g20 +aI184 +aI-416 +aa(lp20012 +g20 +aI184 +aI-558 +aa(lp20013 +g20 +aI250 +aI-558 +aa(lp20014 +g15 +aI350 +aI-568 +aI290 +aI-558 +aI323 +aI-561 +aa(lp20015 +g15 +aI413 +aI-598 +aI376 +aI-576 +aI397 +aI-585 +aa(lp20016 +g15 +aI447 +aI-641 +aI429 +aI-610 +aI440 +aI-624 +aa(lp20017 +g15 +aI457 +aI-694 +aI453 +aI-657 +aI457 +aI-675 +aa(lp20018 +g15 +aI425 +aI-773 +aI457 +aI-728 +aI446 +aI-754 +aa(lp20019 +g15 +aI325 +aI-802 +aI404 +aI-792 +aI371 +aI-802 +aa(lp20020 +g15 +aI267 +aI-796 +aI304 +aI-802 +aI285 +aI-800 +aa(lp20021 +g15 +aI217 +aI-780 +aI249 +aI-791 +aI232 +aI-786 +aa(lp20022 +g15 +aI174 +aI-759 +aI201 +aI-774 +aI187 +aI-767 +aa(lp20023 +g15 +aI139 +aI-737 +aI162 +aI-752 +aI150 +aI-744 +aa(lp20024 +g20 +aI38 +aI-871 +aa(lp20025 +g15 +aI97 +aI-908 +aI56 +aI-884 +aI76 +aI-897 +aa(lp20026 +g15 +aI167 +aI-938 +aI119 +aI-919 +aI142 +aI-929 +aa(lp20027 +g15 +aI249 +aI-957 +aI193 +aI-946 +aI220 +aI-953 +aa(lp20028 +g15 +aI342 +aI-965 +aI278 +aI-962 +aI309 +aI-965 +aa(lp20029 +g15 +aI470 +aI-949 +aI389 +aI-965 +aI431 +aI-959 +aa(lp20030 +g15 +aI569 +aI-905 +aI508 +aI-939 +aI541 +aI-924 +aa(lp20031 +g15 +aI632 +aI-834 +aI596 +aI-886 +aI617 +aI-862 +aa(lp20032 +g15 +aI654 +aI-738 +aI647 +aI-806 +aI654 +aI-774 +aa(lp20033 +g10 +aa(lp20034 +g8 +aI734 +aI0 +aa(lp20035 +g10 +aa(lp20036 +g8 +aI734 +aI0 +aasV7 +(lp20037 +(lp20038 +g8 +aI134 +aI0 +aa(lp20039 +g20 +aI473 +aI-780 +aa(lp20040 +g20 +aI35 +aI-780 +aa(lp20041 +g20 +aI35 +aI-950 +aa(lp20042 +g20 +aI692 +aI-950 +aa(lp20043 +g20 +aI692 +aI-823 +aa(lp20044 +g20 +aI345 +aI0 +aa(lp20045 +g10 +aa(lp20046 +g8 +aI734 +aI0 +aa(lp20047 +g10 +aa(lp20048 +g8 +aI734 +aI0 +aasV; +(lp20049 +(lp20050 +g8 +aI289 +aI-154 +aa(lp20051 +g20 +aI298 +aI-139 +aa(lp20052 +g15 +aI277 +aI-64 +aI292 +aI-116 +aI285 +aI-91 +aa(lp20053 +g15 +aI249 +aI15 +aI268 +aI-38 +aI259 +aI-11 +aa(lp20054 +g15 +aI217 +aI95 +aI238 +aI42 +aI228 +aI69 +aa(lp20055 +g15 +aI184 +aI172 +aI206 +aI122 +aI195 +aI148 +aa(lp20056 +g20 +aI41 +aI172 +aa(lp20057 +g15 +aI60 +aI89 +aI47 +aI145 +aI53 +aI118 +aa(lp20058 +g15 +aI78 +aI4 +aI66 +aI60 +aI72 +aI32 +aa(lp20059 +g15 +aI94 +aI-79 +aI84 +aI-24 +aI89 +aI-52 +aa(lp20060 +g15 +aI106 +aI-154 +aI99 +aI-106 +aI103 +aI-131 +aa(lp20061 +g10 +aa(lp20062 +g8 +aI76 +aI-630 +aa(lp20063 +g15 +aI84 +aI-682 +aI76 +aI-650 +aI79 +aI-668 +aa(lp20064 +g15 +aI109 +aI-716 +aI90 +aI-696 +aI98 +aI-707 +aa(lp20065 +g15 +aI145 +aI-735 +aI119 +aI-725 +aI131 +aI-731 +aa(lp20066 +g15 +aI190 +aI-741 +aI159 +aI-739 +aI174 +aI-741 +aa(lp20067 +g15 +aI234 +aI-735 +aI205 +aI-741 +aI220 +aI-739 +aa(lp20068 +g15 +aI270 +aI-716 +aI247 +aI-731 +aI259 +aI-725 +aa(lp20069 +g15 +aI294 +aI-682 +aI280 +aI-707 +aI288 +aI-696 +aa(lp20070 +g15 +aI304 +aI-630 +aI300 +aI-668 +aI304 +aI-650 +aa(lp20071 +g15 +aI294 +aI-579 +aI304 +aI-610 +aI300 +aI-594 +aa(lp20072 +g15 +aI270 +aI-545 +aI288 +aI-565 +aI280 +aI-554 +aa(lp20073 +g15 +aI234 +aI-525 +aI259 +aI-536 +aI247 +aI-530 +aa(lp20074 +g15 +aI190 +aI-519 +aI220 +aI-521 +aI205 +aI-519 +aa(lp20075 +g15 +aI145 +aI-525 +aI174 +aI-519 +aI159 +aI-521 +aa(lp20076 +g15 +aI109 +aI-545 +aI131 +aI-530 +aI119 +aI-536 +aa(lp20077 +g15 +aI84 +aI-579 +aI98 +aI-554 +aI90 +aI-565 +aa(lp20078 +g15 +aI76 +aI-630 +aI79 +aI-594 +aI76 +aI-610 +aa(lp20079 +g10 +aa(lp20080 +g8 +aI386 +aI0 +aa(lp20081 +g10 +aa(lp20082 +g8 +aI386 +aI0 +aasV? +(lp20083 +(lp20084 +g8 +aI171 +aI-315 +aa(lp20085 +g20 +aI171 +aI-363 +aa(lp20086 +g15 +aI178 +aI-423 +aI171 +aI-385 +aI174 +aI-405 +aa(lp20087 +g15 +aI199 +aI-475 +aI183 +aI-441 +aI190 +aI-458 +aa(lp20088 +g15 +aI235 +aI-522 +aI208 +aI-491 +aI220 +aI-507 +aa(lp20089 +g15 +aI289 +aI-570 +aI250 +aI-538 +aI268 +aI-554 +aa(lp20090 +g15 +aI335 +aI-608 +aI307 +aI-584 +aI322 +aI-597 +aa(lp20091 +g15 +aI365 +aI-642 +aI347 +aI-620 +aI358 +aI-631 +aa(lp20092 +g15 +aI382 +aI-677 +aI373 +aI-653 +aI379 +aI-665 +aa(lp20093 +g15 +aI388 +aI-719 +aI386 +aI-689 +aI388 +aI-703 +aa(lp20094 +g15 +aI362 +aI-780 +aI388 +aI-744 +aI379 +aI-764 +aa(lp20095 +g15 +aI286 +aI-804 +aI346 +aI-796 +aI320 +aI-804 +aa(lp20096 +g15 +aI189 +aI-786 +aI256 +aI-804 +aI224 +aI-798 +aa(lp20097 +g15 +aI82 +aI-739 +aI155 +aI-773 +aI119 +aI-758 +aa(lp20098 +g20 +aI16 +aI-883 +aa(lp20099 +g15 +aI77 +aI-914 +aI34 +aI-894 +aI55 +aI-904 +aa(lp20100 +g15 +aI145 +aI-940 +aI99 +aI-924 +aI121 +aI-933 +aa(lp20101 +g15 +aI217 +aI-958 +aI169 +aI-948 +aI193 +aI-954 +aa(lp20102 +g15 +aI289 +aI-965 +aI241 +aI-962 +aI265 +aI-965 +aa(lp20103 +g15 +aI408 +aI-949 +aI333 +aI-965 +aI373 +aI-959 +aa(lp20104 +g15 +aI499 +aI-902 +aI444 +aI-938 +aI474 +aI-922 +aa(lp20105 +g15 +aI556 +aI-828 +aI524 +aI-882 +aI543 +aI-857 +aa(lp20106 +g15 +aI576 +aI-728 +aI569 +aI-799 +aI576 +aI-766 +aa(lp20107 +g15 +aI567 +aI-655 +aI576 +aI-701 +aI573 +aI-676 +aa(lp20108 +g15 +aI540 +aI-595 +aI560 +aI-633 +aI551 +aI-614 +aa(lp20109 +g15 +aI495 +aI-542 +aI528 +aI-577 +aI513 +aI-559 +aa(lp20110 +g15 +aI432 +aI-487 +aI477 +aI-525 +aI456 +aI-506 +aa(lp20111 +g15 +aI387 +aI-450 +aI414 +aI-473 +aI399 +aI-461 +aa(lp20112 +g15 +aI360 +aI-420 +aI376 +aI-439 +aI367 +aI-429 +aa(lp20113 +g15 +aI347 +aI-390 +aI354 +aI-410 +aI349 +aI-400 +aa(lp20114 +g15 +aI343 +aI-354 +aI344 +aI-380 +aI343 +aI-368 +aa(lp20115 +g20 +aI343 +aI-315 +aa(lp20116 +g10 +aa(lp20117 +g8 +aI150 +aI-92 +aa(lp20118 +g15 +aI159 +aI-144 +aI150 +aI-113 +aI153 +aI-130 +aa(lp20119 +g15 +aI183 +aI-178 +aI165 +aI-158 +aI173 +aI-169 +aa(lp20120 +g15 +aI220 +aI-197 +aI194 +aI-187 +aI206 +aI-193 +aa(lp20121 +g15 +aI265 +aI-203 +aI234 +aI-201 +aI249 +aI-203 +aa(lp20122 +g15 +aI308 +aI-197 +aI280 +aI-203 +aI295 +aI-201 +aa(lp20123 +g15 +aI345 +aI-178 +aI322 +aI-193 +aI334 +aI-187 +aa(lp20124 +g15 +aI369 +aI-144 +aI355 +aI-169 +aI363 +aI-158 +aa(lp20125 +g15 +aI378 +aI-92 +aI375 +aI-130 +aI378 +aI-113 +aa(lp20126 +g15 +aI369 +aI-42 +aI378 +aI-73 +aI375 +aI-56 +aa(lp20127 +g15 +aI345 +aI-8 +aI363 +aI-28 +aI355 +aI-17 +aa(lp20128 +g15 +aI308 +aI11 +aI334 +aI1 +aI322 +aI7 +aa(lp20129 +g15 +aI265 +aI18 +aI295 +aI15 +aI280 +aI18 +aa(lp20130 +g15 +aI220 +aI11 +aI249 +aI18 +aI234 +aI15 +aa(lp20131 +g15 +aI183 +aI-8 +aI206 +aI7 +aI194 +aI1 +aa(lp20132 +g15 +aI159 +aI-42 +aI173 +aI-17 +aI165 +aI-28 +aa(lp20133 +g15 +aI150 +aI-92 +aI153 +aI-56 +aI150 +aI-73 +aa(lp20134 +g10 +aa(lp20135 +g8 +aI611 +aI0 +aa(lp20136 +g10 +aa(lp20137 +g8 +aI611 +aI0 +aasVC +(lp20138 +(lp20139 +g8 +aI524 +aI-797 +aa(lp20140 +g15 +aI421 +aI-774 +aI485 +aI-797 +aI451 +aI-789 +aa(lp20141 +g15 +aI346 +aI-710 +aI391 +aI-759 +aI366 +aI-738 +aa(lp20142 +g15 +aI300 +aI-607 +aI326 +aI-682 +aI311 +aI-648 +aa(lp20143 +g15 +aI285 +aI-472 +aI290 +aI-567 +aI285 +aI-522 +aa(lp20144 +g15 +aI299 +aI-337 +aI285 +aI-422 +aI289 +aI-376 +aa(lp20145 +g15 +aI342 +aI-237 +aI308 +aI-297 +aI322 +aI-264 +aa(lp20146 +g15 +aI416 +aI-175 +aI361 +aI-210 +aI386 +aI-189 +aa(lp20147 +g15 +aI524 +aI-154 +aI446 +aI-161 +aI482 +aI-154 +aa(lp20148 +g15 +aI640 +aI-167 +aI562 +aI-154 +aI601 +aI-158 +aa(lp20149 +g15 +aI766 +aI-204 +aI679 +aI-176 +aI721 +aI-188 +aa(lp20150 +g20 +aI766 +aI-35 +aa(lp20151 +g15 +aI705 +aI-13 +aI746 +aI-26 +aI725 +aI-19 +aa(lp20152 +g15 +aI642 +aI1 +aI684 +aI-7 +aI663 +aI-2 +aa(lp20153 +g15 +aI577 +aI10 +aI621 +aI5 +aI599 +aI8 +aa(lp20154 +g15 +aI505 +aI13 +aI554 +aI12 +aI530 +aI13 +aa(lp20155 +g15 +aI314 +aI-21 +aI431 +aI13 +aI368 +aI1 +aa(lp20156 +g15 +aI180 +aI-120 +aI260 +aI-45 +aI216 +aI-78 +aa(lp20157 +g15 +aI102 +aI-274 +aI145 +aI-163 +aI119 +aI-214 +aa(lp20158 +g15 +aI77 +aI-474 +aI85 +aI-334 +aI77 +aI-400 +aa(lp20159 +g15 +aI106 +aI-672 +aI77 +aI-546 +aI87 +aI-612 +aa(lp20160 +g15 +aI192 +aI-827 +aI126 +aI-732 +aI154 +aI-784 +aa(lp20161 +g15 +aI332 +aI-928 +aI230 +aI-871 +aI277 +aI-904 +aa(lp20162 +g15 +aI524 +aI-965 +aI388 +aI-952 +aI452 +aI-965 +aa(lp20163 +g15 +aI666 +aI-947 +aI571 +aI-965 +aI618 +aI-959 +aa(lp20164 +g15 +aI802 +aI-897 +aI713 +aI-935 +aI759 +aI-918 +aa(lp20165 +g20 +aI737 +aI-733 +aa(lp20166 +g15 +aI630 +aI-778 +aI702 +aI-750 +aI666 +aI-765 +aa(lp20167 +g15 +aI524 +aI-797 +aI594 +aI-790 +aI558 +aI-797 +aa(lp20168 +g10 +aa(lp20169 +g8 +aI849 +aI0 +aa(lp20170 +g10 +aa(lp20171 +g8 +aI849 +aI0 +aasVG +(lp20172 +(lp20173 +g8 +aI481 +aI-534 +aa(lp20174 +g20 +aI858 +aI-534 +aa(lp20175 +g20 +aI858 +aI-40 +aa(lp20176 +g15 +aI782 +aI-18 +aI833 +aI-32 +aI808 +aI-24 +aa(lp20177 +g15 +aI702 +aI-1 +aI756 +aI-11 +aI730 +aI-5 +aa(lp20178 +g15 +aI616 +aI9 +aI675 +aI3 +aI646 +aI6 +aa(lp20179 +g15 +aI520 +aI13 +aI586 +aI12 +aI554 +aI13 +aa(lp20180 +g15 +aI331 +aI-18 +aI449 +aI13 +aI385 +aI2 +aa(lp20181 +g15 +aI192 +aI-111 +aI276 +aI-39 +aI229 +aI-70 +aa(lp20182 +g15 +aI106 +aI-265 +aI154 +aI-153 +aI126 +aI-204 +aa(lp20183 +g15 +aI77 +aI-476 +aI87 +aI-326 +aI77 +aI-396 +aa(lp20184 +g15 +aI110 +aI-679 +aI77 +aI-551 +aI88 +aI-618 +aa(lp20185 +g15 +aI206 +aI-833 +aI131 +aI-739 +aI163 +aI-790 +aa(lp20186 +g15 +aI362 +aI-930 +aI248 +aI-875 +aI300 +aI-908 +aa(lp20187 +g15 +aI574 +aI-965 +aI424 +aI-953 +aI495 +aI-965 +aa(lp20188 +g15 +aI723 +aI-948 +aI625 +aI-965 +aI675 +aI-959 +aa(lp20189 +g15 +aI857 +aI-906 +aI772 +aI-937 +aI817 +aI-923 +aa(lp20190 +g20 +aI790 +aI-744 +aa(lp20191 +g15 +aI690 +aI-782 +aI760 +aI-759 +aI727 +aI-772 +aa(lp20192 +g15 +aI573 +aI-797 +aI653 +aI-792 +aI614 +aI-797 +aa(lp20193 +g15 +aI454 +aI-773 +aI529 +aI-797 +aI489 +aI-789 +aa(lp20194 +g15 +aI363 +aI-708 +aI418 +aI-758 +aI388 +aI-736 +aa(lp20195 +g15 +aI305 +aI-606 +aI338 +aI-680 +aI318 +aI-646 +aa(lp20196 +g15 +aI285 +aI-472 +aI291 +aI-566 +aI285 +aI-521 +aa(lp20197 +g15 +aI299 +aI-344 +aI285 +aI-425 +aI289 +aI-383 +aa(lp20198 +g15 +aI343 +aI-243 +aI308 +aI-305 +aI323 +aI-271 +aa(lp20199 +g15 +aI420 +aI-177 +aI363 +aI-215 +aI388 +aI-193 +aa(lp20200 +g15 +aI533 +aI-154 +aI451 +aI-162 +aI489 +aI-154 +aa(lp20201 +g15 +aI605 +aI-158 +aI561 +aI-154 +aI586 +aI-155 +aa(lp20202 +g15 +aI661 +aI-167 +aI625 +aI-161 +aI644 +aI-164 +aa(lp20203 +g20 +aI661 +aI-366 +aa(lp20204 +g20 +aI481 +aI-366 +aa(lp20205 +g10 +aa(lp20206 +g8 +aI965 +aI0 +aa(lp20207 +g10 +aa(lp20208 +g8 +aI965 +aI0 +aasVK +(lp20209 +(lp20210 +g8 +aI845 +aI0 +aa(lp20211 +g20 +aI615 +aI0 +aa(lp20212 +g20 +aI397 +aI-395 +aa(lp20213 +g20 +aI321 +aI-339 +aa(lp20214 +g20 +aI321 +aI0 +aa(lp20215 +g20 +aI119 +aI0 +aa(lp20216 +g20 +aI119 +aI-951 +aa(lp20217 +g20 +aI321 +aI-951 +aa(lp20218 +g20 +aI321 +aI-493 +aa(lp20219 +g20 +aI401 +aI-627 +aa(lp20220 +g20 +aI618 +aI-951 +aa(lp20221 +g20 +aI842 +aI-951 +aa(lp20222 +g20 +aI538 +aI-522 +aa(lp20223 +g10 +aa(lp20224 +g8 +aI845 +aI0 +aa(lp20225 +g10 +aa(lp20226 +g8 +aI845 +aI0 +aasVO +(lp20227 +(lp20228 +g8 +aI930 +aI-476 +aa(lp20229 +g15 +aI905 +aI-276 +aI930 +aI-403 +aI922 +aI-336 +aa(lp20230 +g15 +aI826 +aI-121 +aI888 +aI-215 +aI861 +aI-164 +aa(lp20231 +g15 +aI693 +aI-21 +aI791 +aI-78 +aI747 +aI-45 +aa(lp20232 +g15 +aI503 +aI13 +aI640 +aI1 +aI576 +aI13 +aa(lp20233 +g15 +aI314 +aI-21 +aI430 +aI13 +aI367 +aI1 +aa(lp20234 +g15 +aI181 +aI-121 +aI260 +aI-45 +aI216 +aI-78 +aa(lp20235 +g15 +aI103 +aI-276 +aI146 +aI-164 +aI120 +aI-216 +aa(lp20236 +g15 +aI77 +aI-478 +aI86 +aI-337 +aI77 +aI-404 +aa(lp20237 +g15 +aI103 +aI-678 +aI77 +aI-551 +aI86 +aI-618 +aa(lp20238 +g15 +aI181 +aI-832 +aI120 +aI-739 +aI146 +aI-790 +aa(lp20239 +g15 +aI314 +aI-931 +aI216 +aI-875 +aI261 +aI-908 +aa(lp20240 +g15 +aI505 +aI-966 +aI368 +aI-954 +aI431 +aI-966 +aa(lp20241 +g15 +aI694 +aI-931 +aI578 +aI-966 +aI641 +aI-954 +aa(lp20242 +g15 +aI827 +aI-832 +aI748 +aI-908 +aI792 +aI-875 +aa(lp20243 +g15 +aI905 +aI-678 +aI862 +aI-789 +aI888 +aI-738 +aa(lp20244 +g15 +aI930 +aI-476 +aI922 +aI-618 +aI930 +aI-550 +aa(lp20245 +g10 +aa(lp20246 +g8 +aI285 +aI-476 +aa(lp20247 +g15 +aI298 +aI-342 +aI285 +aI-426 +aI289 +aI-382 +aa(lp20248 +g15 +aI338 +aI-241 +aI306 +aI-302 +aI320 +aI-268 +aa(lp20249 +g15 +aI406 +aI-177 +aI356 +aI-213 +aI378 +aI-192 +aa(lp20250 +g15 +aI503 +aI-155 +aI433 +aI-163 +aI466 +aI-155 +aa(lp20251 +g15 +aI603 +aI-177 +aI542 +aI-155 +aI575 +aI-163 +aa(lp20252 +g15 +aI670 +aI-241 +aI630 +aI-192 +aI653 +aI-213 +aa(lp20253 +g15 +aI709 +aI-342 +aI688 +aI-268 +aI701 +aI-302 +aa(lp20254 +g15 +aI722 +aI-476 +aI718 +aI-382 +aI722 +aI-426 +aa(lp20255 +g15 +aI709 +aI-611 +aI722 +aI-526 +aI718 +aI-571 +aa(lp20256 +g15 +aI670 +aI-712 +aI701 +aI-650 +aI688 +aI-684 +aa(lp20257 +g15 +aI603 +aI-776 +aI653 +aI-740 +aI630 +aI-761 +aa(lp20258 +g15 +aI505 +aI-798 +aI576 +aI-790 +aI543 +aI-798 +aa(lp20259 +g15 +aI406 +aI-776 +aI467 +aI-798 +aI434 +aI-790 +aa(lp20260 +g15 +aI338 +aI-712 +aI379 +aI-761 +aI356 +aI-740 +aa(lp20261 +g15 +aI298 +aI-611 +aI320 +aI-684 +aI306 +aI-650 +aa(lp20262 +g15 +aI285 +aI-476 +aI289 +aI-571 +aI285 +aI-526 +aa(lp20263 +g10 +aa(lp20264 +g8 +aI1007 +aI0 +aa(lp20265 +g10 +aa(lp20266 +g8 +aI1007 +aI0 +aasVS +(lp20267 +(lp20268 +g8 +aI641 +aI-263 +aa(lp20269 +g15 +aI619 +aI-148 +aI641 +aI-221 +aI634 +aI-183 +aa(lp20270 +g15 +aI555 +aI-61 +aI604 +aI-114 +aI583 +aI-85 +aa(lp20271 +g15 +aI452 +aI-6 +aI527 +aI-37 +aI493 +aI-19 +aa(lp20272 +g15 +aI313 +aI13 +aI412 +aI6 +aI365 +aI13 +aa(lp20273 +g15 +aI180 +aI0 +aI267 +aI13 +aI222 +aI8 +aa(lp20274 +g15 +aI61 +aI-43 +aI137 +aI-10 +aI97 +aI-24 +aa(lp20275 +g20 +aI61 +aI-231 +aa(lp20276 +g15 +aI124 +aI-202 +aI82 +aI-221 +aI103 +aI-211 +aa(lp20277 +g15 +aI189 +aI-177 +aI145 +aI-193 +aI167 +aI-184 +aa(lp20278 +g15 +aI254 +aI-159 +aI211 +aI-169 +aI232 +aI-164 +aa(lp20279 +g15 +aI320 +aI-153 +aI276 +aI-155 +aI298 +aI-153 +aa(lp20280 +g15 +aI377 +aI-160 +aI342 +aI-153 +aI361 +aI-155 +aa(lp20281 +g15 +aI415 +aI-181 +aI393 +aI-165 +aI405 +aI-172 +aa(lp20282 +g15 +aI437 +aI-213 +aI425 +aI-190 +aI432 +aI-201 +aa(lp20283 +g15 +aI444 +aI-254 +aI441 +aI-225 +aI444 +aI-239 +aa(lp20284 +g15 +aI432 +aI-301 +aI444 +aI-271 +aI440 +aI-287 +aa(lp20285 +g15 +aI400 +aI-339 +aI425 +aI-314 +aI414 +aI-327 +aa(lp20286 +g15 +aI351 +aI-374 +aI387 +aI-351 +aI370 +aI-363 +aa(lp20287 +g15 +aI286 +aI-410 +aI331 +aI-385 +aI310 +aI-397 +aa(lp20288 +g15 +aI219 +aI-448 +aI266 +aI-420 +aI244 +aI-433 +aa(lp20289 +g15 +aI149 +aI-503 +aI194 +aI-462 +aI171 +aI-481 +aa(lp20290 +g15 +aI94 +aI-582 +aI127 +aI-525 +aI109 +aI-551 +aa(lp20291 +g15 +aI72 +aI-694 +aI79 +aI-613 +aI72 +aI-650 +aa(lp20292 +g15 +aI93 +aI-808 +aI72 +aI-736 +aI79 +aI-774 +aa(lp20293 +g15 +aI153 +aI-893 +aI107 +aI-842 +aI127 +aI-870 +aa(lp20294 +g15 +aI248 +aI-946 +aI179 +aI-916 +aI211 +aI-934 +aa(lp20295 +g15 +aI373 +aI-965 +aI285 +aI-958 +aI327 +aI-965 +aa(lp20296 +g15 +aI440 +aI-960 +aI396 +aI-965 +aI418 +aI-963 +aa(lp20297 +g15 +aI505 +aI-947 +aI462 +aI-957 +aI484 +aI-953 +aa(lp20298 +g15 +aI570 +aI-926 +aI527 +aI-941 +aI548 +aI-934 +aa(lp20299 +g15 +aI637 +aI-897 +aI592 +aI-918 +aI614 +aI-908 +aa(lp20300 +g20 +aI572 +aI-741 +aa(lp20301 +g15 +aI517 +aI-765 +aI552 +aI-750 +aI534 +aI-758 +aa(lp20302 +g15 +aI468 +aI-782 +aI500 +aI-772 +aI484 +aI-777 +aa(lp20303 +g15 +aI420 +aI-793 +aI452 +aI-787 +aI436 +aI-791 +aa(lp20304 +g15 +aI374 +aI-797 +aI405 +aI-795 +aI389 +aI-797 +aa(lp20305 +g15 +aI296 +aI-770 +aI340 +aI-797 +aI314 +aI-788 +aa(lp20306 +g15 +aI269 +aI-698 +aI278 +aI-752 +aI269 +aI-728 +aa(lp20307 +g15 +aI277 +aI-655 +aI269 +aI-682 +aI272 +aI-667 +aa(lp20308 +g15 +aI303 +aI-620 +aI283 +aI-643 +aI291 +aI-631 +aa(lp20309 +g15 +aI349 +aI-587 +aI315 +aI-609 +aI331 +aI-598 +aa(lp20310 +g15 +aI418 +aI-549 +aI368 +aI-576 +aI391 +aI-563 +aa(lp20311 +g15 +aI508 +aI-495 +aI451 +aI-531 +aI481 +aI-513 +aa(lp20312 +g15 +aI579 +aI-436 +aI535 +aI-477 +aI559 +aI-457 +aa(lp20313 +g15 +aI625 +aI-361 +aI598 +aI-414 +aI614 +aI-389 +aa(lp20314 +g15 +aI641 +aI-263 +aI635 +aI-333 +aI641 +aI-301 +aa(lp20315 +g10 +aa(lp20316 +g8 +aI698 +aI0 +aa(lp20317 +g10 +aa(lp20318 +g8 +aI698 +aI0 +aasVW +(lp20319 +(lp20320 +g8 +aI1006 +aI0 +aa(lp20321 +g20 +aI777 +aI0 +aa(lp20322 +g20 +aI660 +aI-468 +aa(lp20323 +g15 +aI653 +aI-496 +aI658 +aI-475 +aI656 +aI-484 +aa(lp20324 +g15 +aI645 +aI-536 +aI651 +aI-508 +aI648 +aI-521 +aa(lp20325 +g15 +aI636 +aI-582 +aI642 +aI-550 +aI639 +aI-566 +aa(lp20326 +g15 +aI628 +aI-629 +aI633 +aI-598 +aI630 +aI-613 +aa(lp20327 +g15 +aI621 +aI-671 +aI625 +aI-644 +aI623 +aI-658 +aa(lp20328 +g15 +aI617 +aI-702 +aI619 +aI-683 +aI618 +aI-694 +aa(lp20329 +g15 +aI612 +aI-671 +aI616 +aI-694 +aI614 +aI-683 +aa(lp20330 +g15 +aI606 +aI-629 +aI611 +aI-658 +aI608 +aI-644 +aa(lp20331 +g15 +aI597 +aI-582 +aI603 +aI-614 +aI600 +aI-598 +aa(lp20332 +g15 +aI589 +aI-536 +aI595 +aI-566 +aI592 +aI-551 +aa(lp20333 +g15 +aI581 +aI-496 +aI586 +aI-521 +aI583 +aI-508 +aa(lp20334 +g15 +aI574 +aI-467 +aI578 +aI-484 +aI576 +aI-474 +aa(lp20335 +g20 +aI458 +aI0 +aa(lp20336 +g20 +aI229 +aI0 +aa(lp20337 +g20 +aI0 +aI-951 +aa(lp20338 +g20 +aI198 +aI-951 +aa(lp20339 +g20 +aI306 +aI-431 +aa(lp20340 +g15 +aI312 +aI-401 +aI307 +aI-424 +aI309 +aI-414 +aa(lp20341 +g15 +aI320 +aI-356 +aI314 +aI-388 +aI317 +aI-373 +aa(lp20342 +g15 +aI329 +aI-304 +aI323 +aI-340 +aI326 +aI-323 +aa(lp20343 +g15 +aI339 +aI-251 +aI333 +aI-286 +aI336 +aI-268 +aa(lp20344 +g15 +aI347 +aI-202 +aI342 +aI-234 +aI345 +aI-217 +aa(lp20345 +g15 +aI353 +aI-166 +aI350 +aI-188 +aI352 +aI-175 +aa(lp20346 +g15 +aI359 +aI-202 +aI354 +aI-175 +aI356 +aI-187 +aa(lp20347 +g15 +aI366 +aI-249 +aI361 +aI-217 +aI363 +aI-233 +aa(lp20348 +g15 +aI375 +aI-301 +aI369 +aI-266 +aI372 +aI-283 +aa(lp20349 +g15 +aI384 +aI-351 +aI378 +aI-319 +aI381 +aI-336 +aa(lp20350 +g15 +aI391 +aI-392 +aI386 +aI-366 +aI389 +aI-380 +aa(lp20351 +g15 +aI397 +aI-418 +aI393 +aI-404 +aI395 +aI-412 +aa(lp20352 +g20 +aI529 +aI-951 +aa(lp20353 +g20 +aI706 +aI-951 +aa(lp20354 +g20 +aI838 +aI-418 +aa(lp20355 +g15 +aI844 +aI-392 +aI839 +aI-412 +aI841 +aI-404 +aa(lp20356 +g15 +aI851 +aI-351 +aI846 +aI-380 +aI849 +aI-366 +aa(lp20357 +g15 +aI860 +aI-301 +aI854 +aI-336 +aI857 +aI-319 +aa(lp20358 +g15 +aI869 +aI-249 +aI863 +aI-283 +aI866 +aI-266 +aa(lp20359 +g15 +aI877 +aI-202 +aI872 +aI-233 +aI874 +aI-217 +aa(lp20360 +g15 +aI882 +aI-166 +aI879 +aI-187 +aI881 +aI-175 +aa(lp20361 +g15 +aI888 +aI-202 +aI884 +aI-175 +aI885 +aI-188 +aa(lp20362 +g15 +aI896 +aI-251 +aI890 +aI-217 +aI893 +aI-234 +aa(lp20363 +g15 +aI905 +aI-304 +aI899 +aI-268 +aI902 +aI-286 +aa(lp20364 +g15 +aI915 +aI-356 +aI909 +aI-323 +aI912 +aI-340 +aa(lp20365 +g15 +aI923 +aI-401 +aI918 +aI-373 +aI921 +aI-388 +aa(lp20366 +g15 +aI929 +aI-431 +aI925 +aI-414 +aI927 +aI-424 +aa(lp20367 +g20 +aI1037 +aI-951 +aa(lp20368 +g20 +aI1235 +aI-951 +aa(lp20369 +g10 +aa(lp20370 +g8 +aI1235 +aI0 +aa(lp20371 +g10 +aa(lp20372 +g8 +aI1235 +aI0 +aasV[ +(lp20373 +(lp20374 +g8 +aI408 +aI211 +aa(lp20375 +g20 +aI93 +aI211 +aa(lp20376 +g20 +aI93 +aI-951 +aa(lp20377 +g20 +aI408 +aI-951 +aa(lp20378 +g20 +aI408 +aI-814 +aa(lp20379 +g20 +aI262 +aI-814 +aa(lp20380 +g20 +aI262 +aI74 +aa(lp20381 +g20 +aI408 +aI74 +aa(lp20382 +g10 +aa(lp20383 +g8 +aI441 +aI0 +aa(lp20384 +g10 +aa(lp20385 +g8 +aI441 +aI0 +aasV_ +(lp20386 +(lp20387 +g8 +aI550 +aI211 +aa(lp20388 +g20 +aI-2 +aI211 +aa(lp20389 +g20 +aI-2 +aI120 +aa(lp20390 +g20 +aI550 +aI120 +aa(lp20391 +g10 +aa(lp20392 +g8 +aI548 +aI0 +aa(lp20393 +g10 +aa(lp20394 +g8 +aI548 +aI0 +aasVc +(lp20395 +(lp20396 +g8 +aI406 +aI13 +aa(lp20397 +g15 +aI265 +aI-8 +aI354 +aI13 +aI307 +aI6 +aa(lp20398 +g15 +aI158 +aI-74 +aI224 +aI-22 +aI188 +aI-44 +aa(lp20399 +g15 +aI90 +aI-190 +aI128 +aI-104 +aI106 +aI-143 +aa(lp20400 +g15 +aI66 +aI-359 +aI74 +aI-237 +aI66 +aI-294 +aa(lp20401 +g15 +aI90 +aI-541 +aI66 +aI-432 +aI74 +aI-492 +aa(lp20402 +g15 +aI159 +aI-659 +aI107 +aI-590 +aI130 +aI-629 +aa(lp20403 +g15 +aI267 +aI-722 +aI189 +aI-688 +aI225 +aI-709 +aa(lp20404 +g15 +aI406 +aI-741 +aI309 +aI-734 +aI355 +aI-741 +aa(lp20405 +g15 +aI518 +aI-727 +aI444 +aI-741 +aI481 +aI-736 +aa(lp20406 +g15 +aI622 +aI-689 +aI555 +aI-718 +aI589 +aI-705 +aa(lp20407 +g20 +aI565 +aI-537 +aa(lp20408 +g15 +aI482 +aI-568 +aI536 +aI-550 +aI508 +aI-560 +aa(lp20409 +g15 +aI406 +aI-580 +aI455 +aI-576 +aI430 +aI-580 +aa(lp20410 +g15 +aI302 +aI-525 +aI358 +aI-580 +aI323 +aI-562 +aa(lp20411 +g15 +aI269 +aI-360 +aI280 +aI-489 +aI269 +aI-434 +aa(lp20412 +g15 +aI302 +aI-199 +aI269 +aI-287 +aI280 +aI-234 +aa(lp20413 +g15 +aI404 +aI-147 +aI323 +aI-164 +aI357 +aI-147 +aa(lp20414 +g15 +aI507 +aI-161 +aI442 +aI-147 +aI476 +aI-152 +aa(lp20415 +g15 +aI601 +aI-199 +aI537 +aI-171 +aI569 +aI-184 +aa(lp20416 +g20 +aI601 +aI-34 +aa(lp20417 +g15 +aI554 +aI-13 +aI585 +aI-26 +aI569 +aI-19 +aa(lp20418 +g15 +aI508 +aI1 +aI539 +aI-7 +aI524 +aI-2 +aa(lp20419 +g15 +aI460 +aI10 +aI493 +aI5 +aI477 +aI8 +aa(lp20420 +g15 +aI406 +aI13 +aI443 +aI12 +aI425 +aI13 +aa(lp20421 +g10 +aa(lp20422 +g8 +aI665 +aI0 +aa(lp20423 +g10 +aa(lp20424 +g8 +aI665 +aI0 +aasVg +(lp20425 +(lp20426 +g8 +aI706 +aI-726 +aa(lp20427 +g20 +aI706 +aI-618 +aa(lp20428 +g20 +aI600 +aI-584 +aa(lp20429 +g15 +aI618 +aI-538 +aI608 +aI-570 +aI615 +aI-554 +aa(lp20430 +g15 +aI623 +aI-487 +aI621 +aI-523 +aI623 +aI-506 +aa(lp20431 +g15 +aI606 +aI-386 +aI623 +aI-450 +aI617 +aI-417 +aa(lp20432 +g15 +aI554 +aI-308 +aI594 +aI-355 +aI577 +aI-329 +aa(lp20433 +g15 +aI467 +aI-257 +aI531 +aI-286 +aI502 +aI-269 +aa(lp20434 +g15 +aI346 +aI-239 +aI432 +aI-245 +aI392 +aI-239 +aa(lp20435 +g15 +aI313 +aI-241 +aI336 +aI-239 +aI325 +aI-240 +aa(lp20436 +g15 +aI287 +aI-244 +aI302 +aI-242 +aI293 +aI-243 +aa(lp20437 +g15 +aI267 +aI-221 +aI279 +aI-237 +aI272 +aI-229 +aa(lp20438 +g15 +aI259 +aI-192 +aI262 +aI-213 +aI259 +aI-204 +aa(lp20439 +g15 +aI268 +aI-171 +aI259 +aI-183 +aI262 +aI-176 +aa(lp20440 +g15 +aI290 +aI-158 +aI273 +aI-165 +aI281 +aI-161 +aa(lp20441 +g15 +aI322 +aI-151 +aI299 +aI-154 +aI310 +aI-152 +aa(lp20442 +g15 +aI360 +aI-149 +aI334 +aI-150 +aI347 +aI-149 +aa(lp20443 +g20 +aI473 +aI-149 +aa(lp20444 +g15 +aI567 +aI-137 +aI508 +aI-149 +aI539 +aI-145 +aa(lp20445 +g15 +aI638 +aI-101 +aI595 +aI-129 +aI619 +aI-117 +aa(lp20446 +g15 +aI682 +aI-38 +aI657 +aI-84 +aI672 +aI-63 +aa(lp20447 +g15 +aI698 +aI52 +aI693 +aI-12 +aI698 +aI17 +aa(lp20448 +g15 +aI673 +aI164 +aI698 +aI93 +aI690 +aI130 +aa(lp20449 +g15 +aI599 +aI248 +aI657 +aI197 +aI632 +aI225 +aa(lp20450 +g15 +aI477 +aI302 +aI567 +aI272 +aI526 +aI289 +aa(lp20451 +g15 +aI309 +aI320 +aI429 +aI314 +aI373 +aI320 +aa(lp20452 +g15 +aI179 +aI306 +aI259 +aI320 +aI216 +aI316 +aa(lp20453 +g15 +aI87 +aI266 +aI142 +aI297 +aI111 +aI283 +aa(lp20454 +g15 +aI31 +aI202 +aI62 +aI248 +aI43 +aI227 +aa(lp20455 +g15 +aI13 +aI118 +aI19 +aI178 +aI13 +aI150 +aa(lp20456 +g15 +aI26 +aI49 +aI13 +aI92 +aI17 +aI69 +aa(lp20457 +g15 +aI63 +aI0 +aI35 +aI30 +aI47 +aI13 +aa(lp20458 +g15 +aI114 +aI-34 +aI78 +aI-14 +aI95 +aI-25 +aa(lp20459 +g15 +aI174 +aI-54 +aI134 +aI-42 +aI154 +aI-49 +aa(lp20460 +g15 +aI147 +aI-70 +aI165 +aI-58 +aI156 +aI-63 +aa(lp20461 +g15 +aI123 +aI-94 +aI138 +aI-77 +aI130 +aI-85 +aa(lp20462 +g15 +aI105 +aI-124 +aI116 +aI-103 +aI110 +aI-113 +aa(lp20463 +g15 +aI98 +aI-159 +aI101 +aI-135 +aI98 +aI-147 +aa(lp20464 +g15 +aI105 +aI-197 +aI98 +aI-173 +aI101 +aI-186 +aa(lp20465 +g15 +aI123 +aI-229 +aI109 +aI-208 +aI115 +aI-219 +aa(lp20466 +g15 +aI152 +aI-256 +aI130 +aI-238 +aI140 +aI-248 +aa(lp20467 +g15 +aI192 +aI-283 +aI164 +aI-265 +aI177 +aI-274 +aa(lp20468 +g15 +aI101 +aI-362 +aI153 +aI-299 +aI123 +aI-326 +aa(lp20469 +g15 +aI67 +aI-491 +aI78 +aI-399 +aI67 +aI-442 +aa(lp20470 +g15 +aI85 +aI-596 +aI67 +aI-530 +aI73 +aI-565 +aa(lp20471 +g15 +aI139 +aI-675 +aI98 +aI-627 +aI115 +aI-653 +aa(lp20472 +g15 +aI226 +aI-724 +aI162 +aI-696 +aI191 +aI-712 +aa(lp20473 +g15 +aI346 +aI-741 +aI261 +aI-735 +aI301 +aI-741 +aa(lp20474 +g15 +aI375 +aI-739 +aI355 +aI-741 +aI364 +aI-740 +aa(lp20475 +g15 +aI407 +aI-735 +aI386 +aI-738 +aI397 +aI-737 +aa(lp20476 +g15 +aI437 +aI-730 +aI418 +aI-734 +aI428 +aI-732 +aa(lp20477 +g15 +aI458 +aI-726 +aI446 +aI-728 +aI453 +aI-727 +aa(lp20478 +g10 +aa(lp20479 +g8 +aI185 +aI103 +aa(lp20480 +g15 +aI192 +aI134 +aI185 +aI114 +aI187 +aI124 +aa(lp20481 +g15 +aI214 +aI161 +aI196 +aI145 +aI204 +aI154 +aa(lp20482 +g15 +aI255 +aI180 +aI225 +aI169 +aI238 +aI175 +aa(lp20483 +g15 +aI318 +aI187 +aI272 +aI185 +aI293 +aI187 +aa(lp20484 +g15 +aI471 +aI158 +aI386 +aI187 +aI437 +aI177 +aa(lp20485 +g15 +aI522 +aI81 +aI505 +aI139 +aI522 +aI113 +aa(lp20486 +g15 +aI490 +aI27 +aI522 +aI54 +aI512 +aI36 +aa(lp20487 +g15 +aI391 +aI13 +aI469 +aI18 +aI436 +aI13 +aa(lp20488 +g20 +aI300 +aI13 +aa(lp20489 +g15 +aI262 +aI17 +aI288 +aI13 +aI275 +aI14 +aa(lp20490 +g15 +aI225 +aI32 +aI248 +aI20 +aI236 +aI25 +aa(lp20491 +g15 +aI196 +aI60 +aI213 +aI39 +aI204 +aI48 +aa(lp20492 +g15 +aI185 +aI103 +aI189 +aI71 +aI185 +aI85 +aa(lp20493 +g10 +aa(lp20494 +g8 +aI257 +aI-489 +aa(lp20495 +g15 +aI279 +aI-397 +aI257 +aI-449 +aI264 +aI-419 +aa(lp20496 +g15 +aI346 +aI-364 +aI294 +aI-375 +aI316 +aI-364 +aa(lp20497 +g15 +aI414 +aI-397 +aI377 +aI-364 +aI400 +aI-375 +aa(lp20498 +g15 +aI434 +aI-489 +aI427 +aI-419 +aI434 +aI-449 +aa(lp20499 +g15 +aI414 +aI-582 +aI434 +aI-528 +aI428 +aI-559 +aa(lp20500 +g15 +aI346 +aI-616 +aI400 +aI-605 +aI378 +aI-616 +aa(lp20501 +g15 +aI257 +aI-489 +aI286 +aI-616 +aI257 +aI-574 +aa(lp20502 +g10 +aa(lp20503 +g8 +aI735 +aI0 +aa(lp20504 +g10 +aa(lp20505 +g8 +aI735 +aI0 +aasVk +(lp20506 +(lp20507 +g8 +aI294 +aI-395 +aa(lp20508 +g20 +aI367 +aI-506 +aa(lp20509 +g20 +aI545 +aI-727 +aa(lp20510 +g20 +aI769 +aI-727 +aa(lp20511 +g20 +aI506 +aI-411 +aa(lp20512 +g20 +aI786 +aI0 +aa(lp20513 +g20 +aI557 +aI0 +aa(lp20514 +g20 +aI380 +aI-279 +aa(lp20515 +g20 +aI302 +aI-226 +aa(lp20516 +g20 +aI302 +aI0 +aa(lp20517 +g20 +aI104 +aI0 +aa(lp20518 +g20 +aI104 +aI-1012 +aa(lp20519 +g20 +aI302 +aI-1012 +aa(lp20520 +g20 +aI302 +aI-560 +aa(lp20521 +g20 +aI292 +aI-395 +aa(lp20522 +g10 +aa(lp20523 +g8 +aI786 +aI0 +aa(lp20524 +g10 +aa(lp20525 +g8 +aI786 +aI0 +aasVo +(lp20526 +(lp20527 +g8 +aI269 +aI-364 +aa(lp20528 +g15 +aI300 +aI-201 +aI269 +aI-292 +aI279 +aI-237 +aa(lp20529 +g15 +aI399 +aI-146 +aI320 +aI-164 +aI353 +aI-146 +aa(lp20530 +g15 +aI498 +aI-201 +aI445 +aI-146 +aI478 +aI-164 +aa(lp20531 +g15 +aI529 +aI-364 +aI519 +aI-238 +aI529 +aI-292 +aa(lp20532 +g15 +aI498 +aI-527 +aI529 +aI-437 +aI519 +aI-491 +aa(lp20533 +g15 +aI398 +aI-580 +aI478 +aI-563 +aI444 +aI-580 +aa(lp20534 +g15 +aI299 +aI-527 +aI352 +aI-580 +aI319 +aI-563 +aa(lp20535 +g15 +aI269 +aI-364 +aI279 +aI-491 +aI269 +aI-437 +aa(lp20536 +g10 +aa(lp20537 +g8 +aI731 +aI-364 +aa(lp20538 +g15 +aI708 +aI-203 +aI731 +aI-304 +aI724 +aI-250 +aa(lp20539 +g15 +aI642 +aI-84 +aI693 +aI-156 +aI671 +aI-116 +aa(lp20540 +g15 +aI536 +aI-11 +aI613 +aI-52 +aI578 +aI-28 +aa(lp20541 +g15 +aI397 +aI13 +aI495 +aI5 +aI448 +aI13 +aa(lp20542 +g15 +aI264 +aI-11 +aI348 +aI13 +aI304 +aI5 +aa(lp20543 +g15 +aI159 +aI-84 +aI223 +aI-28 +aI189 +aI-52 +aa(lp20544 +g15 +aI91 +aI-203 +aI130 +aI-116 +aI107 +aI-156 +aa(lp20545 +g15 +aI66 +aI-364 +aI74 +aI-250 +aI66 +aI-304 +aa(lp20546 +g15 +aI89 +aI-525 +aI66 +aI-425 +aI74 +aI-478 +aa(lp20547 +g15 +aI155 +aI-643 +aI104 +aI-572 +aI127 +aI-611 +aa(lp20548 +g15 +aI261 +aI-716 +aI184 +aI-675 +aI219 +aI-699 +aa(lp20549 +g15 +aI401 +aI-741 +aI302 +aI-732 +aI348 +aI-741 +aa(lp20550 +g15 +aI533 +aI-716 +aI449 +aI-741 +aI493 +aI-732 +aa(lp20551 +g15 +aI638 +aI-643 +aI574 +aI-699 +aI609 +aI-675 +aa(lp20552 +g15 +aI707 +aI-525 +aI667 +aI-611 +aI690 +aI-572 +aa(lp20553 +g15 +aI731 +aI-364 +aI723 +aI-478 +aI731 +aI-425 +aa(lp20554 +g10 +aa(lp20555 +g8 +aI798 +aI0 +aa(lp20556 +g10 +aa(lp20557 +g8 +aI798 +aI0 +aasVs +(lp20558 +(lp20559 +g8 +aI589 +aI-215 +aa(lp20560 +g15 +aI568 +aI-115 +aI589 +aI-177 +aI582 +aI-144 +aa(lp20561 +g15 +aI509 +aI-43 +aI554 +aI-86 +aI534 +aI-62 +aa(lp20562 +g15 +aI416 +aI0 +aI483 +aI-24 +aI452 +aI-10 +aa(lp20563 +g15 +aI293 +aI13 +aI379 +aI8 +aI338 +aI13 +aa(lp20564 +g15 +aI227 +aI11 +aI269 +aI13 +aI247 +aI12 +aa(lp20565 +g15 +aI169 +aI3 +aI206 +aI9 +aI187 +aI7 +aa(lp20566 +g15 +aI116 +aI-9 +aI151 +aI0 +aI133 +aI-4 +aa(lp20567 +g15 +aI65 +aI-28 +aI99 +aI-14 +aI82 +aI-21 +aa(lp20568 +g20 +aI65 +aI-192 +aa(lp20569 +g15 +aI122 +aI-168 +aI83 +aI-183 +aI102 +aI-175 +aa(lp20570 +g15 +aI182 +aI-148 +aI142 +aI-160 +aI162 +aI-154 +aa(lp20571 +g15 +aI241 +aI-136 +aI202 +aI-143 +aI222 +aI-139 +aa(lp20572 +g15 +aI293 +aI-131 +aI260 +aI-133 +aI277 +aI-131 +aa(lp20573 +g15 +aI339 +aI-136 +aI311 +aI-131 +aI326 +aI-133 +aa(lp20574 +g15 +aI370 +aI-150 +aI351 +aI-139 +aI362 +aI-144 +aa(lp20575 +g15 +aI387 +aI-171 +aI378 +aI-156 +aI384 +aI-163 +aa(lp20576 +g15 +aI393 +aI-196 +aI391 +aI-179 +aI393 +aI-187 +aa(lp20577 +g15 +aI388 +aI-221 +aI393 +aI-205 +aI391 +aI-214 +aa(lp20578 +g15 +aI369 +aI-244 +aI386 +aI-228 +aI379 +aI-235 +aa(lp20579 +g15 +aI325 +aI-271 +aI359 +aI-252 +aI345 +aI-261 +aa(lp20580 +g15 +aI248 +aI-308 +aI306 +aI-281 +aI280 +aI-294 +aa(lp20581 +g15 +aI165 +aI-351 +aI216 +aI-323 +aI188 +aI-337 +aa(lp20582 +g15 +aI108 +aI-398 +aI142 +aI-365 +aI123 +aI-381 +aa(lp20583 +g15 +aI74 +aI-458 +aI93 +aI-415 +aI82 +aI-435 +aa(lp20584 +g15 +aI63 +aI-537 +aI67 +aI-480 +aI63 +aI-507 +aa(lp20585 +g15 +aI83 +aI-626 +aI63 +aI-571 +aI70 +aI-601 +aa(lp20586 +g15 +aI138 +aI-690 +aI96 +aI-652 +aI114 +aI-673 +aa(lp20587 +g15 +aI224 +aI-728 +aI162 +aI-707 +aI191 +aI-719 +aa(lp20588 +g15 +aI337 +aI-741 +aI258 +aI-736 +aI296 +aI-741 +aa(lp20589 +g15 +aI460 +aI-726 +aI380 +aI-741 +aI421 +aI-736 +aa(lp20590 +g15 +aI581 +aI-681 +aI500 +aI-716 +aI540 +aI-701 +aa(lp20591 +g20 +aI521 +aI-540 +aa(lp20592 +g15 +aI427 +aI-578 +aI488 +aI-556 +aI457 +aI-568 +aa(lp20593 +g15 +aI337 +aI-593 +aI397 +aI-588 +aI367 +aI-593 +aa(lp20594 +g15 +aI278 +aI-579 +aI310 +aI-593 +aI290 +aI-589 +aa(lp20595 +g15 +aI261 +aI-540 +aI267 +aI-570 +aI261 +aI-557 +aa(lp20596 +g15 +aI265 +aI-517 +aI261 +aI-531 +aI262 +aI-524 +aa(lp20597 +g15 +aI283 +aI-496 +aI268 +aI-510 +aI274 +aI-503 +aa(lp20598 +g15 +aI322 +aI-473 +aI292 +aI-489 +aI305 +aI-481 +aa(lp20599 +g15 +aI386 +aI-442 +aI338 +aI-464 +aI360 +aI-454 +aa(lp20600 +g15 +aI470 +aI-402 +aI417 +aI-428 +aI445 +aI-415 +aa(lp20601 +g15 +aI533 +aI-356 +aI494 +aI-388 +aI516 +aI-373 +aa(lp20602 +g15 +aI574 +aI-297 +aI551 +aI-340 +aI565 +aI-320 +aa(lp20603 +g15 +aI589 +aI-215 +aI584 +aI-275 +aI589 +aI-247 +aa(lp20604 +g10 +aa(lp20605 +g8 +aI641 +aI0 +aa(lp20606 +g10 +aa(lp20607 +g8 +aI641 +aI0 +aasVw +(lp20608 +(lp20609 +g8 +aI660 +aI0 +aa(lp20610 +g20 +aI604 +aI-254 +aa(lp20611 +g15 +aI597 +aI-285 +aI602 +aI-261 +aI600 +aI-272 +aa(lp20612 +g15 +aI587 +aI-331 +aI594 +aI-299 +aI591 +aI-314 +aa(lp20613 +g15 +aI577 +aI-386 +aI584 +aI-349 +aI580 +aI-367 +aa(lp20614 +g15 +aI565 +aI-444 +aI573 +aI-405 +aI569 +aI-425 +aa(lp20615 +g15 +aI537 +aI-588 +aI557 +aI-488 +aI547 +aI-537 +aa(lp20616 +g20 +aI533 +aI-588 +aa(lp20617 +g15 +aI505 +aI-443 +aI523 +aI-537 +aI514 +aI-488 +aa(lp20618 +g15 +aI495 +aI-385 +aI502 +aI-424 +aI498 +aI-405 +aa(lp20619 +g15 +aI484 +aI-330 +aI491 +aI-366 +aI487 +aI-347 +aa(lp20620 +g15 +aI474 +aI-284 +aI480 +aI-313 +aI477 +aI-297 +aa(lp20621 +g15 +aI468 +aI-251 +aI472 +aI-270 +aI469 +aI-259 +aa(lp20622 +g20 +aI409 +aI0 +aa(lp20623 +g20 +aI195 +aI0 +aa(lp20624 +g20 +aI0 +aI-727 +aa(lp20625 +g20 +aI197 +aI-727 +aa(lp20626 +g20 +aI270 +aI-405 +aa(lp20627 +g15 +aI282 +aI-344 +aI274 +aI-388 +aI278 +aI-367 +aa(lp20628 +g15 +aI294 +aI-272 +aI287 +aI-320 +aI290 +aI-296 +aa(lp20629 +g15 +aI304 +aI-204 +aI298 +aI-248 +aI301 +aI-225 +aa(lp20630 +g15 +aI311 +aI-153 +aI307 +aI-182 +aI310 +aI-165 +aa(lp20631 +g20 +aI315 +aI-153 +aa(lp20632 +g15 +aI318 +aI-185 +aI316 +aI-161 +aI317 +aI-172 +aa(lp20633 +g15 +aI324 +aI-228 +aI320 +aI-198 +aI322 +aI-212 +aa(lp20634 +g15 +aI331 +aI-274 +aI326 +aI-243 +aI328 +aI-258 +aa(lp20635 +g15 +aI338 +aI-319 +aI333 +aI-290 +aI335 +aI-305 +aa(lp20636 +g15 +aI344 +aI-355 +aI340 +aI-333 +aI342 +aI-345 +aa(lp20637 +g15 +aI349 +aI-378 +aI346 +aI-366 +aI348 +aI-374 +aa(lp20638 +g20 +aI429 +aI-727 +aa(lp20639 +g20 +aI647 +aI-727 +aa(lp20640 +g20 +aI723 +aI-378 +aa(lp20641 +g15 +aI732 +aI-334 +aI726 +aI-368 +aI728 +aI-354 +aa(lp20642 +g15 +aI743 +aI-270 +aI735 +aI-314 +aI739 +aI-292 +aa(lp20643 +g15 +aI752 +aI-203 +aI746 +aI-247 +aI750 +aI-225 +aa(lp20644 +g15 +aI757 +aI-153 +aI755 +aI-182 +aI756 +aI-165 +aa(lp20645 +g20 +aI761 +aI-153 +aa(lp20646 +g15 +aI767 +aI-201 +aI762 +aI-164 +aI764 +aI-180 +aa(lp20647 +g15 +aI778 +aI-270 +aI771 +aI-222 +aI774 +aI-245 +aa(lp20648 +g15 +aI791 +aI-343 +aI782 +aI-294 +aI786 +aI-318 +aa(lp20649 +g15 +aI804 +aI-405 +aI795 +aI-367 +aI800 +aI-388 +aa(lp20650 +g20 +aI880 +aI-727 +aa(lp20651 +g20 +aI1074 +aI-727 +aa(lp20652 +g20 +aI876 +aI0 +aa(lp20653 +g10 +aa(lp20654 +g8 +aI1074 +aI0 +aa(lp20655 +g10 +aa(lp20656 +g8 +aI1074 +aI0 +aasV{ +(lp20657 +(lp20658 +g8 +aI186 +aI-175 +aa(lp20659 +g15 +aI144 +aI-265 +aI186 +aI-217 +aI172 +aI-247 +aa(lp20660 +g15 +aI20 +aI-291 +aI115 +aI-282 +aI74 +aI-291 +aa(lp20661 +g20 +aI20 +aI-447 +aa(lp20662 +g15 +aI92 +aI-453 +aI47 +aI-447 +aI71 +aI-449 +aa(lp20663 +g15 +aI145 +aI-473 +aI113 +aI-457 +aI130 +aI-464 +aa(lp20664 +g15 +aI177 +aI-509 +aI159 +aI-483 +aI170 +aI-495 +aa(lp20665 +g15 +aI186 +aI-563 +aI184 +aI-524 +aI187 +aI-542 +aa(lp20666 +g20 +aI186 +aI-770 +aa(lp20667 +g15 +aI199 +aI-852 +aI186 +aI-802 +aI190 +aI-829 +aa(lp20668 +g15 +aI243 +aI-908 +aI207 +aI-875 +aI222 +aI-894 +aa(lp20669 +g15 +aI331 +aI-940 +aI265 +aI-923 +aI294 +aI-934 +aa(lp20670 +g15 +aI472 +aI-951 +aI368 +aI-947 +aI415 +aI-951 +aa(lp20671 +g20 +aI472 +aI-804 +aa(lp20672 +g15 +aI424 +aI-800 +aI454 +aI-804 +aI438 +aI-802 +aa(lp20673 +g15 +aI388 +aI-786 +aI410 +aI-797 +aI398 +aI-793 +aa(lp20674 +g15 +aI366 +aI-758 +aI379 +aI-779 +aI371 +aI-770 +aa(lp20675 +g15 +aI358 +aI-713 +aI361 +aI-746 +aI358 +aI-731 +aa(lp20676 +g20 +aI358 +aI-518 +aa(lp20677 +g15 +aI206 +aI-373 +aI356 +aI-437 +aI305 +aI-389 +aa(lp20678 +g20 +aI206 +aI-366 +aa(lp20679 +g15 +aI320 +aI-319 +aI256 +aI-358 +aI294 +aI-343 +aa(lp20680 +g15 +aI358 +aI-222 +aI347 +aI-295 +aI360 +aI-263 +aa(lp20681 +g20 +aI358 +aI-27 +aa(lp20682 +g15 +aI366 +aI18 +aI358 +aI-8 +aI361 +aI6 +aa(lp20683 +g15 +aI388 +aI45 +aI371 +aI29 +aI379 +aI38 +aa(lp20684 +g15 +aI424 +aI59 +aI398 +aI52 +aI410 +aI57 +aa(lp20685 +g15 +aI472 +aI64 +aI438 +aI62 +aI454 +aI63 +aa(lp20686 +g20 +aI472 +aI211 +aa(lp20687 +g15 +aI331 +aI200 +aI415 +aI211 +aI368 +aI207 +aa(lp20688 +g15 +aI243 +aI168 +aI294 +aI194 +aI265 +aI183 +aa(lp20689 +g15 +aI199 +aI112 +aI222 +aI154 +aI207 +aI135 +aa(lp20690 +g15 +aI186 +aI29 +aI190 +aI89 +aI186 +aI61 +aa(lp20691 +g20 +aI186 +aI-175 +aa(lp20692 +g10 +aa(lp20693 +g8 +aI485 +aI0 +aa(lp20694 +g10 +aa(lp20695 +g8 +aI485 +aI0 +aasV" +(lp20696 +(lp20697 +g8 +aI268 +aI-951 +aa(lp20698 +g20 +aI241 +aI-607 +aa(lp20699 +g20 +aI113 +aI-607 +aa(lp20700 +g20 +aI86 +aI-951 +aa(lp20701 +g10 +aa(lp20702 +g8 +aI542 +aI-951 +aa(lp20703 +g20 +aI516 +aI-607 +aa(lp20704 +g20 +aI388 +aI-607 +aa(lp20705 +g20 +aI361 +aI-951 +aa(lp20706 +g10 +aa(lp20707 +g8 +aI629 +aI0 +aa(lp20708 +g10 +aa(lp20709 +g8 +aI629 +aI0 +aasV& +(lp20710 +(lp20711 +g8 +aI960 +aI0 +aa(lp20712 +g20 +aI714 +aI0 +aa(lp20713 +g20 +aI651 +aI-64 +aa(lp20714 +g15 +aI536 +aI-7 +aI616 +aI-40 +aI578 +aI-21 +aa(lp20715 +g15 +aI398 +aI13 +aI494 +aI6 +aI448 +aI13 +aa(lp20716 +g15 +aI256 +aI-6 +aI346 +aI13 +aI299 +aI6 +aa(lp20717 +g15 +aI148 +aI-61 +aI214 +aI-19 +aI178 +aI-37 +aa(lp20718 +g15 +aI78 +aI-146 +aI117 +aI-84 +aI94 +aI-113 +aa(lp20719 +g15 +aI53 +aI-256 +aI61 +aI-179 +aI53 +aI-216 +aa(lp20720 +g15 +aI65 +aI-346 +aI53 +aI-290 +aI57 +aI-319 +aa(lp20721 +g15 +aI99 +aI-417 +aI73 +aI-372 +aI84 +aI-396 +aa(lp20722 +g15 +aI153 +aI-475 +aI114 +aI-438 +aI132 +aI-458 +aa(lp20723 +g15 +aI223 +aI-524 +aI174 +aI-492 +aI197 +aI-509 +aa(lp20724 +g15 +aI181 +aI-582 +aI207 +aI-544 +aI193 +aI-564 +aa(lp20725 +g15 +aI154 +aI-637 +aI170 +aI-601 +aI161 +aI-619 +aa(lp20726 +g15 +aI139 +aI-691 +aI147 +aI-655 +aI142 +aI-673 +aa(lp20727 +g15 +aI134 +aI-747 +aI136 +aI-709 +aI134 +aI-728 +aa(lp20728 +g15 +aI154 +aI-838 +aI134 +aI-781 +aI141 +aI-811 +aa(lp20729 +g15 +aI209 +aI-906 +aI167 +aI-865 +aI186 +aI-887 +aa(lp20730 +g15 +aI294 +aI-950 +aI233 +aI-925 +aI261 +aI-940 +aa(lp20731 +g15 +aI402 +aI-965 +aI327 +aI-960 +aI363 +aI-965 +aa(lp20732 +g15 +aI505 +aI-951 +aI439 +aI-965 +aI474 +aI-960 +aa(lp20733 +g15 +aI586 +aI-911 +aI537 +aI-942 +aI564 +aI-928 +aa(lp20734 +g15 +aI640 +aI-846 +aI609 +aI-893 +aI627 +aI-872 +aa(lp20735 +g15 +aI660 +aI-758 +aI653 +aI-820 +aI660 +aI-790 +aa(lp20736 +g15 +aI645 +aI-675 +aI660 +aI-728 +aI655 +aI-700 +aa(lp20737 +g15 +aI606 +aI-606 +aI635 +aI-650 +aI622 +aI-627 +aa(lp20738 +g15 +aI547 +aI-547 +aI589 +aI-585 +aI570 +aI-565 +aa(lp20739 +g15 +aI475 +aI-498 +aI525 +aI-529 +aI501 +aI-513 +aa(lp20740 +g20 +aI645 +aI-323 +aa(lp20741 +g15 +aI685 +aI-414 +aI660 +aI-352 +aI673 +aI-382 +aa(lp20742 +g15 +aI714 +aI-509 +aI696 +aI-445 +aI706 +aI-477 +aa(lp20743 +g20 +aI921 +aI-509 +aa(lp20744 +g15 +aI898 +aI-431 +aI914 +aI-485 +aI907 +aI-459 +aa(lp20745 +g15 +aI867 +aI-349 +aI889 +aI-404 +aI878 +aI-377 +aa(lp20746 +g15 +aI826 +aI-267 +aI855 +aI-321 +aI842 +aI-294 +aa(lp20747 +g15 +aI776 +aI-189 +aI811 +aI-239 +aI794 +aI-213 +aa(lp20748 +g10 +aa(lp20749 +g8 +aI262 +aI-275 +aa(lp20750 +g15 +aI272 +aI-224 +aI262 +aI-256 +aI265 +aI-239 +aa(lp20751 +g15 +aI301 +aI-185 +aI279 +aI-208 +aI289 +aI-196 +aa(lp20752 +g15 +aI345 +aI-161 +aI314 +aI-175 +aI328 +aI-167 +aa(lp20753 +g15 +aI399 +aI-153 +aI362 +aI-156 +aI380 +aI-153 +aa(lp20754 +g15 +aI472 +aI-163 +aI425 +aI-153 +aI449 +aI-156 +aa(lp20755 +g15 +aI533 +aI-191 +aI494 +aI-170 +aI514 +aI-179 +aa(lp20756 +g20 +aI332 +aI-406 +aa(lp20757 +g15 +aI280 +aI-347 +aI309 +aI-388 +aI292 +aI-368 +aa(lp20758 +g15 +aI262 +aI-275 +aI268 +aI-327 +aI262 +aI-302 +aa(lp20759 +g10 +aa(lp20760 +g8 +aI475 +aI-731 +aa(lp20761 +g15 +aI469 +aI-765 +aI475 +aI-744 +aI473 +aI-756 +aa(lp20762 +g15 +aI452 +aI-788 +aI465 +aI-774 +aI459 +aI-782 +aa(lp20763 +g15 +aI428 +aI-801 +aI444 +aI-794 +aI436 +aI-799 +aa(lp20764 +g15 +aI401 +aI-806 +aI419 +aI-804 +aI410 +aI-806 +aa(lp20765 +g15 +aI372 +aI-802 +aI391 +aI-806 +aI381 +aI-804 +aa(lp20766 +g15 +aI345 +aI-789 +aI362 +aI-799 +aI353 +aI-795 +aa(lp20767 +g15 +aI325 +aI-766 +aI337 +aI-783 +aI330 +aI-775 +aa(lp20768 +g15 +aI318 +aI-730 +aI320 +aI-756 +aI318 +aI-744 +aa(lp20769 +g15 +aI333 +aI-666 +aI318 +aI-707 +aI323 +aI-686 +aa(lp20770 +g15 +aI374 +aI-606 +aI343 +aI-646 +aI356 +aI-626 +aa(lp20771 +g15 +aI450 +aI-663 +aI407 +aI-625 +aI433 +aI-644 +aa(lp20772 +g15 +aI475 +aI-731 +aI467 +aI-682 +aI475 +aI-705 +aa(lp20773 +g10 +aa(lp20774 +g8 +aI962 +aI0 +aa(lp20775 +g10 +aa(lp20776 +g8 +aI962 +aI0 +aasV* +(lp20777 +(lp20778 +g8 +aI447 +aI-1012 +aa(lp20779 +g20 +aI421 +aI-772 +aa(lp20780 +g20 +aI664 +aI-840 +aa(lp20781 +g20 +aI685 +aI-676 +aa(lp20782 +g20 +aI464 +aI-661 +aa(lp20783 +g20 +aI609 +aI-467 +aa(lp20784 +g20 +aI461 +aI-388 +aa(lp20785 +g20 +aI360 +aI-592 +aa(lp20786 +g20 +aI270 +aI-390 +aa(lp20787 +g20 +aI117 +aI-467 +aa(lp20788 +g20 +aI261 +aI-661 +aa(lp20789 +g20 +aI41 +aI-677 +aa(lp20790 +g20 +aI66 +aI-840 +aa(lp20791 +g20 +aI304 +aI-772 +aa(lp20792 +g20 +aI277 +aI-1012 +aa(lp20793 +g10 +aa(lp20794 +g8 +aI726 +aI0 +aa(lp20795 +g10 +aa(lp20796 +g8 +aI726 +aI0 +aasV. +(lp20797 +(lp20798 +g8 +aI76 +aI-92 +aa(lp20799 +g15 +aI84 +aI-144 +aI76 +aI-113 +aI79 +aI-130 +aa(lp20800 +g15 +aI109 +aI-178 +aI90 +aI-158 +aI98 +aI-169 +aa(lp20801 +g15 +aI145 +aI-197 +aI119 +aI-187 +aI131 +aI-193 +aa(lp20802 +g15 +aI190 +aI-203 +aI159 +aI-201 +aI174 +aI-203 +aa(lp20803 +g15 +aI234 +aI-197 +aI205 +aI-203 +aI220 +aI-201 +aa(lp20804 +g15 +aI270 +aI-178 +aI247 +aI-193 +aI259 +aI-187 +aa(lp20805 +g15 +aI294 +aI-144 +aI280 +aI-169 +aI288 +aI-158 +aa(lp20806 +g15 +aI304 +aI-92 +aI300 +aI-130 +aI304 +aI-113 +aa(lp20807 +g15 +aI294 +aI-42 +aI304 +aI-73 +aI300 +aI-56 +aa(lp20808 +g15 +aI270 +aI-8 +aI288 +aI-28 +aI280 +aI-17 +aa(lp20809 +g15 +aI234 +aI11 +aI259 +aI1 +aI247 +aI7 +aa(lp20810 +g15 +aI190 +aI18 +aI220 +aI15 +aI205 +aI18 +aa(lp20811 +g15 +aI145 +aI11 +aI174 +aI18 +aI159 +aI15 +aa(lp20812 +g15 +aI109 +aI-8 +aI131 +aI7 +aI119 +aI1 +aa(lp20813 +g15 +aI84 +aI-42 +aI98 +aI-17 +aI90 +aI-28 +aa(lp20814 +g15 +aI76 +aI-92 +aI79 +aI-56 +aI76 +aI-73 +aa(lp20815 +g10 +aa(lp20816 +g8 +aI380 +aI0 +aa(lp20817 +g10 +aa(lp20818 +g8 +aI380 +aI0 +aasV2 +(lp20819 +(lp20820 +g8 +aI692 +aI0 +aa(lp20821 +g20 +aI53 +aI0 +aa(lp20822 +g20 +aI53 +aI-139 +aa(lp20823 +g20 +aI277 +aI-381 +aa(lp20824 +g15 +aI354 +aI-465 +aI305 +aI-411 +aI331 +aI-439 +aa(lp20825 +g15 +aI413 +aI-539 +aI377 +aI-490 +aI396 +aI-515 +aa(lp20826 +g15 +aI451 +aI-614 +aI429 +aI-564 +aI442 +aI-588 +aa(lp20827 +g15 +aI465 +aI-695 +aI460 +aI-639 +aI465 +aI-666 +aa(lp20828 +g15 +aI436 +aI-770 +aI465 +aI-727 +aI455 +aI-752 +aa(lp20829 +g15 +aI358 +aI-797 +aI417 +aI-788 +aI391 +aI-797 +aa(lp20830 +g15 +aI259 +aI-771 +aI324 +aI-797 +aI291 +aI-788 +aa(lp20831 +g15 +aI160 +aI-699 +aI228 +aI-754 +aI194 +aI-730 +aa(lp20832 +g20 +aI50 +aI-828 +aa(lp20833 +g15 +aI111 +aI-880 +aI70 +aI-846 +aI90 +aI-863 +aa(lp20834 +g15 +aI182 +aI-923 +aI133 +aI-896 +aI156 +aI-910 +aa(lp20835 +g15 +aI266 +aI-953 +aI207 +aI-935 +aI236 +aI-946 +aa(lp20836 +g15 +aI370 +aI-965 +aI297 +aI-961 +aI332 +aI-965 +aa(lp20837 +g15 +aI493 +aI-946 +aI416 +aI-965 +aI456 +aI-958 +aa(lp20838 +g15 +aI585 +aI-892 +aI529 +aI-933 +aI560 +aI-915 +aa(lp20839 +g15 +aI644 +aI-808 +aI611 +aI-869 +aI631 +aI-841 +aa(lp20840 +g15 +aI665 +aI-696 +aI658 +aI-775 +aI665 +aI-738 +aa(lp20841 +g15 +aI645 +aI-589 +aI665 +aI-659 +aI658 +aI-623 +aa(lp20842 +g15 +aI592 +aI-489 +aI632 +aI-555 +aI615 +aI-522 +aa(lp20843 +g15 +aI513 +aI-391 +aI569 +aI-456 +aI543 +aI-424 +aa(lp20844 +g15 +aI418 +aI-293 +aI484 +aI-359 +aI452 +aI-326 +aa(lp20845 +g20 +aI304 +aI-177 +aa(lp20846 +g20 +aI304 +aI-168 +aa(lp20847 +g20 +aI692 +aI-168 +aa(lp20848 +g10 +aa(lp20849 +g8 +aI734 +aI0 +aa(lp20850 +g10 +aa(lp20851 +g8 +aI734 +aI0 +aasV6 +(lp20852 +(lp20853 +g8 +aI49 +aI-403 +aa(lp20854 +g15 +aI56 +aI-539 +aI49 +aI-449 +aI51 +aI-494 +aa(lp20855 +g15 +aI83 +aI-669 +aI61 +aI-585 +aI70 +aI-628 +aa(lp20856 +g15 +aI135 +aI-785 +aI96 +aI-711 +aI113 +aI-749 +aa(lp20857 +g15 +aI219 +aI-878 +aI157 +aI-820 +aI185 +aI-851 +aa(lp20858 +g15 +aI340 +aI-939 +aI252 +aI-904 +aI293 +aI-925 +aa(lp20859 +g15 +aI505 +aI-962 +aI387 +aI-954 +aI442 +aI-962 +aa(lp20860 +g15 +aI535 +aI-961 +aI514 +aI-962 +aI524 +aI-962 +aa(lp20861 +g15 +aI568 +aI-960 +aI546 +aI-961 +aI556 +aI-960 +aa(lp20862 +g15 +aI600 +aI-957 +aI579 +aI-959 +aI589 +aI-958 +aa(lp20863 +g15 +aI628 +aI-952 +aI610 +aI-955 +aI620 +aI-954 +aa(lp20864 +g20 +aI628 +aI-791 +aa(lp20865 +g15 +aI575 +aI-801 +aI611 +aI-795 +aI594 +aI-798 +aa(lp20866 +g15 +aI520 +aI-804 +aI557 +aI-803 +aI538 +aI-804 +aa(lp20867 +g15 +aI375 +aI-783 +aI461 +aI-804 +aI413 +aI-797 +aa(lp20868 +g15 +aI285 +aI-722 +aI337 +aI-768 +aI307 +aI-748 +aa(lp20869 +g15 +aI238 +aI-628 +aI263 +aI-696 +aI247 +aI-664 +aa(lp20870 +g15 +aI221 +aI-507 +aI229 +aI-591 +aI223 +aI-551 +aa(lp20871 +g20 +aI229 +aI-507 +aa(lp20872 +g15 +aI260 +aI-551 +aI237 +aI-522 +aI248 +aI-537 +aa(lp20873 +g15 +aI304 +aI-586 +aI273 +aI-564 +aI287 +aI-576 +aa(lp20874 +g15 +aI359 +aI-609 +aI320 +aI-596 +aI339 +aI-603 +aa(lp20875 +g15 +aI429 +aI-618 +aI380 +aI-615 +aI403 +aI-618 +aa(lp20876 +g15 +aI540 +aI-597 +aI470 +aI-618 +aI507 +aI-611 +aa(lp20877 +g15 +aI624 +aI-539 +aI573 +aI-584 +aI601 +aI-564 +aa(lp20878 +g15 +aI676 +aI-444 +aI646 +aI-513 +aI664 +aI-482 +aa(lp20879 +g15 +aI694 +aI-316 +aI688 +aI-407 +aI694 +aI-364 +aa(lp20880 +g15 +aI672 +aI-177 +aI694 +aI-264 +aI687 +aI-218 +aa(lp20881 +g15 +aI610 +aI-74 +aI658 +aI-137 +aI637 +aI-102 +aa(lp20882 +g15 +aI513 +aI-8 +aI583 +aI-45 +aI551 +aI-23 +aa(lp20883 +g15 +aI384 +aI13 +aI474 +aI5 +aI431 +aI13 +aa(lp20884 +g15 +aI252 +aI-11 +aI337 +aI13 +aI293 +aI5 +aa(lp20885 +g15 +aI146 +aI-88 +aI211 +aI-28 +aI176 +aI-53 +aa(lp20886 +g15 +aI75 +aI-217 +aI115 +aI-122 +aI92 +aI-165 +aa(lp20887 +g15 +aI49 +aI-403 +aI58 +aI-270 +aI49 +aI-332 +aa(lp20888 +g10 +aa(lp20889 +g8 +aI380 +aI-147 +aa(lp20890 +g15 +aI428 +aI-157 +aI398 +aI-147 +aI414 +aI-150 +aa(lp20891 +g15 +aI466 +aI-188 +aI443 +aI-164 +aI455 +aI-174 +aa(lp20892 +g15 +aI491 +aI-239 +aI477 +aI-201 +aI485 +aI-218 +aa(lp20893 +g15 +aI500 +aI-314 +aI497 +aI-260 +aI500 +aI-285 +aa(lp20894 +g15 +aI471 +aI-423 +aI500 +aI-360 +aI490 +aI-397 +aa(lp20895 +g15 +aI382 +aI-463 +aI451 +aI-450 +aI422 +aI-463 +aa(lp20896 +g15 +aI328 +aI-452 +aI362 +aI-463 +aI344 +aI-459 +aa(lp20897 +g15 +aI285 +aI-421 +aI311 +aI-444 +aI297 +aI-434 +aa(lp20898 +g15 +aI258 +aI-379 +aI274 +aI-408 +aI265 +aI-394 +aa(lp20899 +g15 +aI249 +aI-331 +aI252 +aI-363 +aI249 +aI-347 +aa(lp20900 +g15 +aI257 +aI-265 +aI249 +aI-309 +aI252 +aI-287 +aa(lp20901 +g15 +aI282 +aI-206 +aI262 +aI-243 +aI271 +aI-223 +aa(lp20902 +g15 +aI323 +aI-163 +aI293 +aI-188 +aI306 +aI-174 +aa(lp20903 +g15 +aI380 +aI-147 +aI339 +aI-152 +aI358 +aI-147 +aa(lp20904 +g10 +aa(lp20905 +g8 +aI734 +aI0 +aa(lp20906 +g10 +aa(lp20907 +g8 +aI734 +aI0 +aasV: +(lp20908 +(lp20909 +g8 +aI76 +aI-92 +aa(lp20910 +g15 +aI84 +aI-144 +aI76 +aI-113 +aI79 +aI-130 +aa(lp20911 +g15 +aI109 +aI-178 +aI90 +aI-158 +aI98 +aI-169 +aa(lp20912 +g15 +aI145 +aI-197 +aI119 +aI-187 +aI131 +aI-193 +aa(lp20913 +g15 +aI190 +aI-203 +aI159 +aI-201 +aI174 +aI-203 +aa(lp20914 +g15 +aI234 +aI-197 +aI205 +aI-203 +aI220 +aI-201 +aa(lp20915 +g15 +aI270 +aI-178 +aI247 +aI-193 +aI259 +aI-187 +aa(lp20916 +g15 +aI294 +aI-144 +aI280 +aI-169 +aI288 +aI-158 +aa(lp20917 +g15 +aI304 +aI-92 +aI300 +aI-130 +aI304 +aI-113 +aa(lp20918 +g15 +aI294 +aI-42 +aI304 +aI-73 +aI300 +aI-56 +aa(lp20919 +g15 +aI270 +aI-8 +aI288 +aI-28 +aI280 +aI-17 +aa(lp20920 +g15 +aI234 +aI11 +aI259 +aI1 +aI247 +aI7 +aa(lp20921 +g15 +aI190 +aI18 +aI220 +aI15 +aI205 +aI18 +aa(lp20922 +g15 +aI145 +aI11 +aI174 +aI18 +aI159 +aI15 +aa(lp20923 +g15 +aI109 +aI-8 +aI131 +aI7 +aI119 +aI1 +aa(lp20924 +g15 +aI84 +aI-42 +aI98 +aI-17 +aI90 +aI-28 +aa(lp20925 +g15 +aI76 +aI-92 +aI79 +aI-56 +aI76 +aI-73 +aa(lp20926 +g10 +aa(lp20927 +g8 +aI76 +aI-630 +aa(lp20928 +g15 +aI84 +aI-682 +aI76 +aI-650 +aI79 +aI-668 +aa(lp20929 +g15 +aI109 +aI-716 +aI90 +aI-696 +aI98 +aI-707 +aa(lp20930 +g15 +aI145 +aI-735 +aI119 +aI-725 +aI131 +aI-731 +aa(lp20931 +g15 +aI190 +aI-741 +aI159 +aI-739 +aI174 +aI-741 +aa(lp20932 +g15 +aI234 +aI-735 +aI205 +aI-741 +aI220 +aI-739 +aa(lp20933 +g15 +aI270 +aI-716 +aI247 +aI-731 +aI259 +aI-725 +aa(lp20934 +g15 +aI294 +aI-682 +aI280 +aI-707 +aI288 +aI-696 +aa(lp20935 +g15 +aI304 +aI-630 +aI300 +aI-668 +aI304 +aI-650 +aa(lp20936 +g15 +aI294 +aI-579 +aI304 +aI-610 +aI300 +aI-594 +aa(lp20937 +g15 +aI270 +aI-545 +aI288 +aI-565 +aI280 +aI-554 +aa(lp20938 +g15 +aI234 +aI-525 +aI259 +aI-536 +aI247 +aI-530 +aa(lp20939 +g15 +aI190 +aI-519 +aI220 +aI-521 +aI205 +aI-519 +aa(lp20940 +g15 +aI145 +aI-525 +aI174 +aI-519 +aI159 +aI-521 +aa(lp20941 +g15 +aI109 +aI-545 +aI131 +aI-530 +aI119 +aI-536 +aa(lp20942 +g15 +aI84 +aI-579 +aI98 +aI-554 +aI90 +aI-565 +aa(lp20943 +g15 +aI76 +aI-630 +aI79 +aI-594 +aI76 +aI-610 +aa(lp20944 +g10 +aa(lp20945 +g8 +aI380 +aI0 +aa(lp20946 +g10 +aa(lp20947 +g8 +aI380 +aI0 +aasV> +(lp20948 +(lp20949 +g8 +aI57 +aI-287 +aa(lp20950 +g20 +aI475 +aI-470 +aa(lp20951 +g20 +aI57 +aI-676 +aa(lp20952 +g20 +aI57 +aI-832 +aa(lp20953 +g20 +aI677 +aI-509 +aa(lp20954 +g20 +aI677 +aI-416 +aa(lp20955 +g20 +aI57 +aI-131 +aa(lp20956 +g10 +aa(lp20957 +g8 +aI734 +aI0 +aa(lp20958 +g10 +aa(lp20959 +g8 +aI734 +aI0 +aasVB +(lp20960 +(lp20961 +g8 +aI119 +aI-951 +aa(lp20962 +g20 +aI398 +aI-951 +aa(lp20963 +g15 +aI555 +aI-938 +aI458 +aI-951 +aI510 +aI-947 +aa(lp20964 +g15 +aI669 +aI-897 +aI601 +aI-930 +aI638 +aI-916 +aa(lp20965 +g15 +aI737 +aI-823 +aI699 +aI-878 +aI722 +aI-854 +aa(lp20966 +g15 +aI761 +aI-710 +aI753 +aI-792 +aI761 +aI-755 +aa(lp20967 +g15 +aI751 +aI-634 +aI761 +aI-683 +aI757 +aI-658 +aa(lp20968 +g15 +aI722 +aI-573 +aI744 +aI-611 +aI735 +aI-590 +aa(lp20969 +g15 +aI676 +aI-528 +aI710 +aI-555 +aI694 +aI-540 +aa(lp20970 +g15 +aI614 +aI-504 +aI658 +aI-516 +aI638 +aI-508 +aa(lp20971 +g20 +aI614 +aI-498 +aa(lp20972 +g15 +aI681 +aI-475 +aI638 +aI-493 +aI660 +aI-485 +aa(lp20973 +g15 +aI735 +aI-435 +aI701 +aI-466 +aI719 +aI-452 +aa(lp20974 +g15 +aI771 +aI-370 +aI750 +aI-418 +aI762 +aI-396 +aa(lp20975 +g15 +aI785 +aI-275 +aI780 +aI-344 +aI785 +aI-312 +aa(lp20976 +g15 +aI762 +aI-159 +aI785 +aI-232 +aI777 +aI-193 +aa(lp20977 +g15 +aI696 +aI-72 +aI747 +aI-125 +aI725 +aI-96 +aa(lp20978 +g15 +aI593 +aI-18 +aI668 +aI-49 +aI634 +aI-31 +aa(lp20979 +g15 +aI455 +aI0 +aI552 +aI-5 +aI506 +aI0 +aa(lp20980 +g20 +aI119 +aI0 +aa(lp20981 +g10 +aa(lp20982 +g8 +aI321 +aI-574 +aa(lp20983 +g20 +aI426 +aI-574 +aa(lp20984 +g15 +aI489 +aI-581 +aI451 +aI-574 +aI472 +aI-576 +aa(lp20985 +g15 +aI530 +aI-601 +aI506 +aI-585 +aI520 +aI-592 +aa(lp20986 +g15 +aI553 +aI-635 +aI541 +aI-610 +aI548 +aI-622 +aa(lp20987 +g15 +aI559 +aI-683 +aI557 +aI-649 +aI559 +aI-665 +aa(lp20988 +g15 +aI525 +aI-762 +aI559 +aI-720 +aI548 +aI-746 +aa(lp20989 +g15 +aI417 +aI-786 +aI502 +aI-778 +aI466 +aI-786 +aa(lp20990 +g20 +aI321 +aI-786 +aa(lp20991 +g10 +aa(lp20992 +g8 +aI321 +aI-414 +aa(lp20993 +g20 +aI321 +aI-166 +aa(lp20994 +g20 +aI440 +aI-166 +aa(lp20995 +g15 +aI506 +aI-175 +aI466 +aI-166 +aI488 +aI-169 +aa(lp20996 +g15 +aI550 +aI-201 +aI524 +aI-181 +aI539 +aI-190 +aa(lp20997 +g15 +aI574 +aI-242 +aI561 +aI-212 +aI569 +aI-226 +aa(lp20998 +g15 +aI581 +aI-295 +aI578 +aI-258 +aI581 +aI-276 +aa(lp20999 +g15 +aI574 +aI-344 +aI581 +aI-313 +aI578 +aI-329 +aa(lp21000 +g15 +aI549 +aI-381 +aI569 +aI-358 +aI561 +aI-371 +aa(lp21001 +g15 +aI504 +aI-405 +aI538 +aI-392 +aI523 +aI-400 +aa(lp21002 +g15 +aI434 +aI-414 +aI485 +aI-411 +aI462 +aI-414 +aa(lp21003 +g10 +aa(lp21004 +g8 +aI856 +aI0 +aa(lp21005 +g10 +aa(lp21006 +g8 +aI856 +aI0 +aasVF +(lp21007 +(lp21008 +g8 +aI318 +aI0 +aa(lp21009 +g20 +aI119 +aI0 +aa(lp21010 +g20 +aI119 +aI-951 +aa(lp21011 +g20 +aI665 +aI-951 +aa(lp21012 +g20 +aI665 +aI-786 +aa(lp21013 +g20 +aI318 +aI-786 +aa(lp21014 +g20 +aI318 +aI-540 +aa(lp21015 +g20 +aI641 +aI-540 +aa(lp21016 +g20 +aI641 +aI-375 +aa(lp21017 +g20 +aI318 +aI-375 +aa(lp21018 +g10 +aa(lp21019 +g8 +aI731 +aI0 +aa(lp21020 +g10 +aa(lp21021 +g8 +aI731 +aI0 +aasVJ +(lp21022 +(lp21023 +g8 +aI-1 +aI280 +aa(lp21024 +g15 +aI-75 +aI276 +aI-29 +aI280 +aI-54 +aI278 +aa(lp21025 +g15 +aI-129 +aI266 +aI-96 +aI273 +aI-114 +aI269 +aa(lp21026 +g20 +aI-129 +aI98 +aa(lp21027 +g15 +aI-79 +aI107 +aI-113 +aI101 +aI-96 +aI104 +aa(lp21028 +g15 +aI-21 +aI111 +aI-61 +aI109 +aI-42 +aI111 +aa(lp21029 +g15 +aI34 +aI104 +aI-1 +aI111 +aI17 +aI108 +aa(lp21030 +g15 +aI79 +aI82 +aI51 +aI100 +aI66 +aI92 +aa(lp21031 +g15 +aI109 +aI39 +aI91 +aI71 +aI101 +aI57 +aa(lp21032 +g15 +aI119 +aI-27 +aI116 +aI21 +aI119 +aI0 +aa(lp21033 +g20 +aI119 +aI-951 +aa(lp21034 +g20 +aI321 +aI-951 +aa(lp21035 +g20 +aI321 +aI-34 +aa(lp21036 +g15 +aI297 +aI107 +aI321 +aI20 +aI313 +aI67 +aa(lp21037 +g15 +aI231 +aI205 +aI282 +aI146 +aI259 +aI179 +aa(lp21038 +g15 +aI129 +aI262 +aI203 +aI231 +aI169 +aI250 +aa(lp21039 +g15 +aI-1 +aI280 +aI90 +aI274 +aI46 +aI280 +aa(lp21040 +g10 +aa(lp21041 +g8 +aI441 +aI0 +aa(lp21042 +g10 +aa(lp21043 +g8 +aI441 +aI0 +aasVN +(lp21044 +(lp21045 +g8 +aI923 +aI0 +aa(lp21046 +g20 +aI667 +aI0 +aa(lp21047 +g20 +aI293 +aI-719 +aa(lp21048 +g20 +aI287 +aI-719 +aa(lp21049 +g15 +aI294 +aI-619 +aI290 +aI-686 +aI292 +aI-652 +aa(lp21050 +g15 +aI298 +aI-531 +aI296 +aI-591 +aI297 +aI-562 +aa(lp21051 +g15 +aI300 +aI-447 +aI299 +aI-500 +aI300 +aI-472 +aa(lp21052 +g20 +aI300 +aI0 +aa(lp21053 +g20 +aI119 +aI0 +aa(lp21054 +g20 +aI119 +aI-951 +aa(lp21055 +g20 +aI374 +aI-951 +aa(lp21056 +g20 +aI748 +aI-238 +aa(lp21057 +g20 +aI751 +aI-238 +aa(lp21058 +g15 +aI747 +aI-336 +aI750 +aI-271 +aI749 +aI-304 +aa(lp21059 +g15 +aI745 +aI-378 +aI746 +aI-350 +aI746 +aI-364 +aa(lp21060 +g15 +aI744 +aI-422 +aI745 +aI-393 +aI744 +aI-407 +aa(lp21061 +g15 +aI743 +aI-464 +aI743 +aI-436 +aI743 +aI-450 +aa(lp21062 +g15 +aI742 +aI-500 +aI742 +aI-477 +aI742 +aI-489 +aa(lp21063 +g20 +aI742 +aI-951 +aa(lp21064 +g20 +aI923 +aI-951 +aa(lp21065 +g10 +aa(lp21066 +g8 +aI1044 +aI0 +aa(lp21067 +g10 +aa(lp21068 +g8 +aI1044 +aI0 +aasVR +(lp21069 +(lp21070 +g8 +aI321 +aI-528 +aa(lp21071 +g20 +aI376 +aI-528 +aa(lp21072 +g15 +aI496 +aI-562 +aI432 +aI-528 +aI472 +aI-540 +aa(lp21073 +g15 +aI533 +aI-661 +aI521 +aI-584 +aI533 +aI-617 +aa(lp21074 +g15 +aI494 +aI-757 +aI533 +aI-706 +aI520 +aI-738 +aa(lp21075 +g15 +aI373 +aI-786 +aI468 +aI-776 +aI427 +aI-786 +aa(lp21076 +g20 +aI321 +aI-786 +aa(lp21077 +g10 +aa(lp21078 +g8 +aI321 +aI-364 +aa(lp21079 +g20 +aI321 +aI0 +aa(lp21080 +g20 +aI119 +aI0 +aa(lp21081 +g20 +aI119 +aI-951 +aa(lp21082 +g20 +aI380 +aI-951 +aa(lp21083 +g15 +aI650 +aI-880 +aI502 +aI-951 +aI592 +aI-927 +aa(lp21084 +g15 +aI737 +aI-666 +aI708 +aI-833 +aI737 +aI-762 +aa(lp21085 +g15 +aI724 +aI-577 +aI737 +aI-633 +aI733 +aI-604 +aa(lp21086 +g15 +aI689 +aI-507 +aI715 +aI-551 +aI704 +aI-527 +aa(lp21087 +g15 +aI639 +aI-452 +aI675 +aI-486 +aI658 +aI-468 +aa(lp21088 +g15 +aI580 +aI-414 +aI620 +aI-437 +aI600 +aI-424 +aa(lp21089 +g15 +aI709 +aI-207 +aI628 +aI-337 +aI671 +aI-267 +aa(lp21090 +g15 +aI757 +aI-131 +aI726 +aI-181 +aI742 +aI-155 +aa(lp21091 +g15 +aI798 +aI-64 +aI772 +aI-106 +aI786 +aI-84 +aa(lp21092 +g15 +aI828 +aI-17 +aI810 +aI-45 +aI820 +aI-29 +aa(lp21093 +g20 +aI839 +aI0 +aa(lp21094 +g20 +aI615 +aI0 +aa(lp21095 +g20 +aI409 +aI-364 +aa(lp21096 +g10 +aa(lp21097 +g8 +aI839 +aI0 +aa(lp21098 +g10 +aa(lp21099 +g8 +aI839 +aI0 +aasVV +(lp21100 +(lp21101 +g8 +aI609 +aI-951 +aa(lp21102 +g20 +aI813 +aI-951 +aa(lp21103 +g20 +aI516 +aI0 +aa(lp21104 +g20 +aI296 +aI0 +aa(lp21105 +g20 +aI0 +aI-951 +aa(lp21106 +g20 +aI203 +aI-951 +aa(lp21107 +g20 +aI365 +aI-378 +aa(lp21108 +g15 +aI374 +aI-341 +aI367 +aI-371 +aI370 +aI-358 +aa(lp21109 +g15 +aI385 +aI-284 +aI377 +aI-323 +aI381 +aI-304 +aa(lp21110 +g15 +aI397 +aI-221 +aI389 +aI-263 +aI393 +aI-242 +aa(lp21111 +g15 +aI406 +aI-168 +aI401 +aI-200 +aI404 +aI-183 +aa(lp21112 +g15 +aI416 +aI-221 +aI409 +aI-183 +aI412 +aI-200 +aa(lp21113 +g15 +aI428 +aI-283 +aI419 +aI-242 +aI424 +aI-263 +aa(lp21114 +g15 +aI441 +aI-340 +aI432 +aI-304 +aI436 +aI-323 +aa(lp21115 +g15 +aI450 +aI-378 +aI445 +aI-358 +aI448 +aI-370 +aa(lp21116 +g10 +aa(lp21117 +g8 +aI813 +aI0 +aa(lp21118 +g10 +aa(lp21119 +g8 +aI813 +aI0 +aasVZ +(lp21120 +(lp21121 +g8 +aI686 +aI0 +aa(lp21122 +g20 +aI31 +aI0 +aa(lp21123 +g20 +aI31 +aI-130 +aa(lp21124 +g20 +aI434 +aI-784 +aa(lp21125 +g20 +aI44 +aI-784 +aa(lp21126 +g20 +aI44 +aI-951 +aa(lp21127 +g20 +aI674 +aI-951 +aa(lp21128 +g20 +aI674 +aI-821 +aa(lp21129 +g20 +aI272 +aI-166 +aa(lp21130 +g20 +aI686 +aI-166 +aa(lp21131 +g10 +aa(lp21132 +g8 +aI718 +aI0 +aa(lp21133 +g10 +aa(lp21134 +g8 +aI718 +aI0 +aasV^ +(lp21135 +(lp21136 +g8 +aI5 +aI-338 +aa(lp21137 +g20 +aI290 +aI-956 +aa(lp21138 +g20 +aI384 +aI-956 +aa(lp21139 +g20 +aI706 +aI-338 +aa(lp21140 +g20 +aI550 +aI-338 +aa(lp21141 +g20 +aI341 +aI-756 +aa(lp21142 +g15 +aI249 +aI-545 +aI311 +aI-686 +aI280 +aI-616 +aa(lp21143 +g15 +aI158 +aI-338 +aI218 +aI-475 +aI188 +aI-405 +aa(lp21144 +g10 +aa(lp21145 +g8 +aI709 +aI0 +aa(lp21146 +g10 +aa(lp21147 +g8 +aI709 +aI0 +aasVb +(lp21148 +(lp21149 +g8 +aI492 +aI-741 +aa(lp21150 +g15 +aI594 +aI-716 +aI529 +aI-741 +aI563 +aI-733 +aa(lp21151 +g15 +aI673 +aI-645 +aI625 +aI-700 +aI651 +aI-677 +aa(lp21152 +g15 +aI725 +aI-527 +aI695 +aI-613 +aI713 +aI-574 +aa(lp21153 +g15 +aI744 +aI-364 +aI737 +aI-480 +aI744 +aI-426 +aa(lp21154 +g15 +aI725 +aI-200 +aI744 +aI-302 +aI737 +aI-247 +aa(lp21155 +g15 +aI673 +aI-82 +aI713 +aI-153 +aI695 +aI-113 +aa(lp21156 +g15 +aI591 +aI-10 +aI650 +aI-50 +aI623 +aI-26 +aa(lp21157 +g15 +aI486 +aI13 +aI560 +aI5 +aI525 +aI13 +aa(lp21158 +g15 +aI422 +aI5 +aI462 +aI13 +aI441 +aI10 +aa(lp21159 +g15 +aI371 +aI-15 +aI403 +aI0 +aI386 +aI-6 +aa(lp21160 +g15 +aI333 +aI-44 +aI356 +aI-23 +aI344 +aI-33 +aa(lp21161 +g15 +aI302 +aI-79 +aI321 +aI-55 +aI311 +aI-67 +aa(lp21162 +g20 +aI289 +aI-79 +aa(lp21163 +g20 +aI255 +aI0 +aa(lp21164 +g20 +aI104 +aI0 +aa(lp21165 +g20 +aI104 +aI-1012 +aa(lp21166 +g20 +aI302 +aI-1012 +aa(lp21167 +g20 +aI302 +aI-776 +aa(lp21168 +g15 +aI301 +aI-730 +aI302 +aI-762 +aI302 +aI-747 +aa(lp21169 +g15 +aI298 +aI-683 +aI300 +aI-713 +aI299 +aI-698 +aa(lp21170 +g15 +aI294 +aI-633 +aI297 +aI-666 +aI296 +aI-649 +aa(lp21171 +g20 +aI302 +aI-633 +aa(lp21172 +g15 +aI333 +aI-675 +aI311 +aI-648 +aI322 +aI-662 +aa(lp21173 +g15 +aI374 +aI-709 +aI345 +aI-688 +aI359 +aI-699 +aa(lp21174 +g15 +aI427 +aI-732 +aI390 +aI-719 +aI407 +aI-726 +aa(lp21175 +g15 +aI492 +aI-741 +aI446 +aI-738 +aI468 +aI-741 +aa(lp21176 +g10 +aa(lp21177 +g8 +aI425 +aI-582 +aa(lp21178 +g15 +aI368 +aI-570 +aI402 +aI-582 +aI384 +aI-578 +aa(lp21179 +g15 +aI331 +aI-534 +aI353 +aI-562 +aI340 +aI-550 +aa(lp21180 +g15 +aI310 +aI-473 +aI321 +aI-517 +aI314 +aI-497 +aa(lp21181 +g15 +aI302 +aI-387 +aI306 +aI-448 +aI303 +aI-420 +aa(lp21182 +g20 +aI302 +aI-366 +aa(lp21183 +g15 +aI308 +aI-272 +aI302 +aI-330 +aI304 +aI-299 +aa(lp21184 +g15 +aI329 +aI-203 +aI313 +aI-244 +aI319 +aI-222 +aa(lp21185 +g15 +aI367 +aI-161 +aI338 +aI-185 +aI351 +aI-171 +aa(lp21186 +g15 +aI426 +aI-147 +aI383 +aI-152 +aI402 +aI-147 +aa(lp21187 +g15 +aI513 +aI-203 +aI465 +aI-147 +aI494 +aI-166 +aa(lp21188 +g15 +aI541 +aI-367 +aI531 +aI-241 +aI541 +aI-295 +aa(lp21189 +g15 +aI513 +aI-528 +aI541 +aI-439 +aI531 +aI-492 +aa(lp21190 +g15 +aI425 +aI-582 +aI494 +aI-564 +aI465 +aI-582 +aa(lp21191 +g10 +aa(lp21192 +g8 +aI810 +aI0 +aa(lp21193 +g10 +aa(lp21194 +g8 +aI810 +aI0 +aasVf +(lp21195 +(lp21196 +g8 +aI482 +aI-578 +aa(lp21197 +g20 +aI334 +aI-578 +aa(lp21198 +g20 +aI334 +aI0 +aa(lp21199 +g20 +aI136 +aI0 +aa(lp21200 +g20 +aI136 +aI-578 +aa(lp21201 +g20 +aI26 +aI-578 +aa(lp21202 +g20 +aI26 +aI-674 +aa(lp21203 +g20 +aI136 +aI-727 +aa(lp21204 +g20 +aI136 +aI-780 +aa(lp21205 +g15 +aI152 +aI-896 +aI136 +aI-827 +aI141 +aI-865 +aa(lp21206 +g15 +aI201 +aI-969 +aI164 +aI-926 +aI180 +aI-951 +aa(lp21207 +g15 +aI276 +aI-1008 +aI222 +aI-987 +aI247 +aI-1000 +aa(lp21208 +g15 +aI376 +aI-1019 +aI306 +aI-1015 +aI339 +aI-1019 +aa(lp21209 +g15 +aI477 +aI-1010 +aI416 +aI-1019 +aI449 +aI-1016 +aa(lp21210 +g15 +aI546 +aI-989 +aI504 +aI-1003 +aI527 +aI-996 +aa(lp21211 +g20 +aI500 +aI-843 +aa(lp21212 +g15 +aI457 +aI-856 +aI486 +aI-848 +aI472 +aI-852 +aa(lp21213 +g15 +aI405 +aI-862 +aI442 +aI-860 +aI425 +aI-862 +aa(lp21214 +g15 +aI350 +aI-837 +aI379 +aI-862 +aI361 +aI-853 +aa(lp21215 +g15 +aI334 +aI-772 +aI339 +aI-820 +aI334 +aI-799 +aa(lp21216 +g20 +aI334 +aI-727 +aa(lp21217 +g20 +aI482 +aI-727 +aa(lp21218 +g10 +aa(lp21219 +g8 +aI516 +aI0 +aa(lp21220 +g10 +aa(lp21221 +g8 +aI516 +aI0 +aasVj +(lp21222 +(lp21223 +g8 +aI66 +aI320 +aa(lp21224 +g15 +aI1 +aI316 +aI45 +aI320 +aI24 +aI319 +aa(lp21225 +g15 +aI-53 +aI304 +aI-20 +aI313 +aI-38 +aI309 +aa(lp21226 +g20 +aI-53 +aI148 +aa(lp21227 +g15 +aI-15 +aI157 +aI-39 +aI152 +aI-27 +aI155 +aa(lp21228 +g15 +aI24 +aI160 +aI-3 +aI159 +aI9 +aI160 +aa(lp21229 +g15 +aI55 +aI155 +aI34 +aI160 +aI45 +aI158 +aa(lp21230 +g15 +aI80 +aI138 +aI64 +aI152 +aI73 +aI146 +aa(lp21231 +g15 +aI97 +aI104 +aI87 +aI129 +aI93 +aI118 +aa(lp21232 +g15 +aI104 +aI49 +aI101 +aI90 +aI104 +aI72 +aa(lp21233 +g20 +aI104 +aI-727 +aa(lp21234 +g20 +aI302 +aI-727 +aa(lp21235 +g20 +aI302 +aI79 +aa(lp21236 +g15 +aI290 +aI173 +aI302 +aI112 +aI298 +aI144 +aa(lp21237 +g15 +aI249 +aI250 +aI281 +aI202 +aI267 +aI228 +aa(lp21238 +g15 +aI175 +aI301 +aI230 +aI272 +aI205 +aI289 +aa(lp21239 +g15 +aI66 +aI320 +aI145 +aI314 +aI109 +aI320 +aa(lp21240 +g10 +aa(lp21241 +g8 +aI95 +aI-915 +aa(lp21242 +g15 +aI104 +aI-962 +aI95 +aI-934 +aI98 +aI-949 +aa(lp21243 +g15 +aI127 +aI-992 +aI109 +aI-974 +aI117 +aI-984 +aa(lp21244 +g15 +aI161 +aI-1008 +aI137 +aI-999 +aI148 +aI-1004 +aa(lp21245 +g15 +aI203 +aI-1012 +aI175 +aI-1011 +aI189 +aI-1012 +aa(lp21246 +g15 +aI245 +aI-1008 +aI218 +aI-1012 +aI232 +aI-1011 +aa(lp21247 +g15 +aI279 +aI-992 +aI258 +aI-1004 +aI269 +aI-999 +aa(lp21248 +g15 +aI303 +aI-962 +aI289 +aI-984 +aI297 +aI-974 +aa(lp21249 +g15 +aI311 +aI-915 +aI308 +aI-949 +aI311 +aI-934 +aa(lp21250 +g15 +aI303 +aI-869 +aI311 +aI-897 +aI308 +aI-881 +aa(lp21251 +g15 +aI279 +aI-839 +aI297 +aI-856 +aI289 +aI-846 +aa(lp21252 +g15 +aI245 +aI-822 +aI269 +aI-831 +aI258 +aI-826 +aa(lp21253 +g15 +aI203 +aI-817 +aI232 +aI-819 +aI218 +aI-817 +aa(lp21254 +g15 +aI161 +aI-822 +aI189 +aI-817 +aI175 +aI-819 +aa(lp21255 +g15 +aI127 +aI-839 +aI148 +aI-826 +aI137 +aI-831 +aa(lp21256 +g15 +aI104 +aI-869 +aI117 +aI-846 +aI109 +aI-856 +aa(lp21257 +g15 +aI95 +aI-915 +aI98 +aI-881 +aI95 +aI-897 +aa(lp21258 +g10 +aa(lp21259 +g8 +aI406 +aI0 +aa(lp21260 +g10 +aa(lp21261 +g8 +aI406 +aI0 +aasVn +(lp21262 +(lp21263 +g8 +aI735 +aI0 +aa(lp21264 +g20 +aI537 +aI0 +aa(lp21265 +g20 +aI537 +aI-424 +aa(lp21266 +g15 +aI513 +aI-542 +aI537 +aI-477 +aI529 +aI-516 +aa(lp21267 +g15 +aI437 +aI-582 +aI497 +aI-569 +aI472 +aI-582 +aa(lp21268 +g15 +aI372 +aI-566 +aI411 +aI-582 +aI389 +aI-577 +aa(lp21269 +g15 +aI331 +aI-520 +aI355 +aI-556 +aI341 +aI-540 +aa(lp21270 +g15 +aI309 +aI-444 +aI320 +aI-499 +aI313 +aI-474 +aa(lp21271 +g15 +aI302 +aI-341 +aI304 +aI-414 +aI302 +aI-380 +aa(lp21272 +g20 +aI302 +aI0 +aa(lp21273 +g20 +aI104 +aI0 +aa(lp21274 +g20 +aI104 +aI-727 +aa(lp21275 +g20 +aI255 +aI-727 +aa(lp21276 +g20 +aI282 +aI-634 +aa(lp21277 +g20 +aI293 +aI-634 +aa(lp21278 +g15 +aI331 +aI-682 +aI304 +aI-652 +aI316 +aI-669 +aa(lp21279 +g15 +aI380 +aI-715 +aI346 +aI-695 +aI363 +aI-707 +aa(lp21280 +g15 +aI437 +aI-734 +aI398 +aI-724 +aI417 +aI-730 +aa(lp21281 +g15 +aI498 +aI-741 +aI457 +aI-739 +aI477 +aI-741 +aa(lp21282 +g15 +aI595 +aI-725 +aI534 +aI-741 +aI566 +aI-735 +aa(lp21283 +g15 +aI670 +aI-677 +aI624 +aI-715 +aI649 +aI-699 +aa(lp21284 +g15 +aI718 +aI-594 +aI691 +aI-656 +aI707 +aI-628 +aa(lp21285 +g15 +aI735 +aI-474 +aI730 +aI-561 +aI735 +aI-521 +aa(lp21286 +g10 +aa(lp21287 +g8 +aI835 +aI0 +aa(lp21288 +g10 +aa(lp21289 +g8 +aI835 +aI0 +aasVr +(lp21290 +(lp21291 +g8 +aI483 +aI-741 +aa(lp21292 +g15 +aI500 +aI-740 +aI488 +aI-741 +aI494 +aI-740 +aa(lp21293 +g15 +aI519 +aI-739 +aI507 +aI-740 +aI513 +aI-740 +aa(lp21294 +g15 +aI535 +aI-737 +aI525 +aI-738 +aI530 +aI-738 +aa(lp21295 +g15 +aI546 +aI-735 +aI540 +aI-736 +aI544 +aI-736 +aa(lp21296 +g20 +aI546 +aI-549 +aa(lp21297 +g15 +aI532 +aI-551 +aI543 +aI-549 +aI538 +aI-550 +aa(lp21298 +g15 +aI513 +aI-553 +aI526 +aI-552 +aI520 +aI-553 +aa(lp21299 +g15 +aI493 +aI-555 +aI506 +aI-554 +aI500 +aI-554 +aa(lp21300 +g15 +aI477 +aI-555 +aI486 +aI-555 +aI481 +aI-555 +aa(lp21301 +g15 +aI406 +aI-545 +aI451 +aI-555 +aI428 +aI-552 +aa(lp21302 +g15 +aI351 +aI-514 +aI385 +aI-539 +aI366 +aI-528 +aa(lp21303 +g15 +aI315 +aI-456 +aI335 +aI-499 +aI323 +aI-480 +aa(lp21304 +g15 +aI302 +aI-369 +aI306 +aI-433 +aI302 +aI-404 +aa(lp21305 +g20 +aI302 +aI0 +aa(lp21306 +g20 +aI104 +aI0 +aa(lp21307 +g20 +aI104 +aI-727 +aa(lp21308 +g20 +aI254 +aI-727 +aa(lp21309 +g20 +aI283 +aI-618 +aa(lp21310 +g20 +aI293 +aI-618 +aa(lp21311 +g15 +aI327 +aI-668 +aI304 +aI-636 +aI315 +aI-653 +aa(lp21312 +g15 +aI368 +aI-707 +aI339 +aI-684 +aI353 +aI-696 +aa(lp21313 +g15 +aI418 +aI-732 +aI383 +aI-718 +aI400 +aI-726 +aa(lp21314 +g15 +aI483 +aI-741 +aI437 +aI-738 +aI459 +aI-741 +aa(lp21315 +g10 +aa(lp21316 +g8 +aI578 +aI0 +aa(lp21317 +g10 +aa(lp21318 +g8 +aI578 +aI0 +aasVv +(lp21319 +(lp21320 +g8 +aI257 +aI0 +aa(lp21321 +g20 +aI0 +aI-727 +aa(lp21322 +g20 +aI207 +aI-727 +aa(lp21323 +g20 +aI328 +aI-312 +aa(lp21324 +g15 +aI347 +aI-235 +aI335 +aI-287 +aI341 +aI-262 +aa(lp21325 +g15 +aI357 +aI-163 +aI352 +aI-208 +aI356 +aI-184 +aa(lp21326 +g20 +aI361 +aI-163 +aa(lp21327 +g15 +aI371 +aI-236 +aI362 +aI-186 +aI365 +aI-211 +aa(lp21328 +g15 +aI390 +aI-312 +aI376 +aI-262 +aI383 +aI-287 +aa(lp21329 +g20 +aI510 +aI-727 +aa(lp21330 +g20 +aI718 +aI-727 +aa(lp21331 +g20 +aI461 +aI0 +aa(lp21332 +g10 +aa(lp21333 +g8 +aI718 +aI0 +aa(lp21334 +g10 +aa(lp21335 +g8 +aI718 +aI0 +aasVz +(lp21336 +(lp21337 +g8 +aI570 +aI0 +aa(lp21338 +g20 +aI35 +aI0 +aa(lp21339 +g20 +aI35 +aI-116 +aa(lp21340 +g20 +aI333 +aI-575 +aa(lp21341 +g20 +aI55 +aI-575 +aa(lp21342 +g20 +aI55 +aI-727 +aa(lp21343 +g20 +aI558 +aI-727 +aa(lp21344 +g20 +aI558 +aI-598 +aa(lp21345 +g20 +aI270 +aI-151 +aa(lp21346 +g20 +aI570 +aI-151 +aa(lp21347 +g10 +aa(lp21348 +g8 +aI609 +aI0 +aa(lp21349 +g10 +aa(lp21350 +g8 +aI609 +aI0 +aasV~ +(lp21351 +(lp21352 +g8 +aI343 +aI-400 +aa(lp21353 +g15 +aI301 +aI-418 +aI327 +aI-407 +aI313 +aI-413 +aa(lp21354 +g15 +aI267 +aI-429 +aI288 +aI-422 +aI277 +aI-426 +aa(lp21355 +g15 +aI238 +aI-435 +aI257 +aI-432 +aI247 +aI-434 +aa(lp21356 +g15 +aI209 +aI-437 +aI229 +aI-436 +aI219 +aI-437 +aa(lp21357 +g15 +aI170 +aI-430 +aI197 +aI-437 +aI184 +aI-434 +aa(lp21358 +g15 +aI130 +aI-413 +aI157 +aI-426 +aI143 +aI-421 +aa(lp21359 +g15 +aI92 +aI-388 +aI117 +aI-406 +aI105 +aI-398 +aa(lp21360 +g15 +aI57 +aI-358 +aI80 +aI-379 +aI68 +aI-369 +aa(lp21361 +g20 +aI57 +aI-508 +aa(lp21362 +g15 +aI131 +aI-561 +aI79 +aI-532 +aI104 +aI-549 +aa(lp21363 +g15 +aI223 +aI-579 +aI159 +aI-573 +aI190 +aI-579 +aa(lp21364 +g15 +aI260 +aI-577 +aI236 +aI-579 +aI249 +aI-579 +aa(lp21365 +g15 +aI295 +aI-571 +aI271 +aI-576 +aI282 +aI-574 +aa(lp21366 +g15 +aI336 +aI-559 +aI307 +aI-568 +aI321 +aI-564 +aa(lp21367 +g15 +aI390 +aI-537 +aI351 +aI-553 +aI369 +aI-546 +aa(lp21368 +g15 +aI433 +aI-520 +aI407 +aI-531 +aI421 +aI-525 +aa(lp21369 +g15 +aI468 +aI-509 +aI446 +aI-516 +aI457 +aI-512 +aa(lp21370 +g15 +aI497 +aI-503 +aI478 +aI-506 +aI488 +aI-504 +aa(lp21371 +g15 +aI525 +aI-502 +aI506 +aI-502 +aI515 +aI-502 +aa(lp21372 +g15 +aI564 +aI-508 +aI537 +aI-502 +aI550 +aI-504 +aa(lp21373 +g15 +aI604 +aI-524 +aI577 +aI-512 +aI591 +aI-517 +aa(lp21374 +g15 +aI642 +aI-550 +aI617 +aI-531 +aI629 +aI-540 +aa(lp21375 +g15 +aI677 +aI-580 +aI654 +aI-559 +aI666 +aI-570 +aa(lp21376 +g20 +aI677 +aI-430 +aa(lp21377 +g15 +aI510 +aI-359 +aI633 +aI-383 +aI577 +aI-359 +aa(lp21378 +g15 +aI474 +aI-361 +aI497 +aI-359 +aI485 +aI-360 +aa(lp21379 +g15 +aI439 +aI-367 +aI463 +aI-362 +aI451 +aI-364 +aa(lp21380 +g15 +aI397 +aI-379 +aI426 +aI-369 +aI412 +aI-374 +aa(lp21381 +g15 +aI343 +aI-400 +aI382 +aI-384 +aI364 +aI-391 +aa(lp21382 +g10 +aa(lp21383 +g8 +aI734 +aI0 +aa(lp21384 +g10 +aa(lp21385 +g8 +aI734 +aI0 +aasV! +(lp21386 +(lp21387 +g8 +aI270 +aI-315 +aa(lp21388 +g20 +aI111 +aI-315 +aa(lp21389 +g20 +aI78 +aI-951 +aa(lp21390 +g20 +aI304 +aI-951 +aa(lp21391 +g10 +aa(lp21392 +g8 +aI76 +aI-92 +aa(lp21393 +g15 +aI84 +aI-144 +aI76 +aI-113 +aI79 +aI-130 +aa(lp21394 +g15 +aI109 +aI-178 +aI90 +aI-158 +aI98 +aI-169 +aa(lp21395 +g15 +aI145 +aI-197 +aI119 +aI-187 +aI131 +aI-193 +aa(lp21396 +g15 +aI190 +aI-203 +aI159 +aI-201 +aI174 +aI-203 +aa(lp21397 +g15 +aI234 +aI-197 +aI205 +aI-203 +aI220 +aI-201 +aa(lp21398 +g15 +aI270 +aI-178 +aI247 +aI-193 +aI259 +aI-187 +aa(lp21399 +g15 +aI294 +aI-144 +aI280 +aI-169 +aI288 +aI-158 +aa(lp21400 +g15 +aI304 +aI-92 +aI300 +aI-130 +aI304 +aI-113 +aa(lp21401 +g15 +aI294 +aI-42 +aI304 +aI-73 +aI300 +aI-56 +aa(lp21402 +g15 +aI270 +aI-8 +aI288 +aI-28 +aI280 +aI-17 +aa(lp21403 +g15 +aI234 +aI11 +aI259 +aI1 +aI247 +aI7 +aa(lp21404 +g15 +aI190 +aI18 +aI220 +aI15 +aI205 +aI18 +aa(lp21405 +g15 +aI145 +aI11 +aI174 +aI18 +aI159 +aI15 +aa(lp21406 +g15 +aI109 +aI-8 +aI131 +aI7 +aI119 +aI1 +aa(lp21407 +g15 +aI84 +aI-42 +aI98 +aI-17 +aI90 +aI-28 +aa(lp21408 +g15 +aI76 +aI-92 +aI79 +aI-56 +aI76 +aI-73 +aa(lp21409 +g10 +aa(lp21410 +g8 +aI381 +aI0 +aa(lp21411 +g10 +aa(lp21412 +g8 +aI381 +aI0 +aasV% +(lp21413 +(lp21414 +g8 +aI205 +aI-666 +aa(lp21415 +g15 +aI219 +aI-542 +aI205 +aI-611 +aI209 +aI-569 +aa(lp21416 +g15 +aI266 +aI-502 +aI229 +aI-515 +aI245 +aI-502 +aa(lp21417 +g15 +aI314 +aI-542 +aI288 +aI-502 +aI303 +aI-515 +aa(lp21418 +g15 +aI329 +aI-666 +aI324 +aI-569 +aI329 +aI-610 +aa(lp21419 +g15 +aI266 +aI-828 +aI329 +aI-774 +aI308 +aI-828 +aa(lp21420 +g15 +aI219 +aI-788 +aI245 +aI-828 +aI229 +aI-815 +aa(lp21421 +g15 +aI205 +aI-666 +aI209 +aI-762 +aI205 +aI-721 +aa(lp21422 +g10 +aa(lp21423 +g8 +aI493 +aI-667 +aa(lp21424 +g15 +aI480 +aI-541 +aI493 +aI-620 +aI489 +aI-578 +aa(lp21425 +g15 +aI438 +aI-446 +aI471 +aI-503 +aI457 +aI-472 +aa(lp21426 +g15 +aI367 +aI-387 +aI420 +aI-421 +aI396 +aI-401 +aa(lp21427 +g15 +aI265 +aI-367 +aI339 +aI-374 +aI305 +aI-367 +aa(lp21428 +g15 +aI168 +aI-387 +aI228 +aI-367 +aI196 +aI-374 +aa(lp21429 +g15 +aI97 +aI-446 +aI140 +aI-401 +aI116 +aI-421 +aa(lp21430 +g15 +aI55 +aI-541 +aI79 +aI-472 +aI64 +aI-503 +aa(lp21431 +g15 +aI41 +aI-667 +aI45 +aI-578 +aI41 +aI-620 +aa(lp21432 +g15 +aI54 +aI-793 +aI41 +aI-714 +aI45 +aI-756 +aa(lp21433 +g15 +aI94 +aI-886 +aI62 +aI-830 +aI76 +aI-861 +aa(lp21434 +g15 +aI164 +aI-944 +aI113 +aI-911 +aI136 +aI-931 +aa(lp21435 +g15 +aI265 +aI-965 +aI192 +aI-958 +aI226 +aI-965 +aa(lp21436 +g15 +aI364 +aI-944 +aI302 +aI-965 +aI335 +aI-958 +aa(lp21437 +g15 +aI435 +aI-886 +aI392 +aI-931 +aI416 +aI-911 +aa(lp21438 +g15 +aI478 +aI-793 +aI454 +aI-861 +aI469 +aI-830 +aa(lp21439 +g15 +aI493 +aI-667 +aI488 +aI-756 +aI493 +aI-714 +aa(lp21440 +g10 +aa(lp21441 +g8 +aI927 +aI-951 +aa(lp21442 +g20 +aI399 +aI0 +aa(lp21443 +g20 +aI244 +aI0 +aa(lp21444 +g20 +aI772 +aI-951 +aa(lp21445 +g10 +aa(lp21446 +g8 +aI845 +aI-286 +aa(lp21447 +g15 +aI859 +aI-162 +aI845 +aI-230 +aI849 +aI-189 +aa(lp21448 +g15 +aI906 +aI-121 +aI869 +aI-135 +aI885 +aI-121 +aa(lp21449 +g15 +aI954 +aI-162 +aI928 +aI-121 +aI943 +aI-135 +aa(lp21450 +g15 +aI969 +aI-286 +aI964 +aI-189 +aI969 +aI-230 +aa(lp21451 +g15 +aI906 +aI-448 +aI969 +aI-394 +aI948 +aI-448 +aa(lp21452 +g15 +aI859 +aI-408 +aI885 +aI-448 +aI869 +aI-435 +aa(lp21453 +g15 +aI845 +aI-286 +aI849 +aI-382 +aI845 +aI-341 +aa(lp21454 +g10 +aa(lp21455 +g8 +aI1133 +aI-287 +aa(lp21456 +g15 +aI1120 +aI-161 +aI1133 +aI-240 +aI1129 +aI-198 +aa(lp21457 +g15 +aI1078 +aI-67 +aI1111 +aI-124 +aI1097 +aI-92 +aa(lp21458 +g15 +aI1007 +aI-8 +aI1060 +aI-41 +aI1036 +aI-22 +aa(lp21459 +g15 +aI905 +aI12 +aI979 +aI5 +aI945 +aI12 +aa(lp21460 +g15 +aI808 +aI-8 +aI868 +aI12 +aI836 +aI5 +aa(lp21461 +g15 +aI738 +aI-67 +aI780 +aI-22 +aI757 +aI-41 +aa(lp21462 +g15 +aI695 +aI-161 +aI719 +aI-92 +aI705 +aI-124 +aa(lp21463 +g15 +aI681 +aI-287 +aI686 +aI-198 +aI681 +aI-240 +aa(lp21464 +g15 +aI694 +aI-412 +aI681 +aI-334 +aI685 +aI-376 +aa(lp21465 +g15 +aI735 +aI-506 +aI703 +aI-449 +aI716 +aI-480 +aa(lp21466 +g15 +aI804 +aI-564 +aI753 +aI-531 +aI776 +aI-551 +aa(lp21467 +g15 +aI905 +aI-584 +aI832 +aI-578 +aI866 +aI-584 +aa(lp21468 +g15 +aI1004 +aI-564 +aI942 +aI-584 +aI975 +aI-578 +aa(lp21469 +g15 +aI1075 +aI-506 +aI1032 +aI-551 +aI1056 +aI-531 +aa(lp21470 +g15 +aI1118 +aI-412 +aI1094 +aI-480 +aI1109 +aI-449 +aa(lp21471 +g15 +aI1133 +aI-287 +aI1128 +aI-376 +aI1133 +aI-334 +aa(lp21472 +g10 +aa(lp21473 +g8 +aI1174 +aI0 +aa(lp21474 +g10 +aa(lp21475 +g8 +aI1174 +aI0 +aasV) +(lp21476 +(lp21477 +g8 +aI398 +aI-364 +aa(lp21478 +g15 +aI386 +aI-205 +aI398 +aI-310 +aI394 +aI-258 +aa(lp21479 +g15 +aI350 +aI-54 +aI378 +aI-153 +aI366 +aI-103 +aa(lp21480 +g15 +aI290 +aI85 +aI334 +aI-5 +aI314 +aI41 +aa(lp21481 +g15 +aI202 +aI211 +aI265 +aI130 +aI236 +aI172 +aa(lp21482 +g20 +aI41 +aI211 +aa(lp21483 +g15 +aI120 +aI81 +aI70 +aI170 +aI97 +aI127 +aa(lp21484 +g15 +aI178 +aI-61 +aI143 +aI35 +aI162 +aI-12 +aa(lp21485 +g15 +aI213 +aI-211 +aI194 +aI-110 +aI205 +aI-160 +aa(lp21486 +g15 +aI225 +aI-366 +aI221 +aI-263 +aI225 +aI-314 +aa(lp21487 +g15 +aI178 +aI-675 +aI225 +aI-471 +aI209 +aI-575 +aa(lp21488 +g15 +aI39 +aI-951 +aI147 +aI-775 +aI100 +aI-867 +aa(lp21489 +g20 +aI202 +aI-951 +aa(lp21490 +g15 +aI290 +aI-822 +aI236 +aI-911 +aI265 +aI-867 +aa(lp21491 +g15 +aI350 +aI-678 +aI314 +aI-776 +aI334 +aI-728 +aa(lp21492 +g15 +aI386 +aI-525 +aI366 +aI-629 +aI378 +aI-577 +aa(lp21493 +g15 +aI398 +aI-364 +aI394 +aI-472 +aI398 +aI-419 +aa(lp21494 +g10 +aa(lp21495 +g8 +aI451 +aI0 +aa(lp21496 +g10 +aa(lp21497 +g8 +aI451 +aI0 +aasV- +(lp21498 +(lp21499 +g8 +aI39 +aI-275 +aa(lp21500 +g20 +aI39 +aI-438 +aa(lp21501 +g20 +aI389 +aI-438 +aa(lp21502 +g20 +aI389 +aI-275 +aa(lp21503 +g10 +aa(lp21504 +g8 +aI429 +aI0 +aa(lp21505 +g10 +aa(lp21506 +g8 +aI429 +aI0 +aasV1 +(lp21507 +(lp21508 +g8 +aI531 +aI0 +aa(lp21509 +g20 +aI330 +aI0 +aa(lp21510 +g20 +aI330 +aI-550 +aa(lp21511 +g15 +aI331 +aI-591 +aI330 +aI-561 +aI330 +aI-575 +aa(lp21512 +g15 +aI332 +aI-640 +aI331 +aI-606 +aI331 +aI-623 +aa(lp21513 +g15 +aI334 +aI-692 +aI333 +aI-657 +aI333 +aI-674 +aa(lp21514 +g15 +aI335 +aI-739 +aI334 +aI-709 +aI335 +aI-725 +aa(lp21515 +g15 +aI324 +aI-728 +aI333 +aI-737 +aI330 +aI-733 +aa(lp21516 +g15 +aI307 +aI-710 +aI319 +aI-722 +aI313 +aI-717 +aa(lp21517 +g15 +aI287 +aI-691 +aI300 +aI-704 +aI294 +aI-698 +aa(lp21518 +g15 +aI266 +aI-674 +aI280 +aI-685 +aI273 +aI-679 +aa(lp21519 +g20 +aI157 +aI-586 +aa(lp21520 +g20 +aI59 +aI-707 +aa(lp21521 +g20 +aI366 +aI-951 +aa(lp21522 +g20 +aI531 +aI-951 +aa(lp21523 +g10 +aa(lp21524 +g8 +aI734 +aI0 +aa(lp21525 +g10 +aa(lp21526 +g8 +aI734 +aI0 +aasV5 +(lp21527 +(lp21528 +g8 +aI389 +aI-607 +aa(lp21529 +g15 +aI503 +aI-588 +aI430 +aI-607 +aI468 +aI-601 +aa(lp21530 +g15 +aI595 +aI-533 +aI538 +aI-576 +aI569 +aI-557 +aa(lp21531 +g15 +aI656 +aI-442 +aI621 +aI-509 +aI641 +aI-478 +aa(lp21532 +g15 +aI678 +aI-317 +aI671 +aI-406 +aI678 +aI-364 +aa(lp21533 +g15 +aI654 +aI-178 +aI678 +aI-266 +aI670 +aI-219 +aa(lp21534 +g15 +aI583 +aI-74 +aI638 +aI-137 +aI614 +aI-103 +aa(lp21535 +g15 +aI467 +aI-9 +aI552 +aI-46 +aI513 +aI-24 +aa(lp21536 +g15 +aI307 +aI13 +aI420 +aI5 +aI367 +aI13 +aa(lp21537 +g15 +aI236 +aI10 +aI284 +aI13 +aI260 +aI12 +aa(lp21538 +g15 +aI169 +aI0 +aI213 +aI8 +aI191 +aI4 +aa(lp21539 +g15 +aI108 +aI-15 +aI148 +aI-3 +aI127 +aI-8 +aa(lp21540 +g15 +aI55 +aI-37 +aI89 +aI-21 +aI71 +aI-29 +aa(lp21541 +g20 +aI55 +aI-211 +aa(lp21542 +g15 +aI108 +aI-187 +aI71 +aI-203 +aI88 +aI-194 +aa(lp21543 +g15 +aI170 +aI-167 +aI128 +aI-179 +aI149 +aI-173 +aa(lp21544 +g15 +aI235 +aI-154 +aI192 +aI-162 +aI213 +aI-158 +aa(lp21545 +g15 +aI297 +aI-149 +aI257 +aI-151 +aI277 +aI-149 +aa(lp21546 +g15 +aI430 +aI-186 +aI355 +aI-149 +aI399 +aI-161 +aa(lp21547 +g15 +aI475 +aI-300 +aI460 +aI-210 +aI475 +aI-248 +aa(lp21548 +g15 +aI431 +aI-408 +aI475 +aI-347 +aI461 +aI-383 +aa(lp21549 +g15 +aI293 +aI-444 +aI401 +aI-432 +aI355 +aI-444 +aa(lp21550 +g15 +aI257 +aI-442 +aI282 +aI-444 +aI270 +aI-444 +aa(lp21551 +g15 +aI219 +aI-437 +aI244 +aI-441 +aI232 +aI-439 +aa(lp21552 +g15 +aI184 +aI-430 +aI207 +aI-435 +aI195 +aI-433 +aa(lp21553 +g15 +aI154 +aI-423 +aI172 +aI-428 +aI163 +aI-425 +aa(lp21554 +g20 +aI74 +aI-466 +aa(lp21555 +g20 +aI110 +aI-951 +aa(lp21556 +g20 +aI613 +aI-951 +aa(lp21557 +g20 +aI613 +aI-780 +aa(lp21558 +g20 +aI285 +aI-780 +aa(lp21559 +g20 +aI269 +aI-593 +aa(lp21560 +g15 +aI318 +aI-603 +aI283 +aI-596 +aI299 +aI-600 +aa(lp21561 +g15 +aI389 +aI-607 +aI336 +aI-606 +aI360 +aI-607 +aa(lp21562 +g10 +aa(lp21563 +g8 +aI734 +aI0 +aa(lp21564 +g10 +aa(lp21565 +g8 +aI734 +aI0 +aasV9 +(lp21566 +(lp21567 +g8 +aI686 +aI-545 +aa(lp21568 +g15 +aI679 +aI-408 +aI686 +aI-499 +aI684 +aI-454 +aa(lp21569 +g15 +aI652 +aI-278 +aI674 +aI-363 +aI665 +aI-320 +aa(lp21570 +g15 +aI600 +aI-163 +aI639 +aI-237 +aI622 +aI-199 +aa(lp21571 +g15 +aI517 +aI-70 +aI578 +aI-127 +aI550 +aI-96 +aa(lp21572 +g15 +aI396 +aI-8 +aI483 +aI-44 +aI443 +aI-23 +aa(lp21573 +g15 +aI230 +aI13 +aI349 +aI5 +aI293 +aI13 +aa(lp21574 +g15 +aI200 +aI12 +aI221 +aI13 +aI211 +aI13 +aa(lp21575 +g15 +aI167 +aI11 +aI189 +aI12 +aI178 +aI11 +aa(lp21576 +g15 +aI135 +aI8 +aI156 +aI10 +aI145 +aI9 +aa(lp21577 +g15 +aI108 +aI4 +aI124 +aI7 +aI115 +aI6 +aa(lp21578 +g20 +aI108 +aI-157 +aa(lp21579 +g15 +aI159 +aI-147 +aI124 +aI-152 +aI141 +aI-149 +aa(lp21580 +g15 +aI216 +aI-143 +aI178 +aI-144 +aI197 +aI-143 +aa(lp21581 +g15 +aI360 +aI-165 +aI274 +aI-143 +aI322 +aI-150 +aa(lp21582 +g15 +aI450 +aI-226 +aI398 +aI-179 +aI428 +aI-200 +aa(lp21583 +g15 +aI497 +aI-320 +aI472 +aI-252 +aI488 +aI-284 +aa(lp21584 +g15 +aI514 +aI-440 +aI507 +aI-356 +aI512 +aI-397 +aa(lp21585 +g20 +aI506 +aI-440 +aa(lp21586 +g15 +aI475 +aI-397 +aI497 +aI-425 +aI487 +aI-410 +aa(lp21587 +g15 +aI432 +aI-362 +aI463 +aI-383 +aI448 +aI-372 +aa(lp21588 +g15 +aI376 +aI-338 +aI415 +aI-352 +aI397 +aI-344 +aa(lp21589 +g15 +aI306 +aI-330 +aI355 +aI-333 +aI332 +aI-330 +aa(lp21590 +g15 +aI195 +aI-350 +aI265 +aI-330 +aI228 +aI-337 +aa(lp21591 +g15 +aI111 +aI-409 +aI162 +aI-363 +aI134 +aI-383 +aa(lp21592 +g15 +aI59 +aI-503 +aI88 +aI-434 +aI71 +aI-466 +aa(lp21593 +g15 +aI41 +aI-631 +aI47 +aI-540 +aI41 +aI-583 +aa(lp21594 +g15 +aI62 +aI-770 +aI41 +aI-683 +aI48 +aI-729 +aa(lp21595 +g15 +aI125 +aI-874 +aI77 +aI-811 +aI98 +aI-845 +aa(lp21596 +g15 +aI222 +aI-939 +aI151 +aI-902 +aI184 +aI-924 +aa(lp21597 +g15 +aI352 +aI-962 +aI261 +aI-954 +aI304 +aI-962 +aa(lp21598 +g15 +aI483 +aI-937 +aI399 +aI-962 +aI442 +aI-954 +aa(lp21599 +g15 +aI589 +aI-860 +aI524 +aI-920 +aI559 +aI-895 +aa(lp21600 +g15 +aI660 +aI-730 +aI619 +aI-826 +aI643 +aI-783 +aa(lp21601 +g15 +aI686 +aI-545 +aI678 +aI-678 +aI686 +aI-616 +aa(lp21602 +g10 +aa(lp21603 +g8 +aI356 +aI-800 +aa(lp21604 +g15 +aI307 +aI-791 +aI338 +aI-800 +aI322 +aI-797 +aa(lp21605 +g15 +aI269 +aI-760 +aI292 +aI-784 +aI279 +aI-774 +aa(lp21606 +g15 +aI244 +aI-708 +aI258 +aI-747 +aI250 +aI-729 +aa(lp21607 +g15 +aI235 +aI-634 +aI238 +aI-687 +aI235 +aI-662 +aa(lp21608 +g15 +aI264 +aI-524 +aI235 +aI-588 +aI245 +aI-551 +aa(lp21609 +g15 +aI353 +aI-484 +aI284 +aI-498 +aI314 +aI-484 +aa(lp21610 +g15 +aI408 +aI-496 +aI373 +aI-484 +aI391 +aI-488 +aa(lp21611 +g15 +aI450 +aI-526 +aI424 +aI-504 +aI438 +aI-514 +aa(lp21612 +g15 +aI477 +aI-569 +aI462 +aI-539 +aI471 +aI-553 +aa(lp21613 +g15 +aI486 +aI-616 +aI483 +aI-584 +aI486 +aI-600 +aa(lp21614 +g15 +aI478 +aI-682 +aI486 +aI-638 +aI484 +aI-660 +aa(lp21615 +g15 +aI454 +aI-742 +aI473 +aI-704 +aI465 +aI-724 +aa(lp21616 +g15 +aI413 +aI-784 +aI443 +aI-759 +aI429 +aI-773 +aa(lp21617 +g15 +aI356 +aI-800 +aI396 +aI-795 +aI377 +aI-800 +aa(lp21618 +g10 +aa(lp21619 +g8 +aI734 +aI0 +aa(lp21620 +g10 +aa(lp21621 +g8 +aI734 +aI0 +aasV= +(lp21622 +(lp21623 +g8 +aI57 +aI-524 +aa(lp21624 +g20 +aI57 +aI-666 +aa(lp21625 +g20 +aI677 +aI-666 +aa(lp21626 +g20 +aI677 +aI-524 +aa(lp21627 +g10 +aa(lp21628 +g8 +aI57 +aI-271 +aa(lp21629 +g20 +aI57 +aI-414 +aa(lp21630 +g20 +aI677 +aI-414 +aa(lp21631 +g20 +aI677 +aI-271 +aa(lp21632 +g10 +aa(lp21633 +g8 +aI734 +aI0 +aa(lp21634 +g10 +aa(lp21635 +g8 +aI734 +aI0 +aasVA +(lp21636 +(lp21637 +g8 +aI662 +aI0 +aa(lp21638 +g20 +aI597 +aI-226 +aa(lp21639 +g20 +aI269 +aI-226 +aa(lp21640 +g20 +aI203 +aI0 +aa(lp21641 +g20 +aI0 +aI0 +aa(lp21642 +g20 +aI309 +aI-955 +aa(lp21643 +g20 +aI555 +aI-955 +aa(lp21644 +g20 +aI866 +aI0 +aa(lp21645 +g10 +aa(lp21646 +g8 +aI550 +aI-395 +aa(lp21647 +g20 +aI489 +aI-603 +aa(lp21648 +g15 +aI477 +aI-642 +aI486 +aI-611 +aI483 +aI-624 +aa(lp21649 +g15 +aI461 +aI-701 +aI472 +aI-659 +aI467 +aI-679 +aa(lp21650 +g15 +aI444 +aI-765 +aI455 +aI-722 +aI449 +aI-744 +aa(lp21651 +g15 +aI433 +aI-821 +aI439 +aI-787 +aI435 +aI-805 +aa(lp21652 +g15 +aI426 +aI-787 +aI431 +aI-811 +aI429 +aI-800 +aa(lp21653 +g15 +aI416 +aI-745 +aI423 +aI-774 +aI420 +aI-760 +aa(lp21654 +g15 +aI405 +aI-702 +aI413 +aI-731 +aI409 +aI-716 +aa(lp21655 +g15 +aI394 +aI-660 +aI401 +aI-687 +aI398 +aI-673 +aa(lp21656 +g15 +aI385 +aI-625 +aI391 +aI-647 +aI387 +aI-635 +aa(lp21657 +g15 +aI378 +aI-603 +aI382 +aI-615 +aI380 +aI-608 +aa(lp21658 +g20 +aI318 +aI-395 +aa(lp21659 +g10 +aa(lp21660 +g8 +aI866 +aI0 +aa(lp21661 +g10 +aa(lp21662 +g8 +aI866 +aI0 +aasVE +(lp21663 +(lp21664 +g8 +aI667 +aI0 +aa(lp21665 +g20 +aI119 +aI0 +aa(lp21666 +g20 +aI119 +aI-951 +aa(lp21667 +g20 +aI667 +aI-951 +aa(lp21668 +g20 +aI667 +aI-786 +aa(lp21669 +g20 +aI321 +aI-786 +aa(lp21670 +g20 +aI321 +aI-577 +aa(lp21671 +g20 +aI643 +aI-577 +aa(lp21672 +g20 +aI643 +aI-411 +aa(lp21673 +g20 +aI321 +aI-411 +aa(lp21674 +g20 +aI321 +aI-166 +aa(lp21675 +g20 +aI667 +aI-166 +aa(lp21676 +g10 +aa(lp21677 +g8 +aI746 +aI0 +aa(lp21678 +g10 +aa(lp21679 +g8 +aI746 +aI0 +aasVI +(lp21680 +(lp21681 +g8 +aI475 +aI0 +aa(lp21682 +g20 +aI42 +aI0 +aa(lp21683 +g20 +aI42 +aI-114 +aa(lp21684 +g20 +aI158 +aI-167 +aa(lp21685 +g20 +aI158 +aI-783 +aa(lp21686 +g20 +aI42 +aI-836 +aa(lp21687 +g20 +aI42 +aI-951 +aa(lp21688 +g20 +aI475 +aI-951 +aa(lp21689 +g20 +aI475 +aI-836 +aa(lp21690 +g20 +aI360 +aI-783 +aa(lp21691 +g20 +aI360 +aI-167 +aa(lp21692 +g20 +aI475 +aI-114 +aa(lp21693 +g10 +aa(lp21694 +g8 +aI518 +aI0 +aa(lp21695 +g10 +aa(lp21696 +g8 +aI518 +aI0 +aasVM +(lp21697 +(lp21698 +g8 +aI502 +aI0 +aa(lp21699 +g20 +aI293 +aI-746 +aa(lp21700 +g20 +aI287 +aI-746 +aa(lp21701 +g15 +aI294 +aI-630 +aI290 +aI-706 +aI292 +aI-667 +aa(lp21702 +g15 +aI296 +aI-580 +aI295 +aI-614 +aI295 +aI-597 +aa(lp21703 +g15 +aI298 +aI-530 +aI297 +aI-563 +aI297 +aI-547 +aa(lp21704 +g15 +aI299 +aI-483 +aI299 +aI-514 +aI299 +aI-498 +aa(lp21705 +g15 +aI300 +aI-442 +aI300 +aI-468 +aI300 +aI-454 +aa(lp21706 +g20 +aI300 +aI0 +aa(lp21707 +g20 +aI119 +aI0 +aa(lp21708 +g20 +aI119 +aI-951 +aa(lp21709 +g20 +aI394 +aI-951 +aa(lp21710 +g20 +aI600 +aI-223 +aa(lp21711 +g20 +aI604 +aI-223 +aa(lp21712 +g20 +aI822 +aI-951 +aa(lp21713 +g20 +aI1097 +aI-951 +aa(lp21714 +g20 +aI1097 +aI0 +aa(lp21715 +g20 +aI909 +aI0 +aa(lp21716 +g20 +aI909 +aI-450 +aa(lp21717 +g15 +aI909 +aI-488 +aI909 +aI-461 +aI909 +aI-474 +aa(lp21718 +g15 +aI910 +aI-534 +aI910 +aI-502 +aI910 +aI-517 +aa(lp21719 +g15 +aI912 +aI-582 +aI911 +aI-550 +aI911 +aI-566 +aa(lp21720 +g15 +aI914 +aI-631 +aI913 +aI-599 +aI913 +aI-615 +aa(lp21721 +g15 +aI918 +aI-744 +aI915 +aI-667 +aI917 +aI-705 +aa(lp21722 +g20 +aI913 +aI-744 +aa(lp21723 +g20 +aI688 +aI0 +aa(lp21724 +g10 +aa(lp21725 +g8 +aI1217 +aI0 +aa(lp21726 +g10 +aa(lp21727 +g8 +aI1217 +aI0 +aasVQ +(lp21728 +(lp21729 +g8 +aI930 +aI-476 +aa(lp21730 +g15 +aI918 +aI-331 +aI930 +aI-425 +aI926 +aI-376 +aa(lp21731 +g15 +aI879 +aI-207 +aI909 +aI-285 +aI897 +aI-244 +aa(lp21732 +g15 +aI815 +aI-107 +aI862 +aI-169 +aI841 +aI-136 +aa(lp21733 +g15 +aI723 +aI-35 +aI789 +aI-78 +aI759 +aI-54 +aa(lp21734 +g20 +aI958 +aI227 +aa(lp21735 +g20 +aI699 +aI227 +aa(lp21736 +g20 +aI525 +aI12 +aa(lp21737 +g15 +aI516 +aI12 +aI522 +aI12 +aI519 +aI12 +aa(lp21738 +g15 +aI510 +aI13 +aI514 +aI13 +aI512 +aI13 +aa(lp21739 +g15 +aI503 +aI13 +aI507 +aI13 +aI505 +aI13 +aa(lp21740 +g15 +aI314 +aI-21 +aI430 +aI13 +aI367 +aI1 +aa(lp21741 +g15 +aI181 +aI-121 +aI260 +aI-45 +aI216 +aI-78 +aa(lp21742 +g15 +aI103 +aI-276 +aI146 +aI-164 +aI120 +aI-216 +aa(lp21743 +g15 +aI77 +aI-478 +aI86 +aI-337 +aI77 +aI-404 +aa(lp21744 +g15 +aI103 +aI-678 +aI77 +aI-551 +aI86 +aI-618 +aa(lp21745 +g15 +aI181 +aI-832 +aI120 +aI-739 +aI146 +aI-790 +aa(lp21746 +g15 +aI314 +aI-931 +aI216 +aI-875 +aI261 +aI-908 +aa(lp21747 +g15 +aI505 +aI-966 +aI368 +aI-954 +aI431 +aI-966 +aa(lp21748 +g15 +aI694 +aI-931 +aI578 +aI-966 +aI641 +aI-954 +aa(lp21749 +g15 +aI827 +aI-832 +aI748 +aI-908 +aI792 +aI-875 +aa(lp21750 +g15 +aI905 +aI-678 +aI862 +aI-789 +aI888 +aI-738 +aa(lp21751 +g15 +aI930 +aI-476 +aI922 +aI-618 +aI930 +aI-550 +aa(lp21752 +g10 +aa(lp21753 +g8 +aI285 +aI-476 +aa(lp21754 +g15 +aI298 +aI-342 +aI285 +aI-426 +aI289 +aI-382 +aa(lp21755 +g15 +aI338 +aI-241 +aI306 +aI-302 +aI320 +aI-268 +aa(lp21756 +g15 +aI406 +aI-177 +aI356 +aI-213 +aI378 +aI-192 +aa(lp21757 +g15 +aI503 +aI-155 +aI433 +aI-163 +aI466 +aI-155 +aa(lp21758 +g15 +aI603 +aI-177 +aI542 +aI-155 +aI575 +aI-163 +aa(lp21759 +g15 +aI670 +aI-241 +aI630 +aI-192 +aI653 +aI-213 +aa(lp21760 +g15 +aI709 +aI-342 +aI688 +aI-268 +aI701 +aI-302 +aa(lp21761 +g15 +aI722 +aI-476 +aI718 +aI-382 +aI722 +aI-426 +aa(lp21762 +g15 +aI709 +aI-611 +aI722 +aI-526 +aI718 +aI-571 +aa(lp21763 +g15 +aI670 +aI-712 +aI701 +aI-650 +aI688 +aI-684 +aa(lp21764 +g15 +aI603 +aI-776 +aI653 +aI-740 +aI630 +aI-761 +aa(lp21765 +g15 +aI505 +aI-798 +aI576 +aI-790 +aI543 +aI-798 +aa(lp21766 +g15 +aI406 +aI-776 +aI467 +aI-798 +aI434 +aI-790 +aa(lp21767 +g15 +aI338 +aI-712 +aI379 +aI-761 +aI356 +aI-740 +aa(lp21768 +g15 +aI298 +aI-611 +aI320 +aI-684 +aI306 +aI-650 +aa(lp21769 +g15 +aI285 +aI-476 +aI289 +aI-571 +aI285 +aI-526 +aa(lp21770 +g10 +aa(lp21771 +g8 +aI1007 +aI0 +aa(lp21772 +g10 +aa(lp21773 +g8 +aI1007 +aI0 +aasVU +(lp21774 +(lp21775 +g8 +aI841 +aI-951 +aa(lp21776 +g20 +aI841 +aI-335 +aa(lp21777 +g15 +aI818 +aI-197 +aI841 +aI-286 +aI833 +aI-239 +aa(lp21778 +g15 +aI750 +aI-86 +aI803 +aI-154 +aI780 +aI-118 +aa(lp21779 +g15 +aI635 +aI-13 +aI719 +aI-55 +aI681 +aI-31 +aa(lp21780 +g15 +aI473 +aI13 +aI589 +aI4 +aI535 +aI13 +aa(lp21781 +g15 +aI318 +aI-11 +aI414 +aI13 +aI362 +aI5 +aa(lp21782 +g15 +aI205 +aI-82 +aI273 +aI-28 +aI235 +aI-52 +aa(lp21783 +g15 +aI136 +aI-193 +aI175 +aI-113 +aI152 +aI-150 +aa(lp21784 +g15 +aI113 +aI-338 +aI121 +aI-237 +aI113 +aI-285 +aa(lp21785 +g20 +aI113 +aI-951 +aa(lp21786 +g20 +aI314 +aI-951 +aa(lp21787 +g20 +aI314 +aI-353 +aa(lp21788 +g15 +aI324 +aI-262 +aI314 +aI-317 +aI317 +aI-287 +aa(lp21789 +g15 +aI355 +aI-201 +aI331 +aI-237 +aI342 +aI-217 +aa(lp21790 +g15 +aI406 +aI-166 +aI369 +aI-185 +aI386 +aI-174 +aa(lp21791 +g15 +aI478 +aI-155 +aI427 +aI-159 +aI451 +aI-155 +aa(lp21792 +g15 +aI601 +aI-205 +aI535 +aI-155 +aI576 +aI-172 +aa(lp21793 +g15 +aI639 +aI-354 +aI627 +aI-238 +aI639 +aI-287 +aa(lp21794 +g20 +aI639 +aI-951 +aa(lp21795 +g10 +aa(lp21796 +g8 +aI954 +aI0 +aa(lp21797 +g10 +aa(lp21798 +g8 +aI954 +aI0 +aasVY +(lp21799 +(lp21800 +g8 +aI389 +aI-559 +aa(lp21801 +g20 +aI561 +aI-951 +aa(lp21802 +g20 +aI778 +aI-951 +aa(lp21803 +g20 +aI489 +aI-369 +aa(lp21804 +g20 +aI489 +aI0 +aa(lp21805 +g20 +aI289 +aI0 +aa(lp21806 +g20 +aI289 +aI-363 +aa(lp21807 +g20 +aI0 +aI-951 +aa(lp21808 +g20 +aI218 +aI-951 +aa(lp21809 +g10 +aa(lp21810 +g8 +aI778 +aI0 +aa(lp21811 +g10 +aa(lp21812 +g8 +aI778 +aI0 +aasV] +(lp21813 +(lp21814 +g8 +aI33 +aI74 +aa(lp21815 +g20 +aI178 +aI74 +aa(lp21816 +g20 +aI178 +aI-814 +aa(lp21817 +g20 +aI33 +aI-814 +aa(lp21818 +g20 +aI33 +aI-951 +aa(lp21819 +g20 +aI348 +aI-951 +aa(lp21820 +g20 +aI348 +aI211 +aa(lp21821 +g20 +aI33 +aI211 +aa(lp21822 +g10 +aa(lp21823 +g8 +aI441 +aI0 +aa(lp21824 +g10 +aa(lp21825 +g8 +aI441 +aI0 +aasVa +(lp21826 +(lp21827 +g8 +aI526 +aI0 +aa(lp21828 +g20 +aI488 +aI-98 +aa(lp21829 +g20 +aI482 +aI-98 +aa(lp21830 +g15 +aI439 +aI-48 +aI468 +aI-78 +aI453 +aI-62 +aa(lp21831 +g15 +aI392 +aI-13 +aI425 +aI-33 +aI409 +aI-22 +aa(lp21832 +g15 +aI335 +aI6 +aI375 +aI-4 +aI356 +aI2 +aa(lp21833 +g15 +aI262 +aI13 +aI314 +aI11 +aI290 +aI13 +aa(lp21834 +g15 +aI180 +aI0 +aI232 +aI13 +aI205 +aI8 +aa(lp21835 +g15 +aI114 +aI-42 +aI155 +aI-9 +aI133 +aI-23 +aa(lp21836 +g15 +aI71 +aI-114 +aI96 +aI-61 +aI82 +aI-85 +aa(lp21837 +g15 +aI55 +aI-216 +aI61 +aI-143 +aI55 +aI-177 +aa(lp21838 +g15 +aI130 +aI-387 +aI55 +aI-294 +aI80 +aI-351 +aa(lp21839 +g15 +aI352 +aI-448 +aI179 +aI-424 +aI253 +aI-444 +aa(lp21840 +g20 +aI468 +aI-452 +aa(lp21841 +g20 +aI468 +aI-507 +aa(lp21842 +g15 +aI442 +aI-573 +aI468 +aI-537 +aI459 +aI-559 +aa(lp21843 +g15 +aI369 +aI-595 +aI424 +aI-588 +aI400 +aI-595 +aa(lp21844 +g15 +aI277 +aI-581 +aI337 +aI-595 +aI307 +aI-590 +aa(lp21845 +g15 +aI188 +aI-545 +aI247 +aI-572 +aI218 +aI-560 +aa(lp21846 +g20 +aI123 +aI-676 +aa(lp21847 +g15 +aI244 +aI-724 +aI160 +aI-697 +aI200 +aI-713 +aa(lp21848 +g15 +aI384 +aI-742 +aI289 +aI-736 +aI335 +aI-742 +aa(lp21849 +g15 +aI592 +aI-678 +aI474 +aI-742 +aI544 +aI-721 +aa(lp21850 +g15 +aI665 +aI-484 +aI641 +aI-636 +aI665 +aI-571 +aa(lp21851 +g20 +aI665 +aI0 +aa(lp21852 +g10 +aa(lp21853 +g8 +aI468 +aI-336 +aa(lp21854 +g20 +aI402 +aI-334 +aa(lp21855 +g15 +aI335 +aI-323 +aI375 +aI-333 +aI353 +aI-329 +aa(lp21856 +g15 +aI291 +aI-299 +aI317 +aI-317 +aI302 +aI-309 +aa(lp21857 +g15 +aI267 +aI-262 +aI280 +aI-289 +aI272 +aI-276 +aa(lp21858 +g15 +aI259 +aI-215 +aI262 +aI-248 +aI259 +aI-233 +aa(lp21859 +g15 +aI281 +aI-150 +aI259 +aI-185 +aI267 +aI-163 +aa(lp21860 +g15 +aI339 +aI-131 +aI296 +aI-138 +aI315 +aI-131 +aa(lp21861 +g15 +aI390 +aI-141 +aI358 +aI-131 +aI374 +aI-134 +aa(lp21862 +g15 +aI431 +aI-169 +aI406 +aI-147 +aI419 +aI-156 +aa(lp21863 +g15 +aI458 +aI-214 +aI442 +aI-181 +aI451 +aI-196 +aa(lp21864 +g15 +aI468 +aI-276 +aI464 +aI-232 +aI468 +aI-253 +aa(lp21865 +g10 +aa(lp21866 +g8 +aI765 +aI0 +aa(lp21867 +g10 +aa(lp21868 +g8 +aI765 +aI0 +aasVe +(lp21869 +(lp21870 +g8 +aI398 +aI-599 +aa(lp21871 +g15 +aI310 +aI-562 +aI363 +aI-599 +aI334 +aI-587 +aa(lp21872 +g15 +aI270 +aI-446 +aI287 +aI-537 +aI274 +aI-499 +aa(lp21873 +g20 +aI524 +aI-446 +aa(lp21874 +g15 +aI515 +aI-507 +aI523 +aI-468 +aI520 +aI-488 +aa(lp21875 +g15 +aI492 +aI-555 +aI510 +aI-526 +aI502 +aI-542 +aa(lp21876 +g15 +aI453 +aI-588 +aI481 +aI-569 +aI468 +aI-580 +aa(lp21877 +g15 +aI398 +aI-599 +aI437 +aI-595 +aI419 +aI-599 +aa(lp21878 +g10 +aa(lp21879 +g8 +aI423 +aI13 +aa(lp21880 +g15 +aI279 +aI-9 +aI371 +aI13 +aI323 +aI5 +aa(lp21881 +g15 +aI166 +aI-77 +aI236 +aI-24 +aI198 +aI-47 +aa(lp21882 +g15 +aI92 +aI-193 +aI134 +aI-108 +aI110 +aI-147 +aa(lp21883 +g15 +aI66 +aI-358 +aI75 +aI-240 +aI66 +aI-295 +aa(lp21884 +g15 +aI90 +aI-525 +aI66 +aI-422 +aI74 +aI-477 +aa(lp21885 +g15 +aI157 +aI-645 +aI106 +aI-573 +aI129 +aI-613 +aa(lp21886 +g15 +aI262 +aI-716 +aI186 +aI-676 +aI221 +aI-700 +aa(lp21887 +g15 +aI397 +aI-741 +aI302 +aI-733 +aI347 +aI-741 +aa(lp21888 +g15 +aI527 +aI-719 +aI445 +aI-741 +aI488 +aI-733 +aa(lp21889 +g15 +aI626 +aI-655 +aI566 +aI-704 +aI599 +aI-683 +aa(lp21890 +g15 +aI689 +aI-551 +aI653 +aI-626 +aI674 +aI-592 +aa(lp21891 +g15 +aI710 +aI-410 +aI703 +aI-510 +aI710 +aI-463 +aa(lp21892 +g20 +aI710 +aI-314 +aa(lp21893 +g20 +aI266 +aI-314 +aa(lp21894 +g15 +aI280 +aI-238 +aI267 +aI-286 +aI272 +aI-261 +aa(lp21895 +g15 +aI314 +aI-182 +aI288 +aI-216 +aI299 +aI-197 +aa(lp21896 +g15 +aI366 +aI-146 +aI328 +aI-166 +aI346 +aI-154 +aa(lp21897 +g15 +aI437 +aI-134 +aI387 +aI-138 +aI411 +aI-134 +aa(lp21898 +g15 +aI500 +aI-137 +aI459 +aI-134 +aI480 +aI-135 +aa(lp21899 +g15 +aI557 +aI-148 +aI520 +aI-140 +aI539 +aI-143 +aa(lp21900 +g15 +aI613 +aI-166 +aI576 +aI-153 +aI595 +aI-159 +aa(lp21901 +g15 +aI669 +aI-191 +aI631 +aI-173 +aI650 +aI-182 +aa(lp21902 +g20 +aI669 +aI-37 +aa(lp21903 +g15 +aI616 +aI-14 +aI651 +aI-28 +aI634 +aI-21 +aa(lp21904 +g15 +aI561 +aI1 +aI599 +aI-8 +aI580 +aI-3 +aa(lp21905 +g15 +aI498 +aI10 +aI541 +aI5 +aI520 +aI8 +aa(lp21906 +g15 +aI423 +aI13 +aI475 +aI12 +aI450 +aI13 +aa(lp21907 +g10 +aa(lp21908 +g8 +aI774 +aI0 +aa(lp21909 +g10 +aa(lp21910 +g8 +aI774 +aI0 +aasVi +(lp21911 +(lp21912 +g8 +aI95 +aI-915 +aa(lp21913 +g15 +aI104 +aI-962 +aI95 +aI-934 +aI98 +aI-949 +aa(lp21914 +g15 +aI127 +aI-992 +aI109 +aI-974 +aI117 +aI-984 +aa(lp21915 +g15 +aI161 +aI-1008 +aI137 +aI-999 +aI148 +aI-1004 +aa(lp21916 +g15 +aI203 +aI-1012 +aI175 +aI-1011 +aI189 +aI-1012 +aa(lp21917 +g15 +aI245 +aI-1008 +aI218 +aI-1012 +aI232 +aI-1011 +aa(lp21918 +g15 +aI279 +aI-992 +aI258 +aI-1004 +aI269 +aI-999 +aa(lp21919 +g15 +aI303 +aI-962 +aI289 +aI-984 +aI297 +aI-974 +aa(lp21920 +g15 +aI311 +aI-915 +aI308 +aI-949 +aI311 +aI-934 +aa(lp21921 +g15 +aI303 +aI-869 +aI311 +aI-897 +aI308 +aI-881 +aa(lp21922 +g15 +aI279 +aI-839 +aI297 +aI-856 +aI289 +aI-846 +aa(lp21923 +g15 +aI245 +aI-822 +aI269 +aI-831 +aI258 +aI-826 +aa(lp21924 +g15 +aI203 +aI-817 +aI232 +aI-819 +aI218 +aI-817 +aa(lp21925 +g15 +aI161 +aI-822 +aI189 +aI-817 +aI175 +aI-819 +aa(lp21926 +g15 +aI127 +aI-839 +aI148 +aI-826 +aI137 +aI-831 +aa(lp21927 +g15 +aI104 +aI-869 +aI117 +aI-846 +aI109 +aI-856 +aa(lp21928 +g15 +aI95 +aI-915 +aI98 +aI-881 +aI95 +aI-897 +aa(lp21929 +g10 +aa(lp21930 +g8 +aI302 +aI0 +aa(lp21931 +g20 +aI104 +aI0 +aa(lp21932 +g20 +aI104 +aI-727 +aa(lp21933 +g20 +aI302 +aI-727 +aa(lp21934 +g10 +aa(lp21935 +g8 +aI406 +aI0 +aa(lp21936 +g10 +aa(lp21937 +g8 +aI406 +aI0 +aasVm +(lp21938 +(lp21939 +g8 +aI729 +aI0 +aa(lp21940 +g20 +aI530 +aI0 +aa(lp21941 +g20 +aI530 +aI-424 +aa(lp21942 +g15 +aI507 +aI-542 +aI530 +aI-477 +aI522 +aI-516 +aa(lp21943 +g15 +aI433 +aI-582 +aI491 +aI-569 +aI467 +aI-582 +aa(lp21944 +g15 +aI370 +aI-566 +aI408 +aI-582 +aI387 +aI-577 +aa(lp21945 +g15 +aI330 +aI-520 +aI354 +aI-556 +aI340 +aI-540 +aa(lp21946 +g15 +aI309 +aI-444 +aI320 +aI-499 +aI313 +aI-474 +aa(lp21947 +g15 +aI302 +aI-341 +aI304 +aI-414 +aI302 +aI-380 +aa(lp21948 +g20 +aI302 +aI0 +aa(lp21949 +g20 +aI104 +aI0 +aa(lp21950 +g20 +aI104 +aI-727 +aa(lp21951 +g20 +aI255 +aI-727 +aa(lp21952 +g20 +aI282 +aI-634 +aa(lp21953 +g20 +aI293 +aI-634 +aa(lp21954 +g15 +aI331 +aI-682 +aI304 +aI-652 +aI316 +aI-669 +aa(lp21955 +g15 +aI378 +aI-715 +aI345 +aI-695 +aI361 +aI-707 +aa(lp21956 +g15 +aI434 +aI-734 +aI396 +aI-724 +aI414 +aI-730 +aa(lp21957 +g15 +aI493 +aI-741 +aI453 +aI-739 +aI473 +aI-741 +aa(lp21958 +g15 +aI620 +aI-715 +aI543 +aI-741 +aI585 +aI-732 +aa(lp21959 +g15 +aI701 +aI-634 +aI655 +aI-698 +aI682 +aI-671 +aa(lp21960 +g20 +aI717 +aI-634 +aa(lp21961 +g15 +aI755 +aI-682 +aI727 +aI-652 +aI740 +aI-669 +aa(lp21962 +g15 +aI804 +aI-715 +aI769 +aI-695 +aI786 +aI-707 +aa(lp21963 +g15 +aI860 +aI-734 +aI821 +aI-724 +aI840 +aI-730 +aa(lp21964 +g15 +aI919 +aI-741 +aI880 +aI-739 +aI899 +aI-741 +aa(lp21965 +g15 +aI1096 +aI-677 +aI998 +aI-741 +aI1056 +aI-719 +aa(lp21966 +g15 +aI1156 +aI-474 +aI1136 +aI-635 +aI1156 +aI-567 +aa(lp21967 +g20 +aI1156 +aI0 +aa(lp21968 +g20 +aI957 +aI0 +aa(lp21969 +g20 +aI957 +aI-424 +aa(lp21970 +g15 +aI933 +aI-542 +aI957 +aI-477 +aI949 +aI-516 +aa(lp21971 +g15 +aI860 +aI-582 +aI917 +aI-569 +aI893 +aI-582 +aa(lp21972 +g15 +aI759 +aI-525 +aI812 +aI-582 +aI779 +aI-563 +aa(lp21973 +g15 +aI729 +aI-364 +aI739 +aI-488 +aI729 +aI-434 +aa(lp21974 +g10 +aa(lp21975 +g8 +aI1255 +aI0 +aa(lp21976 +g10 +aa(lp21977 +g8 +aI1255 +aI0 +aasVq +(lp21978 +(lp21979 +g8 +aI391 +aI-142 +aa(lp21980 +g15 +aI452 +aI-154 +aI415 +aI-142 +aI435 +aI-146 +aa(lp21981 +g15 +aI491 +aI-190 +aI468 +aI-162 +aI481 +aI-174 +aa(lp21982 +g15 +aI513 +aI-251 +aI501 +aI-206 +aI508 +aI-226 +aa(lp21983 +g15 +aI521 +aI-336 +aI518 +aI-275 +aI521 +aI-304 +aa(lp21984 +g20 +aI521 +aI-360 +aa(lp21985 +g15 +aI515 +aI-454 +aI521 +aI-396 +aI519 +aI-427 +aa(lp21986 +g15 +aI493 +aI-523 +aI511 +aI-481 +aI504 +aI-504 +aa(lp21987 +g15 +aI453 +aI-565 +aI483 +aI-541 +aI470 +aI-555 +aa(lp21988 +g15 +aI390 +aI-579 +aI436 +aI-574 +aI415 +aI-579 +aa(lp21989 +g15 +aI298 +aI-523 +aI348 +aI-579 +aI318 +aI-560 +aa(lp21990 +g15 +aI269 +aI-359 +aI279 +aI-485 +aI269 +aI-431 +aa(lp21991 +g15 +aI299 +aI-196 +aI269 +aI-286 +aI279 +aI-232 +aa(lp21992 +g15 +aI391 +aI-142 +aI318 +aI-160 +aI349 +aI-142 +aa(lp21993 +g10 +aa(lp21994 +g8 +aI318 +aI13 +aa(lp21995 +g15 +aI215 +aI-10 +aI280 +aI13 +aI246 +aI5 +aa(lp21996 +g15 +aI136 +aI-81 +aI184 +aI-26 +aI158 +aI-50 +aa(lp21997 +g15 +aI84 +aI-199 +aI113 +aI-113 +aI96 +aI-152 +aa(lp21998 +g15 +aI66 +aI-362 +aI72 +aI-246 +aI66 +aI-300 +aa(lp21999 +g15 +aI84 +aI-525 +aI66 +aI-424 +aI72 +aI-478 +aa(lp22000 +g15 +aI137 +aI-644 +aI97 +aI-573 +aI114 +aI-612 +aa(lp22001 +g15 +aI219 +aI-716 +aI160 +aI-676 +aI187 +aI-700 +aa(lp22002 +g15 +aI324 +aI-741 +aI251 +aI-732 +aI286 +aI-741 +aa(lp22003 +g15 +aI389 +aI-732 +aI348 +aI-741 +aI370 +aI-738 +aa(lp22004 +g15 +aI443 +aI-710 +aI409 +aI-727 +aI427 +aI-719 +aa(lp22005 +g15 +aI485 +aI-676 +aI458 +aI-700 +aI472 +aI-689 +aa(lp22006 +g15 +aI517 +aI-634 +aI497 +aI-663 +aI508 +aI-649 +aa(lp22007 +g20 +aI522 +aI-634 +aa(lp22008 +g20 +aI538 +aI-727 +aa(lp22009 +g20 +aI706 +aI-727 +aa(lp22010 +g20 +aI706 +aI320 +aa(lp22011 +g20 +aI507 +aI320 +aa(lp22012 +g20 +aI507 +aI15 +aa(lp22013 +g15 +aI509 +aI-15 +aI507 +aI7 +aI508 +aI-3 +aa(lp22014 +g15 +aI512 +aI-51 +aI510 +aI-27 +aI511 +aI-39 +aa(lp22015 +g15 +aI516 +aI-93 +aI513 +aI-65 +aI514 +aI-79 +aa(lp22016 +g20 +aI507 +aI-93 +aa(lp22017 +g15 +aI477 +aI-51 +aI499 +aI-79 +aI488 +aI-65 +aa(lp22018 +g15 +aI436 +aI-17 +aI465 +aI-38 +aI451 +aI-27 +aa(lp22019 +g15 +aI384 +aI5 +aI421 +aI-8 +aI403 +aI0 +aa(lp22020 +g15 +aI318 +aI13 +aI364 +aI10 +aI342 +aI13 +aa(lp22021 +g10 +aa(lp22022 +g8 +aI810 +aI0 +aa(lp22023 +g10 +aa(lp22024 +g8 +aI810 +aI0 +aasVu +(lp22025 +(lp22026 +g8 +aI580 +aI0 +aa(lp22027 +g20 +aI553 +aI-92 +aa(lp22028 +g20 +aI542 +aI-92 +aa(lp22029 +g15 +aI504 +aI-44 +aI532 +aI-73 +aI519 +aI-58 +aa(lp22030 +g15 +aI455 +aI-11 +aI489 +aI-31 +aI472 +aI-20 +aa(lp22031 +g15 +aI398 +aI7 +aI437 +aI-3 +aI418 +aI3 +aa(lp22032 +g15 +aI337 +aI13 +aI378 +aI11 +aI358 +aI13 +aa(lp22033 +g15 +aI240 +aI-1 +aI301 +aI13 +aI269 +aI8 +aa(lp22034 +g15 +aI165 +aI-49 +aI211 +aI-12 +aI186 +aI-27 +aa(lp22035 +g15 +aI117 +aI-132 +aI144 +aI-71 +aI128 +aI-98 +aa(lp22036 +g15 +aI100 +aI-252 +aI105 +aI-165 +aI100 +aI-205 +aa(lp22037 +g20 +aI100 +aI-727 +aa(lp22038 +g20 +aI298 +aI-727 +aa(lp22039 +g20 +aI298 +aI-302 +aa(lp22040 +g15 +aI322 +aI-184 +aI298 +aI-249 +aI306 +aI-210 +aa(lp22041 +g15 +aI398 +aI-144 +aI338 +aI-157 +aI363 +aI-144 +aa(lp22042 +g15 +aI463 +aI-160 +aI424 +aI-144 +aI446 +aI-149 +aa(lp22043 +g15 +aI504 +aI-206 +aI480 +aI-170 +aI494 +aI-186 +aa(lp22044 +g15 +aI526 +aI-282 +aI515 +aI-226 +aI522 +aI-252 +aa(lp22045 +g15 +aI533 +aI-384 +aI531 +aI-312 +aI533 +aI-346 +aa(lp22046 +g20 +aI533 +aI-727 +aa(lp22047 +g20 +aI731 +aI-727 +aa(lp22048 +g20 +aI731 +aI0 +aa(lp22049 +g10 +aa(lp22050 +g8 +aI835 +aI0 +aa(lp22051 +g10 +aa(lp22052 +g8 +aI835 +aI0 +aasVy +(lp22053 +(lp22054 +g8 +aI0 +aI-727 +aa(lp22055 +g20 +aI217 +aI-727 +aa(lp22056 +g20 +aI334 +aI-317 +aa(lp22057 +g15 +aI349 +aI-245 +aI341 +aI-295 +aI346 +aI-271 +aa(lp22058 +g15 +aI356 +aI-176 +aI353 +aI-220 +aI355 +aI-197 +aa(lp22059 +g20 +aI360 +aI-176 +aa(lp22060 +g15 +aI363 +aI-209 +aI360 +aI-186 +aI362 +aI-197 +aa(lp22061 +g15 +aI369 +aI-246 +aI365 +aI-221 +aI366 +aI-234 +aa(lp22062 +g15 +aI376 +aI-284 +aI371 +aI-259 +aI373 +aI-272 +aa(lp22063 +g15 +aI385 +aI-317 +aI379 +aI-296 +aI382 +aI-307 +aa(lp22064 +g20 +aI500 +aI-727 +aa(lp22065 +g20 +aI718 +aI-727 +aa(lp22066 +g20 +aI430 +aI93 +aa(lp22067 +g15 +aI320 +aI264 +aI404 +aI170 +aI367 +aI227 +aa(lp22068 +g15 +aI146 +aI320 +aI274 +aI302 +aI216 +aI320 +aa(lp22069 +g15 +aI87 +aI317 +aI123 +aI320 +aI104 +aI319 +aa(lp22070 +g15 +aI45 +aI309 +aI71 +aI314 +aI57 +aI312 +aa(lp22071 +g20 +aI45 +aI152 +aa(lp22072 +g15 +aI80 +aI158 +aI54 +aI154 +aI66 +aI156 +aa(lp22073 +g15 +aI123 +aI160 +aI93 +aI159 +aI108 +aI160 +aa(lp22074 +g15 +aI177 +aI152 +aI144 +aI160 +aI162 +aI157 +aa(lp22075 +g15 +aI215 +aI128 +aI191 +aI146 +aI204 +aI138 +aa(lp22076 +g15 +aI242 +aI91 +aI225 +aI118 +aI234 +aI105 +aa(lp22077 +g15 +aI262 +aI43 +aI250 +aI77 +aI256 +aI61 +aa(lp22078 +g20 +aI274 +aI6 +aa(lp22079 +g10 +aa(lp22080 +g8 +aI718 +aI0 +aa(lp22081 +g10 +aa(lp22082 +g8 +aI718 +aI0 +aasV} +(lp22083 +(lp22084 +g8 +aI305 +aI29 +aa(lp22085 +g15 +aI292 +aI112 +aI305 +aI61 +aI301 +aI89 +aa(lp22086 +g15 +aI248 +aI168 +aI284 +aI135 +aI269 +aI154 +aa(lp22087 +g15 +aI160 +aI200 +aI226 +aI183 +aI197 +aI194 +aa(lp22088 +g15 +aI20 +aI211 +aI123 +aI207 +aI77 +aI211 +aa(lp22089 +g20 +aI20 +aI64 +aa(lp22090 +g15 +aI67 +aI59 +aI37 +aI63 +aI53 +aI62 +aa(lp22091 +g15 +aI102 +aI45 +aI80 +aI57 +aI92 +aI52 +aa(lp22092 +g15 +aI125 +aI18 +aI112 +aI38 +aI119 +aI29 +aa(lp22093 +g15 +aI133 +aI-27 +aI130 +aI6 +aI133 +aI-8 +aa(lp22094 +g20 +aI133 +aI-222 +aa(lp22095 +g15 +aI171 +aI-319 +aI132 +aI-263 +aI144 +aI-295 +aa(lp22096 +g15 +aI285 +aI-366 +aI197 +aI-343 +aI235 +aI-358 +aa(lp22097 +g20 +aI285 +aI-373 +aa(lp22098 +g15 +aI133 +aI-518 +aI186 +aI-389 +aI136 +aI-437 +aa(lp22099 +g20 +aI133 +aI-713 +aa(lp22100 +g15 +aI125 +aI-758 +aI133 +aI-731 +aI130 +aI-746 +aa(lp22101 +g15 +aI102 +aI-786 +aI119 +aI-770 +aI112 +aI-779 +aa(lp22102 +g15 +aI67 +aI-800 +aI92 +aI-793 +aI80 +aI-797 +aa(lp22103 +g15 +aI20 +aI-804 +aI53 +aI-802 +aI37 +aI-804 +aa(lp22104 +g20 +aI20 +aI-951 +aa(lp22105 +g15 +aI160 +aI-940 +aI77 +aI-951 +aI123 +aI-947 +aa(lp22106 +g15 +aI248 +aI-908 +aI197 +aI-934 +aI226 +aI-923 +aa(lp22107 +g15 +aI292 +aI-852 +aI269 +aI-894 +aI284 +aI-875 +aa(lp22108 +g15 +aI305 +aI-770 +aI301 +aI-829 +aI305 +aI-802 +aa(lp22109 +g20 +aI305 +aI-563 +aa(lp22110 +g15 +aI315 +aI-509 +aI304 +aI-542 +aI308 +aI-524 +aa(lp22111 +g15 +aI347 +aI-473 +aI322 +aI-495 +aI332 +aI-483 +aa(lp22112 +g15 +aI400 +aI-453 +aI361 +aI-464 +aI379 +aI-457 +aa(lp22113 +g15 +aI472 +aI-447 +aI421 +aI-449 +aI445 +aI-447 +aa(lp22114 +g20 +aI472 +aI-291 +aa(lp22115 +g15 +aI347 +aI-265 +aI417 +aI-291 +aI376 +aI-282 +aa(lp22116 +g15 +aI305 +aI-175 +aI319 +aI-247 +aI305 +aI-217 +aa(lp22117 +g10 +aa(lp22118 +g8 +aI485 +aI0 +aa(lp22119 +g10 +aa(lp22120 +g8 +aI485 +aI0 +aassg10874 +(dp22121 +V +(lp22122 +(lp22123 +g8 +aI346 +aI0 +aa(lp22124 +g10 +aa(lp22125 +g8 +aI346 +aI0 +aasV$ +(lp22126 +(lp22127 +g8 +aI641 +aI-289 +aa(lp22128 +g15 +aI625 +aI-207 +aI641 +aI-259 +aI635 +aI-231 +aa(lp22129 +g15 +aI578 +aI-142 +aI614 +aI-182 +aI598 +aI-161 +aa(lp22130 +g15 +aI504 +aI-97 +aI558 +aI-124 +aI533 +aI-109 +aa(lp22131 +g15 +aI406 +aI-71 +aI476 +aI-85 +aI443 +aI-77 +aa(lp22132 +g20 +aI406 +aI77 +aa(lp22133 +g20 +aI317 +aI77 +aa(lp22134 +g20 +aI317 +aI-65 +aa(lp22135 +g15 +aI251 +aI-68 +aI295 +aI-65 +aI273 +aI-66 +aa(lp22136 +g15 +aI186 +aI-77 +aI229 +aI-70 +aI207 +aI-73 +aa(lp22137 +g15 +aI128 +aI-91 +aI166 +aI-81 +aI146 +aI-86 +aa(lp22138 +g15 +aI80 +aI-111 +aI110 +aI-97 +aI93 +aI-104 +aa(lp22139 +g20 +aI80 +aI-223 +aa(lp22140 +g15 +aI129 +aI-202 +aI94 +aI-216 +aI111 +aI-209 +aa(lp22141 +g15 +aI189 +aI-183 +aI148 +aI-195 +aI168 +aI-188 +aa(lp22142 +g15 +aI253 +aI-169 +aI210 +aI-177 +aI231 +aI-172 +aa(lp22143 +g15 +aI317 +aI-163 +aI275 +aI-165 +aI296 +aI-163 +aa(lp22144 +g20 +aI317 +aI-446 +aa(lp22145 +g15 +aI216 +aI-487 +aI278 +aI-459 +aI244 +aI-472 +aa(lp22146 +g15 +aI145 +aI-536 +aI188 +aI-501 +aI164 +aI-517 +aa(lp22147 +g15 +aI104 +aI-599 +aI127 +aI-554 +aI113 +aI-575 +aa(lp22148 +g15 +aI90 +aI-683 +aI95 +aI-623 +aI90 +aI-651 +aa(lp22149 +g15 +aI106 +aI-763 +aI90 +aI-712 +aI95 +aI-739 +aa(lp22150 +g15 +aI152 +aI-826 +aI117 +aI-787 +aI132 +aI-808 +aa(lp22151 +g15 +aI223 +aI-870 +aI171 +aI-844 +aI195 +aI-859 +aa(lp22152 +g15 +aI317 +aI-894 +aI251 +aI-882 +aI282 +aI-890 +aa(lp22153 +g20 +aI317 +aI-1011 +aa(lp22154 +g20 +aI406 +aI-1011 +aa(lp22155 +g20 +aI406 +aI-896 +aa(lp22156 +g15 +aI527 +aI-879 +aI450 +aI-894 +aI490 +aI-888 +aa(lp22157 +g15 +aI625 +aI-845 +aI563 +aI-870 +aI596 +aI-859 +aa(lp22158 +g20 +aI582 +aI-751 +aa(lp22159 +g15 +aI500 +aI-781 +aI558 +aI-762 +aI531 +aI-772 +aa(lp22160 +g15 +aI406 +aI-798 +aI470 +aI-790 +aI439 +aI-795 +aa(lp22161 +g20 +aI406 +aI-523 +aa(lp22162 +g15 +aI508 +aI-481 +aI445 +aI-510 +aI478 +aI-496 +aa(lp22163 +g15 +aI581 +aI-433 +aI537 +aI-467 +aI561 +aI-451 +aa(lp22164 +g15 +aI626 +aI-371 +aI601 +aI-415 +aI616 +aI-394 +aa(lp22165 +g15 +aI641 +aI-289 +aI636 +aI-348 +aI641 +aI-321 +aa(lp22166 +g10 +aa(lp22167 +g8 +aI526 +aI-289 +aa(lp22168 +g15 +aI520 +aI-329 +aI526 +aI-304 +aI524 +aI-317 +aa(lp22169 +g15 +aI499 +aI-361 +aI515 +aI-341 +aI509 +aI-352 +aa(lp22170 +g15 +aI462 +aI-388 +aI490 +aI-371 +aI478 +aI-380 +aa(lp22171 +g15 +aI406 +aI-412 +aI447 +aI-397 +aI429 +aI-405 +aa(lp22172 +g20 +aI406 +aI-170 +aa(lp22173 +g15 +aI497 +aI-211 +aI447 +aI-176 +aI477 +aI-189 +aa(lp22174 +g15 +aI526 +aI-289 +aI516 +aI-232 +aI526 +aI-258 +aa(lp22175 +g10 +aa(lp22176 +g8 +aI205 +aI-682 +aa(lp22177 +g15 +aI210 +aI-640 +aI205 +aI-666 +aI206 +aI-652 +aa(lp22178 +g15 +aI229 +aI-606 +aI214 +aI-628 +aI220 +aI-616 +aa(lp22179 +g15 +aI263 +aI-578 +aI237 +aI-596 +aI249 +aI-587 +aa(lp22180 +g15 +aI317 +aI-555 +aI277 +aI-570 +aI295 +aI-562 +aa(lp22181 +g20 +aI317 +aI-795 +aa(lp22182 +g15 +aI232 +aI-756 +aI278 +aI-788 +aI250 +aI-775 +aa(lp22183 +g15 +aI205 +aI-682 +aI214 +aI-737 +aI205 +aI-712 +aa(lp22184 +g10 +aa(lp22185 +g8 +aI734 +aI0 +aa(lp22186 +g10 +aa(lp22187 +g8 +aI734 +aI0 +aasV( +(lp22188 +(lp22189 +g8 +aI53 +aI-364 +aa(lp22190 +g15 +aI65 +aI-525 +aI53 +aI-419 +aI57 +aI-472 +aa(lp22191 +g15 +aI100 +aI-678 +aI72 +aI-577 +aI84 +aI-629 +aa(lp22192 +g15 +aI161 +aI-822 +aI116 +aI-728 +aI137 +aI-776 +aa(lp22193 +g15 +aI249 +aI-951 +aI186 +aI-867 +aI215 +aI-911 +aa(lp22194 +g20 +aI361 +aI-951 +aa(lp22195 +g15 +aI222 +aI-675 +aI300 +aI-867 +aI254 +aI-775 +aa(lp22196 +g15 +aI175 +aI-366 +aI191 +aI-575 +aI175 +aI-471 +aa(lp22197 +g15 +aI187 +aI-211 +aI175 +aI-314 +aI179 +aI-263 +aa(lp22198 +g15 +aI222 +aI-61 +aI195 +aI-160 +aI207 +aI-110 +aa(lp22199 +g15 +aI280 +aI81 +aI238 +aI-12 +aI257 +aI35 +aa(lp22200 +g15 +aI360 +aI211 +aI303 +aI127 +aI330 +aI170 +aa(lp22201 +g20 +aI249 +aI211 +aa(lp22202 +g15 +aI161 +aI85 +aI215 +aI172 +aI186 +aI130 +aa(lp22203 +g15 +aI100 +aI-54 +aI137 +aI41 +aI116 +aI-5 +aa(lp22204 +g15 +aI65 +aI-205 +aI84 +aI-103 +aI72 +aI-153 +aa(lp22205 +g15 +aI53 +aI-364 +aI57 +aI-258 +aI53 +aI-310 +aa(lp22206 +g10 +aa(lp22207 +g8 +aI401 +aI0 +aa(lp22208 +g10 +aa(lp22209 +g8 +aI401 +aI0 +aasV, +(lp22210 +(lp22211 +g8 +aI235 +aI-154 +aa(lp22212 +g20 +aI245 +aI-139 +aa(lp22213 +g15 +aI223 +aI-64 +aI239 +aI-116 +aI232 +aI-91 +aa(lp22214 +g15 +aI195 +aI15 +aI215 +aI-38 +aI205 +aI-11 +aa(lp22215 +g15 +aI163 +aI95 +aI185 +aI42 +aI174 +aI69 +aa(lp22216 +g15 +aI130 +aI172 +aI152 +aI122 +aI141 +aI148 +aa(lp22217 +g20 +aI41 +aI172 +aa(lp22218 +g15 +aI60 +aI89 +aI47 +aI145 +aI53 +aI118 +aa(lp22219 +g15 +aI78 +aI4 +aI66 +aI60 +aI72 +aI32 +aa(lp22220 +g15 +aI94 +aI-79 +aI84 +aI-24 +aI89 +aI-52 +aa(lp22221 +g15 +aI106 +aI-154 +aI99 +aI-106 +aI103 +aI-131 +aa(lp22222 +g10 +aa(lp22223 +g8 +aI333 +aI0 +aa(lp22224 +g10 +aa(lp22225 +g8 +aI333 +aI0 +aasV0 +(lp22226 +(lp22227 +g8 +aI671 +aI-476 +aa(lp22228 +g15 +aI655 +aI-270 +aI671 +aI-399 +aI666 +aI-331 +aa(lp22229 +g15 +aI601 +aI-116 +aI644 +aI-209 +aI626 +aI-158 +aa(lp22230 +g15 +aI507 +aI-19 +aI577 +aI-73 +aI545 +aI-41 +aa(lp22231 +g15 +aI366 +aI13 +aI468 +aI2 +aI421 +aI13 +aa(lp22232 +g15 +aI232 +aI-19 +aI315 +aI13 +aI270 +aI2 +aa(lp22233 +g15 +aI138 +aI-116 +aI194 +aI-41 +aI163 +aI-73 +aa(lp22234 +g15 +aI82 +aI-270 +aI113 +aI-158 +aI94 +aI-209 +aa(lp22235 +g15 +aI63 +aI-476 +aI69 +aI-331 +aI63 +aI-399 +aa(lp22236 +g15 +aI80 +aI-683 +aI63 +aI-553 +aI69 +aI-622 +aa(lp22237 +g15 +aI133 +aI-837 +aI91 +aI-743 +aI109 +aI-795 +aa(lp22238 +g15 +aI226 +aI-933 +aI157 +aI-878 +aI188 +aI-911 +aa(lp22239 +g15 +aI366 +aI-966 +aI265 +aI-955 +aI311 +aI-966 +aa(lp22240 +g15 +aI501 +aI-933 +aI418 +aI-966 +aI463 +aI-955 +aa(lp22241 +g15 +aI596 +aI-837 +aI539 +aI-911 +aI571 +aI-879 +aa(lp22242 +g15 +aI652 +aI-683 +aI621 +aI-795 +aI640 +aI-744 +aa(lp22243 +g15 +aI671 +aI-476 +aI665 +aI-623 +aI671 +aI-554 +aa(lp22244 +g10 +aa(lp22245 +g8 +aI184 +aI-476 +aa(lp22246 +g15 +aI194 +aI-306 +aI184 +aI-411 +aI187 +aI-354 +aa(lp22247 +g15 +aI225 +aI-184 +aI200 +aI-257 +aI210 +aI-217 +aa(lp22248 +g15 +aI281 +aI-111 +aI239 +aI-152 +aI258 +aI-128 +aa(lp22249 +g15 +aI366 +aI-87 +aI304 +aI-95 +aI333 +aI-87 +aa(lp22250 +g15 +aI451 +aI-111 +aI399 +aI-87 +aI428 +aI-95 +aa(lp22251 +g15 +aI509 +aI-183 +aI475 +aI-127 +aI494 +aI-151 +aa(lp22252 +g15 +aI541 +aI-305 +aI524 +aI-215 +aI535 +aI-256 +aa(lp22253 +g15 +aI552 +aI-476 +aI548 +aI-354 +aI552 +aI-411 +aa(lp22254 +g15 +aI541 +aI-647 +aI552 +aI-541 +aI548 +aI-598 +aa(lp22255 +g15 +aI509 +aI-768 +aI535 +aI-695 +aI524 +aI-736 +aa(lp22256 +g15 +aI451 +aI-840 +aI494 +aI-800 +aI475 +aI-824 +aa(lp22257 +g15 +aI366 +aI-864 +aI428 +aI-856 +aI399 +aI-864 +aa(lp22258 +g15 +aI281 +aI-840 +aI333 +aI-864 +aI304 +aI-856 +aa(lp22259 +g15 +aI225 +aI-768 +aI258 +aI-824 +aI239 +aI-800 +aa(lp22260 +g15 +aI194 +aI-647 +aI210 +aI-736 +aI200 +aI-695 +aa(lp22261 +g15 +aI184 +aI-476 +aI187 +aI-598 +aI184 +aI-541 +aa(lp22262 +g10 +aa(lp22263 +g8 +aI734 +aI0 +aa(lp22264 +g10 +aa(lp22265 +g8 +aI734 +aI0 +aasV4 +(lp22266 +(lp22267 +g8 +aI707 +aI-213 +aa(lp22268 +g20 +aI569 +aI-213 +aa(lp22269 +g20 +aI569 +aI0 +aa(lp22270 +g20 +aI454 +aI0 +aa(lp22271 +g20 +aI454 +aI-213 +aa(lp22272 +g20 +aI14 +aI-213 +aa(lp22273 +g20 +aI14 +aI-316 +aa(lp22274 +g20 +aI446 +aI-956 +aa(lp22275 +g20 +aI569 +aI-956 +aa(lp22276 +g20 +aI569 +aI-321 +aa(lp22277 +g20 +aI707 +aI-321 +aa(lp22278 +g10 +aa(lp22279 +g8 +aI454 +aI-321 +aa(lp22280 +g20 +aI454 +aI-552 +aa(lp22281 +g15 +aI455 +aI-629 +aI454 +aI-577 +aI454 +aI-602 +aa(lp22282 +g15 +aI457 +aI-707 +aI456 +aI-656 +aI456 +aI-682 +aa(lp22283 +g15 +aI460 +aI-778 +aI458 +aI-732 +aI459 +aI-756 +aa(lp22284 +g15 +aI462 +aI-834 +aI461 +aI-800 +aI462 +aI-819 +aa(lp22285 +g20 +aI457 +aI-834 +aa(lp22286 +g15 +aI445 +aI-805 +aI453 +aI-825 +aI450 +aI-815 +aa(lp22287 +g15 +aI430 +aI-773 +aI441 +aI-794 +aI436 +aI-783 +aa(lp22288 +g15 +aI414 +aI-742 +aI425 +aI-762 +aI419 +aI-752 +aa(lp22289 +g15 +aI398 +aI-716 +aI408 +aI-732 +aI403 +aI-723 +aa(lp22290 +g20 +aI130 +aI-321 +aa(lp22291 +g10 +aa(lp22292 +g8 +aI734 +aI0 +aa(lp22293 +g10 +aa(lp22294 +g8 +aI734 +aI0 +aasV8 +(lp22295 +(lp22296 +g8 +aI367 +aI-966 +aa(lp22297 +g15 +aI471 +aI-952 +aI404 +aI-966 +aI438 +aI-961 +aa(lp22298 +g15 +aI556 +aI-909 +aI503 +aI-942 +aI531 +aI-928 +aa(lp22299 +g15 +aI614 +aI-837 +aI580 +aI-889 +aI600 +aI-866 +aa(lp22300 +g15 +aI636 +aI-737 +aI628 +aI-808 +aI636 +aI-775 +aa(lp22301 +g15 +aI623 +aI-658 +aI636 +aI-708 +aI631 +aI-681 +aa(lp22302 +g15 +aI587 +aI-594 +aI614 +aI-634 +aI602 +aI-613 +aa(lp22303 +g15 +aI533 +aI-544 +aI572 +aI-576 +aI554 +aI-559 +aa(lp22304 +g15 +aI465 +aI-503 +aI512 +aI-529 +aI489 +aI-515 +aa(lp22305 +g15 +aI539 +aI-458 +aI490 +aI-489 +aI515 +aI-475 +aa(lp22306 +g15 +aI603 +aI-402 +aI563 +aI-442 +aI584 +aI-423 +aa(lp22307 +g15 +aI649 +aI-333 +aI622 +aI-382 +aI637 +aI-359 +aa(lp22308 +g15 +aI666 +aI-247 +aI660 +aI-307 +aI666 +aI-279 +aa(lp22309 +g15 +aI644 +aI-139 +aI666 +aI-207 +aI659 +aI-171 +aa(lp22310 +g15 +aI583 +aI-56 +aI630 +aI-106 +aI609 +aI-79 +aa(lp22311 +g15 +aI489 +aI-4 +aI557 +aI-34 +aI525 +aI-16 +aa(lp22312 +g15 +aI367 +aI13 +aI452 +aI7 +aI412 +aI13 +aa(lp22313 +g15 +aI240 +aI-4 +aI320 +aI13 +aI277 +aI7 +aa(lp22314 +g15 +aI146 +aI-54 +aI203 +aI-15 +aI172 +aI-32 +aa(lp22315 +g15 +aI88 +aI-134 +aI121 +aI-76 +aI102 +aI-103 +aa(lp22316 +g15 +aI69 +aI-242 +aI75 +aI-166 +aI69 +aI-202 +aa(lp22317 +g15 +aI83 +aI-330 +aI69 +aI-274 +aI73 +aI-304 +aa(lp22318 +g15 +aI123 +aI-400 +aI93 +aI-356 +aI106 +aI-379 +aa(lp22319 +g15 +aI181 +aI-455 +aI139 +aI-421 +aI159 +aI-439 +aa(lp22320 +g15 +aI253 +aI-498 +aI204 +aI-471 +aI228 +aI-486 +aa(lp22321 +g15 +aI193 +aI-542 +aI231 +aI-511 +aI212 +aI-526 +aa(lp22322 +g15 +aI144 +aI-595 +aI174 +aI-558 +aI158 +aI-575 +aa(lp22323 +g15 +aI112 +aI-660 +aI131 +aI-614 +aI120 +aI-636 +aa(lp22324 +g15 +aI100 +aI-738 +aI104 +aI-683 +aI100 +aI-709 +aa(lp22325 +g15 +aI122 +aI-837 +aI100 +aI-776 +aI107 +aI-809 +aa(lp22326 +g15 +aI180 +aI-909 +aI136 +aI-866 +aI156 +aI-889 +aa(lp22327 +g15 +aI266 +aI-952 +aI205 +aI-928 +aI234 +aI-942 +aa(lp22328 +g15 +aI367 +aI-966 +aI298 +aI-961 +aI332 +aI-966 +aa(lp22329 +g10 +aa(lp22330 +g8 +aI185 +aI-241 +aa(lp22331 +g15 +aI195 +aI-177 +aI185 +aI-218 +aI189 +aI-196 +aa(lp22332 +g15 +aI228 +aI-128 +aI202 +aI-158 +aI213 +aI-141 +aa(lp22333 +g15 +aI284 +aI-96 +aI243 +aI-114 +aI261 +aI-103 +aa(lp22334 +g15 +aI365 +aI-84 +aI307 +aI-88 +aI333 +aI-84 +aa(lp22335 +g15 +aI445 +aI-96 +aI395 +aI-84 +aI422 +aI-88 +aa(lp22336 +g15 +aI503 +aI-128 +aI468 +aI-103 +aI488 +aI-114 +aa(lp22337 +g15 +aI539 +aI-179 +aI519 +aI-142 +aI531 +aI-159 +aa(lp22338 +g15 +aI550 +aI-246 +aI546 +aI-199 +aI550 +aI-221 +aa(lp22339 +g15 +aI538 +aI-307 +aI550 +aI-268 +aI546 +aI-289 +aa(lp22340 +g15 +aI501 +aI-358 +aI529 +aI-325 +aI517 +aI-342 +aa(lp22341 +g15 +aI444 +aI-402 +aI485 +aI-373 +aI466 +aI-388 +aa(lp22342 +g15 +aI370 +aI-443 +aI422 +aI-416 +aI397 +aI-430 +aa(lp22343 +g20 +aI350 +aI-452 +aa(lp22344 +g15 +aI227 +aI-363 +aI296 +aI-426 +aI254 +aI-396 +aa(lp22345 +g15 +aI185 +aI-241 +aI199 +aI-329 +aI185 +aI-288 +aa(lp22346 +g10 +aa(lp22347 +g8 +aI366 +aI-867 +aa(lp22348 +g15 +aI256 +aI-832 +aI320 +aI-867 +aI283 +aI-855 +aa(lp22349 +g15 +aI216 +aI-732 +aI229 +aI-809 +aI216 +aI-776 +aa(lp22350 +g15 +aI227 +aI-668 +aI216 +aI-707 +aI219 +aI-686 +aa(lp22351 +g15 +aI259 +aI-621 +aI235 +aI-651 +aI245 +aI-635 +aa(lp22352 +g15 +aI307 +aI-583 +aI272 +aI-607 +aI288 +aI-594 +aa(lp22353 +g15 +aI369 +aI-551 +aI326 +aI-572 +aI347 +aI-562 +aa(lp22354 +g15 +aI428 +aI-582 +aI389 +aI-561 +aI409 +aI-571 +aa(lp22355 +g15 +aI476 +aI-621 +aI446 +aI-594 +aI462 +aI-606 +aa(lp22356 +g15 +aI508 +aI-670 +aI489 +aI-635 +aI500 +aI-651 +aa(lp22357 +g15 +aI520 +aI-732 +aI516 +aI-688 +aI520 +aI-709 +aa(lp22358 +g15 +aI479 +aI-832 +aI520 +aI-776 +aI506 +aI-809 +aa(lp22359 +g15 +aI366 +aI-867 +aI451 +aI-855 +aI414 +aI-867 +aa(lp22360 +g10 +aa(lp22361 +g8 +aI734 +aI0 +aa(lp22362 +g10 +aa(lp22363 +g8 +aI734 +aI0 +aasV< +(lp22364 +(lp22365 +g8 +aI667 +aI-154 +aa(lp22366 +g20 +aI66 +aI-430 +aa(lp22367 +g20 +aI66 +aI-496 +aa(lp22368 +g20 +aI667 +aI-810 +aa(lp22369 +g20 +aI667 +aI-705 +aa(lp22370 +g20 +aI189 +aI-468 +aa(lp22371 +g20 +aI667 +aI-259 +aa(lp22372 +g10 +aa(lp22373 +g8 +aI734 +aI0 +aa(lp22374 +g10 +aa(lp22375 +g8 +aI734 +aI0 +aasV@ +(lp22376 +(lp22377 +g8 +aI1083 +aI-475 +aa(lp22378 +g15 +aI1077 +aI-394 +aI1083 +aI-448 +aI1081 +aI-421 +aa(lp22379 +g15 +aI1059 +aI-316 +aI1073 +aI-367 +aI1067 +aI-341 +aa(lp22380 +g15 +aI1028 +aI-248 +aI1051 +aI-292 +aI1041 +aI-269 +aa(lp22381 +g15 +aI985 +aI-193 +aI1016 +aI-227 +aI1002 +aI-209 +aa(lp22382 +g15 +aI929 +aI-156 +aI969 +aI-177 +aI950 +aI-165 +aa(lp22383 +g15 +aI860 +aI-143 +aI908 +aI-147 +aI885 +aI-143 +aa(lp22384 +g15 +aI806 +aI-153 +aI840 +aI-143 +aI822 +aI-146 +aa(lp22385 +g15 +aI766 +aI-179 +aI791 +aI-159 +aI777 +aI-168 +aa(lp22386 +g15 +aI738 +aI-216 +aI754 +aI-190 +aI745 +aI-202 +aa(lp22387 +g15 +aI723 +aI-260 +aI731 +aI-230 +aI726 +aI-245 +aa(lp22388 +g20 +aI721 +aI-260 +aa(lp22389 +g15 +aI692 +aI-215 +aI713 +aI-244 +aI703 +aI-229 +aa(lp22390 +g15 +aI651 +aI-177 +aI680 +aI-200 +aI666 +aI-188 +aa(lp22391 +g15 +aI599 +aI-152 +aI635 +aI-166 +aI618 +aI-158 +aa(lp22392 +g15 +aI535 +aI-143 +aI579 +aI-146 +aI558 +aI-143 +aa(lp22393 +g15 +aI446 +aI-161 +aI502 +aI-143 +aI472 +aI-149 +aa(lp22394 +g15 +aI381 +aI-212 +aI421 +aI-173 +aI399 +aI-190 +aa(lp22395 +g15 +aI340 +aI-291 +aI363 +aI-234 +aI350 +aI-261 +aa(lp22396 +g15 +aI326 +aI-394 +aI331 +aI-322 +aI326 +aI-356 +aa(lp22397 +g15 +aI346 +aI-514 +aI326 +aI-437 +aI333 +aI-478 +aa(lp22398 +g15 +aI401 +aI-608 +aI358 +aI-550 +aI377 +aI-582 +aa(lp22399 +g15 +aI488 +aI-670 +aI425 +aI-635 +aI454 +aI-656 +aa(lp22400 +g15 +aI604 +aI-692 +aI523 +aI-685 +aI561 +aI-692 +aa(lp22401 +g15 +aI662 +aI-690 +aI623 +aI-692 +aI643 +aI-692 +aa(lp22402 +g15 +aI718 +aI-683 +aI682 +aI-688 +aI700 +aI-686 +aa(lp22403 +g15 +aI767 +aI-673 +aI736 +aI-680 +aI752 +aI-676 +aa(lp22404 +g15 +aI805 +aI-662 +aI782 +aI-669 +aI795 +aI-665 +aa(lp22405 +g20 +aI790 +aI-391 +aa(lp22406 +g15 +aI789 +aI-368 +aI789 +aI-381 +aI789 +aI-374 +aa(lp22407 +g15 +aI789 +aI-354 +aI789 +aI-362 +aI789 +aI-357 +aa(lp22408 +g15 +aI789 +aI-346 +aI789 +aI-350 +aI789 +aI-348 +aa(lp22409 +g15 +aI789 +aI-341 +aI789 +aI-344 +aI789 +aI-343 +aa(lp22410 +g15 +aI795 +aI-285 +aI789 +aI-318 +aI791 +aI-300 +aa(lp22411 +g15 +aI813 +aI-250 +aI800 +aI-270 +aI806 +aI-258 +aa(lp22412 +g15 +aI838 +aI-232 +aI821 +aI-241 +aI829 +aI-235 +aa(lp22413 +g15 +aI867 +aI-227 +aI848 +aI-229 +aI857 +aI-227 +aa(lp22414 +g15 +aI920 +aI-247 +aI887 +aI-227 +aI905 +aI-234 +aa(lp22415 +g15 +aI958 +aI-300 +aI935 +aI-260 +aI948 +aI-278 +aa(lp22416 +g15 +aI981 +aI-380 +aI968 +aI-323 +aI976 +aI-350 +aa(lp22417 +g15 +aI989 +aI-476 +aI986 +aI-410 +aI989 +aI-442 +aa(lp22418 +g15 +aI961 +aI-641 +aI989 +aI-538 +aI980 +aI-593 +aa(lp22419 +g15 +aI884 +aI-762 +aI942 +aI-689 +aI917 +aI-729 +aa(lp22420 +g15 +aI766 +aI-837 +aI851 +aI-795 +aI811 +aI-820 +aa(lp22421 +g15 +aI618 +aI-863 +aI721 +aI-854 +aI671 +aI-863 +aa(lp22422 +g15 +aI424 +aI-827 +aI545 +aI-863 +aI480 +aI-851 +aa(lp22423 +g15 +aI283 +aI-726 +aI368 +aI-803 +aI321 +aI-769 +aa(lp22424 +g15 +aI197 +aI-572 +aI245 +aI-683 +aI216 +aI-632 +aa(lp22425 +g15 +aI167 +aI-378 +aI177 +aI-513 +aI167 +aI-448 +aa(lp22426 +g15 +aI193 +aI-203 +aI167 +aI-312 +aI176 +aI-254 +aa(lp22427 +g15 +aI269 +aI-75 +aI210 +aI-153 +aI236 +aI-110 +aa(lp22428 +g15 +aI392 +aI3 +aI302 +aI-40 +aI343 +aI-14 +aa(lp22429 +g15 +aI562 +aI29 +aI442 +aI20 +aI498 +aI29 +aa(lp22430 +g15 +aI640 +aI25 +aI588 +aI29 +aI615 +aI28 +aa(lp22431 +g15 +aI715 +aI12 +aI666 +aI22 +aI691 +aI18 +aa(lp22432 +g15 +aI784 +aI-5 +aI739 +aI7 +aI762 +aI1 +aa(lp22433 +g15 +aI845 +aI-26 +aI806 +aI-11 +aI826 +aI-18 +aa(lp22434 +g20 +aI845 +aI65 +aa(lp22435 +g15 +aI718 +aI104 +aI807 +aI82 +aI765 +aI95 +aa(lp22436 +g15 +aI563 +aI118 +aI671 +aI114 +aI620 +aI118 +aa(lp22437 +g15 +aI355 +aI85 +aI486 +aI118 +aI416 +aI107 +aa(lp22438 +g15 +aI200 +aI-10 +aI294 +aI63 +aI243 +aI31 +aa(lp22439 +g15 +aI104 +aI-165 +aI158 +aI-53 +aI126 +aI-104 +aa(lp22440 +g15 +aI70 +aI-373 +aI82 +aI-226 +aI70 +aI-296 +aa(lp22441 +g15 +aI109 +aI-602 +aI70 +aI-455 +aI83 +aI-531 +aa(lp22442 +g15 +aI219 +aI-785 +aI134 +aI-672 +aI171 +aI-733 +aa(lp22443 +g15 +aI391 +aI-907 +aI266 +aI-837 +aI324 +aI-877 +aa(lp22444 +g15 +aI618 +aI-951 +aI459 +aI-936 +aI534 +aI-951 +aa(lp22445 +g15 +aI805 +aI-918 +aI686 +aI-951 +aI748 +aI-940 +aa(lp22446 +g15 +aI952 +aI-824 +aI862 +aI-896 +aI911 +aI-865 +aa(lp22447 +g15 +aI1049 +aI-674 +aI994 +aI-783 +aI1026 +aI-733 +aa(lp22448 +g15 +aI1083 +aI-475 +aI1072 +aI-615 +aI1083 +aI-549 +aa(lp22449 +g10 +aa(lp22450 +g8 +aI430 +aI-391 +aa(lp22451 +g15 +aI463 +aI-266 +aI430 +aI-333 +aI441 +aI-291 +aa(lp22452 +g15 +aI552 +aI-227 +aI485 +aI-240 +aI515 +aI-227 +aa(lp22453 +g15 +aI613 +aI-242 +aI575 +aI-227 +aI596 +aI-232 +aa(lp22454 +g15 +aI654 +aI-283 +aI630 +aI-251 +aI644 +aI-265 +aa(lp22455 +g15 +aI679 +aI-348 +aI665 +aI-301 +aI674 +aI-323 +aa(lp22456 +g15 +aI690 +aI-430 +aI685 +aI-373 +aI689 +aI-400 +aa(lp22457 +g20 +aI699 +aI-595 +aa(lp22458 +g15 +aI656 +aI-604 +aI687 +aI-598 +aI673 +aI-601 +aa(lp22459 +g15 +aI604 +aI-608 +aI639 +aI-607 +aI622 +aI-608 +aa(lp22460 +g15 +aI523 +aI-590 +aI572 +aI-608 +aI545 +aI-602 +aa(lp22461 +g15 +aI469 +aI-540 +aI501 +aI-577 +aI483 +aI-560 +aa(lp22462 +g15 +aI440 +aI-470 +aI456 +aI-520 +aI446 +aI-496 +aa(lp22463 +g15 +aI430 +aI-391 +aI434 +aI-444 +aI430 +aI-418 +aa(lp22464 +g10 +aa(lp22465 +g8 +aI1154 +aI0 +aa(lp22466 +g10 +aa(lp22467 +g8 +aI1154 +aI0 +aasVD +(lp22468 +(lp22469 +g8 +aI830 +aI-484 +aa(lp22470 +g15 +aI799 +aI-273 +aI830 +aI-404 +aI820 +aI-333 +aa(lp22471 +g15 +aI708 +aI-121 +aI778 +aI-212 +aI748 +aI-162 +aa(lp22472 +g15 +aI563 +aI-30 +aI669 +aI-81 +aI620 +aI-50 +aa(lp22473 +g15 +aI367 +aI0 +aI505 +aI-9 +aI440 +aI0 +aa(lp22474 +g20 +aI129 +aI0 +aa(lp22475 +g20 +aI129 +aI-951 +aa(lp22476 +g20 +aI394 +aI-951 +aa(lp22477 +g15 +aI574 +aI-921 +aI460 +aI-951 +aI521 +aI-941 +aa(lp22478 +g15 +aI712 +aI-832 +aI628 +aI-901 +aI674 +aI-871 +aa(lp22479 +g15 +aI799 +aI-686 +aI750 +aI-793 +aI779 +aI-744 +aa(lp22480 +g15 +aI830 +aI-484 +aI820 +aI-628 +aI830 +aI-560 +aa(lp22481 +g10 +aa(lp22482 +g8 +aI702 +aI-480 +aa(lp22483 +g15 +aI680 +aI-645 +aI702 +aI-544 +aI695 +aI-598 +aa(lp22484 +g15 +aI618 +aI-759 +aI666 +aI-691 +aI645 +aI-729 +aa(lp22485 +g15 +aI517 +aI-826 +aI591 +aI-789 +aI557 +aI-811 +aa(lp22486 +g15 +aI381 +aI-847 +aI477 +aI-840 +aI432 +aI-847 +aa(lp22487 +g20 +aI250 +aI-847 +aa(lp22488 +g20 +aI250 +aI-103 +aa(lp22489 +g20 +aI356 +aI-103 +aa(lp22490 +g15 +aI615 +aI-198 +aI470 +aI-103 +aI557 +aI-135 +aa(lp22491 +g15 +aI702 +aI-480 +aI673 +aI-262 +aI702 +aI-356 +aa(lp22492 +g10 +aa(lp22493 +g8 +aI912 +aI0 +aa(lp22494 +g10 +aa(lp22495 +g8 +aI912 +aI0 +aasVH +(lp22496 +(lp22497 +g8 +aI805 +aI0 +aa(lp22498 +g20 +aI684 +aI0 +aa(lp22499 +g20 +aI684 +aI-443 +aa(lp22500 +g20 +aI250 +aI-443 +aa(lp22501 +g20 +aI250 +aI0 +aa(lp22502 +g20 +aI129 +aI0 +aa(lp22503 +g20 +aI129 +aI-951 +aa(lp22504 +g20 +aI250 +aI-951 +aa(lp22505 +g20 +aI250 +aI-550 +aa(lp22506 +g20 +aI684 +aI-550 +aa(lp22507 +g20 +aI684 +aI-951 +aa(lp22508 +g20 +aI805 +aI-951 +aa(lp22509 +g10 +aa(lp22510 +g8 +aI934 +aI0 +aa(lp22511 +g10 +aa(lp22512 +g8 +aI934 +aI0 +aasVL +(lp22513 +(lp22514 +g8 +aI129 +aI0 +aa(lp22515 +g20 +aI129 +aI-951 +aa(lp22516 +g20 +aI250 +aI-951 +aa(lp22517 +g20 +aI250 +aI-107 +aa(lp22518 +g20 +aI623 +aI-107 +aa(lp22519 +g20 +aI623 +aI0 +aa(lp22520 +g10 +aa(lp22521 +g8 +aI654 +aI0 +aa(lp22522 +g10 +aa(lp22523 +g8 +aI654 +aI0 +aasVP +(lp22524 +(lp22525 +g8 +aI699 +aI-672 +aa(lp22526 +g15 +aI681 +aI-558 +aI699 +aI-633 +aI693 +aI-595 +aa(lp22527 +g15 +aI623 +aI-462 +aI670 +aI-522 +aI650 +aI-490 +aa(lp22528 +g15 +aI514 +aI-395 +aI595 +aI-434 +aI559 +aI-411 +aa(lp22529 +g15 +aI348 +aI-369 +aI469 +aI-378 +aI414 +aI-369 +aa(lp22530 +g20 +aI250 +aI-369 +aa(lp22531 +g20 +aI250 +aI0 +aa(lp22532 +g20 +aI129 +aI0 +aa(lp22533 +g20 +aI129 +aI-951 +aa(lp22534 +g20 +aI365 +aI-951 +aa(lp22535 +g15 +aI515 +aI-932 +aI423 +aI-951 +aI473 +aI-945 +aa(lp22536 +g15 +aI619 +aI-878 +aI557 +aI-920 +aI592 +aI-902 +aa(lp22537 +g15 +aI680 +aI-791 +aI647 +aI-855 +aI667 +aI-825 +aa(lp22538 +g15 +aI699 +aI-672 +aI693 +aI-756 +aI699 +aI-716 +aa(lp22539 +g10 +aa(lp22540 +g8 +aI250 +aI-472 +aa(lp22541 +g20 +aI334 +aI-472 +aa(lp22542 +g15 +aI440 +aI-483 +aI375 +aI-472 +aI410 +aI-476 +aa(lp22543 +g15 +aI515 +aI-516 +aI470 +aI-490 +aI495 +aI-501 +aa(lp22544 +g15 +aI559 +aI-576 +aI535 +aI-532 +aI549 +aI-552 +aa(lp22545 +g15 +aI574 +aI-666 +aI569 +aI-601 +aI574 +aI-631 +aa(lp22546 +g15 +aI521 +aI-803 +aI574 +aI-727 +aI557 +aI-773 +aa(lp22547 +g15 +aI354 +aI-847 +aI485 +aI-832 +aI430 +aI-847 +aa(lp22548 +g20 +aI250 +aI-847 +aa(lp22549 +g10 +aa(lp22550 +g8 +aI768 +aI0 +aa(lp22551 +g10 +aa(lp22552 +g8 +aI768 +aI0 +aasVT +(lp22553 +(lp22554 +g8 +aI406 +aI0 +aa(lp22555 +g20 +aI285 +aI0 +aa(lp22556 +g20 +aI285 +aI-844 +aa(lp22557 +g20 +aI13 +aI-844 +aa(lp22558 +g20 +aI13 +aI-951 +aa(lp22559 +g20 +aI678 +aI-951 +aa(lp22560 +g20 +aI678 +aI-844 +aa(lp22561 +g20 +aI406 +aI-844 +aa(lp22562 +g10 +aa(lp22563 +g8 +aI692 +aI0 +aa(lp22564 +g10 +aa(lp22565 +g8 +aI692 +aI0 +aasVX +(lp22566 +(lp22567 +g8 +aI729 +aI0 +aa(lp22568 +g20 +aI591 +aI0 +aa(lp22569 +g20 +aI361 +aI-412 +aa(lp22570 +g20 +aI122 +aI0 +aa(lp22571 +g20 +aI0 +aI0 +aa(lp22572 +g20 +aI294 +aI-496 +aa(lp22573 +g20 +aI20 +aI-951 +aa(lp22574 +g20 +aI149 +aI-951 +aa(lp22575 +g20 +aI365 +aI-587 +aa(lp22576 +g20 +aI582 +aI-951 +aa(lp22577 +g20 +aI706 +aI-951 +aa(lp22578 +g20 +aI432 +aI-500 +aa(lp22579 +g10 +aa(lp22580 +g8 +aI729 +aI0 +aa(lp22581 +g10 +aa(lp22582 +g8 +aI729 +aI0 +aasV\u005C +(lp22583 +(lp22584 +g8 +aI130 +aI-951 +aa(lp22585 +g20 +aI485 +aI0 +aa(lp22586 +g20 +aI369 +aI0 +aa(lp22587 +g20 +aI14 +aI-951 +aa(lp22588 +g10 +aa(lp22589 +g8 +aI497 +aI0 +aa(lp22590 +g10 +aa(lp22591 +g8 +aI497 +aI0 +aasV` +(lp22592 +(lp22593 +g8 +aI511 +aI-807 +aa(lp22594 +g20 +aI433 +aI-807 +aa(lp22595 +g15 +aI384 +aI-852 +aI418 +aI-819 +aI401 +aI-834 +aa(lp22596 +g15 +aI332 +aI-908 +aI366 +aI-870 +aI349 +aI-889 +aa(lp22597 +g15 +aI286 +aI-963 +aI315 +aI-927 +aI300 +aI-945 +aa(lp22598 +g15 +aI255 +aI-1007 +aI273 +aI-980 +aI262 +aI-995 +aa(lp22599 +g20 +aI255 +aI-1021 +aa(lp22600 +g20 +aI398 +aI-1021 +aa(lp22601 +g15 +aI422 +aI-972 +aI405 +aI-1006 +aI413 +aI-990 +aa(lp22602 +g15 +aI451 +aI-919 +aI432 +aI-954 +aI441 +aI-937 +aa(lp22603 +g15 +aI482 +aI-868 +aI461 +aI-902 +aI472 +aI-885 +aa(lp22604 +g15 +aI511 +aI-825 +aI492 +aI-852 +aI502 +aI-837 +aa(lp22605 +g10 +aa(lp22606 +g8 +aI769 +aI0 +aa(lp22607 +g10 +aa(lp22608 +g8 +aI769 +aI0 +aasVd +(lp22609 +(lp22610 +g8 +aI554 +aI-95 +aa(lp22611 +g20 +aI549 +aI-95 +aa(lp22612 +g15 +aI515 +aI-53 +aI539 +aI-80 +aI528 +aI-66 +aa(lp22613 +g15 +aI471 +aI-18 +aI503 +aI-40 +aI488 +aI-28 +aa(lp22614 +g15 +aI415 +aI5 +aI454 +aI-8 +aI436 +aI0 +aa(lp22615 +g15 +aI345 +aI13 +aI394 +aI10 +aI371 +aI13 +aa(lp22616 +g15 +aI234 +aI-9 +aI304 +aI13 +aI267 +aI5 +aa(lp22617 +g15 +aI148 +aI-79 +aI200 +aI-25 +aI172 +aI-48 +aa(lp22618 +g15 +aI93 +aI-195 +aI124 +aI-110 +aI106 +aI-149 +aa(lp22619 +g15 +aI73 +aI-355 +aI80 +aI-241 +aI73 +aI-294 +aa(lp22620 +g15 +aI93 +aI-516 +aI73 +aI-416 +aI80 +aI-470 +aa(lp22621 +g15 +aI148 +aI-633 +aI106 +aI-563 +aI124 +aI-601 +aa(lp22622 +g15 +aI234 +aI-703 +aI172 +aI-664 +aI200 +aI-687 +aa(lp22623 +g15 +aI345 +aI-727 +aI267 +aI-719 +aI304 +aI-727 +aa(lp22624 +g15 +aI414 +aI-718 +aI370 +aI-727 +aI393 +aI-724 +aa(lp22625 +g15 +aI471 +aI-696 +aI435 +aI-713 +aI454 +aI-705 +aa(lp22626 +g15 +aI515 +aI-662 +aI487 +aI-686 +aI502 +aI-675 +aa(lp22627 +g15 +aI549 +aI-623 +aI528 +aI-650 +aI539 +aI-637 +aa(lp22628 +g20 +aI557 +aI-623 +aa(lp22629 +g15 +aI553 +aI-665 +aI555 +aI-638 +aI554 +aI-652 +aa(lp22630 +g15 +aI550 +aI-700 +aI552 +aI-676 +aI551 +aI-688 +aa(lp22631 +g15 +aI549 +aI-728 +aI549 +aI-712 +aI549 +aI-721 +aa(lp22632 +g20 +aI549 +aI-1012 +aa(lp22633 +g20 +aI667 +aI-1012 +aa(lp22634 +g20 +aI667 +aI0 +aa(lp22635 +g20 +aI572 +aI0 +aa(lp22636 +g10 +aa(lp22637 +g8 +aI367 +aI-84 +aa(lp22638 +g15 +aI451 +aI-99 +aI400 +aI-84 +aI428 +aI-89 +aa(lp22639 +g15 +aI506 +aI-145 +aI474 +aI-109 +aI492 +aI-124 +aa(lp22640 +g15 +aI538 +aI-221 +aI520 +aI-165 +aI531 +aI-191 +aa(lp22641 +g15 +aI549 +aI-328 +aI544 +aI-252 +aI548 +aI-288 +aa(lp22642 +g20 +aI549 +aI-355 +aa(lp22643 +g15 +aI540 +aI-472 +aI549 +aI-399 +aI546 +aI-438 +aa(lp22644 +g15 +aI510 +aI-558 +aI534 +aI-506 +aI524 +aI-535 +aa(lp22645 +g15 +aI454 +aI-611 +aI496 +aI-581 +aI477 +aI-599 +aa(lp22646 +g15 +aI366 +aI-629 +aI430 +aI-623 +aI401 +aI-629 +aa(lp22647 +g15 +aI237 +aI-558 +aI307 +aI-629 +aI264 +aI-605 +aa(lp22648 +g15 +aI195 +aI-354 +aI209 +aI-510 +aI195 +aI-442 +aa(lp22649 +g15 +aI237 +aI-151 +aI195 +aI-263 +aI209 +aI-196 +aa(lp22650 +g15 +aI367 +aI-84 +aI264 +aI-107 +aI308 +aI-84 +aa(lp22651 +g10 +aa(lp22652 +g8 +aI781 +aI0 +aa(lp22653 +g10 +aa(lp22654 +g8 +aI781 +aI0 +aasVh +(lp22655 +(lp22656 +g8 +aI559 +aI0 +aa(lp22657 +g20 +aI559 +aI-459 +aa(lp22658 +g15 +aI525 +aI-586 +aI559 +aI-516 +aI548 +aI-558 +aa(lp22659 +g15 +aI418 +aI-629 +aI502 +aI-614 +aI467 +aI-629 +aa(lp22660 +g15 +aI330 +aI-612 +aI383 +aI-629 +aI353 +aI-623 +aa(lp22661 +g15 +aI272 +aI-562 +aI306 +aI-600 +aI287 +aI-584 +aa(lp22662 +g15 +aI241 +aI-480 +aI257 +aI-539 +aI247 +aI-512 +aa(lp22663 +g15 +aI231 +aI-369 +aI234 +aI-448 +aI231 +aI-411 +aa(lp22664 +g20 +aI231 +aI0 +aa(lp22665 +g20 +aI113 +aI0 +aa(lp22666 +g20 +aI113 +aI-1012 +aa(lp22667 +g20 +aI231 +aI-1012 +aa(lp22668 +g20 +aI231 +aI-711 +aa(lp22669 +g20 +aI226 +aI-618 +aa(lp22670 +g20 +aI233 +aI-618 +aa(lp22671 +g15 +aI271 +aI-666 +aI243 +aI-636 +aI256 +aI-652 +aa(lp22672 +g15 +aI320 +aI-700 +aI286 +aI-680 +aI303 +aI-691 +aa(lp22673 +g15 +aI377 +aI-720 +aI338 +aI-709 +aI357 +aI-716 +aa(lp22674 +g15 +aI438 +aI-727 +aI397 +aI-725 +aI417 +aI-727 +aa(lp22675 +g15 +aI618 +aI-665 +aI518 +aI-727 +aI578 +aI-706 +aa(lp22676 +g15 +aI678 +aI-466 +aI658 +aI-623 +aI678 +aI-557 +aa(lp22677 +g20 +aI678 +aI0 +aa(lp22678 +g10 +aa(lp22679 +g8 +aI785 +aI0 +aa(lp22680 +g10 +aa(lp22681 +g8 +aI785 +aI0 +aasVl +(lp22682 +(lp22683 +g8 +aI231 +aI0 +aa(lp22684 +g20 +aI113 +aI0 +aa(lp22685 +g20 +aI113 +aI-1012 +aa(lp22686 +g20 +aI231 +aI-1012 +aa(lp22687 +g10 +aa(lp22688 +g8 +aI345 +aI0 +aa(lp22689 +g10 +aa(lp22690 +g8 +aI345 +aI0 +aasVp +(lp22691 +(lp22692 +g8 +aI436 +aI13 +aa(lp22693 +g15 +aI366 +aI5 +aI410 +aI13 +aI387 +aI10 +aa(lp22694 +g15 +aI310 +aI-17 +aI345 +aI0 +aI326 +aI-8 +aa(lp22695 +g15 +aI265 +aI-50 +aI293 +aI-26 +aI278 +aI-37 +aa(lp22696 +g15 +aI231 +aI-90 +aI253 +aI-62 +aI241 +aI-76 +aa(lp22697 +g20 +aI223 +aI-90 +aa(lp22698 +g15 +aI227 +aI-47 +aI225 +aI-75 +aI226 +aI-61 +aa(lp22699 +g15 +aI230 +aI-12 +aI228 +aI-36 +aI229 +aI-24 +aa(lp22700 +g15 +aI231 +aI15 +aI231 +aI0 +aI231 +aI8 +aa(lp22701 +g20 +aI231 +aI320 +aa(lp22702 +g20 +aI113 +aI320 +aa(lp22703 +g20 +aI113 +aI-714 +aa(lp22704 +g20 +aI209 +aI-714 +aa(lp22705 +g20 +aI226 +aI-618 +aa(lp22706 +g20 +aI231 +aI-618 +aa(lp22707 +g15 +aI265 +aI-660 +aI241 +aI-633 +aI253 +aI-647 +aa(lp22708 +g15 +aI309 +aI-695 +aI278 +aI-673 +aI292 +aI-685 +aa(lp22709 +g15 +aI365 +aI-718 +aI326 +aI-704 +aI345 +aI-712 +aa(lp22710 +g15 +aI436 +aI-727 +aI386 +aI-724 +aI410 +aI-727 +aa(lp22711 +g15 +aI547 +aI-703 +aI476 +aI-727 +aI514 +aI-719 +aa(lp22712 +g15 +aI633 +aI-633 +aI580 +aI-688 +aI609 +aI-665 +aa(lp22713 +g15 +aI688 +aI-518 +aI656 +aI-602 +aI675 +aI-564 +aa(lp22714 +g15 +aI707 +aI-358 +aI701 +aI-472 +aI707 +aI-419 +aa(lp22715 +g15 +aI688 +aI-197 +aI707 +aI-297 +aI701 +aI-243 +aa(lp22716 +g15 +aI633 +aI-80 +aI675 +aI-150 +aI656 +aI-112 +aa(lp22717 +g15 +aI547 +aI-10 +aI609 +aI-49 +aI580 +aI-26 +aa(lp22718 +g15 +aI436 +aI13 +aI514 +aI5 +aI476 +aI13 +aa(lp22719 +g10 +aa(lp22720 +g8 +aI413 +aI-629 +aa(lp22721 +g15 +aI329 +aI-614 +aI380 +aI-629 +aI352 +aI-624 +aa(lp22722 +g15 +aI274 +aI-568 +aI306 +aI-604 +aI288 +aI-588 +aa(lp22723 +g15 +aI243 +aI-492 +aI260 +aI-548 +aI249 +aI-522 +aa(lp22724 +g15 +aI231 +aI-384 +aI236 +aI-462 +aI232 +aI-426 +aa(lp22725 +g20 +aI231 +aI-358 +aa(lp22726 +g15 +aI240 +aI-241 +aI231 +aI-314 +aI234 +aI-275 +aa(lp22727 +g15 +aI270 +aI-155 +aI246 +aI-207 +aI256 +aI-178 +aa(lp22728 +g15 +aI326 +aI-102 +aI284 +aI-132 +aI303 +aI-114 +aa(lp22729 +g15 +aI414 +aI-84 +aI350 +aI-90 +aI379 +aI-84 +aa(lp22730 +g15 +aI543 +aI-155 +aI473 +aI-84 +aI516 +aI-108 +aa(lp22731 +g15 +aI585 +aI-359 +aI571 +aI-203 +aI585 +aI-271 +aa(lp22732 +g15 +aI543 +aI-562 +aI585 +aI-449 +aI571 +aI-517 +aa(lp22733 +g15 +aI413 +aI-629 +aI516 +aI-606 +aI472 +aI-629 +aa(lp22734 +g10 +aa(lp22735 +g8 +aI781 +aI0 +aa(lp22736 +g10 +aa(lp22737 +g8 +aI781 +aI0 +aasVt +(lp22738 +(lp22739 +g8 +aI329 +aI-83 +aa(lp22740 +g15 +aI355 +aI-84 +aI337 +aI-83 +aI346 +aI-83 +aa(lp22741 +g15 +aI384 +aI-88 +aI365 +aI-85 +aI374 +aI-86 +aa(lp22742 +g15 +aI409 +aI-92 +aI393 +aI-89 +aI401 +aI-90 +aa(lp22743 +g15 +aI426 +aI-97 +aI416 +aI-94 +aI422 +aI-95 +aa(lp22744 +g20 +aI426 +aI-7 +aa(lp22745 +g15 +aI404 +aI0 +aI420 +aI-4 +aI413 +aI-2 +aa(lp22746 +g15 +aI376 +aI7 +aI396 +aI3 +aI386 +aI5 +aa(lp22747 +g15 +aI343 +aI11 +aI365 +aI9 +aI355 +aI10 +aa(lp22748 +g15 +aI310 +aI13 +aI332 +aI12 +aI321 +aI13 +aa(lp22749 +g15 +aI235 +aI3 +aI283 +aI13 +aI258 +aI10 +aa(lp22750 +g15 +aI176 +aI-32 +aI212 +aI-3 +aI192 +aI-15 +aa(lp22751 +g15 +aI136 +aI-101 +aI159 +aI-49 +aI146 +aI-72 +aa(lp22752 +g15 +aI122 +aI-210 +aI127 +aI-130 +aI122 +aI-166 +aa(lp22753 +g20 +aI122 +aI-625 +aa(lp22754 +g20 +aI21 +aI-625 +aa(lp22755 +g20 +aI21 +aI-677 +aa(lp22756 +g20 +aI122 +aI-728 +aa(lp22757 +g20 +aI173 +aI-878 +aa(lp22758 +g20 +aI241 +aI-878 +aa(lp22759 +g20 +aI241 +aI-714 +aa(lp22760 +g20 +aI421 +aI-714 +aa(lp22761 +g20 +aI421 +aI-625 +aa(lp22762 +g20 +aI241 +aI-625 +aa(lp22763 +g20 +aI241 +aI-210 +aa(lp22764 +g15 +aI262 +aI-115 +aI241 +aI-168 +aI248 +aI-136 +aa(lp22765 +g15 +aI329 +aI-83 +aI275 +aI-94 +aI298 +aI-83 +aa(lp22766 +g10 +aa(lp22767 +g8 +aI451 +aI0 +aa(lp22768 +g10 +aa(lp22769 +g8 +aI451 +aI0 +aasVx +(lp22770 +(lp22771 +g8 +aI265 +aI-366 +aa(lp22772 +g20 +aI35 +aI-714 +aa(lp22773 +g20 +aI170 +aI-714 +aa(lp22774 +g20 +aI333 +aI-447 +aa(lp22775 +g20 +aI496 +aI-714 +aa(lp22776 +g20 +aI630 +aI-714 +aa(lp22777 +g20 +aI399 +aI-366 +aa(lp22778 +g20 +aI642 +aI0 +aa(lp22779 +g20 +aI507 +aI0 +aa(lp22780 +g20 +aI333 +aI-283 +aa(lp22781 +g20 +aI157 +aI0 +aa(lp22782 +g20 +aI22 +aI0 +aa(lp22783 +g10 +aa(lp22784 +g8 +aI666 +aI0 +aa(lp22785 +g10 +aa(lp22786 +g8 +aI666 +aI0 +aasV| +(lp22787 +(lp22788 +g8 +aI318 +aI-1012 +aa(lp22789 +g20 +aI416 +aI-1012 +aa(lp22790 +g20 +aI416 +aI320 +aa(lp22791 +g20 +aI318 +aI320 +aa(lp22792 +g10 +aa(lp22793 +g8 +aI734 +aI0 +aa(lp22794 +g10 +aa(lp22795 +g8 +aI734 +aI0 +aasV# +(lp22796 +(lp22797 +g8 +aI639 +aI-580 +aa(lp22798 +g20 +aI598 +aI-367 +aa(lp22799 +g20 +aI781 +aI-367 +aa(lp22800 +g20 +aI781 +aI-278 +aa(lp22801 +g20 +aI581 +aI-278 +aa(lp22802 +g20 +aI527 +aI0 +aa(lp22803 +g20 +aI432 +aI0 +aa(lp22804 +g20 +aI486 +aI-278 +aa(lp22805 +g20 +aI297 +aI-278 +aa(lp22806 +g20 +aI244 +aI0 +aa(lp22807 +g20 +aI150 +aI0 +aa(lp22808 +g20 +aI201 +aI-278 +aa(lp22809 +g20 +aI33 +aI-278 +aa(lp22810 +g20 +aI33 +aI-367 +aa(lp22811 +g20 +aI218 +aI-367 +aa(lp22812 +g20 +aI261 +aI-580 +aa(lp22813 +g20 +aI82 +aI-580 +aa(lp22814 +g20 +aI82 +aI-670 +aa(lp22815 +g20 +aI277 +aI-670 +aa(lp22816 +g20 +aI330 +aI-951 +aa(lp22817 +g20 +aI426 +aI-951 +aa(lp22818 +g20 +aI373 +aI-670 +aa(lp22819 +g20 +aI563 +aI-670 +aa(lp22820 +g20 +aI618 +aI-951 +aa(lp22821 +g20 +aI712 +aI-951 +aa(lp22822 +g20 +aI657 +aI-670 +aa(lp22823 +g20 +aI828 +aI-670 +aa(lp22824 +g20 +aI828 +aI-580 +aa(lp22825 +g10 +aa(lp22826 +g8 +aI314 +aI-367 +aa(lp22827 +g20 +aI503 +aI-367 +aa(lp22828 +g20 +aI545 +aI-580 +aa(lp22829 +g20 +aI356 +aI-580 +aa(lp22830 +g10 +aa(lp22831 +g8 +aI861 +aI0 +aa(lp22832 +g10 +aa(lp22833 +g8 +aI861 +aI0 +aasV' +(lp22834 +(lp22835 +g8 +aI214 +aI-951 +aa(lp22836 +g20 +aI188 +aI-607 +aa(lp22837 +g20 +aI113 +aI-607 +aa(lp22838 +g20 +aI86 +aI-951 +aa(lp22839 +g10 +aa(lp22840 +g8 +aI301 +aI0 +aa(lp22841 +g10 +aa(lp22842 +g8 +aI301 +aI0 +aasV+ +(lp22843 +(lp22844 +g8 +aI318 +aI-420 +aa(lp22845 +g20 +aI66 +aI-420 +aa(lp22846 +g20 +aI66 +aI-518 +aa(lp22847 +g20 +aI318 +aI-518 +aa(lp22848 +g20 +aI318 +aI-771 +aa(lp22849 +g20 +aI416 +aI-771 +aa(lp22850 +g20 +aI416 +aI-518 +aa(lp22851 +g20 +aI667 +aI-518 +aa(lp22852 +g20 +aI667 +aI-420 +aa(lp22853 +g20 +aI416 +aI-420 +aa(lp22854 +g20 +aI416 +aI-170 +aa(lp22855 +g20 +aI318 +aI-170 +aa(lp22856 +g10 +aa(lp22857 +g8 +aI734 +aI0 +aa(lp22858 +g10 +aa(lp22859 +g8 +aI734 +aI0 +aasV/ +(lp22860 +(lp22861 +g8 +aI483 +aI-951 +aa(lp22862 +g20 +aI129 +aI0 +aa(lp22863 +g20 +aI13 +aI0 +aa(lp22864 +g20 +aI367 +aI-951 +aa(lp22865 +g10 +aa(lp22866 +g8 +aI497 +aI0 +aa(lp22867 +g10 +aa(lp22868 +g8 +aI497 +aI0 +aasV3 +(lp22869 +(lp22870 +g8 +aI625 +aI-728 +aa(lp22871 +g15 +aI610 +aI-642 +aI625 +aI-697 +aI620 +aI-668 +aa(lp22872 +g15 +aI568 +aI-574 +aI600 +aI-616 +aI586 +aI-593 +aa(lp22873 +g15 +aI503 +aI-527 +aI550 +aI-555 +aI529 +aI-539 +aa(lp22874 +g15 +aI419 +aI-500 +aI478 +aI-514 +aI450 +aI-506 +aa(lp22875 +g20 +aI419 +aI-496 +aa(lp22876 +g15 +aI595 +aI-423 +aI496 +aI-487 +aI555 +aI-462 +aa(lp22877 +g15 +aI654 +aI-270 +aI634 +aI-384 +aI654 +aI-333 +aa(lp22878 +g15 +aI633 +aI-155 +aI654 +aI-228 +aI647 +aI-190 +aa(lp22879 +g15 +aI569 +aI-65 +aI619 +aI-121 +aI598 +aI-91 +aa(lp22880 +g15 +aI460 +aI-7 +aI541 +aI-40 +aI504 +aI-21 +aa(lp22881 +g15 +aI305 +aI13 +aI417 +aI6 +aI365 +aI13 +aa(lp22882 +g15 +aI171 +aI2 +aI258 +aI13 +aI213 +aI9 +aa(lp22883 +g15 +aI53 +aI-37 +aI129 +aI-4 +aI90 +aI-18 +aa(lp22884 +g20 +aI53 +aI-148 +aa(lp22885 +g15 +aI176 +aI-102 +aI91 +aI-128 +aI132 +aI-113 +aa(lp22886 +g15 +aI302 +aI-86 +aI220 +aI-91 +aI262 +aI-86 +aa(lp22887 +g15 +aI406 +aI-99 +aI342 +aI-86 +aI377 +aI-90 +aa(lp22888 +g15 +aI478 +aI-136 +aI435 +aI-107 +aI459 +aI-120 +aa(lp22889 +g15 +aI519 +aI-195 +aI497 +aI-152 +aI510 +aI-172 +aa(lp22890 +g15 +aI533 +aI-274 +aI528 +aI-218 +aI533 +aI-245 +aa(lp22891 +g15 +aI515 +aI-350 +aI533 +aI-303 +aI527 +aI-329 +aa(lp22892 +g15 +aI466 +aI-402 +aI504 +aI-371 +aI488 +aI-388 +aa(lp22893 +g15 +aI388 +aI-432 +aI445 +aI-415 +aI419 +aI-425 +aa(lp22894 +g15 +aI285 +aI-442 +aI358 +aI-439 +aI323 +aI-442 +aa(lp22895 +g20 +aI198 +aI-442 +aa(lp22896 +g20 +aI198 +aI-540 +aa(lp22897 +g20 +aI285 +aI-540 +aa(lp22898 +g15 +aI378 +aI-553 +aI320 +aI-540 +aI351 +aI-544 +aa(lp22899 +g15 +aI447 +aI-590 +aI406 +aI-562 +aI429 +aI-574 +aa(lp22900 +g15 +aI489 +aI-647 +aI466 +aI-606 +aI480 +aI-625 +aa(lp22901 +g15 +aI503 +aI-720 +aI499 +aI-670 +aI503 +aI-694 +aa(lp22902 +g15 +aI492 +aI-781 +aI503 +aI-743 +aI500 +aI-763 +aa(lp22903 +g15 +aI458 +aI-826 +aI484 +aI-799 +aI473 +aI-814 +aa(lp22904 +g15 +aI407 +aI-855 +aI444 +aI-839 +aI427 +aI-848 +aa(lp22905 +g15 +aI341 +aI-864 +aI387 +aI-861 +aI365 +aI-864 +aa(lp22906 +g15 +aI218 +aI-842 +aI294 +aI-864 +aI253 +aI-857 +aa(lp22907 +g15 +aI117 +aI-786 +aI183 +aI-828 +aI149 +aI-809 +aa(lp22908 +g20 +aI57 +aI-867 +aa(lp22909 +g15 +aI112 +aI-905 +aI73 +aI-880 +aI92 +aI-893 +aa(lp22910 +g15 +aI178 +aI-936 +aI132 +aI-916 +aI154 +aI-927 +aa(lp22911 +g15 +aI254 +aI-957 +aI202 +aI-944 +aI227 +aI-952 +aa(lp22912 +g15 +aI341 +aI-965 +aI282 +aI-962 +aI310 +aI-965 +aa(lp22913 +g15 +aI464 +aI-947 +aI388 +aI-965 +aI429 +aI-959 +aa(lp22914 +g15 +aI553 +aI-898 +aI499 +aI-935 +aI529 +aI-919 +aa(lp22915 +g15 +aI607 +aI-823 +aI577 +aI-877 +aI595 +aI-852 +aa(lp22916 +g15 +aI625 +aI-728 +aI619 +aI-794 +aI625 +aI-763 +aa(lp22917 +g10 +aa(lp22918 +g8 +aI734 +aI0 +aa(lp22919 +g10 +aa(lp22920 +g8 +aI734 +aI0 +aasV7 +(lp22921 +(lp22922 +g8 +aI182 +aI0 +aa(lp22923 +g20 +aI549 +aI-843 +aa(lp22924 +g20 +aI58 +aI-843 +aa(lp22925 +g20 +aI58 +aI-951 +aa(lp22926 +g20 +aI670 +aI-951 +aa(lp22927 +g20 +aI670 +aI-856 +aa(lp22928 +g20 +aI309 +aI0 +aa(lp22929 +g10 +aa(lp22930 +g8 +aI734 +aI0 +aa(lp22931 +g10 +aa(lp22932 +g8 +aI734 +aI0 +aasV; +(lp22933 +(lp22934 +g8 +aI235 +aI-154 +aa(lp22935 +g20 +aI245 +aI-139 +aa(lp22936 +g15 +aI223 +aI-64 +aI239 +aI-116 +aI232 +aI-91 +aa(lp22937 +g15 +aI195 +aI15 +aI215 +aI-38 +aI205 +aI-11 +aa(lp22938 +g15 +aI163 +aI95 +aI185 +aI42 +aI174 +aI69 +aa(lp22939 +g15 +aI130 +aI172 +aI152 +aI122 +aI141 +aI148 +aa(lp22940 +g20 +aI41 +aI172 +aa(lp22941 +g15 +aI60 +aI89 +aI47 +aI145 +aI53 +aI118 +aa(lp22942 +g15 +aI78 +aI4 +aI66 +aI60 +aI72 +aI32 +aa(lp22943 +g15 +aI94 +aI-79 +aI84 +aI-24 +aI89 +aI-52 +aa(lp22944 +g15 +aI106 +aI-154 +aI99 +aI-106 +aI103 +aI-131 +aa(lp22945 +g10 +aa(lp22946 +g8 +aI95 +aI-642 +aa(lp22947 +g15 +aI102 +aI-684 +aI95 +aI-659 +aI97 +aI-673 +aa(lp22948 +g15 +aI119 +aI-712 +aI106 +aI-696 +aI112 +aI-705 +aa(lp22949 +g15 +aI145 +aI-728 +aI127 +aI-719 +aI135 +aI-725 +aa(lp22950 +g15 +aI178 +aI-732 +aI155 +aI-731 +aI166 +aI-732 +aa(lp22951 +g15 +aI210 +aI-728 +aI189 +aI-732 +aI200 +aI-731 +aa(lp22952 +g15 +aI236 +aI-712 +aI220 +aI-725 +aI229 +aI-719 +aa(lp22953 +g15 +aI254 +aI-684 +aI244 +aI-705 +aI250 +aI-696 +aa(lp22954 +g15 +aI261 +aI-642 +aI258 +aI-673 +aI261 +aI-659 +aa(lp22955 +g15 +aI254 +aI-601 +aI261 +aI-626 +aI258 +aI-612 +aa(lp22956 +g15 +aI236 +aI-573 +aI250 +aI-589 +aI244 +aI-580 +aa(lp22957 +g15 +aI210 +aI-556 +aI229 +aI-565 +aI220 +aI-560 +aa(lp22958 +g15 +aI178 +aI-551 +aI200 +aI-553 +aI189 +aI-551 +aa(lp22959 +g15 +aI145 +aI-556 +aI166 +aI-551 +aI155 +aI-553 +aa(lp22960 +g15 +aI119 +aI-573 +aI135 +aI-560 +aI127 +aI-565 +aa(lp22961 +g15 +aI102 +aI-601 +aI112 +aI-580 +aI106 +aI-589 +aa(lp22962 +g15 +aI95 +aI-642 +aI97 +aI-612 +aI95 +aI-626 +aa(lp22963 +g10 +aa(lp22964 +g8 +aI357 +aI0 +aa(lp22965 +g10 +aa(lp22966 +g8 +aI357 +aI0 +aasV? +(lp22967 +(lp22968 +g8 +aI182 +aI-269 +aa(lp22969 +g20 +aI182 +aI-293 +aa(lp22970 +g15 +aI187 +aI-360 +aI182 +aI-317 +aI184 +aI-340 +aa(lp22971 +g15 +aI205 +aI-416 +aI191 +aI-380 +aI196 +aI-398 +aa(lp22972 +g15 +aI239 +aI-467 +aI213 +aI-433 +aI225 +aI-450 +aa(lp22973 +g15 +aI293 +aI-519 +aI253 +aI-484 +aI271 +aI-501 +aa(lp22974 +g15 +aI347 +aI-568 +aI314 +aI-537 +aI332 +aI-553 +aa(lp22975 +g15 +aI383 +aI-612 +aI361 +aI-582 +aI373 +aI-597 +aa(lp22976 +g15 +aI403 +aI-660 +aI392 +aI-627 +aI399 +aI-643 +aa(lp22977 +g15 +aI410 +aI-720 +aI408 +aI-677 +aI410 +aI-697 +aa(lp22978 +g15 +aI401 +aI-777 +aI410 +aI-741 +aI407 +aI-760 +aa(lp22979 +g15 +aI372 +aI-822 +aI394 +aI-795 +aI385 +aI-809 +aa(lp22980 +g15 +aI326 +aI-850 +aI360 +aI-834 +aI344 +aI-844 +aa(lp22981 +g15 +aI262 +aI-860 +aI308 +aI-857 +aI286 +aI-860 +aa(lp22982 +g15 +aI159 +aI-843 +aI226 +aI-860 +aI192 +aI-855 +aa(lp22983 +g15 +aI65 +aI-804 +aI126 +aI-832 +aI95 +aI-819 +aa(lp22984 +g20 +aI24 +aI-899 +aa(lp22985 +g15 +aI138 +aI-945 +aI59 +aI-917 +aI97 +aI-933 +aa(lp22986 +g15 +aI262 +aI-965 +aI178 +aI-958 +aI220 +aI-965 +aa(lp22987 +g15 +aI371 +aI-948 +aI302 +aI-965 +aI339 +aI-959 +aa(lp22988 +g15 +aI453 +aI-900 +aI403 +aI-937 +aI431 +aI-921 +aa(lp22989 +g15 +aI505 +aI-824 +aI476 +aI-879 +aI493 +aI-854 +aa(lp22990 +g15 +aI524 +aI-722 +aI518 +aI-793 +aI524 +aI-759 +aa(lp22991 +g15 +aI515 +aI-644 +aI524 +aI-693 +aI521 +aI-667 +aa(lp22992 +g15 +aI488 +aI-580 +aI509 +aI-621 +aI500 +aI-600 +aa(lp22993 +g15 +aI445 +aI-524 +aI477 +aI-561 +aI462 +aI-542 +aa(lp22994 +g15 +aI384 +aI-466 +aI427 +aI-506 +aI407 +aI-486 +aa(lp22995 +g15 +aI328 +aI-415 +aI361 +aI-446 +aI343 +aI-429 +aa(lp22996 +g15 +aI294 +aI-372 +aI314 +aI-400 +aI303 +aI-386 +aa(lp22997 +g15 +aI277 +aI-330 +aI286 +aI-359 +aI281 +aI-345 +aa(lp22998 +g15 +aI273 +aI-280 +aI274 +aI-316 +aI273 +aI-299 +aa(lp22999 +g20 +aI273 +aI-269 +aa(lp23000 +g10 +aa(lp23001 +g8 +aI151 +aI-71 +aa(lp23002 +g15 +aI158 +aI-113 +aI151 +aI-88 +aI153 +aI-102 +aa(lp23003 +g15 +aI175 +aI-141 +aI162 +aI-125 +aI168 +aI-134 +aa(lp23004 +g15 +aI201 +aI-157 +aI183 +aI-148 +aI191 +aI-154 +aa(lp23005 +g15 +aI234 +aI-162 +aI211 +aI-160 +aI222 +aI-162 +aa(lp23006 +g15 +aI266 +aI-157 +aI245 +aI-162 +aI256 +aI-160 +aa(lp23007 +g15 +aI292 +aI-141 +aI276 +aI-154 +aI285 +aI-148 +aa(lp23008 +g15 +aI310 +aI-113 +aI300 +aI-134 +aI306 +aI-125 +aa(lp23009 +g15 +aI317 +aI-71 +aI314 +aI-102 +aI317 +aI-88 +aa(lp23010 +g15 +aI310 +aI-30 +aI317 +aI-55 +aI314 +aI-41 +aa(lp23011 +g15 +aI292 +aI-2 +aI306 +aI-18 +aI300 +aI-9 +aa(lp23012 +g15 +aI266 +aI14 +aI285 +aI5 +aI276 +aI10 +aa(lp23013 +g15 +aI234 +aI19 +aI256 +aI17 +aI245 +aI19 +aa(lp23014 +g15 +aI201 +aI14 +aI222 +aI19 +aI211 +aI17 +aa(lp23015 +g15 +aI175 +aI-2 +aI191 +aI10 +aI183 +aI5 +aa(lp23016 +g15 +aI158 +aI-30 +aI168 +aI-9 +aI162 +aI-18 +aa(lp23017 +g15 +aI151 +aI-71 +aI153 +aI-41 +aI151 +aI-55 +aa(lp23018 +g10 +aa(lp23019 +g8 +aI567 +aI0 +aa(lp23020 +g10 +aa(lp23021 +g8 +aI567 +aI0 +aasVC +(lp23022 +(lp23023 +g8 +aI516 +aI-858 +aa(lp23024 +g15 +aI389 +aI-831 +aI469 +aI-858 +aI427 +aI-849 +aa(lp23025 +g15 +aI293 +aI-756 +aI352 +aI-814 +aI319 +aI-789 +aa(lp23026 +g15 +aI231 +aI-635 +aI266 +aI-723 +aI245 +aI-682 +aa(lp23027 +g15 +aI209 +aI-475 +aI216 +aI-588 +aI209 +aI-534 +aa(lp23028 +g15 +aI228 +aI-312 +aI209 +aI-414 +aI216 +aI-359 +aa(lp23029 +g15 +aI286 +aI-192 +aI241 +aI-264 +aI260 +aI-224 +aa(lp23030 +g15 +aI382 +aI-118 +aI312 +aI-159 +aI343 +aI-134 +aa(lp23031 +g15 +aI516 +aI-92 +aI420 +aI-101 +aI465 +aI-92 +aa(lp23032 +g15 +aI626 +aI-104 +aI554 +aI-92 +aI591 +aI-96 +aa(lp23033 +g15 +aI729 +aI-130 +aI661 +aI-111 +aI695 +aI-120 +aa(lp23034 +g20 +aI729 +aI-24 +aa(lp23035 +g15 +aI678 +aI-7 +aI712 +aI-18 +aI695 +aI-12 +aa(lp23036 +g15 +aI625 +aI4 +aI661 +aI-2 +aI643 +aI1 +aa(lp23037 +g15 +aI566 +aI11 +aI606 +aI7 +aI587 +aI9 +aa(lp23038 +g15 +aI496 +aI13 +aI545 +aI12 +aI521 +aI13 +aa(lp23039 +g15 +aI311 +aI-21 +aI424 +aI13 +aI363 +aI1 +aa(lp23040 +g15 +aI181 +aI-121 +aI259 +aI-45 +aI216 +aI-78 +aa(lp23041 +g15 +aI106 +aI-276 +aI147 +aI-164 +aI122 +aI-215 +aa(lp23042 +g15 +aI81 +aI-476 +aI89 +aI-336 +aI81 +aI-403 +aa(lp23043 +g15 +aI109 +aI-674 +aI81 +aI-548 +aI90 +aI-614 +aa(lp23044 +g15 +aI193 +aI-828 +aI128 +aI-734 +aI156 +aI-786 +aa(lp23045 +g15 +aI329 +aI-929 +aI229 +aI-871 +aI275 +aI-905 +aa(lp23046 +g15 +aI516 +aI-965 +aI383 +aI-953 +aI445 +aI-965 +aa(lp23047 +g15 +aI650 +aI-950 +aI563 +aI-965 +aI607 +aI-960 +aa(lp23048 +g15 +aI765 +aI-909 +aI692 +aI-941 +aI731 +aI-927 +aa(lp23049 +g20 +aI714 +aI-807 +aa(lp23050 +g15 +aI625 +aI-843 +aI687 +aI-821 +aI657 +aI-833 +aa(lp23051 +g15 +aI516 +aI-858 +aI593 +aI-853 +aI557 +aI-858 +aa(lp23052 +g10 +aa(lp23053 +g8 +aI804 +aI0 +aa(lp23054 +g10 +aa(lp23055 +g8 +aI804 +aI0 +aasVG +(lp23056 +(lp23057 +g8 +aI509 +aI-502 +aa(lp23058 +g20 +aI824 +aI-502 +aa(lp23059 +g20 +aI824 +aI-35 +aa(lp23060 +g15 +aI751 +aI-14 +aI800 +aI-27 +aI776 +aI-20 +aa(lp23061 +g15 +aI677 +aI0 +aI727 +aI-8 +aI702 +aI-3 +aa(lp23062 +g15 +aI596 +aI10 +aI651 +aI4 +aI624 +aI8 +aa(lp23063 +g15 +aI505 +aI13 +aI568 +aI12 +aI537 +aI13 +aa(lp23064 +g15 +aI324 +aI-20 +aI437 +aI13 +aI376 +aI2 +aa(lp23065 +g15 +aI191 +aI-118 +aI271 +aI-43 +aI227 +aI-76 +aa(lp23066 +g15 +aI109 +aI-272 +aI155 +aI-160 +aI128 +aI-212 +aa(lp23067 +g15 +aI81 +aI-476 +aI90 +aI-333 +aI81 +aI-401 +aa(lp23068 +g15 +aI112 +aI-679 +aI81 +aI-551 +aI91 +aI-618 +aa(lp23069 +g15 +aI202 +aI-833 +aI132 +aI-739 +aI162 +aI-790 +aa(lp23070 +g15 +aI348 +aI-930 +aI241 +aI-875 +aI290 +aI-908 +aa(lp23071 +g15 +aI546 +aI-965 +aI406 +aI-953 +aI472 +aI-965 +aa(lp23072 +g15 +aI685 +aI-950 +aI595 +aI-965 +aI641 +aI-960 +aa(lp23073 +g15 +aI809 +aI-909 +aI729 +aI-941 +aI771 +aI-927 +aa(lp23074 +g20 +aI762 +aI-803 +aa(lp23075 +g15 +aI711 +aI-824 +aI746 +aI-810 +aI729 +aI-817 +aa(lp23076 +g15 +aI656 +aI-841 +aI693 +aI-830 +aI675 +aI-836 +aa(lp23077 +g15 +aI597 +aI-853 +aI637 +aI-846 +aI617 +aI-850 +aa(lp23078 +g15 +aI537 +aI-858 +aI577 +aI-856 +aI557 +aI-858 +aa(lp23079 +g15 +aI396 +aI-831 +aI484 +aI-858 +aI437 +aI-849 +aa(lp23080 +g15 +aI293 +aI-756 +aI355 +aI-814 +aI321 +aI-789 +aa(lp23081 +g15 +aI231 +aI-635 +aI266 +aI-723 +aI245 +aI-682 +aa(lp23082 +g15 +aI209 +aI-475 +aI216 +aI-588 +aI209 +aI-534 +aa(lp23083 +g15 +aI227 +aI-320 +aI209 +aI-419 +aI215 +aI-367 +aa(lp23084 +g15 +aI284 +aI-199 +aI239 +aI-273 +aI258 +aI-233 +aa(lp23085 +g15 +aI385 +aI-120 +aI310 +aI-165 +aI344 +aI-139 +aa(lp23086 +g15 +aI534 +aI-92 +aI426 +aI-101 +aI476 +aI-92 +aa(lp23087 +g15 +aI586 +aI-94 +aI553 +aI-92 +aI571 +aI-93 +aa(lp23088 +g15 +aI630 +aI-98 +aI602 +aI-95 +aI617 +aI-96 +aa(lp23089 +g15 +aI668 +aI-104 +aI644 +aI-100 +aI657 +aI-102 +aa(lp23090 +g15 +aI703 +aI-111 +aI680 +aI-107 +aI692 +aI-109 +aa(lp23091 +g20 +aI703 +aI-395 +aa(lp23092 +g20 +aI509 +aI-395 +aa(lp23093 +g10 +aa(lp23094 +g8 +aI919 +aI0 +aa(lp23095 +g10 +aa(lp23096 +g8 +aI919 +aI0 +aasVK +(lp23097 +(lp23098 +g8 +aI772 +aI0 +aa(lp23099 +g20 +aI634 +aI0 +aa(lp23100 +g20 +aI341 +aI-453 +aa(lp23101 +g20 +aI250 +aI-379 +aa(lp23102 +g20 +aI250 +aI0 +aa(lp23103 +g20 +aI129 +aI0 +aa(lp23104 +g20 +aI129 +aI-951 +aa(lp23105 +g20 +aI250 +aI-951 +aa(lp23106 +g20 +aI250 +aI-475 +aa(lp23107 +g20 +aI329 +aI-584 +aa(lp23108 +g20 +aI623 +aI-951 +aa(lp23109 +g20 +aI759 +aI-951 +aa(lp23110 +g20 +aI421 +aI-536 +aa(lp23111 +g10 +aa(lp23112 +g8 +aI772 +aI0 +aa(lp23113 +g10 +aa(lp23114 +g8 +aI772 +aI0 +aasVO +(lp23115 +(lp23116 +g8 +aI906 +aI-476 +aa(lp23117 +g15 +aI880 +aI-276 +aI906 +aI-403 +aI898 +aI-336 +aa(lp23118 +g15 +aI802 +aI-121 +aI862 +aI-215 +aI836 +aI-164 +aa(lp23119 +g15 +aI672 +aI-21 +aI767 +aI-78 +aI724 +aI-45 +aa(lp23120 +g15 +aI494 +aI13 +aI621 +aI1 +aI562 +aI13 +aa(lp23121 +g15 +aI310 +aI-21 +aI424 +aI13 +aI362 +aI1 +aa(lp23122 +g15 +aI181 +aI-121 +aI259 +aI-45 +aI216 +aI-78 +aa(lp23123 +g15 +aI106 +aI-276 +aI147 +aI-164 +aI122 +aI-216 +aa(lp23124 +g15 +aI81 +aI-478 +aI89 +aI-337 +aI81 +aI-404 +aa(lp23125 +g15 +aI106 +aI-678 +aI81 +aI-551 +aI89 +aI-618 +aa(lp23126 +g15 +aI182 +aI-832 +aI122 +aI-739 +aI148 +aI-790 +aa(lp23127 +g15 +aI311 +aI-931 +aI216 +aI-875 +aI259 +aI-908 +aa(lp23128 +g15 +aI496 +aI-966 +aI363 +aI-954 +aI425 +aI-966 +aa(lp23129 +g15 +aI673 +aI-931 +aI563 +aI-966 +aI622 +aI-954 +aa(lp23130 +g15 +aI802 +aI-832 +aI724 +aI-908 +aI767 +aI-875 +aa(lp23131 +g15 +aI880 +aI-678 +aI836 +aI-789 +aI862 +aI-738 +aa(lp23132 +g15 +aI906 +aI-476 +aI898 +aI-618 +aI906 +aI-550 +aa(lp23133 +g10 +aa(lp23134 +g8 +aI209 +aI-476 +aa(lp23135 +g15 +aI226 +aI-316 +aI209 +aI-417 +aI215 +aI-363 +aa(lp23136 +g15 +aI278 +aI-195 +aI237 +aI-268 +aI255 +aI-228 +aa(lp23137 +g15 +aI366 +aI-119 +aI301 +aI-161 +aI331 +aI-136 +aa(lp23138 +g15 +aI494 +aI-92 +aI402 +aI-101 +aI445 +aI-92 +aa(lp23139 +g15 +aI622 +aI-119 +aI544 +aI-92 +aI586 +aI-101 +aa(lp23140 +g15 +aI711 +aI-195 +aI658 +aI-136 +aI688 +aI-161 +aa(lp23141 +g15 +aI762 +aI-316 +aI734 +aI-228 +aI751 +aI-268 +aa(lp23142 +g15 +aI778 +aI-476 +aI773 +aI-363 +aI778 +aI-417 +aa(lp23143 +g15 +aI762 +aI-637 +aI778 +aI-536 +aI773 +aI-590 +aa(lp23144 +g15 +aI711 +aI-757 +aI751 +aI-684 +aI734 +aI-724 +aa(lp23145 +g15 +aI623 +aI-833 +aI688 +aI-790 +aI659 +aI-815 +aa(lp23146 +g15 +aI496 +aI-859 +aI588 +aI-850 +aI545 +aI-859 +aa(lp23147 +g15 +aI367 +aI-833 +aI446 +aI-859 +aI403 +aI-850 +aa(lp23148 +g15 +aI278 +aI-757 +aI331 +aI-815 +aI302 +aI-790 +aa(lp23149 +g15 +aI226 +aI-637 +aI255 +aI-724 +aI237 +aI-684 +aa(lp23150 +g15 +aI209 +aI-476 +aI215 +aI-590 +aI209 +aI-536 +aa(lp23151 +g10 +aa(lp23152 +g8 +aI989 +aI0 +aa(lp23153 +g10 +aa(lp23154 +g8 +aI989 +aI0 +aasVS +(lp23155 +(lp23156 +g8 +aI630 +aI-254 +aa(lp23157 +g15 +aI608 +aI-141 +aI630 +aI-212 +aI623 +aI-174 +aa(lp23158 +g15 +aI544 +aI-56 +aI593 +aI-107 +aI572 +aI-79 +aa(lp23159 +g15 +aI442 +aI-4 +aI516 +aI-33 +aI482 +aI-16 +aa(lp23160 +g15 +aI307 +aI13 +aI402 +aI7 +aI357 +aI13 +aa(lp23161 +g15 +aI172 +aI2 +aI259 +aI13 +aI214 +aI9 +aa(lp23162 +g15 +aI67 +aI-31 +aI130 +aI-5 +aI95 +aI-16 +aa(lp23163 +g20 +aI67 +aI-147 +aa(lp23164 +g15 +aI118 +aI-126 +aI82 +aI-140 +aI99 +aI-133 +aa(lp23165 +g15 +aI177 +aI-108 +aI137 +aI-120 +aI156 +aI-114 +aa(lp23166 +g15 +aI242 +aI-96 +aI198 +aI-103 +aI220 +aI-99 +aa(lp23167 +g15 +aI307 +aI-91 +aI264 +aI-92 +aI286 +aI-91 +aa(lp23168 +g15 +aI461 +aI-130 +aI377 +aI-91 +aI428 +aI-104 +aa(lp23169 +g15 +aI511 +aI-242 +aI495 +aI-156 +aI511 +aI-193 +aa(lp23170 +g15 +aI502 +aI-303 +aI511 +aI-265 +aI508 +aI-286 +aa(lp23171 +g15 +aI469 +aI-351 +aI495 +aI-320 +aI484 +aI-336 +aa(lp23172 +g15 +aI405 +aI-393 +aI453 +aI-365 +aI432 +aI-380 +aa(lp23173 +g15 +aI305 +aI-438 +aI379 +aI-407 +aI345 +aI-422 +aa(lp23174 +g15 +aI204 +aI-488 +aI266 +aI-453 +aI233 +aI-470 +aa(lp23175 +g15 +aI134 +aI-549 +aI176 +aI-506 +aI152 +aI-526 +aa(lp23176 +g15 +aI93 +aI-625 +aI115 +aI-571 +aI102 +aI-597 +aa(lp23177 +g15 +aI80 +aI-723 +aI84 +aI-654 +aI80 +aI-687 +aa(lp23178 +g15 +aI100 +aI-825 +aI80 +aI-761 +aI87 +aI-795 +aa(lp23179 +g15 +aI159 +aI-901 +aI114 +aI-855 +aI134 +aI-880 +aa(lp23180 +g15 +aI249 +aI-948 +aI184 +aI-922 +aI214 +aI-937 +aa(lp23181 +g15 +aI365 +aI-965 +aI284 +aI-959 +aI323 +aI-965 +aa(lp23182 +g15 +aI504 +aI-950 +aI416 +aI-965 +aI463 +aI-960 +aa(lp23183 +g15 +aI614 +aI-912 +aI545 +aI-940 +aI582 +aI-928 +aa(lp23184 +g20 +aI570 +aI-811 +aa(lp23185 +g15 +aI474 +aI-844 +aI542 +aI-823 +aI510 +aI-834 +aa(lp23186 +g15 +aI363 +aI-858 +aI439 +aI-853 +aI402 +aI-858 +aa(lp23187 +g15 +aI240 +aI-821 +aI310 +aI-858 +aI269 +aI-846 +aa(lp23188 +g15 +aI197 +aI-722 +aI211 +aI-796 +aI197 +aI-763 +aa(lp23189 +g15 +aI207 +aI-658 +aI197 +aI-697 +aI200 +aI-676 +aa(lp23190 +g15 +aI239 +aI-609 +aI213 +aI-640 +aI224 +aI-623 +aa(lp23191 +g15 +aI299 +aI-568 +aI254 +aI-594 +aI274 +aI-581 +aa(lp23192 +g15 +aI391 +aI-527 +aI324 +aI-555 +aI355 +aI-541 +aa(lp23193 +g15 +aI495 +aI-479 +aI431 +aI-511 +aI466 +aI-495 +aa(lp23194 +g15 +aI570 +aI-423 +aI525 +aI-462 +aI550 +aI-444 +aa(lp23195 +g15 +aI615 +aI-351 +aI590 +aI-402 +aI605 +aI-378 +aa(lp23196 +g15 +aI630 +aI-254 +aI625 +aI-323 +aI630 +aI-291 +aa(lp23197 +g10 +aa(lp23198 +g8 +aI692 +aI0 +aa(lp23199 +g10 +aa(lp23200 +g8 +aI692 +aI0 +aasVW +(lp23201 +(lp23202 +g8 +aI526 +aI-951 +aa(lp23203 +g20 +aI654 +aI-951 +aa(lp23204 +g20 +aI804 +aI-394 +aa(lp23205 +g15 +aI823 +aI-321 +aI810 +aI-369 +aI816 +aI-345 +aa(lp23206 +g15 +aI840 +aI-250 +aI829 +aI-296 +aI835 +aI-273 +aa(lp23207 +g15 +aI855 +aI-185 +aI846 +aI-227 +aI851 +aI-206 +aa(lp23208 +g15 +aI865 +aI-130 +aI859 +aI-165 +aI862 +aI-146 +aa(lp23209 +g15 +aI871 +aI-184 +aI866 +aI-146 +aI869 +aI-164 +aa(lp23210 +g15 +aI880 +aI-245 +aI874 +aI-203 +aI877 +aI-224 +aa(lp23211 +g15 +aI892 +aI-311 +aI884 +aI-267 +aI888 +aI-289 +aa(lp23212 +g15 +aI905 +aI-377 +aI896 +aI-334 +aI900 +aI-355 +aa(lp23213 +g20 +aI1035 +aI-951 +aa(lp23214 +g20 +aI1165 +aI-951 +aa(lp23215 +g20 +aI926 +aI0 +aa(lp23216 +g20 +aI804 +aI0 +aa(lp23217 +g20 +aI638 +aI-610 +aa(lp23218 +g15 +aI621 +aI-678 +aI632 +aI-632 +aI626 +aI-655 +aa(lp23219 +g15 +aI605 +aI-744 +aI615 +aI-702 +aI610 +aI-723 +aa(lp23220 +g15 +aI590 +aI-814 +aI600 +aI-768 +aI595 +aI-791 +aa(lp23221 +g15 +aI576 +aI-744 +aI585 +aI-791 +aI580 +aI-768 +aa(lp23222 +g15 +aI561 +aI-677 +aI571 +aI-724 +aI566 +aI-702 +aa(lp23223 +g15 +aI544 +aI-606 +aI556 +aI-653 +aI550 +aI-629 +aa(lp23224 +g20 +aI386 +aI0 +aa(lp23225 +g20 +aI264 +aI0 +aa(lp23226 +g20 +aI13 +aI-951 +aa(lp23227 +g20 +aI141 +aI-951 +aa(lp23228 +g20 +aI286 +aI-372 +aa(lp23229 +g15 +aI300 +aI-310 +aI291 +aI-352 +aI296 +aI-331 +aa(lp23230 +g15 +aI312 +aI-246 +aI305 +aI-288 +aI309 +aI-267 +aa(lp23231 +g15 +aI322 +aI-184 +aI316 +aI-225 +aI319 +aI-204 +aa(lp23232 +g15 +aI330 +aI-130 +aI325 +aI-165 +aI328 +aI-146 +aa(lp23233 +g15 +aI338 +aI-186 +aI332 +aI-146 +aI335 +aI-165 +aa(lp23234 +g15 +aI350 +aI-253 +aI342 +aI-207 +aI345 +aI-230 +aa(lp23235 +g15 +aI364 +aI-324 +aI354 +aI-276 +aI359 +aI-300 +aa(lp23236 +g15 +aI380 +aI-392 +aI369 +aI-348 +aI374 +aI-371 +aa(lp23237 +g10 +aa(lp23238 +g8 +aI1178 +aI0 +aa(lp23239 +g10 +aa(lp23240 +g8 +aI1178 +aI0 +aasV[ +(lp23241 +(lp23242 +g8 +aI370 +aI211 +aa(lp23243 +g20 +aI106 +aI211 +aa(lp23244 +g20 +aI106 +aI-951 +aa(lp23245 +g20 +aI370 +aI-951 +aa(lp23246 +g20 +aI370 +aI-854 +aa(lp23247 +g20 +aI225 +aI-854 +aa(lp23248 +g20 +aI225 +aI113 +aa(lp23249 +g20 +aI370 +aI113 +aa(lp23250 +g10 +aa(lp23251 +g8 +aI404 +aI0 +aa(lp23252 +g10 +aa(lp23253 +g8 +aI404 +aI0 +aasV_ +(lp23254 +(lp23255 +g8 +aI550 +aI211 +aa(lp23256 +g20 +aI-2 +aI211 +aa(lp23257 +g20 +aI-2 +aI120 +aa(lp23258 +g20 +aI550 +aI120 +aa(lp23259 +g10 +aa(lp23260 +g8 +aI548 +aI0 +aa(lp23261 +g10 +aa(lp23262 +g8 +aI548 +aI0 +aasVc +(lp23263 +(lp23264 +g8 +aI386 +aI13 +aa(lp23265 +g15 +aI263 +aI-7 +aI342 +aI13 +aI301 +aI6 +aa(lp23266 +g15 +aI164 +aI-72 +aI225 +aI-20 +aI192 +aI-42 +aa(lp23267 +g15 +aI97 +aI-186 +aI135 +aI-101 +aI113 +aI-139 +aa(lp23268 +g15 +aI73 +aI-353 +aI81 +aI-232 +aI73 +aI-287 +aa(lp23269 +g15 +aI98 +aI-526 +aI73 +aI-421 +aI81 +aI-479 +aa(lp23270 +g15 +aI166 +aI-642 +aI114 +aI-574 +aI137 +aI-612 +aa(lp23271 +g15 +aI267 +aI-707 +aI195 +aI-672 +aI228 +aI-693 +aa(lp23272 +g15 +aI391 +aI-727 +aI306 +aI-720 +aI347 +aI-727 +aa(lp23273 +g15 +aI491 +aI-716 +aI425 +aI-727 +aI458 +aI-723 +aa(lp23274 +g15 +aI572 +aI-689 +aI523 +aI-708 +aI550 +aI-699 +aa(lp23275 +g20 +aI537 +aI-588 +aa(lp23276 +g15 +aI503 +aI-601 +aI527 +aI-593 +aI516 +aI-597 +aa(lp23277 +g15 +aI466 +aI-612 +aI491 +aI-605 +aI479 +aI-609 +aa(lp23278 +g15 +aI427 +aI-620 +aI453 +aI-615 +aI440 +aI-618 +aa(lp23279 +g15 +aI391 +aI-623 +aI415 +aI-622 +aI403 +aI-623 +aa(lp23280 +g15 +aI242 +aI-557 +aI323 +aI-623 +aI274 +aI-601 +aa(lp23281 +g15 +aI195 +aI-354 +aI211 +aI-514 +aI195 +aI-446 +aa(lp23282 +g15 +aI243 +aI-153 +aI195 +aI-262 +aI211 +aI-195 +aa(lp23283 +g15 +aI386 +aI-90 +aI274 +aI-111 +aI322 +aI-90 +aa(lp23284 +g15 +aI482 +aI-102 +aI421 +aI-90 +aI453 +aI-94 +aa(lp23285 +g15 +aI559 +aI-130 +aI510 +aI-110 +aI536 +aI-119 +aa(lp23286 +g20 +aI559 +aI-24 +aa(lp23287 +g15 +aI484 +aI3 +aI536 +aI-12 +aI511 +aI-2 +aa(lp23288 +g15 +aI386 +aI13 +aI458 +aI10 +aI425 +aI13 +aa(lp23289 +g10 +aa(lp23290 +g8 +aI617 +aI0 +aa(lp23291 +g10 +aa(lp23292 +g8 +aI617 +aI0 +aasVg +(lp23293 +(lp23294 +g8 +aI664 +aI-714 +aa(lp23295 +g20 +aI664 +aI-640 +aa(lp23296 +g20 +aI535 +aI-623 +aa(lp23297 +g15 +aI566 +aI-564 +aI547 +aI-608 +aI558 +aI-588 +aa(lp23298 +g15 +aI578 +aI-484 +aI574 +aI-541 +aI578 +aI-514 +aa(lp23299 +g15 +aI563 +aI-393 +aI578 +aI-451 +aI573 +aI-421 +aa(lp23300 +g15 +aI517 +aI-320 +aI553 +aI-365 +aI537 +aI-340 +aa(lp23301 +g15 +aI440 +aI-272 +aI496 +aI-300 +aI471 +aI-284 +aa(lp23302 +g15 +aI334 +aI-255 +aI410 +aI-261 +aI375 +aI-255 +aa(lp23303 +g15 +aI305 +aI-255 +aI325 +aI-255 +aI315 +aI-255 +aa(lp23304 +g15 +aI282 +aI-258 +aI296 +aI-255 +aI288 +aI-256 +aa(lp23305 +g15 +aI260 +aI-243 +aI275 +aI-253 +aI267 +aI-248 +aa(lp23306 +g15 +aI241 +aI-224 +aI253 +aI-237 +aI247 +aI-231 +aa(lp23307 +g15 +aI226 +aI-201 +aI235 +aI-217 +aI230 +aI-210 +aa(lp23308 +g15 +aI221 +aI-172 +aI223 +aI-192 +aI221 +aI-183 +aa(lp23309 +g15 +aI229 +aI-144 +aI221 +aI-161 +aI223 +aI-151 +aa(lp23310 +g15 +aI250 +aI-127 +aI234 +aI-137 +aI241 +aI-131 +aa(lp23311 +g15 +aI281 +aI-119 +aI259 +aI-123 +aI269 +aI-121 +aa(lp23312 +g15 +aI320 +aI-118 +aI294 +aI-118 +aI306 +aI-118 +aa(lp23313 +g20 +aI434 +aI-118 +aa(lp23314 +g15 +aI537 +aI-102 +aI475 +aI-118 +aI509 +aI-112 +aa(lp23315 +g15 +aI605 +aI-61 +aI564 +aI-92 +aI587 +aI-78 +aa(lp23316 +g15 +aI643 +aI0 +aI622 +aI-44 +aI635 +aI-23 +aa(lp23317 +g15 +aI654 +aI75 +aI651 +aI23 +aI654 +aI48 +aa(lp23318 +g15 +aI633 +aI178 +aI654 +aI113 +aI647 +aI147 +aa(lp23319 +g15 +aI569 +aI255 +aI619 +aI208 +aI598 +aI234 +aa(lp23320 +g15 +aI458 +aI303 +aI539 +aI276 +aI503 +aI292 +aa(lp23321 +g15 +aI301 +aI320 +aI414 +aI315 +aI361 +aI320 +aa(lp23322 +g15 +aI179 +aI307 +aI254 +aI320 +aI214 +aI316 +aa(lp23323 +g15 +aI93 +aI267 +aI144 +aI297 +aI116 +aI284 +aa(lp23324 +g15 +aI41 +aI204 +aI70 +aI250 +aI52 +aI229 +aa(lp23325 +g15 +aI24 +aI121 +aI29 +aI180 +aI24 +aI152 +aa(lp23326 +g15 +aI36 +aI52 +aI24 +aI95 +aI28 +aI72 +aa(lp23327 +g15 +aI70 +aI1 +aI45 +aI33 +aI56 +aI16 +aa(lp23328 +g15 +aI120 +aI-33 +aI85 +aI-12 +aI101 +aI-24 +aa(lp23329 +g15 +aI179 +aI-54 +aI139 +aI-42 +aI159 +aI-49 +aa(lp23330 +g15 +aI134 +aI-93 +aI161 +aI-62 +aI146 +aI-75 +aa(lp23331 +g15 +aI117 +aI-154 +aI123 +aI-111 +aI117 +aI-131 +aa(lp23332 +g15 +aI138 +aI-223 +aI117 +aI-180 +aI124 +aI-203 +aa(lp23333 +g15 +aI203 +aI-279 +aI151 +aI-242 +aI173 +aI-261 +aa(lp23334 +g15 +aI152 +aI-311 +aI185 +aI-287 +aI168 +aI-298 +aa(lp23335 +g15 +aI113 +aI-358 +aI137 +aI-325 +aI124 +aI-341 +aa(lp23336 +g15 +aI88 +aI-416 +aI102 +aI-376 +aI94 +aI-395 +aa(lp23337 +g15 +aI80 +aI-480 +aI83 +aI-437 +aI80 +aI-458 +aa(lp23338 +g15 +aI96 +aI-584 +aI80 +aI-519 +aI85 +aI-553 +aa(lp23339 +g15 +aI144 +aI-661 +aI107 +aI-614 +aI123 +aI-640 +aa(lp23340 +g15 +aI223 +aI-710 +aI165 +aI-682 +aI192 +aI-699 +aa(lp23341 +g15 +aI334 +aI-727 +aI255 +aI-721 +aI292 +aI-727 +aa(lp23342 +g15 +aI384 +aI-723 +aI350 +aI-727 +aI367 +aI-726 +aa(lp23343 +g15 +aI427 +aI-714 +aI401 +aI-721 +aI416 +aI-718 +aa(lp23344 +g10 +aa(lp23345 +g8 +aI136 +aI117 +aa(lp23346 +g15 +aI144 +aI162 +aI136 +aI133 +aI138 +aI148 +aa(lp23347 +g15 +aI172 +aI198 +aI150 +aI176 +aI159 +aI188 +aa(lp23348 +g15 +aI222 +aI222 +aI185 +aI208 +aI201 +aI216 +aa(lp23349 +g15 +aI301 +aI230 +aI244 +aI227 +aI270 +aI230 +aa(lp23350 +g15 +aI482 +aI193 +aI382 +aI230 +aI442 +aI218 +aa(lp23351 +g15 +aI542 +aI85 +aI522 +aI168 +aI542 +aI132 +aa(lp23352 +g15 +aI535 +aI36 +aI542 +aI65 +aI540 +aI49 +aa(lp23353 +g15 +aI509 +aI7 +aI529 +aI24 +aI521 +aI14 +aa(lp23354 +g15 +aI462 +aI-7 +aI497 +aI0 +aI481 +aI-4 +aa(lp23355 +g15 +aI390 +aI-11 +aI442 +aI-9 +aI418 +aI-11 +aa(lp23356 +g20 +aI276 +aI-11 +aa(lp23357 +g15 +aI228 +aI-6 +aI260 +aI-11 +aI245 +aI-9 +aa(lp23358 +g15 +aI183 +aI13 +aI212 +aI-2 +aI196 +aI3 +aa(lp23359 +g15 +aI149 +aI52 +aI169 +aI23 +aI158 +aI36 +aa(lp23360 +g15 +aI136 +aI117 +aI140 +aI69 +aI136 +aI91 +aa(lp23361 +g10 +aa(lp23362 +g8 +aI195 +aI-484 +aa(lp23363 +g15 +aI231 +aI-373 +aI195 +aI-434 +aI207 +aI-397 +aa(lp23364 +g15 +aI330 +aI-336 +aI254 +aI-348 +aI287 +aI-336 +aa(lp23365 +g15 +aI429 +aI-372 +aI374 +aI-336 +aI407 +aI-348 +aa(lp23366 +g15 +aI462 +aI-486 +aI451 +aI-397 +aI462 +aI-434 +aa(lp23367 +g15 +aI428 +aI-604 +aI462 +aI-539 +aI451 +aI-579 +aa(lp23368 +g15 +aI329 +aI-642 +aI405 +aI-629 +aI372 +aI-642 +aa(lp23369 +g15 +aI230 +aI-603 +aI286 +aI-642 +aI253 +aI-629 +aa(lp23370 +g15 +aI195 +aI-484 +aI207 +aI-577 +aI195 +aI-537 +aa(lp23371 +g10 +aa(lp23372 +g8 +aI690 +aI0 +aa(lp23373 +g10 +aa(lp23374 +g8 +aI690 +aI0 +aasVk +(lp23375 +(lp23376 +g8 +aI222 +aI-368 +aa(lp23377 +g20 +aI310 +aI-479 +aa(lp23378 +g20 +aI501 +aI-714 +aa(lp23379 +g20 +aI638 +aI-714 +aa(lp23380 +g20 +aI377 +aI-405 +aa(lp23381 +g20 +aI656 +aI0 +aa(lp23382 +g20 +aI520 +aI0 +aa(lp23383 +g20 +aI301 +aI-327 +aa(lp23384 +g20 +aI230 +aI-274 +aa(lp23385 +g20 +aI230 +aI0 +aa(lp23386 +g20 +aI113 +aI0 +aa(lp23387 +g20 +aI113 +aI-1012 +aa(lp23388 +g20 +aI230 +aI-1012 +aa(lp23389 +g20 +aI230 +aI-547 +aa(lp23390 +g20 +aI220 +aI-368 +aa(lp23391 +g10 +aa(lp23392 +g8 +aI661 +aI0 +aa(lp23393 +g10 +aa(lp23394 +g8 +aI661 +aI0 +aasVo +(lp23395 +(lp23396 +g8 +aI695 +aI-358 +aa(lp23397 +g15 +aI674 +aI-199 +aI695 +aI-298 +aI688 +aI-245 +aa(lp23398 +g15 +aI611 +aI-83 +aI659 +aI-153 +aI638 +aI-114 +aa(lp23399 +g15 +aI513 +aI-11 +aI584 +aI-51 +aI551 +aI-27 +aa(lp23400 +g15 +aI382 +aI13 +aI474 +aI5 +aI430 +aI13 +aa(lp23401 +g15 +aI259 +aI-11 +aI338 +aI13 +aI296 +aI5 +aa(lp23402 +g15 +aI161 +aI-83 +aI221 +aI-27 +aI188 +aI-51 +aa(lp23403 +g15 +aI96 +aI-199 +aI133 +aI-114 +aI112 +aI-153 +aa(lp23404 +g15 +aI73 +aI-358 +aI81 +aI-245 +aI73 +aI-298 +aa(lp23405 +g15 +aI95 +aI-515 +aI73 +aI-417 +aI80 +aI-469 +aa(lp23406 +g15 +aI157 +aI-631 +aI109 +aI-561 +aI130 +aI-599 +aa(lp23407 +g15 +aI256 +aI-702 +aI184 +aI-662 +aI217 +aI-686 +aa(lp23408 +g15 +aI386 +aI-727 +aI295 +aI-719 +aI338 +aI-727 +aa(lp23409 +g15 +aI510 +aI-702 +aI431 +aI-727 +aI472 +aI-719 +aa(lp23410 +g15 +aI608 +aI-631 +aI548 +aI-686 +aI580 +aI-662 +aa(lp23411 +g15 +aI672 +aI-515 +aI635 +aI-599 +aI657 +aI-561 +aa(lp23412 +g15 +aI695 +aI-358 +aI688 +aI-469 +aI695 +aI-417 +aa(lp23413 +g10 +aa(lp23414 +g8 +aI195 +aI-358 +aa(lp23415 +g15 +aI240 +aI-153 +aI195 +aI-267 +aI210 +aI-199 +aa(lp23416 +g15 +aI385 +aI-84 +aI270 +aI-107 +aI318 +aI-84 +aa(lp23417 +g15 +aI529 +aI-153 +aI452 +aI-84 +aI500 +aI-107 +aa(lp23418 +g15 +aI573 +aI-358 +aI558 +aI-199 +aI573 +aI-267 +aa(lp23419 +g15 +aI528 +aI-561 +aI573 +aI-448 +aI558 +aI-516 +aa(lp23420 +g15 +aI384 +aI-629 +aI499 +aI-606 +aI450 +aI-629 +aa(lp23421 +g15 +aI239 +aI-561 +aI317 +aI-629 +aI269 +aI-606 +aa(lp23422 +g15 +aI195 +aI-358 +aI210 +aI-516 +aI195 +aI-448 +aa(lp23423 +g10 +aa(lp23424 +g8 +aI769 +aI0 +aa(lp23425 +g10 +aa(lp23426 +g8 +aI769 +aI0 +aasVs +(lp23427 +(lp23428 +g8 +aI541 +aI-195 +aa(lp23429 +g15 +aI522 +aI-104 +aI541 +aI-160 +aI534 +aI-130 +aa(lp23430 +g15 +aI467 +aI-38 +aI509 +aI-78 +aI491 +aI-56 +aa(lp23431 +g15 +aI382 +aI0 +aI444 +aI-21 +aI415 +aI-8 +aa(lp23432 +g15 +aI269 +aI13 +aI348 +aI9 +aI311 +aI13 +aa(lp23433 +g15 +aI147 +aI2 +aI222 +aI13 +aI181 +aI9 +aa(lp23434 +g15 +aI58 +aI-31 +aI113 +aI-5 +aI84 +aI-16 +aa(lp23435 +g20 +aI58 +aI-139 +aa(lp23436 +g15 +aI103 +aI-119 +aI72 +aI-132 +aI87 +aI-125 +aa(lp23437 +g15 +aI155 +aI-101 +aI120 +aI-112 +aI137 +aI-106 +aa(lp23438 +g15 +aI211 +aI-88 +aI173 +aI-95 +aI192 +aI-91 +aa(lp23439 +g15 +aI269 +aI-83 +aI231 +aI-85 +aI250 +aI-83 +aa(lp23440 +g15 +aI341 +aI-90 +aI297 +aI-83 +aI321 +aI-85 +aa(lp23441 +g15 +aI389 +aI-111 +aI361 +aI-95 +aI377 +aI-102 +aa(lp23442 +g15 +aI416 +aI-143 +aI402 +aI-120 +aI411 +aI-130 +aa(lp23443 +g15 +aI425 +aI-186 +aI422 +aI-156 +aI425 +aI-170 +aa(lp23444 +g15 +aI418 +aI-222 +aI425 +aI-199 +aI422 +aI-212 +aa(lp23445 +g15 +aI394 +aI-255 +aI414 +aI-233 +aI406 +aI-244 +aa(lp23446 +g15 +aI347 +aI-287 +aI383 +aI-265 +aI367 +aI-276 +aa(lp23447 +g15 +aI270 +aI-323 +aI327 +aI-298 +aI302 +aI-310 +aa(lp23448 +g15 +aI186 +aI-363 +aI239 +aI-337 +aI211 +aI-350 +aa(lp23449 +g15 +aI123 +aI-407 +aI161 +aI-376 +aI140 +aI-391 +aa(lp23450 +g15 +aI83 +aI-462 +aI105 +aI-423 +aI92 +aI-441 +aa(lp23451 +g15 +aI69 +aI-537 +aI73 +aI-483 +aI69 +aI-508 +aa(lp23452 +g15 +aI86 +aI-619 +aI69 +aI-568 +aI74 +aI-595 +aa(lp23453 +g15 +aI137 +aI-678 +aI98 +aI-642 +aI115 +aI-662 +aa(lp23454 +g15 +aI215 +aI-715 +aI159 +aI-694 +aI185 +aI-706 +aa(lp23455 +g15 +aI317 +aI-727 +aI245 +aI-723 +aI279 +aI-727 +aa(lp23456 +g15 +aI432 +aI-713 +aI359 +aI-727 +aI397 +aI-722 +aa(lp23457 +g15 +aI531 +aI-677 +aI467 +aI-704 +aI500 +aI-692 +aa(lp23458 +g20 +aI490 +aI-582 +aa(lp23459 +g15 +aI403 +aI-615 +aI462 +aI-594 +aI433 +aI-605 +aa(lp23460 +g15 +aI313 +aI-629 +aI374 +aI-624 +aI343 +aI-629 +aa(lp23461 +g15 +aI214 +aI-607 +aI268 +aI-629 +aI236 +aI-621 +aa(lp23462 +g15 +aI182 +aI-545 +aI193 +aI-592 +aI182 +aI-572 +aa(lp23463 +g15 +aI190 +aI-505 +aI182 +aI-529 +aI185 +aI-516 +aa(lp23464 +g15 +aI216 +aI-473 +aI195 +aI-494 +aI203 +aI-483 +aa(lp23465 +g15 +aI264 +aI-443 +aI228 +aI-463 +aI244 +aI-453 +aa(lp23466 +g15 +aI341 +aI-409 +aI285 +aI-433 +aI310 +aI-421 +aa(lp23467 +g15 +aI424 +aI-369 +aI372 +aI-396 +aI400 +aI-383 +aa(lp23468 +g15 +aI487 +aI-326 +aI449 +aI-356 +aI470 +aI-342 +aa(lp23469 +g15 +aI527 +aI-270 +aI504 +aI-309 +aI518 +aI-291 +aa(lp23470 +g15 +aI541 +aI-195 +aI536 +aI-249 +aI541 +aI-224 +aa(lp23471 +g10 +aa(lp23472 +g8 +aI601 +aI0 +aa(lp23473 +g10 +aa(lp23474 +g8 +aI601 +aI0 +aasVw +(lp23475 +(lp23476 +g8 +aI656 +aI0 +aa(lp23477 +g20 +aI546 +aI-400 +aa(lp23478 +g15 +aI540 +aI-426 +aI545 +aI-408 +aI542 +aI-417 +aa(lp23479 +g15 +aI532 +aI-457 +aI537 +aI-436 +aI535 +aI-447 +aa(lp23480 +g15 +aI524 +aI-491 +aI529 +aI-468 +aI527 +aI-479 +aa(lp23481 +g15 +aI516 +aI-524 +aI521 +aI-502 +aI518 +aI-513 +aa(lp23482 +g15 +aI497 +aI-602 +aI510 +aI-549 +aI503 +aI-575 +aa(lp23483 +g20 +aI493 +aI-602 +aa(lp23484 +g15 +aI475 +aI-523 +aI487 +aI-575 +aI481 +aI-548 +aa(lp23485 +g15 +aI460 +aI-456 +aI471 +aI-501 +aI466 +aI-479 +aa(lp23486 +g15 +aI445 +aI-397 +aI455 +aI-433 +aI450 +aI-414 +aa(lp23487 +g20 +aI333 +aI0 +aa(lp23488 +g20 +aI195 +aI0 +aa(lp23489 +g20 +aI13 +aI-714 +aa(lp23490 +g20 +aI137 +aI-714 +aa(lp23491 +g20 +aI222 +aI-334 +aa(lp23492 +g15 +aI235 +aI-270 +aI226 +aI-314 +aI231 +aI-293 +aa(lp23493 +g15 +aI248 +aI-202 +aI240 +aI-247 +aI244 +aI-225 +aa(lp23494 +g15 +aI258 +aI-139 +aI251 +aI-180 +aI255 +aI-159 +aa(lp23495 +g15 +aI265 +aI-91 +aI261 +aI-120 +aI263 +aI-103 +aa(lp23496 +g20 +aI269 +aI-91 +aa(lp23497 +g15 +aI278 +aI-136 +aI271 +aI-102 +aI274 +aI-117 +aa(lp23498 +g15 +aI290 +aI-196 +aI282 +aI-155 +aI286 +aI-175 +aa(lp23499 +g15 +aI304 +aI-258 +aI295 +aI-217 +aI299 +aI-238 +aa(lp23500 +g15 +aI318 +aI-311 +aI309 +aI-279 +aI314 +aI-297 +aa(lp23501 +g20 +aI434 +aI-714 +aa(lp23502 +g20 +aI562 +aI-714 +aa(lp23503 +g20 +aI674 +aI-311 +aa(lp23504 +g15 +aI687 +aI-259 +aI678 +aI-296 +aI682 +aI-279 +aa(lp23505 +g15 +aI702 +aI-198 +aI692 +aI-239 +aI697 +aI-219 +aa(lp23506 +g15 +aI715 +aI-138 +aI707 +aI-177 +aI711 +aI-157 +aa(lp23507 +g15 +aI723 +aI-91 +aI719 +aI-119 +aI722 +aI-103 +aa(lp23508 +g20 +aI727 +aI-91 +aa(lp23509 +g15 +aI734 +aI-136 +aI729 +aI-102 +aI731 +aI-117 +aa(lp23510 +g15 +aI744 +aI-198 +aI736 +aI-155 +aI740 +aI-176 +aa(lp23511 +g15 +aI756 +aI-268 +aI748 +aI-221 +aI752 +aI-244 +aa(lp23512 +g15 +aI770 +aI-334 +aI761 +aI-291 +aI766 +aI-313 +aa(lp23513 +g20 +aI860 +aI-714 +aa(lp23514 +g20 +aI981 +aI-714 +aa(lp23515 +g20 +aI796 +aI0 +aa(lp23516 +g10 +aa(lp23517 +g8 +aI994 +aI0 +aa(lp23518 +g10 +aa(lp23519 +g8 +aI994 +aI0 +aasV{ +(lp23520 +(lp23521 +g8 +aI325 +aI10 +aa(lp23522 +g15 +aI333 +aI61 +aI325 +aI31 +aI328 +aI48 +aa(lp23523 +g15 +aI355 +aI93 +aI338 +aI75 +aI346 +aI85 +aa(lp23524 +g15 +aI391 +aI108 +aI365 +aI100 +aI377 +aI106 +aa(lp23525 +g15 +aI438 +aI113 +aI405 +aI111 +aI421 +aI113 +aa(lp23526 +g20 +aI438 +aI211 +aa(lp23527 +g15 +aI346 +aI199 +aI405 +aI210 +aI374 +aI207 +aa(lp23528 +g15 +aI272 +aI166 +aI317 +aI192 +aI293 +aI181 +aa(lp23529 +g15 +aI223 +aI107 +aI251 +aI150 +aI235 +aI131 +aa(lp23530 +g15 +aI206 +aI20 +aI212 +aI83 +aI206 +aI54 +aa(lp23531 +g20 +aI206 +aI-196 +aa(lp23532 +g15 +aI163 +aI-291 +aI206 +aI-241 +aI192 +aI-273 +aa(lp23533 +g15 +aI39 +aI-319 +aI135 +aI-310 +aI93 +aI-319 +aa(lp23534 +g20 +aI39 +aI-420 +aa(lp23535 +g15 +aI163 +aI-448 +aI93 +aI-420 +aI135 +aI-430 +aa(lp23536 +g15 +aI206 +aI-543 +aI192 +aI-467 +aI206 +aI-499 +aa(lp23537 +g20 +aI206 +aI-760 +aa(lp23538 +g15 +aI223 +aI-847 +aI206 +aI-794 +aI212 +aI-823 +aa(lp23539 +g15 +aI272 +aI-906 +aI235 +aI-871 +aI251 +aI-890 +aa(lp23540 +g15 +aI346 +aI-939 +aI293 +aI-921 +aI317 +aI-932 +aa(lp23541 +g15 +aI438 +aI-951 +aI374 +aI-947 +aI405 +aI-950 +aa(lp23542 +g20 +aI438 +aI-854 +aa(lp23543 +g15 +aI391 +aI-849 +aI421 +aI-853 +aI405 +aI-852 +aa(lp23544 +g15 +aI355 +aI-833 +aI377 +aI-846 +aI365 +aI-841 +aa(lp23545 +g15 +aI333 +aI-802 +aI346 +aI-826 +aI338 +aI-815 +aa(lp23546 +g15 +aI325 +aI-751 +aI328 +aI-789 +aI325 +aI-772 +aa(lp23547 +g20 +aI325 +aI-535 +aa(lp23548 +g15 +aI286 +aI-426 +aI325 +aI-489 +aI312 +aI-453 +aa(lp23549 +g15 +aI173 +aI-373 +aI260 +aI-400 +aI223 +aI-382 +aa(lp23550 +g20 +aI173 +aI-366 +aa(lp23551 +g15 +aI286 +aI-313 +aI223 +aI-357 +aI260 +aI-339 +aa(lp23552 +g15 +aI325 +aI-204 +aI312 +aI-286 +aI325 +aI-250 +aa(lp23553 +g10 +aa(lp23554 +g8 +aI472 +aI0 +aa(lp23555 +g10 +aa(lp23556 +g8 +aI472 +aI0 +aasV" +(lp23557 +(lp23558 +g8 +aI214 +aI-951 +aa(lp23559 +g20 +aI188 +aI-607 +aa(lp23560 +g20 +aI113 +aI-607 +aa(lp23561 +g20 +aI86 +aI-951 +aa(lp23562 +g10 +aa(lp23563 +g8 +aI449 +aI-951 +aa(lp23564 +g20 +aI422 +aI-607 +aa(lp23565 +g20 +aI348 +aI-607 +aa(lp23566 +g20 +aI321 +aI-951 +aa(lp23567 +g10 +aa(lp23568 +g8 +aI535 +aI0 +aa(lp23569 +g10 +aa(lp23570 +g8 +aI535 +aI0 +aasV& +(lp23571 +(lp23572 +g8 +aI274 +aI-758 +aa(lp23573 +g15 +aI279 +aI-714 +aI274 +aI-743 +aI276 +aI-728 +aa(lp23574 +g15 +aI295 +aI-672 +aI283 +aI-700 +aI288 +aI-686 +aa(lp23575 +g15 +aI323 +aI-629 +aI303 +aI-658 +aI312 +aI-643 +aa(lp23576 +g15 +aI363 +aI-583 +aI334 +aI-614 +aI348 +aI-599 +aa(lp23577 +g15 +aI430 +aI-626 +aI389 +aI-598 +aI411 +aI-613 +aa(lp23578 +g15 +aI476 +aI-667 +aI449 +aI-639 +aI464 +aI-653 +aa(lp23579 +g15 +aI503 +aI-711 +aI488 +aI-681 +aI497 +aI-695 +aa(lp23580 +g15 +aI513 +aI-760 +aI509 +aI-726 +aI513 +aI-742 +aa(lp23581 +g15 +aI504 +aI-803 +aI513 +aI-776 +aI510 +aI-790 +aa(lp23582 +g15 +aI481 +aI-838 +aI499 +aI-817 +aI491 +aI-828 +aa(lp23583 +g15 +aI444 +aI-860 +aI471 +aI-847 +aI458 +aI-855 +aa(lp23584 +g15 +aI395 +aI-868 +aI430 +aI-865 +aI414 +aI-868 +aa(lp23585 +g15 +aI307 +aI-839 +aI358 +aI-868 +aI328 +aI-859 +aa(lp23586 +g15 +aI274 +aI-758 +aI285 +aI-820 +aI274 +aI-793 +aa(lp23587 +g10 +aa(lp23588 +g8 +aI362 +aI-91 +aa(lp23589 +g15 +aI432 +aI-98 +aI387 +aI-91 +aI411 +aI-93 +aa(lp23590 +g15 +aI491 +aI-119 +aI453 +aI-103 +aI473 +aI-110 +aa(lp23591 +g15 +aI542 +aI-149 +aI509 +aI-128 +aI526 +aI-138 +aa(lp23592 +g15 +aI586 +aI-187 +aI557 +aI-161 +aI572 +aI-174 +aa(lp23593 +g20 +aI334 +aI-452 +aa(lp23594 +g15 +aI274 +aI-410 +aI312 +aI-438 +aI292 +aI-424 +aa(lp23595 +g15 +aI230 +aI-366 +aI257 +aI-397 +aI242 +aI-382 +aa(lp23596 +g15 +aI203 +aI-315 +aI218 +aI-351 +aI209 +aI-334 +aa(lp23597 +g15 +aI194 +aI-251 +aI197 +aI-297 +aI194 +aI-275 +aa(lp23598 +g15 +aI206 +aI-186 +aI194 +aI-228 +aI198 +aI-206 +aa(lp23599 +g15 +aI238 +aI-135 +aI213 +aI-166 +aI224 +aI-150 +aa(lp23600 +g15 +aI291 +aI-103 +aI253 +aI-121 +aI270 +aI-110 +aa(lp23601 +g15 +aI362 +aI-91 +aI312 +aI-95 +aI336 +aI-91 +aa(lp23602 +g10 +aa(lp23603 +g8 +aI70 +aI-247 +aa(lp23604 +g15 +aI83 +aI-338 +aI70 +aI-281 +aI75 +aI-311 +aa(lp23605 +g15 +aI122 +aI-410 +aI92 +aI-364 +aI105 +aI-388 +aa(lp23606 +g15 +aI183 +aI-470 +aI138 +aI-432 +aI159 +aI-452 +aa(lp23607 +g15 +aI265 +aI-526 +aI207 +aI-489 +aI234 +aI-508 +aa(lp23608 +g15 +aI225 +aI-574 +aI252 +aI-541 +aI238 +aI-558 +aa(lp23609 +g15 +aI191 +aI-628 +aI212 +aI-591 +aI201 +aI-609 +aa(lp23610 +g15 +aI167 +aI-688 +aI181 +aI-647 +aI174 +aI-667 +aa(lp23611 +g15 +aI158 +aI-758 +aI161 +aI-710 +aI158 +aI-733 +aa(lp23612 +g15 +aI175 +aI-845 +aI158 +aI-790 +aI164 +aI-819 +aa(lp23613 +g15 +aI222 +aI-911 +aI185 +aI-871 +aI201 +aI-893 +aa(lp23614 +g15 +aI297 +aI-952 +aI242 +aI-929 +aI267 +aI-943 +aa(lp23615 +g15 +aI399 +aI-966 +aI327 +aI-961 +aI361 +aI-966 +aa(lp23616 +g15 +aI496 +aI-952 +aI435 +aI-966 +aI467 +aI-961 +aa(lp23617 +g15 +aI568 +aI-911 +aI524 +aI-943 +aI548 +aI-929 +aa(lp23618 +g15 +aI613 +aI-845 +aI588 +aI-893 +aI603 +aI-871 +aa(lp23619 +g15 +aI629 +aI-758 +aI624 +aI-819 +aI629 +aI-790 +aa(lp23620 +g15 +aI613 +aI-680 +aI629 +aI-730 +aI624 +aI-704 +aa(lp23621 +g15 +aI569 +aI-615 +aI602 +aI-657 +aI587 +aI-635 +aa(lp23622 +g15 +aI506 +aI-559 +aI551 +aI-594 +aI530 +aI-576 +aa(lp23623 +g15 +aI432 +aI-509 +aI483 +aI-541 +aI458 +aI-525 +aa(lp23624 +g20 +aI661 +aI-267 +aa(lp23625 +g15 +aI693 +aI-306 +aI673 +aI-280 +aI683 +aI-293 +aa(lp23626 +g15 +aI718 +aI-347 +aI702 +aI-319 +aI710 +aI-333 +aa(lp23627 +g15 +aI737 +aI-395 +aI725 +aI-362 +aI732 +aI-378 +aa(lp23628 +g15 +aI753 +aI-451 +aI743 +aI-412 +aI748 +aI-430 +aa(lp23629 +g20 +aI873 +aI-451 +aa(lp23630 +g15 +aI849 +aI-372 +aI866 +aI-422 +aI858 +aI-396 +aa(lp23631 +g15 +aI819 +aI-304 +aI841 +aI-348 +aI830 +aI-325 +aa(lp23632 +g15 +aI780 +aI-244 +aI807 +aI-282 +aI795 +aI-263 +aa(lp23633 +g15 +aI734 +aI-190 +aI766 +aI-226 +aI751 +aI-208 +aa(lp23634 +g20 +aI914 +aI0 +aa(lp23635 +g20 +aI768 +aI0 +aa(lp23636 +g20 +aI658 +aI-111 +aa(lp23637 +g15 +aI595 +aI-59 +aI637 +aI-91 +aI616 +aI-74 +aa(lp23638 +g15 +aI529 +aI-20 +aI574 +aI-43 +aI552 +aI-30 +aa(lp23639 +g15 +aI453 +aI4 +aI505 +aI-9 +aI480 +aI-1 +aa(lp23640 +g15 +aI362 +aI13 +aI426 +aI10 +aI396 +aI13 +aa(lp23641 +g15 +aI239 +aI-3 +aI317 +aI13 +aI276 +aI7 +aa(lp23642 +g15 +aI148 +aI-54 +aI203 +aI-15 +aI173 +aI-32 +aa(lp23643 +g15 +aI90 +aI-136 +aI123 +aI-76 +aI104 +aI-104 +aa(lp23644 +g15 +aI70 +aI-247 +aI77 +aI-168 +aI70 +aI-205 +aa(lp23645 +g10 +aa(lp23646 +g8 +aI936 +aI0 +aa(lp23647 +g10 +aa(lp23648 +g8 +aI936 +aI0 +aasV* +(lp23649 +(lp23650 +g8 +aI432 +aI-1012 +aa(lp23651 +g20 +aI404 +aI-756 +aa(lp23652 +g20 +aI662 +aI-828 +aa(lp23653 +g20 +aI679 +aI-703 +aa(lp23654 +g20 +aI433 +aI-685 +aa(lp23655 +g20 +aI593 +aI-472 +aa(lp23656 +g20 +aI477 +aI-410 +aa(lp23657 +g20 +aI362 +aI-643 +aa(lp23658 +g20 +aI259 +aI-410 +aa(lp23659 +g20 +aI139 +aI-472 +aa(lp23660 +g20 +aI297 +aI-685 +aa(lp23661 +g20 +aI53 +aI-703 +aa(lp23662 +g20 +aI72 +aI-828 +aa(lp23663 +g20 +aI326 +aI-756 +aa(lp23664 +g20 +aI298 +aI-1012 +aa(lp23665 +g10 +aa(lp23666 +g8 +aI734 +aI0 +aa(lp23667 +g10 +aa(lp23668 +g8 +aI734 +aI0 +aasV. +(lp23669 +(lp23670 +g8 +aI95 +aI-71 +aa(lp23671 +g15 +aI102 +aI-113 +aI95 +aI-88 +aI97 +aI-102 +aa(lp23672 +g15 +aI119 +aI-141 +aI106 +aI-125 +aI112 +aI-134 +aa(lp23673 +g15 +aI145 +aI-157 +aI127 +aI-148 +aI135 +aI-154 +aa(lp23674 +g15 +aI178 +aI-162 +aI155 +aI-160 +aI166 +aI-162 +aa(lp23675 +g15 +aI210 +aI-157 +aI189 +aI-162 +aI200 +aI-160 +aa(lp23676 +g15 +aI236 +aI-141 +aI220 +aI-154 +aI229 +aI-148 +aa(lp23677 +g15 +aI254 +aI-113 +aI244 +aI-134 +aI250 +aI-125 +aa(lp23678 +g15 +aI261 +aI-71 +aI258 +aI-102 +aI261 +aI-88 +aa(lp23679 +g15 +aI254 +aI-30 +aI261 +aI-55 +aI258 +aI-41 +aa(lp23680 +g15 +aI236 +aI-2 +aI250 +aI-18 +aI244 +aI-9 +aa(lp23681 +g15 +aI210 +aI14 +aI229 +aI5 +aI220 +aI10 +aa(lp23682 +g15 +aI178 +aI19 +aI200 +aI17 +aI189 +aI19 +aa(lp23683 +g15 +aI145 +aI14 +aI166 +aI19 +aI155 +aI17 +aa(lp23684 +g15 +aI119 +aI-2 +aI135 +aI10 +aI127 +aI5 +aa(lp23685 +g15 +aI102 +aI-30 +aI112 +aI-9 +aI106 +aI-18 +aa(lp23686 +g15 +aI95 +aI-71 +aI97 +aI-41 +aI95 +aI-55 +aa(lp23687 +g10 +aa(lp23688 +g8 +aI357 +aI0 +aa(lp23689 +g10 +aa(lp23690 +g8 +aI357 +aI0 +aasV2 +(lp23691 +(lp23692 +g8 +aI656 +aI0 +aa(lp23693 +g20 +aI62 +aI0 +aa(lp23694 +g20 +aI62 +aI-101 +aa(lp23695 +g20 +aI290 +aI-349 +aa(lp23696 +g15 +aI377 +aI-445 +aI322 +aI-384 +aI351 +aI-416 +aa(lp23697 +g15 +aI443 +aI-530 +aI403 +aI-474 +aI425 +aI-503 +aa(lp23698 +g15 +aI484 +aI-614 +aI461 +aI-558 +aI474 +aI-586 +aa(lp23699 +g15 +aI498 +aI-705 +aI493 +aI-642 +aI498 +aI-672 +aa(lp23700 +g15 +aI487 +aI-773 +aI498 +aI-731 +aI495 +aI-754 +aa(lp23701 +g15 +aI456 +aI-823 +aI480 +aI-793 +aI469 +aI-809 +aa(lp23702 +g15 +aI407 +aI-854 +aI442 +aI-837 +aI426 +aI-847 +aa(lp23703 +g15 +aI345 +aI-864 +aI388 +aI-861 +aI368 +aI-864 +aa(lp23704 +g15 +aI233 +aI-839 +aI303 +aI-864 +aI266 +aI-856 +aa(lp23705 +g15 +aI138 +aI-775 +aI200 +aI-823 +aI168 +aI-801 +aa(lp23706 +g20 +aI72 +aI-853 +aa(lp23707 +g15 +aI128 +aI-897 +aI89 +aI-868 +aI108 +aI-883 +aa(lp23708 +g15 +aI192 +aI-932 +aI148 +aI-910 +aI169 +aI-922 +aa(lp23709 +g15 +aI265 +aI-956 +aI215 +aI-942 +aI240 +aI-950 +aa(lp23710 +g15 +aI346 +aI-965 +aI291 +aI-962 +aI318 +aI-965 +aa(lp23711 +g15 +aI459 +aI-947 +aI388 +aI-965 +aI425 +aI-959 +aa(lp23712 +g15 +aI544 +aI-897 +aI492 +aI-935 +aI521 +aI-918 +aa(lp23713 +g15 +aI599 +aI-816 +aI568 +aI-875 +aI586 +aI-848 +aa(lp23714 +g15 +aI618 +aI-710 +aI612 +aI-785 +aI618 +aI-749 +aa(lp23715 +g15 +aI601 +aI-605 +aI618 +aI-673 +aI612 +aI-638 +aa(lp23716 +g15 +aI553 +aI-506 +aI589 +aI-571 +aI573 +aI-538 +aa(lp23717 +g15 +aI481 +aI-409 +aI533 +aI-474 +aI509 +aI-441 +aa(lp23718 +g15 +aI390 +aI-307 +aI453 +aI-376 +aI423 +aI-342 +aa(lp23719 +g20 +aI207 +aI-112 +aa(lp23720 +g20 +aI207 +aI-107 +aa(lp23721 +g20 +aI656 +aI-107 +aa(lp23722 +g10 +aa(lp23723 +g8 +aI734 +aI0 +aa(lp23724 +g10 +aa(lp23725 +g8 +aI734 +aI0 +aasV6 +(lp23726 +(lp23727 +g8 +aI73 +aI-406 +aa(lp23728 +g15 +aI80 +aI-542 +aI73 +aI-452 +aI75 +aI-497 +aa(lp23729 +g15 +aI104 +aI-672 +aI84 +aI-587 +aI92 +aI-630 +aa(lp23730 +g15 +aI151 +aI-787 +aI115 +aI-713 +aI131 +aI-752 +aa(lp23731 +g15 +aI227 +aI-880 +aI171 +aI-823 +aI197 +aI-854 +aa(lp23732 +g15 +aI338 +aI-942 +aI258 +aI-906 +aI295 +aI-927 +aa(lp23733 +g15 +aI489 +aI-965 +aI381 +aI-957 +aI431 +aI-965 +aa(lp23734 +g15 +aI516 +aI-964 +aI497 +aI-965 +aI506 +aI-964 +aa(lp23735 +g15 +aI547 +aI-962 +aI526 +aI-963 +aI537 +aI-963 +aa(lp23736 +g15 +aI576 +aI-958 +aI557 +aI-961 +aI567 +aI-959 +aa(lp23737 +g15 +aI601 +aI-952 +aI585 +aI-956 +aI594 +aI-954 +aa(lp23738 +g20 +aI601 +aI-851 +aa(lp23739 +g15 +aI550 +aI-863 +aI586 +aI-856 +aI569 +aI-860 +aa(lp23740 +g15 +aI493 +aI-867 +aI531 +aI-866 +aI512 +aI-867 +aa(lp23741 +g15 +aI390 +aI-853 +aI454 +aI-867 +aI420 +aI-862 +aa(lp23742 +g15 +aI313 +aI-814 +aI360 +aI-844 +aI334 +aI-830 +aa(lp23743 +g15 +aI258 +aI-753 +aI291 +aI-797 +aI273 +aI-776 +aa(lp23744 +g15 +aI223 +aI-675 +aI244 +aI-730 +aI232 +aI-704 +aa(lp23745 +g15 +aI203 +aI-584 +aI214 +aI-647 +aI207 +aI-616 +aa(lp23746 +g15 +aI194 +aI-484 +aI198 +aI-552 +aI195 +aI-519 +aa(lp23747 +g20 +aI202 +aI-484 +aa(lp23748 +g15 +aI234 +aI-528 +aI211 +aI-500 +aI221 +aI-514 +aa(lp23749 +g15 +aI277 +aI-563 +aI246 +aI-542 +aI260 +aI-553 +aa(lp23750 +g15 +aI333 +aI-586 +aI293 +aI-573 +aI312 +aI-581 +aa(lp23751 +g15 +aI402 +aI-595 +aI353 +aI-592 +aI376 +aI-595 +aa(lp23752 +g15 +aI514 +aI-576 +aI443 +aI-595 +aI480 +aI-588 +aa(lp23753 +g15 +aI599 +aI-519 +aI547 +aI-563 +aI576 +aI-544 +aa(lp23754 +g15 +aI653 +aI-428 +aI623 +aI-494 +aI641 +aI-464 +aa(lp23755 +g15 +aI673 +aI-306 +aI666 +aI-393 +aI673 +aI-352 +aa(lp23756 +g15 +aI652 +aI-172 +aI673 +aI-256 +aI666 +aI-212 +aa(lp23757 +g15 +aI595 +aI-72 +aI639 +aI-133 +aI620 +aI-99 +aa(lp23758 +g15 +aI503 +aI-8 +aI569 +aI-44 +aI539 +aI-23 +aa(lp23759 +g15 +aI384 +aI13 +aI468 +aI6 +aI428 +aI13 +aa(lp23760 +g15 +aI262 +aI-11 +aI340 +aI13 +aI300 +aI5 +aa(lp23761 +g15 +aI163 +aI-89 +aI224 +aI-28 +aI191 +aI-54 +aa(lp23762 +g15 +aI97 +aI-220 +aI135 +aI-124 +aI113 +aI-167 +aa(lp23763 +g15 +aI73 +aI-406 +aI81 +aI-272 +aI73 +aI-334 +aa(lp23764 +g10 +aa(lp23765 +g8 +aI382 +aI-86 +aa(lp23766 +g15 +aI454 +aI-99 +aI408 +aI-86 +aI432 +aI-90 +aa(lp23767 +g15 +aI509 +aI-139 +aI475 +aI-108 +aI494 +aI-121 +aa(lp23768 +g15 +aI545 +aI-208 +aI525 +aI-157 +aI537 +aI-180 +aa(lp23769 +g15 +aI558 +aI-306 +aI554 +aI-235 +aI558 +aI-268 +aa(lp23770 +g15 +aI547 +aI-387 +aI558 +aI-336 +aI555 +aI-363 +aa(lp23771 +g15 +aI515 +aI-449 +aI540 +aI-411 +aI529 +aI-432 +aa(lp23772 +g15 +aI461 +aI-488 +aI501 +aI-466 +aI483 +aI-479 +aa(lp23773 +g15 +aI386 +aI-502 +aI440 +aI-497 +aI415 +aI-502 +aa(lp23774 +g15 +aI306 +aI-486 +aI357 +aI-502 +aI331 +aI-497 +aa(lp23775 +g15 +aI245 +aI-447 +aI282 +aI-476 +aI262 +aI-463 +aa(lp23776 +g15 +aI206 +aI-391 +aI228 +aI-430 +aI215 +aI-412 +aa(lp23777 +g15 +aI192 +aI-328 +aI196 +aI-370 +aI192 +aI-349 +aa(lp23778 +g15 +aI204 +aI-242 +aI192 +aI-299 +aI196 +aI-270 +aa(lp23779 +g15 +aI239 +aI-164 +aI212 +aI-213 +aI224 +aI-187 +aa(lp23780 +g15 +aI299 +aI-107 +aI255 +aI-141 +aI275 +aI-122 +aa(lp23781 +g15 +aI382 +aI-86 +aI323 +aI-93 +aI351 +aI-86 +aa(lp23782 +g10 +aa(lp23783 +g8 +aI734 +aI0 +aa(lp23784 +g10 +aa(lp23785 +g8 +aI734 +aI0 +aasV: +(lp23786 +(lp23787 +g8 +aI95 +aI-71 +aa(lp23788 +g15 +aI102 +aI-113 +aI95 +aI-88 +aI97 +aI-102 +aa(lp23789 +g15 +aI119 +aI-141 +aI106 +aI-125 +aI112 +aI-134 +aa(lp23790 +g15 +aI145 +aI-157 +aI127 +aI-148 +aI135 +aI-154 +aa(lp23791 +g15 +aI178 +aI-162 +aI155 +aI-160 +aI166 +aI-162 +aa(lp23792 +g15 +aI210 +aI-157 +aI189 +aI-162 +aI200 +aI-160 +aa(lp23793 +g15 +aI236 +aI-141 +aI220 +aI-154 +aI229 +aI-148 +aa(lp23794 +g15 +aI254 +aI-113 +aI244 +aI-134 +aI250 +aI-125 +aa(lp23795 +g15 +aI261 +aI-71 +aI258 +aI-102 +aI261 +aI-88 +aa(lp23796 +g15 +aI254 +aI-30 +aI261 +aI-55 +aI258 +aI-41 +aa(lp23797 +g15 +aI236 +aI-2 +aI250 +aI-18 +aI244 +aI-9 +aa(lp23798 +g15 +aI210 +aI14 +aI229 +aI5 +aI220 +aI10 +aa(lp23799 +g15 +aI178 +aI19 +aI200 +aI17 +aI189 +aI19 +aa(lp23800 +g15 +aI145 +aI14 +aI166 +aI19 +aI155 +aI17 +aa(lp23801 +g15 +aI119 +aI-2 +aI135 +aI10 +aI127 +aI5 +aa(lp23802 +g15 +aI102 +aI-30 +aI112 +aI-9 +aI106 +aI-18 +aa(lp23803 +g15 +aI95 +aI-71 +aI97 +aI-41 +aI95 +aI-55 +aa(lp23804 +g10 +aa(lp23805 +g8 +aI95 +aI-642 +aa(lp23806 +g15 +aI102 +aI-684 +aI95 +aI-659 +aI97 +aI-673 +aa(lp23807 +g15 +aI119 +aI-712 +aI106 +aI-696 +aI112 +aI-705 +aa(lp23808 +g15 +aI145 +aI-728 +aI127 +aI-719 +aI135 +aI-725 +aa(lp23809 +g15 +aI178 +aI-732 +aI155 +aI-731 +aI166 +aI-732 +aa(lp23810 +g15 +aI210 +aI-728 +aI189 +aI-732 +aI200 +aI-731 +aa(lp23811 +g15 +aI236 +aI-712 +aI220 +aI-725 +aI229 +aI-719 +aa(lp23812 +g15 +aI254 +aI-684 +aI244 +aI-705 +aI250 +aI-696 +aa(lp23813 +g15 +aI261 +aI-642 +aI258 +aI-673 +aI261 +aI-659 +aa(lp23814 +g15 +aI254 +aI-601 +aI261 +aI-626 +aI258 +aI-612 +aa(lp23815 +g15 +aI236 +aI-573 +aI250 +aI-589 +aI244 +aI-580 +aa(lp23816 +g15 +aI210 +aI-556 +aI229 +aI-565 +aI220 +aI-560 +aa(lp23817 +g15 +aI178 +aI-551 +aI200 +aI-553 +aI189 +aI-551 +aa(lp23818 +g15 +aI145 +aI-556 +aI166 +aI-551 +aI155 +aI-553 +aa(lp23819 +g15 +aI119 +aI-573 +aI135 +aI-560 +aI127 +aI-565 +aa(lp23820 +g15 +aI102 +aI-601 +aI112 +aI-580 +aI106 +aI-589 +aa(lp23821 +g15 +aI95 +aI-642 +aI97 +aI-612 +aI95 +aI-626 +aa(lp23822 +g10 +aa(lp23823 +g8 +aI357 +aI0 +aa(lp23824 +g10 +aa(lp23825 +g8 +aI357 +aI0 +aasV> +(lp23826 +(lp23827 +g8 +aI66 +aI-259 +aa(lp23828 +g20 +aI545 +aI-468 +aa(lp23829 +g20 +aI66 +aI-705 +aa(lp23830 +g20 +aI66 +aI-810 +aa(lp23831 +g20 +aI667 +aI-496 +aa(lp23832 +g20 +aI667 +aI-430 +aa(lp23833 +g20 +aI66 +aI-154 +aa(lp23834 +g10 +aa(lp23835 +g8 +aI734 +aI0 +aa(lp23836 +g10 +aa(lp23837 +g8 +aI734 +aI0 +aasVB +(lp23838 +(lp23839 +g8 +aI129 +aI-951 +aa(lp23840 +g20 +aI389 +aI-951 +aa(lp23841 +g15 +aI536 +aI-938 +aI444 +aI-951 +aI493 +aI-947 +aa(lp23842 +g15 +aI642 +aI-897 +aI578 +aI-930 +aI613 +aI-916 +aa(lp23843 +g15 +aI706 +aI-823 +aI670 +aI-878 +aI692 +aI-854 +aa(lp23844 +g15 +aI727 +aI-710 +aI720 +aI-792 +aI727 +aI-755 +aa(lp23845 +g15 +aI715 +aI-634 +aI727 +aI-683 +aI723 +aI-658 +aa(lp23846 +g15 +aI678 +aI-573 +aI706 +aI-611 +aI694 +aI-590 +aa(lp23847 +g15 +aI618 +aI-528 +aI662 +aI-555 +aI642 +aI-540 +aa(lp23848 +g15 +aI538 +aI-504 +aI595 +aI-516 +aI568 +aI-508 +aa(lp23849 +g20 +aI538 +aI-498 +aa(lp23850 +g15 +aI622 +aI-475 +aI568 +aI-493 +aI596 +aI-485 +aa(lp23851 +g15 +aI691 +aI-435 +aI648 +aI-466 +aI671 +aI-452 +aa(lp23852 +g15 +aI737 +aI-370 +aI710 +aI-418 +aI726 +aI-396 +aa(lp23853 +g15 +aI754 +aI-275 +aI748 +aI-344 +aI754 +aI-312 +aa(lp23854 +g15 +aI733 +aI-159 +aI754 +aI-232 +aI747 +aI-193 +aa(lp23855 +g15 +aI672 +aI-72 +aI719 +aI-125 +aI698 +aI-96 +aa(lp23856 +g15 +aI574 +aI-18 +aI645 +aI-49 +aI613 +aI-31 +aa(lp23857 +g15 +aI445 +aI0 +aI536 +aI-5 +aI493 +aI0 +aa(lp23858 +g20 +aI129 +aI0 +aa(lp23859 +g10 +aa(lp23860 +g8 +aI250 +aI-547 +aa(lp23861 +g20 +aI409 +aI-547 +aa(lp23862 +g15 +aI501 +aI-557 +aI445 +aI-547 +aI476 +aI-550 +aa(lp23863 +g15 +aI561 +aI-586 +aI526 +aI-564 +aI546 +aI-573 +aa(lp23864 +g15 +aI594 +aI-634 +aI576 +aI-599 +aI587 +aI-615 +aa(lp23865 +g15 +aI604 +aI-702 +aI600 +aI-653 +aI604 +aI-676 +aa(lp23866 +g15 +aI554 +aI-814 +aI604 +aI-754 +aI587 +aI-791 +aa(lp23867 +g15 +aI395 +aI-847 +aI520 +aI-836 +aI467 +aI-847 +aa(lp23868 +g20 +aI250 +aI-847 +aa(lp23869 +g10 +aa(lp23870 +g8 +aI250 +aI-446 +aa(lp23871 +g20 +aI250 +aI-102 +aa(lp23872 +g20 +aI423 +aI-102 +aa(lp23873 +g15 +aI519 +aI-115 +aI462 +aI-102 +aI494 +aI-106 +aa(lp23874 +g15 +aI582 +aI-151 +aI545 +aI-124 +aI566 +aI-136 +aa(lp23875 +g15 +aI616 +aI-208 +aI598 +aI-167 +aI609 +aI-186 +aa(lp23876 +g15 +aI626 +aI-280 +aI623 +aI-230 +aI626 +aI-254 +aa(lp23877 +g15 +aI616 +aI-347 +aI626 +aI-305 +aI623 +aI-327 +aa(lp23878 +g15 +aI581 +aI-400 +aI609 +aI-368 +aI597 +aI-385 +aa(lp23879 +g15 +aI516 +aI-434 +aI564 +aI-414 +aI543 +aI-426 +aa(lp23880 +g15 +aI416 +aI-446 +aI489 +aI-442 +aI455 +aI-446 +aa(lp23881 +g10 +aa(lp23882 +g8 +aI828 +aI0 +aa(lp23883 +g10 +aa(lp23884 +g8 +aI828 +aI0 +aasVF +(lp23885 +(lp23886 +g8 +aI250 +aI0 +aa(lp23887 +g20 +aI129 +aI0 +aa(lp23888 +g20 +aI129 +aI-951 +aa(lp23889 +g20 +aI623 +aI-951 +aa(lp23890 +g20 +aI623 +aI-844 +aa(lp23891 +g20 +aI250 +aI-844 +aa(lp23892 +g20 +aI250 +aI-508 +aa(lp23893 +g20 +aI598 +aI-508 +aa(lp23894 +g20 +aI598 +aI-401 +aa(lp23895 +g20 +aI250 +aI-401 +aa(lp23896 +g10 +aa(lp23897 +g8 +aI654 +aI0 +aa(lp23898 +g10 +aa(lp23899 +g8 +aI654 +aI0 +aasVJ +(lp23900 +(lp23901 +g8 +aI-18 +aI253 +aa(lp23902 +g15 +aI-76 +aI249 +aI-41 +aI253 +aI-60 +aI252 +aa(lp23903 +g15 +aI-119 +aI238 +aI-93 +aI246 +aI-107 +aI242 +aa(lp23904 +g20 +aI-119 +aI133 +aa(lp23905 +g15 +aI-72 +aI143 +aI-105 +aI137 +aI-89 +aI140 +aa(lp23906 +g15 +aI-17 +aI146 +aI-55 +aI145 +aI-37 +aI146 +aa(lp23907 +g15 +aI30 +aI140 +aI-1 +aI146 +aI14 +aI144 +aa(lp23908 +g15 +aI75 +aI118 +aI47 +aI136 +aI61 +aI129 +aa(lp23909 +g15 +aI107 +aI73 +aI88 +aI107 +aI99 +aI92 +aa(lp23910 +g15 +aI119 +aI0 +aI115 +aI54 +aI119 +aI29 +aa(lp23911 +g20 +aI119 +aI-951 +aa(lp23912 +g20 +aI241 +aI-951 +aa(lp23913 +g20 +aI241 +aI-12 +aa(lp23914 +g15 +aI222 +aI105 +aI241 +aI33 +aI235 +aI72 +aa(lp23915 +g15 +aI168 +aI188 +aI209 +aI139 +aI191 +aI167 +aa(lp23916 +g15 +aI86 +aI237 +aI146 +aI210 +aI118 +aI227 +aa(lp23917 +g15 +aI-18 +aI253 +aI55 +aI248 +aI19 +aI253 +aa(lp23918 +g10 +aa(lp23919 +g8 +aI361 +aI0 +aa(lp23920 +g10 +aa(lp23921 +g8 +aI361 +aI0 +aasVN +(lp23922 +(lp23923 +g8 +aI842 +aI0 +aa(lp23924 +g20 +aI702 +aI0 +aa(lp23925 +g20 +aI234 +aI-787 +aa(lp23926 +g20 +aI229 +aI-787 +aa(lp23927 +g15 +aI235 +aI-687 +aI231 +aI-753 +aI233 +aI-720 +aa(lp23928 +g15 +aI239 +aI-599 +aI237 +aI-659 +aI238 +aI-629 +aa(lp23929 +g15 +aI241 +aI-515 +aI240 +aI-568 +aI241 +aI-540 +aa(lp23930 +g20 +aI241 +aI0 +aa(lp23931 +g20 +aI129 +aI0 +aa(lp23932 +g20 +aI129 +aI-951 +aa(lp23933 +g20 +aI268 +aI-951 +aa(lp23934 +g20 +aI734 +aI-167 +aa(lp23935 +g20 +aI738 +aI-167 +aa(lp23936 +g15 +aI734 +aI-265 +aI737 +aI-200 +aI736 +aI-233 +aa(lp23937 +g15 +aI732 +aI-307 +aI733 +aI-279 +aI733 +aI-293 +aa(lp23938 +g15 +aI730 +aI-351 +aI732 +aI-322 +aI731 +aI-336 +aa(lp23939 +g15 +aI729 +aI-393 +aI730 +aI-365 +aI729 +aI-379 +aa(lp23940 +g15 +aI729 +aI-430 +aI729 +aI-406 +aI729 +aI-419 +aa(lp23941 +g20 +aI729 +aI-951 +aa(lp23942 +g20 +aI842 +aI-951 +aa(lp23943 +g10 +aa(lp23944 +g8 +aI972 +aI0 +aa(lp23945 +g10 +aa(lp23946 +g8 +aI972 +aI0 +aasVR +(lp23947 +(lp23948 +g8 +aI250 +aI-392 +aa(lp23949 +g20 +aI250 +aI0 +aa(lp23950 +g20 +aI129 +aI0 +aa(lp23951 +g20 +aI129 +aI-951 +aa(lp23952 +g20 +aI361 +aI-951 +aa(lp23953 +g15 +aI617 +aI-884 +aI476 +aI-951 +aI562 +aI-929 +aa(lp23954 +g15 +aI699 +aI-681 +aI672 +aI-839 +aI699 +aI-771 +aa(lp23955 +g15 +aI683 +aI-582 +aI699 +aI-643 +aI694 +aI-610 +aa(lp23956 +g15 +aI641 +aI-509 +aI673 +aI-554 +aI659 +aI-529 +aa(lp23957 +g15 +aI581 +aI-459 +aI624 +aI-489 +aI603 +aI-472 +aa(lp23958 +g15 +aI511 +aI-425 +aI558 +aI-445 +aI535 +aI-434 +aa(lp23959 +g20 +aI770 +aI0 +aa(lp23960 +g20 +aI628 +aI0 +aa(lp23961 +g20 +aI399 +aI-392 +aa(lp23962 +g10 +aa(lp23963 +g8 +aI250 +aI-495 +aa(lp23964 +g20 +aI357 +aI-495 +aa(lp23965 +g15 +aI457 +aI-507 +aI396 +aI-495 +aI429 +aI-499 +aa(lp23966 +g15 +aI524 +aI-540 +aI484 +aI-514 +aI506 +aI-525 +aa(lp23967 +g15 +aI562 +aI-596 +aI541 +aI-555 +aI554 +aI-574 +aa(lp23968 +g15 +aI574 +aI-675 +aI570 +aI-619 +aI574 +aI-645 +aa(lp23969 +g15 +aI561 +aI-754 +aI574 +aI-706 +aI570 +aI-733 +aa(lp23970 +g15 +aI521 +aI-808 +aI552 +aI-776 +aI539 +aI-794 +aa(lp23971 +g15 +aI452 +aI-838 +aI503 +aI-822 +aI480 +aI-832 +aa(lp23972 +g15 +aI354 +aI-847 +aI425 +aI-844 +aI392 +aI-847 +aa(lp23973 +g20 +aI250 +aI-847 +aa(lp23974 +g10 +aa(lp23975 +g8 +aI786 +aI0 +aa(lp23976 +g10 +aa(lp23977 +g8 +aI786 +aI0 +aasVV +(lp23978 +(lp23979 +g8 +aI628 +aI-951 +aa(lp23980 +g20 +aI757 +aI-951 +aa(lp23981 +g20 +aI438 +aI0 +aa(lp23982 +g20 +aI317 +aI0 +aa(lp23983 +g20 +aI0 +aI-951 +aa(lp23984 +g20 +aI128 +aI-951 +aa(lp23985 +g20 +aI320 +aI-347 +aa(lp23986 +g15 +aI352 +aI-233 +aI332 +aI-308 +aI343 +aI-270 +aa(lp23987 +g15 +aI377 +aI-130 +aI361 +aI-196 +aI370 +aI-162 +aa(lp23988 +g15 +aI402 +aI-233 +aI384 +aI-162 +aI392 +aI-196 +aa(lp23989 +g15 +aI437 +aI-351 +aI412 +aI-270 +aI424 +aI-309 +aa(lp23990 +g10 +aa(lp23991 +g8 +aI757 +aI0 +aa(lp23992 +g10 +aa(lp23993 +g8 +aI757 +aI0 +aasVZ +(lp23994 +(lp23995 +g8 +aI665 +aI0 +aa(lp23996 +g20 +aI53 +aI0 +aa(lp23997 +g20 +aI53 +aI-93 +aa(lp23998 +g20 +aI516 +aI-843 +aa(lp23999 +g20 +aI66 +aI-843 +aa(lp24000 +g20 +aI66 +aI-951 +aa(lp24001 +g20 +aI651 +aI-951 +aa(lp24002 +g20 +aI651 +aI-856 +aa(lp24003 +g20 +aI189 +aI-107 +aa(lp24004 +g20 +aI665 +aI-107 +aa(lp24005 +g10 +aa(lp24006 +g8 +aI718 +aI0 +aa(lp24007 +g10 +aa(lp24008 +g8 +aI718 +aI0 +aasV^ +(lp24009 +(lp24010 +g8 +aI26 +aI-356 +aa(lp24011 +g20 +aI325 +aI-958 +aa(lp24012 +g20 +aI391 +aI-958 +aa(lp24013 +g20 +aI682 +aI-356 +aa(lp24014 +g20 +aI578 +aI-356 +aa(lp24015 +g20 +aI358 +aI-835 +aa(lp24016 +g20 +aI131 +aI-356 +aa(lp24017 +g10 +aa(lp24018 +g8 +aI709 +aI0 +aa(lp24019 +g10 +aa(lp24020 +g8 +aI709 +aI0 +aasVb +(lp24021 +(lp24022 +g8 +aI436 +aI-727 +aa(lp24023 +g15 +aI547 +aI-703 +aI476 +aI-727 +aI514 +aI-719 +aa(lp24024 +g15 +aI633 +aI-633 +aI580 +aI-688 +aI609 +aI-665 +aa(lp24025 +g15 +aI688 +aI-518 +aI656 +aI-602 +aI675 +aI-564 +aa(lp24026 +g15 +aI707 +aI-358 +aI701 +aI-472 +aI707 +aI-419 +aa(lp24027 +g15 +aI688 +aI-197 +aI707 +aI-297 +aI701 +aI-243 +aa(lp24028 +g15 +aI633 +aI-80 +aI675 +aI-150 +aI656 +aI-112 +aa(lp24029 +g15 +aI547 +aI-10 +aI609 +aI-49 +aI580 +aI-26 +aa(lp24030 +g15 +aI436 +aI13 +aI514 +aI5 +aI476 +aI13 +aa(lp24031 +g15 +aI366 +aI5 +aI410 +aI13 +aI387 +aI10 +aa(lp24032 +g15 +aI310 +aI-17 +aI345 +aI0 +aI326 +aI-8 +aa(lp24033 +g15 +aI265 +aI-50 +aI293 +aI-26 +aI278 +aI-37 +aa(lp24034 +g15 +aI231 +aI-90 +aI253 +aI-62 +aI241 +aI-76 +aa(lp24035 +g20 +aI223 +aI-90 +aa(lp24036 +g20 +aI199 +aI0 +aa(lp24037 +g20 +aI113 +aI0 +aa(lp24038 +g20 +aI113 +aI-1012 +aa(lp24039 +g20 +aI231 +aI-1012 +aa(lp24040 +g20 +aI231 +aI-767 +aa(lp24041 +g15 +aI231 +aI-719 +aI231 +aI-752 +aI231 +aI-736 +aa(lp24042 +g15 +aI229 +aI-671 +aI230 +aI-702 +aI230 +aI-686 +aa(lp24043 +g15 +aI226 +aI-620 +aI228 +aI-654 +aI227 +aI-637 +aa(lp24044 +g20 +aI231 +aI-620 +aa(lp24045 +g15 +aI265 +aI-662 +aI241 +aI-635 +aI253 +aI-649 +aa(lp24046 +g15 +aI309 +aI-696 +aI278 +aI-675 +aI292 +aI-687 +aa(lp24047 +g15 +aI365 +aI-719 +aI326 +aI-706 +aI345 +aI-713 +aa(lp24048 +g15 +aI436 +aI-727 +aI386 +aI-724 +aI410 +aI-727 +aa(lp24049 +g10 +aa(lp24050 +g8 +aI413 +aI-629 +aa(lp24051 +g15 +aI326 +aI-612 +aI378 +aI-629 +aI349 +aI-623 +aa(lp24052 +g15 +aI270 +aI-562 +aI303 +aI-601 +aI284 +aI-584 +aa(lp24053 +g15 +aI240 +aI-477 +aI256 +aI-539 +aI246 +aI-511 +aa(lp24054 +g15 +aI231 +aI-358 +aI234 +aI-443 +aI231 +aI-403 +aa(lp24055 +g15 +aI240 +aI-241 +aI231 +aI-314 +aI234 +aI-275 +aa(lp24056 +g15 +aI270 +aI-155 +aI246 +aI-207 +aI256 +aI-178 +aa(lp24057 +g15 +aI326 +aI-102 +aI284 +aI-132 +aI303 +aI-114 +aa(lp24058 +g15 +aI414 +aI-84 +aI350 +aI-90 +aI379 +aI-84 +aa(lp24059 +g15 +aI543 +aI-155 +aI473 +aI-84 +aI516 +aI-108 +aa(lp24060 +g15 +aI585 +aI-359 +aI571 +aI-203 +aI585 +aI-271 +aa(lp24061 +g15 +aI543 +aI-562 +aI585 +aI-449 +aI571 +aI-517 +aa(lp24062 +g15 +aI413 +aI-629 +aI516 +aI-606 +aI472 +aI-629 +aa(lp24063 +g10 +aa(lp24064 +g8 +aI781 +aI0 +aa(lp24065 +g10 +aa(lp24066 +g8 +aI781 +aI0 +aasVf +(lp24067 +(lp24068 +g8 +aI423 +aI-625 +aa(lp24069 +g20 +aI264 +aI-625 +aa(lp24070 +g20 +aI264 +aI0 +aa(lp24071 +g20 +aI145 +aI0 +aa(lp24072 +g20 +aI145 +aI-625 +aa(lp24073 +g20 +aI18 +aI-625 +aa(lp24074 +g20 +aI18 +aI-674 +aa(lp24075 +g20 +aI145 +aI-718 +aa(lp24076 +g20 +aI145 +aI-780 +aa(lp24077 +g15 +aI159 +aI-896 +aI145 +aI-827 +aI150 +aI-865 +aa(lp24078 +g15 +aI202 +aI-969 +aI169 +aI-926 +aI183 +aI-951 +aa(lp24079 +g15 +aI270 +aI-1008 +aI220 +aI-987 +aI243 +aI-1000 +aa(lp24080 +g15 +aI361 +aI-1019 +aI297 +aI-1015 +aI327 +aI-1019 +aa(lp24081 +g15 +aI431 +aI-1012 +aI386 +aI-1019 +aI410 +aI-1017 +aa(lp24082 +g15 +aI489 +aI-995 +aI453 +aI-1007 +aI472 +aI-1001 +aa(lp24083 +g20 +aI458 +aI-903 +aa(lp24084 +g15 +aI415 +aI-916 +aI445 +aI-908 +aI430 +aI-912 +aa(lp24085 +g15 +aI365 +aI-922 +aI399 +aI-920 +aI382 +aI-922 +aa(lp24086 +g15 +aI320 +aI-915 +aI347 +aI-922 +aI332 +aI-920 +aa(lp24087 +g15 +aI289 +aI-894 +aI307 +aI-911 +aI297 +aI-904 +aa(lp24088 +g15 +aI270 +aI-851 +aI280 +aI-883 +aI274 +aI-869 +aa(lp24089 +g15 +aI264 +aI-782 +aI266 +aI-833 +aI264 +aI-810 +aa(lp24090 +g20 +aI264 +aI-714 +aa(lp24091 +g20 +aI423 +aI-714 +aa(lp24092 +g10 +aa(lp24093 +g8 +aI438 +aI0 +aa(lp24094 +g10 +aa(lp24095 +g8 +aI438 +aI0 +aasVj +(lp24096 +(lp24097 +g8 +aI42 +aI320 +aa(lp24098 +g15 +aI-8 +aI316 +aI22 +aI320 +aI4 +aI319 +aa(lp24099 +g15 +aI-44 +aI304 +aI-22 +aI313 +aI-34 +aI309 +aa(lp24100 +g20 +aI-44 +aI208 +aa(lp24101 +g15 +aI-9 +aI218 +aI-32 +aI212 +aI-21 +aI215 +aa(lp24102 +g15 +aI30 +aI221 +aI1 +aI220 +aI15 +aI221 +aa(lp24103 +g15 +aI63 +aI216 +aI42 +aI221 +aI53 +aI220 +aa(lp24104 +g15 +aI89 +aI199 +aI73 +aI213 +aI81 +aI207 +aa(lp24105 +g15 +aI107 +aI165 +aI97 +aI190 +aI102 +aI179 +aa(lp24106 +g15 +aI113 +aI111 +aI111 +aI151 +aI113 +aI133 +aa(lp24107 +g20 +aI113 +aI-714 +aa(lp24108 +g20 +aI231 +aI-714 +aa(lp24109 +g20 +aI231 +aI103 +aa(lp24110 +g15 +aI220 +aI193 +aI231 +aI136 +aI228 +aI166 +aa(lp24111 +g15 +aI186 +aI261 +aI213 +aI220 +aI201 +aI242 +aa(lp24112 +g15 +aI127 +aI305 +aI170 +aI280 +aI150 +aI295 +aa(lp24113 +g15 +aI42 +aI320 +aI103 +aI315 +aI75 +aI320 +aa(lp24114 +g10 +aa(lp24115 +g8 +aI104 +aI-907 +aa(lp24116 +g15 +aI124 +aI-964 +aI104 +aI-933 +aI110 +aI-952 +aa(lp24117 +g15 +aI173 +aI-981 +aI137 +aI-976 +aI153 +aI-981 +aa(lp24118 +g15 +aI200 +aI-977 +aI182 +aI-981 +aI191 +aI-980 +aa(lp24119 +g15 +aI222 +aI-964 +aI208 +aI-974 +aI216 +aI-970 +aa(lp24120 +g15 +aI237 +aI-941 +aI228 +aI-958 +aI233 +aI-950 +aa(lp24121 +g15 +aI242 +aI-907 +aI240 +aI-931 +aI242 +aI-920 +aa(lp24122 +g15 +aI222 +aI-851 +aI242 +aI-882 +aI236 +aI-863 +aa(lp24123 +g15 +aI173 +aI-832 +aI208 +aI-839 +aI192 +aI-832 +aa(lp24124 +g15 +aI124 +aI-851 +aI153 +aI-832 +aI137 +aI-838 +aa(lp24125 +g15 +aI104 +aI-907 +aI110 +aI-863 +aI104 +aI-882 +aa(lp24126 +g10 +aa(lp24127 +g8 +aI345 +aI0 +aa(lp24128 +g10 +aa(lp24129 +g8 +aI345 +aI0 +aasVn +(lp24130 +(lp24131 +g8 +aI559 +aI0 +aa(lp24132 +g20 +aI559 +aI-459 +aa(lp24133 +g15 +aI525 +aI-586 +aI559 +aI-516 +aI548 +aI-558 +aa(lp24134 +g15 +aI418 +aI-629 +aI502 +aI-614 +aI467 +aI-629 +aa(lp24135 +g15 +aI330 +aI-612 +aI383 +aI-629 +aI353 +aI-623 +aa(lp24136 +g15 +aI272 +aI-562 +aI306 +aI-600 +aI287 +aI-584 +aa(lp24137 +g15 +aI241 +aI-480 +aI257 +aI-539 +aI247 +aI-512 +aa(lp24138 +g15 +aI231 +aI-369 +aI234 +aI-448 +aI231 +aI-411 +aa(lp24139 +g20 +aI231 +aI0 +aa(lp24140 +g20 +aI113 +aI0 +aa(lp24141 +g20 +aI113 +aI-714 +aa(lp24142 +g20 +aI209 +aI-714 +aa(lp24143 +g20 +aI226 +aI-618 +aa(lp24144 +g20 +aI233 +aI-618 +aa(lp24145 +g15 +aI271 +aI-666 +aI243 +aI-636 +aI256 +aI-652 +aa(lp24146 +g15 +aI320 +aI-700 +aI286 +aI-680 +aI303 +aI-691 +aa(lp24147 +g15 +aI377 +aI-720 +aI338 +aI-709 +aI357 +aI-716 +aa(lp24148 +g15 +aI438 +aI-727 +aI397 +aI-725 +aI417 +aI-727 +aa(lp24149 +g15 +aI618 +aI-665 +aI518 +aI-727 +aI578 +aI-706 +aa(lp24150 +g15 +aI678 +aI-466 +aI658 +aI-623 +aI678 +aI-557 +aa(lp24151 +g20 +aI678 +aI0 +aa(lp24152 +g10 +aa(lp24153 +g8 +aI785 +aI0 +aa(lp24154 +g10 +aa(lp24155 +g8 +aI785 +aI0 +aasVr +(lp24156 +(lp24157 +g8 +aI422 +aI-727 +aa(lp24158 +g15 +aI464 +aI-725 +aI435 +aI-727 +aI449 +aI-726 +aa(lp24159 +g15 +aI505 +aI-720 +aI480 +aI-724 +aI493 +aI-723 +aa(lp24160 +g20 +aI489 +aI-611 +aa(lp24161 +g15 +aI452 +aI-617 +aI477 +aI-613 +aI464 +aI-615 +aa(lp24162 +g15 +aI416 +aI-619 +aI439 +aI-618 +aI427 +aI-619 +aa(lp24163 +g15 +aI341 +aI-602 +aI388 +aI-619 +aI363 +aI-613 +aa(lp24164 +g15 +aI282 +aI-555 +aI318 +aI-591 +aI299 +aI-575 +aa(lp24165 +g15 +aI245 +aI-480 +aI266 +aI-534 +aI254 +aI-509 +aa(lp24166 +g15 +aI231 +aI-384 +aI236 +aI-452 +aI231 +aI-420 +aa(lp24167 +g20 +aI231 +aI0 +aa(lp24168 +g20 +aI113 +aI0 +aa(lp24169 +g20 +aI113 +aI-714 +aa(lp24170 +g20 +aI209 +aI-714 +aa(lp24171 +g20 +aI223 +aI-583 +aa(lp24172 +g20 +aI229 +aI-583 +aa(lp24173 +g15 +aI263 +aI-637 +aI240 +aI-602 +aI251 +aI-620 +aa(lp24174 +g15 +aI305 +aI-683 +aI276 +aI-654 +aI290 +aI-670 +aa(lp24175 +g15 +aI357 +aI-715 +aI321 +aI-696 +aI338 +aI-707 +aa(lp24176 +g15 +aI422 +aI-727 +aI376 +aI-723 +aI398 +aI-727 +aa(lp24177 +g10 +aa(lp24178 +g8 +aI531 +aI0 +aa(lp24179 +g10 +aa(lp24180 +g8 +aI531 +aI0 +aasVv +(lp24181 +(lp24182 +g8 +aI244 +aI0 +aa(lp24183 +g20 +aI0 +aI-714 +aa(lp24184 +g20 +aI122 +aI-714 +aa(lp24185 +g20 +aI251 +aI-316 +aa(lp24186 +g15 +aI268 +aI-261 +aI256 +aI-302 +aI262 +aI-283 +aa(lp24187 +g15 +aI288 +aI-192 +aI275 +aI-238 +aI281 +aI-215 +aa(lp24188 +g15 +aI306 +aI-125 +aI294 +aI-168 +aI300 +aI-146 +aa(lp24189 +g15 +aI317 +aI-78 +aI311 +aI-105 +aI315 +aI-89 +aa(lp24190 +g20 +aI321 +aI-78 +aa(lp24191 +g15 +aI332 +aI-125 +aI323 +aI-89 +aI327 +aI-105 +aa(lp24192 +g15 +aI350 +aI-192 +aI337 +aI-146 +aI343 +aI-168 +aa(lp24193 +g15 +aI369 +aI-261 +aI356 +aI-215 +aI363 +aI-238 +aa(lp24194 +g15 +aI386 +aI-316 +aI376 +aI-283 +aI381 +aI-302 +aa(lp24195 +g20 +aI516 +aI-714 +aa(lp24196 +g20 +aI638 +aI-714 +aa(lp24197 +g20 +aI394 +aI0 +aa(lp24198 +g10 +aa(lp24199 +g8 +aI638 +aI0 +aa(lp24200 +g10 +aa(lp24201 +g8 +aI638 +aI0 +aasVz +(lp24202 +(lp24203 +g8 +aI534 +aI0 +aa(lp24204 +g20 +aI53 +aI0 +aa(lp24205 +g20 +aI53 +aI-80 +aa(lp24206 +g20 +aI402 +aI-625 +aa(lp24207 +g20 +aI74 +aI-625 +aa(lp24208 +g20 +aI74 +aI-714 +aa(lp24209 +g20 +aI522 +aI-714 +aa(lp24210 +g20 +aI522 +aI-619 +aa(lp24211 +g20 +aI181 +aI-88 +aa(lp24212 +g20 +aI534 +aI-88 +aa(lp24213 +g10 +aa(lp24214 +g8 +aI587 +aI0 +aa(lp24215 +g10 +aa(lp24216 +g8 +aI587 +aI0 +aasV~ +(lp24217 +(lp24218 +g8 +aI345 +aI-423 +aa(lp24219 +g15 +aI303 +aI-440 +aI328 +aI-430 +aI314 +aI-436 +aa(lp24220 +g15 +aI270 +aI-452 +aI291 +aI-445 +aI280 +aI-449 +aa(lp24221 +g15 +aI242 +aI-458 +aI260 +aI-455 +aI251 +aI-457 +aa(lp24222 +g15 +aI214 +aI-459 +aI233 +aI-459 +aI224 +aI-459 +aa(lp24223 +g15 +aI177 +aI-453 +aI202 +aI-459 +aI190 +aI-457 +aa(lp24224 +g15 +aI138 +aI-436 +aI164 +aI-449 +aI151 +aI-443 +aa(lp24225 +g15 +aI100 +aI-411 +aI125 +aI-429 +aI113 +aI-421 +aa(lp24226 +g15 +aI66 +aI-381 +aI88 +aI-402 +aI77 +aI-391 +aa(lp24227 +g20 +aI66 +aI-486 +aa(lp24228 +g15 +aI227 +aI-556 +aI109 +aI-533 +aI163 +aI-556 +aa(lp24229 +g15 +aI263 +aI-555 +aI240 +aI-556 +aI252 +aI-556 +aa(lp24230 +g15 +aI297 +aI-549 +aI273 +aI-554 +aI285 +aI-552 +aa(lp24231 +g15 +aI336 +aI-536 +aI309 +aI-546 +aI322 +aI-542 +aa(lp24232 +g15 +aI389 +aI-515 +aI351 +aI-531 +aI368 +aI-524 +aa(lp24233 +g15 +aI431 +aI-498 +aI405 +aI-508 +aI419 +aI-503 +aa(lp24234 +g15 +aI464 +aI-486 +aI443 +aI-493 +aI454 +aI-489 +aa(lp24235 +g15 +aI492 +aI-480 +aI474 +aI-484 +aI484 +aI-482 +aa(lp24236 +g15 +aI520 +aI-479 +aI501 +aI-479 +aI510 +aI-479 +aa(lp24237 +g15 +aI557 +aI-485 +aI532 +aI-479 +aI544 +aI-481 +aa(lp24238 +g15 +aI596 +aI-502 +aI570 +aI-489 +aI583 +aI-495 +aa(lp24239 +g15 +aI634 +aI-527 +aI609 +aI-509 +aI621 +aI-517 +aa(lp24240 +g15 +aI667 +aI-558 +aI646 +aI-537 +aI657 +aI-547 +aa(lp24241 +g20 +aI667 +aI-452 +aa(lp24242 +g15 +aI506 +aI-382 +aI624 +aI-405 +aI571 +aI-382 +aa(lp24243 +g15 +aI471 +aI-383 +aI493 +aI-382 +aI482 +aI-382 +aa(lp24244 +g15 +aI437 +aI-389 +aI460 +aI-385 +aI449 +aI-387 +aa(lp24245 +g15 +aI397 +aI-402 +aI425 +aI-392 +aI412 +aI-396 +aa(lp24246 +g15 +aI345 +aI-423 +aI382 +aI-407 +aI365 +aI-414 +aa(lp24247 +g10 +aa(lp24248 +g8 +aI734 +aI0 +aa(lp24249 +g10 +aa(lp24250 +g8 +aI734 +aI0 +aasV! +(lp24251 +(lp24252 +g8 +aI218 +aI-269 +aa(lp24253 +g20 +aI139 +aI-269 +aa(lp24254 +g20 +aI106 +aI-951 +aa(lp24255 +g20 +aI251 +aI-951 +aa(lp24256 +g10 +aa(lp24257 +g8 +aI95 +aI-71 +aa(lp24258 +g15 +aI102 +aI-113 +aI95 +aI-88 +aI97 +aI-102 +aa(lp24259 +g15 +aI119 +aI-141 +aI106 +aI-125 +aI112 +aI-134 +aa(lp24260 +g15 +aI145 +aI-157 +aI127 +aI-148 +aI135 +aI-154 +aa(lp24261 +g15 +aI178 +aI-162 +aI155 +aI-160 +aI166 +aI-162 +aa(lp24262 +g15 +aI210 +aI-157 +aI189 +aI-162 +aI200 +aI-160 +aa(lp24263 +g15 +aI236 +aI-141 +aI220 +aI-154 +aI229 +aI-148 +aa(lp24264 +g15 +aI254 +aI-113 +aI244 +aI-134 +aI250 +aI-125 +aa(lp24265 +g15 +aI261 +aI-71 +aI258 +aI-102 +aI261 +aI-88 +aa(lp24266 +g15 +aI254 +aI-30 +aI261 +aI-55 +aI258 +aI-41 +aa(lp24267 +g15 +aI236 +aI-2 +aI250 +aI-18 +aI244 +aI-9 +aa(lp24268 +g15 +aI210 +aI14 +aI229 +aI5 +aI220 +aI10 +aa(lp24269 +g15 +aI178 +aI19 +aI200 +aI17 +aI189 +aI19 +aa(lp24270 +g15 +aI145 +aI14 +aI166 +aI19 +aI155 +aI17 +aa(lp24271 +g15 +aI119 +aI-2 +aI135 +aI10 +aI127 +aI5 +aa(lp24272 +g15 +aI102 +aI-30 +aI112 +aI-9 +aI106 +aI-18 +aa(lp24273 +g15 +aI95 +aI-71 +aI97 +aI-41 +aI95 +aI-55 +aa(lp24274 +g10 +aa(lp24275 +g8 +aI358 +aI0 +aa(lp24276 +g10 +aa(lp24277 +g8 +aI358 +aI0 +aasV% +(lp24278 +(lp24279 +g8 +aI162 +aI-667 +aa(lp24280 +g15 +aI185 +aI-506 +aI162 +aI-595 +aI170 +aI-542 +aa(lp24281 +g15 +aI261 +aI-452 +aI201 +aI-470 +aI226 +aI-452 +aa(lp24282 +g15 +aI362 +aI-667 +aI328 +aI-452 +aI362 +aI-524 +aa(lp24283 +g15 +aI261 +aI-881 +aI362 +aI-809 +aI328 +aI-881 +aa(lp24284 +g15 +aI185 +aI-827 +aI226 +aI-881 +aI201 +aI-863 +aa(lp24285 +g15 +aI162 +aI-667 +aI170 +aI-792 +aI162 +aI-739 +aa(lp24286 +g10 +aa(lp24287 +g8 +aI458 +aI-667 +aa(lp24288 +g15 +aI447 +aI-541 +aI458 +aI-620 +aI455 +aI-578 +aa(lp24289 +g15 +aI411 +aI-446 +aI439 +aI-503 +aI427 +aI-472 +aa(lp24290 +g15 +aI349 +aI-387 +aI395 +aI-421 +aI374 +aI-401 +aa(lp24291 +g15 +aI261 +aI-367 +aI324 +aI-374 +aI295 +aI-367 +aa(lp24292 +g15 +aI177 +aI-387 +aI229 +aI-367 +aI201 +aI-374 +aa(lp24293 +g15 +aI115 +aI-446 +aI152 +aI-401 +aI132 +aI-421 +aa(lp24294 +g15 +aI78 +aI-541 +aI99 +aI-472 +aI87 +aI-503 +aa(lp24295 +g15 +aI66 +aI-667 +aI70 +aI-578 +aI66 +aI-620 +aa(lp24296 +g15 +aI77 +aI-793 +aI66 +aI-714 +aI70 +aI-756 +aa(lp24297 +g15 +aI112 +aI-886 +aI85 +aI-830 +aI97 +aI-861 +aa(lp24298 +g15 +aI173 +aI-944 +aI128 +aI-911 +aI148 +aI-931 +aa(lp24299 +g15 +aI261 +aI-965 +aI198 +aI-958 +aI227 +aI-965 +aa(lp24300 +g15 +aI346 +aI-944 +aI293 +aI-965 +aI322 +aI-958 +aa(lp24301 +g15 +aI408 +aI-886 +aI371 +aI-931 +aI391 +aI-911 +aa(lp24302 +g15 +aI446 +aI-793 +aI425 +aI-861 +aI437 +aI-830 +aa(lp24303 +g15 +aI458 +aI-667 +aI454 +aI-756 +aI458 +aI-714 +aa(lp24304 +g10 +aa(lp24305 +g8 +aI737 +aI-286 +aa(lp24306 +g15 +aI760 +aI-125 +aI737 +aI-214 +aI745 +aI-160 +aa(lp24307 +g15 +aI835 +aI-71 +aI776 +aI-89 +aI801 +aI-71 +aa(lp24308 +g15 +aI937 +aI-286 +aI903 +aI-71 +aI937 +aI-143 +aa(lp24309 +g15 +aI835 +aI-499 +aI937 +aI-428 +aI903 +aI-499 +aa(lp24310 +g15 +aI760 +aI-446 +aI801 +aI-499 +aI776 +aI-481 +aa(lp24311 +g15 +aI737 +aI-286 +aI745 +aI-411 +aI737 +aI-357 +aa(lp24312 +g10 +aa(lp24313 +g8 +aI1033 +aI-286 +aa(lp24314 +g15 +aI1021 +aI-160 +aI1033 +aI-239 +aI1029 +aI-197 +aa(lp24315 +g15 +aI986 +aI-65 +aI1014 +aI-122 +aI1002 +aI-91 +aa(lp24316 +g15 +aI924 +aI-7 +aI970 +aI-40 +aI949 +aI-20 +aa(lp24317 +g15 +aI835 +aI13 +aI899 +aI6 +aI870 +aI13 +aa(lp24318 +g15 +aI751 +aI-7 +aI803 +aI13 +aI775 +aI6 +aa(lp24319 +g15 +aI690 +aI-65 +aI726 +aI-20 +aI706 +aI-40 +aa(lp24320 +g15 +aI653 +aI-160 +aI674 +aI-91 +aI661 +aI-122 +aa(lp24321 +g15 +aI641 +aI-286 +aI645 +aI-197 +aI641 +aI-239 +aa(lp24322 +g15 +aI652 +aI-411 +aI641 +aI-332 +aI645 +aI-374 +aa(lp24323 +g15 +aI687 +aI-505 +aI660 +aI-448 +aI671 +aI-479 +aa(lp24324 +g15 +aI748 +aI-563 +aI703 +aI-530 +aI723 +aI-549 +aa(lp24325 +g15 +aI835 +aI-583 +aI772 +aI-576 +aI802 +aI-583 +aa(lp24326 +g15 +aI921 +aI-563 +aI868 +aI-583 +aI897 +aI-576 +aa(lp24327 +g15 +aI983 +aI-505 +aI946 +aI-549 +aI966 +aI-530 +aa(lp24328 +g15 +aI1020 +aI-411 +aI999 +aI-479 +aI1012 +aI-448 +aa(lp24329 +g15 +aI1033 +aI-286 +aI1028 +aI-374 +aI1033 +aI-332 +aa(lp24330 +g10 +aa(lp24331 +g8 +aI866 +aI-951 +aa(lp24332 +g20 +aI338 +aI0 +aa(lp24333 +g20 +aI235 +aI0 +aa(lp24334 +g20 +aI764 +aI-951 +aa(lp24335 +g10 +aa(lp24336 +g8 +aI1100 +aI0 +aa(lp24337 +g10 +aa(lp24338 +g8 +aI1100 +aI0 +aasV) +(lp24339 +(lp24340 +g8 +aI348 +aI-364 +aa(lp24341 +g15 +aI336 +aI-205 +aI348 +aI-310 +aI344 +aI-258 +aa(lp24342 +g15 +aI300 +aI-54 +aI328 +aI-153 +aI316 +aI-103 +aa(lp24343 +g15 +aI239 +aI85 +aI284 +aI-5 +aI263 +aI41 +aa(lp24344 +g15 +aI151 +aI211 +aI214 +aI130 +aI185 +aI172 +aa(lp24345 +g20 +aI41 +aI211 +aa(lp24346 +g15 +aI120 +aI81 +aI70 +aI170 +aI97 +aI127 +aa(lp24347 +g15 +aI178 +aI-61 +aI143 +aI35 +aI162 +aI-12 +aa(lp24348 +g15 +aI213 +aI-211 +aI194 +aI-110 +aI205 +aI-160 +aa(lp24349 +g15 +aI225 +aI-366 +aI221 +aI-263 +aI225 +aI-314 +aa(lp24350 +g15 +aI178 +aI-675 +aI225 +aI-471 +aI209 +aI-575 +aa(lp24351 +g15 +aI39 +aI-951 +aI147 +aI-775 +aI100 +aI-867 +aa(lp24352 +g20 +aI151 +aI-951 +aa(lp24353 +g15 +aI239 +aI-822 +aI185 +aI-911 +aI214 +aI-867 +aa(lp24354 +g15 +aI300 +aI-678 +aI263 +aI-776 +aI284 +aI-728 +aa(lp24355 +g15 +aI336 +aI-525 +aI316 +aI-629 +aI328 +aI-577 +aa(lp24356 +g15 +aI348 +aI-364 +aI344 +aI-472 +aI348 +aI-419 +aa(lp24357 +g10 +aa(lp24358 +g8 +aI401 +aI0 +aa(lp24359 +g10 +aa(lp24360 +g8 +aI401 +aI0 +aasV- +(lp24361 +(lp24362 +g8 +aI53 +aI-302 +aa(lp24363 +g20 +aI53 +aI-411 +aa(lp24364 +g20 +aI376 +aI-411 +aa(lp24365 +g20 +aI376 +aI-302 +aa(lp24366 +g10 +aa(lp24367 +g8 +aI429 +aI0 +aa(lp24368 +g10 +aa(lp24369 +g8 +aI429 +aI0 +aasV1 +(lp24370 +(lp24371 +g8 +aI462 +aI0 +aa(lp24372 +g20 +aI348 +aI0 +aa(lp24373 +g20 +aI348 +aI-593 +aa(lp24374 +g15 +aI348 +aI-653 +aI348 +aI-612 +aI348 +aI-632 +aa(lp24375 +g15 +aI349 +aI-717 +aI348 +aI-675 +aI349 +aI-696 +aa(lp24376 +g15 +aI351 +aI-777 +aI350 +aI-738 +aI351 +aI-758 +aa(lp24377 +g15 +aI353 +aI-828 +aI352 +aI-797 +aI353 +aI-814 +aa(lp24378 +g15 +aI333 +aI-808 +aI346 +aI-821 +aI339 +aI-814 +aa(lp24379 +g15 +aI316 +aI-792 +aI328 +aI-803 +aI322 +aI-797 +aa(lp24380 +g15 +aI298 +aI-775 +aI310 +aI-787 +aI304 +aI-781 +aa(lp24381 +g15 +aI274 +aI-755 +aI291 +aI-770 +aI283 +aI-763 +aa(lp24382 +g20 +aI178 +aI-676 +aa(lp24383 +g20 +aI115 +aI-756 +aa(lp24384 +g20 +aI365 +aI-951 +aa(lp24385 +g20 +aI462 +aI-951 +aa(lp24386 +g10 +aa(lp24387 +g8 +aI734 +aI0 +aa(lp24388 +g10 +aa(lp24389 +g8 +aI734 +aI0 +aasV5 +(lp24390 +(lp24391 +g8 +aI354 +aI-583 +aa(lp24392 +g15 +aI474 +aI-565 +aI397 +aI-583 +aI437 +aI-577 +aa(lp24393 +g15 +aI571 +aI-512 +aI512 +aI-553 +aI544 +aI-536 +aa(lp24394 +g15 +aI636 +aI-425 +aI599 +aI-489 +aI621 +aI-460 +aa(lp24395 +g15 +aI660 +aI-304 +aI652 +aI-390 +aI660 +aI-350 +aa(lp24396 +g15 +aI638 +aI-171 +aI660 +aI-255 +aI652 +aI-210 +aa(lp24397 +g15 +aI572 +aI-71 +aI623 +aI-131 +aI601 +aI-98 +aa(lp24398 +g15 +aI464 +aI-8 +aI543 +aI-43 +aI507 +aI-22 +aa(lp24399 +g15 +aI317 +aI13 +aI421 +aI6 +aI372 +aI13 +aa(lp24400 +g15 +aI251 +aI10 +aI294 +aI13 +aI273 +aI12 +aa(lp24401 +g15 +aI189 +aI0 +aI230 +aI8 +aI209 +aI4 +aa(lp24402 +g15 +aI133 +aI-15 +aI170 +aI-3 +aI151 +aI-8 +aa(lp24403 +g15 +aI85 +aI-37 +aI115 +aI-21 +aI99 +aI-29 +aa(lp24404 +g20 +aI85 +aI-149 +aa(lp24405 +g15 +aI135 +aI-123 +aI99 +aI-139 +aI116 +aI-131 +aa(lp24406 +g15 +aI196 +aI-103 +aI155 +aI-115 +aI175 +aI-108 +aa(lp24407 +g15 +aI260 +aI-91 +aI217 +aI-98 +aI239 +aI-94 +aa(lp24408 +g15 +aI320 +aI-87 +aI282 +aI-88 +aI302 +aI-87 +aa(lp24409 +g15 +aI412 +aI-99 +aI354 +aI-87 +aI385 +aI-91 +aa(lp24410 +g15 +aI480 +aI-136 +aI439 +aI-107 +aI461 +aI-119 +aa(lp24411 +g15 +aI523 +aI-200 +aI499 +aI-153 +aI513 +aI-175 +aa(lp24412 +g15 +aI538 +aI-291 +aI533 +aI-226 +aI538 +aI-256 +aa(lp24413 +g15 +aI481 +aI-434 +aI538 +aI-353 +aI519 +aI-401 +aa(lp24414 +g15 +aI314 +aI-483 +aI442 +aI-466 +aI387 +aI-483 +aa(lp24415 +g15 +aI276 +aI-481 +aI302 +aI-483 +aI290 +aI-482 +aa(lp24416 +g15 +aI235 +aI-477 +aI262 +aI-480 +aI249 +aI-479 +aa(lp24417 +g15 +aI196 +aI-471 +aI221 +aI-475 +aI208 +aI-473 +aa(lp24418 +g15 +aI164 +aI-466 +aI183 +aI-469 +aI173 +aI-468 +aa(lp24419 +g20 +aI105 +aI-503 +aa(lp24420 +g20 +aI141 +aI-951 +aa(lp24421 +g20 +aI590 +aI-951 +aa(lp24422 +g20 +aI590 +aI-843 +aa(lp24423 +g20 +aI244 +aI-843 +aa(lp24424 +g20 +aI218 +aI-570 +aa(lp24425 +g15 +aI273 +aI-578 +aI232 +aI-573 +aI250 +aI-575 +aa(lp24426 +g15 +aI354 +aI-583 +aI296 +aI-582 +aI323 +aI-583 +aa(lp24427 +g10 +aa(lp24428 +g8 +aI734 +aI0 +aa(lp24429 +g10 +aa(lp24430 +g8 +aI734 +aI0 +aasV9 +(lp24431 +(lp24432 +g8 +aI669 +aI-545 +aa(lp24433 +g15 +aI662 +aI-408 +aI669 +aI-499 +aI666 +aI-454 +aa(lp24434 +g15 +aI638 +aI-278 +aI657 +aI-363 +aI649 +aI-320 +aa(lp24435 +g15 +aI591 +aI-163 +aI626 +aI-237 +aI611 +aI-199 +aa(lp24436 +g15 +aI514 +aI-70 +aI571 +aI-127 +aI545 +aI-96 +aa(lp24437 +g15 +aI404 +aI-8 +aI484 +aI-44 +aI447 +aI-23 +aa(lp24438 +g15 +aI253 +aI13 +aI361 +aI5 +aI310 +aI13 +aa(lp24439 +g15 +aI225 +aI12 +aI245 +aI13 +aI235 +aI13 +aa(lp24440 +g15 +aI195 +aI10 +aI215 +aI12 +aI205 +aI11 +aa(lp24441 +g15 +aI166 +aI6 +aI185 +aI9 +aI176 +aI8 +aa(lp24442 +g15 +aI141 +aI1 +aI157 +aI5 +aI148 +aI3 +aa(lp24443 +g20 +aI141 +aI-99 +aa(lp24444 +g15 +aI192 +aI-87 +aI156 +aI-94 +aI173 +aI-90 +aa(lp24445 +g15 +aI249 +aI-83 +aI211 +aI-84 +aI230 +aI-83 +aa(lp24446 +g15 +aI393 +aI-114 +aI307 +aI-83 +aI356 +aI-93 +aa(lp24447 +g15 +aI483 +aI-197 +aI431 +aI-134 +aI461 +aI-162 +aa(lp24448 +g15 +aI530 +aI-319 +aI505 +aI-232 +aI521 +aI-272 +aa(lp24449 +g15 +aI548 +aI-466 +aI540 +aI-365 +aI546 +aI-414 +aa(lp24450 +g20 +aI539 +aI-466 +aa(lp24451 +g15 +aI508 +aI-422 +aI531 +aI-450 +aI520 +aI-436 +aa(lp24452 +g15 +aI465 +aI-387 +aI496 +aI-409 +aI481 +aI-397 +aa(lp24453 +g15 +aI409 +aI-364 +aI449 +aI-377 +aI430 +aI-369 +aa(lp24454 +g15 +aI339 +aI-355 +aI388 +aI-358 +aI365 +aI-355 +aa(lp24455 +g15 +aI227 +aI-374 +aI298 +aI-355 +aI261 +aI-362 +aa(lp24456 +g15 +aI142 +aI-431 +aI194 +aI-387 +aI166 +aI-406 +aa(lp24457 +g15 +aI88 +aI-522 +aI119 +aI-455 +aI101 +aI-486 +aa(lp24458 +g15 +aI69 +aI-644 +aI75 +aI-557 +aI69 +aI-598 +aa(lp24459 +g15 +aI89 +aI-778 +aI69 +aI-694 +aI75 +aI-738 +aa(lp24460 +g15 +aI147 +aI-879 +aI103 +aI-818 +aI122 +aI-851 +aa(lp24461 +g15 +aI238 +aI-942 +aI172 +aI-906 +aI202 +aI-928 +aa(lp24462 +g15 +aI358 +aI-965 +aI274 +aI-957 +aI314 +aI-965 +aa(lp24463 +g15 +aI481 +aI-939 +aI402 +aI-965 +aI443 +aI-956 +aa(lp24464 +g15 +aI579 +aI-862 +aI518 +aI-922 +aI551 +aI-896 +aa(lp24465 +g15 +aI645 +aI-730 +aI607 +aI-827 +aI629 +aI-783 +aa(lp24466 +g15 +aI669 +aI-545 +aI661 +aI-678 +aI669 +aI-616 +aa(lp24467 +g10 +aa(lp24468 +g8 +aI360 +aI-864 +aa(lp24469 +g15 +aI288 +aI-851 +aI333 +aI-864 +aI310 +aI-860 +aa(lp24470 +g15 +aI233 +aI-811 +aI267 +aI-843 +aI248 +aI-829 +aa(lp24471 +g15 +aI196 +aI-742 +aI217 +aI-793 +aI205 +aI-770 +aa(lp24472 +g15 +aI184 +aI-644 +aI188 +aI-715 +aI184 +aI-682 +aa(lp24473 +g15 +aI194 +aI-563 +aI184 +aI-614 +aI187 +aI-587 +aa(lp24474 +g15 +aI227 +aI-501 +aI202 +aI-538 +aI212 +aI-518 +aa(lp24475 +g15 +aI280 +aI-462 +aI241 +aI-484 +aI259 +aI-471 +aa(lp24476 +g15 +aI356 +aI-448 +aI302 +aI-453 +aI327 +aI-448 +aa(lp24477 +g15 +aI436 +aI-464 +aI385 +aI-448 +aI412 +aI-453 +aa(lp24478 +g15 +aI497 +aI-503 +aI460 +aI-474 +aI480 +aI-487 +aa(lp24479 +g15 +aI536 +aI-559 +aI514 +aI-520 +aI527 +aI-538 +aa(lp24480 +g15 +aI550 +aI-621 +aI546 +aI-580 +aI550 +aI-601 +aa(lp24481 +g15 +aI538 +aI-708 +aI550 +aI-651 +aI546 +aI-679 +aa(lp24482 +g15 +aI502 +aI-786 +aI530 +aI-737 +aI518 +aI-763 +aa(lp24483 +g15 +aI443 +aI-843 +aI487 +aI-810 +aI467 +aI-828 +aa(lp24484 +g15 +aI360 +aI-864 +aI419 +aI-857 +aI391 +aI-864 +aa(lp24485 +g10 +aa(lp24486 +g8 +aI734 +aI0 +aa(lp24487 +g10 +aa(lp24488 +g8 +aI734 +aI0 +aasV= +(lp24489 +(lp24490 +g8 +aI66 +aI-554 +aa(lp24491 +g20 +aI66 +aI-651 +aa(lp24492 +g20 +aI667 +aI-651 +aa(lp24493 +g20 +aI667 +aI-554 +aa(lp24494 +g10 +aa(lp24495 +g8 +aI66 +aI-287 +aa(lp24496 +g20 +aI66 +aI-384 +aa(lp24497 +g20 +aI667 +aI-384 +aa(lp24498 +g20 +aI667 +aI-287 +aa(lp24499 +g10 +aa(lp24500 +g8 +aI734 +aI0 +aa(lp24501 +g10 +aa(lp24502 +g8 +aI734 +aI0 +aasVA +(lp24503 +(lp24504 +g8 +aI686 +aI0 +aa(lp24505 +g20 +aI582 +aI-294 +aa(lp24506 +g20 +aI227 +aI-294 +aa(lp24507 +g20 +aI122 +aI0 +aa(lp24508 +g20 +aI0 +aI0 +aa(lp24509 +g20 +aI349 +aI-955 +aa(lp24510 +g20 +aI460 +aI-955 +aa(lp24511 +g20 +aI810 +aI0 +aa(lp24512 +g10 +aa(lp24513 +g8 +aI544 +aI-401 +aa(lp24514 +g20 +aI447 +aI-677 +aa(lp24515 +g15 +aI438 +aI-706 +aI445 +aI-685 +aI442 +aI-695 +aa(lp24516 +g15 +aI427 +aI-743 +aI434 +aI-717 +aI430 +aI-730 +aa(lp24517 +g15 +aI415 +aI-783 +aI423 +aI-756 +aI419 +aI-769 +aa(lp24518 +g15 +aI404 +aI-825 +aI411 +aI-797 +aI407 +aI-811 +aa(lp24519 +g15 +aI393 +aI-783 +aI401 +aI-811 +aI397 +aI-797 +aa(lp24520 +g15 +aI382 +aI-742 +aI389 +aI-769 +aI386 +aI-755 +aa(lp24521 +g15 +aI370 +aI-705 +aI378 +aI-728 +aI374 +aI-716 +aa(lp24522 +g15 +aI361 +aI-677 +aI367 +aI-694 +aI363 +aI-685 +aa(lp24523 +g20 +aI266 +aI-401 +aa(lp24524 +g10 +aa(lp24525 +g8 +aI810 +aI0 +aa(lp24526 +g10 +aa(lp24527 +g8 +aI810 +aI0 +aasVE +(lp24528 +(lp24529 +g8 +aI623 +aI0 +aa(lp24530 +g20 +aI129 +aI0 +aa(lp24531 +g20 +aI129 +aI-951 +aa(lp24532 +g20 +aI623 +aI-951 +aa(lp24533 +g20 +aI623 +aI-844 +aa(lp24534 +g20 +aI250 +aI-844 +aa(lp24535 +g20 +aI250 +aI-550 +aa(lp24536 +g20 +aI598 +aI-550 +aa(lp24537 +g20 +aI598 +aI-444 +aa(lp24538 +g20 +aI250 +aI-444 +aa(lp24539 +g20 +aI250 +aI-106 +aa(lp24540 +g20 +aI623 +aI-106 +aa(lp24541 +g10 +aa(lp24542 +g8 +aI703 +aI0 +aa(lp24543 +g10 +aa(lp24544 +g8 +aI703 +aI0 +aasVI +(lp24545 +(lp24546 +g8 +aI398 +aI0 +aa(lp24547 +g20 +aI53 +aI0 +aa(lp24548 +g20 +aI53 +aI-65 +aa(lp24549 +g20 +aI165 +aI-92 +aa(lp24550 +g20 +aI165 +aI-858 +aa(lp24551 +g20 +aI53 +aI-884 +aa(lp24552 +g20 +aI53 +aI-951 +aa(lp24553 +g20 +aI398 +aI-951 +aa(lp24554 +g20 +aI398 +aI-884 +aa(lp24555 +g20 +aI286 +aI-858 +aa(lp24556 +g20 +aI286 +aI-92 +aa(lp24557 +g20 +aI398 +aI-65 +aa(lp24558 +g10 +aa(lp24559 +g8 +aI451 +aI0 +aa(lp24560 +g10 +aa(lp24561 +g8 +aI451 +aI0 +aasVM +(lp24562 +(lp24563 +g8 +aI522 +aI0 +aa(lp24564 +g20 +aI234 +aI-832 +aa(lp24565 +g20 +aI229 +aI-832 +aa(lp24566 +g15 +aI235 +aI-737 +aI231 +aI-800 +aI233 +aI-768 +aa(lp24567 +g15 +aI239 +aI-650 +aI237 +aI-709 +aI238 +aI-681 +aa(lp24568 +g15 +aI241 +aI-568 +aI240 +aI-620 +aI241 +aI-593 +aa(lp24569 +g20 +aI241 +aI0 +aa(lp24570 +g20 +aI129 +aI0 +aa(lp24571 +g20 +aI129 +aI-951 +aa(lp24572 +g20 +aI309 +aI-951 +aa(lp24573 +g20 +aI577 +aI-175 +aa(lp24574 +g20 +aI581 +aI-175 +aa(lp24575 +g20 +aI850 +aI-951 +aa(lp24576 +g20 +aI1030 +aI-951 +aa(lp24577 +g20 +aI1030 +aI0 +aa(lp24578 +g20 +aI909 +aI0 +aa(lp24579 +g20 +aI909 +aI-577 +aa(lp24580 +g15 +aI910 +aI-654 +aI909 +aI-599 +aI909 +aI-625 +aa(lp24581 +g15 +aI914 +aI-737 +aI911 +aI-683 +aI912 +aI-711 +aa(lp24582 +g15 +aI918 +aI-831 +aI915 +aI-768 +aI917 +aI-799 +aa(lp24583 +g20 +aI913 +aI-831 +aa(lp24584 +g20 +aI622 +aI0 +aa(lp24585 +g10 +aa(lp24586 +g8 +aI1160 +aI0 +aa(lp24587 +g10 +aa(lp24588 +g8 +aI1160 +aI0 +aasVQ +(lp24589 +(lp24590 +g8 +aI906 +aI-476 +aa(lp24591 +g15 +aI890 +aI-317 +aI906 +aI-419 +aI901 +aI-366 +aa(lp24592 +g15 +aI844 +aI-185 +aI880 +aI-268 +aI864 +aI-224 +aa(lp24593 +g15 +aI766 +aI-83 +aI823 +aI-146 +aI797 +aI-112 +aa(lp24594 +g15 +aI660 +aI-15 +aI736 +aI-54 +aI700 +aI-32 +aa(lp24595 +g15 +aI732 +aI91 +aI678 +aI24 +aI703 +aI60 +aa(lp24596 +g15 +aI835 +aI177 +aI762 +aI122 +aI796 +aI151 +aa(lp24597 +g20 +aI757 +aI269 +aa(lp24598 +g15 +aI633 +aI158 +aI712 +aI238 +aI671 +aI200 +aa(lp24599 +g15 +aI544 +aI10 +aI596 +aI115 +aI566 +aI65 +aa(lp24600 +g15 +aI519 +aI12 +aI536 +aI11 +aI528 +aI12 +aa(lp24601 +g15 +aI494 +aI13 +aI510 +aI13 +aI502 +aI13 +aa(lp24602 +g15 +aI310 +aI-21 +aI424 +aI13 +aI362 +aI1 +aa(lp24603 +g15 +aI181 +aI-121 +aI259 +aI-45 +aI216 +aI-78 +aa(lp24604 +g15 +aI106 +aI-276 +aI147 +aI-164 +aI122 +aI-216 +aa(lp24605 +g15 +aI81 +aI-478 +aI89 +aI-337 +aI81 +aI-404 +aa(lp24606 +g15 +aI106 +aI-678 +aI81 +aI-551 +aI89 +aI-618 +aa(lp24607 +g15 +aI182 +aI-832 +aI122 +aI-739 +aI148 +aI-790 +aa(lp24608 +g15 +aI311 +aI-931 +aI216 +aI-875 +aI259 +aI-908 +aa(lp24609 +g15 +aI496 +aI-966 +aI363 +aI-954 +aI425 +aI-966 +aa(lp24610 +g15 +aI673 +aI-931 +aI563 +aI-966 +aI622 +aI-954 +aa(lp24611 +g15 +aI802 +aI-832 +aI724 +aI-908 +aI767 +aI-875 +aa(lp24612 +g15 +aI880 +aI-678 +aI836 +aI-789 +aI862 +aI-738 +aa(lp24613 +g15 +aI906 +aI-476 +aI898 +aI-618 +aI906 +aI-550 +aa(lp24614 +g10 +aa(lp24615 +g8 +aI209 +aI-476 +aa(lp24616 +g15 +aI226 +aI-316 +aI209 +aI-417 +aI215 +aI-363 +aa(lp24617 +g15 +aI278 +aI-195 +aI237 +aI-268 +aI255 +aI-228 +aa(lp24618 +g15 +aI366 +aI-119 +aI301 +aI-161 +aI331 +aI-136 +aa(lp24619 +g15 +aI494 +aI-92 +aI402 +aI-101 +aI445 +aI-92 +aa(lp24620 +g15 +aI622 +aI-119 +aI544 +aI-92 +aI586 +aI-101 +aa(lp24621 +g15 +aI711 +aI-195 +aI658 +aI-136 +aI688 +aI-161 +aa(lp24622 +g15 +aI762 +aI-316 +aI734 +aI-228 +aI751 +aI-268 +aa(lp24623 +g15 +aI778 +aI-476 +aI773 +aI-363 +aI778 +aI-417 +aa(lp24624 +g15 +aI762 +aI-637 +aI778 +aI-536 +aI773 +aI-590 +aa(lp24625 +g15 +aI711 +aI-757 +aI751 +aI-684 +aI734 +aI-724 +aa(lp24626 +g15 +aI623 +aI-833 +aI688 +aI-790 +aI659 +aI-815 +aa(lp24627 +g15 +aI496 +aI-859 +aI588 +aI-850 +aI545 +aI-859 +aa(lp24628 +g15 +aI367 +aI-833 +aI446 +aI-859 +aI403 +aI-850 +aa(lp24629 +g15 +aI278 +aI-757 +aI331 +aI-815 +aI302 +aI-790 +aa(lp24630 +g15 +aI226 +aI-637 +aI255 +aI-724 +aI237 +aI-684 +aa(lp24631 +g15 +aI209 +aI-476 +aI215 +aI-590 +aI209 +aI-536 +aa(lp24632 +g10 +aa(lp24633 +g8 +aI988 +aI0 +aa(lp24634 +g10 +aa(lp24635 +g8 +aI988 +aI0 +aasVU +(lp24636 +(lp24637 +g8 +aI810 +aI-952 +aa(lp24638 +g20 +aI810 +aI-335 +aa(lp24639 +g15 +aI789 +aI-197 +aI810 +aI-286 +aI803 +aI-239 +aa(lp24640 +g15 +aI724 +aI-86 +aI774 +aI-154 +aI753 +aI-118 +aa(lp24641 +g15 +aI615 +aI-13 +aI695 +aI-55 +aI659 +aI-31 +aa(lp24642 +g15 +aI461 +aI13 +aI571 +aI4 +aI520 +aI13 +aa(lp24643 +g15 +aI314 +aI-11 +aI406 +aI13 +aI356 +aI5 +aa(lp24644 +g15 +aI207 +aI-82 +aI271 +aI-28 +aI236 +aI-52 +aa(lp24645 +g15 +aI141 +aI-193 +aI178 +aI-113 +aI156 +aI-150 +aa(lp24646 +g15 +aI119 +aI-338 +aI127 +aI-237 +aI119 +aI-285 +aa(lp24647 +g20 +aI119 +aI-951 +aa(lp24648 +g20 +aI241 +aI-951 +aa(lp24649 +g20 +aI241 +aI-331 +aa(lp24650 +g15 +aI297 +aI-155 +aI241 +aI-255 +aI260 +aI-196 +aa(lp24651 +g15 +aI468 +aI-92 +aI335 +aI-113 +aI392 +aI-92 +aa(lp24652 +g15 +aI567 +aI-110 +aI506 +aI-92 +aI539 +aI-98 +aa(lp24653 +g15 +aI636 +aI-159 +aI595 +aI-121 +aI618 +aI-138 +aa(lp24654 +g15 +aI675 +aI-235 +aI653 +aI-180 +aI667 +aI-206 +aa(lp24655 +g15 +aI689 +aI-332 +aI684 +aI-265 +aI689 +aI-297 +aa(lp24656 +g20 +aI689 +aI-952 +aa(lp24657 +g10 +aa(lp24658 +g8 +aI930 +aI0 +aa(lp24659 +g10 +aa(lp24660 +g8 +aI930 +aI0 +aasVY +(lp24661 +(lp24662 +g8 +aI350 +aI-470 +aa(lp24663 +g20 +aI572 +aI-951 +aa(lp24664 +g20 +aI702 +aI-951 +aa(lp24665 +g20 +aI412 +aI-369 +aa(lp24666 +g20 +aI412 +aI0 +aa(lp24667 +g20 +aI290 +aI0 +aa(lp24668 +g20 +aI290 +aI-363 +aa(lp24669 +g20 +aI0 +aI-951 +aa(lp24670 +g20 +aI132 +aI-951 +aa(lp24671 +g10 +aa(lp24672 +g8 +aI702 +aI0 +aa(lp24673 +g10 +aa(lp24674 +g8 +aI702 +aI0 +aasV] +(lp24675 +(lp24676 +g8 +aI33 +aI113 +aa(lp24677 +g20 +aI178 +aI113 +aa(lp24678 +g20 +aI178 +aI-854 +aa(lp24679 +g20 +aI33 +aI-854 +aa(lp24680 +g20 +aI33 +aI-951 +aa(lp24681 +g20 +aI297 +aI-951 +aa(lp24682 +g20 +aI297 +aI211 +aa(lp24683 +g20 +aI33 +aI211 +aa(lp24684 +g10 +aa(lp24685 +g8 +aI404 +aI0 +aa(lp24686 +g10 +aa(lp24687 +g8 +aI404 +aI0 +aasVa +(lp24688 +(lp24689 +g8 +aI516 +aI0 +aa(lp24690 +g20 +aI492 +aI-98 +aa(lp24691 +g20 +aI486 +aI-98 +aa(lp24692 +g15 +aI444 +aI-48 +aI472 +aI-78 +aI458 +aI-62 +aa(lp24693 +g15 +aI397 +aI-13 +aI429 +aI-33 +aI414 +aI-22 +aa(lp24694 +g15 +aI340 +aI6 +aI380 +aI-4 +aI361 +aI2 +aa(lp24695 +g15 +aI268 +aI13 +aI319 +aI11 +aI295 +aI13 +aa(lp24696 +g15 +aI185 +aI0 +aI238 +aI13 +aI210 +aI9 +aa(lp24697 +g15 +aI120 +aI-38 +aI160 +aI-7 +aI138 +aI-20 +aa(lp24698 +g15 +aI76 +aI-104 +aI101 +aI-55 +aI87 +aI-77 +aa(lp24699 +g15 +aI61 +aI-199 +aI66 +aI-131 +aI61 +aI-162 +aa(lp24700 +g15 +aI136 +aI-363 +aI61 +aI-270 +aI86 +aI-325 +aa(lp24701 +g15 +aI365 +aI-425 +aI186 +aI-401 +aI262 +aI-422 +aa(lp24702 +g20 +aI485 +aI-430 +aa(lp24703 +g20 +aI485 +aI-475 +aa(lp24704 +g15 +aI475 +aI-548 +aI485 +aI-504 +aI481 +aI-528 +aa(lp24705 +g15 +aI448 +aI-595 +aI469 +aI-567 +aI460 +aI-583 +aa(lp24706 +g15 +aI403 +aI-621 +aI436 +aI-607 +aI421 +aI-616 +aa(lp24707 +g15 +aI343 +aI-629 +aI386 +aI-626 +aI366 +aI-629 +aa(lp24708 +g15 +aI243 +aI-613 +aI307 +aI-629 +aI274 +aI-623 +aa(lp24709 +g15 +aI153 +aI-575 +aI212 +aI-603 +aI182 +aI-590 +aa(lp24710 +g20 +aI111 +aI-664 +aa(lp24711 +g15 +aI219 +aI-709 +aI144 +aI-682 +aI179 +aI-697 +aa(lp24712 +g15 +aI343 +aI-727 +aI258 +aI-721 +aI300 +aI-727 +aa(lp24713 +g15 +aI458 +aI-714 +aI388 +aI-727 +aI426 +aI-722 +aa(lp24714 +g15 +aI538 +aI-671 +aI490 +aI-705 +aI517 +aI-691 +aa(lp24715 +g15 +aI585 +aI-597 +aI559 +aI-652 +aI575 +aI-627 +aa(lp24716 +g15 +aI601 +aI-489 +aI596 +aI-567 +aI601 +aI-531 +aa(lp24717 +g20 +aI601 +aI0 +aa(lp24718 +g10 +aa(lp24719 +g8 +aI298 +aI-82 +aa(lp24720 +g15 +aI372 +aI-94 +aI325 +aI-82 +aI349 +aI-86 +aa(lp24721 +g15 +aI430 +aI-132 +aI394 +aI-102 +aI414 +aI-115 +aa(lp24722 +g15 +aI469 +aI-195 +aI447 +aI-148 +aI460 +aI-169 +aa(lp24723 +g15 +aI483 +aI-284 +aI479 +aI-220 +aI483 +aI-250 +aa(lp24724 +g20 +aI483 +aI-349 +aa(lp24725 +g20 +aI390 +aI-344 +aa(lp24726 +g15 +aI292 +aI-331 +aI351 +aI-342 +aI318 +aI-338 +aa(lp24727 +g15 +aI228 +aI-302 +aI265 +aI-324 +aI244 +aI-314 +aa(lp24728 +g15 +aI194 +aI-257 +aI212 +aI-290 +aI201 +aI-275 +aa(lp24729 +g15 +aI184 +aI-198 +aI187 +aI-240 +aI184 +aI-220 +aa(lp24730 +g15 +aI215 +aI-110 +aI184 +aI-158 +aI194 +aI-128 +aa(lp24731 +g15 +aI298 +aI-82 +aI236 +aI-91 +aI264 +aI-82 +aa(lp24732 +g10 +aa(lp24733 +g8 +aI707 +aI0 +aa(lp24734 +g10 +aa(lp24735 +g8 +aI707 +aI0 +aasVe +(lp24736 +(lp24737 +g8 +aI395 +aI13 +aa(lp24738 +g15 +aI264 +aI-10 +aI348 +aI13 +aI304 +aI5 +aa(lp24739 +g15 +aI163 +aI-80 +aI225 +aI-26 +aI191 +aI-50 +aa(lp24740 +g15 +aI97 +aI-195 +aI134 +aI-111 +aI112 +aI-149 +aa(lp24741 +g15 +aI73 +aI-351 +aI81 +aI-241 +aI73 +aI-293 +aa(lp24742 +g15 +aI95 +aI-509 +aI73 +aI-410 +aI80 +aI-463 +aa(lp24743 +g15 +aI155 +aI-628 +aI109 +aI-556 +aI129 +aI-595 +aa(lp24744 +g15 +aI249 +aI-702 +aI181 +aI-660 +aI212 +aI-685 +aa(lp24745 +g15 +aI369 +aI-727 +aI285 +aI-718 +aI325 +aI-727 +aa(lp24746 +g15 +aI485 +aI-704 +aI412 +aI-727 +aI450 +aI-719 +aa(lp24747 +g15 +aI572 +aI-639 +aI519 +aI-688 +aI548 +aI-667 +aa(lp24748 +g15 +aI627 +aI-538 +aI596 +aI-611 +aI614 +aI-577 +aa(lp24749 +g15 +aI646 +aI-407 +aI640 +aI-499 +aI646 +aI-455 +aa(lp24750 +g20 +aI646 +aI-334 +aa(lp24751 +g20 +aI195 +aI-334 +aa(lp24752 +g15 +aI249 +aI-149 +aI198 +aI-250 +aI215 +aI-188 +aa(lp24753 +g15 +aI397 +aI-90 +aI282 +aI-109 +aI331 +aI-90 +aa(lp24754 +g15 +aI458 +aI-93 +aI419 +aI-90 +aI439 +aI-91 +aa(lp24755 +g15 +aI513 +aI-102 +aI477 +aI-95 +aI495 +aI-98 +aa(lp24756 +g15 +aI564 +aI-118 +aI530 +aI-106 +aI547 +aI-112 +aa(lp24757 +g15 +aI614 +aI-139 +aI580 +aI-124 +aI597 +aI-131 +aa(lp24758 +g20 +aI614 +aI-34 +aa(lp24759 +g15 +aI563 +aI-12 +aI597 +aI-25 +aI580 +aI-18 +aa(lp24760 +g15 +aI512 +aI2 +aI546 +aI-6 +aI529 +aI-1 +aa(lp24761 +g15 +aI457 +aI10 +aI494 +aI6 +aI476 +aI9 +aa(lp24762 +g15 +aI395 +aI13 +aI438 +aI12 +aI417 +aI13 +aa(lp24763 +g10 +aa(lp24764 +g8 +aI366 +aI-629 +aa(lp24765 +g15 +aI249 +aI-578 +aI317 +aI-629 +aI277 +aI-612 +aa(lp24766 +g15 +aI198 +aI-430 +aI220 +aI-544 +aI203 +aI-495 +aa(lp24767 +g20 +aI518 +aI-430 +aa(lp24768 +g15 +aI510 +aI-511 +aI518 +aI-460 +aI515 +aI-487 +aa(lp24769 +g15 +aI482 +aI-574 +aI504 +aI-536 +aI495 +aI-557 +aa(lp24770 +g15 +aI435 +aI-614 +aI470 +aI-591 +aI454 +aI-605 +aa(lp24771 +g15 +aI366 +aI-629 +aI416 +aI-624 +aI393 +aI-629 +aa(lp24772 +g10 +aa(lp24773 +g8 +aI713 +aI0 +aa(lp24774 +g10 +aa(lp24775 +g8 +aI713 +aI0 +aasVi +(lp24776 +(lp24777 +g8 +aI231 +aI0 +aa(lp24778 +g20 +aI113 +aI0 +aa(lp24779 +g20 +aI113 +aI-714 +aa(lp24780 +g20 +aI231 +aI-714 +aa(lp24781 +g10 +aa(lp24782 +g8 +aI104 +aI-907 +aa(lp24783 +g15 +aI124 +aI-964 +aI104 +aI-933 +aI110 +aI-952 +aa(lp24784 +g15 +aI173 +aI-981 +aI137 +aI-976 +aI153 +aI-981 +aa(lp24785 +g15 +aI200 +aI-977 +aI182 +aI-981 +aI191 +aI-980 +aa(lp24786 +g15 +aI222 +aI-964 +aI208 +aI-974 +aI216 +aI-970 +aa(lp24787 +g15 +aI237 +aI-941 +aI228 +aI-958 +aI233 +aI-950 +aa(lp24788 +g15 +aI242 +aI-907 +aI240 +aI-931 +aI242 +aI-920 +aa(lp24789 +g15 +aI222 +aI-851 +aI242 +aI-882 +aI236 +aI-863 +aa(lp24790 +g15 +aI173 +aI-832 +aI208 +aI-839 +aI192 +aI-832 +aa(lp24791 +g15 +aI124 +aI-851 +aI153 +aI-832 +aI137 +aI-838 +aa(lp24792 +g15 +aI104 +aI-907 +aI110 +aI-863 +aI104 +aI-882 +aa(lp24793 +g10 +aa(lp24794 +g8 +aI345 +aI0 +aa(lp24795 +g10 +aa(lp24796 +g8 +aI345 +aI0 +aasVm +(lp24797 +(lp24798 +g8 +aI969 +aI0 +aa(lp24799 +g20 +aI969 +aI-459 +aa(lp24800 +g15 +aI936 +aI-586 +aI969 +aI-516 +aI958 +aI-558 +aa(lp24801 +g15 +aI835 +aI-629 +aI915 +aI-614 +aI881 +aI-629 +aa(lp24802 +g15 +aI755 +aI-613 +aI804 +aI-629 +aI777 +aI-624 +aa(lp24803 +g15 +aI700 +aI-568 +aI733 +aI-603 +aI714 +aI-588 +aa(lp24804 +g15 +aI669 +aI-495 +aI686 +aI-549 +aI676 +aI-524 +aa(lp24805 +g15 +aI660 +aI-394 +aI663 +aI-466 +aI660 +aI-432 +aa(lp24806 +g20 +aI660 +aI0 +aa(lp24807 +g20 +aI541 +aI0 +aa(lp24808 +g20 +aI541 +aI-459 +aa(lp24809 +g15 +aI508 +aI-586 +aI541 +aI-516 +aI530 +aI-558 +aa(lp24810 +g15 +aI408 +aI-629 +aI487 +aI-614 +aI453 +aI-629 +aa(lp24811 +g15 +aI324 +aI-612 +aI374 +aI-629 +aI346 +aI-623 +aa(lp24812 +g15 +aI269 +aI-562 +aI301 +aI-600 +aI283 +aI-584 +aa(lp24813 +g15 +aI240 +aI-480 +aI256 +aI-539 +aI246 +aI-512 +aa(lp24814 +g15 +aI231 +aI-369 +aI234 +aI-448 +aI231 +aI-411 +aa(lp24815 +g20 +aI231 +aI0 +aa(lp24816 +g20 +aI113 +aI0 +aa(lp24817 +g20 +aI113 +aI-714 +aa(lp24818 +g20 +aI209 +aI-714 +aa(lp24819 +g20 +aI226 +aI-618 +aa(lp24820 +g20 +aI233 +aI-618 +aa(lp24821 +g15 +aI270 +aI-666 +aI243 +aI-636 +aI255 +aI-652 +aa(lp24822 +g15 +aI317 +aI-700 +aI284 +aI-680 +aI300 +aI-691 +aa(lp24823 +g15 +aI372 +aI-720 +aI334 +aI-709 +aI352 +aI-716 +aa(lp24824 +g15 +aI430 +aI-727 +aI391 +aI-725 +aI411 +aI-727 +aa(lp24825 +g15 +aI560 +aI-698 +aI483 +aI-727 +aI526 +aI-717 +aa(lp24826 +g15 +aI637 +aI-608 +aI595 +aI-679 +aI620 +aI-649 +aa(lp24827 +g20 +aI642 +aI-608 +aa(lp24828 +g15 +aI683 +aI-661 +aI653 +aI-629 +aI667 +aI-646 +aa(lp24829 +g15 +aI735 +aI-698 +aI699 +aI-676 +aI716 +aI-688 +aa(lp24830 +g15 +aI794 +aI-720 +aI754 +aI-708 +aI774 +aI-715 +aa(lp24831 +g15 +aI858 +aI-727 +aI815 +aI-725 +aI837 +aI-727 +aa(lp24832 +g15 +aI1030 +aI-665 +aI934 +aI-727 +aI991 +aI-706 +aa(lp24833 +g15 +aI1087 +aI-466 +aI1068 +aI-623 +aI1087 +aI-557 +aa(lp24834 +g20 +aI1087 +aI0 +aa(lp24835 +g10 +aa(lp24836 +g8 +aI1194 +aI0 +aa(lp24837 +g10 +aa(lp24838 +g8 +aI1194 +aI0 +aasVq +(lp24839 +(lp24840 +g8 +aI367 +aI-84 +aa(lp24841 +g15 +aI451 +aI-99 +aI400 +aI-84 +aI428 +aI-89 +aa(lp24842 +g15 +aI506 +aI-145 +aI474 +aI-109 +aI492 +aI-124 +aa(lp24843 +g15 +aI538 +aI-221 +aI520 +aI-165 +aI531 +aI-191 +aa(lp24844 +g15 +aI549 +aI-328 +aI544 +aI-252 +aI548 +aI-288 +aa(lp24845 +g20 +aI549 +aI-355 +aa(lp24846 +g15 +aI540 +aI-472 +aI549 +aI-399 +aI546 +aI-438 +aa(lp24847 +g15 +aI510 +aI-558 +aI534 +aI-506 +aI524 +aI-535 +aa(lp24848 +g15 +aI454 +aI-611 +aI496 +aI-581 +aI477 +aI-599 +aa(lp24849 +g15 +aI366 +aI-629 +aI430 +aI-623 +aI401 +aI-629 +aa(lp24850 +g15 +aI237 +aI-558 +aI307 +aI-629 +aI264 +aI-605 +aa(lp24851 +g15 +aI195 +aI-354 +aI209 +aI-510 +aI195 +aI-442 +aa(lp24852 +g15 +aI237 +aI-151 +aI195 +aI-263 +aI209 +aI-196 +aa(lp24853 +g15 +aI367 +aI-84 +aI264 +aI-107 +aI308 +aI-84 +aa(lp24854 +g10 +aa(lp24855 +g8 +aI345 +aI13 +aa(lp24856 +g15 +aI234 +aI-9 +aI304 +aI13 +aI267 +aI5 +aa(lp24857 +g15 +aI148 +aI-79 +aI200 +aI-25 +aI172 +aI-48 +aa(lp24858 +g15 +aI93 +aI-195 +aI124 +aI-110 +aI106 +aI-149 +aa(lp24859 +g15 +aI73 +aI-355 +aI80 +aI-241 +aI73 +aI-294 +aa(lp24860 +g15 +aI93 +aI-516 +aI73 +aI-416 +aI80 +aI-470 +aa(lp24861 +g15 +aI148 +aI-633 +aI106 +aI-563 +aI124 +aI-601 +aa(lp24862 +g15 +aI234 +aI-703 +aI172 +aI-664 +aI200 +aI-687 +aa(lp24863 +g15 +aI345 +aI-727 +aI267 +aI-719 +aI304 +aI-727 +aa(lp24864 +g15 +aI414 +aI-718 +aI370 +aI-727 +aI393 +aI-724 +aa(lp24865 +g15 +aI470 +aI-695 +aI435 +aI-712 +aI454 +aI-704 +aa(lp24866 +g15 +aI514 +aI-660 +aI487 +aI-685 +aI501 +aI-673 +aa(lp24867 +g15 +aI549 +aI-618 +aI527 +aI-647 +aI539 +aI-633 +aa(lp24868 +g20 +aI554 +aI-618 +aa(lp24869 +g20 +aI572 +aI-714 +aa(lp24870 +g20 +aI667 +aI-714 +aa(lp24871 +g20 +aI667 +aI320 +aa(lp24872 +g20 +aI549 +aI320 +aa(lp24873 +g20 +aI549 +aI15 +aa(lp24874 +g15 +aI550 +aI-15 +aI549 +aI7 +aI549 +aI-3 +aa(lp24875 +g15 +aI553 +aI-52 +aI551 +aI-28 +aI552 +aI-40 +aa(lp24876 +g15 +aI557 +aI-95 +aI554 +aI-66 +aI555 +aI-80 +aa(lp24877 +g20 +aI549 +aI-95 +aa(lp24878 +g15 +aI515 +aI-53 +aI539 +aI-80 +aI528 +aI-66 +aa(lp24879 +g15 +aI471 +aI-18 +aI503 +aI-40 +aI488 +aI-28 +aa(lp24880 +g15 +aI415 +aI5 +aI454 +aI-8 +aI436 +aI0 +aa(lp24881 +g15 +aI345 +aI13 +aI394 +aI10 +aI371 +aI13 +aa(lp24882 +g10 +aa(lp24883 +g8 +aI781 +aI0 +aa(lp24884 +g10 +aa(lp24885 +g8 +aI781 +aI0 +aasVu +(lp24886 +(lp24887 +g8 +aI576 +aI0 +aa(lp24888 +g20 +aI558 +aI-95 +aa(lp24889 +g20 +aI552 +aI-95 +aa(lp24890 +g15 +aI513 +aI-46 +aI541 +aI-76 +aI528 +aI-60 +aa(lp24891 +g15 +aI464 +aI-12 +aI498 +aI-33 +aI481 +aI-21 +aa(lp24892 +g15 +aI407 +aI6 +aI446 +aI-3 +aI427 +aI2 +aa(lp24893 +g15 +aI346 +aI13 +aI387 +aI11 +aI367 +aI13 +aa(lp24894 +g15 +aI242 +aI-1 +aI306 +aI13 +aI272 +aI8 +aa(lp24895 +g15 +aI167 +aI-48 +aI212 +aI-11 +aI187 +aI-27 +aa(lp24896 +g15 +aI122 +aI-129 +aI147 +aI-69 +aI132 +aI-96 +aa(lp24897 +g15 +aI106 +aI-247 +aI111 +aI-162 +aI106 +aI-202 +aa(lp24898 +g20 +aI106 +aI-714 +aa(lp24899 +g20 +aI225 +aI-714 +aa(lp24900 +g20 +aI225 +aI-254 +aa(lp24901 +g15 +aI259 +aI-127 +aI225 +aI-197 +aI236 +aI-155 +aa(lp24902 +g15 +aI366 +aI-84 +aI282 +aI-98 +aI318 +aI-84 +aa(lp24903 +g15 +aI455 +aI-101 +aI401 +aI-84 +aI431 +aI-90 +aa(lp24904 +g15 +aI512 +aI-151 +aI478 +aI-113 +aI498 +aI-129 +aa(lp24905 +g15 +aI543 +aI-232 +aI527 +aI-173 +aI537 +aI-200 +aa(lp24906 +g15 +aI553 +aI-343 +aI550 +aI-264 +aI553 +aI-301 +aa(lp24907 +g20 +aI553 +aI-714 +aa(lp24908 +g20 +aI671 +aI-714 +aa(lp24909 +g20 +aI671 +aI0 +aa(lp24910 +g10 +aa(lp24911 +g8 +aI785 +aI0 +aa(lp24912 +g10 +aa(lp24913 +g8 +aI785 +aI0 +aasVy +(lp24914 +(lp24915 +g8 +aI6 +aI-714 +aa(lp24916 +g20 +aI129 +aI-714 +aa(lp24917 +g20 +aI269 +aI-315 +aa(lp24918 +g15 +aI288 +aI-260 +aI275 +aI-297 +aI281 +aI-279 +aa(lp24919 +g15 +aI305 +aI-203 +aI294 +aI-241 +aI300 +aI-222 +aa(lp24920 +g15 +aI319 +aI-147 +aI311 +aI-184 +aI315 +aI-165 +aa(lp24921 +g15 +aI328 +aI-98 +aI323 +aI-130 +aI326 +aI-113 +aa(lp24922 +g20 +aI332 +aI-98 +aa(lp24923 +g15 +aI342 +aI-142 +aI334 +aI-109 +aI337 +aI-124 +aa(lp24924 +g15 +aI358 +aI-202 +aI347 +aI-161 +aI352 +aI-181 +aa(lp24925 +g15 +aI376 +aI-264 +aI364 +aI-223 +aI370 +aI-244 +aa(lp24926 +g15 +aI393 +aI-316 +aI382 +aI-284 +aI388 +aI-302 +aa(lp24927 +g20 +aI522 +aI-714 +aa(lp24928 +g20 +aI645 +aI-714 +aa(lp24929 +g20 +aI362 +aI93 +aa(lp24930 +g15 +aI323 +aI188 +aI350 +aI128 +aI337 +aI160 +aa(lp24931 +g15 +aI274 +aI259 +aI309 +aI216 +aI292 +aI240 +aa(lp24932 +g15 +aI208 +aI304 +aI255 +aI279 +aI233 +aI294 +aa(lp24933 +g15 +aI118 +aI320 +aI183 +aI315 +aI153 +aI320 +aa(lp24934 +g15 +aI59 +aI317 +aI95 +aI320 +aI76 +aI319 +aa(lp24935 +g15 +aI17 +aI309 +aI43 +aI314 +aI29 +aI312 +aa(lp24936 +g20 +aI17 +aI215 +aa(lp24937 +g15 +aI52 +aI220 +aI26 +aI217 +aI38 +aI219 +aa(lp24938 +g15 +aI95 +aI223 +aI65 +aI222 +aI80 +aI223 +aa(lp24939 +g15 +aI149 +aI215 +aI116 +aI223 +aI134 +aI220 +aa(lp24940 +g15 +aI189 +aI193 +aI164 +aI210 +aI178 +aI203 +aa(lp24941 +g15 +aI218 +aI158 +aI200 +aI184 +aI210 +aI172 +aa(lp24942 +g15 +aI240 +aI111 +aI226 +aI144 +aI233 +aI128 +aa(lp24943 +g20 +aI277 +aI6 +aa(lp24944 +g10 +aa(lp24945 +g8 +aI651 +aI0 +aa(lp24946 +g10 +aa(lp24947 +g8 +aI651 +aI0 +aasV} +(lp24948 +(lp24949 +g8 +aI146 +aI-204 +aa(lp24950 +g15 +aI185 +aI-313 +aI146 +aI-250 +aI159 +aI-286 +aa(lp24951 +g15 +aI298 +aI-366 +aI211 +aI-339 +aI248 +aI-357 +aa(lp24952 +g20 +aI298 +aI-373 +aa(lp24953 +g15 +aI185 +aI-426 +aI248 +aI-382 +aI211 +aI-400 +aa(lp24954 +g15 +aI146 +aI-535 +aI159 +aI-453 +aI146 +aI-489 +aa(lp24955 +g20 +aI146 +aI-751 +aa(lp24956 +g15 +aI138 +aI-802 +aI146 +aI-772 +aI143 +aI-789 +aa(lp24957 +g15 +aI116 +aI-833 +aI133 +aI-815 +aI125 +aI-826 +aa(lp24958 +g15 +aI80 +aI-849 +aI106 +aI-841 +aI94 +aI-846 +aa(lp24959 +g15 +aI33 +aI-854 +aI66 +aI-852 +aI50 +aI-853 +aa(lp24960 +g20 +aI33 +aI-951 +aa(lp24961 +g15 +aI125 +aI-939 +aI66 +aI-950 +aI97 +aI-947 +aa(lp24962 +g15 +aI199 +aI-906 +aI154 +aI-932 +aI178 +aI-921 +aa(lp24963 +g15 +aI248 +aI-847 +aI220 +aI-890 +aI236 +aI-871 +aa(lp24964 +g15 +aI265 +aI-760 +aI259 +aI-823 +aI265 +aI-794 +aa(lp24965 +g20 +aI265 +aI-543 +aa(lp24966 +g15 +aI276 +aI-486 +aI265 +aI-521 +aI269 +aI-502 +aa(lp24967 +g15 +aI308 +aI-448 +aI283 +aI-470 +aI294 +aI-458 +aa(lp24968 +g15 +aI360 +aI-427 +aI322 +aI-438 +aI339 +aI-431 +aa(lp24969 +g15 +aI432 +aI-420 +aI381 +aI-422 +aI405 +aI-420 +aa(lp24970 +g20 +aI432 +aI-319 +aa(lp24971 +g15 +aI308 +aI-291 +aI378 +aI-319 +aI336 +aI-310 +aa(lp24972 +g15 +aI265 +aI-196 +aI279 +aI-273 +aI265 +aI-241 +aa(lp24973 +g20 +aI265 +aI20 +aa(lp24974 +g15 +aI248 +aI107 +aI265 +aI54 +aI259 +aI83 +aa(lp24975 +g15 +aI199 +aI166 +aI236 +aI131 +aI220 +aI150 +aa(lp24976 +g15 +aI125 +aI199 +aI178 +aI181 +aI154 +aI192 +aa(lp24977 +g15 +aI33 +aI211 +aI97 +aI207 +aI66 +aI210 +aa(lp24978 +g20 +aI33 +aI113 +aa(lp24979 +g15 +aI80 +aI108 +aI50 +aI113 +aI66 +aI111 +aa(lp24980 +g15 +aI116 +aI93 +aI94 +aI106 +aI106 +aI100 +aa(lp24981 +g15 +aI138 +aI61 +aI125 +aI85 +aI133 +aI75 +aa(lp24982 +g15 +aI146 +aI10 +aI143 +aI48 +aI146 +aI31 +aa(lp24983 +g10 +aa(lp24984 +g8 +aI472 +aI0 +aa(lp24985 +g10 +aa(lp24986 +g8 +aI472 +aI0 +aasssS'Droid Sans Mono' +p24987 +(dp24988 +g10874 +(dp24989 +V +(lp24990 +(lp24991 +g8 +aI800 +aI0 +aa(lp24992 +g10 +aa(lp24993 +g8 +aI800 +aI0 +aasV$ +(lp24994 +(lp24995 +g8 +aI445 +aI-71 +aa(lp24996 +g20 +aI445 +aI77 +aa(lp24997 +g20 +aI356 +aI77 +aa(lp24998 +g20 +aI356 +aI-65 +aa(lp24999 +g15 +aI118 +aI-111 +aI257 +aI-65 +aI177 +aI-81 +aa(lp25000 +g20 +aI118 +aI-223 +aa(lp25001 +g15 +aI356 +aI-163 +aI203 +aI-183 +aI282 +aI-163 +aa(lp25002 +g20 +aI356 +aI-446 +aa(lp25003 +g15 +aI180 +aI-540 +aI272 +aI-473 +aI213 +aI-505 +aa(lp25004 +g15 +aI129 +aI-683 +aI146 +aI-576 +aI129 +aI-623 +aa(lp25005 +g15 +aI189 +aI-825 +aI129 +aI-740 +aI149 +aI-787 +aa(lp25006 +g15 +aI356 +aI-894 +aI229 +aI-862 +aI284 +aI-885 +aa(lp25007 +g20 +aI356 +aI-1011 +aa(lp25008 +g20 +aI445 +aI-1011 +aa(lp25009 +g20 +aI445 +aI-896 +aa(lp25010 +g15 +aI664 +aI-845 +aI526 +aI-892 +aI599 +aI-875 +aa(lp25011 +g20 +aI621 +aI-751 +aa(lp25012 +g15 +aI445 +aI-798 +aI560 +aI-778 +aI501 +aI-794 +aa(lp25013 +g20 +aI445 +aI-523 +aa(lp25014 +g15 +aI627 +aI-426 +aI531 +aI-494 +aI592 +aI-461 +aa(lp25015 +g15 +aI679 +aI-289 +aI662 +aI-392 +aI679 +aI-346 +aa(lp25016 +g15 +aI445 +aI-71 +aI679 +aI-168 +aI601 +aI-95 +aa(lp25017 +g10 +aa(lp25018 +g8 +aI356 +aI-555 +aa(lp25019 +g20 +aI356 +aI-795 +aa(lp25020 +g15 +aI244 +aI-682 +aI281 +aI-783 +aI244 +aI-745 +aa(lp25021 +g15 +aI270 +aI-603 +aI244 +aI-648 +aI252 +aI-622 +aa(lp25022 +g15 +aI356 +aI-555 +aI288 +aI-585 +aI316 +aI-568 +aa(lp25023 +g10 +aa(lp25024 +g8 +aI445 +aI-412 +aa(lp25025 +g20 +aI445 +aI-170 +aa(lp25026 +g15 +aI565 +aI-289 +aI525 +aI-182 +aI565 +aI-222 +aa(lp25027 +g15 +aI445 +aI-412 +aI565 +aI-345 +aI525 +aI-386 +aa(lp25028 +g10 +aa(lp25029 +g8 +aI800 +aI0 +aa(lp25030 +g10 +aa(lp25031 +g8 +aI800 +aI0 +aasV( +(lp25032 +(lp25033 +g8 +aI481 +aI-951 +aa(lp25034 +g20 +aI606 +aI-951 +aa(lp25035 +g15 +aI314 +aI-369 +aI411 +aI-788 +aI314 +aI-594 +aa(lp25036 +g15 +aI605 +aI211 +aI314 +aI-143 +aI411 +aI49 +aa(lp25037 +g20 +aI481 +aI211 +aa(lp25038 +g15 +aI192 +aI-368 +aI288 +aI58 +aI192 +aI-135 +aa(lp25039 +g15 +aI481 +aI-951 +aI192 +aI-599 +aI288 +aI-793 +aa(lp25040 +g10 +aa(lp25041 +g8 +aI800 +aI0 +aa(lp25042 +g10 +aa(lp25043 +g8 +aI800 +aI0 +aasV, +(lp25044 +(lp25045 +g8 +aI501 +aI-170 +aa(lp25046 +g20 +aI511 +aI-154 +aa(lp25047 +g15 +aI385 +aI188 +aI486 +aI-57 +aI444 +aI57 +aa(lp25048 +g20 +aI286 +aI188 +aa(lp25049 +g15 +aI358 +aI-170 +aI319 +aI48 +aI343 +aI-71 +aa(lp25050 +g10 +aa(lp25051 +g8 +aI800 +aI0 +aa(lp25052 +g10 +aa(lp25053 +g8 +aI800 +aI0 +aasV0 +(lp25054 +(lp25055 +g8 +aI398 +aI13 +aa(lp25056 +g15 +aI172 +aI-112 +aI299 +aI13 +aI223 +aI-28 +aa(lp25057 +g15 +aI95 +aI-476 +aI121 +aI-196 +aI95 +aI-317 +aa(lp25058 +g15 +aI398 +aI-966 +aI95 +aI-803 +aI196 +aI-966 +aa(lp25059 +g15 +aI626 +aI-840 +aI499 +aI-966 +aI575 +aI-924 +aa(lp25060 +g15 +aI703 +aI-476 +aI678 +aI-756 +aI703 +aI-635 +aa(lp25061 +g15 +aI398 +aI13 +aI703 +aI-149 +aI601 +aI13 +aa(lp25062 +g10 +aa(lp25063 +g8 +aI398 +aI-87 +aa(lp25064 +g15 +aI539 +aI-178 +aI462 +aI-87 +aI509 +aI-117 +aa(lp25065 +g15 +aI583 +aI-476 +aI569 +aI-239 +aI583 +aI-339 +aa(lp25066 +g15 +aI539 +aI-773 +aI583 +aI-613 +aI569 +aI-712 +aa(lp25067 +g15 +aI398 +aI-864 +aI509 +aI-834 +aI462 +aI-864 +aa(lp25068 +g15 +aI260 +aI-773 +aI335 +aI-864 +aI289 +aI-834 +aa(lp25069 +g15 +aI216 +aI-476 +aI230 +aI-713 +aI216 +aI-614 +aa(lp25070 +g15 +aI260 +aI-178 +aI216 +aI-338 +aI230 +aI-239 +aa(lp25071 +g15 +aI398 +aI-87 +aI289 +aI-117 +aI335 +aI-87 +aa(lp25072 +g10 +aa(lp25073 +g8 +aI800 +aI0 +aa(lp25074 +g10 +aa(lp25075 +g8 +aI800 +aI0 +aasV4 +(lp25076 +(lp25077 +g8 +aI733 +aI-213 +aa(lp25078 +g20 +aI594 +aI-213 +aa(lp25079 +g20 +aI594 +aI0 +aa(lp25080 +g20 +aI479 +aI0 +aa(lp25081 +g20 +aI479 +aI-213 +aa(lp25082 +g20 +aI39 +aI-213 +aa(lp25083 +g20 +aI39 +aI-316 +aa(lp25084 +g20 +aI472 +aI-956 +aa(lp25085 +g20 +aI594 +aI-956 +aa(lp25086 +g20 +aI594 +aI-321 +aa(lp25087 +g20 +aI733 +aI-321 +aa(lp25088 +g10 +aa(lp25089 +g8 +aI479 +aI-321 +aa(lp25090 +g20 +aI479 +aI-552 +aa(lp25091 +g15 +aI488 +aI-834 +aI479 +aI-629 +aI482 +aI-723 +aa(lp25092 +g20 +aI482 +aI-834 +aa(lp25093 +g15 +aI423 +aI-716 +aI466 +aI-789 +aI447 +aI-750 +aa(lp25094 +g20 +aI156 +aI-321 +aa(lp25095 +g10 +aa(lp25096 +g8 +aI800 +aI0 +aa(lp25097 +g10 +aa(lp25098 +g8 +aI800 +aI0 +aasV8 +(lp25099 +(lp25100 +g8 +aI497 +aI-503 +aa(lp25101 +g15 +aI698 +aI-247 +aI631 +aI-434 +aI698 +aI-348 +aa(lp25102 +g15 +aI616 +aI-58 +aI698 +aI-169 +aI671 +aI-105 +aa(lp25103 +g15 +aI399 +aI13 +aI561 +aI-10 +aI489 +aI13 +aa(lp25104 +g15 +aI180 +aI-53 +aI305 +aI13 +aI232 +aI-8 +aa(lp25105 +g15 +aI101 +aI-242 +aI127 +aI-98 +aI101 +aI-161 +aa(lp25106 +g15 +aI285 +aI-498 +aI101 +aI-353 +aI162 +aI-439 +aa(lp25107 +g15 +aI132 +aI-738 +aI183 +aI-561 +aI132 +aI-641 +aa(lp25108 +g15 +aI208 +aI-904 +aI132 +aI-808 +aI157 +aI-863 +aa(lp25109 +g15 +aI399 +aI-966 +aI258 +aI-945 +aI322 +aI-966 +aa(lp25110 +g15 +aI593 +aI-904 +aI479 +aI-966 +aI544 +aI-945 +aa(lp25111 +g15 +aI667 +aI-737 +aI643 +aI-863 +aI667 +aI-807 +aa(lp25112 +g15 +aI497 +aI-503 +aI667 +aI-637 +aI611 +aI-559 +aa(lp25113 +g10 +aa(lp25114 +g8 +aI401 +aI-551 +aa(lp25115 +g15 +aI552 +aI-732 +aI501 +aI-596 +aI552 +aI-656 +aa(lp25116 +g15 +aI511 +aI-832 +aI552 +aI-776 +aI538 +aI-809 +aa(lp25117 +g15 +aI398 +aI-867 +aI483 +aI-855 +aI446 +aI-867 +aa(lp25118 +g15 +aI288 +aI-832 +aI352 +aI-867 +aI315 +aI-855 +aa(lp25119 +g15 +aI248 +aI-732 +aI261 +aI-809 +aI248 +aI-776 +aa(lp25120 +g15 +aI280 +aI-633 +aI248 +aI-693 +aI258 +aI-660 +aa(lp25121 +g15 +aI401 +aI-551 +aI301 +aI-606 +aI342 +aI-578 +aa(lp25122 +g10 +aa(lp25123 +g8 +aI382 +aI-452 +aa(lp25124 +g15 +aI217 +aI-241 +aI272 +aI-400 +aI217 +aI-329 +aa(lp25125 +g15 +aI397 +aI-84 +aI217 +aI-136 +aI277 +aI-84 +aa(lp25126 +g15 +aI534 +aI-127 +aI456 +aI-84 +aI501 +aI-99 +aa(lp25127 +g15 +aI582 +aI-246 +aI566 +aI-155 +aI582 +aI-195 +aa(lp25128 +g15 +aI541 +aI-350 +aI582 +aI-285 +aI569 +aI-319 +aa(lp25129 +g15 +aI402 +aI-443 +aI514 +aI-380 +aI467 +aI-411 +aa(lp25130 +g10 +aa(lp25131 +g8 +aI800 +aI0 +aa(lp25132 +g10 +aa(lp25133 +g8 +aI800 +aI0 +aasV< +(lp25134 +(lp25135 +g8 +aI699 +aI-143 +aa(lp25136 +g20 +aI98 +aI-437 +aa(lp25137 +g20 +aI98 +aI-503 +aa(lp25138 +g20 +aI699 +aI-797 +aa(lp25139 +g20 +aI699 +aI-692 +aa(lp25140 +g20 +aI234 +aI-470 +aa(lp25141 +g20 +aI699 +aI-247 +aa(lp25142 +g10 +aa(lp25143 +g8 +aI800 +aI0 +aa(lp25144 +g10 +aa(lp25145 +g8 +aI800 +aI0 +aasV@ +(lp25146 +(lp25147 +g8 +aI520 +aI-260 +aa(lp25148 +g20 +aI517 +aI-260 +aa(lp25149 +g15 +aI367 +aI-143 +aI485 +aI-182 +aI435 +aI-143 +aa(lp25150 +g15 +aI244 +aI-211 +aI315 +aI-143 +aI274 +aI-166 +aa(lp25151 +g15 +aI198 +aI-394 +aI213 +aI-256 +aI198 +aI-317 +aa(lp25152 +g15 +aI261 +aI-610 +aI198 +aI-483 +aI219 +aI-555 +aa(lp25153 +g15 +aI427 +aI-692 +aI303 +aI-665 +aI359 +aI-692 +aa(lp25154 +g15 +aI594 +aI-662 +aI487 +aI-692 +aI542 +aI-682 +aa(lp25155 +g20 +aI580 +aI-391 +aa(lp25156 +g15 +aI578 +aI-346 +aI579 +aI-374 +aI578 +aI-360 +aa(lp25157 +g20 +aI578 +aI-341 +aa(lp25158 +g15 +aI625 +aI-227 +aI578 +aI-265 +aI594 +aI-227 +aa(lp25159 +g15 +aI690 +aI-476 +aI669 +aI-227 +aI690 +aI-310 +aa(lp25160 +g15 +aI618 +aI-760 +aI690 +aI-597 +aI666 +aI-692 +aa(lp25161 +g15 +aI423 +aI-863 +aI570 +aI-829 +aI505 +aI-863 +aa(lp25162 +g15 +aI194 +aI-738 +aI325 +aI-863 +aI249 +aI-821 +aa(lp25163 +g15 +aI111 +aI-395 +aI139 +aI-655 +aI111 +aI-540 +aa(lp25164 +g15 +aI196 +aI-81 +aI111 +aI-259 +aI140 +aI-155 +aa(lp25165 +g15 +aI436 +aI29 +aI252 +aI-7 +aI332 +aI29 +aa(lp25166 +g15 +aI661 +aI-21 +aI514 +aI29 +aI589 +aI12 +aa(lp25167 +g20 +aI661 +aI65 +aa(lp25168 +g15 +aI432 +aI118 +aI592 +aI101 +aI516 +aI118 +aa(lp25169 +g15 +aI129 +aI-15 +aI302 +aI118 +aI201 +aI74 +aa(lp25170 +g15 +aI20 +aI-391 +aI56 +aI-105 +aI20 +aI-230 +aa(lp25171 +g15 +aI128 +aI-800 +aI20 +aI-563 +aI56 +aI-700 +aa(lp25172 +g15 +aI425 +aI-951 +aI201 +aI-901 +aI300 +aI-951 +aa(lp25173 +g15 +aI683 +aI-823 +aI532 +aI-951 +aI618 +aI-908 +aa(lp25174 +g15 +aI779 +aI-475 +aI747 +aI-738 +aI779 +aI-622 +aa(lp25175 +g15 +aI738 +aI-234 +aI779 +aI-375 +aI766 +aI-294 +aa(lp25176 +g15 +aI622 +aI-143 +aI710 +aI-173 +aI671 +aI-143 +aa(lp25177 +g15 +aI520 +aI-260 +aI566 +aI-143 +aI532 +aI-182 +aa(lp25178 +g10 +aa(lp25179 +g8 +aI489 +aI-595 +aa(lp25180 +g15 +aI422 +aI-608 +aI466 +aI-604 +aI443 +aI-608 +aa(lp25181 +g15 +aI333 +aI-548 +aI383 +aI-608 +aI354 +aI-588 +aa(lp25182 +g15 +aI302 +aI-391 +aI313 +aI-507 +aI302 +aI-455 +aa(lp25183 +g15 +aI385 +aI-227 +aI302 +aI-282 +aI330 +aI-227 +aa(lp25184 +g15 +aI479 +aI-430 +aI442 +aI-227 +aI473 +aI-295 +aa(lp25185 +g10 +aa(lp25186 +g8 +aI800 +aI0 +aa(lp25187 +g10 +aa(lp25188 +g8 +aI800 +aI0 +aasVD +(lp25189 +(lp25190 +g8 +aI87 +aI0 +aa(lp25191 +g20 +aI87 +aI-951 +aa(lp25192 +g20 +aI310 +aI-951 +aa(lp25193 +g15 +aI631 +aI-828 +aI448 +aI-951 +aI555 +aI-910 +aa(lp25194 +g15 +aI746 +aI-484 +aI708 +aI-746 +aI746 +aI-631 +aa(lp25195 +g15 +aI627 +aI-124 +aI746 +aI-327 +aI707 +aI-207 +aa(lp25196 +g15 +aI283 +aI0 +aI548 +aI-41 +aI433 +aI0 +aa(lp25197 +g10 +aa(lp25198 +g8 +aI209 +aI-847 +aa(lp25199 +g20 +aI209 +aI-103 +aa(lp25200 +g20 +aI272 +aI-103 +aa(lp25201 +g15 +aI618 +aI-480 +aI503 +aI-103 +aI618 +aI-229 +aa(lp25202 +g15 +aI297 +aI-847 +aI618 +aI-725 +aI511 +aI-847 +aa(lp25203 +g10 +aa(lp25204 +g8 +aI800 +aI0 +aa(lp25205 +g10 +aa(lp25206 +g8 +aI800 +aI0 +aasVH +(lp25207 +(lp25208 +g8 +aI712 +aI0 +aa(lp25209 +g20 +aI590 +aI0 +aa(lp25210 +g20 +aI590 +aI-443 +aa(lp25211 +g20 +aI209 +aI-443 +aa(lp25212 +g20 +aI209 +aI0 +aa(lp25213 +g20 +aI87 +aI0 +aa(lp25214 +g20 +aI87 +aI-951 +aa(lp25215 +g20 +aI209 +aI-951 +aa(lp25216 +g20 +aI209 +aI-550 +aa(lp25217 +g20 +aI590 +aI-550 +aa(lp25218 +g20 +aI590 +aI-951 +aa(lp25219 +g20 +aI712 +aI-951 +aa(lp25220 +g10 +aa(lp25221 +g8 +aI800 +aI0 +aa(lp25222 +g10 +aa(lp25223 +g8 +aI800 +aI0 +aasVL +(lp25224 +(lp25225 +g8 +aI151 +aI0 +aa(lp25226 +g20 +aI151 +aI-951 +aa(lp25227 +g20 +aI273 +aI-951 +aa(lp25228 +g20 +aI273 +aI-107 +aa(lp25229 +g20 +aI686 +aI-107 +aa(lp25230 +g20 +aI686 +aI0 +aa(lp25231 +g10 +aa(lp25232 +g8 +aI800 +aI0 +aa(lp25233 +g10 +aa(lp25234 +g8 +aI800 +aI0 +aasVP +(lp25235 +(lp25236 +g8 +aI235 +aI-369 +aa(lp25237 +g20 +aI235 +aI0 +aa(lp25238 +g20 +aI114 +aI0 +aa(lp25239 +g20 +aI114 +aI-951 +aa(lp25240 +g20 +aI377 +aI-951 +aa(lp25241 +g15 +aI712 +aI-672 +aI600 +aI-951 +aI712 +aI-858 +aa(lp25242 +g15 +aI622 +aI-450 +aI712 +aI-577 +aI682 +aI-503 +aa(lp25243 +g15 +aI360 +aI-369 +aI561 +aI-396 +aI474 +aI-369 +aa(lp25244 +g10 +aa(lp25245 +g8 +aI235 +aI-472 +aa(lp25246 +g20 +aI346 +aI-472 +aa(lp25247 +g15 +aI530 +aI-519 +aI432 +aI-472 +aI493 +aI-488 +aa(lp25248 +g15 +aI586 +aI-666 +aI568 +aI-550 +aI586 +aI-599 +aa(lp25249 +g15 +aI366 +aI-847 +aI586 +aI-787 +aI513 +aI-847 +aa(lp25250 +g20 +aI235 +aI-847 +aa(lp25251 +g10 +aa(lp25252 +g8 +aI800 +aI0 +aa(lp25253 +g10 +aa(lp25254 +g8 +aI800 +aI0 +aasVT +(lp25255 +(lp25256 +g8 +aI460 +aI0 +aa(lp25257 +g20 +aI338 +aI0 +aa(lp25258 +g20 +aI338 +aI-844 +aa(lp25259 +g20 +aI66 +aI-844 +aa(lp25260 +g20 +aI66 +aI-951 +aa(lp25261 +g20 +aI731 +aI-951 +aa(lp25262 +g20 +aI731 +aI-844 +aa(lp25263 +g20 +aI460 +aI-844 +aa(lp25264 +g10 +aa(lp25265 +g8 +aI800 +aI0 +aa(lp25266 +g10 +aa(lp25267 +g8 +aI800 +aI0 +aasVX +(lp25268 +(lp25269 +g8 +aI764 +aI0 +aa(lp25270 +g20 +aI626 +aI0 +aa(lp25271 +g20 +aI395 +aI-412 +aa(lp25272 +g20 +aI157 +aI0 +aa(lp25273 +g20 +aI34 +aI0 +aa(lp25274 +g20 +aI329 +aI-496 +aa(lp25275 +g20 +aI54 +aI-951 +aa(lp25276 +g20 +aI184 +aI-951 +aa(lp25277 +g20 +aI399 +aI-587 +aa(lp25278 +g20 +aI617 +aI-951 +aa(lp25279 +g20 +aI741 +aI-951 +aa(lp25280 +g20 +aI466 +aI-500 +aa(lp25281 +g10 +aa(lp25282 +g8 +aI800 +aI0 +aa(lp25283 +g10 +aa(lp25284 +g8 +aI800 +aI0 +aasV\u005C +(lp25285 +(lp25286 +g8 +aI253 +aI-951 +aa(lp25287 +g20 +aI661 +aI0 +aa(lp25288 +g20 +aI545 +aI0 +aa(lp25289 +g20 +aI137 +aI-951 +aa(lp25290 +g10 +aa(lp25291 +g8 +aI800 +aI0 +aa(lp25292 +g10 +aa(lp25293 +g8 +aI800 +aI0 +aasV` +(lp25294 +(lp25295 +g8 +aI527 +aI-807 +aa(lp25296 +g20 +aI449 +aI-807 +aa(lp25297 +g15 +aI272 +aI-1007 +aI377 +aI-869 +aI318 +aI-935 +aa(lp25298 +g20 +aI272 +aI-1021 +aa(lp25299 +g20 +aI414 +aI-1021 +aa(lp25300 +g15 +aI527 +aI-825 +aI452 +aI-943 +aI489 +aI-878 +aa(lp25301 +g10 +aa(lp25302 +g8 +aI800 +aI0 +aa(lp25303 +g10 +aa(lp25304 +g8 +aI800 +aI0 +aasVd +(lp25305 +(lp25306 +g8 +aI583 +aI-95 +aa(lp25307 +g20 +aI578 +aI-95 +aa(lp25308 +g15 +aI369 +aI13 +aI529 +aI-22 +aI459 +aI13 +aa(lp25309 +g15 +aI163 +aI-83 +aI281 +aI13 +aI213 +aI-18 +aa(lp25310 +g15 +aI89 +aI-355 +aI114 +aI-148 +aI89 +aI-239 +aa(lp25311 +g15 +aI164 +aI-629 +aI89 +aI-472 +aI114 +aI-564 +aa(lp25312 +g15 +aI369 +aI-727 +aI213 +aI-694 +aI282 +aI-727 +aa(lp25313 +g15 +aI578 +aI-623 +aI458 +aI-727 +aI528 +aI-692 +aa(lp25314 +g20 +aI586 +aI-623 +aa(lp25315 +g15 +aI578 +aI-728 +aI581 +aI-679 +aI578 +aI-714 +aa(lp25316 +g20 +aI578 +aI-1012 +aa(lp25317 +g20 +aI697 +aI-1012 +aa(lp25318 +g20 +aI697 +aI0 +aa(lp25319 +g20 +aI601 +aI0 +aa(lp25320 +g10 +aa(lp25321 +g8 +aI578 +aI-328 +aa(lp25322 +g20 +aI578 +aI-355 +aa(lp25323 +g15 +aI533 +aI-566 +aI578 +aI-454 +aI563 +aI-524 +aa(lp25324 +g15 +aI389 +aI-629 +aI503 +aI-608 +aI455 +aI-629 +aa(lp25325 +g15 +aI212 +aI-354 +aI271 +aI-629 +aI212 +aI-537 +aa(lp25326 +g15 +aI390 +aI-84 +aI212 +aI-174 +aI271 +aI-84 +aa(lp25327 +g15 +aI532 +aI-142 +aI456 +aI-84 +aI504 +aI-104 +aa(lp25328 +g15 +aI578 +aI-328 +aI561 +aI-180 +aI577 +aI-243 +aa(lp25329 +g10 +aa(lp25330 +g8 +aI800 +aI0 +aa(lp25331 +g10 +aa(lp25332 +g8 +aI800 +aI0 +aasVh +(lp25333 +(lp25334 +g8 +aI577 +aI0 +aa(lp25335 +g20 +aI577 +aI-459 +aa(lp25336 +g15 +aI422 +aI-629 +aI577 +aI-572 +aI525 +aI-629 +aa(lp25337 +g15 +aI222 +aI-369 +aI289 +aI-629 +aI222 +aI-542 +aa(lp25338 +g20 +aI222 +aI0 +aa(lp25339 +g20 +aI104 +aI0 +aa(lp25340 +g20 +aI104 +aI-1012 +aa(lp25341 +g20 +aI222 +aI-1012 +aa(lp25342 +g20 +aI222 +aI-711 +aa(lp25343 +g20 +aI217 +aI-618 +aa(lp25344 +g20 +aI223 +aI-618 +aa(lp25345 +g15 +aI442 +aI-727 +aI268 +aI-690 +aI341 +aI-727 +aa(lp25346 +g15 +aI695 +aI-466 +aI611 +aI-727 +aI695 +aI-640 +aa(lp25347 +g20 +aI695 +aI0 +aa(lp25348 +g10 +aa(lp25349 +g8 +aI800 +aI0 +aa(lp25350 +g10 +aa(lp25351 +g8 +aI800 +aI0 +aasVl +(lp25352 +(lp25353 +g8 +aI346 +aI-919 +aa(lp25354 +g20 +aI171 +aI-933 +aa(lp25355 +g20 +aI171 +aI-1012 +aa(lp25356 +g20 +aI465 +aI-1012 +aa(lp25357 +g20 +aI465 +aI-92 +aa(lp25358 +g20 +aI694 +aI-79 +aa(lp25359 +g20 +aI694 +aI0 +aa(lp25360 +g20 +aI122 +aI0 +aa(lp25361 +g20 +aI122 +aI-79 +aa(lp25362 +g20 +aI346 +aI-92 +aa(lp25363 +g10 +aa(lp25364 +g8 +aI800 +aI0 +aa(lp25365 +g10 +aa(lp25366 +g8 +aI800 +aI0 +aasVp +(lp25367 +(lp25368 +g8 +aI221 +aI-90 +aa(lp25369 +g20 +aI213 +aI-90 +aa(lp25370 +g15 +aI221 +aI15 +aI218 +aI-34 +aI221 +aI1 +aa(lp25371 +g20 +aI221 +aI320 +aa(lp25372 +g20 +aI102 +aI320 +aa(lp25373 +g20 +aI102 +aI-714 +aa(lp25374 +g20 +aI198 +aI-714 +aa(lp25375 +g20 +aI216 +aI-618 +aa(lp25376 +g20 +aI221 +aI-618 +aa(lp25377 +g15 +aI430 +aI-727 +aI269 +aI-690 +aI338 +aI-727 +aa(lp25378 +g15 +aI636 +aI-630 +aI518 +aI-727 +aI586 +aI-694 +aa(lp25379 +g15 +aI710 +aI-358 +aI686 +aI-565 +aI710 +aI-474 +aa(lp25380 +g15 +aI636 +aI-84 +aI710 +aI-241 +aI685 +aI-149 +aa(lp25381 +g15 +aI430 +aI13 +aI586 +aI-19 +aI517 +aI13 +aa(lp25382 +g15 +aI221 +aI-90 +aI341 +aI13 +aI271 +aI-21 +aa(lp25383 +g10 +aa(lp25384 +g8 +aI221 +aI-384 +aa(lp25385 +g20 +aI221 +aI-358 +aa(lp25386 +g15 +aI266 +aI-147 +aI221 +aI-259 +aI236 +aI-189 +aa(lp25387 +g15 +aI410 +aI-84 +aI296 +aI-105 +aI344 +aI-84 +aa(lp25388 +g15 +aI587 +aI-359 +aI528 +aI-84 +aI587 +aI-176 +aa(lp25389 +g15 +aI409 +aI-629 +aI587 +aI-539 +aI528 +aI-629 +aa(lp25390 +g15 +aI267 +aI-571 +aI343 +aI-629 +aI296 +aI-610 +aa(lp25391 +g15 +aI221 +aI-384 +aI238 +aI-533 +aI223 +aI-471 +aa(lp25392 +g10 +aa(lp25393 +g8 +aI800 +aI0 +aa(lp25394 +g10 +aa(lp25395 +g8 +aI800 +aI0 +aasVt +(lp25396 +(lp25397 +g8 +aI664 +aI-97 +aa(lp25398 +g20 +aI664 +aI-7 +aa(lp25399 +g15 +aI500 +aI13 +aI607 +aI6 +aI552 +aI13 +aa(lp25400 +g15 +aI264 +aI-210 +aI342 +aI13 +aI264 +aI-61 +aa(lp25401 +g20 +aI264 +aI-625 +aa(lp25402 +g20 +aI90 +aI-625 +aa(lp25403 +g20 +aI90 +aI-686 +aa(lp25404 +g20 +aI264 +aI-718 +aa(lp25405 +g20 +aI314 +aI-905 +aa(lp25406 +g20 +aI382 +aI-905 +aa(lp25407 +g20 +aI382 +aI-714 +aa(lp25408 +g20 +aI667 +aI-714 +aa(lp25409 +g20 +aI667 +aI-625 +aa(lp25410 +g20 +aI382 +aI-625 +aa(lp25411 +g20 +aI382 +aI-210 +aa(lp25412 +g15 +aI507 +aI-83 +aI382 +aI-125 +aI424 +aI-83 +aa(lp25413 +g15 +aI664 +aI-97 +aI548 +aI-83 +aI600 +aI-88 +aa(lp25414 +g10 +aa(lp25415 +g8 +aI800 +aI0 +aa(lp25416 +g10 +aa(lp25417 +g8 +aI800 +aI0 +aasVx +(lp25418 +(lp25419 +g8 +aI332 +aI-366 +aa(lp25420 +g20 +aI76 +aI-714 +aa(lp25421 +g20 +aI210 +aI-714 +aa(lp25422 +g20 +aI399 +aI-447 +aa(lp25423 +g20 +aI589 +aI-714 +aa(lp25424 +g20 +aI723 +aI-714 +aa(lp25425 +g20 +aI466 +aI-366 +aa(lp25426 +g20 +aI735 +aI0 +aa(lp25427 +g20 +aI601 +aI0 +aa(lp25428 +g20 +aI399 +aI-283 +aa(lp25429 +g20 +aI197 +aI0 +aa(lp25430 +g20 +aI62 +aI0 +aa(lp25431 +g10 +aa(lp25432 +g8 +aI800 +aI0 +aa(lp25433 +g10 +aa(lp25434 +g8 +aI800 +aI0 +aasV| +(lp25435 +(lp25436 +g8 +aI350 +aI-1012 +aa(lp25437 +g20 +aI447 +aI-1012 +aa(lp25438 +g20 +aI447 +aI320 +aa(lp25439 +g20 +aI350 +aI320 +aa(lp25440 +g10 +aa(lp25441 +g8 +aI800 +aI0 +aa(lp25442 +g10 +aa(lp25443 +g8 +aI800 +aI0 +aasV# +(lp25444 +(lp25445 +g8 +aI609 +aI-580 +aa(lp25446 +g20 +aI567 +aI-367 +aa(lp25447 +g20 +aI723 +aI-367 +aa(lp25448 +g20 +aI723 +aI-278 +aa(lp25449 +g20 +aI550 +aI-278 +aa(lp25450 +g20 +aI497 +aI0 +aa(lp25451 +g20 +aI401 +aI0 +aa(lp25452 +g20 +aI455 +aI-278 +aa(lp25453 +g20 +aI266 +aI-278 +aa(lp25454 +g20 +aI213 +aI0 +aa(lp25455 +g20 +aI119 +aI0 +aa(lp25456 +g20 +aI170 +aI-278 +aa(lp25457 +g20 +aI29 +aI-278 +aa(lp25458 +g20 +aI29 +aI-367 +aa(lp25459 +g20 +aI188 +aI-367 +aa(lp25460 +g20 +aI230 +aI-580 +aa(lp25461 +g20 +aI78 +aI-580 +aa(lp25462 +g20 +aI78 +aI-670 +aa(lp25463 +g20 +aI246 +aI-670 +aa(lp25464 +g20 +aI300 +aI-951 +aa(lp25465 +g20 +aI395 +aI-951 +aa(lp25466 +g20 +aI342 +aI-670 +aa(lp25467 +g20 +aI533 +aI-670 +aa(lp25468 +g20 +aI587 +aI-951 +aa(lp25469 +g20 +aI681 +aI-951 +aa(lp25470 +g20 +aI626 +aI-670 +aa(lp25471 +g20 +aI770 +aI-670 +aa(lp25472 +g20 +aI770 +aI-580 +aa(lp25473 +g10 +aa(lp25474 +g8 +aI283 +aI-367 +aa(lp25475 +g20 +aI473 +aI-367 +aa(lp25476 +g20 +aI514 +aI-580 +aa(lp25477 +g20 +aI325 +aI-580 +aa(lp25478 +g10 +aa(lp25479 +g8 +aI800 +aI0 +aa(lp25480 +g10 +aa(lp25481 +g8 +aI800 +aI0 +aasV' +(lp25482 +(lp25483 +g8 +aI477 +aI-951 +aa(lp25484 +g20 +aI450 +aI-607 +aa(lp25485 +g20 +aI349 +aI-607 +aa(lp25486 +g20 +aI322 +aI-951 +aa(lp25487 +g10 +aa(lp25488 +g8 +aI800 +aI0 +aa(lp25489 +g10 +aa(lp25490 +g8 +aI800 +aI0 +aasV+ +(lp25491 +(lp25492 +g8 +aI350 +aI-420 +aa(lp25493 +g20 +aI98 +aI-420 +aa(lp25494 +g20 +aI98 +aI-518 +aa(lp25495 +g20 +aI350 +aI-518 +aa(lp25496 +g20 +aI350 +aI-771 +aa(lp25497 +g20 +aI447 +aI-771 +aa(lp25498 +g20 +aI447 +aI-518 +aa(lp25499 +g20 +aI699 +aI-518 +aa(lp25500 +g20 +aI699 +aI-420 +aa(lp25501 +g20 +aI447 +aI-420 +aa(lp25502 +g20 +aI447 +aI-170 +aa(lp25503 +g20 +aI350 +aI-170 +aa(lp25504 +g10 +aa(lp25505 +g8 +aI800 +aI0 +aa(lp25506 +g10 +aa(lp25507 +g8 +aI800 +aI0 +aasV/ +(lp25508 +(lp25509 +g8 +aI661 +aI-951 +aa(lp25510 +g20 +aI253 +aI0 +aa(lp25511 +g20 +aI137 +aI0 +aa(lp25512 +g20 +aI545 +aI-951 +aa(lp25513 +g10 +aa(lp25514 +g8 +aI800 +aI0 +aa(lp25515 +g10 +aa(lp25516 +g8 +aI800 +aI0 +aasV3 +(lp25517 +(lp25518 +g8 +aI451 +aI-500 +aa(lp25519 +g20 +aI451 +aI-496 +aa(lp25520 +g15 +aI686 +aI-270 +aI608 +aI-476 +aI686 +aI-401 +aa(lp25521 +g15 +aI597 +aI-62 +aI686 +aI-182 +aI656 +aI-112 +aa(lp25522 +g15 +aI337 +aI13 +aI537 +aI-11 +aI450 +aI13 +aa(lp25523 +g15 +aI85 +aI-37 +aI232 +aI13 +aI148 +aI-3 +aa(lp25524 +g20 +aI85 +aI-148 +aa(lp25525 +g15 +aI334 +aI-86 +aI165 +aI-106 +aI248 +aI-86 +aa(lp25526 +g15 +aI565 +aI-274 +aI488 +aI-86 +aI565 +aI-148 +aa(lp25527 +g15 +aI317 +aI-442 +aI565 +aI-386 +aI482 +aI-442 +aa(lp25528 +g20 +aI230 +aI-442 +aa(lp25529 +g20 +aI230 +aI-540 +aa(lp25530 +g20 +aI317 +aI-540 +aa(lp25531 +g15 +aI478 +aI-590 +aI386 +aI-540 +aI440 +aI-557 +aa(lp25532 +g15 +aI535 +aI-720 +aI516 +aI-623 +aI535 +aI-666 +aa(lp25533 +g15 +aI491 +aI-826 +aI535 +aI-765 +aI521 +aI-800 +aa(lp25534 +g15 +aI373 +aI-864 +aI462 +aI-851 +aI422 +aI-864 +aa(lp25535 +g15 +aI149 +aI-786 +aI295 +aI-864 +aI221 +aI-838 +aa(lp25536 +g20 +aI89 +aI-867 +aa(lp25537 +g15 +aI373 +aI-965 +aI170 +aI-932 +aI264 +aI-965 +aa(lp25538 +g15 +aI582 +aI-900 +aI462 +aI-965 +aI532 +aI-943 +aa(lp25539 +g15 +aI657 +aI-728 +aI632 +aI-857 +aI657 +aI-800 +aa(lp25540 +g15 +aI604 +aI-578 +aI657 +aI-668 +aI639 +aI-618 +aa(lp25541 +g15 +aI451 +aI-500 +aI568 +aI-537 +aI517 +aI-512 +aa(lp25542 +g10 +aa(lp25543 +g8 +aI800 +aI0 +aa(lp25544 +g10 +aa(lp25545 +g8 +aI800 +aI0 +aasV7 +(lp25546 +(lp25547 +g8 +aI217 +aI0 +aa(lp25548 +g20 +aI583 +aI-843 +aa(lp25549 +g20 +aI93 +aI-843 +aa(lp25550 +g20 +aI93 +aI-951 +aa(lp25551 +g20 +aI705 +aI-951 +aa(lp25552 +g20 +aI705 +aI-856 +aa(lp25553 +g20 +aI343 +aI0 +aa(lp25554 +g10 +aa(lp25555 +g8 +aI800 +aI0 +aa(lp25556 +g10 +aa(lp25557 +g8 +aI800 +aI0 +aasV; +(lp25558 +(lp25559 +g8 +aI404 +aI-732 +aa(lp25560 +g15 +aI486 +aI-642 +aI459 +aI-732 +aI486 +aI-702 +aa(lp25561 +g15 +aI404 +aI-551 +aI486 +aI-581 +aI459 +aI-551 +aa(lp25562 +g15 +aI321 +aI-642 +aI349 +aI-551 +aI321 +aI-581 +aa(lp25563 +g15 +aI404 +aI-732 +aI321 +aI-702 +aI349 +aI-732 +aa(lp25564 +g10 +aa(lp25565 +g8 +aI461 +aI-154 +aa(lp25566 +g20 +aI470 +aI-139 +aa(lp25567 +g15 +aI356 +aI172 +aI448 +aI-54 +aI410 +aI49 +aa(lp25568 +g20 +aI266 +aI172 +aa(lp25569 +g15 +aI332 +aI-154 +aI293 +aI61 +aI315 +aI-47 +aa(lp25570 +g10 +aa(lp25571 +g8 +aI800 +aI0 +aa(lp25572 +g10 +aa(lp25573 +g8 +aI800 +aI0 +aasV? +(lp25574 +(lp25575 +g8 +aI302 +aI-269 +aa(lp25576 +g20 +aI302 +aI-293 +aa(lp25577 +g15 +aI332 +aI-420 +aI302 +aI-345 +aI312 +aI-387 +aa(lp25578 +g15 +aI437 +aI-522 +aI352 +aI-452 +aI387 +aI-486 +aa(lp25579 +g15 +aI549 +aI-623 +aI493 +aI-564 +aI531 +aI-598 +aa(lp25580 +g15 +aI576 +aI-726 +aI567 +aI-648 +aI576 +aI-682 +aa(lp25581 +g15 +aI527 +aI-823 +aI576 +aI-766 +aI560 +aI-798 +aa(lp25582 +g15 +aI393 +aI-860 +aI495 +aI-848 +aI450 +aI-860 +aa(lp25583 +g15 +aI151 +aI-802 +aI317 +aI-860 +aI237 +aI-841 +aa(lp25584 +g20 +aI109 +aI-901 +aa(lp25585 +g15 +aI386 +aI-965 +aI200 +aI-943 +aI292 +aI-965 +aa(lp25586 +g15 +aI607 +aI-901 +aI479 +aI-965 +aI553 +aI-943 +aa(lp25587 +g15 +aI689 +aI-731 +aI662 +aI-859 +aI689 +aI-802 +aa(lp25588 +g15 +aI654 +aI-590 +aI689 +aI-673 +aI677 +aI-626 +aa(lp25589 +g15 +aI526 +aI-466 +aI631 +aI-554 +aI588 +aI-513 +aa(lp25590 +g15 +aI428 +aI-374 +aI475 +aI-428 +aI442 +aI-397 +aa(lp25591 +g15 +aI406 +aI-280 +aI414 +aI-351 +aI406 +aI-319 +aa(lp25592 +g20 +aI406 +aI-269 +aa(lp25593 +g10 +aa(lp25594 +g8 +aI360 +aI-162 +aa(lp25595 +g15 +aI442 +aI-71 +aI415 +aI-162 +aI442 +aI-132 +aa(lp25596 +g15 +aI360 +aI19 +aI442 +aI-11 +aI415 +aI19 +aa(lp25597 +g15 +aI277 +aI-71 +aI304 +aI19 +aI277 +aI-11 +aa(lp25598 +g15 +aI360 +aI-162 +aI277 +aI-132 +aI304 +aI-162 +aa(lp25599 +g10 +aa(lp25600 +g8 +aI800 +aI0 +aa(lp25601 +g10 +aa(lp25602 +g8 +aI800 +aI0 +aasVC +(lp25603 +(lp25604 +g8 +aI731 +aI-130 +aa(lp25605 +g20 +aI731 +aI-24 +aa(lp25606 +g15 +aI498 +aI13 +aI668 +aI0 +aI590 +aI13 +aa(lp25607 +g15 +aI190 +aI-114 +aI364 +aI13 +aI261 +aI-29 +aa(lp25608 +g15 +aI83 +aI-476 +aI119 +aI-199 +aI83 +aI-320 +aa(lp25609 +g15 +aI200 +aI-833 +aI83 +aI-626 +aI122 +aI-745 +aa(lp25610 +g15 +aI518 +aI-965 +aI278 +aI-921 +aI384 +aI-965 +aa(lp25611 +g15 +aI768 +aI-909 +aI614 +aI-965 +aI697 +aI-946 +aa(lp25612 +g20 +aI717 +aI-807 +aa(lp25613 +g15 +aI518 +aI-858 +aI650 +aI-841 +aI584 +aI-858 +aa(lp25614 +g15 +aI295 +aI-755 +aI425 +aI-858 +aI351 +aI-823 +aa(lp25615 +g15 +aI212 +aI-475 +aI240 +aI-686 +aI212 +aI-593 +aa(lp25616 +g15 +aI290 +aI-190 +aI212 +aI-350 +aI238 +aI-255 +aa(lp25617 +g15 +aI518 +aI-92 +aI342 +aI-125 +aI418 +aI-92 +aa(lp25618 +g15 +aI731 +aI-130 +aI575 +aI-92 +aI646 +aI-105 +aa(lp25619 +g10 +aa(lp25620 +g8 +aI800 +aI0 +aa(lp25621 +g10 +aa(lp25622 +g8 +aI800 +aI0 +aasVG +(lp25623 +(lp25624 +g8 +aI437 +aI-502 +aa(lp25625 +g20 +aI712 +aI-502 +aa(lp25626 +g20 +aI712 +aI-35 +aa(lp25627 +g15 +aI438 +aI13 +aI627 +aI-2 +aI536 +aI13 +aa(lp25628 +g15 +aI172 +aI-116 +aI325 +aI13 +aI236 +aI-29 +aa(lp25629 +g15 +aI76 +aI-476 +aI108 +aI-202 +aI76 +aI-323 +aa(lp25630 +g15 +aI181 +aI-835 +aI76 +aI-629 +aI111 +aI-748 +aa(lp25631 +g15 +aI472 +aI-965 +aI251 +aI-921 +aI348 +aI-965 +aa(lp25632 +g15 +aI697 +aI-909 +aI555 +aI-965 +aI630 +aI-946 +aa(lp25633 +g20 +aI650 +aI-803 +aa(lp25634 +g15 +aI468 +aI-858 +aI587 +aI-840 +aI526 +aI-858 +aa(lp25635 +g15 +aI273 +aI-757 +aI384 +aI-858 +aI319 +aI-824 +aa(lp25636 +g15 +aI203 +aI-475 +aI226 +aI-689 +aI203 +aI-595 +aa(lp25637 +g15 +aI460 +aI-92 +aI203 +aI-220 +aI289 +aI-92 +aa(lp25638 +g15 +aI591 +aI-111 +aI502 +aI-92 +aI546 +aI-98 +aa(lp25639 +g20 +aI591 +aI-395 +aa(lp25640 +g20 +aI437 +aI-395 +aa(lp25641 +g10 +aa(lp25642 +g8 +aI800 +aI0 +aa(lp25643 +g10 +aa(lp25644 +g8 +aI800 +aI0 +aasVK +(lp25645 +(lp25646 +g8 +aI779 +aI0 +aa(lp25647 +g20 +aI642 +aI0 +aa(lp25648 +g20 +aI349 +aI-453 +aa(lp25649 +g20 +aI258 +aI-379 +aa(lp25650 +g20 +aI258 +aI0 +aa(lp25651 +g20 +aI137 +aI0 +aa(lp25652 +g20 +aI137 +aI-951 +aa(lp25653 +g20 +aI258 +aI-951 +aa(lp25654 +g20 +aI258 +aI-475 +aa(lp25655 +g20 +aI337 +aI-584 +aa(lp25656 +g20 +aI632 +aI-951 +aa(lp25657 +g20 +aI768 +aI-951 +aa(lp25658 +g20 +aI429 +aI-536 +aa(lp25659 +g10 +aa(lp25660 +g8 +aI800 +aI0 +aa(lp25661 +g10 +aa(lp25662 +g8 +aI800 +aI0 +aasVO +(lp25663 +(lp25664 +g8 +aI401 +aI13 +aa(lp25665 +g15 +aI54 +aI-478 +aI170 +aI13 +aI54 +aI-150 +aa(lp25666 +g15 +aI402 +aI-966 +aI54 +aI-803 +aI170 +aI-966 +aa(lp25667 +g15 +aI657 +aI-839 +aI513 +aI-966 +aI598 +aI-923 +aa(lp25668 +g15 +aI746 +aI-476 +aI717 +aI-754 +aI746 +aI-633 +aa(lp25669 +g15 +aI656 +aI-114 +aI746 +aI-320 +aI716 +aI-199 +aa(lp25670 +g15 +aI401 +aI13 +aI597 +aI-29 +aI511 +aI13 +aa(lp25671 +g10 +aa(lp25672 +g8 +aI401 +aI-92 +aa(lp25673 +g15 +aI566 +aI-187 +aI476 +aI-92 +aI531 +aI-124 +aa(lp25674 +g15 +aI618 +aI-476 +aI601 +aI-249 +aI618 +aI-346 +aa(lp25675 +g15 +aI565 +aI-766 +aI618 +aI-608 +aI600 +aI-704 +aa(lp25676 +g15 +aI402 +aI-859 +aI530 +aI-828 +aI475 +aI-859 +aa(lp25677 +g15 +aI182 +aI-476 +aI256 +aI-859 +aI182 +aI-731 +aa(lp25678 +g15 +aI401 +aI-92 +aI182 +aI-220 +aI255 +aI-92 +aa(lp25679 +g10 +aa(lp25680 +g8 +aI800 +aI0 +aa(lp25681 +g10 +aa(lp25682 +g8 +aI800 +aI0 +aasVS +(lp25683 +(lp25684 +g8 +aI91 +aI-31 +aa(lp25685 +g20 +aI91 +aI-147 +aa(lp25686 +g15 +aI361 +aI-91 +aI183 +aI-110 +aI273 +aI-91 +aa(lp25687 +g15 +aI589 +aI-247 +aI513 +aI-91 +aI589 +aI-143 +aa(lp25688 +g15 +aI543 +aI-351 +aI589 +aI-292 +aI573 +aI-327 +aa(lp25689 +g15 +aI357 +aI-438 +aI512 +aI-376 +aI450 +aI-404 +aa(lp25690 +g15 +aI163 +aI-551 +aI267 +aI-470 +aI202 +aI-507 +aa(lp25691 +g15 +aI104 +aI-723 +aI123 +aI-596 +aI104 +aI-653 +aa(lp25692 +g15 +aI187 +aI-900 +aI104 +aI-799 +aI132 +aI-858 +aa(lp25693 +g15 +aI417 +aI-965 +aI243 +aI-943 +aI320 +aI-965 +aa(lp25694 +g15 +aI688 +aI-914 +aI516 +aI-965 +aI606 +aI-948 +aa(lp25695 +g20 +aI646 +aI-807 +aa(lp25696 +g15 +aI412 +aI-858 +aI562 +aI-841 +aI484 +aI-858 +aa(lp25697 +g15 +aI221 +aI-722 +aI284 +aI-858 +aI221 +aI-812 +aa(lp25698 +g15 +aI263 +aI-615 +aI221 +aI-677 +aI235 +aI-642 +aa(lp25699 +g15 +aI440 +aI-528 +aI292 +aI-588 +aI351 +aI-559 +aa(lp25700 +g15 +aI653 +aI-410 +aI546 +aI-490 +aI618 +aI-451 +aa(lp25701 +g15 +aI707 +aI-254 +aI689 +aI-370 +aI707 +aI-317 +aa(lp25702 +g15 +aI617 +aI-57 +aI707 +aI-170 +aI677 +aI-105 +aa(lp25703 +g15 +aI361 +aI13 +aI557 +aI-10 +aI472 +aI13 +aa(lp25704 +g15 +aI91 +aI-31 +aI246 +aI13 +aI156 +aI-1 +aa(lp25705 +g10 +aa(lp25706 +g8 +aI800 +aI0 +aa(lp25707 +g10 +aa(lp25708 +g8 +aI800 +aI0 +aasVW +(lp25709 +(lp25710 +g8 +aI343 +aI-655 +aa(lp25711 +g20 +aI458 +aI-655 +aa(lp25712 +g20 +aI553 +aI-316 +aa(lp25713 +g15 +aI600 +aI-116 +aI579 +aI-221 +aI595 +aI-154 +aa(lp25714 +g15 +aI642 +aI-519 +aI601 +aI-139 +aI615 +aI-274 +aa(lp25715 +g20 +aI688 +aI-951 +aa(lp25716 +g20 +aI798 +aI-951 +aa(lp25717 +g20 +aI677 +aI0 +aa(lp25718 +g20 +aI553 +aI0 +aa(lp25719 +g20 +aI444 +aI-377 +aa(lp25720 +g15 +aI401 +aI-560 +aI426 +aI-437 +aI412 +aI-498 +aa(lp25721 +g15 +aI358 +aI-375 +aI387 +aI-485 +aI373 +aI-424 +aa(lp25722 +g20 +aI257 +aI0 +aa(lp25723 +g20 +aI133 +aI0 +aa(lp25724 +g20 +aI1 +aI-951 +aa(lp25725 +g20 +aI111 +aI-951 +aa(lp25726 +g20 +aI169 +aI-519 +aa(lp25727 +g15 +aI195 +aI-273 +aI179 +aI-443 +aI187 +aI-361 +aa(lp25728 +g15 +aI206 +aI-116 +aI202 +aI-185 +aI206 +aI-133 +aa(lp25729 +g15 +aI251 +aI-319 +aI216 +aI-182 +aI231 +aI-249 +aa(lp25730 +g10 +aa(lp25731 +g8 +aI800 +aI0 +aa(lp25732 +g10 +aa(lp25733 +g8 +aI800 +aI0 +aasV[ +(lp25734 +(lp25735 +g8 +aI611 +aI211 +aa(lp25736 +g20 +aI268 +aI211 +aa(lp25737 +g20 +aI268 +aI-951 +aa(lp25738 +g20 +aI611 +aI-951 +aa(lp25739 +g20 +aI611 +aI-854 +aa(lp25740 +g20 +aI386 +aI-854 +aa(lp25741 +g20 +aI386 +aI113 +aa(lp25742 +g20 +aI611 +aI113 +aa(lp25743 +g10 +aa(lp25744 +g8 +aI800 +aI0 +aa(lp25745 +g10 +aa(lp25746 +g8 +aI800 +aI0 +aasV_ +(lp25747 +(lp25748 +g8 +aI809 +aI211 +aa(lp25749 +g20 +aI-10 +aI211 +aa(lp25750 +g20 +aI-10 +aI120 +aa(lp25751 +g20 +aI809 +aI120 +aa(lp25752 +g10 +aa(lp25753 +g8 +aI800 +aI0 +aa(lp25754 +g10 +aa(lp25755 +g8 +aI800 +aI0 +aasVc +(lp25756 +(lp25757 +g8 +aI690 +aI-689 +aa(lp25758 +g20 +aI650 +aI-586 +aa(lp25759 +g15 +aI475 +aI-623 +aI585 +aI-610 +aI527 +aI-623 +aa(lp25760 +g15 +aI234 +aI-354 +aI314 +aI-623 +aI234 +aI-533 +aa(lp25761 +g15 +aI469 +aI-90 +aI234 +aI-178 +aI312 +aI-90 +aa(lp25762 +g15 +aI678 +aI-130 +aI537 +aI-90 +aI607 +aI-103 +aa(lp25763 +g20 +aI678 +aI-26 +aa(lp25764 +g15 +aI464 +aI13 +aI620 +aI0 +aI548 +aI13 +aa(lp25765 +g15 +aI204 +aI-81 +aI352 +aI13 +aI266 +aI-18 +aa(lp25766 +g15 +aI111 +aI-353 +aI142 +aI-144 +aI111 +aI-235 +aa(lp25767 +g15 +aI206 +aI-631 +aI111 +aI-475 +aI143 +aI-567 +aa(lp25768 +g15 +aI472 +aI-727 +aI269 +aI-695 +aI357 +aI-727 +aa(lp25769 +g15 +aI690 +aI-689 +aI549 +aI-727 +aI622 +aI-714 +aa(lp25770 +g10 +aa(lp25771 +g8 +aI800 +aI0 +aa(lp25772 +g10 +aa(lp25773 +g8 +aI800 +aI0 +aasVg +(lp25774 +(lp25775 +g8 +aI733 +aI-714 +aa(lp25776 +g20 +aI733 +aI-640 +aa(lp25777 +g20 +aI605 +aI-623 +aa(lp25778 +g15 +aI647 +aI-484 +aI633 +aI-586 +aI647 +aI-540 +aa(lp25779 +g15 +aI578 +aI-317 +aI647 +aI-414 +aI624 +aI-359 +aa(lp25780 +g15 +aI385 +aI-255 +aI532 +aI-276 +aI467 +aI-255 +aa(lp25781 +g15 +aI329 +aI-259 +aI361 +aI-255 +aI342 +aI-256 +aa(lp25782 +g15 +aI264 +aI-172 +aI286 +aI-235 +aI264 +aI-206 +aa(lp25783 +g15 +aI369 +aI-118 +aI264 +aI-136 +aI299 +aI-118 +aa(lp25784 +g20 +aI490 +aI-118 +aa(lp25785 +g15 +aI664 +aI-67 +aI566 +aI-118 +aI624 +aI-101 +aa(lp25786 +g15 +aI723 +aI75 +aI703 +aI-34 +aI723 +aI13 +aa(lp25787 +g15 +aI356 +aI320 +aI723 +aI238 +aI601 +aI320 +aa(lp25788 +g15 +aI140 +aI268 +aI261 +aI320 +aI189 +aI303 +aa(lp25789 +g15 +aI66 +aI121 +aI91 +aI233 +aI66 +aI184 +aa(lp25790 +g15 +aI222 +aI-54 +aI66 +aI29 +aI118 +aI-29 +aa(lp25791 +g15 +aI160 +aI-154 +aI180 +aI-74 +aI160 +aI-108 +aa(lp25792 +g15 +aI246 +aI-279 +aI160 +aI-203 +aI189 +aI-244 +aa(lp25793 +g15 +aI155 +aI-359 +aI208 +aI-295 +aI177 +aI-322 +aa(lp25794 +g15 +aI122 +aI-480 +aI133 +aI-396 +aI122 +aI-436 +aa(lp25795 +g15 +aI191 +aI-663 +aI122 +aI-559 +aI145 +aI-620 +aa(lp25796 +g15 +aI389 +aI-727 +aI237 +aI-706 +aI303 +aI-727 +aa(lp25797 +g15 +aI486 +aI-714 +aI426 +aI-727 +aI459 +aI-723 +aa(lp25798 +g10 +aa(lp25799 +g8 +aI386 +aI-336 +aa(lp25800 +g15 +aI531 +aI-486 +aI483 +aI-336 +aI531 +aI-386 +aa(lp25801 +g15 +aI385 +aI-642 +aI531 +aI-590 +aI483 +aI-642 +aa(lp25802 +g15 +aI238 +aI-484 +aI287 +aI-642 +aI238 +aI-589 +aa(lp25803 +g15 +aI386 +aI-336 +aI238 +aI-386 +aI288 +aI-336 +aa(lp25804 +g10 +aa(lp25805 +g8 +aI450 +aI-11 +aa(lp25806 +g20 +aI328 +aI-11 +aa(lp25807 +g15 +aI178 +aI117 +aI228 +aI-11 +aI178 +aI31 +aa(lp25808 +g15 +aI354 +aI230 +aI178 +aI193 +aI237 +aI230 +aa(lp25809 +g15 +aI611 +aI85 +aI526 +aI230 +aI611 +aI182 +aa(lp25810 +g15 +aI579 +aI8 +aI611 +aI47 +aI601 +aI21 +aa(lp25811 +g15 +aI450 +aI-11 +aI557 +aI-4 +aI514 +aI-11 +aa(lp25812 +g10 +aa(lp25813 +g8 +aI800 +aI0 +aa(lp25814 +g10 +aa(lp25815 +g8 +aI800 +aI0 +aasVk +(lp25816 +(lp25817 +g8 +aI249 +aI-359 +aa(lp25818 +g20 +aI337 +aI-458 +aa(lp25819 +g20 +aI594 +aI-714 +aa(lp25820 +g20 +aI738 +aI-714 +aa(lp25821 +g20 +aI417 +aI-405 +aa(lp25822 +g20 +aI757 +aI0 +aa(lp25823 +g20 +aI618 +aI0 +aa(lp25824 +g20 +aI341 +aI-327 +aa(lp25825 +g20 +aI257 +aI-274 +aa(lp25826 +g20 +aI257 +aI0 +aa(lp25827 +g20 +aI139 +aI0 +aa(lp25828 +g20 +aI139 +aI-1012 +aa(lp25829 +g20 +aI257 +aI-1012 +aa(lp25830 +g20 +aI257 +aI-547 +aa(lp25831 +g20 +aI246 +aI-359 +aa(lp25832 +g10 +aa(lp25833 +g8 +aI800 +aI0 +aa(lp25834 +g10 +aa(lp25835 +g8 +aI800 +aI0 +aasVo +(lp25836 +(lp25837 +g8 +aI397 +aI13 +aa(lp25838 +g15 +aI165 +aI-87 +aI303 +aI13 +aI226 +aI-20 +aa(lp25839 +g15 +aI74 +aI-358 +aI105 +aI-155 +aI74 +aI-245 +aa(lp25840 +g15 +aI163 +aI-628 +aI74 +aI-472 +aI104 +aI-562 +aa(lp25841 +g15 +aI401 +aI-727 +aI221 +aI-694 +aI301 +aI-727 +aa(lp25842 +g15 +aI633 +aI-626 +aI495 +aI-727 +aI573 +aI-693 +aa(lp25843 +g15 +aI723 +aI-358 +aI693 +aI-559 +aI723 +aI-469 +aa(lp25844 +g15 +aI634 +aI-86 +aI723 +aI-243 +aI694 +aI-152 +aa(lp25845 +g15 +aI397 +aI13 +aI575 +aI-19 +aI496 +aI13 +aa(lp25846 +g10 +aa(lp25847 +g8 +aI399 +aI-84 +aa(lp25848 +g15 +aI601 +aI-358 +aI534 +aI-84 +aI601 +aI-175 +aa(lp25849 +g15 +aI398 +aI-629 +aI601 +aI-538 +aI533 +aI-629 +aa(lp25850 +g15 +aI197 +aI-358 +aI264 +aI-629 +aI197 +aI-538 +aa(lp25851 +g15 +aI399 +aI-84 +aI197 +aI-175 +aI264 +aI-84 +aa(lp25852 +g10 +aa(lp25853 +g8 +aI800 +aI0 +aa(lp25854 +g10 +aa(lp25855 +g8 +aI800 +aI0 +aasVs +(lp25856 +(lp25857 +g8 +aI132 +aI-31 +aa(lp25858 +g20 +aI132 +aI-139 +aa(lp25859 +g15 +aI373 +aI-83 +aI215 +aI-102 +aI296 +aI-83 +aa(lp25860 +g15 +aI552 +aI-189 +aI492 +aI-83 +aI552 +aI-118 +aa(lp25861 +g15 +aI520 +aI-253 +aI552 +aI-213 +aI541 +aI-235 +aa(lp25862 +g15 +aI373 +aI-322 +aI498 +aI-271 +aI449 +aI-294 +aa(lp25863 +g15 +aI181 +aI-426 +aI271 +aI-360 +aI208 +aI-394 +aa(lp25864 +g15 +aI142 +aI-537 +aI155 +aI-457 +aI142 +aI-494 +aa(lp25865 +g15 +aI215 +aI-676 +aI142 +aI-596 +aI166 +aI-643 +aa(lp25866 +g15 +aI416 +aI-727 +aI263 +aI-710 +aI330 +aI-727 +aa(lp25867 +g15 +aI656 +aI-679 +aI501 +aI-727 +aI582 +aI-711 +aa(lp25868 +g20 +aI617 +aI-582 +aa(lp25869 +g15 +aI409 +aI-629 +aI538 +aI-613 +aI468 +aI-629 +aa(lp25870 +g15 +aI255 +aI-542 +aI307 +aI-629 +aI255 +aI-600 +aa(lp25871 +g15 +aI288 +aI-479 +aI255 +aI-516 +aI266 +aI-494 +aa(lp25872 +g15 +aI440 +aI-412 +aI310 +aI-463 +aI361 +aI-441 +aa(lp25873 +g15 +aI622 +aI-314 +aI531 +aI-379 +aI592 +aI-346 +aa(lp25874 +g15 +aI667 +aI-195 +aI652 +aI-281 +aI667 +aI-242 +aa(lp25875 +g15 +aI591 +aI-42 +aI667 +aI-130 +aI642 +aI-79 +aa(lp25876 +g15 +aI376 +aI13 +aI541 +aI-5 +aI469 +aI13 +aa(lp25877 +g15 +aI132 +aI-31 +aI268 +aI13 +aI187 +aI-1 +aa(lp25878 +g10 +aa(lp25879 +g8 +aI800 +aI0 +aa(lp25880 +g10 +aa(lp25881 +g8 +aI800 +aI0 +aasVw +(lp25882 +(lp25883 +g8 +aI529 +aI0 +aa(lp25884 +g20 +aI444 +aI-387 +aa(lp25885 +g20 +aI399 +aI-602 +aa(lp25886 +g20 +aI395 +aI-602 +aa(lp25887 +g20 +aI353 +aI-384 +aa(lp25888 +g20 +aI265 +aI0 +aa(lp25889 +g20 +aI142 +aI0 +aa(lp25890 +g20 +aI-2 +aI-714 +aa(lp25891 +g20 +aI102 +aI-714 +aa(lp25892 +g20 +aI166 +aI-360 +aa(lp25893 +g15 +aI203 +aI-105 +aI181 +aI-280 +aI193 +aI-194 +aa(lp25894 +g20 +aI207 +aI-105 +aa(lp25895 +g15 +aI251 +aI-338 +aI221 +aI-185 +aI235 +aI-263 +aa(lp25896 +g20 +aI338 +aI-714 +aa(lp25897 +g20 +aI464 +aI-714 +aa(lp25898 +g20 +aI546 +aI-338 +aa(lp25899 +g15 +aI590 +aI-105 +aI565 +aI-253 +aI580 +aI-175 +aa(lp25900 +g20 +aI594 +aI-105 +aa(lp25901 +g15 +aI633 +aI-360 +aI607 +aI-210 +aI620 +aI-295 +aa(lp25902 +g20 +aI699 +aI-714 +aa(lp25903 +g20 +aI802 +aI-714 +aa(lp25904 +g20 +aI656 +aI0 +aa(lp25905 +g10 +aa(lp25906 +g8 +aI800 +aI0 +aa(lp25907 +g10 +aa(lp25908 +g8 +aI800 +aI0 +aasV{ +(lp25909 +(lp25910 +g8 +aI485 +aI10 +aa(lp25911 +g15 +aI521 +aI88 +aI485 +aI46 +aI497 +aI71 +aa(lp25912 +g15 +aI651 +aI113 +aI545 +aI104 +aI589 +aI112 +aa(lp25913 +g20 +aI651 +aI211 +aa(lp25914 +g15 +aI366 +aI20 +aI461 +aI208 +aI366 +aI145 +aa(lp25915 +g20 +aI366 +aI-196 +aa(lp25916 +g15 +aI146 +aI-319 +aI366 +aI-278 +aI293 +aI-319 +aa(lp25917 +g20 +aI146 +aI-420 +aa(lp25918 +g15 +aI366 +aI-543 +aI293 +aI-420 +aI366 +aI-461 +aa(lp25919 +g20 +aI366 +aI-760 +aa(lp25920 +g15 +aI651 +aI-951 +aI366 +aI-885 +aI461 +aI-948 +aa(lp25921 +g20 +aI651 +aI-854 +aa(lp25922 +g15 +aI521 +aI-828 +aI589 +aI-853 +aI545 +aI-844 +aa(lp25923 +g15 +aI485 +aI-751 +aI497 +aI-812 +aI485 +aI-786 +aa(lp25924 +g20 +aI485 +aI-535 +aa(lp25925 +g15 +aI333 +aI-373 +aI485 +aI-445 +aI434 +aI-391 +aa(lp25926 +g20 +aI333 +aI-366 +aa(lp25927 +g15 +aI485 +aI-204 +aI434 +aI-348 +aI485 +aI-294 +aa(lp25928 +g10 +aa(lp25929 +g8 +aI800 +aI0 +aa(lp25930 +g10 +aa(lp25931 +g8 +aI800 +aI0 +aasV" +(lp25932 +(lp25933 +g8 +aI339 +aI-951 +aa(lp25934 +g20 +aI313 +aI-607 +aa(lp25935 +g20 +aI212 +aI-607 +aa(lp25936 +g20 +aI185 +aI-951 +aa(lp25937 +g10 +aa(lp25938 +g8 +aI614 +aI-951 +aa(lp25939 +g20 +aI587 +aI-607 +aa(lp25940 +g20 +aI486 +aI-607 +aa(lp25941 +g20 +aI460 +aI-951 +aa(lp25942 +g10 +aa(lp25943 +g8 +aI800 +aI0 +aa(lp25944 +g10 +aa(lp25945 +g8 +aI800 +aI0 +aasV& +(lp25946 +(lp25947 +g8 +aI391 +aI-504 +aa(lp25948 +g20 +aI574 +aI-278 +aa(lp25949 +g15 +aI642 +aI-451 +aI605 +aI-330 +aI628 +aI-388 +aa(lp25950 +g20 +aI762 +aI-451 +aa(lp25951 +g15 +aI646 +aI-189 +aI739 +aI-349 +aI700 +aI-262 +aa(lp25952 +g20 +aI798 +aI0 +aa(lp25953 +g20 +aI657 +aI0 +aa(lp25954 +g20 +aI572 +aI-107 +aa(lp25955 +g15 +aI304 +aI13 +aI496 +aI-26 +aI407 +aI13 +aa(lp25956 +g15 +aI110 +aI-56 +aI222 +aI13 +aI157 +aI-9 +aa(lp25957 +g15 +aI39 +aI-247 +aI63 +aI-102 +aI39 +aI-166 +aa(lp25958 +g15 +aI81 +aI-396 +aI39 +aI-304 +aI53 +aI-354 +aa(lp25959 +g15 +aI234 +aI-526 +aI108 +aI-438 +aI159 +aI-481 +aa(lp25960 +g15 +aI128 +aI-758 +aI163 +aI-609 +aI128 +aI-686 +aa(lp25961 +g15 +aI190 +aI-910 +aI128 +aI-822 +aI148 +aI-873 +aa(lp25962 +g15 +aI369 +aI-966 +aI231 +aI-947 +aI291 +aI-966 +aa(lp25963 +g15 +aI538 +aI-910 +aI442 +aI-966 +aI498 +aI-947 +aa(lp25964 +g15 +aI598 +aI-758 +aI578 +aI-873 +aI598 +aI-822 +aa(lp25965 +g15 +aI391 +aI-504 +aI598 +aI-669 +aI529 +aI-585 +aa(lp25966 +g10 +aa(lp25967 +g8 +aI330 +aI-583 +aa(lp25968 +g15 +aI450 +aI-673 +aI388 +aI-617 +aI428 +aI-647 +aa(lp25969 +g15 +aI482 +aI-760 +aI471 +aI-699 +aI482 +aI-728 +aa(lp25970 +g15 +aI450 +aI-838 +aI482 +aI-792 +aI471 +aI-818 +aa(lp25971 +g15 +aI365 +aI-868 +aI428 +aI-858 +aI400 +aI-868 +aa(lp25972 +g15 +aI276 +aI-839 +aI327 +aI-868 +aI297 +aI-859 +aa(lp25973 +g15 +aI244 +aI-758 +aI254 +aI-820 +aI244 +aI-793 +aa(lp25974 +g15 +aI330 +aI-583 +aI244 +aI-706 +aI273 +aI-648 +aa(lp25975 +g10 +aa(lp25976 +g8 +aI506 +aI-186 +aa(lp25977 +g20 +aI296 +aI-447 +aa(lp25978 +g15 +aI164 +aI-251 +aI208 +aI-394 +aI164 +aI-328 +aa(lp25979 +g15 +aI207 +aI-137 +aI164 +aI-205 +aI178 +aI-167 +aa(lp25980 +g15 +aI311 +aI-91 +aI236 +aI-106 +aI271 +aI-91 +aa(lp25981 +g15 +aI506 +aI-186 +aI381 +aI-91 +aI446 +aI-123 +aa(lp25982 +g10 +aa(lp25983 +g8 +aI800 +aI0 +aa(lp25984 +g10 +aa(lp25985 +g8 +aI800 +aI0 +aasV* +(lp25986 +(lp25987 +g8 +aI465 +aI-1012 +aa(lp25988 +g20 +aI437 +aI-756 +aa(lp25989 +g20 +aI695 +aI-828 +aa(lp25990 +g20 +aI713 +aI-703 +aa(lp25991 +g20 +aI466 +aI-685 +aa(lp25992 +g20 +aI626 +aI-472 +aa(lp25993 +g20 +aI510 +aI-410 +aa(lp25994 +g20 +aI395 +aI-643 +aa(lp25995 +g20 +aI293 +aI-410 +aa(lp25996 +g20 +aI173 +aI-472 +aa(lp25997 +g20 +aI330 +aI-685 +aa(lp25998 +g20 +aI86 +aI-703 +aa(lp25999 +g20 +aI105 +aI-828 +aa(lp26000 +g20 +aI360 +aI-756 +aa(lp26001 +g20 +aI332 +aI-1012 +aa(lp26002 +g10 +aa(lp26003 +g8 +aI800 +aI0 +aa(lp26004 +g10 +aa(lp26005 +g8 +aI800 +aI0 +aasV. +(lp26006 +(lp26007 +g8 +aI399 +aI-195 +aa(lp26008 +g15 +aI498 +aI-87 +aI465 +aI-195 +aI498 +aI-159 +aa(lp26009 +g15 +aI399 +aI20 +aI498 +aI-15 +aI465 +aI20 +aa(lp26010 +g15 +aI301 +aI-87 +aI334 +aI20 +aI301 +aI-15 +aa(lp26011 +g15 +aI399 +aI-195 +aI301 +aI-159 +aI334 +aI-195 +aa(lp26012 +g10 +aa(lp26013 +g8 +aI800 +aI0 +aa(lp26014 +g10 +aa(lp26015 +g8 +aI800 +aI0 +aasV2 +(lp26016 +(lp26017 +g8 +aI695 +aI0 +aa(lp26018 +g20 +aI102 +aI0 +aa(lp26019 +g20 +aI102 +aI-101 +aa(lp26020 +g20 +aI330 +aI-349 +aa(lp26021 +g15 +aI498 +aI-555 +aI415 +aI-441 +aI471 +aI-510 +aa(lp26022 +g15 +aI538 +aI-705 +aI524 +aI-601 +aI538 +aI-651 +aa(lp26023 +g15 +aI497 +aI-822 +aI538 +aI-754 +aI524 +aI-793 +aa(lp26024 +g15 +aI385 +aI-864 +aI469 +aI-850 +aI432 +aI-864 +aa(lp26025 +g15 +aI178 +aI-775 +aI315 +aI-864 +aI246 +aI-835 +aa(lp26026 +g20 +aI111 +aI-853 +aa(lp26027 +g15 +aI386 +aI-965 +aI195 +aI-927 +aI286 +aI-965 +aa(lp26028 +g15 +aI585 +aI-896 +aI470 +aI-965 +aI537 +aI-942 +aa(lp26029 +g15 +aI658 +aI-710 +aI634 +aI-850 +aI658 +aI-788 +aa(lp26030 +g15 +aI620 +aI-551 +aI658 +aI-658 +aI646 +aI-605 +aa(lp26031 +g15 +aI430 +aI-307 +aI594 +aI-497 +aI531 +aI-415 +aa(lp26032 +g20 +aI248 +aI-112 +aa(lp26033 +g20 +aI248 +aI-107 +aa(lp26034 +g20 +aI695 +aI-107 +aa(lp26035 +g10 +aa(lp26036 +g8 +aI800 +aI0 +aa(lp26037 +g10 +aa(lp26038 +g8 +aI800 +aI0 +aasV6 +(lp26039 +(lp26040 +g8 +aI628 +aI-952 +aa(lp26041 +g20 +aI628 +aI-851 +aa(lp26042 +g15 +aI520 +aI-867 +aI597 +aI-862 +aI561 +aI-867 +aa(lp26043 +g15 +aI301 +aI-775 +aI422 +aI-867 +aI349 +aI-836 +aa(lp26044 +g15 +aI221 +aI-484 +aI252 +aI-714 +aI225 +aI-617 +aa(lp26045 +g20 +aI229 +aI-484 +aa(lp26046 +g15 +aI429 +aI-595 +aI270 +aI-558 +aI337 +aI-595 +aa(lp26047 +g15 +aI627 +aI-517 +aI513 +aI-595 +aI579 +aI-569 +aa(lp26048 +g15 +aI699 +aI-306 +aI675 +aI-466 +aI699 +aI-395 +aa(lp26049 +g15 +aI621 +aI-72 +aI699 +aI-207 +aI673 +aI-129 +aa(lp26050 +g15 +aI410 +aI13 +aI569 +aI-15 +aI498 +aI13 +aa(lp26051 +g15 +aI184 +aI-96 +aI316 +aI13 +aI240 +aI-23 +aa(lp26052 +g15 +aI100 +aI-406 +aI128 +aI-169 +aI100 +aI-272 +aa(lp26053 +g15 +aI516 +aI-965 +aI100 +aI-778 +aI238 +aI-965 +aa(lp26054 +g15 +aI628 +aI-952 +aI561 +aI-965 +aI598 +aI-960 +aa(lp26055 +g10 +aa(lp26056 +g8 +aI585 +aI-306 +aa(lp26057 +g15 +aI540 +aI-451 +aI585 +aI-369 +aI570 +aI-417 +aa(lp26058 +g15 +aI413 +aI-502 +aI510 +aI-485 +aI468 +aI-502 +aa(lp26059 +g15 +aI274 +aI-449 +aI358 +aI-502 +aI312 +aI-484 +aa(lp26060 +g15 +aI218 +aI-328 +aI237 +aI-414 +aI218 +aI-374 +aa(lp26061 +g15 +aI271 +aI-158 +aI218 +aI-263 +aI236 +aI-206 +aa(lp26062 +g15 +aI409 +aI-86 +aI306 +aI-110 +aI352 +aI-86 +aa(lp26063 +g15 +aI538 +aI-143 +aI464 +aI-86 +aI507 +aI-105 +aa(lp26064 +g15 +aI585 +aI-306 +aI569 +aI-181 +aI585 +aI-235 +aa(lp26065 +g10 +aa(lp26066 +g8 +aI800 +aI0 +aa(lp26067 +g10 +aa(lp26068 +g8 +aI800 +aI0 +aasV: +(lp26069 +(lp26070 +g8 +aI399 +aI-732 +aa(lp26071 +g15 +aI482 +aI-642 +aI454 +aI-732 +aI482 +aI-702 +aa(lp26072 +g15 +aI399 +aI-551 +aI482 +aI-581 +aI454 +aI-551 +aa(lp26073 +g15 +aI317 +aI-642 +aI344 +aI-551 +aI317 +aI-581 +aa(lp26074 +g15 +aI399 +aI-732 +aI317 +aI-702 +aI344 +aI-732 +aa(lp26075 +g10 +aa(lp26076 +g8 +aI399 +aI-162 +aa(lp26077 +g15 +aI482 +aI-71 +aI454 +aI-162 +aI482 +aI-132 +aa(lp26078 +g15 +aI399 +aI19 +aI482 +aI-11 +aI454 +aI19 +aa(lp26079 +g15 +aI317 +aI-71 +aI344 +aI19 +aI317 +aI-11 +aa(lp26080 +g15 +aI399 +aI-162 +aI317 +aI-132 +aI344 +aI-162 +aa(lp26081 +g10 +aa(lp26082 +g8 +aI800 +aI0 +aa(lp26083 +g10 +aa(lp26084 +g8 +aI800 +aI0 +aasV> +(lp26085 +(lp26086 +g8 +aI98 +aI-247 +aa(lp26087 +g20 +aI563 +aI-470 +aa(lp26088 +g20 +aI98 +aI-692 +aa(lp26089 +g20 +aI98 +aI-797 +aa(lp26090 +g20 +aI699 +aI-503 +aa(lp26091 +g20 +aI699 +aI-437 +aa(lp26092 +g20 +aI98 +aI-143 +aa(lp26093 +g10 +aa(lp26094 +g8 +aI800 +aI0 +aa(lp26095 +g10 +aa(lp26096 +g8 +aI800 +aI0 +aasVB +(lp26097 +(lp26098 +g8 +aI87 +aI-951 +aa(lp26099 +g20 +aI374 +aI-951 +aa(lp26100 +g15 +aI633 +aI-894 +aI493 +aI-951 +aI579 +aI-932 +aa(lp26101 +g15 +aI713 +aI-710 +aI686 +aI-856 +aI713 +aI-795 +aa(lp26102 +g15 +aI662 +aI-571 +aI713 +aI-654 +aI696 +aI-608 +aa(lp26103 +g15 +aI524 +aI-504 +aI628 +aI-534 +aI582 +aI-512 +aa(lp26104 +g20 +aI524 +aI-498 +aa(lp26105 +g15 +aI740 +aI-275 +aI668 +aI-474 +aI740 +aI-400 +aa(lp26106 +g15 +aI657 +aI-73 +aI740 +aI-189 +aI712 +aI-122 +aa(lp26107 +g15 +aI430 +aI0 +aI601 +aI-24 +aI526 +aI0 +aa(lp26108 +g20 +aI87 +aI0 +aa(lp26109 +g10 +aa(lp26110 +g8 +aI209 +aI-547 +aa(lp26111 +g20 +aI394 +aI-547 +aa(lp26112 +g15 +aI542 +aI-583 +aI462 +aI-547 +aI511 +aI-559 +aa(lp26113 +g15 +aI589 +aI-702 +aI573 +aI-607 +aI589 +aI-646 +aa(lp26114 +g15 +aI539 +aI-814 +aI589 +aI-754 +aI572 +aI-791 +aa(lp26115 +g15 +aI381 +aI-847 +aI506 +aI-836 +aI453 +aI-847 +aa(lp26116 +g20 +aI209 +aI-847 +aa(lp26117 +g10 +aa(lp26118 +g8 +aI209 +aI-446 +aa(lp26119 +g20 +aI209 +aI-102 +aa(lp26120 +g20 +aI409 +aI-102 +aa(lp26121 +g15 +aI611 +aI-280 +aI544 +aI-102 +aI611 +aI-161 +aa(lp26122 +g15 +aI401 +aI-446 +aI611 +aI-391 +aI541 +aI-446 +aa(lp26123 +g10 +aa(lp26124 +g8 +aI800 +aI0 +aa(lp26125 +g10 +aa(lp26126 +g8 +aI800 +aI0 +aasVF +(lp26127 +(lp26128 +g8 +aI279 +aI0 +aa(lp26129 +g20 +aI158 +aI0 +aa(lp26130 +g20 +aI158 +aI-951 +aa(lp26131 +g20 +aI706 +aI-951 +aa(lp26132 +g20 +aI706 +aI-844 +aa(lp26133 +g20 +aI279 +aI-844 +aa(lp26134 +g20 +aI279 +aI-508 +aa(lp26135 +g20 +aI681 +aI-508 +aa(lp26136 +g20 +aI681 +aI-401 +aa(lp26137 +g20 +aI279 +aI-401 +aa(lp26138 +g10 +aa(lp26139 +g8 +aI800 +aI0 +aa(lp26140 +g10 +aa(lp26141 +g8 +aI800 +aI0 +aasVJ +(lp26142 +(lp26143 +g8 +aI89 +aI-24 +aa(lp26144 +g20 +aI89 +aI-133 +aa(lp26145 +g15 +aI290 +aI-92 +aI159 +aI-106 +aI226 +aI-92 +aa(lp26146 +g15 +aI455 +aI-144 +aI360 +aI-92 +aI415 +aI-109 +aa(lp26147 +g15 +aI516 +aI-291 +aI496 +aI-178 +aI516 +aI-228 +aa(lp26148 +g20 +aI516 +aI-951 +aa(lp26149 +g20 +aI637 +aI-951 +aa(lp26150 +g20 +aI637 +aI-293 +aa(lp26151 +g15 +aI545 +aI-69 +aI637 +aI-199 +aI606 +aI-124 +aa(lp26152 +g15 +aI300 +aI13 +aI484 +aI-14 +aI402 +aI13 +aa(lp26153 +g15 +aI89 +aI-24 +aI205 +aI13 +aI135 +aI0 +aa(lp26154 +g10 +aa(lp26155 +g8 +aI800 +aI0 +aa(lp26156 +g10 +aa(lp26157 +g8 +aI800 +aI0 +aasVN +(lp26158 +(lp26159 +g8 +aI710 +aI0 +aa(lp26160 +g20 +aI570 +aI0 +aa(lp26161 +g20 +aI193 +aI-787 +aa(lp26162 +g20 +aI188 +aI-787 +aa(lp26163 +g15 +aI199 +aI-515 +aI195 +aI-667 +aI199 +aI-576 +aa(lp26164 +g20 +aI199 +aI0 +aa(lp26165 +g20 +aI87 +aI0 +aa(lp26166 +g20 +aI87 +aI-951 +aa(lp26167 +g20 +aI226 +aI-951 +aa(lp26168 +g20 +aI602 +aI-167 +aa(lp26169 +g20 +aI606 +aI-167 +aa(lp26170 +g15 +aI597 +aI-430 +aI600 +aI-299 +aI597 +aI-386 +aa(lp26171 +g20 +aI597 +aI-951 +aa(lp26172 +g20 +aI710 +aI-951 +aa(lp26173 +g10 +aa(lp26174 +g8 +aI800 +aI0 +aa(lp26175 +g10 +aa(lp26176 +g8 +aI800 +aI0 +aasVR +(lp26177 +(lp26178 +g8 +aI242 +aI-392 +aa(lp26179 +g20 +aI242 +aI0 +aa(lp26180 +g20 +aI121 +aI0 +aa(lp26181 +g20 +aI121 +aI-951 +aa(lp26182 +g20 +aI353 +aI-951 +aa(lp26183 +g15 +aI692 +aI-681 +aI579 +aI-951 +aI692 +aI-861 +aa(lp26184 +g15 +aI503 +aI-425 +aI692 +aI-556 +aI629 +aI-471 +aa(lp26185 +g20 +aI762 +aI0 +aa(lp26186 +g20 +aI619 +aI0 +aa(lp26187 +g20 +aI391 +aI-392 +aa(lp26188 +g10 +aa(lp26189 +g8 +aI242 +aI-495 +aa(lp26190 +g20 +aI349 +aI-495 +aa(lp26191 +g15 +aI513 +aI-538 +aI423 +aI-495 +aI478 +aI-509 +aa(lp26192 +g15 +aI566 +aI-675 +aI548 +aI-567 +aI566 +aI-612 +aa(lp26193 +g15 +aI514 +aI-807 +aI566 +aI-736 +aI549 +aI-780 +aa(lp26194 +g15 +aI346 +aI-847 +aI479 +aI-834 +aI423 +aI-847 +aa(lp26195 +g20 +aI242 +aI-847 +aa(lp26196 +g10 +aa(lp26197 +g8 +aI800 +aI0 +aa(lp26198 +g10 +aa(lp26199 +g8 +aI800 +aI0 +aasVV +(lp26200 +(lp26201 +g8 +aI649 +aI-951 +aa(lp26202 +g20 +aI778 +aI-951 +aa(lp26203 +g20 +aI460 +aI0 +aa(lp26204 +g20 +aI338 +aI0 +aa(lp26205 +g20 +aI21 +aI-951 +aa(lp26206 +g20 +aI149 +aI-951 +aa(lp26207 +g20 +aI341 +aI-347 +aa(lp26208 +g15 +aI398 +aI-130 +aI358 +aI-292 +aI378 +aI-220 +aa(lp26209 +g15 +aI458 +aI-351 +aI411 +aI-193 +aI432 +aI-267 +aa(lp26210 +g10 +aa(lp26211 +g8 +aI800 +aI0 +aa(lp26212 +g10 +aa(lp26213 +g8 +aI800 +aI0 +aasVZ +(lp26214 +(lp26215 +g8 +aI731 +aI0 +aa(lp26216 +g20 +aI66 +aI0 +aa(lp26217 +g20 +aI66 +aI-93 +aa(lp26218 +g20 +aI582 +aI-843 +aa(lp26219 +g20 +aI80 +aI-843 +aa(lp26220 +g20 +aI80 +aI-951 +aa(lp26221 +g20 +aI718 +aI-951 +aa(lp26222 +g20 +aI718 +aI-856 +aa(lp26223 +g20 +aI202 +aI-107 +aa(lp26224 +g20 +aI731 +aI-107 +aa(lp26225 +g10 +aa(lp26226 +g8 +aI800 +aI0 +aa(lp26227 +g10 +aa(lp26228 +g8 +aI800 +aI0 +aasV^ +(lp26229 +(lp26230 +g8 +aI72 +aI-356 +aa(lp26231 +g20 +aI348 +aI-958 +aa(lp26232 +g20 +aI414 +aI-958 +aa(lp26233 +g20 +aI727 +aI-356 +aa(lp26234 +g20 +aI622 +aI-356 +aa(lp26235 +g20 +aI382 +aI-835 +aa(lp26236 +g20 +aI175 +aI-356 +aa(lp26237 +g10 +aa(lp26238 +g8 +aI800 +aI0 +aa(lp26239 +g10 +aa(lp26240 +g8 +aI800 +aI0 +aasVb +(lp26241 +(lp26242 +g8 +aI221 +aI-90 +aa(lp26243 +g20 +aI213 +aI-90 +aa(lp26244 +g20 +aI189 +aI0 +aa(lp26245 +g20 +aI102 +aI0 +aa(lp26246 +g20 +aI102 +aI-1012 +aa(lp26247 +g20 +aI221 +aI-1012 +aa(lp26248 +g20 +aI221 +aI-767 +aa(lp26249 +g15 +aI216 +aI-620 +aI221 +aI-732 +aI219 +aI-683 +aa(lp26250 +g20 +aI221 +aI-620 +aa(lp26251 +g15 +aI430 +aI-727 +aI267 +aI-691 +aI337 +aI-727 +aa(lp26252 +g15 +aI636 +aI-630 +aI518 +aI-727 +aI586 +aI-694 +aa(lp26253 +g15 +aI710 +aI-358 +aI686 +aI-565 +aI710 +aI-474 +aa(lp26254 +g15 +aI636 +aI-84 +aI710 +aI-241 +aI685 +aI-149 +aa(lp26255 +g15 +aI430 +aI13 +aI586 +aI-19 +aI517 +aI13 +aa(lp26256 +g15 +aI221 +aI-90 +aI341 +aI13 +aI271 +aI-21 +aa(lp26257 +g10 +aa(lp26258 +g8 +aI221 +aI-358 +aa(lp26259 +g15 +aI266 +aI-147 +aI221 +aI-259 +aI236 +aI-189 +aa(lp26260 +g15 +aI410 +aI-84 +aI296 +aI-105 +aI344 +aI-84 +aa(lp26261 +g15 +aI587 +aI-359 +aI528 +aI-84 +aI587 +aI-176 +aa(lp26262 +g15 +aI409 +aI-629 +aI587 +aI-539 +aI528 +aI-629 +aa(lp26263 +g15 +aI264 +aI-567 +aI342 +aI-629 +aI294 +aI-608 +aa(lp26264 +g15 +aI221 +aI-358 +aI235 +aI-527 +aI221 +aI-457 +aa(lp26265 +g10 +aa(lp26266 +g8 +aI800 +aI0 +aa(lp26267 +g10 +aa(lp26268 +g8 +aI800 +aI0 +aasVf +(lp26269 +(lp26270 +g8 +aI679 +aI-625 +aa(lp26271 +g20 +aI426 +aI-625 +aa(lp26272 +g20 +aI426 +aI0 +aa(lp26273 +g20 +aI307 +aI0 +aa(lp26274 +g20 +aI307 +aI-625 +aa(lp26275 +g20 +aI101 +aI-625 +aa(lp26276 +g20 +aI101 +aI-696 +aa(lp26277 +g20 +aI307 +aI-718 +aa(lp26278 +g20 +aI307 +aI-780 +aa(lp26279 +g15 +aI366 +aI-963 +aI307 +aI-864 +aI327 +aI-925 +aa(lp26280 +g15 +aI561 +aI-1019 +aI405 +aI-1000 +aI470 +aI-1019 +aa(lp26281 +g15 +aI725 +aI-996 +aI617 +aI-1019 +aI671 +aI-1012 +aa(lp26282 +g20 +aI698 +aI-903 +aa(lp26283 +g15 +aI563 +aI-922 +aI653 +aI-915 +aI608 +aI-922 +aa(lp26284 +g15 +aI455 +aI-889 +aI510 +aI-922 +aI474 +aI-911 +aa(lp26285 +g15 +aI426 +aI-782 +aI435 +aI-867 +aI426 +aI-832 +aa(lp26286 +g20 +aI426 +aI-714 +aa(lp26287 +g20 +aI679 +aI-714 +aa(lp26288 +g10 +aa(lp26289 +g8 +aI800 +aI0 +aa(lp26290 +g10 +aa(lp26291 +g8 +aI800 +aI0 +aasVj +(lp26292 +(lp26293 +g8 +aI483 +aI-1008 +aa(lp26294 +g15 +aI553 +aI-934 +aI530 +aI-1008 +aI553 +aI-983 +aa(lp26295 +g15 +aI483 +aI-859 +aI553 +aI-884 +aI530 +aI-859 +aa(lp26296 +g15 +aI414 +aI-934 +aI437 +aI-859 +aI414 +aI-884 +aa(lp26297 +g15 +aI483 +aI-1008 +aI414 +aI-983 +aI437 +aI-1008 +aa(lp26298 +g10 +aa(lp26299 +g8 +aI87 +aI297 +aa(lp26300 +g20 +aI87 +aI197 +aa(lp26301 +g15 +aI276 +aI223 +aI146 +aI214 +aI208 +aI223 +aa(lp26302 +g15 +aI394 +aI186 +aI326 +aI223 +aI366 +aI210 +aa(lp26303 +g15 +aI437 +aI83 +aI423 +aI161 +aI437 +aI126 +aa(lp26304 +g20 +aI437 +aI-620 +aa(lp26305 +g20 +aI164 +aI-634 +aa(lp26306 +g20 +aI164 +aI-714 +aa(lp26307 +g20 +aI555 +aI-714 +aa(lp26308 +g20 +aI555 +aI76 +aa(lp26309 +g15 +aI482 +aI257 +aI555 +aI154 +aI531 +aI214 +aa(lp26310 +g15 +aI274 +aI320 +aI433 +aI299 +aI364 +aI320 +aa(lp26311 +g15 +aI87 +aI297 +aI203 +aI320 +aI141 +aI313 +aa(lp26312 +g10 +aa(lp26313 +g8 +aI800 +aI0 +aa(lp26314 +g10 +aa(lp26315 +g8 +aI800 +aI0 +aasVn +(lp26316 +(lp26317 +g8 +aI577 +aI0 +aa(lp26318 +g20 +aI577 +aI-459 +aa(lp26319 +g15 +aI422 +aI-629 +aI577 +aI-572 +aI525 +aI-629 +aa(lp26320 +g15 +aI222 +aI-369 +aI289 +aI-629 +aI222 +aI-542 +aa(lp26321 +g20 +aI222 +aI0 +aa(lp26322 +g20 +aI104 +aI0 +aa(lp26323 +g20 +aI104 +aI-714 +aa(lp26324 +g20 +aI199 +aI-714 +aa(lp26325 +g20 +aI217 +aI-618 +aa(lp26326 +g20 +aI223 +aI-618 +aa(lp26327 +g15 +aI442 +aI-727 +aI268 +aI-690 +aI341 +aI-727 +aa(lp26328 +g15 +aI695 +aI-466 +aI611 +aI-727 +aI695 +aI-640 +aa(lp26329 +g20 +aI695 +aI0 +aa(lp26330 +g10 +aa(lp26331 +g8 +aI800 +aI0 +aa(lp26332 +g10 +aa(lp26333 +g8 +aI800 +aI0 +aasVr +(lp26334 +(lp26335 +g8 +aI689 +aI-698 +aa(lp26336 +g20 +aI657 +aI-590 +aa(lp26337 +g15 +aI511 +aI-619 +aI604 +aI-609 +aI555 +aI-619 +aa(lp26338 +g15 +aI347 +aI-559 +aI440 +aI-619 +aI386 +aI-599 +aa(lp26339 +g15 +aI290 +aI-384 +aI309 +aI-518 +aI290 +aI-460 +aa(lp26340 +g20 +aI290 +aI0 +aa(lp26341 +g20 +aI171 +aI0 +aa(lp26342 +g20 +aI171 +aI-714 +aa(lp26343 +g20 +aI268 +aI-714 +aa(lp26344 +g20 +aI282 +aI-583 +aa(lp26345 +g20 +aI287 +aI-583 +aa(lp26346 +g15 +aI393 +aI-694 +aI320 +aI-635 +aI356 +aI-672 +aa(lp26347 +g15 +aI533 +aI-727 +aI431 +aI-716 +aI478 +aI-727 +aa(lp26348 +g15 +aI689 +aI-698 +aI584 +aI-727 +aI636 +aI-717 +aa(lp26349 +g10 +aa(lp26350 +g8 +aI800 +aI0 +aa(lp26351 +g10 +aa(lp26352 +g8 +aI800 +aI0 +aasVv +(lp26353 +(lp26354 +g8 +aI324 +aI0 +aa(lp26355 +g20 +aI53 +aI-714 +aa(lp26356 +g20 +aI175 +aI-714 +aa(lp26357 +g20 +aI332 +aI-289 +aa(lp26358 +g15 +aI397 +aI-78 +aI368 +aI-189 +aI390 +aI-119 +aa(lp26359 +g20 +aI401 +aI-78 +aa(lp26360 +g15 +aI466 +aI-289 +aI404 +aI-97 +aI425 +aI-167 +aa(lp26361 +g20 +aI622 +aI-714 +aa(lp26362 +g20 +aI745 +aI-714 +aa(lp26363 +g20 +aI474 +aI0 +aa(lp26364 +g10 +aa(lp26365 +g8 +aI800 +aI0 +aa(lp26366 +g10 +aa(lp26367 +g8 +aI800 +aI0 +aasVz +(lp26368 +(lp26369 +g8 +aI679 +aI0 +aa(lp26370 +g20 +aI118 +aI0 +aa(lp26371 +g20 +aI118 +aI-80 +aa(lp26372 +g20 +aI548 +aI-625 +aa(lp26373 +g20 +aI139 +aI-625 +aa(lp26374 +g20 +aI139 +aI-714 +aa(lp26375 +g20 +aI667 +aI-714 +aa(lp26376 +g20 +aI667 +aI-619 +aa(lp26377 +g20 +aI246 +aI-88 +aa(lp26378 +g20 +aI679 +aI-88 +aa(lp26379 +g10 +aa(lp26380 +g8 +aI800 +aI0 +aa(lp26381 +g10 +aa(lp26382 +g8 +aI800 +aI0 +aasV~ +(lp26383 +(lp26384 +g8 +aI98 +aI-381 +aa(lp26385 +g20 +aI98 +aI-486 +aa(lp26386 +g15 +aI259 +aI-556 +aI141 +aI-533 +aI195 +aI-556 +aa(lp26387 +g15 +aI421 +aI-515 +aI303 +aI-556 +aI356 +aI-543 +aa(lp26388 +g15 +aI552 +aI-479 +aI477 +aI-491 +aI521 +aI-479 +aa(lp26389 +g15 +aI699 +aI-558 +aI598 +aI-479 +aI648 +aI-505 +aa(lp26390 +g20 +aI699 +aI-452 +aa(lp26391 +g15 +aI538 +aI-382 +aI656 +aI-405 +aI603 +aI-382 +aa(lp26392 +g15 +aI377 +aI-423 +aI495 +aI-382 +aI441 +aI-396 +aa(lp26393 +g15 +aI246 +aI-459 +aI320 +aI-447 +aI277 +aI-459 +aa(lp26394 +g15 +aI98 +aI-381 +aI199 +aI-459 +aI150 +aI-433 +aa(lp26395 +g10 +aa(lp26396 +g8 +aI800 +aI0 +aa(lp26397 +g10 +aa(lp26398 +g8 +aI800 +aI0 +aasV! +(lp26399 +(lp26400 +g8 +aI440 +aI-269 +aa(lp26401 +g20 +aI361 +aI-269 +aa(lp26402 +g20 +aI328 +aI-951 +aa(lp26403 +g20 +aI473 +aI-951 +aa(lp26404 +g10 +aa(lp26405 +g8 +aI399 +aI-162 +aa(lp26406 +g15 +aI482 +aI-71 +aI454 +aI-162 +aI482 +aI-132 +aa(lp26407 +g15 +aI399 +aI19 +aI482 +aI-11 +aI454 +aI19 +aa(lp26408 +g15 +aI317 +aI-71 +aI344 +aI19 +aI317 +aI-11 +aa(lp26409 +g15 +aI399 +aI-162 +aI317 +aI-132 +aI344 +aI-162 +aa(lp26410 +g10 +aa(lp26411 +g8 +aI800 +aI0 +aa(lp26412 +g10 +aa(lp26413 +g8 +aI800 +aI0 +aasV% +(lp26414 +(lp26415 +g8 +aI189 +aI-509 +aa(lp26416 +g15 +aI52 +aI-571 +aI132 +aI-509 +aI86 +aI-530 +aa(lp26417 +g15 +aI0 +aI-737 +aI17 +aI-612 +aI0 +aI-667 +aa(lp26418 +g15 +aI51 +aI-903 +aI0 +aI-808 +aI17 +aI-863 +aa(lp26419 +g15 +aI192 +aI-962 +aI85 +aI-942 +aI132 +aI-962 +aa(lp26420 +g15 +aI328 +aI-901 +aI248 +aI-962 +aI293 +aI-942 +aa(lp26421 +g15 +aI381 +aI-737 +aI363 +aI-861 +aI381 +aI-806 +aa(lp26422 +g15 +aI330 +aI-570 +aI381 +aI-666 +aI364 +aI-611 +aa(lp26423 +g15 +aI189 +aI-509 +aI296 +aI-530 +aI249 +aI-509 +aa(lp26424 +g10 +aa(lp26425 +g8 +aI190 +aI-587 +aa(lp26426 +g15 +aI281 +aI-737 +aI251 +aI-587 +aI281 +aI-637 +aa(lp26427 +g15 +aI190 +aI-883 +aI281 +aI-834 +aI251 +aI-883 +aa(lp26428 +g15 +aI98 +aI-737 +aI129 +aI-883 +aI98 +aI-834 +aa(lp26429 +g15 +aI190 +aI-587 +aI98 +aI-637 +aI129 +aI-587 +aa(lp26430 +g10 +aa(lp26431 +g8 +aI688 +aI-951 +aa(lp26432 +g20 +aI213 +aI0 +aa(lp26433 +g20 +aI110 +aI0 +aa(lp26434 +g20 +aI585 +aI-951 +aa(lp26435 +g10 +aa(lp26436 +g8 +aI608 +aI12 +aa(lp26437 +g15 +aI471 +aI-49 +aI551 +aI12 +aI505 +aI-8 +aa(lp26438 +g15 +aI418 +aI-214 +aI436 +aI-90 +aI418 +aI-145 +aa(lp26439 +g15 +aI470 +aI-380 +aI418 +aI-285 +aI435 +aI-340 +aa(lp26440 +g15 +aI610 +aI-439 +aI504 +aI-419 +aI551 +aI-439 +aa(lp26441 +g15 +aI747 +aI-379 +aI666 +aI-439 +aI712 +aI-419 +aa(lp26442 +g15 +aI800 +aI-214 +aI782 +aI-338 +aI800 +aI-283 +aa(lp26443 +g15 +aI749 +aI-48 +aI800 +aI-144 +aI783 +aI-89 +aa(lp26444 +g15 +aI608 +aI12 +aI714 +aI-8 +aI667 +aI12 +aa(lp26445 +g10 +aa(lp26446 +g8 +aI609 +aI-64 +aa(lp26447 +g15 +aI699 +aI-214 +aI669 +aI-64 +aI699 +aI-114 +aa(lp26448 +g15 +aI609 +aI-360 +aI699 +aI-312 +aI669 +aI-360 +aa(lp26449 +g15 +aI517 +aI-214 +aI548 +aI-360 +aI517 +aI-312 +aa(lp26450 +g15 +aI609 +aI-64 +aI517 +aI-114 +aI548 +aI-64 +aa(lp26451 +g10 +aa(lp26452 +g8 +aI800 +aI0 +aa(lp26453 +g10 +aa(lp26454 +g8 +aI800 +aI0 +aasV) +(lp26455 +(lp26456 +g8 +aI318 +aI211 +aa(lp26457 +g20 +aI194 +aI211 +aa(lp26458 +g15 +aI485 +aI-369 +aI388 +aI50 +aI485 +aI-143 +aa(lp26459 +g15 +aI193 +aI-951 +aI485 +aI-594 +aI387 +aI-788 +aa(lp26460 +g20 +aI318 +aI-951 +aa(lp26461 +g15 +aI608 +aI-368 +aI511 +aI-794 +aI608 +aI-600 +aa(lp26462 +g15 +aI318 +aI211 +aI608 +aI-134 +aI511 +aI59 +aa(lp26463 +g10 +aa(lp26464 +g8 +aI800 +aI0 +aa(lp26465 +g10 +aa(lp26466 +g8 +aI800 +aI0 +aasV- +(lp26467 +(lp26468 +g8 +aI185 +aI-302 +aa(lp26469 +g20 +aI185 +aI-411 +aa(lp26470 +g20 +aI614 +aI-411 +aa(lp26471 +g20 +aI614 +aI-302 +aa(lp26472 +g10 +aa(lp26473 +g8 +aI800 +aI0 +aa(lp26474 +g10 +aa(lp26475 +g8 +aI800 +aI0 +aasV1 +(lp26476 +(lp26477 +g8 +aI493 +aI0 +aa(lp26478 +g20 +aI378 +aI0 +aa(lp26479 +g20 +aI378 +aI-593 +aa(lp26480 +g15 +aI384 +aI-828 +aI378 +aI-646 +aI380 +aI-725 +aa(lp26481 +g15 +aI305 +aI-755 +aI367 +aI-810 +aI340 +aI-785 +aa(lp26482 +g20 +aI209 +aI-676 +aa(lp26483 +g20 +aI146 +aI-756 +aa(lp26484 +g20 +aI395 +aI-951 +aa(lp26485 +g20 +aI493 +aI-951 +aa(lp26486 +g10 +aa(lp26487 +g8 +aI800 +aI0 +aa(lp26488 +g10 +aa(lp26489 +g8 +aI800 +aI0 +aasV5 +(lp26490 +(lp26491 +g8 +aI111 +aI-37 +aa(lp26492 +g20 +aI111 +aI-149 +aa(lp26493 +g15 +aI346 +aI-87 +aI174 +aI-108 +aI252 +aI-87 +aa(lp26494 +g15 +aI565 +aI-291 +aI492 +aI-87 +aI565 +aI-155 +aa(lp26495 +g15 +aI341 +aI-483 +aI565 +aI-419 +aI490 +aI-483 +aa(lp26496 +g15 +aI190 +aI-466 +aI302 +aI-483 +aI252 +aI-477 +aa(lp26497 +g20 +aI132 +aI-503 +aa(lp26498 +g20 +aI167 +aI-951 +aa(lp26499 +g20 +aI617 +aI-951 +aa(lp26500 +g20 +aI617 +aI-843 +aa(lp26501 +g20 +aI270 +aI-843 +aa(lp26502 +g20 +aI245 +aI-570 +aa(lp26503 +g15 +aI381 +aI-583 +aI291 +aI-579 +aI337 +aI-583 +aa(lp26504 +g15 +aI602 +aI-508 +aI472 +aI-583 +aI546 +aI-558 +aa(lp26505 +g15 +aI686 +aI-304 +aI658 +aI-459 +aI686 +aI-391 +aa(lp26506 +g15 +aI597 +aI-69 +aI686 +aI-203 +aI656 +aI-124 +aa(lp26507 +g15 +aI343 +aI13 +aI537 +aI-14 +aI452 +aI13 +aa(lp26508 +g15 +aI111 +aI-37 +aI246 +aI13 +aI169 +aI-3 +aa(lp26509 +g10 +aa(lp26510 +g8 +aI800 +aI0 +aa(lp26511 +g10 +aa(lp26512 +g8 +aI800 +aI0 +aasV9 +(lp26513 +(lp26514 +g8 +aI171 +aI1 +aa(lp26515 +g20 +aI171 +aI-99 +aa(lp26516 +g15 +aI279 +aI-83 +aI200 +aI-88 +aI236 +aI-83 +aa(lp26517 +g15 +aI499 +aI-175 +aI377 +aI-83 +aI450 +aI-114 +aa(lp26518 +g15 +aI578 +aI-466 +aI547 +aI-236 +aI574 +aI-333 +aa(lp26519 +g20 +aI570 +aI-466 +aa(lp26520 +g15 +aI370 +aI-355 +aI529 +aI-392 +aI462 +aI-355 +aa(lp26521 +g15 +aI172 +aI-432 +aI286 +aI-355 +aI220 +aI-381 +aa(lp26522 +g15 +aI100 +aI-644 +aI124 +aI-483 +aI100 +aI-554 +aa(lp26523 +g15 +aI178 +aI-879 +aI100 +aI-743 +aI126 +aI-821 +aa(lp26524 +g15 +aI389 +aI-965 +aI231 +aI-936 +aI301 +aI-965 +aa(lp26525 +g15 +aI616 +aI-853 +aI484 +aI-965 +aI560 +aI-927 +aa(lp26526 +g15 +aI699 +aI-545 +aI671 +aI-779 +aI699 +aI-676 +aa(lp26527 +g15 +aI283 +aI13 +aI699 +aI-172 +aI561 +aI13 +aa(lp26528 +g15 +aI171 +aI1 +aI238 +aI13 +aI200 +aI9 +aa(lp26529 +g10 +aa(lp26530 +g8 +aI214 +aI-644 +aa(lp26531 +g15 +aI259 +aI-499 +aI214 +aI-581 +aI229 +aI-533 +aa(lp26532 +g15 +aI386 +aI-448 +aI289 +aI-465 +aI331 +aI-448 +aa(lp26533 +g15 +aI525 +aI-501 +aI441 +aI-448 +aI488 +aI-466 +aa(lp26534 +g15 +aI581 +aI-621 +aI562 +aI-537 +aI581 +aI-577 +aa(lp26535 +g15 +aI529 +aI-792 +aI581 +aI-687 +aI564 +aI-744 +aa(lp26536 +g15 +aI390 +aI-864 +aI494 +aI-840 +aI448 +aI-864 +aa(lp26537 +g15 +aI261 +aI-808 +aI335 +aI-864 +aI291 +aI-845 +aa(lp26538 +g15 +aI214 +aI-644 +aI230 +aI-770 +aI214 +aI-715 +aa(lp26539 +g10 +aa(lp26540 +g8 +aI800 +aI0 +aa(lp26541 +g10 +aa(lp26542 +g8 +aI800 +aI0 +aasV= +(lp26543 +(lp26544 +g8 +aI98 +aI-554 +aa(lp26545 +g20 +aI98 +aI-651 +aa(lp26546 +g20 +aI699 +aI-651 +aa(lp26547 +g20 +aI699 +aI-554 +aa(lp26548 +g10 +aa(lp26549 +g8 +aI98 +aI-287 +aa(lp26550 +g20 +aI98 +aI-384 +aa(lp26551 +g20 +aI699 +aI-384 +aa(lp26552 +g20 +aI699 +aI-287 +aa(lp26553 +g10 +aa(lp26554 +g8 +aI800 +aI0 +aa(lp26555 +g10 +aa(lp26556 +g8 +aI800 +aI0 +aasVA +(lp26557 +(lp26558 +g8 +aI653 +aI0 +aa(lp26559 +g20 +aI559 +aI-294 +aa(lp26560 +g20 +aI240 +aI-294 +aa(lp26561 +g20 +aI145 +aI0 +aa(lp26562 +g20 +aI21 +aI0 +aa(lp26563 +g20 +aI335 +aI-955 +aa(lp26564 +g20 +aI462 +aI-955 +aa(lp26565 +g20 +aI778 +aI0 +aa(lp26566 +g10 +aa(lp26567 +g8 +aI525 +aI-401 +aa(lp26568 +g20 +aI438 +aI-677 +aa(lp26569 +g15 +aI398 +aI-825 +aI421 +aI-731 +aI408 +aI-780 +aa(lp26570 +g15 +aI368 +aI-705 +aI389 +aI-782 +aI379 +aI-742 +aa(lp26571 +g20 +aI274 +aI-401 +aa(lp26572 +g10 +aa(lp26573 +g8 +aI800 +aI0 +aa(lp26574 +g10 +aa(lp26575 +g8 +aI800 +aI0 +aasVE +(lp26576 +(lp26577 +g8 +aI689 +aI0 +aa(lp26578 +g20 +aI141 +aI0 +aa(lp26579 +g20 +aI141 +aI-951 +aa(lp26580 +g20 +aI689 +aI-951 +aa(lp26581 +g20 +aI689 +aI-844 +aa(lp26582 +g20 +aI262 +aI-844 +aa(lp26583 +g20 +aI262 +aI-550 +aa(lp26584 +g20 +aI664 +aI-550 +aa(lp26585 +g20 +aI664 +aI-444 +aa(lp26586 +g20 +aI262 +aI-444 +aa(lp26587 +g20 +aI262 +aI-106 +aa(lp26588 +g20 +aI689 +aI-106 +aa(lp26589 +g10 +aa(lp26590 +g8 +aI800 +aI0 +aa(lp26591 +g10 +aa(lp26592 +g8 +aI800 +aI0 +aasVI +(lp26593 +(lp26594 +g8 +aI651 +aI0 +aa(lp26595 +g20 +aI146 +aI0 +aa(lp26596 +g20 +aI146 +aI-79 +aa(lp26597 +g20 +aI338 +aI-92 +aa(lp26598 +g20 +aI338 +aI-858 +aa(lp26599 +g20 +aI146 +aI-871 +aa(lp26600 +g20 +aI146 +aI-951 +aa(lp26601 +g20 +aI651 +aI-951 +aa(lp26602 +g20 +aI651 +aI-871 +aa(lp26603 +g20 +aI460 +aI-858 +aa(lp26604 +g20 +aI460 +aI-92 +aa(lp26605 +g20 +aI651 +aI-79 +aa(lp26606 +g10 +aa(lp26607 +g8 +aI800 +aI0 +aa(lp26608 +g10 +aa(lp26609 +g8 +aI800 +aI0 +aasVM +(lp26610 +(lp26611 +g8 +aI346 +aI0 +aa(lp26612 +g20 +aI165 +aI-832 +aa(lp26613 +g20 +aI160 +aI-832 +aa(lp26614 +g15 +aI171 +aI-568 +aI167 +aI-717 +aI171 +aI-629 +aa(lp26615 +g20 +aI171 +aI0 +aa(lp26616 +g20 +aI73 +aI0 +aa(lp26617 +g20 +aI73 +aI-951 +aa(lp26618 +g20 +aI234 +aI-951 +aa(lp26619 +g20 +aI395 +aI-175 +aa(lp26620 +g20 +aI399 +aI-175 +aa(lp26621 +g20 +aI562 +aI-951 +aa(lp26622 +g20 +aI726 +aI-951 +aa(lp26623 +g20 +aI726 +aI0 +aa(lp26624 +g20 +aI626 +aI0 +aa(lp26625 +g20 +aI626 +aI-577 +aa(lp26626 +g15 +aI636 +aI-831 +aI626 +aI-621 +aI629 +aI-706 +aa(lp26627 +g20 +aI630 +aI-831 +aa(lp26628 +g20 +aI446 +aI0 +aa(lp26629 +g10 +aa(lp26630 +g8 +aI800 +aI0 +aa(lp26631 +g10 +aa(lp26632 +g8 +aI800 +aI0 +aasVQ +(lp26633 +(lp26634 +g8 +aI561 +aI-24 +aa(lp26635 +g15 +aI742 +aI177 +aI598 +aI53 +aI658 +aI120 +aa(lp26636 +g20 +aI664 +aI269 +aa(lp26637 +g15 +aI450 +aI9 +aI561 +aI195 +aI490 +aI108 +aa(lp26638 +g15 +aI401 +aI13 +aI434 +aI12 +aI418 +aI13 +aa(lp26639 +g15 +aI54 +aI-478 +aI170 +aI13 +aI54 +aI-150 +aa(lp26640 +g15 +aI402 +aI-966 +aI54 +aI-803 +aI170 +aI-966 +aa(lp26641 +g15 +aI657 +aI-839 +aI513 +aI-966 +aI598 +aI-923 +aa(lp26642 +g15 +aI746 +aI-476 +aI717 +aI-754 +aI746 +aI-633 +aa(lp26643 +g15 +aI561 +aI-24 +aI746 +aI-248 +aI684 +aI-97 +aa(lp26644 +g10 +aa(lp26645 +g8 +aI401 +aI-92 +aa(lp26646 +g15 +aI566 +aI-187 +aI476 +aI-92 +aI531 +aI-124 +aa(lp26647 +g15 +aI618 +aI-476 +aI601 +aI-249 +aI618 +aI-346 +aa(lp26648 +g15 +aI565 +aI-766 +aI618 +aI-608 +aI600 +aI-704 +aa(lp26649 +g15 +aI402 +aI-859 +aI530 +aI-828 +aI475 +aI-859 +aa(lp26650 +g15 +aI182 +aI-476 +aI256 +aI-859 +aI182 +aI-731 +aa(lp26651 +g15 +aI401 +aI-92 +aI182 +aI-220 +aI255 +aI-92 +aa(lp26652 +g10 +aa(lp26653 +g8 +aI800 +aI0 +aa(lp26654 +g10 +aa(lp26655 +g8 +aI800 +aI0 +aasVU +(lp26656 +(lp26657 +g8 +aI718 +aI-952 +aa(lp26658 +g20 +aI718 +aI-335 +aa(lp26659 +g15 +aI636 +aI-76 +aI718 +aI-222 +aI691 +aI-136 +aa(lp26660 +g15 +aI395 +aI13 +aI582 +aI-16 +aI501 +aI13 +aa(lp26661 +g15 +aI81 +aI-338 +aI186 +aI13 +aI81 +aI-103 +aa(lp26662 +g20 +aI81 +aI-951 +aa(lp26663 +g20 +aI202 +aI-951 +aa(lp26664 +g20 +aI202 +aI-344 +aa(lp26665 +g15 +aI402 +aI-92 +aI202 +aI-176 +aI269 +aI-92 +aa(lp26666 +g15 +aI597 +aI-345 +aI530 +aI-92 +aI595 +aI-177 +aa(lp26667 +g20 +aI597 +aI-952 +aa(lp26668 +g10 +aa(lp26669 +g8 +aI800 +aI0 +aa(lp26670 +g10 +aa(lp26671 +g8 +aI800 +aI0 +aasVY +(lp26672 +(lp26673 +g8 +aI398 +aI-470 +aa(lp26674 +g20 +aI646 +aI-951 +aa(lp26675 +g20 +aI777 +aI-951 +aa(lp26676 +g20 +aI460 +aI-369 +aa(lp26677 +g20 +aI460 +aI0 +aa(lp26678 +g20 +aI338 +aI0 +aa(lp26679 +g20 +aI338 +aI-363 +aa(lp26680 +g20 +aI21 +aI-951 +aa(lp26681 +g20 +aI153 +aI-951 +aa(lp26682 +g10 +aa(lp26683 +g8 +aI800 +aI0 +aa(lp26684 +g10 +aa(lp26685 +g8 +aI800 +aI0 +aasV] +(lp26686 +(lp26687 +g8 +aI188 +aI113 +aa(lp26688 +g20 +aI413 +aI113 +aa(lp26689 +g20 +aI413 +aI-854 +aa(lp26690 +g20 +aI188 +aI-854 +aa(lp26691 +g20 +aI188 +aI-951 +aa(lp26692 +g20 +aI531 +aI-951 +aa(lp26693 +g20 +aI531 +aI211 +aa(lp26694 +g20 +aI188 +aI211 +aa(lp26695 +g10 +aa(lp26696 +g8 +aI800 +aI0 +aa(lp26697 +g10 +aa(lp26698 +g8 +aI800 +aI0 +aasVa +(lp26699 +(lp26700 +g8 +aI582 +aI0 +aa(lp26701 +g20 +aI558 +aI-98 +aa(lp26702 +g20 +aI553 +aI-98 +aa(lp26703 +g15 +aI450 +aI-10 +aI519 +aI-56 +aI485 +aI-27 +aa(lp26704 +g15 +aI314 +aI13 +aI415 +aI5 +aI370 +aI13 +aa(lp26705 +g15 +aI148 +aI-42 +aI243 +aI13 +aI188 +aI-5 +aa(lp26706 +g15 +aI87 +aI-199 +aI107 +aI-79 +aI87 +aI-132 +aa(lp26707 +g15 +aI419 +aI-425 +aI87 +aI-343 +aI198 +aI-419 +aa(lp26708 +g20 +aI552 +aI-430 +aa(lp26709 +g20 +aI552 +aI-475 +aa(lp26710 +g15 +aI393 +aI-629 +aI552 +aI-577 +aI499 +aI-629 +aa(lp26711 +g15 +aI179 +aI-575 +aI329 +aI-629 +aI258 +aI-611 +aa(lp26712 +g20 +aI138 +aI-664 +aa(lp26713 +g15 +aI388 +aI-727 +aI223 +aI-706 +aI306 +aI-727 +aa(lp26714 +g15 +aI601 +aI-670 +aI486 +aI-727 +aI557 +aI-708 +aa(lp26715 +g15 +aI667 +aI-489 +aI645 +aI-633 +aI667 +aI-572 +aa(lp26716 +g20 +aI667 +aI0 +aa(lp26717 +g10 +aa(lp26718 +g8 +aI550 +aI-349 +aa(lp26719 +g20 +aI445 +aI-344 +aa(lp26720 +g15 +aI264 +aI-304 +aI360 +aI-341 +aI299 +aI-327 +aa(lp26721 +g15 +aI210 +aI-198 +aI228 +aI-281 +aI210 +aI-245 +aa(lp26722 +g15 +aI341 +aI-82 +aI210 +aI-120 +aI254 +aI-82 +aa(lp26723 +g15 +aI493 +aI-135 +aI404 +aI-82 +aI455 +aI-99 +aa(lp26724 +g15 +aI550 +aI-284 +aI531 +aI-170 +aI550 +aI-220 +aa(lp26725 +g10 +aa(lp26726 +g8 +aI800 +aI0 +aa(lp26727 +g10 +aa(lp26728 +g8 +aI800 +aI0 +aasVe +(lp26729 +(lp26730 +g8 +aI713 +aI-334 +aa(lp26731 +g20 +aI209 +aI-334 +aa(lp26732 +g15 +aI433 +aI-90 +aI213 +aI-171 +aI287 +aI-90 +aa(lp26733 +g15 +aI674 +aI-139 +aI518 +aI-90 +aI598 +aI-106 +aa(lp26734 +g20 +aI674 +aI-35 +aa(lp26735 +g15 +aI437 +aI13 +aI602 +aI-2 +aI523 +aI13 +aa(lp26736 +g15 +aI182 +aI-83 +aI331 +aI13 +aI246 +aI-18 +aa(lp26737 +g15 +aI86 +aI-351 +aI118 +aI-148 +aI86 +aI-238 +aa(lp26738 +g15 +aI174 +aI-626 +aI86 +aI-467 +aI115 +aI-558 +aa(lp26739 +g15 +aI410 +aI-727 +aI233 +aI-693 +aI312 +aI-727 +aa(lp26740 +g15 +aI631 +aI-640 +aI502 +aI-727 +aI576 +aI-698 +aa(lp26741 +g15 +aI713 +aI-407 +aI686 +aI-582 +aI713 +aI-504 +aa(lp26742 +g10 +aa(lp26743 +g8 +aI212 +aI-430 +aa(lp26744 +g20 +aI585 +aI-430 +aa(lp26745 +g15 +aI408 +aI-629 +aI585 +aI-562 +aI526 +aI-629 +aa(lp26746 +g15 +aI212 +aI-430 +aI288 +aI-629 +aI223 +aI-562 +aa(lp26747 +g10 +aa(lp26748 +g8 +aI800 +aI0 +aa(lp26749 +g10 +aa(lp26750 +g8 +aI800 +aI0 +aasVi +(lp26751 +(lp26752 +g8 +aI412 +aI-1008 +aa(lp26753 +g15 +aI481 +aI-934 +aI458 +aI-1008 +aI481 +aI-983 +aa(lp26754 +g15 +aI460 +aI-878 +aI481 +aI-909 +aI474 +aI-890 +aa(lp26755 +g15 +aI412 +aI-859 +aI446 +aI-865 +aI430 +aI-859 +aa(lp26756 +g15 +aI342 +aI-934 +aI365 +aI-859 +aI342 +aI-884 +aa(lp26757 +g15 +aI412 +aI-1008 +aI342 +aI-983 +aI365 +aI-1008 +aa(lp26758 +g10 +aa(lp26759 +g8 +aI352 +aI-620 +aa(lp26760 +g20 +aI177 +aI-634 +aa(lp26761 +g20 +aI177 +aI-714 +aa(lp26762 +g20 +aI470 +aI-714 +aa(lp26763 +g20 +aI470 +aI-92 +aa(lp26764 +g20 +aI699 +aI-79 +aa(lp26765 +g20 +aI699 +aI0 +aa(lp26766 +g20 +aI128 +aI0 +aa(lp26767 +g20 +aI128 +aI-79 +aa(lp26768 +g20 +aI352 +aI-92 +aa(lp26769 +g10 +aa(lp26770 +g8 +aI800 +aI0 +aa(lp26771 +g10 +aa(lp26772 +g8 +aI800 +aI0 +aasVm +(lp26773 +(lp26774 +g8 +aI636 +aI0 +aa(lp26775 +g20 +aI636 +aI-459 +aa(lp26776 +g15 +aI618 +aI-591 +aI636 +aI-523 +aI630 +aI-567 +aa(lp26777 +g15 +aI561 +aI-629 +aI607 +aI-616 +aI588 +aI-629 +aa(lp26778 +g15 +aI478 +aI-575 +aI523 +aI-629 +aI495 +aI-611 +aa(lp26779 +g15 +aI453 +aI-394 +aI461 +aI-539 +aI453 +aI-478 +aa(lp26780 +g20 +aI453 +aI0 +aa(lp26781 +g20 +aI348 +aI0 +aa(lp26782 +g20 +aI348 +aI-459 +aa(lp26783 +g15 +aI266 +aI-629 +aI348 +aI-572 +aI321 +aI-629 +aa(lp26784 +g15 +aI188 +aI-577 +aI230 +aI-629 +aI204 +aI-611 +aa(lp26785 +g15 +aI165 +aI-369 +aI173 +aI-542 +aI165 +aI-473 +aa(lp26786 +g20 +aI165 +aI0 +aa(lp26787 +g20 +aI59 +aI0 +aa(lp26788 +g20 +aI59 +aI-714 +aa(lp26789 +g20 +aI142 +aI-714 +aa(lp26790 +g20 +aI160 +aI-618 +aa(lp26791 +g20 +aI166 +aI-618 +aa(lp26792 +g15 +aI297 +aI-727 +aI195 +aI-690 +aI239 +aI-727 +aa(lp26793 +g15 +aI436 +aI-608 +aI368 +aI-727 +aI414 +aI-687 +aa(lp26794 +g20 +aI440 +aI-608 +aa(lp26795 +g15 +aI582 +aI-727 +aI473 +aI-687 +aI520 +aI-727 +aa(lp26796 +g15 +aI703 +aI-667 +aI638 +aI-727 +aI678 +aI-707 +aa(lp26797 +g15 +aI741 +aI-466 +aI728 +aI-627 +aI741 +aI-560 +aa(lp26798 +g20 +aI741 +aI0 +aa(lp26799 +g10 +aa(lp26800 +g8 +aI800 +aI0 +aa(lp26801 +g10 +aa(lp26802 +g8 +aI800 +aI0 +aasVq +(lp26803 +(lp26804 +g8 +aI578 +aI-618 +aa(lp26805 +g20 +aI583 +aI-618 +aa(lp26806 +g20 +aI601 +aI-714 +aa(lp26807 +g20 +aI697 +aI-714 +aa(lp26808 +g20 +aI697 +aI320 +aa(lp26809 +g20 +aI578 +aI320 +aa(lp26810 +g20 +aI578 +aI15 +aa(lp26811 +g15 +aI586 +aI-95 +aI578 +aI-2 +aI581 +aI-39 +aa(lp26812 +g20 +aI578 +aI-95 +aa(lp26813 +g15 +aI369 +aI13 +aI529 +aI-22 +aI459 +aI13 +aa(lp26814 +g15 +aI163 +aI-83 +aI281 +aI13 +aI213 +aI-18 +aa(lp26815 +g15 +aI89 +aI-355 +aI114 +aI-148 +aI89 +aI-239 +aa(lp26816 +g15 +aI164 +aI-629 +aI89 +aI-472 +aI114 +aI-564 +aa(lp26817 +g15 +aI369 +aI-727 +aI213 +aI-694 +aI282 +aI-727 +aa(lp26818 +g15 +aI578 +aI-618 +aI458 +aI-727 +aI528 +aI-690 +aa(lp26819 +g10 +aa(lp26820 +g8 +aI578 +aI-328 +aa(lp26821 +g20 +aI578 +aI-355 +aa(lp26822 +g15 +aI533 +aI-566 +aI578 +aI-454 +aI563 +aI-524 +aa(lp26823 +g15 +aI389 +aI-629 +aI503 +aI-608 +aI455 +aI-629 +aa(lp26824 +g15 +aI212 +aI-354 +aI271 +aI-629 +aI212 +aI-537 +aa(lp26825 +g15 +aI390 +aI-84 +aI212 +aI-174 +aI271 +aI-84 +aa(lp26826 +g15 +aI532 +aI-142 +aI456 +aI-84 +aI504 +aI-104 +aa(lp26827 +g15 +aI578 +aI-328 +aI561 +aI-180 +aI577 +aI-243 +aa(lp26828 +g10 +aa(lp26829 +g8 +aI800 +aI0 +aa(lp26830 +g10 +aa(lp26831 +g8 +aI800 +aI0 +aasVu +(lp26832 +(lp26833 +g8 +aI600 +aI0 +aa(lp26834 +g20 +aI582 +aI-95 +aa(lp26835 +g20 +aI576 +aI-95 +aa(lp26836 +g15 +aI358 +aI13 +aI530 +aI-22 +aI458 +aI13 +aa(lp26837 +g15 +aI104 +aI-247 +aI189 +aI13 +aI104 +aI-73 +aa(lp26838 +g20 +aI104 +aI-714 +aa(lp26839 +g20 +aI222 +aI-714 +aa(lp26840 +g20 +aI222 +aI-254 +aa(lp26841 +g15 +aI376 +aI-84 +aI222 +aI-141 +aI273 +aI-84 +aa(lp26842 +g15 +aI529 +aI-145 +aI446 +aI-84 +aI497 +aI-104 +aa(lp26843 +g15 +aI577 +aI-343 +aI561 +aI-185 +aI577 +aI-251 +aa(lp26844 +g20 +aI577 +aI-714 +aa(lp26845 +g20 +aI695 +aI-714 +aa(lp26846 +g20 +aI695 +aI0 +aa(lp26847 +g10 +aa(lp26848 +g8 +aI800 +aI0 +aa(lp26849 +g10 +aa(lp26850 +g8 +aI800 +aI0 +aasVy +(lp26851 +(lp26852 +g8 +aI53 +aI-714 +aa(lp26853 +g20 +aI175 +aI-714 +aa(lp26854 +g20 +aI346 +aI-288 +aa(lp26855 +g15 +aI404 +aI-99 +aI381 +aI-199 +aI401 +aI-136 +aa(lp26856 +g20 +aI408 +aI-99 +aa(lp26857 +g15 +aI466 +aI-289 +aI418 +aI-148 +aI437 +aI-211 +aa(lp26858 +g20 +aI622 +aI-714 +aa(lp26859 +g20 +aI745 +aI-714 +aa(lp26860 +g20 +aI436 +aI93 +aa(lp26861 +g15 +aI334 +aI263 +aI407 +aI169 +aI373 +aI225 +aa(lp26862 +g15 +aI174 +aI320 +aI296 +aI301 +aI242 +aI320 +aa(lp26863 +g15 +aI65 +aI309 +aI137 +aI320 +aI100 +aI317 +aa(lp26864 +g20 +aI65 +aI215 +aa(lp26865 +g15 +aI153 +aI223 +aI92 +aI220 +aI121 +aI223 +aa(lp26866 +g15 +aI250 +aI196 +aI195 +aI223 +aI227 +aI214 +aa(lp26867 +g15 +aI313 +aI104 +aI274 +aI178 +aI294 +aI148 +aa(lp26868 +g20 +aI350 +aI6 +aa(lp26869 +g10 +aa(lp26870 +g8 +aI800 +aI0 +aa(lp26871 +g10 +aa(lp26872 +g8 +aI800 +aI0 +aasV} +(lp26873 +(lp26874 +g8 +aI314 +aI-204 +aa(lp26875 +g15 +aI466 +aI-366 +aI314 +aI-294 +aI365 +aI-348 +aa(lp26876 +g20 +aI466 +aI-373 +aa(lp26877 +g15 +aI314 +aI-535 +aI365 +aI-391 +aI314 +aI-445 +aa(lp26878 +g20 +aI314 +aI-751 +aa(lp26879 +g15 +aI277 +aI-828 +aI314 +aI-786 +aI302 +aI-812 +aa(lp26880 +g15 +aI147 +aI-854 +aI253 +aI-845 +aI209 +aI-853 +aa(lp26881 +g20 +aI147 +aI-951 +aa(lp26882 +g15 +aI433 +aI-760 +aI338 +aI-948 +aI433 +aI-885 +aa(lp26883 +g20 +aI433 +aI-543 +aa(lp26884 +g15 +aI653 +aI-420 +aI433 +aI-461 +aI506 +aI-420 +aa(lp26885 +g20 +aI653 +aI-319 +aa(lp26886 +g15 +aI433 +aI-196 +aI506 +aI-319 +aI433 +aI-278 +aa(lp26887 +g20 +aI433 +aI20 +aa(lp26888 +g15 +aI147 +aI211 +aI433 +aI145 +aI338 +aI208 +aa(lp26889 +g20 +aI147 +aI113 +aa(lp26890 +g15 +aI277 +aI88 +aI209 +aI113 +aI253 +aI104 +aa(lp26891 +g15 +aI314 +aI10 +aI302 +aI71 +aI314 +aI46 +aa(lp26892 +g10 +aa(lp26893 +g8 +aI800 +aI0 +aa(lp26894 +g10 +aa(lp26895 +g8 +aI800 +aI0 +aasss. \ No newline at end of file diff --git a/nodeboxgl/font/glyph.py b/nodeboxgl/font/glyph.py new file mode 100644 index 0000000..457d4f6 --- /dev/null +++ b/nodeboxgl/font/glyph.py @@ -0,0 +1,108 @@ +#=== CHARACTER GLYPH PATHS =========================================================================== +# NodeBox for OpenGL has no direct way of accessing glyph path information. +# This script is to be used in the classic NodeBox for Mac OS X (http://nodebox.net). +# It uses the textpath() command to convert characters to paths, +# and store the paths in a file that can be used by NodeBox for OpenGL as glyph path info. + +# Defines the characters to process. +# By default, only standard ASCII characters are converted. +characters = range(32, 127) + +# Defines which fonts to process. +# By default, only the standard fonts in NodeBox for OpenGL +# are converted (Droid Sans, Droid Sans Mono, Droid Serif, Arial). +fonts = { + "Droid Sans": { + "normal" : "DroidSans", # PostScript-name. + "bold" : "DroidSans-Bold" + }, + "Droid Sans Mono": { + "normal" : "DroidSansMono" + }, + "Droid Serif": { + "normal" : "DroidSerif", + "bold" : "DroidSerif-Bold", + "italic" : "DroidSerif-Italic", + "bold italic" : "DroidSerif-BoldItalic" + }, + "Arial": { + "normal" : "ArialMT", + "bold" : "Arial-BoldMT", + } +} + +# How point size is measured (NodeBox for OpenGL uses 96dpi). +dpi = 96 + +# Measure from the baseline? +baseline = True + +#===================================================================================================== + +glyphs = {} + +commands = { + 0: "moveto", + 1: "lineto", + 2: "curveto", + 3: "close" +} + +from AppKit import NSFont +def descent(fontname, fontsize=10): + return NSFont.fontWithName_size_(fontname, fontsize).descender() + +for fontname in fonts: + glyphs[fontname] = {} + for fontweight in fonts[fontname]: + glyphs[fontname][fontweight] = {} + # Render the font at a large size so we can round the path points. + # This saves disk space and decreases the loading time. + _ctx.font(fonts[fontname][fontweight]) + _ctx.fontsize(1000.0 * dpi / 72) + _ctx.lineheight(1.0) + dy = baseline and descent(fontname, _ctx.fontsize()) or 0 + for i in characters: + ch = unichr(i) + glyphs[fontname][fontweight][ch] = [] + for pt in _ctx.textpath(ch, 0, 0): + if pt.cmd == 0: + pt = [commands[pt.cmd], int(pt.x), int(pt.y-dy)] + elif pt.cmd == 1: + pt = [commands[pt.cmd], int(pt.x), int(pt.y-dy)] + elif pt.cmd == 2: + pt = [commands[pt.cmd], + int(pt.x), int(pt.y-dy), + int(pt.ctrl1.x), int(pt.ctrl1.y-dy), + int(pt.ctrl2.x), int(pt.ctrl2.y-dy)] + elif pt.cmd == 3: + pt = [commands[pt.cmd]] + glyphs[fontname][fontweight][ch].append(pt) + +import cPickle +f = open("glyph.p","w") +cPickle.dump(glyphs, f) +f.close() + +#===================================================================================================== +# For testing purposes: + +def textpath_from_glyphs(string, x=0, y=0, fontname="Droid Sans", fontweight="normal"): + glyphs = cPickle.load(open("glyph.p")) + p = _ctx.BezierPath() + f = _ctx.fontsize() / 1000.0 * 72 / dpi + y += textheight(" ", lineheight()) - textheight(" ", lineheight=1) + from nodebox.graphics import MOVETO, LINETO, CURVETO, CLOSE + for ch in string: + glyph = glyphs[fontname][fontweight][ch] + for pt in glyph: + if pt[0] == "moveto": + p.moveto(x+pt[1]*f, y+pt[2]*f) + elif pt[0] == "lineto": + p.lineto(x+pt[1]*f, y+pt[2]*f) + elif pt[0] == "curveto": + p.curveto(x+pt[3]*f, y+pt[4]*f, x+pt[5]*f, y+pt[6]*f, x+pt[1]*f, y+pt[2]*f) + elif pt[0] == "close": + p.closepath() + x += _ctx.textwidth(ch) + return p diff --git a/nodeboxgl/graphics/__init__.py b/nodeboxgl/graphics/__init__.py new file mode 100644 index 0000000..392a7dd --- /dev/null +++ b/nodeboxgl/graphics/__init__.py @@ -0,0 +1,39 @@ +import bezier +import context +import geometry +import physics +import shader + +from noise import noise +from context import * + +physics.line = context.line +physics.ellipse = context.ellipse +physics.Text = context.Text + +#----------------------------------------------------------------------------------------------------- +# Expose the canvas and some common canvas properties on global level. +# Some magic constants from NodeBox are commands here: +# - WIDTH => width() +# - HEIGHT => height() +# - FRAME => frame() + +canvas = Canvas() + +def size(width=None, height=None): + if width is not None: + canvas.width = width + if height is not None: + canvas.height = height + return canvas.size + +def speed(fps=None): + if fps is not None: + canvas.fps = fps + return canvas.fps + +def frame(): + return canvas.frame + +def clear(): + canvas.clear() \ No newline at end of file diff --git a/nodeboxgl/graphics/bezier.py b/nodeboxgl/graphics/bezier.py new file mode 100644 index 0000000..172f388 --- /dev/null +++ b/nodeboxgl/graphics/bezier.py @@ -0,0 +1,531 @@ +#=== BEZIER ========================================================================================== +# Bezier mathematics. +# Authors: Tom De Smedt +# License: BSD (see LICENSE.txt for details). +# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) +# http://cityinabottle.org/nodebox + +# Thanks to Prof. F. De Smedt at the Vrije Universiteit Brussel. + +from context import BezierPath, PathElement, PathError, Point, MOVETO, LINETO, CURVETO, CLOSE +from math import sqrt, pow + +class DynamicPathElement(PathElement): + # Not a "fixed" point in the BezierPath, but calculated with BezierPath.point(). + pass + +#===================================================================================================== + +#--- BEZIER MATH ------------------------------------------------------------------------------------ + +def linepoint(t, x0, y0, x1, y1): + """ Returns coordinates for point at t on the line. + Calculates the coordinates of x and y for a point at t on a straight line. + The t parameter is a number between 0.0 and 1.0, + x0 and y0 define the starting point of the line, + x1 and y1 the ending point of the line. + """ + out_x = x0 + t * (x1-x0) + out_y = y0 + t * (y1-y0) + return (out_x, out_y) + +def linelength(x0, y0, x1, y1): + """ Returns the length of the line. + """ + a = pow(abs(x0 - x1), 2) + b = pow(abs(y0 - y1), 2) + return sqrt(a+b) + +def curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3, handles=False): + """ Returns coordinates for point at t on the spline. + Calculates the coordinates of x and y for a point at t on the cubic bezier spline, + and its control points, based on the de Casteljau interpolation algorithm. + The t parameter is a number between 0.0 and 1.0, + x0 and y0 define the starting point of the spline, + x1 and y1 its control point, + x3 and y3 the ending point of the spline, + x2 and y2 its control point. + If the handles parameter is set, returns not only the point at t, + but the modified control points of p0 and p3 should this point split the path as well. + """ + mint = 1 - t + x01 = x0 * mint + x1 * t + y01 = y0 * mint + y1 * t + x12 = x1 * mint + x2 * t + y12 = y1 * mint + y2 * t + x23 = x2 * mint + x3 * t + y23 = y2 * mint + y3 * t + out_c1x = x01 * mint + x12 * t + out_c1y = y01 * mint + y12 * t + out_c2x = x12 * mint + x23 * t + out_c2y = y12 * mint + y23 * t + out_x = out_c1x * mint + out_c2x * t + out_y = out_c1y * mint + out_c2y * t + if not handles: + return (out_x, out_y, out_c1x, out_c1y, out_c2x, out_c2y) + else: + return (out_x, out_y, out_c1x, out_c1y, out_c2x, out_c2y, x01, y01, x23, y23) + +def curvelength(x0, y0, x1, y1, x2, y2, x3, y3, n=20): + """ Returns the length of the spline. + Integrates the estimated length of the cubic bezier spline defined by x0, y0, ... x3, y3, + by adding the lengths of linear lines between points at t. + The number of points is defined by n + (n=10 would add the lengths of lines between 0.0 and 0.1, between 0.1 and 0.2, and so on). + The default n=20 is fine for most cases, usually resulting in a deviation of less than 0.01. + """ + length = 0 + xi = x0 + yi = y0 + for i in range(n): + t = 1.0 * (i+1) / n + pt_x, pt_y, pt_c1x, pt_c1y, pt_c2x, pt_c2y = \ + curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3) + c = sqrt(pow(abs(xi-pt_x),2) + pow(abs(yi-pt_y),2)) + length += c + xi = pt_x + yi = pt_y + return length + +# Fast C implementations: +try: + from nglbezier import linepoint, linelength, curvepoint, curvelength +except: + pass + +#--- BEZIER PATH LENGTH ------------------------------------------------------------------------------ + +def segment_lengths(path, relative=False, n=20): + """ Returns a list with the lengths of each segment in the path. + """ + lengths = [] + first = True + for el in path: + if first == True: + close_x, close_y = el.x, el.y + first = False + elif el.cmd == MOVETO: + close_x, close_y = el.x, el.y + lengths.append(0.0) + elif el.cmd == CLOSE: + lengths.append(linelength(x0, y0, close_x, close_y)) + elif el.cmd == LINETO: + lengths.append(linelength(x0, y0, el.x, el.y)) + elif el.cmd == CURVETO: + x3, y3, x1, y1, x2, y2 = el.x, el.y, el.ctrl1.x, el.ctrl1.y, el.ctrl2.x, el.ctrl2.y + lengths.append(curvelength(x0, y0, x1, y1, x2, y2, x3, y3, n)) + if el.cmd != CLOSE: + x0 = el.x + y0 = el.y + if relative: + length = sum(lengths) + try: + # Relative segment lengths' sum is 1.0. + return map(lambda l: l / length, lengths) + except ZeroDivisionError: + # If the length is zero, just return zero for all segments + return [0.0] * len(lengths) + else: + return lengths + +def length(path, segmented=False, n=20): + """ Returns the length of the path. + Calculates the length of each spline in the path, using n as a number of points to measure. + When segmented is True, returns a list containing the individual length of each spline + as values between 0.0 and 1.0, defining the relative length of each spline + in relation to the total path length. + """ + if not segmented: + return sum(segment_lengths(path, n=n), 0.0) + else: + return segment_lengths(path, relative=True, n=n) + +#--- BEZIER PATH POINT ------------------------------------------------------------------------------- + +def _locate(path, t, segments=None): + """ Locates t on a specific segment in the path. + Returns (index, t, PathElement) + A path is a combination of lines and curves (segments). + The returned index indicates the start of the segment that contains point t. + The returned t is the absolute time on that segment, + in contrast to the relative t on the whole of the path. + The returned point is the last MOVETO, any subsequent CLOSETO after i closes to that point. + When you supply the list of segment lengths yourself, as returned from length(path, segmented=True), + point() works about thirty times faster in a for-loop since it doesn't need to recalculate + the length during each iteration. + """ + if segments == None: + segments = segment_lengths(path, relative=True) + if len(segments) == 0: + raise PathError, "The given path is empty" + for i, el in enumerate(path): + if i == 0 or el.cmd == MOVETO: + closeto = Point(el.x, el.y) + if t <= segments[i] or i == len(segments)-1: + break + else: + t -= segments[i] + try: t /= segments[i] + except ZeroDivisionError: + pass + if i == len(segments)-1 and segments[i] == 0: i -= 1 + return (i, t, closeto) + +def point(path, t, segments=None): + """ Returns coordinates for point at t on the path. + Gets the length of the path, based on the length of each curve and line in the path. + Determines in what segment t falls. Gets the point on that segment. + When you supply the list of segment lengths yourself, as returned from length(path, segmented=True), + point() works about thirty times faster in a for-loop since it doesn't need to recalculate + the length during each iteration. + """ + if len(path) == 0: + raise PathError, "The given path is empty" + i, t, closeto = _locate(path, t, segments=segments) + x0, y0 = path[i].x, path[i].y + p1 = path[i+1] + if p1.cmd == CLOSE: + x, y = linepoint(t, x0, y0, closeto.x, closeto.y) + return DynamicPathElement(LINETO, ((x, y),)) + elif p1.cmd == LINETO: + x1, y1 = p1.x, p1.y + x, y = linepoint(t, x0, y0, x1, y1) + return DynamicPathElement(LINETO, ((x, y),)) + elif p1.cmd == CURVETO: + # Note: the handles need to be interpreted differenty than in a BezierPath. + # In a BezierPath, ctrl1 is how the curve started, and ctrl2 how it arrives in this point. + # Here, ctrl1 is how the curve arrives, and ctrl2 how it continues to the next point. + x3, y3, x1, y1, x2, y2 = p1.x, p1.y, p1.ctrl1.x, p1.ctrl1.y, p1.ctrl2.x, p1.ctrl2.y + x, y, c1x, c1y, c2x, c2y = curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3) + return DynamicPathElement(CURVETO, ((c1x, c1y), (c2x, c2y), (x, y))) + else: + raise PathError, "Unknown cmd '%s' for p1 %s" % (p1.cmd, p1) + +def points(path, amount=100, start=0.0, end=1.0, segments=None): + """ Returns an iterator with a list of calculated points for the path. + To omit the last point on closed paths: end=1-1.0/amount + """ + if len(path) == 0: + raise PathError, "The given path is empty" + n = end - start + d = n + if amount > 1: + # The delta value is divided by amount-1, because we also want the last point (t=1.0) + # If we don't use amount-1, we fall one point short of the end. + # If amount=4, we want the point at t 0.0, 0.33, 0.66 and 1.0. + # If amount=2, we want the point at t 0.0 and 1.0. + d = float(n) / (amount-1) + for i in xrange(amount): + yield point(path, start+d*i, segments) + +#--- BEZIER PATH CONTOURS ---------------------------------------------------------------------------- + +def contours(path): + """ Returns a list of contours in the path, as BezierPath objects. + A contour is a sequence of lines and curves separated from the next contour by a MOVETO. + For example, the glyph "o" has two contours: the inner circle and the outer circle. + """ + contours = [] + current_contour = None + empty = True + for i, el in enumerate(path): + if el.cmd == MOVETO: + if not empty: + contours.append(current_contour) + current_contour = BezierPath() + current_contour.moveto(el.x, el.y) + empty = True + elif el.cmd == LINETO: + empty = False + current_contour.lineto(el.x, el.y) + elif el.cmd == CURVETO: + empty = False + current_contour.curveto(el.ctrl1.x, el.ctrl1.y, el.ctrl2.x, el.ctrl2.y, el.x, el.y) + elif el.cmd == CLOSE: + current_contour.closepath() + if not empty: + contours.append(current_contour) + return contours + +#--- BEZIER PATH FROM POINTS ------------------------------------------------------------------------- + +def findpath(points, curvature=1.0): + """ Constructs a smooth BezierPath from the given list of points. + The curvature parameter offers some control on how separate segments are stitched together: + from straight angles to smooth curves. + Curvature is only useful if the path has more than three points. + """ + + # The list of points consists of Point objects, + # but it shouldn't crash on something straightforward + # as someone supplying a list of (x,y)-tuples. + from types import TupleType + for i, pt in enumerate(points): + if type(pt) == TupleType: + points[i] = Point(pt[0], pt[1]) + + # No points: return nothing. + if len(points) == 0: return None + # One point: return a path with a single MOVETO-point. + if len(points) == 1: + path = BezierPath(None) + path.moveto(points[0].x, points[0].y) + return path + # Two points: path with a single straight line. + if len(points) == 2: + path = BezierPath(None) + path.moveto(points[0].x, points[0].y) + path.lineto(points[1].x, points[1].y) + return path + # Zero curvature means path with straight lines. + curvature = max(0, min(1, curvature)) + if curvature == 0: + path = BezierPath(None) + path.moveto(points[0].x, points[0].y) + for i in range(len(points)): + path.lineto(points[i].x, points[i].y) + return path + + # Construct the path with curves. + curvature = 4 + (1.0-curvature)*40 + + # The first point's ctrl1 and ctrl2 and last point's ctrl2 + # will be the same as that point's location; + # we cannot infer how the path curvature started or will continue. + dx = {0: 0, len(points)-1: 0} + dy = {0: 0, len(points)-1: 0} + bi = {1: -0.25} + ax = {1: (points[2].x-points[0].x-dx[0]) / 4} + ay = {1: (points[2].y-points[0].y-dy[0]) / 4} + for i in range(2, len(points)-1): + bi[i] = -1 / (curvature + bi[i-1]) + ax[i] = -(points[i+1].x-points[i-1].x-ax[i-1]) * bi[i] + ay[i] = -(points[i+1].y-points[i-1].y-ay[i-1]) * bi[i] + + r = range(1, len(points)-1) + r.reverse() + for i in r: + dx[i] = ax[i] + dx[i+1] * bi[i] + dy[i] = ay[i] + dy[i+1] * bi[i] + + path = BezierPath(None) + path.moveto(points[0].x, points[0].y) + for i in range(len(points)-1): + path.curveto(points[i].x + dx[i], + points[i].y + dy[i], + points[i+1].x - dx[i+1], + points[i+1].y - dy[i+1], + points[i+1].x, + points[i+1].y) + + return path + +#--- BEZIER PATH INSERT POINT ------------------------------------------------------------------------ + +def insert_point(path, t): + """ Inserts an extra point at t. + """ + + # Find the points before and after t on the path. + i, t, closeto = _locate(path, t) + x0 = path[i].x + y0 = path[i].y + p1 = path[i+1] + p1cmd, x3, y3, x1, y1, x2, y2 = p1.cmd, p1.x, p1.y, p1.ctrl1.x, p1.ctrl1.y, p1.ctrl2.x, p1.ctrl2.y + + # Construct the new point at t. + if p1cmd == CLOSE: + pt_cmd = LINETO + pt_x, pt_y = linepoint(t, x0, y0, closeto.x, closeto.y) + elif p1cmd == LINETO: + pt_cmd = LINETO + pt_x, pt_y = linepoint(t, x0, y0, x3, y3) + elif p1cmd == CURVETO: + pt_cmd = CURVETO + pt_x, pt_y, pt_c1x, pt_c1y, pt_c2x, pt_c2y, pt_h1x, pt_h1y, pt_h2x, pt_h2y = \ + curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3, True) + else: + raise PathError, "Locate should not return a MOVETO" + + # NodeBox for OpenGL modifies the path in place, + # NodeBox for Mac OS X returned a path copy (see inactive code below). + if pt_cmd == CURVETO: + path[i+1].ctrl1.x = pt_c2x + path[i+1].ctrl1.y = pt_c2y + path[i+1].ctrl2.x = pt_h2x + path[i+1].ctrl2.y = pt_h2y + path.insert(i+1, PathElement(cmd=CURVETO, pts=[(pt_h1x, pt_h1y), (pt_c1x, pt_c1y), (pt_x, pt_y)])) + elif pt_cmd == LINETO: + path.insert(i+1, PathElement(cmd=LINETO, pts=[(pt_x, pt_y)])) + else: + raise PathError, "Didn't expect pt_cmd %s here" % pt_cmd + return path[i+1] + + #new_path = BezierPath(None) + #new_path.moveto(path[0].x, path[0].y) + #for j in range(1, len(path)): + # if j == i+1: + # if pt_cmd == CURVETO: + # new_path.curveto(pt_h1x, pt_h1y, pt_c1x, pt_c1y, pt_x, pt_y) + # new_path.curveto(pt_c2x, pt_c2y, pt_h2x, pt_h2y, path[j].x, path[j].y) + # elif pt_cmd == LINETO: + # new_path.lineto(pt_x, pt_y) + # if path[j].cmd != CLOSE: + # new_path.lineto(path[j].x, path[j].y) + # else: + # new_path.closepath() + # else: + # raise PathError, "Didn't expect pt_cmd %s here" % pt_cmd + # else: + # if path[j].cmd == MOVETO: + # new_path.moveto(path[j].x, path[j].y) + # if path[j].cmd == LINETO: + # new_path.lineto(path[j].x, path[j].y) + # if path[j].cmd == CURVETO: + # new_path.curveto(path[j].ctrl1.x, path[j].ctrl1.y, + # path[j].ctrl2.x, path[j].ctrl2.y, + # path[j].x, path[j].y) + # if path[j].cmd == CLOSE: + # new_path.closepath() + + return new_path + +#===================================================================================================== + +#--- BEZIER ARC -------------------------------------------------------------------------------------- + +# Copyright (c) 2005-2008, Enthought, Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# Neither the name of Enthought, Inc. nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from math import acos, sin, cos, hypot, ceil, sqrt, radians, degrees + +def arc(x1, y1, x2, y2, angle=0, extent=90): + """ Compute a cubic Bezier approximation of an elliptical arc. + (x1, y1) and (x2, y2) are the corners of the enclosing rectangle. + The coordinate system has coordinates that increase to the right and down. + Angles, measured in degrees, start with 0 to the right (the positive X axis) + and increase counter-clockwise. + The arc extends from angle to angle+extent. + I.e. angle=0 and extent=180 yields an openside-down semi-circle. + The resulting coordinates are of the form (x1,y1, x2,y2, x3,y3, x4,y4) + such that the curve goes from (x1, y1) to (x4, y4) + with (x2, y2) and (x3, y3) as their respective Bezier control points. + """ + x1, y1, x2, y2 = min(x1,x2), max(y1,y2), max(x1,x2), min(y1,y2) + extent = min(max(extent, -360), 360) + n = abs(extent) <= 90 and 1 or int(ceil(abs(extent) / 90.0)) + a = float(extent) / n + cx = float(x1 + x2) / 2 + cy = float(y1 + y2) / 2 + rx = float(x2 - x1) / 2 + ry = float(y2 - y1) / 2 + a2 = radians(a) / 2 + kappa = abs(4.0 / 3 * (1 - cos(a2)) / sin(a2)) + points = [] + for i in range(n): + theta0 = radians(angle + (i+0) * a) + theta1 = radians(angle + (i+1) * a) + c0, c1 = cos(theta0), cos(theta1) + s0, s1 = sin(theta0), sin(theta1) + k = a > 0 and -kappa or kappa + points.append(( + cx + rx * c0, + cy - ry * s0, + cx + rx * (c0 + k * s0), + cy - ry * (s0 - k * c0), + cx + rx * (c1 - k * s1), + cy - ry * (s1 + k * c1), + cx + rx * c1, + cy - ry * s1 + )) + return points + +def arcto(x1, y1, rx, ry, phi, large_arc, sweep, x2, y2): + """ An elliptical arc approximated with Bezier curves or a line segment. + Algorithm taken from the SVG 1.1 Implementation Notes: + http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes + """ + + def angle(x1, y1, x2, y2): + a = degrees(acos(min(max((x1*x2 + y1*y2) / hypot(x1,y1) * hypot(x2,y2), -1), 1))) + return x1*y2 > y1*x2 and a or -a + + def abspt(x, y, cphi, sphi, mx, my): + return (x * cp - y * sp + mx, + x * sp + y * cp + my) + + if x1 == x2 and y1 == y2: + return [] + if rx == 0 or ry == 0: # Line segment. + return [(x2,y2)] + rx, ry, phi = abs(rx), abs(ry), phi % 360 + cp = cos(radians(phi)) + sp = sin(radians(phi)) + + # Rotate to the local coordinates. + dx = 0.5 * (x1 - x2) + dy = 0.5 * (y1 - y2) + x = cp * dx + sp * dy + y = -sp * dx + cp * dy + + # If rx, ry and phi are such that there is no solution + # (basically, the ellipse is not big enough to reach from (x1, y1) to (x2, y2)) + # then the ellipse is scaled up uniformly until there is exactly one solution + # (until the ellipse is just big enough). + s = (x/rx)**2 + (y/ry)**2 + if s > 1.0: + s = sqrt(s); rx, ry = rx*s, ry*s + + # Solve for the center in the local coordinates. + a = sqrt(max((rx*ry)**2 - (rx*y)**2 - (ry*x)**2, 0) / ((rx*y)**2 + (ry*x)**2)) + a = large_arc == sweep and -a or a + cx = a * rx * y / ry + cy = -a * ry * x / rx + + # Transform back. + mx = 0.5 * (x1 + x2) + my = 0.5 * (y1 + y2) + + # Compute the start angle and the angular extent of the arc. + # Note that theta is local to the phi-rotated coordinate space. + dx1 = ( x - cx) / rx + dy1 = ( y - cy) / ry + dx2 = (-x - cx) / rx + dy2 = (-y - cy) / ry + theta = angle(1.0, 0.0, dx1, dy1) + delta = angle(dx1, dy1, dx2, dy2) + if not sweep and delta > 0: delta -= 360 + if sweep and delta < 0: delta += 360 + + # Break it apart into Bezier curves. + points = [] + handles = arc(cx-rx, cy-ry, cx+rx, cy+ry, theta, delta) + for x1, y1, x2, y2, x3, y3, x4, y4 in handles: + points.append(( + abspt(x2, y2, cp, sp, mx, my) + \ + abspt(x3, y3, cp, sp, mx, my) + \ + abspt(x4, y4, cp, sp, mx, my) + )) + return points diff --git a/nodeboxgl/graphics/context.py b/nodeboxgl/graphics/context.py new file mode 100644 index 0000000..15fbbb3 --- /dev/null +++ b/nodeboxgl/graphics/context.py @@ -0,0 +1,4134 @@ +#=== CONTEXT ========================================================================================= +# 2D NodeBox API in OpenGL. +# Authors: Tom De Smedt, Frederik De Bleser +# License: BSD (see LICENSE.txt for details). +# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) +# http://cityinabottle.org/nodebox + +# All graphics are drawn directly to the screen. +# No scenegraph is kept for obvious performance reasons (therefore, no canvas._grobs as in NodeBox). + +# Debugging must be switched on or of before other modules are imported. +import pyglet +pyglet.options['debug_gl'] = False + +from pyglet.gl import * +from pyglet.image import Texture +from math import cos, sin, radians, pi, floor +from time import time +from random import seed, choice, shuffle, random as rnd +from new import instancemethod +from glob import glob +from os import path, remove +from sys import getrefcount +from StringIO import StringIO +from hashlib import md5 +from types import FunctionType +from datetime import datetime +from numbers import Number + +import geometry + +#import bezier +# Do this at the end, when we have defined BezierPath, which is needed in the bezier module. + +#import shader +# Do this when we have defined texture() and image(), which are needed in the shader module. + +# OpenGL version, e.g. "2.0 NVIDIA-1.5.48". +OPENGL = pyglet.gl.gl_info.get_version() + +#===================================================================================================== + +#--- CACHING ----------------------------------------------------------------------------------------- +# OpenGL Display Lists offer a simple way to precompile batches of OpenGL commands. +# The drawback is that the commands, once compiled, can't be modified. + +def precompile(function, *args, **kwargs): + """ Creates an OpenGL Display List from the OpenGL commands in the given function. + A Display List will precompile the commands and (if possible) store them in graphics memory. + Returns an id which can be used with precompiled() to execute the cached commands. + """ + id = glGenLists(1) + glNewList(id, GL_COMPILE) + function(*args, **kwargs) + glEndList() + return id + +def precompiled(id): + """ Executes the Display List program with the given id. + """ + glCallList(id) + +def flush(id): + """ Removes the Display List program with the given id from memory. + """ + if id is not None: + glDeleteLists(id, 1) + +#===================================================================================================== + +#--- COLOR ------------------------------------------------------------------------------------------- + +RGB = "RGB" +HSB = "HSB" +XYZ = "XYZ" +LAB = "LAB" + +_background = None # Current state background color. +_fill = None # Current state fill color. +_stroke = None # Current state stroke color. +_strokewidth = 1 # Current state strokewidth. +_strokestyle = "solid" # Current state strokestyle. +_alpha = 1 # Current state alpha transparency. + +class Color(list): + + def __init__(self, *args, **kwargs): + """ A color with R,G,B,A channels, with channel values ranging between 0.0-1.0. + Either takes four parameters (R,G,B,A), three parameters (R,G,B), + two parameters (grayscale and alpha) or one parameter (grayscale or Color object). + An optional base=1.0 parameter defines the range of the given parameters. + An optional colorspace=RGB defines the color space of the given parameters. + """ + # Values are supplied as a tuple. + if len(args) == 1 and isinstance(args[0], (list, tuple)): + args = args[0] + # R, G, B and A. + if len(args) == 4: + r, g, b, a = args[0], args[1], args[2], args[3] + # R, G and B. + elif len(args) == 3: + r, g, b, a = args[0], args[1], args[2], 1 + # Two values, grayscale and alpha. + elif len(args) == 2: + r, g, b, a = args[0], args[0], args[0], args[1] + # One value, another color object. + elif len(args) == 1 and isinstance(args[0], Color): + r, g, b, a = args[0].r, args[0].g, args[0].b, args[0].a + # One value, None. + elif len(args) == 1 and args[0] is None: + r, g, b, a = 0, 0, 0, 0 + # One value, grayscale. + elif len(args) == 1: + r, g, b, a = args[0], args[0], args[0], 1 + # No value, transparent black. + elif len(args): + r, g, b, a = 0, 0, 0, 0 + # Transform to base 1: + base = float(kwargs.get("base", 1.0)) + if base != 1: + r, g, b, a = [ch/base for ch in r, g, b, a] + # Transform to color space RGB: + colorspace = kwargs.get("colorspace") + if colorspace and colorspace != RGB: + if colorspace == HSB: r, g, b = hsb_to_rgb(r, g, b) + if colorspace == XYZ: r, g, b = xyz_to_rgb(r, g, b) + if colorspace == LAB: r, g, b = lab_to_rgb(r, g, b) + list.__init__(self, [r, g, b, a]) + self._dirty = False + + def __setitem__(self, i, v): + list.__setitem__(self, i, v) + self._dirty = True + + def _get_r(self): return self[0] + def _get_g(self): return self[1] + def _get_b(self): return self[2] + def _get_a(self): return self[3] + + def _set_r(self, v): self[0] = v + def _set_g(self, v): self[1] = v + def _set_b(self, v): self[2] = v + def _set_a(self, v): self[3] = v + + r = red = property(_get_r, _set_r) + g = green = property(_get_g, _set_g) + b = blue = property(_get_b, _set_b) + a = alpha = property(_get_a, _set_a) + + def _get_rgb(self): + return self[0], self[1], self[2] + def _set_rgb(self, (r,g,b)): + self[0] = r + self[1] = g + self[2] = b + + rgb = property(_get_rgb, _set_rgb) + + def _get_rgba(self): + return self[0], self[1], self[2], self[3] + def _set_rgba(self, (r,g,b,a)): + self[0] = r + self[1] = g + self[2] = b + self[3] = a + + rgba = property(_get_rgba, _set_rgba) + + def copy(self): + return Color(self) + + def _apply(self): + glColor4f(self[0], self[1], self[2], self[3] * _alpha) + + def __repr__(self): + return "Color(%.3f, %.3f, %.3f, %.3f)" % \ + (self[0], self[1], self[2], self[3]) + + def __eq__(self, clr): + if not isinstance(clr, Color): return False + return self[0] == clr[0] \ + and self[1] == clr[1] \ + and self[2] == clr[2] \ + and self[3] == clr[3] + + def __ne__(self, clr): + return not self.__eq__(clr) + + def map(self, base=1.0, colorspace=RGB): + """ Returns a list of R,G,B,A values mapped to the given base, + e.g. from 0-255 instead of 0.0-1.0 which is useful for setting image pixels. + Other values than RGBA can be obtained by setting the colorspace (RGB/HSB/XYZ/LAB). + """ + r, g, b, a = self + if colorspace != RGB: + if colorspace == HSB: r, g, b = rgb_to_hsb(r, g, b) + if colorspace == XYZ: r, g, b = rgb_to_xyz(r, g, b) + if colorspace == LAB: r, g, b = rgb_to_lab(r, g, b) + if base != 1: + r, g, b, a = [ch*base for ch in r, g, b, a] + if base != 1 and isinstance(base, int): + r, g, b, a = [int(ch) for ch in r, g, b, a] + return r, g, b, a + + def blend(self, clr, t=0.5, colorspace=RGB): + """ Returns a new color between the two colors. + Parameter t is the amount to interpolate between the two colors + (0.0 equals the first color, 0.5 is half-way in between, etc.) + Blending in CIE-LAB colorspace avoids "muddy" colors in the middle of the blend. + """ + ch = zip(self.map(1, colorspace)[:3], clr.map(1, colorspace)[:3]) + r, g, b = [geometry.lerp(a, b, t) for a, b in ch] + a = geometry.lerp(self.a, len(clr)==4 and clr[3] or 1, t) + return Color(r, g, b, a, colorspace=colorspace) + + def rotate(self, angle): + """ Returns a new color with it's hue rotated on the RYB color wheel. + """ + h, s, b = rgb_to_hsb(*self[:3]) + h, s, b = rotate_ryb(h, s, b, angle) + return Color(h, s, b, self.a, colorspace=HSB) + +color = Color + +def background(*args, **kwargs): + """ Sets the current background color. + """ + global _background + if args: + _background = Color(*args, **kwargs) + xywh = (GLint*4)(); glGetIntegerv(GL_VIEWPORT, xywh); x,y,w,h = xywh + rect(x, y, w, h, fill=_background, stroke=None) + return _background + +def fill(*args, **kwargs): + """ Sets the current fill color for drawing primitives and paths. + """ + global _fill + if args: + _fill = Color(*args, **kwargs) + return _fill + +fill(0) # The default fill is black. + +def stroke(*args, **kwargs): + """ Sets the current stroke color. + """ + global _stroke + if args: + _stroke = Color(*args, **kwargs) + return _stroke + +def nofill(): + """ No current fill color. + """ + global _fill + _fill = None + +def nostroke(): + """ No current stroke color. + """ + global _stroke + _stroke = None + +def strokewidth(width=None): + """ Sets the outline stroke width. + """ + # Note: strokewidth is clamped to integers (e.g. 0.2 => 1), + # but finer lines can be achieved visually with a transparent stroke. + # Thicker strokewidth results in ugly (i.e. no) line caps. + global _strokewidth + if width is not None: + _strokewidth = width + glLineWidth(width) + return _strokewidth + +SOLID = "solid" +DOTTED = "dotted" +DASHED = "dashed" + +def strokestyle(style=None): + """ Sets the outline stroke style (SOLID / DOTTED / DASHED). + """ + global _strokestyle + if style is not None and style != _strokestyle: + _strokestyle = style + glLineDash(style) + return _strokestyle + +def glLineDash(style): + if style == SOLID: + glDisable(GL_LINE_STIPPLE) + elif style == DOTTED: + glEnable(GL_LINE_STIPPLE); glLineStipple(0, 0x0101) + elif style == DASHED: + glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0x000F) + +def outputmode(mode=None): + raise NotImplementedError + +def colormode(mode=None, range=1.0): + raise NotImplementedError + +#--- COLOR SPACE ------------------------------------------------------------------------------------- +# Transformations between RGB, HSB, CIE XYZ and CIE LAB color spaces. +# http://www.easyrgb.com/math.php + +def rgb_to_hsb(r, g, b): + """ Converts the given R,G,B values to H,S,B (between 0.0-1.0). + """ + h, s, v = 0, 0, max(r, g, b) + d = v - min(r, g, b) + if v != 0: + s = d / float(v) + if s != 0: + if r == v: h = 0 + (g-b) / d + elif g == v: h = 2 + (b-r) / d + else : h = 4 + (r-g) / d + h = h / 6.0 % 1 + return h, s, v + +def hsb_to_rgb(h, s, v): + """ Converts the given H,S,B color values to R,G,B (between 0.0-1.0). + """ + if s == 0: + return v, v, v + h = h % 1 * 6.0 + i = floor(h) + f = h - i + x = v * (1-s) + y = v * (1-s * f) + z = v * (1-s * (1-f)) + if i > 4: + return v, x, y + return [(v,z,x), (y,v,x), (x,v,z), (x,y,v), (z,x,v)][int(i)] + +def rgb_to_xyz(r, g, b): + """ Converts the given R,G,B values to CIE X,Y,Z (between 0.0-1.0). + """ + r, g, b = [ch > 0.04045 and ((ch+0.055) / 1.055) ** 2.4 or ch / 12.92 for ch in r, g, b] + r, g, b = [ch * 100.0 for ch in r, g, b] + r, g, b = ( # Observer = 2, Illuminant = D65 + r * 0.4124 + g * 0.3576 + b * 0.1805, + r * 0.2126 + g * 0.7152 + b * 0.0722, + r * 0.0193 + g * 0.1192 + b * 0.9505) + return r/95.047, g/100.0, b/108.883 + +def xyz_to_rgb(x, y, z): + """ Converts the given CIE X,Y,Z color values to R,G,B (between 0.0-1.0). + """ + x, y, z = x*95.047, y*100.0, z*108.883 + x, y, z = [ch / 100.0 for ch in x, y, z] + r = x * 3.2406 + y * -1.5372 + z * -0.4986 + g = x * -0.9689 + y * 1.8758 + z * 0.0415 + b = x * -0.0557 + y * -0.2040 + z * 1.0570 + r, g, b = [ch > 0.0031308 and 1.055 * ch**(1/2.4) - 0.055 or ch * 12.92 for ch in r, g, b] + return r, g, b + +def rgb_to_lab(r, g, b): + """ Converts the given R,G,B values to CIE L,A,B (between 0.0-1.0). + """ + x, y, z = rgb_to_xyz(r, g, b) + x, y, z = [ch > 0.008856 and ch**(1/3.0) or (ch*7.787) + (16/116.0) for ch in x, y, z] + l, a, b = y*116-16, 500*(x-y), 200*(y-z) + l, a, b = l/100.0, (a+86)/(86+98), (b+108)/(108+94) + return l, a, b + +def lab_to_rgb(l, a, b): + """ Converts the given CIE L,A,B color values to R,G,B (between 0.0-1.0). + """ + l, a, b = l*100, a*(86+98)-86, b*(108+94)-108 + y = (l+16)/116.0 + x = y + a/500.0 + z = y - b/200.0 + x, y, z = [ch**3 > 0.008856 and ch**3 or (ch-16/116.0)/7.787 for ch in x, y, z] + return xyz_to_rgb(x, y, z) + +def luminance(r, g, b): + """ Returns an indication (0.0-1.0) of how bright the color appears. + """ + return (r*0.2125 + g*0.7154 + b+0.0721) * 0.5 + +def darker(clr, step=0.2): + """ Returns a copy of the color with a darker brightness. + """ + h, s, b = rgb_to_hsb(clr.r, clr.g, clr.b) + r, g, b = hsb_to_rgb(h, s, max(0, b-step)) + return Color(r, g, b, len(clr)==4 and clr[3] or 1) + +def lighter(clr, step=0.2): + """ Returns a copy of the color with a lighter brightness. + """ + h, s, b = rgb_to_hsb(clr.r, clr.g, clr.b) + r, g, b = hsb_to_rgb(h, s, min(1, b+step)) + return Color(r, g, b, len(clr)==4 and clr[3] or 1) + +darken, lighten = darker, lighter + +#--- COLOR ROTATION ---------------------------------------------------------------------------------- + +# Approximation of the RYB color wheel. +# In HSB, colors hues range from 0 to 360, +# but on the color wheel these values are not evenly distributed. +# The second tuple value contains the actual value on the wheel (angle). +_colorwheel = [ + ( 0, 0), ( 15, 8), ( 30, 17), ( 45, 26), + ( 60, 34), ( 75, 41), ( 90, 48), (105, 54), + (120, 60), (135, 81), (150, 103), (165, 123), + (180, 138), (195, 155), (210, 171), (225, 187), + (240, 204), (255, 219), (270, 234), (285, 251), + (300, 267), (315, 282), (330, 298), (345, 329), (360, 360) +] + +def rotate_ryb(h, s, b, angle=180): + """ Rotates the given H,S,B color (0.0-1.0) on the RYB color wheel. + The RYB colorwheel is not mathematically precise, + but focuses on aesthetically pleasing complementary colors. + """ + h = h*360 % 360 + # Find the location (angle) of the hue on the RYB color wheel. + for i in range(len(_colorwheel)-1): + (x0, y0), (x1, y1) = _colorwheel[i], _colorwheel[i+1] + if y0 <= h <= y1: + a = geometry.lerp(x0, x1, t=(h-y0)/(y1-y0)) + break + # Rotate the angle and retrieve the hue. + a = (a+angle) % 360 + for i in range(len(_colorwheel)-1): + (x0, y0), (x1, y1) = _colorwheel[i], _colorwheel[i+1] + if x0 <= a <= x1: + h = geometry.lerp(y0, y1, t=(a-x0)/(x1-x0)) + break + return h/360.0, s, b + +def complement(clr): + """ Returns the color opposite on the color wheel. + The complementary color contrasts with the given color. + """ + if not isinstance(clr, Color): + clr = Color(clr) + return clr.rotate(180) + +def analog(clr, angle=20, d=0.1): + """ Returns a random adjacent color on the color wheel. + Analogous color schemes can often be found in nature. + """ + h, s, b = rgb_to_hsb(*clr[:3]) + h, s, b = rotate_ryb(h, s, b, angle=random(-angle,angle)) + s *= 1 - random(-d,d) + b *= 1 - random(-d,d) + return Color(h, s, b, len(clr)==4 and clr[3] or 1, colorspace=HSB) + +#--- COLOR MIXIN ------------------------------------------------------------------------------------- +# Drawing commands like rect() have optional parameters fill and stroke to set the color directly. + +def color_mixin(**kwargs): + fill = kwargs.get("fill", _fill) + stroke = kwargs.get("stroke", _stroke) + strokewidth = kwargs.get("strokewidth", _strokewidth) + strokestyle = kwargs.get("strokestyle", _strokestyle) + return (fill, stroke, strokewidth, strokestyle) + +#--- COLOR PLANE ------------------------------------------------------------------------------------- +# Not part of the standard API but too convenient to leave out. + +def colorplane(x, y, width, height, *a): + """ Draws a rectangle that emits a different fill color from each corner. + An optional number of colors can be given: + - four colors define top left, top right, bottom right and bottom left, + - three colors define top left, top right and bottom, + - two colors define top and bottom, + - no colors assumes black top and white bottom gradient. + """ + if len(a) == 2: + # Top and bottom colors. + clr1, clr2, clr3, clr4 = a[0], a[0], a[1], a[1] + elif len(a) == 4: + # Top left, top right, bottom right, bottom left. + clr1, clr2, clr3, clr4 = a[0], a[1], a[2], a[3] + elif len(a) == 3: + # Top left, top right, bottom. + clr1, clr2, clr3, clr4 = a[0], a[1], a[2], a[2] + elif len(a) == 0: + # Black top, white bottom. + clr1 = clr2 = (0,0,0,1) + clr3 = clr4 = (1,1,1,1) + glPushMatrix() + glTranslatef(x, y, 0) + glScalef(width, height, 1) + glBegin(GL_QUADS) + glColor4f(clr1[0], clr1[1], clr1[2], clr1[3] * _alpha); glVertex2f(-0.0, 1.0) + glColor4f(clr2[0], clr2[1], clr2[2], clr2[3] * _alpha); glVertex2f( 1.0, 1.0) + glColor4f(clr3[0], clr3[1], clr3[2], clr3[3] * _alpha); glVertex2f( 1.0, -0.0) + glColor4f(clr4[0], clr4[1], clr4[2], clr4[3] * _alpha); glVertex2f(-0.0, -0.0) + glEnd() + glPopMatrix() + +#===================================================================================================== + +#--- TRANSFORMATIONS --------------------------------------------------------------------------------- +# Unlike NodeBox, all transformations are CORNER-mode and originate from the bottom-left corner. + +# Example: using Transform to get a transformed path. +# t = Transform() +# t.rotate(45) +# p = BezierPath() +# p.rect(10,10,100,70) +# p = t.transform_path(p) +# p.contains(x,y) # now we can check if the mouse is in the transformed shape. +Transform = geometry.AffineTransform + +def push(): + """ Pushes the transformation state. + Subsequent transformations (translate, rotate, scale) remain in effect until pop() is called. + """ + glPushMatrix() + +def pop(): + """ Pops the transformation state. + This reverts the transformation to before the last push(). + """ + glPopMatrix() + +def translate(x, y, z=0): + """ By default, the origin of the layer or canvas is at the bottom left. + This origin point will be moved by (x,y) pixels. + """ + glTranslatef(round(x), round(y), round(z)) + +def rotate(degrees, axis=(0,0,1)): + """ Rotates the transformation state, i.e. all subsequent drawing primitives are rotated. + Rotations work incrementally: + calling rotate(60) and rotate(30) sets the current rotation to 90. + """ + glRotatef(degrees, *axis) + +def scale(x, y=None, z=None): + """ Scales the transformation state. + """ + if y is None: + y = x + if z is None: + z = 1 + glScalef(x, y, z) + +def reset(): + """ Resets the transform state of the layer or canvas. + """ + glLoadIdentity() + +CORNER = "corner" +CENTER = "center" +def transform(mode=None): + if mode == CENTER: + raise NotImplementedError, "no center-mode transform" + return CORNER + +def skew(x, y): + raise NotImplementedError + +#===================================================================================================== + +#--- DRAWING PRIMITIVES ------------------------------------------------------------------------------ +# Drawing primitives: Point, line, rect, ellipse, arrow. star. +# The fill and stroke are two different shapes put on top of each other. + +Point = geometry.Point + +def line(x0, y0, x1, y1, **kwargs): + """ Draws a straight line from x0, y0 to x1, y1 with the current stroke color and strokewidth. + """ + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + if stroke is not None and strokewidth > 0: + glColor4f(stroke[0], stroke[1], stroke[2], stroke[3] * _alpha) + glLineWidth(strokewidth) + if strokestyle != _strokestyle: + glLineDash(strokestyle) + glBegin(GL_LINES) + glVertex2f(x0, y0) + glVertex2f(x1, y1) + glEnd() + +def rect(x, y, width, height, **kwargs): + """ Draws a rectangle with the bottom left corner at x, y. + The current stroke, strokewidth and fill color are applied. + """ + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + if fill is not None: + glColor4f(fill[0], fill[1], fill[2], fill[3] * _alpha) + glRectf(x, y, x+width, y+height) + + if stroke is not None and strokewidth > 0: + glLineWidth(strokewidth) + glLineDash(strokestyle) + glColor4f(stroke[0], stroke[1], stroke[2], stroke[3] * _alpha) + # Note: this performs equally well as when using precompile(). + glBegin(GL_LINE_LOOP) + glVertex2f(x, y) + glVertex2f(x+width, y) + glVertex2f(x+width, y+height) + glVertex2f(x, y+height) + glEnd() + +def triangle(x1, y1, x2, y2, x3, y3, **kwargs): + """ Draws the triangle created by connecting the three given points. + The current stroke, strokewidth and fill color are applied. + """ + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + for i, clr in enumerate((fill, stroke)): + if clr is not None and (i==0 or strokewidth > 0): + if i == 1: + glLineWidth(strokewidth) + if strokestyle != _strokestyle: + glLineDash(strokestyle) + glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) + # Note: this performs equally well as when using precompile(). + glBegin((GL_TRIANGLES, GL_LINE_LOOP)[i]) + glVertex2f(x1, y1) + glVertex2f(x2, y2) + glVertex2f(x3, y3) + glEnd() + +_ellipses = {} +ELLIPSE_SEGMENTS = 50 +def ellipse(x, y, width, height, segments=ELLIPSE_SEGMENTS, **kwargs): + """ Draws an ellipse with the center located at x, y. + The current stroke, strokewidth and fill color are applied. + """ + if not segments in _ellipses: + # For the given amount of line segments, calculate the ellipse once. + # Then reuse the cached ellipse by scaling it to the desired size. + commands = [] + f = 2 * pi / segments + v = [(cos(t)/2, sin(t)/2) for t in [i*f for i in list(range(segments))+[0]]] + for mode in (GL_TRIANGLE_FAN, GL_LINE_LOOP): + commands.append(precompile(lambda:( + glBegin(mode), + [glVertex2f(x, y) for (x, y) in v], + glEnd() + ))) + + _ellipses[segments] = commands + + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + for i, clr in enumerate((fill, stroke)): + if clr is not None and (i==0 or strokewidth > 0): + if i == 1: + glLineWidth(strokewidth) + if strokestyle != _strokestyle: + glLineDash(strokestyle) + glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) + glPushMatrix() + glTranslatef(x, y, 0) + glScalef(width, height, 1) + glCallList(_ellipses[segments][i]) + glPopMatrix() + +oval = ellipse # Backwards compatibility. + +def arrow(x, y, width, **kwargs): + """ Draws an arrow with its tip located at x, y. + The current stroke, strokewidth and fill color are applied. + """ + head = width * 0.4 + tail = width * 0.2 + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + for i, clr in enumerate((fill, stroke)): + if clr is not None and (i==0 or strokewidth > 0): + if i == 1: + glLineWidth(strokewidth) + glLineDash(strokestyle) + glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) + # Note: this performs equally well as when using precompile(). + glBegin((GL_POLYGON, GL_LINE_LOOP)[i]) + glVertex2f(x, y) + glVertex2f(x-head, y+head) + glVertex2f(x-head, y+tail) + glVertex2f(x-width, y+tail) + glVertex2f(x-width, y-tail) + glVertex2f(x-head, y-tail) + glVertex2f(x-head, y-head) + glVertex2f(x, y) + glEnd() + +def gcd(a, b): + return gcd(b, a % b) if b else a + +_stars = {} #TODO: LRU? +def fast_star(x, y, points=20, outer=100, inner=50, **kwargs): + """ Draws a star with the given points, outer radius and inner radius. + The current stroke, strokewidth and fill color are applied. + """ + scale = gcd(inner, outer) + iscale = inner / scale + oscale = outer / scale + cached = _stars.get((points, iscale, oscale), []) + if not cached: + radii = [oscale, iscale] * int(points+1); radii.pop() # which radius? + f = pi / points + v = [(r*sin(i*f), r*cos(i*f)) for i, r in enumerate(radii)] + cached.append(precompile(lambda:( + glBegin(GL_TRIANGLE_FAN), + glVertex2f(0, 0), + [glVertex2f(vx, vy) for (vx, vy) in v], + glEnd() + ))) + cached.append(precompile(lambda:( + glBegin(GL_LINE_LOOP), + [glVertex2f(vx, vy) for (vx, vy) in v], + glEnd() + ))) + _stars[(points, iscale, oscale)] = cached + + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + for i, clr in enumerate((fill, stroke)): + if clr is not None and (i == 0 or strokewidth > 0): + if i == 1: + glLineWidth(strokewidth) + if strokestyle != _strokestyle: + glLineDash(strokestyle) + glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) + glPushMatrix() + glTranslatef(x, y, 0) + glScalef(scale, scale, 1) + glCallList(cached[i]) + glPopMatrix() + +def star(x, y, points=20, outer=100, inner=50, **kwargs): + """ Draws a star with the given points, outer radius and inner radius. + The current stroke, strokewidth and fill color are applied. + This is about 20x slower than fast_star; use it only if you need the path returned. + """ + p = BezierPath(**kwargs) + p.moveto(x, y+outer) + for i in range(0, int(2*points)+1): + r = (outer, inner)[i%2] + a = pi*i/points + p.lineto(x+r*sin(a), y+r*cos(a)) + p.closepath() + + if kwargs.get("draw", True): + p.draw(**kwargs) + return p + +#===================================================================================================== + +#--- BEZIER PATH ------------------------------------------------------------------------------------- +# A BezierPath class with lineto(), curveto() and moveto() commands. +# It has all the path math functionality from NodeBox and a ray casting algorithm for contains(). +# A number of caching mechanisms are used for performance: +# drawn vertices, segment lengths, path bounds, and a hit test area for BezierPath.contains(). +# For optimal performance, the path should be created once (not every frame) and left unmodified. +# When points in the path are added, removed or modified, a _dirty flag is set. +# When dirty, the cache will be cleared and the new path recalculated. +# If the path is being drawn with a fill color, this means doing tessellation +# (i.e. additional math for finding out if parts overlap and punch a hole in the shape). + +MOVETO = "moveto" +LINETO = "lineto" +CURVETO = "curveto" +CLOSE = "close" + +RELATIVE = "relative" # Number of straight lines to represent a curve = 20% of curve length. +RELATIVE_PRECISION = 0.2 + +class PathError(Exception): + pass +class NoCurrentPointForPath(Exception): + pass +class NoCurrentPath(Exception): + pass + +class PathPoint(Point): + + def __init__(self, x=0, y=0): + """ A control handle for PathElement. + """ + self._x = x + self._y = y + self._dirty = False + + def _get_x(self): return self._x + def _set_x(self, v): + self._x = v + self._dirty = True + + def _get_y(self): return self._y + def _set_y(self, v): + self._y = v + self._dirty = True + + x = property(_get_x, _set_x) + y = property(_get_y, _set_y) + + def copy(self, parent=None): + return PathPoint(self._x, self._y) + +class PathElement(object): + + def __init__(self, cmd=None, pts=None): + """ A point in the path, optionally with control handles: + - MOVETO : the list of points contains a single (x,y)-tuple. + - LINETO : the list of points contains a single (x,y)-tuple. + - CURVETO : the list of points contains (vx1,vy1), (vx2,vy2), (x,y) tuples. + - CLOSETO : no points. + """ + if cmd == MOVETO \ + or cmd == LINETO: + pt, h1, h2 = pts[0], pts[0], pts[0] + elif cmd == CURVETO: + pt, h1, h2 = pts[2], pts[0], pts[1] + else: + pt, h1, h2 = (0,0), (0,0), (0,0) + self._cmd = cmd + self._x = pt[0] + self._y = pt[1] + self._ctrl1 = PathPoint(h1[0], h1[1]) + self._ctrl2 = PathPoint(h2[0], h2[1]) + self.__dirty = False + + def _get_dirty(self): + return self.__dirty \ + or self.ctrl1._dirty \ + or self.ctrl2._dirty + + def _set_dirty(self, b): + self.__dirty = b + self.ctrl1._dirty = b + self.ctrl2._dirty = b + + _dirty = property(_get_dirty, _set_dirty) + + @property + def cmd(self): + return self._cmd + + def _get_x(self): return self._x + def _set_x(self, v): + self._x = v + self.__dirty = True + + def _get_y(self): return self._y + def _set_y(self, v): + self._y = v + self.__dirty = True + + x = property(_get_x, _set_x) + y = property(_get_y, _set_y) + + def _get_xy(self): + return (self.x, self.y) + def _set_xy(self, (x,y)): + self.x = x + self.y = y + + xy = property(_get_xy, _set_xy) + + # Handle 1 describes now the curve from the previous point started. + def _get_ctrl1(self): return self._ctrl1 + def _set_ctrl1(self, v): + self._ctrl1 = PathPoint(v.x, v.y) + self.__dirty = True + + # Handle 2 describes how the curve from the previous point arrives in this point. + def _get_ctrl2(self): return self._ctrl2 + def _set_ctrl2(self, v): + self._ctrl2 = PathPoint(v.x, v.y) + self.__dirty = True + + ctrl1 = property(_get_ctrl1, _set_ctrl1) + ctrl2 = property(_get_ctrl2, _set_ctrl2) + + def __eq__(self, pt): + if not isinstance(pt, PathElement): return False + return self.cmd == pt.cmd \ + and self.x == pt.x \ + and self.y == pt.y \ + and self.ctrl1 == pt.ctrl1 \ + and self.ctrl2 == pt.ctrl2 + + def __ne__(self, pt): + return not self.__eq__(pt) + + def __repr__(self): + return "%s(cmd='%s', x=%.1f, y=%.1f, ctrl1=(%.1f, %.1f), ctrl2=(%.1f, %.1f))" % ( + self.__class__.__name__, self.cmd, self.x, self.y, + self.ctrl1.x, self.ctrl1.y, + self.ctrl2.x, self.ctrl2.y) + + def copy(self): + if self.cmd == MOVETO \ + or self.cmd == LINETO: + pts = ((self.x, self.y),) + elif self.cmd == CURVETO: + pts = ((self.ctrl1.x, self.ctrl1.y), (self.ctrl2.x, self.ctrl2.y), (self.x, self.y)) + else: + pts = None + return PathElement(self.cmd, pts) + +class BezierPath(list): + + def __init__(self, path=None, **kwargs): + """ A list of PathElements describing the curves and lines that make up the path. + """ + if isinstance(path, (BezierPath, list, tuple)): + self.extend([pt.copy() for pt in path]) + self._kwargs = kwargs + self._cache = None # Cached vertices for drawing. + self._segments = None # Cached segment lengths. + self._bounds = None # Cached bounding rectangle. + self._polygon = None # Cached polygon hit test area. + self._dirty = False + self._index = {} + + def copy(self): + return BezierPath(self, **self._kwargs) + + def append(self, pt): + self._dirty = True; list.append(self, pt) + def extend(self, points): + self._dirty = True; list.extend(self, points) + def insert(self, i, pt): + self._dirty = True; self._index={}; list.insert(self, i, pt) + def remove(self, pt): + self._dirty = True; self._index={}; list.remove(self, pt) + def pop(self, i): + self._dirty = True; self._index={}; list.pop(self, i) + def __setitem__(self, i, pt): + self._dirty = True; self._index={}; list.__setitem__(self, i, pt) + def __delitem__(self, i): + self._dirty = True; self._index={}; list.__delitem__(self, i) + def sort(self): + self._dirty = True; self._index={}; list.sort(self) + def reverse(self): + self._dirty = True; self._index={}; list.reverse(self) + def index(self, pt): + return self._index.setdefault(pt, list.index(self, pt)) + + def _update(self): + # Called from BezierPath.draw(). + # If points were added or removed, clear the cache. + b = self._dirty + for pt in self: b = b or pt._dirty; pt._dirty = False + if b: + if self._cache is not None: + if self._cache[0]: flush(self._cache[0]) + if self._cache[1]: flush(self._cache[1]) + self._cache = self._segments = self._bounds = self._polygon = None + self._dirty = False + + def moveto(self, x, y): + """ Adds a new point to the path at x, y. + """ + self.append(PathElement(MOVETO, ((x, y),))) + + def lineto(self, x, y): + """ Adds a line from the previous point to x, y. + """ + self.append(PathElement(LINETO, ((x, y),))) + + def curveto(self, x1, y1, x2, y2, x3, y3): + """ Adds a Bezier-curve from the previous point to x3, y3. + The curvature is determined by control handles x1, y1 and x2, y2. + """ + self.append(PathElement(CURVETO, ((x1, y1), (x2, y2), (x3, y3)))) + + def arcto(self, x, y, radius=1, clockwise=True, short=False): + """ Adds a number of Bezier-curves that draw an arc with the given radius to (x,y). + The short parameter selects either the "long way" around or the "shortcut". + """ + x0, y0 = self[-1].x, self[-1].y + phi = geometry.angle(x0,y0,x,y) + for p in bezier.arcto(x0, y0, radius, radius, phi, short, not clockwise, x, y): + f = len(p) == 2 and self.lineto or self.curveto + f(*p) + + def closepath(self): + """ Adds a line from the previous point to the last MOVETO. + """ + self.append(PathElement(CLOSE)) + + def rect(self, x, y, width, height, roundness=0.0): + """ Adds a (rounded) rectangle to the path. + Corner roundness can be given as a relative float or absolute int. + """ + if roundness <= 0: + self.moveto(x, y) + self.lineto(x+width, y) + self.lineto(x+width, y+height) + self.lineto(x, y+height) + self.lineto(x, y) + else: + if isinstance(roundness, int): + r = min(roundness, width/2, height/2) + else: + r = min(width, height) + r = min(roundness, 1) * r * 0.5 + self.moveto(x+r, y) + self.lineto(x+width-r, y) + self.arcto(x+width, y+r, radius=r, clockwise=False) + self.lineto(x+width, y+height-r) + self.arcto(x+width-r, y+height, radius=r, clockwise=False) + self.lineto(x+r, y+height) + self.arcto(x, y+height-r, radius=r, clockwise=False) + self.lineto(x, y+r) + self.arcto(x+r, y, radius=r, clockwise=False) + + def ellipse(self, x, y, width, height): + """ Adds an ellipse to the path. + """ + w, h = width*0.5, height*0.5 + k = 0.5522847498 # kappa: (-1 + sqrt(2)) / 3 * 4 + self.moveto(x, y-h) # http://www.whizkidtech.redprince.net/bezier/circle/ + self.curveto(x+w*k, y-h, x+w, y-h*k, x+w, y, ) + self.curveto(x+w, y+h*k, x+w*k, y+h, x, y+h) + self.curveto(x-w*k, y+h, x-w, y+h*k, x-w, y, ) + self.curveto(x-w, y-h*k, x-w*k, y-h, x, y-h) + self.closepath() + + oval = ellipse + + def arc(self, x, y, width, height, start=0, stop=90): + """ Adds an arc to the path. + The arc follows the ellipse defined by (x, y, width, height), + with start and stop specifying what angle range to draw. + """ + w, h = width*0.5, height*0.5 + for i, p in enumerate(bezier.arc(x-w, y-h, x+w, y+h, start, stop)): + if i == 0: + self.moveto(*p[:2]) + self.curveto(*p[2:]) + + def smooth(self, *args, **kwargs): + """ Smooths the path by making the curve handles colinear. + With mode=EQUIDISTANT, the curve handles will be of equal (average) length. + """ + e = BezierEditor(self) + for i, pt in enumerate(self): + self._index[pt] = i + e.smooth(pt, *args, **kwargs) + + def flatten(self, precision=RELATIVE): + """ Returns a list of contours, in which each contour is a list of (x,y)-tuples. + The precision determines the number of straight lines to use as a substition for a curve. + It can be a fixed number (int) or relative to the curve length (float or RELATIVE). + """ + if precision == RELATIVE: + precision = RELATIVE_PRECISION + contours = [[]] + x0, y0 = None, None + closeto = None + for pt in self: + if (pt.cmd == LINETO or pt.cmd == CURVETO) and x0 == y0 is None: + raise NoCurrentPointForPath + elif pt.cmd == LINETO: + contours[-1].append((x0, y0)) + contours[-1].append((pt.x, pt.y)) + elif pt.cmd == CURVETO: + # Curves are interpolated from a number of straight line segments. + # With relative precision, we use the (rough) curve length to determine the number of lines. + x1, y1, x2, y2, x3, y3 = pt.ctrl1.x, pt.ctrl1.y, pt.ctrl2.x, pt.ctrl2.y, pt.x, pt.y + if isinstance(precision, float): + n = int(max(0, precision) * bezier.curvelength(x0, y0, x1, y1, x2, y2, x3, y3, 3)) + else: + n = int(max(0, precision)) + if n > 0: + xi, yi = x0, y0 + for i in range(n+1): + xj, yj, vx1, vy1, vx2, vy2 = bezier.curvepoint(float(i)/n, x0, y0, x1, y1, x2, y2, x3, y3) + contours[-1].append((xi, yi)) + contours[-1].append((xj, yj)) + xi, yi = xj, yj + elif pt.cmd == MOVETO: + contours.append([]) # Start a new contour. + closeto = pt + elif pt.cmd == CLOSE and closeto is not None: + contours[-1].append((x0, y0)) + contours[-1].append((closeto.x, closeto.y)) + x0, y0 = pt.x, pt.y + return contours + + def draw(self, precision=RELATIVE, **kwargs): + """ Draws the path. + The precision determines the number of straight lines to use as a substition for a curve. + It can be a fixed number (int) or relative to the curve length (float or RELATIVE). + """ + if len(kwargs) > 0: + # Optional parameters in draw() overrule those set during initialization. + kw = dict(self._kwargs) + kw.update(kwargs) + fill, stroke, strokewidth, strokestyle = color_mixin(**kw) + else: + fill, stroke, strokewidth, strokestyle = color_mixin(**self._kwargs) + def _draw_fill(contours): + # Drawing commands for the path fill (as triangles by tessellating the contours). + v = geometry.tesselate(contours) + glBegin(GL_TRIANGLES) + for x, y in v: + glVertex3f(x, y, 0) + glEnd() + def _draw_stroke(contours): + # Drawing commands for the path stroke. + for path in contours: + glBegin(GL_LINE_STRIP) + for x, y in path: + glVertex2f(x, y) + glEnd() + self._update() # Remove the cache if points were modified. + if self._cache is None \ + or self._cache[0] is None and fill \ + or self._cache[1] is None and stroke \ + or self._cache[-1] != precision: + # Calculate and cache the vertices as Display Lists. + # If the path requires a fill color, it will have to be tessellated. + if self._cache is not None: + if self._cache[0]: flush(self._cache[0]) + if self._cache[1]: flush(self._cache[1]) + contours = self.flatten(precision) + self._cache = [None, None, precision] + if fill : self._cache[0] = precompile(_draw_fill, contours) + if stroke : self._cache[1] = precompile(_draw_stroke, contours) + if fill is not None: + glColor4f(fill[0], fill[1], fill[2], fill[3] * _alpha) + glCallList(self._cache[0]) + if stroke is not None and strokewidth > 0: + glColor4f(stroke[0], stroke[1], stroke[2], stroke[3] * _alpha) + glLineWidth(strokewidth) + glLineDash(strokestyle) + glCallList(self._cache[1]) + + def angle(self, t): + """ Returns the directional angle at time t (0.0-1.0) on the path. + """ + # The directed() enumerator is much faster but less precise. + pt0, pt1 = t==0 and (self.point(t), self.point(t+0.001)) or (self.point(t-0.001), self.point(t)) + return geometry.angle(pt0.x, pt0.y, pt1.x, pt1.y) + + def point(self, t): + """ Returns the PathElement at time t (0.0-1.0) on the path. + See the linear interpolation math in bezier.py. + """ + if self._segments is None: + self._segments = bezier.length(self, segmented=True, n=10) + return bezier.point(self, t, segments=self._segments) + + def points(self, amount=2, start=0.0, end=1.0): + """ Returns a list of PathElements along the path. + To omit the last point on closed paths: end=1-1.0/amount + """ + if self._segments is None: + self._segments = bezier.length(self, segmented=True, n=10) + return bezier.points(self, amount, start, end, segments=self._segments) + + def addpoint(self, t): + """ Inserts a new PathElement at time t (0.0-1.0) on the path. + """ + self._segments = None + self._index = {} + return bezier.insert_point(self, t) + + split = addpoint + + @property + def length(self, precision=10): + """ Returns an approximation of the total length of the path. + """ + return bezier.length(self, segmented=False, n=precision) + + @property + def contours(self): + """ Returns a list of contours (i.e. segments separated by a MOVETO) in the path. + Each contour is a BezierPath object. + """ + return bezier.contours(self) + + @property + def bounds(self, precision=100): + """ Returns a (x, y, width, height)-tuple of the approximate path dimensions. + """ + # In _update(), traverse all the points and check if they have changed. + # If so, the bounds must be recalculated. + self._update() + if self._bounds is None: + l = t = float( "inf") + r = b = float("-inf") + for pt in self.points(precision): + if pt.x < l: l = pt.x + if pt.y < t: t = pt.y + if pt.x > r: r = pt.x + if pt.y > b: b = pt.y + self._bounds = (l, t, r-l, b-t) + return self._bounds + + def contains(self, x, y, precision=100): + """ Returns True when point (x,y) falls within the contours of the path. + """ + bx, by, bw, bh = self.bounds + if bx <= x <= bx+bw and \ + by <= y <= by+bh: + if self._polygon is None \ + or self._polygon[1] != precision: + self._polygon = [(pt.x,pt.y) for pt in self.points(precision)], precision + # Ray casting algorithm: + return geometry.point_in_polygon(self._polygon[0], x, y) + return False + + def hash(self, state=None, decimal=1): + """ Returns the path id, based on the position and handles of its PathElements. + Two distinct BezierPath objects that draw the same path therefore have the same id. + """ + f = lambda x: int(x*10**decimal) # Format floats as strings with given decimal precision. + id = [state] + for pt in self: id.extend(( + pt.cmd, f(pt.x), f(pt.y), f(pt.ctrl1.x), f(pt.ctrl1.y), f(pt.ctrl2.x), f(pt.ctrl2.y))) + id = str(id) + id = md5(id).hexdigest() + return id + + def __repr__(self): + return "BezierPath(%s)" % repr(list(self)) + + def __del__(self): + # Note: it is important that __del__() is called since it unloads the cache from GPU. + # BezierPath and PathElement should contain no circular references, e.g. no PathElement.parent. + if hasattr(self, "_cache") and self._cache is not None and flush: + if self._cache[0]: flush(self._cache[0]) + if self._cache[1]: flush(self._cache[1]) + +def drawpath(path, **kwargs): + """ Draws the given BezierPath (or list of PathElements). + The current stroke, strokewidth and fill color are applied. + """ + if not isinstance(path, BezierPath): + path = BezierPath(path) + path.draw(**kwargs) + +_autoclosepath = True +def autoclosepath(close=False): + """ Paths constructed with beginpath() and endpath() are automatically closed. + """ + global _autoclosepath + _autoclosepath = close + +_path = None +def beginpath(x, y): + """ Starts a new path at (x,y). + The commands moveto(), lineto(), curveto() and closepath() + can then be used between beginpath() and endpath() calls. + """ + global _path + _path = BezierPath() + _path.moveto(x, y) + +def moveto(x, y): + """ Moves the current point in the current path to (x,y). + """ + if _path is None: + raise NoCurrentPath + _path.moveto(x, y) + +def lineto(x, y): + """ Draws a line from the current point in the current path to (x,y). + """ + if _path is None: + raise NoCurrentPath + _path.lineto(x, y) + +def curveto(x1, y1, x2, y2, x3, y3): + """ Draws a curve from the current point in the current path to (x3,y3). + The curvature is determined by control handles x1, y1 and x2, y2. + """ + if _path is None: + raise NoCurrentPath + _path.curveto(x1, y1, x2, y2, x3, y3) + +def closepath(): + """ Closes the current path with a straight line to the last MOVETO. + """ + if _path is None: + raise NoCurrentPath + _path.closepath() + +def endpath(draw=True, **kwargs): + """ Draws and returns the current path. + With draw=False, only returns the path so it can be manipulated and drawn with drawpath(). + """ + global _path, _autoclosepath + if _path is None: + raise NoCurrentPath + if _autoclosepath is True: + _path.closepath() + if draw: + _path.draw(**kwargs) + p, _path = _path, None + return p + +def findpath(points, curvature=1.0): + """ Returns a smooth BezierPath from the given list of (x,y)-tuples. + """ + return bezier.findpath(list(points), curvature) + +Path = BezierPath + +#--- BEZIER EDITOR ----------------------------------------------------------------------------------- + +EQUIDISTANT = "equidistant" +IN, OUT, BOTH = "in", "out", "both" # Drag pt1.ctrl2, pt2.ctrl1 or both simultaneously? + +class BezierEditor: + + def __init__(self, path): + self.path = path + + def _nextpoint(self, pt): + i = self.path.index(pt) # BezierPath caches this operation. + return i < len(self.path)-1 and self.path[i+1] or None + + def translate(self, pt, x=0, y=0, h1=(0,0), h2=(0,0)): + """ Translates the point and its control handles by (x,y). + Translates the incoming handle by h1 and the outgoing handle by h2. + """ + pt1, pt2 = pt, self._nextpoint(pt) + pt1.x += x + pt1.y += y + pt1.ctrl2.x += x + h1[0] + pt1.ctrl2.y += y + h1[1] + if pt2 is not None: + pt2.ctrl1.x += x + (pt2.cmd == CURVETO and h2[0] or 0) + pt2.ctrl1.y += y + (pt2.cmd == CURVETO and h2[1] or 0) + + def rotate(self, pt, angle, handle=BOTH): + """ Rotates the point control handles by the given angle. + """ + pt1, pt2 = pt, self._nextpoint(pt) + if handle == BOTH or handle == IN: + pt1.ctrl2.x, pt1.ctrl2.y = geometry.rotate(pt1.ctrl2.x, pt1.ctrl2.y, pt1.x, pt1.y, angle) + if handle == BOTH or handle == OUT and pt2 is not None and pt2.cmd == CURVETO: + pt2.ctrl1.x, pt2.ctrl1.y = geometry.rotate(pt2.ctrl1.x, pt2.ctrl1.y, pt1.x, pt1.y, angle) + + def scale(self, pt, v, handle=BOTH): + """ Scales the point control handles by the given factor. + """ + pt1, pt2 = pt, self._nextpoint(pt) + if handle == BOTH or handle == IN: + pt1.ctrl2.x, pt1.ctrl2.y = bezier.linepoint(v, pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) + if handle == BOTH or handle == OUT and pt2 is not None and pt2.cmd == CURVETO: + pt2.ctrl1.x, pt2.ctrl1.y = bezier.linepoint(v, pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y) + + def smooth(self, pt, mode=None, handle=BOTH): + pt1, pt2, i = pt, self._nextpoint(pt), self.path.index(pt) + if pt2 is None: + return + if pt1.cmd == pt2.cmd == CURVETO: + if mode == EQUIDISTANT: + d1 = d2 = 0.5 * ( + geometry.distance(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) + \ + geometry.distance(pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y)) + else: + d1 = geometry.distance(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) + d2 = geometry.distance(pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y) + if handle == IN: + a = geometry.angle(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) + if handle == OUT: + a = geometry.angle(pt2.ctrl1.x, pt2.ctrl1.y, pt1.x, pt1.y) + if handle == BOTH: + a = geometry.angle(pt2.ctrl1.x, pt2.ctrl1.y, pt1.ctrl2.x, pt1.ctrl2.y) + pt1.ctrl2.x, pt1.ctrl2.y = geometry.coordinates(pt1.x, pt1.y, d1, a) + pt2.ctrl1.x, pt2.ctrl1.y = geometry.coordinates(pt1.x, pt1.y, d2, a-180) + elif pt1.cmd == CURVETO and pt2.cmd == LINETO: + d = mode == EQUIDISTANT and \ + geometry.distance(pt1.x, pt1.y, pt2.x, pt2.y) or \ + geometry.distance(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) + a = geometry.angle(pt1.x, pt1.y, pt2.x, pt2.y) + pt1.ctrl2.x, pt1.ctrl2.y = geometry.coordinates(pt1.x, pt1.y, d, a-180) + elif pt1.cmd == LINETO and pt2.cmd == CURVETO and i > 0: + d = mode == EQUIDISTANT and \ + geometry.distance(pt1.x, pt1.y, self.path[i-1].x, self.path[i-1].y) or \ + geometry.distance(pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y) + a = geometry.angle(self.path[i-1].x, self.path[i-1].y, pt1.x, pt1.y) + pt2.ctrl1.x, pt2.ctrl1.y = geometry.coordinates(pt1.x, pt1.y, d, a) + +#--- POINT ANGLES ------------------------------------------------------------------------------------ + +def directed(points): + """ Returns an iterator that yields (angle, point)-tuples for the given list of points. + The angle represents the direction of the point on the path. + This works with BezierPath, Bezierpath.points, [pt1, pt2, pt2, ...] + For example: + for a, pt in directed(path.points(30)): + push() + translate(pt.x, pt.y) + rotate(a) + arrow(0, 0, 10) + pop() + This is useful if you want to have shapes following a path. + To put text on a path, rotate the angle by +-90 to get the normal (i.e. perpendicular). + """ + p = list(points) + n = len(p) + for i, pt in enumerate(p): + if 0 < i < n-1 and pt.__dict__.get("_cmd") == CURVETO: + # For a point on a curve, the control handle gives the best direction. + # For PathElement (fixed point in BezierPath), ctrl2 tells us how the curve arrives. + # For DynamicPathElement (returnd from BezierPath.point()), ctrl1 tell how the curve arrives. + ctrl = isinstance(pt, bezier.DynamicPathElement) and pt.ctrl1 or pt.ctrl2 + angle = geometry.angle(ctrl.x, ctrl.y, pt.x, pt.y) + elif 0 < i < n-1 and pt.__dict__.get("_cmd") == LINETO and p[i-1].__dict__.get("_cmd") == CURVETO: + # For a point on a line preceded by a curve, look ahead gives better results. + angle = geometry.angle(pt.x, pt.y, p[i+1].x, p[i+1].y) + elif i == 0 and isinstance(points, BezierPath): + # For the first point in a BezierPath, we can calculate a next point very close by. + pt1 = points.point(0.001) + angle = geometry.angle(pt.x, pt.y, pt1.x, pt1.y) + elif i == n-1 and isinstance(points, BezierPath): + # For the last point in a BezierPath, we can calculate a previous point very close by. + pt0 = points.point(0.999) + angle = geometry.angle(pt0.x, pt0.y, pt.x, pt.y) + elif i == n-1 and isinstance(pt, bezier.DynamicPathElement) and pt.ctrl1.x != pt.x or pt.ctrl1.y != pt.y: + # For the last point in BezierPath.points(), use incoming handle (ctrl1) for curves. + angle = geometry.angle(pt.ctrl1.x, pt.ctrl1.y, pt.x, pt.y) + elif 0 < i: + # For any point, look back gives a good result, if enough points are given. + angle = geometry.angle(p[i-1].x, p[i-1].y, pt.x, pt.y) + elif i < n-1: + # For the first point, the best (only) guess is the location of the next point. + angle = geometry.angle(pt.x, pt.y, p[i+1].x, p[i+1].y) + else: + angle = 0 + yield angle, pt + +#--- CLIPPING PATH ----------------------------------------------------------------------------------- + +class ClippingMask: + def draw(self, fill=(0,0,0,1), stroke=None): + pass + +def beginclip(path): + """ Enables the given BezierPath (or ClippingMask) as a clipping mask. + Drawing commands between beginclip() and endclip() are constrained to the shape of the path. + """ + # Enable the stencil buffer to limit the area of rendering (stenciling). + glClear(GL_STENCIL_BUFFER_BIT) + glEnable(GL_STENCIL_TEST) + glStencilFunc(GL_NOTEQUAL, 0, 0) + glStencilOp(GL_INCR, GL_INCR, GL_INCR) + # Shouldn't depth testing be disabled when stencilling? + # In any case, if it is, transparency doesn't work. + #glDisable(GL_DEPTH_TEST) + path.draw(fill=(0,0,0,1), stroke=None) # Disregard color settings; always use a black mask. + #glEnable(GL_DEPTH_TEST) + glStencilFunc(GL_EQUAL, 1, 1) + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP) + +def endclip(): + glDisable(GL_STENCIL_TEST) + +#--- SUPERSHAPE -------------------------------------------------------------------------------------- + +def supershape(x, y, width, height, m, n1, n2, n3, points=100, percentage=1.0, range=2*pi, **kwargs): + """ Returns a BezierPath constructed using the superformula, + which can be used to describe many complex shapes and curves that are found in nature. + """ + path = BezierPath() + first = True + for i in xrange(points): + if i <= points * percentage: + dx, dy = geometry.superformula(m, n1, n2, n3, i*range/points) + dx, dy = dx*width/2 + x, dy*height/2 + y + if first is True: + path.moveto(dx, dy); first=False + else: + path.lineto(dx, dy) + path.closepath() + if kwargs.get("draw", True): + path.draw(**kwargs) + return path + +#===================================================================================================== + +#--- IMAGE ------------------------------------------------------------------------------------------- +# Textures and quad vertices are cached for performance. +# Textures remain in cache for the duration of the program. +# Quad vertices are cached as Display Lists and destroyed when the Image object is deleted. +# For optimal performance, images should be created once (not every frame) and its quads left unmodified. +# Performance should be comparable to (moving) pyglet.Sprites drawn in a batch. + +pow2 = [2**n for n in range(20)] # [1, 2, 4, 8, 16, 32, 64, ...] + +def ceil2(x): + """ Returns the nearest power of 2 that is higher than x, e.g. 700 => 1024. + """ + for y in pow2: + if y >= x: return y + +class ImageError(Exception): + pass + +_texture_cache = {} # pyglet.Texture referenced by filename. +_texture_cached = {} # pyglet.Texture.id is in keys once the image has been cached. +def texture(img, data=None): + """ Returns a (cached) texture from the given image filename or byte data. + When a Image or Pixels object is given, returns the associated texture. + """ + # Image texture stored in cache, referenced by file path (or a custom id defined with cache()). + if isinstance(img, (basestring, int)) and img in _texture_cache: + return _texture_cache[img] + # Image file path, load it, cache it, return texture. + if isinstance(img, basestring): + try: + cache(img, pyglet.image.load(img).get_texture()) + except IOError: + raise ImageError, "can't load image from %s" % repr(img) + return _texture_cache[img] + # Image texture, return original. + if isinstance(img, pyglet.image.Texture): + return img + # Image object, return image texture. + # (if you use this to create a new image, the new image will do expensive caching as well). + if isinstance(img, Image): + return img.texture + # Pixels object, return pixel texture. + if isinstance(img, Pixels): + return img.texture + # Pyglet image data. + if isinstance(img, pyglet.image.ImageData): + return img.texture + # Image data as byte string, load it, return texture. + if isinstance(data, basestring): + return pyglet.image.load("", file=StringIO(data)).get_texture() + # Don't know how to handle this image. + raise ImageError, "unknown image type: %s" % repr(img.__class__) + +def cache(id, texture): + """ Store the given texture in cache, referenced by id (which can then be passed to image()). + This is useful for procedurally rendered images (which are not stored in cache by default). + """ + if isinstance(texture, (Image, Pixels)): + texture = texture.texture + if not isinstance(texture, pyglet.image.Texture): + raise ValueError, "can only cache texture, not %s" % repr(texture.__class__.__name__) + _texture_cache[id] = texture + _texture_cached[_texture_cache[id].id] = id + +def cached(texture): + """ Returns the cache id if the texture has been cached (None otherwise). + """ + if isinstance(texture, (Image, Pixels)): + texture = texture.texture + if isinstance(texture, pyglet.image.Texture): + return _texture_cached.get(texture.texture.id) + if isinstance(texture, (basestring, int)): + return texture in _texture_cache and texture or None + return None + +def _render(texture, quad=(0,0,0,0,0,0,0,0)): + """ Renders the texture on the canvas inside a quadtriliteral (i.e. rectangle). + The quadriliteral can be distorted by giving corner offset coordinates. + """ + t = texture.tex_coords # power-2 dimensions + w = texture.width # See Pyglet programming guide -> OpenGL imaging. + h = texture.height + dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4 = quad or (0,0,0,0,0,0,0,0) + glEnable(texture.target) + glBindTexture(texture.target, texture.id) + glBegin(GL_QUADS) + glTexCoord3f(t[0], t[1], t[2] ); glVertex3f(dx4, dy4, 0) + glTexCoord3f(t[3], t[4], t[5] ); glVertex3f(dx3+w, dy3, 0) + glTexCoord3f(t[6], t[7], t[8] ); glVertex3f(dx2+w, dy2+h, 0) + glTexCoord3f(t[9], t[10], t[11]); glVertex3f(dx1, dy1+h, 0) + glEnd() + glDisable(texture.target) + +class Quad(list): + + def __init__(self, dx1=0, dy1=0, dx2=0, dy2=0, dx3=0, dy3=0, dx4=0, dy4=0): + """ Describes the four-sided polygon on which an image texture is "mounted". + This is a quadrilateral (four sides) of which the vertices do not necessarily + have a straight angle (i.e. the corners can be distorted). + """ + list.__init__(self, (dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4)) + self._dirty = True # Image objects poll Quad._dirty to check if the image cache is outdated. + + def copy(self): + return Quad(*self) + + def reset(self): + list.__init__(self, (0,0,0,0,0,0,0,0)) + self._dirty = True + + def __setitem__(self, i, v): + list.__setitem__(self, i, v) + self._dirty = True + + def _get_dx1(self): return self[0] + def _get_dy1(self): return self[1] + def _get_dx2(self): return self[2] + def _get_dy2(self): return self[3] + def _get_dx3(self): return self[4] + def _get_dy3(self): return self[5] + def _get_dx4(self): return self[6] + def _get_dy4(self): return self[7] + + def _set_dx1(self, v): self[0] = v + def _set_dy1(self, v): self[1] = v + def _set_dx2(self, v): self[2] = v + def _set_dy2(self, v): self[3] = v + def _set_dx3(self, v): self[4] = v + def _set_dy3(self, v): self[5] = v + def _set_dx4(self, v): self[6] = v + def _set_dy4(self, v): self[7] = v + + dx1 = property(_get_dx1, _set_dx1) + dy1 = property(_get_dy1, _set_dy1) + dx2 = property(_get_dx2, _set_dx2) + dy2 = property(_get_dy2, _set_dy2) + dx3 = property(_get_dx3, _set_dx3) + dy3 = property(_get_dy3, _set_dy3) + dx4 = property(_get_dx4, _set_dx4) + dy4 = property(_get_dy4, _set_dy4) + +class Image(object): + + def __init__(self, path, x=0, y=0, width=None, height=None, alpha=1.0, data=None): + """ A texture that can be drawn at a given position. + The quadrilateral in which the texture is drawn can be distorted (slow, image cache is flushed). + The image can be resized, colorized and its opacity can be set. + """ + self._src = (path, data) + self._texture = texture(path, data=data) + self._cache = None + self.x = x + self.y = y + self.width = width or self._texture.width # Scaled width, Image.texture.width yields original width. + self.height = height or self._texture.height # Scaled height, Image.texture.height yields original height. + self.quad = Quad() + self.color = Color(1.0, 1.0, 1.0, alpha) + + def copy(self, texture=None, width=None, height=None): + img = texture is None \ + and self.__class__(self._src[0], data=self._src[1]) \ + or self.__class__(texture) + img.x = self.x + img.y = self.y + img.width = self.width + img.height = self.height + img.quad = self.quad.copy() + img.color = self.color.copy() + if width is not None: + img.width = width + if height is not None: + img.height = height + return img + + @property + def id(self): + return self._texture.id + + @property + def texture(self): + return self._texture + + def _get_xy(self): + return (self.x, self.y) + def _set_xy(self, (x,y)): + self.x = x + self.y = y + + xy = property(_get_xy, _set_xy) + + def _get_size(self): + return (self.width, self.height) + def _set_size(self, (w,h)): + self.width = w + self.height = h + + size = property(_get_size, _set_size) + + def _get_alpha(self): + return self.color[3] + def _set_alpha(self, v): + self.color[3] = v + + alpha = property(_get_alpha, _set_alpha) + + def distort(self, dx1=0, dy1=0, dx2=0, dy2=0, dx3=0, dy3=0, dx4=0, dy4=0): + """ Adjusts the four-sided polygon on which an image texture is "mounted", + by incrementing the corner coordinates with the given values. + """ + for i, v in enumerate((dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4)): + if v != 0: + self.quad[i] += v + + def adjust(r=1.0, g=1.0, b=1.0, a=1.0): + """ Adjusts the image color by multiplying R,G,B,A channels with the given values. + """ + self.color[0] *= r + self.color[1] *= g + self.color[2] *= b + self.color[3] *= a + + def draw(self, x=None, y=None, width=None, height=None, alpha=None, color=None, filter=None): + """ Draws the image. + The given parameters (if any) override the image's attributes. + """ + # Calculate and cache the quad vertices as a Display List. + # If the quad has changed, update the cache. + if self._cache is None or self.quad._dirty: + flush(self._cache) + self._cache = precompile(_render, self._texture, self.quad) + self.quad._dirty = False + # Given parameters override Image attributes. + if x is None: + x = self.x + if y is None: + y = self.y + if width is None: + width = self.width + if height is None: + height = self.height + if color and len(color) < 4: + color = color[0], color[1], color[2], 1.0 + if color is None: + color = self.color + if alpha is not None: + color = color[0], color[1], color[2], alpha + if filter: + filter.texture = self._texture # Register the current texture with the filter. + filter.push() + # Round position (x,y) to nearest integer to avoid sub-pixel rendering. + # This ensures there are no visual artefacts on transparent borders (e.g. the "white halo"). + # Halo can also be avoided by overpainting in the source image, but this requires some work: + # http://technology.blurst.com/remove-white-borders-in-transparent-textures/ + x = round(x) + y = round(y) + w = float(width) / self._texture.width + h = float(height) / self._texture.height + # Transform and draw the quads. + glPushMatrix() + glTranslatef(x, y, 0) + glScalef(w, h, 0) + glColor4f(color[0], color[1], color[2], color[3] * _alpha) + glCallList(self._cache) + glPopMatrix() + if filter: + filter.pop() + + def save(self, path): + """ Exports the image as a PNG-file. + """ + self._texture.save(path) + + def __repr__(self): + return "%s(x=%.1f, y=%.1f, width=%.1f, height=%.1f, alpha=%.2f)" % ( + self.__class__.__name__, self.x, self.y, self.width, self.height, self.alpha) + + def __del__(self): + try: + if hasattr(self, "_cache") and self._cache is not None and flush: + flush(self._cache) + except: + pass + +_IMAGE_CACHE = 200 +_image_cache = {} # Image object referenced by Image.texture.id. +_image_queue = [] # Most recent id's are at the front of the list. +def image(img, x=None, y=None, width=None, height=None, + alpha=None, color=None, filter=None, data=None, draw=True): + """ Draws the image at (x,y), scaling it to the given width and height. + The image's transparency can be set with alpha (0.0-1.0). + Applies the given color adjustment, quad distortion and filter (one filter can be specified). + Note: with a filter enabled, alpha and color will not be applied. + This is because the filter overrides the default drawing behavior with its own. + """ + if not isinstance(img, Image): + # If the given image is not an Image object, create one on the fly. + # This object is cached for reuse. + # The cache has a limited size (200), so the oldest Image objects are deleted. + t = texture(img, data=data) + if t.id in _image_cache: + img = _image_cache[t.id] + else: + img = Image(img, data=data) + _image_cache[img.texture.id] = img + _image_queue.insert(0, img.texture.id) + for id in reversed(_image_queue[_IMAGE_CACHE:]): + del _image_cache[id] + del _image_queue[-1] + # Draw the image. + if draw: + img.draw(x, y, width, height, alpha, color, filter) + return img + +def imagesize(img): + """ Returns a (width, height)-tuple with the image dimensions. + """ + t = texture(img) + return (t.width, t.height) + +def crop(img, x=0, y=0, width=None, height=None): + """ Returns the given (x, y, width, height)-region from the image. + Use this to pass cropped image files to image(). + """ + t = texture(img) + if width is None: width = t.width + if height is None: height = t.height + t = t.get_region(x, y, min(t.width-x, width), min(t.height-y, height)) + if isinstance(img, Image): + img = img.copy(texture=t) + return img.copy(texture=t, width=t.width, height=t.height) + if isinstance(img, Pixels): + return Pixels(t) + if isinstance(img, pyglet.image.Texture): + return t + return Image(t) + +#--- PIXELS ------------------------------------------------------------------------------------------ + +class Pixels(list): + + def __init__(self, img): + """ A list of RGBA color values (0-255) for each pixel in the given image. + The Pixels object can be passed to the image() command. + """ + self._img = texture(img).get_image_data() + # A negative pitch means the pixels are stored top-to-bottom row. + self._flipped = self._img.pitch >= 0 + # Data yields a byte array if no conversion (e.g. BGRA => RGBA) was necessary, + # or a byte string otherwise - which needs to be converted to a list of ints. + data = self._img.get_data("RGBA", self._img.width*4 * (-1,1)[self._flipped]) + if isinstance(data, str): + data = map(ord, list(data)) + # Some formats seem to store values from -1 to -256. + data = [(256+v)%256 for v in data] + self.array = data + self._texture = None + + @property + def width(self): + return self._img.width + + @property + def height(self): + return self._img.height + + @property + def size(self): + return (self.width, self.height) + + def __len__(self): + return len(self.array) / 4 + + def __iter__(self): + for i in xrange(len(self)): + yield self[i] + + def __getitem__(self, i): + """ Returns a list of R,G,B,A channel values between 0-255 from pixel i. + Users need to wrap the list in a Color themselves for performance. + - r,g,b,a = Pixels[i] + - clr = color(Pixels[i], base=255) + """ + return self.array[i*4:i*4+4] + + def __setitem__(self, i, v): + """ Sets pixel i to the given R,G,B,A values. + Users need to unpack a Color themselves for performance, + and are resposible for keeping channes values between 0 and 255 + (otherwise an error will occur when Pixels.update() is called), + - Pixels[i] = r,g,b,a + - Pixels[i] = clr.map(base=255) + """ + for j in range(4): + self.array[i*4+j] = v[j] + + def __getslice__(self, i, j): + return [self[i+n] for n in xrange(j-i)] + + def __setslice__(self, i, j, seq): + for n in xrange(j-i): + self[i+n] = seq[n] + + def map(self, function): + """ Applies a function to each pixel. + Function takes a list of R,G,B,A channel values and must return a similar list. + """ + for i in xrange(len(self)): + self[i] = function(self[i]) + + def get(self, i, j): + """ Returns the pixel at row i, column j as a Color object. + """ + if 0 <= i < self.width and 0 <= j < self.height: + return color(self[i+j*self.width], base=255) + + def set(self, i, j, clr): + """ Sets the pixel at row i, column j from a Color object. + """ + if 0 <= i < self.width and 0 <= j < self.height: + self[i+j*self.width] = clr.map(base=255) + + def update(self): + """ Pixels.update() must be called to refresh the image. + """ + data = self.array + data = "".join(map(chr, data)) + self._img.set_data("RGBA", self._img.width*4*(-1,1)[self._flipped], data) + self._texture = self._img.get_texture() + + @property + def texture(self): + if self._texture is None: + self.update() + return self._texture + + def copy(self): + return Pixels(self.texture) + + def __repr__(self): + return "%s(width=%.1f, height=%.1f)" % ( + self.__class__.__name__, self.width, self.height) + +pixels = Pixels + +#--- ANIMATION --------------------------------------------------------------------------------------- +# A sequence of images displayed in a loop. +# Useful for storing pre-rendered effect frames like explosions etc. + +class Animation(list): + + def __init__(self, images=[], duration=None, loop=False, **kwargs): + """ Constructs an animation loop from the given image frames. + The duration specifies the time for the entire animation to run. + Animations are useful to cache effects like explosions, + that have for example been prepared in an offscreen buffer. + """ + list.__init__(self, list(images)) + self.duration = duration # Duration of the entire animation. + self.loop = loop # Loop from last frame to first frame? + self._i = -1 # Frame counter. + self._t = Transition(0, interpolation=kwargs.get("interpolation", LINEAR)) + + def copy(self, **kwargs): + return Animation(self, + duration = kwargs.get("duration", self.duration), + loop = kwargs.get("loop", self.loop), + interpolation = self._t._interpolation) + + def update(self): + if self.duration is not None: + # With a duration, + # skip to a next frame so that the entire animation takes the given time. + if self._i < 0 or self.loop and self._i == len(self)-1: + self._t.set(0, 0) + self._t.update() + self._t.set(len(self)-1, self.duration) + self._t.update() + self._i = int(self._t.current) + else: + # Without a duration, + # Animation.update() simply moves to the next frame. + if self._i < 0 or self.loop and self._i == len(self)-1: + self._i = -1 + self._i = min(self._i+1, len(self)-1) + + @property + def frames(self): + return self + + @property + def frame(self): + # Yields the current frame Image (or None). + try: return self[self._i] + except: + return None + + @property + def done(self): + # Yields True when the animation has stopped (or hasn't started). + return self.loop is False and self._i == len(self)-1 + + def draw(self, *args, **kwargs): + if not self.done: + image(self.frame, *args, **kwargs) + + def __repr__(self): + return "%s(frames=%i, duration=%s)" % ( + self.__class__.__name__, len(self), repr(self.duration)) + +animation = Animation + +#--- OFFSCREEN RENDERING ----------------------------------------------------------------------------- +# Offscreen buffers can be used to render images from paths etc. +# or to apply filters on images before drawing them to the screen. +# There are several ways to draw offscreen: +# - render(img, filter): applies the given filter to the image and returns it. +# - procedural(function, width, height): execute the drawing commands in function inside an image. +# - Create your own subclass of OffscreenBuffer with a draw() method: +# class MyBuffer(OffscreenBuffer): +# def draw(self): pass +# - Define drawing commands between OffscreenBuffer.push() and pop(): +# b = MyBuffer() +# b.push() +# # drawing commands +# b.pop() +# img = Image(b.render()) +# +# The shader.py module already defines several filters that use an offscreen buffer, for example: +# blur(), adjust(), multiply(), twirl(), ... +# +# The less you change about an offscreen buffer, the faster it runs. +# This includes switching it on and off and changing its size. + +from shader import * + +#===================================================================================================== + +#--- FONT -------------------------------------------------------------------------------------------- + +def install_font(ttf): + """ Loads the given TrueType font from file, and returns True on success. + """ + try: + pyglet.font.add_file(ttf) + return True + except: + # This might fail with Carbon on 64-bit Mac systems. + # Fonts can be installed on the system manually if this is the case. + return False + +# Load the platform-independent fonts shipped with NodeBox. +# The default font is Droid (licensed under Apache 2.0). +try: + for f in glob(path.join(path.dirname(__file__), "..", "font", "*")): + install_font(f) + DEFAULT_FONT = "Droid Sans" +except: + DEFAULT_FONT = "Arial" + +# Font weight +NORMAL = "normal" +BOLD = "bold" +ITALIC = "italic" + +# Text alignment +LEFT = "left" +RIGHT = "right" +CENTER = "center" + +_fonts = [] # Custom fonts loaded from file. +_fontname = DEFAULT_FONT # Current state font name. +_fontsize = 12 # Current state font size. +_fontweight = [False, False] # Current state font weight (bold, italic). +_lineheight = 1.0 # Current state text lineheight. +_align = LEFT # Current state text alignment (LEFT/RIGHT/CENTER). + +def font(fontname=None, fontsize=None, fontweight=None, file=None): + """ Sets the current font and/or fontsize. + If a filename is also given, loads the fontname from the given font file. + """ + global _fontname, _fontsize + if file is not None and file not in _fonts: + _fonts.append(file); install_font(file) + if fontname is not None: + _fontname = fontname + if fontsize is not None: + _fontsize = fontsize + if fontweight is not None: + _fontweight_(fontweight) # _fontweight_() is just an alias for fontweight(). + return _fontname + +def fontname(name=None): + """ Sets the current font used when drawing text. + """ + global _fontname + if name is not None: + _fontname = name + return _fontname + +def fontsize(size=None): + """ Sets the current fontsize in points. + """ + global _fontsize + if size is not None: + _fontsize = size + return _fontsize + +def fontweight(*args, **kwargs): + """ Sets the current font weight. + You can supply NORMAL, BOLD and/or ITALIC or set named parameters bold=True and/or italic=True. + """ + global _fontweight + if len(args) == 1 and isinstance(args, (list, tuple)): + args = args[0] + if NORMAL in args: + _fontweight = [False, False] + if BOLD in args or kwargs.get(BOLD): + _fontweight[0] = True + if ITALIC in args or kwargs.get(ITALIC): + _fontweight[1] = True + return _fontweight + +_fontweight_ = fontweight + +def lineheight(size=None): + """ Sets the vertical spacing between lines of text. + The given size is a relative value: lineheight 1.2 for fontsize 10 means 12. + """ + global _lineheight + if size is not None: + _lineheight = size + return _lineheight + +def align(mode=None): + """ Sets the alignment of text paragrapgs (LEFT, RIGHT or CENTER). + """ + global _align + if mode is not None: + _align = mode + return _align + +#--- FONT MIXIN -------------------------------------------------------------------------------------- +# The text() command has optional parameters font, fontsize, fontweight, bold, italic, lineheight and align. + +def font_mixin(**kwargs): + fontname = kwargs.get("fontname", kwargs.get("font", _fontname)) + fontsize = kwargs.get("fontsize", _fontsize) + bold = kwargs.get("bold", BOLD in kwargs.get("fontweight", "") or _fontweight[0]) + italic = kwargs.get("italic", ITALIC in kwargs.get("fontweight", "") or _fontweight[1]) + lineheight = kwargs.get("lineheight", _lineheight) + align = kwargs.get("align", _align) + return (fontname, fontsize, bold, italic, lineheight, align) + +#--- TEXT -------------------------------------------------------------------------------------------- +# Text is cached for performance. +# For optimal performance, texts should be created once (not every frame) and left unmodified. +# Dynamic texts use a cache of recycled Text objects. + +# pyglet.text.Label leaks memory when deleted, because its old batch continues to reference +# loaded font/fontsize/bold/italic glyphs. +# Adding all labels to our own batch remedies this. +_label_batch = pyglet.graphics.Batch() + +def label(str="", width=None, height=None, **kwargs): + """ Returns a drawable pyglet.text.Label object from the given string. + Optional arguments include: font, fontsize, bold, italic, align, lineheight, fill. + If these are omitted the current state is used. + """ + fontname, fontsize, bold, italic, lineheight, align = font_mixin(**kwargs) + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + fill = fill is None and (0,0,0,0) or fill + # We use begin_update() so that the TextLayout doesn't refresh on each update. + # FormattedDocument allows individual styling of characters - see Text.style(). + label = pyglet.text.Label(batch=_label_batch) + label.begin_update() + label.document = pyglet.text.document.FormattedDocument(str or " ") + label.width = width + label.height = height + label.font_name = fontname + label.font_size = fontsize + label.bold = bold + label.italic = italic + label.multiline = True + label.anchor_y = "bottom" + label.set_style("align", align) + label.set_style("line_spacing", lineheight * fontsize) + label.color = [int(ch*255) for ch in fill] + if str == "": + # Empty string "" does not set properties so we used " " first. + label.text = str + label.end_update() + return label + +class Text(object): + + def __init__(self, str, x=0, y=0, width=None, height=None, **kwargs): + """ A formatted string of text that can be drawn at a given position. + Text has the following properties: + text, x, y, width, height, font, fontsize, bold, italic, lineheight, align, fill. + Individual character ranges can be styled with Text.style(). + """ + if width is None: + # Supplying a string with "\n" characters will crash if no width is given. + # On the outside it appears as None but inside we use a very large number. + width = geometry.INFINITE + a, kwargs["align"] = kwargs.get("align", _align), LEFT + else: + a = None + self.__dict__["x"] = x + self.__dict__["y"] = y + self.__dict__["_label"] = label(str, width, height, **kwargs) + self.__dict__["_dirty"] = False + self.__dict__["_align"] = a + self.__dict__["_fill"] = None + + def _get_xy(self): + return (self.x, self.y) + def _set_xy(self, (x,y)): + self.x = x + self.y = y + + xy = property(_get_xy, _set_xy) + + def _get_size(self): + return (self.width, self.height) + def _set_size(self, (w,h)): + self.width = w + self.height = h + + size = property(_get_size, _set_size) + + def __getattr__(self, k): + if k in self.__dict__: + return self.__dict__[k] + elif k in ("text", "height", "bold", "italic"): + return getattr(self._label, k) + elif k == "string": + return self._label.text + elif k == "width": + if self._label.width != geometry.INFINITE: return self._label.width + elif k in ("font", "fontname"): + return self._label.font_name + elif k == "fontsize": + return self._label.font_size + elif k == "fontweight": + return ((None, BOLD)[self._label.bold], (None, ITALIC)[self._label.italic]) + elif k == "lineheight": + return self._label.get_style("line_spacing") / (self.fontsize or 1) + elif k == "align": + if not self._align: self._align = self._label.get_style(k) + return self._align + elif k == "fill": + if not self._fill: self._fill = Color([ch/255.0 for ch in self._label.color]) + return self._fill + else: + raise AttributeError, "'Text' object has no attribute '%s'" % k + + def __setattr__(self, k, v): + if k in self.__dict__: + self.__dict__[k] = v; return + # Setting properties other than x and y requires the label's layout to be updated. + self.__dict__["_dirty"] = True + self._label.begin_update() + if k in ("text", "height", "bold", "italic"): + setattr(self._label, k, v) + elif k == "string": + self._label.text = v + elif k == "width": + self._label.width = v is None and geometry.INFINITE or v + elif k in ("font", "fontname"): + self._label.font_name = v + elif k == "fontsize": + self._label.font_size = v + elif k == "fontweight": + self._label.bold, self._label.italic = BOLD in v, ITALIC in v + elif k == "lineheight": + self._label.set_style("line_spacing", v * (self.fontsize or 1)) + elif k == "align": + self._align = v + self._label.set_style(k, self._label.width == geometry.INFINITE and LEFT or v) + elif k == "fill": + self._fill = v + self._label.color = [int(255*ch) for ch in self._fill or (0,0,0,0)] + else: + raise AttributeError, "'Text' object has no attribute '%s'" % k + + def _update(self): + # Called from Text.draw(), Text.copy() and Text.metrics. + # Ensures that all the color changes have been reflected in Text._label. + # If necessary, recalculates the label's layout (happens in end_update()). + if hasattr(self._fill, "_dirty") and self._fill._dirty: + self.fill = self._fill + self._fill._dirty = False + if self._dirty: + self._label.end_update() + self._dirty = False + + @property + def path(self): + raise NotImplementedError + + @property + def metrics(self): + """ Yields a (width, height)-tuple of the actual text content. + """ + self._update() + return self._label.content_width, self._label.content_height + + def draw(self, x=None, y=None): + """ Draws the text. + """ + # Given parameters override Text attributes. + if x is None: + x = self.x + if y is None: + y = self.y + # Fontsize is rounded, and fontsize 0 will output a default font. + # Therefore, we don't draw text with a fontsize smaller than 0.5. + if self._label.font_size >= 0.5: + glPushMatrix() + glTranslatef(x, y, 0) + self._update() + self._label.draw() + glPopMatrix() + + def copy(self): + self._update() + txt = Text(self.text, self.x, self.y, self.width, self.height, + fontname = self.fontname, + fontsize = self.fontsize, + bold = self.bold, + italic = self.italic, + lineheight = self.lineheight, + align = self.align, + fill = self.fill + ) + # The individual character styling is retrieved from Label.document._style_runs. + # Traverse it and set the styles in the new text. + txt._label.begin_update() + for k in self._label.document._style_runs: + for i, j, v in self._label.document._style_runs[k]: + txt.style(i,j, **{k:v}) + txt._label.end_update() + return txt + + def style(self, i, j, **kwargs): + """ Defines the styling for a range of characters in the text. + Valid arguments can include: font, fontsize, bold, italic, lineheight, align, fill. + For example: text.style(0, 10, bold=True, fill=color(1,0,0)) + """ + attributes = {} + for k,v in kwargs.items(): + if k in ("font", "fontname"): + attributes["font_name"] = v + elif k == "fontsize": + attributes["font_size"] = v + elif k in ("bold", "italic", "align"): + attributes[k] = v + elif k == "fontweight": + attributes.setdefault("bold", BOLD in v) + attributes.setdefault("italic", ITALIC in v) + elif k == "lineheight": + attributes["line_spacing"] = v * self._label.font_size + elif k == "fill": + attributes["color"] = [int(ch*255) for ch in v] + else: + attributes[k] = v + self._dirty = True + self._label.begin_update() + self._label.document.set_style(i, j, attributes) + + def __len__(self): + return len(self.text) + + def __del__(self): + if hasattr(self, "_label") and self._label: + self._label.delete() + +_TEXT_CACHE = 200 +_text_cache = {} +_text_queue = [] +def text(str, x=None, y=None, width=None, height=None, draw=True, **kwargs): + """ Draws the string at the given position, with the current font(). + Lines of text will span the given width before breaking to the next line. + The text will be displayed with the current state font(), fontsize(), fontweight(), etc. + When the given text is a Text object, the state will not be applied. + """ + if isinstance(str, Text) and width is None and height is None and len(kwargs) == 0: + txt = str + else: + # If the given text is not a Text object, create one on the fly. + # Dynamic Text objects are cached by (font, fontsize, bold, italic), + # and those that are no longer referenced by the user are recycled. + # Changing Text properties is still faster than creating a new Text. + # The cache has a limited size (200), so the oldest Text objects are deleted. + fontname, fontsize, bold, italic, lineheight, align = font_mixin(**kwargs) + fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) + id = (fontname, int(fontsize), bold, italic) + recycled = False + if id in _text_cache: + for txt in _text_cache[id]: + # Reference count 3 => Python, _text_cache[id], txt. + # No other variables are referencing the text, so we can recycle it. + if getrefcount(txt) == 3: + txt.text = str + txt.x = x or 0 + txt.y = y or 0 + txt.width = width + txt.height = height + txt.lineheight = lineheight + txt.align = align + txt.fill = fill + recycled = True + break + if not recycled: + txt = Text(str, x or 0, y or 0, width, height, **kwargs) + _text_cache.setdefault(id, []) + _text_cache[id].append(txt) + _text_queue.insert(0, id) + for id in reversed(_text_queue[_TEXT_CACHE:]): + del _text_cache[id][0] + del _text_queue[-1] + if draw: + txt.draw(x, y) + return txt + +def textwidth(txt, **kwargs): + """ Returns the width of the given text. + """ + if not isinstance(txt, Text) or len(kwargs) > 0: + kwargs["draw"] = False + txt = text(txt, 0, 0, **kwargs) + return txt.metrics[0] + +def textheight(txt, width=None, **kwargs): + """ Returns the height of the given text. + """ + if not isinstance(txt, Text) or len(kwargs) > 0 or width != txt.width: + kwargs["draw"] = False + txt = text(txt, 0, 0, width=width, **kwargs) + return txt.metrics[1] + +def textmetrics(txt, width=None, **kwargs): + """ Returns a (width, height)-tuple for the given text. + """ + if not isinstance(txt, Text) or len(kwargs) > 0 or width != txt.width: + kwargs["draw"] = False + txt = text(txt, 0, 0, width=width, **kwargs) + return txt.metrics + +#--- TEXTPATH ---------------------------------------------------------------------------------------- + +class GlyphPathError(Exception): + pass + +import cPickle +glyphs = {} +try: + # Load cached font glyph path information from nodebox/font/glyph.p. + # By default, it has glyph path info for Droid Sans, Droid Sans Mono, Droid Serif. + glyphs = path.join(path.dirname(__file__), "..", "font", "glyph.p") + glyphs = cPickle.load(open(glyphs)) +except: + pass + +def textpath(string, x=0, y=0, **kwargs): + """ Returns a BezierPath from the given text string. + The fontname, fontsize and fontweight can be given as optional parameters, + width, height, lineheight and align are ignored. + Only works with ASCII characters in the default fonts (Droid Sans, Droid Sans Mono, Droid Serif, Arial). + See nodebox/font/glyph.py on how to activate other fonts. + """ + fontname, fontsize, bold, italic, lineheight, align = font_mixin(**kwargs) + w = bold and italic and "bold italic" or bold and "bold" or italic and "italic" or "normal" + p = BezierPath() + f = fontsize / 1000.0 + for ch in string: + try: glyph = glyphs[fontname][w][ch] + except: + raise GlyphPathError, "no glyph path information for %s %s '%s'" % (w, fontname, ch) + for pt in glyph: + if pt[0] == MOVETO: + p.moveto(x+pt[1]*f, y-pt[2]*f) + elif pt[0] == LINETO: + p.lineto(x+pt[1]*f, y-pt[2]*f) + elif pt[0] == CURVETO: + p.curveto(x+pt[3]*f, y-pt[4]*f, x+pt[5]*f, y-pt[6]*f, x+pt[1]*f, y-pt[2]*f) + elif pt[0] == CLOSE: + p.closepath() + x += textwidth(ch, font=fontname, fontsize=fontsize, bold=bold, italic=italic) + return p + +#===================================================================================================== + +#--- UTILITIES --------------------------------------------------------------------------------------- + +_RANDOM_MAP = [90.0, 9.00, 4.00, 2.33, 1.50, 1.00, 0.66, 0.43, 0.25, 0.11, 0.01] +def _rnd_exp(bias=0.5): + bias = max(0, min(bias, 1)) * 10 + i = int(floor(bias)) # bias*10 => index in the _map curve. + n = _RANDOM_MAP[i] # If bias is 0.3, rnd()**2.33 will average 0.3. + if bias < 10: + n += (_RANDOM_MAP[i+1]-n) * (bias-i) + return n + +def random(v1=1.0, v2=None, bias=None): + """ Returns a number between v1 and v2, including v1 but not v2. + The bias (0.0-1.0) represents preference towards lower or higher numbers. + """ + if v2 is None: + v1, v2 = 0, v1 + if bias is None: + r = rnd() + else: + r = rnd()**_rnd_exp(bias) + x = r * (v2-v1) + v1 + if isinstance(v1, int) and isinstance(v2, int): + x = int(x) + return x + +def grid(cols, rows, colwidth=1, rowheight=1, shuffled=False): + """ Yields (x,y)-tuples for the given number of rows and columns. + The space between each point is determined by colwidth and colheight. + """ + rows = range(int(rows)) + cols = range(int(cols)) + if shuffled: + shuffle(rows) + shuffle(cols) + for y in rows: + for x in cols: + yield (x*colwidth, y*rowheight) + +def files(path="*"): + """ Returns a list of files found at the given path. + """ + return glob(path) + +#===================================================================================================== + +#--- PROTOTYPE ---------------------------------------------------------------------------------------- + +class Prototype(object): + + def __init__(self): + """ A base class that allows on-the-fly extension. + This means that external functions can be bound to it as methods, + and properties set at runtime are copied correctly. + Prototype can handle: + - functions (these become class methods), + - immutable types (str, unicode, int, long, float, bool), + - lists, tuples and dictionaries of immutable types, + - objects with a copy() method. + """ + self._dynamic = {} + + def _deepcopy(self, value): + if isinstance(value, FunctionType): + return instancemethod(value, self) + elif hasattr(value, "copy"): + return value.copy() + elif isinstance(value, (list, tuple)): + return [self._deepcopy(x) for x in value] + elif isinstance(value, dict): + return dict([(k, self._deepcopy(v)) for k,v in value.items()]) + elif isinstance(value, (str, unicode, int, long, float, bool)): + return value + else: + # Biggest problem here is how to find/relink circular references. + raise TypeError, "Prototype can't bind %s." % str(value.__class__) + + def _bind(self, key, value): + """ Adds a new method or property to the prototype. + For methods, the given function is expected to take the object (i.e. self) as first parameter. + For properties, values can be: list, tuple, dict, str, unicode, int, long, float, bool, + or an object with a copy() method. + For example, we can define a Layer's custom draw() method in two ways: + - By subclassing: + class MyLayer(Layer): + def draw(layer): + pass + layer = MyLayer() + layer.draw() + - By function binding: + def my_draw(layer): + pass + layer = Layer() + layer._bind("draw", my_draw) + layer.draw() + """ + self._dynamic[key] = value + object.__setattr__(self, key, self._deepcopy(value)) + + def set_method(self, function, name=None): + """ Creates a dynamic method (with the given name) from the given function. + """ + if not name: + name = function.__name__ + self._bind(name, function) + + def set_property(self, key, value): + """ Adds a property to the prototype. + Using this method ensures that dynamic properties are copied correctly - see inherit(). + """ + self._bind(key, value) + + def inherit(self, prototype): + """ Inherit all the dynamic properties and methods of another prototype. + """ + for k,v in prototype._dynamic.items(): + self._bind(k,v) + +#===================================================================================================== + +#--- EVENT HANDLER ------------------------------------------------------------------------------------ + +class EventHandler: + + def __init__(self): + # Use __dict__ directly so we can do multiple inheritance in combination with Prototype: + self.__dict__["enabled"] = True # Receive events from the canvas? + self.__dict__["focus"] = False # True when this object receives the focus. + self.__dict__["pressed"] = False # True when the mouse is pressed on this object. + self.__dict__["dragged"] = False # True when the mouse is dragged on this object. + self.__dict__["_queue"] = [] + + def on_mouse_enter(self, mouse): + pass + def on_mouse_leave(self, mouse): + pass + def on_mouse_motion(self, mouse): + pass + def on_mouse_press(self, mouse): + pass + def on_mouse_release(self, mouse): + pass + def on_mouse_drag(self, mouse): + pass + def on_mouse_scroll(self, mouse): + pass + + def on_key_press(self, keys): + pass + def on_key_release(self, keys): + pass + + # Instead of calling an event directly it could be queued, + # e.g. layer.queue_event(layer.on_mouse_press, canvas.mouse). + # layer.process_events() can then be called whenever desired, + # e.g. after the canvas has been drawn so that events can contain drawing commands. + def queue_event(self, event, *args): + self._queue.append((event, args)) + def process_events(self): + for event, args in self._queue: + event(*args) + self._queue = [] + + # Note: there is no event propagation. + # Event propagation means that, for example, if a layer is pressed + # all its child (or parent) layers receive an on_mouse_press() event as well. + # If this kind of behavior is desired, it is the responsibility of custom subclasses of Layer. + +#===================================================================================================== + +#--- TRANSITION -------------------------------------------------------------------------------------- +# Transition.update() will tween from the last value to transition.set() new value in the given time. +# Transitions are used as attributes (e.g. position, rotation) for the Layer class. + +TIME = 0 # the current time in this frame changes when the canvas is updated + +LINEAR = "linear" +SMOOTH = "smooth" + +class Transition(object): + + def __init__(self, value, interpolation=SMOOTH): + self._v0 = value # Previous value => Transition.start. + self._vi = value # Current value => Transition.current. + self._v1 = value # Desired value => Transition.stop. + self._t0 = TIME # Start time. + self._t1 = TIME # End time. + self._interpolation = interpolation + + def copy(self): + t = Transition(None) + t._v0 = self._v0 + t._vi = self._vi + t._v1 = self._v1 + t._t0 = self._t0 + t._t1 = self._t1 + t._interpolation = self._interpolation + return t + + def get(self): + """ Returns the transition stop value. + """ + return self._v1 + + def set(self, value, duration=1.0): + """ Sets the transition stop value, which will be reached in the given duration (seconds). + Calling Transition.update() moves the Transition.current value toward Transition.stop. + """ + if duration == 0: + # If no duration is given, Transition.start = Transition.current = Transition.stop. + self._vi = value + self._v1 = value + self._v0 = self._vi + self._t0 = TIME # Now. + self._t1 = TIME + duration + + @property + def start(self): + return self._v0 + @property + def stop(self): + return self._v1 + @property + def current(self): + return self._vi + + @property + def done(self): + return TIME >= self._t1 + + def update(self): + """ Calculates the new current value. Returns True when done. + The transition approaches the desired value according to the interpolation: + - LINEAR: even transition over the given duration time, + - SMOOTH: transition goes slower at the beginning and end. + """ + if TIME >= self._t1 or self._vi is None: + self._vi = self._v1 + return True + else: + # Calculate t: the elapsed time as a number between 0.0 and 1.0. + t = (TIME-self._t0) / (self._t1-self._t0) + if self._interpolation == LINEAR: + self._vi = self._v0 + (self._v1-self._v0) * t + else: + self._vi = self._v0 + (self._v1-self._v0) * geometry.smoothstep(0.0, 1.0, t) + return False + +#--- LAYER ------------------------------------------------------------------------------------------- +# The Layer class is responsible for the following: +# - it has a draw() method to override; all sorts of NodeBox drawing commands can be put here, +# - it has a transformation origin point and rotates/scales its drawn items as a group, +# - it has child layers that transform relative to this layer, +# - when its attributes (position, scale, angle, ...) change, they will tween smoothly over time. + +_UID = 0 +def _uid(): + global _UID; _UID+=1; return _UID + +RELATIVE = "relative" # Origin point is stored as float, e.g. (0.5, 0.5). +ABSOLUTE = "absolute" # Origin point is stored as int, e.g. (100, 100). + +class LayerRenderError(Exception): + pass + +# When Layer.clipped=True, children are clipped to the bounds of the layer. +# The layer clipping masks lazily changes size with the layer. +class LayerClippingMask(ClippingMask): + def __init__(self, layer): + self.layer = layer + def draw(self, fill=(0,0,0,1), stroke=None): + w = not self.layer.width and geometry.INFINITE or self.layer.width + h = not self.layer.height and geometry.INFINITE or self.layer.height + rect(0, 0, w, h, fill=fill, stroke=stroke) + +class Layer(list, Prototype, EventHandler): + + def __init__(self, x=0, y=0, width=None, height=None, origin=(0,0), + scale=1.0, rotation=0, opacity=1.0, duration=0.0, name=None, + parent=None, **kwargs): + """ Creates a new drawing layer that can be appended to the canvas. + The duration defines the time (seconds) it takes to animate transformations or opacity. + When the animation has terminated, layer.done=True. + """ + if origin == CENTER: + origin = (0.5,0.5) + origin_mode = RELATIVE + elif isinstance(origin[0], float) \ + and isinstance(origin[1], float): + origin_mode = RELATIVE + else: + origin_mode = ABSOLUTE + Prototype.__init__(self) # Facilitates extension on the fly. + EventHandler.__init__(self) + self._id = _uid() + self.name = name # Layer name. Layers are accessible as ParentLayer.[name] + self.canvas = None # The canvas this layer is drawn to. + self.parent = parent # The layer this layer is a child of. + self._x = Transition(x) # Layer horizontal position in pixels, from the left. + self._y = Transition(y) # Layer vertical position in pixels, from the bottom. + self._width = Transition(width) # Layer width in pixels. + self._height = Transition(height) # Layer height in pixels. + self._dx = Transition(origin[0]) # Transformation origin point. + self._dy = Transition(origin[1]) # Transformation origin point. + self._origin = origin_mode # Origin point as RELATIVE or ABSOLUTE coordinates? + self._scale = Transition(scale) # Layer width and height scale. + self._rotation = Transition(rotation) # Layer rotation. + self._opacity = Transition(opacity) # Layer opacity. + self.duration = duration # The time it takes to animate transformations. + self.top = True # Draw on top of or beneath parent? + self.flipped = False # Flip the layer horizontally? + self.clipped = False # Clip child layers to bounds? + self.hidden = False # Hide the layer? + self._transform_cache = None # Cache of the local transformation matrix. + self._transform_stack = None # Cache of the cumulative transformation matrix. + self._clipping_mask = LayerClippingMask(self) + + @classmethod + def from_image(self, img, *args, **kwargs): + """ Returns a new layer that renders the given image, and with the same size as the image. + The layer's draw() method and an additional image property are set. + """ + if not isinstance(img, Image): + img = Image(img, data=kwargs.get("data")) + kwargs.setdefault("width", img.width) + kwargs.setdefault("height", img.height) + def draw(layer): + image(layer.image) + layer = self(*args, **kwargs) + layer.set_method(draw) + layer.set_property("image", img) + return layer + + @classmethod + def from_function(self, function, *args, **kwargs): + """ Returns a new layer that renders the drawing commands in the given function. + The layer's draw() method is set. + """ + def draw(layer): + function(layer) + layer = self(*args, **kwargs) + layer.set_method(draw) + return layer + + def copy(self, parent=None, canvas=None): + """ Returns a copy of the layer. + All Layer properties will be copied, except for the new parent and canvas, + which you need to define as optional parameters. + This means that copies are not automatically appended to the parent layer or canvas. + """ + layer = self.__class__() # Create instance of the derived class, not Layer. + layer.duration = 0 # Copy all transitions instantly. + layer.canvas = canvas + layer.parent = parent + layer.name = self.name + layer._x = self._x.copy() + layer._y = self._y.copy() + layer._width = self._width.copy() + layer._height = self._height.copy() + layer._origin = self._origin + layer._dx = self._dx.copy() + layer._dy = self._dy.copy() + layer._scale = self._scale.copy() + layer._rotation = self._rotation.copy() + layer._opacity = self._opacity.copy() + layer.duration = self.duration + layer.top = self.top + layer.flipped = self.flipped + layer.clipped = self.clipped + layer.hidden = self.hidden + layer.enabled = self.enabled + # Use base Layer.extend(), we don't care about what subclass.extend() does. + Layer.extend(layer, [child.copy() for child in self]) + # Inherit all the dynamic properties and methods. + Prototype.inherit(layer, self) + return layer + + def __getattr__(self, key): + """ Returns the given property, or the layer with the given name. + """ + if key in self.__dict__: + return self.__dict__[key] + for layer in self: + if layer.name == key: + return layer + raise AttributeError, "%s instance has no attribute '%s'" % (self.__class__.__name__, key) + + def _set_container(self, key, value): + # If Layer.canvas is set to None, the canvas should no longer contain the layer. + # If Layer.canvas is set to Canvas, this canvas should contain the layer. + # Remove the layer from the old canvas/parent. + # Append the layer to the new container. + if self in (self.__dict__.get(key) or ()): + self.__dict__[key].remove(self) + if isinstance(value, list) and self not in value: + list.append(value, self) + self.__dict__[key] = value + + def _get_canvas(self): + return self.__dict__.get("canvas") + def _get_parent(self): + return self.__dict__.get("parent") + + def _set_canvas(self, canvas): + self._set_container("canvas", canvas) + def _set_parent(self, layer): + self._set_container("parent", layer) + + canvas = property(_get_canvas, _set_canvas) + parent = property(_get_parent, _set_parent) + + @property + def root(self): + return self.parent and self.parent.root or self + + @property + def layers(self): + return self + + def insert(self, index, layer): + list.insert(self, index, layer) + layer.__dict__["parent"] = self + def append(self, layer): + list.append(self, layer) + layer.__dict__["parent"] = self + def extend(self, layers): + for layer in layers: + Layer.append(self, layer) + def remove(self, layer): + list.remove(self, layer) + layer.__dict__["parent"] = None + def pop(self, index): + layer = list.pop(self, index) + layer.__dict__["parent"] = None + return layer + + def _get_x(self): + return self._x.get() + def _get_y(self): + return self._y.get() + def _get_width(self): + return self._width.get() + def _get_height(self): + return self._height.get() + def _get_scale(self): + return self._scale.get() + def _get_rotation(self): + return self._rotation.get() + def _get_opacity(self): + return self._opacity.get() + + def _set_x(self, x): + self._transform_cache = None + self._x.set(x, self.duration) + def _set_y(self, y): + self._transform_cache = None + self._y.set(y, self.duration) + def _set_width(self, width): + self._transform_cache = None + self._width.set(width, self.duration) + def _set_height(self, height): + self._transform_cache = None + self._height.set(height, self.duration) + def _set_scale(self, scale): + self._transform_cache = None + self._scale.set(scale, self.duration) + def _set_rotation(self, rotation): + self._transform_cache = None + self._rotation.set(rotation, self.duration) + def _set_opacity(self, opacity): + self._opacity.set(opacity, self.duration) + + x = property(_get_x, _set_x) + y = property(_get_y, _set_y) + width = property(_get_width, _set_width) + height = property(_get_height, _set_height) + scaling = property(_get_scale, _set_scale) + rotation = property(_get_rotation, _set_rotation) + opacity = property(_get_opacity, _set_opacity) + + def _get_xy(self): + return (self.x, self.y) + def _set_xy(self, (x,y)): + self.x = x + self.y = y + + xy = property(_get_xy, _set_xy) + + def _get_origin(self, relative=False): + """ Returns the point (x,y) from which all layer transformations originate. + When relative=True, x and y are defined percentually (0.0-1.0) in terms of width and height. + In some cases x=0 or y=0 is returned: + - For an infinite layer (width=None or height=None), we can't deduct the absolute origin + from coordinates stored relatively (e.g. what is infinity*0.5?). + - Vice versa, for an infinite layer we can't deduct the relative origin from coordinates + stored absolute (e.g. what is 200/infinity?). + """ + dx = self._dx.current + dy = self._dy.current + w = self._width.current + h = self._height.current + # Origin is stored as absolute coordinates and we want it relative. + if self._origin == ABSOLUTE and relative: + if w is None: w = 0 + if h is None: h = 0 + dx = w!=0 and dx/w or 0 + dy = h!=0 and dy/h or 0 + # Origin is stored as relative coordinates and we want it absolute. + elif self._origin == RELATIVE and not relative: + dx = w is not None and dx*w or 0 + dy = h is not None and dy*h or 0 + return dx, dy + + def _set_origin(self, x, y, relative=False): + """ Sets the transformation origin point in either absolute or relative coordinates. + For example, if a layer is 400x200 pixels, setting the origin point to (200,100) + all transformations (translate, rotate, scale) originate from the center. + """ + self._transform_cache = None + self._dx.set(x, self.duration) + self._dy.set(y, self.duration) + self._origin = relative and RELATIVE or ABSOLUTE + + def origin(self, x=None, y=None, relative=False): + """ Sets or returns the point (x,y) from which all layer transformations originate. + """ + if x is not None: + if x == CENTER: + x, y, relative = 0.5, 0.5, True + if y is not None: + self._set_origin(x, y, relative) + return self._get_origin(relative) + + def _get_relative_origin(self): + return self.origin(relative=True) + def _set_relative_origin(self, xy): + self._set_origin(xy[0], xy[1], relative=True) + + relative_origin = property(_get_relative_origin, _set_relative_origin) + + def _get_absolute_origin(self): + return self.origin(relative=False) + def _set_absolute_origin(self, xy): + self._set_origin(xy[0], xy[1], relative=False) + + absolute_origin = property(_get_absolute_origin, _set_absolute_origin) + + def _get_visible(self): + return not self.hidden + def _set_visible(self, b): + self.hidden = not b + + visible = property(_get_visible, _set_visible) + + def translate(self, x, y): + self.x += x + self.y += y + + def rotate(self, angle): + self.rotation += angle + + def scale(self, f): + self.scaling *= f + + def flip(self): + self.flipped = not self.flipped + + def _update(self): + """ Called each frame from canvas._update() to update the layer transitions. + """ + done = self._x.update() + done &= self._y.update() + done &= self._width.update() + done &= self._height.update() + done &= self._dx.update() + done &= self._dy.update() + done &= self._scale.update() + done &= self._rotation.update() + if not done: # i.e. the layer is being transformed + self._transform_cache = None + self._opacity.update() + self.update() + for layer in self: + layer._update() + + def update(self): + """Override this method to provide custom updating code. + """ + pass + + @property + def done(self): + """ Returns True when all transitions have finished. + """ + return self._x.done \ + and self._y.done \ + and self._width.done \ + and self._height.done \ + and self._dx.done \ + and self._dy.done \ + and self._scale.done \ + and self._rotation.done \ + and self._opacity.done + + def _draw(self): + """ Draws the transformed layer and all of its children. + """ + if self.hidden: + return + glPushMatrix() + # Be careful that the transformations happen in the same order in Layer._transform(). + # translate => flip => rotate => scale => origin. + # Center the contents around the origin point. + dx, dy = self.origin(relative=False) + glTranslatef(round(self._x.current), round(self._y.current), 0) + if self.flipped: + glScalef(-1, 1, 1) + glRotatef(self._rotation.current, 0, 0, 1) + glScalef(self._scale.current, self._scale.current, 1) + # Enable clipping mask if Layer.clipped=True. + if self.clipped: + beginclip(self._clipping_mask) + # Draw child layers below. + for layer in self: + if layer.top is False: + layer._draw() + # Draw layer. + global _alpha + _alpha = self._opacity.current # XXX should also affect child layers? + glPushMatrix() + glTranslatef(-round(dx), -round(dy), 0) # Layers are drawn relative from parent origin. + self.draw() + glPopMatrix() + _alpha = 1 + # Draw child layers on top. + for layer in self: + if layer.top is True: + layer._draw() + if self.clipped: + endclip() + glPopMatrix() + + def draw(self): + """Override this method to provide custom drawing code for this layer. + At this point, the layer is correctly transformed. + """ + pass + + def render(self): + """ Returns the layer as a flattened image. + The layer and all of its children need to have width and height set. + """ + b = self.bounds + if geometry.INFINITE in (b.x, b.y, b.width, b.height): + raise LayerRenderError, "can't render layer of infinite size" + return render(lambda: (translate(-b.x,-b.y), self._draw()), b.width, b.height) + + def layer_at(self, x, y, clipped=False, enabled=False, transformed=True, _covered=False): + """ Returns the topmost layer containing the mouse position, None otherwise. + With clipped=True, no parts of child layers outside the parent's bounds are checked. + With enabled=True, only enabled layers are checked (useful for events). + """ + if self.hidden: + # Don't do costly operations on layers the user can't see. + return None + if enabled and not self.enabled: + # Skip disabled layers during event propagation. + return None + if _covered: + # An ancestor is blocking this layer, so we can't select it. + return None + hit = self.contains(x, y, transformed) + if clipped: + # If (x,y) is not inside the clipped bounds, return None. + # If children protruding beyond the layer's bounds are clipped, + # we only need to look at children on top of the layer. + # Each child is drawn on top of the previous child, + # so we hit test them in reverse order (highest-first). + if not hit: + return None + children = [layer for layer in reversed(self) if layer.top is True] + else: + # Otherwise, traverse all children in on-top-first order to avoid + # selecting a child underneath the layer that is in reality + # covered by a peer on top of the layer, further down the list. + children = sorted(reversed(self), key=lambda layer: not layer.top) + for child in children: + # An ancestor (e.g. grandparent) may be covering the child. + # This happens when it hit tested and is somewhere on top of the child. + # We keep a recursive covered-state to verify visibility. + # The covered-state starts as False, but stays True once it switches. + _covered = _covered or (hit and not child.top) + child = child.layer_at(x, y, clipped, enabled, transformed, _covered) + if child is not None: + # Note: "if child:" won't work because it can be an empty list (no children). + # Should be improved by not having Layer inherit from list. + return child + if hit: + return self + else: + return None + + def _transform(self, local=True): + """ Returns the transformation matrix of the layer: + a calculated state of its translation, rotation and scaling. + If local=False, prepends all transformations of the parent layers, + i.e. you get the absolute transformation state of a nested layer. + """ + if self._transform_cache is None: + # Calculate the local transformation matrix. + # Be careful that the transformations happen in the same order in Layer._draw(). + # translate => flip => rotate => scale => origin. + tf = Transform() + dx, dy = self.origin(relative=False) + tf.translate(round(self._x.current), round(self._y.current)) + if self.flipped: + tf.scale(-1, 1) + tf.rotate(self._rotation.current) + tf.scale(self._scale.current, self._scale.current) + tf.translate(-round(dx), -round(dy)) + self._transform_cache = tf + # Flush the cumulative transformation cache of all children. + def _flush(layer): + layer._transform_stack = None + self.traverse(_flush) + if not local: + # Return the cumulative transformation matrix. + # All of the parent transformation states need to be up to date. + # If not, we need to recalculate the whole chain. + if self._transform_stack is None: + if self.parent is None: + self._transform_stack = self._transform_cache.copy() + else: + # Accumulate all the parent layer transformations. + # In the process, we update the transformation state of any outdated parent. + dx, dy = self.parent.origin(relative=False) + # Layers are drawn relative from parent origin. + tf = self.parent._transform(local=False).copy() + tf.translate(round(dx), round(dy)) + self._transform_stack = self._transform_cache.copy() + self._transform_stack.prepend(tf) + return self._transform_stack + return self._transform_cache + + @property + def transform(self): + return self._transform(local=False) + + def _bounds(self, local=True): + """ Returns the rectangle that encompasses the transformed layer and its children. + If one of the children has width=None or height=None, bounds will be infinite. + """ + w = self._width.current; w = w is None and geometry.INFINITE or w + h = self._height.current; h = h is None and geometry.INFINITE or h + # Find the transformed bounds of the layer: + p = self.transform.map([(0,0), (w,0), (w,h), (0,h)]) + x = min(p[0][0], p[1][0], p[2][0], p[3][0]) + y = min(p[0][1], p[1][1], p[2][1], p[3][1]) + w = max(p[0][0], p[1][0], p[2][0], p[3][0]) - x + h = max(p[0][1], p[1][1], p[2][1], p[3][1]) - y + b = geometry.Bounds(x, y, w, h) + if not local: + for child in self: + b = b.union(child.bounds) + return b + + @property + def bounds(self): + return self._bounds(local=False) + + def contains(self, x, y, transformed=True): + """ Returns True if (x,y) falls within the layer's rectangular area. + Useful for GUI elements: with transformed=False the calculations are much faster; + and it will report correctly as long as the layer (or parent layer) + is not rotated or scaled, and has its origin at (0,0). + """ + w = self._width.current; w = w is None and geometry.INFINITE or w + h = self._height.current; h = h is None and geometry.INFINITE or h + if not transformed: + x0, y0 = self.absolute_position() + return x0 <= x <= x0+w \ + and y0 <= y <= y0+h + # Find the transformed bounds of the layer: + p = self.transform.map([(0,0), (w,0), (w,h), (0,h)]) + return geometry.point_in_polygon(p, x, y) + + hit_test = contains + + def absolute_position(self, root=None): + """ Returns the absolute (x,y) position (i.e. cumulative with parent position). + """ + x = 0 + y = 0 + layer = self + while layer is not None and layer != root: + x += layer.x + y += layer.y + layer = layer.parent + return x, y + + def traverse(self, visit=lambda layer: None): + """ Recurses the layer structure and calls visit() on each child layer. + """ + visit(self) + [layer.traverse(visit) for layer in self] + + def __repr__(self): + return "Layer(%sx=%.2f, y=%.2f, scale=%.2f, rotation=%.2f, opacity=%.2f, duration=%.2f)" % ( + self.name is not None and "name='%s', " % self.name or "", + self.x, + self.y, + self.scaling, + self.rotation, + self.opacity, + self.duration + ) + + def __eq__(self, other): + return isinstance(other, Layer) and self._id == other._id + def __ne__(self, other): + return not self.__eq__(other) + +layer = Layer + +#--- GROUP ------------------------------------------------------------------------------------------- + +class Group(Layer): + + def __init__(self, *args, **kwargs): + """ A layer that serves as a container for other layers. + It has no width or height and doesn't draw anything. + """ + Layer.__init__(self, *args, **kwargs) + self._set_width(0) + self._set_height(0) + + @classmethod + def from_image(*args, **kwargs): + raise NotImplementedError + + @classmethod + def from_function(*args, **kwargs): + raise NotImplementedError + + @property + def width(self): + return 0 + @property + def height(self): + return 0 + + def layer_at(self, x, y, clipped=False, enabled=False, transformed=True, _covered=False): + # Ignores clipped=True for Group (since it has no width or height). + for child in reversed(self): + layer = child.layer_at(x, y, clipped, enabled, transformed, _covered) + if layer: + return layer + +group = Group + +#===================================================================================================== + +#--- MOUSE ------------------------------------------------------------------------------------------- + +# Mouse cursors: +DEFAULT = "default" +HIDDEN = "hidden" +CROSS = pyglet.window.Window.CURSOR_CROSSHAIR +HAND = pyglet.window.Window.CURSOR_HAND +TEXT = pyglet.window.Window.CURSOR_TEXT +WAIT = pyglet.window.Window.CURSOR_WAIT + +# Mouse buttons: +LEFT = "left" +RIGHT = "right" +MIDDLE = "middle" + +class Mouse(Point): + + def __init__(self, canvas, x=0, y=0): + """ Keeps track of the mouse position on the canvas, buttons pressed and the cursor icon. + """ + Point.__init__(self, x, y) + self._canvas = canvas + self._cursor = DEFAULT # Mouse cursor: CROSS, HAND, HIDDEN, TEXT, WAIT. + self._button = None # Mouse button pressed: LEFT, RIGHT, MIDDLE. + self.modifiers = [] # Mouse button modifiers: CTRL, SHIFT, OPTION. + self.pressed = False # True if the mouse button is pressed. + self.dragged = False # True if the mouse is dragged. + self.scroll = Point(0,0) # Scroll offset. + self.dx = 0 # Relative offset from previous horizontal position. + self.dy = 0 # Relative offset from previous vertical position. + + # Backwards compatibility due to an old typo: + @property + def vx(self): + return self.dx + @property + def vy(self): + return self.dy + + @property + def relative_x(self): + try: return float(self.x) / self._canvas.width + except ZeroDivisionError: + return 0 + @property + def relative_y(self): + try: return float(self.y) / self._canvas.height + except ZeroDivisionError: + return 0 + + def _get_cursor(self): + return self._cursor + def _set_cursor(self, mode): + self._cursor = mode != DEFAULT and mode or None + if mode == HIDDEN: + self._canvas._window.set_mouse_visible(False); return + self._canvas._window.set_mouse_cursor( + self._canvas._window.get_system_mouse_cursor( + self._cursor)) + + cursor = property(_get_cursor, _set_cursor) + + def _get_button(self): + return self._button + def _set_button(self, button): + self._button = \ + button == pyglet.window.mouse.LEFT and LEFT or \ + button == pyglet.window.mouse.RIGHT and RIGHT or \ + button == pyglet.window.mouse.MIDDLE and MIDDLE or None + + button = property(_get_button, _set_button) + + def __repr__(self): + return "Mouse(x=%.1f, y=%.1f, pressed=%s, dragged=%s)" % ( + self.x, self.y, repr(self.pressed), repr(self.dragged)) + +#--- KEYBOARD ---------------------------------------------------------------------------------------- + +# Key codes: +BACKSPACE = "backspace" +DELETE = "delete" +TAB = "tab" +ENTER = "enter" +SPACE = "space" +ESCAPE = "escape" +UP = "up" +DOWN = "down" +LEFT = "left" +RIGHT = "right" + +# Key modifiers: +OPTION = \ +ALT = "option" +CTRL = "ctrl" +SHIFT = "shift" +COMMAND = "command" + +MODIFIERS = (OPTION, CTRL, SHIFT, COMMAND) + +class Keys(list): + + def __init__(self, canvas): + """ Keeps track of the keys pressed and any modifiers (e.g. shift or control key). + """ + self._canvas = canvas + self.code = None # Last key pressed + self.char = "" # Last key character representation (i.e., SHIFT + "a" = "A"). + self.modifiers = [] # Modifier keys pressed (OPTION, CTRL, SHIFT, COMMAND). + self.pressed = False + + + def append(self, code): + code = self._decode(code) + if code in MODIFIERS: + self.modifiers.append(code) + list.append(self, code) + self.code = self[-1] + + def remove(self, code): + code = self._decode(code) + if code in MODIFIERS: + self.modifiers.remove(code) + + if code in self: # some window managers catch keys in weird manner + list.remove(self, code) # .. so we may be in situation where no key code exists in our list + + self.code = len(self) > 0 and self[-1] or None + + def _decode(self, code): + if not isinstance(code, Number): + s = code + else: + s = pyglet.window.key.symbol_string(code) # 65288 => "BACKSPACE" + s = s.lower() # "BACKSPACE" => "backspace" + s = s.lstrip("_") # "_1" => "1" + s = s.replace("return", ENTER) # "return" => "enter" + s = s.replace("num_", "") # "num_space" => "space" + s = s.endswith(MODIFIERS) and s.lstrip("lr") or s # "lshift" => "shift" + return s + + def __repr__(self): + return "Keys(char=%s, code=%s, modifiers=%s, pressed=%s)" % ( + repr(self.char), repr(iter(self)), repr(self.modifiers), repr(self.pressed)) + +#===================================================================================================== + +#--- CANVAS ------------------------------------------------------------------------------------------ + +VERY_LIGHT_GREY = 0.95 + +FRAME = 0 + +# Window styles. +WINDOW_DEFAULT = pyglet.window.Window.WINDOW_STYLE_DEFAULT +WINDOW_BORDERLESS = pyglet.window.Window.WINDOW_STYLE_BORDERLESS + +# Configuration settings for the canvas. +# http://www.pyglet.org/doc/programming_guide/opengl_configuration_options.html +# The stencil buffer is enabled (we need it to do clipping masks). +# Multisampling will be enabled (if possible) to do anti-aliasing. +settings = OPTIMAL = dict( +# buffer_size = 32, # Let Pyglet decide automatically. +# red_size = 8, +# green_size = 8, +# blue_size = 8, + depth_size = 24, + stencil_size = 1, + alpha_size = 8, + double_buffer = 1, + sample_buffers = 1, + samples = 4 +) + +def _configure(settings): + """ Returns a pyglet.gl.Config object from the given dictionary of settings. + If the settings are not supported, returns the default settings. + """ + screen = pyglet.window.get_platform().get_default_display().get_default_screen() + c = pyglet.gl.Config(**settings) + try: + c = screen.get_best_config(c) + except pyglet.window.NoSuchConfigException: + # Probably the hardwarde doesn't support multisampling. + # We can still do some anti-aliasing by turning on GL_LINE_SMOOTH. + c = pyglet.gl.Config() + c = screen.get_best_config(c) + return c + +class Canvas(list, Prototype, EventHandler): + + def __init__(self, width=640, height=480, name="NodeBox for OpenGL", resizable=False, border=True, settings=OPTIMAL, vsync=True): + """ The main application window containing the drawing canvas. + It is opened when Canvas.run() is called. + It is a collection of drawable Layer objects, and it has its own draw() method. + This method must be overridden with your own drawing commands, which will be executed each frame. + Event handlers for keyboard and mouse interaction can also be overriden. + Events will be passed to layers that have been appended to the canvas. + """ + window = dict( + caption = name, + visible = False, + width = width, + height = height, + resizable = resizable, + style = border is False and WINDOW_BORDERLESS or WINDOW_DEFAULT, + config = _configure(settings), + vsync = vsync + ) + Prototype.__init__(self) + EventHandler.__init__(self) + self.profiler = Profiler(self) + self._window = pyglet.window.Window(**window) + self._fps = 60 # Frames per second. + self._frame = 0 # The current frame. + self._elapsed = 0 # dt = time elapsed since last frame. + self._active = False # Application is running? + self.paused = False # Pause animation? + self._mouse = Mouse(self) # The mouse cursor location. + self._keys = Keys(self) # The keys pressed on the keyboard. + self._focus = None # The layer being focused by the mouse. + # Mouse and keyboard events: + self._window.on_mouse_enter = self._on_mouse_enter + self._window.on_mouse_leave = self._on_mouse_leave + self._window.on_mouse_motion = self._on_mouse_motion + self._window.on_mouse_press = self._on_mouse_press + self._window.on_mouse_release = self._on_mouse_release + self._window.on_mouse_drag = self._on_mouse_drag + self._window.on_mouse_scroll = self._on_mouse_scroll + self._window.on_key_pressed = False + self._window.on_key_press = self._on_key_press + self._window.on_key_release = self._on_key_release + self._window.on_text = self._on_text + self._window.on_text_motion = self._on_text_motion + self._window.on_move = self._on_move + self._window.on_resize = self._on_resize + self._window.on_close = self.stop + + def _get_name(self): + return self._window.caption + def _set_name(self, str): + self._window.set_caption(str) + + name = property(_get_name, _set_name) + + def _get_vsync(self): + return self._window.vsync + def _set_vsync(self, bool): + self._window.set_vsync(bool) + + vsync = property(_get_vsync, _set_vsync) + + @property + def layers(self): + return self + + def insert(self, index, layer): + list.insert(self, index, layer) + layer.__dict__["canvas"] = self + def append(self, layer): + list.append(self, layer) + layer.__dict__["canvas"] = self + def extend(self, layers): + for layer in layers: + self.append(layer) + def remove(self, layer): + list.remove(self, layer) + layer.__dict__["canvas"] = None + def pop(self, index): + layer = list.pop(index) + layer.__dict__["canvas"] = None + return layer + + def _get_x(self): + return self._window.get_location()[0] + def _set_x(self, v): + self._window.set_location(v, self.y) + def _get_y(self): + return self._window.get_location()[1] + def _set_y(self, v): + self._window.set_location(self.x, v) + def _get_xy(self): + return (self.x, self.y) + def _set_xy(self, (x,y)): + self.x = x + self.y = y + def _get_width(self): + return self._window.width + def _get_height(self): + return self._window.height + def _get_size(self): + return (self.width, self.height) + def _set_width(self, v): + self._window.width = v + def _set_height(self, v): + self._window.height = v + def _set_size(self, (w,h)): + self.width = w + self.height = h + + x = property(_get_x, _set_x) + y = property(_get_y, _set_y) + xy = property(_get_xy, _set_xy) + width = property(_get_width, _set_width) + height = property(_get_height, _set_height) + size = property(_get_size, _set_size) + + def _get_fullscreen(self): + return self._window.fullscreen + def _set_fullscreen(self, mode=True): + self._window.set_fullscreen(mode) + + fullscreen = property(_get_fullscreen, _set_fullscreen) + + @property + def screen(self): + return pyglet.window.get_platform().get_default_display().get_default_screen() + + @property + def frame(self): + """ Yields the current frame number. + """ + return self._frame + + @property + def elapsed(self): + """ Yields the elapsed time since last frame. + """ + return self._elapsed + + dt = elapsed + + @property + def mouse(self): + """ Yields a Point(x, y) with the mouse position on the canvas. + """ + return self._mouse + + @property + def keys(self): + return self._keys + + @property # Backwards compatibility. + def key(self): + return self._keys + + @property + def focus(self): + return self._focus + + #--- Event dispatchers ------------------------------ + # First events are dispatched, then update() and draw() are called. + + def layer_at(self, x, y, **kwargs): + """ Find the topmost layer at the specified coordinates. + This method returns None if no layer was found. + """ + for layer in reversed(self): + layer = layer.layer_at(x, y, **kwargs) + if layer is not None: + return layer + return None + + def _on_mouse_enter(self, x, y): + self._mouse.x = x + self._mouse.y = y + self.on_mouse_enter(self._mouse) + + def _on_mouse_leave(self, x, y): + self._mouse.x = x + self._mouse.y = y + self.on_mouse_leave(self._mouse) + # When the mouse leaves the canvas, no layer has the focus. + if self._focus is not None: + self._focus.on_mouse_leave(self._mouse) + self._focus.focus = False + self._focus.pressed = False + self._focus.dragged = False + self._focus = None + + def _on_mouse_motion(self, x, y, dx, dy): + self._mouse.x = x + self._mouse.y = y + self._mouse.dx = int(dx) + self._mouse.dy = int(dy) + self.on_mouse_motion(self._mouse) + # Get the topmost layer over which the mouse is hovering. + layer = self.layer_at(x, y, enabled=True) + # If the layer differs from the layer which currently has the focus, + # or the mouse is not over any layer, remove the current focus. + if self._focus is not None and (self._focus != layer or not self._focus.contains(x,y)): + self._focus.on_mouse_leave(self._mouse) + self._focus.focus = False + self._focus = None + # Set the focus. + if self.focus != layer and layer is not None: + self._focus = layer + self._focus.focus = True + self._focus.on_mouse_enter(self._mouse) + # Propagate mouse motion to layer with the focus. + if self._focus is not None: + self._focus.on_mouse_motion(self._mouse) + + def _on_mouse_press(self, x, y, button, modifiers): + self._mouse.pressed = True + self._mouse.button = button + self._mouse.modifiers = [a for (a,b) in ( + (CTRL, pyglet.window.key.MOD_CTRL), + (SHIFT, pyglet.window.key.MOD_SHIFT), + (OPTION, pyglet.window.key.MOD_OPTION)) if modifiers & b] + self.on_mouse_press(self._mouse) + # Propagate mouse clicking to the layer with the focus. + if self._focus is not None: + self._focus.pressed = True + self._focus.on_mouse_press(self._mouse) + + def _on_mouse_release(self, x, y, button, modifiers): + if self._focus is not None: + self._focus.on_mouse_release(self._mouse) + self._focus.pressed = False + self._focus.dragged = False + self.on_mouse_release(self._mouse) + self._mouse.button = None + self._mouse.modifiers = [] + self._mouse.pressed = False + self._mouse.dragged = False + if self._focus is not None: + # Get the topmost layer over which the mouse is hovering. + layer = self.layer_at(x, y, enabled=True) + # If the mouse is no longer over the layer with the focus + # (this can happen after dragging), remove the focus. + if self._focus != layer or not self._focus.contains(x,y): + self._focus.on_mouse_leave(self._mouse) + self._focus.focus = False + self._focus = None + # Propagate mouse to the layer with the focus. + if self._focus != layer and layer is not None: + layer.focus = True + layer.on_mouse_enter(self._mouse) + self._focus = layer + + def _on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): + self._mouse.dragged = True + self._mouse.x = x + self._mouse.y = y + self._mouse.dx = int(dx) + self._mouse.dy = int(dy) + self._mouse.modifiers = [a for (a,b) in ( + (CTRL, pyglet.window.key.MOD_CTRL), + (SHIFT, pyglet.window.key.MOD_SHIFT), + (OPTION, pyglet.window.key.MOD_OPTION)) if modifiers & b] + # XXX also needs to log buttons. + self.on_mouse_drag(self._mouse) + # Propagate mouse dragging to the layer with the focus. + if self._focus is not None: + self._focus.dragged = True + self._focus.on_mouse_drag(self._mouse) + + def _on_mouse_scroll(self, x, y, scroll_x, scroll_y): + self._mouse.scroll.x = scroll_x + self._mouse.scroll.y = scroll_y + self.on_mouse_scroll(self._mouse) + # Propagate mouse scrolling to the layer with the focus. + if self._focus is not None: + self._focus.on_mouse_scroll(self._mouse) + + def _on_key_press(self, keycode, modifiers): + self._keys.pressed = True + self._keys.append(keycode) + if self._keys.code == TAB: + self._keys.char = "\t" + # The event is delegated in _update(): + self._window.on_key_pressed = True + + def _on_key_release(self, keycode, modifiers): + for layer in self: + layer.on_key_release(self.key) + self.on_key_release(self.key) + self._keys.char = "" + try: + self._keys.remove(keycode) + except ValueError: + pass + self._keys.pressed = False + + def _on_text(self, text): + self._keys.char = text + # The event is delegated in _update(): + self._window.on_key_pressed = True + + def _on_text_motion(self, keycode): + self._keys.char = "" + # The event is delegated in _update(): + self._window.on_key_pressed = True + + def _on_move(self, x, y): + self.on_move() + + def _on_resize(self, width, height): + pyglet.window.Window.on_resize(self._window, width, height) + self.on_resize() + + # Event methods are meant to be overridden or patched with Prototype.set_method(). + def on_key_press(self, keys): + """ The default behavior of the canvas: + - ESC exits the application, + - CTRL-P pauses the animation, + - CTRL-S saves a screenshot. + """ + if keys.code == ESCAPE: + self.stop() + if keys.code == "p" and CTRL in keys.modifiers: + self.paused = not self.paused + if keys.code == "s" and CTRL in keys.modifiers: + self.save("nodebox-%s.png" % str(datetime.now()).split(".")[0].replace(" ","-").replace(":","-")) + + def on_move(self): + pass + + def on_resize(self): + pass + + #--- Main loop -------------------------------------- + + def setup(self): + pass + + def update(self): + pass + + def draw(self): + self.clear() + + def draw_overlay(self): + """ Override this method to draw once all the layers have been drawn. + """ + pass + + draw_over = draw_overlay + + def _setup(self): + """ Initializes the application window and resets the state. + Clears the canvas and calls Canvas.setup(). + """ + # Start the application (if not already running). + if not self._active: + self._window.switch_to() + # Set the window color, this will be transparent in saved images. + glClearColor(VERY_LIGHT_GREY, VERY_LIGHT_GREY, VERY_LIGHT_GREY, 0) + # Reset the transformation state. + # Most of this is already taken care of in Pyglet. + #glMatrixMode(GL_PROJECTION) + #glLoadIdentity() + #glOrtho(0, self.width, 0, self.height, -1, 1) + #glMatrixMode(GL_MODELVIEW) + glLoadIdentity() + # Enable line anti-aliasing. + glEnable(GL_LINE_SMOOTH) + # Enable alpha transparency. + glEnable(GL_BLEND) + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) + #glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + self._window.dispatch_events() + self._window.set_visible(True) + self._active = True + self.clear() + self.setup() + + def _draw(self, lapse=0): + """ Draws the canvas and its layers. + This method gives the same result each time it gets drawn; only _update() advances state. + """ + if self.paused: + return + self._window.switch_to() + glPushMatrix() + self.draw() + glPopMatrix() + glPushMatrix() + for layer in self: + layer._draw() + glPopMatrix() + glPushMatrix() + self.draw_overlay() + glPopMatrix() + + def _update(self, lapse=0): + """ Updates the canvas and its layers. + This method does not actually draw anything, it only updates the state. + """ + self._elapsed = lapse + if not self.paused: + # Advance the animation by updating all layers. + # This is only done when the canvas is not paused. + # Events will still be propagated during pause. + global TIME; TIME = time() + self._frame += 1 + self.update() + for layer in self: + layer._update() + if self._window.on_key_pressed is True: + # Fire on_key_press() event, + # which combines _on_key_press(), _on_text() and _on_text_motion(). + self._window.on_key_pressed = False + self.on_key_press(self._keys) + for layer in self: + layer.on_key_press(self._keys) + + def stop(self): + # If you override this method, don't forget to call Canvas.stop() to exit the app. + # Any user-defined stop method, added with canvas.set_method() or canvas.run(stop=stop), + # is called first. + try: self._user_defined_stop() + except: + pass + for f in (self._update, self._draw): + pyglet.clock.unschedule(f) + self._window.close() + self._active = False + pyglet.app.exit() + + def clear(self): + """ Clears the previous frame from the canvas. + """ + glClear(GL_COLOR_BUFFER_BIT) + glClear(GL_DEPTH_BUFFER_BIT) + glClear(GL_STENCIL_BUFFER_BIT) + + def run(self, draw=None, setup=None, update=None, stop=None): + """ Opens the application windows and starts drawing the canvas. + Canvas.setup() will be called once during initialization. + Canvas.draw() and Canvas.update() will be called each frame. + Canvas.clear() needs to be called explicitly to clear the previous frame drawing. + Canvas.stop() closes the application window. + If the given setup, draw or update parameter is a function, + it overrides that canvas method. + """ + if isinstance(setup, FunctionType): + self.set_method(setup, name="setup") + if isinstance(draw, FunctionType): + self.set_method(draw, name="draw") + if isinstance(update, FunctionType): + self.set_method(update, name="update") + if isinstance(stop, FunctionType): + self.set_method(stop, name="stop") + self._setup() + self.fps = self._fps # Schedule the _update and _draw events. + pyglet.app.run() + + @property + def active(self): + return self._active + + def _get_fps(self): + return self._fps + def _set_fps(self, v): + # Use pyglet.clock to schedule _update() and _draw() events. + # The clock will then take care of calling them enough times. + # Note: frames per second is related to vsync. + # If the vertical refresh rate is about 30Hz you'll get top speed of around 33fps. + # It's probably a good idea to leave vsync=True if you don't want to fry the GPU. + for f in (self._update, self._draw): + pyglet.clock.unschedule(f) + if v is None: + pyglet.clock.schedule(f) + if v > 0: + pyglet.clock.schedule_interval(f, 1.0/v) + self._fps = v + + fps = property(_get_fps, _set_fps) + + #--- Frame export ----------------------------------- + + def render(self): + """ Returns a screenshot of the current frame as a texture. + This texture can be passed to the image() command. + """ + return pyglet.image.get_buffer_manager().get_color_buffer().get_texture() + + buffer = screenshot = render + + @property + def texture(self): + return pyglet.image.get_buffer_manager().get_color_buffer().get_texture() + + def save(self, path): + """ Exports the current frame as a PNG-file. + """ + pyglet.image.get_buffer_manager().get_color_buffer().save(path) + + #--- Prototype -------------------------------------- + + def __setattr__(self, k, v): + # Canvas is a Prototype, so Canvas.draw() can be overridden + # but it can also be patched with Canvas.set_method(draw). + # Specific methods (setup, draw, mouse and keyboard events) can also be set directly + # (e.g. canvas.on_mouse_press = my_mouse_handler). + # This way we don't have to explain set_method() to beginning users.. + if isinstance(v, FunctionType) and (k in ("setup", "draw", "update", "stop") \ + or k.startswith("on_") and k in ( + "on_mouse_enter", + "on_mouse_leave", + "on_mouse_motion", + "on_mouse_press", + "on_mouse_release", + "on_mouse_drag", + "on_mouse_scroll", + "on_key_press", + "on_key_release", + "on_move", + "on_resize")): + self.set_method(v, name=k) + else: + object.__setattr__(self, k, v) + + def set_method(self, function, name=None): + if name == "stop" \ + or name is None and function.__name__ == "stop": + Prototype.set_method(self, function, name="_user_defined_stop") # Called from Canvas.stop(). + else: + Prototype.set_method(self, function, name) + + def __repr__(self): + return "Canvas(name='%s', size='%s', layers=%s)" % (self.name, self.size, repr(list(self))) + +#--- PROFILER ---------------------------------------------------------------------------------------- + +CUMULATIVE = "cumulative" +SLOWEST = "slowest" + +_profile_canvas = None +_profile_frames = 100 +def profile_run(): + for i in range(_profile_frames): + _profile_canvas._update() + _profile_canvas._draw() + +class Profiler: + + def __init__(self, canvas): + self.canvas = canvas + + @property + def framerate(self): + return pyglet.clock.get_fps() + + def run(self, draw=None, setup=None, update=None, frames=100, sort=CUMULATIVE, top=30): + """ Runs cProfile on the canvas for the given number of frames. + The performance statistics are returned as a string, sorted by SLOWEST or CUMULATIVE. + For example, instead of doing canvas.run(draw): + print canvas.profiler.run(draw, frames=100) + """ + # Register the setup, draw, update functions with the canvas (if given). + if isinstance(setup, FunctionType): + self.canvas.set_method(setup, name="setup") + if isinstance(draw, FunctionType): + self.canvas.set_method(draw, name="draw") + if isinstance(update, FunctionType): + self.canvas.set_method(update, name="update") + # If enabled, turn Psyco off. + psyco_stopped = False + try: + psyco.stop() + psyco_stopped = True + except: + pass + # Set the current canvas and the number of frames to profile. + # The profiler will then repeatedly execute canvas._update() and canvas._draw(). + # Statistics are redirected from stdout to a temporary file. + global _profile_canvas, _profile_frames + _profile_canvas = self.canvas + _profile_frames = frames + import cProfile + import pstats + cProfile.run("profile_run()", "_profile") + p = pstats.Stats("_profile") + p.stream = open("_profile", "w") + p.sort_stats(sort==SLOWEST and "time" or sort).print_stats(top) + p.stream.close() + s = open("_profile").read() + remove("_profile") + # Restart Psyco if we stopped it. + if psyco_stopped: + psyco.profile() + return s + +#--- LIBRARIES --------------------------------------------------------------------------------------- +# Import the library and assign it a _ctx variable containing the current context. +# This mimics the behavior in NodeBox for Mac OS X. + +def ximport(library): + from sys import modules + library = __import__(library) + library._ctx = modules[__name__] + return library + +#----------------------------------------------------------------------------------------------------- +# Linear interpolation math for BezierPath.point() etc. + +import bezier diff --git a/nodeboxgl/graphics/geometry.py b/nodeboxgl/graphics/geometry.py new file mode 100644 index 0000000..5c21d1c --- /dev/null +++ b/nodeboxgl/graphics/geometry.py @@ -0,0 +1,600 @@ +#=== SHADER ========================================================================================== +# 2D geometry functions. +# Authors: Tom De Smedt +# License: BSD (see LICENSE.txt for details). +# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) +# http://cityinabottle.org/nodebox + +from math import sqrt, pow +from math import sin, cos, atan2, degrees, radians, pi + +INFINITE = 1e15 # float("inf") doesn't work on windows. + +#===================================================================================================== + +#--- ROTATION ---------------------------------------------------------------------------------------- + +def angle(x0, y0, x1, y1): + """ Returns the angle between two points. + """ + return degrees(atan2(y1-y0, x1-x0)) + +def distance(x0, y0, x1, y1): + """ Returns the distance between two points. + """ + return sqrt(pow(x1-x0, 2) + pow(y1-y0, 2)) + +def coordinates(x0, y0, distance, angle): + """ Returns the location of a point by rotating around origin (x0,y0). + """ + return (x0 + cos(radians(angle)) * distance, + y0 + sin(radians(angle)) * distance) + +def rotate(x, y, x0, y0, angle): + """ Returns the coordinates of (x,y) rotated around origin (x0,y0). + """ + x, y = x-x0, y-y0 + a, b = cos(radians(angle)), sin(radians(angle)) + return (x*a-y*b+x0, y*a+x*b+y0) + +def reflect(x, y, x0, y0, d=1.0, a=180): + """ Returns the reflection of a point through origin (x0,y0). + """ + return coordinates(x0, y0, d*distance(x0,y0,x,y), a+angle(x0,y0,x,y)) + +# Fast C implementations: +try: + from nglgeometry import angle, distance, coordinates, rotate +except: + pass + +#--- INTERPOLATION ----------------------------------------------------------------------------------- + +def lerp(a, b, t): + """ Returns the linear interpolation between a and b for time t between 0.0-1.0. + For example: lerp(100, 200, 0.5) => 150. + """ + if t < 0.0: return a + if t > 1.0: return b + return a + (b-a)*t + +def smoothstep(a, b, x): + """ Returns a smooth transition between 0.0 and 1.0 using Hermite interpolation (cubic spline), + where x is a number between a and b. The return value will ease (slow down) as x nears a or b. + For x smaller than a, returns 0.0. For x bigger than b, returns 1.0. + """ + if x < a: return 0.0 + if x >=b: return 1.0 + x = float(x-a) / (b-a) + return x*x * (3-2*x) + +def bounce(x): + """ Returns a bouncing value between 0.0 and 1.0 (e.g. Mac OS X Dock) for a value between 0.0-1.0. + """ + return abs(sin(2*pi * (x+1) * (x+1)) * (1-x)) + +def clamp(v, a, b): + return max(a, min(v, b)) + +# Fast C implementations: +try: + from nglgeometry import smoothstep +except: + pass + +#--- INTERSECTION ------------------------------------------------------------------------------------ + +def line_line_intersection(x1, y1, x2, y2, x3, y3, x4, y4, infinite=False): + """ Determines the intersection point of two lines, or two finite line segments if infinite=False. + When the lines do not intersect, returns an empty list. + """ + # Based on: P. Bourke, http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/ + ua = (x4-x3)*(y1-y3) - (y4-y3)*(x1-x3) + ub = (x2-x1)*(y1-y3) - (y2-y1)*(x1-x3) + d = (y4-y3)*(x2-x1) - (x4-x3)*(y2-y1) + if d == 0: + if ua == ub == 0: + # The lines are coincident + return [] + else: + # The lines are parallel. + return [] + ua /= float(d) + ub /= float(d) + if not infinite and not (0<=ua<=1 and 0<=ub<=1): + # Intersection point is not within both line segments. + return None, None + return [(x1+ua*(x2-x1), y1+ua*(y2-y1))] + +def circle_line_intersection(cx, cy, radius, x1, y1, x2, y2, infinite=False): + """ Returns a list of points where the circle and the line intersect. + Returns an empty list when the circle and the line do not intersect. + """ + # Based on: http://www.vb-helper.com/howto_net_line_circle_intersections.html + dx = x2-x1 + dy = y2-y1 + A = dx*dx + dy*dy + B = 2 * (dx*(x1-cx) + dy*(y1-cy)) + C = pow(x1-cx, 2) + pow(y1-cy, 2) - radius*radius + det = B*B - 4*A*C + if A <= 0.0000001 or det < 0: + return [] + elif det == 0: + # One point of intersection. + t = -B / (2*A) + return [(x1+t*dx, y1+t*dy)] + else: + # Two points of intersection. + # A point of intersection lies on the line segment if 0 <= t <= 1, + # and on an extension of the segment otherwise. + points = [] + det2 = sqrt(det) + t1 = (-B+det2) / (2*A) + t2 = (-B-det2) / (2*A) + if infinite or 0 <= t1 <= 1: points.append((x1+t1*dx, y1+t1*dy)) + if infinite or 0 <= t2 <= 1: points.append((x1+t2*dx, y1+t2*dy)) + return points + +def intersection(*args, **kwargs): + if len(args) == 8: + return line_line_intersection(*args, **kwargs) + if len(args) == 7: + return circle_line_intersection(*args, **kwargs) + +def point_in_polygon(points, x, y): + """ Ray casting algorithm. + Determines how many times a horizontal ray starting from the point + intersects with the sides of the polygon. + If it is an even number of times, the point is outside, if odd, inside. + The algorithm does not always report correctly when the point is very close to the boundary. + The polygon is passed as a list of (x,y)-tuples. + """ + odd = False + n = len(points) + for i in range(n): + j = i= y) or (y1 < y and y0 >= y): + if x0 + (y-y0) / (y1-y0) * (x1-x0) < x: + odd = not odd + return odd + +#===================================================================================================== + +#--- AFFINE TRANSFORM -------------------------------------------------------------------------------- + +def superformula(m, n1, n2, n3, phi): + """ A generalization of the superellipse first proposed by Johan Gielis. + It can be used to describe many complex shapes and curves that are found in nature. + """ + if n1 == 0: + return (0,0) + a = 1.0 + b = 1.0 + r = pow(pow(abs(cos(m * phi/4) / a), n2) + \ + pow(abs(sin(m * phi/4) / b), n3), 1/n1) + if abs(r) == 0: + return (0,0) + r = 1 / r + return (r*cos(phi), r*sin(phi)) + +# Fast C implementation: +try: from nglgeometry import superformula +except: + pass + +#===================================================================================================== + +#--- AFFINE TRANSFORM -------------------------------------------------------------------------------- +# Based on http://www.senocular.com/flash/tutorials/transformmatrix/ + +class AffineTransform: + + def __init__(self, transform=None): + """ A geometric transformation in Euclidean space (i.e. 2D) + that preserves collinearity and ratio of distance between points. + Linear transformations include rotation, translation, scaling, shear. + """ + if isinstance(transform, AffineTransform): + self.matrix = list(transform.matrix) + else: + self.matrix = self.identity + + def copy(self): + return AffineTransform(self) + + def prepend(self, transform): + self.matrix = self._mmult(self.matrix, transform.matrix) + def append(self, transform): + self.matrix = self._mmult(transform.matrix, self.matrix) + + concat = append + + def _mmult(self, a, b): + """ Returns the 3x3 matrix multiplication of A and B. + Note that scale(), translate(), rotate() work with premultiplication, + e.g. the matrix A followed by B = BA and not AB. + """ + # No need to optimize (C version is just as fast). + return [ + a[0]*b[0] + a[1]*b[3], + a[0]*b[1] + a[1]*b[4], + 0, + a[3]*b[0] + a[4]*b[3], + a[3]*b[1] + a[4]*b[4], + 0, + a[6]*b[0] + a[7]*b[3] + b[6], + a[6]*b[1] + a[7]*b[4] + b[7], + 1 + ] + + def invert(self): + """ Multiplying a matrix by its inverse produces the identity matrix. + """ + m = self.matrix + d = m[0]*m[4] - m[1]*m[3] + self.matrix = [ + m[4]/d, -m[1]/d, 0, + -m[3]/d, m[0]/d, 0, + (m[3]*m[7]-m[4]*m[6])/d, + -(m[0]*m[7]-m[1]*m[6])/d, + 1 + ] + + @property + def inverse(self): + m = self.copy(); m.invert(); return m; + + @property + def identity(self): + return [1,0,0, 0,1,0, 0,0,1] + + @property + def rotation(self): + return (degrees(atan2(self.matrix[1], self.matrix[0])) + 360) % 360 # 0.0 => 360.0 + + def scale(self, x, y=None): + if y==None: y = x + self.matrix = self._mmult([x,0,0, 0,y,0, 0,0,1], self.matrix) + + def translate(self, x, y): + self.matrix = self._mmult([1,0,0, 0,1,0, x,y,1], self.matrix) + + def rotate(self, degrees=0, radians=0): + radians = degrees and degrees*pi/180 or radians + c = cos(radians) + s = sin(radians) + self.matrix = self._mmult([c,s,0, -s,c,0, 0,0,1], self.matrix) + + def transform_point(self, x, y): + """ Returns the new coordinates of (x,y) after transformation. + """ + m = self.matrix + return (x*m[0]+y*m[3]+m[6], x*m[1]+y*m[4]+m[7]) + + apply = transform_point + + def transform_path(self, path): + """ Returns a BezierPath object with the transformation applied. + """ + p = path.__class__() # Create a new BezierPath. + for pt in path: + if pt.cmd == "close": + p.closepath() + elif pt.cmd == "moveto": + p.moveto(*self.apply(pt.x, pt.y)) + elif pt.cmd == "lineto": + p.lineto(*self.apply(pt.x, pt.y)) + elif pt.cmd == "curveto": + vx1, vy1 = self.apply(pt.ctrl1.x, pt.ctrl1.y) + vx2, vy2 = self.apply(pt.ctrl2.x, pt.ctrl2.y) + x, y = self.apply(pt.x, pt.y) + p.curveto(vx1, vy1, vx2, vy2, x, y) + return p + + # Compatibility with NodeBox. + transformPoint = transform_point + transformBezierPath = transform_path + + def map(self, points): + return [self.apply(*pt) for pt in points] + +Transform = AffineTransform + +#===================================================================================================== + +#--- POINT ------------------------------------------------------------------------------------------- + +class Point(object): + + def __init__(self, x=0, y=0): + self.x = x + self.y = y + + def _get_xy(self): + return (self.x, self.y) + def _set_xy(self, (x,y)): + self.x = x + self.y = y + + xy = property(_get_xy, _set_xy) + + def __iter__(self): + return iter((self.x, self.y)) + + def __repr__(self): + return "Point(x=%.1f, y=%.1f)" % (self.x, self.y) + + def __eq__(self, pt): + if not isinstance(pt, Point): return False + return self.x == pt.x \ + and self.y == pt.y + + def __ne__(self, pt): + return not self.__eq__(pt) + +#--- BOUNDS ------------------------------------------------------------------------------------------ + +class Bounds: + + def __init__(self, x, y, width, height): + """ Creates a bounding box. + The bounding box is an untransformed rectangle that encompasses a shape or group of shapes. + """ + # context.Layer does not always have a width or height defined (i.e. infinite layer): + if width == None: width = INFINITE + if height == None: height = INFINITE + # Normalize if width or height is negative: + if width < 0: x, width = x+width, -width + if height < 0: y, height = y+height, -height + self.x = x + self.y = y + self.width = width + self.height = height + + def copy(self): + return Bounds(self.x, self.y, self.width, self.height) + + def __iter__(self): + """ You can conveniently unpack bounds: x,y,w,h = Bounds(0,0,100,100) + """ + return iter((self.x, self.y, self.width, self.height)) + + def intersects(self, b): + """ Return True if a part of the two bounds overlaps. + """ + return max(self.x, b.x) < min(self.x+self.width, b.x+b.width) \ + and max(self.y, b.y) < min(self.y+self.height, b.y+b.height) + + def intersection(self, b): + """ Returns bounds that encompass the intersection of the two. + If there is no overlap between the two, None is returned. + """ + if not self.intersects(b): + return None + mx, my = max(self.x, b.x), max(self.y, b.y) + return Bounds(mx, my, + min(self.x+self.width, b.x+b.width) - mx, + min(self.y+self.height, b.y+b.height) - my) + + def union(self, b): + """ Returns bounds that encompass the union of the two. + """ + # Note: this will also work with ghost points. + # Bounds(20, 20, 5, 5).union(Bounds(100, 100, 0, 0)) => Bounds(20, 20, 100, 100). + mx, my = min(self.x, b.x), min(self.y, b.y) + return Bounds(mx, my, + max(self.x+self.width, b.x+b.width) - mx, + max(self.y+self.height, b.y+b.height) - my) + + def contains(self, *a): + """ Returns True if the given point or rectangle falls within the bounds. + """ + if len(a) == 2: a = [Point(a[0], a[1])] + if len(a) == 1: + a = a[0] + if isinstance(a, Point): + return a.x >= self.x and a.x <= self.x+self.width \ + and a.y >= self.y and a.y <= self.y+self.height + if isinstance(a, Bounds): + return a.x >= self.x and a.x+a.width <= self.x+self.width \ + and a.y >= self.y and a.y+a.height <= self.y+self.height + + def __eq__(self, b): + if not isinstance(b, Bounds): + return False + return self.x == b.x \ + and self.y == b.y \ + and self.width == b.width \ + and self.height == b.height + + def __ne__(self, b): + return not self.__eq__(b) + + def __repr__(self): + return "Bounds(%.1f, %.1f, %.1f, %.1f)" % (self.x, self.y, self.width, self.height) + +#===================================================================================================== + +#--- TESSELLATION ------------------------------------------------------------------------------------ +# OpenGL can only display simple convex polygons directly. +# A polygon is simple if the edges intersect only at vertices, there are no duplicate vertices, +# and exactly two edges meet at any vertex. +# Polygons containing holes or polygons with intersecting edges must first be subdivided +# into simple convex polygons before they can be displayed. +# Such subdivision is called tessellation. + +# Algorithm adopted from Squirtle: +# +# Copyright (c) 2008 Martin O'Leary. +# +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name(s) of the copyright holders nor the names of its contributors may be used to +# endorse or promote products derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from sys import platform +from ctypes import CFUNCTYPE, POINTER, byref, cast, pointer +from ctypes import CFUNCTYPE as _CFUNCTYPE +from pyglet.gl import \ + GLdouble, GLvoid, GLenum, GLfloat, \ + gluNewTess, gluTessProperty, gluTessNormal, gluTessCallback, gluTessVertex, \ + gluTessBeginPolygon, gluTessEndPolygon, \ + gluTessBeginContour, gluTessEndContour, \ + GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO, \ + GLU_TESS_VERTEX, GLU_TESS_BEGIN, GLU_TESS_END, GLU_TESS_ERROR, GLU_TESS_COMBINE, \ + GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_TRIANGLES, GL_LINE_LOOP + +if platform == "win32": + from ctypes import WINFUNCTYPE as CFUNCTYPE + +_tessellator = gluNewTess() + +# Winding rule determines the regions that should be filled and those that should remain unshaded. +# Winding direction is determined by the normal. +gluTessProperty(_tessellator, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO) +gluTessNormal(_tessellator, 0, 0, 1) + +# As tessellation proceeds, callback routines are called in a manner +# similar to OpenGL commands glBegin(), glEdgeFlag*(), glVertex*(), and glEnd(). +# The callback functions must be C functions so we need to cast our Python callbacks to C. +_tessellate_callback_type = { + GLU_TESS_VERTEX : CFUNCTYPE(None, POINTER(GLvoid)), + GLU_TESS_BEGIN : CFUNCTYPE(None, GLenum), + GLU_TESS_END : CFUNCTYPE(None), + GLU_TESS_ERROR : CFUNCTYPE(None, GLenum), + GLU_TESS_COMBINE : CFUNCTYPE(None, + POINTER(GLdouble), + POINTER(POINTER(GLvoid)), + POINTER(GLfloat), + POINTER(POINTER(GLvoid))) +} + +# One path with a 100 points is somewhere around 15KB. +TESSELLATION_CACHE = 100 + +class TessellationError(Exception): + pass + +class Tessellate(list): + """ Tessellation state that stores data from the callback functions + while tessellate() is processing. + """ + def __init__(self): + self.cache = {} # Cache of previously triangulated contours + self.queue = [] # Latest contours appear at the end of the list. + self.reset() + def clear(self): + list.__init__(self, []) # Populated during _tessellate_vertex(). + def reset(self): + self.clear() + self.mode = None # GL_TRIANGLE_FAN | GL_TRIANGLE_STRIP | GL_TRIANGLES. + self.triangles = [] # After tessellation, contains lists of (x,y)-vertices, + self._combined = [] # which can be drawn with glBegin(GL_TRIANGLES) mode. + +_tessellate = Tessellate() + +def _tessellate_callback(type): + # Registers a C version of a Python callback function for gluTessCallback(). + def _C(function): + f = _tessellate_callback_type[type](function) + gluTessCallback(_tessellator, type, cast(f, _CFUNCTYPE(None))) + return f + return _C + +@_tessellate_callback(GLU_TESS_BEGIN) +def _tessellate_begin(mode): + # Called to indicate the start of a triangle. + _tessellate.mode = mode + +@_tessellate_callback(GLU_TESS_VERTEX) +def _tessellate_vertex(vertex): + # Called to define the vertices of triangles created by the tessellation. + _tessellate.append(list(cast(vertex, POINTER(GLdouble))[0:2])) + +@_tessellate_callback(GLU_TESS_END) +def _tessellate_end(): + # Called to indicate the end of a primitive. + # GL_TRIANGLE_FAN defines triangles with a same origin (pt1). + if _tessellate.mode in (GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP): + pt1 = _tessellate.pop(0) + pt2 = _tessellate.pop(0) + while _tessellate: + pt3 = _tessellate.pop(0) + _tessellate.triangles.extend([pt1, pt2, pt3]) + if _tessellate.mode == GL_TRIANGLE_STRIP: + pt1 = pt2 + pt2 = pt3 + elif _tessellate.mode == GL_TRIANGLES: + _tessellate.triangles.extend(_tessellate) + elif _tessellate.mode == GL_LINE_LOOP: + pass + _tessellate.mode = None + _tessellate.clear() + +@_tessellate_callback(GLU_TESS_COMBINE) +def _tessellate_combine(coords, vertex_data, weights, dataOut): + # Called when the tessellation detects an intersection. + x, y, z = coords[0:3] + data = (GLdouble * 3)(x, y, z) + dataOut[0] = cast(pointer(data), POINTER(GLvoid)) + _tessellate._combined.append(data) + +@_tessellate_callback(GLU_TESS_ERROR) +def _tessellate_error(code): + # Called when an error occurs. + e, s, i = gluErrorString(code), "", 0 + while e[i]: + s += chr(e[i]) + i += 1 + raise TessellationError, s + +_cache = {} + +def tessellate(contours): + """ Returns a list of triangulated (x,y)-vertices from the given list of path contours, + where each contour is a list of (x,y)-tuples. + The vertices can be drawn with GL_TRIANGLES to render a complex polygon, for example: + glBegin(GL_TRIANGLES) + for x, y in tessellate(contours): + glVertex3f(x, y, 0) + glEnd() + """ + id = repr(contours) + if id in _tessellate.cache: + return _tessellate.cache[id] + # Push the given contours to C and call gluTessVertex(). + _tessellate.reset() + contours = [[(GLdouble * 3)(x, y, 0) for x, y in points] for points in contours] + gluTessBeginPolygon(_tessellator, None) + for vertices in contours: + gluTessBeginContour(_tessellator) + for v in vertices: + gluTessVertex(_tessellator, v, v) + gluTessEndContour(_tessellator) + gluTessEndPolygon(_tessellator) + # Update the tessellation cache with the results. + if len(_tessellate.cache) > TESSELLATION_CACHE: + del _tessellate.cache[_tessellate.queue.pop(0)] + _tessellate.queue.append(id) + _tessellate.cache[id] = _tessellate.triangles + return _tessellate.triangles + +tesselate = tessellate # Common spelling error. diff --git a/nodeboxgl/graphics/noise.py b/nodeboxgl/graphics/noise.py new file mode 100644 index 0000000..ba56393 --- /dev/null +++ b/nodeboxgl/graphics/noise.py @@ -0,0 +1,72 @@ +from random import random +from math import floor + +class PerlinNoise: + + def __init__(self, permutation=None): + """ Initializes a Perlin noise generator with the given permutation pattern, + which is a list of 256 integers between 0-255. + """ + if not permutation: + permutation = [random()*256 for i in range(256)] + self._init([int(x) for x in permutation] * 2) + + def _init(self, p): + self._p = p + def _fade(self, t): + return t * t * t * (t * (t * 6 - 15) + 10) + def _lerp(self, t, a, b): + return a + t * (b - a) + def _grad(self, hash, x, y, z): + u, v, h = x, y, hash & 15 + if h >= 8: u = y + if h >= 4: + v = x + if h != 12 and h != 14: v = z + if (h&1) != 0: u = -u + if (h&2) != 0: v = -v + return u + v + + def generate(self, x, y=0, z=0): + """ Returns a smooth value between -1.0 and 1.0. + The x, y, z parameters determine the coordinates in the noise landscape. + Since the landscape is infinite, the actual value of a coordinate doesn't matter, + only the distance between successive steps. + The smaller the difference between steps, the smoother the noise sequence. + Steps between 0.005 and 0.1 usually work best. + """ + lerp, grad, fade, p = self._lerp, self._grad, self._fade, self._p + # Find unit cuve that contains point (x,y,z). + X = int(floor(x)) & 255 + Y = int(floor(y)) & 255 + Z = int(floor(z)) & 255 + # Find relative (x,y,z) of point in cube. + # Compute fade curves. + x, y, z = x-floor(x), y-floor(y), z-floor(z) + u, v, w = fade(x), fade(y), fade(z) + # Hash coordinates of the cube corners. + A = Y + p[X] + B = Y + p[X+1] + AA, AB, BA, BB = Z+p[A], Z+p[A+1], Z+p[B], Z+p[B+1] + # Add blended results from the cube corners. + return lerp(w, + lerp(v, lerp(u, grad(p[AA ], x , y , z ), + grad(p[BA ], x-1, y , z )), + lerp(u, grad(p[AB ], x , y-1, z ), + grad(p[BB ], x-1, y-1, z ))), + lerp(v, lerp(u, grad(p[AA+1], x , y , z-1), + grad(p[BA+1], x-1, y , z-1)), + lerp(u, grad(p[AB+1], x , y-1, z-1), + grad(p[BB+1], x-1, y-1, z-1)))) + +try: + # Fast C implementations: + from nglnoise import init, generate + PerlinNoise._init = init + PerlinNoise.generate = generate +except: + pass + +_generator = PerlinNoise() +def noise(x, y=0, z=0): + return _generator.generate(x, y, z) diff --git a/nodeboxgl/graphics/physics.py b/nodeboxgl/graphics/physics.py new file mode 100644 index 0000000..174fcd5 --- /dev/null +++ b/nodeboxgl/graphics/physics.py @@ -0,0 +1,1976 @@ +#=== PHYSICS ========================================================================================= +# 2D physics functions. +# Authors: Tom De Smedt, Giorgio Olivero +# License: BSD (see LICENSE.txt for details). +# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) +# http://cityinabottle.org/nodebox + +# This module can benefit greatly from loading psyco. + +from math import sqrt, pow +from math import sin, cos, atan2, degrees, radians, pi +from random import random +from heapq import heappush, heappop +from warnings import warn + +# float("inf") doesn't work on windows. +INFINITE = 1e20 + +# This module is standalone, line(), ellipse() and Text.draw() +# must be either implemented or patched: +def line(x1, y1, x2, y2, stroke=(0,0,0,1), strokewidth=1): + pass +def ellipse(x, y, width, height, fill=(0,0,0,1), stroke=None, strokewidth=1): + pass + +class Text: + def __init__(self, string, **kwargs): + self.string = string + self.__dict__.update(kwargs) + def copy(self): + k = self.__dict__.copy() + k.pop("string") + return Text(self.string, **k) + def draw(self): + pass + +#===================================================================================================== + +#--- VECTOR ------------------------------------------------------------------------------------------ +# A Euclidean vector (sometimes called a geometric or spatial vector, or - as here - simply a vector) +# is a geometric object that has both a magnitude (or length) and direction. +# A vector is frequently represented by a line segment with an arrow. + +class Vector(object): + + def __init__(self, x=0, y=0, z=0, length=None, angle=None): + """ A vector represents a direction and a magnitude (or length). + Vectors can be added, subtracted, multiplied, divided, flipped, and 2D rotated. + Vectors are used in physics to represent velocity and acceleration. + """ + self.x = float(x) + self.y = float(y) + self.z = float(z) + if length is not None: + self.length = length + if angle is not None: + self.angle = angle + + def copy(self): + return Vector(self.x, self.y, self.z) + + def __getitem__(self, i): + return (self.x, self.y, self.z)[i] + def __setitem__(self, i, v): + setattr(self, ("x", "y", "z")[i], float(v)) + + def _get_xyz(self): + return (self.x, self.y, self.z) + def _set_xyz(self, (x,y,z)): + self.x = float(x) + self.y = float(y) + self.z = float(z) + xyz = property(_get_xyz, _set_xyz) + + def _get_xy(self): + return (self.x, self.y) + def _set_xy(self, (x,y)): + self.x = float(x) + self.y = float(y) + xy = property(_get_xy, _set_xy) + + def _get_length(self): + return sqrt(self.x**2 + self.y**2 + self.z**2) + def _set_length(self, n): + d = self.length or 1 + self.x *= n/d + self.y *= n/d + self.z *= n/d + length = magnitude = property(_get_length, _set_length) + + def distance(self, v): + """ Returns the distance between two vectors, + e.g. if two vectors would be two sides of a triangle, returns the third side. + """ + dx = v.x - self.x + dy = v.y - self.y + dz = v.z - self.z + return sqrt(dx**2 + dy**2 + dz**2) + + def distance2(self, v): + # Squared distance, avoiding the costly root calculation. + return (v.x-self.x)**2 + (v.y-self.y)**2 + (v.z-self.z)**2 + + def normalize(self): + """ Normalizes the vector to a unit vector with length=1. + """ + d = self.length or 1 + self.x /= d + self.y /= d + self.z /= d + + def _normalized(self): + """ Yields a new vector that is the normalized vector of this vector. + """ + d = self.length + if d == 0: + return self.copy() + return Vector(self.x/d, self.y/d, self.z/d) + normalized = unit = property(_normalized) + + def reverse(self): + """ Reverses the direction of the vector so it points in the opposite direction. + """ + self.x = -self.x + self.y = -self.y + self.z = -self.z + flip = reverse + + def _reversed(self): + """ Yields a new vector pointing in the opposite direction of this vector. + """ + return Vector(-self.x, -self.y, -self.z) + reversed = flipped = inverse = property(_reversed) + + # v.normal, v.angle, v.rotate(), v.rotated() and v.angle_to() are defined in 2D. + # v.in2D.rotate() is here for decorational purposes. + @property + def in2D(self): + return self + + def _orthogonal(self): + """ Yields a new vector whose 2D angle is 90 degrees (perpendicular) to this vector. + In 3D, there would be many perpendicular vectors. + """ + return Vector(self.y, -self.x, self.z) + orthogonal = perpendicular = normal = property(_orthogonal) + + def _get_angle(self): + """ Yields the 2D direction of the vector. + """ + return degrees(atan2(self.y, self.x)) + def _set_angle(self, degrees): + d = self.length + self.x = cos(radians(degrees)) * d + self.y = sin(radians(degrees)) * d + angle = direction = property(_get_angle, _set_angle) + + def rotate(self, degrees): + """ Rotates the direction of the vector in 2D. + """ + self.angle += degrees + + def rotated(self, degrees): + """ Returns a copy of the vector with direction rotated in 2D. + """ + v = self.copy() + v.rotate(degrees) + return v + + def angle_to(self, v): + """ Returns the 2D angle between two vectors. + """ + return degrees(atan2(v.y, v.x) - atan2(self.y, self.x)) + angle_between = angle_to + + # Arithmetic operators. + # + - * / returns new vector objects. + def __add__(self, v): + if isinstance(v, (int, float)): + return Vector(self.x+v, self.y+v, self.z+v) + return Vector(self.x+v.x, self.y+v.y, self.z+v.z) + def __sub__(self, v): + if isinstance(v, (int, float)): + return Vector(self.x-v, self.y-v, self.z-v) + return Vector(self.x-v.x, self.y-v.y, self.z-v.z) + def __mul__(self, v): + if isinstance(v, (int, float)): + return Vector(self.x*v, self.y*v, self.z*v) + return Vector(self.x*v.x, self.y*v.y, self.z*v.z) + def __div__(self, v): + if isinstance(v, (int, float)): + return Vector(self.x/v, self.y/v, self.z/v) + return Vector(self.x/v.x, self.y/v.y, self.z/v.z) + + # += -= *= /= modify the vector coordinates in-place. + def __iadd__(self, v): + if isinstance(v, (int, float)): + self.x+=v; self.y+=v; self.z+=v; return self + self.x+=v.x; self.y+=v.y; self.z+=v.z; return self + def __isub__(self, v): + if isinstance(v, (int, float)): + self.x-=v; self.y-=v; self.z-=v; return self + self.x-=v.x; self.y-=v.y; self.z-=v.z; return self + def __imul__(self, v): + if isinstance(v, (int, float)): + self.x*=v; self.y*=v; self.z*=v; return self + self.x*=v.x; self.y*=v.y; self.z*=v.z; return self + def __idiv__(self, v): + if isinstance(v, (int, float)): + self.x/=v; self.y/=v; self.z/=v; return self + self.x/=v.x; self.y/=v.y; self.z/=v.z; return self + + def dot(self, v): + """ Returns a scalar that is the dot product between the two vectors. + """ + return self.x*v.x + self.y*v.y + self.z*v.z + + def cross(self, v): + """ Returns a new vector that is the cross product between the two vectors. + """ + return Vector(self.y*v.z - self.z*v.y, + self.z*v.x - self.x*v.z, + self.x*v.y - self.y*v.x) + + def __neg__(self): + return Vector(-self.x, -self.y, -self.z) + + def __eq__(self, v): + return isinstance(v, Vector) and self.x == v.x and self.y == v.y and self.z == v.z + def __ne__(self, v): + return not self.__eq__(v) + + def __repr__(self): + return "%s(%.2f, %.2f, %.2f)" % (self.__class__.__name__, self.x, self.y, self.z) + + def draw(self, x, y): + """ Draws the vector in 2D (z-axis is ignored). + Set stroke() and strokewidth() first. + """ + ellipse(x, y, 4, 4) + line(x, y, x+self.x, y+self.y) + +#===================================================================================================== + +#--- FLOCKING ---------------------------------------------------------------------------------------- +# Boids is an artificial life program, developed by Craig Reynolds in 1986, +# which simulates the flocking behavior of birds. +# Boids is an example of emergent behavior, the complexity of Boids arises +# from the interaction of individual agents adhering to a set of simple rules: +# - separation: steer to avoid crowding local flockmates, +# - alignment: steer towards the average heading of local flockmates, +# - cohesion: steer to move toward the average position of local flockmates. +# Unexpected behavior, such as splitting flocks and reuniting after avoiding obstacles, +# can be considered emergent. The boids framework is often used in computer graphics, +# providing realistic-looking representations of flocks of birds and other creatures, +# such as schools of fish or herds of animals. + +_UID = 0 +def _uid(): + global _UID; _UID+=1; return _UID + +class Boid: + + def __init__(self, flock, x=0, y=0, z=0, sight=70, space=30): + """ An agent in a flock with an (x,y,z)-position subject to different forces. + - sight : radius of local flockmates when calculating cohesion and alignment. + - space : radius of personal space when calculating separation. + """ + self._id = _uid() + self.flock = flock + self.x = x + self.y = y + self.z = z + self.velocity = Vector(random()*2-1, random()*2-1, random()*2-1) + self.target = None # A target Vector towards which the boid will steer. + self.sight = sight # The radius of cohesion and alignment, and visible obstacles. + self.space = space # The radius of separation. + self.dodge = False # Avoiding an obstacle? + self.crowd = 0 # Percentage (0.0-1.0) of flockmates within sight. + + def __eq__(self, other): + # Comparing boids by id makes it significantly faster. + return isinstance(other, Boid) and self._id == other._id + def __ne__(self, other): + return not self.__eq__(other) + + def copy(self): + b = Boid(self.flock, self.x, self.y, self.z, self.sight, self.space) + b.velocity = self.velocity.copy() + b.target = self.target + return b + + @property + def heading(self): + """ The boid's heading as an angle in degrees. + """ + return self.velocity.angle + + @property + def depth(self): + """ The boid's relative depth (0.0-1.0) in the flock's container box. + """ + return not self.flock.depth and 1.0 or max(0.0, min(1.0, self.z / self.flock.depth)) + + def near(self, boid, distance=50): + """ Returns True if the given boid is within distance. + """ + # Distance is measured in a box instead of a sphere for performance. + return abs(self.x - boid.x) < distance and \ + abs(self.y - boid.y) < distance and \ + abs(self.z - boid.z) < distance + + def separation(self, distance=25): + """ Returns steering velocity (vx,vy,vz) to avoid crowding local flockmates. + """ + vx = vy = vz = 0.0 + for b in self.flock: + if b != self: + if abs(self.x-b.x) < distance: vx += self.x - b.x + if abs(self.y-b.y) < distance: vy += self.y - b.y + if abs(self.z-b.z) < distance: vz += self.z - b.z + return vx, vy, vz + + def alignment(self, distance=50): + """ Returns steering velocity (vx,vy,vz) towards the average heading of local flockmates. + """ + vx = vy = vz = n = 0.0 + for b in self.flock: + if b != self and b.near(self, distance): + vx += b.velocity.x + vy += b.velocity.y + vz += b.velocity.z; n += 1 + if n: + return (vx/n-self.velocity.x), (vy/n-self.velocity.y), (vz/n-self.velocity.z) + return vx, vy, vz + + def cohesion(self, distance=40): + """ Returns steering velocity (vx,vy,vz) towards the average position of local flockmates. + """ + vx = vy = vz = n = 0.0 + for b in self.flock: + if b != self and b.near(self, distance): + vx += b.x + vy += b.y + vz += b.z; n += 1 + # Calculate percentage of flockmates within sight. + self.crowd = float(n) / (len(self.flock) or 1) + if n: + return (vx/n-self.x), (vy/n-self.y), (vz/n-self.z) + return vx, vy, vz + + def avoidance(self): + """ Returns steering velocity (vx,vy,0) to avoid 2D obstacles. + The boid is not guaranteed to avoid collision. + """ + vx = vy = 0.0 + self.dodge = False + for o in self.flock.obstacles: + dx = o.x - self.x + dy = o.y - self.y + d = sqrt(dx**2 + dy**2) # Distance to obstacle. + s = (self.sight + o.radius) # Visibility range. + if d < s: + self.dodge = True + # Force grows exponentially from 0.0 to 1.0, + # where 1.0 means the boid touches the obstacle circumference. + f = (d-o.radius) / (s-o.radius) + f = (1-f)**2 + if d < o.radius: + f *= 4 + #self.velocity.reverse() + vx -= dx * f + vy -= dy * f + return (vx, vy, 0) + + def limit(self, speed=10.0): + """ Limits the boid's velocity (the boid can momentarily go very fast). + """ + v = self.velocity + m = max(abs(v.x), abs(v.y), abs(v.z)) or 1 + if abs(v.x) > speed: v.x = v.x / m * speed + if abs(v.y) > speed: v.y = v.y / m * speed + if abs(v.z) > speed: v.z = v.z / m * speed + + def update(self, separation=0.2, cohesion=0.2, alignment=0.6, avoidance=0.6, target=0.2, limit=15.0): + """ Updates the boid's velocity based on the cohesion, separation and alignment forces. + - separation: force that keeps boids apart. + - cohesion : force that keeps boids closer together. + - alignment : force that makes boids move in the same direction. + - avoidance : force that steers the boid away from obstacles. + - target : force that steers the boid towards a target vector. + - limit : maximum velocity. + """ + f = 0.1 + m1, m2, m3, m4, m5 = separation*f, cohesion*f, alignment*f, avoidance*f, target*f + vx1, vy1, vz1 = self.separation(self.space) + vx2, vy2, vz2 = self.cohesion(self.sight) + vx3, vy3, vz3 = self.alignment(self.sight) + vx4, vy4, vz4 = self.avoidance() + vx5, vy5, vz5 = self.target and ( + (self.target.x-self.x), + (self.target.y-self.y), + (self.target.z-self.z)) or (0,0,0) + self.velocity.x += m1*vx1 + m2*vx2 + m3*vx3 + m4*vx4 + m5*vx5 + self.velocity.y += m1*vy1 + m2*vy2 + m3*vy3 + m4*vy4 + m5*vy5 + self.velocity.z += m1*vz1 + m2*vz2 + m3*vz3 + m4*vz4 + m5*vz5 + self.velocity.z = self.flock.depth and self.velocity.z or 0 # No z-axis for Flock.depth=0 + self.limit(speed=limit) + self.x += self.velocity.x + self.y += self.velocity.y + self.z += self.velocity.z + + def seek(self, vector): + """ Sets the given Vector as the boid's target. + """ + self.target = vector + + def __repr__(self): + return "Boid(x=%.1f, y=%.1f, z=%.1f)" % (self.x, self.y, self.z) + +class Obstacle: + + def __init__(self, x=0, y=0, z=0, radius=10): + """ An obstacle with an (x, y, z) position and a radius. + Boids will steer around obstacles that the flock is aware of, and that they can see. + """ + self.x = x + self.y = y + self.z = z + self.radius = radius + + def copy(self): + return Obstacle(self.x, self.y, self.z, self.radius) + + def __repr__(self): + return "Obstacle(x=%.1f, y=%.1f, z=%.1f, radius=%.1f)" % (self.x, self.y, self.z, self.radius) + +class Flock(list): + + def __init__(self, amount, x, y, width, height, depth=100.0, obstacles=[]): + """ A flock of the given amount of boids, confined to a box. + Obstacles can be added to Flock.obstacles (boids will steer away from them). + """ + self.x = x + self.y = y + self.width = width + self.height = height + self.depth = depth + self.scattered = False + self.gather = 0.05 + self.obstacles = [] + for i in range(amount): + # Boids will originate from the center of the flocking area. + b = Boid(self, + self.x + 0.5 * (width or 0), + self.y + 0.5 * (height or 0), + 0.5 * (depth or 0)) + self.append(b) + + @property + def boids(self): + return self + + def copy(self): + f = Flock(0, self.x, self.y, self.width, self.height, self.depth) + f.scattered = self.scattered + f.gather = self.gather + f.obstacles = [o.copy() for o in self.obstacles] + for b in self: + f.append(b.copy()) + return f + + def seek(self, target): + """ Sets the target vector of all boids in the flock (None for no target). + """ + for b in self: + b.seek(target) + + def sight(self, distance): + for b in self: + b.sight = distance + + def space(self, distance): + for b in self: + b.space = distance + + def constrain(self, force=1.0, teleport=False): + """ Keep the flock inside the rectangular flocking area. + The given force determines how fast the boids will swivel when near an edge. + Alternatively, with teleport=True boids that cross a 2D edge teleport to the opposite side. + """ + f = 5 + def _teleport(b): + if b.x < self.x: + b.x = self.x + self.width + if b.x > self.x + self.width: + b.x = self.x + if b.y < self.y: + b.y = self.y + self.height + if b.y > self.y + self.height: + b.y = self.y + def _constrain(b): + if b.x < self.x: + b.velocity.x += force * f * random() + if b.x > self.x + self.width: + b.velocity.x -= force * f * random() + if b.y < self.y: + b.velocity.y += force * f * random() + if b.y > self.y + self.height: + b.velocity.y -= force * f * random() + for b in self: + if b.z < 0: + b.velocity.z += force * f * random() + if b.z > self.depth: + b.velocity.z -= force * f * random() + teleport and _teleport(b) \ + or _constrain(b) + + def scatter(self, gather=0.05): + """ Scatters the flock, until Flock.scattered=False. + Flock.gather is the chance (0.0-1.0, or True/False) that the flock will reunite by itself. + """ + self.scattered = True + self.gather = gather + + def update(self, separation=0.2, cohesion=0.2, alignment=0.6, avoidance=0.6, target=0.2, limit=15.0, constrain=1.0, teleport=False): + """ Updates the boid velocities based on the given forces. + Different forces elicit different flocking behavior; fine-tuning them can be delicate. + """ + if self.scattered: + # When scattered, make the boid cohesion negative and diminish alignment. + self.scattered = (random() > self.gather) + cohesion = -0.01 + alignment *= 0.25 + for b in self: + b.update(separation, cohesion, alignment, avoidance, target, limit) + self.constrain(force=constrain, teleport=teleport) + + def by_depth(self): + """ Returns the boids in the flock sorted by depth (z-axis). + """ + return sorted(self, key=lambda boid: boid.z) + + def __repr__(self): + return "Flock(%s)" % repr(list(self)) + +flock = Flock + +#=== SYSTEM ========================================================================================== +# A computer graphics technique to simulate certain fuzzy phenomena, +# which are otherwise very hard to reproduce with conventional rendering techniques: +# fire, explosions, smoke, moving water, sparks, falling leaves, clouds, fog, snow, dust, +# meteor tails, hair, fur, grass, or abstract visual effects like glowing trails, magic spells. + +#--- FORCE ------------------------------------------------------------------------------------------- + +class Force: + + def __init__(self, particle1, particle2, strength=1.0, threshold=100.0): + """ An attractive or repulsive force that causes objects with a mass to accelerate. + A negative strength indicates an attractive force. + """ + self.particle1 = particle1 + self.particle2 = particle2 + self.strength = strength + self.threshold = threshold + + def apply(self): + """ Applies the force between two particles, based on the distance and mass of the particles. + """ + # Distance has a minimum threshold to keep forces from growing too large, + # e.g. distance 100 divides force by 10000, distance 5 only by 25. + # Decreasing the threshold moves particles that are very close to each other away faster. + dx = self.particle2.x - self.particle1.x + dy = self.particle2.y - self.particle1.y + d = sqrt(dx*dx + dy*dy) + d = max(d, self.threshold) + # The force between particles increases according to their weight. + # The force decreases as distance between them increases. + f = 10.0 * -self.strength * self.particle1.mass * self.particle2.mass + f = f / (d*d) + fx = f * dx / d + fy = f * dy / d + self.particle1.force.x += fx + self.particle1.force.y += fy + self.particle2.force.x -= fx + self.particle2.force.y -= fy + + def __repr__(self): + return "Force(strength=%.2f)" % self.strength + +force = Force + +#--- SPRING ------------------------------------------------------------------------------------------ + +class Spring: + + def __init__(self, particle1, particle2, length, strength=1.0): + """ A force that exerts attractive resistance when its length changes. + A spring acts as a flexible (but secure) connection between two particles. + """ + self.particle1 = particle1 + self.particle2 = particle2 + self.strength = strength + self.length = length + self.snapped = False + + def snap(self): + """ Breaks the connection between the two particles. + """ + self.snapped = True + + def apply(self): + """ Applies the force between two particles. + """ + # Distance between two particles. + dx = self.particle2.x - self.particle1.x + dy = self.particle2.y - self.particle1.y + d = sqrt(dx*dx + dy*dy) + if d == 0: + return + # The attractive strength decreases for heavy particles. + # The attractive strength increases when the spring is stretched. + f = 10.0 * self.strength / (self.particle1.mass * self.particle2.mass) + f = f * (d - self.length) + fx = f * dx / d + fy = f * dy / d + self.particle1.force.x += fx + self.particle1.force.y += fy + self.particle2.force.x -= fx + self.particle2.force.y -= fy + + def draw(self, **kwargs): + line(self.particle1.x, self.particle1.y, + self.particle2.x, self.particle2.y, **kwargs) + + def __repr__(self): + return "Spring(strength='%.2f', length='%.2f')" % (self.strength, self.length) + +spring = Spring + +#--- PARTICLE ---------------------------------------------------------------------------------------- + +MASS = "mass" + +class Particle: + + def __init__(self, x, y, velocity=(0.0,0.0), mass=10.0, radius=10.0, life=None, fixed=False): + """ An object with a mass subjected to attractive and repulsive forces. + The object's velocity is an inherent force (e.g. a rocket propeller to escape gravity). + """ + self._id = _uid() + self.x = x + random() + self.y = y + random() + self.mass = mass + self.radius = radius == MASS and mass or radius + self.velocity = isinstance(velocity, tuple) and Vector(*velocity) or velocity + self.force = Vector(0.0, 0.0) # Force accumulator. + self.life = life + self._age = 0.0 + self.dead = False + self.fixed = fixed + + @property + def age(self): + # Yields the particle's age as a number between 0.0 and 1.0. + return self.life and min(1.0, float(self._age) / self.life) or 0.0 + + def draw(self, **kwargs): + r = self.radius * (1 - self.age) + ellipse(self.x, self.y, r*2, r*2, **kwargs) + + def __eq__(self, other): + return isinstance(other, Particle) and self._id == other._id + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "Particle(x=%.1f, y=%.1f, radius=%.1f, mass=%.1f)" % ( + self.x, self.y, self.radius, self.mass) + +particle = Particle + +#--- SYSTEM ------------------------------------------------------------------------------------------ + +class flist(list): + + def __init__(self, system): + # List of forces or springs that keeps System.dynamics in synch. + self.system = system + + def insert(self, i, force): + list.insert(self, i, force) + self.system._dynamics.setdefault(force.particle1._id, []).append(force) + self.system._dynamics.setdefault(force.particle2._id, []).append(force) + def append(self, force): + self.insert(len(self), force) + def extend(self, forces): + for f in forces: self.append(f) + + def pop(self, i): + f = list.pop(self, i) + self.system._dynamics.pop(force.particle1._id) + self.system._dynamics.pop(force.particle2._id) + return f + def remove(self, force): + i = self.index(force); self.pop(i) + +class System(object): + + def __init__(self, gravity=(0,0), drag=0.0): + """ A collection of particles and the forces working on them. + """ + self.particles = [] + self.emitters = [] + self.forces = flist(self) + self.springs = flist(self) + self.gravity = isinstance(gravity, tuple) and Vector(*gravity) or gravity + self.drag = drag + self._dynamics = {} # Particle id linked to list of applied forces. + + def __len__(self): + return len(self.particles) + def __iter__(self): + return iter(self.particles) + def __getitem__(self, i): + return self.particles[i] + + def extend(self, x): + for x in x: self.append(x) + def append(self, x): + if isinstance(x, Particle) and not x in self.particles: + self.particles.append(x) + elif isinstance(x, Force): + self.forces.append(x) + elif isinstance(x, Spring): + self.springs.append(x) + elif isinstance(x, Emitter): + self.emitters.append(x) + self.extend(x.particles) + x.system = self + + def _cross(self, f=lambda particle1, particle2: None, source=None, particles=[]): + # Applies function f to any two given particles in the list, + # or between source and any other particle if source is given. + P = particles or self.particles + for i, p1 in enumerate(P): + if source is None: + [f(p1, p2) for p2 in P[i+1:]] + else: + f(source, p1) + + def force(self, strength=1.0, threshold=100, source=None, particles=[]): + """ The given force is applied between each two particles. + The effect this yields (with a repulsive force) is an explosion. + - source: one vs. all, apply the force to this particle with all others. + - particles: a list of particles to apply the force to (some vs. some or some vs. source). + Be aware that 50 particles wield yield 1250 forces: O(n**2/2); or O(n) with source. + The force is applied to particles present in the system, + those added later on are not subjected to the force. + """ + f = lambda p1, p2: self.forces.append(Force(p1, p2, strength, threshold)) + self._cross(f, source, particles) + + def dynamics(self, particle, type=None): + """ Returns a list of forces working on the particle, optionally filtered by type (e.g. Spring). + """ + F = self._dynamics.get(isinstance(particle, Particle) and particle._id or particle, []) + F = [f for f in F if type is None or isinstance(f, type)] + return F + + def limit(self, particle, m=None): + """ Limits the movement of the particle to m. + When repulsive particles are close to each other, their force can be very high. + This results in large movement steps, and gaps in the animation. + This can be remedied by limiting the total force. + """ + # The right way to do it requires 4x sqrt(): + # if m and particle.force.length > m: + # particle.force.length = m + # if m and particle.velocity.length > m: + # particle.velocity.length = m + if m is not None: + for f in (particle.force, particle.velocity): + if abs(f.x) > m: + f.y *= m / abs(f.x) + f.x *= m / abs(f.x) + if abs(f.y) > m: + f.x *= m / abs(f.y) + f.y *= m / abs(f.y) + + def update(self, limit=30): + """ Updates the location of the particles by applying all the forces. + """ + for e in self.emitters: + # Fire particles from emitters. + e.update() + for p in self.particles: + # Apply gravity. Heavier objects have a stronger attraction. + p.force.x = 0 + p.force.y = 0 + p.force.x += 0.1 * self.gravity.x * p.mass + p.force.y += 0.1 * -self.gravity.y * p.mass + for f in self.forces: + # Apply attractive and repulsive forces between particles. + if not f.particle1.dead and \ + not f.particle2.dead: + f.apply() + for s in self.springs: + # Apply spring forces between particles. + if not s.particle1.dead and \ + not s.particle2.dead and \ + not s.snapped: + s.apply() + for p in self.particles: + if not p.fixed: + # Apply drag. + p.velocity.x *= 1.0 - min(1.0, self.drag) + p.velocity.y *= 1.0 - min(1.0, self.drag) + # Apply velocity. + p.force.x += p.velocity.x + p.force.y += p.velocity.y + # Limit the accumulated force and update the particle's position. + self.limit(p, limit) + p.x += p.force.x + p.y += p.force.y + if p.life: + # Apply lifespan. + p._age += 1 + p.dead = p._age > p.life + + @property + def dead(self): + # Yields True when all particles are dead (and we don't need to update anymore). + for p in self.particles: + if not p.dead: return False + return True + + def draw(self, **kwargs): + """ Draws the system at the current iteration. + """ + for s in self.springs: + if not s.particle1.dead and \ + not s.particle2.dead and \ + not s.snapped: + s.draw(**kwargs) + for p in self.particles: + if not p.dead: + p.draw(**kwargs) + + def __repr__(self): + return "System(particles=%i, forces=%i, springs=%i)" % \ + (len(self.particles), len(self.forces), len(self.springs)) + +system = System + +# Notes: +# While this system is interesting for many effects, it is unstable. +# If for example very strong springs are applied, particles will start "shaking". +# This is because the forces are simply added to the particle's position instead of integrated. +# See also: +# http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/particle/ +# http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/particle/particlelib.c + +#def euler_derive(particle, dt=0.1): +# particle.x += particle.velocity.x * dt +# particle.y += particle.velocity.y * dt +# particle.velocity.x += particle.force.x / particle.mass * dt +# particle.velocity.y += particle.force.y / particle.mass * dt + +# If this is applied, springs will need a velocity dampener: +#fx = f + 0.01 + (self.particle2.velocity.x - self.particle1.velocity.x) * dx / d +#fy = f + 0.01 + (self.particle2.velocity.y - self.particle1.velocity.y) * dy / d + +# In pure Python this is slow, since only 1/10 of the force is applied each System.update(). + +#--- EMITTER ----------------------------------------------------------------------------------------- + +class Emitter(object): + + def __init__(self, x, y, angle=0, strength=1.0, spread=10): + """ A source that shoots particles in a given direction with a given strength. + """ + self.system = None # Set when appended to System. + self.particles = [] + self.x = x + self.y = y + self.velocity = Vector(1, 1, length=strength, angle=angle) + self.spread = spread # Angle-of-view. + self._i = 0 # Current iteration. + + def __len__(self): + return len(self.particles) + def __iter__(self): + return iter(self.particles) + def __getitem__(self, i): + return self.particles[i] + + def extend(self, x, life=100): + for x in x: self.append(x, life) + def append(self, particle, life=100): + particle.life = particle.life or life + particle._age = particle.life + particle.dead = True + self.particles.append(particle) + if self.system is not None: + # Also append the particle to the system the emitter is part of. + self.system.append(particle) + + def _get_angle(self): + return self.velocity.angle + def _set_angle(self, v): + self.velocity.angle = v + + angle = property(_get_angle, _set_angle) + + def _get_strength(self): + return self.velocity.length + def _set_strength(self, v): + self.velocity.length = max(v, 0.01) + + strength = length = magnitude = property(_get_strength, _set_strength) + + def update(self): + """ Update the system and respawn dead particles. + When a particle dies, it can be reused as a new particle fired from the emitter. + This is more efficient than creating a new Particle object. + """ + self._i += 1 # Respawn occurs gradually. + p = self.particles[self._i % len(self.particles)] + if p.dead: + p.x = self.x + p.y = self.y + p.velocity = self.velocity.rotated(self.spread * 0.5 * (random()*2-1)) + p._age = 0 + p.dead = False + +emitter = Emitter + +#=== GRAPH =========================================================================================== +# Graph visualization is a way of representing information as diagrams of abstract graphs and networks. +# Automatic graph drawing has many important applications in software engineering, +# database and web design, networking, and in visual interfaces for many other domains. + +#--- NODE -------------------------------------------------------------------------------------------- + +def deepcopy(o): + # A color can be represented as a tuple or as a nodeboxgl.graphics.Color object, + # in which case it needs to be copied by invoking Color.copy(). + if o is None: + return o + if hasattr(o, "copy"): + return o.copy() + if isinstance(o, (basestring, bool, int, float, long, complex)): + return o + if isinstance(o, (list, tuple, set)): + return o.__class__(deepcopy(v) for v in o) + if isinstance(o, dict): + return dict((deepcopy(k), deepcopy(v)) for k,v in o.iteritems()) + raise Exception, "don't know how to copy %s" % o.__class__.__name__ + +class Node(object): + + def __init__(self, id="", radius=5, **kwargs): + """ A node with a unique id in the graph. + Node.id is drawn as a text label, unless optional parameter text=False. + Optional parameters include: fill, stroke, strokewidth, text, font, fontsize, fontweight. + """ + self.graph = None + self.links = Links() + self.id = id + self._x = 0.0 # Calculated by Graph.layout.update(). + self._y = 0.0 # Calculated by Graph.layout.update(). + self.force = Vector(0.0, 0.0) + self.radius = radius + self.fixed = kwargs.pop("fixed", False) + self.fill = kwargs.pop("fill", None) + self.stroke = kwargs.pop("stroke", (0,0,0,1)) + self.strokewidth = kwargs.pop("strokewidth", 1) + self.text = kwargs.get("text", True) and \ + Text(isinstance(id, unicode) and id or str(id).decode("utf-8", "ignore"), + width = 85, + fill = kwargs.pop("text", (0,0,0,1)), + fontsize = kwargs.pop("fontsize", 11), **kwargs) or None + self._weight = None # Calculated by Graph.eigenvector_centrality(). + self._centrality = None # Calculated by Graph.betweenness_centrality(). + + @property + def _distance(self): + # Graph.distance controls the (x,y) spacing between nodes. + return self.graph and float(self.graph.distance) or 1.0 + + def _get_x(self): + return self._x * self._distance + def _get_y(self): + return self._y * self._distance + def _set_x(self, v): + self._x = v / self._distance + def _set_y(self, v): + self._y = v / self._distance + + x = property(_get_x, _set_x) + y = property(_get_y, _set_y) + + @property + def edges(self): + """ Yields a list of edges from/to the node. + """ + return self.graph is not None \ + and [e for e in self.graph.edges if self.id in (e.node1.id, e.node2.id)] \ + or [] + + @property + def weight(self): + """ Yields eigenvector centrality as a number between 0.0-1.0. + """ + if self.graph and self._weight is None: + self.graph.eigenvector_centrality() + return self._weight + + @property + def centrality(self): + """ Yields betweenness centrality as a number between 0.0-1.0. + """ + if self.graph and self._centrality is None: + self.graph.betweenness_centrality() + return self._centrality + + def flatten(self, depth=1, traversable=lambda node, edge: True, _visited=None): + """ Recursively lists the node and nodes linked to it. + Depth 0 returns a list with the node. + Depth 1 returns a list with the node and all the directly linked nodes. + Depth 2 includes the linked nodes' links, and so on. + """ + _visited = _visited or {} + _visited[self.id] = (self, depth) + if depth >= 1: + for n in self.links: + if n.id not in _visited or _visited[n.id][1] < depth-1: + if traversable(self, self.links.edges[n.id]): + n.flatten(depth-1, traversable, _visited) + return [n for n,d in _visited.values()] # Fast, but not order-preserving. + + def draw(self, weighted=False): + """ Draws the node as a circle with the given radius, fill, stroke and strokewidth. + Draws the node centrality as a shadow effect when weighted=True. + Draws the node text label. + Override this method in a subclass for custom drawing. + """ + # Draw the node weight as a shadow (based on node betweenness centrality). + if weighted is not False and self.centrality > (weighted==True and -1 or weighted): + w = self.centrality * 35 + ellipse( + self.x, + self.y, + self.radius*2 + w, + self.radius*2 + w, fill=(0,0,0,0.2), stroke=None) + # Draw the node. + ellipse( + self.x, + self.y, + self.radius*2, + self.radius*2, fill=self.fill, stroke=self.stroke, strokewidth=self.strokewidth) + # Draw the node text label. + if self.text: + self.text.draw( + self.x + self.radius, + self.y + self.radius) + + def contains(self, x, y): + """ Returns True if the given coordinates (x, y) are inside the node radius. + """ + return abs(self.x - x) < self.radius*2 and \ + abs(self.y - y) < self.radius*2 + + def __repr__(self): + return "%s(id=%s)" % (self.__class__.__name__, repr(self.id)) + + def __eq__(self, node): + return isinstance(node, Node) and self.id == node.id + def __ne__(self, node): + return not self.__eq__(node) + +class Links(list): + + def __init__(self): + """ A list in which each node has an associated edge. + The edge() method returns the edge for a given node id. + """ + self.edges = dict() + + def append(self, node, edge=None): + if node.id not in self.edges: + list.append(self, node) + self.edges[node.id] = edge + + def remove(self, node): + list.remove(self, node) + self.edges.pop(node.id, None) + + def edge(self, node): + return self.edges.get(isinstance(node, Node) and node.id or node) + +#--- EDGE -------------------------------------------------------------------------------------------- + +coordinates = lambda x, y, d, a: (x + d*cos(radians(a)), y + d*sin(radians(a))) + +class Edge(object): + + def __init__(self, node1, node2, weight=0.0, length=1.0, type=None, stroke=(0,0,0,1), strokewidth=1): + """ A connection between two nodes. + Its weight indicates the importance (not the cost) of the connection. + Its type is useful in a semantic network (e.g. "is-a", "is-part-of", ...) + """ + self.node1 = node1 + self.node2 = node2 + self._weight = weight + self.length = length + self.type = type + self.stroke = stroke + self.strokewidth = strokewidth + + def _get_weight(self): + return self._weight + def _set_weight(self, v): + self._weight = v + # Clear cached adjacency map in the graph, since edge weights have changed. + if self.node1.graph is not None: + self.node1.graph._adjacency = None + if self.node2.graph is not None: + self.node2.graph._adjacency = None + + weight = property(_get_weight, _set_weight) + + def draw(self, weighted=False, directed=False): + """ Draws the edge as a line with the given stroke and strokewidth (increased with Edge.weight). + Override this method in a subclass for custom drawing. + """ + w = weighted and self.weight or 0 + line( + self.node1.x, + self.node1.y, + self.node2.x, + self.node2.y, stroke=self.stroke, strokewidth=self.strokewidth+w) + if directed: + self.draw_arrow(stroke=self.stroke, strokewidth=self.strokewidth+w) + + def draw_arrow(self, **kwargs): + """ Draws the direction of the edge as an arrow on the rim of the receiving node. + """ + x0, y0 = self.node1.x, self.node1.y + x1, y1 = self.node2.x, self.node2.y + # Find the edge's angle based on node1 and node2 position. + a = degrees(atan2(y1-y0, x1-x0)) + # The arrow points to node2's rim instead of it's center. + r = self.node2.radius + d = sqrt(pow(x1-x0, 2) + pow(y1-y0, 2)) + x01, y01 = coordinates(x0, y0, d-r-1, a) + # Find the two other arrow corners under the given angle. + r = max(kwargs.get("strokewidth", 1) * 3, 6) + dx1, dy1 = coordinates(x01, y01, -r, a-20) + dx2, dy2 = coordinates(x01, y01, -r, a+20) + line(x01, y01, dx1, dy1, **kwargs) + line(x01, y01, dx2, dy2, **kwargs) + line(dx1, dy1, dx2, dy2, **kwargs) + + def __repr__(self): + return "%s(id1=%s, id2=%s)" % (self.__class__.__name__, repr(self.node1.id), repr(self.node2.id)) + +#--- GRAPH ------------------------------------------------------------------------------------------- + +# Return value of Graph.shortest_paths(). +# Dictionary values can be accessed by Node as well as by node id. +class nodedict(dict): + def __init__(self, graph, *args, **kwargs): + dict.__init__(self, *args, **kwargs) + self.graph = graph + def __contains__(self, node): + return dict.__contains__(self, self.graph.get(node, node)) + def __getitem__(self, node): + return dict.__getitem__(self, isinstance(node, Node) and node or self.graph[node]) + def get(self, node, default=None): + return dict.get(self, self.graph.get(node, node), default) + +def unique(list): + u, b = [], {} + for item in list: + if item not in b: u.append(item); b[item]=True + return u + +# Graph layouts: +SPRING = "spring" + +# Graph node sort order: +WEIGHT, CENTRALITY = "weight", "centrality" + +ALL = "all" + +class Graph(dict): + + def __init__(self, layout=SPRING, distance=10.0): + """ A network of nodes connected by edges that can be drawn with a given layout. + """ + self.nodes = [] # List of Node objects. + self.edges = [] # List of Edge objects. + self.root = None + self._adjacency = None # Cached adjacency() dict. + self.layout = layout==SPRING and GraphSpringLayout(self) or GraphLayout(self) + self.distance = distance + + def __getitem__(self, id): + try: + return dict.__getitem__(self, id) + except KeyError: + raise KeyError, "no node with id '%s' in graph" % id + + def append(self, base, *args, **kwargs): + """ Appends a Node or Edge to the graph: Graph.append(Node, id="rabbit"). + """ + kwargs["base"] = base + if issubclass(base, Node): + return self.add_node(*args, **kwargs) + if issubclass(base, Edge): + return self.add_edge(*args, **kwargs) + + def add_node(self, id, *args, **kwargs): + """ Appends a new Node to the graph. + An optional base parameter can be used to pass a subclass of Node. + """ + n = kwargs.pop("base", Node) + n = isinstance(id, Node) and id or self.get(id) or n(id, *args, **kwargs) + if n.id not in self: + self.nodes.append(n) + self[n.id] = n; n.graph = self + self.root = kwargs.get("root", False) and n or self.root + # Clear adjacency cache. + self._adjacency = None + return n + + def add_edge(self, id1, id2, *args, **kwargs): + """ Appends a new Edge to the graph. + An optional base parameter can be used to pass a subclass of Edge: + Graph.add_edge("cold", "winter", base=IsPropertyOf) + """ + # Create nodes that are not yet part of the graph. + n1 = self.add_node(id1) + n2 = self.add_node(id2) + # Creates an Edge instance. + # If an edge (in the same direction) already exists, yields that edge instead. + e1 = n1.links.edge(n2) + if e1 and e1.node1 == n1 and e1.node2 == n2: + return e1 + e2 = kwargs.pop("base", Edge) + e2 = e2(n1, n2, *args, **kwargs) + self.edges.append(e2) + # Synchronizes Node.links: + # A.links.edge(B) yields edge A->B + # B.links.edge(A) yields edge B->A + n1.links.append(n2, edge=e2) + n2.links.append(n1, edge=e1 or e2) + # Clear adjacency cache. + self._adjacency = None + return e2 + + def remove(self, x): + """ Removes the given Node (and all its edges) or Edge from the graph. + Note: removing Edge a->b does not remove Edge b->a. + """ + if isinstance(x, Node) and x.id in self: + self.pop(x.id) + self.nodes.remove(x); x.graph = None + # Remove all edges involving the given node. + for e in list(self.edges): + if x in (e.node1, e.node2): + if x in e.node1.links: e.node1.links.remove(x) + if x in e.node2.links: e.node2.links.remove(x) + self.edges.remove(e) + if isinstance(x, Edge): + self.edges.remove(x) + # Clear adjacency cache. + self._adjacency = None + + def node(self, id): + """ Returns the node in the graph with the given id. + """ + return self.get(id) + + def edge(self, id1, id2): + """ Returns the edge between the nodes with given id1 and id2. + """ + return id1 in self and id2 in self and self[id1].links.edge(id2) or None + + def paths(self, node1, node2, length=4, path=[]): + """ Returns a list of paths (shorter than or equal to given length) connecting the two nodes. + """ + if not isinstance(node1, Node): + node1 = self[node1] + if not isinstance(node2, Node): + node2 = self[node2] + return [[self[id] for id in p] for p in paths(self, node1.id, node2.id, length, path)] + + def shortest_path(self, node1, node2, heuristic=None, directed=False): + """ Returns a list of nodes connecting the two nodes. + """ + if not isinstance(node1, Node): + node1 = self[node1] + if not isinstance(node2, Node): + node2 = self[node2] + try: + p = dijkstra_shortest_path(self, node1.id, node2.id, heuristic, directed) + p = [self[id] for id in p] + return p + except IndexError: + return None + + def shortest_paths(self, node, heuristic=None, directed=False): + """ Returns a dictionary of nodes, each linked to a list of nodes (shortest path). + """ + if not isinstance(node, Node): + node = self[node] + p = nodedict(self) + for id, path in dijkstra_shortest_paths(self, node.id, heuristic, directed).iteritems(): + p[self[id]] = path and [self[id] for id in path] or None + return p + + def eigenvector_centrality(self, normalized=True, reversed=True, rating={}, iterations=100, tolerance=0.0001): + """ Calculates eigenvector centrality and returns a node => weight dictionary. + Node.weight is updated in the process. + Node.weight is higher for nodes with a lot of (indirect) incoming traffic. + """ + ec = eigenvector_centrality(self, normalized, reversed, rating, iterations, tolerance) + ec = nodedict(self, ((self[id], w) for id, w in ec.iteritems())) + for n, w in ec.iteritems(): + n._weight = w + return ec + + def betweenness_centrality(self, normalized=True, directed=False): + """ Calculates betweenness centrality and returns a node => weight dictionary. + Node.centrality is updated in the process. + Node.centrality is higher for nodes with a lot of passing traffic. + """ + bc = brandes_betweenness_centrality(self, normalized, directed) + bc = nodedict(self, ((self[id], w) for id, w in bc.iteritems())) + for n, w in bc.iteritems(): + n._centrality = w + return bc + + def sorted(self, order=WEIGHT, threshold=0.0): + """ Returns a list of nodes sorted by WEIGHT or CENTRALITY. + Nodes with a lot of traffic will be at the start of the list. + """ + o = lambda node: getattr(node, order) + nodes = ((o(n), n) for n in self.nodes if o(n) >= threshold) + nodes = reversed(sorted(nodes)) + return [n for w, n in nodes] + + def prune(self, depth=0): + """ Removes all nodes with less or equal links than depth. + """ + for n in (n for n in self.nodes if len(n.links) <= depth): + self.remove(n) + + def fringe(self, depth=0): + """ For depth=0, returns the list of leaf nodes (nodes with only one connection). + For depth=1, returns the list of leaf nodes and their connected nodes, and so on. + """ + u = []; [u.extend(n.flatten(depth)) for n in self.nodes if len(n.links) == 1] + return unique(u) + + @property + def density(self): + """ Yields the number of edges vs. the maximum number of possible edges. + For example, <0.35 => sparse, >0.65 => dense, 1.0 => complete. + """ + return 2.0*len(self.edges) / (len(self.nodes) * (len(self.nodes)-1)) + + @property + def is_complete(self): + return self.density == 1.0 + @property + def is_dense(self): + return self.density > 0.65 + @property + def is_sparse(self): + return self.density < 0.35 + + def split(self): + """ Returns the list of unconnected subgraphs. + """ + return partition(self) + + def update(self, iterations=10, **kwargs): + """ Graph.layout.update() is called the given number of iterations. + """ + for i in range(iterations): + self.layout.update(**kwargs) + + def draw(self, weighted=False, directed=False): + """ Draws all nodes and edges. + """ + for e in self.edges: + e.draw(weighted, directed) + for n in reversed(self.nodes): # New nodes (with Node._weight=None) first. + n.draw(weighted) + + def node_at(self, x, y): + """ Returns the node at (x,y) or None. + """ + for n in self.nodes: + if n.contains(x, y): return n + + def _add_node_copy(self, n, **kwargs): + # Magical fairy dust to copy subclasses of Node. + # We assume that the subclass constructor takes an optional "text" parameter + # (Text objects in NodeBox for OpenGL's implementation are expensive). + try: + new = self.add_node(n.id, root=kwargs.get("root",False), text=False) + except TypeError: + new = self.add_node(n.id, root=kwargs.get("root",False)) + new.__class__ = n.__class__ + new.__dict__.update((k, deepcopy(v)) for k,v in n.__dict__.iteritems() + if k not in ("graph", "links", "_x", "_y", "force", "_weight", "_centrality")) + + def _add_edge_copy(self, e, **kwargs): + if kwargs.get("node1", e.node1).id not in self \ + or kwargs.get("node2", e.node2).id not in self: + return + new = self.add_edge( + kwargs.get("node1", self[e.node1.id]), + kwargs.get("node2", self[e.node2.id])) + new.__class__ = e.__class__ + new.__dict__.update((k, deepcopy(v)) for k,v in e.__dict__.iteritems() + if k not in ("node1", "node2")) + + def copy(self, nodes=ALL): + """ Returns a copy of the graph with the given list of nodes (and connecting edges). + The layout will be reset. + """ + g = Graph(layout=None, distance=self.distance) + g.layout = self.layout.copy(graph=g) + for n in (nodes==ALL and self.nodes or (isinstance(n, Node) and n or self[n] for n in nodes)): + g._add_node_copy(n, root=self.root==n) + for e in self.edges: + g._add_edge_copy(e) + return g + +#--- GRAPH LAYOUT ------------------------------------------------------------------------------------ +# Graph drawing or graph layout, as a branch of graph theory, +# applies topology and geometry to derive two-dimensional representations of graphs. + +class GraphLayout: + + def __init__(self, graph): + """ Calculates node positions iteratively when GraphLayout.update() is called. + """ + self.graph = graph + self.iterations = 0 + + def update(self): + self.iterations += 1 + + def reset(self): + self.iterations = 0 + for n in self.graph.nodes: + n._x = 0 + n._y = 0 + n.force = Vector(0,0) + + @property + def bounds(self): + """ Returns a (x, y, width, height)-tuple of the approximate layout dimensions. + """ + x0, y0 = +INFINITE, +INFINITE + x1, y1 = -INFINITE, -INFINITE + for n in self.graph.nodes: + if (n.x < x0): x0 = n.x + if (n.y < y0): y0 = n.y + if (n.x > x1): x1 = n.x + if (n.y > y1): y1 = n.y + return (x0, y0, x1-x0, y1-y0) + + def copy(self, graph): + return GraphLayout(self, graph) + +class GraphSpringLayout(GraphLayout): + + def __init__(self, graph): + """ A force-based layout in which edges are regarded as springs. + The forces are applied to the nodes, pulling them closer or pushing them apart. + """ + # Based on: http://snipplr.com/view/1950/graph-javascript-framework-version-001/ + GraphLayout.__init__(self, graph) + self.k = 4.0 # Force constant. + self.force = 0.01 # Force multiplier. + self.repulsion = 15 # Maximum repulsive force radius. + + def _distance(self, node1, node2): + # Yields a tuple with distances (dx, dy, d, d**2). + # Ensures that the distance is never zero (which deadlocks the animation). + dx = node2._x - node1._x + dy = node2._y - node1._y + d2 = dx*dx + dy*dy + if d2 < 0.01: + dx = random() * 0.1 + 0.1 + dy = random() * 0.1 + 0.1 + d2 = dx*dx + dy*dy + return dx, dy, sqrt(d2), d2 + + def _repulse(self, node1, node2): + # Updates Node.force with the repulsive force. + dx, dy, d, d2 = self._distance(node1, node2) + if d < self.repulsion: + f = self.k**2 / d2 + node2.force.x += f * dx + node2.force.y += f * dy + node1.force.x -= f * dx + node1.force.y -= f * dy + + def _attract(self, node1, node2, weight=0, length=1.0): + # Updates Node.force with the attractive edge force. + dx, dy, d, d2 = self._distance(node1, node2) + d = min(d, self.repulsion) + f = (d2 - self.k**2) / self.k * length + f *= weight * 0.5 + 1 + f /= d + node2.force.x -= f * dx + node2.force.y -= f * dy + node1.force.x += f * dx + node1.force.y += f * dy + + def update(self, weight=10.0, limit=0.5): + """ Updates the position of nodes in the graph. + The weight parameter determines the impact of edge weight. + The limit parameter determines the maximum movement each update(). + """ + GraphLayout.update(self) + # Forces on all nodes due to node-node repulsions. + for i, n1 in enumerate(self.graph.nodes): + for j, n2 in enumerate(self.graph.nodes[i+1:]): + self._repulse(n1, n2) + # Forces on nodes due to edge attractions. + for e in self.graph.edges: + self._attract(e.node1, e.node2, weight*e.weight, 1.0/(e.length or 0.01)) + # Move nodes by given force. + for n in self.graph.nodes: + if not n.fixed: + n._x += max(-limit, min(self.force * n.force.x, limit)) + n._y += max(-limit, min(self.force * n.force.y, limit)) + n.force.x = 0 + n.force.y = 0 + + def copy(self, graph): + g = GraphSpringLayout(graph) + g.k, g.force, g.repulsion = self.k, self.force, self.repulsion + return g + +#--- GRAPH TRAVERSAL --------------------------------------------------------------------------------- + +def depth_first_search(node, visit=lambda node: False, traversable=lambda node, edge: True, _visited=None): + """ Visits all the nodes connected to the given root node, depth-first. + The visit function is called on each node. + Recursion will stop if it returns True, and subsequently dfs() will return True. + The traversable function takes the current node and edge, + and returns True if we are allowed to follow this connection to the next node. + For example, the traversable for directed edges is follows: + lambda node, edge: node == edge.node1 + """ + stop = visit(node) + _visited = _visited or {} + _visited[node.id] = True + for n in node.links: + if stop: return True + if traversable(node, node.links.edge(n)) is False: continue + if not n.id in _visited: + stop = depth_first_search(n, visit, traversable, _visited) + return stop + +dfs = depth_first_search; + +def breadth_first_search(node, visit=lambda node: False, traversable=lambda node, edge: True): + """ Visits all the nodes connected to the given root node, breadth-first. + """ + q = [node] + _visited = {} + while q: + node = q.pop(0) + if not node.id in _visited: + if visit(node): + return True + q.extend((n for n in node.links if traversable(node, node.links.edge(n)) is not False)) + _visited[node.id] = True + return False + +bfs = breadth_first_search; + +def paths(graph, id1, id2, length=4, path=[], _root=True): + """ Returns a list of paths from node with id1 to node with id2. + Only paths shorter than or equal to the given length are included. + Uses a brute-force DFS approach (performance drops exponentially for longer paths). + """ + if len(path) >= length: + return [] + if id1 not in graph: + return [] + if id1 == id2: + return [path + [id1]] + path = path + [id1] + p = [] + s = set(path) # 5% speedup. + for node in graph[id1].links: + if node.id not in s: + p.extend(paths(graph, node.id, id2, length, path, False)) + return _root and sorted(p, key=len) or p + +def edges(path): + """ Returns an iterator of Edge objects for the given list of nodes. + It yields None where two successive nodes are not connected. + """ + # For example, the distance (i.e., edge weight sum) of a path: + # sum(e.weight for e in edges(path)) + return len(path) > 1 and (n.links.edge(path[i+1]) for i,n in enumerate(path[:-1])) or iter(()) + +#--- GRAPH THEORY ------------------------------------------------------------------------------------ + +def adjacency(graph, directed=False, reversed=False, stochastic=False, heuristic=None): + """ Returns a dictionary indexed by node id1's, + in which each value is a dictionary of connected node id2's linking to the edge weight. + If directed=True, edges go from id1 to id2, but not the other way. + If stochastic=True, all the weights for the neighbors of a given node sum to 1. + A heuristic function can be given that takes two node id's and returns + an additional cost for movement between the two nodes. + """ + # Caching a heuristic from a method won't work. + # Bound method objects are transient, + # i.e., id(object.method) returns a new value each time. + if graph._adjacency is not None and \ + graph._adjacency[1:] == (directed, reversed, stochastic, heuristic and id(heuristic)): + return graph._adjacency[0] + map = {} + for n in graph.nodes: + map[n.id] = {} + for e in graph.edges: + id1, id2 = not reversed and (e.node1.id, e.node2.id) or (e.node2.id, e.node1.id) + map[id1][id2] = 1.0 - 0.5 * e.weight + if heuristic: + map[id1][id2] += heuristic(id1, id2) + if not directed: + map[id2][id1] = map[id1][id2] + if stochastic: + for id1 in map: + n = sum(map[id1].values()) + for id2 in map[id1]: + map[id1][id2] /= n + # Cache the adjacency map: this makes dijkstra_shortest_path() 2x faster in repeated use. + graph._adjacency = (map, directed, reversed, stochastic, heuristic and id(heuristic)) + return map + +def dijkstra_shortest_path(graph, id1, id2, heuristic=None, directed=False): + """ Dijkstra algorithm for finding the shortest path between two nodes. + Returns a list of node id's, starting with id1 and ending with id2. + Raises an IndexError between nodes on unconnected graphs. + """ + # Based on: Connelly Barnes, http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/119466 + def flatten(list): + # Flattens a linked list of the form [0,[1,[2,[]]]] + while len(list) > 0: + yield list[0]; list=list[1] + G = adjacency(graph, directed=directed, heuristic=heuristic) + q = [(0, id1, ())] # Heap of (cost, path_head, path_rest). + visited = set() # Visited nodes. + while True: + (cost1, n1, path) = heappop(q) + if n1 not in visited: + visited.add(n1) + if n1 == id2: + return list(flatten(path))[::-1] + [n1] + path = (n1, path) + for (n2, cost2) in G[n1].iteritems(): + if n2 not in visited: + heappush(q, (cost1 + cost2, n2, path)) + +def dijkstra_shortest_paths(graph, id, heuristic=None, directed=False): + """ Dijkstra algorithm for finding the shortest paths from the given node to all other nodes. + Returns a dictionary of node id's, each linking to a list of node id's (i.e., the path). + """ + # Based on: Dijkstra's algorithm for shortest paths modified from Eppstein. + # Based on: NetworkX 1.4.1: Aric Hagberg, Dan Schult and Pieter Swart. + # This is 5x faster than: + # for n in g: dijkstra_shortest_path(g, id, n.id) + W = adjacency(graph, directed=directed, heuristic=heuristic) + Q = [] # Use Q as a heap with (distance, node id)-tuples. + D = {} # Dictionary of final distances. + P = {} # Dictionary of paths. + P[id] = [id] + seen = {id: 0} + heappush(Q, (0, id)) + while Q: + (dist, v) = heappop(Q) + if v in D: continue + D[v] = dist + for w in W[v].iterkeys(): + vw_dist = D[v] + W[v][w] + if w not in D and (w not in seen or vw_dist < seen[w]): + seen[w] = vw_dist + heappush(Q, (vw_dist, w)) + P[w] = P[v] + [w] + for n in graph: + if n not in P: P[n]=None + return P + +def floyd_warshall_all_pairs_distance(graph, heuristic=None, directed=False): + """ Floyd-Warshall's algorithm for finding the path length for all pairs for nodes. + Returns a dictionary of node id's, + each linking to a dictionary of node id's linking to path length. + """ + from collections import defaultdict # Requires Python 2.5+. + g = graph.keys() + d = defaultdict(lambda: defaultdict(lambda: 1e30)) # float('inf') + p = defaultdict(dict) # Predecessors. + for e in graph.edges: + u = e.node1.id + v = e.node2.id + w = 1.0 - 0.5 * e.weight + w = heuristic and heuristic(u, v) + w or w + d[u][v] = min(w, d[u][v]) + d[u][u] = 0 + p[u][v] = u + if not directed: + d[v][u] = min(w, d[v][u]) + p[v][u] = v + for w in g: + dw = d[w] + for u in g: + du, duw = d[u], d[u][w] + for v in g: + # Performance optimization, assumes d[w][v] > 0. + #if du[v] > duw + dw[v]: + if du[v] > duw and du[v] > duw + dw[v]: + d[u][v] = duw + dw[v] + p[u][v] = p[w][v] + class pdict(dict): + def __init__(self, predecessors, *args, **kwargs): + dict.__init__(self, *args, **kwargs) + self.predecessors = predecessors + return pdict(p, ((u, dict((v, w) for v,w in d[u].iteritems() if w < 1e30)) for u in d)) + +def predecessor_path(tree, u, v): + """ Returns the path between node u and node v as a list of node id's. + The given tree is the return value of floyd_warshall_all_pairs_distance().predecessors. + """ + def _traverse(u, v): + w = tree[u][v] + if w == u: + return [] + return _traverse(u,w) + [w] + _traverse(w,v) + return [u] + _traverse(u,v) + [v] + +def brandes_betweenness_centrality(graph, normalized=True, directed=False): + """ Betweenness centrality for nodes in the graph. + Betweenness centrality is a measure of the number of shortests paths that pass through a node. + Nodes in high-density areas will get a good score. + """ + # Ulrik Brandes, A Faster Algorithm for Betweenness Centrality, + # Journal of Mathematical Sociology 25(2):163-177, 2001, + # http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf + # Based on: Dijkstra's algorithm for shortest paths modified from Eppstein. + # Based on: NetworkX 1.0.1: Aric Hagberg, Dan Schult and Pieter Swart. + # http://python-networkx.sourcearchive.com/documentation/1.0.1/centrality_8py-source.html + W = adjacency(graph, directed=directed) + b = dict.fromkeys(graph, 0.0) + for id in graph: + Q = [] # Use Q as a heap with (distance, node id)-tuples. + D = {} # Dictionary of final distances. + P = {} # Dictionary of paths. + for n in graph: P[n]=[] + seen = {id: 0} + heappush(Q, (0, id, id)) + S = [] + E = dict.fromkeys(graph, 0) # sigma + E[id] = 1.0 + while Q: + (dist, pred, v) = heappop(Q) + if v in D: + continue + D[v] = dist + S.append(v) + E[v] += E[pred] + for w in W[v]: + vw_dist = D[v] + W[v][w] + if w not in D and (w not in seen or vw_dist < seen[w]): + seen[w] = vw_dist + heappush(Q, (vw_dist, v, w)) + P[w] = [v] + E[w] = 0.0 + elif vw_dist == seen[w]: # Handle equal paths. + P[w].append(v) + E[w] += E[v] + d = dict.fromkeys(graph, 0.0) + for w in reversed(S): + for v in P[w]: + d[v] += (1.0 + d[w]) * E[v] / E[w] + if w != id: + b[w] += d[w] + # Normalize between 0.0 and 1.0. + m = normalized and max(b.values()) or 1 + b = dict((id, w/m) for id, w in b.iteritems()) + return b + +def eigenvector_centrality(graph, normalized=True, reversed=True, rating={}, iterations=100, tolerance=0.0001): + """ Eigenvector centrality for nodes in the graph (cfr. Google's PageRank). + Eigenvector centrality is a measure of the importance of a node in a directed network. + It rewards nodes with a high potential of (indirectly) connecting to high-scoring nodes. + Nodes with no incoming connections have a score of zero. + If you want to measure outgoing connections, reversed should be False. + """ + # Based on: NetworkX, Aric Hagberg (hagberg@lanl.gov) + # http://python-networkx.sourcearchive.com/documentation/1.0.1/centrality_8py-source.html + # Note: much faster than betweenness centrality (which grows exponentially). + def normalize(vector): + w = 1.0 / (sum(vector.values()) or 1) + for node in vector: + vector[node] *= w + return vector + G = adjacency(graph, directed=True, reversed=reversed) + v = normalize(dict([(n, random()) for n in graph])) # Node ID => weight vector. + # Eigenvector calculation using the power iteration method: y = Ax. + # It has no guarantee of convergence. + for i in range(iterations): + v0 = v + v = dict.fromkeys(v0.iterkeys(), 0) + for n1 in v: + for n2 in G[n1]: + v[n1] += 0.01 + v0[n2] * G[n1][n2] * rating.get(n1, 1) + normalize(v) + e = sum([abs(v[n]-v0[n]) for n in v]) # Check for convergence. + if e < len(G) * tolerance: + # Normalize between 0.0 and 1.0. + m = normalized and max(v.values()) or 1 + v = dict((id, w/m) for id, w in v.iteritems()) + return v + warn("node weight is 0 because eigenvector_centrality() did not converge.", Warning) + return dict((n, 0) for n in G) + +# a | b => all elements from a and all the elements from b. +# a & b => elements that appear in a as well as in b. +# a - b => elements that appear in a but not in b. +def union(a, b): + return list(set(a) | set(b)) +def intersection(a, b): + return list(set(a) & set(b)) +def difference(a, b): + return list(set(a) - set(b)) + +def partition(graph): + """ Returns a list of unconnected subgraphs. + """ + # Creates clusters of nodes and directly connected nodes. + # Iteratively merges two clusters if they overlap. + g = [] + for n in graph.nodes: + g.append(dict.fromkeys((n.id for n in n.flatten()), True)) + for i in reversed(range(len(g))): + for j in reversed(range(i+1, len(g))): + if g[i] and g[j] and len(intersection(g[i], g[j])) > 0: + g[i] = union(g[i], g[j]) + g[j] = [] + g = [graph.copy(nodes=[graph[id] for id in n]) for n in g if n] + g.sort(lambda a, b: len(b) - len(a)) + return g + +#--- GRAPH THEORY | CLIQUE --------------------------------------------------------------------------- + +def is_clique(graph): + """ A clique is a set of nodes in which each node is connected to all other nodes. + """ + #for n1 in graph.nodes: + # for n2 in graph.nodes: + # if n1 != n2 and graph.edge(n1.id, n2.id) is None: + # return False + return graph.density == 1.0 + +def clique(graph, id): + """ Returns the largest possible clique for the node with given id. + """ + if isinstance(id, Node): + id = id.id + a = [id] + for n in graph.nodes: + try: + # Raises StopIteration if all nodes in the clique are connected to n: + (id for id in a if n.id==id or graph.edge(n.id, id) is None).next() + except StopIteration: + a.append(n.id) + return a + +def cliques(graph, threshold=3): + """ Returns all cliques in the graph with at least the given number of nodes. + """ + a = [] + for n in graph.nodes: + c = clique(graph, n.id) + if len(c) >= threshold: + c.sort() + if c not in a: a.append(c) + return a + +#--- GRAPH MAINTENANCE ------------------------------------------------------------------------------- +# Utility commands for safe linking and unlinking of nodes, +# with respect for the surrounding nodes. + +def unlink(graph, node1, node2=None): + """ Removes the edges between node1 and node2. + If only node1 is given, removes all edges to and from it. + This does not remove node1 from the graph. + """ + if not isinstance(node1, Node): + node1 = graph[node1] + if not isinstance(node2, Node) and node2 is not None: + node2 = graph[node2] + for e in list(graph.edges): + if node1 in (e.node1, e.node2) and node2 in (e.node1, e.node2, None): + graph.edges.remove(e) + try: + node1.links.remove(node2) + node2.links.remove(node1) + except: # 'NoneType' object has no attribute 'links' + pass + +def redirect(graph, node1, node2): + """ Connects all of node1's edges to node2 and unlinks node1. + """ + if not isinstance(node1, Node): + node1 = graph[node1] + if not isinstance(node2, Node): + node2 = graph[node2] + for e in graph.edges: + if node1 in (e.node1, e.node2): + if e.node1 == node1 and e.node2 != node2: + graph._add_edge_copy(e, node1=node2, node2=e.node2) + if e.node2 == node1 and e.node1 != node2: + graph._add_edge_copy(e, node1=e.node1, node2=node2) + unlink(graph, node1) + +def cut(graph, node): + """ Unlinks the given node, but keeps edges intact by connecting the surrounding nodes. + If A, B, C, D are nodes and A->B, B->C, B->D, if we then cut B: A->C, A->D. + """ + if not isinstance(node, Node): + node = graph[node] + for e in graph.edges: + if node in (e.node1, e.node2): + for n in node.links: + if e.node1 == node and e.node2 != n: + graph._add_edge_copy(e, node1=n, node2=e.node2) + if e.node2 == node and e.node1 != n: + graph._add_edge_copy(e, node1=e.node1, node2=n) + unlink(graph, node) + +def insert(graph, node, a, b): + """ Inserts the given node between node a and node b. + If A, B, C are nodes and A->B, if we then insert C: A->C, C->B. + """ + if not isinstance(node, Node): + node = graph[node] + if not isinstance(a, Node): + a = graph[a] + if not isinstance(b, Node): + b = graph[b] + for e in graph.edges: + if e.node1 == a and e.node2 == b: + graph._add_edge_copy(e, node1=a, node2=node) + graph._add_edge_copy(e, node1=node, node2=b) + if e.node1 == b and e.node2 == a: + graph._add_edge_copy(e, node1=b, node2=node) + graph._add_edge_copy(e, node1=node, node2=a) + unlink(graph, a, b) diff --git a/nodeboxgl/graphics/shader.py b/nodeboxgl/graphics/shader.py new file mode 100644 index 0000000..6f90cd5 --- /dev/null +++ b/nodeboxgl/graphics/shader.py @@ -0,0 +1,1515 @@ + +# Fragment shaders, filters, Frame Buffer Object (FBO) +# Authors: Tom De Smedt, Frederik De Bleser +# License: BSD (see LICENSE.txt for details). +# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) +# http://cityinabottle.org/nodebox + +from pyglet.gl import * +from pyglet.image import Texture, SolidColorImagePattern +from context import Image, texture +from geometry import lerp, clamp +from math import radians +from ctypes import byref, cast, pointer, POINTER +from ctypes import c_char, c_char_p, c_uint, c_int + +def next(generator, default=None): + try: + return generator.next() + except StopIteration: + return default + +#===================================================================================================== + +pow2 = [2**n for n in range(20)] # [1, 2, 4, 8, 16, 32, 64, ...] + +def ceil2(x): + """ Returns the nearest power of 2 that is higher than x, e.g. 700 => 1024. + """ + for y in pow2: + if y >= x: return y + +def extent2(texture): + """ Returns the extent of the image data (0.0-1.0, 0.0-1.0) inside its texture owner. + Textures have a size power of 2 (512, 1024, ...), but the actual image can be smaller. + For example: a 400x250 image will be loaded in a 512x256 texture. + Its extent is (0.78, 0.98), the remainder of the texture is transparent. + """ + return (texture.tex_coords[3], texture.tex_coords[7]) + +def ratio2(texture1, texture2): + """ Returns the size ratio (0.0-1.0, 0.0-1.0) of two texture owners. + """ + return ( + float(ceil2(texture1.width)) / ceil2(texture2.width), + float(ceil2(texture1.height)) / ceil2(texture2.height) + ) + +#===================================================================================================== + +#--- SHADER ------------------------------------------------------------------------------------------ +# A shader is a pixel effect (motion blur, fog, glow) executed on the GPU. +# The effect has two distinct parts: a vertex shader and a fragment shader. +# The vertex shader retrieves the coordinates of the current pixel. +# The fragment shader manipulates the color of the current pixel. +# http://www.lighthouse3d.com/opengl/glsl/index.php?fragmentp +# Shaders are written in GLSL and expect their variables to be set from glUniform() calls. +# The Shader class compiles the source code and has an easy way to pass variables to GLSL. +# e.g. shader = Shader(fragment=open("colorize.frag").read()) +# shader.set("color", vec4(1, 0.8, 1, 1)) +# shader.push() +# image("box.png", 0, 0) +# shader.pop() + +DEFAULT = "default" +DEFAULT_VERTEX_SHADER = ''' +void main() { + gl_TexCoord[0] = gl_MultiTexCoord0; + gl_Position = ftransform(); +}''' +DEFAULT_FRAGMENT_SHADER = ''' +uniform sampler2D src; +void main() { + gl_FragColor = texture2D(src, gl_TexCoord[0].xy); +}''' + +class vector(tuple): + pass + +def vec2(f1, f2): + return vector((f1, f2)) +def vec3(f1, f2, f3): + return vector((f1, f2, f3)) +def vec4(f1, f2, f3, f4): + return vector((f1, f2, f3, f4)) + +COMPILE = "compile" # Error occurs during glCompileShader(). +BUILD = "build" # Error occurs during glLinkProgram(). +class ShaderError(Exception): + def __init__(self, value, type=COMPILE): + Exception.__init__(self, "%s error: %s" % (type, value)) + self.value = value + self.type = type + +class Shader(object): + + def __init__(self, vertex=DEFAULT, fragment=DEFAULT): + """ A per-pixel shader effect (blur, fog, glow, ...) executed on the GPU. + Shader wraps a compiled GLSL program and facilitates passing parameters to it. + The fragment and vertex parameters contain the GLSL source code to execute. + Raises a ShaderError if the source fails to compile. + Once compiled, you can set uniform variables in the GLSL source with Shader.set(). + """ + if vertex == DEFAULT: + vertex = DEFAULT_VERTEX_SHADER + if fragment == DEFAULT: + fragment = DEFAULT_FRAGMENT_SHADER + self._vertex = vertex # GLSL source for vertex shader. + self._fragment = fragment # GLSL source for fragment shader. + self._compiled = [] + self._program = None + self._active = False + self.variables = {} + self._build() + + def _compile(self, source, type=GL_VERTEX_SHADER): + # Compile the GLSL source code, either as GL_FRAGMENT_SHADER or GL_VERTEX_SHADER. + # If the source fails to compile, retrieve the error message and raise ShaderError. + # Store the compiled shader so we can delete it later on. + shader = glCreateShader(type) + status = c_int(-1) + glShaderSource(shader, 1, cast(pointer(c_char_p(source)), POINTER(POINTER(c_char))), None) + glCompileShader(shader) + glGetShaderiv(shader, GL_COMPILE_STATUS, byref(status)) + if status.value == 0: + raise self._error(shader, type=COMPILE) + self._compiled.append(shader) + return shader + + def _build(self): + # Each Shader has its own OpenGL rendering program and you need to switch between them. + # Compile fragment and vertex shaders and build the program. + program = glCreateProgram() + status = c_int(-1) + if self._vertex: + glAttachShader(program, self._compile(self._vertex, GL_VERTEX_SHADER)) + if self._fragment: + glAttachShader(program, self._compile(self._fragment, GL_FRAGMENT_SHADER)) + glLinkProgram(program) + glGetProgramiv(program, GL_LINK_STATUS, byref(status)) + if status.value == 0: + raise self._error(program, type=BUILD) + self._program = program + + def _error(self, obj, type=COMPILE): + # Get the info for the failed glCompileShader() or glLinkProgram(), + # delete the failed shader or program, + # return a ShaderError with the error message. + f1 = type==COMPILE and glGetShaderiv or glGetProgramiv + f2 = type==COMPILE and glGetShaderInfoLog or glGetProgramInfoLog + f3 = type==COMPILE and glDeleteShader or glDeleteProgram + length = c_int(); f1(obj, GL_INFO_LOG_LENGTH, byref(length)) + msg = "" + if length.value > 0: + msg = create_string_buffer(length.value); f2(obj, length, byref(length), msg) + msg = msg.value + f3(obj) + return ShaderError(msg, type) + + def get(self, name): + """ Returns the value of the variable with the given name. + """ + return self.variables[name] + + def set(self, name, value): + """ Set the value of the variable with the given name in the GLSL source script. + Supported variable types are: vec2(), vec3(), vec4(), single int/float, list of int/float. + Variables will be initialized when Shader.push() is called (i.e. glUseProgram). + """ + self.variables[name] = value + if self._active: + self._set(name, value) + + def _set(self, name, value): + address = glGetUniformLocation(self._program, name) + # A vector with 2, 3 or 4 floats representing vec2, vec3 or vec4. + if isinstance(value, vector): + if len(value) == 2: + glUniform2f(address, value[0], value[1]) + elif len(value) == 3: + glUniform3f(address, value[0], value[1], value[2]) + elif len(value) == 4: + glUniform4f(address, value[0], value[1], value[2], value[3]) + # A list representing an array of ints or floats. + elif isinstance(value, (list, tuple)): + if next((v for v in value if isinstance(v, float))) is not None: + array = c_float * len(value) + glUniform1fv(address, len(value), array(*value)) + else: + array = c_int * len(value) + glUniform1iv(address, len(value), array(*value)) + # Single float value. + elif isinstance(value, float): + glUniform1f(address, value) + # Single int value or named texture. + elif isinstance(value, int): + glUniform1i(address, value) + else: + ShaderError, "don't know how to handle variable %s" % value.__class__ + + def push(self): + """ Installs the program and sets its variables. + When you use the image() command between shader.push() and shader.pop(), + the shader's effect will be applied to the image before drawing it. + To use shader effects in combination with paths, + draw the path in an offscreen buffer, render it, and apply to effect to the render. + """ + self._active = True + glUseProgram(self._program) + for k, v in self.variables.items(): + self._set(k, v) + + def pop(self): + # Note that shaders can't be nested since they all have their own program, + # pop() just removes any active program. + if self._active == True: + glUseProgram(0) + self._active = False + + @property + def active(self): + return self._active + + @property + def source(self): + return (self._vertex, self._fragment) + + def __del__(self): + try: + for shader in self._compiled: + if glDetachShader and self._program: + glDetachShader(self._program, shader) + if glDeleteShader: + glDeleteShader(shader) + if glDeleteProgram: + glDeleteProgram(self._program) + except: + pass + +class ShaderFacade: + def __init__(self, vertex=None, fragment=None): + # Acts like a shader but doesn't do anything. + pass + @property + def variables(self): + return {} + @property + def active(self): + return None + def get(self, name): + return None + def set(self, name, value): + pass + def push(self): + pass + def pop(self): + pass + +SUPPORTED = True # Graphics hardware supports shaders? + +def shader(vertex=DEFAULT_VERTEX_SHADER, fragment=DEFAULT_FRAGMENT_SHADER, silent=True): + """ Returns a compiled Shader from the given GLSL source code. + With silent=True, never raises an error but instead returns a ShaderFacade. + During startup, a number of Shaders are created. + This mechanisms ensures that the module doesn't crash while doing this, + instead the shader simply won't have any visible effect and SUPPORTED will be False. + """ + if not silent: + return Shader(vertex, fragment) + try: + return Shader(vertex, fragment) + except Exception, e: + SUPPORTED = False + return ShaderFacade() + +#===================================================================================================== + +#--- FILTER ------------------------------------------------------------------------------------------ +# Stores a shader's variables and applies them once push() is called. +# The shader is created only once for perfomance while filters can exist multiple times. +# Textures that are drawn between Filter.push() and Filter.pop() have the effect applied to them. + +class Filter(object): + + def __init__(self): + """ Filter combines a Shader with variable settings. + Variables need to be prepared in Filter.push() before passing them to the shader: + e.g. creating a list of kernel values, calculating a scale based on image height, ... + Performance note: create the Shader separately, not during initialization. + """ + # Shader and its variables need to be stored here. + self.shader = None + self.texture = None + + def push(self): + """ Installs the filter so it will be applied to the next image() call. + """ + # Shader needs to set its variables here: + # self.shader.set(variable, value) + self.shader.push() + + def pop(self): + """ Removes the filter. + """ + self.shader.pop() + +#===================================================================================================== + +#--- INVERT ----------------------------------------------------------------------------------------- + +_invert = shader(fragment=''' +uniform sampler2D src; +void main() { + gl_FragColor = texture2D(src, gl_TexCoord[0].xy); + gl_FragColor.rgb = 1.0 - gl_FragColor.rgb; +}''') + +class Invert(Filter): + + def __init__(self, texture): + self.shader = _invert + self.texture = texture + + def push(self): + self.shader.push() + +#--- GRADIENT ---------------------------------------------------------------------------------------- + +LINEAR = "linear" +RADIAL = "radial" + +_gradient = {} +_gradient[LINEAR] = shader(fragment=''' +uniform sampler2D src; +uniform vec4 clr1; +uniform vec4 clr2; +void main() { + vec2 v = gl_TexCoord[0].xy; + gl_FragColor = clr1 * v.y + clr2 * (1.0 - v.y); +}''') +_gradient[RADIAL] = shader(fragment=''' +uniform sampler2D src; +uniform vec4 clr1; +uniform vec4 clr2; +void main() { + vec2 v = gl_TexCoord[0].xy - 0.5; + float d = 4.0 * (v.x * v.x + v.y * v.y); + gl_FragColor = clr1 * (1.0 - d) + clr2 * d; +}''') + +class LinearGradient(Filter): + + def __init__(self, texture, clr1=vec4(0,0,0,1), clr2=vec4(1,1,1,1)): + self.shader = _gradient[LINEAR] + self.texture = texture + self.clr1 = clr1 + self.clr2 = clr2 + + def push(self): + self.shader.set("clr1", self.clr1) + self.shader.set("clr2", self.clr2) + self.shader.push() + +class RadialGradient(Filter): + + def __init__(self, texture, clr1=vec4(0,0,0,1), clr2=vec4(1,1,1,1)): + self.shader = _gradient[RADIAL] + self.texture = texture + self.clr1 = clr1 + self.clr2 = clr2 + + def push(self): + self.shader.set("clr1", self.clr1) + self.shader.set("clr2", self.clr2) + self.shader.push() + +#--- COLORIZE --------------------------------------------------------------------------------------- + +_colorize = shader(fragment=''' +uniform sampler2D src; +uniform vec4 color; +uniform vec4 bias; +void main() { + vec4 p = texture2D(src, gl_TexCoord[0].xy); + gl_FragColor = clamp(p * color + bias, 0.0, 1.0); +}''') + +class Colorize(Filter): + + def __init__(self, texture, color=vec4(1,1,1,1), bias=vec4(0,0,0,0)): + self.shader = _colorize + self.texture = texture + self.color = color + self.bias = bias + + def push(self): + self.shader.set("color", self.color) + self.shader.set("bias", self.bias) + self.shader.push() + +#--- COLORSPACE ------------------------------------------------------------------------------------- +# Helper functions for conversion between RGB and HSB that we can use in other filters. +# Based on "Photoshop math with GLSL shaders" (2009), Romain Dura, +# http://blog.mouaif.org/?p=94 + +glsl_hsb2rgb = ''' +float _hue2rgb(float a, float b, float hue) { + hue = mod(hue, 1.0); + if (6.0 * hue < 1.0) return a + (b - a) * 6.0 * hue; + if (2.0 * hue < 1.0) return b; + if (3.0 * hue < 2.0) return a + (b - a) * 6.0 * (2.0/3.0 - hue); + return a; +} +vec3 hsb2rgb(vec3 hsb) { + if (hsb.y == 0.0) return vec3(hsb.z); + float b = (hsb.z < 0.5)? hsb.z * (1.0 + hsb.y) : (hsb.y + hsb.z) - (hsb.y * hsb.z); + float a = 2.0 * hsb.z - b; + return vec3( + _hue2rgb(a, b, hsb.x + (1.0/3.0)), + _hue2rgb(a, b, hsb.x), + _hue2rgb(a, b, hsb.x - (1.0/3.0)) + ); +}''' + +glsl_rgb2hsb = ''' +vec3 rgb2hsb(vec3 rgb) { + vec3 hsb = vec3(0.0); + float a = min(min(rgb.r, rgb.g), rgb.b); + float b = max(max(rgb.r, rgb.g), rgb.b); + float c = b - a; + if (c != 0.0) { + vec3 d = ((vec3(b) - rgb) / 6.0 + c / 2.0) / c; + if (rgb.r == b) hsb.x = d.b - d.g; + else if (rgb.g == b) hsb.x = d.r - d.b + 1.0/3.0; + else if (rgb.b == b) hsb.x = d.g - d.r + 2.0/3.0; + hsb.x = mod(hsb.x, 1.0); + hsb.y = (hsb.z < 0.5)? c / (a+b) : c / (2.0 - c); + } + hsb.z = (a+b) / 2.0; + return hsb; +}'''; + +#--- ADJUSTMENTS ------------------------------------------------------------------------------------ + +BRIGHTNESS = "brightness" +CONTRAST = "contrast" +SATURATION = "saturation" +HUE = "hue" + +_adjustment = {} +_adjustment[BRIGHTNESS] = shader(fragment=''' +uniform sampler2D src; +uniform float m; +void main() { + vec4 p = texture2D(src, gl_TexCoord[0].xy); + gl_FragColor = vec4(clamp(p.rgb + m, 0.0, 1.0), p.a); +}''') +_adjustment[CONTRAST] = shader(fragment=''' +uniform sampler2D src; +uniform float m; +void main() { + vec4 p = texture2D(src, gl_TexCoord[0].xy); + gl_FragColor = vec4(clamp((p.rgb - 0.5) * m + 0.5, 0.0, 1.0), p.a); +}''') +_adjustment[SATURATION] = shader(fragment=''' +uniform sampler2D src; +uniform float m; +void main() { + vec4 p = texture2D(src, gl_TexCoord[0].xy); + float i = 0.3 * p.r + 0.59 * p.g + 0.11 * p.b; + gl_FragColor = vec4( + i * (1.0 - m) + p.r * m, + i * (1.0 - m) + p.g * m, + i * (1.0 - m) + p.b * m, + p.a + ); +}''') +_adjustment[HUE] = shader(fragment=glsl_hsb2rgb+glsl_rgb2hsb+''' +uniform sampler2D src; +uniform float m; +void main() { + vec4 p = texture2D(src, gl_TexCoord[0].xy); + vec3 hsb = rgb2hsb(p.rgb); + hsb.x = hsb.x + m; + gl_FragColor = vec4(hsb2rgb(hsb).xyz, p.a); +}''') + +class BrightnessAdjustment(Filter): + + def __init__(self, texture, m=1.0): + self.shader = _adjustment[BRIGHTNESS] + self.texture = texture + self.m = m + + def push(self): + self.shader.set("m", float(self.m-1)) + self.shader.push() + +class ContrastAdjustment(Filter): + + def __init__(self, texture, m=1.0): + self.shader = _adjustment[CONTRAST] + self.texture = texture + self.m = m + + def push(self): + self.shader.set("m", float(self.m)) + self.shader.push() + +class SaturationAdjustment(Filter): + + def __init__(self, texture, m=1.0): + self.shader = _adjustment[SATURATION] + self.texture = texture + self.m = m + + def push(self): + self.shader.set("m", float(max(self.m, 0))) + self.shader.push() + +class HueAdjustment(Filter): + + def __init__(self, texture, m=0.0): + self.shader = _adjustment[HUE] + self.texture = texture + self.m = m + + def push(self): + self.shader.set("m", float(self.m)); + self.shader.push() + +#--- BRIGHTPASS -------------------------------------------------------------------------------------- +# Note: the magic numbers 0.2125, 0.7154, 0.0721 represent how (in RGB) +# green contributes the most to luminosity while blue hardly contributes anything. +# Thus, luminance L = R*0.2125 + G*0.7154 + B+0.0721 + +_brightpass = shader(fragment=''' +uniform sampler2D src; +uniform float threshold; +void main() { + vec4 p = texture2D(src, gl_TexCoord[0].xy); + float L = dot(p.rgb, vec3(0.2125, 0.7154, 0.0721)); // luminance + gl_FragColor = (L > threshold)? vec4(p.rgb, p.a) : vec4(0.0, 0.0, 0.0, p.a); +}''') + +class BrightPass(Filter): + + def __init__(self, texture, threshold=0.5): + self.shader = _brightpass + self.texture = texture + self.threshold = threshold + + def push(self): + self.shader.set("threshold", float(self.threshold)); + self.shader.push() + +#--- BLUR -------------------------------------------------------------------------------------------- +# Based on "Gaussian Blur Filter Shader" (2008), +# http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/ +# Blurring occurs in two steps (requiring an FBO): horizontal blur and vertical blur. +# Separating these two steps reduces the problem to linear complexity (i.e. it is faster). + +glsl_blur = ''' +uniform sampler2D src; +uniform int kernel; +uniform float radius; +uniform vec2 extent; +void main() { + vec2 v = gl_TexCoord[0].xy; + vec4 p = vec4(0.0); + float n = float(kernel * kernel); + if (v.x <= extent.x && v.y <= extent.y) { + for (int i=1; i 6 calculations, single pass => 9 calculations. +_blur["gaussian3x3"] = shader(fragment=''' +uniform sampler2D src; +uniform vec2 radius; +void main() { + float dx = radius.x; + float dy = radius.y; + vec2 v = gl_TexCoord[0].xy; + vec4 p = vec4(0.0); + p = 4.0 * texture2D(src, v); + p += 2.0 * texture2D(src, v + vec2(+dx, 0.0)); + p += 2.0 * texture2D(src, v + vec2(-dx, 0.0)); + p += 2.0 * texture2D(src, v + vec2(0.0, +dy)); + p += 2.0 * texture2D(src, v + vec2(0.0, -dy)); + p += 1.0 * texture2D(src, v + vec2(+dx, +dy)); + p += 1.0 * texture2D(src, v + vec2(-dx, +dy)); + p += 1.0 * texture2D(src, v + vec2(-dx, -dy)); + p += 1.0 * texture2D(src, v + vec2(+dx, -dy)); + gl_FragColor = p / 16.0; +}''') + +class Gaussian3x3Blur(Filter): + + def __init__(self, texture, scale=1.0): + self.shader = _blur["gaussian3x3"] + self.texture = texture + self.scale = scale + + def push(self): + x = float(self.scale) / self.texture.width + y = float(self.scale) / self.texture.height + self.shader.set("radius", vec2(x, y)) + self.shader.push() + +#--- COMPOSITING ------------------------------------------------------------------------------------- + +# Compositing function. +# It will be reused in alpha compositing and blending filters below. +# It prepares pixels p1 and p2, which need to be mixed into vec4 p. +glsl_compositing = ''' +uniform sampler2D src1; +uniform sampler2D src2; +uniform vec2 extent; +uniform vec2 offset; +uniform vec2 ratio; +uniform float alpha; +void main() { + vec2 v1 = gl_TexCoord[0].xy; + vec2 v2 = v1 * ratio - offset * extent; + vec4 p1 = texture2D(src1, v1.xy); + vec4 p2 = texture2D(src2, v2.xy); + if (v2.x < 0.0 || + v2.y < 0.0 || + v2.x > extent.x + 0.001 || + v2.y > extent.y + 0.001) { + gl_FragColor = p1; + return; + } + vec4 p = vec4(0.0); + %s + gl_FragColor = p; +}''' + +class Compositing(Filter): + + def __init__(self, shader, texture, blend, alpha=1.0, dx=0, dy=0): + """ A filter that mixes a base image (the destination) with a blend image (the source). + Used to implement alpha compositing and blend modes. + - dx: the horizontal offset (in pixels) of the blend layer. + - dy: the vertical offset (in pixels) of the blend layer. + """ + self.shader = shader + self.texture = texture + self.blend = blend + self.alpha = alpha + self.dx = dx + self.dy = dy + + def push(self): + w = float(self.blend.width) + h = float(self.blend.height) + w2 = float(ceil2(w)) + h2 = float(ceil2(h)) + dx = float(self.dx) / w + dy = float(self.dy) / h + glActiveTexture(GL_TEXTURE0) + glBindTexture(self.texture.target, self.texture.id) + glActiveTexture(GL_TEXTURE1) + glBindTexture(self.blend.target, self.blend.id) + glActiveTexture(GL_TEXTURE0) + self.shader.set("src1", 0) + self.shader.set("src2", 1) + self.shader.set("extent", vec2(w/w2, h/h2)) # Blend extent. + self.shader.set("offset", vec2(dx, dy)) # Blend offset. + self.shader.set("ratio", vec2(*ratio2(self.texture, self.blend))) # Image-blend proportion. + self.shader.set("alpha", self.alpha) + self.shader.push() + +#--- ALPHA TRANSPARENCY ------------------------------------------------------------------------------ + +_alpha = {} +_alpha["transparency"] = shader(fragment=''' +uniform sampler2D src; +uniform float alpha; +void main() { + vec4 p = texture2D(src, gl_TexCoord[0].xy); + gl_FragColor = vec4(p.rgb, p.a * alpha); +}''') +_alpha["mask"] = shader(fragment=glsl_compositing % ''' + p = vec4(p1.rgb, p1.a * (p2.r * p2.a * alpha)); +'''.strip()) + +class AlphaTransparency(Filter): + + def __init__(self, texture, alpha=1.0): + self.shader = _alpha["transparency"] + self.texture = texture + self.alpha = alpha + + def push(self): + self.shader.set("alpha", float(max(0, min(1, self.alpha)))) + self.shader.push() + +class AlphaMask(Compositing): + + def __init__(self, texture, blend, alpha=1.0, dx=0, dy=0): + Compositing.__init__(self, _alpha["mask"], texture, blend, alpha, dx, dy) + self.shader = _alpha["mask"] + +#--- BLEND MODES ------------------------------------------------------------------------------------- +# Based on "Photoshop math with GLSL shaders" (2009), Romain Dura, +# http://blog.mouaif.org/?p=94 + +ADD = "add" # Pixels are added. +SUBTRACT = "subtract" # Pixels are subtracted. +LIGHTEN = "lighten" # Lightest value for each pixel. +DARKEN = "darken" # Darkest value for each pixel. +MULTIPLY = "multiply" # Pixels are multiplied, resulting in a darker image. +SCREEN = "screen" # Pixels are inverted/multiplied/inverted, resulting in a brighter picture. +OVERLAY = "overlay" # Combines multiply and screen: light parts become ligher, dark parts darker. +HARDLIGHT = "hardlight" # Same as overlay, but uses the blend instead of base image for luminance. +HUE = "hue" # Hue from the blend image, brightness and saturation from the base image. + +# If the blend is opaque (alpha=1.0), swap base and blend. +# This way lighten, darken, multiply and screen appear the same as in Photoshop and Core Image. +_blendx = '''if (p2.a == 1.0) { vec4 p3=p1; p1=p2; p2=p3; } + ''' +# Blending operates on RGB values, the A needs to be handled separately. +# Where both images are transparent, their transparency is blended. +# Where the base image is fully transparent, the blend image appears source over. +# There is a subtle transition at transparent edges, which makes the edges less jagged. +glsl_blend = glsl_compositing % ''' + vec3 w = vec3(1.0); // white + %s + p = mix(p1, clamp(p, 0.0, 1.0), p2.a * alpha); + p = (v1.x * ratio.x > 1.0 || v1.y * ratio.y > 1.0)? p1 : p; + p = (p1.a < 0.25)? p * p1.a + p2 * (1.0-p1.a) : p; +'''.strip() +_blend = {} +_blend[ADD] = 'p = vec4(p1.rgb + p2.rgb, 1.0);' +_blend[SUBTRACT] = 'p = vec4(p1.rgb + p2.rgb - 1.0, 1.0);' +_blend[LIGHTEN] = _blendx + 'p = vec4(max(p1.rgb, p2.rgb), 1.0);' +_blend[DARKEN] = _blendx + 'p = vec4(min(p1.rgb, p2.rgb), 1.0);' +_blend[MULTIPLY] = _blendx + 'p = vec4(p1.rgb * p2.rgb, 1.0);' +_blend[SCREEN] = _blendx + 'p = vec4(w - (w - p1.rgb) * (w - p2.rgb), 1.0);' +_blend[OVERLAY] = ''' + float L = dot(p1.rgb, vec3(0.2125, 0.7154, 0.0721)); // luminance + vec4 a = vec4(2.0 * p1.rgb * p2.rgb, 1.0); + vec4 b = vec4(w - 2.0 * (w - p1.rgb) * (w - p2.rgb), 1.0); + p = (L < 0.45)? a : (L > 0.55)? b : vec4(mix(a.rgb, b.rgb, (L - 0.45) * 10.0), 1.0); +''' +_blend[HARDLIGHT] = _blend[OVERLAY].replace("dot(p1", "dot(p2") +_blend[HUE] = ''' + vec3 h1 = rgb2hsb(p1.rgb); + vec3 h2 = rgb2hsb(p2.rgb); + p = vec4(hsb2rgb(vec3(h2.x, h1.yz)).rgb, p1.a); +''' + +for f in _blend.keys(): + src = glsl_blend % _blend[f].strip() + src = f==HUE and glsl_rgb2hsb + glsl_hsb2rgb + src or src # Hue blend requires rgb2hsb() function. + _blend[f] = shader(fragment=src) + +class Blend(Compositing): + + def __init__(self, mode, texture, blend, alpha=1.0, dx=0, dy=0): + Compositing.__init__(self, _blend[mode], texture, blend, alpha, dx, dy) + +#--- DISTORTION -------------------------------------------------------------------------------------- +# Based on "PhotoBooth Demystified" (2007), Libero Spagnolini, +# http://dem.ocracy.org/libero/photobooth/ + +PINCH = "pinch" # Radius grows faster near the center of the effect. +TWIRL = "twirl" # Decreasing offset is added to the angle while moving down the radius. +SPLASH = "splash" # Light-tunnel effect by capping the radius. +BUMP = "bump" # Radius grows slower near the center of the effect. +DENT = "dent" +FISHEYE = "fisheye" +STRETCH = "stretch" +MIRROR = "mirror" + +# Distortion function. +# - vec2 offset: horizontal and vertical offset from the image center (-0.5 to +0.5). +# - vec2 extent: the actual size of the image (0.0-1.0) in the texture. +# Textures have a size power of 2 (512, 1024, ...) but the actual image may be smaller. +# We need to know the extent of the image in the texture to calculate its center. +# - float ratio: the ratio between width and height, so the effect doesn't get stretched. +# - float m: the magnitude of the effect (e.g. radius, ...) +# - float i: the intensity of the effect (e.g. number of rotations, ...) +# - vec2 n: a normalized texture space between -1.0 and 1.0 (instead of 0.0-1.0). +glsl_distortion = ''' +uniform sampler2D src; +uniform vec2 offset; +uniform vec2 extent; +uniform float ratio; +uniform float m; +uniform float i; +void main() { + vec2 v = gl_TexCoord[0].xy; + vec2 d = extent + extent * offset; + vec2 n = 2.0 * v - 1.0 * d; + n.x *= ratio; + %s + n.x /= ratio; + v = n / 2.0 + 0.5 * d; + %s + gl_FragColor = p; +}''' +# Polar coordinates. +# Most of the effects are based on simple angle and radius transformations. +# After the transformations, convert back to cartesian coordinates n. +glsl_polar = ''' + float r = length(n); + float phi = atan(n.y, n.x); + %s + n = vec2(r*cos(phi), r*sin(phi)); +'''.strip() +# For most effects, pixels are not wrapped around the edges. +# The second version wraps, with respect to the extent of the actual image in its power-of-2 texture. +# The third version wraps with a flipped image (transition). +glsl_wrap = ( + '''vec4 p = (v.x < 0.0 || v.y < 0.0 || v.x > 0.999 || v.y > 0.999)? vec4(0.0) : texture2D(src, v);''', + ''' + v.x = (v.x >= extent.x - 0.001)? mod(v.x, extent.x) - 0.002 : max(v.x, 0.001); + v.y = (v.y >= extent.y - 0.001)? mod(v.x, extent.x) - 0.002 : max(v.y, 0.001); + vec4 p = texture2D(src, v);'''.strip(), + ''' + v.x = (v.x >= extent.x - 0.001)? (extent.x - (v.x-extent.x)) - 0.002 : max(v.x, 0.001); + v.y = (v.y >= extent.y - 0.001)? (extent.y - (v.y-extent.y)) - 0.002 : max(v.y, 0.001); + vec4 p = texture2D(src, v);'''.strip()) + +_distortion = {} +_distortion[BUMP] = 'r = r * smoothstep(i, m, r);' +_distortion[DENT] = 'r = 2.0 * r - r * smoothstep(0.0, m, r/i);' +_distortion[PINCH] = 'r = pow(r, m/i) * m;' +_distortion[FISHEYE] = 'r = r * r / sqrt(2.0);' +_distortion[SPLASH] = 'if (r > m) r = m;' +_distortion[TWIRL] = 'phi = phi + (1.0 - smoothstep(-m, m, r)) * i;' +_distortion[MIRROR] = ''' + if (m > 0.0) { n.x += offset.x * extent.x * ratio; n.x = n.x * sign(n.x); } + if (i > 0.0) { n.y += offset.y * extent.y; n.y = n.y * sign(n.y); } +'''.strip() +_distortion[STRETCH] = ''' + vec2 s = sign(n); + n = abs(n); + n = (1.0-i) * n + i * smoothstep(m*0.25, m, n) * n; + n = s * n; +'''.strip() + +for f in (BUMP, DENT, PINCH, FISHEYE, SPLASH, TWIRL): + _distortion[f] = shader(fragment=glsl_distortion % (glsl_polar % _distortion[f], glsl_wrap[0])) +for f in (STRETCH, MIRROR): + _distortion[f] = shader(fragment=glsl_distortion % ( _distortion[f], glsl_wrap[2])) + +class Distortion(Filter): + + def __init__(self, effect, texture, dx=0, dy=0, m=1.0, i=1.0): + """ Distortion filter with dx, dy offset from the center (between -0.5 and 0.5), + magnitude m as the radius of effect, intensity i as the depth of the effect. + """ + self.shader = _distortion[effect] + self.texture = texture + self.dx = dx + self.dy = dy + self.m = m + self.i = i + + # Center offset can also be set in absolute coordinates (e.g. pixels): + def _get_abs_dx(self): + return int(self.dx * self.texture.width) + def _get_abs_dy(self): + return int(self.dy * self.texture.height) + def _set_abs_dx(self, v): + self.dx = float(v) / self.texture.width + def _set_abs_dy(self, v): + self.dy = float(v) / self.texture.height + + abs_dx = property(_get_abs_dx, _set_abs_dx) + abs_dy = property(_get_abs_dy, _set_abs_dy) + + def push(self): + w = float(self.texture.width) + h = float(self.texture.height) + w2 = float(ceil2(w)) + h2 = float(ceil2(h)) + self.shader.set("extent", vec2(w/w2, h/h2)) + self.shader.set("offset", vec2(float(2*self.dx), float(2*self.dy))) + self.shader.set("ratio", w2/h2) + self.shader.set("m", float(self.m)) + self.shader.set("i", float(self.i)) + self.shader.push() + +#===================================================================================================== + +#--- FRAME BUFFER OBJECT ----------------------------------------------------------------------------- +# Based on "Frame Buffer Object 101" (2006), Rob Jones, +# http://www.gamedev.net/reference/articles/article2331.asp + +_UID = 0 +def _uid(): + # Each FBO has a unique ID. + global _UID; _UID+=1; return _UID; + +def _texture(width, height): + # Returns an empty texture of the given width and height. + return Texture.create(width, height) + +def glCurrentViewport(x=None, y=None, width=None, height=None): + """ Returns a (x, y, width, height)-tuple with the current viewport bounds. + If x, y, width and height are given, set the viewport bounds. + """ + # Why? To switch between the size of the onscreen canvas and the offscreen buffer. + # The canvas could be 256x256 while an offscreen buffer could be 1024x1024. + # Without switching the viewport, information from the buffer would be lost. + if x is not None and y is not None and width is not None and height is not None: + glViewport(x, y, width, height) + glMatrixMode(GL_PROJECTION) + glLoadIdentity() + glOrtho(x, width, y, height, -1, 1) + glMatrixMode(GL_MODELVIEW) + xywh = (GLint*4)(); glGetIntegerv(GL_VIEWPORT, xywh) + return tuple(xywh) + +# The FBO stack keeps track of nested FBO's. +# When OffscreenBuffer.pop() is called, we revert to the previous buffer. +# Usually, this is the onscreen canvas, but in a render() function that contains +# filters or nested render() calls, this is the previous FBO. +_FBO_STACK = [] + +class OffscreenBufferError(Exception): + pass + +class OffscreenBuffer(object): + + def __init__(self, width, height): + """ "FBO" is an OpenGL extension to do "Render to Texture", drawing in an offscreen buffer. + It is useful as a place to chain multiple shaders, + since each shader has its own program and we can only install one program at a time. + """ + self.id = c_uint(_uid()) + try: glGenFramebuffersEXT(1, byref(self.id)) + except: + raise OffscreenBufferError, "offscreen buffer not supported." + self.texture = None + self._viewport = (None, None, None, None) # The canvas bounds, set in OffscreenBuffer.push(). + self._active = False + self._init(width, height) + #self._init_depthbuffer() + + def _init(self, width, height): + self.texture = _texture(int(width), int(height)) + + @property + def width(self): + return self.texture.width + + @property + def height(self): + return self.texture.height + + @property + def active(self): + return self._active + + def push(self): + """ Between push() and pop(), all drawing is done offscreen in OffscreenBuffer.texture. + The offscreen buffer has its own transformation state, + so any translate(), rotate() etc. does not affect the onscreen canvas. + """ + _FBO_STACK.append(self) + glBindTexture(self.texture.target, self.texture.id) + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.id.value) + glFramebufferTexture2DEXT( + GL_FRAMEBUFFER_EXT, + GL_COLOR_ATTACHMENT0_EXT, + self.texture.target, + self.texture.id, + self.texture.level + ) + # FBO's can fail when not supported by the graphics hardware, + # or when supplied an image of size 0 or unequal width/height. + # Check after glBindFramebufferEXT() and glFramebufferTexture2DEXT(). + if glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT: + msg = self.texture.width == self.texture.height == 0 and "width=0, height=0." or "" + raise OffscreenBufferError, msg + # Separate the offscreen from the onscreen transform state. + # Separate the offscreen from the onscreen canvas size. + self._viewport = glCurrentViewport() + glPushMatrix() + glLoadIdentity() + glCurrentViewport(0, 0, self.texture.width, self.texture.height) + glColor4f(1.0,1.0,1.0,1.0) + # FBO's work with a simple GL_LINE_SMOOTH anti-aliasing. + # The instructions on how to enable framebuffer multisampling are pretty clear: + # (http://www.opengl.org/wiki/GL_EXT_framebuffer_multisample) + # but glRenderbufferStorageMultisampleEXT doesn't appear to work (yet), + # plus there is a performance drop. + glEnable(GL_LINE_SMOOTH) + # Blending transparent images in a transparent FBO is a bit tricky + # because alpha is premultiplied, an image with 50% transparency + # will come out 25% transparency with glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). + # http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=257630 + # http://www.openframeworks.cc/forum/viewtopic.php?f=9&t=2215 + # This blend mode gives better results: + glEnable(GL_BLEND) + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) + self._active = True + + def pop(self): + """ Reverts to the onscreen canvas. + The contents of the offscreen buffer can be retrieved with OffscreenBuffer.texture. + """ + # Switch to onscreen canvas size and transformation state. + # Switch to onscreen canvas. + # Reset to the normal blending mode. + _FBO_STACK.pop(-1) + glCurrentViewport(*self._viewport) + glPopMatrix() + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _FBO_STACK and _FBO_STACK[-1].id or 0) + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) + #glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + self._active = False + + def render(self): + """ Executes the drawing commands in OffscreenBuffer.draw() offscreen and returns image. + This is useful if you have a class that inherits from FBO with a draw() method. + """ + self.push() + self.draw() + self.pop() + return self.texture + + def draw(self): + pass + + def slice(self, x, y, width, height): + """ Returns a portion of the offscreen buffer as an image. + """ + return self.texture.get_region(x, y, width, height) + + def reset(self, width=None, height=None): + """ Resizes the offscreen buffer by attaching a new texture to it. + This will destroy the contents of the previous buffer. + If you do not explicitly reset the buffer, the contents from previous drawing + between OffscreenBuffer.push() and OffscreenBuffer.pop() is retained. + """ + if self._active: + raise OffscreenBufferError, "can't reset offscreen buffer when active" + if width is None: + width = self.width + if height is None: + height = self.height + self._init(width, height) + + def clear(self): + glClear(GL_COLOR_BUFFER_BIT) + glClear(GL_DEPTH_BUFFER_BIT) + glClear(GL_STENCIL_BUFFER_BIT) + + def _init_depthbuffer(self): + self._depthbuffer = c_uint(_uid()) + glGenRenderbuffersEXT(1, byref(self._depthbuffer)) + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, self._depthbuffer) + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, self.width, self.height) + glFramebufferRenderbufferEXT( + GL_FRAMEBUFFER_EXT, + GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, + self._depthbuffer + ) + + def __del__(self): + try: + if glDeleteFramebuffersEXT: + glDeleteFramebuffersEXT(1, self.id) + if glDeleteRenderbuffersEXT and hasattr(self, "_depthbuffer"): + glDeleteRenderbuffersEXT(1, self._depthbuffer) + except: + pass + +FBO = OffscreenBuffer + +#===================================================================================================== + +#--- OFFSCREEN RENDERING ----------------------------------------------------------------------------- +# Uses an offscreen buffer to render filters and drawing commands to images. + +try: + _buffer = OffscreenBuffer(640, 480) +except OffscreenBufferError: + _buffer = None + +def filter(img, filter=None, clear=True): + """ Returns a new Image object with the given filter applied to it. + - img : an image that can be passed to the image() command. + - filter: an instance of the Filter class, with parameters set. + - clear : if True, clears the contents of the offscreen buffer and resizes it to the image. + """ + # For file paths, textures and Pixel objects, create an Image first. + if not isinstance(img, Image): + img = Image(img) + # Reuse main _buffer when possible, otherwise create one on the fly + # (this will be necessary when filter() or render() is nested inside render()). + if not _buffer or _buffer.active: + buffer = OffscreenBuffer(img.texture.width, img.texture.height) + elif clear: + buffer = _buffer + buffer.reset(img.texture.width, img.texture.height) + else: + buffer = _buffer + buffer.push() + if filter != None: + filter.texture = img.texture # Register the current texture with the filter. + filter.push() + # This blend mode gives better results for transparent images: + glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) + # Note: Image.alpha and Image.color attributes won't work here, + # because the shader overrides the default drawing behavior. + # Instead, add the transparent() and colorize() filters to the chain. + img.draw(0, 0, img.texture.width, img.texture.height) + if filter != None: + filter.pop() + buffer.pop() + return img.copy(texture=buffer.texture) + +class RenderedImage(Image): + + def draw(self, *args, **kwargs): + # Textures rendered in the FBO look slightly washed out. + # The render() command yields a RenderedImage object, + # which draw() method uses a blending trick to correct the colors: + glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) + Image.draw(self, *args, **kwargs) + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) + + def save(self, path): + # XXX Colors will appear washed out in the exported image. + Image.save(self, path) + +def render(function, width, height, clear=True, **kwargs): + """ Returns an Image object from a function containing drawing commands (i.e. a procedural image). + This is useful when, for example, you need to render filters on paths. + - function: a function containing drawing commands. + - width : width of the offscreen canvas. + - height : height of the offscreen canvas. + - clear : when False, retains the contents of the offscreen canvas, without resizing it. + """ + # Reuse main _buffer when possible, otherwise create one on the fly + # (this will be necessary when render() is nested inside another render()). + if not _buffer or _buffer.active: + buffer = OffscreenBuffer(width, height) + elif clear: + buffer = _buffer + buffer.reset(width, height) + else: + buffer = _buffer + buffer.push() + function(**kwargs) + buffer.pop() + return RenderedImage(buffer.texture) + +#--- OFFSCREEN FILTERS ------------------------------------------------------------------------------- +# Images are rendered offscreen with the filter applied, and the new image returned. + +def invert(img): + """ Returns an image with inverted colors (e.g. white becomes black). + """ + return filter(img, Invert(img.texture)) + +def solid(width, height, fill=(0,0,0,0)): + """ Generates an image filled with a solid color. + """ + clr = tuple([int(v*255) for v in fill]) + return Image(SolidColorImagePattern(clr).create_image(width, height).get_texture()) + +def gradient(width, height, clr1=(0,0,0,1), clr2=(1,1,1,1), type=LINEAR): + """ Generates a gradient image and returns it. + - width : the width of the image. + - height: the height of the image. + - clr1 : a Color (or a tuple) that defines the bottom (or inner) color. + - clr2 : a Color (or a tuple) that defines the top (or outer) color. + - type : either LINEAR or RADIAL. + """ + f = type==LINEAR and LinearGradient or RadialGradient + img = Image(_texture(ceil2(width), ceil2(height))) + img = filter(img, f(img.texture, vec4(*clr1), vec4(*clr2))) + # Reuse main _buffer when possible, otherwise create one on the fly + # (this will be necessary when filter() or render() is nested inside render()). + if not _buffer or _buffer.active: + buffer = OffscreenBuffer(img.texture.width, img.texture.height) + else: + buffer = _buffer + # If the given dimensions are not power of 2, + # scale down the gradient to the given dimensions. + if width != img.width or height != img.height: + buffer.reset(width, height) + buffer.push() + img.width = width + img.height = height + img.draw() + buffer.pop() + return img.copy(texture=buffer.texture) + return img + +def colorize(img, color=(1,1,1,1), bias=(0,0,0,0)): + """ Applies a colorize filter to the image and returns the colorized image. + - color: a Color (or a tuple) of RGBA-values to multiply with each image pixel. + - bias : a Color (or a tuple) of RGBA-values to add to each image pixel. + """ + return filter(img, Colorize(img.texture, vec4(*color), vec4(*bias))) + +def adjust(img, brightness=1.0, contrast=1.0, saturation=1.0, hue=0.0): + """ Applies color adjustment filters to the image and returns the adjusted image. + - brightness: the overall lightness or darkness (0.0 is a black image). + - contrast : the difference in brightness between regions. + - saturation: the intensity of the colors (0.0 is a grayscale image). + - hue : the shift in hue (1.0 is 360 degrees on the color wheel). + """ + if brightness != 1: img = filter(img, BrightnessAdjustment(img.texture, brightness)) + if contrast != 1: img = filter(img, ContrastAdjustment(img.texture, contrast)) + if saturation != 1: img = filter(img, SaturationAdjustment(img.texture, saturation)) + if hue != 0: img = filter(img, HueAdjustment(img.texture, hue)) + return img + +def desaturate(img): + """ Returns a grayscale version of the image. + """ + return filter(img, SaturationAdjustment(img.texture, 0.0)) + +grayscale = desaturate + +def brightpass(img, threshold=0.3): + """ Applies a bright pass filter, where pixels whose luminance falls below the threshold are black. + """ + return filter(img, BrightPass(img.texture, threshold)) + +def blur(img, kernel=5, scale=1.0, amount=1, cumulative=False): + """ Applies a blur filter to the image and returns the blurred image. + - kernel: the size of the convolution matrix (e.g. 9 = 9x9 convolution kernel). + - scale : the radius of the effect, a higher scale will create a rougher but faster blur. + - amount: the number of the times to apply the blur filter; + because blurred layers are pasted on top of each other cumulatively + this produces a nicer effect than repeatedly using blur() in a for-loop + (which blurs the blurred). + """ + for i in range(amount): + clear = i==0 or not cumulative + img = filter(img, HorizontalBlur(img.texture, kernel, scale), clear=clear) + img = filter(img, VerticalBlur(img.texture, kernel, scale), clear=clear) + return img + +def transparent(img, alpha=1.0): + """ Returns a transparent version of the image. + - alpha: the percentage of the original opacity of the image (0.0-1.0). + """ + return filter(img, AlphaTransparency(img.texture, alpha)) + +def _q(img): + # For images functioning as masks or blend layers, + # apply any quad distortian and then use the texture of the distored image. + if img.quad != (0,0,0,0,0,0,0,0): + return filter(img) + return img + +def mask(img1, img2, alpha=1.0, dx=0, dy=0): + """ Applies the second image as an alpha mask to the first image. + The second image must be a grayscale image, where the black areas + make the first image transparent (e.g. punch holes in it). + - dx: horizontal offset (in pixels) of the alpha mask. + - dy: vertical offset (in pixels) of the alpha mask. + """ + return filter(img1, AlphaMask(img1.texture, _q(img2).texture, alpha, dx, dy)) + +def blend(img1, img2, mode=OVERLAY, alpha=1.0, dx=0, dy=0): + """ Applies the second image as a blend layer with the first image. + - dx: horizontal offset (in pixels) of the blend layer. + - dy: vertical offset (in pixels) of the blend layer. + """ + return filter(img1, Blend(mode, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def add(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(ADD, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def subtract(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(SUBTRACT, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def lighten(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(LIGHTEN, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def darken(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(DARKEN, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def multiply(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(MULTIPLY, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def screen(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(SCREEN, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def overlay(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(OVERLAY, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def hardlight(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(HARDLIGHT, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def hue(img1, img2, alpha=1.0, dx=0, dy=0): + return filter(img1, Blend(HUE, img1.texture, _q(img2).texture, alpha, dx, dy)) + +def glow(img, intensity=0.5, amount=1): + """ Returns the image blended with a blurred version, yielding a glowing effect. + - intensity: the opacity of the blur (0.0-1.0). + - amount : the number of times to blur. + """ + b = blur(img, kernel=9, scale=1.0, amount=max(1, amount)) + return add(img, b, alpha=intensity) + +def bloom(img, intensity=0.5, amount=1, threshold=0.3): + """ Returns the image blended with a blurred brightpass version, yielding a "magic glow" effect. + - intensity: the opacity of the blur (0.0-1.0). + - amount : the number of times to blur. + - threshold: the luminance threshold of pixels that light up. + """ + b = brightpass(img, threshold) + b = blur(img, kernel=9, scale=1.0, amount=max(1, amount)) + return add(img, b, alpha=intensity) + +def distortion_mixin(type, dx, dy, **kwargs): + # Each distortion filter has specific parameters to tweak the effect (usually radius and zoom). + # Returns the magnitude m and intensity i from the keyword arguments, + # which are the parameters expected by the Distortion Filter class. + if type == BUMP: + m = kwargs.get("radius", 0.5) + i = lerp(-m*20, m*0.25, max(0, kwargs.get("zoom", 0.5))**0.1) + elif type == DENT: + m = max(0, 2 * kwargs.get("radius", 0.5)) + i = max(0, 1 * kwargs.get("zoom", 0.5)) + elif type == PINCH: + m = 1.0 + i = max(0.2, 2 * kwargs.get("zoom", 0.75)) + elif type == TWIRL: + m = kwargs.get("radius", 1.0) + i = radians(kwargs.get("angle", 180.0)) + elif type == SPLASH: + m = kwargs.get("radius", 0.5) + i = 0 + elif type == MIRROR: + m = int(kwargs.get("horizontal", True)) + i = int(kwargs.get("vertical", True)) + dx = clamp(dx, -0.5, 1.5) + dy = clamp(dy, -0.5, 1.5) + elif type == STRETCH: + m = max(0, kwargs.get("radius", 0.5)) + i = max(0, min(1, 0.5 * kwargs.get("zoom", 1.0))) + else: + m = 0.5 + i = 0.5 + return dx, dy, m, i + +#def bump(img, dx=0.5, dy=0.5, radius=0.5, zoom=0.5) +def bump(img, dx=0.5, dy=0.5, **kwargs): + """ Returns the image with a bump distortion applied to it. + - dx: horizontal origin of the effect, between 0.0 and 1.0. + - dy: vertical origin of the effect, between 0.0 and 1.0. + - radius: the radius of the affected area, proportional to the image size. + - zoom: the amount to zoom in. + """ + dx, dy, m, i = distortion_mixin(BUMP, dx, dy, **kwargs) + return filter(img, filter=Distortion(BUMP, img.texture, dx-0.5, dy-0.5, m, i)) + +#def dent(img, dx=0.5, dy=0.5, radius=0.5, zoom=0.5) +def dent(img, dx=0.5, dy=0.5, **kwargs): + """ Returns the image with a dent distortion applied to it. + - dx: horizontal origin of the effect, between 0.0 and 1.0. + - dy: vertical origin of the effect, between 0.0 and 1.0. + - radius: the radius of the affected area, proportional to the image size. + - zoom: the amount to zoom in. + """ + dx, dy, m, i = distortion_mixin(DENT, dx, dy, **kwargs) + return filter(img, filter=Distortion(DENT, img.texture, dx-0.5, dy-0.5, m, i)) + +#def pinch(img, dx=0.5, dy=0.5, zoom=0.75) +def pinch(img, dx=0.5, dy=0.5, **kwargs): + """ Returns the image with a pinch distortion applied to it. + - dx: horizontal origin of the effect, between 0.0 and 1.0. + - dy: vertical origin of the effect, between 0.0 and 1.0. + - zoom: the amount of bulge (0.1-0.5) or pinch (0.5-1.0): + """ + dx, dy, m, i = distortion_mixin(PINCH, dx, dy, **kwargs) + return filter(img, filter=Distortion(PINCH, img.texture, dx-0.5, dy-0.5, m, i)) + +#def twirl(img, dx=0.5, dy=0.5, radius=1.0, angle=180.0) +def twirl(img, dx=0.5, dy=0.5, **kwargs): + """ Returns the image with a twirl distortion applied to it. + - dx: horizontal origin of the effect, between 0.0 and 1.0. + - dy: vertical origin of the effect, between 0.0 and 1.0. + - radius: the radius of the effect, proportional to the image size. + - angle: the amount of rotation in degrees. + """ + dx, dy, m, i = distortion_mixin(TWIRL, dx, dy, **kwargs) + return filter(img, filter=Distortion(TWIRL, img.texture, dx-0.5, dy-0.5, m, i)) + +#def splash(img, dx=0.5, dy=0.5, radius=0.5) +def splash(img, dx=0.5, dy=0.5, **kwargs): + """ Returns the image with a light-tunnel distortion applied to it. + - dx: horizontal origin of the effect, between 0.0 and 1.0. + - dy: vertical origin of the effect, between 0.0 and 1.0. + - radius: the radius of the unaffected area, proportional to the image size. + """ + dx, dy, m, i = distortion_mixin(SPLASH, dx, dy, **kwargs) + return filter(img, filter=Distortion(SPLASH, img.texture, dx-0.5, dy-0.5, m, i)) + +#def stretch(img, dx=0.5, dy=0.5, radius=0.5, zoom=1.0) +def stretch(img, dx=0.5, dy=0.5, **kwargs): + """ Returns the image with a zoom box distortion applied to it. + - dx: horizontal origin of the effect, between 0.0 and 1.0. + - dy: vertical origin of the effect, between 0.0 and 1.0. + - radius: the radius of the affected area, proportional to the image size. + - zoom: the amount to zoom in (0.0-2.0, where 1.0 means 1x zoomed in, or 200%). + """ + dx, dy, m, i = distortion_mixin(STRETCH, dx, dy, **kwargs) + return filter(img, filter=Distortion(STRETCH, img.texture, dx-0.5, dy-0.5, m, i)) + +#def mirror(img, dx=0.5, dy=0.5, horizontal=True, vertical=True) +def mirror(img, dx=0.5, dy=0.5, **kwargs): + """ Returns the image mirrored along horizontal axis dx and vertical axis dy. + - dx: horizontal origin of the effect, between 0.0 and 1.0. + - dy: vertical origin of the effect, between 0.0 and 1.0. + - horizontal: when True, mirrors the image horizontally. + - vertical : when True, mirrors the image vertically. + """ + dx, dy, m, i = distortion_mixin(MIRROR, dx, dy, **kwargs) + return filter(img, filter=Distortion(MIRROR, img.texture, dx-0.5, dy-0.5, m, i)) + +def dropshadow(img, alpha=0.5, amount=2, kernel=5): + """ Returns a blurred and grayscale version of the image. + If filters are not supported, returns a grayscale version without blur (using Image.color). + """ + if not SUPPORTED: + t = texture(img) + else: + t = blur(img, kernel=kernel, amount=amount).texture + img = isinstance(img, Image) and img.copy(t) or Image(t) + img.color.rgba = (0,0,0, alpha) + return img + +#--- ONSCREEN FILTERS -------------------------------------------------------------------------------- +# These can be used directly as filter parameter for the image() command. +# This may be faster because no offscreen buffer is used to render the effect. + +def inverted(): + return Invert(None) + +def colorized(color=(1,1,1,1), bias=(0,0,0,0)): + return Colorize(None, vec4(*color), vec4(*bias)) + +def adjusted(mode, v): + if mode == BRIGHTNESS: + return BrightnessAdjustment(None, v) + if mode == CONTRAST: + return ContrastAdjustment(None, v) + if mode == SATURATION: + return SaturationAdjustment(None, v) + if mode == HUE: + return HueAdjustment(None, v) + +def desaturated(): + return SaturationAdjustment(None, 0.0) + +def blurred(scale=1.0): + return Gaussian3x3Blur(None, scale) + +def masked(img, alpha=1.0, dx=0, dy=0): + return AlphaMask(None, _q(img).texture, alpha, dx, dy) + +def blended(mode, img, alpha=1.0, dx=0, dy=0): + return Blend(mode, None, _q(img).texture, alpha, dx, dy) + +def distorted(type, dx=0.5, dy=0.5, **kwargs): + dx, dy, m, i = distortion_mixin(type, dx, dy, **kwargs) + return Distortion(type, None, dx-0.5, dy-0.5, m, i) \ No newline at end of file diff --git a/nodeboxgl/gui/__init__.py b/nodeboxgl/gui/__init__.py new file mode 100644 index 0000000..ad9aade --- /dev/null +++ b/nodeboxgl/gui/__init__.py @@ -0,0 +1 @@ +from controls import * \ No newline at end of file diff --git a/nodeboxgl/gui/controls.py b/nodeboxgl/gui/controls.py new file mode 100644 index 0000000..5900650 --- /dev/null +++ b/nodeboxgl/gui/controls.py @@ -0,0 +1,1222 @@ +#=== CONTROLS ======================================================================================== +# Native GUI controls. +# Authors: Tom De Smedt +# License: BSD (see LICENSE.txt for details). +# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) +# http://cityinabottle.org/nodebox + +import os +from glob import glob +from time import time + +from pyglet.text.layout import IncrementalTextLayout +from pyglet.text.caret import Caret + +from nodeboxgl.graphics.geometry import angle, distance, clamp, Bounds, INFINITE +from nodeboxgl.graphics import \ + Layer, Color, Image, image, crop, rect, \ + Text, font, NORMAL, BOLD, CENTER, DEFAULT_FONT, install_font, \ + translate, rotate, \ + line, DASHED, DOTTED, \ + DEFAULT, HAND, TEXT, \ + LEFT, RIGHT, UP, DOWN, TAB, ENTER, BACKSPACE, CTRL, SHIFT, ALT + +def _popdefault(dict, key, default=None): + """ Pops the given key from the dictionary and returns its value (or default). + """ + if key in dict: + return dict.pop(key) + return default + +def _find(match=lambda item: False, list=[]): + """ Returns the first item in the list for which match(item)=True, or None. + """ + for item in list: + if match(item): return item + +#===================================================================================================== + +#--- Theme ------------------------------------------------------------------------------------------- + +class Theme(dict): + + def __init__(self, path, **kwargs): + """ A theme defines the source images for controls and font settings for labels. + A theme is loaded from a given folder path (containing PNG images and TTF font files). + The default theme is in nodebox/graphics/gui/theme/ + Copy this folder and modify it to create a custom theme. + """ + images = glob(os.path.join(path, "*.png")) + images = [(os.path.basename(os.path.splitext(f)[0]), f) for f in images] + fonts = glob(os.path.join(path, "*.ttf")) + fonts = [(os.path.basename(os.path.splitext(f)[0]), install_font(f)) for f in fonts] + fonts = [f[0] for f in fonts if f[1]] # Filename is assumed to be fontname. + dict.__init__(self, images) + self["fonts"] = fonts + self["fontname"] = kwargs.get("fontname", fonts and fonts[-1] or DEFAULT_FONT) + self["fontsize"] = kwargs.get("fontsize", 10) + self["fontweight"] = kwargs.get("fontweight", NORMAL) + self["text"] = kwargs.get("text", Color(1.0)) + +theme = Theme(os.path.join(os.path.dirname(os.path.abspath(__file__)), "theme")) + +#===================================================================================================== + +#--- Control ----------------------------------------------------------------------------------------- + +class Control(Layer): + + def __init__(self, x=0, y=0, id=None, color=(1,1,1,1), **kwargs): + """ Base class for GUI controls. + The Control class inherits from Layer so it must be appended to the canvas (or a container) + to receive events and get drawn. + An id can be given to uniquely identify the control. + If the control is part of a Panel, it can be retrieved with Panel.control_id. + """ + Layer.__init__(self, x=x, y=y, **kwargs) + self.id = id + self.src = {} # Collection of source images. + self.color = color # Color for source images. + self.enabled = True # Enable event listener. + self.duration = 0 # Disable tweening. + self._controls = {} # Lazy index of (id, control) children, see nested(). + self._press = None + + # Control width and height can't be modified after creation. + # Internally, use Layer._set_width() and Layer._set_height(). + @property + def width(self): + return self._get_width() + @property + def height(self): + return self._get_height() + + def on_mouse_enter(self, mouse): + mouse.cursor = HAND + def on_mouse_leave(self, mouse): + mouse.cursor = DEFAULT + + def on_mouse_press(self, mouse): + # Fire Control.on_mouse_doubleclick() when mouse is pressed twice in same location. + # Subclasses need to call this method in their overridden on_mouse_press(). + if self._press and \ + abs(self._press[0] - mouse.x) < 2 and \ + abs(self._press[1] - mouse.y) < 2 and \ + self._press[2] == mouse.button and \ + self._press[3] == mouse.modifiers and \ + self._press[4] - time() > -0.4: + self._press = None + self.on_mouse_doubleclick(mouse) + self._press = (mouse.x, mouse.y, mouse.button, mouse.modifiers, time()) + + def on_mouse_doubleclick(self, mouse): + pass + + def on_key_press(self, keys): + for control in self: + control.on_key_press(keys) + def on_key_release(self, keys): + for control in self: + control.on_key_release(keys) + + def on_action(self): + """ Override this method with a custom action. + """ + pass + + def reset(self): + pass + + def _draw(self): + Layer._draw(self) + + # Control._pack() is called internally to layout child controls. + # This should not happen in Control.update(), which is called every frame. + def _pack(self): + pass + + # With transformed=True, expensive matrix transformations are done. + # Turn off, controls are not meant to be rotated or scaled. + def layer_at(self, x, y, clipped=False, enabled=False, transformed=True, _covered=False): + return Layer.layer_at(self, x, y, clipped, enabled, False, _covered) + + def origin(self, x=None, y=None, relative=False): + return Layer.origin(self, x, y, relative) + def rotate(self, angle): + pass + def scale(self, f): + pass + + def __getattr__(self, k): + # Yields the property with the given name, or + # yields the child control with the given id. + if k in self.__dict__: + return self.__dict__[k] + ctrl = nested(self, k) + if ctrl is not None: + return ctrl + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, k) + + def __repr__(self): + return "%s(id=%s%s)" % ( + self.__class__.__name__, + repr(self.id), + hasattr(self, "value") and ", value="+repr(self.value) or "" + ) + +def nested(control, id): + """ Returns the child Control with the given id, or None. + Also searches all child Layout containers. + """ + # First check the Control._controls cache (=> 10x faster). + # Also check if the control's id changed after it was cached (however unlikely). + # If so, the cached entry is no longer valid. + if id in control._controls: + ctrl = control._controls[id] + if ctrl.id == id: + return ctrl + del control._controls[id] + # Nothing in the cache. + # Traverse all child Control and Layout objects. + m = None + for ctrl in control: + if ctrl.__dict__.get("id") == id: + m = ctrl; break + if isinstance(ctrl, Layout): + m = nested(ctrl, id) + if m is not None: + break + # If a control was found, cache it. + if m is not None: + control._controls[id] = m + return m + +#===================================================================================================== + +#--- Label ------------------------------------------------------------------------------------------- + +class Label(Control): + + def __init__(self, caption, x=0, y=0, width=None, height=None, id=None, **kwargs): + """ A label displaying the given caption, centered in the label's (width, height)-box. + The label does not receive any events. + Optional parameters can include fill, font, fontsize, fontweight. + """ + txt = Text(caption, **{ + "fill" : _popdefault(kwargs, "fill", theme["text"]), + "font" : _popdefault(kwargs, "font", theme["fontname"]), + "fontsize" : _popdefault(kwargs, "fontsize", theme["fontsize"]), + "fontweight" : _popdefault(kwargs, "fontweight", theme["fontweight"]), + "lineheight" : 1, + "align" : CENTER + }) + kwargs.setdefault("width", txt.metrics[0]) + kwargs.setdefault("height", txt.metrics[1]) + Control.__init__(self, x=x, y=y, id=id, **kwargs) + self.enabled = False # Pass on events to the layers underneath. + self._text = txt + self._pack() + + def _get_caption(self): + return self._text.text + def _set_caption(self, string): + self._text.text = string + self._pack() + + caption = property(_get_caption, _set_caption) + + @property + def font(self): + return self._text.font + @property + def fontsize(self): + return self._text.fontsize + @property + def fontweight(self): + return self._text.fontweight + + def _pack(self): + # Center the text inside the label. + self._text.x = 0.5 * (self.width - self._text.metrics[0]) + self._text.y = 0.5 * (self.height - self._text.metrics[1]) + + def draw(self): + self._text.draw() + +#===================================================================================================== + +#--- BUTTON ------------------------------------------------------------------------------------------ + +class Button(Control): + + def __init__(self, caption="", action=None, x=0, y=0, width=125, id=None, **kwargs): + """ A clickable button that will fire Button.on_action() when clicked. + The action handler can be defined in a subclass, or given as a function. + """ + Control.__init__(self, x=x, y=y, width=width, id=id, **kwargs) + img, w = Image(theme["button"]), 20 + self.src = { + "face" : crop(img, w, 0, 1, img.height), + "cap1" : crop(img, 0, 0, w, img.height), + "cap2" : crop(img, img.width-w, 0, w, img.height), + } + if action: + # Override the Button.on_action() method from the given function. + self.set_method(action, name="on_action") + _popdefault(kwargs, "width") + _popdefault(kwargs, "height") + self.append(Label(caption, **kwargs)) + self._pack() + + def _get_caption(self): + return self[0].caption + def _set_caption(self, string): + self[0].caption = string + self._pack() + + caption = property(_get_caption, _set_caption) + + def _pack(self): + # Button size can not be smaller than its caption. + w = max(self.width, self[0].width + self[0].fontsize * 2) + self._set_width(w) + self._set_height(self.src["face"].height) + + def update(self): + # Center the text inside the button. + # This happens each frame because the position changes when the button is pressed. + self[0].x = 0.5 * (self.width - self[0].width) + self[0].y = 0.5 * (self.height - self[0].height) - self.pressed + + def draw(self): + clr = self.pressed and [v*0.75 for v in self.color] or self.color + im1, im2, im3 = self.src["cap1"], self.src["cap2"], self.src["face"] + image(im1, 0, 0, height=self.height, color=clr) + image(im2, x=self.width-im2.width, height=self.height, color=clr) + image(im3, x=im1.width, width=self.width-im1.width-im2.width, height=self.height, color=clr) + + def on_mouse_release(self, mouse): + Control.on_mouse_release(self, mouse) + if self.contains(mouse.x, mouse.y, transformed=False): + # Only fire event if mouse is actually released on the button. + self.on_action() + +#--- ACTION ------------------------------------------------------------------------------------------ + +class Action(Control): + + def __init__(self, action=None, x=0, y=0, id=None, **kwargs): + """ A clickable button that will fire Action.on_action() when clicked. + Actions display an icon instead of a text caption. + Actions are meant to be used for interface management: + e.g. closing or minimizing a panel, navigating to the next page, ... + """ + Control.__init__(self, x=x, y=y, id=id, **kwargs) + self.src = {"face": Image(theme["action"])} + self._pack() + if action: + # Override the Button.on_action() method from the given function. + self.set_method(action, name="on_action") + + def _pack(self): + self._set_width(self.src["face"].width) + self._set_height(self.src["face"].height) + + def draw(self): + clr = self.pressed and [v*0.75 for v in self.color] or self.color + image(self.src["face"], 0, 0, color=clr) + + def on_mouse_release(self, mouse): + Control.on_mouse_release(self, mouse) + if self.contains(mouse.x, mouse.y, transformed=False): + # Only fire event if mouse is actually released on the button. + self.on_action() + +class Close(Action): + + def __init__(self, action=None, x=0, y=0, id=None, **kwargs): + """ An action that hides the parent control (e.g. a Panel) when pressed. + """ + Action.__init__(self, action, x=x, y=y, id=id, **kwargs) + self.src["face"] = Image(theme["action-close"]) + + def on_action(self): + self.parent.hidden = True + +#===================================================================================================== + +#--- SLIDER ------------------------------------------------------------------------------------------ + +class Handle(Control): + + def __init__(self, parent): + # The slider handle can protrude from the slider bar, + # so it is a separate layer that fires its own events. + Control.__init__(self, + width = parent.src["handle"].width, + height = parent.src["handle"].height) + self.parent = parent + + def on_mouse_press(self, mouse): + self.parent.on_mouse_press(mouse) + def on_mouse_drag(self, mouse): + self.parent.on_mouse_drag(mouse) + def on_mouse_release(self, mouse): + self.parent.on_mouse_release(mouse) + + def draw(self): + clr = self.parent.pressed | self.pressed and [v*0.75 for v in self.color] or self.color + image(self.parent.src["handle"], 0, 0, color=clr) + +class Slider(Control): + + def __init__(self, default=0.5, min=0.0, max=1.0, steps=100, x=0, y=0, width=125, id=None, **kwargs): + """ A draggable slider that will fire Slider.on_action() when dragged. + The slider's value can be retrieved with Slider.value. + """ + Control.__init__(self, x=x, y=y, width=width, id=id, **kwargs) + self.min = min # Slider minimum value. + self.max = max # Slider maximum value. + self.default = default # Slider default value. + self.value = default # Slider current value. + self.steps = steps # Number of steps from min to max. + img, w = Image(theme["slider"]), 5 + self.src = { + "face1" : crop(img, w, 0, 1, img.height), + "face2" : crop(img, img.width-w, 0, 1, img.height), + "cap1" : crop(img, 0, 0, w, img.height), + "cap2" : crop(img, img.width-w, 0, w, img.height), + "handle" : Image(theme["slider-handle"]) + } + # The handle is a separate layer. + self.append(Handle(self)) + self._pack() + + def _get_value(self): + return self.min + self._t * (self.max-self.min) + def _set_value(self, value): + self._t = clamp(float(value-self.min) / (self.max-self.min or -1), 0.0, 1.0) + + value = property(_get_value, _set_value) + + @property + def relative(self): + """ Yields the slider position as a relative number (0.0-1.0). + """ + return self._t + + def _pack(self): + w = max(self.width, self.src["cap1"].width + self.src["cap2"].width) + self._set_width(w) + self._set_height(self.src["face1"].height) + + def reset(self): + Control.reset(self) + self.value = self.default + + def update(self): + # Update the handle's position, before Slider.draw() occurs (=smoother). + self[0].x = self._t * self.width - 0.5 * self[0].width + self[0].y = 0.5 * (self.height - self[0].height) + + def draw(self): + t = self._t * self.width + im1, im2, im3, im4 = self.src["cap1"], self.src["cap2"], self.src["face1"], self.src["face2"] + clr = self.color + image(im1, x=0, y=0, color=clr) + image(im2, x=self.width-im2.width, y=0, color=clr) + image(im3, x=im1.width, y=0, width=t-im1.width, color=clr) + image(im4, x=t, y=0, width=self.width-t-im2.width+1, color=clr) + + def on_mouse_press(self, mouse): + x0, y0 = self.absolute_position() # Can be nested in other layers. + step = 1.0 / max(self.steps, 1) + # Calculate relative value from the slider handle position. + # The inner width is a bit smaller to accomodate for the slider handle. + # Clamp the relative value to the nearest step. + self._t = (mouse.x-x0-self.height*0.5) / float(self.width-self.height) + self._t = self._t - self._t % step + step + self._t = clamp(self._t, 0.0, 1.0) + self.on_action() + + def on_mouse_drag(self, mouse): + self.on_mouse_press(mouse) + +#===================================================================================================== + +#--- KNOB -------------------------------------------------------------------------------------------- + +class Knob(Control): + + def __init__(self, default=0, limit=True, x=0, y=0, id=None, **kwargs): + """ A twistable knob that will fire Knob.on_action() when dragged. + The knob's angle can be retrieved with Knob.value (in degrees, 0-360). + With CTRL pressed, twists by a very small amount. + """ + Control.__init__(self, x=x, y=y, id=id, **kwargs) + self.default = default # Knob default angle. + self.value = default # Knob current angle. + self._limit = limit # Constrain between 0-360 or scroll endlessly? + self.src = { + "face" : Image(theme["knob"]), + "socket" : Image(theme["knob-socket"]), + } + self._pack() + + @property + def relative(self): + """ Yields the knob's angle as a relative number (0.0-1.0). + """ + return self.value % 360 / 360.0 + + def _pack(self): + self._set_width(self.src["socket"].width) + self._set_height(self.src["socket"].height) + + def reset(self): + Control.reset(self) + self.value = self.default + + def draw(self): + clr1 = self.color + clr2 = self.pressed and [v*0.85 for v in self.color] or self.color + translate(self.width/2, self.height/2) + image(self.src["socket"], -self.width/2, -self.height/2, color=clr1) + rotate(360-self.value) + image(self.src["face"], -self.width/2, -self.height/2, color=clr2) + + def on_mouse_press(self, mouse): + self.value += mouse.dy * (CTRL in mouse.modifiers and 1 or 5) + if self._limit: + self.value %= 360 + self.on_action() + + def on_mouse_drag(self, mouse): + self.on_mouse_press(mouse) + +#===================================================================================================== + +#--- FLAG -------------------------------------------------------------------------------------------- + +class Flag(Control): + + def __init__(self, default=False, x=0, y=0, id=None, **kwargs): + """ A checkbox control that fires Flag.on_action() when checked. + The checkbox value can be retrieved with Flag.value. + """ + Control.__init__(self, x=x, y=y, id=id, **kwargs) + self.default = bool(default) # Flag default value. + self.value = bool(default) # Flag current value. + self.src = { + "face" : Image(theme["flag"]), + "checked" : Image(theme["flag-checked"]), + } + self._pack() + + def _pack(self): + self._set_width(self.src["face"].width) + self._set_height(self.src["face"].height) + + def reset(self): + self.value = self.default + + def draw(self): + clr = self.color + image(self.value and self.src["checked"] or self.src["face"], color=clr) + + def on_mouse_release(self, mouse): + Control.on_mouse_release(self, mouse) + if self.contains(mouse.x, mouse.y, transformed=False): + # Only change status if mouse is actually released on the button. + self.value = not self.value + self.on_action() + +Checkbox = CheckBox = Flag + +#===================================================================================================== + +#--- Editable ---------------------------------------------------------------------------------------- + +EDITING = None +editing = lambda: EDITING + +class Editable(Control): + + def __init__(self, value="", x=0, y=0, width=125, height=20, padding=(0,0), wrap=False, id=None, **kwargs): + """ An editable text box. + When clicked, it has the focus and can receive keyboard events. + With wrap=True, several lines of text will wrap around the width. + Optional parameters can include fill, font, fontsize, fontweight. + """ + txt = Text(value or " ", **{ + "fill" : _popdefault(kwargs, "fill", Color(0,0.9)), + "font" : _popdefault(kwargs, "font", theme["fontname"]), + "fontsize" : _popdefault(kwargs, "fontsize", theme["fontsize"]), + "fontweight" : _popdefault(kwargs, "fontweight", theme["fontweight"]), + "lineheight" : _popdefault(kwargs, "lineheight", wrap and 1.25 or 1.0), + "align" : LEFT + }) + kwargs["width"] = width + kwargs["height"] = height + Control.__init__(self, x=x, y=y, id=id, **kwargs) + self.reserved = kwargs.get("reserved", [ENTER, TAB]) + self._padding = padding + self._i = 0 # Index of character on which the mouse is pressed. + self._empty = value == "" and True or False + self._editor = IncrementalTextLayout(txt._label.document, width, height, multiline=wrap) + self._editor.content_valign = wrap and "top" or "center" + self._editor.selection_background_color = (170, 200, 230, 255) + self._editor.selection_color = txt._label.color + self._editor.caret = Caret(self._editor) + self._editor.caret.visible = False + self._editing = False # When True, cursor is blinking and text can be edited. + Editable._pack(self) # On init, call Editable._pack(), not the derived Field._pack(). + + def _pack(self): + self._editor.x = self._padding[0] + self._editor.y = self._padding[1] + self._editor.width = max(0, self.width - self._padding[0] * 2) + self._editor.height = max(0, self.height - self._padding[1] * 2) + + def _get_value(self): + # IncrementalTextLayout in Pyglet 1.1.4 has a bug with empty strings. + # We keep track of empty strings with Editable._empty to avoid this. + return not self._empty and self._editor.document.text or u"" + def _set_value(self, string): + self._editor.begin_update() + self._editor.document.text = string or " " + self._editor.end_update() + self._empty = string == "" and True or False + + value = property(_get_value, _set_value) + + def _get_editing(self): + return self._editing + def _set_editing(self, b): + self._editing = b + self._editor.caret.visible = b + global EDITING + if b is False and EDITING == self: + EDITING = None + if b is True: + EDITING = self + # Cursor is blinking and text can be edited. + # Visit all layers on the canvas. + # Remove the caret from all other Editable controls. + for layer in (self.root.canvas and self.root.canvas.layers or []): + layer.traverse(visit=lambda layer: \ + isinstance(layer, Editable) and layer != self and \ + setattr(layer, "editing", False)) + + editing = property(_get_editing, _set_editing) + + @property + def selection(self): + # Yields a (start, stop)-tuple with the indices of the current selected text. + return (self._editor.selection_start, + self._editor.selection_end) + + @property + def selected(self): + # Yields True when text is currently selected. + return self.selection[0] != self.selection[1] + + @property + def cursor(self): + # Yields the index at the text cursor (caret). + return self._editor.caret.position + + def index(self, x, y): + """ Returns the index of the character in the text at position x, y. + """ + x0, y0 = self.absolute_position() + i = self._editor.get_position_from_point(x-x0, y-y0) + if self._editor.get_point_from_position(0)[0] > x-x0: # Pyglet bug? + i = 0 + if self._empty: + i = 0 + return i + + def on_mouse_enter(self, mouse): + mouse.cursor = TEXT + + def on_mouse_press(self, mouse): + i = self._i = self.index(mouse.x, mouse.y) + self._editor.set_selection(0, 0) + self.editing = True + self._editor.caret.position = i + Control.on_mouse_press(self, mouse) + + def on_mouse_release(self, mouse): + if not self.dragged: + self._editor.caret.position = self.index(mouse.x, mouse.y) + Control.on_mouse_release(self, mouse) + + def on_mouse_drag(self, mouse): + i = self.index(mouse.x, mouse.y) + self._editor.selection_start = max(min(self._i, i), 0) + self._editor.selection_end = min(max(self._i, i), len(self.value)) + self._editor.caret.visible = False + Control.on_mouse_drag(self, mouse) + + def on_mouse_doubleclick(self, mouse): + # Select the word at the mouse position. + # Words are delimited by non-alphanumeric characters. + i = self.index(mouse.x, mouse.y) + delimiter = lambda ch: not (ch.isalpha() or ch.isdigit()) + if i < len(self.value) and delimiter(self.value[i]): + self._editor.set_selection(i, i+1) + if i == len(self.value) and self.value != "" and delimiter(self.value[i-1]): + self._editor.set_selection(i-1, i) + a = _find(lambda (i,ch): delimiter(ch), enumerate(reversed(self.value[:i]))) + b = _find(lambda (i,ch): delimiter(ch), enumerate(self.value[i:])) + a = a and i-a[0] or 0 + b = b and i+b[0] or len(self.value) + self._editor.set_selection(a, b) + + def on_key_press(self, keys): + if self._editing: + self._editor.caret.visible = True + i = self._editor.caret.position + if keys.code == LEFT: + # The left arrow moves the text cursor to the left. + self._editor.caret.position = max(i-1, 0) + elif keys.code == RIGHT: + # The right arrow moves the text cursor to the right. + self._editor.caret.position = min(i+1, len(self.value)) + elif keys.code in (UP, DOWN): + # The up arrows moves the text cursor to the previous line. + # The down arrows moves the text cursor to the next line. + y = keys.code == UP and -1 or +1 + n = self._editor.get_line_count() + i = self._editor.get_position_on_line( + min(max(self._editor.get_line_from_position(i)+y, 0), n-1), + self._editor.get_point_from_position(i)[0]) + self._editor.caret.position = i + elif keys.code == TAB and TAB in self.reserved: + # The tab key navigates away from the control. + self._editor.caret.position = 0 + self.editing = False + elif keys.code == ENTER and ENTER in self.reserved: + # The enter key executes on_action() and navigates away from the control. + self._editor.caret.position = 0 + self.editing = False + self.on_action() + elif keys.code == BACKSPACE and self.selected: + # The backspace key removes the current text selection. + self.value = self.value[:self.selection[0]] + self.value[self.selection[1]:] + self._editor.caret.position = max(self.selection[0], 0) + elif keys.code == BACKSPACE and i > 0: + # The backspace key removes the character at the text cursor. + self.value = self.value[:i-1] + self.value[i:] + self._editor.caret.position = max(i-1, 0) + elif keys.char: + if self.selected: + # Typing replaces any text currently selected. + self.value = self.value[:self.selection[0]] + self.value[self.selection[1]:] + self._editor.caret.position = i = max(self.selection[0], 0) + ch = keys.char + ch = ch.replace("\r", "\n\r") + self.value = self.value[:i] + ch + self.value[i:] + self._editor.caret.position = min(i+1, len(self.value)) + self._editor.set_selection(0, 0) + + def draw(self): + self._editor.draw() + +#--- Field ------------------------------------------------------------------------------------------- + +class Field(Editable): + + def __init__(self, value="", hint="", action=None, x=0, y=0, width=125, padding=5, id=None, **kwargs): + """ A single-line text input field. + The string value can be retrieved with Field.value. + """ + Editable.__init__(self, value, x=x, y=y, width=width, padding=[padding]*2, id=id, **kwargs) + img, w = Image(theme["field"]), 10 + self.src = { + "cap1" : crop(img, 0, img.height-w, w, w), + "cap2" : crop(img, img.width-w, img.height-w, w, w), + "cap3" : crop(img, 0, 0, w, w), + "cap4" : crop(img, img.width-w, 0, w, w), + "top" : crop(img, w+1, img.height-w, 1, w), + "bottom" : crop(img, w+1, 0, 1, w), + "left" : crop(img, 0, w+1, w, 1), + "right" : crop(img, img.width-w, w+1, w, 1), + "face" : crop(img, w+1, w+1, 1, 1) + } + if action: + # Override the Button.on_action() method from the given function. + self.set_method(action, name="on_action") + self.default = value + self.append(Label(hint, fill=Color(0, 0.4))) + self._pack() + + def _get_hint(self): + return self[0].caption + def _set_hint(self, string): + self[0].caption = string + + hint = property(_get_hint, _set_hint) + + def reset(self): + self.value = self.default + + def _pack(self): + Editable._pack(self) + w = max(self.width, self.src["cap1"].width + self.src["cap2"].width) + h = max(self.height, self.src["cap1"].width + self.src["cap3"].width) + h = max(h, int(self._editor.document.get_style("line_spacing") * 1.5 + self._padding[1] * 2)) + self._set_width(w) + self._set_height(h) + # Position the hint text (if no other text is in the field). + # The hint will not span multiple line if it is wider than the field + # (it was designed to be a short word or phrase). + self[0].x = self._padding[0] + self[0].y = self.height - self._padding[1] - self[0]._text.metrics[1] * 1.25 + self[0]._pack() + + def on_action(self): + pass + + def update(self): + self[0].hidden = self.editing or self.value != "" + + def draw(self): + im1, im2, im3 = self.src["cap1"], self.src["cap2"], self.src["top"] + im4, im5, im6 = self.src["cap3"], self.src["cap4"], self.src["bottom"] + im7, im8, im9 = self.src["left"], self.src["right"], self.src["face"] + clr = self.color + image(im1, 0, self.height-im1.height, color=clr) + image(im2, self.width-im2.width, self.height-im2.height, color=clr) + image(im3, im1.width, self.height-im3.height, width=self.width-im1.width-im2.width, color=clr) + image(im4, 0, 0, color=clr) + image(im5, self.width-im5.width, 0, color=clr) + image(im6, im4.width, 0, width=self.width-im4.width-im5.width, color=clr) + image(im7, 0, im4.height, height=self.height-im1.height-im4.height, color=clr) + image(im8, self.width-im8.width, im4.height, height=self.height-im2.height-im5.height, color=clr) + image(im9, im4.width, im6.height, width=self.width-im7.width-im8.width, height=self.height-im3.height-im6.height, color=clr) + Editable.draw(self) + +#===================================================================================================== + +#--- Rulers ------------------------------------------------------------------------------------------ + +class Rulers(Control): + + def __init__(self, step=10, interval=5, crosshair=False, color=(0,0,0,1)): + """ A horizontal and vertical ruler displaying the width/height of the parent at intervals. + A measurement line is drawn at each step(e.g. at 10 20 30...) + A label with the value is drawn at each interval (e.g. 50 | | | | 100 | | | | 150). + """ + Control.__init__(self, x=0, y=0) + self.enabled = False + self.step = step + self.interval = interval + self.crosshair = crosshair + self.color = color + self._dirty = False + self._markers = {} + self._pack() + + def _get_step(self): + return self._step + def _set_step(self, v): + self._step = round(v) + self._dirty = True + + step = property(_get_step, _set_step) + + def _get_interval(self): + return self._interval + def _set_interval(self, v): + self._interval = round(v) + self._dirty = True + + interval = property(_get_interval, _set_interval) + + def _pack(self): + # Cache Text objects for the measurement markers. + # This happens whenever the canvas resizes, or the step or interval changes. + # This will raise an error if the parent's width or height is None (infinite). + p = self.parent or self.canvas + if p and (self._dirty or self.width != p.width or self.height != p.height): + self._dirty = False + self._set_width(p.width) + self._set_height(p.height) + for i in range(int(round(max(self.width, self.height) / self._step))): + if i % self._interval == 0: + self._markers.setdefault(i*self._step, + Text(str(int(round(i*self._step))), + fontname = theme["fontname"], + fontsize = theme["fontsize"] * 0.6, + fill = self.color)) + + def update(self): + self._pack() + + def draw(self): + length = 5 + # Draw the horizontal ruler. + for i in range(1, int(round(self.height / self._step))): + v, mark = i*self._step, i%self.interval==0 + line(0, v, mark and length*3 or length, v, + stroke = self.color, + strokewidth = 0.5) + if mark: + self._markers[v].draw(length*3-self._markers[v].metrics[0], v+2) + # Draw the vertical ruler. + for i in range(1, int(round(self.width / self._step))): + v, mark = i*self._step, i%self.interval==0 + line(v, 0, v, mark and length*3 or length, + stroke = self.color, + strokewidth = 0.5) + if mark: + self._markers[v].draw(v+2, length*3-self._markers[v].fontsize) + # Draw the crosshair. + if self.crosshair: + line(0, self.canvas.mouse.y, self.width, self.canvas.mouse.y, + stroke = self.color, + strokewidth = 0.5, + strokestyle = DOTTED) + line(self.canvas.mouse.x, 0, self.canvas.mouse.x, self.height, + stroke = self.color, + strokewidth = 0.5, + strokestyle = DOTTED) + +#===================================================================================================== + +#--- PANEL ------------------------------------------------------------------------------------------- + +class Panel(Control): + + def __init__(self, caption="", fixed=False, modal=True, x=0, y=0, width=175, height=250, **kwargs): + """ A panel containing other controls that can be dragged when Panel.fixed=False. + Controls or (Layout groups) can be added with Panel.append(). + """ + Control.__init__(self, x=x, y=y, width=max(width,60), height=max(height,60), **kwargs) + img, w = Image(theme["panel"]), 30 + self.src = { + "cap1" : crop(img, 0, img.height-w, w, w), + "cap2" : crop(img, img.width-w, img.height-w, w, w), + "cap3" : crop(img, 0, 0, w, w), + "cap4" : crop(img, img.width-w, 0, w, w), + "top" : crop(img, w+1, img.height-w, 1, w), + "bottom" : crop(img, w+1, 0, 1, w), + "left" : crop(img, 0, w+1, w, 1), + "right" : crop(img, img.width-w, w+1, w, 1), + "face" : crop(img, w+1, w+1, 1, 1) + } + _popdefault(kwargs, "width") + _popdefault(kwargs, "height") + self.append(Label(caption)) + self.append(Close()) + #self.extend(kwargs.pop("controls", []), **kwargs) + self.fixed = fixed # Draggable? + self.modal = modal # Closeable? + self._pack() + + def _get_caption(self): + return self._caption.text + def _set_caption(self, str): + self._caption.text = str + self._pack() + + caption = property(_get_caption, _set_caption) + + @property + def controls(self): + return iter(self[2:]) # self[0] is the Label, + # self[1] is the Close action. + + def insert(self, i, control): + """ Inserts the control, or inserts all controls in the given Layout. + """ + if isinstance(control, Layout): + # If the control is actually a Layout (e.g. ordered group of controls), apply it. + control.apply() + Layer.insert(self, i, control) + + def append(self, control): + self.insert(len(self), control) + def extend(self, controls): + for control in controls: + self.append(control) + + def _pack(self): + # Center the caption in the label's header. + # Position the close button in the top right corner. + self[0].x = 0.5 * (self.width - self[0].width) + self[0].y = self.height - self.src["top"].height + 0.5 * (self.src["top"].height - self[0].height) + self[1].x = self.width - self[1].width - 4 + self[1].y = self.height - self[1].height - 2 + + def pack(self, padding=20): + """ Resizes the panel to the most compact size, + based on the position and size of the controls in the panel. + """ + def _visit(control): + if control not in (self, self[0], self[1]): + self._b = self._b and self._b.union(control.bounds) or control.bounds + self._b = None + self.traverse(_visit) + for control in self.controls: + control.x += padding + self.x - self._b.x + control.y += padding + self.y - self._b.y + self._set_width( padding + self._b.width + padding) + self._set_height(padding + self._b.height + padding + self.src["top"].height) + self._pack() + + def update(self): + self[1].hidden = self.modal + self[1].color = self.color + + def draw(self): + im1, im2, im3 = self.src["cap1"], self.src["cap2"], self.src["top"] + im4, im5, im6 = self.src["cap3"], self.src["cap4"], self.src["bottom"] + im7, im8, im9 = self.src["left"], self.src["right"], self.src["face"] + clr = self.color + image(im1, 0, self.height-im1.height, color=clr) + image(im2, self.width-im2.width, self.height-im2.height, color=clr) + image(im3, im1.width, self.height-im3.height, width=self.width-im1.width-im2.width, color=clr) + image(im4, 0, 0, color=clr) + image(im5, self.width-im5.width, 0, color=clr) + image(im6, im4.width, 0, width=self.width-im4.width-im5.width, color=clr) + image(im7, 0, im4.height, height=self.height-im1.height-im4.height, color=clr) + image(im8, self.width-im8.width, im4.height, height=self.height-im2.height-im5.height, color=clr) + image(im9, im4.width, im6.height, width=self.width-im7.width-im8.width, height=self.height-im3.height-im6.height, color=clr) + + def on_mouse_enter(self, mouse): + mouse.cursor = DEFAULT + + def on_mouse_press(self, mouse): + self._dragged = not self.fixed and mouse.y > self.y+self.height-self.src["top"].height + + def on_mouse_drag(self, mouse): + if self._dragged and not self.fixed: + self.x += mouse.dx + self.y += mouse.dy + self.dragged = self._dragged + + def open(self): + self.hidden = False + def close(self): + self.hidden = True + +class Dock(Panel): + + def __init__(self, caption="", anchor=LEFT, fixed=True, modal=True, **kwargs): + """ A panel attached to the edge of the canvas (LEFT or RIGHT), extending the full height. + With fixed=False, it can be snapped from the edge and dragged as a normal panel. + """ + kwargs.setdefault("x", anchor==RIGHT and INFINITE or 0) + kwargs.setdefault("y", 0) + Panel.__init__(self, caption=caption, fixed=fixed, modal=modal, **kwargs) + self.anchor = anchor + self.snap = 1 + + def update(self): + Panel.update(self) + if self.canvas is not None: + if self.anchor == LEFT and self.x < self.snap: + if self.dragged and self.x == 0: + # Stop drag once snapped to the edge. + self._dragged = False + self.x = 0 + self.y = self.canvas.height - self.height + if self.anchor == RIGHT and self.x > self.canvas.width-self.width - self.snap: + if self.dragged and self.x == self.canvas.width-self.width: + self._dragged = False + self.x = self.canvas.width - self.width + self.y = self.canvas.height - self.height + + def draw(self): + im1, im2 = self.src["top"], self.src["face"] + if self.canvas is not None and \ + (self.anchor == LEFT and self.x == 0) or \ + (self.anchor == RIGHT and self.x == self.canvas.width-self.width): + clr = self.color + image(im1, 0, self.height-im1.height, width=self.width, color=clr) + image(im2, 0, -self.canvas.height+self.height, width=self.width, height=self.canvas.height-im1.height, color=clr) + else: + Panel.draw(self) + +#===================================================================================================== + +#--- Layout ------------------------------------------------------------------------------------------ + +class Layout(Layer): + + SPACING = 10 # Spacing between controls in a Layout. + + def __init__(self, controls=[], x=0, y=0, **kwargs): + """ A group of controls with a specific layout. + Controls can be added with Layout.append(). + The layout will be applied when Layout.apply() is called. + This happens automatically if a layout is appended to a Panel. + """ + kwargs["width"] = 0 + kwargs["height"] = 0 + Layer.__init__(self, x=x, y=y, **kwargs) + self._controls = {} # Lazy cache of (id, control)-children, see nested(). + self.spacing = kwargs.get("spacing", Layout.SPACING) + self.extend(controls) + + def insert(self, i, control): + """ Inserts the control, or inserts all controls in the given Layout. + """ + if isinstance(control, Layout): + # If the control is actually a Layout (e.g. ordered group of controls), apply it. + control.apply() + Layer.insert(self, i, control) + + def append(self, control): + self.insert(len(self), control) + def extend(self, controls): + for control in controls: + self.append(control) + + def on_key_press(self, keys): + for control in self: + control.on_key_press(keys) + def on_key_release(self, keys): + for control in self: + control.on_key_release(keys) + + def __getattr__(self, k): + # Yields the property with the given name, or + # yields the child control with the given id. + if k in self.__dict__: + return self.__dict__[k] + ctrl = nested(self, k) + if ctrl is not None: + return ctrl + raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, k) + + def apply(self): + """ Adjusts the position and size of the controls to match the layout. + """ + self.width = max(control.width for control in self) + self.height = max(control.height for control in self) + + def __repr__(self): + return "Layout(type=%s)" % repr(self.__class__.__name__.lower()) + + # Debug mode: + #def draw(self): + # rect(0, 0, self.width, self.height, fill=None, stroke=(0,0.5,1,1)) + +#--- Layout: Labeled ---------------------------------------------------------------------------------- + +class Labeled(Layout): + + def __init__(self, controls=[], x=0, y=0, **kwargs): + """ A layout where each control has an associated text label. + """ + Layout.__init__(self, controls=[], x=x, y=y, **kwargs) + self.controls = [] + self.captions = [] + self.extend(controls) + + def insert(self, i, control, caption=""): + """ Inserts a new control to the layout, with an associated caption. + Each control will be drawn in a new row. + """ + self.controls.insert(i, control) + self.captions.insert(i, Label(caption.upper(), + fontsize = theme["fontsize"] * 0.8, + fill = theme["text"].rgb+(theme["text"].a * 0.8,))) + Layout.insert(self, i, self.controls[i]) + Layout.insert(self, i, self.captions[i]) + + def append(self, control, caption=""): + self.insert(len(self)/2, control, caption) + def extend(self, controls): + for control in controls: + caption, control = isinstance(control, tuple) and control or ("", control) + self.append(control, caption) + + def remove(self, control): + self.pop(self.controls.index(control)) + def pop(self, i): + self.captions.pop(i); return self.controls.pop(i) + +#--- Layout: Rows ------------------------------------------------------------------------------------ + +class Rows(Labeled): + + def __init__(self, controls=[], x=0, y=0, width=125, **kwargs): + """ A layout where each control appears on a new line. + Each control has an associated text caption, displayed to the left of the control. + The given width defines the desired width for each control. + """ + Labeled.__init__(self, controls, x=x, y=y, **kwargs) + self._maxwidth = width + + def apply(self): + """ Adjusts the position and width of all the controls in the layout: + - each control is placed next to its caption, with spacing in between, + - each caption is aligned to the right, and centered vertically, + - the width of all Label, Button, Slider, Field controls is evened out. + """ + mw = self._maxwidth + for control in self.controls: + if isinstance(control, Layout): + # Child containers in the layout can be wider than the desired width. + # adjusting mw at the start will make controls wider to line out with the total width, + # adjusting it at the end would just ensure that the layout is wide enough. + mw = max(mw, control.width) + w1 = max(caption.width for caption in self.captions) + w2 = max(control.width for control in self.controls) + w2 = min(w2, mw) + dx = 0 + dy = 0 + for caption, control in reversed(zip(self.captions, self.controls)): + if isinstance(control, Layout) and control.height > caption.height * 2: + caption.y = dy + control.height - caption.height # valign top. + if isinstance(control, (Label, Button, Slider, Field)): + control._set_width(mw) + control._pack() + caption.x = dx + w1 - caption.width # halign right. + control.x = dx + w1 + (w1>0 and self.spacing) + caption.y = dy + 0.5 * (control.height - caption.height) # valign center. + control.y = dy + dy += max(caption.height, control.height) + self.spacing + self.width = w1 + max(w2, mw) + (w1>0 and self.spacing) + self.height = dy - self.spacing + +TOP, BOTTOM, CENTER = "top", "bottom", "center" + +class Row(Labeled): + + def __init__(self, controls=[], x=0, y=0, width=125, align=CENTER, **kwargs): + """ A layout where each control appears in a new column. + Each control has an associated text caption, displayed on top of the control. + The given width defines the desired width for each control. + """ + Labeled.__init__(self, controls, x=x, y=y, **kwargs) + self._maxwidth = width + self._align = align + + def apply(self): + """ Adjusts the position and width of all the controls in the layout: + - each control is placed centrally below its caption, with spacing in between, + - the width of all Label, Button, Slider, Field controls is evened out. + """ + mw = self._maxwidth + da = {TOP: 1.0, BOTTOM: 0.0, CENTER: 0.5}.get(self._align, 0.5) + h1 = max(control.height for control in self.controls) + h2 = max(caption.height for caption in self.captions) + dx = 0 + dy = 0 + for caption, control in zip(self.captions, self.controls): + if isinstance(control, (Label, Button, Slider, Field)): + control._set_width(mw) + control._pack() + caption.x = dx + 0.5 * max(control.width - caption.width, 0) # halign center + control.x = dx + 0.5 * max(caption.width - control.width, 0) # halign center + caption.y = dy + h1 + (h2>0 and self.spacing) + control.y = dy + da * (h1 - control.height) # valign center + dx += max(caption.width, control.width) + self.spacing + self.width = dx - self.spacing + self.height = h1 + h2 + (h2>0 and self.spacing) diff --git a/nodeboxgl/gui/theme/Droid Sans-Bold.ttf b/nodeboxgl/gui/theme/Droid Sans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7ac04b6f0d8a7e8407ec37445a29ad72d6c43fd3 GIT binary patch literal 191032 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 literal 0 HcmV?d00001 diff --git a/nodeboxgl/gui/theme/Droid Sans.ttf b/nodeboxgl/gui/theme/Droid Sans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..767c63ad000e3eea20f3cb7a43ba9f4154ed7a5d GIT binary patch literal 190044 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%0D=-PBu&{ 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 ZFaX~&`WcM@!{h(}002ovPDHLkV1iTf>!bhx literal 0 HcmV?d00001 diff --git a/nodeboxgl/gui/theme/flag.png b/nodeboxgl/gui/theme/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..958fd823f9b56125147e25b807ba060f8b1a6f40 GIT binary patch literal 504 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 dZP#A{3;+c8)W2b~eEkx@aAjG5`Ls`8xT+@3Rc zI-}EFod)Z9;Bf2Xb_E*p@Sa=MHR*UfPM$#ODjN=m&!uVlhSY1a|BTcXsXPIIzEMft zllrr1nlGg8OsCU**{`J5&Kj=pQ=no-igi*z_ zSS(aLhf?oOCX+i(Iw#UjJ{pZ;*{D?tkJD?r4Rwn1OX`JFN-y@JjMsE=Sl4R+0M3iL!)`ELGpCd*g(H(**Vam7 z5o~Z2 z1^_lqIrf~+Wpj%5{_1m zXaHaf;>m+&;^%NkHvrIe%2_^#QzY&On_&Xd0e}vr6M{|Z-!G9O8vxis!byG9IdK30 zU<#sKit$YRkT8vy94 zrHXw*O9cSCX{q>W0|0cLa-Jw0+A09pmTYLL0AP15Rj?8d00O|Kgg*sL!U2HYNQkch z0CpxE7K{O)3s^J;fStl^aR4CU0KoqbgaZHw2LKQb0KnStJ{$lb;Q#=_0RZSsI17Hb z2>@MSE?JxBYo|9F93kGFo)FUl*$~_3a57UtJF87902Gb-F$0KSvn>NM-4QWnu(D< zmT|#a4gjnp8(X_khuoBLYHn#$PCgoqR64m-DK*fECYo1BIsmYSY?NEpE$LmV$5KZs zo*vI(ppzWm>Ykf7jx3x!atX)F zrVheMoLuz8)LnF8rN=Hv4NW+OB^`tV&`;r1E{sf_a8x#jwm)^UX(`+V5<8hhsVA)M z?3r)|PB^^Y0-%4?PB=3Y%fuuzu?oqiO5AU$ipW|?G@*6|3+pzelTAv>0q9-2i33S! zt7dM0*+x0HB0WbcEP)=-3zN17vCjA0kVZ>`s9oI0OS71kotQ{IS2U_zMYXQ|Q6* z)4TiJ{qBAz6h%Q?bX~t=$0O4RrbcC+Go3M=c%J9*Sb>8KdS=IqX`1~`r$d^imG&SA zXti3=bUIzI-w}g9k6;D8S(bIHC<^U%J31T=B`As_Ns>fKlF)cOj+yBlu+Z!EaJ`S= zaM-WaYP8*M>Gb+#c0nLnmT9xukZs$j{Cd-BwXDHl@YHU%DNWO|+J3)3Q`nFYi5rcE z=KKDagh8mPN^u;Q0oMe6#DW26AQP(bzJ3!_Z8n?uGyqZ*MYLY8{{%58ek*`;2Hs;J z$aqaKAQS;3;&H<;JoW(iC*_r@*crfy>$(f>z?tXynV$L(3r4KgXyiCfjQ7H0L(nhp z88-M3Q*DoPv2xvRw_mT<%YOJIvn-?Ka(TIO|5@^H0R{ld*7$-~UB3(f0000U~^s-Qg2g$6PV z13aHk$~Q$(zBs=7AQ(XqfUfJp0m02AEDXjNpgO>^ENGf0oagzMfE-=d1&}4x|vGL_LHgv;kQsu#qqBRF)+W3yu)JQ6cZxTtc!eJoXAzkZs#S z1L?YMX%#4f8?j(?56QBOj=pEKs}tt!9 or visit +# http://www.stetson.edu/~ProctoLogic/ +# +# Changelog: +# 15 Nov. 2001: +# Removed dependency on Python 2.0 features. +# - dwh +# 13 Feb. 2002: +# Added a generic callback handler. +# - dwh + +import socket +import struct +import math +import sys +import string +import pprint + + +def hexDump(bytes): + """Useful utility; prints the string in hexadecimal""" + for i in range(len(bytes)): + sys.stdout.write("%2x " % (ord(bytes[i]))) + if (i+1) % 8 == 0: + print repr(bytes[i-7:i+1]) + + if(len(bytes) % 8 != 0): + print string.rjust("", 11), repr(bytes[i-len(bytes)%8:i+1]) + + +class OSCMessage: + """Builds typetagged OSC messages.""" + def __init__(self): + self.address = "" + self.typetags = "," + self.message = "" + + def setAddress(self, address): + self.address = address + + def setMessage(self, message): + self.message = message + + def setTypetags(self, typetags): + self.typetags = typetags + + def clear(self): + self.address = "" + self.clearData() + + def clearData(self): + self.typetags = "," + self.message = "" + + def append(self, argument, typehint = None): + """Appends data to the message, + updating the typetags based on + the argument's type. + If the argument is a blob (counted string) + pass in 'b' as typehint.""" + + if typehint == 'b': + binary = OSCBlob(argument) + else: + binary = OSCArgument(argument) + + self.typetags = self.typetags + binary[0] + self.rawAppend(binary[1]) + + def rawAppend(self, data): + """Appends raw data to the message. Use append().""" + self.message = self.message + data + + def getBinary(self): + """Returns the binary message (so far) with typetags.""" + address = OSCArgument(self.address)[1] + typetags = OSCArgument(self.typetags)[1] + return address + typetags + self.message + + def __repr__(self): + return self.getBinary() + +def readString(data): + length = string.find(data,"\0") + nextData = int(math.ceil((length+1) / 4.0) * 4) + return (data[0:length], data[nextData:]) + + +def readBlob(data): + length = struct.unpack(">i", data[0:4])[0] + nextData = int(math.ceil((length) / 4.0) * 4) + 4 + return (data[4:length+4], data[nextData:]) + + +def readInt(data): + if(len(data)<4): + print "Error: too few bytes for int", data, len(data) + rest = data + integer = 0 + else: + integer = struct.unpack(">i", data[0:4])[0] + rest = data[4:] + + return (integer, rest) + + + +def readLong(data): + """Tries to interpret the next 8 bytes of the data + as a 64-bit signed integer.""" + high, low = struct.unpack(">ll", data[0:8]) + big = (long(high) << 32) + low + rest = data[8:] + return (big, rest) + + + +def readFloat(data): + if(len(data)<4): + print "Error: too few bytes for float", data, len(data) + rest = data + float = 0 + else: + float = struct.unpack(">f", data[0:4])[0] + rest = data[4:] + + return (float, rest) + + +def OSCBlob(next): + """Convert a string into an OSC Blob, + returning a (typetag, data) tuple.""" + + if type(next) == type(""): + length = len(next) + padded = math.ceil((len(next)) / 4.0) * 4 + binary = struct.pack(">i%ds" % (padded), length, next) + tag = 'b' + else: + tag = '' + binary = '' + + return (tag, binary) + + +def OSCArgument(next): + """Convert some Python types to their + OSC binary representations, returning a + (typetag, data) tuple.""" + + if type(next) == type(""): + OSCstringLength = math.ceil((len(next)+1) / 4.0) * 4 + binary = struct.pack(">%ds" % (OSCstringLength), next) + tag = "s" + elif type(next) == type(42.5): + binary = struct.pack(">f", next) + tag = "f" + elif type(next) == type(13): + binary = struct.pack(">i", next) + tag = "i" + else: + binary = "" + tag = "" + + return (tag, binary) + + +def parseArgs(args): + """Given a list of strings, produces a list + where those strings have been parsed (where + possible) as floats or integers.""" + parsed = [] + for arg in args: + print arg + arg = arg.strip() + interpretation = None + try: + interpretation = float(arg) + if string.find(arg, ".") == -1: + interpretation = int(interpretation) + except: + # Oh - it was a string. + interpretation = arg + pass + parsed.append(interpretation) + return parsed + + + +def decodeOSC(data): + """Converts a typetagged OSC message to a Python list.""" + table = {"i":readInt, "f":readFloat, "s":readString, "b":readBlob} + decoded = [] + address, rest = readString(data) + typetags = "" + + if address == "#bundle": + time, rest = readLong(rest) +# decoded.append(address) +# decoded.append(time) + while len(rest)>0: + length, rest = readInt(rest) + decoded.append(decodeOSC(rest[:length])) + rest = rest[length:] + + elif len(rest) > 0: + typetags, rest = readString(rest) + decoded.append(address) + decoded.append(typetags) + if typetags[0] == ",": + for tag in typetags[1:]: + value, rest = table[tag](rest) + decoded.append(value) + else: + print "Oops, typetag lacks the magic ," + + return decoded + + +class CallbackManager: + """This utility class maps OSC addresses to callables. + + The CallbackManager calls its callbacks with a list + of decoded OSC arguments, including the address and + the typetags as the first two arguments.""" + + def __init__(self): + self.callbacks = {} + self.add(self.unbundler, "#bundle") + + def handle(self, data, source = None): + """Given OSC data, tries to call the callback with the + right address.""" + decoded = decodeOSC(data) + self.dispatch(decoded, source) + + def dispatch(self, message, source = None): + """Sends decoded OSC data to an appropriate calback""" + try: + if type(message[0]) == str : + # got a single message + address = message[0] + self.callbacks[address](message, source) + + elif type(message[0]) == list : + # smells like nested messages + for msg in message : + self.dispatch(msg, source) + + except KeyError, e: + # address not found + print 'address %s not found ' % address + pprint.pprint(message) + except IndexError, e: + print 'got malformed OSC message' + pass + except None, e: + print "Exception in", address, "callback :", e + + return + + def add(self, callback, name): + """Adds a callback to our set of callbacks, + or removes the callback with name if callback + is None.""" + if callback == None: + del self.callbacks[name] + else: + self.callbacks[name] = callback + + def unbundler(self, messages): + """Dispatch the messages in a decoded bundle.""" + # first two elements are #bundle and the time tag, rest are messages. + for message in messages[2:]: + self.dispatch(message) + + +if __name__ == "__main__": + hexDump("Welcome to the OSC testing program.") + print + message = OSCMessage() + message.setAddress("/foo/play") + message.append(44) + message.append(11) + message.append(4.5) + message.append("the white cliffs of dover") + hexDump(message.getBinary()) + + print "Making and unmaking a message.." + + strings = OSCMessage() + strings.append("Mary had a little lamb") + strings.append("its fleece was white as snow") + strings.append("and everywhere that Mary went,") + strings.append("the lamb was sure to go.") + strings.append(14.5) + strings.append(14.5) + strings.append(-400) + + raw = strings.getBinary() + + hexDump(raw) + + print "Retrieving arguments..." + data = raw + for i in range(6): + text, data = readString(data) + print text + + number, data = readFloat(data) + print number + + number, data = readFloat(data) + print number + + number, data = readInt(data) + print number + + hexDump(raw) + print decodeOSC(raw) + print decodeOSC(message.getBinary()) + + print "Testing Blob types." + + blob = OSCMessage() + blob.append("","b") + blob.append("b","b") + blob.append("bl","b") + blob.append("blo","b") + blob.append("blob","b") + blob.append("blobs","b") + blob.append(42) + + hexDump(blob.getBinary()) + + print decodeOSC(blob.getBinary()) + + def printingCallback(*stuff): + sys.stdout.write("Got: ") + for i in stuff: + sys.stdout.write(str(i) + " ") + sys.stdout.write("\n") + + print "Testing the callback manager." + + c = CallbackManager() + c.add(printingCallback, "/print") + + c.handle(message.getBinary()) + message.setAddress("/print") + c.handle(message.getBinary()) + + print1 = OSCMessage() + print1.setAddress("/print") + print1.append("Hey man, that's cool.") + print1.append(42) + print1.append(3.1415926) + + c.handle(print1.getBinary()) + + bundle = OSCMessage() + bundle.setAddress("") + bundle.append("#bundle") + bundle.append(0) + bundle.append(0) + bundle.append(print1.getBinary(), 'b') + bundle.append(print1.getBinary(), 'b') + + bundlebinary = bundle.message + + print "sending a bundle to the callback manager" + c.handle(bundlebinary) + + + +""" simpleOSC 0.2 + ixi software - July, 2006 + www.ixi-software.net + + simple API for the Open SoundControl for Python (by Daniel Holth, Clinton + McChesney --> pyKit.tar.gz file at http://wiretap.stetson.edu) + Documentation at http://wiretap.stetson.edu/docs/pyKit/ + + The main aim of this implementation is to provide with a simple way to deal + with the OSC implementation that makes life easier to those who don't have + understanding of sockets or programming. This would not be on your screen without the help + of Daniel Holth. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Thanks for the support to Buchsenhausen, Innsbruck, Austria. +""" + +import socket + +# globals +addressManager = 0 +outSocket = 0 + + +def init():#ipAddr, port): + """ inits manager and outsocket + """ + createSender() + createCallBackManager() + +def createSender(): + """create and return outbound socket""" + global outSocket + outSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + +def createCallBackManager(): + global addressManager + addressManager = CallbackManager() + +def createListener(ipAddr, port): + """create and return an inbound socket + """ + l = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + l.bind((ipAddr, port)) + l.setblocking(0) # if not waits for msgs to arrive blocking other events + return l + +def bind(func, oscaddress): + """ bind certains oscaddresses with certain functions in address manager + """ + addressManager.add(func, oscaddress) + +################################# + +def createBinaryMsg(oscAddress, dataArray): + """create and return general type binary OSC msg""" + m = OSCMessage() + m.setAddress(oscAddress) + + for x in dataArray: ## append each item of the array to the message + m.append(x) + + return m.getBinary() # get the actual OSC to send + +def sendOSC(stufftosend, ipAddr, port): # outSocket, + """ send OSC msg or bundle as binary""" + outSocket.sendto(stufftosend, (ipAddr, port)) + +####################################################### user interface below: + +############################### send message + +def sendMsg(oscAddress, dataArray, ipAddr, port):#, outSocket): + """create and send normal OSC msgs""" + msg = createBinaryMsg(oscAddress, dataArray) + sendOSC(msg, ipAddr, port) # outSocket, + +############################### bundle stuff + send bundle + +def createBundle(): + """create bundled type of OSC messages""" + b = OSCMessage() + b.setAddress("") + b.append("#bundle") + b.append(0) + b.append(0) + return b + +def appendToBundle(bundle, oscAddress, dataArray): + """create OSC mesage and append it to a given bundle""" + OSCmsg = createBinaryMsg(oscAddress, dataArray) + bundle.append(OSCmsg, 'b') + +def sendBundle(bundle, ipAddr, port):#, outSocket): + """convert bundle to a binary and send it""" + sendOSC(bundle.message, ipAddr, port) # outSocket + +################################ receive osc from The Other. + +def getOSC(inSocket):#, addressManager): + """try to get incoming OSC and send it to callback manager (for osc addresses)""" + try: + while 1: + data = inSocket.recv(1024) + addressManager.handle(data) + except: + return "nodata" # not data arrived +################################ + diff --git a/nodeboxgl/sound/process.py b/nodeboxgl/sound/process.py new file mode 100644 index 0000000..a67d441 --- /dev/null +++ b/nodeboxgl/sound/process.py @@ -0,0 +1,291 @@ +#=== SOUND =========================================================================================== +# Convenience classes and functions for audio manipulation. +# Authors: Frederik De Bleser, Lieven Menschaert, Tom De Smedt. +# License: BSD (see LICENSE.txt for details). +# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) +# http://cityinabottle.org/nodebox + +import osc +import sys +import os +import subprocess +import StringIO +import signal +import time +import socket as _socket + +def _find(match=lambda item: False, list=[]): + """ Returns the first item in the list for which match(item)=True, or None. + """ + for item in list: + if match(item): return item + +#===================================================================================================== + +#--- PROCESS ----------------------------------------------------------------------------------------- + +# True when running on Windows. +WINDOWS = sys.platform.startswith('win') + +if not WINDOWS: + import select + import fcntl + def read_non_blocking(stream, bytes=1024, timeout=0): + # Reads a number of bytes from the given stream, + # without deadlocking when no more data is available (returns None instead). + fcntl.fcntl(stream, fcntl.F_SETFL, fcntl.fcntl(stream, fcntl.F_GETFL) | os.O_NONBLOCK) + if not select.select([stream], [], [], 0)[0]: + return None + return stream.read(bytes) + +if WINDOWS: + import ctypes; from ctypes.wintypes import DWORD + import msvcrt + def read_non_blocking(stream, bytes=1024): + # Reads a number of bytes from the given stream, + # without deadlocking when no more data is available (returns None instead). + p = msvcrt.get_osfhandle(stream.fileno()) + s = ctypes.create_string_buffer(1) + b = ctypes.windll.kernel32.PeekNamedPipe(p, s, 1, None, None, None) + if s.value: + c_read = DWORD() + s = ctypes.create_string_buffer(bytes+1) + b = ctypes.windll.kernel32.ReadFile(p, s, bytes+1, ctypes.byref(c_read), None) + s[c_read.value] = '\0' + return s.value.decode() + +class Process(object): + + def __init__(self, program, options={}, start=True): + """ Runs the given program (i.e. executable file path) as a background process + with the given command-line options. + """ + self.program = program + self.options = options + self._process = None + if start: + self.start() + + @property + def started(self): + return self._process is not None + + @property + def id(self): + return self._process \ + and self._process.pid or None + + pid = id + + @property + def output(self, bytes=1024): + # Yields a number of bytes of output, or None if the process is idle. + if self._process is not None: + return read_non_blocking(self._process.stdout, bytes) + + def start(self): + """ Starts the program with the given command-line options. + The output can be read from Process.output. + """ + o = [self.program]; [o.extend((k,v)) for k,v in self.options.items()] + o = [str(x) for x in o if x is not None] + self._process = subprocess.Popen(o, + stdout = subprocess.PIPE, + stderr = subprocess.STDOUT + ) + + def stop(self): + """ Attempts to stop the process. + Returns True when the process is stopped, False otherwise. + """ + if not self._process: + # The process has not been started. + return True + if hasattr(self._process, 'kill'): + # Popen.kill() works in Python 2.6+ on all platforms. + self._process.kill() + self._process = None + return True + if self._process.pid is not None and not WINDOWS: + # os.kill() works in Python 2.4+ on Unix and Mac OS X. + os.kill(self._process.pid, signal.SIGTERM) + time.sleep(0.1) + self._process = None + return True + if self._process.pid is not None and WINDOWS: + # Use ctypes on Windows platforms. + import ctypes + p = ctypes.windll.kernel32.OpenProcess(1, False, self._process.pid) + ctypes.windll.kernel32.TerminateProcess(p, -1) + ctypes.windll.kernel32.CloseHandle(p) + time.sleep(0.1) + self._process = None + return True + return False + +#===================================================================================================== + +#--- SOCKET ------------------------------------------------------------------------------------------ + +class Socket(_socket.socket): + + def __init__(self, host, port): + """ Creates a socket connection to the given host (IP address) and port. + Socket.close() will close the connection when Socket.connections is 0 + """ + _socket.socket.__init__(self, _socket.AF_INET, _socket.SOCK_DGRAM) + self.bind((host, port)) + self.setblocking(0) + self.connections = 0 + + def close(self): + if self.connections <= 0: + _socket.socket.close(self) + +_sockets = {} +def socket(host, port): + """ Returns the socket connection to the given host and port, creating it when none exists. + """ + return _sockets.setdefault("%s:%s" % (host, port), Socket(host, port)) + +#--- PUREDATA ---------------------------------------------------------------------------------------- + +# Pd application default paths: +# /usr/local/bin/pd +# /Applications/Pd-extended.app/Contents/Resources/bin/pd +# C:\Program Files\pd\bin\pd.exe +PD_UNIX1 = "pdextended" +PD_UNIX2 = "pd" +PD_MACOSX = "Pd-extended.app/Contents/Resources/bin/pd" +PD_WINDOWS = "pd\\bin\\pd.exe" +DEFAULT = "default" + +# Default server. +LOCALHOST = "127.0.0.1" + +# Default ports. +# PD.get() receives on port 44000, the Pd patch broadcasts on port 44000. +# PD.send() broadcasts on port 44001, the Pd patch receives on port 44001. +IN = 44000 +OUT = 44001 + +class PDError(Exception): + pass + +class PD(object): + + def __init__(self, patch=None, buffer=128, options={}, start=False, path=DEFAULT): + """ Creates a network connection with PureData. + When a patch (.pd file) is given and start=True, loads PD with the patch in the background. + Otherwise, communication can be established with whatever patch is active in a running PD. + The PD.send() method sends data to the patch running at a given host and port. + The path defines the location of the PD executable. + A number of default locations are searched as well: + - the current folder, + - /usr/bin/pdextended (Unix, preferred), + - /usr/local/bin/pd (Unix), + - /Applications/Pd-extended.app/Contents/Resources/bin/pd (Mac OS X), + - C:\Program Files\pd\bin\pd.exe (Windows). + Command-line options can be given as a dictionary, e.g. + PD(options={'-alsa': None}) + """ + path = path != DEFAULT and path or "" + path = _find(lambda x: os.path.exists(x), [ + path, + os.path.join(path, PD_UNIX1), + os.path.join(path, PD_UNIX2), + os.path.join(path, PD_MACOSX), + os.path.join(path, PD_WINDOWS), + "usr/bin/" + PD_UNIX1, + "usr/local/bin/" + PD_UNIX1, + "usr/bin/" + PD_UNIX2, + "usr/local/bin/" + PD_UNIX2, + "/Applications/" + PD_MACOSX, + "C:\\Program Files\\" + PD_WINDOWS + ]) + self._path = path # PD executable location. + self._process = None # PD executable running in background. + self._callback = {} # [PDCallback, data] items indexed by path + host + port. + self._options = dict(options) # For PD-Extended 0.41- on Mac OS X, only works with -nogui. + self._options.setdefault("-nogui", None) + self._options.setdefault("-audiobuf", buffer) + self._options.setdefault("-open", patch) + if start: + self.start() + osc.init() + + @property + def patch(self): + return self._options.get("-open") + @property + def buffer(self): + return self._options.get("-audiobuf") + + def start(self): + """ Starts PD as a background process and loads PD.patch. + If PD is already running another patch, restarts the application. + """ + if self.patch is None \ + or not os.path.exists(self.patch): + raise PDError, "no PD patch file at '%s'" % self.patch + if not self._path: + raise PDError, "no PD application found" + if not os.path.exists(self._path): + raise PDError, "no PD application at '%s'" % self._path + if not self._process: + self._process = Process(program=self._path, options=self._options) + + def stop(self): + for callback in self._callback.values(): + callback.stop() + return self._process \ + and self._process.stop() + + def send(self, data, path, host=LOCALHOST, port=OUT): + """ Sends the given list of data over OSC to PD. + The path specifies the address where PD receives the data e.g. "/creature/perch". + """ + osc.sendMsg(path, data, host, port) + + def get(self, path, host=LOCALHOST, port=IN): + """ Returns the data sent from the given path in PD. + """ + id = "%s%s%s" % (path, host, port) + if not id in self._callback: + self._callback[id] = PDCallback(path, host, port) + return self._callback[id].data + + def __del__(self): + try: self.stop() + except: + pass + + @property + def output(self): + return self._process.output + +class PDCallback: + + def __init__(self, path, host=LOCALHOST, port=44001): + """ Creates a listener for data broadcast from Pd. + PDCallback.__call__() is called from PD.get(). + """ + osc.bind(self, path) + self._path = path + self._data = [] + self._socket = socket(host, port) + self._socket.connections += 1 + + def __call__(self, *data): + # First two arguments in the list are the path and typetags string. + self._data = data[0][2:] if data != "nodata" else [] + + @property + def data(self): + osc.getOSC(self._socket) + return self._data + + def stop(self): + self._socket.connections -= 1 + self._socket.close() + self._socket = None From 73659277c40cef19cb8557fe067e0f742951210a Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 14:26:25 +0200 Subject: [PATCH 04/12] Renamed dir nodebox to nodeboxgl. --- nodebox/__init__.py | 21 - nodebox/ext/__init__.py | 0 nodebox/ext/bezier.c | 167 - nodebox/ext/geometry.c | 191 - nodebox/ext/noise.c | 88 - nodebox/ext/psyco/__init__.py | 54 - nodebox/ext/psyco/classes.py | 42 - nodebox/ext/psyco/core.py | 232 - nodebox/ext/psyco/kdictproxy.py | 133 - nodebox/ext/psyco/logger.py | 96 - nodebox/ext/psyco/profiler.py | 388 - nodebox/ext/psyco/src/COPYING.txt | 9 - nodebox/ext/psyco/src/MANIFEST | 171 - nodebox/ext/psyco/src/README.txt | 77 - nodebox/ext/psyco/src/c/Makefile | 108 - nodebox/ext/psyco/src/c/Modules/parray.c | 515 - nodebox/ext/psyco/src/c/Modules/pmath.c | 200 - nodebox/ext/psyco/src/c/Modules/ppsyco.c | 247 - .../ext/psyco/src/c/Objects/compactobject.c | 1033 - .../ext/psyco/src/c/Objects/compactobject.h | 68 - nodebox/ext/psyco/src/c/Objects/pabstract.c | 1092 - nodebox/ext/psyco/src/c/Objects/pabstract.h | 110 - nodebox/ext/psyco/src/c/Objects/pboolobject.c | 110 - nodebox/ext/psyco/src/c/Objects/pboolobject.h | 56 - .../ext/psyco/src/c/Objects/pclassobject.c | 167 - .../ext/psyco/src/c/Objects/pclassobject.h | 40 - .../ext/psyco/src/c/Objects/pcompactobject.c | 653 - .../ext/psyco/src/c/Objects/pcompactobject.h | 18 - .../ext/psyco/src/c/Objects/pdescrobject.c | 58 - .../ext/psyco/src/c/Objects/pdescrobject.h | 13 - nodebox/ext/psyco/src/c/Objects/pdictobject.c | 55 - nodebox/ext/psyco/src/c/Objects/pdictobject.h | 19 - .../ext/psyco/src/c/Objects/pfloatobject.c | 599 - .../ext/psyco/src/c/Objects/pfloatobject.h | 81 - nodebox/ext/psyco/src/c/Objects/pfuncobject.c | 234 - nodebox/ext/psyco/src/c/Objects/pfuncobject.h | 37 - nodebox/ext/psyco/src/c/Objects/pintobject.c | 539 - nodebox/ext/psyco/src/c/Objects/pintobject.h | 74 - nodebox/ext/psyco/src/c/Objects/piterobject.c | 141 - nodebox/ext/psyco/src/c/Objects/piterobject.h | 41 - nodebox/ext/psyco/src/c/Objects/plistobject.c | 340 - nodebox/ext/psyco/src/c/Objects/plistobject.h | 44 - nodebox/ext/psyco/src/c/Objects/plongobject.c | 96 - nodebox/ext/psyco/src/c/Objects/plongobject.h | 19 - .../ext/psyco/src/c/Objects/pmethodobject.c | 141 - .../ext/psyco/src/c/Objects/pmethodobject.h | 47 - nodebox/ext/psyco/src/c/Objects/pobject.c | 699 - nodebox/ext/psyco/src/c/Objects/pobject.h | 182 - .../ext/psyco/src/c/Objects/prangeobject.c | 231 - .../ext/psyco/src/c/Objects/prangeobject.h | 36 - .../ext/psyco/src/c/Objects/pstringobject.c | 1221 - .../ext/psyco/src/c/Objects/pstringobject.h | 69 - .../ext/psyco/src/c/Objects/pstructmember.c | 166 - .../ext/psyco/src/c/Objects/pstructmember.h | 16 - .../ext/psyco/src/c/Objects/ptupleobject.c | 263 - .../ext/psyco/src/c/Objects/ptupleobject.h | 40 - nodebox/ext/psyco/src/c/Objects/ptypeobject.c | 355 - nodebox/ext/psyco/src/c/Objects/ptypeobject.h | 17 - nodebox/ext/psyco/src/c/Python/frames.c | 736 - nodebox/ext/psyco/src/c/Python/frames.h | 82 - nodebox/ext/psyco/src/c/Python/pbltinmodule.c | 281 - nodebox/ext/psyco/src/c/Python/pbltinmodule.h | 10 - nodebox/ext/psyco/src/c/Python/pycheader.h | 116 - nodebox/ext/psyco/src/c/Python/pycinternal.h | 24 - nodebox/ext/psyco/src/c/Python/pycompiler.c | 3237 - nodebox/ext/psyco/src/c/Python/pycompiler.h | 366 - nodebox/ext/psyco/src/c/Python/pyver.h | 81 - nodebox/ext/psyco/src/c/alarm.c | 280 - nodebox/ext/psyco/src/c/alarm.h | 17 - nodebox/ext/psyco/src/c/blockalloc.h | 118 - nodebox/ext/psyco/src/c/codegen.c | 1200 - nodebox/ext/psyco/src/c/codegen.h | 351 - nodebox/ext/psyco/src/c/codemanager.c | 374 - nodebox/ext/psyco/src/c/codemanager.h | 88 - nodebox/ext/psyco/src/c/cstruct.c | 93 - nodebox/ext/psyco/src/c/cstruct.h | 42 - nodebox/ext/psyco/src/c/depend.py | 44 - nodebox/ext/psyco/src/c/dispatcher.c | 2259 - nodebox/ext/psyco/src/c/dispatcher.h | 284 - nodebox/ext/psyco/src/c/files.py | 166 - nodebox/ext/psyco/src/c/i386/idispatcher.c | 367 - nodebox/ext/psyco/src/c/i386/idispatcher.h | 155 - nodebox/ext/psyco/src/c/i386/iencoding.c | 736 - nodebox/ext/psyco/src/c/i386/iencoding.h | 1120 - nodebox/ext/psyco/src/c/i386/iinitialize.h | 21 - nodebox/ext/psyco/src/c/i386/iprocessor.c | 152 - nodebox/ext/psyco/src/c/i386/ipyencoding.c | 104 - nodebox/ext/psyco/src/c/i386/ipyencoding.h | 318 - nodebox/ext/psyco/src/c/initialize.h | 150 - nodebox/ext/psyco/src/c/ivm/idispatcher.c | 272 - nodebox/ext/psyco/src/c/ivm/idispatcher.h | 121 - nodebox/ext/psyco/src/c/ivm/iencoding.c | 487 - nodebox/ext/psyco/src/c/ivm/iencoding.h | 285 - nodebox/ext/psyco/src/c/ivm/iinitialize.h | 20 - nodebox/ext/psyco/src/c/ivm/iprocessor.c | 476 - nodebox/ext/psyco/src/c/ivm/ipyencoding.c | 20 - nodebox/ext/psyco/src/c/ivm/ipyencoding.h | 117 - nodebox/ext/psyco/src/c/ivm/ivm-insns.c | 20 - nodebox/ext/psyco/src/c/ivm/ivm-insns.h | 111 - nodebox/ext/psyco/src/c/ivm/localsetup.py | 20 - nodebox/ext/psyco/src/c/ivm/prolog/Makefile | 57 - nodebox/ext/psyco/src/c/ivm/prolog/ccode.pl | 274 - .../ext/psyco/src/c/ivm/prolog/detcheck.pl | 37 - .../src/c/ivm/prolog/insns-igen-h.i.default | 89 - .../src/c/ivm/prolog/insns-igen.i.default | 377 - .../src/c/ivm/prolog/insns-switch.i.default | 853 - .../src/c/ivm/prolog/insns-table.py.default | 201 - .../src/c/ivm/prolog/insns-threaded.i.default | 1118 - nodebox/ext/psyco/src/c/ivm/prolog/insns.pl | 111 - nodebox/ext/psyco/src/c/ivm/prolog/insns.py | 88 - nodebox/ext/psyco/src/c/ivm/prolog/insnset.py | 81 - .../src/c/ivm/prolog/mode_combine.pl.default | 12 - .../ext/psyco/src/c/ivm/prolog/optimize.pl | 186 - .../ext/psyco/src/c/ivm/prolog/samelines.py | 38 - nodebox/ext/psyco/src/c/ivm/prolog/utils.pl | 110 - nodebox/ext/psyco/src/c/ivm/prolog/vm.pl | 567 - .../ext/psyco/src/c/ivm/prolog/vmwriter.pl | 241 - nodebox/ext/psyco/src/c/linuxmemchk.c | 102 - nodebox/ext/psyco/src/c/linuxmemchk.h | 17 - nodebox/ext/psyco/src/c/mergepoints.c | 947 - nodebox/ext/psyco/src/c/mergepoints.h | 89 - nodebox/ext/psyco/src/c/mkincl.py | 16 - nodebox/ext/psyco/src/c/mychecker.py | 78 - nodebox/ext/psyco/src/c/platform.c | 66 - nodebox/ext/psyco/src/c/platform.h | 9 - nodebox/ext/psyco/src/c/processor.h | 43 - nodebox/ext/psyco/src/c/profile.c | 673 - nodebox/ext/psyco/src/c/profile.h | 37 - nodebox/ext/psyco/src/c/psyco.c | 1054 - nodebox/ext/psyco/src/c/psyco.h | 302 - nodebox/ext/psyco/src/c/psyfunc.c | 890 - nodebox/ext/psyco/src/c/psyfunc.h | 59 - nodebox/ext/psyco/src/c/pycodegen.h | 68 - nodebox/ext/psyco/src/c/stats.c | 387 - nodebox/ext/psyco/src/c/stats.h | 74 - nodebox/ext/psyco/src/c/timing.h | 32 - nodebox/ext/psyco/src/c/vcompiler.c | 1004 - nodebox/ext/psyco/src/c/vcompiler.h | 760 - nodebox/ext/psyco/src/c/versionchecker.py | 46 - nodebox/ext/psyco/src/c/win32/psyco.vcproj | 313 - nodebox/ext/psyco/src/doc/Makefile | 43 - nodebox/ext/psyco/src/doc/README.txt | 21 - nodebox/ext/psyco/src/doc/psycoguide.tex | 1131 - nodebox/ext/psyco/src/psyco-mactel.diff | 210 - nodebox/ext/psyco/src/py-support/__init__.py | 54 - nodebox/ext/psyco/src/py-support/classes.py | 42 - nodebox/ext/psyco/src/py-support/core.py | 232 - .../ext/psyco/src/py-support/kdictproxy.py | 133 - nodebox/ext/psyco/src/py-support/logger.py | 96 - nodebox/ext/psyco/src/py-support/profiler.py | 388 - nodebox/ext/psyco/src/py-support/support.py | 193 - nodebox/ext/psyco/src/py-utils/cvs.py | 116 - nodebox/ext/psyco/src/py-utils/httpxam.py | 448 - nodebox/ext/psyco/src/py-utils/ivmdump.py | 110 - nodebox/ext/psyco/src/py-utils/ivmextract.py | 73 - nodebox/ext/psyco/src/py-utils/ivmoptimize.py | 61 - nodebox/ext/psyco/src/py-utils/manifest.py | 24 - nodebox/ext/psyco/src/py-utils/symbols.py | 38 - nodebox/ext/psyco/src/py-utils/vinfo_dump.py | 56 - .../ext/psyco/src/py-utils/win32/README.TXT | 16 - nodebox/ext/psyco/src/py-utils/xam.py | 570 - nodebox/ext/psyco/src/py-utils/xamsupport.c | 31 - nodebox/ext/psyco/src/setup.py | 180 - nodebox/ext/psyco/src/test/bpnn.py | 192 - nodebox/ext/psyco/src/test/btrun.py | 778 - nodebox/ext/psyco/src/test/classicregrtest.py | 178 - nodebox/ext/psyco/src/test/file1-basetests | 271 - nodebox/ext/psyco/src/test/file2-basetests.uu | 95 - nodebox/ext/psyco/src/test/fulltester.py | 180 - nodebox/ext/psyco/src/test/life-psyco.py | 236 - nodebox/ext/psyco/src/test/life.py | 226 - nodebox/ext/psyco/src/test/pystone-jit.py | 259 - nodebox/ext/psyco/src/test/pystone.py | 307 - nodebox/ext/psyco/src/test/regrtester.py | 76 - nodebox/ext/psyco/src/test/regrtester2.py | 48 - nodebox/ext/psyco/src/test/test1.py | 211 - nodebox/ext/psyco/src/test/test3.py | 424 - nodebox/ext/psyco/src/test/test5.py | 453 - nodebox/ext/psyco/src/test/test_base.py | 92 - .../ext/psyco/src/test/test_compactobject.py | 280 - nodebox/ext/psyco/src/test/test_misc.py | 102 - nodebox/ext/psyco/support.py | 193 - nodebox/ext/setup.py | 13 - nodebox/font/Droid Sans Mono.ttf | Bin 117072 -> 0 bytes nodebox/font/Droid Sans-Bold.ttf | Bin 191032 -> 0 bytes nodebox/font/Droid Sans.ttf | Bin 190044 -> 0 bytes nodebox/font/Droid Serif-Bold.ttf | Bin 184836 -> 0 bytes nodebox/font/Droid Serif-BoldItalic.ttf | Bin 189916 -> 0 bytes nodebox/font/Droid Serif-Italic.ttf | Bin 177176 -> 0 bytes nodebox/font/Droid Serif-Regular.ttf | Bin 172532 -> 0 bytes nodebox/font/glyph.p | 160310 --------------- nodebox/font/glyph.py | 108 - nodebox/graphics/__init__.py | 39 - nodebox/graphics/bezier.py | 530 - nodebox/graphics/context.py | 4134 - nodebox/graphics/geometry.py | 598 - nodebox/graphics/noise.py | 72 - nodebox/graphics/physics.py | 1976 - nodebox/graphics/shader.py | 1515 - nodebox/gui/__init__.py | 1 - nodebox/gui/controls.py | 1222 - nodebox/gui/theme/Droid Sans-Bold.ttf | Bin 191032 -> 0 bytes nodebox/gui/theme/Droid Sans.ttf | Bin 190044 -> 0 bytes nodebox/gui/theme/action-close.png | Bin 1287 -> 0 bytes nodebox/gui/theme/action.png | Bin 1020 -> 0 bytes nodebox/gui/theme/button.png | Bin 528 -> 0 bytes nodebox/gui/theme/field.png | Bin 1032 -> 0 bytes nodebox/gui/theme/flag-checked.png | Bin 1107 -> 0 bytes nodebox/gui/theme/flag.png | Bin 504 -> 0 bytes nodebox/gui/theme/flag.psd | Bin 35450 -> 0 bytes nodebox/gui/theme/knob-socket.png | Bin 688 -> 0 bytes nodebox/gui/theme/knob.png | Bin 1683 -> 0 bytes nodebox/gui/theme/panel.png | Bin 1407 -> 0 bytes nodebox/gui/theme/slider-handle.png | Bin 464 -> 0 bytes nodebox/gui/theme/slider.png | Bin 418 -> 0 bytes nodebox/sound/__init__.py | 1 - nodebox/sound/osc.py | 517 - nodebox/sound/process.py | 291 - 218 files changed, 218980 deletions(-) delete mode 100644 nodebox/__init__.py delete mode 100644 nodebox/ext/__init__.py delete mode 100644 nodebox/ext/bezier.c delete mode 100644 nodebox/ext/geometry.c delete mode 100644 nodebox/ext/noise.c delete mode 100644 nodebox/ext/psyco/__init__.py delete mode 100644 nodebox/ext/psyco/classes.py delete mode 100644 nodebox/ext/psyco/core.py delete mode 100644 nodebox/ext/psyco/kdictproxy.py delete mode 100644 nodebox/ext/psyco/logger.py delete mode 100644 nodebox/ext/psyco/profiler.py delete mode 100644 nodebox/ext/psyco/src/COPYING.txt delete mode 100644 nodebox/ext/psyco/src/MANIFEST delete mode 100644 nodebox/ext/psyco/src/README.txt delete mode 100644 nodebox/ext/psyco/src/c/Makefile delete mode 100644 nodebox/ext/psyco/src/c/Modules/parray.c delete mode 100644 nodebox/ext/psyco/src/c/Modules/pmath.c delete mode 100644 nodebox/ext/psyco/src/c/Modules/ppsyco.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/compactobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/compactobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pabstract.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pabstract.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pboolobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pboolobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pclassobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pclassobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pcompactobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pcompactobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pdescrobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pdescrobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pdictobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pdictobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pfloatobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pfloatobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pfuncobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pfuncobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pintobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pintobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/piterobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/piterobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/plistobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/plistobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/plongobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/plongobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pmethodobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pmethodobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/prangeobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/prangeobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pstringobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pstringobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/pstructmember.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/pstructmember.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/ptupleobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/ptupleobject.h delete mode 100644 nodebox/ext/psyco/src/c/Objects/ptypeobject.c delete mode 100644 nodebox/ext/psyco/src/c/Objects/ptypeobject.h delete mode 100644 nodebox/ext/psyco/src/c/Python/frames.c delete mode 100644 nodebox/ext/psyco/src/c/Python/frames.h delete mode 100644 nodebox/ext/psyco/src/c/Python/pbltinmodule.c delete mode 100644 nodebox/ext/psyco/src/c/Python/pbltinmodule.h delete mode 100644 nodebox/ext/psyco/src/c/Python/pycheader.h delete mode 100644 nodebox/ext/psyco/src/c/Python/pycinternal.h delete mode 100644 nodebox/ext/psyco/src/c/Python/pycompiler.c delete mode 100644 nodebox/ext/psyco/src/c/Python/pycompiler.h delete mode 100644 nodebox/ext/psyco/src/c/Python/pyver.h delete mode 100644 nodebox/ext/psyco/src/c/alarm.c delete mode 100644 nodebox/ext/psyco/src/c/alarm.h delete mode 100644 nodebox/ext/psyco/src/c/blockalloc.h delete mode 100644 nodebox/ext/psyco/src/c/codegen.c delete mode 100644 nodebox/ext/psyco/src/c/codegen.h delete mode 100644 nodebox/ext/psyco/src/c/codemanager.c delete mode 100644 nodebox/ext/psyco/src/c/codemanager.h delete mode 100644 nodebox/ext/psyco/src/c/cstruct.c delete mode 100644 nodebox/ext/psyco/src/c/cstruct.h delete mode 100644 nodebox/ext/psyco/src/c/depend.py delete mode 100644 nodebox/ext/psyco/src/c/dispatcher.c delete mode 100644 nodebox/ext/psyco/src/c/dispatcher.h delete mode 100644 nodebox/ext/psyco/src/c/files.py delete mode 100644 nodebox/ext/psyco/src/c/i386/idispatcher.c delete mode 100644 nodebox/ext/psyco/src/c/i386/idispatcher.h delete mode 100644 nodebox/ext/psyco/src/c/i386/iencoding.c delete mode 100644 nodebox/ext/psyco/src/c/i386/iencoding.h delete mode 100644 nodebox/ext/psyco/src/c/i386/iinitialize.h delete mode 100644 nodebox/ext/psyco/src/c/i386/iprocessor.c delete mode 100644 nodebox/ext/psyco/src/c/i386/ipyencoding.c delete mode 100644 nodebox/ext/psyco/src/c/i386/ipyencoding.h delete mode 100644 nodebox/ext/psyco/src/c/initialize.h delete mode 100644 nodebox/ext/psyco/src/c/ivm/idispatcher.c delete mode 100644 nodebox/ext/psyco/src/c/ivm/idispatcher.h delete mode 100644 nodebox/ext/psyco/src/c/ivm/iencoding.c delete mode 100644 nodebox/ext/psyco/src/c/ivm/iencoding.h delete mode 100644 nodebox/ext/psyco/src/c/ivm/iinitialize.h delete mode 100644 nodebox/ext/psyco/src/c/ivm/iprocessor.c delete mode 100644 nodebox/ext/psyco/src/c/ivm/ipyencoding.c delete mode 100644 nodebox/ext/psyco/src/c/ivm/ipyencoding.h delete mode 100644 nodebox/ext/psyco/src/c/ivm/ivm-insns.c delete mode 100644 nodebox/ext/psyco/src/c/ivm/ivm-insns.h delete mode 100644 nodebox/ext/psyco/src/c/ivm/localsetup.py delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/Makefile delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/ccode.pl delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/detcheck.pl delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insns-igen.i.default delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insns-switch.i.default delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insns-table.py.default delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insns.pl delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insns.py delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/insnset.py delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/optimize.pl delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/samelines.py delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/utils.pl delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/vm.pl delete mode 100644 nodebox/ext/psyco/src/c/ivm/prolog/vmwriter.pl delete mode 100644 nodebox/ext/psyco/src/c/linuxmemchk.c delete mode 100644 nodebox/ext/psyco/src/c/linuxmemchk.h delete mode 100644 nodebox/ext/psyco/src/c/mergepoints.c delete mode 100644 nodebox/ext/psyco/src/c/mergepoints.h delete mode 100644 nodebox/ext/psyco/src/c/mkincl.py delete mode 100644 nodebox/ext/psyco/src/c/mychecker.py delete mode 100644 nodebox/ext/psyco/src/c/platform.c delete mode 100644 nodebox/ext/psyco/src/c/platform.h delete mode 100644 nodebox/ext/psyco/src/c/processor.h delete mode 100644 nodebox/ext/psyco/src/c/profile.c delete mode 100644 nodebox/ext/psyco/src/c/profile.h delete mode 100644 nodebox/ext/psyco/src/c/psyco.c delete mode 100644 nodebox/ext/psyco/src/c/psyco.h delete mode 100644 nodebox/ext/psyco/src/c/psyfunc.c delete mode 100644 nodebox/ext/psyco/src/c/psyfunc.h delete mode 100644 nodebox/ext/psyco/src/c/pycodegen.h delete mode 100644 nodebox/ext/psyco/src/c/stats.c delete mode 100644 nodebox/ext/psyco/src/c/stats.h delete mode 100644 nodebox/ext/psyco/src/c/timing.h delete mode 100644 nodebox/ext/psyco/src/c/vcompiler.c delete mode 100644 nodebox/ext/psyco/src/c/vcompiler.h delete mode 100644 nodebox/ext/psyco/src/c/versionchecker.py delete mode 100644 nodebox/ext/psyco/src/c/win32/psyco.vcproj delete mode 100644 nodebox/ext/psyco/src/doc/Makefile delete mode 100644 nodebox/ext/psyco/src/doc/README.txt delete mode 100644 nodebox/ext/psyco/src/doc/psycoguide.tex delete mode 100644 nodebox/ext/psyco/src/psyco-mactel.diff delete mode 100644 nodebox/ext/psyco/src/py-support/__init__.py delete mode 100644 nodebox/ext/psyco/src/py-support/classes.py delete mode 100644 nodebox/ext/psyco/src/py-support/core.py delete mode 100644 nodebox/ext/psyco/src/py-support/kdictproxy.py delete mode 100644 nodebox/ext/psyco/src/py-support/logger.py delete mode 100644 nodebox/ext/psyco/src/py-support/profiler.py delete mode 100644 nodebox/ext/psyco/src/py-support/support.py delete mode 100644 nodebox/ext/psyco/src/py-utils/cvs.py delete mode 100644 nodebox/ext/psyco/src/py-utils/httpxam.py delete mode 100644 nodebox/ext/psyco/src/py-utils/ivmdump.py delete mode 100644 nodebox/ext/psyco/src/py-utils/ivmextract.py delete mode 100644 nodebox/ext/psyco/src/py-utils/ivmoptimize.py delete mode 100644 nodebox/ext/psyco/src/py-utils/manifest.py delete mode 100644 nodebox/ext/psyco/src/py-utils/symbols.py delete mode 100644 nodebox/ext/psyco/src/py-utils/vinfo_dump.py delete mode 100644 nodebox/ext/psyco/src/py-utils/win32/README.TXT delete mode 100644 nodebox/ext/psyco/src/py-utils/xam.py delete mode 100644 nodebox/ext/psyco/src/py-utils/xamsupport.c delete mode 100644 nodebox/ext/psyco/src/setup.py delete mode 100755 nodebox/ext/psyco/src/test/bpnn.py delete mode 100644 nodebox/ext/psyco/src/test/btrun.py delete mode 100644 nodebox/ext/psyco/src/test/classicregrtest.py delete mode 100644 nodebox/ext/psyco/src/test/file1-basetests delete mode 100644 nodebox/ext/psyco/src/test/file2-basetests.uu delete mode 100644 nodebox/ext/psyco/src/test/fulltester.py delete mode 100755 nodebox/ext/psyco/src/test/life-psyco.py delete mode 100755 nodebox/ext/psyco/src/test/life.py delete mode 100644 nodebox/ext/psyco/src/test/pystone-jit.py delete mode 100644 nodebox/ext/psyco/src/test/pystone.py delete mode 100644 nodebox/ext/psyco/src/test/regrtester.py delete mode 100644 nodebox/ext/psyco/src/test/regrtester2.py delete mode 100644 nodebox/ext/psyco/src/test/test1.py delete mode 100644 nodebox/ext/psyco/src/test/test3.py delete mode 100644 nodebox/ext/psyco/src/test/test5.py delete mode 100755 nodebox/ext/psyco/src/test/test_base.py delete mode 100644 nodebox/ext/psyco/src/test/test_compactobject.py delete mode 100644 nodebox/ext/psyco/src/test/test_misc.py delete mode 100644 nodebox/ext/psyco/support.py delete mode 100644 nodebox/ext/setup.py delete mode 100644 nodebox/font/Droid Sans Mono.ttf delete mode 100644 nodebox/font/Droid Sans-Bold.ttf delete mode 100644 nodebox/font/Droid Sans.ttf delete mode 100644 nodebox/font/Droid Serif-Bold.ttf delete mode 100644 nodebox/font/Droid Serif-BoldItalic.ttf delete mode 100644 nodebox/font/Droid Serif-Italic.ttf delete mode 100644 nodebox/font/Droid Serif-Regular.ttf delete mode 100644 nodebox/font/glyph.p delete mode 100644 nodebox/font/glyph.py delete mode 100644 nodebox/graphics/__init__.py delete mode 100644 nodebox/graphics/bezier.py delete mode 100644 nodebox/graphics/context.py delete mode 100644 nodebox/graphics/geometry.py delete mode 100644 nodebox/graphics/noise.py delete mode 100644 nodebox/graphics/physics.py delete mode 100644 nodebox/graphics/shader.py delete mode 100644 nodebox/gui/__init__.py delete mode 100644 nodebox/gui/controls.py delete mode 100644 nodebox/gui/theme/Droid Sans-Bold.ttf delete mode 100644 nodebox/gui/theme/Droid Sans.ttf delete mode 100644 nodebox/gui/theme/action-close.png delete mode 100644 nodebox/gui/theme/action.png delete mode 100644 nodebox/gui/theme/button.png delete mode 100644 nodebox/gui/theme/field.png delete mode 100644 nodebox/gui/theme/flag-checked.png delete mode 100644 nodebox/gui/theme/flag.png delete mode 100644 nodebox/gui/theme/flag.psd delete mode 100644 nodebox/gui/theme/knob-socket.png delete mode 100644 nodebox/gui/theme/knob.png delete mode 100644 nodebox/gui/theme/panel.png delete mode 100644 nodebox/gui/theme/slider-handle.png delete mode 100644 nodebox/gui/theme/slider.png delete mode 100644 nodebox/sound/__init__.py delete mode 100755 nodebox/sound/osc.py delete mode 100644 nodebox/sound/process.py diff --git a/nodebox/__init__.py b/nodebox/__init__.py deleted file mode 100644 index ff08cb5..0000000 --- a/nodebox/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -#=== NODEBOX FOR OPENGL ============================================================================== - -# NodeBox for OpenGL is a Python module for creating 2D interactive visuals using OpenGL. -# It is based on the command set of the classic NodeBox for Mac OS X (http://nodebox.net). -# It has support for Bezier paths, text, image filters (blur, bloom, ...), offscreen rendering, -# animation & motion tweening, and simple 2D physics. - -__author__ = "Tom De Smedt, Frederik De Bleser" -__version__ = "1.7" -__copyright__ = "Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org)" -__license__ = "BSD" - -import sys -if sys.version_info < (2,7): - try: import psyco; psyco.profile() - except: - try: from ext import psyco; psyco.profile() - except: - pass - -import nodebox \ No newline at end of file diff --git a/nodebox/ext/__init__.py b/nodebox/ext/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/nodebox/ext/bezier.c b/nodebox/ext/bezier.c deleted file mode 100644 index 48f6e4b..0000000 --- a/nodebox/ext/bezier.c +++ /dev/null @@ -1,167 +0,0 @@ -#include -#include - -// --- LINEPOINT ---------------------------------------------------------------- -void _linepoint(double t, double x0, double y0, double x1, double y1, - double *out_x, double *out_y) { - *out_x = x0 + t * (x1-x0); - *out_y = y0 + t * (y1-y0); -} - -// ---- LINELENGTH -------------------------------------------------------------- -void _linelength(double x0, double y0, double x1, double y1, - double *out_length) { - double a, b; - a = pow(fabs(x0 - x1), 2); - b = pow(fabs(y0 - y1), 2); - *out_length = sqrt(a + b); -} - -// --- CURVEPOINT --------------------------------------------------------------- -void _curvepoint(double t, double x0, double y0, double x1, double y1, - double x2, double y2, double x3, double y3, - double *out_x, double *out_y, - double *out_c1x, double *out_c1y, double *out_c2x, double *out_c2y) { - double mint, x01, y01, x12, y12, x23, y23; - mint = 1 - t; - x01 = x0 * mint + x1 * t; - y01 = y0 * mint + y1 * t; - x12 = x1 * mint + x2 * t; - y12 = y1 * mint + y2 * t; - x23 = x2 * mint + x3 * t; - y23 = y2 * mint + y3 * t; - *out_c1x = x01 * mint + x12 * t; - *out_c1y = y01 * mint + y12 * t; - *out_c2x = x12 * mint + x23 * t; - *out_c2y = y12 * mint + y23 * t; - *out_x = *out_c1x * mint + *out_c2x * t; - *out_y = *out_c1y * mint + *out_c2y * t; -} - -// --- CURVEPOINT HANDLES ------------------------------------------------------- -void _curvepoint_handles(double t, double x0, double y0, double x1, double y1, - double x2, double y2, double x3, double y3, - double *out_x, double *out_y, - double *out_c1x, double *out_c1y, double *out_c2x, double *out_c2y, - double *out_h1x, double *out_h1y, double *out_h2x, double *out_h2y) { - double mint, x01, y01, x12, y12, x23, y23; - mint = 1 - t; - x01 = x0 * mint + x1 * t; - y01 = y0 * mint + y1 * t; - x12 = x1 * mint + x2 * t; - y12 = y1 * mint + y2 * t; - x23 = x2 * mint + x3 * t; - y23 = y2 * mint + y3 * t; - *out_c1x = x01 * mint + x12 * t; - *out_c1y = y01 * mint + y12 * t; - *out_c2x = x12 * mint + x23 * t; - *out_c2y = y12 * mint + y23 * t; - *out_x = *out_c1x * mint + *out_c2x * t; - *out_y = *out_c1y * mint + *out_c2y * t; - *out_h1x = x01; - *out_h1y = y01; - *out_h2x = x23; - *out_h2y = y23; -} - -// --- CURVELENGTH -------------------------------------------------------------- -void _curvelength(double x0, double y0, double x1, double y1, - double x2, double y2, double x3, double y3, int n, - double *out_length) { - double length = 0; - double xi, yi, t, c; - double pt_x, pt_y, pt_c1x, pt_c1y, pt_c2x, pt_c2y; - int i; - xi = x0; - yi = y0; - for (i=0; i -#include - -// --- FAST INVERSE SQRT -------------------------------------------------------- -// Chris Lomont, http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf -float _fast_inverse_sqrt(float x) { - float xhalf = 0.5f*x; - int i = *(int*)&x; - i = 0x5f3759df - (i>>1); - x = *(float*)&i; - x = x*(1.5f-xhalf*x*x); - return x; -} - -// --- ANGLE -------------------------------------------------------------------- -void _angle(double x0, double y0, double x1, double y1, double *a) { - *a = atan2(y1-y0, x1-x0) / M_PI * 180; -} - -// --- DISTANCE ----------------------------------------------------------------- -void _distance(double x0, double y0, double x1, double y1, double *d) { - *d = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); -} - -// --- COORDINATES -------------------------------------------------------------- -void _coordinates(double x0, double y0, double d, double a, double *x1, double *y1) { - *x1 = x0 + cos(a/180*M_PI) * d; - *y1 = y0 + sin(a/180*M_PI) * d; -} - -// --- ROTATE ------------------------------------------------------------------- -void _rotate(double x, double y, double x0, double y0, double a, double *x1, double *y1) { - x = x-x0; - y = y-y0; - double u = cos(a/180*M_PI); - double v = sin(a/180*M_PI); - *x1 = x*u-y*v+x0; - *y1 = y*u+x*v+y0; -} - -// --- SMOOTHSTEP --------------------------------------------------------------- -void _smoothstep(double a, double b, double x, double *t) { - if (x < a) { - *t = 0.0; - } else if (x >= b) { - *t = 1.0; - } else { - x = (x-a) / (b-a); - *t = x*x * (3-2*x); - } -} - -// --- SUPERFORMULA ------------------------------------------------------------- - -void _superformula(double m, double n1, double n2, double n3, double phi, double *x, double *y) { - double a=1.0, b=1.0, r; - if (n1 != 0) { - r = pow(pow(fabs(cos(m*phi/4.0)/a), n2) + - pow(fabs(sin(m*phi/4.0)/b), n3), 1.0/n1); - } - if (n1 == 0 || fabs(r) == 0) { - *x = 0; - *y = 0; - } else { - r = 1.0 / r; - *x = r*cos(phi); - *y = r*sin(phi); - } -} - -// --- MATRIX MULTIPLY ---------------------------------------------------------- - -void _mmult(double a0, double a1, double a2, double a3, double a4, double a5, double a6, double a7, double a8, - double b0, double b1, double b2, double b3, double b4, double b5, double b6, double b7, double b8, - double *c0, double *c1, double *c2, double *c3, double *c4, double *c5, double *c6, double *c7, double *c8) { - *c0 = a0*b0 + a1*b3; - *c1 = a0*b1 + a1*b4; - *c2 = 0; - *c3 = a3*b0 + a4*b3; - *c4 = a3*b1 + a4*b4; - *c5 = 0; - *c6 = a6*b0 + a7*b3 + b6; - *c7 = a6*b1 + a7*b4 + b7; - *c8 = 1; -} - -// ------------------------------------------------------------------------------ - -static PyObject * -fast_inverse_sqrt(PyObject *self, PyObject *args) { - double x; - if (!PyArg_ParseTuple(args, "d", &x)) - return NULL; - x = _fast_inverse_sqrt(x); - return Py_BuildValue("d", x); -} - -static PyObject * -angle(PyObject *self, PyObject *args) { - double x0, y0, x1, y1, a; - if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &x1, &y1)) - return NULL; - _angle(x0, y0, x1, y1, &a); - return Py_BuildValue("d", a); -} - -static PyObject * -distance(PyObject *self, PyObject *args) { - double x0, y0, x1, y1, d; - if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &x1, &y1)) - return NULL; - _distance(x0, y0, x1, y1, &d); - return Py_BuildValue("d", d); -} - -static PyObject * -coordinates(PyObject *self, PyObject *args) { - double x0, y0, d, a, x1, y1; - if (!PyArg_ParseTuple(args, "dddd", &x0, &y0, &d, &a)) - return NULL; - _coordinates(x0, y0, d, a, &x1, &y1); - return Py_BuildValue("dd", x1, y1); -} - -static PyObject * -rotate(PyObject *self, PyObject *args) { - double x, y, x0, y0, a, x1, y1; - if (!PyArg_ParseTuple(args, "ddddd", &x, &y, &x0, &y0, &a)) - return NULL; - _rotate(x, y, x0, y0, a, &x1, &y1); - return Py_BuildValue("dd", x1, y1); -} - -static PyObject * -smoothstep(PyObject *self, PyObject *args) { - double a, b, x, t; - if (!PyArg_ParseTuple(args, "ddd", &a, &b, &x)) - return NULL; - _smoothstep(a, b, x, &t); - return Py_BuildValue("d", t); -} - -static PyObject * -superformula(PyObject *self, PyObject *args) { - double m, n1, n2, n3, phi, x, y; - if (!PyArg_ParseTuple(args, "ddddd", &m, &n1, &n2, &n3, &phi)) - return NULL; - _superformula(m, n1, n2, n3, phi, &x, &y); - return Py_BuildValue("dd", x, y); -} - -static PyObject * -mmult(PyObject *self, PyObject *args) { - double a0, a1, a2, a3, a4, a5, a6, a7, a8; - double b0, b1, b2, b3, b4, b5, b6, b7, b8; - double c0, c1, c2, c3, c4, c5, c6, c7, c8; - if (!PyArg_ParseTuple(args, "dddddddddddddddddd", - &a0, &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8, - &b0, &b1, &b2, &b3, &b4, &b5, &b6, &b7, &b8)) - return NULL; - _mmult( a0, a1, a2, a3, a4, a5, a6, a7, a8, - b0, b1, b2, b3, b4, b5, b6, b7, b8, - &c0, &c1, &c2, &c3, &c4, &c5, &c6, &c7, &c8); - return Py_BuildValue("ddddddddd", c0, c1, c2, c3, c4, c5, c6, c7, c8); -} - -// ------------------------------------------------------------------------------ - -static PyMethodDef geometry_methods[]={ - { "fast_inverse_sqrt", fast_inverse_sqrt, METH_VARARGS }, - { "angle", angle, METH_VARARGS }, - { "distance", distance, METH_VARARGS }, - { "coordinates", coordinates, METH_VARARGS }, - { "rotate", rotate, METH_VARARGS }, - { "smoothstep", smoothstep, METH_VARARGS }, - { "superformula", superformula, METH_VARARGS }, - { "mmult", mmult, METH_VARARGS }, - { NULL, NULL } -}; - -PyMODINIT_FUNC initgeometry(void){ - PyObject *m; - m = Py_InitModule("geometry", geometry_methods); -} - -int main(int argc, char *argv[]) { - Py_SetProgramName(argv[0]); - Py_Initialize(); - initgeometry(); - return 0; -} \ No newline at end of file diff --git a/nodebox/ext/noise.c b/nodebox/ext/noise.c deleted file mode 100644 index e5a4423..0000000 --- a/nodebox/ext/noise.c +++ /dev/null @@ -1,88 +0,0 @@ -// --- PERLIN NOISE -------------------------------------------------------------------- -// Based on: Malcolm Kesson, http://www.fundza.com/c4serious/noise/perlin/perlin.html -// © 2002-4 Malcolm Kesson. All rights reserved. - -#include - -#include -#include - -static int p[512]; - -double fade(double t) { return t * t * t * (t * (t * 6 - 15) + 10); } -double lerp(double t, double a, double b) { return a + t * (b - a); } -double grad(int hash, double x, double y, double z) { - int h = hash & 15; - double u = h < 8 ? x : y, - v = h < 4 ? y : h==12 || h==14 ? x : z; - return ((h&1) == 0 ? u : -u) + ((h&2) == 0 ? v : -v); -} - -double _generate(double x, double y, double z) { - // Find unit cuve that contains point. - int X = (int)floor(x) & 255, - Y = (int)floor(y) & 255, - Z = (int)floor(z) & 255; - // Find relative x, y, z of point in cube. - x -= floor(x); - y -= floor(y); - z -= floor(z); - // Compute fade curves for each of x, y, z. - double u=fade(x), v=fade(y), w=fade(z); - // Hash coordinates of the 8 cube corners. - int A = p[X ] + Y, - AA = p[A ] + Z, - AB = p[A+1] + Z, - B = p[X+1] + Y, - BA = p[B ] + Z, - BB = p[B+1] + Z; - // Add blended results from 8 corners of cube. - return lerp(w, - lerp(v, lerp(u, grad(p[AA ], x , y , z ), - grad(p[BA ], x-1, y , z )), - lerp(u, grad(p[AB ], x , y-1, z ), - grad(p[BB ], x-1, y-1, z ))), - lerp(v, lerp(u, grad(p[AA+1], x , y , z-1), - grad(p[BA+1], x-1, y , z-1)), - lerp(u, grad(p[AB+1], x , y-1, z-1), - grad(p[BB+1], x-1, y-1, z-1)))); -} - -// ------------------------------------------------------------------------------------- - -static PyObject * -generate(PyObject *self, PyObject *args) { - double x, y, z, d; - if (!PyArg_ParseTuple(args, "ddd", &x, &y, &z)) return NULL; - d = _generate(x, y, z); - return Py_BuildValue("d", d); -} - -static PyObject * -init(PyObject *self, PyObject *args) { - PyObject * a; - if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &a)) return NULL; - int i; - for(i=0; i<512; i++) - p[i] = (int)PyInt_AsLong(PyList_GetItem(a, i)); - return Py_BuildValue(""); -} - -static PyMethodDef methods[]={ - { "generate", generate, METH_VARARGS }, - { "init", init, METH_VARARGS }, - { NULL, NULL } -}; - -PyMODINIT_FUNC initnoise(void) { - PyObject *m; - m = Py_InitModule("noise", methods); -} - -int main(int argc, char *argv[]) { - Py_SetProgramName(argv[0]); - Py_Initialize(); - initnoise(); - return 0; -} - diff --git a/nodebox/ext/psyco/__init__.py b/nodebox/ext/psyco/__init__.py deleted file mode 100644 index d25e197..0000000 --- a/nodebox/ext/psyco/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -########################################################################### -# -# Psyco top-level file of the Psyco package. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco -- the Python Specializing Compiler. - -Typical usage: add the following lines to your application's main module, -preferably after the other imports: - -try: - import psyco - psyco.full() -except ImportError: - print 'Psyco not installed, the program will just run slower' -""" -########################################################################### - - -# -# This module is present to make 'psyco' a package and to -# publish the main functions and variables. -# -# More documentation can be found in core.py. -# - - -# Try to import the dynamic-loading _psyco and report errors -try: - import _psyco -except ImportError, e: - extramsg = '' - import sys, imp - try: - file, filename, (suffix, mode, type) = imp.find_module('_psyco', __path__) - except ImportError: - ext = [suffix for suffix, mode, type in imp.get_suffixes() - if type == imp.C_EXTENSION] - if ext: - extramsg = (" (cannot locate the compiled extension '_psyco%s' " - "in the package path '%s')" % (ext[0], '; '.join(__path__))) - else: - extramsg = (" (check that the compiled extension '%s' is for " - "the correct Python version; this is Python %s)" % - (filename, sys.version.split()[0])) - raise ImportError, str(e) + extramsg - -# Publish important data by importing them in the package -from support import __version__, error, warning, _getrealframe, _getemulframe -from support import version_info, __version__ as hexversion -from core import full, profile, background, runonly, stop, cannotcompile -from core import log, bind, unbind, proxy, unproxy, dumpcodebuf -from _psyco import setfilter -from _psyco import compact, compacttype diff --git a/nodebox/ext/psyco/classes.py b/nodebox/ext/psyco/classes.py deleted file mode 100644 index 0563f84..0000000 --- a/nodebox/ext/psyco/classes.py +++ /dev/null @@ -1,42 +0,0 @@ -########################################################################### -# -# Psyco class support module. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco class support module. - -'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes. -Any class inheriting from it or using the metaclass '__metaclass__' might -get optimized specifically for Psyco. It is equivalent to call -psyco.bind() on the class object after its creation. - -Importing everything from psyco.classes in a module will import the -'__metaclass__' name, so all classes defined after a - - from psyco.classes import * - -will automatically use the Psyco-optimized metaclass. -""" -########################################################################### - -__all__ = ['psyobj', 'psymetaclass', '__metaclass__'] - - -from _psyco import compacttype -import core -from types import FunctionType - -class psymetaclass(compacttype): - "Psyco-optimized meta-class. Turns all methods into Psyco proxies." - - def __new__(cls, name, bases, dict): - bindlist = dict.get('__psyco__bind__') - if bindlist is None: - bindlist = [key for key, value in dict.items() - if isinstance(value, FunctionType)] - for attr in bindlist: - dict[attr] = core.proxy(dict[attr]) - return super(psymetaclass, cls).__new__(cls, name, bases, dict) - -psyobj = psymetaclass("psyobj", (), {}) -__metaclass__ = psymetaclass diff --git a/nodebox/ext/psyco/core.py b/nodebox/ext/psyco/core.py deleted file mode 100644 index 42a6c2f..0000000 --- a/nodebox/ext/psyco/core.py +++ /dev/null @@ -1,232 +0,0 @@ -########################################################################### -# -# Psyco main functions. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco main functions. - -Here are the routines that you can use from your applications. -These are mostly interfaces to the C core, but they depend on -the Python version. - -You can use these functions from the 'psyco' module instead of -'psyco.core', e.g. - - import psyco - psyco.log('/tmp/psyco.log') - psyco.profile() -""" -########################################################################### - -import _psyco -import types, new -from support import * - - -# Default charge profiler values -default_watermark = 0.09 # between 0.0 (0%) and 1.0 (100%) -default_halflife = 0.5 # seconds -default_pollfreq_profile = 20 # Hz -default_pollfreq_background = 100 # Hz -- a maximum for sleep's resolution -default_parentframe = 0.25 # should not be more than 0.5 (50%) - - -def full(memory=None, time=None, memorymax=None, timemax=None): - """Compile as much as possible. - -Typical use is for small scripts performing intensive computations -or string handling.""" - import profiler - if PYTHON_SUPPORT: - p = profiler.FullCompiler() - else: - p = profiler.ActiveProfiler(0.0, 0.5) - p.run(memory, time, memorymax, timemax) - - -def profile(watermark = default_watermark, - halflife = default_halflife, - pollfreq = default_pollfreq_profile, - parentframe = default_parentframe, - memory=None, time=None, memorymax=None, timemax=None): - """Turn on profiling. - -The 'watermark' parameter controls how easily running functions will -be compiled. The smaller the value, the more functions are compiled.""" - import profiler - p = profiler.ActivePassiveProfiler(watermark, halflife, - pollfreq, parentframe) - p.run(memory, time, memorymax, timemax) - - -def background(watermark = default_watermark, - halflife = default_halflife, - pollfreq = default_pollfreq_background, - parentframe = default_parentframe, - memory=None, time=None, memorymax=None, timemax=None): - """Turn on passive profiling. - -This is a very lightweight mode in which only intensively computing -functions can be detected. The smaller the 'watermark', the more functions -are compiled.""" - import profiler - p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe) - p.run(memory, time, memorymax, timemax) - - -def runonly(memory=None, time=None, memorymax=None, timemax=None): - """Nonprofiler. - -XXX check if this is useful and document.""" - if PYTHON_SUPPORT: - import profiler - p = profiler.RunOnly() - p.run(memory, time, memorymax, timemax) - - -def stop(): - """Turn off all automatic compilation. bind() calls remain in effect.""" - import profiler - profiler.go([]) - - -def log(logfile='', mode='w', top=10): - """Enable logging to the given file. - -If the file name is unspecified, a default name is built by appending -a 'log-psyco' extension to the main script name. - -Mode is 'a' to append to a possibly existing file or 'w' to overwrite -an existing file. Note that the log file may grow quickly in 'a' mode.""" - import profiler, logger - if not logfile: - import os - logfile, dummy = os.path.splitext(sys.argv[0]) - if os.path.basename(logfile): - logfile += '.' - logfile += 'log-psyco' - if hasattr(_psyco, 'VERBOSE_LEVEL'): - print >> sys.stderr, 'psyco: logging to', logfile - # logger.current should be a real file object; subtle problems - # will show up if its write() and flush() methods are written - # in Python, as Psyco will invoke them while compiling. - logger.current = open(logfile, mode) - logger.print_charges = top - profiler.logger = logger - logger.writedate('Logging started') - cannotcompile(logger.psycowrite) - _psyco.statwrite(logger=logger.psycowrite) - - -def bind(x, rec=None): - """Enable compilation of the given function, method, or class object. - -If C is a class (or anything with a '__dict__' attribute), bind(C) will -rebind all functions and methods found in C.__dict__ (which means, for -classes, all methods defined in the class but not in its parents). - -The optional second argument specifies the number of recursive -compilation levels: all functions called by func are compiled -up to the given depth of indirection.""" - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - if rec is None: - x.func_code = _psyco.proxycode(x) - else: - x.func_code = _psyco.proxycode(x, rec) - return - if hasattr(x, '__dict__'): - funcs = [o for o in x.__dict__.values() - if isinstance(o, types.MethodType) - or isinstance(o, types.FunctionType)] - if not funcs: - raise error, ("nothing bindable found in %s object" % - type(x).__name__) - for o in funcs: - bind(o, rec) - return - raise TypeError, "cannot bind %s objects" % type(x).__name__ - - -def unbind(x): - """Reverse of bind().""" - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - try: - f = _psyco.unproxycode(x.func_code) - except error: - pass - else: - x.func_code = f.func_code - return - if hasattr(x, '__dict__'): - for o in x.__dict__.values(): - if (isinstance(o, types.MethodType) - or isinstance(o, types.FunctionType)): - unbind(o) - return - raise TypeError, "cannot unbind %s objects" % type(x).__name__ - - -def proxy(x, rec=None): - """Return a Psyco-enabled copy of the function. - -The original function is still available for non-compiled calls. -The optional second argument specifies the number of recursive -compilation levels: all functions called by func are compiled -up to the given depth of indirection.""" - if isinstance(x, types.FunctionType): - if rec is None: - code = _psyco.proxycode(x) - else: - code = _psyco.proxycode(x, rec) - return new.function(code, x.func_globals, x.func_name) - if isinstance(x, types.MethodType): - p = proxy(x.im_func, rec) - return new.instancemethod(p, x.im_self, x.im_class) - raise TypeError, "cannot proxy %s objects" % type(x).__name__ - - -def unproxy(proxy): - """Return a new copy of the original function of method behind a proxy. -The result behaves like the original function in that calling it -does not trigger compilation nor execution of any compiled code.""" - if isinstance(proxy, types.FunctionType): - return _psyco.unproxycode(proxy.func_code) - if isinstance(proxy, types.MethodType): - f = unproxy(proxy.im_func) - return new.instancemethod(f, proxy.im_self, proxy.im_class) - raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__ - - -def cannotcompile(x): - """Instruct Psyco never to compile the given function, method -or code object.""" - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - x = x.func_code - if isinstance(x, types.CodeType): - _psyco.cannotcompile(x) - else: - raise TypeError, "unexpected %s object" % type(x).__name__ - - -def dumpcodebuf(): - """Write in file psyco.dump a copy of the emitted machine code, -provided Psyco was compiled with a non-zero CODE_DUMP. -See py-utils/httpxam.py to examine psyco.dump.""" - if hasattr(_psyco, 'dumpcodebuf'): - _psyco.dumpcodebuf() - - -########################################################################### -# Psyco variables -# error * the error raised by Psyco -# warning * the warning raised by Psyco -# __in_psyco__ * a new built-in variable which is always zero, but which -# Psyco special-cases by returning 1 instead. So -# __in_psyco__ can be used in a function to know if -# that function is being executed by Psyco or not. diff --git a/nodebox/ext/psyco/kdictproxy.py b/nodebox/ext/psyco/kdictproxy.py deleted file mode 100644 index c764e5e..0000000 --- a/nodebox/ext/psyco/kdictproxy.py +++ /dev/null @@ -1,133 +0,0 @@ -########################################################################### -# -# Support code for the 'psyco.compact' type. - -from __future__ import generators - -try: - from UserDict import DictMixin -except ImportError: - - # backported from Python 2.3 to Python 2.2 - class DictMixin: - # Mixin defining all dictionary methods for classes that already have - # a minimum dictionary interface including getitem, setitem, delitem, - # and keys. Without knowledge of the subclass constructor, the mixin - # does not define __init__() or copy(). In addition to the four base - # methods, progressively more efficiency comes with defining - # __contains__(), __iter__(), and iteritems(). - - # second level definitions support higher levels - def __iter__(self): - for k in self.keys(): - yield k - def has_key(self, key): - try: - value = self[key] - except KeyError: - return False - return True - def __contains__(self, key): - return self.has_key(key) - - # third level takes advantage of second level definitions - def iteritems(self): - for k in self: - yield (k, self[k]) - def iterkeys(self): - return self.__iter__() - - # fourth level uses definitions from lower levels - def itervalues(self): - for _, v in self.iteritems(): - yield v - def values(self): - return [v for _, v in self.iteritems()] - def items(self): - return list(self.iteritems()) - def clear(self): - for key in self.keys(): - del self[key] - def setdefault(self, key, default): - try: - return self[key] - except KeyError: - self[key] = default - return default - def pop(self, key, *args): - if len(args) > 1: - raise TypeError, "pop expected at most 2 arguments, got "\ - + repr(1 + len(args)) - try: - value = self[key] - except KeyError: - if args: - return args[0] - raise - del self[key] - return value - def popitem(self): - try: - k, v = self.iteritems().next() - except StopIteration: - raise KeyError, 'container is empty' - del self[k] - return (k, v) - def update(self, other): - # Make progressively weaker assumptions about "other" - if hasattr(other, 'iteritems'): # iteritems saves memory and lookups - for k, v in other.iteritems(): - self[k] = v - elif hasattr(other, '__iter__'): # iter saves memory - for k in other: - self[k] = other[k] - else: - for k in other.keys(): - self[k] = other[k] - def get(self, key, default=None): - try: - return self[key] - except KeyError: - return default - def __repr__(self): - return repr(dict(self.iteritems())) - def __cmp__(self, other): - if other is None: - return 1 - if isinstance(other, DictMixin): - other = dict(other.iteritems()) - return cmp(dict(self.iteritems()), other) - def __len__(self): - return len(self.keys()) - -########################################################################### - -from _psyco import compact - - -class compactdictproxy(DictMixin): - - def __init__(self, ko): - self._ko = ko # compact object of which 'self' is the dict - - def __getitem__(self, key): - return compact.__getslot__(self._ko, key) - - def __setitem__(self, key, value): - compact.__setslot__(self._ko, key, value) - - def __delitem__(self, key): - compact.__delslot__(self._ko, key) - - def keys(self): - return compact.__members__.__get__(self._ko) - - def clear(self): - keys = self.keys() - keys.reverse() - for key in keys: - del self[key] - - def __repr__(self): - keys = ', '.join(self.keys()) - return '' % (keys,) diff --git a/nodebox/ext/psyco/logger.py b/nodebox/ext/psyco/logger.py deleted file mode 100644 index a3c5219..0000000 --- a/nodebox/ext/psyco/logger.py +++ /dev/null @@ -1,96 +0,0 @@ -########################################################################### -# -# Psyco logger. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco logger. - -See log() in core.py. -""" -########################################################################### - - -import _psyco -from time import time, localtime, strftime - - -current = None -print_charges = 10 -dump_delay = 0.2 -dump_last = 0.0 - -def write(s, level): - t = time() - f = t-int(t) - try: - current.write("%s.%02d %-*s%s\n" % ( - strftime("%X", localtime(int(t))), - int(f*100.0), 63-level, s, - "%"*level)) - current.flush() - except (OSError, IOError): - pass - -def psycowrite(s): - t = time() - f = t-int(t) - try: - current.write("%s.%02d %-*s%s\n" % ( - strftime("%X", localtime(int(t))), - int(f*100.0), 60, s.strip(), - "% %")) - current.flush() - except (OSError, IOError): - pass - -##def writelines(lines, level=0): -## if lines: -## t = time() -## f = t-int(t) -## timedesc = strftime("%x %X", localtime(int(t))) -## print >> current, "%s.%03d %-*s %s" % ( -## timedesc, int(f*1000), -## 50-level, lines[0], -## "+"*level) -## timedesc = " " * (len(timedesc)+5) -## for line in lines[1:]: -## print >> current, timedesc, line - -def writememory(): - write("memory usage: %d+ kb" % _psyco.memory(), 1) - -def dumpcharges(): - global dump_last - if print_charges: - t = time() - if not (dump_last <= t < dump_last+dump_delay): - if t <= dump_last+1.5*dump_delay: - dump_last += dump_delay - else: - dump_last = t - #write("%s: charges:" % who, 0) - lst = _psyco.stattop(print_charges) - if lst: - f = t-int(t) - lines = ["%s.%02d ______\n" % ( - strftime("%X", localtime(int(t))), - int(f*100.0))] - i = 1 - for co, charge in lst: - detail = co.co_filename - if len(detail) > 19: - detail = '...' + detail[-17:] - lines.append(" #%-3d |%4.1f %%| %-26s%20s:%d\n" % - (i, charge*100.0, co.co_name, detail, - co.co_firstlineno)) - i += 1 - current.writelines(lines) - current.flush() - -def writefinalstats(): - dumpcharges() - writememory() - writedate("program exit") - -def writedate(msg): - write('%s, %s' % (msg, strftime("%x")), 20) diff --git a/nodebox/ext/psyco/profiler.py b/nodebox/ext/psyco/profiler.py deleted file mode 100644 index ef7bf8e..0000000 --- a/nodebox/ext/psyco/profiler.py +++ /dev/null @@ -1,388 +0,0 @@ -########################################################################### -# -# Psyco profiler (Python part). -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco profiler (Python part). - -The implementation of the non-time-critical parts of the profiler. -See profile() and full() in core.py for the easy interface. -""" -########################################################################### - -import _psyco -from support import * -import math, time, types, atexit -now = time.time -try: - import thread -except ImportError: - import dummy_thread as thread - - -# current profiler instance -current = None - -# enabled profilers, in order of priority -profilers = [] - -# logger module (when enabled by core.log()) -logger = None - -# a lock for a thread-safe go() -go_lock = thread.allocate_lock() - -def go(stop=0): - # run the highest-priority profiler in 'profilers' - global current - go_lock.acquire() - try: - prev = current - if stop: - del profilers[:] - if prev: - if profilers and profilers[0] is prev: - return # best profiler already running - prev.stop() - current = None - for p in profilers[:]: - if p.start(): - current = p - if logger: # and p is not prev: - logger.write("%s: starting" % p.__class__.__name__, 5) - return - finally: - go_lock.release() - # no profiler is running now - if stop: - if logger: - logger.writefinalstats() - else: - tag2bind() - -atexit.register(go, 1) - - -def buildfncache(globals, cache): - if hasattr(types.IntType, '__dict__'): - clstypes = (types.ClassType, types.TypeType) - else: - clstypes = types.ClassType - for x in globals.values(): - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - cache[x.func_code] = x, '' - elif isinstance(x, clstypes): - for y in x.__dict__.values(): - if isinstance(y, types.MethodType): - y = y.im_func - if isinstance(y, types.FunctionType): - cache[y.func_code] = y, x.__name__ - -# code-to-function mapping (cache) -function_cache = {} - -def trytobind(co, globals, log=1): - try: - f, clsname = function_cache[co] - except KeyError: - buildfncache(globals, function_cache) - try: - f, clsname = function_cache[co] - except KeyError: - if logger: - logger.write('warning: cannot find function %s in %s' % - (co.co_name, globals.get('__name__', '?')), 3) - return # give up - if logger and log: - modulename = globals.get('__name__', '?') - if clsname: - modulename += '.' + clsname - logger.write('bind function: %s.%s' % (modulename, co.co_name), 1) - f.func_code = _psyco.proxycode(f) - - -if PYTHON_SUPPORT: - # the list of code objects that have been tagged - tagged_codes = [] - - def tag(co, globals): - if logger: - try: - f, clsname = function_cache[co] - except KeyError: - buildfncache(globals, function_cache) - try: - f, clsname = function_cache[co] - except KeyError: - clsname = '' # give up - modulename = globals.get('__name__', '?') - if clsname: - modulename += '.' + clsname - logger.write('tag function: %s.%s' % (modulename, co.co_name), 1) - tagged_codes.append((co, globals)) - _psyco.turbo_frame(co) - _psyco.turbo_code(co) - - def tag2bind(): - if tagged_codes: - if logger: - logger.write('profiling stopped, binding %d functions' % - len(tagged_codes), 2) - for co, globals in tagged_codes: - trytobind(co, globals, 0) - function_cache.clear() - del tagged_codes[:] - -else: - # tagging is impossible, always bind - tag = trytobind - def tag2bind(): - pass - - - -class Profiler: - MemoryTimerResolution = 0.103 - - def run(self, memory, time, memorymax, timemax): - self.memory = memory - self.memorymax = memorymax - self.time = time - if timemax is None: - self.endtime = None - else: - self.endtime = now() + timemax - self.alarms = [] - profilers.append(self) - go() - - def start(self): - curmem = _psyco.memory() - memlimits = [] - if self.memorymax is not None: - if curmem >= self.memorymax: - if logger: - logger.writememory() - return self.limitreached('memorymax') - memlimits.append(self.memorymax) - if self.memory is not None: - if self.memory <= 0: - if logger: - logger.writememory() - return self.limitreached('memory') - memlimits.append(curmem + self.memory) - self.memory_at_start = curmem - - curtime = now() - timelimits = [] - if self.endtime is not None: - if curtime >= self.endtime: - return self.limitreached('timemax') - timelimits.append(self.endtime - curtime) - if self.time is not None: - if self.time <= 0.0: - return self.limitreached('time') - timelimits.append(self.time) - self.time_at_start = curtime - - try: - self.do_start() - except error, e: - if logger: - logger.write('%s: disabled by psyco.error:' % ( - self.__class__.__name__), 4) - logger.write(' %s' % str(e), 3) - return 0 - - if memlimits: - self.memlimits_args = (time.sleep, (self.MemoryTimerResolution,), - self.check_memory, (min(memlimits),)) - self.alarms.append(_psyco.alarm(*self.memlimits_args)) - if timelimits: - self.alarms.append(_psyco.alarm(time.sleep, (min(timelimits),), - self.time_out)) - return 1 - - def stop(self): - for alarm in self.alarms: - alarm.stop(0) - for alarm in self.alarms: - alarm.stop(1) # wait for parallel threads to stop - del self.alarms[:] - if self.time is not None: - self.time -= now() - self.time_at_start - if self.memory is not None: - self.memory -= _psyco.memory() - self.memory_at_start - - try: - self.do_stop() - except error: - return 0 - return 1 - - def check_memory(self, limit): - if _psyco.memory() < limit: - return self.memlimits_args - go() - - def time_out(self): - self.time = 0.0 - go() - - def limitreached(self, limitname): - try: - profilers.remove(self) - except ValueError: - pass - if logger: - logger.write('%s: disabled (%s limit reached)' % ( - self.__class__.__name__, limitname), 4) - return 0 - - -class FullCompiler(Profiler): - - def do_start(self): - _psyco.profiling('f') - - def do_stop(self): - _psyco.profiling('.') - - -class RunOnly(Profiler): - - def do_start(self): - _psyco.profiling('n') - - def do_stop(self): - _psyco.profiling('.') - - -class ChargeProfiler(Profiler): - - def __init__(self, watermark, parentframe): - self.watermark = watermark - self.parent2 = parentframe * 2.0 - self.lock = thread.allocate_lock() - - def init_charges(self): - _psyco.statwrite(watermark = self.watermark, - parent2 = self.parent2) - - def do_stop(self): - _psyco.profiling('.') - _psyco.statwrite(callback = None) - - -class ActiveProfiler(ChargeProfiler): - - def active_start(self): - _psyco.profiling('p') - - def do_start(self): - self.init_charges() - self.active_start() - _psyco.statwrite(callback = self.charge_callback) - - def charge_callback(self, frame, charge): - tag(frame.f_code, frame.f_globals) - - -class PassiveProfiler(ChargeProfiler): - - initial_charge_unit = _psyco.statread('unit') - reset_stats_after = 120 # half-lives (maximum 200!) - reset_limit = initial_charge_unit * (2.0 ** reset_stats_after) - - def __init__(self, watermark, halflife, pollfreq, parentframe): - ChargeProfiler.__init__(self, watermark, parentframe) - self.pollfreq = pollfreq - # self.progress is slightly more than 1.0, and computed so that - # do_profile() will double the change_unit every 'halflife' seconds. - self.progress = 2.0 ** (1.0 / (halflife * pollfreq)) - - def reset(self): - _psyco.statwrite(unit = self.initial_charge_unit, callback = None) - _psyco.statreset() - if logger: - logger.write("%s: resetting stats" % self.__class__.__name__, 1) - - def passive_start(self): - self.passivealarm_args = (time.sleep, (1.0 / self.pollfreq,), - self.do_profile) - self.alarms.append(_psyco.alarm(*self.passivealarm_args)) - - def do_start(self): - tag2bind() - self.init_charges() - self.passive_start() - - def do_profile(self): - _psyco.statcollect() - if logger: - logger.dumpcharges() - nunit = _psyco.statread('unit') * self.progress - if nunit > self.reset_limit: - self.reset() - else: - _psyco.statwrite(unit = nunit, callback = self.charge_callback) - return self.passivealarm_args - - def charge_callback(self, frame, charge): - trytobind(frame.f_code, frame.f_globals) - - -class ActivePassiveProfiler(PassiveProfiler, ActiveProfiler): - - def do_start(self): - self.init_charges() - self.active_start() - self.passive_start() - - def charge_callback(self, frame, charge): - tag(frame.f_code, frame.f_globals) - - - -# -# we register our own version of sys.settrace(), sys.setprofile() -# and thread.start_new_thread(). -# - -def psyco_settrace(*args, **kw): - "This is the Psyco-aware version of sys.settrace()." - result = original_settrace(*args, **kw) - go() - return result - -def psyco_setprofile(*args, **kw): - "This is the Psyco-aware version of sys.setprofile()." - result = original_setprofile(*args, **kw) - go() - return result - -def psyco_thread_stub(callable, args, kw): - _psyco.statcollect() - if kw is None: - return callable(*args) - else: - return callable(*args, **kw) - -def psyco_start_new_thread(callable, args, kw=None): - "This is the Psyco-aware version of thread.start_new_thread()." - return original_start_new_thread(psyco_thread_stub, (callable, args, kw)) - -original_settrace = sys.settrace -original_setprofile = sys.setprofile -original_start_new_thread = thread.start_new_thread -sys.settrace = psyco_settrace -sys.setprofile = psyco_setprofile -if PYTHON_SUPPORT: - thread.start_new_thread = psyco_start_new_thread - # hack to patch threading._start_new_thread if the module is - # already loaded - if (sys.modules.has_key('threading') and - hasattr(sys.modules['threading'], '_start_new_thread')): - sys.modules['threading']._start_new_thread = psyco_start_new_thread diff --git a/nodebox/ext/psyco/src/COPYING.txt b/nodebox/ext/psyco/src/COPYING.txt deleted file mode 100644 index 7ae25af..0000000 --- a/nodebox/ext/psyco/src/COPYING.txt +++ /dev/null @@ -1,9 +0,0 @@ -Psyco is distributed under the MIT License. - -Copyright (c) 2001-2003 Armin Rigo - -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/nodebox/ext/psyco/src/MANIFEST b/nodebox/ext/psyco/src/MANIFEST deleted file mode 100644 index de79f6d..0000000 --- a/nodebox/ext/psyco/src/MANIFEST +++ /dev/null @@ -1,171 +0,0 @@ -COPYING.txt -MANIFEST -README.txt -c/Makefile -c/Modules/parray.c -c/Modules/pmath.c -c/Modules/ppsyco.c -c/Objects/compactobject.c -c/Objects/compactobject.h -c/Objects/pabstract.c -c/Objects/pabstract.h -c/Objects/pboolobject.c -c/Objects/pboolobject.h -c/Objects/pclassobject.c -c/Objects/pclassobject.h -c/Objects/pcompactobject.c -c/Objects/pcompactobject.h -c/Objects/pdescrobject.c -c/Objects/pdescrobject.h -c/Objects/pdictobject.c -c/Objects/pdictobject.h -c/Objects/pfloatobject.c -c/Objects/pfloatobject.h -c/Objects/pfuncobject.c -c/Objects/pfuncobject.h -c/Objects/pintobject.c -c/Objects/pintobject.h -c/Objects/piterobject.c -c/Objects/piterobject.h -c/Objects/plistobject.c -c/Objects/plistobject.h -c/Objects/plongobject.c -c/Objects/plongobject.h -c/Objects/pmethodobject.c -c/Objects/pmethodobject.h -c/Objects/pobject.c -c/Objects/pobject.h -c/Objects/prangeobject.c -c/Objects/prangeobject.h -c/Objects/pstringobject.c -c/Objects/pstringobject.h -c/Objects/pstructmember.c -c/Objects/pstructmember.h -c/Objects/ptupleobject.c -c/Objects/ptupleobject.h -c/Objects/ptypeobject.c -c/Objects/ptypeobject.h -c/Python/frames.c -c/Python/frames.h -c/Python/pbltinmodule.c -c/Python/pbltinmodule.h -c/Python/pycheader.h -c/Python/pycinternal.h -c/Python/pycompiler.c -c/Python/pycompiler.h -c/Python/pyver.h -c/alarm.c -c/alarm.h -c/blockalloc.h -c/codegen.c -c/codegen.h -c/codemanager.c -c/codemanager.h -c/cstruct.c -c/cstruct.h -c/depend.py -c/dispatcher.c -c/dispatcher.h -c/files.py -c/i386/idispatcher.c -c/i386/idispatcher.h -c/i386/iencoding.c -c/i386/iencoding.h -c/i386/iinitialize.h -c/i386/iprocessor.c -c/i386/ipyencoding.c -c/i386/ipyencoding.h -c/i386/itiming.h -c/initialize.h -c/ivm/idispatcher.c -c/ivm/idispatcher.h -c/ivm/iencoding.c -c/ivm/iencoding.h -c/ivm/iinitialize.h -c/ivm/iprocessor.c -c/ivm/ipyencoding.c -c/ivm/ipyencoding.h -c/ivm/itiming.h -c/ivm/ivm-insns.c -c/ivm/ivm-insns.h -c/ivm/localsetup.py -c/ivm/prolog/Makefile -c/ivm/prolog/ccode.pl -c/ivm/prolog/detcheck.pl -c/ivm/prolog/insns-igen-h.i.default -c/ivm/prolog/insns-igen.i.default -c/ivm/prolog/insns-switch.i.default -c/ivm/prolog/insns-table.py.default -c/ivm/prolog/insns-threaded.i.default -c/ivm/prolog/insns.pl -c/ivm/prolog/insns.py -c/ivm/prolog/insnset.py -c/ivm/prolog/mode_combine.pl.default -c/ivm/prolog/optimize.pl -c/ivm/prolog/samelines.py -c/ivm/prolog/utils.pl -c/ivm/prolog/vm.pl -c/ivm/prolog/vmwriter.pl -c/linuxmemchk.c -c/linuxmemchk.h -c/mergepoints.c -c/mergepoints.h -c/mkincl.py -c/mychecker.py -c/platform.c -c/platform.h -c/processor.h -c/profile.c -c/profile.h -c/psyco.c -c/psyco.h -c/psyfunc.c -c/psyfunc.h -c/pycodegen.h -c/stats.c -c/stats.h -c/timing.h -c/vcompiler.c -c/vcompiler.h -c/versionchecker.py -c/win32/psyco.vcproj -doc/Makefile -doc/README.txt -doc/psycoguide.tex -py-support/__init__.py -py-support/classes.py -py-support/core.py -py-support/kdictproxy.py -py-support/logger.py -py-support/profiler.py -py-support/support.py -py-utils/cvs.py -py-utils/httpxam.py -py-utils/ivmdump.py -py-utils/ivmextract.py -py-utils/ivmoptimize.py -py-utils/manifest.py -py-utils/symbols.py -py-utils/vinfo_dump.py -py-utils/win32/README.TXT -py-utils/xam.py -py-utils/xamsupport.c -setup.py -test/bpnn.py -test/btrun.py -test/classicregrtest.py -test/file1-basetests -test/file2-basetests.uu -test/fulltester.py -test/life-psyco.py -test/life.py -test/pystone-jit.py -test/pystone.py -test/regrtester.py -test/regrtester2.py -test/test1.py -test/test3.py -test/test5.py -test/test_base.py -test/test_compactobject.py -test/test_misc.py diff --git a/nodebox/ext/psyco/src/README.txt b/nodebox/ext/psyco/src/README.txt deleted file mode 100644 index 222aa68..0000000 --- a/nodebox/ext/psyco/src/README.txt +++ /dev/null @@ -1,77 +0,0 @@ -====================================================================== - Psyco, the Python Specializing Compiler -====================================================================== - - - VERSION 1.5.2+SVN - ----------------- - -Psyco is a Python extension module which can massively speed up the -execution of any Python code. - - -REQUIREMENTS ------------- - -Psyco works on almost any version of Python (currently 2.2.2 -to 2.5). At present it *requires* a *32-bit* *PC* (i.e. a -386-compatible processor), but it is OS-independant. - -This program is still and will always be incomplete, but it -has been stable for a long time and can give good results. - -There are no plans to port Psyco to 64-bit architectures. -This would be rather involved. Psyco is only being -maintained, not further developed. The development efforts of -the author are now focused on PyPy, which will include -Psyco-like techniques. (http://codespeak.net/pypy) - -Psyco requires Python >= 2.2.2. Support for older versions -has been dropped after Psyco 1.5.2. - - -QUICK INTRODUCTION ------------------- - -To install Psyco, do the usual - - python setup.py install - -Manually, you can also put the 'psyco' package in your Python search -path, e.g. by copying the subdirectory 'psyco' into the directory -'/usr/lib/python2.x/site-packages' (default path on Linux). - -Basic usage is very simple: add - - import psyco - psyco.full() - -to the beginning of your main script. For basic introduction see: - - import psyco - help(psyco) - - -DOCUMENTATION AND LATEST VERSIONS ---------------------------------- - -Home page: - - * http://psyco.sourceforge.net - -The current up-to-date documentation is the Ultimate Psyco Guide. -If it was not included in this distribution ("psycoguide.ps" or -"psycoguide/index.html"), see the doc page: - - * http://psyco.sourceforge.net/doc.html - - -DEBUG BUILD ------------ - -To build a version of Psyco that includes debugging checks and/or -debugging output, see comments in setup.py. - - ----------- -Armin Rigo. diff --git a/nodebox/ext/psyco/src/c/Makefile b/nodebox/ext/psyco/src/c/Makefile deleted file mode 100644 index 562afd6..0000000 --- a/nodebox/ext/psyco/src/c/Makefile +++ /dev/null @@ -1,108 +0,0 @@ - -# G = debug, O = optimized, V = verbose, X = all tests, -# H = heavy mem check -mode = O - -processor = i386 -# processor = ivm - - -# OPTS = -DPSYCO_DEBUG=1 -DBIG_BUFFER_SIZE=0x100000 -DVERBOSE_LEVEL=0 -DCODE_DUMP=1 -DHEAVY_MEM_CHECK=0 -OPTS_G = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -C_FLAGS_G = -g - -OPTS_O = -DPSYCO_DEBUG=0 -DVERBOSE_LEVEL=0 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=0 -C_FLAGS_O = -O3 - -OPTS_OG = -DPSYCO_DEBUG=0 -DVERBOSE_LEVEL=3 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=0 -C_FLAGS_OG= -O3 -g - -OPTS_FASTG= -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -C_FLAGS_FASTG= -O3 -g - -OPTS_DG = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DMETA_ASSERT_DEPTH -C_FLAGS_DG = -g - -OPTS_V = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=3 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -C_FLAGS_V = -g - -OPTS_X = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=2 -C_FLAGS_X = -g - -OPTS_H = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=1 -DCODE_DUMP=1 -C_FLAGS_H = -g - -OPTS_P = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DVERBOSE_STATS=1 -C_FLAGS_P = -g - -OPTS_PP = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=3 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DVERBOSE_STATS=1 -C_FLAGS_PP= -g - -OPTS_M = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 -DPSYCO_NO_LINKED_LISTS -C_FLAGS_M = -g - -OPTS_T = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=1 '-DPSYCO_TRACE="psyco.trace"' -C_FLAGS_T = -g - -OPTS_TT = -DPSYCO_DEBUG=1 -DVERBOSE_LEVEL=1 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=3 '-DPSYCO_TRACE="psyco.trace"' - -OPTS_OO = -DPSYCO_DEBUG=0 -DVERBOSE_LEVEL=0 -DHEAVY_MEM_CHECK=0 -DCODE_DUMP=0 -C_FLAGS_OO= -DNDEBUG -O3 -Wall -fomit-frame-pointer -mcpu=pentium4 -march=pentium4 -mmmx -msse -mfpmath=sse - - -OPTS = ${OPTS_${mode}} -C_FLAGS = -I${processor} -DNDEBUG ${C_FLAGS_${mode}} -Wall -Wstrict-prototypes -fPIC -fno-strict-aliasing ${OPTS} ${incl} -ansi -Wdeclaration-after-statement -Wundef -LD_FLAGS = -shared -BUILDDIR = ../build -LIBDIR = lib.linux-i686-${PY_VER} -OUTDIR = ${BUILDDIR}/${LIBDIR}/psyco -OUTPUT = ${OUTDIR}/_psyco.so - -ifdef cvs - cvshome = ${HOME}/cvs/2.2 - python = ${cvshome}/dist/src/python -else - python = python -endif - - -PY_VER := $(shell $(python) -c "import sys; print '%d.%d' % sys.version_info[:2]") -PY_VER_EX := $(shell $(python) -V 2>&1) -incl := $(shell $(python) mkincl.py) - -BUILD_VERSION = Compiling mode ${mode} for ${PY_VER_EX} on ${processor} - -main: build_ext build_py - -dyn: ${OUTDIR}/dyn-tag build_py - -build_ext: build_py - @echo ------------------------------------------- - @echo ${BUILD_VERSION} - @echo ------------------------------------------- - gcc ${LD_FLAGS} ${C_FLAGS} -DALL_STATIC=1 psyco.c platform.c -o ${OUTPUT} - echo ${BUILD_VERSION} > ${OUTDIR}/build-version - cd ..; $(python) setup.py install - -build_py: - cd ..; $(python) setup.py build_py - --include dyn-Makefile - -%.o: %.c - gcc ${C_FLAGS} -DALL_STATIC=0 -c $< -o $@ - -${OUTDIR}/dyn-tag: ${O_FILES} -# -rm ${BUILDDIR}/current - gcc ${LD_FLAGS} $^ -o ${OUTPUT} - echo ${BUILD_VERSION} > ${OUTDIR}/build-version - echo dyn-tag >> ${OUTDIR}/build-version -# ln -s ${LIBDIR} ${BUILDDIR}/current - touch $@ - -clean: - -rm -f ${O_FILES} - -depend: - python files.py - python depend.py ${processor} diff --git a/nodebox/ext/psyco/src/c/Modules/parray.c b/nodebox/ext/psyco/src/c/Modules/parray.c deleted file mode 100644 index 4e92787..0000000 --- a/nodebox/ext/psyco/src/c/Modules/parray.c +++ /dev/null @@ -1,515 +0,0 @@ -#include "../psyco.h" -#include "../Objects/pabstract.h" -#include "../Objects/pintobject.h" -#include "../Objects/pfloatobject.h" -#include "../Objects/pstringobject.h" -#include "../Objects/ptupleobject.h" - - -/***************************************************************/ - -/* the following two variables are set by the initialization function - to point to private things in arraymodule.c */ -static PyCFunction cimpl_array = NULL; /* ptr to C impl of array.array() */ -static PyTypeObject* arraytype; /* array.ArrayType */ - - -/* declarations copied from arraymodule.c */ -struct arrayobject; /* Forward */ -struct arraydescr { - int typecode; - int itemsize; - PyObject * (*getitem)(struct arrayobject *, int); - int (*setitem)(struct arrayobject *, int, PyObject *); -}; -typedef struct arrayobject { - PyObject_HEAD - int ob_size; - char *ob_item; -#if HAVE_arrayobject_allocated - int allocated; -#endif - struct arraydescr *ob_descr; -} arrayobject; - - -#define ARRAY_ob_item FMUT(DEF_FIELD(arrayobject, char*, ob_item, VAR_size)) -#define ARRAY_ob_descr DEF_FIELD(arrayobject, struct arraydescr*, \ - ob_descr, ARRAY_ob_item) -#define iARRAY_OB_ITEM FIELD_INDEX(ARRAY_ob_item) -#define iARRAY_OB_DESCR FIELD_INDEX(ARRAY_ob_descr) -#define ARRAY_TOTAL FIELDS_TOTAL(ARRAY_ob_descr) - - -/* meta-implementation of some getitem() and setitem() functions. - Our meta-implementations of setitem() are never called with a run-time - index equal to -1; to do the equivalent of the array module's object - type checking, you must call setitem() with a *compile-time* value of -1. */ - -PSY_INLINE vinfo_t* generic_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, - defield_t rdf) -{ - vinfo_t* result; - vinfo_t* ob_item; - - ob_item = psyco_get_field(po, ap, ARRAY_ob_item); - if (ob_item == NULL) - return NULL; - - result = psyco_get_field_array(po, ob_item, rdf, vi); - vinfo_decref(ob_item, po); - return result; -} - -static vinfo_t* integral_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, - defield_t rdf) -{ - vinfo_t* num = generic_getitem(po, ap, vi, rdf); - if (num != NULL) { - return PsycoInt_FROM_LONG(num); - } - else - return NULL; -} - -static vinfo_t* p_c_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) -{ - defield_t rdf = FMUT(UNSIGNED_ARRAY(unsigned char, 0)); - vinfo_t* chr = generic_getitem(po, ap, vi, rdf); - if (chr != NULL) { - vinfo_t* result = PsycoCharacter_New(chr); - vinfo_decref(chr, po); - return result; - } - else - return NULL; -} - -static vinfo_t* p_b_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { - return integral_getitem(po, ap, vi, - FMUT(DEF_ARRAY(signed char, 0))); -} - -static vinfo_t* p_BB_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { - return integral_getitem(po, ap, vi, - FMUT(UNSIGNED_ARRAY(unsigned char, 0))); -} - -static vinfo_t* p_h_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { - return integral_getitem(po, ap, vi, - FMUT(DEF_ARRAY(signed short, 0))); -} - -static vinfo_t* p_HH_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { - return integral_getitem(po, ap, vi, - FMUT(UNSIGNED_ARRAY(unsigned short, 0))); -} - -static vinfo_t* p_l_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) { - return integral_getitem(po, ap, vi, - FMUT(DEF_ARRAY(long, 0))); -} - -#if HAVE_FP_FN_CALLS -static vinfo_t* p_f_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) -{ - defield_t rdf = FMUT(DEF_ARRAY(float, 0)); - vinfo_t* fval = generic_getitem(po, ap, vi, rdf); - if (fval != NULL) { - vinfo_t* result = PsycoFloat_FromFloat(po, fval); - vinfo_decref(fval, po); - return result; - } - else - return NULL; -} - -static vinfo_t* p_d_getitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) -{ - vinfo_t* ob_item; - vinfo_t* fval1; - vinfo_t* fval2; - defield_t rdf = FMUT(DEF_ARRAY(double, 0)); - - ob_item = psyco_get_field(po, ap, ARRAY_ob_item); - if (ob_item == NULL) - return NULL; - - fval1 = psyco_get_field_array(po, ob_item, rdf, vi); - if (fval1 == NULL) { - vinfo_decref(ob_item, po); - return NULL; - } - fval2 = psyco_get_field_array(po, ob_item, FIELD_PART2(rdf), vi); - vinfo_decref(ob_item, po); - if (fval2 == NULL) { - vinfo_decref(fval1, po); - return NULL; - } - - return PsycoFloat_FROM_DOUBLE(fval1, fval2); -} -#else -# define p_f_getitem NULL -# define p_d_getitem NULL -#endif - - -PSY_INLINE bool generic_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, - vinfo_t* value, defield_t rdf) -{ - bool result; - vinfo_t* ob_item; - - ob_item = psyco_get_field(po, ap, ARRAY_ob_item); - if (ob_item == NULL) - return false; - - result = psyco_put_field_array(po, ob_item, rdf, vi, value); - vinfo_decref(ob_item, po); - return result; -} - -static bool integral_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, - vinfo_t* v, long lowbound, long highbound, - defield_t rdf) -{ - bool result; - vinfo_t* value = PsycoInt_AsLong(po, v); - if (value == NULL) { - /* XXX translate TypeError("an integer is required") - into TypeError("array item must be integer") */ - return false; - } - - switch (runtime_in_bounds(po, value, lowbound, highbound)) { - case 0: - /* XXX build the correct error message */ - PycException_SetString(po, PyExc_OverflowError, - "array item is out of bounds"); - result = false; - break; - case 1: - result = generic_setitem(po, ap, vi, value, rdf); - break; - default: - result = false; - break; - } - vinfo_decref(value, po); - return result; -} - -static bool p_c_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) -{ - vinfo_t* value; - if (!PsycoCharacter_Ord(po, v, &value)) - return false; - - if (value != NULL) { - /* 'v' is really a string of size 1 */ - defield_t rdf = FMUT(UNSIGNED_ARRAY(char, 0)); - bool result = generic_setitem(po, ap, vi, value, rdf); - vinfo_decref(value, po); - return result; - } - PycException_SetString(po, PyExc_TypeError, - "array item must be char"); - return false; -} - -static bool p_b_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { - return integral_setitem(po, ap, vi, v, -128, 127, - FMUT(DEF_ARRAY(char, 0))); -} - -static bool p_BB_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { - return integral_setitem(po, ap, vi, v, 0, UCHAR_MAX, - FMUT(UNSIGNED_ARRAY(char, 0))); -} - -static bool p_h_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { - return integral_setitem(po, ap, vi, v, SHRT_MIN, SHRT_MAX, - FMUT(DEF_ARRAY(short, 0))); -} - -static bool p_HH_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { - return integral_setitem(po, ap, vi, v, 0, USHRT_MAX, - FMUT(UNSIGNED_ARRAY(short, 0))); -} - -static bool p_l_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { - return integral_setitem(po, ap, vi, v, LONG_MIN, LONG_MAX, - FMUT(DEF_ARRAY(long, 0))); -} - -#if HAVE_FP_FN_CALLS -#define p_f_setitem NULL -/* -static bool p_f_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { - XXX implement PsycoFloat_AsFloat() XXX -}*/ - -static bool p_d_setitem(PsycoObject* po, vinfo_t* ap, vinfo_t* vi, vinfo_t* v) { - vinfo_t* w1; - vinfo_t* w2; - bool result; - vinfo_t* ob_item; - defield_t rdf = FMUT(DEF_ARRAY(double, 0)); - - if (!PsycoFloat_AsDouble(po, v, &w1, &w2)) - return false; - - ob_item = psyco_get_field(po, ap, ARRAY_ob_item); - if (ob_item == NULL) - result = false; - else { - result = psyco_put_field_array(po, ob_item, rdf, vi, w1) && - psyco_put_field_array(po, ob_item, FIELD_PART2(rdf), vi, w2); - vinfo_decref(ob_item, po); - } - vinfo_decref(w2, po); - vinfo_decref(w1, po); - return result; -} -#else -# define p_f_setitem NULL -# define p_d_setitem NULL -#endif - - -/* list of meta-implementations of descriptor-specific getitem() and setitem() */ -struct metadescr_s { - int typecode; - vinfo_t* (*meta_getitem) (PsycoObject*, vinfo_t*, vinfo_t*); - bool (*meta_setitem) (PsycoObject*, vinfo_t*, vinfo_t*, vinfo_t*); - struct arraydescr* base; -}; - -static struct metadescr_s metadescriptors[] = { - {'c', p_c_getitem, p_c_setitem}, - {'b', p_b_getitem, p_b_setitem}, - {'B', p_BB_getitem, p_BB_setitem}, -#ifdef Py_USING_UNICODE - /* XXX */ -#endif - {'h', p_h_getitem, p_h_setitem}, - {'H', p_HH_getitem, p_HH_setitem}, -#if SIZEOF_INT==SIZEOF_LONG -# define p_i_getitem p_l_getitem -# define p_i_setitem p_l_setitem - {'i', p_i_getitem, p_i_setitem}, - /*# define p_II_getitem p_l_getitem - # define p_II_setitem p_l_setitem - {'I', p_II_getitem, p_II_setitem},*/ -#endif - {'l', p_l_getitem, p_l_setitem}, - /*#define p_LL_getitem p_l_getitem - #define p_LL_setitem p_l_setitem - {'L', p_LL_getitem, p_LL_setitem},*/ - {'f', p_f_getitem, p_f_setitem}, - {'d', p_d_getitem, p_d_setitem}, - {'\0', NULL, NULL} /* Sentinel */ -}; - - -/* meta-implementation of array_item */ -static vinfo_t* parray_item(PsycoObject* po, vinfo_t* ap, vinfo_t* vi) -{ - condition_code_t cc; - vinfo_t* vlen; - struct arraydescr* d; - long dlong; - - /* get the ob_descr field of 'ap' and promote it to compile-time */ - vinfo_t* vdescr = psyco_get_const(po, ap, ARRAY_ob_descr); - if (vdescr == NULL) - return NULL; - dlong = psyco_atcompiletime(po, vdescr); - if (dlong == -1) { - /* a pointer cannot be -1, so we know it must be an exception */ - extra_assert(PycException_Occurred(po)); - return NULL; - } - d = (struct arraydescr*) dlong; - - /* check that the index is within range */ - vlen = psyco_get_field(po, ap, VAR_size); - if (vlen == NULL) - return NULL; - - cc = integer_cmp(po, vi, vlen, Py_GE|COMPARE_UNSIGNED); - vinfo_decref(vlen, po); - if (cc == CC_ERROR) - return NULL; - - if (runtime_condition_f(po, cc)) { - PycException_SetString(po, PyExc_IndexError, - "array index out of range"); - return NULL; - } - - /* call the item getter or its meta-implementation */ - return Psyco_META2(po, d->getitem, CfReturnRef|CfPyErrIfNull, - "vv", ap, vi); -} - -static bool parray_ass_item(PsycoObject* po, vinfo_t* ap, vinfo_t* vi,vinfo_t* v) -{ - vinfo_t* vdescr; - condition_code_t cc; - vinfo_t* vlen; - struct arraydescr* d; - long dlong; - - if (v == NULL) { - /* XXX implement item deletion */ - return psyco_generic_call(po, arraytype->tp_as_sequence-> - sq_ass_item, - CfNoReturnValue|CfPyErrIfNonNull, - "vvl", ap, vi, (long) NULL) != NULL; - } - - /* get the ob_descr field of 'ap' and promote it to compile-time */ - vdescr = psyco_get_const(po, ap, ARRAY_ob_descr); - if (vdescr == NULL) - return false; - dlong = psyco_atcompiletime(po, vdescr); - if (dlong == -1) { - /* a pointer cannot be -1, so we know it must be an exception */ - extra_assert(PycException_Occurred(po)); - return false; - } - d = (struct arraydescr*) dlong; - - /* check that the index is within range */ - vlen = psyco_get_field(po, ap, VAR_size); - if (vlen == NULL) - return false; - - cc = integer_cmp(po, vi, vlen, Py_GE|COMPARE_UNSIGNED); - vinfo_decref(vlen, po); - if (cc == CC_ERROR) - return false; - - if (runtime_condition_f(po, cc)) { - PycException_SetString(po, PyExc_IndexError, - "array assignment index out of range"); - return false; - } - - /* call the item setter or its meta-implementation */ - return Psyco_META3(po, d->setitem, CfNoReturnValue|CfPyErrIfNonNull, - "vvv", ap, vi, v) != NULL; -} - - -/* array creation: we know the result is of type ArrayType. */ -DEF_KNOWN_RET_TYPE_2(pa_array, cimpl_array, CfReturnRef|CfPyErrIfNull, arraytype) - -static vinfo_t* parray_new(PsycoObject* po, PyTypeObject* type, - vinfo_t* varg, vinfo_t* vkw) -{ - /* In this version we also decode a constant-time - description character. */ - vinfo_t* result = psyco_generic_call(po, arraytype->tp_new, - CfReturnRef|CfPyErrIfNull, - "lvv", type, varg, vkw); - if (result != NULL) { - vinfo_t* firstarg; - PyObject* a; - struct metadescr_s* descr; - char code; - - if (PsycoTuple_Load(varg) < 1) goto cannot_decode; - firstarg = PsycoTuple_GET_ITEM(varg, 0); - if (!is_compiletime(firstarg->source)) goto cannot_decode; - - a = (PyObject*) CompileTime_Get(firstarg->source)->value; - if (!PyString_Check(a) || PyString_GET_SIZE(a) != 1) - goto cannot_decode; - - code = *PyString_AS_STRING(a); - for (descr=metadescriptors; descr->typecode!=0; descr++) { - if (descr->typecode == code) { - if (descr->base != NULL) { - psyco_assert_field(po, result, - ARRAY_ob_descr, - (long) descr->base); - } - break; - } - } - - cannot_decode: - Psyco_AssertType(po, result, type); - } - return result; -} - -/***************************************************************/ - - -INITIALIZATIONFN -void psyco_initarray(void) -{ - PyObject* md = Psyco_DefineMetaModule("array"); - PyObject* arrayobj; - struct metadescr_s* descr; - PySequenceMethods* m; - PyMappingMethods *mm; - - if (md == NULL) - return; - - /* get array.array and array.ArrayType */ - arrayobj = Psyco_GetModuleObject(md, "array", NULL); - arraytype = (PyTypeObject*) - Psyco_GetModuleObject(md, "ArrayType", &PyType_Type); - - /* bail out if not found */ - if (arrayobj == NULL || arraytype == NULL) { - Py_DECREF(md); - return; - } - - m = arraytype->tp_as_sequence; - Psyco_DefineMeta(m->sq_length, psyco_generic_mut_ob_size); - Psyco_DefineMeta(m->sq_item, parray_item); - Psyco_DefineMeta(m->sq_ass_item, parray_ass_item); - - mm = arraytype->tp_as_mapping; - if (mm) { /* Python >= 2.3 */ - Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); - Psyco_DefineMeta(mm->mp_ass_subscript, - psyco_generic_ass_subscript); - } - - /* map array.array() to its meta-implementation pa_array() */ - cimpl_array = Psyco_DefineModuleC(md, "array", METH_VARARGS, - &pa_array, &parray_new); - - for (descr=metadescriptors; descr->typecode!=0; descr++) { - /* There seem to be no better way to get Python's - original array descriptors than to create dummy - arrays */ - PyObject* array = PyObject_CallFunction(arrayobj, "c", - (char) descr->typecode); - if (!array) { - PyErr_Clear(); - debug_printf(1, ("init: cannot create an array of " - "typecode '%c'\n", - (char)descr->typecode)); - } - else { - struct arraydescr* d = ((arrayobject*) array)->ob_descr; - if (descr->meta_getitem) - Psyco_DefineMeta(d->getitem,descr->meta_getitem); - if (descr->meta_setitem) - Psyco_DefineMeta(d->setitem,descr->meta_setitem); - descr->base = d; - Py_DECREF(array); - } - } - Py_DECREF(md); -} diff --git a/nodebox/ext/psyco/src/c/Modules/pmath.c b/nodebox/ext/psyco/src/c/Modules/pmath.c deleted file mode 100644 index 64fe503..0000000 --- a/nodebox/ext/psyco/src/c/Modules/pmath.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Psyco version of python math module, mathmodule.c - * - * TODO: - * - raise python exceptions on math errors (domain error etc) - * - implement: - * - frexp() - * - ldexp() - * - log() - * - log10() - * - modf() - */ - -#include "../initialize.h" -#if HAVE_FP_FN_CALLS /* disable float optimizations if functions with - float/double arguments are not implemented - in the back-end */ - -#ifndef _MSC_VER -#ifndef __STDC__ -extern double fmod (double, double); -extern double frexp (double, int *); -extern double ldexp (double, int); -extern double modf (double, double *); -#endif /* __STDC__ */ -#endif /* _MSC_VER */ - - -#include - -#define CIMPL_MATH_FUNC1(funcname, func, libfunc) \ - static int cimpl_math_##func(double a, double* result) { \ - errno = 0; \ - PyFPE_START_PROTECT(funcname, return -1) \ - *result = libfunc(a); \ - PyFPE_END_PROTECT(*result); \ - return 0; \ - } - -#define CIMPL_MATH_FUNC2(funcname, func, libfunc) \ - static int cimpl_math_##func(double a, double b, double* result) { \ - errno = 0; \ - PyFPE_START_PROTECT(funcname, return -1) \ - *result = libfunc(a,b); \ - PyFPE_END_PROTECT(*result); \ - return 0; \ - } - -/* - * This is almost but not quite the same as the - * version in pfloatobject.c. The error handling - * on invalid args is different - */ -#define PMATH_CONVERT_TO_DOUBLE(vobj, v1, v2, ERRORACTION) \ - switch (psyco_convert_to_double(po, vobj, &v1, &v2)) { \ - case true: \ - break; /* fine */ \ - case false: \ - ERRORACTION; /* error or promotion */ \ - default: \ - PycException_SetString(po, PyExc_TypeError, \ - "bad argument type for built-in operation"); \ - ERRORACTION; \ - } - -#define PMATH_RELEASE_DOUBLE(v1, v2) \ - vinfo_decref(v2, po); \ - vinfo_decref(v1, po); - -#define PMATH_FUNC1(funcname, func ) \ - static PyCFunction fallback_##func; \ - static vinfo_t* pmath_##func(PsycoObject* po, vinfo_t* vself, vinfo_t* varg) { \ - vinfo_t *a1, *a2, *x; \ - vinfo_array_t* result; \ - vinfo_t *v; \ - int tuplesize = PsycoTuple_Load(varg); \ - if (tuplesize != 1){ /* wrong or unknown number of arguments */ \ - return psyco_generic_call(po, fallback_##func, \ - CfReturnRef|CfPyErrIfNull, \ - "lv", NULL, varg); \ - } \ - v = PsycoTuple_GET_ITEM(varg, 0); \ - PMATH_CONVERT_TO_DOUBLE(v,a1,a2,return NULL); \ - result = array_new(2); \ - x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ - "vva",a1,a2,result); \ - PMATH_RELEASE_DOUBLE(a1,a2); \ - if (x != NULL) \ - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); \ - array_release(result); \ - return x; \ - } - - -#define PMATH_FUNC2(funcname, func ) \ - static PyCFunction fallback_##func; \ - static vinfo_t* pmath_##func(PsycoObject* po, vinfo_t* vself, vinfo_t* varg) { \ - vinfo_t *a1, *a2, *b1, *b2, *x; \ - vinfo_array_t* result; \ - vinfo_t *v1, *v2; \ - int tuplesize = PsycoTuple_Load(varg); \ - if (tuplesize != 2){ /* wrong or unknown number of arguments */ \ - return psyco_generic_call(po, fallback_##func, \ - CfReturnRef|CfPyErrIfNull, \ - "lv", NULL, varg); \ - } \ - v1 = PsycoTuple_GET_ITEM(varg, 0); \ - v2 = PsycoTuple_GET_ITEM(varg, 1); \ - PMATH_CONVERT_TO_DOUBLE(v1,a1,a2,return NULL); \ - PMATH_CONVERT_TO_DOUBLE(v2,b1,b2,goto cleanup); \ - result = array_new(2); \ - x = psyco_generic_call(po, cimpl_math_##func, CfPure|CfNoReturnValue|CfPyErrIfNonNull, \ - "vvvva",a1,a2,b1,b2,result); \ - PMATH_RELEASE_DOUBLE(a1,a2); \ - PMATH_RELEASE_DOUBLE(b1,b2); \ - if (x != NULL) \ - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); \ - array_release(result); \ - return x; \ - cleanup:\ - PMATH_RELEASE_DOUBLE(a1,a2); \ - return NULL; \ - } - -/* the functions cimpl_math_sin() etc */ -CIMPL_MATH_FUNC1("acos", acos, acos) -CIMPL_MATH_FUNC1("asin", asin, asin) -CIMPL_MATH_FUNC1("atan", atan, atan) -CIMPL_MATH_FUNC2("atan2", atan2, atan2) -CIMPL_MATH_FUNC1("ceil", ceil, ceil) -CIMPL_MATH_FUNC1("cos", cos, cos) -CIMPL_MATH_FUNC1("cosh", cosh, cosh) -CIMPL_MATH_FUNC1("exp", exp, exp) -CIMPL_MATH_FUNC1("fabs", fabs, fabs) -CIMPL_MATH_FUNC1("floor", floor, floor) -CIMPL_MATH_FUNC2("fmod", fmod, fmod) -CIMPL_MATH_FUNC2("hypot", hypot, hypot) -/*CIMPL_MATH_FUNC2("power", power, pow)*/ -CIMPL_MATH_FUNC2("pow", pow, pow) -CIMPL_MATH_FUNC1("sin", sin, sin) -CIMPL_MATH_FUNC1("sinh", sinh, sinh) -CIMPL_MATH_FUNC1("sqrt", sqrt, sqrt) -CIMPL_MATH_FUNC1("tan", tan, tan) -CIMPL_MATH_FUNC1("tanh", tanh, tanh) - -/* the functions pmath_sin() etc */ -PMATH_FUNC1("acos", acos) -PMATH_FUNC1("asin", asin) -PMATH_FUNC1("atan", atan) -PMATH_FUNC2("atan2", atan2) -PMATH_FUNC1("ceil", ceil) -PMATH_FUNC1("cos", cos) -PMATH_FUNC1("cosh", cosh) -PMATH_FUNC1("exp", exp) -PMATH_FUNC1("fabs", fabs) -PMATH_FUNC1("floor", floor) -PMATH_FUNC2("fmod", fmod) -PMATH_FUNC2("hypot", hypot) -/*PMATH_FUNC2("power", power)*/ -PMATH_FUNC2("pow", pow) -PMATH_FUNC1("sin", sin) -PMATH_FUNC1("sinh", sinh) -PMATH_FUNC1("sqrt", sqrt) -PMATH_FUNC1("tan", tan) -PMATH_FUNC1("tanh", tanh) - -INITIALIZATIONFN -void psyco_initmath(void) -{ - PyObject* md = Psyco_DefineMetaModule("math"); - - fallback_acos = Psyco_DefineModuleFn(md, "acos", METH_VARARGS, pmath_acos); - fallback_asin = Psyco_DefineModuleFn(md, "asin", METH_VARARGS, pmath_asin); - fallback_atan = Psyco_DefineModuleFn(md, "atan", METH_VARARGS, pmath_atan); - fallback_atan2= Psyco_DefineModuleFn(md, "atan2",METH_VARARGS, pmath_atan2); - fallback_ceil = Psyco_DefineModuleFn(md, "ceil", METH_VARARGS, pmath_ceil); - fallback_cos = Psyco_DefineModuleFn(md, "cos", METH_VARARGS, pmath_cos); - fallback_cosh = Psyco_DefineModuleFn(md, "cosh", METH_VARARGS, pmath_cosh); - fallback_exp = Psyco_DefineModuleFn(md, "exp", METH_VARARGS, pmath_exp); - fallback_fabs = Psyco_DefineModuleFn(md, "fabs", METH_VARARGS, pmath_fabs); - fallback_floor= Psyco_DefineModuleFn(md, "floor",METH_VARARGS, pmath_floor); - fallback_fmod = Psyco_DefineModuleFn(md, "fmod", METH_VARARGS, pmath_fmod); - fallback_hypot= Psyco_DefineModuleFn(md, "hypot",METH_VARARGS, pmath_hypot); - /*Psyco_DefineModuleFn(md, "power", METH_VARARGS, pmath_power);*/ - fallback_pow = Psyco_DefineModuleFn(md, "pow", METH_VARARGS, pmath_pow); - fallback_sin = Psyco_DefineModuleFn(md, "sin", METH_VARARGS, pmath_sin); - fallback_sinh = Psyco_DefineModuleFn(md, "sinh", METH_VARARGS, pmath_sinh); - fallback_sqrt = Psyco_DefineModuleFn(md, "sqrt", METH_VARARGS, pmath_sqrt); - fallback_tan = Psyco_DefineModuleFn(md, "tan", METH_VARARGS, pmath_tan); - fallback_tanh = Psyco_DefineModuleFn(md, "tanh", METH_VARARGS, pmath_tanh); - - Py_XDECREF(md); -} - -#else /* !HAVE_FP_FN_CALLS */ -INITIALIZATIONFN -void psyco_initmath(void) -{ -} -#endif /* !HAVE_FP_FN_CALLS */ diff --git a/nodebox/ext/psyco/src/c/Modules/ppsyco.c b/nodebox/ext/psyco/src/c/Modules/ppsyco.c deleted file mode 100644 index 55d3a8d..0000000 --- a/nodebox/ext/psyco/src/c/Modules/ppsyco.c +++ /dev/null @@ -1,247 +0,0 @@ -#include "../psyco.h" -#include "../mergepoints.h" -#include "../Objects/ptupleobject.h" -#include "../Objects/pdictobject.h" - - -static PyCFunction cimpl_globals; -static PyCFunction cimpl_eval; -static PyCFunction cimpl_execfile; -static PyCFunction cimpl_locals; -static PyCFunction cimpl_vars; -static PyCFunction cimpl_dir; -static PyCFunction cimpl_input; - -/***************************************************************/ - /*** Psyco meta-version of functions accessing the locals ***/ - -PSY_INLINE bool psyco_fast_locals_ok(PsycoObject* po) -{ - return !(psyco_mp_flags(po->pr.merge_points) & MP_FLAGS_CONTROLFLOW); -} - -static vinfo_t* psyco_fast_to_locals(PsycoObject* po) -{ - int j; - PyObject* map; - PyCodeObject* co = po->pr.co; - vinfo_t* vlocals = PsycoDict_New(po); - if (vlocals == NULL) - return NULL; - - map = co->co_varnames; - if (!PyTuple_Check(map)) - return vlocals; - j = PyTuple_GET_SIZE(map); - if (j > co->co_nlocals) - j = co->co_nlocals; - - while (--j >= 0) { - PyObject *key = PyTuple_GET_ITEM(map, j); - vinfo_t* vvalue = LOC_LOCALS_PLUS[j]; - /* a local variable can only be unbound if its - value is known to be (PyObject*)NULL. A run-time - or virtual value is always non-NULL. */ - if (!psyco_knowntobe(vvalue, 0)) { - if (!PsycoDict_SetItem(po, vlocals, key, vvalue)) { - vinfo_decref(vlocals, po); - return NULL; - } - } - } - return vlocals; -} - -static PyObject* fast_to_locals_keys(PsycoObject* po) -{ - int j; - PyObject* map; - PyCodeObject* co = po->pr.co; - PyObject* keys = PyList_New(0); - if (keys == NULL) - return NULL; - - map = co->co_varnames; - if (!PyTuple_Check(map)) - return keys; - j = PyTuple_GET_SIZE(map); - if (j > co->co_nlocals) - j = co->co_nlocals; - - while (--j >= 0) { - PyObject *key = PyTuple_GET_ITEM(map, j); - vinfo_t* vvalue = LOC_LOCALS_PLUS[j]; - /* a local variable can only be unbound if its - value is known to be (PyObject*)NULL. A run-time - or virtual value is always non-NULL. */ - if (!psyco_knowntobe(vvalue, 0)) { - if (PyList_Append(keys, key) < 0) { - Py_DECREF(keys); - return NULL; - } - } - } - if (PyList_Sort(keys) < 0) { - Py_DECREF(keys); - return NULL; - } - return keys; -} - -static vinfo_t* pget_cpsyco_obj(char* name) -{ - PyObject* d = PyModule_GetDict(CPsycoModule); - PyObject* result = PyDict_GetItemString(d, name); - if (result == NULL) - return NULL; - else - return vinfo_new(CompileTime_New((long) result)); -} - -static vinfo_t* ppsyco_globals(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - if (PsycoTuple_Load(vargs) == 0) { - vinfo_t* vglobals = LOC_GLOBALS; - vinfo_incref(vglobals); - return vglobals; - } - return psyco_generic_call(po, cimpl_globals, - CfReturnRef|CfPyErrIfNull, - "vv", vself, vargs); -} - -static vinfo_t* pbuiltinevaluator(PsycoObject* po, vinfo_t* vargs, - char* original_name, PyCFunction cimpl) -{ - vinfo_t* vfn; - vinfo_t* var; - vinfo_t* vkw; - vinfo_t* vresult = NULL; - vinfo_t* args[3]; - - if (!psyco_fast_locals_ok(po) || PsycoTuple_Load(vargs) != 1) - goto fallback; - - vfn = pget_cpsyco_obj(original_name); - if (vfn == NULL) - goto fallback; - - args[0] = PsycoTuple_GET_ITEM(vargs, 0); - args[1] = LOC_GLOBALS; - args[2] = psyco_fast_to_locals(po); - if (args[2] == NULL) - goto error; - - var = PsycoTuple_New(3, args); - vkw = psyco_vi_Zero(); - vresult = PsycoObject_Call(po, vfn, var, vkw); - vinfo_decref(vkw, po); - vinfo_decref(var, po); - vinfo_decref(args[2], po); - error: - vinfo_decref(vfn, po); - return vresult; - - fallback: - return psyco_generic_call(po, cimpl, CfReturnRef|CfPyErrIfNull, - "lv", (long) NULL, vargs); -} - -static vinfo_t* ppsyco_eval(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - return pbuiltinevaluator(po, vargs, "original_eval", cimpl_eval); -} - -static vinfo_t* ppsyco_execfile(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - return pbuiltinevaluator(po, vargs, "original_execfile", cimpl_execfile); -} - -static vinfo_t* ppsyco_locals(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - if (psyco_fast_locals_ok(po) && PsycoTuple_Load(vargs) == 0) { - return psyco_fast_to_locals(po); - } - return psyco_generic_call(po, cimpl_locals, - CfReturnRef|CfPyErrIfNull, - "vv", vself, vargs); -} - -static vinfo_t* ppsyco_vars(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - if (psyco_fast_locals_ok(po) && PsycoTuple_Load(vargs) == 0) { - return psyco_fast_to_locals(po); - } - return psyco_generic_call(po, cimpl_vars, - CfReturnRef|CfPyErrIfNull, - "vv", vself, vargs); -} - -static vinfo_t* ppsyco_dir(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - if (psyco_fast_locals_ok(po) && PsycoTuple_Load(vargs) == 0) { - PyObject* keys = fast_to_locals_keys(po); - if (keys == NULL) { - psyco_virtualize_exception(po); - return NULL; - } - return vinfo_new(CompileTime_NewSk(sk_new((long) keys, - SkFlagPyObj))); - } - return psyco_generic_call(po, cimpl_dir, - CfReturnRef|CfPyErrIfNull, - "vv", vself, vargs); -} - -static vinfo_t* ppsyco_input(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - vinfo_t* vfn; - vinfo_t* vkw; - vinfo_t* vcmd; - vinfo_t* vresult; - - vfn = pget_cpsyco_obj("original_raw_input"); - if (vfn == NULL) - goto fallback; - - vkw = psyco_vi_Zero(); - vcmd = PsycoObject_Call(po, vfn, vargs, vkw); - vinfo_decref(vkw, po); - vinfo_decref(vfn, po); - if (vcmd == NULL) - return NULL; - - vargs = PsycoTuple_New(1, &vcmd); - vresult = ppsyco_eval(po, NULL, vargs); - vinfo_decref(vargs, po); - vinfo_decref(vcmd, po); - return vresult; - - fallback: - return psyco_generic_call(po, cimpl_input, - CfReturnRef|CfPyErrIfNull, - "vv", vself, vargs); -} - -/***************************************************************/ - - -INITIALIZATIONFN -void psyco_initpsyco(void) -{ - PyObject* md = CPsycoModule; - -#define DEFMETA(name) \ - cimpl_ ## name = Psyco_DefineModuleFn(md, #name, METH_VARARGS, \ - &ppsyco_ ## name) - - DEFMETA( globals ); - DEFMETA( eval ); - DEFMETA( execfile ); - DEFMETA( locals ); - DEFMETA( vars ); - DEFMETA( dir ); - DEFMETA( input ); - -#undef DEFMETA -} diff --git a/nodebox/ext/psyco/src/c/Objects/compactobject.c b/nodebox/ext/psyco/src/c/Objects/compactobject.c deleted file mode 100644 index f2c5d42..0000000 --- a/nodebox/ext/psyco/src/c/Objects/compactobject.c +++ /dev/null @@ -1,1033 +0,0 @@ -#include "compactobject.h" -#include "../blockalloc.h" -#include "../dispatcher.h" -#include "../Python/pycompiler.h" -#include "pintobject.h" - - -#define DEBUG_K_IMPL 0 - - -BLOCKALLOC_STATIC(kimpl, compact_impl_t, 4096) - - -static compact_impl_t k_empty_impl = { - NULL, /* attrname */ - NULL, /* vattr */ - 0, /* datasize */ - NULL, /* extensions */ - NULL, /* next */ - NULL, /* parent */ -}; - -/*****************************************************************/ - -#if DEBUG_K_IMPL - -static void debug_k_impl(compact_impl_t* p) -{ - int smin, smax; - compact_impl_t *q, *lim; - fprintf(stderr, "\t$ "); - lim = &k_empty_impl; - while (p != lim) { - for (q=p; q->parent != lim; q = q->parent) - ; - fprintf(stderr, " %s", PyString_AsString(q->attrname)); - smin = p->datasize; - smax = 0; - k_attribute_range(q->vattr, &smin, &smax); - if (smin < smax) - fprintf(stderr, "(%d-%d)", smin, smax); - else - fprintf(stderr, "(void)"); - lim = q; - } - fprintf(stderr, ".\n"); -} - -#else /* !DEBUG_K_IMPL */ -# define debug_k_impl(p) /* nothing */ -#endif - -/*****************************************************************/ - -/* static int */ -/* compact_init(PyObject *self, PyObject *args, PyObject *kwds) */ -/* { */ -/* return 0; */ -/* } */ - -static newfunc object_new; - -static PyObject * -compact_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject* ko = object_new(type, args, kwds); - if (ko != NULL) { - ((PyCompactObject*) ko)->k_impl = &k_empty_impl; - } - return ko; -} - -#if 0 -DEFINEFN -PyObject* PyCompact_New(void) -{ - PyCompactObject* o = PyObject_GC_New(PyCompactObject, &PyCompact_Type); - if (o != NULL) { - o->k_impl = &k_empty_impl; - o->k_data = NULL; - PyObject_GC_Track(o); - } - return (PyObject*) o; -} -#endif - -static bool k_same_vinfo(vinfo_t* a, vinfo_t* b) -{ - if (a->source != b->source) { - if (is_compiletime(a->source) && is_compiletime(b->source)) - return (CompileTime_Get(a->source)->value == - CompileTime_Get(b->source)->value); - else - return false; - } - if (a->array != b->array) { - int i = a->array->count; - if (i != b->array->count) - return false; - while (--i >= 0) { - if (a->array->items[i] == b->array->items[i]) - continue; - if (a->array->items[i] == NULL || - b->array->items[i] == NULL) - return false; - if (!k_same_vinfo(a->array->items[i], - b->array->items[i])) - return false; - } - } - return true; -} - -static int k_fix_run_time_vars(vinfo_t* a, int datasize) -{ - if (is_runtime(a->source)) { - bool ref = has_rtref(a->source); - int sindex = datasize; - datasize += sizeof(long); - extra_assert(sizeof(long) == sizeof(PyObject*)); - a->source = RunTime_NewStack(sindex, ref, false); - } - if (a->array != NullArray) { - int i, n = a->array->count; - for (i=0; iarray->items[i] != NULL) - datasize = k_fix_run_time_vars( - a->array->items[i], datasize); - } - } - return datasize; -} - -DEFINEFN -compact_impl_t* k_extend_impl(compact_impl_t* oldimpl, PyObject* attr, - vinfo_t* v) -{ - int datasize; - compact_impl_t* p; - extra_assert(PyString_CheckExact(attr) && PyString_CHECK_INTERNED(attr)); - - /* enumerate the run-time entries */ - datasize = k_fix_run_time_vars(v, oldimpl->datasize); - - /* look for a matching existing extension of oldimpl */ - for (p = oldimpl->extensions; p != NULL; p = p->next) { - if (p->attrname == attr && p->datasize == datasize && - k_same_vinfo(v, p->vattr)) - return p; - } - - /* build a new impl */ - p = psyco_llalloc_kimpl(); - p->attrname = attr; - Py_INCREF(attr); - p->vattr = v; - vinfo_incref(v); - p->datasize = datasize; - p->extensions = NULL; - p->next = oldimpl->extensions; - oldimpl->extensions = p; - p->parent = oldimpl; - debug_k_impl(p); - return p; -} - -#if PSYCO_DEBUG -static int k_check_extension(compact_impl_t* impl1, compact_impl_t* impl2) -{ - while (impl1 != impl2) { - impl1 = impl1->parent; - if (impl1 == NULL) - return false; - } - return true; -} -#endif - -static int k_extend(PyCompactObject* ko, compact_impl_t* nimpl) -{ - char* ndata; - extra_assert(k_check_extension(nimpl, ko->k_impl)); - if (nimpl->datasize > K_ROUNDUP(ko->k_impl->datasize)) { - ndata = ko->k_data; - ndata = (char*) PyMem_Realloc(ndata, - K_ROUNDUP(nimpl->datasize)); - if (ndata == NULL) { - PyErr_NoMemory(); - return -1; - } - ko->k_data = ndata; - } - ko->k_impl = nimpl; - return 0; -} - -DEFINEFN -vinfo_t* vinfo_copy_no_share(vinfo_t* vi) -{ - vinfo_t* result = vinfo_new_skref(vi->source); - if (vi->array != NullArray) { - int i = vi->array->count; - vinfo_array_grow(result, i); - while (--i >= 0) { - if (vi->array->items[i] != NULL) - result->array->items[i] = - vinfo_copy_no_share(vi->array->items[i]); - } - } - return result; -} - - -/*****************************************************************/ - -/* decref all PyObjects found in the CompactObject */ -static void k_decref_objects(vinfo_t* a, char* data) -{ - if (has_rtref(a->source)) { - int sindex = getstack(a->source); - PyObject* o = *(PyObject**)(data+sindex); - Py_DECREF(o); - } - if (a->array != NullArray) { - int i = a->array->count; - while (--i >= 0) { - if (a->array->items[i] != NULL) - k_decref_objects(a->array->items[i], data); - } - } -} - -static void compact_dealloc(PyCompactObject* ko) -{ - compact_impl_t* impl = ko->k_impl; - while (impl->vattr != NULL) { - k_decref_objects(impl->vattr, ko->k_data); - impl = impl->parent; - } - PyMem_Free(ko->k_data); - ko->ob_type->tp_free((PyObject*) ko); -} - -static int k_traverse_objects(vinfo_t* a, char* data, - visitproc visit, void* arg) -{ - int err; - if (has_rtref(a->source)) { /* run-time && with reference */ - int sindex = getstack(a->source); - PyObject* o = *(PyObject**)(data+sindex); - err = visit(o, arg); - if (err) - return err; - } - if (a->array != NullArray) { - int i = a->array->count; - while (--i >= 0) { - if (a->array->items[i] != NULL) { - err = k_traverse_objects(a->array->items[i], - data, visit, arg); - if (err) - return err; - } - } - } - return 0; -} - -static int compact_traverse(PyCompactObject* ko, visitproc visit, void* arg) -{ - int err; - compact_impl_t* impl = ko->k_impl; - while (impl->vattr != NULL) { - err = k_traverse_objects(impl->vattr, ko->k_data, visit, arg); - if (err) - return err; - impl = impl->parent; - } - return 0; -} - -static int compact_clear(PyCompactObject* ko) -{ - compact_impl_t* impl = ko->k_impl; - char* data = ko->k_data; - ko->k_impl = &k_empty_impl; - ko->k_data = NULL; - while (impl->vattr != NULL) { - k_decref_objects(impl->vattr, data); - impl = impl->parent; - } - PyMem_Free(data); - return 0; -} - - -/*****************************************************************/ - -static PyObject* compact_getattro(PyCompactObject* ko, PyObject* attr) -{ - PyTypeObject* tp = ko->ob_type; - PyObject* descr; - descrgetfunc f = NULL; - compact_impl_t* impl = ko->k_impl; - PyObject* o; - - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) - return NULL; - } - - Py_INCREF(attr); - K_INTERN(attr); - - /* Special code for data descriptors first, as in - PyObject_GenericGetAttr() */ - descr = _PyType_Lookup(tp, attr); - if (descr != NULL) { - Py_INCREF(descr); - if (PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { - f = descr->ob_type->tp_descr_get; - if (f != NULL && PyDescr_IsData(descr)) { - o = f(descr, (PyObject*) ko, (PyObject*) tp); - Py_DECREF(descr); - goto done; - } - } - } - - /* Read data out of the compact memory buffer */ - while (impl->attrname != NULL) { - if (impl->attrname == attr) { - o = direct_xobj_vinfo(impl->vattr, ko->k_data); - if (o != NULL || PyErr_Occurred()) { - Py_XDECREF(descr); - goto done; - } - } - impl = impl->parent; - } - - /* The end of PyObject_GenericGetAttr() */ - if (f != NULL) { - o = f(descr, (PyObject*) ko, (PyObject*) tp); - Py_DECREF(descr); - goto done; - } - - if (descr != NULL) { - o = descr; - /* descr was already increfed above */ - goto done; - } - - o = NULL; - PyErr_Format(PyExc_AttributeError, - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(attr)); - done: - Py_DECREF(attr); - return o; -} - -DEFINEFN -bool k_match_vinfo(vinfo_t* vnew, vinfo_t* vexisting) -{ - if (vnew == NULL) - return vexisting == NULL; - if (vexisting == NULL) - return false; - switch (gettime(vnew->source)) { - - case RunTime: - if (!is_runtime(vexisting->source)) - return false; - break; - - case CompileTime: - if (!is_compiletime(vexisting->source)) - return false; - return CompileTime_Get(vnew->source)->value == - CompileTime_Get(vexisting->source)->value; - - case VirtualTime: - if (vexisting->source != vnew->source) - return false; - break; - } - if (vnew->array != vexisting->array) { - int i, n = vexisting->array->count; - if (n != vnew->array->count) - return false; - for (i=0; iarray->items[i], - vexisting->array->items[i])) - return false; - } - } - return true; -} - -static char* k_store_vinfo(vinfo_t* v, char* target, char* source) -{ - if (is_runtime(v->source)) { - int sindex = getstack(v->source); - if (has_rtref(v->source)) { - PyObject* o = *(PyObject**) source; - source += sizeof(PyObject*); - *(PyObject**)(target+sindex) = o; - Py_INCREF(o); - } - else { - long l = *(long*) source; - source += sizeof(long); - *(long*)(target+sindex) = l; - } - } - if (v->array != NullArray) { - int i, n = v->array->count; - for (i=0; iarray->items[i] != NULL) - source = k_store_vinfo(v->array->items[i], - target, source); - } - } - return source; -} - -DEFINEFN -void k_attribute_range(vinfo_t* v, int* smin, int* smax) -{ - /* XXX Assumes that the data for an attr is stored consecutively */ - if (is_runtime(v->source)) { - int sindex = getstack(v->source); - if (*smin > sindex) - *smin = sindex; - sindex += sizeof(PyObject*); - extra_assert(sizeof(PyObject*) == sizeof(long)); - if (*smax < sindex) - *smax = sindex; - } - if (v->array != NullArray) { - int i = v->array->count; - while (--i >= 0) { - if (v->array->items[i] != NULL) - k_attribute_range(v->array->items[i], - smin, smax); - } - } -} - -static void k_shift_rt_pos(vinfo_t* v, int delta) -{ - if (is_runtime(v->source)) { - v->source += delta; - } - if (v->array != NullArray) { - int i = v->array->count; - while (--i >= 0) { - if (v->array->items[i] != NULL) - k_shift_rt_pos(v->array->items[i], delta); - } - } -} - -DEFINEFN -compact_impl_t* k_duplicate_impl(compact_impl_t* base, - compact_impl_t* first_excluded, - compact_impl_t* last, - int shift_delta) -{ - vinfo_t* v; - if (first_excluded == last) - return base; - base = k_duplicate_impl(base, first_excluded, last->parent, - shift_delta); - v = vinfo_copy_no_share(last->vattr); - k_shift_rt_pos(v, shift_delta); - return k_extend_impl(base, last->attrname, v); -} - -static -int compact_set(PyCompactObject* ko, PyObject* attr, PyObject* value, - PyObject* pyerr_notfound) -{ - int err, smin, smax; - long immed_value; - vinfo_t* source_vi; - char* source_data; - compact_impl_t* impl; - compact_impl_t* p; - - /* recognize a few obvious object types and optimize accordingly - Note that this is not related to Psyco's ability to store - attributes with arbitrary flexibility, which is implemented in - pcompactobject.c. */ - if (value == NULL) { - source_vi = NULL; - source_data = NULL; - } - else if (PyInt_CheckExact(value)) { - immed_value = PyInt_AS_LONG(value); - source_vi = PsycoInt_FROM_LONG(vinfo_new(SOURCE_DUMMY)); - source_data = (char*) &immed_value; - } - else if (value == Py_None) { - source_vi = psyco_vi_None(); - source_data = NULL; - } - else { - source_vi = vinfo_new(SOURCE_DUMMY_WITH_REF); - source_data = (char*) &value; - } - impl = ko->k_impl; - while (impl->attrname != NULL) { - if (impl->attrname == attr) { - k_decref_objects(impl->vattr, ko->k_data); - - if (k_match_vinfo(source_vi, impl->vattr)) { - /* the attr already has the correct format */ - k_store_vinfo(impl->vattr, ko->k_data, - source_data); - err = 0; - goto finally; - } - - /* a format change is needed: first delete the - * existing attribute. - * XXX Not too efficient right now. - * XXX Also assumes that attribute order matches - * XXX data storage order. - */ - smin = ko->k_impl->datasize; - smax = 0; - k_attribute_range(impl->vattr, &smin, &smax); - if (smax < smin) - smax = smin; - - /* data between smin and smax is removed */ - memmove(ko->k_data + smin, - ko->k_data + smax, - ko->k_impl->datasize - smax); - - /* make the new 'impl' by starting from impl->parent - and accounting for all following attrs excluding - 'impl', shifted as per memmove() */ - ko->k_impl = k_duplicate_impl(impl->parent, impl, - ko->k_impl, smin - smax); - - if (source_vi != NULL) - goto store_data; /* now, re-create the attr - under its new format */ - err = 0; - goto finally; /* if attribute deletion: done */ - } - impl = impl->parent; - } - - if (source_vi == NULL) { - /* deleting a non-existing attribute */ - PyErr_SetObject(pyerr_notfound, attr); - return -1; - } - - /* setting a new attribute */ - store_data: - p = k_extend_impl(ko->k_impl, attr, source_vi); - err = k_extend(ko, p); - if (err == 0) { - k_store_vinfo(p->vattr, ko->k_data, source_data); - } - - finally: - vinfo_xdecref(source_vi, NULL); - return err; -} - -static -int compact_setattro(PyCompactObject* ko, PyObject* attr, PyObject* value) -{ - PyTypeObject* tp = ko->ob_type; - PyObject* descr; - descrsetfunc f; - - /* NB. this assumes that 'attr' is an already-interned string. - PyObject_SetAttr() should have interned it. */ - - /* Special code for data descriptors first, as in - PyObject_GenericSetAttr() */ - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) - return -1; - } - descr = _PyType_Lookup(tp, attr); - if (descr != NULL && - PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { - f = descr->ob_type->tp_descr_set; - if (f != NULL && PyDescr_IsData(descr)) - return f(descr, (PyObject*) ko, value); - } - - return compact_set(ko, attr, value, PyExc_AttributeError); -} - -static PyObject* k_interned_key(PyObject* key) -{ - if (key->ob_type != &PyString_Type) { - if (!PyString_Check(key)) { - PyErr_SetString(PyExc_TypeError, - "keys in compact objects " - "must be strings"); - return NULL; - } - key = PyString_FromStringAndSize(PyString_AS_STRING(key), - PyString_GET_SIZE(key)); - if (key == NULL) - return NULL; - } - else { - Py_INCREF(key); - } - K_INTERN(key); - return key; -} - -#if 0 -DEFINEFN -PyObject* PyCompact_GetSlot(PyObject* ko, PyObject* key) -{ - compact_impl_t* impl; - PyObject* o; - - if (!PyCompact_Check(ko)) { - PyErr_BadInternalCall(); - return NULL; - } - - key = k_interned_key(key); - if (key == NULL) - return NULL; - - impl = ((PyCompactObject*) ko)->k_impl; - while (impl->attrname != NULL) { - if (impl->attrname == key) { - o = direct_xobj_vinfo(impl->vattr, - ((PyCompactObject*) ko)->k_data); - if (o != NULL || PyErr_Occurred()) - goto finally; - } - impl = impl->parent; - } - PyErr_SetObject(PyExc_KeyError, key); - o = NULL; - finally: - Py_DECREF(key); - return o; -} - -DEFINEFN -PyObject* PyCompact_SetSlot(PyObject* ko, PyObject* key, PyObject* value) -{ - int err; - - if (!PyCompact_Check(ko)) { - PyErr_BadInternalCall(); - return NULL; - } - - key = k_interned_key(key); - if (key == NULL) - return NULL; - - err = compact_set((PyCompactObject*) ko, key, value, - PyExc_KeyError); - Py_DECREF(key); - return err; -} -#endif - -static PyObject* compact_getslot(PyCompactObject* ko, PyObject* key) -{ - compact_impl_t* impl = ko->k_impl; - PyObject* o; - - key = k_interned_key(key); - if (key == NULL) - return NULL; - - while (impl->attrname != NULL) { - if (impl->attrname == key) { - o = direct_xobj_vinfo(impl->vattr, ko->k_data); - if (o != NULL || PyErr_Occurred()) - goto finally; - } - impl = impl->parent; - } - PyErr_SetObject(PyExc_KeyError, key); - o = NULL; - finally: - Py_DECREF(key); - return o; -} - -static PyObject* compact_setslot(PyCompactObject* ko, PyObject* args) -{ - PyObject* key; - PyObject* value; - int err; - - if (!PyArg_ParseTuple(args, "OO", &key, &value)) - return NULL; - - key = k_interned_key(key); - if (key == NULL) - return NULL; - - err = compact_set(ko, key, value, PyExc_KeyError); - Py_DECREF(key); - if (err < 0) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* compact_delslot(PyCompactObject* ko, PyObject* key) -{ - int err; - - key = k_interned_key(key); - if (key == NULL) - return NULL; - - err = compact_set(ko, key, NULL, PyExc_KeyError); - Py_DECREF(key); - if (err < 0) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* compact_getmembers(PyCompactObject* ko, void* context) -{ - compact_impl_t* impl = ko->k_impl; - PyObject* result = PyList_New(0); - if (result == NULL) - return NULL; - while (impl->attrname != NULL) { - if (PyList_Append(result, impl->attrname) < 0) { - Py_DECREF(result); - return NULL; - } - impl = impl->parent; - } - if (PyList_Reverse(result) < 0) { - Py_DECREF(result); - return NULL; - } - return result; -} - -static PyObject* compact_getdict(PyObject* ko, void* context) -{ - PyObject* t = need_cpsyco_obj("compactdictproxy"); - if (t == NULL) - return NULL; - return PyObject_CallFunction(t, "O", ko); -} - -static int compact_setdict(PyObject* ko, PyObject* value, void* context) -{ - PyObject* nval; - PyObject* d; - PyObject* tmp; - - if (value == NULL) { - PyErr_SetString(PyExc_AttributeError, - "__dict__ attribute cannot be deleted"); - return -1; - } - if (PyDict_Check(value)) { - nval = value; - Py_INCREF(nval); - } - else { - /* Force a complete copy of 'value' for the assignment - x.__dict__ = x.__dict__. Note that we could do better - and just copy the memory buffer if we detect that - 'value' is the dict proxy of another compact object. */ - if (!PyMapping_Check(value)) { - PyErr_SetString(PyExc_TypeError, - "__dict__ attribute must be set " - "to a mapping"); - return -1; - } - nval = PyDict_New(); - if (nval == NULL) - return -1; - if (PyDict_Merge(nval, value, 1) < 0) - goto error; - } - d = compact_getdict(ko, context); - if (d == NULL) - goto error; - tmp = PyObject_CallMethod(d, "clear", ""); - if (tmp == NULL) - goto error; - Py_DECREF(tmp); - tmp = PyObject_CallMethod(d, "update", "O", nval); - if (tmp == NULL) - goto error; - Py_DECREF(tmp); - Py_DECREF(nval); - return 0; - - error: - Py_DECREF(nval); - return -1; -} - - -/*****************************************************************/ -/* The custom metaclass 'psyco.compacttype'. - * The only difference with the standard 'type' is that it - * forces some values: - * __slots__ == () - * __bases__[-1] == psyco.compact - */ - -staticforward PyTypeObject PyCompactType_Type; - -static PyObject * -compacttype_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) -{ - int i, n; - PyObject *name, *bases, *dict, *slots, *result, *nbases; - static char *kwlist[] = {"name", "bases", "dict", 0}; - - /* Check arguments: (name, bases, dict) */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:compacttype", - kwlist, - &name, - &PyTuple_Type, &bases, - &PyDict_Type, &dict)) - return NULL; - - slots = PyDict_GetItemString(dict, "__slots__"); - if (slots != NULL) { - /* Specifying __slots__ on compacttypes is forbidden! */ - PyErr_SetString(PyExc_PsycoError, "psyco.compact classes " - "cannot have an explicit __slots__"); - return NULL; - } - - args = PyTuple_New(3); - if (args == NULL) - return NULL; - PyTuple_SET_ITEM(args, 0, name); Py_INCREF(name); - - /* Append 'psyco.compact' to bases if necessary, i.e. if none of the - provided bases already has a metaclass of psyco.compacttype. - The goal is to ensure that all the instances of psyco.compacttype - are classes that inherit from psyco.compact, but only add - psyco.compact to the bases if absolutely necessary. */ - n = PyTuple_GET_SIZE(bases); - for (i=0; iob_type != &PyString_Type || !PyString_CHECK_INTERNED(attr)) \ - Py_FatalError("Psyco failed to intern an attribute name"); \ -} while (0) - -EXTERNFN vinfo_t* vinfo_copy_no_share(vinfo_t* vi); -EXTERNFN bool k_match_vinfo(vinfo_t* vnew, vinfo_t* vexisting); -EXTERNFN compact_impl_t* k_extend_impl(compact_impl_t* oldimpl, PyObject* attr, - vinfo_t* v); -EXTERNFN void k_attribute_range(vinfo_t* v, int* smin, int* smax); -EXTERNFN compact_impl_t* k_duplicate_impl(compact_impl_t* base, - compact_impl_t* first_excluded, - compact_impl_t* last, - int shift_delta); - -#endif /* _COMPACTOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pabstract.c b/nodebox/ext/psyco/src/c/Objects/pabstract.c deleted file mode 100644 index 45f6731..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pabstract.c +++ /dev/null @@ -1,1092 +0,0 @@ -#include "pabstract.h" -#include "pintobject.h" -#include "plongobject.h" -#include "pstringobject.h" -#include "piterobject.h" -#include "ptupleobject.h" -#include "pmethodobject.h" -#include "pclassobject.h" -#include "pfuncobject.h" - - -/*** This file is translated from the original 'abstract.c', see comments - in the original file for the general ideas about the algorithms. ***/ - -/* Shorthand to return certain errors */ - -static vinfo_t* type_error(PsycoObject* po, const char *msg) -{ - PycException_SetString(po, PyExc_TypeError, msg); - return NULL; -} - - -DEFINEFN -vinfo_t* PsycoObject_Call(PsycoObject* po, vinfo_t* callable_object, - vinfo_t* args, vinfo_t* kw) -{ /* 'kw' may not be NULL */ - ternaryfunc call; - PyTypeObject* tp = Psyco_NeedType(po, callable_object); - if (tp == NULL) - return NULL; - - if ((call = tp->tp_call) != NULL) { - return Psyco_META3(po, call, CfReturnRef|CfPyErrIfNull, - "vvv", callable_object, args, kw); - } - PycException_SetFormat(po, PyExc_TypeError, - "object of type '%.100s' is not callable", - tp->tp_name); - return NULL; -} - -DEFINEFN -vinfo_t* PsycoEval_CallObjectWithKeywords(PsycoObject* po, - vinfo_t* callable_object, - vinfo_t* args, vinfo_t* kw) -{ - vinfo_t* result; - - if (args == NULL) - args = PsycoTuple_New(0, NULL); - else { - switch (Psyco_VerifyType(po, args, &PyTuple_Type)) { - case true: /* args is a tuple */ - vinfo_incref(args); - break; - case false: /* args is not a tuple */ - goto use_proxy; - default: /* error or promotion */ - return NULL; - } - } - if (kw == NULL) - kw = psyco_vi_Zero(); - else { - switch (Psyco_VerifyType(po, kw, &PyDict_Type)) { - case true: /* kw is a dict */ - vinfo_incref(kw); - break; - case false: /* kw is not a dict */ - vinfo_decref(args, po); - goto use_proxy; - default: /* error or promotion */ - return NULL; - } - } - - result = PsycoObject_Call(po, callable_object, args, kw); - vinfo_decref(kw, po); - vinfo_decref(args, po); - return result; - - use_proxy: - return psyco_generic_call(po, PyEval_CallObjectWithKeywords, - CfReturnRef|CfPyErrIfNull, - "vvv", callable_object, args, kw); -} - - -DEFINEFN -vinfo_t* PsycoObject_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key) -{ - PyMappingMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, o); - if (tp == NULL) - return NULL; - - m = tp->tp_as_mapping; - if (m && m->mp_subscript) - return Psyco_META2(po, m->mp_subscript, - CfReturnRef|CfPyErrIfNull, "vv", o, key); - - if (tp->tp_as_sequence) { - /* TypeSwitch */ - PyTypeObject* ktp = Psyco_NeedType(po, key); - if (ktp == NULL) - return NULL; - - if (PyType_TypeCheck(ktp, &PyInt_Type)) { - return PsycoSequence_GetItem(po, o, - PsycoInt_AS_LONG(po, key)); - } - if (PyType_TypeCheck(ktp, &PyLong_Type)) { - vinfo_t* result; - vinfo_t* key_value = PsycoLong_AsLong(po, key); - if (key_value == NULL) - return NULL; - result = PsycoSequence_GetItem(po, o, key_value); - vinfo_decref(key_value, po); - return result; - } -#if HAVE_NB_INDEX - if (PsycoIndex_Check(ktp)) { - vinfo_t* result; - vinfo_t* key_value; - key_value = psyco_generic_call(po, PyNumber_AsSsize_t, - CfReturnNormal|CfPyErrCheckMinus1, - "vl", key, (long) PyExc_IndexError); - if (key_value == NULL) - return NULL; - result = PsycoSequence_GetItem(po, o, key_value); - vinfo_decref(key_value, po); - return result; - } -#endif - type_error(po, "sequence index must be integer"); - return false; - } - - type_error(po, "unsubscriptable object"); - return false; -} - -DEFINEFN -bool PsycoObject_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key, - vinfo_t* value) -{ - PyMappingMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, o); - if (tp == NULL) - return false; - - m = tp->tp_as_mapping; - if (m && m->mp_ass_subscript) { - char* vargs = (value!=NULL) ? "vvv" : "vvl"; - return Psyco_META3(po, m->mp_ass_subscript, - CfNoReturnValue|CfPyErrIfNonNull, - vargs, o, key, value) != NULL; - } - - if (tp->tp_as_sequence) { - /* TypeSwitch */ - PyTypeObject* ktp = Psyco_NeedType(po, key); - if (ktp == NULL) - return false; - - if (PyType_TypeCheck(ktp, &PyInt_Type)) { - return PsycoSequence_SetItem(po, o, - PsycoInt_AS_LONG(po, key), - value); - } - if (PyType_TypeCheck(ktp, &PyLong_Type)) { - bool result; - vinfo_t* key_value = PsycoLong_AsLong(po, key); - if (key_value == NULL) - return false; - result = PsycoSequence_SetItem(po, o, key_value,value); - vinfo_decref(key_value, po); - return result; - } -#if HAVE_NB_INDEX - if (PsycoIndex_Check(ktp)) { - bool result; - vinfo_t* key_value; - key_value = psyco_generic_call(po, PyNumber_AsSsize_t, - CfReturnNormal|CfPyErrCheckMinus1, - "vl", key, (long) PyExc_IndexError); - if (key_value == NULL) - return false; - result = PsycoSequence_SetItem(po, o, key_value,value); - vinfo_decref(key_value, po); - return result; - } -#endif - if (tp->tp_as_sequence->sq_ass_item) { - type_error(po, "sequence index must be integer"); - return false; - } - } - - type_error(po, (value!=NULL) ? - "object does not support item assignment" : - "object does not support item deletion"); - return false; -} - -DEFINEFN -vinfo_t* PsycoObject_Size(PsycoObject* po, vinfo_t* vi) -{ - PySequenceMethods *m; - void* f; - PyTypeObject* tp = Psyco_NeedType(po, vi); - if (tp == NULL) - return NULL; - - m = tp->tp_as_sequence; - if (m && m->sq_length) - f = m->sq_length; - else { - PyMappingMethods *m2 = tp->tp_as_mapping; - if (m2 && m2->mp_length) - f = m2->mp_length; - else - return type_error(po, "len() of unsized object"); - } - - return Psyco_META1(po, f, CfReturnNormal|CfPyErrIfNeg, "v", vi); -} - -DEFINEFN -vinfo_t* psyco_generic_immut_ob_size(PsycoObject* po, vinfo_t* vi) -{ - return psyco_get_field(po, vi, FIX_size); -} - -DEFINEFN -vinfo_t* psyco_generic_mut_ob_size(PsycoObject* po, vinfo_t* vi) -{ - return psyco_get_field(po, vi, VAR_size); -} - -DEFINEFN -vinfo_t* PsycoSequence_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i) -{ - PySequenceMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, o); - if (tp == NULL) - return NULL; - - m = tp->tp_as_sequence; - if (m && m->sq_item) { - vinfo_t* result; - vinfo_t* release_me = NULL; - if (m->sq_length) { - condition_code_t cc = integer_cmp_i(po, i, 0, Py_LT); - if (cc == CC_ERROR) - return NULL; - if (runtime_condition_f(po, cc)) { - vinfo_t* l = Psyco_META1(po, m->sq_length, - CfReturnNormal|CfPyErrIfNeg, - "v", o); - if (l == NULL) - return NULL; - release_me = i = integer_add(po, i, l, false); - vinfo_decref(l, po); - if (i == NULL) - return NULL; - } - else - assert_nonneg(i); - } - result = Psyco_META2(po, m->sq_item, CfReturnRef|CfPyErrIfNull, - "vv", o, i); - vinfo_xdecref(release_me, po); - return result; - } - - return type_error(po, "unindexable object"); -} - -DEFINEFN -bool PsycoSequence_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i, - vinfo_t* value) -{ - PySequenceMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, o); - if (tp == NULL) - return false; - - m = tp->tp_as_sequence; - if (m && m->sq_ass_item) { - bool result; - char* vargs; - vinfo_t* release_me = NULL; - if (m->sq_length) { - condition_code_t cc = integer_cmp_i(po, i, 0, Py_LT); - if (cc == CC_ERROR) - return false; - if (runtime_condition_f(po, cc)) { - vinfo_t* l = Psyco_META1(po, m->sq_length, - CfReturnNormal|CfPyErrIfNeg, - "v", o); - if (l == NULL) - return false; - release_me = i = integer_add(po, i, l, false); - vinfo_decref(l, po); - if (i == NULL) - return false; - } - else - assert_nonneg(i); - } - vargs = (value!=NULL) ? "vvv" : "vvl"; - result = Psyco_META3(po, m->sq_ass_item, - CfNoReturnValue|CfPyErrIfNonNull, - vargs, o, i, value) != NULL; - vinfo_xdecref(release_me, po); - return result; - } - - type_error(po, (value!=NULL) ? - "object doesn't support item assignment" : - "object doesn't support item deletion"); - return false; -} - -DEFINEFN -vinfo_t* PsycoSequence_GetSlice(PsycoObject* po, vinfo_t* o, - vinfo_t* i1, vinfo_t* i2) -{ - PySequenceMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, o); - if (tp == NULL) - return false; - - m = tp->tp_as_sequence; - if (m && m->sq_slice) { - vinfo_t* result = NULL; - vinfo_t* l = NULL; /* length, if already computed */ - vinfo_t* release_me1 = NULL; - vinfo_t* release_me2 = NULL; - if (m->sq_length) { - condition_code_t cc; - cc = integer_cmp_i(po, i1, 0, Py_LT); - if (cc == CC_ERROR) - goto fail; - if (runtime_condition_f(po, cc)) { - /* i1 < 0 */ - l = Psyco_META1(po, m->sq_length, - CfReturnNormal|CfPyErrIfNeg, - "v", o); - if (l == NULL) - goto fail; - release_me1 = i1 = integer_add(po, i1, l, false); - if (i1 == NULL) - goto fail; - } - else - assert_nonneg(i1); - - cc = integer_cmp_i(po, i2, 0, Py_LT); - if (cc == CC_ERROR) - goto fail; - if (runtime_condition_f(po, cc)) { - /* i2 < 0 */ - if (l == NULL) { - l = Psyco_META1(po, m->sq_length, - CfReturnNormal|CfPyErrIfNeg, - "v", o); - if (l == NULL) - goto fail; - } - release_me2 = i2 = integer_add(po, i2, l, false); - if (i2 == NULL) - goto fail; - } - else - assert_nonneg(i2); - } - result = Psyco_META3(po, m->sq_slice, CfReturnRef|CfPyErrIfNull, - "vvv", o, i1, i2); - - fail: - vinfo_xdecref(release_me2, po); - vinfo_xdecref(release_me1, po); - vinfo_xdecref(l, po); - return result; - } - else { - /* XXX call mp_subscript with sliceobj_from_intint */ - /* fallback */ - return psyco_generic_call(po, PySequence_GetSlice, - CfReturnRef|CfPyErrIfNull, - "vvv", o, i1, i2); - } -} - -DEFINEFN -bool PsycoSequence_SetSlice(PsycoObject* po, vinfo_t* o, - vinfo_t* ilow, vinfo_t* ihigh, vinfo_t* value) -{ - /* XXX implement me */ - if (value != NULL) - return psyco_generic_call(po, PySequence_SetSlice, - CfNoReturnValue|CfPyErrIfNonNull, - "vvvv", o, ilow, ihigh, value)!=NULL; - else - return psyco_generic_call(po, PySequence_DelSlice, - CfNoReturnValue|CfPyErrIfNonNull, - "vvv", o, ilow, ihigh) != NULL; -} - -DEFINEFN -vinfo_t* PsycoSequence_Contains(PsycoObject* po, vinfo_t* seq, vinfo_t* ob) -{ - PyTypeObject* tp = Psyco_NeedType(po, seq); - if (tp == NULL) - return false; - - if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_SEQUENCE_IN)) { - PySequenceMethods *sqm = tp->tp_as_sequence; - if (sqm != NULL && sqm->sq_contains != NULL) - return Psyco_META2(po, sqm->sq_contains, - CfReturnNormal|CfPyErrIfNeg, - "vv", seq, ob); - } - - /* XXX implement me */ - return psyco_generic_call(po, _PySequence_IterSearch, - CfReturnNormal|CfPyErrIfNeg, - "vvl", seq, ob, PY_ITERSEARCH_CONTAINS); -} - -DEFINEFN -vinfo_t* PsycoSequence_Tuple(PsycoObject* po, vinfo_t* seq) -{ - /* XXX implement me */ - vinfo_t* v = psyco_generic_call(po, PySequence_Tuple, - CfReturnRef|CfPyErrIfNull, - "v", seq); - if (v == NULL) - return NULL; - - /* the result is a tuple */ - Psyco_AssertType(po, v, &PyTuple_Type); - return v; -} - - -DEFINEFN -vinfo_t* PsycoNumber_Positive(PsycoObject* po, vinfo_t* vi) -{ - PyNumberMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, vi); - if (tp == NULL) - return NULL; - - m = tp->tp_as_number; - if (m && m->nb_positive) - return Psyco_META1(po, m->nb_positive, - CfReturnRef|CfPyErrIfNull, "v", vi); - - return type_error(po, "bad operand type for unary +"); -} - -DEFINEFN -vinfo_t* PsycoNumber_Negative(PsycoObject* po, vinfo_t* vi) -{ - PyNumberMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, vi); - if (tp == NULL) - return NULL; - - m = tp->tp_as_number; - if (m && m->nb_negative) - return Psyco_META1(po, m->nb_negative, - CfReturnRef|CfPyErrIfNull, "v", vi); - - return type_error(po, "bad operand type for unary -"); -} - -DEFINEFN -vinfo_t* PsycoNumber_Invert(PsycoObject* po, vinfo_t* vi) -{ - PyNumberMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, vi); - if (tp == NULL) - return NULL; - - m = tp->tp_as_number; - if (m && m->nb_invert) - return Psyco_META1(po, m->nb_invert, - CfReturnRef|CfPyErrIfNull, "v", vi); - - return type_error(po, "bad operand type for unary ~"); -} - -DEFINEFN -vinfo_t* PsycoNumber_Absolute(PsycoObject* po, vinfo_t* vi) -{ - PyNumberMethods *m; - PyTypeObject* tp = Psyco_NeedType(po, vi); - if (tp == NULL) - return NULL; - - m = tp->tp_as_number; - if (m && m->nb_absolute) - return Psyco_META1(po, m->nb_absolute, - CfReturnRef|CfPyErrIfNull, "v", vi); - - return type_error(po, "bad operand type for abs()"); -} - -#ifdef Py_TPFLAGS_CHECKTYPES -# define NEW_STYLE_NUMBER(otp) PyType_HasFeature((otp), \ - Py_TPFLAGS_CHECKTYPES) -#else -# define NEW_STYLE_NUMBER(otp) 0 -#endif - - -#define NB_SLOT(x) offsetof(PyNumberMethods, x) -#define NB_BINOP(nb_methods, slot) \ - ((binaryfunc*)(& ((char*)nb_methods)[slot] )) -#define NB_TERNOP(nb_methods, slot) \ - ((ternaryfunc*)(& ((char*)nb_methods)[slot] )) - - -/* the 'cimpl_xxx()' functions are called at run-time, to do things - we give up to write at the meta-level in the PsycoXxx() functions. */ -static PyObject* cimpl_oldstyle_binary_op1(PyObject* v, PyObject* w, - const int op_slot) -{ - int err = PyNumber_CoerceEx(&v, &w); - if (err < 0) { - return NULL; - } - if (err == 0) { - PyNumberMethods *mv = v->ob_type->tp_as_number; - if (mv) { - binaryfunc slot; - slot = *NB_BINOP(mv, op_slot); - if (slot) { - PyObject *x = slot(v, w); - Py_DECREF(v); - Py_DECREF(w); - return x; - } - } - /* CoerceEx incremented the reference counts */ - Py_DECREF(v); - Py_DECREF(w); - } - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; -} - -static vinfo_t* binary_op1(PsycoObject* po, vinfo_t* v, vinfo_t* w, - const int op_slot) -{ - vinfo_t* x; - binaryfunc slotv = NULL; - binaryfunc slotw = NULL; - - PyTypeObject* vtp; - PyTypeObject* wtp; - vtp = Psyco_NeedType(po, v); - if (vtp == NULL) - return NULL; - wtp = Psyco_NeedType(po, w); - if (wtp == NULL) - return NULL; - - if (vtp->tp_as_number != NULL && NEW_STYLE_NUMBER(vtp)) - slotv = *NB_BINOP(vtp->tp_as_number, op_slot); - if (wtp != vtp && - wtp->tp_as_number != NULL && NEW_STYLE_NUMBER(wtp)) { - slotw = *NB_BINOP(wtp->tp_as_number, op_slot); - if (slotw == slotv) - slotw = NULL; - } - if (slotv) { - if (slotw && PyType_IsSubtype(wtp, vtp)) { - x = Psyco_META2(po, slotw, - CfReturnRef|CfPyErrNotImplemented, - "vv", v, w); - if (IS_IMPLEMENTED(x)) - return x; /* may be NULL */ - vinfo_decref(x, po); /* can't do it */ - slotw = NULL; - } - x = Psyco_META2(po, slotv, - CfReturnRef|CfPyErrNotImplemented, "vv", v, w); - if (IS_IMPLEMENTED(x)) - return x; - vinfo_decref(x, po); /* can't do it */ - } - if (slotw) { - x = Psyco_META2(po, slotw, CfReturnRef|CfPyErrNotImplemented, - "vv", v, w); - if (IS_IMPLEMENTED(x)) - return x; - vinfo_decref(x, po); /* can't do it */ - } - if (!NEW_STYLE_NUMBER(vtp) || !NEW_STYLE_NUMBER(wtp)) { - /* inline a bit of PyNumber_CoerceEx */ - if (vtp == wtp) { - /* PyNumber_CoerceEx returns 0 in this case */ - PyNumberMethods *mv = vtp->tp_as_number; - if (mv) { - binaryfunc slot; - slot = *NB_BINOP(mv, op_slot); - if (slot) { - x = Psyco_META2(po, slot, - CfReturnRef|CfPyErrIfNull, - "vv", v, w); - return x; - } - } - } - else if ((vtp->tp_as_number && vtp->tp_as_number->nb_coerce) || - (wtp->tp_as_number && wtp->tp_as_number->nb_coerce)) { - /* stop inlining now, we don't try to optimize - old-style numbers any further here */ - return psyco_generic_call(po, cimpl_oldstyle_binary_op1, - CfReturnRef|CfPyErrNotImplemented, - "vvl", v, w, op_slot); - } - } - return psyco_vi_NotImplemented(); -} - -static vinfo_t* binop_type_error(PsycoObject* po, - vinfo_t* v, vinfo_t* w, const char *op_name) -{ - PycException_SetFormat(po, PyExc_TypeError, - "unsupported operand type(s) for %s: '%s' and '%s'", - op_name, - Psyco_FastType(v)->tp_name, - Psyco_FastType(w)->tp_name); - return NULL; -} - -static vinfo_t* binary_op(PsycoObject* po, vinfo_t* v, vinfo_t* w, - const int op_slot, const char *op_name) -{ - vinfo_t* result = binary_op1(po, v, w, op_slot); - if (!IS_IMPLEMENTED(result)) { - vinfo_decref(result, po); - return binop_type_error(po, v, w, op_name); - } - return result; -} - -#define BINARY_FUNC(func, op, op_name) \ -DEFINEFN vinfo_t* func(PsycoObject* po, vinfo_t* v, vinfo_t* w) { \ - return binary_op(po, v, w, NB_SLOT(op), op_name); \ -} - -BINARY_FUNC(PsycoNumber_Or, nb_or, "|") -BINARY_FUNC(PsycoNumber_Xor, nb_xor, "^") -BINARY_FUNC(PsycoNumber_And, nb_and, "&") -BINARY_FUNC(PsycoNumber_Lshift, nb_lshift, "<<") -BINARY_FUNC(PsycoNumber_Rshift, nb_rshift, ">>") -BINARY_FUNC(PsycoNumber_Subtract, nb_subtract, "-") -BINARY_FUNC(PsycoNumber_Divide, nb_divide, "/") -BINARY_FUNC(PsycoNumber_Divmod, nb_divmod, "divmod()") - - /* XXX tp_flags test -- not done in Python either, check future releases */ -BINARY_FUNC(PsycoNumber_FloorDivide, nb_floor_divide, "//") -BINARY_FUNC(PsycoNumber_TrueDivide, nb_true_divide, "/") - - -DEFINEFN -vinfo_t* PsycoNumber_Add(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* result = binary_op1(po, v, w, NB_SLOT(nb_add)); - if (!IS_IMPLEMENTED(result)) { - PySequenceMethods* m; - vinfo_decref(result, po); - m = Psyco_FastType(v)->tp_as_sequence; - if (m && m->sq_concat) { - result = Psyco_META2(po, m->sq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", v, w); - } - else { - return binop_type_error(po, v, w, "+"); - } - } - return result; -} - -static vinfo_t* psequence_repeat(PsycoObject* po, void *repeatfunc, - vinfo_t* vseq, vinfo_t* vn) -{ - PyTypeObject* tp = Psyco_FastType(vn); - vinfo_t* vcount; - vinfo_t* result; - - if (PyType_TypeCheck(tp, &PyInt_Type)) { - vcount = PsycoInt_AsLong(po, vn); - } - else if (PyType_TypeCheck(tp, &PyLong_Type)) { - vcount = PsycoLong_AsLong(po, vn); - } -#if HAVE_NB_INDEX - else if (PsycoIndex_Check(tp)) { - vcount = psyco_generic_call(po, PyNumber_AsSsize_t, - CfReturnNormal|CfPyErrCheckMinus1, - "vl", vn, - (long) PyExc_OverflowError); - } -#endif - else { - return type_error(po, - "can't multiply sequence to non-int"); - } - if (vcount == NULL) - return NULL; - -#if LONG_MAX != INT_MAX -# error "omitted code from Python 2.3 here" -#endif - result = Psyco_META2(po, repeatfunc, CfReturnRef|CfPyErrIfNull, - "vv", vseq, vcount); - vinfo_decref(vcount, po); - return result; -} - -DEFINEFN -vinfo_t* PsycoNumber_Multiply(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - /* This has varied a lot over recent Python versions. - 2.2 has no special code here; instead, int_mul and long_mul - check if they should delegate to the other argument's - sq_repeat. In 2.3 there is code similar to the code below: - int_mul and long_mul just return NotImplemented, and when - they do we check if we should proceed with sq_repeat. - I use the 2.3 semantics even with earlier Python versions. - Only convoluted user code would see the difference. */ - - vinfo_t* result = binary_op1(po, v, w, NB_SLOT(nb_multiply)); - if (!IS_IMPLEMENTED(result)) { - PySequenceMethods *mv = Psyco_FastType(v)->tp_as_sequence; - PySequenceMethods *mw = Psyco_FastType(w)->tp_as_sequence; - vinfo_decref(result, po); - if (mv && mv->sq_repeat) { - return psequence_repeat(po, mv->sq_repeat, v, w); - } - else if (mw && mw->sq_repeat) { - return psequence_repeat(po, mw->sq_repeat, w, v); - } - result = binop_type_error(po, v, w, "*"); - } - return result; -} - -DEFINEFN -vinfo_t* PsycoNumber_Remainder(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - PyTypeObject* vtp = Psyco_NeedType(po, v); - if (vtp == NULL) - return NULL; - if (vtp->tp_as_number == NULL) { - /* <= 2.2 only: special-case strings */ - if (PsycoString_Check(vtp)) - return psyco_generic_call(po, PyString_Format, - CfReturnRef|CfPyErrIfNull, - "vv", v, w); -#ifdef Py_USING_UNICODE - else if (PsycoUnicode_Check(vtp)) - return psyco_generic_call(po, -# if PSYCO_CAN_CALL_UNICODE - PyUnicode_Format, -# else - PyNumber_Remainder, -# endif - CfReturnRef|CfPyErrIfNull, - "vv", v, w); -#endif - } - return binary_op(po, v, w, NB_SLOT(nb_remainder), "%"); -} - -DEFINEFN -vinfo_t* PsycoNumber_Power(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, vinfo_t*v3) -{ - /* limited support -- the goal is only to support - (int-or-long-or-float) ** (int-or-long-or-float) */ - vinfo_t* x; - PyTypeObject* vtp; - PyTypeObject* wtp; - ternaryfunc f; - vtp = Psyco_NeedType(po, v1); - if (vtp == NULL) - return NULL; - if (vtp != &PyInt_Type && vtp != &PyLong_Type && vtp != &PyFloat_Type) - goto fallback; - wtp = Psyco_NeedType(po, v2); - if (wtp == NULL) - return NULL; - if (wtp != &PyInt_Type && wtp != &PyLong_Type && wtp != &PyFloat_Type) - goto fallback; - if (vtp == &PyFloat_Type || wtp == &PyFloat_Type) - f = PyFloat_Type.tp_as_number->nb_power; - else if (vtp == &PyLong_Type || wtp == &PyLong_Type) - f = PyLong_Type.tp_as_number->nb_power; - else - f = PyInt_Type.tp_as_number->nb_power; - x = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, - "vvv", v1, v2, v3); - if (IS_IMPLEMENTED(x)) - return x; /* may be NULL */ - vinfo_decref(x, po); - - fallback: - return psyco_generic_call(po, PyNumber_Power, CfReturnRef|CfPyErrIfNull, - "vvv", v1, v2, v3); -} - - -#define HASINPLACE(tp) PyType_HasFeature((tp), Py_TPFLAGS_HAVE_INPLACEOPS) - -static vinfo_t* binary_iop1(PsycoObject* po, vinfo_t* v, vinfo_t* w, - const int iop_slot, const int op_slot) -{ - PyNumberMethods *mv; - PyTypeObject* vtp = Psyco_NeedType(po, v); - if (vtp == NULL) - return NULL; - - mv = vtp->tp_as_number; - if (mv != NULL && HASINPLACE(vtp)) { - binaryfunc slot = *NB_BINOP(mv, iop_slot); - if (slot) { - vinfo_t* x = Psyco_META2(po, slot, - CfReturnRef|CfPyErrNotImplemented, - "vv", v, w); - if (IS_IMPLEMENTED(x)) - return x; - vinfo_decref(x, po); - } - } - return binary_op1(po, v, w, op_slot); -} - -static vinfo_t* binary_iop(PsycoObject* po, vinfo_t* v, vinfo_t* w, - const int iop_slot, const int op_slot, - const char *op_name) -{ - vinfo_t* result = binary_iop1(po, v, w, iop_slot, op_slot); - if (!IS_IMPLEMENTED(result)) { - vinfo_decref(result, po); - return binop_type_error(po, v, w, op_name); - } - return result; -} - -#define INPLACE_BINOP(func, iop, op, op_name) \ -DEFINEFN vinfo_t* func(PsycoObject* po, vinfo_t* v, vinfo_t* w) { \ - return binary_iop(po, v, w, NB_SLOT(iop), NB_SLOT(op), op_name); \ -} - -INPLACE_BINOP(PsycoNumber_InPlaceOr, nb_inplace_or, nb_or, "|=") -INPLACE_BINOP(PsycoNumber_InPlaceXor, nb_inplace_xor, nb_xor, "^=") -INPLACE_BINOP(PsycoNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=") -INPLACE_BINOP(PsycoNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=") -INPLACE_BINOP(PsycoNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=") -INPLACE_BINOP(PsycoNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract,"-=") -INPLACE_BINOP(PsycoNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=") - - /* XXX tp_flags test -- not done in Python either, check future releases */ -INPLACE_BINOP(PsycoNumber_InPlaceFloorDivide, nb_inplace_floor_divide, - nb_floor_divide, "//=") -INPLACE_BINOP(PsycoNumber_InPlaceTrueDivide, nb_inplace_true_divide, - nb_true_divide, "/=") - -DEFINEFN -vinfo_t* PsycoNumber_InPlaceAdd(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* result = binary_iop1(po, v, w, NB_SLOT(nb_inplace_add), - NB_SLOT(nb_add)); - if (!IS_IMPLEMENTED(result)) { - PyTypeObject* vtp = Psyco_FastType(v); - PySequenceMethods* m = vtp->tp_as_sequence; - vinfo_decref(result, po); - if (m != NULL) { - binaryfunc f = NULL; - if (HASINPLACE(vtp)) - f = m->sq_inplace_concat; - if (f == NULL) - f = m->sq_concat; - if (f != NULL) - return Psyco_META2(po, f, - CfReturnRef|CfPyErrIfNull, - "vv", v, w); - } - result = binop_type_error(po, v, w, "+="); - } - return result; -} - -DEFINEFN -vinfo_t* PsycoNumber_InPlaceMultiply(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* result = binary_iop1(po, v, w, NB_SLOT(nb_inplace_multiply), - NB_SLOT(nb_multiply)); - if (!IS_IMPLEMENTED(result)) { - PyTypeObject* vtp = Psyco_FastType(v); - PyTypeObject* wtp = Psyco_FastType(w); - void *f = NULL; - PySequenceMethods *mv = vtp->tp_as_sequence; - PySequenceMethods *mw = wtp->tp_as_sequence; - vinfo_decref(result, po); - if (mv != NULL) { - if (HASINPLACE(vtp)) - f = mv->sq_inplace_repeat; - if (f == NULL) - f = mv->sq_repeat; - if (f != NULL) - return psequence_repeat(po, f, v, w); - } - else if (mw != NULL) { - /* Note that the right hand operand should not be - * mutated in this case so sq_inplace_repeat is not - * used. */ - if (mw->sq_repeat) - return psequence_repeat(po, - mw->sq_repeat, w, v); - } - result = binop_type_error(po, v, w, "*="); - } - return result; -} - -DEFINEFN -vinfo_t* PsycoNumber_InPlaceRemainder(PsycoObject* po, vinfo_t* v ,vinfo_t* w) -{ - PyTypeObject* vtp = Psyco_NeedType(po, v); - if (vtp == NULL) - return NULL; - if (vtp->tp_as_number == NULL) { - /* <= 2.2 only: special-case strings */ - if (PsycoString_Check(vtp)) - return psyco_generic_call(po, PyString_Format, - CfReturnRef|CfPyErrIfNull, - "vv", v, w); -#ifdef Py_USING_UNICODE - else if (PsycoUnicode_Check(vtp)) - return psyco_generic_call(po, -# if PSYCO_CAN_CALL_UNICODE - PyUnicode_Format, -# else - PyNumber_InPlaceRemainder, -# endif - CfReturnRef|CfPyErrIfNull, - "vv", v, w); -#endif - } - return binary_iop(po, v, w, NB_SLOT(nb_inplace_remainder), - NB_SLOT(nb_remainder), "%"); -} - -DEFINEFN -vinfo_t* PsycoNumber_InPlacePower(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, - vinfo_t* v3) { - /* XXX implement the ternary operators */ - return psyco_generic_call(po, PyNumber_InPlacePower, - CfReturnRef|CfPyErrIfNull, - "vvv", v1, v2, v3); -} - - -DEFINEFN -vinfo_t* PsycoObject_GetIter(PsycoObject* po, vinfo_t* vi) -{ - getiterfunc f; - PyTypeObject* t = Psyco_NeedType(po, vi); - if (t == NULL) - return NULL; - if (PyType_HasFeature(t, Py_TPFLAGS_HAVE_ITER)) - f = t->tp_iter; - else - f = NULL; - if (f == NULL) { - if (PsycoSequence_Check(t)) - return PsycoSeqIter_New(po, vi); - PycException_SetString(po, PyExc_TypeError, - "iteration over non-sequence"); - return NULL; - } - else { - return Psyco_META1(po, f, CfReturnRef|CfPyErrIfNull, - "v", vi); - } -} - -DEFINEFN -vinfo_t* PsycoIter_Next(PsycoObject* po, vinfo_t* iter) -{ - PyTypeObject* tp = Psyco_NeedType(po, iter); - if (tp == NULL) - return NULL; - if (!PsycoIter_Check(tp)) { - PycException_SetFormat(po, PyExc_TypeError, - "'%.100s' object is not an iterator", - tp->tp_name); - return NULL; - } - return Psyco_META1(po, tp->tp_iternext, CfReturnRef|CfPyErrIterNext, - "v", iter); -} - - -DEFINEFN -vinfo_t* psyco_generic_subscript(PsycoObject* po, vinfo_t* o, vinfo_t* key) -{ - /* This is the meta-implementation of the mapping item assignment - for sequences in Python >= 2.3, which is called for any - expression of the form a[n]. It expects n to be an integer - or an extended slice object. Regular slicing a[n:m] does not - come here. */ - - /* TypeSwitch */ - PyTypeObject* ktp = Psyco_NeedType(po, key); - if (ktp == NULL) - return NULL; - - if (PyType_TypeCheck(ktp, &PyInt_Type)) { - return PsycoSequence_GetItem(po, o, - PsycoInt_AS_LONG(po, key)); - } - else if (PyType_TypeCheck(ktp, &PyLong_Type)) { - vinfo_t* result; - vinfo_t* key_value = PsycoLong_AsLong(po, key); - if (key_value == NULL) - return NULL; - result = PsycoSequence_GetItem(po, o, key_value); - vinfo_decref(key_value, po); - return result; - } - else { - PyTypeObject* tp = Psyco_NeedType(po, o); - if (tp == NULL) - return NULL; - extra_assert(tp->tp_as_mapping != NULL); - extra_assert(tp->tp_as_mapping->mp_subscript != NULL); - return psyco_generic_call(po, tp->tp_as_mapping->mp_subscript, - CfReturnRef|CfPyErrIfNull, - "vv", o, key); - } -} - -DEFINEFN -bool psyco_generic_ass_subscript(PsycoObject* po, vinfo_t* o, - vinfo_t* key, vinfo_t* value) -{ - /* see psyco_generic_subscript() for comments */ - - /* TypeSwitch */ - PyTypeObject* ktp = Psyco_NeedType(po, key); - if (ktp == NULL) - return false; - - if (PyType_TypeCheck(ktp, &PyInt_Type)) { - return PsycoSequence_SetItem(po, o, - PsycoInt_AS_LONG(po, key), - value); - } - else if (PyType_TypeCheck(ktp, &PyLong_Type)) { - bool result; - vinfo_t* key_value = PsycoLong_AsLong(po, key); - if (key_value == NULL) - return false; - result = PsycoSequence_SetItem(po, o, key_value, value); - vinfo_decref(key_value, po); - return result; - } - else { - char* vargs = (value!=NULL) ? "vvv" : "vvl"; - PyTypeObject* tp = Psyco_NeedType(po, o); - if (tp == NULL) - return false; - extra_assert(tp->tp_as_mapping != NULL); - extra_assert(tp->tp_as_mapping->mp_ass_subscript != NULL); - return psyco_generic_call(po, - tp->tp_as_mapping->mp_ass_subscript, - CfNoReturnValue|CfPyErrIfNonNull, - vargs, o, key, value) != NULL; - } -} diff --git a/nodebox/ext/psyco/src/c/Objects/pabstract.h b/nodebox/ext/psyco/src/c/Objects/pabstract.h deleted file mode 100644 index 5a1c94e..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pabstract.h +++ /dev/null @@ -1,110 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of abstract.h ***/ - /***************************************************************/ - -#ifndef _PSY_ABSTRACT_H -#define _PSY_ABSTRACT_H - - -#include "pobject.h" -#include "../Python/pycinternal.h" - - -EXTERNFN vinfo_t* PsycoObject_Call(PsycoObject* po, vinfo_t* callable_object, - vinfo_t* args, vinfo_t* kw); -/* 'args' and 'kw' may be NULL; this version performs type checks */ -EXTERNFN vinfo_t* PsycoEval_CallObjectWithKeywords(PsycoObject* po, - vinfo_t* callable_object, - vinfo_t* args, vinfo_t* kw); - -EXTERNFN vinfo_t* PsycoObject_Size(PsycoObject* po, vinfo_t* vi); -EXTERNFN vinfo_t* PsycoObject_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key); -EXTERNFN bool PsycoObject_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* key, - vinfo_t* value); - -EXTERNFN vinfo_t* PsycoSequence_GetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i); -EXTERNFN bool PsycoSequence_SetItem(PsycoObject* po, vinfo_t* o, vinfo_t* i, - vinfo_t* value); -EXTERNFN vinfo_t* PsycoSequence_GetSlice(PsycoObject* po, vinfo_t* o, - vinfo_t* i1, vinfo_t* i2); -EXTERNFN bool PsycoSequence_SetSlice(PsycoObject* po, vinfo_t* o, - vinfo_t* ilow, vinfo_t* ihigh, - vinfo_t* value); -EXTERNFN vinfo_t* PsycoSequence_Contains(PsycoObject* po, vinfo_t* seq, - vinfo_t* ob); -EXTERNFN vinfo_t* PsycoSequence_Tuple(PsycoObject* po, vinfo_t* seq); - -EXTERNFN vinfo_t* PsycoNumber_Positive(PsycoObject* po, vinfo_t* vi); -EXTERNFN vinfo_t* PsycoNumber_Negative(PsycoObject* po, vinfo_t* vi); -EXTERNFN vinfo_t* PsycoNumber_Invert(PsycoObject* po, vinfo_t* vi); -EXTERNFN vinfo_t* PsycoNumber_Absolute(PsycoObject* po, vinfo_t* vi); - -EXTERNFN vinfo_t* PsycoNumber_Add(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Or(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Xor(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_And(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Lshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Rshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Subtract(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Multiply(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Divide(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Divmod(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Remainder(PsycoObject* po, vinfo_t* v,vinfo_t* w); -EXTERNFN vinfo_t* PsycoNumber_Power(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, - vinfo_t* v3); - -EXTERNFN -vinfo_t* PsycoNumber_FloorDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_TrueDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceFloorDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceTrueDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); - -EXTERNFN -vinfo_t* PsycoNumber_InPlaceAdd(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceOr(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceXor(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceAnd(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceLshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceRshift(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceSubtract(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceMultiply(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceDivide(PsycoObject* po, vinfo_t* v, vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlaceRemainder(PsycoObject* po, vinfo_t* v,vinfo_t* w); -EXTERNFN -vinfo_t* PsycoNumber_InPlacePower(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, - vinfo_t* v3); - - /* Attention! This does not catch PyExc_StopIteration. - As with all meta-functions, when it returns NULL there is - an exception set. All iterators raise PyExc_StopIteration at - the meta-level (because this is not time-consuming, the - exceptions being virtualized and not really set at Python's - eyes): */ -EXTERNFN vinfo_t* PsycoIter_Next(PsycoObject* po, vinfo_t* iter); -EXTERNFN vinfo_t* PsycoObject_GetIter(PsycoObject* po, vinfo_t* vi); - - -/* generic implementations of len() that reads the object's ob_size field - and the tp_subscript of all sequences in Python 2.3. - See e.g. plistobject.c */ -EXTERNFN vinfo_t* psyco_generic_immut_ob_size(PsycoObject* po, vinfo_t* vi); -EXTERNFN vinfo_t* psyco_generic_mut_ob_size(PsycoObject* po, vinfo_t* vi); -EXTERNFN vinfo_t* psyco_generic_subscript(PsycoObject* po, vinfo_t* o, - vinfo_t* key); -EXTERNFN bool psyco_generic_ass_subscript(PsycoObject* po, vinfo_t* o, - vinfo_t* key, vinfo_t* value); - - -#endif /* _PSY_ABSTRACT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pboolobject.c b/nodebox/ext/psyco/src/c/Objects/pboolobject.c deleted file mode 100644 index a842e06..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pboolobject.c +++ /dev/null @@ -1,110 +0,0 @@ -#include "pboolobject.h" -#include "pintobject.h" - -#if BOOLEAN_TYPE /* Booleans were introduced in Python 2.3 */ - - -static bool compute_bool(PsycoObject* po, vinfo_t* boolobj) -{ - vinfo_t* newobj; - vinfo_t* x; - condition_code_t cc; - - /* get the field 'ob_ival' from the Python object 'boolobj' */ - x = vinfo_getitem(boolobj, iBOOL_OB_IVAL); - if (x == NULL) - return false; - - cc = integer_non_null(po, x); - if (cc == CC_ERROR) - return false; - newobj = integer_conditional(po, cc, - (long) Py_True, - (long) Py_False); - if (newobj == NULL) - return false; - - /* move the resulting non-virtual Python object back into 'boolobj' */ - vinfo_move(po, boolobj, newobj); - return true; -} - -static PyObject* direct_compute_bool(vinfo_t* boolobj, char* data) -{ - PyObject* result; - int ival; - ival = direct_read_vinfo(vinfo_getitem(boolobj, iBOOL_OB_IVAL), data); - if (ival == -1 && PyErr_Occurred()) - return NULL; - result = ival ? Py_True : Py_False; - Py_INCREF(result); - return result; -} - - -DEFINEVAR source_virtual_t psyco_computed_bool; - - - /***************************************************************/ - /*** boolean objects meta-implementation ***/ - -#define CONVERT_TO_BOOL(vobj, vlng) \ - switch (Psyco_VerifyType(po, vobj, &PyBool_Type)) { \ - case true: /* vobj is a PyBoolObject */ \ - vlng = PsycoInt_AS_LONG(po, vobj); \ - if (vlng == NULL) \ - return NULL; \ - break; \ - case false: /* vobj is not a PyBoolObject */ \ - return pint_base2op(po, v, w, op); \ - default: /* error or promotion */ \ - return NULL; \ - } - -static vinfo_t* pbool_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, - vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_BOOL(v, a); - CONVERT_TO_BOOL(w, b); - x = op (po, a, b); - if (x != NULL) - x = PsycoBool_FROM_LONG(x); - return x; -} - -static vinfo_t* pbool_or(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pbool_base2op(po, v, w, integer_or); -} - -static vinfo_t* pbool_xor(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pbool_base2op(po, v, w, integer_xor); -} - -static vinfo_t* pbool_and(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pbool_base2op(po, v, w, integer_and); -} - - -INITIALIZATIONFN -void psy_boolobject_init(void) -{ - PyNumberMethods *m = PyBool_Type.tp_as_number; - - Psyco_DefineMeta(m->nb_or, pbool_or); - Psyco_DefineMeta(m->nb_xor, pbool_xor); - Psyco_DefineMeta(m->nb_and, pbool_and); - - INIT_SVIRTUAL(psyco_computed_bool, compute_bool, - direct_compute_bool, 0, 0, 0); -} - -#else /* !BOOLEAN_TYPE */ -INITIALIZATIONFN -void psy_boolobject_init(void) { } -#endif /* BOOLEAN_TYPE */ diff --git a/nodebox/ext/psyco/src/c/Objects/pboolobject.h b/nodebox/ext/psyco/src/c/Objects/pboolobject.h deleted file mode 100644 index 5a38914..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pboolobject.h +++ /dev/null @@ -1,56 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of boolobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_BOOLOBJECT_H -#define _PSY_BOOLOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - -#if BOOLEAN_TYPE /* Booleans were introduced in Python 2.3 */ - - -#define BOOL_ob_ival DEF_FIELD(PyBoolObject, long, ob_ival, OB_type) -#define iBOOL_OB_IVAL FIELD_INDEX(BOOL_ob_ival) -#define BOOL_TOTAL FIELDS_TOTAL(BOOL_ob_ival) - - -#define PsycoBool_Check(tp) PyType_TypeCheck(tp, &PyBool_Type) - - - /***************************************************************/ - /*** Virtual-time object builder ***/ - -/* not-yet-computed booleans */ -EXTERNVAR source_virtual_t psyco_computed_bool; - -/* !! consumes a reference to vlong. PsycoBool_FromLong() does not. */ -PSY_INLINE vinfo_t* PsycoBool_FROM_LONG(vinfo_t* vlong) -{ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_bool)); - result->array = array_new(BOOL_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyBool_Type))); - result->array->items[iBOOL_OB_IVAL] = vlong; assert_nonneg(vlong); - return result; -} -PSY_INLINE vinfo_t* PsycoBool_FromLong(vinfo_t* vlong) -{ - vinfo_incref(vlong); - return PsycoBool_FROM_LONG(vlong); -} - - -#else /* !BOOLEAN_TYPE */ -/* define the booleans as synonims for integers */ -# define PsycoBool_FROM_LONG(v) PsycoInt_FROM_LONG(v) -# define PsycoBool_FromLong(v) PsycoInt_FromLong(v) -#endif /* BOOLEAN_TYPE */ - -/* utility */ -#define PsycoBool_FromCondition(po, cc) \ - PsycoBool_FROM_LONG(psyco_vinfo_condition(po, cc)) - -#endif /* _PSY_INTOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pclassobject.c b/nodebox/ext/psyco/src/c/Objects/pclassobject.c deleted file mode 100644 index f2fe05d..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pclassobject.c +++ /dev/null @@ -1,167 +0,0 @@ -#include "pclassobject.h" -#include "ptupleobject.h" - - -DEFINEFN -vinfo_t* PsycoMethod_New(PyObject* func, vinfo_t* self, PyObject* cls) -{ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_method)); - - result->array = array_new(METHOD_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyMethod_Type))); - - Py_INCREF(func); - result->array->items[iMETHOD_IM_FUNC] = - vinfo_new(CompileTime_NewSk(sk_new((long) func, SkFlagPyObj))); - - vinfo_incref(self); - result->array->items[iMETHOD_IM_SELF] = self; - - Py_INCREF(cls); - result->array->items[iMETHOD_IM_CLASS] = - vinfo_new(CompileTime_NewSk(sk_new((long) cls, SkFlagPyObj))); - - return result; -} - - -static bool compute_method(PsycoObject* po, vinfo_t* methobj) -{ - vinfo_t* newobj; - vinfo_t* im_func; - vinfo_t* im_self; - vinfo_t* im_class; - - /* get the fields from the Python object 'methobj' */ - im_func = vinfo_getitem(methobj, iMETHOD_IM_FUNC); - if (im_func == NULL) - return false; - im_self = vinfo_getitem(methobj, iMETHOD_IM_SELF); - if (im_self == NULL) - return false; - im_class = vinfo_getitem(methobj, iMETHOD_IM_CLASS); - if (im_class == NULL) - return false; - - /* call PyMethod_New() */ - newobj = psyco_generic_call(po, PyMethod_New, - CfPure|CfReturnRef|CfPyErrIfNull, - "vvv", im_func, im_self, im_class); - if (newobj == NULL) - return false; - - /* move the resulting non-virtual Python object back into 'methobj' */ - vinfo_move(po, methobj, newobj); - return true; -} - -static PyObject* direct_compute_method(vinfo_t* methobj, char* data) -{ - PyObject* im_func; - PyObject* im_self; - PyObject* im_class; - PyObject* result = NULL; - - im_func = direct_xobj_vinfo( - vinfo_getitem(methobj, iMETHOD_IM_FUNC), data); - im_self = direct_xobj_vinfo( - vinfo_getitem(methobj, iMETHOD_IM_SELF), data); - im_class = direct_xobj_vinfo( - vinfo_getitem(methobj, iMETHOD_IM_CLASS), data); - - if (!PyErr_Occurred() && im_func != NULL) - result = PyMethod_New(im_func, im_self, im_class); - - Py_XDECREF(im_class); - Py_XDECREF(im_self); - Py_XDECREF(im_func); - return result; -} - - -DEFINEVAR source_virtual_t psyco_computed_method; - - - /***************************************************************/ - /*** instance method objects meta-implementation ***/ - - -DEFINEFN -vinfo_t* pinstancemethod_call(PsycoObject* po, vinfo_t* methobj, - vinfo_t* arg, vinfo_t* kw) -{ - vinfo_t* im_func; - vinfo_t* im_self; - vinfo_t* result; - condition_code_t cc; - - /* get the 'im_self' field from the Python object 'methobj' */ - im_self = psyco_get_const(po, methobj, METHOD_im_self); - if (im_self == NULL) - return NULL; - - cc = object_non_null(po, im_self); - if (cc == CC_ERROR) /* error or more likely promotion */ - return NULL; - - if (!runtime_condition_t(po, cc)) { - /* Unbound methods, XXX implement me */ - goto fallback; - } - else - { - int i, argcount; - vinfo_t* newarg; - if (PycException_Occurred(po)) - return NULL; - - argcount = PsycoTuple_Load(arg); - if (argcount < 0) - goto fallback; - - newarg = PsycoTuple_New(argcount+1, NULL); - vinfo_incref(im_self); - PsycoTuple_GET_ITEM(newarg, 0) = im_self; - for (i = 0; i < argcount; i++) { - vinfo_t* v = PsycoTuple_GET_ITEM(arg, i); - vinfo_incref(v); - PsycoTuple_GET_ITEM(newarg, i+1) = v; - } - arg = newarg; - } - - im_func = psyco_get_const(po, methobj, METHOD_im_func); - if (im_func == NULL) - result = NULL; - else - result = PsycoObject_Call(po, im_func, arg, kw); - vinfo_decref(arg, po); - return result; - - fallback: - return psyco_generic_call(po, PyMethod_Type.tp_call, - CfReturnRef|CfPyErrIfNull, - "vvv", methobj, arg, kw); -} - - /***************************************************************/ - /*** instances and classes ***/ - -DEF_KNOWN_RET_TYPE_3(pinstance_new, PyInstance_New, - CfReturnRef|CfPyErrIfNull, &PyInstance_Type) - - -INITIALIZATIONFN -void psy_classobject_init(void) -{ - Psyco_DefineMeta(PyMethod_Type.tp_call, pinstancemethod_call); - Psyco_DefineMeta(PyInstance_New, pinstance_new); - - INIT_SVIRTUAL(psyco_computed_method, compute_method, - direct_compute_method, - (1 << iMETHOD_IM_FUNC) | - (1 << iMETHOD_IM_SELF) | - (1 << iMETHOD_IM_CLASS), - 0, 0); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pclassobject.h b/nodebox/ext/psyco/src/c/Objects/pclassobject.h deleted file mode 100644 index 7864817..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pclassobject.h +++ /dev/null @@ -1,40 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of classobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_CLASSOBJECT_H -#define _PSY_CLASSOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -/* Instance methods */ -#define METHOD_im_func DEF_FIELD(PyMethodObject, PyObject*, im_func, OB_type) -#define METHOD_im_self DEF_FIELD(PyMethodObject, PyObject*, im_self, \ - METHOD_im_func) -#define METHOD_im_class DEF_FIELD(PyMethodObject, PyObject*, im_class, \ - METHOD_im_self) -#define iMETHOD_IM_FUNC FIELD_INDEX(METHOD_im_func) -#define iMETHOD_IM_SELF FIELD_INDEX(METHOD_im_self) -#define iMETHOD_IM_CLASS FIELD_INDEX(METHOD_im_class) -#define METHOD_TOTAL FIELDS_TOTAL(METHOD_im_class) - - -EXTERNFN vinfo_t* pinstancemethod_call(PsycoObject* po, vinfo_t* methobj, - vinfo_t* arg, vinfo_t* kw); - - - /***************************************************************/ - /*** Virtual-time object builder ***/ - -/* not-yet-computed instance method objects. Usually not computed at all, - but if it needs be, will call PyMethod_New(). */ -EXTERNVAR source_virtual_t psyco_computed_method; - -EXTERNFN -vinfo_t* PsycoMethod_New(PyObject* func, vinfo_t* self, PyObject* cls); - - -#endif /* _PSY_CLASSOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pcompactobject.c b/nodebox/ext/psyco/src/c/Objects/pcompactobject.c deleted file mode 100644 index 461410b..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pcompactobject.c +++ /dev/null @@ -1,653 +0,0 @@ -#include "compactobject.h" -#include "pcompactobject.h" -#include "../Python/pycompiler.h" -#include "ptupleobject.h" -#include "ptypeobject.h" - -#define COMPACT_impl FMUT(DEF_FIELD(PyCompactObject, compact_impl_t*, \ - k_impl, OB_type)) -#define COMPACT_data FMUT(DEF_FIELD(PyCompactObject, char*, \ - k_data, COMPACT_impl)) -#define iCOMPACT_IMPL FIELD_INDEX(COMPACT_impl) -#define iCOMPACT_DATA FIELD_INDEX(COMPACT_data) -#define COMPACT_TOTAL FIELDS_TOTAL(COMPACT_data) - -#define KDATA_AS_LONG FMUT(DEF_ARRAY(long, 0)) -#define KDATA_AS_PYOBJ FMUT(FPYREF(DEF_ARRAY(PyObject*, 0))) -#define KDATA_AS_PYOBJ_NOREF FMUT(DEF_ARRAY(PyObject*, 0)) - - -#define PSY_READ_K_DATA(vdata, on_error) do { \ - if (vdata == NULL) { \ - /* read ko->k_data */ \ - vdata = psyco_get_field(po, vk, COMPACT_data); \ - if (vdata == NULL) \ - on_error; \ - } \ - } while (0) - - - /***************************************************************/ - /*** Meta-implementation of compact_getattro ***/ - -static vinfo_t* psy_k_load_vinfo(PsycoObject* po, vinfo_t* vsrc, vinfo_t* vk, - vinfo_t** pvdata) -{ - /* duplicate a vinfo_t structure from a compact_impl_t, generating - the code to read it out of the PyCompactObject */ - int sindex; - vinfo_t* vresult; - switch (gettime(vsrc->source)) { - - case RunTime: /* read from the object's k_data */ - PSY_READ_K_DATA(*pvdata, return NULL); - sindex = getstack(vsrc->source); - if (has_rtref(vsrc->source)) { - vresult = psyco_get_nth_field(po, *pvdata, - KDATA_AS_PYOBJ, sindex / sizeof(PyObject*)); - } - else { - vresult = psyco_get_nth_field(po, *pvdata, - KDATA_AS_LONG, sindex / sizeof(long)); - } - if (!vresult) - return NULL; - break; - - case CompileTime: /* return a fresh copy of the vinfo_t */ - sk_incref(CompileTime_Get(vsrc->source)); - return vinfo_new(vsrc->source); - - default: - vresult = vinfo_new(vsrc->source); - } - if (vsrc->array != NullArray) { - int i = vsrc->array->count; - vinfo_array_grow(vresult, i); - while (--i >= 0) { - if (vsrc->array->items[i] != NULL) { - vinfo_t* v; - v = psy_k_load_vinfo(po, vsrc->array->items[i], - vk, pvdata); - if (v == NULL) { - vinfo_decref(vresult, po); - return NULL; - } - vresult->array->items[i] = v; - } - } - } - return vresult; -} - -struct source_tmp_virtual_s { - source_virtual_t sv; - PyObject* ko; -}; - -static struct source_tmp_virtual_s* stv_table_start = NULL; -static struct source_tmp_virtual_s* stv_table_next = NULL; -static struct source_tmp_virtual_s* stv_table_stop = NULL; - -static bool compute_stv_never(PsycoObject* po, vinfo_t* vk) -{ - psyco_fatal_msg("compute_stv_never"); - return true; -} - -PSY_INLINE struct source_tmp_virtual_s* malloc_stv(PyObject* ko) -{ - /* this leaks, but we try to minimize the impact by alloc'ing - blocks and doing some sharing */ - struct source_tmp_virtual_s* p; - for (p = stv_table_start; p != stv_table_next; p++) { - if (p->ko == ko) - return p; - } - if (p == stv_table_stop) { - p = (struct source_tmp_virtual_s*) malloc( - 64 * sizeof(struct source_tmp_virtual_s*)); - if (!p) - OUT_OF_MEMORY(); - stv_table_start = p; - stv_table_stop = p + 64; - } - INIT_SVIRTUAL_NOCALL(p->sv, compute_stv_never, 0); - p->ko = ko; - stv_table_next = p + 1; - return p; -} - -static compact_impl_t* pcompact_getimpl(PsycoObject* po, vinfo_t* vk) -{ - /* The problem is to promote the vimpl read out of vk. - To be promotable it must be temporarily stored in vk->array. - However, we cannot store a run-time vimpl in a compile-time vk. - Ideally, this restriction should be lifted, but this - would need a careful review of a lot of code and a lot - of testing :-( - Instead, this is done by temporarily turning the compile-time - vk into a virtual-time value. */ - - long l; - vinfo_t* vimpl; - struct source_tmp_virtual_s* stv; - vinfo_t* vtype; - source_known_t* sk; - - vimpl = vinfo_getitem(vk, iCOMPACT_IMPL); - if (vimpl == NULL) { - /* initial case */ - vimpl = psyco_get_field(po, vk, COMPACT_impl); - if (vimpl == NULL) - return NULL; - extra_assert(is_runtime(vimpl->source)); /* freshly read */ - if (is_compiletime(vk->source)) { - /* CompileTime -> VirtualTime */ - /* leaks stv. */ - sk = CompileTime_Get(vk->source); - stv = malloc_stv((PyObject*) sk->value); - sk_decref(sk); - vk->source = VirtualTime_New(&stv->sv); - - /* store the type as a constant in vk->array */ - vtype = vinfo_new(CompileTime_New( - (long)(stv->ko->ob_type))); - vinfo_setitem(po, vk, iOB_TYPE, vtype); - } - /* temporarily store vimpl in vk->array */ - vinfo_setitem(po, vk, iCOMPACT_IMPL, vimpl); - l = psyco_atcompiletime(po, vimpl); - psyco_assert(l == -1); /* must be promoting here */ - return NULL; - } - else { - /* case 2: resuming after promotion */ - psyco_assert(is_compiletime(vimpl->source)); - /* remove vimpl after promotion */ - l = CompileTime_Get(vimpl->source)->value; - vinfo_setitem(po, vk, iCOMPACT_IMPL, NULL); - if (is_virtualtime(vk->source)) { - /* VirtualTime -> CompileTime */ - /* XXX fix this if virtual compactobjects - are introduced! */ - stv = ((struct source_tmp_virtual_s*) - VirtualTime_Get(vk->source)); - vk->source = CompileTime_New((long) stv->ko); - } - return (compact_impl_t*) l; - } -} - -static vinfo_t* pcompact_getattro(PsycoObject* po, vinfo_t* vk, vinfo_t* vattr) -{ - PyTypeObject* tp; - PyObject* descr = NULL; - descrgetfunc f = NULL; - compact_impl_t* impl; - vinfo_t* vresult = NULL; - PyObject* name; - - /* don't try to optimize non-constant attribute names - (see explanation in PsycoObject_GenericGetAttr()) */ - if (!is_compiletime(vattr->source)) { - return psyco_generic_call(po, PyCompact_Type.tp_getattro, - CfReturnRef|CfPyErrIfNull, - "vv", vk, vattr); - } - - /* we need the type of 'obj' at compile-time */ - tp = (PyTypeObject*) Psyco_NeedType(po, vk); - if (tp == NULL) - return NULL; - - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) { - psyco_virtualize_exception(po); - return NULL; - } - } - - /* use interned strings only */ - name = (PyObject*) CompileTime_Get(vattr->source)->value; - Py_INCREF(name); - K_INTERN(name); - - /* XXX this is broken in the same way as PsycoObject_GenericGetAttr() */ - descr = _PyType_Lookup(tp, name); - if (descr != NULL) { - Py_INCREF(descr); - if (PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { - f = descr->ob_type->tp_descr_get; - if (f != NULL && PyDescr_IsData(descr)) { - vresult = Psyco_META3(po, f, - CfReturnRef|CfPyErrIfNull, - "lvl", descr, vk, tp); - goto done; - } - } - } - - /* read and temporarily promote the k_impl field of the object */ - impl = pcompact_getimpl(po, vk); - if (impl == NULL) - goto done; - - while (impl->attrname != NULL) { - if (impl->attrname == name) { - /* read the attribute data from the object and build a - copy of the attribute's vinfo to reflect the position - of the loaded data in the processor registers */ - vinfo_t* vdata = NULL; - vresult = psy_k_load_vinfo(po, impl->vattr, vk, &vdata); - vinfo_xdecref(vdata, po); - goto done; - } - impl = impl->parent; - } - - /* The end of PyObject_GenericGetAttr() */ - if (f != NULL) { - vresult = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, - "lvl", descr, vk, tp); - goto done; - } - - if (descr != NULL) { - source_known_t* sk = sk_new((long) descr, SkFlagPyObj); - descr = NULL; - vresult = vinfo_new(CompileTime_NewSk(sk)); - goto done; - } - - PycException_SetFormat(po, PyExc_AttributeError, - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(name)); - done: - Py_XDECREF(descr); - Py_DECREF(name); - return vresult; -} - - - /***************************************************************/ - /*** Meta-implementation of compact_setattro ***/ - -static void psy_k_mark_references(vinfo_t* v, bool mark) -{ - long pyobj_mask; - switch (gettime(v->source)) { - - case VirtualTime: - pyobj_mask = VirtualTime_Get(v->source)->pyobject_mask; - break; - - case RunTime: - if (mark) - v->source = add_rtref(v->source); - /* fall through */ - default: - pyobj_mask = 0; - } - - if (v->array != NullArray) { - int i = v->array->count; - while(--i >= 0) { - vinfo_t* a = v->array->items[i]; - if (a != NULL) - psy_k_mark_references(a, pyobj_mask & 1); - pyobj_mask >>= 1; - } - } -} - -static bool psy_k_store_vinfo(PsycoObject* po, vinfo_t* source_vi, - vinfo_t* attr_vi, vinfo_t* vk, vinfo_t** pvdata) -{ - /* generate code that writes 'source_vi' into the raw 'vdata' - using the format described by 'attr_vi' */ - int sindex; - bool result; - extra_assert(gettime(source_vi->source) == gettime(attr_vi->source)); - - if (attr_vi->array != NullArray) { - int i = attr_vi->array->count; - while (--i >= 0) { - if (attr_vi->array->items[i] == NULL) - continue; - extra_assert(source_vi->array->count > i); - result = psy_k_store_vinfo(po, - source_vi->array->items[i], - attr_vi->array->items[i], - vk, pvdata); - if (!result) - return false; - } - } - - if (!is_runtime(attr_vi->source)) - return true; - PSY_READ_K_DATA(*pvdata, return false); - sindex = getstack(attr_vi->source); - if (has_rtref(attr_vi->source)) { - result = psyco_put_nth_field(po, *pvdata, - KDATA_AS_PYOBJ, sindex / sizeof(PyObject*), - source_vi); - } - else { - result = psyco_put_nth_field(po, *pvdata, - KDATA_AS_LONG, sindex / sizeof(long), - source_vi); - } - return result; -} - -static bool psy_k_decref_objects(PsycoObject* po, vinfo_t* attr_vi, - vinfo_t* vk, vinfo_t** pvdata) -{ - if (has_rtref(attr_vi->source)) { - vinfo_t* v; - int sindex = getstack(attr_vi->source); - PSY_READ_K_DATA(*pvdata, return false); - v = psyco_get_nth_field(po, *pvdata, KDATA_AS_PYOBJ_NOREF, - sindex / sizeof(PyObject*)); - if (v == NULL) - return false; - v->source = add_rtref(v->source); /* 'v' stole the reference - from the object */ - vinfo_decref(v, po); - } - if (attr_vi->array != NullArray) { - int i = attr_vi->array->count; - while (--i >= 0) { - if (attr_vi->array->items[i] != NULL && - !psy_k_decref_objects(po, attr_vi->array->items[i], - vk, pvdata)) - return false; - } - } - return true; -} - -static bool pcompact_setattro(PsycoObject* po, vinfo_t* vk, PyObject* attr, - vinfo_t* source_vi) -{ - PyTypeObject* tp; - PyObject* descr; - descrsetfunc f; - vinfo_t* vimpl; - compact_impl_t* impl; - compact_impl_t* k_impl; - vinfo_t* vcopy; - condition_code_t cc; - vinfo_array_t a; - vinfo_t* vdata = NULL; - vinfo_t* vndata; - vinfo_t* v1; - vinfo_t* v2; - bool ok; - int smin, smax, s, s1, s2; - - /* we need the type of 'obj' at compile-time */ - tp = (PyTypeObject*) Psyco_NeedType(po, vk); - if (tp == NULL) - return false; - - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) { - psyco_virtualize_exception(po); - return false; - } - } - - /* XXX this is broken in the same way as PsycoObject_GenericGetAttr() */ - descr = _PyType_Lookup(tp, attr); - if (descr != NULL && - PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { - f = descr->ob_type->tp_descr_set; - if (f != NULL && PyDescr_IsData(descr)) { - Py_INCREF(descr); /* XXX leaks */ - return Psyco_META3(po, f, - CfNoReturnValue|CfPyErrIfNonNull, - source_vi ? "lvv" : "lvl", - descr, vk, source_vi) != NULL; - } - } - - if (source_vi != NULL) { - /* force mutable virtual-time objects out of virtual-time, - and limit the virtual depth a bit */ - a.count = 1; - a.items[0] = source_vi; - if (!psyco_forking(po, &a)) - return false; - clear_tmp_marks(&a); - psyco_simplify_array(&a, po); - } - - /* read and temporarily promote the k_impl field of the object */ - k_impl = pcompact_getimpl(po, vk); - if (k_impl == NULL) - return false; - - for (impl = k_impl; impl->attrname != NULL; impl = impl->parent) { - if (impl->attrname != attr) - continue; - if (!psy_k_decref_objects(po, impl->vattr, vk, &vdata)) - goto error; - if (k_match_vinfo(source_vi, impl->vattr)) { - /* the attr already has the correct format */ - if (!psy_k_store_vinfo(po, source_vi, impl->vattr, - vk, &vdata)) - goto error; - vinfo_xdecref(vdata, po); - return true; - } - /* a format change is needed: first delete the - * existing attribute. - * XXX same restrictions as in compact_setattro(). - * XXX it's already far too scary. - */ - smin = impl->datasize; - smax = 0; - k_attribute_range(impl->vattr, &smin, &smax); - if (smax < smin) - smax = smin; - - /* data between smin and smax is removed */ - if (smin < smax && smax < k_impl->datasize) { - PSY_READ_K_DATA(vdata, return false); - extra_assert((smin % sizeof(long)) == 0); - extra_assert((smax % sizeof(long)) == 0); - extra_assert((k_impl->datasize % sizeof(long)) == 0); - if (k_impl->datasize-smax <= 5*sizeof(long)) { - s1 = smax/sizeof(long); - s2 = k_impl->datasize/sizeof(long); - for (s=s1; sdatasize-smax) - != NULL; - vinfo_decref(v2, po); - vinfo_decref(v1, po); - if (!ok) - goto error; - } - } - - /* make the new 'impl' by starting from impl->parent - and accounting for all following attrs excluding - 'impl', shifted as per memmove() */ - impl = k_duplicate_impl(impl->parent, impl, - k_impl, smin - smax); - - if (source_vi != NULL) - goto store_data; /* now, re-create the attr - under its new format */ - - goto update_k_impl; /* if attribute deletion: done */ - } - - if (source_vi == NULL) { - /* deleting a non-existing attribute */ - return psyco_generic_call(po, PyObject_GenericSetAttr, - CfNoReturnValue|CfPyErrIfNonNull, - "vll", vk, attr, (long) NULL) != NULL; - } - - /* setting a new attribute */ - impl = k_impl; - - /* XXX Psyco's error handling on top of Python's error handling code - is the best recipe for scary sources */ - - store_data: - vcopy = vinfo_copy_no_share(source_vi); - psy_k_mark_references(vcopy, true); - impl = k_extend_impl(impl, attr, vcopy); - vinfo_decref(vcopy, NULL); - - /* generate the operations of PyCompact_Extend() in-line: */ - if (impl->datasize <= K_ROUNDUP(k_impl->datasize)) { - /* already enough space */ - } - else { - PSY_READ_K_DATA(vdata, return false); - - /* call PyMem_Realloc() on k->k_data */ - vndata = psyco_generic_call(po, PyMem_Realloc, CfReturnNormal, - "vl", vdata, - K_ROUNDUP(impl->datasize)); - if (vndata == NULL) - goto error; - vinfo_decref(vdata, po); - vdata = vndata; - /* did PyMem_Realloc() return NULL? */ - cc = integer_non_null(po, vdata); - if (cc == CC_ERROR) - goto error; - if (!runtime_condition_t(po, cc)) { - /* yes -> raise a MemoryError */ - PycException_SetVInfo(po, PyExc_MemoryError, - psyco_vi_None()); - goto error; - } - /* store the result of PyMem_Realloc() back into - ko->k_data */ - if (!psyco_put_field(po, vk, COMPACT_data, vdata)) - goto error; - } - /* store 'v' into the newly allocated data */ - if (!psy_k_store_vinfo(po, source_vi, impl->vattr, vk, &vdata)) - goto error; - - /* update ko->k_impl with the extended compact_impl_t */ - update_k_impl: - vinfo_xdecref(vdata, po); - vimpl = vinfo_new(CompileTime_New((long) impl)); - ok = psyco_put_field(po, vk, COMPACT_impl, vimpl); - vinfo_decref(vimpl, po); - return ok; - - error: - vinfo_xdecref(vdata, po); - return false; -} - - - /***************************************************************/ - /*** More meta-implementations ***/ - -static vinfo_t* pcompact_new(PsycoObject* po, PyTypeObject* type, - vinfo_t* vargs, vinfo_t* vkwds) -{ - /* first delegate to object_new() */ - bool ok; - vinfo_t* vimpl; - vinfo_t* vk = psyco_pobject_new(po, type, vargs, vkwds); - if (vk != NULL) { - extra_assert(Psyco_KnownType(vk) == type); - vimpl = vinfo_new(CompileTime_New((long) PyCompact_EmptyImpl)); - ok = psyco_put_field(po, vk, COMPACT_impl, vimpl); - vinfo_decref(vimpl, po); - if (!ok) { - vinfo_decref(vk, po); - return NULL; - } - } - return vk; -} - - - /***************************************************************/ - /*** Virtual-time compact objects ***/ - -/* A compact object allocated in the heap contains raw data and a pointer - to a compact_impl_t structure that may describe that some of this raw - data represents further virtual-time objects. This is implemented in - compactobject.c and optimized in pcompact_getattro/pcompact_setattro - above the present point. - - This section implements a further optimization: compact objects that - are not yet allocated in the heap at all. This only applies to - newly created compact objects. - - XXX NOT DONE YET -*/ - -#if 0 -static source_virtual_t psyco_computed_compact; - -static -vinfo_t* PsycoCompactObject_New(PyTypeObject* tp) -{ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_compact)); - result->array = array_new(COMPACT_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long) tp)); - result->array->items[iCOMPACT_IMPL] = - vinfo_new(CompileTime_New((long) &k_empty_impl)); - result->array->items[iCOMPACT_DATA] = psyco_vi_Zero(); - - vinfo_incref(self); - result->array->items[iMETHOD_IM_SELF] = self; - - Py_INCREF(cls); - result->array->items[iMETHOD_IM_CLASS] = - vinfo_new(CompileTime_NewSk(sk_new((long) cls, SkFlagPyObj))); - - return result; -} -#endif - - /***************************************************************/ - -INITIALIZATIONFN -void psy_compactobject_init(void) -{ - Psyco_DefineMeta(PyCompact_Type.tp_getattro, pcompact_getattro); - Psyco_DefineMeta(PyCompact_Type.tp_setattro, pcompact_setattro); - Psyco_DefineMeta(PyCompact_Type.tp_new, pcompact_new); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pcompactobject.h b/nodebox/ext/psyco/src/c/Objects/pcompactobject.h deleted file mode 100644 index 03d5f85..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pcompactobject.h +++ /dev/null @@ -1,18 +0,0 @@ - /***************************************************************/ -/*** Meta-version of compactobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_COMPACTOBJECT_H -#define _PSY_COMPACTOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -/***************************************************************/ - /* virtual compact objects. */ -/*EXTERNFN vinfo_t* PsycoCompact_New(PsycoObject* po); - XXX to do */ - -#endif /* _PSY_COMPACTOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pdescrobject.c b/nodebox/ext/psyco/src/c/Objects/pdescrobject.c deleted file mode 100644 index 2e6b198..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pdescrobject.c +++ /dev/null @@ -1,58 +0,0 @@ -#include "../psyfunc.h" -#include "pdescrobject.h" -#include "pstructmember.h" -#include "pmethodobject.h" - - -static vinfo_t* pmember_get(PsycoObject* po, PyMemberDescrObject* descr, - vinfo_t* obj, PyTypeObject *type) -{ - /* a meta-implementation for member_get() of descrobject.c. - Note that not all parameters are 'vinfo_t*'; only 'obj' - is. This is because PsycoObject_GenericGetAttr() gives - immediate values for the other two arguments. */ - - /* XXX We assume that 'obj' is a valid instance of 'type'. */ - return PsycoMember_GetOne(po, obj, descr->d_member); -} - -static vinfo_t* pmethod_get(PsycoObject* po, PyMethodDescrObject* descr, - vinfo_t* obj, PyTypeObject *type) -{ - /* a meta-implementation for method_get() of descrobject.c. - Same remarks as for pmember_get(). */ - return PsycoCFunction_New(po, descr->d_method, obj); -} - - -INITIALIZATIONFN -void psy_descrobject_init(void) -{ - PyObject* dummy; - PyTypeObject* PyMemberDescr_Type; - PyTypeObject* PyMethodDescr_Type; - PyMemberDef dummydef; - PyMethodDef dummydef2; - - /* Member descriptors */ - /* any better way to get a pointer to PyMemberDescr_Type? */ - memset(&dummydef, 0, sizeof(dummydef)); - dummydef.name = "dummy"; - dummy = PyDescr_NewMember(&PsycoFunction_Type, &dummydef); - PyMemberDescr_Type = dummy->ob_type; - Py_DECREF(dummy); - - Psyco_DefineMeta(PyMemberDescr_Type->tp_descr_get, - pmember_get); - - /* C Method descriptors */ - /* any better way to get a pointer to PyMethodDescr_Type? */ - memset(&dummydef2, 0, sizeof(dummydef2)); - dummydef2.ml_name = "dummy"; - dummy = PyDescr_NewMethod(&PsycoFunction_Type, &dummydef2); - PyMethodDescr_Type = dummy->ob_type; - Py_DECREF(dummy); - - Psyco_DefineMeta(PyMethodDescr_Type->tp_descr_get, - pmethod_get); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pdescrobject.h b/nodebox/ext/psyco/src/c/Objects/pdescrobject.h deleted file mode 100644 index e374c21..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pdescrobject.h +++ /dev/null @@ -1,13 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of descrobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_DESCROBJECT_H -#define _PSY_DESCROBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -#endif /* _PSY_DESCROBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pdictobject.c b/nodebox/ext/psyco/src/c/Objects/pdictobject.c deleted file mode 100644 index c639c7c..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pdictobject.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "pdictobject.h" - - -#define DICT_ma_used FMUT(DEF_FIELD(PyDictObject, int, ma_used, OB_type)) -#define iDICT_MA_USED FIELD_INDEX(DICT_ma_used) - -DEFINEFN -vinfo_t* PsycoDict_New(PsycoObject* po) -{ - /* XXX no virtual dicts yet */ - vinfo_t* v = psyco_generic_call(po, PyDict_New, - CfReturnRef|CfPyErrIfNull, ""); - if (v == NULL) - return NULL; - - /* the result is a dict */ - Psyco_AssertType(po, v, &PyDict_Type); - return v; -} - -DEFINEFN -vinfo_t* PsycoDict_Copy(PsycoObject* po, vinfo_t* orig) -{ - vinfo_t* v = psyco_generic_call(po, PyDict_Copy, - CfReturnRef|CfPyErrIfNull, - "v", orig); - if (v == NULL) - return NULL; - - /* the result is a dict */ - Psyco_AssertType(po, v, &PyDict_Type); - return v; -} - -DEFINEFN -bool PsycoDict_SetItem(PsycoObject* po, vinfo_t* vdict, - PyObject* key, vinfo_t* vvalue) -{ - return psyco_generic_call(po, PyDict_SetItem, - CfNoReturnValue|CfPyErrIfNeg, - "vlv", vdict, (long) key, vvalue) != NULL; -} - -static vinfo_t* psyco_dict_length(PsycoObject* po, vinfo_t* vi) -{ - return psyco_get_field(po, vi, DICT_ma_used); -} - - -INITIALIZATIONFN -void psy_dictobject_init(void) -{ - PyMappingMethods *m = PyDict_Type.tp_as_mapping; - Psyco_DefineMeta(m->mp_length, psyco_dict_length); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pdictobject.h b/nodebox/ext/psyco/src/c/Objects/pdictobject.h deleted file mode 100644 index 2f64b03..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pdictobject.h +++ /dev/null @@ -1,19 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of dictobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_DICTOBJECT_H -#define _PSY_DICTOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -EXTERNFN vinfo_t* PsycoDict_New(PsycoObject* po); -EXTERNFN vinfo_t* PsycoDict_Copy(PsycoObject* po, vinfo_t* orig); -EXTERNFN bool PsycoDict_SetItem(PsycoObject* po, vinfo_t* vdict, - PyObject* key, vinfo_t* vvalue); - - -#endif /* _PSY_LISTOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pfloatobject.c b/nodebox/ext/psyco/src/c/Objects/pfloatobject.c deleted file mode 100644 index 4544020..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pfloatobject.c +++ /dev/null @@ -1,599 +0,0 @@ -#include "pfloatobject.h" -#include "plongobject.h" -#include "pboolobject.h" - -#if HAVE_FP_FN_CALLS - -#ifdef WANT_SIGFPE_HANDLER -# define CF_PURE_FP_HELPER (CfPure|CfNoReturnValue|CfPyErrIfNonNull) -#else -# define CF_PURE_FP_HELPER (CfPure|CfNoReturnValue) -#endif - -static int -cimpl_fp_cmp(double a, double b) { - return (a < b) ? -1 : (a > b) ? 1 : 0; -} - -/* XXX the following is only valid if sizeof(long) < sizeof(double). - See Python 2.4's PyFloat_Type.tp_richcompare() */ -static int cimpl_fp_eq_int(double a, long b) { return a == (double) b; } -static int cimpl_fp_ne_int(double a, long b) { return a != (double) b; } -static int cimpl_fp_le_int(double a, long b) { return a <= (double) b; } -static int cimpl_fp_lt_int(double a, long b) { return a < (double) b; } -static int cimpl_fp_ge_int(double a, long b) { return a >= (double) b; } -static int cimpl_fp_gt_int(double a, long b) { return a > (double) b; } - -static int cimpl_fp_eq_fp(double a, double b) { return a == b; } -static int cimpl_fp_ne_fp(double a, double b) { return a != b; } -static int cimpl_fp_le_fp(double a, double b) { return a <= b; } -static int cimpl_fp_lt_fp(double a, double b) { return a < b; } - -static int -cimpl_fp_add(double a, double b, double* result) { - PyFPE_START_PROTECT("add", return -1) - *result = a + b; - PyFPE_END_PROTECT(*result) - return 0; -} - -static int -cimpl_fp_sub(double a, double b, double* result) { - PyFPE_START_PROTECT("subtract", return -1) - *result = a - b; - PyFPE_END_PROTECT(*result) - return 0; -} - - -static int -cimpl_fp_mul(double a, double b, double* result) { - PyFPE_START_PROTECT("multiply", return -1) - *result = a * b; - PyFPE_END_PROTECT(*result) - return 0; -} - -static int -cimpl_fp_div(double a, double b, double* result) { - if (b == 0.0) { - PyErr_SetString(PyExc_ZeroDivisionError, "float division"); - return -1; - } - PyFPE_START_PROTECT("divide", return -1) - *result = a / b; - PyFPE_END_PROTECT(*result) - return 0; -} - -static int -cimpl_fp_pow(double iv, double iw, double* result) { - double ix; - /* Sort out special cases here instead of relying on pow() */ - if (iw == 0) { /* v**0 is 1, even 0**0 */ - *result = 1.0; - return 0; - } - if (iv == 0.0) { /* 0**w is error if w<0, else 0 */ - if (iw < 0.0) { - PyErr_SetString(PyExc_ZeroDivisionError, - "0.0 cannot be raised to a negative power"); - return -1; - } - *result = 0.0; - return 0; - } - if (iv < 0.0) { - /* Whether this is an error is a mess, and bumps into libm - * bugs so we have to figure it out ourselves. - */ - if (iw != floor(iw)) { - PyErr_SetString(PyExc_ValueError, "negative number " - "cannot be raised to a fractional power"); - return -1; - } - /* iw is an exact integer, albeit perhaps a very large one. - * -1 raised to an exact integer should never be exceptional. - * Alas, some libms (chiefly glibc as of early 2003) return - * NaN and set EDOM on pow(-1, large_int) if the int doesn't - * happen to be representable in a *C* integer. That's a - * bug; we let that slide in math.pow() (which currently - * reflects all platform accidents), but not for Python's **. - */ - if (iv == -1.0 && !Py_IS_INFINITY(iw) && iw == iw) { - /* XXX the "iw == iw" was to weed out NaNs. This - * XXX doesn't actually work on all platforms. - */ - /* Return 1 if iw is even, -1 if iw is odd; there's - * no guarantee that any C integral type is big - * enough to hold iw, so we have to check this - * indirectly. - */ - ix = floor(iw * 0.5) * 2.0; - *result = ix == iw ? 1.0 : -1.0; - return 0; - } - /* Else iv != -1.0, and overflow or underflow are possible. - * Unless we're to write pow() ourselves, we have to trust - * the platform to do this correctly. - */ - } - errno = 0; - PyFPE_START_PROTECT("pow", return -1) - ix = pow(iv, iw); - PyFPE_END_PROTECT(ix) -#ifdef Py_ADJUST_ERANGE1 - Py_ADJUST_ERANGE1(ix); -#else -# ifdef Py_SET_ERANGE_IF_OVERFLOW - Py_SET_ERANGE_IF_OVERFLOW(ix); -# endif -#endif - if (errno != 0) { - /* We don't expect any errno value other than ERANGE, but - * the range of libm bugs appears unbounded. - */ - PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError : - PyExc_ValueError); - return -1; - } - *result = ix; - return 0; -} - -static int -cimpl_fp_nonzero(double a) { - return (a != 0); -} - -static void -cimpl_fp_neg(double a, double* result) { - *result = -a; -} - -static void -cimpl_fp_abs(double a, double* result) { - *result = fabs(a); -} - - -DEFINEFN void -cimpl_fp_from_long(long value, double* result) -{ - *result = value; -} - -DEFINEFN void -cimpl_fp_from_float(float value, double* result) -{ - *result = value; -} - - -DEFINEFN -vinfo_t* PsycoFloat_FromFloat(PsycoObject* po, vinfo_t* vfloat) -{ - vinfo_t* x; - vinfo_array_t* result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_from_float, CfNoReturnValue|CfPure, - "va", vfloat, result); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; -} - -DEFINEFN -bool PsycoFloat_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** result_1, vinfo_t** result_2) -{ - PyNumberMethods *nb; - PyTypeObject* tp; - - tp = Psyco_NeedType(po, v); - if (tp == NULL) - return false; - - if (PsycoFloat_Check(tp)) { - *result_1 = PsycoFloat_AS_DOUBLE_1(po, v); - *result_2 = PsycoFloat_AS_DOUBLE_2(po, v); - if (*result_1 == NULL || *result_2 == NULL) - return false; - vinfo_incref(*result_1); - vinfo_incref(*result_2); - return true; - } - - if ((nb = tp->tp_as_number) == NULL || nb->nb_float == NULL) { - PycException_SetString(po, PyExc_TypeError, - "a float is required"); - return false; - } - - v = Psyco_META1(po, nb->nb_float, - CfReturnRef|CfPyErrIfNull, - "v", v); - if (v == NULL) - return false; - - /* silently assumes the result is a float object */ - *result_1 = PsycoFloat_AS_DOUBLE_1(po, v); - *result_2 = PsycoFloat_AS_DOUBLE_2(po, v); - if (*result_1 == NULL || *result_2 == NULL) { - vinfo_decref(v, po); - return false; - } - vinfo_incref(*result_1); - vinfo_incref(*result_2); - vinfo_decref(v, po); - return true; -} - -static bool compute_float(PsycoObject* po, vinfo_t* floatobj) -{ - vinfo_t* newobj; - vinfo_t* first_half; - vinfo_t* second_half; - - /* get the field 'ob_fval' from the Python object 'floatobj' */ - first_half = vinfo_getitem(floatobj, iFLOAT_OB_FVAL+0); - second_half = vinfo_getitem(floatobj, iFLOAT_OB_FVAL+1); - if (first_half == NULL || second_half == NULL) - return false; - - /* call PyFloat_FromDouble() */ - newobj = psyco_generic_call(po, PyFloat_FromDouble, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", first_half, second_half); - - if (newobj == NULL) - return false; - - /* move the resulting non-virtual Python object back into 'floatobj' */ - vinfo_move(po, floatobj, newobj); - return true; -} - -static PyObject* direct_compute_float(vinfo_t* floatobj, char* data) -{ - double value; - long* vl = (long*) &value; - extra_assert(sizeof(double) == 2*sizeof(long)); - vl[0] = direct_read_vinfo(vinfo_getitem(floatobj, iINT_OB_IVAL+0), data); - vl[1] = direct_read_vinfo(vinfo_getitem(floatobj, iINT_OB_IVAL+1), data); - if (PyErr_Occurred()) - return NULL; - return PyFloat_FromDouble(value); -} - - -DEFINEVAR source_virtual_t psyco_computed_float; - - - /***************************************************************/ - /*** float objects meta-implementation ***/ - - -#define CONVERT_TO_DOUBLE_CORE(vobj, v1, v2, ERRORACTION) \ - switch (psyco_convert_to_double(po, vobj, &v1, &v2)) { \ - case true: \ - break; /* fine */ \ - case false: \ - return ERRORACTION; /* error or promotion */ \ - default: \ - ERRORACTION; \ - return psyco_vi_NotImplemented(); /* cannot do it */ \ - } - -#define CONVERT_TO_DOUBLE(vobj, v1, v2) \ - CONVERT_TO_DOUBLE_CORE(vobj, v1, v2, return_null()) - -#define CONVERT_TO_DOUBLE2(uobj, u1, u2, vobj, v1, v2) \ - CONVERT_TO_DOUBLE_CORE(uobj, u1, u2, return_null()); \ - CONVERT_TO_DOUBLE_CORE(vobj, v1, v2, release_double(po, u1, u2)) - -#define RELEASE_DOUBLE(v1, v2) \ - vinfo_decref(v1, po); \ - vinfo_decref(v2, po); - -#define RELEASE_DOUBLE2(v1, v2, u1, u2) \ - vinfo_decref(v1, po); \ - vinfo_decref(v2, po); \ - vinfo_decref(u1, po); \ - vinfo_decref(u2, po); - -static vinfo_t* release_double(PsycoObject* po, vinfo_t* u1, vinfo_t* u2) { - vinfo_decref(u1, po); - vinfo_decref(u2, po); - return NULL; -} - -static vinfo_t* return_null(void) { - return NULL; -} - - -DEFINEFN -int psyco_convert_to_double(PsycoObject* po, vinfo_t* vobj, - vinfo_t** pv1, vinfo_t** pv2) -{ - /* TypeSwitch */ - PyTypeObject* vtp = Psyco_NeedType(po, vobj); - if (vtp == NULL) - return false; - - if (PyType_TypeCheck(vtp, &PyInt_Type)) { - vinfo_array_t* result = array_new(2); - psyco_generic_call(po, cimpl_fp_from_long, CfNoReturnValue|CfPure, - "va", PsycoInt_AS_LONG(po, vobj), result); - *pv1 = result->items[0]; - *pv2 = result->items[1]; - array_release(result); - return true; - } - if (PyType_TypeCheck(vtp, &PyLong_Type)) { - return PsycoLong_AsDouble(po, vobj, pv1, pv2); - } - if (PyType_TypeCheck(vtp, &PyFloat_Type)) { - *pv1 = PsycoFloat_AS_DOUBLE_1(po, vobj); - *pv2 = PsycoFloat_AS_DOUBLE_2(po, vobj); - if (*pv1 == NULL || *pv2 == NULL) - return false; - vinfo_incref(*pv1); - vinfo_incref(*pv2); - return true; - } - return -1; /* cannot do it */ -} - -static vinfo_t* pfloat_cmp(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - /* Python < 2.4 */ - vinfo_t *a1, *a2, *b1, *b2, *x; - /* We could probably assume that these are floats, but using CONVERT is easier */ - CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); - x = psyco_generic_call(po, cimpl_fp_cmp, CfPure|CfReturnNormal, "vvvv", a1, a2, b1, b2); - RELEASE_DOUBLE2(a1, a2, b1, b2); - return x; -} - -static vinfo_t* pfloat_richcompare(PsycoObject* po, vinfo_t* v, - vinfo_t* w, int op) -{ - /* Python >= 2.4 */ - /* TypeSwitch */ - PyTypeObject* wtp; - vinfo_t *a1, *a2, *b1, *b2, *r; - void* fn; - - wtp = Psyco_NeedType(po, w); - if (wtp == NULL) - return NULL; - - extra_assert(Psyco_KnownType(v) != NULL); - extra_assert(PsycoFloat_Check(Psyco_KnownType(v))); - a1 = PsycoFloat_AS_DOUBLE_1(po, v); - a2 = PsycoFloat_AS_DOUBLE_2(po, v); - if (a1 == NULL || a2 == NULL) - return NULL; - - if (PyType_TypeCheck(wtp, &PyInt_Type)) { - switch (op) { - case Py_EQ: fn = cimpl_fp_eq_int; break; - case Py_NE: fn = cimpl_fp_ne_int; break; - case Py_LE: fn = cimpl_fp_le_int; break; - case Py_GE: fn = cimpl_fp_ge_int; break; - case Py_LT: fn = cimpl_fp_lt_int; break; - case Py_GT: fn = cimpl_fp_gt_int; break; - default: Py_FatalError("bad richcmp op"); return NULL; - } - r = psyco_generic_call(po, fn, CfReturnNormal|CfPure, - "vvv", a1, a2, PsycoInt_AS_LONG(po, w)); - if (r != NULL) - r = PsycoBool_FROM_LONG(r); - return r; - } - if (PyType_TypeCheck(wtp, &PyLong_Type)) { - /* fall back */ - return psyco_generic_call(po, PyFloat_Type.tp_richcompare, - CfReturnRef|CfPure, - "vvl", v, w, op); - } - if (PyType_TypeCheck(wtp, &PyFloat_Type)) { - b1 = PsycoFloat_AS_DOUBLE_1(po, w); - b2 = PsycoFloat_AS_DOUBLE_2(po, w); - if (b1 == NULL || b2 == NULL) - return NULL; -#define SWAP_A_B r=a1; a1=b1; b1=r; r=a2; a2=b2; b2=r - switch (op) { - case Py_EQ: fn = cimpl_fp_eq_fp; break; - case Py_NE: fn = cimpl_fp_ne_fp; break; - case Py_LE: fn = cimpl_fp_le_fp; break; - case Py_GE: fn = cimpl_fp_le_fp; SWAP_A_B; break; - case Py_LT: fn = cimpl_fp_lt_fp; break; - case Py_GT: fn = cimpl_fp_lt_fp; SWAP_A_B; break; - default: Py_FatalError("bad richcmp op"); return NULL; - } -#undef SWAP_A_B - r = psyco_generic_call(po, fn, CfReturnNormal|CfPure, - "vvvv", a1, a2, b1, b2); - if (r != NULL) - r = PsycoBool_FROM_LONG(r); - return r; - } - - return psyco_vi_NotImplemented(); /* cannot do it */ -} - -static vinfo_t* pfloat_nonzero(PsycoObject* po, vinfo_t* v) -{ - vinfo_t *a1, *a2; - /* Assume that this is a float */ - a1 = PsycoFloat_AS_DOUBLE_1(po, v); - a2 = PsycoFloat_AS_DOUBLE_2(po, v); - if (a1 == NULL || a2 == NULL) - return NULL; - return psyco_generic_call(po, cimpl_fp_nonzero, CfPure|CfReturnNormal, "vv", a1, a2); -} - -static vinfo_t* pfloat_pos(PsycoObject* po, vinfo_t* v) -{ - vinfo_t *a1, *a2, *x; - CONVERT_TO_DOUBLE(v, a1, a2); - x = PsycoFloat_FromDouble(a1, a2); - RELEASE_DOUBLE(a1, a2); - return x; -} - - -static vinfo_t* pfloat_neg(PsycoObject* po, vinfo_t* v) -{ - vinfo_t *a1, *a2, *x; - vinfo_array_t* result; - CONVERT_TO_DOUBLE(v, a1, a2); - result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_neg, CfPure|CfNoReturnValue, - "vva", a1, a2, result); - RELEASE_DOUBLE(a1, a2); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; -} - -static vinfo_t* pfloat_abs(PsycoObject* po, vinfo_t* v) -{ - vinfo_t *a1, *a2, *x; - vinfo_array_t* result; - CONVERT_TO_DOUBLE(v, a1, a2); - result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_abs, CfPure|CfNoReturnValue, - "vva", a1, a2, result); - RELEASE_DOUBLE(a1, a2); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; -} - -static vinfo_t* pfloat_add(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t *a1, *a2, *b1, *b2, *x; - vinfo_array_t* result; - CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); - result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_add, CF_PURE_FP_HELPER, - "vvvva", a1, a2, b1, b2, result); - RELEASE_DOUBLE2(a1, a2, b1, b2); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; -} - -static vinfo_t* pfloat_sub(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t *a1, *a2, *b1, *b2, *x; - vinfo_array_t* result; - CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); - result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_sub, CF_PURE_FP_HELPER, - "vvvva", a1, a2, b1, b2, result); - RELEASE_DOUBLE2(a1, a2, b1, b2); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; -} - -static vinfo_t* pfloat_mul(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t *a1, *a2, *b1, *b2, *x; - vinfo_array_t* result; - CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); - result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_mul, CF_PURE_FP_HELPER, - "vvvva", a1, a2, b1, b2, result); - RELEASE_DOUBLE2(a1, a2, b1, b2); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; -} - -static vinfo_t* pfloat_div(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t *a1, *a2, *b1, *b2, *x; - vinfo_array_t* result; - CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); - result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_div, CfPure|CfNoReturnValue|CfPyErrIfNonNull, - "vvvva", a1, a2, b1, b2, result); - RELEASE_DOUBLE2(a1, a2, b1, b2); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; -} - -static vinfo_t* pfloat_pow(PsycoObject* po, vinfo_t* v, vinfo_t* w, vinfo_t* z) -{ - vinfo_t *a1, *a2, *b1, *b2, *x; - vinfo_array_t* result; - if (!psyco_knowntobe(z, (long) Py_None)) - goto fallback; - CONVERT_TO_DOUBLE2(v, a1, a2, w, b1, b2); - result = array_new(2); - x = psyco_generic_call(po, cimpl_fp_pow, CF_PURE_FP_HELPER, - "vvvva", a1, a2, b1, b2, result); - RELEASE_DOUBLE2(a1, a2, b1, b2); - if (x != NULL) { - x = PsycoFloat_FROM_DOUBLE(result->items[0], result->items[1]); - } - array_release(result); - return x; - - fallback: - return psyco_generic_call(po, PyFloat_Type.tp_as_number->nb_power, - CfReturnRef|CfPyErrIfNull, - "vvv", v, w, z); -} - - -INITIALIZATIONFN -void psy_floatobject_init(void) -{ - PyNumberMethods *m = PyFloat_Type.tp_as_number; - Psyco_DefineMeta(m->nb_nonzero, pfloat_nonzero); - - Psyco_DefineMeta(m->nb_positive, pfloat_pos); - Psyco_DefineMeta(m->nb_negative, pfloat_neg); - Psyco_DefineMeta(m->nb_absolute, pfloat_abs); - - Psyco_DefineMeta(m->nb_add, pfloat_add); - Psyco_DefineMeta(m->nb_subtract, pfloat_sub); - Psyco_DefineMeta(m->nb_multiply, pfloat_mul); - Psyco_DefineMeta(m->nb_divide, pfloat_div); - Psyco_DefineMeta(m->nb_power, pfloat_pow); - - if (PyFloat_Type.tp_compare == NULL) /* Python >= 2.4 */ - Psyco_DefineMeta(PyFloat_Type.tp_richcompare, pfloat_richcompare); - else - Psyco_DefineMeta(PyFloat_Type.tp_compare, pfloat_cmp); - - INIT_SVIRTUAL(psyco_computed_float, compute_float, - direct_compute_float, 0, 0, 0); -} - -#else /* !HAVE_FP_FN_CALLS */ -INITIALIZATIONFN -void psy_floatobject_init(void) -{ -} -#endif /* !HAVE_FP_FN_CALLS */ diff --git a/nodebox/ext/psyco/src/c/Objects/pfloatobject.h b/nodebox/ext/psyco/src/c/Objects/pfloatobject.h deleted file mode 100644 index 56a6c96..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pfloatobject.h +++ /dev/null @@ -1,81 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of floatobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_FLOATOBJECT_H -#define _PSY_FLOATOBJECT_H - -#include -#if HAVE_FP_FN_CALLS /* disable float optimizations if functions with - float/double arguments are not implemented - in the back-end */ -#include "pobject.h" -#include "pabstract.h" -#include "pintobject.h" - -#define FLOAT_ob_fval DEF_FIELD(PyFloatObject, double, ob_fval, OB_type) -#define iFLOAT_OB_FVAL FIELD_INDEX(FLOAT_ob_fval) -#define FLOAT_TOTAL FIELDS_TOTAL(FLOAT_ob_fval) - -#define PsycoFloat_Check(tp) PyType_TypeCheck(tp, &PyFloat_Type) - - -/***************************************************************/ -/*** Virtual-time object builder ***/ - -/* not-yet-computed integers; it will call PyFloat_FromDouble */ -EXTERNVAR source_virtual_t psyco_computed_float; - -/* !! consumes a references to vdouble. PsycoFloat_FromLong() does not. */ -PSY_INLINE vinfo_t* PsycoFloat_FROM_DOUBLE(vinfo_t* vdouble1, vinfo_t* vdouble2) -{ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_float)); - result->array = array_new(FLOAT_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyFloat_Type))); - result->array->items[iFLOAT_OB_FVAL+0] = vdouble1; - result->array->items[iFLOAT_OB_FVAL+1] = vdouble2; - return result; -} - -PSY_INLINE vinfo_t* PsycoFloat_FromDouble(vinfo_t* vdouble1, vinfo_t* vdouble2) -{ - vinfo_incref(vdouble1); - vinfo_incref(vdouble2); - return PsycoFloat_FROM_DOUBLE(vdouble1, vdouble2); -} - -EXTERNFN vinfo_t* PsycoFloat_FromFloat(PsycoObject* po, vinfo_t* vfloat); - -PSY_INLINE vinfo_t* PsycoFloat_AS_DOUBLE_1(PsycoObject* po, vinfo_t* v) -{ /* no type check; does not return a new reference. */ - return psyco_get_const(po, v, FLOAT_ob_fval); -} - -PSY_INLINE vinfo_t* PsycoFloat_AS_DOUBLE_2(PsycoObject* po, vinfo_t* v) -{ /* no type check; does not return a new reference. */ - return psyco_get_const(po, v, FIELD_PART2(FLOAT_ob_fval)); -} - -/* return a new ref */ -EXTERNFN bool PsycoFloat_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** vd1, vinfo_t** vd2); - -/* return true if successful, false if error or promotion, or - -1 if the convertion is impossible */ -EXTERNFN int psyco_convert_to_double(PsycoObject* po, vinfo_t* vobj, - vinfo_t** pv1, vinfo_t** pv2); - -/*EXTERNFN condition_code_t float_cmp(PsycoObject* po, vinfo_t* a1, vinfo_t* a2, - vinfo_t* b1, vinfo_t* b2, int op);*/ - - -/* Some C implementations made visible for Modules/pmath.c */ -EXTERNFN void -cimpl_fp_from_long(long value, double* result); -EXTERNFN void -cimpl_fp_from_float(float value, double* result); - - -#endif /* HAVE_FP_FN_CALLS */ - -#endif /* _PSY_FLOATOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pfuncobject.c b/nodebox/ext/psyco/src/c/Objects/pfuncobject.c deleted file mode 100644 index 20f1720..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pfuncobject.c +++ /dev/null @@ -1,234 +0,0 @@ -#include "../psyfunc.h" -#include "pfuncobject.h" -#include "pclassobject.h" - - - /***************************************************************/ - /*** Virtual functions ***/ - -static source_virtual_t psyco_computed_function; - -static bool compute_function(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* newobj; - vinfo_t* fcode; - vinfo_t* fglobals; - vinfo_t* fdefaults; - - fcode = vinfo_getitem(v, iFUNC_CODE); - if (fcode == NULL) - return false; - - fglobals = vinfo_getitem(v, iFUNC_GLOBALS); - if (fglobals == NULL) - return false; - - fdefaults = vinfo_getitem(v, iFUNC_DEFAULTS); - if (fdefaults == NULL) - return false; - - newobj = psyco_generic_call(po, PyFunction_New, - CfReturnRef|CfPyErrIfNull, - "vv", fcode, fglobals); - if (newobj == NULL) - return false; - - if (!psyco_knowntobe(fdefaults, (long) NULL)) { - if (!psyco_generic_call(po, PyFunction_SetDefaults, - CfNoReturnValue|CfPyErrIfNonNull, - "vv", newobj, fdefaults)) - return false; - } - - /* move the resulting non-virtual Python object back into 'v' */ - vinfo_move(po, v, newobj); - return true; -} - -#if 0 /* not needed currently */ -static PyObject* direct_compute_function(vinfo_t* v, char* data) -{ - PyObject* fcode; - PyObject* fglobals; - PyObject* fdefaults; - PyObject* result = NULL; - - fcode = direct_xobj_vinfo(vinfo_getitem(v, iFUNC_CODE), data); - fglobals = direct_xobj_vinfo(vinfo_getitem(v, iFUNC_GLOBALS), data); - fdefaults = direct_xobj_vinfo(vinfo_getitem(v, iFUNC_DEFAULTS), data); - - if (!PyErr_Occurred() && fcode != NULL && fglobals != NULL) { - result = PyFunction_New(fcode, fglobals); - if (result != NULL && fdefaults != NULL) { - if (PyFunction_SetDefaults(result, fdefaults) != 0) { - Py_DECREF(result); - result = NULL; - } - } - } - Py_XDECREF(fdefaults); - Py_XDECREF(fglobals); - Py_XDECREF(fcode); - return result; -} -#endif - - -DEFINEFN -vinfo_t* PsycoFunction_New(PsycoObject* po, vinfo_t* fcode, - vinfo_t* fglobals, vinfo_t* fdefaults) -{ - vinfo_t* r; - - /* fdefaults contains potential arguments; mutable objects there - must be forced out of virtual-time right now */ - if (fdefaults != NULL && !psyco_forking(po, fdefaults->array)) - return NULL; - - /* Build a virtual function object */ - r = vinfo_new(VirtualTime_New(&psyco_computed_function)); - r->array = array_new(FUNC_TOTAL); - r->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyFunction_Type))); - vinfo_incref(fcode); - r->array->items[iFUNC_CODE] = fcode; - vinfo_incref(fglobals); - r->array->items[iFUNC_GLOBALS] = fglobals; - if (fdefaults == NULL) - fdefaults = psyco_vi_Zero(); - else - vinfo_incref(fdefaults); - r->array->items[iFUNC_DEFAULTS] = fdefaults; - return r; -} - - - /***************************************************************/ - /*** function objects meta-implementation ***/ - -DEFINEFN -vinfo_t* pfunction_simple_call(PsycoObject* po, PyObject* f, - vinfo_t* arg, bool allow_inline) -{ - PyObject* glob; - PyObject* defl; - PyCodeObject* co; - vinfo_t* fglobals; - vinfo_t* fdefaults; - vinfo_t* result; - int saved_inlining; - - /* XXX we capture the code object, so this breaks if someone - changes the .func_code attribute of the function later */ - co = (PyCodeObject*) PyFunction_GET_CODE(f); - if (PyCode_GetNumFree(co) > 0) - goto fallback; - - glob = PyFunction_GET_GLOBALS(f); - defl = PyFunction_GET_DEFAULTS(f); - Py_INCREF(glob); - fglobals = vinfo_new(CompileTime_NewSk(sk_new - ((long)glob, SkFlagPyObj))); - if (defl == NULL) - fdefaults = psyco_vi_Zero(); - else { - Py_INCREF(defl); - fdefaults = vinfo_new(CompileTime_NewSk(sk_new - ((long)defl, SkFlagPyObj))); - } - - saved_inlining = po->pr.is_inlining; - if (!allow_inline) - po->pr.is_inlining = true; - result = psyco_call_pyfunc(po, co, fglobals, fdefaults, - arg, po->pr.auto_recursion); - po->pr.is_inlining = saved_inlining; - vinfo_decref(fdefaults, po); - vinfo_decref(fglobals, po); - return result; - - fallback: - return psyco_generic_call(po, PyFunction_Type.tp_call, - CfReturnRef|CfPyErrIfNull, - "lvl", (long) f, arg, 0); -} - -DEFINEFN -vinfo_t* pfunction_call(PsycoObject* po, vinfo_t* func, - vinfo_t* arg, vinfo_t* kw) -{ - if (!psyco_knowntobe(kw, (long) NULL)) - goto fallback; - - if (!is_virtualtime(func->source)) { - /* run-time or compile-time values: promote the - function object as a whole into compile-time */ - PyObject* f; - switch (psyco_pyobj_atcompiletime_mega(po, func, &f)) { - - case 1: /* promotion ok */ - return pfunction_simple_call(po, f, arg, true); - - case 0: /* megamorphic site */ - goto fallback; /* XXX could do better */ - - default: - return NULL; - } - } - else { /* virtual-time function objects: read the - individual components */ - PyCodeObject* co; - vinfo_t* fcode; - vinfo_t* fglobals; - vinfo_t* fdefaults; - - fcode = vinfo_getitem(func, iFUNC_CODE); - if (fcode == NULL) - return NULL; - co = (PyCodeObject*)psyco_pyobj_atcompiletime(po, fcode); - if (co == NULL) - return NULL; - - fglobals = vinfo_getitem(func, iFUNC_GLOBALS); - if (fglobals == NULL) - return NULL; - - fdefaults = vinfo_getitem(func, iFUNC_DEFAULTS); - if (fdefaults == NULL) - return NULL; - - return psyco_call_pyfunc(po, co, fglobals, fdefaults, - arg, po->pr.auto_recursion); - } - - fallback: - - return psyco_generic_call(po, PyFunction_Type.tp_call, - CfReturnRef|CfPyErrIfNull, - "vvv", func, arg, kw); -} - - -static vinfo_t* pfunc_descr_get(PsycoObject* po, PyObject* func, - vinfo_t* obj, PyObject* type) -{ - /* see comments of pmember_get() in pdescrobject.c. */ - - /* XXX obj is never Py_None here in the current implementation, - but could be if called by other routines than - PsycoObject_GenericGetAttr(). */ - return PsycoMethod_New(func, obj, type); -} - - -INITIALIZATIONFN -void psy_funcobject_init(void) -{ - Psyco_DefineMeta(PyFunction_Type.tp_call, pfunction_call); - Psyco_DefineMeta(PyFunction_Type.tp_descr_get, pfunc_descr_get); - - /* function object are mutable; - they must be forced out of virtual-time across function calls */ - INIT_SVIRTUAL_NOCALL(psyco_computed_function, compute_function, 1); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pfuncobject.h b/nodebox/ext/psyco/src/c/Objects/pfuncobject.h deleted file mode 100644 index b8c6590..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pfuncobject.h +++ /dev/null @@ -1,37 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of funcobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_FUNCOBJECT_H -#define _PSY_FUNCOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -#define FUNC_code DEF_FIELD(PyFunctionObject, PyObject*, func_code, OB_type) -#define FUNC_globals DEF_FIELD(PyFunctionObject, PyObject*, func_globals, \ - FUNC_code) -#define FUNC_defaults DEF_FIELD(PyFunctionObject, PyObject*, func_defaults, \ - FUNC_globals) -#define iFUNC_CODE FIELD_INDEX(FUNC_code) -#define iFUNC_GLOBALS FIELD_INDEX(FUNC_globals) -#define iFUNC_DEFAULTS FIELD_INDEX(FUNC_defaults) -#define FUNC_TOTAL FIELDS_TOTAL(FUNC_defaults) - - -EXTERNFN vinfo_t* pfunction_call(PsycoObject* po, vinfo_t* func, - vinfo_t* arg, vinfo_t* kw); -EXTERNFN vinfo_t* pfunction_simple_call(PsycoObject* po, PyObject* f, - vinfo_t* arg, bool allow_inline); - - -/***************************************************************/ -/* virtual functions. */ -/* 'fdefaults' may be NULL. */ -EXTERNFN vinfo_t* PsycoFunction_New(PsycoObject* po, vinfo_t* fcode, - vinfo_t* fglobals, vinfo_t* fdefaults); - - -#endif /* _PSY_FUNCOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pintobject.c b/nodebox/ext/psyco/src/c/Objects/pintobject.c deleted file mode 100644 index 65b9ef4..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pintobject.c +++ /dev/null @@ -1,539 +0,0 @@ -#include "pintobject.h" -#include "plongobject.h" - - -/* Division and Modulo code follows Python's intobject.c */ -static long cimpl_int_mod(long x, long y) -{ - long xmody; - /* (-sys.maxint-1)/-1 is the only overflow case. */ - if (y == 0 || (y == -1 && x == LONG_MIN)) { - /* the exception will be cleared by the caller */ - PyErr_SetString(PyExc_ValueError, "punt and do this in python code"); - return -1; - } - xmody = x % y; - if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) { - xmody += y; - } - return xmody; -} - -static long cimpl_int_div(long x, long y) -{ - long xdivy; - long xmody; - /* (-sys.maxint-1)/-1 is the only overflow case. */ - if (y == 0 || (y == -1 && x == LONG_MIN)) { - /* the exception will be cleared by the caller */ - PyErr_SetString(PyExc_ValueError, "punt and do this in python code"); - return -1; - } - xdivy = x / y; - xmody = x - xdivy * y; - if (xmody && ((y ^ xmody) < 0) /* i.e. and signs differ */) { - --xdivy; - } - return xdivy; -} - -static long cimpl_int_pow2_nonneg(long iv, long iw) -{ - long ix, prev, temp; - extra_assert(iw >= 0); - /* code from Python 2.5 */ - temp = iv; - ix = 1; - while (iw > 0) { - prev = ix; /* Save value for overflow check */ - if (iw & 1) { - ix = ix*temp; - if (temp == 0) - break; /* Avoid ix / 0 */ - if (ix / temp != prev) - goto overflow; - } - iw >>= 1; /* Shift exponent down by 1 bit */ - if (iw==0) break; - prev = temp; - temp *= temp; /* Square the value of temp */ - if (prev != 0 && temp / prev != prev) - goto overflow; - } - return ix; - - overflow: - /* the exception will be cleared by the caller */ - PyErr_SetString(PyExc_OverflowError, "punt and do this in python code"); - return -1; -} - -static long cimpl_int_pow2(long iv, long iw) -{ - if (iw < 0) { - /* the exception will be cleared by the caller */ - PyErr_SetString(PyExc_ValueError, - "punt and do this in python code"); - return -1; - } - return cimpl_int_pow2_nonneg(iv, iw); -} - -DEFINEFN -vinfo_t* PsycoInt_AsLong(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* result; - PyNumberMethods *nb; - PyTypeObject* tp; - - tp = Psyco_NeedType(po, v); - if (tp == NULL) - return NULL; - - if (PsycoInt_Check(tp)) { - result = PsycoInt_AS_LONG(po, v); - if (result != NULL) - vinfo_incref(result); - return result; - } - - if ((nb = tp->tp_as_number) == NULL || nb->nb_int == NULL) { - PycException_SetString(po, PyExc_TypeError, - "an integer is required"); - return NULL; - } - - return psyco_generic_call(po, PyInt_AsLong, - CfReturnNormal|CfPyErrCheckMinus1, - "v", v); -#if 0 - --- DISABLED: cannot promote the type of a returned object :-( --- - v = Psyco_META1(po, nb->nb_int, - CfReturnRef|CfPyErrIfNull, - "v", v); - if (v == NULL) - return NULL; - - /* check the returned type */ - result = NULL; - tp = Psyco_NeedType(po, v); - if (tp != NULL) { - if (PsycoInt_Check(tp)) { - result = PsycoInt_AS_LONG(po, v); - if (result != NULL) - vinfo_incref(result); - } - else if (PsycoLong_Check(tp)) { - result = PsycoLong_AsLong(po, v); - } - else { /* fall back */ - result = psyco_generic_call(po, PyInt_AsLong, - CfReturnNormal|CfPyErrCheckMinus1, - "v", v); - } - } - vinfo_decref(v, po); - return result; -#endif -} - -static bool compute_int(PsycoObject* po, vinfo_t* intobj) -{ - vinfo_t* newobj; - vinfo_t* x; - - /* get the field 'ob_ival' from the Python object 'intobj' */ - x = vinfo_getitem(intobj, iINT_OB_IVAL); - if (x == NULL) - return false; - - /* call PyInt_FromLong() */ - newobj = psyco_generic_call(po, PyInt_FromLong, - CfPure|CfReturnRef|CfPyErrIfNull, "v", x); - if (newobj == NULL) - return false; - - /* move the resulting non-virtual Python object back into 'intobj' */ - vinfo_move(po, intobj, newobj); - return true; -} - -static PyObject* direct_compute_int(vinfo_t* intobj, char* data) -{ - int ival; - ival = direct_read_vinfo(vinfo_getitem(intobj, iINT_OB_IVAL), data); - if (ival == -1 && PyErr_Occurred()) - return NULL; - return PyInt_FromLong(ival); -} - - -DEFINEVAR source_virtual_t psyco_computed_int; - - - /***************************************************************/ - /*** integer objects meta-implementation ***/ - -static vinfo_t* pint_nonzero(PsycoObject* po, vinfo_t* intobj) -{ - vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); - condition_code_t cc = integer_non_null(po, ival); - if (cc == CC_ERROR) - return NULL; - return psyco_vinfo_condition(po, cc); -} - -static vinfo_t* pint_pos(PsycoObject* po, vinfo_t* intobj) -{ - if (Psyco_KnownType(intobj) == &PyInt_Type) { - vinfo_incref(intobj); - return intobj; - } - else { - vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); - if (ival == NULL) - return NULL; - return PsycoInt_FromLong(ival); - } -} - -static vinfo_t* pint_neg(PsycoObject* po, vinfo_t* intobj) -{ - vinfo_t* result; - vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); - if (ival == NULL) - return NULL; - result = integer_neg(po, ival, true); - if (result != NULL) - return PsycoInt_FROM_LONG(result); - - if (PycException_Occurred(po)) - return NULL; - /* overflow */ - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_negative, - CfPure|CfReturnRef|CfPyErrIfNull, - "v", intobj); -} - -static vinfo_t* pint_invert(PsycoObject* po, vinfo_t* intobj) -{ - vinfo_t* result; - vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); - if (ival == NULL) - return NULL; - result = integer_inv(po, ival); - if (result != NULL) - result = PsycoInt_FROM_LONG(result); - return result; -} - -static vinfo_t* pint_abs(PsycoObject* po, vinfo_t* intobj) -{ - vinfo_t* result; - vinfo_t* ival = PsycoInt_AS_LONG(po, intobj); - if (ival == NULL) - return NULL; - result = integer_abs(po, ival, true); - if (result != NULL) - return PsycoInt_FROM_LONG(result); - - if (PycException_Occurred(po)) - return NULL; - /* overflow */ - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_absolute, - CfPure|CfReturnRef|CfPyErrIfNull, - "v", intobj); -} - - -#define CONVERT_TO_LONG(vobj, vlng) \ - switch (Psyco_VerifyType(po, vobj, &PyInt_Type)) { \ - case true: /* vobj is a PyIntObject */ \ - vlng = PsycoInt_AS_LONG(po, vobj); \ - if (vlng == NULL) \ - return NULL; \ - break; \ - case false: /* vobj is not a PyIntObject */ \ - return psyco_vi_NotImplemented(); \ - default: /* error or promotion */ \ - return NULL; \ - } - -static vinfo_t* pint_add(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - x = integer_add(po, a, b, true); - if (x != NULL) - return PsycoInt_FROM_LONG(x); - if (PycException_Occurred(po)) - return NULL; - /* overflow */ - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_add, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", v, w); -} - -static vinfo_t* pint_sub(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - x = integer_sub(po, a, b, true); - if (x != NULL) - return PsycoInt_FROM_LONG(x); - if (PycException_Occurred(po)) - return NULL; - /* overflow */ - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_subtract, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", v, w); -} - -static vinfo_t* pint_mod(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - x = psyco_generic_call(po, cimpl_int_mod, CfPure|CfReturnNormal|CfPyErrCheckMinus1, "vv", a, b); - if (x != NULL) - return PsycoInt_FROM_LONG(x); - /* Either an error occured or it overflowed. In either case let python deal with it */ - PycException_Clear(po); - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_remainder, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", v, w); -} - -static vinfo_t* pint_div(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - x = psyco_generic_call(po, cimpl_int_div, CfPure|CfReturnNormal|CfPyErrCheckMinus1, "vv", a, b); - if (x != NULL) - return PsycoInt_FROM_LONG(x); - /* Either an error occured or it overflowed. In either case let python deal with it */ - PycException_Clear(po); - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_divide, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", v, w); -} - -static vinfo_t* pint_pow(PsycoObject* po, vinfo_t* v, vinfo_t* w, vinfo_t* z) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - void* cimpl; - if (!psyco_knowntobe(z, (long) Py_None)) { - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_power, - CfPure|CfReturnRef|CfPyErrNotImplemented, - "vvv", v, w, z); - } - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - if (is_nonneg(b->source)) - cimpl = cimpl_int_pow2_nonneg; - else - cimpl = cimpl_int_pow2; - x = psyco_generic_call(po, cimpl, - CfPure|CfReturnNormal|CfPyErrCheckMinus1, - "vv", a, b); - if (x != NULL) - return PsycoInt_FROM_LONG(x); - /* Either an error occured or it overflowed. In either case let python deal with it */ - PycException_Clear(po); - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_power, - CfPure|CfReturnRef|CfPyErrIfNull, - "vvv", v, w, z); -} - -DEFINEFN -vinfo_t* pint_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, - vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - x = op (po, a, b); - if (x != NULL) - x = PsycoInt_FROM_LONG(x); - return x; -} - -static vinfo_t* pint_or(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pint_base2op(po, v, w, integer_or); -} - -static vinfo_t* pint_xor(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pint_base2op(po, v, w, integer_xor); -} - -static vinfo_t* pint_and(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pint_base2op(po, v, w, integer_and); -} - -static vinfo_t* pint_mul(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - x = integer_mul(po, a, b, true); - if (x != NULL) - return PsycoInt_FROM_LONG(x); - if (PycException_Occurred(po)) - return NULL; - /* overflow */ - return psyco_generic_call(po, PyInt_Type.tp_as_number->nb_multiply, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", v, w); -} - -#if PY_VERSION_HEX < 0x02040000 - -static vinfo_t* pint_lshift(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pint_base2op(po, v, w, integer_lshift); -} - -#else -/* Python 2.4: left shifts can return longs */ - -static long cimpl_int_lshift(long a, long b) -{ - long c; - if (b < 0) - return -1; /* error */ - if (a == 0) - return 0; - if (b >= LONG_BIT) - return -1; /* overflow */ - c = a << b; - if (a != Py_ARITHMETIC_RIGHT_SHIFT(long, c, b)) - return -1; /* overflow */ - return c; -} - -static PyObject* cimpl_ovf_int_lshift(long a, long b) -{ - if (b > 0) { - /* cimpl_int_lshift() overflowed */ - PyObject *vv, *ww, *result; - vv = PyLong_FromLong(a); - if (vv == NULL) - return NULL; - ww = PyLong_FromLong(b); - if (ww == NULL) { - Py_DECREF(vv); - return NULL; - } - result = PyNumber_Lshift(vv, ww); - Py_DECREF(vv); - Py_DECREF(ww); - return result; - } - else if (b == 0) { - /* special case '(-1)<<0', which makes cimpl_int_lshift() - return -1 by accident */ - return PyInt_FromLong(a); - } - else { - PyErr_SetString(PyExc_ValueError, "negative shift count"); - return NULL; - } -} - -static vinfo_t* pint_lshift(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - condition_code_t cc; - vinfo_t* a; - vinfo_t* b; - vinfo_t* x; - CONVERT_TO_LONG(v, a); - CONVERT_TO_LONG(w, b); - x = psyco_generic_call(po, cimpl_int_lshift, - CfPure|CfReturnNormal, - "vv", a, b); - if (x == NULL) - return NULL; - - cc = integer_cmp_i(po, x, -1, Py_EQ); - if (cc == CC_ERROR) { - vinfo_decref(x, po); - return NULL; - } - - if (runtime_condition_f(po, cc)) { - /* overflow */ - vinfo_decref(x, po); - return psyco_generic_call(po, cimpl_ovf_int_lshift, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", a, b); - } - else - return PsycoInt_FROM_LONG(x); -} - -#endif /* Python 2.4 */ - -static vinfo_t* pint_rshift(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - return pint_base2op(po, v, w, integer_rshift); -} - - - - -/* Careful, most operations might return a long if they overflow. - Only list here the ones that cannot. Besides, all these operations - should sooner or later be implemented in Psyco. XXX */ -/*DEF_KNOWN_RET_TYPE_2(pint_lshift, PyInt_Type.tp_as_number->nb_lshift, - CfReturnRef|CfPyErrNotImplemented, &PyInt_Type) - DEF_KNOWN_RET_TYPE_2(pint_rshift, PyInt_Type.tp_as_number->nb_rshift, - CfReturnRef|CfPyErrNotImplemented, &PyInt_Type)*/ - -INITIALIZATIONFN -void psy_intobject_init(void) -{ - PyNumberMethods *m = PyInt_Type.tp_as_number; - Psyco_DefineMeta(m->nb_nonzero, pint_nonzero); - - Psyco_DefineMeta(m->nb_positive, pint_pos); - Psyco_DefineMeta(m->nb_negative, pint_neg); - Psyco_DefineMeta(m->nb_invert, pint_invert); - Psyco_DefineMeta(m->nb_absolute, pint_abs); - - Psyco_DefineMeta(m->nb_add, pint_add); - Psyco_DefineMeta(m->nb_subtract, pint_sub); - Psyco_DefineMeta(m->nb_or, pint_or); - Psyco_DefineMeta(m->nb_xor, pint_xor); - Psyco_DefineMeta(m->nb_and, pint_and); - Psyco_DefineMeta(m->nb_multiply, pint_mul); - Psyco_DefineMeta(m->nb_lshift, pint_lshift); - Psyco_DefineMeta(m->nb_rshift, pint_rshift); - - /* partial implementations not emitting machine code */ - Psyco_DefineMeta(m->nb_divide, pint_div); - Psyco_DefineMeta(m->nb_remainder,pint_mod); - Psyco_DefineMeta(m->nb_power, pint_pow); - - INIT_SVIRTUAL(psyco_computed_int, compute_int, - direct_compute_int, 0, 0, 0); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pintobject.h b/nodebox/ext/psyco/src/c/Objects/pintobject.h deleted file mode 100644 index 1f17121..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pintobject.h +++ /dev/null @@ -1,74 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of intobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_INTOBJECT_H -#define _PSY_INTOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" -#include "pboolobject.h" - - -#define INT_ob_ival DEF_FIELD(PyIntObject, long, ob_ival, OB_type) -#define iINT_OB_IVAL FIELD_INDEX(INT_ob_ival) -#define INT_TOTAL FIELDS_TOTAL(INT_ob_ival) - - -#define PsycoInt_Check(tp) PyType_TypeCheck(tp, &PyInt_Type) - - - /***************************************************************/ - /*** Virtual-time object builder ***/ - -/* not-yet-computed integers; it will call PyInt_FromLong */ -EXTERNVAR source_virtual_t psyco_computed_int; - -/* !! consumes a reference to vlong. PsycoInt_FromLong() does not. */ -PSY_INLINE vinfo_t* PsycoInt_FROM_LONG(vinfo_t* vlong) -{ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_int)); - result->array = array_new(INT_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyInt_Type))); - result->array->items[iINT_OB_IVAL] = vlong; - return result; -} -PSY_INLINE vinfo_t* PsycoInt_FromLong(vinfo_t* vlong) -{ - vinfo_incref(vlong); - return PsycoInt_FROM_LONG(vlong); -} - -PSY_INLINE vinfo_t* PsycoInt_AS_LONG(PsycoObject* po, vinfo_t* v) -{ /* no type check; does not return a new reference. */ - return psyco_get_const(po, v, INT_ob_ival); -} - -/* return a new ref */ -EXTERNFN vinfo_t* PsycoInt_AsLong(PsycoObject* po, vinfo_t* v); - - -PSY_INLINE vinfo_t* PsycoIntInt_RichCompare(PsycoObject* po, vinfo_t* v, - vinfo_t* w, int op) -{ /* only for two integer objects */ - vinfo_t* a; - vinfo_t* b; - condition_code_t cc; - a = PsycoInt_AS_LONG(po, v); - if (a == NULL) return NULL; - b = PsycoInt_AS_LONG(po, w); - if (b == NULL) return NULL; - cc = integer_cmp(po, a, b, op); - if (cc == CC_ERROR) return NULL; - return PsycoBool_FromCondition(po, cc); -} - - -EXTERNFN /* internal, for pboolobject.c */ -vinfo_t* pint_base2op(PsycoObject* po, vinfo_t* v, vinfo_t* w, - vinfo_t*(*op)(PsycoObject*,vinfo_t*,vinfo_t*)); - - -#endif /* _PSY_INTOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/piterobject.c b/nodebox/ext/psyco/src/c/Objects/piterobject.c deleted file mode 100644 index c03969a..0000000 --- a/nodebox/ext/psyco/src/c/Objects/piterobject.c +++ /dev/null @@ -1,141 +0,0 @@ -#include "piterobject.h" - - -DEFINEFN vinfo_t* PsycoSeqIter_NEW(PsycoObject* po, vinfo_t* seq) -{ - vinfo_t* zero; - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_seqiter)); - result->array = array_new(SEQITER_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PySeqIter_Type))); - /* the iterator index is immediately run-time because it is - very likely to be unpromoted to run-time anyway */ - zero = psyco_vi_Zero(); - result->array->items[iSEQITER_IT_INDEX] = make_runtime_copy(po, zero); - vinfo_decref(zero, po); - /*result->array->items[SEQITER_IT_INDEX] = - vinfo_new(CompileTime_New(0));*/ - result->array->items[iSEQITER_IT_SEQ] = seq; - return result; -} - - -static vinfo_t* piter_getiter(PsycoObject* po, vinfo_t* v) -{ - vinfo_incref(v); - return v; -} - -static vinfo_t* piter_iternext(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* seq; - vinfo_t* index; - vinfo_t* result; - PyTypeObject* tp; - - seq = psyco_get_const(po, v, SEQITER_it_seq); - if (seq == NULL) - return NULL; - - tp = Psyco_NeedType(po, seq); - if (tp == NULL) - return NULL; - - index = psyco_get_field(po, v, SEQITER_it_index); - if (index == NULL) - return NULL; - assert_nonneg(index); - - if (PyType_IsSubtype(tp, &PyList_Type)) { - /* If the sequence is a list, explicitly ignore a - user-overridden __getitem__ slot. This is what both - Python 2.2 and >=2.3 do (although they use a - different trick to reach that effect). */ - result = plist_item(po, seq, index); - } - else { - result = PsycoSequence_GetItem(po, seq, index); - } - if (result == NULL) { - vinfo_t* matches = PycException_Matches(po, PyExc_IndexError); - if (runtime_NON_NULL_t(po, matches) == true) { - PycException_SetVInfo(po, PyExc_StopIteration, - psyco_vi_None()); - } - } - else { - /* very remotely potential incompatibility: when exhausted, - the internal iterator index is not incremented. Python - is not consistent in this respect. This could be an - issue if an iterator of a mutable object is not - immediately deleted when exhausted. Well, I guess that - muting an object we iterate over is generally considered - as DDIWWY (Don't Do It -- We Warned You.) - (Update: Python 2.5 is consistent, and does the same - as Psyco.) */ - vinfo_t* index_plus_1 = integer_add_i(po, index, 1, true); - if (index_plus_1 == NULL || - !psyco_put_field(po, v, SEQITER_it_index, index_plus_1)) { - vinfo_decref(result, po); - result = NULL; - } - vinfo_xdecref(index_plus_1, po); - } - vinfo_decref(index, po); - return result; -} - - -static bool compute_seqiter(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* seq; - vinfo_t* index; - vinfo_t* newobj; - - index = vinfo_getitem(v, iSEQITER_IT_INDEX); - if (index == NULL) - return false; - - seq = vinfo_getitem(v, iSEQITER_IT_SEQ); - if (seq == NULL) - return false; - - newobj = psyco_generic_call(po, PySeqIter_New, - CfReturnRef|CfPyErrIfNull, "v", seq); - if (newobj == NULL) - return false; - - /* Put the current index into the seq iterator. - This is done by putting the value directly in the - seqiterobject structure; it could be done by calling - PyIter_Next() n times but obviously that's not too - good a solution */ - if (!psyco_knowntobe(index, 0)) { - if (!psyco_put_field(po, v, SEQITER_it_index, index)) { - vinfo_decref(newobj, po); - return false; - } - } - - /* Remove the SEQITER_IT_INDEX entry from v->array because it - is a mutable field now, and could be changed at any time by - anybody .*/ - psyco_forget_field(po, v, SEQITER_it_index); - - vinfo_move(po, v, newobj); - return true; -} - -DEFINEVAR source_virtual_t psyco_computed_seqiter; - - -INITIALIZATIONFN -void psy_iterobject_init(void) -{ - Psyco_DefineMeta(PySeqIter_Type.tp_iter, &piter_getiter); - Psyco_DefineMeta(PySeqIter_Type.tp_iternext, &piter_iternext); - - /* iterator object are mutable; - they must be forced out of virtual-time across function calls */ - INIT_SVIRTUAL_NOCALL(psyco_computed_seqiter, compute_seqiter, 1); -} diff --git a/nodebox/ext/psyco/src/c/Objects/piterobject.h b/nodebox/ext/psyco/src/c/Objects/piterobject.h deleted file mode 100644 index 9264314..0000000 --- a/nodebox/ext/psyco/src/c/Objects/piterobject.h +++ /dev/null @@ -1,41 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of iterobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_ITEROBJECT_H -#define _PSY_ITEROBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -/* this structure not exported by iterobject.h */ -typedef struct { - PyObject_HEAD - long it_index; - PyObject *it_seq; -} seqiterobject; - -#define SEQITER_it_index FMUT(DEF_FIELD(seqiterobject, long, it_index, OB_type)) -#define SEQITER_it_seq DEF_FIELD(seqiterobject, PyObject*, it_seq, \ - SEQITER_it_index) -#define iSEQITER_IT_INDEX FIELD_INDEX(SEQITER_it_index) -#define iSEQITER_IT_SEQ FIELD_INDEX(SEQITER_it_seq) -#define SEQITER_TOTAL FIELDS_TOTAL(SEQITER_it_seq) - - -/*********************************************************************/ - /* Virtual sequence iterators. Created if needed by PySeqIter_New(). */ -EXTERNVAR source_virtual_t psyco_computed_seqiter; - -/* !! consumes a ref on 'seq' */ -EXTERNFN vinfo_t* PsycoSeqIter_NEW(PsycoObject* po, vinfo_t* seq); - -PSY_INLINE vinfo_t* PsycoSeqIter_New(PsycoObject* po, vinfo_t* seq) -{ - vinfo_incref(seq); - return PsycoSeqIter_NEW(po, seq); -} - -#endif /* _PSY_ITEROBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/plistobject.c b/nodebox/ext/psyco/src/c/Objects/plistobject.c deleted file mode 100644 index 5f18d8a..0000000 --- a/nodebox/ext/psyco/src/c/Objects/plistobject.c +++ /dev/null @@ -1,340 +0,0 @@ -#include "plistobject.h" -#include "pintobject.h" -#include "plongobject.h" -#include "piterobject.h" -#include "prangeobject.h" -#include "../pycodegen.h" - - -/***************************************************************/ -/* virtual short lists. */ - -/*DEFINEVAR vinfo_t* psyco_empty_list;*/ -static source_virtual_t psyco_computed_vlist; - -PSY_INLINE int vlist_length(vinfo_t* v) -{ - int len = v->array->count - VLIST_ITEMS; -#if ALL_CHECKS - vinfo_t* vlen = vinfo_getitem(v, iVAR_SIZE); - extra_assert(vlen != NULL); - extra_assert(len == CompileTime_Get(vlen->source)->value); -#endif - return len; -} - -static bool compute_vlist(PsycoObject* po, vinfo_t* v) -{ - int length = vlist_length(v); - vinfo_t* newobj; - vinfo_t* ob_item; - - newobj = psyco_generic_call(po, PyList_New, - CfReturnRef|CfPyErrIfNull, - "l", (long) length); - if (newobj == NULL) - return false; - - /* write the storing of the objects in the list */ - if (length > 0) { - int i; - ob_item = psyco_get_field(po, newobj, LIST_ob_item); - if (ob_item == NULL) - goto fail; - - for (i=0; iarray->items[VLIST_ITEMS + i]; - extra_assert(vi != NULL); - if (!psyco_put_nth_field(po, ob_item, - FPYREF(LIST_itemsarray), - i, vi)) - goto fail2; - } - vinfo_decref(ob_item, po); - } - - /* forget fields that were only relevant in virtual-time */ - vinfo_array_shrink(po, v, LIST_TOTAL); - psyco_forget_field(po, v, VAR_size); - - /* move the resulting non-virtual Python object back into 'v' */ - vinfo_move(po, v, newobj); - return true; - - fail2: - vinfo_decref(ob_item, po); - fail: - vinfo_decref(newobj, po); - return false; -} - -PSY_INLINE vinfo_t* list_maybe_compute(PsycoObject* po, vinfo_t* v) -{ - /* force a list out of virtual-time if it is too long. - decref v in case of error. */ - if (vlist_length(v) > VLIST_LENGTH_MAX) { - if (!compute_vinfo(v, po)) { - /* error */ - vinfo_decref(v, po); - v = NULL; - } - } - return v; -} - - -PSY_INLINE vinfo_t* PsycoList_NEW(int size) -{ - /* returns a virtual list. The caller should use list_maybe_compute() - after initialization. */ - vinfo_t* r = vinfo_new(VirtualTime_New(&psyco_computed_vlist)); - r->array = array_new(VLIST_ITEMS + size); - r->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyList_Type))); - r->array->items[iVAR_SIZE] = vinfo_new(CompileTime_NewSk - (sk_new(size, SkFlagFixed))); - return r; -} - -DEFINEFN -vinfo_t* PsycoList_New(PsycoObject* po, int size, vinfo_t** source) -{ - vinfo_t* v; - int i; - vinfo_t* r = PsycoList_NEW(size); - extra_assert(source != NULL); - for (i=0; iarray->items[VLIST_ITEMS + i] = v; - } - return list_maybe_compute(po, r); -} - -DEFINEFN -vinfo_t* PsycoList_SingletonNew(vinfo_t* vitem) -{ - vinfo_t* r = PsycoList_NEW(1); - vinfo_incref(vitem); - r->array->items[VLIST_ITEMS + 0] = vitem; - return r; -} - -DEFINEFN -int PsycoList_Load(vinfo_t* list) -{ - /* only for virtual lists */ - if (list->source == VirtualTime_New(&psyco_computed_vlist)) - return vlist_length(list); - else - return -1; -} - - - /***************************************************************/ - /*** list objects meta-implementation ***/ - -DEFINEFN -vinfo_t* plist_item(PsycoObject* po, vinfo_t* a, vinfo_t* i) -{ - condition_code_t cc; - vinfo_t* vlen; - vinfo_t* ob_item; - vinfo_t* result; - - vlen = psyco_get_field(po, a, VAR_size); - if (vlen == NULL) - return NULL; - - cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); - vinfo_decref(vlen, po); - if (cc == CC_ERROR) - return NULL; - - if (runtime_condition_f(po, cc)) { - PycException_SetString(po, PyExc_IndexError, - "list index out of range"); - return NULL; - } - assert_nonneg(i); - - if (a->source == VirtualTime_New(&psyco_computed_vlist) && - is_compiletime(i->source)) { - /* optimize virtual lists */ - vlist_length(a); /* for the assert()s */ - result = vinfo_getitem(a, VLIST_ITEMS + - CompileTime_Get(i->source)->value); - extra_assert(result != NULL); - vinfo_incref(result); - need_reference(po, result); - return result; - } - - if (a->source == VirtualTime_New(&psyco_computed_listrange)) { - /* optimize range().__getitem__() */ - /* XXX no support for 'step' right now, - so that the return value is simply 'start+i'. */ - vinfo_t* vstart = vinfo_getitem(a, RANGE_START); - if (vstart == NULL) - return NULL; - result = integer_add(po, i, vstart, false); - if (result == NULL) - return NULL; - return PsycoInt_FROM_LONG(result); - } - - ob_item = psyco_get_field(po, a, LIST_ob_item); - if (ob_item == NULL) - return NULL; - - result = psyco_get_field_array(po, ob_item, FPYREF(LIST_itemsarray), i); - vinfo_decref(ob_item, po); - return result; -} - -static bool plist_ass_item(PsycoObject* po, vinfo_t* a, vinfo_t* i, vinfo_t* v) -{ - condition_code_t cc; - vinfo_t* vlen; - vinfo_t* ob_item; - vinfo_t* old_value; - bool ok; - - if (v == NULL) { - /* XXX implement item deletion */ - return psyco_generic_call(po, PyList_Type.tp_as_sequence-> - sq_ass_item, - CfNoReturnValue|CfPyErrIfNonNull, - "vvl", a, i, (long) NULL) != NULL; - } - - vlen = psyco_get_field(po, a, VAR_size); - if (vlen == NULL) - return false; - - cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); - vinfo_decref(vlen, po); - if (cc == CC_ERROR) - return false; - - if (runtime_condition_f(po, cc)) { - PycException_SetString(po, PyExc_IndexError, - "list assignment index out of range"); - return false; - } - assert_nonneg(i); - - if (a->source == VirtualTime_New(&psyco_computed_vlist) && - is_compiletime(i->source)) { - /* optimize virtual lists */ - vlist_length(a); /* for the assert()s */ - vinfo_incref(v); - vinfo_setitem(po, a, VLIST_ITEMS + - CompileTime_Get(i->source)->value, v); - return true; - } - - ob_item = psyco_get_field(po, a, LIST_ob_item); - if (ob_item == NULL) - return false; - - old_value = psyco_get_field_array(po, ob_item, LIST_itemsarray, i); - ok = (old_value != NULL) && - psyco_put_field_array(po, ob_item, FPYREF(LIST_itemsarray), i, v); - - vinfo_decref(ob_item, po); - if (ok) psyco_decref_v(po, old_value); - vinfo_xdecref(old_value, po); - - return ok; -} - -DEFINEFN -vinfo_t* psyco_plist_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b) -{ - PyTypeObject* btp = Psyco_NeedType(po, b); - if (btp == NULL) - return NULL; - - if (PyType_TypeCheck(btp, &PyList_Type)) { - vinfo_t* r; - int alen, blen; - - blen = PsycoList_Load(b); - if (blen >= 0) { - alen = PsycoList_Load(a); - if (alen >= 0) { - /* known source list lengths: - build a virtual list */ - vinfo_t* buffer[VLIST_LENGTH_MAX*2]; - extra_assert(alen <= VLIST_LENGTH_MAX); - extra_assert(blen <= VLIST_LENGTH_MAX); - memcpy(buffer, - a->array->items + VLIST_ITEMS, - alen * sizeof(vinfo_t*)); - memcpy(buffer + alen, - b->array->items + VLIST_ITEMS, - blen * sizeof(vinfo_t*)); - return PsycoList_New(po, alen+blen, buffer); - } - else if (blen == 1) { - /* XXX - fallback to an append ? */ - } - } - /* fallback - but we still know that the result is a list */ - r = psyco_generic_call(po, - PyList_Type.tp_as_sequence->sq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", a, b); - if (r != NULL) - Psyco_AssertType(po, r, &PyList_Type); - return r; - } - - /* fallback */ - return psyco_generic_call(po, PyList_Type.tp_as_sequence->sq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", a, b); -} - -DEFINEFN -bool PsycoList_Append(PsycoObject* po, vinfo_t* v, vinfo_t* vitem) -{ - /* use the real PyList_Append */ - return psyco_generic_call(po, PyList_Append, - CfNoReturnValue|CfPyErrIfNonNull, - "vv", v, vitem) != NULL; -} - - -INITIALIZATIONFN -void psy_listobject_init(void) -{ - PyMappingMethods *mm; - PySequenceMethods *m = PyList_Type.tp_as_sequence; - Psyco_DefineMeta(m->sq_length, psyco_generic_mut_ob_size); - Psyco_DefineMeta(m->sq_item, plist_item); - Psyco_DefineMeta(m->sq_ass_item, plist_ass_item); - Psyco_DefineMeta(m->sq_concat, psyco_plist_concat); - - mm = PyList_Type.tp_as_mapping; - if (mm) { /* Python >= 2.3 */ - Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); - Psyco_DefineMeta(mm->mp_ass_subscript, - psyco_generic_ass_subscript); - } - - /* In Python 2.3, lists have their own iterator type for - performance, because generic sequence iterators have an - extra overhead -- which is however completely removed by - Psyco. So we redirect list iterators to generic iterators. - (thus in Psyco, iter(l) never returns a listiterator) */ - if (PyList_Type.tp_iter != NULL) /* Python >= 2.3 */ - Psyco_DefineMeta(PyList_Type.tp_iter, &PsycoSeqIter_New); - - /* list object are mutable; - they must be forced out of virtual-time across function calls */ - INIT_SVIRTUAL_NOCALL(psyco_computed_vlist, compute_vlist, NW_VLISTS); - - /*psyco_empty_list = PsycoList_NEW(0);*/ -} diff --git a/nodebox/ext/psyco/src/c/Objects/plistobject.h b/nodebox/ext/psyco/src/c/Objects/plistobject.h deleted file mode 100644 index 59021fa..0000000 --- a/nodebox/ext/psyco/src/c/Objects/plistobject.h +++ /dev/null @@ -1,44 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of listobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_LISTOBJECT_H -#define _PSY_LISTOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -#define LIST_ob_item FMUT(DEF_FIELD(PyListObject, PyObject**, ob_item, \ - VAR_size)) -#define LIST_TOTAL FIELDS_TOTAL(LIST_ob_item) -#define VLIST_ITEMS LIST_TOTAL -#define LIST_itemsarray FMUT(DEF_ARRAY(PyObject*, 0)) - - -/* Warning: only for very short lists! Each new length could - force a new copy of the whole code to be emitted... */ -#define VLIST_LENGTH_MAX 3 - - -EXTERNFN vinfo_t* PsycoList_New(PsycoObject* po, int size, vinfo_t** source); -EXTERNFN vinfo_t* PsycoList_SingletonNew(vinfo_t* vitem); -EXTERNFN bool PsycoList_Append(PsycoObject* po, vinfo_t* v, vinfo_t* vitem); -/*EXTERNVAR vinfo_t* psyco_empty_list;*/ - -/* get the virtual array of items in the list, - returning the length of the list or -1 if it fails (items not known). - The items are then found in list->array->items[VLIST+i]. - Never sets a PycException. */ -EXTERNFN int PsycoList_Load(vinfo_t* list); - - -/* for pstringobject.c */ -EXTERNFN vinfo_t* psyco_plist_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b); - -/* for piterobject.c */ -EXTERNFN vinfo_t* plist_item(PsycoObject* po, vinfo_t* a, vinfo_t* i); - - -#endif /* _PSY_LISTOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/plongobject.c b/nodebox/ext/psyco/src/c/Objects/plongobject.c deleted file mode 100644 index 52a60dd..0000000 --- a/nodebox/ext/psyco/src/c/Objects/plongobject.c +++ /dev/null @@ -1,96 +0,0 @@ -#include "plongobject.h" - - -DEFINEFN -vinfo_t* PsycoLong_AsLong(PsycoObject* po, vinfo_t* v) -{ - /* XXX implement me */ - return psyco_generic_call(po, PyLong_AsLong, - CfReturnNormal|CfPyErrCheckMinus1, - "v", v); -} - -static void cimpl_lng_as_double(PyObject* o, double* result) -{ - *result = PyLong_AsDouble(o); -} - -DEFINEFN -bool PsycoLong_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** vd1, vinfo_t** vd2) -{ - /* XXX implement me */ - vinfo_array_t* result; - result = array_new(2); - if (psyco_generic_call(po, cimpl_lng_as_double, - CfPyErrCheck, - "va", v, result) == NULL) { - array_release(result); - return false; - } - *vd1 = result->items[0]; - *vd2 = result->items[1]; - array_release(result); - return true; -} - - -/* XXX this assumes that operations between longs always return a long. - There are hints that this might change in future releases of Python. */ -#define RETLONG(arity, cname, slotname) \ - DEF_KNOWN_RET_TYPE_##arity(cname, \ - PyLong_Type.tp_as_number->slotname, \ - (arity)==1 ? (CfReturnRef|CfPyErrIfNull) : \ - (CfReturnRef|CfPyErrNotImplemented), \ - &PyLong_Type) - -/* Python 2.2's long_mul() tries to be clever about 'sequence * long' */ -#define SANE_CONVERT_BINOP (PY_VERSION_HEX >= 0x02030000) /* 2.3 */ - -RETLONG(2, plong_add, nb_add) -RETLONG(2, plong_sub, nb_subtract) -#if SANE_CONVERT_BINOP -RETLONG(2, plong_mul, nb_multiply) -#endif -RETLONG(2, plong_classic_div, nb_divide) -RETLONG(2, plong_mod, nb_remainder) -RETLONG(3, plong_pow, nb_power) -RETLONG(1, plong_neg, nb_negative) -RETLONG(1, plong_pos, nb_positive) -RETLONG(1, plong_abs, nb_absolute) -RETLONG(1, plong_invert, nb_invert) -RETLONG(2, plong_lshift, nb_lshift) -RETLONG(2, plong_rshift, nb_rshift) -RETLONG(2, plong_and, nb_and) -RETLONG(2, plong_xor, nb_xor) -RETLONG(2, plong_or, nb_or) -RETLONG(2, plong_div, nb_floor_divide) - /*RETFLOAT(2, plong_true_divide, nb_true_divide) XXX-implement*/ - -#undef RETLONG - - -INITIALIZATIONFN -void psy_longobject_init(void) -{ - PyNumberMethods *m = PyLong_Type.tp_as_number; - - Psyco_DefineMeta(m->nb_add, plong_add); - Psyco_DefineMeta(m->nb_subtract, plong_sub); -#if SANE_CONVERT_BINOP - Psyco_DefineMeta(m->nb_multiply, plong_mul); -#endif - Psyco_DefineMeta(m->nb_divide, plong_classic_div); - Psyco_DefineMeta(m->nb_remainder, plong_mod); - Psyco_DefineMeta(m->nb_power, plong_pow); - Psyco_DefineMeta(m->nb_negative, plong_neg); - Psyco_DefineMeta(m->nb_positive, plong_pos); - Psyco_DefineMeta(m->nb_absolute, plong_abs); - Psyco_DefineMeta(m->nb_invert, plong_invert); - Psyco_DefineMeta(m->nb_lshift, plong_lshift); - Psyco_DefineMeta(m->nb_rshift, plong_rshift); - Psyco_DefineMeta(m->nb_and, plong_and); - Psyco_DefineMeta(m->nb_xor, plong_xor); - Psyco_DefineMeta(m->nb_or, plong_or); - Psyco_DefineMeta(m->nb_floor_divide, plong_div); -/* Psyco_DefineMeta(m->nb_true_divide, plong_true_divide); XXX-implement*/ -} diff --git a/nodebox/ext/psyco/src/c/Objects/plongobject.h b/nodebox/ext/psyco/src/c/Objects/plongobject.h deleted file mode 100644 index 3d63fb1..0000000 --- a/nodebox/ext/psyco/src/c/Objects/plongobject.h +++ /dev/null @@ -1,19 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of longobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_LONGOBJECT_H -#define _PSY_LONGOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -#define PsycoLong_Check(tp) PyType_TypeCheck(tp, &PyLong_Type) - - -EXTERNFN vinfo_t* PsycoLong_AsLong(PsycoObject* po, vinfo_t* v); -EXTERNFN bool PsycoLong_AsDouble(PsycoObject* po, vinfo_t* v, vinfo_t** vd1, vinfo_t** vd2); - -#endif /* _PSY_LONGOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pmethodobject.c b/nodebox/ext/psyco/src/c/Objects/pmethodobject.c deleted file mode 100644 index 4a17187..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pmethodobject.c +++ /dev/null @@ -1,141 +0,0 @@ -#include "pmethodobject.h" -#include "ptupleobject.h" - - -static bool compute_cfunction(PsycoObject* po, vinfo_t* methobj) -{ - vinfo_t* newobj; - vinfo_t* m_self; - vinfo_t* m_ml; - - /* get the fields from the Python object 'methobj' */ - m_self = vinfo_getitem(methobj, iCFUNC_M_SELF); - if (m_self == NULL) - return false; - m_ml = vinfo_getitem(methobj, iCFUNC_M_ML); - if (m_ml == NULL) - return false; - - /* call PyCFunction_New() */ -#ifdef PyCFunction_New /* Python >= 2.3 introduced PyCFunction_NewEx() */ - newobj = psyco_generic_call(po, PyCFunction_NewEx, - CfPure|CfReturnRef|CfPyErrIfNull, - "vvl", m_ml, m_self, NULL); -#else - newobj = psyco_generic_call(po, PyCFunction_New, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", m_ml, m_self); -#endif - if (newobj == NULL) - return false; - - /* move the resulting non-virtual Python object back into 'methobj' */ - vinfo_move(po, methobj, newobj); - return true; -} - -static PyObject* direct_compute_cfunction(vinfo_t* methobj, char* data) -{ - PyObject* m_self; - long m_ml; - PyObject* result = NULL; - - m_self = direct_xobj_vinfo( - vinfo_getitem(methobj, iCFUNC_M_SELF), data); - m_ml = direct_read_vinfo( - vinfo_getitem(methobj, iCFUNC_M_ML), data); - - if (!PyErr_Occurred()) - result = PyCFunction_New((PyMethodDef*) m_ml, m_self); - - Py_XDECREF(m_self); - return result; -} - - -DEFINEVAR source_virtual_t psyco_computed_cfunction; - - - /***************************************************************/ - /*** C method objects meta-implementation ***/ - -DEFINEFN -vinfo_t* PsycoCFunction_Call(PsycoObject* po, vinfo_t* func, - vinfo_t* tuple, vinfo_t* kw) -{ - long mllong; - vinfo_t* vml = psyco_get_const(po, func, CFUNC_m_ml); - if (vml == NULL) - return NULL; - - /* promote to compile-time the function if we do not know which one - it is yet */ - mllong = psyco_atcompiletime(po, vml); - if (mllong == -1) { - /* -1 is not a valid pointer */ - extra_assert(PycException_Occurred(po)); - return NULL; - } - else { - PyMethodDef* ml = (PyMethodDef*) \ - CompileTime_Get(vml->source)->value; - int flags = ml->ml_flags; - int tuplesize; - vinfo_t* carg; - char* argumentlist = "vv"; - - vinfo_t* vself = psyco_get_const(po, func, CFUNC_m_self); - if (vself == NULL) - return NULL; - - if (flags & METH_KEYWORDS) { - return Psyco_META3(po, ml->ml_meth, - CfReturnRef|CfPyErrIfNull, - "vvv", vself, tuple, kw); - } - if (!psyco_knowntobe(kw, (long) NULL)) - goto use_proxy; - - switch (flags) { - case METH_VARARGS: - carg = tuple; - break; - case METH_NOARGS: - tuplesize = PsycoTuple_Load(tuple); - if (tuplesize != 0) - /* if size unknown or known to be != 0 */ - goto use_proxy; - carg = NULL; - argumentlist = "vl"; - break; - case METH_O: - tuplesize = PsycoTuple_Load(tuple); - if (tuplesize != 1) - /* if size unknown or known to be != 1 */ - goto use_proxy; - carg = PsycoTuple_GET_ITEM(tuple, 0); - break; - default: - goto use_proxy; - } - return Psyco_META2(po, ml->ml_meth, CfReturnRef|CfPyErrIfNull, - argumentlist, vself, carg); - } - - /* default, slow version */ - use_proxy: - return psyco_generic_call(po, PyCFunction_Call, - CfReturnRef|CfPyErrIfNull, - "vvv", func, tuple, kw); -} - - -INITIALIZATIONFN -void psy_methodobject_init(void) -{ - Psyco_DefineMeta(PyCFunction_Type.tp_call, PsycoCFunction_Call); - INIT_SVIRTUAL(psyco_computed_cfunction, compute_cfunction, - direct_compute_cfunction, - (1 << iCFUNC_M_SELF), - 1, 1); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pmethodobject.h b/nodebox/ext/psyco/src/c/Objects/pmethodobject.h deleted file mode 100644 index 39d779d..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pmethodobject.h +++ /dev/null @@ -1,47 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of methodobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_METHODOBJECT_H -#define _PSY_METHODOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -#define CFUNC_m_ml DEF_FIELD(PyCFunctionObject, PyMethodDef*, m_ml, OB_type) -#define CFUNC_m_self DEF_FIELD(PyCFunctionObject, PyObject*, m_self, CFUNC_m_ml) -#define iCFUNC_M_ML FIELD_INDEX(CFUNC_m_ml) -#define iCFUNC_M_SELF FIELD_INDEX(CFUNC_m_self) -#define CFUNC_TOTAL FIELDS_TOTAL(CFUNC_m_self) - - -EXTERNFN vinfo_t* PsycoCFunction_Call(PsycoObject* po, vinfo_t* func, - vinfo_t* tuple, vinfo_t* kw); - - - /***************************************************************/ - /*** Virtual-time object builder ***/ - -/* not-yet-computed C method objects, with a m_ml and m_self field. - Usually not computed at all, but if it needs be, will call - PyCFunction_New(). */ -EXTERNVAR source_virtual_t psyco_computed_cfunction; - -PSY_INLINE vinfo_t* PsycoCFunction_New(PsycoObject* po, PyMethodDef* ml, - vinfo_t* self) -{ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_cfunction)); - result->array = array_new(CFUNC_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyCFunction_Type))); - result->array->items[iCFUNC_M_ML] = - vinfo_new(CompileTime_New((long) ml)); - vinfo_incref(self); - result->array->items[iCFUNC_M_SELF] = self; - return result; -} - - -#endif /* _PSY_METHODOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pobject.c b/nodebox/ext/psyco/src/c/Objects/pobject.c deleted file mode 100644 index 9dba371..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pobject.c +++ /dev/null @@ -1,699 +0,0 @@ -#include "pobject.h" -#include "pintobject.h" -#include "pboolobject.h" -#include "pstringobject.h" -#include "../pycodegen.h" - - -#if USE_RUNTIME_SWITCHES -DEFINEVAR fixed_switch_t psyfs_int; -DEFINEVAR fixed_switch_t psyfs_int_long; -DEFINEVAR fixed_switch_t psyfs_int_long_float; -DEFINEVAR fixed_switch_t psyfs_tuple_list; -DEFINEVAR fixed_switch_t psyfs_string_unicode; -DEFINEVAR fixed_switch_t psyfs_tuple; -DEFINEVAR fixed_switch_t psyfs_dict; -DEFINEVAR fixed_switch_t psyfs_none; -#endif - - -DEFINEFN -PyTypeObject* Psyco_NeedType(PsycoObject* po, vinfo_t* vi) -{ - if (is_compiletime(vi->source)) { - /* optimization for the type of a known object */ - PyObject* o = (PyObject*) CompileTime_Get(vi->source)->value; - return o->ob_type; - } - else { - vinfo_t* vtp = psyco_get_const(po, vi, OB_type); - if (vtp == NULL) - return NULL; - return (PyTypeObject*) psyco_pyobj_atcompiletime(po, vtp); - } -} - -DEFINEFN -PyTypeObject* Psyco_KnownType(vinfo_t* vi) -{ - if (is_compiletime(vi->source)) { - PyObject* o = (PyObject*) CompileTime_Get(vi->source)->value; - return o->ob_type; - } - else { - vinfo_t* vtp = vinfo_getitem(vi, iOB_TYPE); - if (vtp != NULL && is_compiletime(vtp->source)) - return (PyTypeObject*) - CompileTime_Get(vtp->source)->value; - else - return NULL; - } -} - - -DEFINEFN -vinfo_t* PsycoObject_IsTrue(PsycoObject* po, vinfo_t* vi) -{ - PyTypeObject* tp; - tp = (PyTypeObject*) Psyco_NeedType(po, vi); - if (tp == NULL) - return NULL; - - if (tp == Py_None->ob_type) - return psyco_vi_Zero(); - else if (tp->tp_as_number != NULL && - tp->tp_as_number->nb_nonzero != NULL) - return Psyco_META1(po, tp->tp_as_number->nb_nonzero, - CfReturnNormal|CfPyErrIfNeg, "v", vi); - else if (tp->tp_as_mapping != NULL && - tp->tp_as_mapping->mp_length != NULL) - return Psyco_META1(po, tp->tp_as_mapping->mp_length, - CfReturnNormal|CfPyErrIfNeg, "v", vi); - else if (tp->tp_as_sequence != NULL && - tp->tp_as_sequence->sq_length != NULL) - return Psyco_META1(po, tp->tp_as_sequence->sq_length, - CfReturnNormal|CfPyErrIfNeg, "v", vi); - else - return psyco_vi_One(); -} - -DEFINEFN -vinfo_t* PsycoObject_Repr(PsycoObject* po, vinfo_t* vi) -{ - /* XXX implement me */ - vinfo_t* vstr = psyco_generic_call(po, PyObject_Repr, - CfReturnRef|CfPyErrIfNull, - "v", vi); - if (vstr == NULL) - return NULL; - - /* the result is a string */ - Psyco_AssertType(po, vstr, &PyString_Type); - return vstr; -} - -DEFINEFN -vinfo_t* PsycoObject_GetAttr(PsycoObject* po, vinfo_t* o, vinfo_t* attr_name) -{ - /* TypeSwitch */ - PyTypeObject* tp = Psyco_NeedType(po, attr_name); - if (tp == NULL) - return NULL; - - if (!PyType_TypeCheck(tp, &PyString_Type)) { - -#ifdef Py_USING_UNICODE - if (PyType_TypeCheck(tp, &PyUnicode_Type)) - goto generic; -#endif - PycException_SetString(po, PyExc_TypeError, - "attribute name must be string"); - return NULL; - } - - tp = (PyTypeObject*) Psyco_NeedType(po, o); - if (tp == NULL) - return NULL; - if (tp->tp_getattro != NULL) - return Psyco_META2(po, tp->tp_getattro, - CfReturnRef|CfPyErrIfNull, - "vv", o, attr_name); - if (tp->tp_getattr != NULL) - return Psyco_META2(po, tp->tp_getattr, - CfReturnRef|CfPyErrIfNull, - "vv", o, - PsycoString_AS_STRING(po, attr_name)); - - generic: - /* when the above fails */ - return psyco_generic_call(po, PyObject_GetAttr, - CfReturnRef|CfPyErrIfNull, - "vv", o, attr_name); -} - -DEFINEFN -bool PsycoObject_SetAttr(PsycoObject* po, vinfo_t* o, - vinfo_t* vattrname, vinfo_t* v) -{ - PyObject* name; - PyTypeObject* tp; - vinfo_t* vresult; - /* as in PsycoObject_GenericGetAttr() we don't try to analyse - a non-constant vattrname */ - if (!is_compiletime(vattrname->source)) - goto generic; - - tp = (PyTypeObject*) Psyco_NeedType(po, o); - if (tp == NULL) - return false; - - name = (PyObject*) CompileTime_Get(vattrname->source)->value; - if (!PyString_Check(name)){ -#ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { -# if PSYCO_CAN_CALL_UNICODE - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) { - psyco_virtualize_exception(po); - return NULL; - } -# else - goto generic; -# endif - } - else -#endif - { - PycException_SetString(po, PyExc_TypeError, - "attribute name must be string"); - return false; - } - } - else - Py_INCREF(name); - - PyString_InternInPlace(&name); - if (tp->tp_setattro != NULL) { - vresult = Psyco_META3(po, tp->tp_setattro, - CfNoReturnValue|CfPyErrIfNonNull, - v ? "vlv" : "vll", o, name, v); - Py_DECREF(name); - return vresult != NULL; - } - if (tp->tp_setattr != NULL) { - vresult = Psyco_META3(po, tp->tp_setattr, - CfNoReturnValue|CfPyErrIfNonNull, - v ? "vlv" : "vll", o, - (long)PyString_AS_STRING(name), v); - Py_DECREF(name); - return vresult != NULL; - } - Py_DECREF(name); - - generic: - /* fall-back implementation */ - return psyco_generic_call(po, PyObject_SetAttr, - CfNoReturnValue|CfPyErrIfNonNull, - v ? "vvv" : "vvl", o, vattrname, v) != NULL; -} - -/* Helper to get the offset an object's __dict__ slot, if any. - Return a defield_t to the base offset, or NO_PREV_FIELD if there is - no __dict__ slot. A variable offset may be computed and stored in - *varindex. */ - -static defield_t getdictoffset(PsycoObject* po, vinfo_t* obj, vinfo_t** varindex) -{ - long dictoffset; - PyTypeObject *tp = Psyco_FastType(obj); - - /*if (!(tp->tp_flags & Py_TPFLAGS_HAVE_CLASS)) - return NO_PREV_FIELD;*/ - dictoffset = tp->tp_dictoffset; - if (dictoffset == 0) - return NO_PREV_FIELD; - if (dictoffset < 0) { - vinfo_t* size1; - vinfo_t* ob_size = psyco_get_field(po, obj, VAR_signed_size); - if (ob_size == NULL) - return NO_PREV_FIELD; - size1 = integer_abs(po, ob_size, false); - vinfo_decref(ob_size, po); - if (size1 == NULL) - return NO_PREV_FIELD; - - extra_assert(dictoffset % SIZEOF_VOID_P == 0); - /* the following code emulates _PyObject_VAR_SIZE() */ - if ((tp->tp_itemsize & (SIZEOF_VOID_P-1)) == 0 && - (tp->tp_basicsize & (SIZEOF_VOID_P-1)) == 0) { - /* the result is automatically aligned */ - vinfo_t* a; - a = integer_mul_i(po, size1, - tp->tp_itemsize / SIZEOF_VOID_P); - vinfo_decref(size1, po); - if (a == NULL) - return NO_PREV_FIELD; - *varindex = a; - dictoffset = tp->tp_basicsize + dictoffset; - } - else { - /* need to align the result to the next - SIZEOF_VOID_P boundary */ - vinfo_t* a; - vinfo_t* b; - vinfo_t* c; - a = integer_mul_i(po, size1, tp->tp_itemsize); - vinfo_decref(size1, po); - if (a == NULL) - return NO_PREV_FIELD; - c = integer_add_i(po, a, tp->tp_basicsize + dictoffset + - SIZEOF_VOID_P - 1, false); - vinfo_decref(a, po); - if (c == NULL) - return NO_PREV_FIELD; - b = integer_urshift_i(po, c, SIZE_OF_LONG_BITS); - vinfo_decref(c, po); - if (b == NULL) - return NO_PREV_FIELD; - *varindex = b; - dictoffset = 0; - } - } - return FMUT(DEF_ARRAY(PyObject*, dictoffset)); -} - -DEFINEFN -vinfo_t* PsycoObject_GenericGetAttr(PsycoObject* po, vinfo_t* obj, - vinfo_t* vname) -{ - PyTypeObject* tp; - PyObject *descr = NULL; - vinfo_t* res = NULL; - descrgetfunc f; - PyObject* name; - defield_t dictofsbase; - vinfo_t* dictofs; - - /* 'name' is generally known at compile-time. - We could promote it at compile-time with - - name = psyco_pyobj_atcompiletime(po, vname); - if (name == NULL) - return NULL; - - but we don't, because run-time names generally - mean that the Python code uses functions like getattr(), - probably inside of a loop, with a lot of various - attributes. Let's emit a call to PyObject_GenericGetAttr - instead. */ - if (!is_compiletime(vname->source)) { - fallback: - return psyco_generic_call(po, PyObject_GenericGetAttr, - CfReturnRef|CfPyErrIfNull, - "vv", obj, vname); - } - name = (PyObject*) CompileTime_Get(vname->source)->value; - - if (!PyString_Check(name)){ -#ifdef Py_USING_UNICODE - /* The Unicode to string conversion is done here because the - existing tp_setattro slots expect a string object as name - and we wouldn't want to break those. */ - if (PyUnicode_Check(name)) { -# if PSYCO_CAN_CALL_UNICODE - name = PyUnicode_AsEncodedString(name, NULL, NULL); - if (name == NULL) { - psyco_virtualize_exception(po); - return NULL; - } -# else - goto fallback; -# endif - } - else -#endif - { - PycException_SetString(po, PyExc_TypeError, - "attribute name must be string"); - return NULL; - } - } - else - Py_INCREF(name); - - /* we need the type of 'obj' at compile-time */ - tp = (PyTypeObject*) Psyco_NeedType(po, obj); - if (tp == NULL) - goto done; - - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) { - psyco_virtualize_exception(po); - goto done; - } - } - - /* XXX this is broken because the type might have been modified - XXX since the last time we were here! */ - descr = _PyType_Lookup(tp, name); - Py_XINCREF(descr); - - f = NULL; - if (descr != NULL && - PyType_HasFeature(descr->ob_type, Py_TPFLAGS_HAVE_CLASS)) { - f = descr->ob_type->tp_descr_get; - if (f != NULL && PyDescr_IsData(descr)) { - res = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, - "lvl", descr, obj, tp); - goto done; - } - } - - dictofs = NULL; - dictofsbase = getdictoffset(po, obj, &dictofs); - if (dictofsbase == NO_PREV_FIELD) { - if (PycException_Occurred(po)) - goto done; - /* no __dict__ slot */ - } - else { - condition_code_t cc; - int cond; - vinfo_t* dict; - if (dictofs == NULL) - dict = psyco_get_field(po, obj, dictofsbase); - else { - dict = psyco_get_field_array(po, obj, dictofsbase, - dictofs); - vinfo_decref(dictofs, po); - } - if (dict == NULL) - goto done; - cc = integer_non_null(po, dict); - if (cc == CC_ERROR) { - vinfo_decref(dict, po); - goto done; - } - - if (runtime_condition_t(po, cc)) { - /* the __dict__ slot contains a non-NULL value */ - res = psyco_generic_call(po, PyDict_GetItem, - CfReturnNormal, - "vl", dict, (long) name); - vinfo_decref(dict, po); - if (res == NULL) - goto done; - Py_INCREF(name); /* XXX ref hold by the code buf */ - - /* if there is a method descriptor of the same name, - then it is likely that we don't find an attribute - with that name; otherwise, it is likely that we - do find it. */ - cc = integer_non_null(po, res); - if (cc == CC_ERROR) { - vinfo_decref(res, po); - goto done; - } - - if (f != NULL) - cond = runtime_condition_f(po, cc); - else - cond = runtime_condition_t(po, cc); - - if (cond) { - /* we have found the attribute */ - need_reference(po, res); - goto done; - } - else { - /* there is no such attribute */ - vinfo_decref(res, po); - res = NULL; - } - } - else { - /* the __dict__ slot contains NULL */ - vinfo_decref(dict, po); - } - } - - if (f != NULL) { - res = Psyco_META3(po, f, CfReturnRef|CfPyErrIfNull, - "lvl", descr, obj, tp); - goto done; - } - - if (descr != NULL) { - source_known_t* sk = sk_new((long) descr, SkFlagPyObj); - descr = NULL; - res = vinfo_new(CompileTime_NewSk(sk)); - goto done; - } - - PycException_SetFormat(po, PyExc_AttributeError, - "'%.50s' object has no attribute '%.400s'", - tp->tp_name, PyString_AS_STRING(name)); - done: - Py_XDECREF(descr); - Py_DECREF(name); - return res; -} - - -/* Macro to get the tp_richcompare field of a type if defined */ -#define RICHCOMPARE(t) (PyType_HasFeature((t), Py_TPFLAGS_HAVE_RICHCOMPARE) \ - ? (t)->tp_richcompare : NULL) - - -/* Map rich comparison operators to their swapped version, e.g. LT --> GT */ -static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE}; - -static vinfo_t* try_rich_compare(PsycoObject* po, vinfo_t* v, vinfo_t* w, int op) -{ - bool swap; - PyTypeObject* vtp = Psyco_FastType(v); - PyTypeObject* wtp = Psyco_FastType(w); - richcmpfunc fv = RICHCOMPARE(vtp); - richcmpfunc fw = RICHCOMPARE(wtp); - vinfo_t* res; - - swap = (vtp != wtp && - PyType_IsSubtype(wtp, vtp) && - fw != NULL); - if (swap) { - res = Psyco_META3(po, fw, CfReturnRef|CfPyErrNotImplemented, - "vvl", w, v, swapped_op[op]); - if (IS_IMPLEMENTED(res)) - return res; /* 'res' might be NULL */ - vinfo_decref(res, po); - } - if (fv != NULL) { - res = Psyco_META3(po, fv, CfReturnRef|CfPyErrNotImplemented, - "vvl", v, w, op); - if (IS_IMPLEMENTED(res)) - return res; - vinfo_decref(res, po); - } - if (!swap && fw != NULL) { - return Psyco_META3(po, fw, CfReturnRef|CfPyErrNotImplemented, - "vvl", w, v, swapped_op[op]); - } - return psyco_vi_NotImplemented(); -} - -PSY_INLINE vinfo_t* convert_3way_to_object(PsycoObject* po, int op, vinfo_t* c) -{ - condition_code_t cc = integer_cmp_i(po, c, 0, op); - if (cc == CC_ERROR) - return NULL; - return PsycoBool_FromCondition(po, cc); -} - -PSY_INLINE vinfo_t* try_3way_to_rich_compare(PsycoObject* po, vinfo_t* v, - vinfo_t* w, int op) -{ - /* XXX implement me (some day) */ - return psyco_generic_call(po, PyObject_RichCompare, - CfReturnRef|CfPyErrIfNull, - "vvl", v, w, (long) op); -} - -DEFINEFN vinfo_t* PsycoObject_RichCompare(PsycoObject* po, vinfo_t* v, - vinfo_t* w, int op) -{ - PyTypeObject* vtp; - PyTypeObject* wtp; - vinfo_t* res; - cmpfunc f; - extra_assert(Py_LT <= op && op <= Py_GE); - - /* XXX try to detect circular data structures */ - - vtp = (PyTypeObject*) Psyco_NeedType(po, v); - if (vtp == NULL) - return NULL; - wtp = (PyTypeObject*) Psyco_NeedType(po, w); - if (wtp == NULL) - return NULL; - - /* If the types are equal, don't bother with coercions etc. - Instances are special-cased in try_3way_compare, since - a result of 2 does *not* mean one value being greater - than the other. */ - if (vtp == wtp - && (f = vtp->tp_compare) != NULL - && !PyType_TypeCheck(vtp, &PyInstance_Type)) { - vinfo_t* c; - richcmpfunc f1; - if (vtp == &PyInt_Type) { - /* Special-case integers because they don't use - rich comparison, and the plain 3-way comparisons - are too low-level for serious optimizations - (they would require building the value -1, 0 or - 1 in a register and then testing it). */ - return PsycoIntInt_RichCompare(po, v, w, op); - } - if ((f1 = RICHCOMPARE(vtp)) != NULL) { - /* If the type has richcmp, try it first. - try_rich_compare would try it two-sided, - which is not needed since we've a single - type only. */ - res = Psyco_META3(po, f1, - CfReturnRef|CfPyErrNotImplemented, - "vvl", v, w, (long) op); - if (IS_IMPLEMENTED(res)) - return res; - vinfo_decref(res, po); - } - c = Psyco_META2(po, f, CfReturnNormal|CfPyErrCheck, - "vv", v, w); - if (c == NULL) - return NULL; - res = convert_3way_to_object(po, op, c); - vinfo_decref(c, po); - return res; - } - - res = try_rich_compare(po, v, w, op); - if (IS_IMPLEMENTED(res)) - return res; - vinfo_decref(res, po); - - return try_3way_to_rich_compare(po, v, w, op); -} - -DEFINEFN -vinfo_t* PsycoObject_RichCompareBool(PsycoObject* po, - vinfo_t* v, vinfo_t* w, int op) -{ - vinfo_t* diff; - vinfo_t* result = PsycoObject_RichCompare(po, v, w, op); - if (result == NULL) - return NULL; - diff = PsycoObject_IsTrue(po, result); - vinfo_decref(result, po); - return diff; -} - -static vinfo_t* collect_undeletable_vars(vinfo_t* vi, vinfo_t* link) -{ - int i; - PyTypeObject* tp; - switch (gettime(vi->source)) { - - case RunTime: - if (vi->tmp != NULL || (vi->source & RunTime_NoRef) != 0) - break; /* already seen or not holding a ref */ - tp = Psyco_KnownType(vi); - if (tp && (tp == &PyInt_Type || tp == &PyString_Type || -#if BOOLEAN_TYPE - tp == &PyBool_Type || -#endif - tp == &PyFloat_Type || tp == &PyLong_Type || - tp == Py_None->ob_type || tp == &PyRange_Type)) - break; /* known safe type */ - /* make a linked list of results */ - vi->tmp = link; - link = vi; - break; - - case VirtualTime: - for (i=vi->array->count; i--; ) - if (vi->array->items[i] != NULL) - link = collect_undeletable_vars( - vi->array->items[i], link); - break; - - default: - break; - } - return link; -} - -DEFINEFN -vinfo_t* Psyco_SafelyDeleteVar(PsycoObject* po, vinfo_t* vi) -{ - vinfo_t* result; - vinfo_t* head; - vinfo_t* queue = (vinfo_t*) 1; - vinfo_t* p; - int count; - vi->tmp = NULL; - clear_tmp_marks(vi->array); - - head = collect_undeletable_vars(vi, queue); - count = 0; - for (p = head; p != queue; p = p->tmp) { - vinfo_array_t* a = p->array; - p->array = NullArray; - array_delete(a, po); - count++; - } - if (count == 0) { - result = psyco_vi_Zero(); - } - else if (count == 1) { - result = head; - vinfo_incref(result); - } - else { - result = vinfo_new( - VirtualTime_New(&psyco_vsource_not_important)); - count += iOB_TYPE + 1; - result->array = array_new(count); - for (p = head; p != queue; p = p->tmp) { - vinfo_incref(p); - result->array->items[--count] = p; - } - } - return result; -} - - -INITIALIZATIONFN -void psy_object_init(void) -{ -#if USE_RUNTIME_SWITCHES - long values[3]; - int cnt; - - values[0] = (long)(&PyInt_Type); - psyco_build_run_time_switch(&psyfs_int, SkFlagFixed, values, 1); - - values[0] = (long)(&PyInt_Type); - values[1] = (long)(&PyLong_Type); - values[2] = (long)(&PyFloat_Type); - psyco_build_run_time_switch(&psyfs_int_long, SkFlagFixed, values, 2); - psyco_build_run_time_switch(&psyfs_int_long_float, SkFlagFixed, values, 3); - - values[0] = (long)(&PyTuple_Type); - values[1] = (long)(&PyList_Type); - psyco_build_run_time_switch(&psyfs_tuple_list, SkFlagFixed, values, 2); - - values[0] = (long)(&PyString_Type); -#ifdef Py_USING_UNICODE - values[1] = (long)(&PyUnicode_Type); - cnt = 2; -#else - cnt = 1; -#endif - psyco_build_run_time_switch(&psyfs_string_unicode, SkFlagFixed, - values, cnt); - - values[0] = (long)(Py_None->ob_type); - psyco_build_run_time_switch(&psyfs_none, SkFlagFixed, values, 1); - - values[0] = (long)(&PyTuple_Type); - psyco_build_run_time_switch(&psyfs_tuple, SkFlagFixed, values, 1); - - values[0] = (long)(&PyDict_Type); - psyco_build_run_time_switch(&psyfs_dict, SkFlagFixed, values, 1); -#endif /* USE_RUNTIME_SWITCHES */ - - /* associate the Python implementation of some functions with - the one from Psyco */ - Psyco_DefineMeta(PyObject_GenericGetAttr, PsycoObject_GenericGetAttr); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pobject.h b/nodebox/ext/psyco/src/c/Objects/pobject.h deleted file mode 100644 index 477796a..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pobject.h +++ /dev/null @@ -1,182 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of object.h ***/ - /***************************************************************/ - -#ifndef _PSY_OBJECT_H -#define _PSY_OBJECT_H - - -#include "../Python/pycompiler.h" - - -/*#define OB_REFCOUNT never directly manipulated*/ -#define OB_type DEF_FIELD(PyObject, PyTypeObject*, ob_type, NO_PREV_FIELD) -#define FIX_size NONNEG_FIELD(PyVarObject, int, ob_size, OB_type) -#define VAR_size FMUT(FIX_size) -#define FIX_signed_size DEF_FIELD(PyVarObject, int, ob_size, OB_type) -#define VAR_signed_size FMUT(FIX_signed_size) - -#define iOB_TYPE FIELD_INDEX(OB_type) -#define iFIX_SIZE FIELD_INDEX(FIX_size) -#define iVAR_SIZE FIELD_INDEX(VAR_size) - - -/* common type checkers, rewritten because in Psyco we manipulate type - objects directly and Python's usual macros insist on taking a regular - PyObject* whose type is checked. */ -# define PyType_TypeCheck(tp1, tp) \ - ((tp1) == (tp) || PyType_IsSubtype((tp1), (tp))) - -#define PsycoIter_Check(tp) \ - (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_ITER) && \ - (tp)->tp_iternext != NULL) - -#define PsycoSequence_Check(tp) \ - ((tp)->tp_as_sequence && (tp)->tp_as_sequence->sq_item != NULL) - - -/* Return the type of an object, or NULL in case of exception (typically - a promotion exception). */ -EXTERNFN PyTypeObject* Psyco_NeedType(PsycoObject* po, vinfo_t* vi); - -PSY_INLINE PyTypeObject* Psyco_FastType(vinfo_t* vi) { - /* fast version. Only call this when you know the type has - already been loaded by a previous Psyco_NeedType() */ - vinfo_t* vtp = vinfo_getitem(vi, iOB_TYPE); - if (vtp == NULL) { - PyObject* o = (PyObject*) CompileTime_Get(vi->source)->value; - return o->ob_type; - } - else { - return (PyTypeObject*) CompileTime_Get(vtp->source)->value; - } -} -#if USE_RUNTIME_SWITCHES -# error "Disabled because of type inheritance. The switch overlooks subtypes." -/* Check for the type of an object. Returns the index in the set 'fs' or - -1 if not in the set (or if exception). Used this is better than - Psyco_NeedType() if you are only interested in some types, not all of them. */ -PSY_INLINE int Psyco_TypeSwitch(PsycoObject* po, vinfo_t* vi, fixed_switch_t* fs) { - vinfo_t* vtp = get_array_item(po, vi, OB_TYPE); - if (vtp == NULL) - return -1; - return psyco_switch_index(po, vtp, fs); -} -#endif - -/* Is the given object is of the given type (or a subtype of it) ? - Returns -1 in case of error or if promotion is requested. */ -PSY_INLINE int Psyco_VerifyType(PsycoObject* po, vinfo_t* vi, PyTypeObject* tp) { - PyTypeObject* vtp = Psyco_NeedType(po, vi); - if (vtp == NULL) - return -1; - return PyType_TypeCheck(vtp, tp); -} -/* Return the type that the object is known to be of, or NULL if unknown. - Never fails. */ -EXTERNFN PyTypeObject* Psyco_KnownType(vinfo_t* vi); - -/* Use this to assert the type of an object. Do not use unless you are - sure about it! (e.g. don't use this for integer-computing functions - if they might return a long in case of overflow) */ -PSY_INLINE void Psyco_AssertType(PsycoObject* po, vinfo_t* vi, PyTypeObject* tp) { - psyco_assert_field(po, vi, OB_type, (long) tp); -} - -/* Same as integer_non_null() but assumes we are testing a PyObject* pointer, - so that only compile-time NULLs or run-time pointers from which we have - not read anything yet can be NULL. Virtual-time pointers are assumed never - to be NULL. */ -PSY_INLINE condition_code_t object_non_null(PsycoObject* po, vinfo_t* v) { - if (is_virtualtime(v->source) || v->array != NullArray) - return CC_ALWAYS_TRUE; - else - return integer_non_null(po, v); -} - - -/* The following functions are Psyco implementations of common functions - of the standard interpreter. */ -EXTERNFN vinfo_t* PsycoObject_IsTrue(PsycoObject* po, vinfo_t* vi); -EXTERNFN vinfo_t* PsycoObject_Repr(PsycoObject* po, vinfo_t* vi); - -/* Note: DelAttr() is SetAttr() with 'v' set to NULL (and not some vinfo_t - that would happend to contain zero). */ -EXTERNFN vinfo_t* PsycoObject_GetAttr(PsycoObject* po, vinfo_t* o, - vinfo_t* attr_name); -EXTERNFN bool PsycoObject_SetAttr(PsycoObject* po, vinfo_t* o, - vinfo_t* attr_name, vinfo_t* v); -EXTERNFN vinfo_t* PsycoObject_GenericGetAttr(PsycoObject* po, vinfo_t* obj, - vinfo_t* vname); - -EXTERNFN vinfo_t* PsycoObject_RichCompare(PsycoObject* po, vinfo_t* v, - vinfo_t* w, int op); -EXTERNFN vinfo_t* PsycoObject_RichCompareBool(PsycoObject* po, - vinfo_t* v, - vinfo_t* w, int op); - - -/* a quick way to specify the type of the object returned by an operation - when it is known, without having to go into all the details of the - operation itself (be careful, you must be *sure* of the return type): */ - -#define DEF_KNOWN_RET_TYPE_1(cname, op, flags, knowntype) \ - DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ - (PsycoObject* po, vinfo_t* v1), \ - (po, op, flags, "v", v1)) -#define DEF_KNOWN_RET_TYPE_2(cname, op, flags, knowntype) \ - DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ - (PsycoObject* po, vinfo_t* v1, vinfo_t* v2), \ - (po, op, flags, "vv", v1, v2)) -#define DEF_KNOWN_RET_TYPE_3(cname, op, flags, knowntype) \ - DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ - (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, \ - vinfo_t* v3), \ - (po, op, flags, "vvv", v1, v2, v3)) -#define DEF_KNOWN_RET_TYPE_4(cname, op, flags, knowntype) \ - DEF_KNOWN_RET_TYPE_internal(cname, knowntype, \ - (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, \ - vinfo_t* v3, vinfo_t* v4), \ - (po, op, flags, "vvvv", v1, v2, v3, v4)) - -#define DEF_KNOWN_RET_TYPE_internal(cname, knowntype, fargs, gargs) \ -static vinfo_t* cname fargs { \ - vinfo_t* result = psyco_generic_call gargs ; \ - if (result != NULL && !IS_NOTIMPLEMENTED(result)) { \ - Psyco_AssertType(po, result, knowntype); \ - } \ - return result; \ -} - -/* 'true' unless 'x' is exactly the special 'not implemented' value - built by psyco_generic_call with CfPyErrNotImplemented */ -#define IS_IMPLEMENTED(x) ((x) == NULL || !IS_NOTIMPLEMENTED(x)) - -/* is 'x' the special 'not implemented' value? */ -#define IS_NOTIMPLEMENTED(x) \ - ((x)->source == CompileTime_NewSk(&psyco_skNotImplemented)) - - -#if USE_RUNTIME_SWITCHES -/* definition of commonly used "fixed switches", i.e. sets of - values (duplicating fixed switch structures for the same set - of value can inccur a run-time performance loss in some cases) */ - -/* the variable names list the values in order. - 'int' means '&PyInt_Type' etc. */ -EXTERNVAR fixed_switch_t psyfs_int; -EXTERNVAR fixed_switch_t psyfs_int_long; -EXTERNVAR fixed_switch_t psyfs_int_long_float; -EXTERNVAR fixed_switch_t psyfs_tuple_list; -EXTERNVAR fixed_switch_t psyfs_string_unicode; -EXTERNVAR fixed_switch_t psyfs_tuple; -EXTERNVAR fixed_switch_t psyfs_dict; -EXTERNVAR fixed_switch_t psyfs_none; -/* NOTE: don't forget to update pobject.c when adding new variables here */ -#endif - -/* for dispatcher.c */ -EXTERNFN vinfo_t* Psyco_SafelyDeleteVar(PsycoObject* po, vinfo_t* vi); - - -#endif /* _PSY_OBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/prangeobject.c b/nodebox/ext/psyco/src/c/Objects/prangeobject.c deleted file mode 100644 index ac06ad1..0000000 --- a/nodebox/ext/psyco/src/c/Objects/prangeobject.c +++ /dev/null @@ -1,231 +0,0 @@ -#include "prangeobject.h" -#include "pintobject.h" -#include "piterobject.h" -#include "../Python/pycinternal.h" - - - /***************************************************************/ - /*** Virtual xrange objects ***/ - -/* This is private in rangeobject.c - */ -struct rangeobject { - PyObject_HEAD - long start; - long step; - long len; -}; - -/* only step == 1 currently supported */ -#define RANGEOBJECT_start DEF_FIELD(struct rangeobject, long, start, OB_type) -#define RANGEOBJECT_step DEF_FIELD(struct rangeobject, long, step, RANGEOBJECT_start) -#define RANGEOBJECT_len DEF_FIELD(struct rangeobject, long, len, RANGEOBJECT_step) -#define iRANGE_START FIELD_INDEX(RANGEOBJECT_start) -#define iRANGE_STEP FIELD_INDEX(RANGEOBJECT_step) -#define iRANGE_LEN FIELD_INDEX(RANGEOBJECT_len) -#define RANGEOBJECT_TOTAL FIELDS_TOTAL(RANGEOBJECT_len) - - -static source_virtual_t psyco_computed_xrange; - -static PyObject* cimpl_xrange_new(long start, long len) -{ - struct rangeobject *obj; - obj = PyObject_New(struct rangeobject, &PyRange_Type); - if (obj == NULL) - return NULL; - obj->start = start; - obj->len = len; - obj->step = 1; - return (PyObject *) obj; -} - -static bool compute_xrange(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* vstart; - vinfo_t* vlen; - vinfo_t* newobj; - - /* get the fields from the Python object 'v' */ - vstart = vinfo_getitem(v, iRANGE_START); - if (vstart == NULL) - return false; - - vlen = vinfo_getitem(v, iRANGE_LEN); - if (vlen == NULL) - return false; - - /* call PyRange_New() */ - newobj = psyco_generic_call(po, cimpl_xrange_new, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", vstart, vlen); - if (newobj == NULL) - return false; - - /* move the resulting non-virtual Python object back into 'v' */ - vinfo_move(po, v, newobj); - return true; -} - -static PyObject* direct_compute_xrange(vinfo_t* v, char* data) -{ - long start, len; - start = direct_read_vinfo(vinfo_getitem(v, iRANGE_START), data); - len = direct_read_vinfo(vinfo_getitem(v, iRANGE_LEN), data); - if (PyErr_Occurred()) - return NULL; - return cimpl_xrange_new(start, len); -} - -DEFINEFN -vinfo_t* PsycoXRange_NEW(PsycoObject* po, vinfo_t* start, vinfo_t* len) -{ - vinfo_t* r = vinfo_new(VirtualTime_New(&psyco_computed_xrange)); - r->array = array_new(RANGEOBJECT_TOTAL); - r->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyRange_Type))); - r->array->items[iRANGE_START] = start; - r->array->items[iRANGE_STEP] = psyco_vi_One(); - r->array->items[iRANGE_LEN] = len; - return r; -} - - - /***************************************************************/ - /*** Virtual list range objects ***/ - -/* NB. The fields in the virtual range object are different from the ones in - virtual xrange objects. This is necessary because they must be compatible - with real list objects... */ - -DEFINEVAR source_virtual_t psyco_computed_listrange; - -static PyObject* cimpl_listrange(long start, long len) -{ - PyObject* lst = PyList_New(len); - long i; - if (lst != NULL) - { - for (i=0; iarray = array_new(RANGE_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyList_Type))); - result->array->items[RANGE_LEN] = len; - result->array->items[RANGE_START] = start; - return result; -} - - - /***************************************************************/ - /*** xrange objects meta-implementation ***/ - -static vinfo_t* prange_length(PsycoObject* po, vinfo_t* vi) -{ - return psyco_get_field(po, vi, RANGEOBJECT_len); -} - -static vinfo_t* prange_item(PsycoObject* po, vinfo_t* a, vinfo_t* i) -{ - condition_code_t cc; - vinfo_t* vstart; - vinfo_t* vstep; - vinfo_t* vlen; - vinfo_t* vdelta; - vinfo_t* result; - - vlen = psyco_get_const(po, a, RANGEOBJECT_len); - if (vlen == NULL) - return NULL; - - cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); - if (cc == CC_ERROR) - return NULL; - - if (runtime_condition_f(po, cc)) { - PycException_SetString(po, PyExc_IndexError, - "xrange object index out of range"); - return NULL; - } - assert_nonneg(i); - - vstep = psyco_get_const(po, a, RANGEOBJECT_step); - if (vstep == NULL) - return NULL; - - vstart = psyco_get_const(po, a, RANGEOBJECT_start); - if (vstart == NULL) - return NULL; - - vdelta = integer_mul(po, vstep, i, false); - if (vdelta == NULL) - return NULL; - - result = integer_add(po, vstart, vdelta, false); - vinfo_decref(vdelta, po); - if (result == NULL) - return NULL; - return PsycoInt_FROM_LONG(result); -} - - -INITIALIZATIONFN -void psy_rangeobject_init(void) -{ - PySequenceMethods *m = PyRange_Type.tp_as_sequence; - Psyco_DefineMeta(m->sq_length, prange_length); - Psyco_DefineMeta(m->sq_item, prange_item); - if (PyRange_Type.tp_iter != NULL) /* Python >= 2.3 */ - Psyco_DefineMeta(PyRange_Type.tp_iter, PsycoSeqIter_New); - INIT_SVIRTUAL(psyco_computed_xrange, compute_xrange, - direct_compute_xrange, 0, 0, 0); - INIT_SVIRTUAL_NOCALL(psyco_computed_listrange, compute_listrange, 0); - /* ranges, unlike xranges, are mutable; - they must be forced out of virtual-time across function calls */ -} diff --git a/nodebox/ext/psyco/src/c/Objects/prangeobject.h b/nodebox/ext/psyco/src/c/Objects/prangeobject.h deleted file mode 100644 index 81522fb..0000000 --- a/nodebox/ext/psyco/src/c/Objects/prangeobject.h +++ /dev/null @@ -1,36 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of rangeobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_RANGEOBJECT_H -#define _PSY_RANGEOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" -#include "plistobject.h" - - -/* currently step == 1 only */ -/* The following functions *consume* a reference to start and len ! */ - -/* for xrange() */ -EXTERNFN vinfo_t* PsycoXRange_NEW(PsycoObject* po, vinfo_t* start, vinfo_t* len); -/* for range() */ -EXTERNFN vinfo_t* PsycoListRange_NEW(PsycoObject* po, vinfo_t* start, vinfo_t* len); - - - /***************************************************************/ - /*** Virtual list range objects (not for xrange) ***/ - -#define RANGE_LEN iVAR_SIZE /* for virtual range() only */ -#define RANGE_START LIST_TOTAL /* " */ -/*#define RANGE_STEP (RANGE_START+1) * " */ -#define RANGE_TOTAL /*(RANGE_STEP+1)*/ (RANGE_START+1) -/* XXX no support for steps currently. Needs implementation of division to - figure out the length. */ - -EXTERNVAR source_virtual_t psyco_computed_listrange; - - -#endif /* _PSY_RANGEOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pstringobject.c b/nodebox/ext/psyco/src/c/Objects/pstringobject.c deleted file mode 100644 index e499406..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pstringobject.c +++ /dev/null @@ -1,1221 +0,0 @@ -#include "pstringobject.h" -#include "pstructmember.h" -#include "../pycodegen.h" - -#if USE_CATSTR -#include "plistobject.h" -#endif - - -static PyObject* pempty_string; - -static vinfo_t* pstr_memory_source(PsycoObject* po, vinfo_t* s); - - -/***************************************************************/ -/* string characters. */ -static source_virtual_t psyco_computed_char; - -static PyObject* cimpl_character(char c) -{ - return PyString_FromStringAndSize(&c, 1); -} - -static bool compute_char(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* chrval; - vinfo_t* newobj; - - chrval = vinfo_getitem(v, CHARACTER_CHAR); - if (chrval == NULL) - return false; - - newobj = psyco_generic_call(po, cimpl_character, - CfPure|CfReturnRef|CfPyErrIfNull, - "v", chrval); - if (newobj == NULL) - return false; - - /* move the resulting non-virtual Python object back into 'v' */ - vinfo_move(po, v, newobj); - return true; -} - -static PyObject* direct_compute_char(vinfo_t* v, char* data) -{ - char c; - c = (char) direct_read_vinfo(vinfo_getitem(v, CHARACTER_CHAR), data); - if (c == -1 && PyErr_Occurred()) - return NULL; - return PyString_FromStringAndSize(&c, 1); -} - - -PSY_INLINE vinfo_t* PsycoCharacter_NEW(vinfo_t* chrval) -{ - /* consumes a ref to 'chrval' */ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_char)); - result->array = array_new(CHARACTER_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyString_Type))); - result->array->items[iFIX_SIZE] = psyco_vi_One(); - result->array->items[CHARACTER_CHAR] = chrval; assert_nonneg(chrval); - return result; -} - -DEFINEFN -vinfo_t* PsycoCharacter_New(vinfo_t* chrval) -{ - vinfo_incref(chrval); - return PsycoCharacter_NEW(chrval); -} - -PSY_INLINE defield_t first_character(vinfo_t* v) -{ - if (v->source == VirtualTime_New(&psyco_computed_char)) - return (defield_t) CHARACTER_CHAR; - else - return STR_sval; -} - -DEFINEFN bool PsycoCharacter_Ord(PsycoObject* po, vinfo_t* v, vinfo_t** vord) -{ - vinfo_t* vlen; - PyTypeObject* vtp; - condition_code_t cc; - vinfo_t* result = NULL; - - if (v->source == VirtualTime_New(&psyco_computed_char)) { - result = vinfo_getitem(v, CHARACTER_CHAR); - if (result != NULL) { - vinfo_incref(result); - goto done; - } - } - - vtp = Psyco_NeedType(po, v); - if (vtp == NULL) - return false; - - if (PyType_TypeCheck(vtp, &PyString_Type)) { - vlen = PsycoString_GET_SIZE(po, v); - if (vlen == NULL) - return false; - cc = integer_cmp_i(po, vlen, 1, Py_EQ); - if (cc == CC_ERROR) - return false; - if (runtime_condition_t(po, cc)) - result = psyco_get_field(po, v, STR_sval); - } - done: - *vord = result; - return true; -} - - -/***************************************************************/ -/* string slices. */ -static source_virtual_t psyco_computed_strslice; - -/* a virtual string obtained as a slice of a source string STRSLICE_SOURCE. - The slice range is defined as [STRSLICE_START:STRSLICE_START+FIX_SIZE] */ - -static bool compute_strslice(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* newobj; - vinfo_t* ptr; - vinfo_t* tmp; - vinfo_t* source; - vinfo_t* start; - vinfo_t* length; - - source = vinfo_getitem(v, STRSLICE_SOURCE); - start = vinfo_getitem(v, STRSLICE_START); - length = vinfo_getitem(v, iFIX_SIZE); - if (source==NULL || start==NULL || length==NULL) - return false; - - tmp = integer_add(po, source, start, false); - if (tmp == NULL) - return false; - ptr = integer_add_i(po, tmp, offsetof(PyStringObject, ob_sval), false); - vinfo_decref(tmp, po); - if (ptr == NULL) - return false; - - newobj = psyco_generic_call(po, PyString_FromStringAndSize, - CfPure|CfReturnRef|CfPyErrIfNull, - "vv", ptr, length); - vinfo_decref(ptr, po); - if (newobj == NULL) - return false; - - /* forget fields that were only relevant in virtual-time */ - vinfo_setitem(po, v, STRSLICE_SOURCE, NULL); - vinfo_setitem(po, v, STRSLICE_START, NULL); - - /* move the resulting non-virtual Python object back into 'v' */ - vinfo_move(po, v, newobj); - return true; -} - -static PyObject* direct_compute_strslice(vinfo_t* v, char* data) -{ - PyObject* source; - long start, length; - PyObject* result = NULL; - source = direct_xobj_vinfo(vinfo_getitem(v, STRSLICE_SOURCE), data); - start = direct_read_vinfo(vinfo_getitem(v, STRSLICE_START), data); - length = direct_read_vinfo(vinfo_getitem(v, iFIX_SIZE), data); - if (!PyErr_Occurred() && source != NULL && PyString_Check(source)) { - char* p = PyString_AS_STRING(source); - result = PyString_FromStringAndSize(p+start, length); - } - Py_XDECREF(source); - return result; -} - -PSY_INLINE vinfo_t* PsycoStrSlice_NEW(vinfo_t* source, vinfo_t* start, vinfo_t* len) -{ - /* consumes a ref to all arguments */ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_strslice)); - result->array = array_new(STRSLICE_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyString_Type))); - result->array->items[iFIX_SIZE] = len; assert_nonneg(len); - result->array->items[STRSLICE_SOURCE] = source; - result->array->items[STRSLICE_START] = start; assert_nonneg(start); - return result; -} - - -#if USE_CATSTR -/***************************************************************/ -/* string concatenations. */ -static source_virtual_t psyco_computed_catstr; - -/* a virtual string defined as the concatenation of all the strings - in a given list. The list must not be user-visible nor shared in - any way, because the correct total length *must always* remain in - FIX_SIZE. - NB: compute_catstr is not too smart with lists of length 1, and - does not work at all with empty lists. */ - -static PyObject* cimpl_concatenate(int totallen, PyObject* lst) -{ - /* C implementation -- equivalent of ''.join(lst), - optimized to skip checks and with a known total length */ - PyObject* result; - extra_assert(PyList_Check(lst)); - - result = PyString_FromStringAndSize(NULL, totallen); - if (result != NULL) { - char* dest = PyString_AS_STRING(result); - int i, slen, count = PyList_GET_SIZE(lst); - PyObject* s; - - for (i=0; iarray->items[VLIST_ITEMS+0])->source) && - !is_virtualtime((t=list->array->items[VLIST_ITEMS+1])->source)) { - /* optimize (for code size) the common case of the sum of two - non-virtual strings */ - newobj = psyco_generic_call(po, - PyString_Type.tp_as_sequence->sq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", s, t); - if (newobj == NULL) - return false; - goto complete; - } - - /* short virtual list: inline cimpl_concatenate */ - newobj = psyco_generic_call(po, PyString_FromStringAndSize, - CfReturnRef|CfPyErrIfNull, - "lv", (long) NULL, slen); - if (newobj == NULL) - return false; - - ptr = integer_add_i(po,newobj, offsetof(PyStringObject, ob_sval), false); - if (ptr == NULL) { - fail: /* generic failure code */ - vinfo_xdecref(release_me, po); - vinfo_xdecref(ptr, po); - vinfo_decref(newobj, po); - return false; - } - - extra_assert(count > 0); - i = 0; - while (1) { - s = list->array->items[VLIST_ITEMS + i]; - slen = psyco_get_const(po, s, FIX_size); - if (slen == NULL) - goto fail; - release_me = s = pstr_memory_source(po, s); - if (is_compiletime(slen->source)) { - int l = CompileTime_Get(slen->source)->value; - if (1 <= l && l <= sizeof(long)) { - /* special-case 1-4 characters */ - bool ok; - defield_t rdf, wdf; - switch (l) { - case 1: /*SIZEOF_CHAR:*/ - rdf = first_character(s); - wdf = FMUT(DEF_ARRAY(char, 0)); - break; - case 2: /*SIZEOF_SHORT:*/ - rdf = STR_sval2; - wdf = FMUT(DEF_ARRAY(short, 0)); - break; - default: - rdf = STR_sval4; - wdf = FMUT(DEF_ARRAY(long, 0)); - break; - /* for 3 chars, we copy a whole word, - but it does not matter */ - } - t = psyco_get_field(po, s, rdf); - if (t == NULL) - goto fail; - ok = psyco_put_field(po, ptr, wdf, t); - vinfo_decref(t, po); - if (!ok) - goto fail; - goto string_done; - } - else if (l == 0) - goto string_done; - } - else { - /* normal case: read out of the string s */ - } - t = integer_add_i(po, s, offsetof(PyStringObject, ob_sval), - false); - if (t == NULL) - goto fail; - /* variable-sized memcpy */ - err = !psyco_generic_call(po, memcpy, CfNoReturnValue, - "vvv", ptr, t, slen); - vinfo_decref(t, po); - if (err) - goto fail; - - string_done: - vinfo_decref(release_me, po); - release_me = NULL; - if (++i == count) - break; /* done */ - t = integer_add(po, ptr, slen, false); - vinfo_decref(ptr, po); - ptr = t; - if (ptr == NULL) - goto fail; - } - vinfo_decref(ptr, po); - - complete: - /* forget fields that were only relevant in virtual-time */ - vinfo_setitem(po, v, CATSTR_LIST, NULL); - - /* move the resulting non-virtual Python object back into 'v' */ - vinfo_move(po, v, newobj); - return true; -} - -PSY_INLINE vinfo_t* PsycoCatStr_NEW(PsycoObject* po, - vinfo_t* totallength, vinfo_t* list) -{ - /* consumes a ref to the arguments */ - - vinfo_t* result; - int count = PsycoList_Load(list); - if (count == 1) { - /* optimize if 'list' contains just one string */ - result = list->array->items[VLIST_ITEMS + 0]; - if (Psyco_KnownType(result) == &PyString_Type) { - vinfo_incref(result); - /* XXX store totallength in result? */ - vinfo_decref(totallength, po); - vinfo_decref(list, po); - return result; - } - } - result = vinfo_new(VirtualTime_New(&psyco_computed_catstr)); - result->array = array_new(CATSTR_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyString_Type))); - result->array->items[iFIX_SIZE]= totallength; assert_nonneg(totallength); - result->array->items[CATSTR_LIST] = list; - return result; -} - -PSY_INLINE vinfo_t* pstring_as_catlist(vinfo_t* vs) -{ - /* the resulting list is guaranteed to be of length >= 1 */ - vinfo_t* list; - if (vs->source == VirtualTime_New(&psyco_computed_catstr)) { - list = vs->array->items[CATSTR_LIST]; - vinfo_incref(list); - } - else { - list = PsycoList_SingletonNew(vs); - } - return list; -} -#endif /* USE_CATSTR */ - - - /***************************************************************/ - /*** string objects meta-implementation ***/ - -static vinfo_t* pstring_item(PsycoObject* po, vinfo_t* a, vinfo_t* i) -{ - condition_code_t cc; - vinfo_t* vlen; - vinfo_t* result; - - vlen = psyco_get_const(po, a, FIX_size); - if (vlen == NULL) - return NULL; - - cc = integer_cmp(po, i, vlen, Py_GE|COMPARE_UNSIGNED); - if (cc == CC_ERROR) - return NULL; - - if (runtime_condition_f(po, cc)) { - PycException_SetString(po, PyExc_IndexError, - "string index out of range"); - return NULL; - } - assert_nonneg(i); - - if (psyco_knowntobe(vlen, 1) && - Psyco_KnownType(a) == &PyString_Type) { - /* if a is known to be a single character, return a */ - vinfo_incref(a); - return a; - } - - a = pstr_memory_source(po, a); - result = psyco_get_field_array(po, a, STR_sval, i); - vinfo_decref(a, po); - if (result == NULL) - return NULL; - - return PsycoCharacter_NEW(result); -} - -static vinfo_t* pstring_slice(PsycoObject* po, vinfo_t* a, - vinfo_t* i, vinfo_t* j) -{ - condition_code_t cc; - vinfo_t* vlen; - vinfo_t* slicelen; - vinfo_t* slicestart = NULL; - vinfo_t* result = NULL; - - vlen = psyco_get_const(po, a, FIX_size); - if (vlen == NULL) - return NULL; - - cc = integer_cmp(po, j, vlen, Py_GT|COMPARE_UNSIGNED|CHEAT_MAXINT); - if (cc == CC_ERROR) - goto fail; - if (runtime_condition_f(po, cc)) { - /* j < 0 or j > vlen */ - cc = integer_cmp_i(po, j, 0, Py_LT); - if (cc == CC_ERROR) - goto fail; - if (runtime_condition_f(po, cc)) { - /* j < 0 */ - return vinfo_new(CompileTime_New((long) pempty_string)); - } - else { - /* j > vlen */ - j = vlen; - } - } - assert_nonneg(j); - - if (j == vlen && /* if j is known to be vlen */ - Psyco_KnownType(a) == &PyString_Type) { - cc = integer_cmp_i(po, i, 0, Py_LE); - if (cc == CC_ERROR) - goto fail; - if (runtime_condition_f(po, cc)) { - /* i <= 0 */ - /* a[i:j] is a */ - vinfo_incref(a); - return a; - } - else - assert_nonneg(i); - } - - cc = integer_cmp(po, i, j, Py_GT|COMPARE_UNSIGNED|CHEAT_MAXINT); - if (cc == CC_ERROR) - goto fail; - if (runtime_condition_f(po, cc)) { - /* i < 0 or i > j */ - cc = integer_cmp_i(po, i, 0, Py_LT); - if (cc == CC_ERROR) - goto fail; - if (runtime_condition_f(po, cc)) { - /* i < 0 */ - i = psyco_vi_Zero(); - } - else { - assert_nonneg(i); - /* i > j */ - return vinfo_new(CompileTime_New((long) pempty_string)); - } - } - else { - assert_nonneg(i); - vinfo_incref(i); - } - slicestart = i; - - /* at this point we have 0 <= i <= j <= vlen. - We don't try to capture the case i==j and special-case it to - an empty string because it might create uninteresting extra paths - for looping algorithms. */ - - if (a->source == VirtualTime_New(&psyco_computed_strslice)) { - vinfo_t* source = vinfo_getitem(a, STRSLICE_SOURCE); - vinfo_t* start = vinfo_getitem(a, STRSLICE_START); - if (source!=NULL && start!=NULL) { - /* optimize slicing of a slice */ - vinfo_t* k = integer_add(po, start, slicestart, false); - if (k == NULL) - goto fail; - vinfo_decref(slicestart, po); - slicestart = k; - a = source; - } - } - - slicelen = integer_sub(po, j, i, false); - if (slicelen == NULL) - goto fail; - vinfo_incref(a); - need_reference(po, a); - return PsycoStrSlice_NEW(a, slicestart, slicelen); - - fail: - vinfo_xdecref(slicestart, po); - return result; -} - -#if USE_CATSTR -static vinfo_t* pstring_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b) -{ - PyTypeObject* btp = Psyco_NeedType(po, b); - if (btp == NULL) - return NULL; - - if (PyType_TypeCheck(btp, &PyString_Type)) { - /* we build a virtual catstr. Each of a or b may already - be a catstr. We convert a and b to a list - representation (of length 1 if they are not already - catstr's) and concatenate the two lists. - Some more optimizations are done by plist_concat(). */ - vinfo_t* lena; - vinfo_t* lenb; - vinfo_t* lenc; - vinfo_t* lista; - vinfo_t* listb; - vinfo_t* listc; - int listalen; - int listblen; - vinfo_t* vlasta; - vinfo_t* vfirstb; - - lena = psyco_get_const(po, a, FIX_size); - if (lena == NULL) - return NULL; - if (psyco_knowntobe(lena, 0) && btp == &PyString_Type) { - /* ('' + b) is b */ - vinfo_incref(b); - return b; - } - - lenb = psyco_get_const(po, b, FIX_size); - if (lenb == NULL) - return NULL; - if (psyco_knowntobe(lenb, 0) && - Psyco_KnownType(a) == &PyString_Type) { - /* (a + '') is a */ - vinfo_incref(a); - return a; - } - - lenc = integer_add(po, lena, lenb, false); - if (lenc == NULL) - return NULL; - - lista = pstring_as_catlist(a); - listb = pstring_as_catlist(b); - - /* if lista ends in a constant string and listb starts - in a constant string, concatenate them now */ - if ((listalen=PsycoList_Load(lista)) > 0 && - is_compiletime( - (vlasta=lista->array->items[VLIST_ITEMS + listalen - 1]) - ->source) && - (listblen=PsycoList_Load(listb)) > 0 && - is_compiletime( - (vfirstb=listb->array->items[VLIST_ITEMS + 0]) - ->source)) { - - vinfo_t* buffer[VLIST_LENGTH_MAX*2-1]; - vinfo_t* v; - PyObject* s1 = (PyObject*) - CompileTime_Get(vlasta->source)->value; - PyObject* s2 = (PyObject*) - CompileTime_Get(vfirstb->source)->value; - Py_INCREF(s1); - PyString_Concat(&s1, s2); - if (s1 == NULL) { - psyco_virtualize_exception(po); - goto fail; - } - v = vinfo_new(CompileTime_NewSk( - sk_new((long) s1, SkFlagPyObj))); - - memcpy(buffer, - lista->array->items + VLIST_ITEMS, - (listalen-1) * sizeof(vinfo_t*)); - buffer[listalen-1] = v; - memcpy(buffer + listalen, - listb->array->items + VLIST_ITEMS + 1, - (listblen-1) * sizeof(vinfo_t*)); - - listc = PsycoList_New(po, listalen+listblen-1, buffer); - vinfo_decref(v, po); - } - else { - /* general case */ - listc = psyco_plist_extend_or_concat(po, lista, listb); - } - if (listc == NULL) - goto fail; - vinfo_decref(listb, po); - vinfo_decref(lista, po); - return PsycoCatStr_NEW(po, lenc, listc); - - fail: - vinfo_decref(listb, po); - vinfo_decref(lista, po); - vinfo_decref(lenc, po); - return NULL; - - } - - /* fallback */ - return psyco_generic_call(po, PyString_Type.tp_as_sequence->sq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", a, b); -} -#endif - - -/* higher-level meta-version of memcmp(): compares the data in string 'v' of length - 'vlen' with the data in string 'w' of length 'wlen'. - Return 0 (no), 1 (yes), or -1 (error). */ -PSY_INLINE int psyco_richmemcmp(PsycoObject* po, vinfo_t* v, vinfo_t* w, - vinfo_t* vlen, vinfo_t* wlen, int op) -{ - condition_code_t cc; - vinfo_t* minlen; - bool same_size; - int result; - vinfo_t* vresult; - vinfo_t* vtest; - vinfo_t* wtest; - - /* first compare the sizes */ - cc = integer_cmp(po, vlen, wlen, Py_EQ); - if (cc == CC_ERROR) - return -1; - same_size = runtime_condition_t(po, cc); - if (same_size) { - /* same length, but better put in 'minlen' the compile-time - value if there is one */ - if (is_compiletime(wlen->source)) - minlen = wlen; - else - minlen = vlen; - if (psyco_knowntobe(minlen, 0)) - return (op == Py_EQ || op == Py_LE || op == Py_GE); - } - else { - /* different sizes */ - switch (op) { - case Py_EQ: - return 0; - case Py_NE: - return 1; - default: - break; - } - if (psyco_knowntobe(vlen, 0)) - return (op == Py_LT || op == Py_LE); - if (psyco_knowntobe(wlen, 0)) - return (op == Py_GT || op == Py_GE); - - cc = integer_cmp(po, vlen, wlen, Py_LT); - if (cc == CC_ERROR) - return -1; - if (runtime_condition_t(po, cc)) { - /* len(v) < len(w) */ - minlen = vlen; - /* (v < w) iff (v[:minlen] <= w[:minlen]) */ - /* (v <= w) iff (v[:minlen] <= w[:minlen]) */ - /* (v > w) iff (v[:minlen] > w[:minlen]) */ - /* (v >= w) iff (v[:minlen] > w[:minlen]) */ - switch (op) { - case Py_LT: op = Py_LE; break; - case Py_GE: op = Py_GT; break; - default: break; - } - } - else { - /* len(v) > len(w) */ - minlen = wlen; - /* (v < w) iff (v[:minlen] < w[:minlen]) */ - /* (v <= w) iff (v[:minlen] < w[:minlen]) */ - /* (v > w) iff (v[:minlen] >= w[:minlen]) */ - /* (v >= w) iff (v[:minlen] >= w[:minlen]) */ - switch (op) { - case Py_LE: op = Py_LT; break; - case Py_GT: op = Py_GE; break; - default: break; - } - } - } - - /* optimize slices and bufstrs */ - w = pstr_memory_source(po, w); - v = pstr_memory_source(po, v); - - /* is 'minlen' a known and small value? */ - if (is_compiletime(minlen->source)) { - defield_t vrdf, wrdf; - switch (CompileTime_Get(minlen->source)->value) { - case 1: /*SIZEOF_CHAR:*/ - vrdf = first_character(v); - wrdf = first_character(w); - break; - - case 2: /*SIZEOF_SHORT:*/ - if (op != Py_EQ && op != Py_NE) goto use_memcmp; - vrdf = wrdf = STR_sval2; - break; - - case 4: /*SIZEOF_LONG:*/ - if (op != Py_EQ && op != Py_NE) goto use_memcmp; - vrdf = wrdf = STR_sval4; - break; - - default: - goto use_memcmp; - } - - /* load all the characters of the (short) strings - into registers */ - vtest = psyco_get_field(po, v, vrdf); - wtest = psyco_get_field(po, w, wrdf); - if (vtest == NULL || wtest == NULL) - goto fail2; - cc = integer_cmp(po, vtest, wtest, op); - vresult = NULL; - } - else { - use_memcmp: - /* compare the 'minlen' first bytes of the data blocks */ - vtest = integer_add_i(po, v, offsetof(PyStringObject, ob_sval), - false); - wtest = integer_add_i(po, w, offsetof(PyStringObject, ob_sval), - false); - if (vtest == NULL || wtest == NULL) - goto fail2; - /* variable-sized memcmp */ - vresult = psyco_generic_call(po, memcmp, CfReturnNormal, - "vvv", vtest, wtest, minlen); - cc = integer_cmp_i(po, vresult, 0, op); - } - - if (cc == CC_ERROR) - result = -1; - else - result = runtime_condition_t(po, cc); - vinfo_xdecref(vresult, po); - vinfo_decref(wtest, po); - vinfo_decref(vtest, po); - vinfo_decref(v, po); - vinfo_decref(w, po); - return result; - - fail2: - vinfo_xdecref(wtest, po); - vinfo_xdecref(vtest, po); - vinfo_xdecref(v, po); - vinfo_xdecref(w, po); - return -1; -} - -static vinfo_t* pstring_richcompare(PsycoObject* po, vinfo_t* v, vinfo_t* w, int op) -{ - int result; - - /* Make sure both arguments are strings. */ - PyTypeObject *tp = Psyco_FastType(v); - if (!PyType_TypeCheck(tp, &PyString_Type)) { - return psyco_vi_NotImplemented(); - } - tp = Psyco_NeedType(po, w); - if (tp == NULL) - return NULL; - if (!PyType_TypeCheck(tp, &PyString_Type)) { - return psyco_vi_NotImplemented(); - } - - if (vinfo_known_equal(v, w)) { - /* identical strings */ - result = (op == Py_EQ || op == Py_LE || op == Py_GE); - } - else { - vinfo_t* vlen; - vinfo_t* wlen; - /* get the sizes */ - wlen = psyco_get_const(po, w, FIX_size); - if (wlen == NULL) - return NULL; - vlen = psyco_get_const(po, v, FIX_size); - if (vlen == NULL) - return NULL; - - result = psyco_richmemcmp(po, v, w, vlen, wlen, op); - } - - switch (result) { - case 0: - return psyco_vi_Py_False(); - case 1: - return psyco_vi_Py_True(); - default: - return NULL; - } -} - -static vinfo_t* pstring_mod(PsycoObject* po, vinfo_t* v, vinfo_t* w) -{ - PyTypeObject *tp = Psyco_FastType(v); - if (!PyType_TypeCheck(tp, &PyString_Type)) { - return psyco_vi_NotImplemented(); - } - return psyco_generic_call(po, PyString_Format, - CfReturnRef|CfPyErrIfNull, - "vv", v, w); -} - - -#if USE_BUFSTR -/***************************************************************/ -/* buffer-based over-allocated concatenations. */ -static source_virtual_t psyco_computed_bufstr; - -PSY_INLINE vinfo_t* PsycoBufStr_NEW(vinfo_t* vcb, vinfo_t* vlen) -{ - /* consumes a ref to its args */ - vinfo_t* result = vinfo_new(VirtualTime_New(&psyco_computed_bufstr)); - result->array = array_new(BUFSTR_TOTAL); - result->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyString_Type))); - result->array->items[iFIX_SIZE] = vlen; assert_nonneg(vlen); - result->array->items[BUFSTR_BUFOBJ] = vcb; - return result; -} - - -typedef PyStringObject stringlike_t; -/* we abuse the PyStringObject structure for our purposes, - so that a buffer can be very quickly turned into a real Python string. - - ob_size - # bytes allocated - ob_shash - # bytes currently used in the buffer - - the number of used bytes must be between the string length (stored in - the virtual bufstr's FIX_SIZE field) and ob_size. If it is larger than - FIX_SIZE it means that the string was enlarged due to some other - concatenation. -*/ - -#define BUFSTR_OVERALLOCATION_MASK 7 -#define BUFSTR_ACCEPT_OVERALLOCATED 15 - -static void -bufstr_dealloc(PyObject *op) -{ - PyObject_DEL(op); -} - -/* this special type is only ever used by Psyco to access tp_dealloc */ -static PyTypeObject PsycoBufStr_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "psyco_bufstr", /*tp_name*/ - sizeof(stringlike_t), /*tp_basicsize*/ - sizeof(char), /*tp_itemsize*/ - /* methods */ - (destructor)bufstr_dealloc, /*tp_dealloc*/ -}; - - -#if PSYCO_DEBUG -static void assert_bufstr_invariants(stringlike_t* a, int a_size) -{ - if (PyString_Check(a)) { - extra_assert(a_size <= a->ob_size); - } - else { - extra_assert(a->ob_type == &PsycoBufStr_Type); - extra_assert(a_size <= a->ob_shash); - extra_assert(a->ob_shash <= a->ob_size); - } -} -#else -#define assert_bufstr_invariants(a, a_size) do { } while (0) /* nothing */ -#endif - - -static stringlike_t* cimpl_cb_new(stringlike_t* a, stringlike_t* b, - int a_size, int b_size, int size) -{ - stringlike_t *op; - assert_bufstr_invariants(a, a_size); - - /* Inline PyObject_NewVar */ - op = (stringlike_t *) - PyObject_MALLOC(sizeof(stringlike_t) + size * sizeof(char)); - if (op == NULL) - return (stringlike_t*) PyErr_NoMemory(); - PyObject_INIT_VAR(op, &PsycoBufStr_Type, size); - op->ob_shash = a_size + b_size; - memcpy(op->ob_sval, a->ob_sval, a_size); - memcpy(op->ob_sval + a_size, b->ob_sval, b_size); - return op; -} - -static stringlike_t* cimpl_cb_grow(stringlike_t* a, stringlike_t* b, - int a_size, int b_size, int size) -{ - assert_bufstr_invariants(a, a_size); - - /* check if the result would fit in the existing buffer - and if we can write there without overwriting anything. */ - if (size <= a->ob_size && a_size == a->ob_shash && - a->ob_type == &PsycoBufStr_Type) { - /* yes -> fast case */ - a->ob_shash += b_size; - memcpy(a->ob_sval + a_size, b->ob_sval, b_size); - Py_INCREF(a); - return a; - } - else { - /* no -> make a new buffer, overallocating by some - hopefully typical value derived from b_size. - XXX catch integer overflows here */ - size = (size + (size+b_size)/2) | BUFSTR_OVERALLOCATION_MASK; - return cimpl_cb_new(a, b, a_size, b_size, size); - } -} - -static PyStringObject* cimpl_cb_normalize(stringlike_t* a, int a_size) -{ - assert_bufstr_invariants(a, a_size); - - if (a->ob_type == &PsycoBufStr_Type) { - - /* this checks that no one else uses this buffer past a_size - and limit the wasted overallocated space */ - /* XXX try using PyObject_REALLOC if we are 100% sure that - nobody else has a pointer to the area */ - if (a->ob_shash == a_size && - a_size >= a->ob_size-BUFSTR_ACCEPT_OVERALLOCATED) { - a->ob_type = &PyString_Type; - a->ob_size = a_size; - a->ob_shash = -1; -#ifdef SSTATE_NOT_INTERNED /* Python >= 2.3 */ - a->ob_sstate = SSTATE_NOT_INTERNED; -#else -#ifdef INTERN_STRINGS - a->ob_sinterned = NULL; -#endif -#endif - a->ob_sval[a_size] = '\0'; - Py_INCREF(a); - return a; - } - } - else if (a->ob_size == a_size) { - /* 'a' is already a string, and it has the expected size */ - Py_INCREF(a); - return a; - } - /* in other cases we must build a new string from scratch */ - return (PyStringObject*) - PyString_FromStringAndSize(a->ob_sval, a_size); -} - -static bool compute_bufstr(PsycoObject* po, vinfo_t* v) -{ - /* computing a bufstr into a PyStringObject is fast, we just have - to patch ob_type, initialize ob_shash, and add a '\0' at the - end of the string. */ - - vinfo_t* vcb; - vinfo_t* vlen; - - vlen = psyco_get_const(po, v, FIX_size); - if (vlen == NULL) - return false; - - vcb = vinfo_getitem(v, BUFSTR_BUFOBJ); - if (vcb == NULL) - return false; - - vcb = psyco_generic_call(po, &cimpl_cb_normalize, CfReturnRef, - "vv", vcb, vlen); - if (vcb == NULL) - return false; - - /* forget fields that were only relevant in virtual-time */ - vinfo_setitem(po, v, BUFSTR_BUFOBJ, NULL); - - /* move the resulting non-virtual Python object back into 'v' */ - vinfo_move(po, v, vcb); - return true; -} - -static PyObject* direct_compute_bufstr(vinfo_t* v, char* data) -{ - PyObject* bufobj; - long length; - PyObject* result = NULL; - length = direct_read_vinfo(vinfo_getitem(v, iFIX_SIZE), data); - bufobj = direct_xobj_vinfo(vinfo_getitem(v, BUFSTR_BUFOBJ), data); - - if (!PyErr_Occurred() && bufobj != NULL) { - /* patch 'bufobj' as explained in compute_bufstr() */ - result = (PyObject*) - cimpl_cb_normalize((stringlike_t*) bufobj, length); - } - Py_XDECREF(bufobj); - return result; -} - - -static vinfo_t* pstring_concat(PsycoObject* po, vinfo_t* a, vinfo_t* b) -{ - PyTypeObject* btp = Psyco_NeedType(po, b); - if (btp == NULL) - return NULL; - - if (PyType_TypeCheck(btp, &PyString_Type)) { - vinfo_t* lena; - vinfo_t* lenb; - vinfo_t* lenc; - vinfo_t* v; - vinfo_t* breal; - - /* if both strings are constants, concatenate them now */ - if (is_compiletime(a->source) && is_compiletime(b->source)) { - PyObject* s1 = (PyObject*) - CompileTime_Get(a->source)->value; - PyObject* s2 = (PyObject*) - CompileTime_Get(b->source)->value; - Py_INCREF(s1); - PyString_Concat(&s1, s2); - if (s1 == NULL) { - psyco_virtualize_exception(po); - return NULL; - } - return vinfo_new(CompileTime_NewSk( - sk_new((long) s1, SkFlagPyObj))); - } - - lenb = psyco_get_const(po, b, FIX_size); - if (lenb == NULL) - return NULL; - if (psyco_knowntobe(lenb, 0) && - Psyco_KnownType(a) == &PyString_Type) { - /* (a + '') is a */ - vinfo_incref(a); - return a; - } - - lena = psyco_get_const(po, a, FIX_size); - if (lena == NULL) - return NULL; - if (psyco_knowntobe(lena, 0) && btp == &PyString_Type) { - /* ('' + b) is b */ - vinfo_incref(b); - return b; - } - - lenc = integer_add(po, lena, lenb, false); - if (lenc == NULL) - return NULL; - - breal = pstr_memory_source(po, b); - - /* if 'a' is already a bufstring, let it grow */ - if (a->source == VirtualTime_New(&psyco_computed_bufstr)) { - vinfo_t* vcb = vinfo_getitem(a, BUFSTR_BUFOBJ); - if (vcb != NULL) { - v = psyco_generic_call(po, &cimpl_cb_grow, - CfReturnRef|CfPyErrIfNull, - "vvvvv", vcb, breal, - lena, lenb, lenc); - goto done; - } - } - - /* make a new bufstring */ - v = psyco_generic_call(po, &cimpl_cb_new, - CfReturnRef|CfPyErrIfNull, - "vvvvv", a, breal, lena, lenb, lenc); - - done: - vinfo_decref(breal, po); - if (v == NULL) { - vinfo_decref(lenc, po); - return NULL; - } - else { - Psyco_AssertType(po, v, &PsycoBufStr_Type); - return PsycoBufStr_NEW(v, lenc); - } - } - - /* fallback */ - return psyco_generic_call(po, PyString_Type.tp_as_sequence->sq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", a, b); -} -#endif /* USE_BUFSTR */ - - -/***************************************************************/ - - -static vinfo_t* pstr_memory_source(PsycoObject* po, vinfo_t* s) -{ - if (s->source == VirtualTime_New(&psyco_computed_strslice)) { - /* get a ptr to the real source memory - without forcing the strslice out of - virtual-time */ - vinfo_t* start = vinfo_getitem(s, STRSLICE_START); - vinfo_t* src = vinfo_getitem(s, STRSLICE_SOURCE); - if (src != NULL && start != NULL) { - return integer_add(po, src, start, false); - } - } -#if USE_BUFSTR - if (s->source == VirtualTime_New(&psyco_computed_bufstr)) { - vinfo_t* cb = vinfo_getitem(s, BUFSTR_BUFOBJ); - if (cb != NULL) - s = cb; - } -#endif - vinfo_incref(s); - return s; -} - - -INITIALIZATIONFN -void psy_stringobject_init(void) -{ - PyMappingMethods *mm; - PyNumberMethods *nm; - PySequenceMethods *m = PyString_Type.tp_as_sequence; - Psyco_DefineMeta(m->sq_length, psyco_generic_immut_ob_size); - Psyco_DefineMeta(m->sq_item, pstring_item); - Psyco_DefineMeta(m->sq_slice, pstring_slice); -#if USE_CATSTR || USE_BUFSTR - Psyco_DefineMeta(m->sq_concat, pstring_concat); -#endif - Psyco_DefineMeta(PyString_Type.tp_richcompare, pstring_richcompare); - - mm = PyString_Type.tp_as_mapping; - if (mm) { /* Python >= 2.3 */ - Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); - } - nm = PyString_Type.tp_as_number; - if (nm) { /* Python >= 2.3 */ - Psyco_DefineMeta(nm->nb_remainder, pstring_mod); - } - - INIT_SVIRTUAL(psyco_computed_char, compute_char, - direct_compute_char, 0, 0, 0); - INIT_SVIRTUAL(psyco_computed_strslice, compute_strslice, - direct_compute_strslice, - (1 << STRSLICE_SOURCE), - NW_STRSLICES_NORMAL, NW_STRSLICES_FUNCALL); -#if USE_CATSTR -# error direct_compute_catstr is missing - INIT_SVIRTUAL(psyco_computed_catstr, compute_catstr, - NW_CATSTRS_NORMAL, NW_CATSTRS_FUNCALL); -#endif -#if USE_BUFSTR - INIT_SVIRTUAL(psyco_computed_bufstr, compute_bufstr, - direct_compute_bufstr, - (1 << BUFSTR_BUFOBJ), - NW_BUFSTRS_NORMAL, NW_BUFSTRS_NORMAL); -#endif - - pempty_string = PyString_FromString(""); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pstringobject.h b/nodebox/ext/psyco/src/c/Objects/pstringobject.h deleted file mode 100644 index f2db690..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pstringobject.h +++ /dev/null @@ -1,69 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of stringobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_STRINGOBJECT_H -#define _PSY_STRINGOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - -#define USE_CATSTR 0 /*trying to use only bufstring virtual strings instead*/ -#define USE_BUFSTR 1 - - -/* various ways to access the actual character data */ -#define STR_sval UNSIGNED_ARRAY(char, offsetof(PyStringObject, ob_sval)) -#define STR_sval2 UNSIGNED_ARRAY(short, offsetof(PyStringObject, ob_sval)) -#define STR_sval4 UNSIGNED_ARRAY(long, offsetof(PyStringObject, ob_sval)) - - -/* all flavors of virtual strings */ -#define VIRTUALSTR_FIRST FIELDS_TOTAL(FIX_size) - -/* virtual one-character strings */ -#define CHARACTER_CHAR VIRTUALSTR_FIRST -#define CHARACTER_TOTAL (CHARACTER_CHAR+1) - -/* virtual string slices */ -#define STRSLICE_SOURCE VIRTUALSTR_FIRST -#define STRSLICE_START (STRSLICE_SOURCE+1) -#define STRSLICE_TOTAL (STRSLICE_START+1) - -#if USE_CATSTR -/* virtual string concatenations */ -#define CATSTR_LIST VIRTUALSTR_FIRST -#define CATSTR_TOTAL (CATSTR_LIST+1) -#endif - -#if USE_BUFSTR -/* virtual overallocated-buffer concatenations */ -#define BUFSTR_BUFOBJ VIRTUALSTR_FIRST -#define BUFSTR_TOTAL (BUFSTR_BUFOBJ+1) -#endif - - -#define PsycoString_Check(tp) PyType_TypeCheck(tp, &PyString_Type) -#ifdef Py_USING_UNICODE -# define PsycoUnicode_Check(tp) PyType_TypeCheck(tp, &PyUnicode_Type) -#else -# define PsycoUnicode_Check(tp) 0 -#endif - - -PSY_INLINE vinfo_t* PsycoString_AS_STRING(PsycoObject* po, vinfo_t* v) -{ /* no type check */ - return integer_add_i(po, v, offsetof(PyStringObject, ob_sval), false); -} -PSY_INLINE vinfo_t* PsycoString_GET_SIZE(PsycoObject* po, vinfo_t* v) -{ /* no type check */ - return psyco_get_const(po, v, FIX_size); -} - - -EXTERNFN vinfo_t* PsycoCharacter_New(vinfo_t* chrval); -EXTERNFN bool PsycoCharacter_Ord(PsycoObject* po, vinfo_t* v, vinfo_t** vord); - - -#endif /* _PSY_STRINGOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/pstructmember.c b/nodebox/ext/psyco/src/c/Objects/pstructmember.c deleted file mode 100644 index 1f70b24..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pstructmember.c +++ /dev/null @@ -1,166 +0,0 @@ -#include "pstructmember.h" -#include "pstringobject.h" -#include "pintobject.h" -#include "pfloatobject.h" -#include "../pycodegen.h" - - -DEFINEFN -vinfo_t* PsycoMember_GetOne(PsycoObject* po, vinfo_t* addr, PyMemberDef* l) -{ - condition_code_t cc; - vinfo_t* v; - vinfo_t* w1; - vinfo_t* w2; - defield_t rdf; - if (l->flags & READ_RESTRICTED) - goto fallback; - - /* XXX add (some of) the missing types */ - switch (l->type) { - case T_BYTE: /* read a byte, extend it signed */ - rdf = FMUT(DEF_ARRAY(signed char, 0)); - break; - case T_UBYTE: /* read a byte, extend it unsigned */ - rdf = FMUT(UNSIGNED_ARRAY(unsigned char, 0)); - break; - case T_SHORT: /* read a short, extend it signed */ - rdf = FMUT(DEF_ARRAY(signed short, 0)); - break; - case T_USHORT: /* read a short, extend it unsigned */ - rdf = FMUT(UNSIGNED_ARRAY(unsigned short, 0)); - break; - case T_INT: - case T_UINT: - case T_LONG: - case T_ULONG: /* read a long */ - /* XXX assumes sizeof(int) == sizeof(long) */ - rdf = FMUT(DEF_ARRAY(long, 0)); - break; -#if HAVE_FP_FN_CALLS - case T_FLOAT: /* read a long, turn it into a float */ - rdf = FMUT(DEF_ARRAY(float, 0)); - w1 = psyco_get_field_offset(po, addr, rdf, l->offset); - if (w1 == NULL) - return NULL; - v = PsycoFloat_FromFloat(po, w1); - vinfo_decref(w1, po); - return v; - case T_DOUBLE: /* read two longs, turn them into a double */ - rdf = FMUT(DEF_ARRAY(double, 0)); - w1 = psyco_get_field_offset(po, addr, rdf, l->offset); - if (w1 == NULL) - return NULL; - w2 = psyco_get_field_offset(po, addr, FIELD_PART2(rdf), - l->offset); - if (w2 == NULL) { - vinfo_decref(w1, po); - return NULL; - } - v = PsycoFloat_FROM_DOUBLE(w1, w2); - return v; -#endif - case T_STRING: /* read a char*, turn it into a string */ - rdf = FMUT(DEF_ARRAY(char*, 0)); - w1 = psyco_get_field_offset(po, addr, rdf, l->offset); - if (w1 == NULL) - return NULL; - cc = integer_non_null(po, w1); - if (cc == CC_ERROR) { - vinfo_decref(w1, po); - return NULL; - } - - if (runtime_condition_t(po, cc)) { - /* the char* is not NULL */ - v = psyco_generic_call(po, PyString_FromString, - CfReturnRef|CfPyErrIfNull, - "v", w1); - if (v != NULL) - Psyco_AssertType(po, v, &PyString_Type); - } - else { - v = psyco_vi_None(); - } - vinfo_decref(w1, po); - return v; - case T_STRING_INPLACE: /* read an array of characters from the struct */ - w1 = integer_add_i(po, addr, l->offset, false); - if (w1 == NULL) - return NULL; - v = psyco_generic_call(po, PyString_FromString, - CfReturnRef|CfPyErrIfNull, - "v", w1); - if (v != NULL) - Psyco_AssertType(po, v, &PyString_Type); - vinfo_decref(w1, po); - return v; - case T_CHAR: /* read a byte, turn it into a char */ - rdf = FMUT(UNSIGNED_ARRAY(unsigned char, 0)); - w1 = psyco_get_field_offset(po, addr, rdf, l->offset); - if (w1 == NULL) - return NULL; - v = PsycoCharacter_New(w1); - vinfo_decref(w1, po); - return v; - case T_OBJECT: /* read a long, turn it into a PyObject with reference */ - rdf = FMUT(DEF_ARRAY(PyObject*, 0)); - v = psyco_get_field_offset(po, addr, rdf, l->offset); - if (v == NULL) - return NULL; - cc = integer_non_null(po, v); - if (cc == CC_ERROR) { - vinfo_decref(v, po); - return NULL; - } - - if (runtime_condition_t(po, cc)) { - /* 'v' contains a non-NULL value */ - need_reference(po, v); - } - else { - /* 'v' contains NULL */ - vinfo_decref(v, po); - v = psyco_vi_None(); - } - return v; -#ifdef T_OBJECT_EX - case T_OBJECT_EX: /* same as T_OBJECT, exception if NULL */ - rdf = FMUT(DEF_ARRAY(PyObject*, 0)); - v = psyco_get_field_offset(po, addr, rdf, l->offset); - if (v == NULL) - return NULL; - cc = integer_non_null(po, v); - if (cc == CC_ERROR) { - vinfo_decref(v, po); - return NULL; - } - - if (runtime_condition_t(po, cc)) { - /* 'v' contains a non-NULL value */ - need_reference(po, v); - } - else { - /* 'v' contains NULL */ - vinfo_decref(v, po); - PycException_SetString(po, PyExc_AttributeError, - l->name); - return NULL; - } - return v; -#endif - default: - goto fallback; - } - - /* for integer fields of any size */ - v = psyco_get_field_offset(po, addr, rdf, l->offset); - if (v != NULL) - v = PsycoInt_FROM_LONG(v); - return v; - - fallback: - /* call the Python implementation for cases we cannot handle directy */ - return psyco_generic_call(po, PyMember_GetOne, - CfReturnRef|CfPyErrIfNull, "vl", addr, l); -} diff --git a/nodebox/ext/psyco/src/c/Objects/pstructmember.h b/nodebox/ext/psyco/src/c/Objects/pstructmember.h deleted file mode 100644 index 86232a0..0000000 --- a/nodebox/ext/psyco/src/c/Objects/pstructmember.h +++ /dev/null @@ -1,16 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of structmember.h ***/ - /***************************************************************/ - -#ifndef _PSY_STRUCTMEMBER_H -#define _PSY_STRUCTMEMBER_H - -#include "../Python/pycompiler.h" -#include "pobject.h" - - -EXTERNFN -vinfo_t* PsycoMember_GetOne(PsycoObject* po, vinfo_t* addr, PyMemberDef* l); - - -#endif /* _PSY_STRUCTMEMBER_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/ptupleobject.c b/nodebox/ext/psyco/src/c/Objects/ptupleobject.c deleted file mode 100644 index a147824..0000000 --- a/nodebox/ext/psyco/src/c/Objects/ptupleobject.c +++ /dev/null @@ -1,263 +0,0 @@ -#include "ptupleobject.h" - - - /***************************************************************/ - /*** Virtual tuples ***/ - -static source_virtual_t psyco_computed_tuple; - -#if ALL_CHECKS -static void check_ituple(vinfo_t* v) -{ - int tuple_end = v->array->count; - int l1 = CompileTime_Get(v->array->items[iFIX_SIZE]->source)->value; - psyco_assert(tuple_end == iTUPLE_OB_ITEM + l1); -} -#else -# define check_ituple(v) ; -#endif - -static bool compute_tuple(PsycoObject* po, vinfo_t* v) -{ - int i, tuple_end; - check_ituple(v); - tuple_end = v->array->count; - - /* check whether all tuple objects are constant */ - for (i=iTUPLE_OB_ITEM; iarray->items[i]; - if (!is_compiletime(vi->source)) - break; /* no */ - } - if (i == tuple_end) { - /* yes -- let's build a constant compile-time tuple */ - source_known_t* sk; - PyObject* constant = PyTuple_New(tuple_end - iTUPLE_OB_ITEM); - if (constant == NULL) - OUT_OF_MEMORY(); - for (i=iTUPLE_OB_ITEM; iarray->items[i]->source); - obj = (PyObject*) sk->value; - Py_INCREF(obj); - PyTuple_SET_ITEM(constant, i-iTUPLE_OB_ITEM, obj); - } - - /* move the resulting non-virtual Python object back into 'v' */ - sk = sk_new((long) constant, SkFlagPyObj); - v->source = CompileTime_NewSk(sk); - } - else { - /* no -- code a call to PyTuple_New() */ - int tuple_len = tuple_end - iTUPLE_OB_ITEM; - vinfo_t* tuple = psyco_generic_call(po, PyTuple_New, - CfReturnRef|CfPyErrIfNull, - "l", tuple_len); - if (tuple == NULL) - return false; - - /* write the storing of the objects in the tuple */ - for (i=0; iarray->count; - - result = PyTuple_New(tuple_end - iTUPLE_OB_ITEM); - if (result == NULL) - return NULL; - - for (i=iTUPLE_OB_ITEM; iarray->items[i], data); - if (obj == NULL) { - Py_DECREF(result); - return NULL; - } - PyTuple_SET_ITEM(result, i-iTUPLE_OB_ITEM, obj); - } - return result; -} - -DEFINEFN -vinfo_t* PsycoTuple_New(int count, vinfo_t** source) -{ - int i; - vinfo_t* r = vinfo_new(VirtualTime_New(&psyco_computed_tuple)); - r->array = array_new(iTUPLE_OB_ITEM + count); - r->array->items[iOB_TYPE] = - vinfo_new(CompileTime_New((long)(&PyTuple_Type))); - r->array->items[iFIX_SIZE] = vinfo_new(CompileTime_New(count)); - if (source != NULL) - for (i=0; isource == VirtualTime_New(&psyco_computed_tuple)) - size = tuple->array->count - iTUPLE_OB_ITEM; - else if (is_compiletime(tuple->source)) { - /* a constant tuple means constant tuple items */ - int i; - PyObject* o = (PyObject*)(CompileTime_Get(tuple->source)->value); - extra_assert(PyTuple_Check(o)); - size = PyTuple_GET_SIZE(o); - if (tuple->array->count < iTUPLE_OB_ITEM + size) { - if (/*not_too_much &&*/ size > CT_TUPLE_LOAD_SIZE_LIMIT) - return -1; - vinfo_array_grow(tuple, iTUPLE_OB_ITEM + size); - } - /* load the tuple into the vinfo_array_t */ - for (i=0; isq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", v1, v2); - default: - return NULL; - } - - /* XXX a "virtual tuple concatenation" would be cool */ - len1 = PsycoTuple_Load(v1); /* -1 if unknown */ - if (len1 == 0) { - vinfo_incref(v2); - return v2; - } - len2 = PsycoTuple_Load(v2); /* -1 if unknown */ - if (len2 == 0) { - vinfo_incref(v1); - return v1; - } - - if (len1 == -1 || len2 == -1) { - /* cannot do it now. Fall back. */ - result = psyco_generic_call(po, - PyTuple_Type.tp_as_sequence->sq_concat, - CfReturnRef|CfPyErrIfNull, - "vv", v1, v2); - if (result == NULL) - return NULL; - - /* the result is a tuple */ - Psyco_AssertType(po, result, &PyTuple_Type); - } - else { - int i; - result = PsycoTuple_New(len1+len2, NULL); - for (i=0; isq_length, psyco_generic_immut_ob_size); - Psyco_DefineMeta(m->sq_item, ptuple_item); - Psyco_DefineMeta(m->sq_concat, PsycoTuple_Concat); - - mm = PyString_Type.tp_as_mapping; - if (mm) { /* Python >= 2.3 */ - Psyco_DefineMeta(mm->mp_subscript, psyco_generic_subscript); - } - - INIT_SVIRTUAL(psyco_computed_tuple, compute_tuple, - direct_compute_tuple, - (-1 << iTUPLE_OB_ITEM), /* sign bit of bitfield will - be extended indefinitely */ - NW_TUPLES_NORMAL, NW_TUPLES_FUNCALL); -} diff --git a/nodebox/ext/psyco/src/c/Objects/ptupleobject.h b/nodebox/ext/psyco/src/c/Objects/ptupleobject.h deleted file mode 100644 index de8c149..0000000 --- a/nodebox/ext/psyco/src/c/Objects/ptupleobject.h +++ /dev/null @@ -1,40 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of tupleobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_TUPLEOBJECT_H -#define _PSY_TUPLEOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -#define TUPLE_ob_item FARRAY(DEF_FIELD(PyTupleObject, PyObject*, ob_item, \ - FIX_size)) -#define iTUPLE_OB_ITEM FIELD_INDEX(TUPLE_ob_item) - -/* The following macro reads an item from a Psyco tuple without any - checks. Be sure the item has already been loaded in the array of - the vinfo_t. This should only be used after a successful call to - PsycoTuple_Load(). */ -#define PsycoTuple_GET_ITEM(vtuple, index) \ - ((vtuple)->array->items[iTUPLE_OB_ITEM + (index)]) - - -/***************************************************************/ -/* virtual tuples. - If 'source' is not NULL it gives the content of the tuple. - If 'source' is NULL you have to initialize it yourself. */ -EXTERNFN vinfo_t* PsycoTuple_New(int count, vinfo_t** source); - -/* get the (possibly virtual) array of items in the tuple, - returning the length of the tuple or -1 if it fails (items not known). - The items are then found in PsycoTuple_GET_ITEM(tuple, i). - Never sets a PycException. */ -EXTERNFN int PsycoTuple_Load(vinfo_t* tuple); - -EXTERNFN vinfo_t* PsycoTuple_Concat(PsycoObject* po, vinfo_t* v1, vinfo_t* v2); - - -#endif /* _PSY_TUPLEOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Objects/ptypeobject.c b/nodebox/ext/psyco/src/c/Objects/ptypeobject.c deleted file mode 100644 index 3c34b6d..0000000 --- a/nodebox/ext/psyco/src/c/Objects/ptypeobject.c +++ /dev/null @@ -1,355 +0,0 @@ -#include "ptypeobject.h" -#include "ptupleobject.h" -#include "pfuncobject.h" - - -static ternaryfunc type_call; -static initproc object_init; -static newfunc object_new; -static initproc slot_tp_init = NULL; - -/***************************************************************/ - /*** type objects meta-implementation ***/ - -static int cimpl_call_tp_init(PyTypeObject* type, PyObject* obj, - PyObject* args, PyObject* kwds) -{ - /* If the returned object is not an instance of type, - it won't be initialized. (Python 2.3 behavior) */ - if (!PyType_IsSubtype(obj->ob_type, type)) - return 0; - type = obj->ob_type; - if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS) && - type->tp_init != NULL) - return type->tp_init(obj, args, kwds); - return 0; -} - -static vinfo_t* ptype_call(PsycoObject* po, vinfo_t* vtype, - vinfo_t* varg, vinfo_t* vkw) -{ - vinfo_t* vobj; - PyTypeObject* type; - PyTypeObject* otype; - type = (PyTypeObject*) psyco_pyobj_atcompiletime(po, vtype); - if (type == NULL) - return NULL; - if (type->tp_new == NULL) - goto fallback; - - /* Ugly exception: if the call is type(o), - just return the type of 'o'. */ - if (type == &PyType_Type) { - int nb_args; - if (!psyco_knowntobe(vkw, (long) NULL)) - goto fallback; - nb_args = PsycoTuple_Load(varg); - if (nb_args == 1) { - vinfo_t* v = PsycoTuple_GET_ITEM(varg, 0); - return psyco_get_field(po, v, OB_type); - } - if (nb_args < 0) - goto fallback; - } - - vobj = Psyco_META3(po, type->tp_new, - CfReturnRef|CfPyErrIfNull, "lvv", - type, varg, vkw); - if (vobj == NULL) - return NULL; - - otype = Psyco_KnownType(vobj); - if (otype == NULL) { - /* unknown return type, cannot promote it to compile-time - now because 'vobj' is not yet stored in 'po->vlocals'. - XXX check again why this wouldn't work */ - if (!psyco_generic_call(po, cimpl_call_tp_init, - CfNoReturnValue|CfPyErrIfNeg, - "vvvv", vtype, vobj, varg, vkw)) - goto error; - return vobj; - } - - /* If the returned object is not an instance of type, - it won't be initialized. (Python 2.3 behavior) */ - if (PyType_IsSubtype(otype, type) && - PyType_HasFeature(otype, Py_TPFLAGS_HAVE_CLASS) && - otype->tp_init != NULL) { - if (!Psyco_META3(po, otype->tp_init, - CfNoReturnValue|CfPyErrIfNeg, - "vvv", vobj, varg, vkw)) - goto error; - } - return vobj; - - error: - vinfo_decref(vobj, po); - return NULL; - - fallback: - return psyco_generic_call(po, type_call, - CfReturnRef|CfPyErrIfNull, - "vvv", vtype, varg, vkw); -} - -static int cimpl_check_noarg(PyObject* args, PyObject* kwds) -{ - if ((PyTuple_GET_SIZE(args) || - (kwds && PyDict_Check(kwds) && PyDict_Size(kwds)))) { - PyErr_SetString(PyExc_TypeError, - "default __new__ takes no parameters"); - return -1; - } - return 0; -} - -DEFINEFN -vinfo_t* psyco_pobject_new(PsycoObject* po, PyTypeObject* type, - vinfo_t* varg, vinfo_t* vkw) -{ - if (type->tp_init == object_init) { - /* same rule as in object_new(): check that no argument - is passed if type->tp_init == object_init */ - int safe = (psyco_knowntobe(vkw, (long) NULL) && - PsycoTuple_Load(varg) == 0); - if (!safe && !psyco_generic_call(po, cimpl_check_noarg, - CfNoReturnValue|CfPyErrIfNeg, - "vv", varg, vkw)) - return NULL; - } - return Psyco_META2(po, type->tp_alloc, - CfReturnRef|CfPyErrIfNull, "ll", - type, 0); -} - -static vinfo_t* ptype_genericnew(PsycoObject* po, PyTypeObject* type, - vinfo_t* varg, vinfo_t* vkw) -{ - return Psyco_META2(po, type->tp_alloc, - CfReturnRef|CfPyErrIfNull, "ll", - type, 0); -} - -static bool pobject_init(PsycoObject* po, vinfo_t* vself, - vinfo_t* vargs, vinfo_t* vkwds) -{ - return true; -} - -#define INLINE_GENERIC_ALLOC (PY_VERSION_HEX >= 0x02030000) /* 2.3 */ - -#if INLINE_GENERIC_ALLOC -static PyObject* cimpl_alloc_gc_heap(PyTypeObject* type) -{ - size_t size = type->tp_basicsize; - PyObject* obj = _PyObject_GC_Malloc(size); - if (obj == NULL) - return PyErr_NoMemory(); - memset(obj, '\0', size); - Py_INCREF(type); - PyObject_INIT(obj, type); - PyObject_GC_Track(obj); - return obj; -} - -static PyObject* cimpl_alloc_gc_nonheap(PyTypeObject* type) -{ - size_t size = type->tp_basicsize; - PyObject* obj = _PyObject_GC_Malloc(size); - if (obj == NULL) - return PyErr_NoMemory(); - memset(obj, '\0', size); - PyObject_INIT(obj, type); - PyObject_GC_Track(obj); - return obj; -} - -static PyObject* cimpl_alloc_nongc_heap(PyTypeObject* type) -{ - size_t size = type->tp_basicsize; - PyObject* obj = PyObject_MALLOC(size); - if (obj == NULL) - return PyErr_NoMemory(); - memset(obj, '\0', size); - Py_INCREF(type); - PyObject_INIT(obj, type); - return obj; -} - -static PyObject* cimpl_alloc_nongc_nonheap(PyTypeObject* type) -{ - size_t size = type->tp_basicsize; - PyObject* obj = PyObject_MALLOC(size); - if (obj == NULL) - return PyErr_NoMemory(); - memset(obj, '\0', size); - PyObject_INIT(obj, type); - return obj; -} -#endif /* INLINE_GENERIC_ALLOC */ - -static vinfo_t* ptype_genericalloc(PsycoObject* po, PyTypeObject* type, - int nitems) -{ - vinfo_t* v_result; -#if INLINE_GENERIC_ALLOC - if (type->tp_itemsize != 0) { -#endif - /* fallback */ - v_result = psyco_generic_call(po, PyType_GenericAlloc, - CfReturnRef|CfPyErrIfNull, - "ll", type, nitems); -#if INLINE_GENERIC_ALLOC - } - else { - void* cimpl; - if (PyType_IS_GC(type)) { - if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) - cimpl = cimpl_alloc_gc_heap; - else - cimpl = cimpl_alloc_gc_nonheap; - } - else { - if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) - cimpl = cimpl_alloc_nongc_heap; - else - cimpl = cimpl_alloc_nongc_nonheap; - } - v_result = psyco_generic_call(po, cimpl, - CfReturnRef|CfPyErrIfNull, - "l", type); - } -#endif - if (v_result != NULL) { - Psyco_AssertType(po, v_result, type); - } - return v_result; -} - -/* call a special method in a "safe" way: with inlining turned off and - without promotion. See test5.class_creation_2() for why this is needed. */ -static vinfo_t* soft_method_call(PsycoObject* po, - PyTypeObject* tp, vinfo_t* vself, - char* attrstr, PyObject** attrobj, - vinfo_t* vargs, vinfo_t* vkwds) -{ - PyObject* descr; - vinfo_t* v_res; - vinfo_t* newarg; - int i, argcount; - - if (*attrobj == NULL) { - *attrobj = PyString_InternFromString(attrstr); - if (*attrobj == NULL) { - psyco_virtualize_exception(po); - return NULL; - } - } - - /* XXX this is broken because the type might have been modified - XXX since the last time we were here! */ - descr = _PyType_Lookup(tp, *attrobj); - if (descr == NULL || !PyFunction_Check(descr)) - return NULL; /* fallback */ - - argcount = PsycoTuple_Load(vargs); - if (argcount < 0) - return NULL; /* fallback */ - if (!psyco_knowntobe(vkwds, (long) NULL)) - return NULL; /* fallback */ - - newarg = PsycoTuple_New(argcount+1, NULL); - vinfo_incref(vself); - PsycoTuple_GET_ITEM(newarg, 0) = vself; - for (i = 0; i < argcount; i++) { - vinfo_t* v = PsycoTuple_GET_ITEM(vargs, i); - vinfo_incref(v); - PsycoTuple_GET_ITEM(newarg, i+1) = v; - } - Py_INCREF(descr); - v_res = pfunction_simple_call(po, descr, newarg, false); - vinfo_decref(newarg, po); - return v_res; -} - -static bool pslot_tp_init(PsycoObject* po, vinfo_t* vself, - vinfo_t* vargs, vinfo_t* vkwds) -{ - static PyObject *init_str; - vinfo_t* v_res; - bool ok; - PyTypeObject* type = Psyco_KnownType(vself); - if (type == NULL) { - /* unknown type, cannot promote it to compile-time - now because 'vself' is not yet stored in 'po->vlocals'. */ - goto fallback; - } - v_res = soft_method_call(po, type, vself, "__init__", &init_str, - vargs, vkwds); - if (v_res == NULL) { - if (PycException_Occurred(po)) - return false; - else - goto fallback; - } - -#if PY_VERSION_HEX >= 0x02050000 /* 2.5 */ - { - /* check that __init__ returned None */ - condition_code_t cc; - cc = integer_cmp_i(po, v_res, (long) Py_None, Py_EQ); - if (cc == CC_ERROR) { - vinfo_decref(v_res, po); - return false; - } - ok = runtime_condition_t(po, cc); - vinfo_decref(v_res, po); - if (!ok) { - PycException_SetString(po, PyExc_TypeError, - "__init__() should return None"); - } - } -#else - vinfo_decref(v_res, po); /* ignore return value */ - ok = true; -#endif - return ok; - - fallback: - return psyco_generic_call(po, slot_tp_init, - CfNoReturnValue|CfPyErrIfNeg, - "vvv", vself, vargs, vkwds) != NULL; -} - - -INITIALIZATIONFN -void psy_typeobject_init(void) -{ - PyObject* d; - PyObject* tmp; - - type_call = PyType_Type.tp_call; - object_new = PyBaseObject_Type.tp_new; - object_init = PyBaseObject_Type.tp_init; - Psyco_DefineMeta(type_call, ptype_call); - Psyco_DefineMeta(object_new, psyco_pobject_new); - Psyco_DefineMeta(object_init, pobject_init); - Psyco_DefineMeta(PyType_GenericNew, ptype_genericnew); - Psyco_DefineMeta(PyType_GenericAlloc, ptype_genericalloc); - - /* Any better way to get pointers to the slot_tp_* functions? */ - if (PyErr_Occurred()) - return; - d = PyDict_New(); - if (d != NULL) { - char* expr = "type('X', (object,), {'__init__': lambda self: None})"; - tmp = PyRun_String(expr, Py_eval_input, PyEval_GetBuiltins(), d); - if (tmp && PyType_Check(tmp)) { - slot_tp_init = ((PyTypeObject*) tmp)->tp_init; - Psyco_DefineMeta(slot_tp_init, pslot_tp_init); - } - Py_XDECREF(tmp); - Py_DECREF(d); - } - PyErr_Clear(); -} diff --git a/nodebox/ext/psyco/src/c/Objects/ptypeobject.h b/nodebox/ext/psyco/src/c/Objects/ptypeobject.h deleted file mode 100644 index 4ed3f30..0000000 --- a/nodebox/ext/psyco/src/c/Objects/ptypeobject.h +++ /dev/null @@ -1,17 +0,0 @@ - /***************************************************************/ -/*** Psyco equivalent of typeobject.h ***/ - /***************************************************************/ - -#ifndef _PSY_TYPEOBJECT_H -#define _PSY_TYPEOBJECT_H - - -#include "pobject.h" -#include "pabstract.h" - - -EXTERNFN vinfo_t* psyco_pobject_new(PsycoObject* po, PyTypeObject* type, - vinfo_t* varg, vinfo_t* vkw); - - -#endif /* _PSY_TYPEOBJECT_H */ diff --git a/nodebox/ext/psyco/src/c/Python/frames.c b/nodebox/ext/psyco/src/c/Python/frames.c deleted file mode 100644 index 21eaa7f..0000000 --- a/nodebox/ext/psyco/src/c/Python/frames.c +++ /dev/null @@ -1,736 +0,0 @@ -#include "frames.h" -#include "pyver.h" -#include "../codemanager.h" -#include "../stats.h" -#include "../vcompiler.h" -#include "../Objects/pobject.h" - -#include - - - /***************************************************************/ - -/* turn a running frame into its Psyco equivalent, a PsycoObject. - Return Py_None if the frame cannot be turned into a PsycoObject. - Never sets an exception. */ -PSY_INLINE PyObject* PsycoObject_FromFrame(PyFrameObject* f, int recursion) -{ - int i, extras, module; - vinfo_t* v; - PsycoObject* po; - RunTimeSource rsrc; - source_known_t* sk; - PyCodeObject* co = f->f_code; - PyObject* merge_points; - - if (f->f_stacktop == NULL) { - /* cannot patch a frame other than the top (running) one */ - goto fail; - } - module = f->f_globals == f->f_locals; - merge_points = PyCodeStats_MergePoints(PyCodeStats_Get(co), module); - if (merge_points == Py_None) { - /* unsupported bytecode instructions */ - goto fail; - } - if (psyco_mp_flags(merge_points) & MP_FLAGS_HAS_FINALLY) { - /* incompatible handling of 'finally' blocks */ - goto fail; - } - - /* the local variables are assumed to be stored as 'fast' variables, - not in the f_locals dictionary. This is currently asserted by - the fact that LOAD_NAME and STORE_NAME opcodes are not supported - at all. XXX support LOAD_NAME / STORE_NAME / DELETE_NAME */ - extras = (f->f_valuestack - f->f_localsplus) + co->co_stacksize; - - po = PsycoObject_New(INDEX_LOC_LOCALS_PLUS + extras); - po->stack_depth = INITIAL_STACK_DEPTH; - po->vlocals.count = INDEX_LOC_LOCALS_PLUS + extras; - INIT_PROCESSOR_PSYCOOBJECT(po); - po->pr.auto_recursion = AUTO_RECURSION(recursion); - - /* initialize po->vlocals */ - Py_INCREF(f->f_globals); - sk = sk_new((long) f->f_globals, SkFlagPyObj); - LOC_GLOBALS = vinfo_new(CompileTime_NewSk(sk)); - - /* move the current arguments, locals, and object stack into - their target place */ - for (i = f->f_stacktop - f->f_localsplus; i--; ) { - PyObject* o = f->f_localsplus[i]; - po->stack_depth += sizeof(long); - if (o == NULL) { - /* uninitialized local variable, - the corresponding stack position is not used */ - v = psyco_vi_Zero(); - } - else { - /* XXX do something more intelligent for cell and - free vars */ - /* arguments get borrowed references */ - rsrc = RunTime_NewStack(po->stack_depth, false, false); - v = vinfo_new(rsrc); - } - LOC_LOCALS_PLUS[i] = v; - } - /* the rest of the stack in LOC_LOCALS_PLUS is - initialized to NULL by PsycoObject_New() */ - - /* store the code object */ - po->pr.co = co; - Py_INCREF(co); /* XXX never freed */ - po->pr.next_instr = f->f_lasti; - pyc_data_build(po, merge_points); - if (f->f_iblock) { - po->pr.iblock = f->f_iblock; - memcpy(po->pr.blockstack, f->f_blockstack, - sizeof(PyTryBlock)*po->pr.iblock); - } - - /* set up the CALL return address */ - po->stack_depth += sizeof(long); - rsrc = RunTime_NewStack(po->stack_depth, false, false); - LOC_CONTINUATION = vinfo_new(rsrc); - psyco_assert_coherent(po); - return (PyObject*) po; - - fail: - Py_INCREF(Py_None); - return Py_None; -} - -/* same as PsycoObject_FromFrame() on any not-yet-started frame with the - given code object */ -PSY_INLINE PyObject* PsycoObject_FromCode(PyCodeObject* co, - PyObject* globals, - int recursion, - int module) -{ - int i, argc, ncells, nfrees, extras; - PyObject* merge_points; - PsycoObject* po; - Source rsrc; - source_known_t* sk; - vinfo_t* v; - - merge_points = PyCodeStats_MergePoints(PyCodeStats_Get(co), module); - if (merge_points == Py_None) { - /* unsupported bytecode instructions */ - goto fail; - } - - ncells = PyTuple_GET_SIZE(co->co_cellvars); - nfrees = PyTuple_GET_SIZE(co->co_freevars); - extras = co->co_stacksize + co->co_nlocals + ncells + nfrees; - - po = PsycoObject_New(INDEX_LOC_LOCALS_PLUS + extras); - po->stack_depth = INITIAL_STACK_DEPTH; - po->vlocals.count = INDEX_LOC_LOCALS_PLUS + extras; - INIT_PROCESSOR_PSYCOOBJECT(po); - po->pr.auto_recursion = AUTO_RECURSION(recursion); - - /* initialize po->vlocals */ - Py_INCREF(globals); - sk = sk_new((long) globals, SkFlagPyObj); - LOC_GLOBALS = vinfo_new(CompileTime_NewSk(sk)); - - argc = co->co_argcount; - if (co->co_flags & CO_VARARGS) - argc++; - if (co->co_flags & CO_VARKEYWORDS) - argc++; - - /* initialize the free and cell vars */ - i = co->co_nlocals + ncells + nfrees; - if (ncells || nfrees) { - while (i > co->co_nlocals) { - po->stack_depth += sizeof(long); - /* borrowed references from the frame object */ - rsrc = RunTime_NewStack(po->stack_depth, false, false); - v = vinfo_new(rsrc); - LOC_LOCALS_PLUS[--i] = v; - } - /* skip the unbound local variables */ - po->stack_depth += sizeof(long) * (i-argc); - } - /* initialize the local variables to zero (unbound) */ - while (i > argc) { - v = psyco_vi_Zero(); - LOC_LOCALS_PLUS[--i] = v; - } - /* initialize the keyword arguments dict */ - if (co->co_flags & CO_VARKEYWORDS) { - po->stack_depth += sizeof(long); - rsrc = RunTime_NewStack(po->stack_depth, false, false); - v = vinfo_new(rsrc); - /* known to be a dict */ - /*Psyco_AssertType(NULL, v, &PyDict_Type);*/ - rsrc = CompileTime_New((long) &PyDict_Type); - v->array = array_new(FIELDS_TOTAL(OB_type)); - v->array->items[iOB_TYPE] = vinfo_new(rsrc); - LOC_LOCALS_PLUS[--i] = v; - } - /* initialize the extra arguments tuple */ - if (co->co_flags & CO_VARARGS) { - po->stack_depth += sizeof(long); - rsrc = RunTime_NewStack(po->stack_depth, false, false); - v = vinfo_new(rsrc); - /* known to be a tuple */ - rsrc = CompileTime_New((long) &PyTuple_Type); - v->array = array_new(iOB_TYPE+1); - v->array->items[iOB_TYPE] = vinfo_new(rsrc); - LOC_LOCALS_PLUS[--i] = v; - } - /* initialize the regular arguments */ - while (i > 0) { - /* XXX do something more intelligent for cell and - free vars */ - po->stack_depth += sizeof(long); - /* arguments get borrowed references */ - rsrc = RunTime_NewStack(po->stack_depth, false, false); - v = vinfo_new(rsrc); - LOC_LOCALS_PLUS[--i] = v; - } - /* the rest of the stack in LOC_LOCALS_PLUS is - initialized to NULL by PsycoObject_New() */ - - /* store the code object */ - po->pr.co = co; - Py_INCREF(co); /* XXX never freed */ - pyc_data_build(po, merge_points); - - /* set up the CALL return address */ - po->stack_depth += sizeof(long); - rsrc = RunTime_NewStack(po->stack_depth, false, false); - LOC_CONTINUATION = vinfo_new(rsrc); - return (PyObject*) po; - - fail: - Py_INCREF(Py_None); - return Py_None; -} - -DEFINEFN -PyObject* PsycoCode_CompileCode(PyCodeObject* co, - PyObject* globals, - int recursion, - int module) -{ - mergepoint_t* mp; - PsycoObject* po; - PyObject* o = PsycoObject_FromCode(co, globals, recursion, module); - if (o == Py_None) - return o; - - /* compile the function */ - po = (PsycoObject*) o; - mp = PsycoObject_Ready(po); - return (PyObject*) psyco_compile_code(po, mp); -} - -DEFINEFN -PyObject* PsycoCode_CompileFrame(PyFrameObject* f, int recursion) -{ - mergepoint_t* mp; - PsycoObject* po; - PyObject* o = PsycoObject_FromFrame(f, recursion); - if (o == Py_None) - return o; - - /* compile the function */ - po = (PsycoObject*) o; - mp = psyco_exact_merge_point(po->pr.merge_points, po->pr.next_instr); - if (mp != NULL) - psyco_delete_unused_vars(po, &mp->entries); - return (PyObject*) psyco_compile_code(po, mp); -} - -DEFINEFN -bool PsycoCode_Run(PyObject* codebuf, PyFrameObject* f, bool entering) -{ - PyObject* tdict; - PyFrameRuntime* fruntime; - stack_frame_info_t** finfo; - int err; - long* initial_stack; - PyObject* result; - PyCodeObject* co = f->f_code; - - extra_assert(codebuf != NULL); - extra_assert(CodeBuffer_Check(codebuf)); - - /* over the current Python frame, a lightweight chained list of - Psyco frames will be built. Mark the current Python frame as - the starting point of this chained list. */ - tdict = psyco_thread_dict(); - if (tdict==NULL) return false; - fruntime = PyCStruct_NEW(PyFrameRuntime, PyFrameRuntime_dealloc); - Py_INCREF(f); - fruntime->cs_key = (PyObject*) f; - fruntime->psy_frames_start = &finfo; - fruntime->psy_code = co; - fruntime->psy_globals = f->f_globals; - extra_assert(PyDict_GetItem(tdict, (PyObject*) f) == NULL); - err = PyDict_SetItem(tdict, (PyObject*) f, (PyObject*) fruntime); - Py_DECREF(fruntime); - if (err) return false; - /* Warning, no 'return' between this point and the PyDict_DelItem() - below */ - - /* get the actual arguments */ - initial_stack = (long*) f->f_localsplus; - - /* run! */ - Py_INCREF(codebuf); - result = psyco_processor_run((CodeBufferObject*) codebuf, - initial_stack, &finfo, tdict); - Py_DECREF(codebuf); - psyco_trash_object(NULL); /* free any trashed object now */ - -#if CODE_DUMP >= 2 - psyco_dump_code_buffers(); -#endif - if (PyDict_DelItem(tdict, (PyObject*) f)) { - Py_XDECREF(result); - result = NULL; - } - if (result == NULL) { - PyObject *exc, *value, *tb; - if (entering) { - /* Nothing special to worry in this case, - eval_frame() will return right away */ - extra_assert(PyErr_Occurred()); /* exception */ - return false; - } - - /* Attention: the maybe_call_line_trace() call of ceval.c:822 - (Python 2.3b1) will *not* reload f->f_lasti and - f->f_stacktop if these get modified in case of exception! - We definitely cannot modify the stack top. We *must* - however empty the block stack to prevent exception - handlers to be entered --- they have already been run by - Psyco! */ - PyErr_Fetch(&exc, &value, &tb); - extra_assert(exc != NULL); /* exception */ - f->f_iblock = 0; - - /* We cannot prevent Python from calling PyTraceBack_Here() - when this function returns, althought Psyco has already - recorded a traceback. We remove Psyco's traceback and - make sure Python will re-insert an equivalent one. */ - if (tb != NULL) { /* should normally never be NULL */ - /* no C interface to tb_lasti; call it via Python */ - PyObject *tb_next, *tb_lasti; - tb_lasti = PyObject_GetAttrString(tb, "tb_lasti"); - extra_assert(tb_lasti != NULL); - extra_assert(PyInt_Check(tb_lasti)); - f->f_lasti = PyInt_AS_LONG(tb_lasti); - Py_DECREF(tb_lasti); - - tb_next = PyObject_GetAttrString(tb, "tb_next"); - extra_assert(tb_next != NULL); - Py_DECREF(tb); - tb = tb_next; - } - PyErr_Restore(exc, value, tb); - return false; - } - else { - /* to emulate the return, move the current position to - the end of the function code. We assume that the - last instruction of any code object is a RETURN_VALUE. */ - PyObject** p; - int new_i = PyString_GET_SIZE(co->co_code) - 1; - /* Python 2.5: the bytecode doesn't always end with a - RETURN_VALUE, but surely there must be one *somewhere* */ - while (PyString_AS_STRING(co->co_code)[new_i] != RETURN_VALUE){ - --new_i; - psyco_assert(new_i >= 0); - } -#if PY_VERSION_HEX >= 0x02030000 /* 2.3 */ - /* dubious compatibility hack for Python 2.3, in which f_lasti - no longer always refer to the instruction that will be - executed just after the current trace hook returns */ - new_i -= entering; -#endif - f->f_lasti = new_i; - f->f_iblock = 0; - - /* free the stack */ - for (p=f->f_stacktop; --p >= f->f_valuestack; ) { - Py_XDECREF(*p); - *p = NULL; - } - /* push the result alone on the stack */ - p = f->f_valuestack; - *p++ = result; /* consume a ref */ - f->f_stacktop = p; - - extra_assert(!PyErr_Occurred()); - return true; - } -} - - - /***************************************************************/ - -#define FRAME_STACK_ALLOC_BY 83 /* about 1KB */ - -DEFINEFN -stack_frame_info_t* psyco_finfo(PsycoObject* caller, PsycoObject* callee) -{ - static stack_frame_info_t* current = NULL; - static stack_frame_info_t* end = NULL; - - Source sglobals; - stack_frame_info_t* p; - int inlining = caller != NULL && caller->pr.is_inlining; - - if (end - current <= inlining) { - psyco_memory_usage += sizeof(stack_frame_info_t) * - FRAME_STACK_ALLOC_BY; - current = PyMem_NEW(stack_frame_info_t, FRAME_STACK_ALLOC_BY); - if (current == NULL) - OUT_OF_MEMORY(); - end = current + FRAME_STACK_ALLOC_BY; - } - p = current; - current += inlining + 1; -#if NEED_STACK_FRAME_HACK - p->link_stack_depth = -inlining; -#endif - p->co = callee->pr.co; - sglobals = callee->vlocals.items[INDEX_LOC_GLOBALS]->source; - if (is_compiletime(sglobals)) - p->globals = (PyObject*) CompileTime_Get(sglobals)->value; - else - p->globals = NULL; /* uncommon */ - if (inlining) { - (p+1)->co = caller->pr.co; - sglobals = caller->vlocals.items[INDEX_LOC_GLOBALS]->source; - if (is_compiletime(sglobals)) - (p+1)->globals = (PyObject*) - CompileTime_Get(sglobals)->value; - else - (p+1)->globals = NULL; /* uncommon */ - } - return p; -} - -DEFINEFN -void PyFrameRuntime_dealloc(PyFrameRuntime* self) -{ - /* nothing */ -} - -PSY_INLINE PyFrameObject* psyco_build_pyframe(PyObject* co, PyObject* globals, - PyThreadState* tstate) -{ - PyFrameObject* back; - PyFrameObject* result; - - /* frame objects are not created in stack order - with Psyco, so it's probably better not to - create plain wrong chained lists */ - back = tstate->frame; - tstate->frame = NULL; - result = PyFrame_New(tstate, (PyCodeObject*) co, globals, NULL); - if (result == NULL) - OUT_OF_MEMORY(); - result->f_lasti = -1; /* can be used to identify emulated frames */ - tstate->frame = back; - return result; -} - -DEFINEFN -PyFrameObject* psyco_emulate_frame(PyObject* o) -{ - if (PyFrame_Check(o)) { - /* a real Python frame */ - Py_INCREF(o); - return (PyFrameObject*) o; - } - else { - /* a Psyco frame: emulate it */ - PyObject* co = PyTuple_GetItem(o, 0); - PyObject* globals = PyTuple_GetItem(o, 1); - extra_assert(co != NULL); - extra_assert(globals != NULL); - return psyco_build_pyframe(co, globals, PyThreadState_GET()); - } -} - -struct sfitmp_s { - stack_frame_info_t** fi; - struct sfitmp_s* next; -}; - -static PyObject* pvisitframes(PyObject*(*callback)(PyObject*,void*), - void* data) -{ - /* Whenever we run Psyco-produced machine code, we mark the current - Python frame as the starting point of a chained list of Psyco - frames. The machine code will update this chained list so that - psyco_next_stack_frame() can be used to visit the list from - the outermost to the innermost frames. Note that the list does - not contain the first Psyco frame, the one directly run by a - call to psyco_processor_run(). This still gives the expected - result, because PsycoFunctionObjects are only supposed to be - called by proxy codes (see psyco_proxycode()). This proxy - code itself has a frame. It replaces the missing Psyco frame. - XXX this would no longer work if we filled the emulated frames - with more information, like local variables */ - - PyObject* result = NULL; - PyFrameRuntime* fstart; - PyObject* tdict = psyco_thread_dict(); - PyFrameObject* f = PyThreadState_Get()->frame; - - RECLIMIT_SAFE_ENTER(); - while (f != NULL) { - /* is this Python frame the starting point of a chained - list of Psyco frames ? */ - fstart = (PyFrameRuntime*) PyDict_GetItem(tdict, (PyObject*) f); - if (fstart != NULL) { - /* Yes. Get the list start. */ - struct sfitmp_s* revlist; - struct sfitmp_s* p; - PyObject* o; - PyObject* g; - long tag; - stack_frame_info_t** f1; - stack_frame_info_t** finfo; - stack_frame_info_t* fdata; - stack_frame_info_t* flimit; - finfo = *(fstart->psy_frames_start); - - /* Enumerate the frames and store them in a - last-in first-out linked list. The end is marked by - a pointer with an odd integer value (actually with - i386 the least significant byte of the integer value - is -1, and with ivm the end pointer's value is - exactly 1; but real pointers cannot be odd at all - because they are aligned anyway). */ - revlist = NULL; - for (f1 = finfo; (((long)(*f1)) & 1) == 0; - f1 = psyco_next_stack_frame(f1)) { - p = (struct sfitmp_s*) - PyMem_MALLOC(sizeof(struct sfitmp_s)); - if (p == NULL) - OUT_OF_MEMORY(); - p->fi = f1; - p->next = revlist; - revlist = p; -#if NEED_STACK_FRAME_HACK - if ((*f1)->link_stack_depth == 0) - break; /* stack top is an inline frame */ -#endif - } - - /* now actually visit them in the correct order */ - while (revlist) { - p = revlist; - /* a Psyco frame is represented as - (co, globals, address_of(*fi)) */ - if (result == NULL) { - tag = (long)(p->fi); - fdata = *p->fi; - flimit = finfo_last(fdata); - while (1) { - g = fdata->globals; - if (g == NULL) - g = f->f_globals; - o = Py_BuildValue("OOl", - fdata->co, g, - tag); - if (o == NULL) - OUT_OF_MEMORY(); - result = callback(o, data); - Py_DECREF(o); - if (result != NULL) - break; - if (fdata == flimit) - break; - fdata++, tag--; - } - } - revlist = p->next; - PyMem_FREE(p); - } - if (result != NULL) - break; - - /* there is still the real Python frame - which is shadowed by a Psyco frame, i.e. a - proxy function. Represented as - (co, globals, f) */ - o = Py_BuildValue("OOO", - fstart->psy_code, - fstart->psy_globals, - f); - if (o == NULL) - OUT_OF_MEMORY(); - result = callback(o, data); - Py_DECREF(o); - } - else { - /* a real unshadowed Python frame */ - result = callback((PyObject*) f, data); - } - if (result != NULL) - break; - f = f->f_back; - } - RECLIMIT_SAFE_LEAVE(); - return result; -} - - - -static PyObject* visit_nth_frame(PyObject* o, void* n) -{ - /* count the calls to the function and return 'o' when - the counter reaches zero */ - if (!--*(int*)n) { - Py_INCREF(o); - return o; - } - return NULL; -} - -static PyObject* visit_prev_frame(PyObject* o, void* data) -{ - PyObject* cmp = *(PyObject**) data; - - if (cmp != NULL) { - /* still searching */ - if (PyFrame_Check(o) || PyFrame_Check(cmp)) { - if (o != cmp) return NULL; - } - else { - PyObject* p1; - PyObject* p2; - - p1 = PyTuple_GetItem(o, 2); /* tag */ - p2 = PyTuple_GetItem(cmp, 2); - if (PyObject_Compare(p1, p2) != 0) return NULL; - - p1 = PyTuple_GetItem(o, 0); /* code */ - p2 = PyTuple_GetItem(cmp, 0); - if (p1 != p2) return NULL; - - p1 = PyTuple_GetItem(o, 1); /* globals */ - p2 = PyTuple_GetItem(cmp, 1); - if (p1 != p2) return NULL; - } - /* found it ! We will succeed the next time - visit_find_frame() is called. */ - *(PyObject**) data = NULL; - return NULL; - } - else { - /* found it the previous time, now return this next 'o' */ - Py_INCREF(o); - return o; - } -} - -DEFINEFN -PyObject* psyco_find_frame(PyObject* o) -{ - void* result; - if (PyInt_Check(o)) { - int depth = PyInt_AsLong(o) + 1; - if (depth <= 0) - depth = 1; - result = pvisitframes(visit_nth_frame, &depth); - } - else { - result = pvisitframes(visit_prev_frame, (void*) &o); - if (result == NULL && !PyErr_Occurred() && o != NULL) - PyErr_SetString(PyExc_PsycoError, - "f_back is invalid when frames are no longer active"); - } - if (result == NULL && !PyErr_Occurred()) - PyErr_SetString(PyExc_ValueError, - "call stack is not deep enough"); - return (PyObject*) result; -} - -static PyObject* visit_get_globals(PyObject* o, void* ignored) -{ - if (PyFrame_Check(o)) - return ((PyFrameObject*) o)->f_globals; - else - return PyTuple_GetItem(o, 1); -} -DEFINEFN -PyObject* psyco_get_globals(void) -{ - PyObject* result = pvisitframes(visit_get_globals, NULL); - if (result == NULL) - psyco_fatal_msg("sorry, don't know what to do with no globals"); - return result; -} - -static PyFrameObject* cached_frame = NULL; -static PyObject* visit_first_frame(PyObject* o, void* ts) -{ - if (PyFrame_Check(o)) { - /* a real Python frame: don't return a new reference */ - return (PyObject*) o; - } - else { - /* a Psyco frame: emulate it */ - /* we can't return a new reference, so we have to remember - the last frame we emulated and free it now. This is - not too bad since we can use this as a cache and avoid - rebuilding the new emulated frame all the time. */ - PyFrameObject* f; - PyFrameObject* newf; - PyObject* co = PyTuple_GetItem(o, 0); - PyObject* globals = PyTuple_GetItem(o, 1); - PyThreadState* tstate = (PyThreadState*) ts; - extra_assert(co != NULL); - extra_assert(globals != NULL); - while (cached_frame != NULL) { - f = cached_frame; - if ((PyObject*) f->f_code == co - && f->f_globals == globals) { - /* reuse the cached frame */ - f->f_tstate = tstate; - return (PyObject*) f; - } - cached_frame = NULL; - Py_DECREF(f); /* might set cached_frame again - XXX could this loop never end? */ - } - newf = psyco_build_pyframe(co, globals, tstate); - while (cached_frame != NULL) { - /* worst-case safe... this is unlikely */ - f = cached_frame; - cached_frame = NULL; - Py_DECREF(f); - } - cached_frame = newf; /* transfer ownership */ - return (PyObject*) newf; - } -} -static PyFrameObject* psyco_threadstate_getframe(PyThreadState* self) -{ - return (PyFrameObject*) pvisitframes(visit_first_frame, (void*)self); -} - - - /***************************************************************/ - -INITIALIZATIONFN -void psyco_frames_init(void) -{ - _PyThreadState_GetFrame = -# if PYTHON_API_VERSION < 1012 - (unaryfunc) -# endif - psyco_threadstate_getframe; -} diff --git a/nodebox/ext/psyco/src/c/Python/frames.h b/nodebox/ext/psyco/src/c/Python/frames.h deleted file mode 100644 index fcf2a0e..0000000 --- a/nodebox/ext/psyco/src/c/Python/frames.h +++ /dev/null @@ -1,82 +0,0 @@ - /***************************************************************/ -/*** Python frames and virtual frames ***/ - /***************************************************************/ - -#ifndef _FRAMES_H -#define _FRAMES_H - - -#include "../psyco.h" -#include "../cstruct.h" -#include -#include "pyver.h" -#include -#include - - -/* Basic interface to compile the given code object. Return the - code buffer or Py_None if this code cannot be compiled. - Never sets an exception. */ -EXTERNFN PyObject* PsycoCode_CompileCode(PyCodeObject* co, - PyObject* globals, - int recursion, - int module); - -/* Same as PsycoCode_CompileCode, but starts compiling from the middle - of a frame */ -EXTERNFN PyObject* PsycoCode_CompileFrame(PyFrameObject* f, int recursion); - -/* Run a compiled buffer returned by PsycoCode_CompileXxx(). - The submitted frame object will be modified to reflect any progress done - in running this frame by Psyco. Return 'false' if an exception is set. - For code compiled by PsycoCode_CompileCode, the frame must just have been - initialized by ceval.c but not yet run. For code compiled by - PsycoCode_CompileFrame, the frame must be in the same state as when it - was compiled. */ -EXTERNFN bool PsycoCode_Run(PyObject* codebuf, PyFrameObject* f, bool entering); - - -/* Find a frame. If 'o' is an integer, it is the 'o'th frame (0=top). - If 'o' was returned by a previous call to psyco_get_frame(), find - the previous frame (as reading f_back does). - The return value is either a normal Python frame object, or - a tuple (code, globals, tag). tag is only used for the next call - to psyco_get_frame(). */ -EXTERNFN PyObject* psyco_find_frame(PyObject* o); -EXTERNFN PyFrameObject* psyco_emulate_frame(PyObject* o); - -EXTERNFN PyObject* psyco_get_globals(void); -/* PyObject* psyco_get_locals(void); this one implemented in psyco.c */ - - -/* to keep a trace of the Psyco stack frames */ -struct stack_frame_info_s { -#if NEED_STACK_FRAME_HACK - int link_stack_depth; /* -1 if there is an inline frame following */ -#endif - PyCodeObject* co; - PyObject* globals; /* NULL if not compile-time */ -}; -PSY_INLINE stack_frame_info_t* finfo_last(stack_frame_info_t* finfo) { -#if NEED_STACK_FRAME_HACK - if (finfo->link_stack_depth < 0) finfo -= finfo->link_stack_depth; -#endif - return finfo; -} - -EXTERNFN stack_frame_info_t* psyco_finfo(PsycoObject* caller, - PsycoObject* callee); - -/* extra run-time data attached to the Python frame objects which are - used as starting point for Psyco frames */ -typedef struct { - PyCStruct_HEAD /* cs_key is the frame object */ - stack_frame_info_t*** psy_frames_start; - PyCodeObject* psy_code; - PyObject* psy_globals; -} PyFrameRuntime; - -EXTERNFN void PyFrameRuntime_dealloc(PyFrameRuntime* self); - - -#endif /* _FRAMES_H */ diff --git a/nodebox/ext/psyco/src/c/Python/pbltinmodule.c b/nodebox/ext/psyco/src/c/Python/pbltinmodule.c deleted file mode 100644 index c94af75..0000000 --- a/nodebox/ext/psyco/src/c/Python/pbltinmodule.c +++ /dev/null @@ -1,281 +0,0 @@ -#include "pbltinmodule.h" -#include "../Objects/pintobject.h" -#include "../Objects/ptupleobject.h" -#include "../Objects/plistobject.h" -#include "../Objects/pstringobject.h" -#include "../Objects/prangeobject.h" - - -static PyCFunction cimpl_range; -static PyCFunction cimpl_xrange; -static PyCFunction cimpl_chr; -static PyCFunction cimpl_ord; -static PyCFunction cimpl_id; -static PyCFunction cimpl_len; -static PyCFunction cimpl_abs; -static PyCFunction cimpl_apply; -static PyCFunction cimpl_divmod; - - -static vinfo_t* get_len_of_range(PsycoObject* po, vinfo_t* lo, vinfo_t* hi - /*, vinfo_t* step == 1 currently*/) -{ - /* translated from bltinmodule.c */ - condition_code_t cc = integer_cmp(po, lo, hi, Py_LT); - if (cc == CC_ERROR) - return NULL; - if (runtime_condition_t(po, cc)) { - vinfo_t* vresult = integer_sub(po, hi, lo, false); - assert_nonneg(vresult); - return vresult; - } - else - return psyco_vi_Zero(); -} - -static vinfo_t* intobj_as_long(PsycoObject* po, vinfo_t* v) -{ - if (Psyco_VerifyType(po, v, &PyInt_Type) == 1) - return PsycoInt_AS_LONG(po, v); - else - return NULL; -} - -static bool parse_range_args(PsycoObject* po, vinfo_t* vargs, - vinfo_t** iistart, vinfo_t** iilen) -{ - vinfo_t* ilow; - vinfo_t* ihigh; - int tuplesize = PsycoTuple_Load(vargs); /* -1 if unknown */ - - switch (tuplesize) { - case 1: - ihigh = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 0)); - if (ihigh == NULL) return false; - ilow = psyco_vi_Zero(); - vinfo_incref(ihigh); - break; - /*case 3: - istep = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 2)); - if (istep == NULL) return NULL;*/ - /* fall through */ - case 2: - ilow = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 0)); - if (ilow == NULL) return false; - ihigh = intobj_as_long(po, PsycoTuple_GET_ITEM(vargs, 1)); - if (ihigh == NULL) return false; - vinfo_incref(ilow); - vinfo_incref(ihigh); - break; - default: - return false; - } - *iilen = get_len_of_range(po, ilow, ihigh); - vinfo_decref(ihigh, po); - if (*iilen == NULL) { - vinfo_decref(ilow, po); - return false; - } - *iistart = ilow; - return true; -} - -static vinfo_t* pbuiltin_range(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - vinfo_t* istart; - vinfo_t* ilen; - if (parse_range_args(po, vargs, &istart, &ilen)) { - return PsycoListRange_NEW(po, istart, ilen); - } - if (PycException_Occurred(po)) - return NULL; - return psyco_generic_call(po, cimpl_range, - CfReturnRef|CfPyErrIfNull, - "lv", NULL, vargs); -} - -static vinfo_t* pbuiltin_xrange(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - vinfo_t* istart; - vinfo_t* ilen; - if (parse_range_args(po, vargs, &istart, &ilen)) { - return PsycoXRange_NEW(po, istart, ilen); - } - if (PycException_Occurred(po)) - return NULL; - return psyco_generic_call(po, cimpl_xrange, - CfReturnRef|CfPyErrIfNull, - "lv", NULL, vargs); -} - -static vinfo_t* prange_new(PsycoObject* po, PyTypeObject* type, - vinfo_t* vargs, vinfo_t* vkw) -{ - /* for Python >= 2.3, where __builtin__.xrange is a type */ - vinfo_t* istart; - vinfo_t* ilen; - psyco_assert(type == &PyRange_Type); /* no subclassing xrange */ - if (parse_range_args(po, vargs, &istart, &ilen)) { - return PsycoXRange_NEW(po, istart, ilen); - } - if (PycException_Occurred(po)) - return NULL; - return psyco_generic_call(po, type->tp_new, - CfReturnRef|CfPyErrIfNull, - "lvv", type, vargs, vkw); -} - -static vinfo_t* pbuiltin_chr(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - vinfo_t* intval; - vinfo_t* result; - condition_code_t cc; - - if (PsycoTuple_Load(vargs) != 1) - goto use_proxy; - intval = PsycoInt_AsLong(po, PsycoTuple_GET_ITEM(vargs, 0)); - if (intval == NULL) - return NULL; - - cc = integer_cmp_i(po, intval, 255, Py_GT|COMPARE_UNSIGNED); - if (cc == CC_ERROR) { - vinfo_decref(intval, po); - return NULL; - } - if (runtime_condition_f(po, cc)) { - vinfo_decref(intval, po); - goto use_proxy; - } - - result = PsycoCharacter_New(intval); - vinfo_decref(intval, po); - return result; - - use_proxy: - return psyco_generic_call(po, cimpl_chr, CfReturnRef|CfPyErrIfNull, - "lv", NULL, vargs); -} - -static vinfo_t* pbuiltin_ord(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) -{ - vinfo_t* result; - if (!PsycoCharacter_Ord(po, vobj, &result)) - return NULL; - - if (result != NULL) - return PsycoInt_FROM_LONG(result); - - return psyco_generic_call(po, cimpl_ord, CfReturnRef|CfPyErrIfNull, - "lv", NULL, vobj); -} - -static vinfo_t* pbuiltin_id(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) -{ -#if HAVE_NEGATIVE_IDS /* Python < 2.5 */ - return PsycoInt_FromLong(vobj); -#else - /* XXX fall-back for now */ - return psyco_generic_call(po, PyLong_FromVoidPtr, - CfReturnRef|CfPyErrIfNull, - "v", vobj); -#endif -} - -static vinfo_t* pbuiltin_len(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) -{ - vinfo_t* result; - result = PsycoObject_Size(po, vobj); - if (result != NULL) - result = PsycoInt_FROM_LONG(result); - return result; -} - -static vinfo_t* pbuiltin_abs(PsycoObject* po, vinfo_t* vself, vinfo_t* vobj) -{ - return PsycoNumber_Absolute(po, vobj); -} - -static vinfo_t* pbuiltin_apply(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - vinfo_t* alist = NULL; - vinfo_t* kwdict = NULL; - vinfo_t* retval; - int tuplesize = PsycoTuple_Load(vargs); /* -1 if unknown */ - PyTypeObject* argt; - vinfo_t* t = NULL; - - switch (tuplesize) { - case 3: - kwdict = PsycoTuple_GET_ITEM(vargs, 2); - if (Psyco_VerifyType(po, kwdict, &PyDict_Type) != true) { - /* 'kwdict' is not a dictionary */ - break; - } - /* fall through */ - case 2: - alist = PsycoTuple_GET_ITEM(vargs, 1); - argt = Psyco_NeedType(po, alist); - if (argt == NULL) - return NULL; - if (!PyType_TypeCheck(argt, &PyTuple_Type)) { - /* 'alist' is not a tuple */ - if (!PsycoSequence_Check(argt)) - break; /* give up */ - t = PsycoSequence_Tuple(po, alist); - if (t == NULL) - break; /* give up */ - alist = t; - } - /* fall through */ - case 1: - retval = PsycoEval_CallObjectWithKeywords(po, - PsycoTuple_GET_ITEM(vargs, 0), - alist, kwdict); - vinfo_xdecref(t, po); - return retval; - } - - if (PycException_Occurred(po)) - return NULL; - return psyco_generic_call(po, cimpl_apply, CfReturnRef|CfPyErrIfNull, - "lv", NULL, vargs); -} - -static vinfo_t* pbuiltin_divmod(PsycoObject* po, vinfo_t* vself, vinfo_t* vargs) -{ - int tuplesize = PsycoTuple_Load(vargs); /* -1 if unknown */ - - if (tuplesize == 2) { - return PsycoNumber_Divmod(po, - PsycoTuple_GET_ITEM(vargs, 0), - PsycoTuple_GET_ITEM(vargs, 1)); - } - return psyco_generic_call(po, cimpl_divmod, CfReturnRef|CfPyErrIfNull, - "lv", NULL, vargs); -} - - -/***************************************************************/ - - -INITIALIZATIONFN -void psyco_bltinmodule_init(void) -{ - PyObject* md = Psyco_DefineMetaModule("__builtin__"); - -#define DEFMETA(name, flags) \ - cimpl_ ## name = Psyco_DefineModuleFn(md, #name, flags, &pbuiltin_ ## name) - - DEFMETA( range, METH_VARARGS ); - DEFMETA( chr, METH_VARARGS ); - DEFMETA( ord, METH_O); - DEFMETA( id, METH_O); - DEFMETA( len, METH_O); - DEFMETA( abs, METH_O); - DEFMETA( apply, METH_VARARGS ); - DEFMETA( divmod, METH_VARARGS ); - cimpl_xrange = Psyco_DefineModuleC(md, "xrange", METH_VARARGS, - &pbuiltin_xrange, prange_new); -#undef DEFMETA - Py_XDECREF(md); -} diff --git a/nodebox/ext/psyco/src/c/Python/pbltinmodule.h b/nodebox/ext/psyco/src/c/Python/pbltinmodule.h deleted file mode 100644 index 3d59fb8..0000000 --- a/nodebox/ext/psyco/src/c/Python/pbltinmodule.h +++ /dev/null @@ -1,10 +0,0 @@ - /***************************************************************/ -/*** interface to bltinmodule.c ***/ - /***************************************************************/ - -#ifndef _PSY_BLTINMODULE_H -#define _PSY_BLTINMODULE_H - -/* empty */ - -#endif /* _PSY_BLTINMODULE_H */ diff --git a/nodebox/ext/psyco/src/c/Python/pycheader.h b/nodebox/ext/psyco/src/c/Python/pycheader.h deleted file mode 100644 index 81ed1ce..0000000 --- a/nodebox/ext/psyco/src/c/Python/pycheader.h +++ /dev/null @@ -1,116 +0,0 @@ - /***************************************************************/ -/*** Language-dependent structures ***/ - /***************************************************************/ - - -#ifndef _PYCHEADER_H -#define _PYCHEADER_H - - -#include "../psyco.h" -#include -#include - - -/* "Frames": the Python compiler may be interrupted between the - compilation of two opcodes. Any local data it needs that should - persist across such interruptions must be stored in the PsycoObject - driving compilation. The PsycoObject plays the same role as the - FrameObject in normal interpretation. The usual fields of - FrameObjects are split into two groups: - - 1) in the 'vlocals' array, as 'vinfo_t' structures. This makes - dynamically-staged variables, that is, whose value may be known - at compile-time, run-time or virtual-time only. Use the LOC_xxx - macros to access these variables. - - 2) in the 'pr' field whose structure is defined below. For - compile-time-only data. - - IMPORTANT: the dispatcher only looks at LOC_xxx variables to - determine if the needed code has already be compiled. If two - PsycoObjects differ only by their 'pr' field, the code that - the compiler would emit in each case must be interchangeable - (but not necessary identical, as different optimizations - could be done). -*/ - -#define INDEX_LOC_CONTINUATION 0 /* return address in the stack */ -#define INDEX_LOC_GLOBALS 1 /* globals() dict object */ -#define INDEX_LOC_INLINING 2 /* for function inlining */ -#define INDEX_LOC_LOCALS_PLUS 3 /* start of local variables + stack */ - -#define LOC_CONTINUATION (po->vlocals.items[INDEX_LOC_CONTINUATION]) -#define LOC_GLOBALS (po->vlocals.items[INDEX_LOC_GLOBALS]) -#define LOC_INLINING (po->vlocals.items[INDEX_LOC_INLINING]) -#define LOC_LOCALS_PLUS (po->vlocals.items + INDEX_LOC_LOCALS_PLUS) - - -typedef struct { - PyCodeObject* co; /* code object we are compiling */ - int next_instr; /* next instruction to compile */ - short auto_recursion; /* # levels to auto-compile calls to Python functions */ - char is_inlining; /* true when compiling a code inlined in a parent */ - unsigned char iblock; /* index in blockstack */ - PyTryBlock blockstack[CO_MAXBLOCKS]; /* for try and loop blocks */ - - /* fields after 'blockstack' are not saved in a FrozenPsycoObject */ - int stack_base; /* number of items before the stack in LOC_LOCALS_PLUS */ - int stack_level; /* see note below */ - PyObject* merge_points; /* see mergepoints.h */ - vinfo_t* exc; /* current compile-time (pseudo) exception, see below */ - vinfo_t* val; /* exception value */ - vinfo_t* tb; /* traceback object */ - PyObject* f_builtins; - PyObject* changing_globals; /* dict of names of globals that are detected to - change */ -} pyc_data_t; - -#define AUTO_RECURSION_MAX 200 -#define AUTO_RECURSION(r) ((r)>AUTO_RECURSION_MAX ? AUTO_RECURSION_MAX : (r)) - -/* Note. - 'stack_level' is stored in 'pr'. To do so we must assume that the level - of the interpreter value stack is always the same when execution reaches - the same position in the bytecode. This is normally the case in Python, - with a few exceptions that need to be worked around ('finally:' clauses - in the original interpreter are invoked with a variable number of objects - pushed on the stack; the present interpreter always only pushes one, - grouping objects in a tuple if necessary (remember that tuples are - abstracted to virtual-time, so this doesn't mean we loose time building - and deconstructing Python tuples)). - - The same assumption holds for the other fields of pyc_data_t but only - 'stack_level' needs special care. -*/ - - -/* some extra flags recognized by psyco_generic_call(). They tell how the - Python C function signals errors. They are ignored by the Psyco_METAX() - macros if a meta-implementation is found, as meta-implementations always - signal errors by returning either (vinfo_t*)NULL or CC_ERROR. */ -#define CfPyErrDontCheck 0x000 /* default: no check */ -#define CfPyErrIfNull 0x100 /* a return == 0 (or NULL) means an error */ -#define CfPyErrIfNonNull 0x200 /* a return != 0 means an error */ -#define CfPyErrIfNeg 0x300 /* a return < 0 means an error */ -#define CfPyErrIfMinus1 0x400 /* only -1 means an error */ -#define CfPyErrCheck 0x500 /* always check with PyErr_Occurred() */ -#define CfPyErrCheckMinus1 0x600 /* use PyErr_Occurred() if return is -1 */ -#define CfPyErrCheckNeg 0x700 /* use PyErr_Occurred() if return is < 0 */ -#define CfPyErrNotImplemented 0x800 /* test for a Py_NotImplemented result */ -#define CfPyErrIterNext 0x900 /* specially for tp_iternext slots */ -#define CfPyErrAlways 0xA00 /* always set an exception */ - -#define CfPyErrMask 0xF00 - -/* Note: CfPyErrNotImplemented means that the C function may return - Py_NotImplemented, and this is checked; if true, then Psyco_METAX() - returns exactly 'psyco_viNotImplemented', and not just a possibly run-time - vinfo_t* containing Py_NotImplemented. Meta-implementations always return - exactly 'psyco_viNotImplemented'. */ - -/* for psyco_generic_call() only */ -EXTERNFN vinfo_t* generic_call_check(PsycoObject* po, int flags, vinfo_t* vi); -EXTERNFN vinfo_t* generic_call_ct(int flags, long result); - -#endif /* _PYCHEADER_H */ diff --git a/nodebox/ext/psyco/src/c/Python/pycinternal.h b/nodebox/ext/psyco/src/c/Python/pycinternal.h deleted file mode 100644 index bc19eae..0000000 --- a/nodebox/ext/psyco/src/c/Python/pycinternal.h +++ /dev/null @@ -1,24 +0,0 @@ - /***************************************************************/ -/*** Includes Python internal headers ***/ - /***************************************************************/ - - -#ifndef _PYCINTERNAL_H -#define _PYCINTERNAL_H - -#include - - -/* Post-2.2 versions of Python introduced the following more explicit names. - XXX We should map the new names to the old ones if the new names do not - XXX exist but how can we detect if this is needed? - XXX Hacked by completely overriding the enum values with #defines. */ - -#define PyCmp_IN 6 -#define PyCmp_NOT_IN 7 -#define PyCmp_IS 8 -#define PyCmp_IS_NOT 9 -#define PyCmp_EXC_MATCH 10 - - -#endif /* _PYCINTERNAL_H */ diff --git a/nodebox/ext/psyco/src/c/Python/pycompiler.c b/nodebox/ext/psyco/src/c/Python/pycompiler.c deleted file mode 100644 index 4be1335..0000000 --- a/nodebox/ext/psyco/src/c/Python/pycompiler.c +++ /dev/null @@ -1,3237 +0,0 @@ -#include "pycompiler.h" -#include "../processor.h" -#include "../dispatcher.h" -#include "../mergepoints.h" -#include "../codemanager.h" -#include "../psyfunc.h" -#include "../pycodegen.h" - -#include "../Objects/pabstract.h" -#include "../Objects/pintobject.h" -#include "../Objects/plongobject.h" -#include "../Objects/ptupleobject.h" -#include "../Objects/plistobject.h" -#include "../Objects/pdictobject.h" -#include "../Objects/pfuncobject.h" - -#include -#include "pycinternal.h" -#include - - -#define KNOWN_VAR(type, varname, loc) \ - type varname = (type)(CompileTime_Get(loc->source)->value) - - -/*****************************************************************/ - /*** Meta functions ***/ - -DEFINEVAR PyObject* Psyco_Meta_Dict = NULL; - -DEFINEFN -void Psyco_DefineMeta(void* c_function, void* psyco_function) -{ - PyObject* key; - PyObject* value; - if (Psyco_Meta_Dict == NULL) { - Psyco_Meta_Dict = PyDict_New(); - if (Psyco_Meta_Dict == NULL) - return; - } - if (c_function == NULL) { - /* should not occur */ - debug_printf(1, ("init: C function pointer NULL in CPython\n")); - return; - } - key = PyInt_FromLong((long) c_function); - if (key != NULL) { - value = PyInt_FromLong((long) psyco_function); - if (value != NULL) { - PyDict_SetItem(Psyco_Meta_Dict, key, value); - Py_DECREF(value); - } - Py_DECREF(key); - } -} - -DEFINEFN -PyObject* Psyco_DefineMetaModule(char* modulename) -{ - PyObject* module = PyImport_ImportModule(modulename); - if (module == NULL) { - PyErr_Clear(); - debug_printf(1, ("init: module %s not found\n", - modulename)); - } - else { - debug_printf(2, ("init: activated module %s\n", modulename)); - } - return module; -} - -DEFINEFN -PyObject* Psyco_GetModuleObject(PyObject* module, char* name, - PyTypeObject* expected_type) -{ - PyObject* fobj; - if (module == NULL) - return NULL; - - fobj = PyObject_GetAttrString(module, name); - if (fobj == NULL) { - debug_printf(1, ("init: %s.%s not found\n", - PyModule_GetName(module), name)); - PyErr_Clear(); - return NULL; - } - if (expected_type != NULL && !PyObject_TypeCheck(fobj, expected_type)) { - debug_printf(1, ("init: %s.%s is of type %.200s instead of " - "%.200s\n", PyModule_GetName(module), name, - fobj->ob_type->tp_name, - expected_type->tp_name)); - Py_DECREF(fobj); - fobj = NULL; - } - return fobj; -} - -DEFINEFN -PyCFunction Psyco_DefineModuleFn(PyObject* module, char* meth_name, - int meth_flags, void* meta_fn) -{ - PyCFunction f; - PyObject* fobj = Psyco_GetModuleObject(module, meth_name, - &PyCFunction_Type); - if (fobj == NULL) - return NULL; - - if (PyCFunction_GET_FLAGS(fobj) != meth_flags) { - f = NULL; - debug_printf(1, ("init: %s.%s built-in has wrong " - "meth_flags\n", PyModule_GetName(module), - meth_name)); - } - else { - f = PyCFunction_GET_FUNCTION(fobj); - Psyco_DefineMeta(f, meta_fn); - } - Py_DECREF(fobj); - return f; -} - -DEFINEFN -PyCFunction Psyco_DefineModuleC(PyObject* module, char* meth_name, - int meth_flags, void* meta_fn, - void* meta_type_new) -{ - PyObject* o = Psyco_GetModuleObject(module, meth_name, NULL); - if (o == NULL) - return NULL; - if (PyType_Check(o) && - PyType_HasFeature((PyTypeObject*) o, Py_TPFLAGS_HAVE_CLASS) && - ((PyTypeObject*)o)->tp_new != NULL) { - /* maps a callable type */ - Psyco_DefineMeta(((PyTypeObject*)o)->tp_new, meta_type_new); - return NULL; - } - else - return Psyco_DefineModuleFn(module, meth_name, - meth_flags, meta_fn); -} - - -#define FORGET_REF if (has_rtref(vi->source)) \ - vi->source = remove_rtref(vi->source) - -DEFINEFN -vinfo_t* generic_call_check(PsycoObject* po, int flags, vinfo_t* vi) -{ - condition_code_t cc; - - switch (flags & CfPyErrMask) { - - case CfPyErrIfNull: /* a return == 0 (or NULL) means an error */ - cc = integer_cmp_i(po, vi, 0, Py_EQ); - break; - - case CfPyErrIfNonNull: /* a return != 0 means an error */ - cc = integer_cmp_i(po, vi, 0, Py_NE); - break; - - case CfPyErrIfNeg: /* a return < 0 means an error */ - cc = integer_cmp_i(po, vi, 0, Py_GE); - if (cc == CC_ERROR) - goto Error; - if (runtime_condition_t(po, cc)) { - assert_nonneg(vi); - return vi; /* result is >= 0, ok */ - } - goto Error; - - case CfPyErrIfMinus1: /* only -1 means an error */ - cc = integer_cmp_i(po, vi, -1, Py_EQ); - break; - - case CfPyErrCheck: /* always check with PyErr_Occurred() */ - cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); - break; - - case CfPyErrCheckMinus1: /* use PyErr_Occurred() if return is -1 */ - cc = integer_cmp_i(po, vi, -1, Py_NE); - if (cc == CC_ERROR) - goto Error; - if (runtime_condition_t(po, cc)) - return vi; /* result is not -1, ok */ - cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); - break; - - case CfPyErrCheckNeg: /* use PyErr_Occurred() if return is < 0 */ - cc = integer_cmp_i(po, vi, 0, Py_GE); - if (cc == CC_ERROR) - goto Error; - if (runtime_condition_t(po, cc)) { - assert_nonneg(vi); - return vi; /* result is >= 0, ok */ - } - cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); - break; - - case CfPyErrNotImplemented: /* test for a Py_NotImplemented result */ - cc = integer_cmp_i(po, vi, (long) Py_NotImplemented, Py_EQ); - if (cc == CC_ERROR) - goto Error; - if (runtime_condition_f(po, cc)) { - /* result is Py_NotImplemented */ - vinfo_decref(vi, po); - return psyco_vi_NotImplemented(); - } - cc = integer_cmp_i(po, vi, 0, Py_EQ); - break; - - case CfPyErrIterNext: /* specially for tp_iternext slots */ - cc = integer_cmp_i(po, vi, 0, Py_NE); - if (cc == CC_ERROR) - goto Error; - if (runtime_condition_t(po, cc)) - return vi; /* result is not 0, ok */ - - FORGET_REF; /* NULL result */ - vinfo_decref(vi, po); - cc = integer_NON_NULL(po, psyco_PyErr_Occurred(po)); - if (cc == CC_ERROR || runtime_condition_f(po, cc)) - goto PythonError; /* PyErr_Occurred() returns true */ - - /* NULL result with no error set; it is the end of the - iteration. Raise a pseudo PyErr_StopIteration. */ - PycException_SetVInfo(po, PyExc_StopIteration, psyco_vi_None()); - return NULL; - - case CfPyErrAlways: /* always set an exception */ - goto Error; - - default: - return vi; - } - - if (cc != CC_ERROR && !runtime_condition_f(po, cc)) - return vi; /* no error */ - - Error: - if ((flags & CfReturnMask) == CfReturnRef) { - /* in case of error, 'vi' is not a real - reference, so forget it */ - FORGET_REF; - } - vinfo_decref(vi, po); - - /* We have detected that a Python exception must be set at - this point. */ - PythonError: - PycException_Raise(po, vinfo_new(VirtualTime_New(&ERtPython)), - NULL); - return NULL; -} -#undef FORGET_REF - -DEFINEFN -vinfo_t* generic_call_ct(int flags, long result) -{ - switch (flags & CfPyErrMask) { - - case CfPyErrNotImplemented: /* test for a Py_NotImplemented result */ - if ((PyObject*) result == Py_NotImplemented) - return psyco_vi_NotImplemented(); - break; - } - return NULL; /* meaning: nothing particular */ -} - -DEFINEFN -vinfo_t* Psyco_Meta1x(PsycoObject* po, void* c_function, int flags, - const char* arguments, long a1) -{ - void* psyco_fn = Psyco_Lookup(c_function); - if (psyco_fn == NULL) { - return psyco_generic_call(po, c_function, flags, arguments, - a1); - } - else - return ((vinfo_t*(*)(PsycoObject*, long))(psyco_fn)) - (po, a1); -} - -DEFINEFN -vinfo_t* Psyco_Meta2x(PsycoObject* po, void* c_function, int flags, - const char* arguments, long a1, long a2) -{ - void* psyco_fn = Psyco_Lookup(c_function); - if (psyco_fn == NULL) - return psyco_generic_call(po, c_function, flags, arguments, - a1, a2); - else - return ((vinfo_t*(*)(PsycoObject*, long, long))(psyco_fn)) - (po, a1, a2); -} - -DEFINEFN -vinfo_t* Psyco_Meta3x(PsycoObject* po, void* c_function, int flags, - const char* arguments, long a1, long a2, long a3) -{ - void* psyco_fn = Psyco_Lookup(c_function); - if (psyco_fn == NULL) - return psyco_generic_call(po, c_function, flags, arguments, - a1, a2, a3); - else - return ((vinfo_t*(*)(PsycoObject*, long, long, long))(psyco_fn)) - (po, a1, a2, a3); -} - -#if 0 -DEFINEFN -int psyco_atcompiletime_mega(PsycoObject* po, vinfo_t* vi, long* out) -{ - if (!compute_vinfo(vi, po)) - return -1; - if (is_runtime(vi->source)) { - if (vi->source & RunTime_Megamorphic) - return 0; - PycException_Promote(po, vi, &psyco_nonfixed_promotion_mega); - return -1; - } - else { - source_known_t* sk = CompileTime_Get(vi->source); - sk->refcount1_flags |= SkFlagFixed; - *out = sk->value; - return 1; - } -} -#endif - -DEFINEFN -int psyco_pyobj_atcompiletime_mega(PsycoObject* po, - vinfo_t* vi, PyObject** out) -{ - if (!compute_vinfo(vi, po)) - return -1; - if (is_runtime(vi->source)) { - if (vi->source & RunTime_Megamorphic) - return 0; - PycException_Promote(po, vi, - &psyco_nonfixed_pyobj_promotion_mega); - return -1; - } - else { - source_known_t* sk = CompileTime_Get(vi->source); - sk->refcount1_flags |= SkFlagFixed; - *out = (PyObject*) sk->value; - return 1; - } -} - - -/***************************************************************/ - /*** pyc_data_t ***/ - - -DEFINEFN -void pyc_data_build(PsycoObject* po, PyObject* merge_points) -{ - /* rebuild the data in the pyc_data_t */ - int i; - PyCodeObject* co = po->pr.co; - int stack_base = po->vlocals.count - co->co_stacksize; - for (i=stack_base; ivlocals.count; i++) - if (po->vlocals.items[i] == NULL) - break; - po->pr.stack_base = stack_base; - po->pr.stack_level = i - stack_base; - po->pr.merge_points = merge_points; -} - -static void block_setup(PsycoObject* po, int type, int handler, int level) -{ - PyTryBlock *b; - extra_assert(!po->pr.is_inlining); - if (po->pr.iblock >= CO_MAXBLOCKS) - Py_FatalError("block stack overflow"); - b = &po->pr.blockstack[(int)(po->pr.iblock++)]; - b->b_type = type; - b->b_level = level; - b->b_handler = handler; -} - -static PyTryBlock* block_pop(PsycoObject* po) -{ - extra_assert(!po->pr.is_inlining); - if (po->pr.iblock <= 0) - Py_FatalError("block stack underflow"); - return &po->pr.blockstack[(int)(--po->pr.iblock)]; -} - - -/*****************************************************************/ - /*** Compile-time Pseudo exceptions ***/ - - -DEFINEVAR source_virtual_t ERtPython; /* Exception raised by Python */ -DEFINEVAR source_virtual_t EReturn; /* 'return' statement */ -DEFINEVAR source_virtual_t EBreak; /* 'break' statement */ -DEFINEVAR source_virtual_t EContinue; /* 'continue' statement */ -DEFINEVAR source_virtual_t EInline; /* request to inline a function */ - -DEFINEFN -void PycException_SetString(PsycoObject* po, PyObject* e, const char* text) -{ - PyObject* s = PyString_FromString(text); - if (s == NULL) - OUT_OF_MEMORY(); - PycException_SetObject(po, e, s); -} - -DEFINEFN -void PycException_SetObject(PsycoObject* po, PyObject* e, PyObject* v) -{ - PycException_Raise(po, vinfo_new(CompileTime_New((long) e)), - vinfo_new(CompileTime_NewSk(sk_new((long) v, - SkFlagPyObj)))); -} - -DEFINEFN -void PycException_SetVInfo(PsycoObject* po, PyObject* e, vinfo_t* v) -{ - PycException_Raise(po, vinfo_new(CompileTime_New((long) e)), v); -} - -DEFINEFN -void PycException_Promote(PsycoObject* po, vinfo_t* vi, c_promotion_t* promotion) -{ - vinfo_incref(vi); - PycException_Raise(po, vinfo_new(VirtualTime_New(&promotion->header)), - vi); -} - -DEFINEFN -void PycException_SetFormat(PsycoObject* po, PyObject* e, const char* fmt, ...) -{ - PyObject* s; - va_list vargs; - -#ifdef HAVE_STDARG_PROTOTYPES - va_start(vargs, fmt); -#else - va_start(vargs); -#endif - s = PyString_FromFormatV(fmt, vargs); - va_end(vargs); - - if (s == NULL) - OUT_OF_MEMORY(); - PycException_SetObject(po, e, s); -} - -DEFINEFN -vinfo_t* PycException_Matches(PsycoObject* po, PyObject* e) -{ - vinfo_t* result; - if (PycException_Is(po, &ERtPython)) { - /* Exception raised by Python, emit a call to - PyErr_ExceptionMatches() */ - result = psyco_generic_call(po, PyErr_ExceptionMatches, - CfReturnNormal, "l", (long) e); - } - else if (PycException_IsPython(po)) { - /* Exception virtually set, that is, present in the PsycoObject - but not actually set at run-time by Python's PyErr_SetXxx */ - result = psyco_generic_call(po, PyErr_GivenExceptionMatches, - CfPure | CfReturnNormal, - "vl", po->pr.exc, (long) e); - } - else { /* pseudo exceptions don't match real Python ones */ - result = psyco_vi_Zero(); - } - return result; -} - -PSY_INLINE void clear_pseudo_exception(PsycoObject* po) -{ - extra_assert(PycException_Occurred(po)); - if (po->pr.tb != NULL) { - vinfo_decref(po->pr.tb, po); - po->pr.tb = NULL; - } - if (po->pr.val != NULL) { - vinfo_decref(po->pr.val, po); - po->pr.val = NULL; - } - vinfo_decref(po->pr.exc, po); - po->pr.exc = NULL; -} - -DEFINEFN -void PycException_Clear(PsycoObject* po) -{ - if (PycException_Is(po, &ERtPython)) { - /* Clear the Python exception set at run-time */ - psyco_generic_call(po, PyErr_Clear, CfNoReturnValue, ""); - } - clear_pseudo_exception(po); -} - -DEFINEFN -void psyco_virtualize_exception(PsycoObject* po) -{ - /* fetch a Python exception set at compile-time (that is, now) - and turn into a pseudo-exception (typically to be re-raised - at run-time). */ - PyObject *exc, *val, *tb; - vinfo_t *vexc, *vval, *vtb; - PyErr_Fetch(&exc, &val, &tb); - extra_assert(exc != NULL); - - vexc = vinfo_new(CompileTime_NewSk(sk_new((long) exc, SkFlagPyObj))); - vval = vinfo_new(CompileTime_NewSk(sk_new((long) val, SkFlagPyObj))); - vtb = tb == NULL ? NULL : - vinfo_new(CompileTime_NewSk(sk_new((long) tb, SkFlagPyObj))); - PycException_Restore(po, vexc, vval, vtb); -} - -static void cimpl_pyerr_fetch(PyObject* target[]) -{ - extra_assert(PyErr_Occurred()); - PyErr_Fetch(target+0, target+1, target+2); - if (target[0] == NULL) { - target[0] = Py_None; - Py_INCREF(Py_None); - } - if (target[1] == NULL) { - target[1] = Py_None; - Py_INCREF(Py_None); - } - if (target[2] == NULL) { - target[2] = Py_None; - Py_INCREF(Py_None); - } -} - -DEFINEFN -void cimpl_finalize_frame_locals(PyObject* f_exc_type, - PyObject* f_exc_value, - PyObject* f_exc_traceback) -{ - /* Called by code emitted by pycencoding.h when a function exits, - but only if f_exc_type!=NULL. Works like reset_exc_info() of - Python. */ - PyThreadState *tstate = PyThreadState_GET(); - PyObject *tmp_type, *tmp_value, *tmp_tb; - - /* This frame caught an exception */ - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = f_exc_type; /* references are transferred */ - tstate->exc_value = f_exc_value; - tstate->exc_traceback = f_exc_traceback; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); - /* For b/w compatibility */ - PySys_SetObject("exc_type", f_exc_type); - PySys_SetObject("exc_value", f_exc_value); - PySys_SetObject("exc_traceback", f_exc_traceback); -} - -PSY_INLINE void cimpl_set_exc_info(PyObject* target[], - PyObject** f_exc_type, - PyObject** f_exc_value, - PyObject** f_exc_traceback) -{ - /* Equivalent of PyErr_NormalizeException() + set_exc_info() */ - PyThreadState *tstate = PyThreadState_GET(); - PyObject *type, *value, *tb; - PyObject *tmp_type, *tmp_value, *tmp_tb; - - PyErr_NormalizeException(target+0, target+1, target+2); - type = target[0]; - value = target[1]; - tb = target[2]; - - if (*f_exc_type == NULL) { - /* This frame didn't catch an exception before */ - /* Save previous exception of this thread in this frame */ - if (tstate->exc_type == NULL) { - Py_INCREF(Py_None); - tstate->exc_type = Py_None; - } - Py_INCREF(tstate->exc_type); - Py_XINCREF(tstate->exc_value); - Py_XINCREF(tstate->exc_traceback); - *f_exc_type = tstate->exc_type; - *f_exc_value = tstate->exc_value; - *f_exc_traceback = tstate->exc_traceback; - } - /* Set new exception for this thread */ - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - Py_XINCREF(type); - Py_XINCREF(value); - Py_XINCREF(tb); - tstate->exc_type = type; - tstate->exc_value = value; - tstate->exc_traceback = tb; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); - /* For b/w compatibility */ - PySys_SetObject("exc_type", type); - PySys_SetObject("exc_value", value); - PySys_SetObject("exc_traceback", tb); -} - -static void cimpl_pyerr_fetch_and_normalize(PyObject* target[], - PyObject** f_exc_type, - PyObject** f_exc_value, - PyObject** f_exc_traceback) -{ - extra_assert(PyErr_Occurred()); - PyErr_Fetch(target+0, target+1, target+2); - cimpl_set_exc_info(target, - f_exc_type, f_exc_value, f_exc_traceback); -} - -static void cimpl_pyerr_normalize(PyObject* exc, PyObject* val, PyObject* tb, - PyObject* target[], - PyObject** f_exc_type, - PyObject** f_exc_value, - PyObject** f_exc_traceback) -{ - target[0] = exc; Py_INCREF(exc); - target[1] = val; Py_XINCREF(val); - target[2] = tb; Py_XINCREF(tb); - cimpl_set_exc_info(target, - f_exc_type, f_exc_value, f_exc_traceback); -} - -DEFINEFN -void PycException_Fetch(PsycoObject* po) -{ - if (PycException_Is(po, &ERtPython)) { -/* vinfo_t* exc = vinfo_new(SOURCE_DUMMY_WITH_REF); */ -/* vinfo_t* val = vinfo_new(SOURCE_DUMMY_WITH_REF); */ -/* vinfo_t* tb = vinfo_new(SOURCE_DUMMY_WITH_REF); */ -/* psyco_generic_call(po, PyErr_Fetch, CfNoReturnValue, */ -/* "rrr", exc, val, tb); */ -/* vinfo_decref(tb, po); */ - vinfo_array_t* array = array_new(3); - psyco_generic_call(po, cimpl_pyerr_fetch, - CfNoReturnValue, "A", array); - clear_pseudo_exception(po); - po->pr.exc = array->items[0]; - po->pr.val = array->items[1]; /* po->pr.val!=NULL after this */ - po->pr.tb = array->items[2]; /* po->pr.tb!=NULL after this */ - array_release(array); - } -} - -PSY_INLINE bool PycException_FetchNormalize(PsycoObject* po) -{ - vinfo_t* result; - vinfo_array_t* array = array_new(3); - vinfo_array_t* f_exc = LOC_CONTINUATION->array; - - /* At runtime, we load the following data into the array: - - array[0] -- exc_type new exception, normalized - array[1] -- exc_value new exception, normalized - array[2] -- exc_traceback new exception, normalized - */ - extra_assert(f_exc->count >= 3); - if (PycException_Is(po, &ERtPython)) { - /* fetch and normalize the exception */ - result = psyco_generic_call(po, cimpl_pyerr_fetch_and_normalize, - CfNoReturnValue, "Arrr", array, - f_exc->items[0], - f_exc->items[1], - f_exc->items[2]); - } - else { - char args[8]; - args[0] = 'v'; - args[1] = po->pr.val == NULL ? 'l' : 'v'; - args[2] = po->pr.tb == NULL ? 'l' : 'v'; - args[3] = 'A'; - args[4] = 'r'; - args[5] = 'r'; - args[6] = 'r'; - args[7] = 0; - /* normalize the already-given exception */ - result = psyco_generic_call(po, cimpl_pyerr_normalize, - CfNoReturnValue, args, - po->pr.exc, po->pr.val, po->pr.tb, - array, - f_exc->items[0], - f_exc->items[1], - f_exc->items[2]); - } - if (result == NULL) { - array_release(array); - return false; - } - clear_pseudo_exception(po); - po->pr.exc = array->items[0]; - po->pr.val = array->items[1]; /* po->pr.val!=NULL after this */ - po->pr.tb = array->items[2]; /* po->pr.tb!=NULL after this */ - array_release(array); - return true; -} - -static PyFrameObject* cimpl_new_frame(PyThreadState* tstate, PyCodeObject* code, - PyObject* globals, int lasti, int lineno) -{ - /* Make a minimalistic frame object, working around the specific - expectations of PyFrame_New(), which is the only reasonable way - to create frame objects (because of free lists etc) */ - PyFrameObject* result; - PyFrameObject* back = tstate->frame; - tstate->frame = NULL; /* frame objects are not created in stack order - with Psyco, so it's probably better not to - create plain wrong chained lists */ - result = PyFrame_New(tstate, code, globals, NULL); - tstate->frame = back; - if (result != NULL) { - result->f_lasti = lasti; - result->f_lineno = lineno; - } - return result; -} - -static void cimpl_rt_traceback(PyCodeObject* code, PyObject* globals, - int lasti, int lineno) -{ - PyThreadState* tstate = PyThreadState_GET(); - PyFrameObject* f = cimpl_new_frame(tstate, code, globals, lasti, lineno); - /* an out-of-memory error just replaces the current exception */ - if (f != NULL) { - PyTraceBack_Here(f); - Py_DECREF(f); - } -} - -static PyObject* cimpl_vt_traceback(PyCodeObject* code, PyObject* globals, - int lasti, int lineno) -{ - /* This is a hack around the limited interface to tracebacks. - PyTraceBack_Here() seems to be the only clean way to create new - traceback objects. */ - PyObject* oldtb; - PyObject* newtb; - PyThreadState* tstate = PyThreadState_GET(); - PyFrameObject* f = cimpl_new_frame(tstate, code, globals, lasti, lineno); - if (f == NULL) { - /* out-of-memory error */ - Py_INCREF(Py_None); - return Py_None; - } - oldtb = tstate->curexc_traceback; /* might be NULL */ - Py_XINCREF(oldtb); - if (PyTraceBack_Here(f)) { - /* out-of-memory error */ - Py_XDECREF(oldtb); - Py_DECREF(f); - Py_INCREF(Py_None); - return Py_None; - } - /* the new traceback is now in curexc_traceback */ - newtb = tstate->curexc_traceback; /* extracts the reference */ - tstate->curexc_traceback = oldtb; /* consumes the reference */ - Py_DECREF(f); - return newtb; -} - -/* record a traceback entry for the current virtual Python exception */ -PSY_INLINE void PsycoTraceBack_Here(PsycoObject* po, int lasti) -{ - int lineno = PyCode_Addr2Line(po->pr.co, lasti); - - if (PycException_Is(po, &ERtPython)) { - /* Python exception is actually set at run-time */ - psyco_generic_call(po, cimpl_rt_traceback, - CfNoReturnValue, "lvll", - (long) po->pr.co, LOC_GLOBALS, lasti, lineno); - } - else { - /* We only have a virtual-time exception (not set in Python), - so we build po->pr.tb without actually setting it either */ - vinfo_t* tb = psyco_generic_call(po, cimpl_vt_traceback, - CfReturnRef, "lvll", - (long) po->pr.co, LOC_GLOBALS, - lasti, lineno); - vinfo_xdecref(po->pr.tb, po); - po->pr.tb = tb; - } -} - - - /***************************************************************/ -/*** Initialization ***/ - /***************************************************************/ - -DEFINEVAR source_known_t psyco_skZero; /* known value 0 */ -DEFINEVAR source_known_t psyco_skOne; /* known value 1 */ -DEFINEVAR source_known_t psyco_skNone; /* known value 'Py_None' */ -DEFINEVAR source_known_t psyco_skPy_False; /* known value 'Py_False' */ -DEFINEVAR source_known_t psyco_skPy_True; /* known value 'Py_True' */ -DEFINEVAR source_known_t psyco_skNotImplemented; - -static PyObject* s_builtin_object; /* intern string '__builtins__' */ - -INITIALIZATIONFN -void psyco_pycompiler_init(void) -{ - s_builtin_object = PyString_InternFromString("__builtins__"); - - psyco_skZero .refcount1_flags = SkFlagFixed; - psyco_skZero .value = (long) 0; - psyco_skOne .refcount1_flags = SkFlagFixed; - psyco_skOne .value = (long) 1; - psyco_skNone .refcount1_flags = SkFlagFixed; - psyco_skNone .value = (long) Py_None; - psyco_skPy_False .refcount1_flags = SkFlagFixed; - psyco_skPy_False .value = (long) Py_False; - psyco_skPy_True .refcount1_flags = SkFlagFixed; - psyco_skPy_True .value = (long) Py_True; - psyco_skNotImplemented.refcount1_flags = SkFlagFixed; - psyco_skNotImplemented.value = (long) Py_NotImplemented; - - ERtPython = psyco_vsource_not_important; - EReturn = psyco_vsource_not_important; - EContinue = psyco_vsource_not_important; - EBreak = psyco_vsource_not_important; - EInline = psyco_vsource_not_important; -} - - - /***************************************************************/ -/*** Compiler ***/ - /***************************************************************/ - -#define CHKSTACK(n) extra_assert(0 <= po->pr.stack_level+(n) && \ - po->pr.stack_base+po->pr.stack_level+(n) < \ - po->vlocals.count) - -#define NEXTOP() (bytecode[next_instr++]) -#define NEXTARG() (next_instr += 2, \ - (bytecode[next_instr-1]<<8) + bytecode[next_instr-2]) - -#define PUSH(v) (CHKSTACK(0), stack_a[po->pr.stack_level++] = v) -#define POP(targ) (CHKSTACK(-1), targ = stack_a[--po->pr.stack_level], \ - stack_a[po->pr.stack_level] = NULL) -#define NTOP(n) (CHKSTACK(-(n)), stack_a[po->pr.stack_level-(n)]) -#define TOP() NTOP(1) -#define POP_DECREF() do { vinfo_t* v1; POP(v1); \ - vinfo_decref(v1, po); } while (0) - -/*#define GETCODEOBJ() ((PyCodeObject*)(KNOWN_SOURCE(LOC_CODE)->value))*/ -#define GETCONST(i) (PyTuple_GET_ITEM(co->co_consts, i)) -#define GETNAMEV(i) (PyTuple_GET_ITEM(co->co_names, i)) - -#define GETLOCAL(i) (LOC_LOCALS_PLUS[i]) -#define SETLOCAL(i, v) do { vinfo_decref(GETLOCAL(i), po); \ - GETLOCAL(i) = v; } while (0) - -#define STACK_POINTER() (stack_a + po->pr.stack_level) -#define INSTR_OFFSET() (next_instr) -#define STACK_LEVEL() (po->pr.stack_level) -#define JUMPBY(offset) (next_instr += (offset)) -#define JUMPTO(target) (next_instr = (target)) - -#define SAVE_NEXT_INSTR(nextinstr1) (po->pr.next_instr = (nextinstr1)) - -/* #define MISSING_OPCODE(opcode) */ -/* case opcode: */ -/* PycException_SetString(po, PyExc_PsycoError, */ -/* "opcode '" #opcode "' not implemented"); */ -/* break */ - - -/***************************************************************/ - /*** LOAD_GLOBAL tricks ***/ - - -static void mark_varying(PsycoObject* po, PyObject* key) -{ - RECLIMIT_SAFE_ENTER(); - if (po->pr.changing_globals == NULL) { - po->pr.changing_globals = PyDict_New(); - if (po->pr.changing_globals == NULL) - OUT_OF_MEMORY(); - } - if (PyDict_SetItem(po->pr.changing_globals, key, Py_True)) - OUT_OF_MEMORY(); - RECLIMIT_SAFE_LEAVE(); -} - -/* closure for the do_changed_global call-back */ -typedef struct { - PyObject* varname; - PyObject* previousvalue; - void* originalmacrocode; - PyDictObject* globals; -} changed_global_t; - -static code_t* do_changed_global(changed_global_t* cg) -{ - PyObject* key = cg->varname; - PyDictEntry* ep; - PyDictObject* globals = cg->globals; - - /* first check that the value really changed; it could merely - have moved in the dictionary table (reallocations etc.) */ - ep = (globals->ma_lookup)(globals, key, - ((PyStringObject*) key)->ob_shash); - - if (ep->me_value == cg->previousvalue) { - /* no real change; update the original macro code - and that's it */ - dictitem_update_nochange(cg->originalmacrocode, - globals, ep); - return psyco_dont_respawn(cg, sizeof(*cg)); - } - else { - /* real change: respawn */ - return psyco_do_respawn(cg, sizeof(*cg)); - } -} - -PyObject* psy_get_builtins(PyObject* globals) -{ - static PyObject* minimal_builtins = NULL; - PyObject* builtins; - /* code copied from frameobject.c */ - RECLIMIT_SAFE_ENTER(); - builtins = PyDict_GetItem((PyObject*) globals, s_builtin_object); - if (builtins) { - if (PyDict_Check(builtins)) - goto done; - if (PyModule_Check(builtins)) { - builtins = PyModule_GetDict(builtins); - if (builtins) { - psyco_assert(PyDict_Check(builtins)); - goto done; - } - } - } - /* No builtins! Make up a minimal one - Give them 'None', at least. */ - if (minimal_builtins == NULL) { - minimal_builtins = PyDict_New(); - if (minimal_builtins == NULL || - PyDict_SetItemString(minimal_builtins, - "None", Py_None) < 0) - OUT_OF_MEMORY(); - } - builtins = minimal_builtins; - done: - RECLIMIT_SAFE_LEAVE(); - return builtins; -} - - -#define GLOBAL_NAME_ERROR_MSG \ - "global name '%.200s' is not defined" -#define UNBOUNDLOCAL_ERROR_MSG \ - "local variable '%.200s' referenced before assignment" - -/* Load the global variable whose name is in 'key' (an interned string). - Returns a new reference to the result or NULL. */ -static PyObject* load_global(PsycoObject* po, PyObject* key, int next_instr) -{ - /* XXX this assumes that builtins never change, and that - no global variable shadowing a builtin variable is added - or removed after Psyco has compiled a piece of code. - - Idea of the current implementation: we perform now the - look-up in the globals() and remember where it was found - in the ma_table of the dictionary. We then emit machine - code that performs a speeded-up version of the lookup by - checking directly at that place if the same value is still - in place. If it is not, do_changed_global() is called. - It redoes a complete look-up, and if the value has merely - moved in the dictionary it updates the machine code. - If the value has really changed, a full respawn is - triggered, which will eventually cause load_global() to - be re-entered and detect_respawn() to succeed. At that - point we un-promote the variable from compile-time to - run-time. - - This requires knowledge of the internal workings of a - dictionary. - - This also assumes that a majority of global variables - never change, which should be the case (typically, - global functions, classes, etc. do not change). - - A more correct but more involved solution could be - implemented by adding to dictobject.c some kind of - 'on-change' hooks. The hooks might be called at any - time; we would then have to insert an espace sequence - inside of the machine code to trigger recompilation the - next time the execution reaches this point. This is not - easy to do because it must be done in a single byte to - prevent accidental overrides of the next instruction. - Processors typically have such a minimally-sized - instruction for debugging purposes but it is not - supposed to be used outside of debuggers -- it - triggers some kind of OS-dependent signal which must - be caught. Not portable at all. (insert dummy NOPs in - the first place to make room for a future JMP?) - */ - KNOWN_VAR(PyDictObject*, globals, LOC_GLOBALS); - PyDictEntry* ep; - PyObject* result; - - /* careful when respawning. The value could have been added or - deleted from the globals in the meantime. This is why we - cannot just do that in the "found in globals()" branch - below. */ - if (detect_respawn_ex(po)) { - /* respawning was triggered by the call to - psyco_prepare_respawn_ex() below */ - /* dictitem_check_change can use NEED_CC and - NEED_FREE_REG, further updating the state of po before - the actual jump to the respawn buffer. We emulate this - effect by calling dictitem_check_change() again here. */ - static PyDictObject* dummy_dict = NULL; - static PyDictEntry* dummy_entry = NULL; - if (dummy_entry == NULL) { - RECLIMIT_SAFE_ENTER(); - dummy_dict = (PyDictObject*) PyDict_New(); /* immortal */ - if (!dummy_dict || PyDict_SetItem( - (PyObject*) dummy_dict, Py_None, Py_None)) - OUT_OF_MEMORY(); - dummy_entry = (dummy_dict->ma_lookup)( - dummy_dict, Py_None, PyObject_Hash(Py_None)); - extra_assert(dummy_entry != NULL); - RECLIMIT_SAFE_LEAVE(); - } - dictitem_check_change(po, dummy_dict, dummy_entry); - /* end of respawning -- this dummy code will now be trashed */ - psyco_respawn_detected(po); - mark_varying(po, key); - return NULL; - } - if (po->pr.changing_globals != NULL && - PyDict_GetItem(po->pr.changing_globals, key) != NULL) - return NULL; /* we know the variable is changing */ - - /* the compiler only puts interned strings in op_names */ - extra_assert(PyString_CheckExact(key)); - /*extra_assert(((PyStringObject*) key)->ob_sinterned != NULL);*/ - extra_assert(((PyStringObject*) key)->ob_shash != -1); - - ep = (globals->ma_lookup)(globals, key, - ((PyStringObject*) key)->ob_shash); - if (ep->me_value != NULL) { - /* found in the globals() */ - changed_global_t* cg; - void* macrocode; - condition_code_t cc; - result = ep->me_value; - - macrocode = dictitem_check_change(po, globals, ep); - cc = DICT_ITEM_CHECK_CC; - cg = (changed_global_t*) psyco_prepare_respawn_ex(po, cc, - &do_changed_global, - sizeof(*cg)); - if (cg != NULL) { - cg->varname = key; Py_INCREF(key); - cg->previousvalue = result; Py_INCREF(result); - cg->originalmacrocode = macrocode; - cg->globals = globals; - } - } - else if (strcmp(PyString_AS_STRING(key), "__in_psyco__") == 0) { - /* special-case __in_psyco__ to always return 1, although - its value in the builtins is always 0. This variable - can be used by a function to know that it is compiled - by Psyco. */ - result = Py_True; - } - else { - /* no such global variable, get the builtins */ - if (po->pr.f_builtins == NULL) { - po->pr.f_builtins = psy_get_builtins((PyObject*)globals); - } - result = PyDict_GetItem(po->pr.f_builtins, key); - - if (result == NULL) { - /* name not found. Maybe it will exist at run-time - in the globals. Fall back to the safe - cimpl_load_global(). */ - return NULL; - } - } - Py_INCREF(result); - return result; -} - - -/***************************************************************/ - /*** Slicing ***/ - -static vinfo_t* _PsycoEval_SliceIndex(PsycoObject* po, vinfo_t* v) -{ - vinfo_t* result; - /* TypeSwitch */ - PyTypeObject* vtp = Psyco_NeedType(po, v); - if (vtp == NULL) - return NULL; - - if (PyType_TypeCheck(vtp, &PyInt_Type)) { - result = PsycoInt_AS_LONG(po, v); - vinfo_incref(result); - } - else if (PyType_TypeCheck(vtp, &PyLong_Type)) { - result = PsycoLong_AsLong(po, v); - if (result == NULL) { - vinfo_t* vi_zero; - PyObject* long_zero; - long x; - vinfo_t* v_err; - - /* catch PyExc_OverflowError */ - v_err = PycException_Matches(po, PyExc_OverflowError); - if (runtime_NON_NULL_t(po, v_err) != true) - return NULL; - - /* It's an overflow error, so we need to - check the sign of the long integer, - set the value to INT_MAX or 0, and clear - the error. */ - PycException_Clear(po); - - long_zero = PyLong_FromLong(0L); - if (long_zero == NULL) - OUT_OF_MEMORY(); - vi_zero = vinfo_new(CompileTime_NewSk(sk_new - ((long) long_zero, SkFlagPyObj))); - result = PsycoObject_RichCompareBool(po, v, vi_zero, - Py_GT); - vinfo_decref(vi_zero, po); - switch (runtime_NON_NULL_t(po, result)) { - case true: - x = INT_MAX; - break; - case false: - x = LARGE_NEG_LONG_AS_SLICE_INDEX; - break; - default: - return NULL; - } - result = vinfo_new(CompileTime_New(x)); - } - } -#if HAVE_NB_INDEX - else if (PsycoIndex_Check(vtp)) { - result = psyco_generic_call(po, PyNumber_AsSsize_t, - CfReturnNormal|CfPyErrCheckMinus1, - "vl", v, (long) NULL); - } -#endif - else { - /* no error set */ - result = NULL; - } - return result; -} - -static vinfo_t* psyco_apply_slice(PsycoObject* po, vinfo_t* u, - vinfo_t* v, vinfo_t* w) -{ /* u[v:w] */ - PyTypeObject *tp; - PySequenceMethods *sq; - - tp = Psyco_NeedType(po, u); - if (tp == NULL) - return NULL; - sq = tp->tp_as_sequence; - - if (sq && sq->sq_slice) { - vinfo_t* ilow; - vinfo_t* ihigh; - if (v == NULL) { - ilow = psyco_vi_Zero(); - } - else { - ilow = _PsycoEval_SliceIndex(po, v); - if (ilow == NULL) { - if (PycException_Occurred(po)) - return NULL; - goto with_slice_object; - } - } - if (w == NULL) - ihigh = vinfo_new(CompileTime_New(INT_MAX)); - else { - ihigh = _PsycoEval_SliceIndex(po, w); - if (ihigh == NULL) { - vinfo_decref(ilow, po); - if (PycException_Occurred(po)) - return NULL; - goto with_slice_object; - } - } - u = PsycoSequence_GetSlice(po, u, ilow, ihigh); - vinfo_decref(ihigh, po); - vinfo_decref(ilow, po); - return u; - } - - with_slice_object: - { - char modes[4]; - vinfo_t* vslice; - modes[0] = v == NULL ? 'l' : 'v'; - modes[1] = w == NULL ? 'l' : 'v'; - modes[2] = 'l'; - modes[3] = 0; - vslice = psyco_generic_call(po, PySlice_New, - CfReturnRef|CfPyErrIfNull, - modes, v, w, NULL); - if (vslice != NULL) { - Psyco_AssertType(po, vslice, &PySlice_Type); - u = PsycoObject_GetItem(po, u, vslice); - vinfo_decref(vslice, po); - return u; - } - else - return NULL; - } -} - -static bool psyco_assign_slice(PsycoObject* po, vinfo_t* u, - vinfo_t* v, vinfo_t* w, vinfo_t* x) -{ /* u[v:w] = x or del u[v:w] if x==NULL */ - PyTypeObject *tp; - PySequenceMethods *sq; - bool ok; - - tp = Psyco_NeedType(po, u); - if (tp == NULL) - return false; - sq = tp->tp_as_sequence; - - if (sq && sq->sq_slice) { - vinfo_t* ilow; - vinfo_t* ihigh; - if (v == NULL) { - ilow = psyco_vi_Zero(); - } - else { - ilow = _PsycoEval_SliceIndex(po, v); - if (ilow == NULL) { - if (PycException_Occurred(po)) - return false; - goto with_slice_object; - } - } - if (w == NULL) - ihigh = vinfo_new(CompileTime_New(INT_MAX)); - else { - ihigh = _PsycoEval_SliceIndex(po, w); - if (ihigh == NULL) { - vinfo_decref(ilow, po); - if (PycException_Occurred(po)) - return false; - goto with_slice_object; - } - } - ok = PsycoSequence_SetSlice(po, u, ilow, ihigh, x); - vinfo_decref(ihigh, po); - vinfo_decref(ilow, po); - return ok; - } - - with_slice_object: - { - char modes[4]; - vinfo_t* vslice; - modes[0] = v == NULL ? 'l' : 'v'; - modes[1] = w == NULL ? 'l' : 'v'; - modes[2] = 'l'; - modes[3] = 0; - vslice = psyco_generic_call(po, PySlice_New, - CfReturnRef|CfPyErrIfNull, - modes, v, w, NULL); - if (vslice != NULL) { - Psyco_AssertType(po, vslice, &PySlice_Type); - ok = PsycoObject_SetItem(po, u, vslice, x); - vinfo_decref(vslice, po); - return ok; - } - else - return false; - } -} - -#define CALL_FLAG_VAR 1 -#define CALL_FLAG_KW 2 -static vinfo_t* psyco_ext_do_calls(PsycoObject* po, int opcode, int oparg, - vinfo_t** stack_top, int* stack_to_pop) -{ - int na = oparg & 0xff; - int nk = (oparg>>8) & 0xff; - int flags = (opcode - CALL_FUNCTION) & 3; - int n = na + 2 * nk; - vinfo_t** args; - vinfo_t* vargs = NULL; - vinfo_t* wdict = NULL; - vinfo_t* result = NULL; - - if (flags & CALL_FLAG_VAR) - n++; - if (flags & CALL_FLAG_KW) - n++; - args = stack_top - n; - *stack_to_pop = n+1; - - /* reminder: the stack layout, top-to-bottom, is: - - - keyword dictionary (for '**kw' call syntax) - - arguments tuple (for '*args' call syntax) - - kw value (nk-1) - - kw key (nk-1) - ... - - kw value (0) - - kw key (0) - - argument value (na-1) - ... - - argument value (0) - - callable object - - We use 'n' as the current stack depth (not including - the callable object) while processing arguments. - */ - - /* keyword arguments */ - if (nk == 0 && !(flags & CALL_FLAG_KW)) - wdict = psyco_vi_Zero(); /* no keyword arguments */ - else { - int i; - if (flags & CALL_FLAG_KW) { /* '**kw' call syntax */ - vinfo_t* w = args[--n]; /* pop keyword dictionary */ - /* check that it is a dictionary */ - switch (Psyco_VerifyType(po, w, &PyDict_Type)) { - case true: /* fine */ - break; - case false: /* not a dict */ - /* don't bother displaying the function name - which might not be known yet */ - PycException_SetString(po, PyExc_TypeError, - "argument after ** " - "must be a dictionary"); - default: /* fall through */ - goto fail; - } - if (nk != 0) { - /* make a copy of the dictionary; - the original one must not be modified */ - wdict = PsycoDict_Copy(po, w); - } - else { - wdict = w; - vinfo_incref(wdict); - } - } - else - wdict = PsycoDict_New(po); - - if (wdict == NULL) - goto fail; - - /* update 'wdict' with the explicit keyword arguments */ - /* XXX do something closer to - update_keyword_args() in ceval.c, e.g. - check for duplicate keywords */ - for (i = na + 2*nk; i > na; ) { - i -= 2; - if (!psyco_generic_call(po, PyDict_SetItem, - CfNoReturnValue|CfPyErrIfNonNull, - "vvv", wdict, args[i], args[i+1])) - break; - } - } - - /* non-keyword arguments */ - vargs = PsycoTuple_New(na, args); /* virtual tuple */ - - if (flags & CALL_FLAG_VAR) { - vinfo_t* vtotal; - vinfo_t* v = args[--n]; /* pop argument tuple */ - PyTypeObject* vt = Psyco_NeedType(po, v); - if (vt == NULL) - goto fail; - if (!PyType_TypeCheck(vt, &PyTuple_Type)) { - /* 'v' is not a tuple */ - v = PsycoSequence_Tuple(po, v); - if (v == NULL) { - /* catch PyExc_TypeError */ - v = PycException_Matches(po, PyExc_TypeError); - if (runtime_NON_NULL_t(po, v) != true) - goto fail; - - PycException_SetString(po, PyExc_TypeError, - "argument after * " - "must be a sequence"); - goto fail; - } - } - else - vinfo_incref(v); - - vtotal = PsycoTuple_Concat(po, vargs, v); - vinfo_decref(v, po); - vinfo_decref(vargs, po); - vargs = vtotal; - if (vargs == NULL) - goto fail; - } - - result = PsycoObject_Call(po, args[-1], vargs, wdict); - /* fall through */ - fail: - vinfo_xdecref(vargs, po); - vinfo_xdecref(wdict, po); - return result; -} - - -/***************************************************************/ - /*** Run-time implementation of various opcodes ***/ - -/* the code of the following functions is "copy-pasted" from ceval.c */ - -static PyObject* cimpl_load_global(PyObject* globals, PyObject* w) -{ - PyObject* x; - RECLIMIT_SAFE_ENTER(); - x = PyDict_GetItem(globals, w); - if (x == NULL) { - x = PyDict_GetItem(psy_get_builtins(globals), w); - if (x == NULL) { - char* obj_str = PyString_AsString(w); - if (obj_str) - PyErr_Format(PyExc_NameError, - GLOBAL_NAME_ERROR_MSG, - obj_str); - RECLIMIT_SAFE_LEAVE(); - return NULL; - } - } - RECLIMIT_SAFE_LEAVE(); - Py_INCREF(x); - return x; -} - -static int cimpl_print_expr(PyObject* v) -{ - PyObject* x; - PyObject* w = PySys_GetObject("displayhook"); - if (w == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "lost sys.displayhook"); - return -1; - } - x = Py_BuildValue("(O)", v); - if (x == NULL) - return -1; - w = PyEval_CallObject(w, x); - Py_XDECREF(w); - Py_DECREF(x); - if (w == NULL) - return -1; - return 0; -} - -static int cimpl_print_item_to(PyObject* v, PyObject* stream) -{ - /* XXX update to Python 2.3's implementation */ - if (stream == NULL || stream == Py_None) { - stream = PySys_GetObject("stdout"); - if (stream == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "lost sys.stdout"); - return -1; - } - } - if (PyFile_SoftSpace(stream, 1)) - if (PyFile_WriteString(" ", stream)) - return -1; - if (PyFile_WriteObject(v, stream, Py_PRINT_RAW)) - return -1; - if (PyString_Check(v)) { - /* move into writeobject() ? */ - char *s = PyString_AsString(v); - int len = PyString_Size(v); - if (len > 0 && - isspace(Py_CHARMASK(s[len-1])) && - s[len-1] != ' ') - PyFile_SoftSpace(stream, 0); - } - return 0; -} - -static int cimpl_print_newline_to(PyObject* stream) -{ - if (stream == NULL || stream == Py_None) { - stream = PySys_GetObject("stdout"); - if (stream == NULL) { - PyErr_SetString(PyExc_RuntimeError, - "lost sys.stdout"); - return -1; - } - } - if (PyFile_WriteString("\n", stream)) - return -1; - PyFile_SoftSpace(stream, 0); - return 0; -} - -static int cimpl_unpack_iterable(PyObject* v, int argcnt, PyObject** sp) -{ - int i = 0; - PyObject *it; /* iter(v) */ - PyObject *w; - - extra_assert(v != NULL); - - it = PyObject_GetIter(v); - if (it == NULL) - goto Error; - - for (; i < argcnt; i++) { - w = PyIter_Next(it); - if (w == NULL) { - /* Iterator done, via error or exhaustion. */ - if (!PyErr_Occurred()) { - PyErr_Format(PyExc_ValueError, - "need more than %d value%s to unpack", - i, i == 1 ? "" : "s"); - } - goto Error; - } - *sp++ = w; - } - - /* We better have exhausted the iterator now. */ - w = PyIter_Next(it); - if (w == NULL) { - if (PyErr_Occurred()) - goto Error; - Py_DECREF(it); - return 0; - } - PyErr_SetString(PyExc_ValueError, "too many values to unpack"); - Py_DECREF(w); - /* fall through */ -Error: - for (; i > 0; i--) { - --sp; - Py_DECREF(*sp); - } - Py_XDECREF(it); - return -1; -} - -static int cimpl_unpack_list(PyObject* listobject, int argcnt, PyObject** sp) -{ - int i; - extra_assert(PyList_Check(listobject)); - - if (PyList_GET_SIZE(listobject) != argcnt) { - PyErr_SetString(PyExc_ValueError, "unpack list of wrong size"); - return -1; - } - for (i=argcnt; i--; ) { - PyObject* v = sp[i] = PyList_GET_ITEM(listobject, i); - Py_INCREF(v); - } - return 0; -} - -/* Logic for the raise statement. - XXX a meta-implementation would be nice (e.g. to know at compile-time - which exception class we got, so that we can know at compile-time which - except: statements match) */ -static void cimpl_do_raise(PyObject *type, PyObject *value, PyObject *tb) -{ - if (type == NULL) { - /* Reraise */ - PyThreadState *tstate = PyThreadState_Get(); - type = tstate->exc_type == NULL ? Py_None : tstate->exc_type; - value = tstate->exc_value; - tb = tstate->exc_traceback; - } - - /* unlike the ceval.c version, this never consumes a reference - to its arguments (psyco_generic_call cannot handle this). */ - Py_XINCREF(type); - Py_XINCREF(value); - Py_XINCREF(tb); - - /* We support the following forms of raise: - raise , - raise , - raise , None - raise , - raise , None - raise , - raise , None - - An omitted second argument is the same as None. - - In addition, raise , is the same as - raising the tuple's first item (and it better have one!); - this rule is applied recursively. - - Finally, an optional third argument can be supplied, which - gives the traceback to be substituted (useful when - re-raising an exception after examining it). */ - - /* First, check the traceback argument, replacing None with - NULL. */ - if (tb == Py_None) { - Py_DECREF(tb); - tb = NULL; - } - else if (tb != NULL && !PyTraceBack_Check(tb)) { - PyErr_SetString(PyExc_TypeError, - "raise: arg 3 must be a traceback or None"); - goto raise_error; - } - - /* Next, replace a missing value with None */ - if (value == NULL) { - value = Py_None; - Py_INCREF(value); - } - - /* Next, repeatedly, replace a tuple exception with its first item */ - while (PyTuple_Check(type) && PyTuple_Size(type) > 0) { - PyObject *tmp = type; - type = PyTuple_GET_ITEM(type, 0); - Py_INCREF(type); - Py_DECREF(tmp); - } - - if (PyString_CheckExact(type)) - /* warning skipped */; - - else if (PyExceptionClass_Check(type)) - PyErr_NormalizeException(&type, &value, &tb); - - else if (PyExceptionInstance_Check(type)) { - /* Raising an instance. The value should be a dummy. */ - if (value != Py_None) { - PyErr_SetString(PyExc_TypeError, - "instance exception may not have a separate value"); - goto raise_error; - } - else { - /* Normalize to raise , */ - Py_DECREF(value); - value = type; - type = PyExceptionInstance_Class(type); - Py_INCREF(type); - } - } - else { - /* Not something you can raise. You get an exception - anyway, just not what you specified :-) */ - PyErr_Format(PyExc_TypeError, - "exceptions must be classes, instances, or " - "strings (deprecated), not %s", - type->ob_type->tp_name); - goto raise_error; - } - PyErr_Restore(type, value, tb); - /*if (tb == NULL) - return WHY_EXCEPTION; - else - return WHY_RERAISE;*/ - return; - - raise_error: - Py_XDECREF(value); - Py_XDECREF(type); - Py_XDECREF(tb); - /*return WHY_EXCEPTION;*/ -} - -/* copied from ceval.c where it is private */ -static PyObject* -cimpl_build_class(PyObject* g, /* globals */ - PyObject *methods, PyObject *bases, PyObject *name) -{ - PyObject *metaclass = NULL, *result, *base; - - if (PyDict_Check(methods)) - metaclass = PyDict_GetItemString(methods, "__metaclass__"); - if (metaclass != NULL) - Py_INCREF(metaclass); - else if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) { - base = PyTuple_GET_ITEM(bases, 0); - metaclass = PyObject_GetAttrString(base, "__class__"); - if (metaclass == NULL) { - PyErr_Clear(); - metaclass = (PyObject *)base->ob_type; - Py_INCREF(metaclass); - } - } - else { - /*if (g != NULL && PyDict_Check(g))*/ - metaclass = PyDict_GetItemString(g, "__metaclass__"); - if (metaclass == NULL) - metaclass = (PyObject *) &PyClass_Type; - Py_INCREF(metaclass); - } - result = PyObject_CallFunction(metaclass, "OOO", - name, bases, methods); - Py_DECREF(metaclass); - return result; -} - -static PyObject* cimpl_import_name(PyObject* globals, PyObject* name, - PyObject* fromlist -#if VERYCONVOLUTED_IMPORT_NAME - , PyObject* fitharg -#endif - ) -{ - PyObject* w; - PyObject* x = PyDict_GetItemString(psy_get_builtins(globals), - "__import__"); - if (x == NULL) { - PyErr_SetString(PyExc_ImportError, - "__import__ not found"); - return NULL; - } -#if VERYCONVOLUTED_IMPORT_NAME - if (PyInt_AsLong(fitharg) != -1 || PyErr_Occurred()) - w = PyTuple_Pack(5, - name, - globals, - Py_None, - fromlist, - fitharg); - else -#endif - w = Py_BuildValue("(OOOO)", - name, - globals, - Py_None, - fromlist); - if (w == NULL) - return NULL; - x = PyEval_CallObject(x, w); - Py_DECREF(w); - return x; -} - -static int cimpl_import_all_from(PyObject *locals, PyObject *v) -{ - PyObject *all = PyObject_GetAttrString(v, "__all__"); - PyObject *dict, *name, *value; - int skip_leading_underscores = 0; - int pos, err; - - if (all == NULL) { - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) - return -1; /* Unexpected error */ - PyErr_Clear(); - dict = PyObject_GetAttrString(v, "__dict__"); - if (dict == NULL) { - if (!PyErr_ExceptionMatches(PyExc_AttributeError)) - return -1; - PyErr_SetString(PyExc_ImportError, - "from-import-* object has no __dict__ and no __all__"); - return -1; - } - all = PyMapping_Keys(dict); - Py_DECREF(dict); - if (all == NULL) - return -1; - skip_leading_underscores = 1; - } - - for (pos = 0, err = 0; ; pos++) { - name = PySequence_GetItem(all, pos); - if (name == NULL) { - if (!PyErr_ExceptionMatches(PyExc_IndexError)) - err = -1; - else - PyErr_Clear(); - break; - } - if (skip_leading_underscores && - PyString_Check(name) && - PyString_AS_STRING(name)[0] == '_') - { - Py_DECREF(name); - continue; - } - value = PyObject_GetAttr(v, name); - if (value == NULL) - err = -1; - else - err = PyDict_SetItem(locals, name, value); - Py_DECREF(name); - Py_XDECREF(value); - if (err != 0) - break; - } - Py_DECREF(all); - return err; -} - - - /***************************************************************/ -/*** Main loop ***/ - /***************************************************************/ - -static bool compute_and_raise_exception(PsycoObject* po) -{ - /* &ERtPython is the case where the code that raised - the Python exception is already written, e.g. when - we called a function in the Python interpreter which - raised an exception. */ - if (!PycException_Is(po, &ERtPython)) { - /* In the other cases (virtual exception), - compute and raise the exception now. */ - char args[4]; - args[3] = 0; - if (po->pr.tb == NULL) - args[2] = 'l'; - else { - args[2] = 'v'; - consume_reference(po, po->pr.tb); - } - if (po->pr.val == NULL) - args[1] = 'l'; - else { - args[1] = 'v'; - consume_reference(po, po->pr.val); - } - args[0] = 'v'; - consume_reference(po, po->pr.exc); - return (psyco_generic_call(po, PyErr_Restore, - CfNoReturnValue, args, - po->pr.exc, po->pr.val, - po->pr.tb) != NULL); - } - else - return true; -} - -static code_t* exit_function(PsycoObject* po) -{ - vinfo_t** locals_plus; - vinfo_t** pp; - Source retsource; - extra_assert(!po->pr.is_inlining); - - /* clear the stack and the locals */ - locals_plus = LOC_LOCALS_PLUS; - for (pp = po->vlocals.items + po->vlocals.count; --pp >= locals_plus; ) - if (*pp != NULL) { - vinfo_decref(*pp, po); - *pp = NULL; - } - - if (PycException_Is(po, &EReturn)) { - /* load the return value */ - vinfo_t* retval = po->pr.val; - extra_assert(retval != NULL); - if (!compute_vinfo(retval, po)) return NULL; - /* return a new reference */ - consume_reference(po, retval); - if (retval->array->count > 0) { - array_delete(retval->array, po); - retval->array = NullArray; - } - retsource = retval->source; - } - else { - if (!compute_and_raise_exception(po)) - return NULL; - clear_pseudo_exception(po); - sk_incref(&psyco_skZero); - retsource = CompileTime_NewSk(&psyco_skZero); /*to return NULL */ - } - - return psyco_finish_return(po, retsource); -} - - -/***************************************************************/ - /*** the main loop of the interpreter/compiler. ***/ - -/* psyco_pycompiler_mainloop() compiles the function using psyco_core_mainloop() - writing function entry and exit points if needed, and destroys 'po' when - it is done */ -DEFINEFN -code_t* psyco_pycompiler_mainloop(PsycoObject* po) -{ - /* 'stack_a' is the Python stack base pointer */ - vinfo_t** stack_a = po->vlocals.items + po->pr.stack_base; - int opcode=0; /* Current opcode */ - int oparg=0; /* Current opcode argument, if any */ - code_t* code1; - - /* save and restore the current Python exception throughout compilation */ - PyObject *old_py_exc, *old_py_val, *old_py_tb; - PyErr_Fetch(&old_py_exc, &old_py_val, &old_py_tb); - - if ((psyco_mp_flags(po->pr.merge_points) & MP_FLAGS_HAS_EXCEPT) != 0 && - (LOC_CONTINUATION->array == NullArray)) { - /* for functions that have "try: except:" blocks, we reserve some room - in the stack to store the previous tstate->exc_xxx if an exception - is raised and catched. This space plays the role of Python's - PyFrameObject::f_exc_xxx fields. */ - psyco_emit_header(po, 3); - } - - while (po->pr.next_instr != -1) - { - /* 'co' is the code object we are interpreting/compiling */ - PyCodeObject* co = po->pr.co; - unsigned char* bytecode = (unsigned char*) PyString_AS_STRING(co->co_code); - vinfo_t *u, *v, /* temporary objects */ - *w, *x; /* popped off the stack */ - condition_code_t cc; - /* 'next_instr' is the position in the byte-code of the next instr */ - int next_instr = po->pr.next_instr; - mergepoint_t* mp = psyco_next_merge_point(po->pr.merge_points, - next_instr+1); - - /* trace each code block entry point */ - TRACE_EXECUTION_NOERR("ENTER_MAINLOOP"); - - /* main loop */ - while (1) { - - extra_assert(!PycException_Occurred(po)); - psyco_assert_coherent(po); /* this test is expensive */ - - /* are we potentially running out of stack space? */ - CHECK_STACK_SPACE(); - - /* save 'next_instr' and 'respawn_cnt' */ - SAVE_NEXT_INSTR(next_instr); /* could be optimized, not needed in the - case of an opcode that cannot set - run-time conditions */ - - opcode = NEXTOP(); - if (HAS_ARG(opcode)) - oparg = NEXTARG(); - dispatch_opcode: - - /* Main switch on opcode */ - - /* !!IMPORTANT!! - No operation with side-effects must be performed before we are - sure the compilation of the current instruction succeeded! - Indeed, if the compilation is interrupted by a C++ exception, - it will be restarted by re-running psyco_pycompiler_mainloop() - and this will restart the compilation of the instruction from - the beginning. In particular, use POP() with care. Better use - TOP() to get the arguments off the stack and call POP() at the - end when you are sure everything when fine. */ - - /* All opcodes found here must also be listed in mergepoints.c. - Python code objects using a bytecode instruction not listed - in mergepoints.c are never Psyco-ified. */ - - switch (opcode) { - - /* case STOP_CODE: this is an error! */ - - case POP_TOP: - POP_DECREF(); - goto fine; - - case ROT_TWO: - POP(v); - POP(w); - PUSH(v); - PUSH(w); - goto fine; - - case ROT_THREE: - POP(v); - POP(w); - POP(x); - PUSH(v); - PUSH(x); - PUSH(w); - goto fine; - - case ROT_FOUR: - POP(u); - POP(v); - POP(w); - POP(x); - PUSH(u); - PUSH(x); - PUSH(w); - PUSH(v); - goto fine; - - case DUP_TOP: - v = TOP(); - vinfo_incref(v); - PUSH(v); - goto fine; - - case DUP_TOPX: - { - int i; - for (i=0; i b->b_level) { - POP(v); - vinfo_decref(v, po); - } - goto fine; - } - - case END_FINALLY: - /* First make extra sure no exception is pending */ - if (PycException_Occurred(po)) - Py_FatalError("psyco: undetected exception " - "in END_FINALLY"); - POP(v); - if (psyco_knowntobe(v, (long) Py_None)) { - /* 'None' on the stack, it is the end of a finally - block with no exception raised */ - vinfo_decref(v, po); - goto fine; - } - if (Psyco_KnownType(v) == &PyTuple_Type && - PsycoTuple_Load(v) == 3) { - /* 'v' is a 3- tuple. As no real Python exception is - a tuple object we are sure it comes from a - finally block (see the SETUP_FINALLY stack unwind - code at the end of pycompiler.c) */ - /* Re-raise the pseudo exception. This will re-raise - exceptions like EReturn as well. */ - po->pr.exc = PsycoTuple_GET_ITEM(v, 0); - PsycoTuple_GET_ITEM(v, 0) = NULL; - po->pr.val = PsycoTuple_GET_ITEM(v, 1); - PsycoTuple_GET_ITEM(v, 1) = NULL; - po->pr.tb = PsycoTuple_GET_ITEM(v, 2); - PsycoTuple_GET_ITEM(v, 2) = NULL; - vinfo_decref(v, po); - break; - } - else { - /* end of an EXCEPT block, re-raise the exception - stored in the stack. As in Python, no extra - traceback is recorded, but instead of the - WHY_RERAISE trick we simply record no traceback - if the opcode is END_FINALLY. */ - po->pr.exc = v; - POP(po->pr.val); - POP(po->pr.tb); - break; - } - - case BUILD_CLASS: - x = psyco_generic_call(po, cimpl_build_class, - CfReturnRef|CfPyErrIfNull, - "vvvv", LOC_GLOBALS, - NTOP(1), NTOP(2), NTOP(3)); - if (x == NULL) - break; - POP_DECREF(); - POP_DECREF(); - POP_DECREF(); - PUSH(x); - goto fine; - - case UNPACK_SEQUENCE: - { - int i; - void* cimpl_unpack; - PyTypeObject* vtp; - - v = TOP(); - vtp = Psyco_NeedType(po, v); - if (vtp == NULL) - break; - - if (PyType_TypeCheck(vtp, &PyTuple_Type)) { - /* shortcut: is this a virtual tuple? - of the correct length? */ - if (PsycoTuple_Load(v) != oparg) { - - /* No, fall back to the default path: - load the size, compare it with oparg, - and if they match proceed by loading the - tuple item by item into the stack. */ - vinfo_t* vsize; - vsize = psyco_get_const(po, v, FIX_size); - if (vsize == NULL) - break; - - /* check the size */ - cc = integer_cmp_i(po, vsize, oparg, Py_NE); - if (cc == CC_ERROR) - break; - if (runtime_condition_f(po, cc)) { - PycException_SetString(po, - PyExc_ValueError, - "unpack tuple of wrong size"); - break; - } - - /* make sure the tuple data is loaded */ - for (i=oparg; i--; ) { - w = psyco_get_nth_const(po, v, - TUPLE_ob_item, - i); - if (w == NULL) - break; - } - if (i >= 0) - break; - } - /* copy the tuple items into the stack */ - POP(v); - for (i=oparg; i--; ) { - w = PsycoTuple_GET_ITEM(v, i); - vinfo_incref(w); - PUSH(w); - /* in case the tuple is freed while its items - are still in use: */ - need_reference(po, w); - } - vinfo_decref(v, po); - goto fine; - - } - - if (PyType_TypeCheck(vtp, &PyList_Type)) - cimpl_unpack = cimpl_unpack_list; - else - cimpl_unpack = cimpl_unpack_iterable; - - { - vinfo_array_t* array = array_new(oparg); - if (!psyco_generic_call(po, cimpl_unpack, - CfNoReturnValue|CfPyErrIfNonNull, - "vlA", v, oparg, array)) { - array_release(array); - break; - } - POP_DECREF(); - for (i=oparg; i--; ) - PUSH(array->items[i]); - array_release(array); - goto fine; - } - } - - case STORE_ATTR: - { - bool ok; - w = vinfo_new(CompileTime_New(((long) GETNAMEV(oparg)))); - ok = PsycoObject_SetAttr(po, TOP(), w, NTOP(2)); /* v.w = u */ - vinfo_decref(w, po); - if (!ok) - break; - POP_DECREF(); - POP_DECREF(); - goto fine; - } - - case DELETE_ATTR: - { - bool ok; - w = vinfo_new(CompileTime_New(((long) GETNAMEV(oparg)))); - ok = PsycoObject_SetAttr(po, TOP(), w, NULL); /* del v.w */ - vinfo_decref(w, po); - if (!ok) - break; - POP_DECREF(); - goto fine; - } - - case STORE_NAME: - /* only for modules: we can only reach this point - for code objects compiled from frames where - f_locals == f_globals */ - /* fall through */ - case STORE_GLOBAL: - { - PyObject* w = GETNAMEV(oparg); - mark_varying(po, w); - if (!psyco_generic_call(po, PyDict_SetItem, - CfNoReturnValue|CfPyErrIfNonNull, - "vlv", LOC_GLOBALS, w, TOP())) - break; - POP_DECREF(); - goto fine; - } - - case DELETE_NAME: - /* only for modules: we can only reach this point - for code objects compiled from frames where - f_locals == f_globals */ - /* fall through */ - case DELETE_GLOBAL: - { - PyObject* w = GETNAMEV(oparg); - mark_varying(po, w); - if (runtime_NON_NULL_f(po, psyco_generic_call(po, PyDict_DelItem, - CfReturnNormal, "vl", LOC_GLOBALS, w))) { - PycException_SetFormat(po, PyExc_NameError, - GLOBAL_NAME_ERROR_MSG, - PyString_AsString(w)); - break; - } - goto fine; - } - - case LOAD_CONST: - /* reference borrowed from the code object */ - v = vinfo_new(CompileTime_New((long) GETCONST(oparg))); - PUSH(v); - goto fine; - - case LOAD_NAME: - /* only for modules: we can only reach this point - for code objects compiled from frames where - f_locals == f_globals */ - /* fall through */ - case LOAD_GLOBAL: - { - PyObject* namev = GETNAMEV(oparg); - PyObject* value; - if (is_compiletime(LOC_GLOBALS->source)) { - /* Common case: fast global loading */ - value = load_global(po, namev, next_instr); - if (value != NULL) { - /* success */ - v = vinfo_new(CompileTime_NewSk( - sk_new((long) value, SkFlagPyObj))); - PUSH(v); - goto fine; - } - /* else { variable not found at all, - or the global has been marked as varying } */ - } - /* else { Globals dict is unknown at compile-time } */ - v = psyco_generic_call(po, cimpl_load_global, - CfReturnRef|CfPyErrIfNull, - "vl", LOC_GLOBALS, namev); - if (v == NULL) - break; - PUSH(v); - goto fine; - } - - case LOAD_FAST: - x = GETLOCAL(oparg); - /* a local variable can only be unbound if its - value is known to be (PyObject*)NULL. A run-time - or virtual value is always non-NULL. */ - if (psyco_knowntobe(x, 0)) { - PyObject* namev; - namev = PyTuple_GetItem(co->co_varnames, oparg); - PycException_SetFormat(po, PyExc_UnboundLocalError, - UNBOUNDLOCAL_ERROR_MSG, - PyString_AsString(namev)); - break; - } - vinfo_incref(x); - PUSH(x); - goto fine; - - case STORE_FAST: - POP(v); - SETLOCAL(oparg, v); - goto fine; - - case DELETE_FAST: - x = GETLOCAL(oparg); - /* a local variable can only be unbound if its - value is known to be (PyObject*)NULL. A run-time - or virtual value is always non-NULL. */ - if (psyco_knowntobe(x, 0)) { - PyObject* namev; - namev = PyTuple_GetItem(co->co_varnames, oparg); - PycException_SetFormat(po, PyExc_UnboundLocalError, - UNBOUNDLOCAL_ERROR_MSG, - PyString_AsString(namev)); - break; - } - - u = psyco_vi_Zero(); - SETLOCAL(oparg, u); - goto fine; - - /*MISSING_OPCODE(LOAD_CLOSURE); - MISSING_OPCODE(LOAD_DEREF); - MISSING_OPCODE(STORE_DEREF);*/ - - case BUILD_TUPLE: - v = PsycoTuple_New(oparg, STACK_POINTER() - oparg); - while (oparg--) - POP_DECREF(); - PUSH(v); - goto fine; - - case BUILD_LIST: - v = PsycoList_New(po, oparg, STACK_POINTER() - oparg); - if (v == NULL) - break; - while (oparg--) - POP_DECREF(); - PUSH(v); - goto fine; - - case BUILD_MAP: - v = PsycoDict_New(po); - if (v == NULL) - break; - PUSH(v); - goto fine; - - case LOAD_ATTR: - w = vinfo_new(CompileTime_New(((long) GETNAMEV(oparg)))); - x = PsycoObject_GetAttr(po, TOP(), w); /* v.w */ - vinfo_decref(w, po); - if (x == NULL) - break; - POP_DECREF(); - PUSH(x); - goto fine; - - case COMPARE_OP: - { - condition_code_t cc = CC_ERROR; - w = TOP(); - v = NTOP(2); - switch (oparg) { - - case PyCmp_IS: /* pointer comparison */ - cc = integer_cmp(po, v, w, Py_EQ); - break; - - case PyCmp_IS_NOT: /* pointer comparison */ - cc = integer_cmp(po, v, w, Py_NE); - break; - - case PyCmp_IN: - case PyCmp_NOT_IN: - x = PsycoSequence_Contains(po, w, v); - cc = integer_NON_NULL(po, x); - if (oparg == PyCmp_NOT_IN && cc != CC_ERROR) - cc = INVERT_CC(cc); - break; - - case PyCmp_EXC_MATCH: - x = psyco_generic_call(po, PyErr_GivenExceptionMatches, - CfPure|CfReturnNormal, - "vv", v, w); - cc = integer_NON_NULL(po, x); - break; - - default: - x = PsycoObject_RichCompare(po, v, w, oparg); - goto compare_done; - } - - if (cc == CC_ERROR) - break; - - /* turns 'cc' into a virtual Python boolean object */ - x = PsycoBool_FromCondition(po, cc); - - compare_done: - if (x == NULL) - break; - POP_DECREF(); - POP_DECREF(); - PUSH(x); /* consumes ref on x */ - goto fine; - } - - case IMPORT_NAME: - { - PyObject* w = GETNAMEV(oparg); -#if !VERYCONVOLUTED_IMPORT_NAME /* Python < 2.5 */ - x = psyco_generic_call(po, cimpl_import_name, - CfReturnRef|CfPyErrIfNull, - "vlv", LOC_GLOBALS, w, TOP()); - if (x == NULL) - break; - POP_DECREF(); -#else - v = TOP(); - u = NTOP(2); - x = psyco_generic_call(po, cimpl_import_name, - CfReturnRef|CfPyErrIfNull, - "vlvv", LOC_GLOBALS, w, v, u); - if (x == NULL) - break; - POP_DECREF(); - POP_DECREF(); -#endif - PUSH(x); - goto fine; - } - - case IMPORT_STAR: - { - /* only for modules: we can only reach this point - for code objects compiled from frames where - f_locals == f_globals */ - x = psyco_generic_call(po, cimpl_import_all_from, - CfReturnNormal|CfPyErrIfNonNull, - "vv", LOC_GLOBALS, TOP()); - if (x == NULL) - break; - vinfo_decref(x, po); - POP_DECREF(); - goto fine; - } - - case IMPORT_FROM: - { - PyObject* name = GETNAMEV(oparg); - w = vinfo_new(CompileTime_New(((long) name))); - v = TOP(); - x = PsycoObject_GetAttr(po, v, w); - vinfo_decref(w, po); - if (x == NULL) { - extra_assert(PycException_Occurred(po)); - - /* catch PyExc_AttributeError */ - v = PycException_Matches(po, PyExc_AttributeError); - if (runtime_NON_NULL_t(po, v) == true) { - PycException_SetFormat(po, PyExc_ImportError, - "cannot import name %.230s", - PyString_AsString(name)); - } - break; - } - PUSH(x); - goto fine; - } - - case JUMP_FORWARD: - JUMPBY(oparg); - mp = psyco_next_merge_point(po->pr.merge_points, next_instr); - goto fine; - - case JUMP_IF_TRUE: - case JUMP_IF_FALSE: - /* This code is very different from the original - interpreter's, because we generally do not know the - outcome of PyObject_IsTrue(). In the case of JUMP_IF_xxx - we must be prepared to have to compile the two possible - paths. */ - cc = integer_NON_NULL(po, PsycoObject_IsTrue(po, TOP())); - if (cc == CC_ERROR) - break; - if (opcode == JUMP_IF_FALSE) - cc = INVERT_CC(cc); - if ((int)cc < CC_TOTAL) { - /* compile the beginning of the "if true" path */ - int current_instr = next_instr; - JUMPBY(oparg); - SAVE_NEXT_INSTR(next_instr); - psyco_compile_cond(po, - psyco_exact_merge_point(po->pr.merge_points, - next_instr), - cc); - next_instr = current_instr; - } - else if (cc == CC_ALWAYS_TRUE) { - JUMPBY(oparg); /* always jump */ - mp = psyco_next_merge_point(po->pr.merge_points, - next_instr); - } - else - ; /* never jump */ - goto fine; - - case JUMP_ABSOLUTE: - JUMPTO(oparg); - mp = psyco_next_merge_point(po->pr.merge_points, next_instr); - goto fine; - - case GET_ITER: - x = PsycoObject_GetIter(po, TOP()); - if (x == NULL) - break; - POP_DECREF(); - PUSH(x); - goto fine; - - case FOR_ITER: - v = PsycoIter_Next(po, TOP()); - if (v != NULL) { - /* iterator not exhausted */ - PUSH(v); - } - else { - extra_assert(PycException_Occurred(po)); - - /* catch PyExc_StopIteration */ - v = PycException_Matches(po, PyExc_StopIteration); - if (runtime_NON_NULL_t(po, v) == true) { - /* iterator ended normally */ - PycException_Clear(po); - POP_DECREF(); - JUMPBY(oparg); - mp = psyco_next_merge_point(po->pr.merge_points, - next_instr); - } - else - break; /* any other exception, or error in - runtime_NON_NULL_t() */ - } - goto fine; - - case SETUP_LOOP: - case SETUP_EXCEPT: - case SETUP_FINALLY: - block_setup(po, opcode, INSTR_OFFSET() + oparg, - STACK_LEVEL()); - goto fine; - -#ifdef SET_LINENO - case SET_LINENO: - /* trace machine code execution at each SET_LINENO opcode - XXX re-implement this feature for Python 2.3, which - no longer uses the SET_LINENO opcode */ - TRACE_EXECUTION_NOERR("SET_LINENO"); - goto fine; -#endif - - case CALL_FUNCTION: - case CALL_FUNCTION_VAR: - case CALL_FUNCTION_KW: - case CALL_FUNCTION_VAR_KW: - { - int i, stack_to_pop; - x = psyco_ext_do_calls(po, opcode, oparg, STACK_POINTER(), - &stack_to_pop); - if (x == NULL) - break; - - /* clean up the stack (remove args and func) */ - for (i=stack_to_pop; i--; ) - POP_DECREF(); - PUSH(x); - goto fine; - } - - /*MISSING_OPCODE(MAKE_CLOSURE);*/ - - case MAKE_FUNCTION: - if (oparg > 0) - v = PsycoTuple_New(oparg, STACK_POINTER() - oparg - 1); - else - v = NULL; - x = PsycoFunction_New(po, TOP(), LOC_GLOBALS, v); - vinfo_xdecref(v, po); - if (x == NULL) - break; - - /* clean up the stack (remove args and func) */ - while (oparg-- >= 0) - POP_DECREF(); - PUSH(x); - goto fine; - - case BUILD_SLICE: - if (oparg == 3) { - w = NTOP(1); - v = NTOP(2); - u = NTOP(3); - } - else { - w = psyco_vi_Zero(); - v = NTOP(1); - u = NTOP(2); - } - x = psyco_generic_call(po, PySlice_New, - CfReturnRef|CfPyErrIfNull, - "vvv", u, v, w); - if (oparg != 3) - vinfo_decref(w, po); - if (x == NULL) - break; - Psyco_AssertType(po, x, &PySlice_Type); - if (oparg == 3) - POP_DECREF(); /* w */ - POP_DECREF(); /* v */ - POP_DECREF(); /* u */ - PUSH(x); - goto fine; - - case EXTENDED_ARG: - opcode = NEXTOP(); - oparg = oparg<<16 | NEXTARG(); - goto dispatch_opcode; - - default: - fprintf(stderr, - "XXX opcode: %d\n", - opcode); - Py_FatalError("unknown opcode"); - - } /* switch (opcode) */ - - /* Exit if an error occurred */ - if (PycException_Occurred(po)) - break; - - fine: - extra_assert(!PycException_Occurred(po)); - extra_assert(mp == psyco_next_merge_point(po->pr.merge_points, - next_instr)); - - /* are we running out of space in the current code buffer? */ - if ((po->codelimit - po->code) < BUFFER_MARGIN) { - if (is_respawning(po)) { - /* when respawning, just forget everything we - wrote so far and come back to the beginning - again */ - PsycoObject_EmergencyCodeRoom(po); - } - else { - /* normal case: save the current position, and - stop compilation. When this point is reached - at run-time, compilation will go on in a - new buffer. */ - SAVE_NEXT_INSTR(next_instr); - if (mp->bytecode_position != next_instr) - mp = NULL; - code1 = psyco_compile(po, mp, false); - goto finished; - } - } - - /* mark merge points via a call to psyco_compile() */ - if (mp->bytecode_position == next_instr) { - extra_assert(!is_respawning(po)); - SAVE_NEXT_INSTR(next_instr); - /* simplify the po->vlocals array */ - if (!psyco_limit_nested_weight(po, &po->vlocals, NWI_NORMAL, - NESTED_WEIGHT_END)) - break; - psyco_delete_unused_vars(po, &mp->entries); - code1 = psyco_compile(po, mp, true); - if (code1 != NULL) - goto finished; - mp++; - /* trace execution at each of the s the execution - goes through */ - TRACE_EXECUTION_NOERR("SNAPSHOT"); - } - } /* end of the main loop, exit if pseudo-exception */ - - psyco_assert_coherent(po); - - /* check for the 'promotion' pseudo-exception. - This is the only case in which the instruction - causing the exception is restarted. */ - if (is_virtualtime(po->pr.exc->source) && - psyco_vsource_is_promotion(po->pr.exc->source)) - { - c_promotion_t* promotion = (c_promotion_t*) - VirtualTime_Get(po->pr.exc->source); - vinfo_t* promote_me = po->pr.val; - /* NOTE: we assume that 'promote_me' is a member of the - 'po->vlocals' arrays, so that we can safely DECREF it - now without actually releasing it. If this assumption - is false, the psyco_finish_xxx() calls below will give - unexpected results. */ - assert_array_contains_nonct(&po->vlocals, promote_me); - clear_pseudo_exception(po); -#if USE_RUNTIME_SWITCHES - if (promotion->fs == NULL) -#endif - code1 = psyco_finish_promotion(po, promote_me, - promotion->pflags); -#if USE_RUNTIME_SWITCHES - else - code1 = psyco_finish_fixed_switch(po, promote_me, - promotion->kflags, - promotion->fs); -#endif - goto finished; - } - - /* check for the 'inline' pseudo-exception. */ - if (PycException_Is(po, &EInline)) - { - vinfo_t* v; - - /* po->pr.val->array contains the new sub-frame that we - should now start to compile, inlined into the parent frame */ - extra_assert(!po->pr.is_inlining); - /* store po->vlocals away */ - v = psyco_save_inline_po(po); - /* copy po->pr.val->array to po->vlocals */ - po = psyco_restore_inline_po(po, &po->pr.val->array); - stack_a = po->vlocals.items + po->pr.stack_base; - /* save the copy of the previous po->vlocals to LOC_INLINING */ - extra_assert(LOC_INLINING == NULL); - LOC_INLINING = v; - po->pr.is_inlining = true; - /* mark this point as an inline frame entry */ - psyco_inline_enter(po); - /* go on with compilation */ - clear_pseudo_exception(po); - continue; - } - - /* At this point, we got a real pseudo-exception. */ - - if (PycException_IsPython(po) && opcode != END_FINALLY) - { - /* log traceback info for real Python exceptions, - unless re-raised by END_FINALLY */ - PsycoTraceBack_Here(po, po->pr.next_instr); - } - - /* All exceptions raised inside an inlined frame are passed to the - parent (neither exception handlers nor loops are allowed in - inlinable code objects). */ - if (po->pr.is_inlining) - { - /* unwind the inlined frame by restoring the parent one */ - vinfo_t* v = LOC_INLINING; - LOC_INLINING = NULL; - po = psyco_restore_inline_po(po, &v->array); - stack_a = po->vlocals.items + po->pr.stack_base; - vinfo_decref(v, po); - po->pr.is_inlining = false; - /* mark this point as an inline frame exit */ - psyco_inline_exit(po); - - if (PycException_Is(po, &EReturn)) - { - /* caught EReturn from the inlined frame */ - - /* 'po' is now in the parent frame, pointing to the instruction - (typically CALL_FUNCTION) which triggered the inline - compilation in the first place. We restart this instruction - entierely. With almost no code emitted we should reach the - psyco_call_pyfunc() again, which will at that point return - the expected result. To this end we save the result in - LOC_INLINING. It might be exceptionally possible that the - restarting CALL_FUNCTION does not reach psyco_call_pyfunc() - again in some cases; this hopefully corresponds to cases - that can never occur at run-time. The waste of code is - minimal. */ - LOC_INLINING = po->pr.val; - po->pr.val = NULL; - clear_pseudo_exception(po); - need_reference(po, LOC_INLINING); /* see test5.makeSelection() */ - continue; - } - - /* stack unwind goes on in the parent frame */ - if (PycException_IsPython(po) && compute_and_raise_exception(po)) - { - /* force the exception to be recorded on inner frame - before we can record its traceback on the parent frame */ - clear_pseudo_exception(po); - PycException_Raise(po, vinfo_new(VirtualTime_New(&ERtPython)), - NULL); - PsycoTraceBack_Here(po, po->pr.next_instr); - } - } - - /* Unwind the Python stack until we find a handler for - the (pseudo) exception. You will recognize here - ceval.c's stack unwinding code. */ - - while (po->pr.iblock > 0) { - PyTryBlock *b = block_pop(po); - - if (b->b_type == SETUP_LOOP && PycException_Is(po, &EContinue)) - { - /* For a continue inside a try block, - don't pop the block for the loop. */ - int next_instr; - block_setup(po, b->b_type, b->b_handler, b->b_level); - JUMPTO(CompileTime_Get(po->pr.val->source)->value); - clear_pseudo_exception(po); - SAVE_NEXT_INSTR(next_instr); - break; - } - - /* clear the stack up to b->b_level */ - while (STACK_LEVEL() > b->b_level) - { - POP_DECREF(); /* no NULLs here */ - } - if (b->b_type == SETUP_LOOP && PycException_Is(po, &EBreak)) - { - int next_instr; - clear_pseudo_exception(po); - JUMPTO(b->b_handler); - SAVE_NEXT_INSTR(next_instr); - break; - } - if (b->b_type == SETUP_FINALLY) - { - /* SETUP_FINALLY always pushes on the stack either a - single compile-time None object or three objects - (exc, value, traceback). Unlike Python, the latter - might represent a pseudo-exception like EReturn. */ - int next_instr; - vinfo_t* exc_info = PsycoTuple_New(3, NULL); - PycException_Fetch(po); - PsycoTuple_GET_ITEM(exc_info, 0) = po->pr.exc; - PsycoTuple_GET_ITEM(exc_info, 1) = po->pr.val; - PsycoTuple_GET_ITEM(exc_info, 2) = po->pr.tb; - po->pr.exc = NULL; - po->pr.val = NULL; - po->pr.tb = NULL; - PUSH(exc_info); - JUMPTO(b->b_handler); - SAVE_NEXT_INSTR(next_instr); - break; - } - if (b->b_type == SETUP_EXCEPT && PycException_IsPython(po)) - { - /* SETUP_EXCEPT pushes three objects individually as in - ceval.c, as needed for bytecode compatibility. See tricks - in END_FINALLY to distinguish between the end of a FINALLY - and the end of an EXCEPT block. */ - int next_instr; - while (!PycException_FetchNormalize(po)) { - /* got an exception while initializing the EXCEPT - block... Consider this new exception as overriding - the previous one, so that we just re-enter the same - EXCEPT block. */ - /* XXX check that this empty loop cannot be endless */ - } - extra_assert(po->pr.val != NULL); - extra_assert(po->pr.tb != NULL); - PUSH(po->pr.tb); po->pr.tb = NULL; - PUSH(po->pr.val); po->pr.val = NULL; - PUSH(po->pr.exc); po->pr.exc = NULL; - JUMPTO(b->b_handler); - SAVE_NEXT_INSTR(next_instr); - break; - } - } /* end of unwind stack */ - - /* End the function if we still have a (pseudo) exception */ - if (PycException_Occurred(po)) - { - /* at the end of the function we set next_instr to -1 - because the actual position has no longer any importance */ - po->pr.next_instr = -1; - } - } - - /* function return (either by RETURN or by exception). */ - while ((code1 = exit_function(po)) == NULL) { - /* If LOC_EXCEPTION is still set after exit_function(), it - means an exception was raised while handling the functn - return... In this case, we do a function return again, - this time with the newly raised exception. XXX make sure - this loop cannot be endless */ - } - - finished: -#if ALL_CHECKS - if (PyErr_Occurred()) { - fprintf(stderr, "psyco: unexpected Python exception during compilation:\n"); - PyErr_WriteUnraisable(Py_None); - } -#endif - PyErr_Restore(old_py_exc, old_py_val, old_py_tb); - return code1; -} diff --git a/nodebox/ext/psyco/src/c/Python/pycompiler.h b/nodebox/ext/psyco/src/c/Python/pycompiler.h deleted file mode 100644 index 9d074d7..0000000 --- a/nodebox/ext/psyco/src/c/Python/pycompiler.h +++ /dev/null @@ -1,366 +0,0 @@ - /***************************************************************/ -/*** Language-dependent part of the compiler ***/ - /***************************************************************/ - -#ifndef _PYCOMPILER_H -#define _PYCOMPILER_H - - -#include "pycheader.h" -#include "pyver.h" -#include "../vcompiler.h" -#include "../processor.h" -#include "../dispatcher.h" - - -/*#define MAX3(a,b,c) ((a)>(b)?((a)>(c)?(a):(c)):(b)>(c)?(b):(c))*/ - - -/*****************************************************************/ - /*** Common constants ***/ - -/* the following known values have the SkFlagFixed set */ -#define DEF_SK_AND_VI(name) \ -EXTERNVAR source_known_t psyco_sk##name; \ -PSY_INLINE vinfo_t* psyco_vi_##name(void) { \ - sk_incref(&psyco_sk##name); \ - return vinfo_new(CompileTime_NewSk(&psyco_sk##name)); \ -} - -DEF_SK_AND_VI(Zero) /* known value 0 */ -DEF_SK_AND_VI(One) /* known value 1 */ -DEF_SK_AND_VI(None) /* known value 'Py_None' */ -DEF_SK_AND_VI(Py_False) /* known value 'Py_False' */ -DEF_SK_AND_VI(Py_True) /* known value 'Py_True' */ -DEF_SK_AND_VI(NotImplemented) /* 'Py_NotImplemented' */ - - /* the macro defines psyco_vi_None(), psyco_vi_Zero(), - psyco_vi_One() and psyco_vi_NotImplemented(). */ - -#undef DEF_SK_AND_VI - - -/*****************************************************************/ - /*** Compile-time Pseudo exceptions ***/ - - -/***** - * A pseudo-exception is the compile-time equivalent of a Python exception. - * They are encoded in the fields 'exc' and 'val' of pyc_data_t. For real - * Python the translation is immediate: 'exc' describes the PyObject* - * pointing to the Python exception class, and 'val' is the associated value. - * - * For the other pseudo-exceptions, like special events breaking the Python - * main loop (returns, break, continue), 'exc' is a virtual value using - * one of the following non-computable virtual sources. - * - * 'ERtPython' is particular: it is the virtual equivalent of "the exception - * currently set at run-time". Use PycException_Fetch() to emit the actual - * call to PyErr_Fetch(). - */ -EXTERNVAR source_virtual_t ERtPython; /* Exception raised by Python */ -EXTERNVAR source_virtual_t EReturn; /* 'return' statement */ -EXTERNVAR source_virtual_t EBreak; /* 'break' statement */ -EXTERNVAR source_virtual_t EContinue; /* 'continue' statement */ -EXTERNVAR source_virtual_t EInline; /* inline a frame inside a parent frame */ - - -/* Check whether a pseudo-exception is currently set */ -PSY_INLINE bool PycException_Occurred(PsycoObject* po) { - return po->pr.exc != NULL; -} - - -/* raise an arbitrary pseudo-exception (consumes the references) */ -EXTERNFN void PycException_Clear(PsycoObject* po); -PSY_INLINE void PycException_Raise(PsycoObject* po, vinfo_t* exc, vinfo_t* val) { - if (PycException_Occurred(po)) - PycException_Clear(po); - po->pr.exc = exc; - po->pr.val = val; -} -PSY_INLINE void PycException_Restore(PsycoObject* po, vinfo_t* exc, - vinfo_t* val, vinfo_t* tb) { - PycException_Raise(po, exc, val); - po->pr.tb = tb; -} - -/* for Python exceptions detected at compile-time */ -EXTERNFN void PycException_SetString(PsycoObject* po, - PyObject* e, const char* text); -EXTERNFN void PycException_SetFormat(PsycoObject* po, - PyObject* e, const char* fmt, ...); - /* consumes a reference on 'v': */ -EXTERNFN void PycException_SetObject(PsycoObject* po, PyObject* e, PyObject* v); - /* consumes a reference on 'v': */ -EXTERNFN void PycException_SetVInfo(PsycoObject* po, PyObject* e, vinfo_t* v); - -/* checking for the Python class of an exception */ -EXTERNFN vinfo_t* PycException_Matches(PsycoObject* po, PyObject* e); - -PSY_INLINE bool PycException_Is(PsycoObject* po, source_virtual_t* sv) { - return po->pr.exc->source == VirtualTime_New(sv); -} -PSY_INLINE bool PycException_IsPython(PsycoObject* po) { - Source src = po->pr.exc->source; - if (is_virtualtime(src)) { - return !(src == VirtualTime_New(&EReturn) || - src == VirtualTime_New(&EBreak) || - src == VirtualTime_New(&EContinue) || - psyco_vsource_is_promotion(src)); - } - else - return true; -} - -/* fetch a Python exception set at compile-time (that is, now) and turn into - a pseudo-exception (typically to be re-raised at run-time). */ -EXTERNFN void psyco_virtualize_exception(PsycoObject* po); - -/* fetch a Python exception set at run-time (that is, a ERtPython) and turn into - a pseudo-exception. This is a no-op if !PycException_Is(po, &ERtPython). */ -EXTERNFN void PycException_Fetch(PsycoObject* po); - -/*****************************************************************/ - /*** Promotion ***/ - -/* Raise a pseudo-exception meaning "promote 'vi' from run-time to - compile-time". If 'promotion->fs' is not NULL, only promote if the - run-time value turns out to be in the given set. -*/ -EXTERNFN void PycException_Promote(PsycoObject* po, - vinfo_t* vi, c_promotion_t* promotion); - -/* A powerful function: it appears to return the value of the - variable 'vi', even if it is a run-time variable. Implemented - by raising a EPromotion exception if needed. Returns -1 in - this case; use PycException_Occurred() to know if it is really - an exception or a plain normal -1. */ -PSY_INLINE long psyco_atcompiletime(PsycoObject* po, vinfo_t *vi) { - if (!compute_vinfo(vi, po)) - return -1; - if (is_runtime(vi->source)) { - PycException_Promote(po, vi, &psyco_nonfixed_promotion); - return -1; - } - else { - source_known_t* sk = CompileTime_Get(vi->source); - sk->refcount1_flags |= SkFlagFixed; - return sk->value; - } -} -/* the same if the value to promote is itself a PyObject* which can be - used as key in the look-up dictionary */ -PSY_INLINE PyObject* psyco_pyobj_atcompiletime(PsycoObject* po, vinfo_t* vi) { - if (!compute_vinfo(vi, po)) - return NULL; - if (is_runtime(vi->source)) { - PycException_Promote(po, vi, &psyco_nonfixed_pyobj_promotion); - return NULL; - } - else { - source_known_t* sk = CompileTime_Get(vi->source); - sk->refcount1_flags |= SkFlagFixed; - return (PyObject*) sk->value; - } -} -/* the same again, detecting megamorphic sites: if many different run-time - values keep showing up, return 0. If successfully promoted, return 1. - In case of exception, return -1. */ -/*EXTERNFN int psyco_atcompiletime_mega(PsycoObject* po, vinfo_t *vi, - long *out);*/ -EXTERNFN int psyco_pyobj_atcompiletime_mega(PsycoObject* po, vinfo_t* vi, - PyObject** out); - -#if USE_RUNTIME_SWITCHES -/* same as above, when the return value is used in a switch. - In this case we must only promote the known values. So instead - of writing 'switch (psyco_atcompiletime(po, vi))' you - must write 'switch (psyco_switch_index(po, vi, fs))' */ -PSY_INLINE int psyco_switch_index(PsycoObject* po, vinfo_t* vi, fixed_switch_t* fs) { - if (!compute_vinfo(vi, po)) - return -1; - if (is_runtime(vi->source)) { - if (!known_to_be_default(vi, fs)) - PycException_Promote(po, vi, &fs->fixed_promotion); - return -1; - } - else - return psyco_switch_lookup(fs, CompileTime_Get(vi->source)->value); -} -#endif - -/* lazy comparison. Returns true if 'vi' is non-NULL, compile-time, and has the - given value, and false otherwise. */ -PSY_INLINE bool psyco_knowntobe(vinfo_t* vi, long value) { - return vi != NULL && is_compiletime(vi->source) && - CompileTime_Get(vi->source)->value == value; -} - -/* comparison with a special PyObject* value, e.g. Py_NotImplemented; assume - that virtual sources are never one of these special objects. The _f version - assumes a generally false outcome, and the _t version a generally true one. */ -/* --- disabled, use CfPyErrNotImplemented instead --- */ -/* inline bool psyco_is_special_f(PsycoObject* po, vinfo_t* vi, */ -/* PyObject* value) { */ -/* return !is_virtualtime(vi->source) && */ -/* runtime_condition_f(po, * integer_cmp_i does not fail here * */ -/* integer_cmp_i(po, vi, (long) value, Py_EQ)); */ -/* } */ -/* inline bool psyco_is_special_t(PsycoObject* po, vinfo_t* vi, PyObject* */ -/* value) { */ -/* return !is_virtualtime(vi->source) && */ -/* runtime_condition_t(po, * integer_cmp_i does not fail here * */ -/* integer_cmp_i(po, vi, (long) value, Py_EQ)); */ -/* } */ - - -/*****************************************************************/ - /*** Exception utilities ***/ - -/* Psyco meta-equivalent of PyErr_Occurred(). Not to be confused with - PycException_Occurred(), which tells whether a Psyco-level exception - is currently set. */ -PSY_INLINE vinfo_t* psyco_PyErr_Occurred(PsycoObject* po) { - if (PycException_Occurred(po) && PycException_IsPython(po)) { - return psyco_vi_One(); - } - else { - /* normal call would be: - return psyco_generic_call(po, PyErr_Occurred, - CfReturnNormal, ""); - but we inline the check done in PyErr_Occurred(). */ - vinfo_t* vaddr; - vinfo_t* vtstate; - vinfo_t* vcurexc; - vaddr = vinfo_new(CompileTime_New( - (long)(&_PyThreadState_Current))); - vtstate = psyco_memory_read(po, vaddr, 0, NULL, 2, false); - vinfo_decref(vaddr, po); - vcurexc = psyco_memory_read(po, vtstate, - offsetof(PyThreadState, curexc_type), - NULL, 2, false); - vinfo_decref(vtstate, po); - return vcurexc; - } -} - - -/*****************************************************************/ - /*** Meta functions ***/ - -/* Each C function of the Python interpreter might be associated to a - "meta" function from Psyco with the same signature but 'vinfo_t*' for - the arguments and return value. The idea is that when such a meta - function exists, Psyco can invoke it at compile-time to do (a part of) - what the Python interpreter would do at run-time only. The code of the - meta function typically ressembles that of the original function enough - that we might dream about a language in which we never have to write - the two versions (where Psyco's version could be derived automatically - from the standard version). -*/ - -EXTERNVAR PyObject* Psyco_Meta_Dict; /* key is a PyIntObject holding the - address of the C function, value is - a PyIntObject holding the address - of the corresponding Psyco function. */ -EXTERNFN void Psyco_DefineMeta(void* c_function, void* psyco_function); -PSY_INLINE void* Psyco_Lookup(void* c_function) { - PyObject* value; - PyObject* key = PyInt_FromLong((long) c_function); - if (key == NULL) OUT_OF_MEMORY(); - value = PyDict_GetItem(Psyco_Meta_Dict, key); - Py_DECREF(key); - if (value != NULL) - return (void*) PyInt_AS_LONG(value); - else - return NULL; -} - -/*** To map the content of a Python module to meta-implementations. ***/ -/* Returns the module object (refcount *incremented*) or NULL if - not found. It also prints some infos in verbose mode. */ -EXTERNFN PyObject* Psyco_DefineMetaModule(char* modulename); -/* Returns an object from a module (refcount *incremented*) or NULL - if not found. In verbose mode, 'not found' errors are printed. */ -EXTERNFN PyObject* Psyco_GetModuleObject(PyObject* module, char* name, - PyTypeObject* expected_type); -/* Maps a built-in function object from a module to a meta-implementation. - Returns a pointer to the C function itself. */ -EXTERNFN PyCFunction Psyco_DefineModuleFn(PyObject* module, char* meth_name, - int meth_flags, void* meta_fn); -/* Same as above, but also alternatively accepts a callable type object - and maps it to meta_type_new. Returns NULL in this case. */ -EXTERNFN PyCFunction Psyco_DefineModuleC(PyObject* module, char* meth_name, - int meth_flags, void* meta_fn, - void* meta_type_new); - -/* the general-purpose calling routine: it looks for a meta implementation of - 'c_function' and call it if found; if not found, it encode a run-time call - to 'c_function'. The 'flags' and 'arguments' are as in psyco_generic_call(). - The remaining arguments are given to the meta function or encoded in the - run-time call; they should be compatible with the description given in - 'arguments'. - This is a bit tricky, with one version of the macro per number of arguments, - because the C processor is too limited and we want to avoid handling - functions with '...' arguments all around -*/ -#define Psyco_META1(po, c_function, flags, arguments, a1) \ - Psyco_Meta1x(po, c_function, flags, arguments, \ - (long)(a1)) -#define Psyco_META2(po, c_function, flags, arguments, a1, a2) \ - Psyco_Meta2x(po, c_function, flags, arguments, \ - (long)(a1), (long)(a2)) -#define Psyco_META3(po, c_function, flags, arguments, a1, a2, a3) \ - Psyco_Meta3x(po, c_function, flags, arguments, \ - (long)(a1), (long)(a2), (long)(a3)) - -#define Psyco_flag_META1 (condition_code_t) Psyco_META1 -#define Psyco_flag_META2 (condition_code_t) Psyco_META2 -#define Psyco_flag_META3 (condition_code_t) Psyco_META3 - -EXTERNFN vinfo_t* Psyco_Meta1x(PsycoObject* po, void* c_function, int flags, - const char* arguments, long a1); -EXTERNFN vinfo_t* Psyco_Meta2x(PsycoObject* po, void* c_function, int flags, - const char* arguments, long a1, long a2); -EXTERNFN vinfo_t* Psyco_Meta3x(PsycoObject* po, void* c_function, int flags, - const char* arguments, long a1, long a2, long a3); - - -/******************************************************************/ - /*** pyc_data_t implementation and snapshots for the dispatcher ***/ - -/* construction for non-frozen snapshots */ -EXTERNFN void pyc_data_build(PsycoObject* po, PyObject* merge_points); -PSY_INLINE void pyc_data_release(pyc_data_t* pyc) { - vinfo_xdecref(pyc->val, NULL); - vinfo_xdecref(pyc->exc, NULL); - vinfo_xdecref(pyc->tb, NULL); - Py_XDECREF(pyc->changing_globals); -} -PSY_INLINE void pyc_data_duplicate(pyc_data_t* target, pyc_data_t* source) { - memcpy(target, source, sizeof(pyc_data_t)); - target->exc = NULL; - target->val = NULL; - target->tb = NULL; - Py_XINCREF(target->changing_globals); -} - -/* construction for frozen snapshots */ -PSY_INLINE size_t frozen_size(pyc_data_t* pyc) { - return offsetof(pyc_data_t, blockstack) + pyc->iblock*sizeof(PyTryBlock); -} -PSY_INLINE void frozen_copy(pyc_data_t* target, pyc_data_t* source) { - memcpy(target, source, frozen_size(source)); -} -PSY_INLINE pyc_data_t* pyc_data_new(pyc_data_t* original) { - pyc_data_t* pyc = (pyc_data_t*) PyMem_MALLOC(frozen_size(original)); - if (pyc == NULL) OUT_OF_MEMORY(); - frozen_copy(pyc, original); - return pyc; -} -PSY_INLINE void pyc_data_delete(pyc_data_t* pyc) { - PyMem_FREE(pyc); -} - -#endif /* _PYCOMPILER_H */ diff --git a/nodebox/ext/psyco/src/c/Python/pyver.h b/nodebox/ext/psyco/src/c/Python/pyver.h deleted file mode 100644 index c5582e0..0000000 --- a/nodebox/ext/psyco/src/c/Python/pyver.h +++ /dev/null @@ -1,81 +0,0 @@ - /***************************************************************/ -/*** Detection of Python features ***/ - /***************************************************************/ - -#ifndef _PYVER_H -#define _PYVER_H - - -#include - -#define PSYCO_VERSION_HEX 0x010502f0 /* 1.5.2 */ - - -/*****************************************************************/ - /*** Detects differences between Python versions ***/ - -/* Note: not all features can be automatically detected; in some cases - we just assume that the feature is present or not based on some - other feature that has been introduced roughly at the same time. - This may need fixes to compile with some intermediary Python - versions. */ - -#define PSYCO_CAN_CALL_UNICODE 0 /* prevent references to PyUnicode_Xxx - functions causing potential linker - errors because of UCS2/UCS4 name - mangling */ - -#define HAVE_arrayobject_allocated (PY_VERSION_HEX>=0x02040000) /* 2.4 */ -#define VERYCONVOLUTED_IMPORT_NAME (PY_VERSION_HEX>=0x02050000) /* 2.5 */ - -#if HAVE_LONG_LONG && !defined(PY_LONG_LONG) -# define PY_LONG_LONG LONG_LONG /* Python < 2.3 */ -#endif - -#ifdef PyBool_Check -# define BOOLEAN_TYPE 1 /* Python >=2.3 */ -#else -# define BOOLEAN_TYPE 0 -#endif - -#ifndef PyString_CHECK_INTERNED -# define PyString_CHECK_INTERNED(op) (((PyStringObject*)(op))->ob_sinterned) -#endif - -#ifndef PyMODINIT_FUNC -# define PyMODINIT_FUNC void -#endif - -#ifndef PyExceptionClass_Check /* Python < 2.5 */ -# define PyExceptionClass_Check(x) PyClass_Check(x) -# define PyExceptionInstance_Check(x) PyInstance_Check(x) -# define PyExceptionInstance_Class(x) \ - (PyObject*)((PyInstanceObject*)(x))->in_class -#endif - -#ifdef Py_TPFLAGS_HAVE_INDEX /* Python >= 2.5 */ -# define HAVE_NB_INDEX 1 -# define PsycoIndex_Check(tp) \ - ((tp)->tp_as_number != NULL && \ - PyType_HasFeature((tp), Py_TPFLAGS_HAVE_INDEX) && \ - (tp)->tp_as_number->nb_index != NULL) - -#else -# define HAVE_NB_INDEX 0 -#endif - -/* for extra fun points, let's try to emulate Python's ever-changing behavior - (but not too hard; you can still tell the difference in Python < 2.5 if - you use -sys.maxint-1 as the lower bound of a slice, provided you inspect - it with a custom __getslice__() */ -#if PY_VERSION_HEX < 0x02030000 -# define LARGE_NEG_LONG_AS_SLICE_INDEX 0 /* 2.2 */ -#elif PY_VERSION_HEX < 0x02050000 -# define LARGE_NEG_LONG_AS_SLICE_INDEX (-INT_MAX) /* 2.3, 2.4 */ -#else -# define LARGE_NEG_LONG_AS_SLICE_INDEX (-INT_MAX-1) /* 2.5 */ -#endif - -#define HAVE_NEGATIVE_IDS (PY_VERSION_HEX < 0x02050000) /* Python < 2.5 */ - -#endif /* _PYVER_H */ diff --git a/nodebox/ext/psyco/src/c/alarm.c b/nodebox/ext/psyco/src/c/alarm.c deleted file mode 100644 index eff8222..0000000 --- a/nodebox/ext/psyco/src/c/alarm.c +++ /dev/null @@ -1,280 +0,0 @@ - -/* Define this to compile as a stand-alone "alarm" module */ -/*#undef STANDALONE*/ - -#ifdef STANDALONE -# include -#else -# include "alarm.h" -#endif - -/************************************************************/ -#ifdef WITH_THREAD -/************************************************************/ - -#include - - -typedef struct { - PyObject_HEAD - PyInterpreterState* interp; - PyThread_type_lock lock; - PyObject* args; - enum { st_waiting, st_running, st_stopped } state; -} PyAlarmObject; - - -staticforward PyTypeObject PyAlarm_Type; - -static void t_bootstrap(void* rawself) -{ - PyAlarmObject* self = (PyAlarmObject*) rawself; - PyThreadState *tstate; - PyObject* args = NULL; - - tstate = PyThreadState_New(self->interp); - PyEval_AcquireThread(tstate); - - while (1) - { - PyObject *res, *sleepfn, *sleeparg, *callback, *cbarg = NULL; - Py_XDECREF(args); - args = self->args; - Py_XINCREF(args); - if (args == NULL || args == Py_None) - break; - if (!PyArg_ParseTuple(args, "OOO|O", &sleepfn, &sleeparg, - &callback, &cbarg)) - break; - res = PyObject_CallObject(sleepfn, sleeparg); - if (res == NULL) - break; - Py_DECREF(res); - res = NULL; - if (self->args == NULL) - break; - - PyThread_acquire_lock(self->lock, WAIT_LOCK); - if (self->args != NULL) - { - self->state = st_running; - res = PyObject_CallObject(callback, cbarg); - self->state = st_waiting; - } - PyThread_release_lock(self->lock); - - Py_DECREF(args); - args = self->args; - self->args = res; - } - Py_XDECREF(args); - Py_XDECREF(self->args); - self->args = NULL; - - self->state = st_stopped; - if (PyErr_Occurred()) - { - if (PyErr_ExceptionMatches(PyExc_SystemExit)) - PyErr_Clear(); - else - { - PySys_WriteStderr("Unhandled exception in alarm:\n"); - PyErr_PrintEx(0); - } - } - Py_DECREF(self); - PyThreadState_Clear(tstate); - PyThreadState_DeleteCurrent(); - PyThread_exit_thread(); -} - - /***************************************************************/ - -static void alarm_dealloc(PyAlarmObject* self) -{ - Py_XDECREF(self->args); - if (self->lock != NULL) - PyThread_free_lock(self->lock); - PyObject_Del((PyObject*) self); -} - -#if 0 -static int alarm_traverse(PyAlarmObject* self, visitproc visit, void* arg) -{ - if (self->args != NULL) - return visit(self->args, arg); - else - return 0; -} -#endif - -PSY_INLINE int alarm_clear(PyAlarmObject* self) -{ - PyObject* nargs = self->args; - self->args = NULL; - Py_XDECREF(nargs); - return 0; -} - -static PyObject* alarmstate(PyAlarmObject* self, PyObject* args) -{ - char* s; - if (!PyArg_ParseTuple(args, "")) - return NULL; - switch (self->state) { - case st_waiting: s = "waiting"; break; - case st_running: s = "running"; break; - default: s = "stopped"; break; - } - return PyString_FromString(s); -} - -static PyObject* alarmstop(PyAlarmObject* self, PyObject* args) -{ - int wait; - if (!PyArg_ParseTuple(args, "i", &wait)) - return NULL; - alarm_clear(self); - if (wait && self->state != st_stopped) - { - Py_BEGIN_ALLOW_THREADS - PyThread_acquire_lock(self->lock, WAIT_LOCK); - PyThread_release_lock(self->lock); - Py_END_ALLOW_THREADS - } - Py_INCREF(Py_None); - return Py_None; -} - -#ifdef STANDALONE -static PyObject* new_alarm(PyObject* dummy, PyObject* args) -#else -DEFINEFN -PyObject* psyco_new_alarm(PyObject* dummy, PyObject* args) -#endif -{ - PyAlarmObject* self; - long ident; - - self = PyObject_New(PyAlarmObject, &PyAlarm_Type); - if (self == NULL) - return NULL; - - PyEval_InitThreads(); /* Start the interpreter's thread-awareness */ - self->interp = PyThreadState_Get()->interp; - self->lock = PyThread_allocate_lock(); - Py_INCREF(args); - self->args = args; - self->state = st_waiting; - - if (self->lock == NULL) goto error; - - Py_INCREF(self); /* t_bootstrap consumes a ref */ - ident = PyThread_start_new_thread(t_bootstrap, (void*) self); - if (ident == -1) - { - Py_DECREF(self); - PyErr_SetString(PyExc_RuntimeError, "can't start new thread"); - goto error; - } - return (PyObject*) self; - - error: - Py_DECREF(self); - return NULL; -} - - /***************************************************************/ - -static PyMethodDef alarm_methods[] = { - {"state", (PyCFunction)alarmstate, METH_VARARGS}, - {"stop", (PyCFunction)alarmstop, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - -static PyObject* alarm_getattr(PyObject* self, char* name) -{ - return Py_FindMethod(alarm_methods, self, name); -} - -statichere PyTypeObject PyAlarm_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "alarm", /*tp_name*/ - sizeof(PyAlarmObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)alarm_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - (getattrfunc)alarm_getattr, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - 0, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ -}; - - -#ifdef STANDALONE -static PyMethodDef AlarmMethods[] = { - {"alarm", new_alarm, METH_VARARGS}, - {NULL, NULL} /* Sentinel */ -}; - -void initalarm() -{ - PyObject* m; - PyAlarm_Type.ob_type = &PyType_Type; - m = Py_InitModule("alarm", AlarmMethods); - if (m == NULL) - return; - Py_INCREF(&PyAlarm_Type); - if (PyModule_AddObject(m, "AlarmType", (PyObject*) &PyAlarm_Type)) - return; -} -#else -INITIALIZATIONFN -void psyco_alarm_init(void) -{ - PyAlarm_Type.ob_type = &PyType_Type; -} -#endif - - -/************************************************************/ -#else /* if !defined(WITH_THREAD) */ -/************************************************************/ - -#ifdef STANDALONE -# error "Thread support is required for the alarm module" -#else - -DEFINEFN -PyObject* psyco_new_alarm(PyObject* dummy, PyObject* args) -{ - PyErr_SetString(PyExc_PsycoError, - "Python and Psyco must be compiled with thread support."); - return NULL; -} - -INITIALIZATIONFN -void psyco_alarm_init(void) -{ -} -#endif - - -/************************************************************/ -#endif /* WITH_THREAD */ -/************************************************************/ diff --git a/nodebox/ext/psyco/src/c/alarm.h b/nodebox/ext/psyco/src/c/alarm.h deleted file mode 100644 index 0e29395..0000000 --- a/nodebox/ext/psyco/src/c/alarm.h +++ /dev/null @@ -1,17 +0,0 @@ - /***************************************************************/ -/*** General-purpose alarm module ***/ - /***************************************************************/ - -#ifndef _ALARM_H -#define _ALARM_H - - -#include "psyco.h" - - -#define ALARM_FUNCTIONS {"alarm", psyco_new_alarm, METH_VARARGS} - -EXTERNFN PyObject* psyco_new_alarm(PyObject* dummy, PyObject* args); - - -#endif /* _ALARM_H */ diff --git a/nodebox/ext/psyco/src/c/blockalloc.h b/nodebox/ext/psyco/src/c/blockalloc.h deleted file mode 100644 index 24d860f..0000000 --- a/nodebox/ext/psyco/src/c/blockalloc.h +++ /dev/null @@ -1,118 +0,0 @@ - /***************************************************************/ -/*** Generic fixed-sized-blocks allocator ***/ - /***************************************************************/ - -#ifndef _BLOCKALLOC_H -#define _BLOCKALLOC_H - - -#include "psyco.h" - - -/* Define two functions to allocate and free items of type 'type'. - The functions are named psyco_llalloc_[name] and psyco_llfree_[name]. */ -#define BLOCKALLOC_INTERFACE(name, type) \ - BLOCKALLOC_INTERN_DEF(name, type, EXTERNVAR, EXTERNFN) - - -/* Implements the required internal variables and functions. - The allocator will reserve and subdivide blocks of the given size. */ -#define BLOCKALLOC_IMPLEMENTATION(name, type, blocksize) \ - BLOCKALLOC_INTERN_IMPL(name, type, blocksize, DEFINEVAR, DEFINEFN) - - -/* Same as the combination of the above two when the result need only - be local to a .c source (i.e. static). */ -#define BLOCKALLOC_STATIC(name, type, blocksize) \ - BLOCKALLOC_INTERN_DEF(name, type, staticforward, static /*forward*/) \ - BLOCKALLOC_INTERN_IMPL(name, type, blocksize, statichere, static) - - -/***************************************************************/ - /*** dummy version, used in conjunction with a memory ***/ - /*** checker like linuxmemchk ***/ - -#ifdef PSYCO_NO_LINKED_LISTS - -#define BLOCKALLOC_INTERN_DEF(name, type, EVAR, EFN) \ -PSY_INLINE type* psyco_llalloc_##name(void) { \ - type* vi = (type*) PyMem_MALLOC(sizeof(type)); \ - if (vi == NULL) \ - OUT_OF_MEMORY(); \ - return vi; \ -} \ -PSY_INLINE void psyco_llfree_##name(type* vi) { \ - PyMem_FREE((char*) vi); \ -} - -#define BLOCKALLOC_INTERN_IMPL(name, type, blocksize, DVAR, DFN) /* nothing */ - - -/***************************************************************/ - /*** full linked-list block-allocated version ***/ - -#else /* if !PSYCO_NO_LINKED_LISTS */ - -#define BLOCKALLOC_INTERN_DEF(name, type, EVAR, EFN) \ -EVAR void** psyco_linked_list_##name; \ -EFN void* psyco_ll_newblock_##name(void); \ -PSY_INLINE type* psyco_llalloc_##name(void) { \ - type* vi; \ - if (psyco_linked_list_##name == NULL) \ - vi = (type*) psyco_ll_newblock_##name(); \ - else { \ - vi = (type*) psyco_linked_list_##name; \ - psyco_linked_list_##name = *(void**) vi; \ - BLOCKALLOC_DEBUG_CHECK( \ - (type*) psyco_linked_list_##name, type) \ - } \ - BLOCKALLOC_DEBUG_CHECK(vi, type) \ - return vi; \ -} \ -PSY_INLINE void psyco_llfree_##name(type* vi) { \ - if (PSYCO_DEBUG) \ - memset(vi, 0xCD, sizeof(type)); \ - *(void**) vi = psyco_linked_list_##name; \ - psyco_linked_list_##name = (void**) vi; \ -} - -#define BLOCKALLOC_INTERN_IMPL(name, type, blocksize, DVAR, DFN) \ -DVAR void** psyco_linked_list_##name = NULL; \ -DFN void* psyco_ll_newblock_##name() \ -{ \ - int block_count = (blocksize)/sizeof(type); \ - size_t sze = block_count * sizeof(type); \ - type* p; \ - type* prev = (type*) psyco_linked_list_##name; \ - type* block = (type*) PyMem_MALLOC(sze); \ - psyco_memory_usage += sze; \ - extra_assert(block_count > 0 && sizeof(type) >= sizeof(void*)); \ - if (block == NULL) \ - OUT_OF_MEMORY(); \ - if (PSYCO_DEBUG) \ - memset(block, 0xCD, sze); \ - for (p=block+block_count; --p!=block; ) { \ - *(type**)p = prev; \ - prev = p; \ - } \ - psyco_linked_list_##name = *(void***) prev; \ - return prev; \ -} - -#if PSYCO_DEBUG -# define BLOCKALLOC_DEBUG_CHECK(vi, type) \ - if (vi) { \ - int i; \ - for (i=sizeof(void*); i -#include "pycodegen.h" - -/*** The processor-independent part of the code generator. ***/ - - -DEFINEFN -void psyco_emit_header(PsycoObject* po, int nframelocal) -{ - int j = nframelocal; - vinfo_array_t* array; - extra_assert(LOC_CONTINUATION->array->count == 0); - - BEGIN_CODE - INITIALIZE_FRAME_LOCALS(nframelocal); - po->stack_depth += 4*nframelocal; - END_CODE - - array = LOC_CONTINUATION->array = array_new(nframelocal); - while (j--) - array->items[j] = vinfo_new(RunTime_NewStack( - po->stack_depth - sizeof(long)*j, false, false)); -} - -#define INITIAL_STACK_DEPTH_INUSE (INITIAL_STACK_DEPTH + \ - (!NEED_STACK_FRAME_HACK) * sizeof(long)) - -DEFINEFN -code_t* psyco_finish_return(PsycoObject* po, Source retval) -{ - code_t* code = po->code; - int retpos; - int nframelocal = LOC_CONTINUATION->array->count; - - /* 'retpos' is the position in the stack of the return address. */ - retpos = getstack(LOC_CONTINUATION->source); - extra_assert(retpos != RunTime_StackNone); - - /* write the epilogue */ - WRITE_FRAME_EPILOGUE(retval, nframelocal); - - /* now clean up the stack up to retpos */ - STACK_CORRECTION(retpos - po->stack_depth); - - /* emit the 'RET' instruction */ - retpos -= INITIAL_STACK_DEPTH_INUSE; - FUNCTION_RET(retpos); - - PsycoObject_Delete(po); - return code; -} - - -/***************************************************************/ - /*** Condition Codes (a.k.a. the processor 'flags' register) ***/ - -#if HAVE_CCREG -static source_virtual_t cc_functions_table[CC_TOTAL]; - -DEFINEFN -condition_code_t cc_from_vsource(Source source) -{ - source_virtual_t* sv = VirtualTime_Get(source); - return (condition_code_t) (sv - cc_functions_table); -} - -static bool generic_computed_cc(PsycoObject* po, vinfo_t* v) -{ - /* also upon forking, because the condition codes cannot be - sent as arguments (function calls typically require adds - and subs to adjust the stack). */ - /* 'v' should be one of the po->ccregs[_] here */ - BEGIN_CODE - code = psyco_compute_cc(po, code -#if REG_TOTAL > 0 - , REG_NONE -#endif - ); - END_CODE - return true; -} - - -DEFINEFN -vinfo_t* psyco_vinfo_condition(PsycoObject* po, condition_code_t cc) -{ - vinfo_t* result; - if ((int)cc < CC_TOTAL) - { - int index = INDEX_CC(cc); - if (po->ccregs[index] != NULL) - { - /* there is already a value in the processor flags register */ - condition_code_t prevcc = psyco_vsource_cc(po->ccregs[index]->source); - extra_assert(prevcc != CC_ALWAYS_FALSE); - - if (prevcc == cc) - { - /* it is the same condition, so reuse it */ - result = po->ccregs[index]; - vinfo_incref(result); - return result; - } - else - { - /* it is not the same condition at all, save the old one and - make a new one (should never occur with the ivm backend) */ - BEGIN_CODE - NEED_CC(); - END_CODE - } - } - extra_assert(po->ccregs[index] == NULL); - result = vinfo_new(VirtualTime_New(cc_functions_table+(int)cc)); - po->ccregs[index] = result; - } - else - result = vinfo_new(CompileTime_New(cc == CC_ALWAYS_TRUE)); - return result; -} - -DEFINEFN -VirtualTimeSource psyco_source_condition(condition_code_t cc) -{ - return VirtualTime_New(cc_functions_table+(int)cc); -} - -DEFINEFN -condition_code_t psyco_vsource_cc(Source source) -{ - if (is_virtualtime(source)) - { - source_virtual_t* sv = VirtualTime_Get(source); - if (cc_functions_table <= sv && sv < cc_functions_table+CC_TOTAL) - { - /* 'sv' points within the cc_functions_table */ - return (condition_code_t) (sv - cc_functions_table); - } - } - return CC_ALWAYS_FALSE; -} - -DEFINEFN -void psyco_resolved_cc(PsycoObject* po, condition_code_t cc_known_true) -{ - if ((int)cc_known_true < CC_TOTAL) - { - vinfo_t* v; - int index; - - index = INDEX_CC(cc_known_true); - v = po->ccregs[index]; - if (v != NULL && psyco_vsource_cc(v->source) == cc_known_true) - { - sk_incref(&psyco_skOne); - v->source = CompileTime_NewSk(&psyco_skOne); - po->ccregs[index] = NULL; - } - - index = INDEX_CC(INVERT_CC(cc_known_true)); - v = po->ccregs[index]; - if (v != NULL && psyco_vsource_cc(v->source) == INVERT_CC(cc_known_true)) - { - sk_incref(&psyco_skZero); - v->source = CompileTime_NewSk(&psyco_skZero); - po->ccregs[index] = NULL; - } - } -} - -#else /* if !HAVE_CCREG */ - -# error "this was meant for ivm, but now ivm also defines HAVE_CCREG." - -#endif /* HAVE_CCREG */ - - -/*****************************************************************/ - /*** run-time switches ***/ - -static bool computed_promotion(PsycoObject* po, vinfo_t* v) -{ - /* uncomputable, but still use the address of computed_promotion() as a - tag to figure out if a virtual source is a c_promotion_s structure. */ - return psyco_vsource_not_important.compute_fn(po, v); -} - -DEFINEVAR c_promotion_t psyco_nonfixed_promotion; -DEFINEVAR c_promotion_t psyco_nonfixed_pyobj_promotion; -/*DEFINEVAR c_promotion_t psyco_nonfixed_promotion_mega;*/ -DEFINEVAR c_promotion_t psyco_nonfixed_pyobj_promotion_mega; - -DEFINEFN -bool psyco_vsource_is_promotion(VirtualTimeSource source) -{ - return VirtualTime_Get(source)->compute_fn == &computed_promotion; -} - - -/*****************************************************************/ - /*** Calling C functions ***/ - -#define MAX_ARGUMENTS_COUNT 16 - -DEFINEFN -vinfo_t* psyco_generic_call(PsycoObject* po, void* c_function, - int flags, const char* arguments, ...) -{ - char argtags[MAX_ARGUMENTS_COUNT]; - long raw_args[MAX_ARGUMENTS_COUNT], args[MAX_ARGUMENTS_COUNT]; - int count, i, j, stackbase, totalstackspace = 0; - vinfo_t* vresult; - bool has_refs = false; - - va_list vargs; - -#ifdef HAVE_STDARG_PROTOTYPES - va_start(vargs, arguments); -#else - va_start(vargs); -#endif - extra_assert(c_function != NULL); - - for (count=0; arguments[count]; count++) { - long arg; - char tag; - vinfo_t* vi; - - extra_assert(count <= MAX_ARGUMENTS_COUNT); - raw_args[count] = arg = va_arg(vargs, long); - tag = arguments[count]; - - switch (tag) { - - case 'l': - break; - - case 'v': - /* Compute all values first */ - vi = (vinfo_t*) arg; - if (!compute_vinfo(vi, po)) return NULL; - if (!is_compiletime(vi->source)) { - flags &= ~CfPure; - } - else { - /* compile-time: get the value */ - arg = CompileTime_Get(vi->source)->value; - tag = 'l'; - } - break; - - case 'r': - /* Push by-reference values in the stack now */ - vi = (vinfo_t*) arg; - extra_assert(is_runtime(vi->source)); -#if REG_TOTAL > 0 - if (getstack(vi->source) == RunTime_StackNone) { - reg_t rg = getreg(vi->source); - if (rg == REG_NONE) { - /* for undefined sources, pushing - just any register will be fine */ - rg = REG_ANY_CALLER_SAVED; - } - BEGIN_CODE - SAVE_REG_VINFO(vi, rg); - END_CODE - } -#endif - arg = RunTime_NewStack(getstack(vi->source), - false, false); - has_refs = true; - break; - - case 'a': - case 'A': - has_refs = true; - totalstackspace += sizeof(long) * - ((vinfo_array_t*) arg)->count; - break; - - default: - Py_FatalError("unknown character argument in" - " psyco_generic_call()"); - } - args[count] = arg; - argtags[count] = tag; - } - va_end(vargs); - - if (flags & CfPure) { - /* calling a pure function with no run-time argument */ - long result; - - if (has_refs) { - for (i = 0; i < count; i++) { - if (argtags[i] == 'a' || argtags[i] == 'A') { - int cnt = ((vinfo_array_t*)args[i])->count; - args[i] = (long)malloc(cnt*sizeof(long)); - } -#if ALL_CHECKS - if (argtags[i] == 'r') - Py_FatalError("psyco_generic_call(): arg mode " - "incompatible with CfPure"); -#endif - } - } - #ifdef __APPLE__ - /* Adjust # of arguments for MacOS 16-byte stack alignment */ - result = psyco_call_var(c_function, (count+3)&~3, args); - #else - result = psyco_call_var(c_function, count, args); - #endif - if (PyErr_Occurred()) { - if (has_refs) - for (i = 0; i < count; i++) - if (argtags[i] == 'a' || argtags[i] == 'A') - free((void*)args[i]); - psyco_virtualize_exception(po); - return NULL; - } - if (has_refs) { - for (i = 0; i < count; i++) - if (argtags[i] == 'a' || argtags[i] == 'A') { - vinfo_array_t* array = (vinfo_array_t*)raw_args[i]; - long sk_flag = (argtags[i] == 'a') ? 0 : SkFlagPyObj; - for (j = 0; j < array->count; j++) { - array->items[j] = vinfo_new(CompileTime_NewSk( - sk_new( ((long*)args[i])[j], sk_flag))); - } - free((void*)args[i]); - } - } - - if (flags & CfPyErrMask) { - /* such functions are rarely pure, but there are - exceptions with CfPyErrNotImplemented */ - vresult = generic_call_ct(flags, result); - if (vresult != NULL) - return vresult; - } - - switch (flags & CfReturnMask) { - - case CfReturnNormal: - vresult = vinfo_new(CompileTime_New(result)); - break; - - case CfReturnRef: - vresult = vinfo_new(CompileTime_NewSk(sk_new(result, - SkFlagPyObj))); - break; - - default: - vresult = (vinfo_t*) 1; /* anything non-NULL */ - } - return vresult; - } - -#ifdef CALL_SET_ARG_FROM_ADDR_CLOBBER_REG - if (has_refs) { - /* we will need a trash register to compute the references - we push later. The following three lines prevent another - argument which would currently be in the same trash - register from being pushed from the register after we - clobbered it. */ - BEGIN_CODE - NEED_REGISTER(CALL_SET_ARG_FROM_ADDR_CLOBBER_REG); - END_CODE - } -#endif - - BEGIN_CODE - NEED_CC(); - - for (count=0; arguments[count]; count++) { - if (argtags[count] == 'v') { - /* We collect all the sources in 'args' now, - before SAVE_REGS_FN_CALLS which might move - some run-time values into the stack. In this - case the old copy in the registers is still - useable to PUSH it for the C function call. */ - RunTimeSource src = ((vinfo_t*)(args[count]))->source; - args[count] = (long) src; - } - } - - SAVE_REGS_FN_CALLS(false); /* CC saved above */ - stackbase = po->stack_depth; - po->stack_depth += totalstackspace; - STACK_CORRECTION(totalstackspace); - CALL_STACK_ALIGN(count); - for (i=count; i--; ) { - switch (argtags[i]) { - - case 'v': - CALL_SET_ARG_FROM_RT (args[i], i, count); - break; - - case 'r': - CALL_SET_ARG_FROM_ADDR (args[i], i, count); - break; - - case 'a': - case 'A': - { - vinfo_array_t* array = (vinfo_array_t*) args[i]; - bool with_reference = (argtags[i] == 'A'); - int j = array->count; - while (j > 0) { - stackbase += sizeof(long); - array->items[--j] = vinfo_new( - RunTime_NewStack(stackbase, - with_reference, false)); - } - CALL_SET_ARG_FROM_ADDR(array->items[0]->source, i,count); - break; - } - - default: - CALL_SET_ARG_IMMED (args[i], i, count); - break; - } - } - CALL_C_FUNCTION (c_function, count); - END_CODE - - switch (flags & CfReturnMask) { - - case CfReturnNormal: - vresult = bfunction_result(po, false); - break; - - case CfReturnRef: - vresult = bfunction_result(po, true); - break; - - default: - if ((flags & CfPyErrMask) == 0) - return (vinfo_t*) 1; /* anything non-NULL */ - - vresult = bfunction_result(po, false); - vresult = generic_call_check(po, flags, vresult); - if (vresult == NULL) - goto error_detected; - vinfo_decref(vresult, po); - return (vinfo_t*) 1; /* anything non-NULL */ - } - - if (flags & CfPyErrMask) { - vresult = generic_call_check(po, flags, vresult); - if (vresult == NULL) - goto error_detected; - } - return vresult; - - error_detected: - /* if the called function returns an error, we then assume that - it did not actually fill the arrays */ - if (has_refs) { - for (i = 0; i < count; i++) - if (argtags[i] == 'a' || argtags[i] == 'A') { - vinfo_array_t* array = (vinfo_array_t*)args[i]; - int j = array->count; - while (j--) { - vinfo_t* v = array->items[j]; - array->items[j] = NULL; - v->source = remove_rtref(v->source); - vinfo_decref(v, po); - } - } - } - - return NULL; -} - - -DEFINEFN -void psyco_inline_enter(PsycoObject* po) -{ - struct stack_frame_info_s* finfo = psyco_finfo(NULL, po); - BEGIN_CODE - ABOUT_TO_CALL_SUBFUNCTION((long) finfo); - END_CODE -} - -DEFINEFN -void psyco_inline_exit (PsycoObject* po) -{ - BEGIN_CODE - RETURNED_FROM_SUBFUNCTION(); - END_CODE -} - - -/*****************************************************************/ - /*** Emit common instructions ***/ - -/* forward */ -static condition_code_t int_cmp_i(PsycoObject* po, vinfo_t* rt1, - long immed2, int py_op); - -DEFINEFN -condition_code_t integer_non_null(PsycoObject* po, vinfo_t* vi) -{ - condition_code_t result; - - if (is_virtualtime(vi->source)) { - result = psyco_vsource_cc(vi->source); - if (result != CC_ALWAYS_FALSE) - return result; - if (!compute_vinfo(vi, po)) - return CC_ERROR; - } - if (is_compiletime(vi->source)) { - if (CompileTime_Get(vi->source)->value != 0) - return CC_ALWAYS_TRUE; - else - return CC_ALWAYS_FALSE; - } - BEGIN_CODE - CHECK_NONZERO_FROM_RT(vi->source, result); - END_CODE - return result; -} - -DEFINEFN -condition_code_t integer_NON_NULL(PsycoObject* po, vinfo_t* vi) -{ - condition_code_t result; - - if (vi == NULL) - return CC_ERROR; - - result = integer_non_null(po, vi); - - /* 'vi' cannot be a reference to a Python object if we are - asking ourselves if it is NULL or not. So the following - vinfo_decref() will not emit a Py_DECREF() that would - clobber the condition code. We check all this. */ -#if ALL_CHECKS - extra_assert(!has_rtref(vi->source)); - { code_t* code1 = po->code; -#endif - vinfo_decref(vi, po); -#if ALL_CHECKS - extra_assert(po->code == code1); } -#endif - return result; -} - -#define GENERIC_BINARY_HEADER \ - if (!compute_vinfo(v2, po) || !compute_vinfo(v1, po)) return NULL - -#define GENERIC_BINARY_HEADER_i \ - if (!compute_vinfo(v1, po)) return NULL - -#define GENERIC_BINARY_CT_CT(c_code) \ - if (is_compiletime(v1->source) && is_compiletime(v2->source)) \ - { \ - long a = CompileTime_Get(v1->source)->value; \ - long b = CompileTime_Get(v2->source)->value; \ - long c = (c_code); \ - return vinfo_new(CompileTime_New(c)); \ - } - -DEFINEFN -vinfo_t* integer_add(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf) -{ - GENERIC_BINARY_HEADER; - if (is_compiletime(v1->source)) - { - long a = CompileTime_Get(v1->source)->value; - if (a == 0) - { - /* adding zero to v2 */ - vinfo_incref(v2); - return v2; - } - if (is_compiletime(v2->source)) - { - long b = CompileTime_Get(v2->source)->value; - long c = a + b; - if (ovf && (c^a) < 0 && (c^b) < 0) - return NULL; /* overflow */ - return vinfo_new(CompileTime_New(c)); - } - if (!ovf) - return bint_add_i(po, v2, a, false); - } - else - if (is_compiletime(v2->source)) - { - long b = CompileTime_Get(v2->source)->value; - if (b == 0) - { - /* adding zero to v1 */ - vinfo_incref(v1); - return v1; - } - if (!ovf) - return bint_add_i(po, v1, b, false); - } - return BINARY_INSTR_ADD(ovf, ovf && is_nonneg(v1->source) - && is_nonneg(v2->source)); -} - -DEFINEFN -vinfo_t* integer_add_i(PsycoObject* po, vinfo_t* v1, long value2, bool unsafe) -{ - if (value2 == 0) - { - /* adding zero to v1 */ - vinfo_incref(v1); - return v1; - } - else - { - GENERIC_BINARY_HEADER_i; - if (is_compiletime(v1->source)) - { - long c = CompileTime_Get(v1->source)->value + value2; - return vinfo_new(CompileTime_New(c)); - } - return bint_add_i(po, v1, value2, unsafe); - } -} - -DEFINEFN -vinfo_t* integer_sub(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf) -{ - GENERIC_BINARY_HEADER; - if (is_compiletime(v1->source)) - { - long a = CompileTime_Get(v1->source)->value; - if (is_compiletime(v2->source)) - { - long b = CompileTime_Get(v2->source)->value; - long c = a - b; - if (ovf && (c^a) < 0 && (c^~b) < 0) - return NULL; /* overflow */ - return vinfo_new(CompileTime_New(c)); - } - } - else - if (is_compiletime(v2->source)) - { - long b = CompileTime_Get(v2->source)->value; - if (b == 0) - { - /* subtracting zero from v1 */ - vinfo_incref(v1); - return v1; - } - if (!ovf) - return bint_add_i(po, v1, -b, false); - } - return BINARY_INSTR_SUB(ovf, false); -} - -DEFINEFN -vinfo_t* integer_or(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) -{ - GENERIC_BINARY_HEADER; - GENERIC_BINARY_CT_CT(a | b); - return BINARY_INSTR_OR(false, is_nonneg(v1->source) && - is_nonneg(v2->source)); -} - -DEFINEFN -vinfo_t* integer_xor(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) -{ - GENERIC_BINARY_HEADER; - GENERIC_BINARY_CT_CT(a ^ b); - return BINARY_INSTR_XOR(false, is_nonneg(v1->source) && - is_nonneg(v2->source)); -} - -DEFINEFN -vinfo_t* integer_and(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) -{ - GENERIC_BINARY_HEADER; - GENERIC_BINARY_CT_CT(a & b); - return BINARY_INSTR_AND(false, is_nonneg(v1->source) || - is_nonneg(v2->source)); -} - -static vinfo_t* int_mul_i(PsycoObject* po, vinfo_t* v1, long value2, - bool ovf) -{ - switch (value2) { - case 0: - return vinfo_new(CompileTime_New(0)); - case 1: - vinfo_incref(v1); - return v1; - } - if (((value2-1) & value2) == 0 && value2 >= 0 && !ovf) - { - /* value2 is a power of two */ - return bint_lshift_i(po, v1, intlog2(value2)); - } - else - { - return bint_mul_i(po, v1, value2, ovf); - } -} - -DEFINEFN -vinfo_t* integer_mul(PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf) -{ - GENERIC_BINARY_HEADER; - if (is_compiletime(v1->source)) - { - long a = CompileTime_Get(v1->source)->value; - if (is_compiletime(v2->source)) - { - long b = CompileTime_Get(v2->source)->value; - /* unlike Python, we use a function written in assembly - to perform the product overflow checking */ - if (ovf && psyco_int_mul_ovf(a, b)) - return NULL; /* overflow */ - return vinfo_new(CompileTime_New(a * b)); - } - return int_mul_i(po, v2, a, ovf); - } - else - if (is_compiletime(v2->source)) - { - long b = CompileTime_Get(v2->source)->value; - return int_mul_i(po, v1, b, ovf); - } - return BINARY_INSTR_MUL(ovf, ovf && is_rtnonneg(v1->source) - && is_rtnonneg(v2->source)); -} - -DEFINEFN -vinfo_t* integer_mul_i(PsycoObject* po, vinfo_t* v1, long value2) -{ - GENERIC_BINARY_HEADER_i; - if (is_compiletime(v1->source)) - { - long c = CompileTime_Get(v1->source)->value * value2; - return vinfo_new(CompileTime_New(c)); - } - return int_mul_i(po, v1, value2, false); -} - -DEFINEFN -vinfo_t* integer_lshift(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) -{ - condition_code_t cc; - GENERIC_BINARY_HEADER; - if (is_compiletime(v2->source)) - return integer_lshift_i(po, v1, CompileTime_Get(v2->source)->value); - - cc = int_cmp_i(po, v2, LONG_BIT, Py_GE|COMPARE_UNSIGNED); - if (cc == CC_ERROR) - return NULL; - - if (runtime_condition_f(po, cc)) - { - cc = int_cmp_i(po, v2, 0, Py_LT); - if (cc == CC_ERROR) - return NULL; - if (runtime_condition_f(po, cc)) - { - PycException_SetString(po, PyExc_ValueError, "negative shift count"); - return NULL; - } - return vinfo_new(CompileTime_New(0)); - } - return BINARY_INSTR_LSHIFT(false); -} - -DEFINEFN -vinfo_t* integer_lshift_i(PsycoObject* po, vinfo_t* v1, long counter) -{ - GENERIC_BINARY_HEADER_i; - if (0 < counter && counter < LONG_BIT) - { - if (is_compiletime(v1->source)) - { - long c = CompileTime_Get(v1->source)->value << counter; - return vinfo_new(CompileTime_New(c)); - } - else - return bint_lshift_i(po, v1, counter); - } - else if (counter == 0) - { - vinfo_incref(v1); - return v1; - } - else if (counter >= LONG_BIT) - return vinfo_new(CompileTime_New(0)); - else - { - PycException_SetString(po, PyExc_ValueError, "negative shift count"); - return NULL; - } -} - -DEFINEFN /* signed */ -vinfo_t* integer_rshift(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) -{ - condition_code_t cc; - GENERIC_BINARY_HEADER; - if (is_compiletime(v2->source)) - return integer_rshift_i(po, v1, CompileTime_Get(v2->source)->value); - - cc = int_cmp_i(po, v2, LONG_BIT, Py_GE|COMPARE_UNSIGNED); - if (cc == CC_ERROR) - return NULL; - - if (runtime_condition_f(po, cc)) - { - cc = int_cmp_i(po, v2, 0, Py_LT); - if (cc == CC_ERROR) - return NULL; - if (runtime_condition_f(po, cc)) - { - PycException_SetString(po, PyExc_ValueError, "negative shift count"); - return NULL; - } - return integer_rshift_i(po, v1, LONG_BIT-1); - } - return BINARY_INSTR_RSHIFT(is_nonneg(v1->source)); -} - -DEFINEFN /* signed */ -vinfo_t* integer_rshift_i(PsycoObject* po, vinfo_t* v1, long counter) -{ - GENERIC_BINARY_HEADER_i; - if (counter >= LONG_BIT-1) - { - if (is_nonneg(v1->source)) - return vinfo_new(CompileTime_New(0)); - counter = LONG_BIT-1; - } - if (counter > 0) - { - if (is_compiletime(v1->source)) - { - long c = ((long)(CompileTime_Get(v1->source)->value)) >> counter; - return vinfo_new(CompileTime_New(c)); - } - else - return bint_rshift_i(po, v1, counter); - } - else if (counter == 0) - { - vinfo_incref(v1); - return v1; - } - else - { - PycException_SetString(po, PyExc_ValueError, "negative shift count"); - return NULL; - } -} - -DEFINEFN -vinfo_t* integer_urshift_i(PsycoObject* po, vinfo_t* v1, long counter) -{ - GENERIC_BINARY_HEADER_i; - if (0 < counter && counter < LONG_BIT) - { - if (is_compiletime(v1->source)) - { - long c = ((unsigned long)(CompileTime_Get(v1->source)->value)) >> counter; - return vinfo_new(CompileTime_New(c)); - } - else - return bint_urshift_i(po, v1, counter); - } - else if (counter == 0) - { - vinfo_incref(v1); - return v1; - } - else if (counter >= LONG_BIT) - return vinfo_new(CompileTime_New(0)); - else - { - PycException_SetString(po, PyExc_ValueError, "negative shift count"); - return NULL; - } -} - -/* DEFINEFN */ -/* vinfo_t* integer_lshift(PsycoObject* po, vinfo_t* v1, vinfo_t* v2) */ -/* { */ -/* NonVirtualSource v1s, v2s; */ -/* v2s = vinfo_compute(v2, po); */ -/* if (v2s == SOURCE_ERROR) return NULL; */ -/* if (is_compiletime(v2s)) */ -/* return integer_lshift_i(po, v1, CompileTime_Get(v2s)->value); */ - -/* v1s = vinfo_compute(v1, po); */ -/* if (v1s == SOURCE_ERROR) return NULL; */ -/* XXX implement me */ -/* } */ - -#define GENERIC_UNARY_HEADER \ - if (!compute_vinfo(v1, po)) return NULL; - -#define GENERIC_UNARY_CT(c_code, ovf, c_ovf) \ - if (is_compiletime(v1->source)) \ - { \ - long a = CompileTime_Get(v1->source)->value; \ - long c = (c_code); \ - if ((ovf) && (c_ovf)) \ - return NULL; \ - return vinfo_new(CompileTime_New(c)); \ - } - -DEFINEFN -vinfo_t* integer_inv(PsycoObject* po, vinfo_t* v1) -{ - GENERIC_UNARY_HEADER; - GENERIC_UNARY_CT(~a, false, false); - return UNARY_INSTR_INV(false, false); -} - -DEFINEFN -vinfo_t* integer_neg(PsycoObject* po, vinfo_t* v1, bool ovf) -{ - GENERIC_UNARY_HEADER; - GENERIC_UNARY_CT(-a, ovf, c == (-LONG_MAX-1)); - return UNARY_INSTR_NEG(ovf, false); -} - -DEFINEFN -vinfo_t* integer_abs(PsycoObject* po, vinfo_t* v1, bool ovf) -{ - GENERIC_UNARY_HEADER; - if (is_nonneg(v1->source)) - { - vinfo_incref(v1); - return v1; - } - GENERIC_UNARY_CT(a<0 ? -a : a, ovf, c == (-LONG_MAX-1)); - return UNARY_INSTR_ABS(ovf, true); /* nb. result assumed to be positive, - which is false in case of overflow */ -} - -static condition_code_t immediate_compare(long a, long b, int base_py_op) -{ - switch (base_py_op) { - case Py_LT: return a < b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_LE: return a <= b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_EQ|COMPARE_UNSIGNED: - case Py_EQ: return a == b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_NE|COMPARE_UNSIGNED: - case Py_NE: return a != b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_GT: return a > b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_GE: return a >= b ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - - case Py_LT|COMPARE_UNSIGNED: return ((unsigned long) a) < ((unsigned long) b) - ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_LE|COMPARE_UNSIGNED: return ((unsigned long) a) <= ((unsigned long) b) - ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_GT|COMPARE_UNSIGNED: return ((unsigned long) a) > ((unsigned long) b) - ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - case Py_GE|COMPARE_UNSIGNED: return ((unsigned long) a) >= ((unsigned long) b) - ? CC_ALWAYS_TRUE : CC_ALWAYS_FALSE; - default: - Py_FatalError("immediate_compare(): bad py_op"); - return CC_ERROR; - } -} - -static condition_code_t int_cmp_i(PsycoObject* po, vinfo_t* rt1, - long immed2, int py_op) -{ - int base_py_op = py_op & COMPARE_OP_MASK; - extra_assert(is_runtime(rt1->source)); - /* detect easy cases */ - if (immed2 == 0) - { - if (is_rtnonneg(rt1->source)) /* if we know that rt1>=0 */ - switch (base_py_op) { - case Py_LT: /* rt1 < 0 */ - return CC_ALWAYS_FALSE; - case Py_GE: /* rt1 >= 0 */ - return CC_ALWAYS_TRUE; - default: - ; /* pass */ - } - switch (base_py_op) { - case Py_LT|COMPARE_UNSIGNED: /* (unsigned) rt1 < 0 */ - return CC_ALWAYS_FALSE; - case Py_GE|COMPARE_UNSIGNED: /* (unsigned) rt1 >= 0 */ - return CC_ALWAYS_TRUE; - default: - ; /* pass */ - } - } - else if (immed2 < 0) - { - if (is_rtnonneg(rt1->source)) /* rt1>=0 && immed2<0 */ - { - switch (base_py_op) { - case Py_EQ: /* rt1 == immed2 */ - case Py_LT: /* rt1 < immed2 */ - case Py_LE: /* rt1 <= immed2 */ - case Py_GT|COMPARE_UNSIGNED: /* (unsigned) rt1 > immed2 */ - case Py_GE|COMPARE_UNSIGNED: /* (unsigned) rt1 >= immed2 */ - return CC_ALWAYS_FALSE; - case Py_NE: /* rt1 != immed2 */ - case Py_GE: /* rt1 >= immed2 */ - case Py_GT: /* rt1 > immed2 */ - case Py_LE|COMPARE_UNSIGNED: /* (unsigned) rt1 <= immed2 */ - case Py_LT|COMPARE_UNSIGNED: /* (unsigned) rt1 < immed2 */ - return CC_ALWAYS_TRUE; - default: - ; /* pass */ - } - } - if (immed2 == LONG_MIN) - { - switch (base_py_op) { - case Py_LT: /* rt1 < LONG_MIN */ - return CC_ALWAYS_FALSE; - case Py_GE: /* rt1 >= LONG_MIN */ - return CC_ALWAYS_TRUE; - case Py_EQ: /* rt1 == LONG_MIN */ - case Py_LE: /* rt1 <= LONG_MIN */ - if (py_op & CHEAT_MAXINT) return CC_ALWAYS_FALSE; - break; - case Py_NE: /* rt1 != LONG_MIN */ - case Py_GT: /* rt1 > LONG_MIN */ - if (py_op & CHEAT_MAXINT) return CC_ALWAYS_TRUE; - break; - default: - ; /* pass */ - } - } - } - else if (immed2 == LONG_MAX) - { - if (is_rtnonneg(rt1->source)) /* if we know that rt1>=0 */ - { - switch (base_py_op) { - case Py_GT|COMPARE_UNSIGNED: /* (unsigned) rt1 > LONG_MAX */ - return CC_ALWAYS_FALSE; - case Py_LE|COMPARE_UNSIGNED: /* (unsigned) rt1 <= LONG_MAX */ - return CC_ALWAYS_TRUE; - case Py_GE|COMPARE_UNSIGNED: /* (unsigned) rt1 >= LONG_MAX */ - if (py_op & CHEAT_MAXINT) return CC_ALWAYS_FALSE; - break; - case Py_LT|COMPARE_UNSIGNED: /* (unsigned) rt1 < LONG_MAX */ - if (py_op & CHEAT_MAXINT) return CC_ALWAYS_TRUE; - break; - default: - ; /* pass */ - } - } - switch (base_py_op) { - case Py_LE: /* rt1 <= LONG_MAX */ - return CC_ALWAYS_TRUE; - case Py_GT: /* rt1 > LONG_MAX */ - return CC_ALWAYS_FALSE; - case Py_EQ: /* rt1 == LONG_MAX */ - case Py_GE: /* rt1 >= LONG_MAX */ - if (py_op & CHEAT_MAXINT) return CC_ALWAYS_FALSE; - break; - case Py_NE: /* rt1 != LONG_MAX */ - case Py_LT: /* rt1 < LONG_MAX */ - if (py_op & CHEAT_MAXINT) return CC_ALWAYS_TRUE; - break; - default: - ; /* pass */ - } - } - /* end of easy cases */ - return bint_cmp_i(po, base_py_op, rt1, immed2); -} - -static const int inverted_py_op[8] = { - /* Py_LT: */ Py_GT, - /* Py_LE: */ Py_GE, - /* Py_EQ: */ Py_EQ, - /* Py_NE: */ Py_NE, - /* Py_GT: */ Py_LT, - /* Py_GE: */ Py_LE, - /* (6) */ -1, - /* (7) */ -1 }; - -DEFINEFN -condition_code_t integer_cmp(PsycoObject* po, vinfo_t* v1, - vinfo_t* v2, int py_op) -{ - int base_py_op = py_op & COMPARE_OP_MASK; - - if (vinfo_known_equal(v1, v2)) - goto same_source; - - if (!compute_vinfo(v1, po) || !compute_vinfo(v2, po)) - return CC_ERROR; - - if (vinfo_known_equal(v1, v2)) - { - same_source: - /* comparing equal sources */ - switch (base_py_op) { - case Py_LE: - case Py_EQ: - case Py_GE: - return CC_ALWAYS_TRUE; - default: - return CC_ALWAYS_FALSE; - } - } - if (is_compiletime(v1->source)) - if (is_compiletime(v2->source)) - { - long a = CompileTime_Get(v1->source)->value; - long b = CompileTime_Get(v2->source)->value; - return immediate_compare(a, b, base_py_op); - } - else - { - /* invert the two operands because (assumedly) the processor has - only CMP xxx,immed and not CMP immed,xxx */ - py_op = inverted_py_op[py_op & COMPARE_BASE_MASK] | - (py_op & ~COMPARE_BASE_MASK); - return int_cmp_i(po, v2, CompileTime_Get(v1->source)->value, py_op); - } - else - if (is_compiletime(v2->source)) - { - return int_cmp_i(po, v1, CompileTime_Get(v2->source)->value, py_op); - } - else - { - return BINARY_INSTR_CMP(base_py_op); - } -} - -DEFINEFN -condition_code_t integer_cmp_i(PsycoObject* po, vinfo_t* v1, - long value2, int py_op) -{ - if (!compute_vinfo(v1, po)) return CC_ERROR; - - if (is_compiletime(v1->source)) - { - long a = CompileTime_Get(v1->source)->value; - return immediate_compare(a, value2, py_op); - } - else - return int_cmp_i(po, v1, value2, py_op); -} - -DEFINEFN -vinfo_t* integer_conditional(PsycoObject* po, condition_code_t cc, - long immed_true, long immed_false) -{ - switch ((int)cc) { - case (int)CC_ALWAYS_FALSE: - return vinfo_new(CompileTime_New(immed_false)); - - case (int)CC_ALWAYS_TRUE: - return vinfo_new(CompileTime_New(immed_true)); - - default: - return BINARY_INSTR_COND(cc, immed_true, immed_false); - } -} - - -INITIALIZATIONFN -void psyco_codegen_init(void) -{ -#if HAVE_CCREG - int i; - for (i=0; i - -#if SIZEOF_LONG == 4 -# define SIZE_OF_LONG_BITS 2 -#else -# error "-----------------------------------------------------" -# error "Sorry, non-32-bit platforms are not supported at all." -# error "You may try with a Python compiled in 32-bit " -# error "compatibility mode. Note that Psyco will probably " -# error "never support non-32-bit platforms, as it is no " -# error "longer actively developed. Instead, the PyPy group " -# error "plans to replace it with a more flexible and easily " -# error "retargettable Psyco-for-PyPy during the year 2006. " -# error "See http://codespeak.net/pypy/ " -# error "-----------------------------------------------------" -#endif - -#if SIZEOF_LONG != SIZEOF_VOID_P -# error "Sorry, your platform is not supported at all." -# error "Psyco currently requires sizeof(long)==sizeof(void*)." -#endif - -#define INITIAL_STACK_DEPTH 4 /* anything >0 and a multiple of 4 */ - - -/***************************************************************/ - /*** Condition Codes (a.k.a. the processor 'flags' register) ***/ - -/* return a new vinfo_t* meaning `in the processor flags, true if ', - as an integer 0 or 1. The source of the vinfo_t* is compile-time - if cc is CC_ALWAYS_TRUE/FALSE, and virtual-time otherwise. */ -EXTERNFN vinfo_t* psyco_vinfo_condition(PsycoObject* po, condition_code_t cc); -EXTERNFN VirtualTimeSource psyco_source_condition(condition_code_t cc); - -/* if 'source' comes from psyco_vinfo_condition(), return its ; - otherwise return CC_ALWAYS_FALSE. */ -#if HAVE_CCREG -EXTERNFN condition_code_t psyco_vsource_cc(Source source); -EXTERNFN void psyco_resolved_cc(PsycoObject* po, condition_code_t cc_known_true); -#else -# define psyco_vsource_cc(src) CC_ALWAYS_FALSE -#endif - - -/***************************************************************/ - /*** Read/write memory ***/ - -/* access the data word at address 'nv_ptr + offset + (rt_vindex<refcount1_flags & SkFlagPyObj) != 0) { - /* XXX we get a reference from the code. - Implement freeing such references - together with code buffers. */ - sk_incref(sk); - } - return sk->value; -} -#endif - - -/*****************************************************************/ - /*** Calling C functions ***/ - -/* A generic way of emitting the call to a C function. - For maximal performance you can also directly use the macros - CALL_C_FUNCTION()&co. in encoding.h. - - 'arguments' is a string describing the following arguments - of psyco_generic_call(). Each argument to the C function to call - comes from a 'vinfo_t*' structure, excepted when it is known to be - compile-time, in which case a 'long' or 'PyObject*' can be passed - instead. In 'arguments' the characters are interpreted as follows: - - l an immediate 'long' or 'PyObject*' value - v a 'vinfo_t*' value - r a run-time 'vinfo_t*' value passed as a reference - a a 'vinfo_array_t*' used by the C function as output buffer - A same as 'a', but the C function creates new references - - 'r' means that the C function wants to get a reference to a - single-word value (typically it is an output argument). The - run-time value is pushed in the stack if it is just in a - register. Incompatible with CfPure. - - 'a' means that the C function gets a pointer to a buffer capable of - containing as many words as specified by the array count. - psyco_generic_call() fills the array with run-time vinfo_ts - representing the output values. -*/ -EXTERNFN vinfo_t* psyco_generic_call(PsycoObject* po, void* c_function, - int flags, const char* arguments, ...); - -/* if the C function has no side effect it can be called at compile-time - if all its arguments are compile-time. Use CfPure in this case. */ -#define CfPure 0x10 - -/* if the C function returns a long or a PyObject* but not a new reference */ -#define CfReturnNormal 0x00 /* default */ - -/* if the C function returns a new reference */ -#define CfReturnRef 0x01 - -/* if the C function does not return anything - or if you are not interested in getting the result in a vinfo_t. - psyco_generic_call() returns anything non-NULL (unless there is an error) - in this case. */ -#define CfNoReturnValue 0x03 - -#define CfReturnMask 0x0F -/* See also the Python-specific flags CfPyErrXxx defined in pycheader.h. */ - - -/* To emit the call to other code blocks emitted by Psyco. 'argsources' gives - the run-time sources for the arguments, as specified by - psyco_build_frame(). */ -EXTERNFN vinfo_t* psyco_call_psyco(PsycoObject* po, CodeBufferObject* codebuf, - Source argsources[], int argcount, - struct stack_frame_info_s* finfo); - -PSY_INLINE int get_arguments_count(vinfo_array_t* vlocals) { - int retpos = getstack(vlocals->items[INDEX_LOC_CONTINUATION]->source); - extra_assert(retpos != RunTime_StackNone); - return (retpos-(INITIAL_STACK_DEPTH+sizeof(long))) / sizeof(long); -} - -/* Emit the code to mark the presence of an inlined frame */ -EXTERNFN void psyco_inline_enter(PsycoObject* po); -EXTERNFN void psyco_inline_exit (PsycoObject* po); - - -/*****************************************************************/ - /*** Emit common instructions ***/ - -/* Returns a condition code for: "'vi' is not null". Warning, when a - function returns a condition code it must be used immediately, before - there is any chance for new code to be emitted. If you are unsure, use - psyco_vinfo_condition() to turn the condition code into a 0 or 1 integer. */ -EXTERNFN condition_code_t integer_non_null(PsycoObject* po, vinfo_t* vi); - -/* Same as above, but consumes the reference on 'vi'. Also checks if - 'vi==NULL' and returns CC_ERROR in this case. */ -EXTERNFN condition_code_t integer_NON_NULL(PsycoObject* po, vinfo_t* vi); - -/* Instructions with an 'ovf' parameter will check for overflow - if 'ovf' is true. They return NULL if an overflow is detected. */ -EXTERNFN -vinfo_t* integer_add (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf); -EXTERNFN /* 'unsafe': optimize by silently assuming no overflow is possible */ -vinfo_t* integer_add_i(PsycoObject* po, vinfo_t* v1, long value2, bool unsafe); -EXTERNFN -vinfo_t* integer_sub (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf); -/*EXTERNFN XXX implement me - vinfo_t* integer_sub_i(PsycoObject* po, vinfo_t* v1, long value2);*/ -EXTERNFN -vinfo_t* integer_mul (PsycoObject* po, vinfo_t* v1, vinfo_t* v2, bool ovf); -EXTERNFN -vinfo_t* integer_mul_i(PsycoObject* po, vinfo_t* v1, long value2); -EXTERNFN -vinfo_t* integer_or (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); -EXTERNFN -vinfo_t* integer_xor (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); -EXTERNFN -vinfo_t* integer_and (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); -/*EXTERNFN - vinfo_t* integer_and_i(PsycoObject* po, vinfo_t* v1, long value2);*/ -EXTERNFN -vinfo_t* integer_lshift (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); -EXTERNFN /* signed */ -vinfo_t* integer_rshift (PsycoObject* po, vinfo_t* v1, vinfo_t* v2); -/*EXTERNFN unsigned - vinfo_t* integer_urshift (PsycoObject* po, vinfo_t* v1, vinfo_t* v2);*/ -EXTERNFN -vinfo_t* integer_lshift_i(PsycoObject* po, vinfo_t* v1, long counter); -EXTERNFN /* signed */ -vinfo_t* integer_rshift_i(PsycoObject* po, vinfo_t* v1, long counter); -EXTERNFN /* unsigned */ -vinfo_t* integer_urshift_i(PsycoObject* po, vinfo_t* v1, long counter); -EXTERNFN -vinfo_t* integer_inv (PsycoObject* po, vinfo_t* v1); -EXTERNFN -vinfo_t* integer_neg (PsycoObject* po, vinfo_t* v1, bool ovf); -EXTERNFN -vinfo_t* integer_abs (PsycoObject* po, vinfo_t* v1, bool ovf); -/* Comparison: 'py_op' is one of Python's rich comparison numbers - Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT, Py_GE - optionally together with COMPARE_UNSIGNED, CHEAT_MAXINT. */ -EXTERNFN condition_code_t integer_cmp (PsycoObject* po, vinfo_t* v1, - vinfo_t* v2, int py_op); -EXTERNFN condition_code_t integer_cmp_i(PsycoObject* po, vinfo_t* v1, - long value2, int py_op); -#define COMPARE_UNSIGNED 8 -#define CHEAT_MAXINT 16 /* assume only a constant can be exactly - LONG_MIN or LONG_MAX */ -#define COMPARE_BASE_MASK 7 -#define COMPARE_OP_MASK 15 - -/* Return one of two constants, depending on the condition code */ -EXTERNFN vinfo_t* integer_conditional(PsycoObject* po, condition_code_t cc, - long immed_true, long immed_false); - -/* make a run-time copy of a vinfo_t */ -EXTERNFN vinfo_t* make_runtime_copy(PsycoObject* po, vinfo_t* v); - -PSY_INLINE int intlog2(long value) { - int counter = 0; - while ((1<array == NullArrayAt(rts->zero); -} - -#endif /* USE_RUNTIME_SWITCHES */ - - -/* The pseudo-exceptions meaning 'promote me' but against no particular - fixed_switch_t. The second one has the SkFlagPyObj flag. */ -EXTERNVAR c_promotion_t psyco_nonfixed_promotion; -EXTERNVAR c_promotion_t psyco_nonfixed_pyobj_promotion; - -/* The same, but detecting megamorphic sites, where many different run-time - values keep showing up. Promotion stop after MEGAMORPHIC_MAX different - values. */ -/*EXTERNVAR c_promotion_t psyco_nonfixed_promotion_mega;*/ -EXTERNVAR c_promotion_t psyco_nonfixed_pyobj_promotion_mega; - -#define MEGAMORPHIC_MAX 5 - -/* Check if the given virtual source is a promotion exception */ -EXTERNFN bool psyco_vsource_is_promotion(VirtualTimeSource source); - - -#endif /* _CODEGEN_H */ diff --git a/nodebox/ext/psyco/src/c/codemanager.c b/nodebox/ext/psyco/src/c/codemanager.c deleted file mode 100644 index 7b4141d..0000000 --- a/nodebox/ext/psyco/src/c/codemanager.c +++ /dev/null @@ -1,374 +0,0 @@ -#include "codemanager.h" -#include -#include "platform.h" - -/*** Allocators for Large Executable Blocks of Memory ***/ - -#define BUFFER_SIGNATURE 0xE673B506 /* arbitrary */ - -typedef struct codemanager_buf_s { - long signature; - char* position; - bool inuse; - struct codemanager_buf_s* next; -} codemanager_buf_t; - -static codemanager_buf_t* big_buffers = NULL; -static codemanager_buf_t* completed_big_buffers = NULL; - - -PSY_INLINE void check_signature(codemanager_buf_t* b) -{ - if (b->signature != BUFFER_SIGNATURE) - Py_FatalError("psyco: code buffer overwrite detected"); -} - -static void allocate_more_buffers(codemanager_buf_t** bb) -{ - static char plat_ok = 0; - char* p; - long allocated; - int num_bigblocks = 0; - - if (plat_ok != 'n') - { - /* try the platform-specific allocator */ - allocated = psyco_allocate_executable_buffer(BIG_BUFFER_SIZE, &p); - num_bigblocks = allocated / BIG_BUFFER_SIZE; - if (num_bigblocks <= 0) - { - /* failed */ - if (plat_ok == 0) - plat_ok = 'n'; /* doesn't work, don't try again */ - else - OUT_OF_MEMORY(); - } - else - plat_ok = 'y'; /* works */ - } - if (num_bigblocks <= 0) - { - p = (char*) PyMem_MALLOC(BIG_BUFFER_SIZE); - if (p == NULL) - OUT_OF_MEMORY(); - num_bigblocks = 1; - } - while (--num_bigblocks >= 0) - { - /* the codemanager_buf_t structure is put at the end of the buffer, - with its signature to detect overflows (just in case) */ -#define BUFFER_START_OFFSET (BIG_BUFFER_SIZE - sizeof(codemanager_buf_t)) - codemanager_buf_t* b; - b = (codemanager_buf_t*) (p + BUFFER_START_OFFSET); - b->signature = BUFFER_SIGNATURE; - b->position = p; - b->next = NULL; - /* insert 'b' at the end of the chained list */ - *bb = b; - bb = &b->next; - p += BIG_BUFFER_SIZE; - } -} - -static code_t* get_next_buffer(code_t** limit) -{ - codemanager_buf_t* b; - codemanager_buf_t** bb; - for (b=big_buffers; b!=NULL; b=b->next) - { - check_signature(b); - if (!b->inuse) - break; /* returns the first (oldest) unlocked buffer */ - } - - if (b == NULL) - { - /* no more free buffers, allocate one or a few new ones */ - for (bb=&big_buffers; *bb!=NULL; bb=&(*bb)->next) - ; - allocate_more_buffers(bb); - b = *bb; - } - b->inuse = true; - *limit = ((code_t*) b) - GUARANTEED_MINIMUM; - return (code_t*) b->position; -} - -DEFINEFN int psyco_locked_buffers(void) -{ - codemanager_buf_t* b; - int count = 0; - for (b=big_buffers; b!=NULL; b=b->next) - if (b->inuse) - count++; - return count; -} - -static void close_buffer_use(code_t* code) -{ - codemanager_buf_t* b; - for (b=big_buffers; b!=NULL; b=b->next) - { - check_signature(b); - if (b->position <= (char*) code && (char*) code <= (char*) b) - { - extra_assert(b->inuse); - ALIGN_NO_FILL(); - /* unlock the buffer */ - psyco_memory_usage += (char*) code - b->position; - b->position = (char*) code; - b->inuse = false; - - if (code > ((code_t*) b) - (BUFFER_MARGIN+2*GUARANTEED_MINIMUM)) - { - /* buffer nearly full, remove it from the chained list */ - codemanager_buf_t** bb; - for (bb=&big_buffers; *bb!=b; bb=&(*bb)->next) - ; - *bb = b->next; - /* add it to the list of completed buffers */ - b->next = completed_big_buffers; - completed_big_buffers = b; - } - return; - } - } - Py_FatalError("psyco: code buffer allocator corruption"); -} - - -static CodeBufferObject* new_code_buffer(PsycoObject* po, global_entries_t* ge, - code_t* proxy_to, code_t** plimit) -{ - CodeBufferObject* b; - code_t* limit; - psyco_trash_object(NULL); - if (plimit == NULL) - plimit = &limit; - - b = PyObject_New(CodeBufferObject, &CodeBuffer_Type); - if (b == NULL) - OUT_OF_MEMORY(); - if (proxy_to != NULL) - { - *plimit = NULL; - b->codestart = proxy_to; /* points inside another code buffer */ - SET_CODEMODE(b, "proxy"); - } - else - { - /* start a new code buffer */ - b->codestart = get_next_buffer(plimit); - SET_CODEMODE(b, "(compiling)"); - } - debug_printf(3, ("%s code buffer %p\n", - proxy_to==NULL ? "new" : "proxy", b->codestart)); - - fpo_mark_new(&b->snapshot); - if (po == NULL) - fpo_mark_unused(&b->snapshot); - else - { - if (is_respawning(po)) - Py_FatalError("psyco: internal bug: respawning in new_code_buffer()"); - fpo_build(&b->snapshot, po); - if (ge != NULL) - register_codebuf(ge, b); - po->respawn_cnt = 0; - po->respawn_proxy = b; - } - return b; -} - -DEFINEFN -CodeBufferObject* psyco_new_code_buffer(PsycoObject* po, global_entries_t* ge, code_t** plimit) -{ - return new_code_buffer(po, ge, NULL, plimit); -} - -DEFINEFN -CodeBufferObject* psyco_proxy_code_buffer(PsycoObject* po, global_entries_t* ge) -{ - return new_code_buffer(po, ge, po->code, NULL); -} - -#if 0 /* not used any more */ -DEFINEFN -CodeBufferObject* psyco_minimal_code_buffer(code_t* code) -{ - return new_code_buffer(NULL, NULL, code, NULL); -} -#endif - -#if 0 /* not used in this version */ -DEFINEFN -CodeBufferObject* psyco_new_code_buffer_size(int size) -{ - PyObject* o; - CodeBufferObject* b; - - /* PyObject_New is inlined */ - o = PyObject_MALLOC(sizeof(CodeBufferObject) + size); - if (o == NULL) - return (CodeBufferObject*) PyErr_NoMemory(); - b = (CodeBufferObject*) PyObject_INIT(o, &CodeBuffer_Type); - b->codestart = (code_t*) (b + 1); - b->po = NULL; - debug_printf(3, ("new_code_buffer_size(%d) %p\n", size, b->codestart)); - return b; -} -#endif - -#if CODE_DUMP -DEFINEVAR CodeBufferObject* psyco_codebuf_chained_list = NULL; -DEFINEVAR void** psyco_codebuf_spec_dict_list = NULL; -#endif - -DEFINEFN -void psyco_shrink_code_buffer(CodeBufferObject* obj, code_t* codeend) -{ - /* Note: "disassemble" will give a wrong size estimation if the buffer has - been split by END_CODE (which occurs very rarely) */ - debug_printf(3, ("disassemble %p %p (%d bytes)\n", obj->codestart, - codeend, codeend - ((code_t*)obj->codestart))); - if (VERBOSE_LEVEL == 2) - fprintf(stderr, "[%d]", codeend - ((code_t*)obj->codestart)); - - close_buffer_use(codeend); - SET_CODEMODE(obj, "normal"); - -#if CODE_DUMP - obj->chained_list = psyco_codebuf_chained_list; - psyco_codebuf_chained_list = obj; -#endif -} - -/* int psyco_tie_code_buffer(PsycoObject* po) */ -/* { */ -/* CodeBufferObject* b = po->respawn_proxy; */ -/* global_entries_t* ge = GET_UNUSED_SNAPSHOT(b->snapshot); */ -/* if (psyco_snapshot(b, po, ge)) */ -/* return -1; */ -/* po->respawn_cnt = 0; */ -/* return 0; */ -/* } */ - -DEFINEFN -void psyco_emergency_enlarge_buffer(code_t** pcode, code_t** pcodelimit) -{ - code_t* code = *pcode; - code_t* nextcode; - if (code - *pcodelimit > GUARANTEED_MINIMUM - MAXIMUM_SIZE_OF_FAR_JUMP) - Py_FatalError("psyco: code buffer overflowing"); - - nextcode = get_next_buffer(pcodelimit); - debug_printf(2, ("emergency enlarge buffer %p -> %p\n", code, nextcode)); - JUMP_TO(nextcode); - close_buffer_use(code); - - *pcode = insn_code_label(nextcode); -} - -#if CODE_DUMP -DEFINEFN -void psyco_dump_bigbuffers(FILE* f) -{ - codemanager_buf_t* b; - for (b = completed_big_buffers; b; b = b->next) - { - char* start = ((char*) b) - BUFFER_START_OFFSET; - size_t size = b->position-start; - fprintf(f, "BigBuffer 0x%lx %d\n", (long) start, size); - fwrite(start, 1, size, f); - } - for (b = big_buffers; b; b = b->next) - { - char* start = ((char*) b) - BUFFER_START_OFFSET; - size_t size = b->position-start; - fprintf(f, "BigBuffer 0x%lx %d\n", (long) start, size); - fwrite(start, 1, size, f); - if (b->inuse) - fprintf(stderr, "warning, BigBuffer at %p still in use\n", - b->position); - } -} -#endif - - -/*****************************************************************/ - -static PyObject* trashed = NULL; - -DEFINEFN -void psyco_trash_object(PyObject* obj) -{ - Py_XDECREF(trashed); - trashed = obj; -} - - -/*****************************************************************/ - -static PyObject* codebuf_repr(CodeBufferObject* self) -{ - char buf[100]; - sprintf(buf, "", - self->codestart, self); - return PyString_FromString(buf); -} - -static void codebuf_dealloc(CodeBufferObject* self) -{ -#if CODE_DUMP - CodeBufferObject** ptr = &psyco_codebuf_chained_list; -/*void** chain;*/ - while (*ptr != NULL) - { - if (*ptr == self) - { - *ptr = self->chained_list; - break; - } - ptr = &((*ptr)->chained_list); - } -/* for (chain = psyco_codebuf_spec_dict_list; chain; chain=(void**)*chain) */ -/* if (self->codestart < (code_t*)chain && (code_t*)chain <= self->codeend) */ -/* assert(!"releasing a code buffer with a spec_dict"); */ -#endif - debug_printf(3, ("releasing code buffer %p at %p\n", - self->codestart, self)); - fpo_release(&self->snapshot); - -/* #if defined(ALL_CHECKS) && defined(STORE_CODE_END) */ -/* if (self->codeend != NULL) */ -/* { */ -/* * do not actully release, to detect calls to released code * */ -/* * 0xCC is the breakpoint instruction (INT 3) * */ -/* memset(self->codestart, 0xCC, self->codeend - self->codeptr); */ -/* return; */ -/* } */ -/* #endif */ - - PyObject_Del(self); -} - -DEFINEVAR -PyTypeObject CodeBuffer_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "CodeBuffer", /*tp_name*/ - sizeof(CodeBufferObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)codebuf_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - (reprfunc)codebuf_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - 0, /*tp_call*/ -}; diff --git a/nodebox/ext/psyco/src/c/codemanager.h b/nodebox/ext/psyco/src/c/codemanager.h deleted file mode 100644 index 67e55cf..0000000 --- a/nodebox/ext/psyco/src/c/codemanager.h +++ /dev/null @@ -1,88 +0,0 @@ - /***************************************************************/ -/*** Support to manage the emitted code chunks ***/ - /***************************************************************/ - -#ifndef _CODEMANAGER_H -#define _CODEMANAGER_H - - -#include "psyco.h" -#include "dispatcher.h" - - -#define WARN_TOO_MANY_BUFFERS 6 /* to detect missing buffer unlocks */ - - -/* a CodeBufferObject is a pointer to emitted code. - The 'state' PsycoObject records the state of the compiler at - the start of the emission of code. Consider this field as private. - Future versions of the code manager will probably encode the recorded - states in a more sophisticated form than just a dump copy. - (There are usually a lot of small CodeBufferObjects, so if each - one has a full copy of the state big projects will explode the memory.) -*/ -struct CodeBufferObject_s { - PyObject_HEAD - void* codestart; - FrozenPsycoObject snapshot; - -#if CODE_DUMP - char* codemode; - CodeBufferObject* chained_list; -#endif -}; - -#if CODE_DUMP -EXTERNVAR CodeBufferObject* psyco_codebuf_chained_list; -EXTERNVAR void** psyco_codebuf_spec_dict_list; -EXTERNFN void psyco_dump_bigbuffers(FILE* f); -# define SET_CODEMODE(b, mode) ((b)->codemode = (mode)) -#else -# define SET_CODEMODE(b, mode) do { } while (0) /* nothing */ -#endif - - -#define CodeBuffer_Check(v) ((v)->ob_type == &CodeBuffer_Type) -EXTERNVAR PyTypeObject CodeBuffer_Type; - - -/* starts a new code buffer. The limit is returned in the optional last argument. - 'po' is the state of the compiler at this point, of which a - frozen copy will be made. It can be NULL. If not, set 'ge' as in - psyco_compile(). */ -EXTERNFN -CodeBufferObject* psyco_new_code_buffer(PsycoObject* po, global_entries_t* ge, code_t** plimit); - -/* creates a CodeBufferObject pointing to an already existing code target */ -EXTERNFN -CodeBufferObject* psyco_proxy_code_buffer(PsycoObject* po, global_entries_t* ge); - -#if 0 /* creates a minimal CodeBufferObject with only a code pointer */ -EXTERNFN -CodeBufferObject* psyco_minimal_code_buffer(code_t* code); -#endif - -/* shrink a buffer returned by new_code_buffer() */ -EXTERNFN -void psyco_shrink_code_buffer(CodeBufferObject* obj, code_t* codeend); - -/* emergency enlarge a buffer (by coding a jump to a new buffer) */ -EXTERNFN -void psyco_emergency_enlarge_buffer(code_t** pcode, code_t** pcodelimit); - -EXTERNFN -int psyco_locked_buffers(void); - -#define SHRINK_CODE_BUFFER(obj, nend, mode) do { \ - psyco_shrink_code_buffer(obj, nend); \ - SET_CODEMODE(obj, mode); \ -} while (0) - - -/* a replacement for Py_XDECREF(obj) which does not release the object - immediately, but only at the next call to psyco_trash_object() */ -EXTERNFN -void psyco_trash_object(PyObject* obj); - - -#endif /* _CODEMANAGER_H */ diff --git a/nodebox/ext/psyco/src/c/cstruct.c b/nodebox/ext/psyco/src/c/cstruct.c deleted file mode 100644 index da9f623..0000000 --- a/nodebox/ext/psyco/src/c/cstruct.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "cstruct.h" - - -DEFINEFN -PyObject* PyCStruct_New(size_t size, destructor d) -{ - cstruct_header_t* cs; - cs = (cstruct_header_t*) PyObject_Malloc(size); - if (cs == NULL) - OUT_OF_MEMORY(); - PyObject_INIT(cs, &PyCStruct_Type); - cs->cs_destructor = d; - cs->cs_key = NULL; - return (PyObject*) cs; -} - -static void cstruct_dealloc(cstruct_header_t* cs) -{ - if (cs->cs_destructor != NULL) - cs->cs_destructor((PyObject*) cs); - Py_XDECREF(cs->cs_key); - PyObject_Del((PyObject*) cs); -} - -static long cstruct_hash(cstruct_header_t* cs) -{ - /* loosing high bits is fine. This can't be -1 */ - if (cs->cs_key == NULL) - return (long)cs; - else - return (long)cs->cs_key; -} - -static PyObject* cstruct_richcmp(cstruct_header_t* o1, cstruct_header_t* o2, - int op) -{ - int c; - PyObject* result; - char* k1 = o1->cs_key ? (char*) o1->cs_key : (char*) o1; - char* k2 = o2->cs_key ? (char*) o2->cs_key : (char*) o2; - switch (op) { - case Py_EQ: c = k1 == k2; break; - case Py_NE: c = k1 != k2; break; - case Py_LT: c = k1 < k2; break; - case Py_LE: c = k1 <= k2; break; - case Py_GT: c = k1 > k2; break; - case Py_GE: c = k1 >= k2; break; - default: - Py_INCREF(Py_NotImplemented); - return Py_NotImplemented; - } - result = c ? Py_True : Py_False; - Py_INCREF(result); - return result; -} - - -DEFINEVAR -PyTypeObject PyCStruct_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "CStruct", /*tp_name*/ - sizeof(cstruct_header_t) /* + ??? */, /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)cstruct_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)cstruct_hash, /*tp_hash*/ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ - 0, /*tp_doc*/ - 0, /*tp_traverse*/ - 0, /*tp_clear*/ - (richcmpfunc)cstruct_richcmp, /*tp_richcompare*/ -}; - - -INITIALIZATIONFN -void psyco_cstruct_init(void) -{ - PyCStruct_Type.ob_type = &PyType_Type; -} diff --git a/nodebox/ext/psyco/src/c/cstruct.h b/nodebox/ext/psyco/src/c/cstruct.h deleted file mode 100644 index 048cb03..0000000 --- a/nodebox/ext/psyco/src/c/cstruct.h +++ /dev/null @@ -1,42 +0,0 @@ - /***************************************************************/ -/*** Turning general-purpose C structures into Python objects ***/ - /***************************************************************/ - -#ifndef _CSTRUCT_H -#define _CSTRUCT_H - - -#include "psyco.h" - - -#define PyCStruct_HEAD \ - PyObject_HEAD \ - destructor cs_destructor; \ - PyObject* cs_key; - -typedef struct { /* internal */ - PyCStruct_HEAD -} cstruct_header_t; - - -EXTERNVAR PyTypeObject PyCStruct_Type; - -#define PyCStruct_Check(op) PyObject_TypeCheck(op, &PyCStruct_Type) - -EXTERNFN PyObject* PyCStruct_New(size_t size, destructor d); -#define PyCStruct_NEW(TYPE, d) \ - ((TYPE*) PyCStruct_New(sizeof(TYPE), (destructor)(d))) - -/* lookup in the given dict for the item whose key is a CStruct with - the given key as cs_key */ -PSY_INLINE PyObject* PyCStruct_DictGet(PyObject* dict, PyObject* key) -{ - cstruct_header_t sample; - sample.ob_type = &PyCStruct_Type; - sample.ob_refcnt = 1; - sample.cs_key = key; - return PyDict_GetItem(dict, (PyObject*) &sample); -} - - -#endif /* _CSTRUCT_H */ diff --git a/nodebox/ext/psyco/src/c/depend.py b/nodebox/ext/psyco/src/c/depend.py deleted file mode 100644 index 19f854c..0000000 --- a/nodebox/ext/psyco/src/c/depend.py +++ /dev/null @@ -1,44 +0,0 @@ -import os, sys, files -from mkincl import * - -GCC = '/usr/bin/gcc' - -processor = sys.argv[1] - - -g = open('dyn-Makefile', 'w') -print >> g, "# automatically generated by depend.py" -print >> g -print >> g, "O_FILES =", - -basenames = [] -for f in files.SRC: - assert f.filename.endswith('.c') - basenames.append(f.filename[:-2]) -for f in files.PROCESSOR_SRC[processor]: - assert f.filename.endswith('.c') - basenames.append(processor + '/' + f.filename[:-2]) - -for fn in basenames: - print >> g, fn+'.o', -print >> g -print >> g - -for fn in basenames: - print fn - h = os.popen("%s -I%s %s -M -Wundef %s.c" % (GCC, processor, - INCLUDE_STR, fn), 'r') - data = h.read() - h.close() - data = data.replace('\\\n', ' ') - data = data[data.index(':')+1:] - data = data.strip().split() - data = map(os.path.normpath, data) - found = {} - print >> g, '%s.o:' % fn, - for f1 in data: - if f1 not in found and not f1.startswith('/'): - print >> g, f1, - found[f1] = 1 - print >> g - print >> g diff --git a/nodebox/ext/psyco/src/c/dispatcher.c b/nodebox/ext/psyco/src/c/dispatcher.c deleted file mode 100644 index 1ff444f..0000000 --- a/nodebox/ext/psyco/src/c/dispatcher.c +++ /dev/null @@ -1,2259 +0,0 @@ -#include "dispatcher.h" -#include "codemanager.h" -#include "mergepoints.h" -#include "blockalloc.h" -#include "Python/pycompiler.h" /* for pyc_data_xxx() */ -#include "Objects/pobject.h" /* for Psyco_SafelyDeleteVar() */ -#include - - - /***************************************************************/ -/*** Snapshots ***/ - /***************************************************************/ - - -#if !VLOCALS_OPC - -/* Store-by-copy: this implementation is kept around for reference. - See the "!VLOCALS_OPC" version of compatible_array(). -*/ - -PSY_INLINE void fz_build(FrozenPsycoObject* fpo, vinfo_array_t* aa) { - fpo->fz_vlocals = array_new(aa->count); - duplicate_array(fpo->fz_vlocals, aa); -} - -PSY_INLINE void fz_unfreeze(vinfo_array_t* aa, FrozenPsycoObject* fpo) { - assert_cleared_tmp_marks(fpo->fz_vlocals); - duplicate_array(aa, fpo->fz_vlocals); - clear_tmp_marks(fpo->fz_vlocals); -} - -PSY_INLINE void fz_release(FrozenPsycoObject* fpo) { - array_delete(fpo->fz_vlocals, NULL); -} - - /* invariant: all snapshot.fz_vlocals in the fatlist have - all their 'tmp' fields set to NULL. */ -PSY_INLINE void fz_check_invariant(FrozenPsycoObject* fpo) { - assert_cleared_tmp_marks(fpo->fz_vlocals); -} - -PSY_INLINE void fz_restore_invariant(FrozenPsycoObject* fpo) { - clear_tmp_marks(fpo->fz_vlocals); -} - -PSY_INLINE int fz_top_array_count(FrozenPsycoObject* fpo) { - return fpo->fz_vlocals->count; -} - -static void fz_find_rt1(vinfo_array_t* bb, fz_find_fn callback, - void* extra, bool clear -#if ALL_CHECKS - , vinfo_array_t* aa -#endif - ) -{ - int i = bb->count; - while (i--) - { - vinfo_t* b = bb->items[i]; - if (b != NULL && b->tmp != NULL) - { -#if ALL_CHECKS - extra_assert(i < aa->count); - if (is_runtime(b->source)) - extra_assert(aa->items[i] == b->tmp); -#endif - if (is_runtime(b->source)) - (*callback)(b->tmp, b->source, extra); - if (clear) - b->tmp = NULL; /* don't consider the same 'b' more than once */ - if (b->array != NullArray) - fz_find_rt1(b->array, callback, extra, clear -#if ALL_CHECKS - , aa->items[i]->array -#endif - ); - } - } -} - -DEFINEFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, - fz_find_fn callback, void* extra, bool clear) -{ - fz_find_rt1(fpo->fz_vlocals, callback, extra, clear -#if ALL_CHECKS - , aa -#endif - ); -} - - -#else /* if VLOCALS_OPC */ - -#define COMPRESS_COMPILETIME_SUBITEMS 0 - - -struct vcilink_s { - int time; - union { - vinfo_t* preva; - vinfo_t** fix; - void* data; - } v; - struct vcilink_s* next; -}; - -BLOCKALLOC_STATIC(vci, struct vcilink_s, 128) - -typedef struct { - /* pointers to an internal buffer for the creation of the pseudo-code - copies, as well as for lookups */ - signed char* buf_begin; - signed char* buf_end; - signed char* buf_opc; /* current opcode position */ - Source* buf_args; /* current opargs position */ - int tmp_counter; /* for links */ - struct vcilink_s* vcilink; /* pending links during decompression */ - struct vcilink_s sentinel; -} vcompat_internal_t; - -/* XXX Argh, a global variable -- this is (just) tolerable because the - algorithms depending on it are not re-entrent anyway. This lets us - share a global all-purpose buffer between the pseudo-code creation - and the lookups. */ -static vcompat_internal_t cmpinternal = { NULL, NULL }; - -static signed char* fz_internal_copy(vcompat_internal_t* current, int nsize) -{ - int opc_size = current->buf_end - current->buf_opc; - signed char* buf = (signed char*) PyMem_MALLOC(nsize); - if (buf == NULL) - OUT_OF_MEMORY(); - memcpy(buf, current->buf_begin, - ((signed char*) current->buf_args) - current->buf_begin); - memcpy(buf + nsize - opc_size, current->buf_opc, opc_size); - return buf; -} - -static void fz_internal_expand(void) -{ - signed char* nbuf; - int opc_size = cmpinternal.buf_end - cmpinternal.buf_opc; - int arg_size = ((signed char*) cmpinternal.buf_args) - cmpinternal.buf_begin; - int nsize = (cmpinternal.buf_end - cmpinternal.buf_begin) * 3 / 2; - if (nsize < 64) nsize = 64; - nbuf = fz_internal_copy(&cmpinternal, nsize); - if (cmpinternal.buf_begin != cmpinternal.buf_end) - PyMem_FREE(cmpinternal.buf_begin); - cmpinternal.buf_begin = nbuf; - cmpinternal.buf_end = nbuf + nsize; - cmpinternal.buf_opc = cmpinternal.buf_end - opc_size; - cmpinternal.buf_args = (Source*)(nbuf + arg_size); -} - -#define FZ_OPC_EXT (-1) -#define FZ_OPC_NULL (-2) -#define FZ_OPC_LINK (-3) /* and the following negative numbers */ - -/* Note: the pseudo-code is built in left-to-right array order, - but it is intended to be read backwards, thus uncompression creates - the arrays right-to-left. */ -PSY_INLINE void fz_putarg(Source arg) -{ - if (cmpinternal.buf_opc < (signed char*) (cmpinternal.buf_args+1)) - fz_internal_expand(); - *cmpinternal.buf_args++ = arg; -} - -PSY_INLINE void fz_putopc(int opc) -{ - if (!(-128 <= opc && opc < 128)) - { - fz_putarg((Source) opc); - opc = FZ_OPC_EXT; - } - if (cmpinternal.buf_opc == (signed char*) cmpinternal.buf_args) - fz_internal_expand(); - *--cmpinternal.buf_opc = opc; -} - -#if COMPRESS_COMPILETIME_SUBITEMS -static void fz_compress(vinfo_array_t* aa, bool nolinks) -{ - int i; - int length = aa->count; - /*while (length > 0 && aa->items[length-1] == NULL) - length--; ---- invalid optimization ---- */ - for (i=0; iitems[i]; - if (a == NULL) { - fz_putopc(FZ_OPC_NULL); /* emit FZ_OPC_NULL */ - } - else if (a->tmp != NULL) { - int prevcounter = (int) a->tmp; /* already seen, emit a link */ - fz_putopc(FZ_OPC_LINK - (cmpinternal.tmp_counter-prevcounter)); - } - else { - bool nosublinks = nolinks; - int length; - Source arg = a->source; - if (is_compiletime(arg)) - { - sk_incref(CompileTime_Get(arg)); - nosublinks = true; - } - ++cmpinternal.tmp_counter; - if (!nolinks) - a->tmp = (vinfo_t*) cmpinternal.tmp_counter; - length = a->array->count; - if (length) /* avoid recursive call if unneeded */ - fz_compress(a->array, nosublinks); /* store the subarray */ - fz_putarg(a->source); /* store the 'source' field */ - fz_putopc(length); /* store the length of the subarray */ - } - } -} -#else /* !COMPRESS_COMPILETIME_SUBITEMS */ -static void fz_compress(vinfo_array_t* aa) -{ - int i; - int length = aa->count; - /*while (length > 0 && aa->items[length-1] == NULL) - length--; ---- invalid optimization ---- */ - for (i=0; iitems[i]; - if (a == NULL) { - fz_putopc(FZ_OPC_NULL); /* emit FZ_OPC_NULL */ - } - else if (a->tmp != NULL) { - int prevcounter = (int) a->tmp; /* already seen, emit a link */ - fz_putopc(FZ_OPC_LINK - (cmpinternal.tmp_counter-prevcounter)); - } - else { - int length; - Source arg; - a->tmp = (vinfo_t*) (++cmpinternal.tmp_counter); - arg = a->source; - if (is_compiletime(arg)) - { - sk_incref(CompileTime_Get(arg)); - length = 0; - } - else - { - length = a->array->count; - if (length) /* avoid recursive call if unneeded */ - fz_compress(a->array); /* store the subarray */ - } - fz_putarg(a->source); /* store the 'source' field */ - fz_putopc(length); /* store the length of the subarray */ - } - } -} -#endif /* COMPRESS_COMPILETIME_SUBITEMS */ -/* Compression note: if we implement sharing of common initial segments - (which could save another 50% memory) we get better results by storing - the 'source' field *before* its sub-array. This will complicate - compatible_array() a bit. */ - -PSY_INLINE Source fz_getarg(void) -{ - return *--cmpinternal.buf_args; -} - -PSY_INLINE int fz_getopc(void) -{ - int result = *cmpinternal.buf_opc++; - if (result == FZ_OPC_EXT) - result = (int) fz_getarg(); - return result; -} - -static void fz_pushstack(int opc, void* ndata) -{ - int ntime = cmpinternal.tmp_counter + (FZ_OPC_LINK-opc); - struct vcilink_s** q; - struct vcilink_s* p = psyco_llalloc_vci(); - p->time = ntime; - p->v.data = ndata; - - /* Record the pending link by inserting it inon the vcilink linked list. - 'ntime' is the value that tmp_counter will have when the pending - item is found, so currently 'ntime >= tmp_counter'. - This linked list is sorted against the time, smallest time first. */ - q = &cmpinternal.vcilink; - while ((*q)->time < ntime) - q = &(*q)->next; - p->next = *q; /* insert new item at the correct position */ - *q = p; -} - -static void fz_uncompress(vinfo_array_t* result) -{ - int i = result->count; - while (i--) - { - vinfo_t* a; - int opc = fz_getopc(); - if (opc >= 0) { /* new item, potentially with its sub-array */ - a = vinfo_new_skref(fz_getarg()); - if (opc != 0) { /* test to make the common path (opc==0) faster */ - a->array = array_new(opc); - fz_uncompress(a->array); - } - } - else if (opc == FZ_OPC_NULL) { /* NULL */ - continue; /* there is already NULL in result->items[i] */ - } - else { /* link to an item not built yet */ - fz_pushstack(opc, &result->items[i]); - continue; - } - - /* At this point we have a real item to store into the array */ - while (cmpinternal.tmp_counter == cmpinternal.vcilink->time) - { - struct vcilink_s* p = cmpinternal.vcilink; - cmpinternal.vcilink = p->next; - /* resolve link */ - vinfo_incref(a); - *p->v.fix = a; - psyco_llfree_vci(p); - } - cmpinternal.tmp_counter++; - result->items[i] = a; - } -} - -static void fz_parse(int length, bool clear) -{ /* highly simplified version of fz_uncompress() that does nothing */ - extra_assert(length >= 0); - while (length--) - { - int opc = fz_getopc(); - if (opc >= 0) - { - Source arg = fz_getarg(); - fz_parse(opc, clear); - if (clear && is_compiletime(arg)) - sk_decref(CompileTime_Get(arg)); - } - } -} - -static void fz_find_rt1(vinfo_array_t* aa, int length, - fz_find_fn callback, void* extra) -{ /* simplified version of fz_uncompress() that does not build anything */ - extra_assert(length >= 0); - while (length--) - { - int opc = fz_getopc(); - if (opc >= 0) - { - vinfo_t* a; - Source source = fz_getarg(); - if (is_compiletime(source)) - { - /* no run-time value should exist under a compile-time one */ - extra_assert(aa == NULL || length < aa->count); - if (opc > 0) - fz_find_rt1(NULL, opc, NULL, NULL); - } - else - { - extra_assert(aa != NULL && length < aa->count); - a = aa->items[length]; - if (is_runtime(source)) - (*callback)(a, source, extra); - if (opc > 0) - fz_find_rt1(a->array, opc, callback, extra); - } - } - } -} - -PSY_INLINE void fz_load_fpo(FrozenPsycoObject* fpo) { - cmpinternal.buf_opc = (signed char*) fpo->fz_vlocals_opc; - cmpinternal.buf_args = fpo->fz_vlocals_opc; -} - -DEFINEFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, - fz_find_fn callback, void* extra, bool clear) -{ - fz_load_fpo(fpo); - fz_find_rt1(aa, fz_getopc(), callback, extra); -} - -PSY_INLINE void fz_build(FrozenPsycoObject* fpo, vinfo_array_t* aa) -{ - int opc_size, arg_size; - signed char* nbuf; - cmpinternal.buf_opc = cmpinternal.buf_end; - cmpinternal.buf_args = (Source*) cmpinternal.buf_begin; - cmpinternal.tmp_counter = 0; - clear_tmp_marks(aa); -#if COMPRESS_COMPILETIME_SUBITEMS - fz_compress(aa, false); -#else - fz_compress(aa); -#endif - fz_putopc(aa->count); - opc_size = cmpinternal.buf_end - cmpinternal.buf_opc; - arg_size = ((signed char*) cmpinternal.buf_args) - cmpinternal.buf_begin; - psyco_memory_usage += arg_size + opc_size + sizeof(CodeBufferObject); - nbuf = fz_internal_copy(&cmpinternal, arg_size + opc_size); - fpo->fz_vlocals_opc = (Source*) (nbuf + arg_size); -} - -PSY_INLINE void fz_load_fpo_stack(FrozenPsycoObject* fpo) { - fz_load_fpo(fpo); - cmpinternal.tmp_counter = 0; - cmpinternal.vcilink = &cmpinternal.sentinel; - cmpinternal.sentinel.time = INT_MAX; /* sentinel */ -} - -PSY_INLINE int fz_top_array_count(FrozenPsycoObject* fpo) { - int result; - if (fpo->fz_vlocals_opc == NULL) - return 0; - fz_load_fpo(fpo); - result = fz_getopc(); - extra_assert(result >= 0); - return result; -} - -PSY_INLINE void fz_unfreeze(vinfo_array_t* aa, FrozenPsycoObject* fpo) { - fz_load_fpo_stack(fpo); - aa->count = fz_getopc(); - fz_uncompress(aa); - /* no more pending link should be left */ - extra_assert(cmpinternal.vcilink == &cmpinternal.sentinel); -} - -PSY_INLINE void fz_release(FrozenPsycoObject* fpo) { - if (fpo->fz_vlocals_opc != NULL) - { - fz_load_fpo(fpo); - fz_parse(fz_getopc(), true); /* find the beginning of the pseudo-code */ - PyMem_FREE(cmpinternal.buf_args); - } -} - -PSY_INLINE void fz_check_invariant(FrozenPsycoObject* fpo) { -} - -PSY_INLINE void fz_restore_invariant(FrozenPsycoObject* fpo) { -} - - -#endif /* VLOCALS_OPC */ - - -#if !ALL_STATIC - DEFINEFN int psyco_top_array_count(FrozenPsycoObject* fpo) /*for psyco.c*/ - { return fz_top_array_count(fpo); } -#endif - - - /***************************************************************/ - -DEFINEFN -void fpo_build(FrozenPsycoObject* fpo, PsycoObject* po) -{ - psyco_assert_coherent1(po, false); - clear_tmp_marks(&po->vlocals); - fz_build(fpo, &po->vlocals); - fpo->fz_stuff.fz_stack_depth = po->stack_depth; - SAVE_PROCESSOR_FROZENOBJECT(fpo, po); - fpo->fz_pyc_data = pyc_data_new(&po->pr); -} - -DEFINEFN -void fpo_release(FrozenPsycoObject* fpo) -{ - if (fpo->fz_pyc_data != NULL) - pyc_data_delete(fpo->fz_pyc_data); - fz_release(fpo); -} - -static void fpo_find_regs_array(vinfo_array_t* source, PsycoObject* po) -{ -#if HAVE_CCREG - condition_code_t cc; -#endif - int i = source->count; - while (i--) - { - vinfo_t* a = source->items[i]; - if (a != NULL) - { - Source src = a->source; -#if REG_TOTAL > 0 - if (is_runtime(src) && !is_reg_none(src)) - REG_NUMBER(po, getreg(src)) = a; - else -#endif -#if HAVE_CCREG - if ((cc = psyco_vsource_cc(src)) != CC_ALWAYS_FALSE) - po->ccregs[INDEX_CC(cc)] = a; - else -#endif - /* nothing */ ; - if (a->array != NullArray) - fpo_find_regs_array(a->array, po); - } - } -} - -DEFINEFN -PsycoObject* fpo_unfreeze(FrozenPsycoObject* fpo) -{ - /* rebuild a PsycoObject from 'this' */ - PsycoObject* po = PsycoObject_New(fz_top_array_count(fpo)); - po->stack_depth = get_stack_depth(fpo); - RESTORE_PROCESSOR_FROZENOBJECT(fpo, po); - fz_unfreeze(&po->vlocals, fpo); - fpo_find_regs_array(&po->vlocals, po); - frozen_copy(&po->pr, fpo->fz_pyc_data); - pyc_data_build(po, psyco_get_merge_points(po->pr.co, -1)); - psyco_assert_coherent(po); - return po; -} - - -/***************************************************************** - * Respawning is restoring a frozen compiler state into a live - * PsycoObject and restarting the compilation. It will produce - * exactly the same code up to a given point. This point was - * a jump in the run-time code, pointing to code that we did - * not compile yet. The purpose of 'replaying' the compilation - * is to rebuild exactly the same state as the compiler had when - * it emitted the jump instruction in the first place. At this - * point we can go on with the real compilation of the missing - * code. - * - * This is all based on the idea that we want to avoid tons - * of copies of PsycoObjects all around for all pending - * compilation branches, and there are a lot of them -- e.g. all - * instructions that could trigger an exception have such a - * (generally uncompiled) branch. - *****/ - -typedef struct respawn_s { - CodeBufferObject* self; - void* write_jmp; - int respawn_cnt; - CodeBufferObject* respawn_from; -} respawn_t; - -static code_t* do_respawn(respawn_t* rs) -{ - /* called when entering a not-compiled branch requiring a respawn */ - code_t* code; - CodeBufferObject* firstcodebuf; - CodeBufferObject* codebuf; - PsycoObject* po; - - /* we might have a chain of code buffers, each containing a conditional - jump to the next one. It ends with a proxy (not-yet-compiled) calling - the function do_respawn(). - - +----------+ - | ... | - | Jcond -----------> +----------+ - | ... | | ... | - +----------+ | Jcond -----------> +-----------------+ - | ... | | CALL do_respawn | - +----------+ +-----------------+ - - The structure 'rs' is stored in the last block (the proxy). - 'rs->respawn_from' is the previous code buffer. - 'rs->respawn_from->snapshot.fz_respawned_from' is the previous one. - etc. - */ - int respawn_cnt = rs->respawn_cnt; - /* find the first code buffer in the chain */ - for (firstcodebuf = rs->respawn_from; - firstcodebuf->snapshot.fz_respawned_from != NULL; - firstcodebuf = firstcodebuf->snapshot.fz_respawned_from) - respawn_cnt = firstcodebuf->snapshot.fz_respawned_cnt; - /* respawn there */ - po = fpo_unfreeze(&firstcodebuf->snapshot); - - codebuf = psyco_new_code_buffer(NULL, NULL, &po->codelimit); - codebuf->snapshot.fz_stuff.respawning = rs; - codebuf->snapshot.fz_respawned_cnt = rs->respawn_cnt; - codebuf->snapshot.fz_respawned_from = firstcodebuf; - po->code = insn_code_label(codebuf->codestart); - /* respawn by restarting the Python compiler at the beginning of the - instruction where it left. It will probably re-emit a few machine - instructions -- not needed, they will be trashed, but this has - rebuilt the correct PsycoObject state. This occurs when eventually - a positive detect_respawn() is issued. */ - po->respawn_cnt = - respawn_cnt; - po->respawn_proxy = codebuf; - - code = GLOBAL_ENTRY_POINT(po); - - SHRINK_CODE_BUFFER(codebuf, code, "respawned"); - /* make sure detect_respawn() succeeded */ - psyco_assert(codebuf->snapshot.fz_respawned_from == rs->respawn_from); - - /* fix the jump to point to 'codebuf->codestart' */ - change_cond_jump_target(rs->write_jmp, (code_t*)codebuf->codestart); - - /* cannot Py_DECREF(cp->self) because the current function is returning into - that code now, but any time later is fine: use the trash of codemanager.c */ - psyco_trash_object((PyObject*) rs->self); - dump_code_buffers(); - /* XXX don't know what to do with this reference to codebuf */ - return codebuf->codestart; -} - -DEFINEFN -void psyco_respawn_detected(PsycoObject* po) -{ - /* this is called when detect_respawn() succeeds. We can now proceed - to the next code block in the picture above. When we reach the - last one, it means we are about to compile the 'special' branch of - a conditional jump -- the one that is not compiled yet. - */ - CodeBufferObject* codebuf = po->respawn_proxy; - CodeBufferObject* current = codebuf->snapshot.fz_respawned_from; - respawn_t* rs = codebuf->snapshot.fz_stuff.respawning; - - /* 'codebuf' is the new block we are writing. - 'current' is the block we are currently respawning. - 'rs->respawn_from' is the last block before the proxy calling - do_respawn(). */ - if (current == rs->respawn_from) - { - /* respawn finished */ - extra_assert(fz_top_array_count(&codebuf->snapshot) == 0); - fpo_build(&codebuf->snapshot, po); - } - else - { - /* proceed to the next block */ - CodeBufferObject* nextblock; - int respawn_cnt = rs->respawn_cnt; - for (nextblock = rs->respawn_from; - nextblock->snapshot.fz_respawned_from != current; - nextblock = nextblock->snapshot.fz_respawned_from) - respawn_cnt = nextblock->snapshot.fz_respawned_cnt; - codebuf->snapshot.fz_respawned_from = nextblock; - po->respawn_cnt = - respawn_cnt; - } - /* restart at the beginning of the buffer, overriding the code written - so far. XXX when implementing freeing of code, be careful that this - lost code does not looses references to other objects as well. - Use is_respawning() to bypass the creation of all references when - compiling during respawn. */ - po->code = (code_t*) codebuf->codestart; - INIT_CODE_EMISSION(po->code); -} - -DEFINEFN -void* psyco_prepare_respawn_ex(PsycoObject* po, condition_code_t jmpcondition, - void* fn, int extrasize) -{ - /* ignore calls to psyco_prepare_respawn() while currently respawning */ - if (!is_respawning(po)) - { - char* closure; - respawn_t* rs; - code_t* calling_code; - code_t* calling_limit; - code_t* limit; - CodeBufferObject* codebuf = psyco_new_code_buffer(NULL, NULL, &limit); - - extra_assert((int)jmpcondition < CC_TOTAL); - - /* the proxy contains only a jump to do_respawn, - followed by a respawn_t structure */ - calling_code = po->code; - calling_limit = po->codelimit; - po->code = insn_code_label(codebuf->codestart); - po->codelimit = limit; - closure = (char*) psyco_call_code_builder(po, fn, true, SOURCE_DUMMY); - rs = (respawn_t*) (closure+extrasize); - SHRINK_CODE_BUFFER(codebuf, (code_t*)(rs+1), "respawn"); - /* fill in the respawn_t structure */ - extra_assert(po->respawn_proxy != NULL); - rs->self = codebuf; - rs->respawn_cnt = po->respawn_cnt; - rs->respawn_from = po->respawn_proxy; - - /* write the jump to the proxy */ - po->code = calling_code; - po->codelimit = calling_limit; - psyco_resolved_cc(po, INVERT_CC(jmpcondition)); /* no jump => cond false */ - rs->write_jmp = conditional_jump_to(po, (code_t*)codebuf->codestart, - jmpcondition); - dump_code_buffers(); - return closure; - } - else - { - /* respawning: come back at the - beginning of the trash memory for - the next instructions */ - po->code = (code_t*) po->respawn_proxy->codestart; - INIT_CODE_EMISSION(po->code); - return NULL; - } -} - -DEFINEFN -bool psyco_prepare_respawn(PsycoObject* po, condition_code_t jmpcondition) -{ - if (detect_respawn(po)) return true; - psyco_prepare_respawn_ex(po, jmpcondition, &do_respawn, 0); - return false; -} - -DEFINEFN -code_t* psyco_do_respawn(void* arg, int extrasize) -{ - respawn_t* rs = (respawn_t*)(((char*) arg) + extrasize); - return do_respawn(rs); -} - -DEFINEFN -code_t* psyco_dont_respawn(void* arg, int extrasize) -{ - respawn_t* rs = (respawn_t*)(((char*) arg) + extrasize); - return resume_after_cond_jump(rs->write_jmp); -} - -DEFINEFN -int runtime_NON_NULL_f(PsycoObject* po, vinfo_t* vi) -{ - condition_code_t cc = integer_NON_NULL(po, vi); - return cc == CC_ERROR ? -1 : runtime_condition_f(po, cc); -} - -DEFINEFN -int runtime_NON_NULL_t(PsycoObject* po, vinfo_t* vi) -{ - condition_code_t cc = integer_NON_NULL(po, vi); - return cc == CC_ERROR ? -1 : runtime_condition_t(po, cc); -} - -DEFINEFN -int runtime_in_bounds(PsycoObject* po, vinfo_t* vi, - long lowbound, long highbound) -{ - condition_code_t cc; - if (highbound == LONG_MAX) - { - if (lowbound == LONG_MIN) - return 1; - cc = integer_cmp_i(po, vi, lowbound, Py_GE); - } - else if (lowbound == 0) - { - cc = integer_cmp_i(po, vi, highbound, Py_LE | COMPARE_UNSIGNED); - } - else - { - if (lowbound != LONG_MIN) - { - cc = integer_cmp_i(po, vi, lowbound, Py_GE); - if (cc == CC_ERROR) - return -1; - if (!runtime_condition_t(po, cc)) - return 0; - } - cc = integer_cmp_i(po, vi, highbound, Py_LE); - } - return cc == CC_ERROR ? -1 : runtime_condition_t(po, cc); -} - - -DEFINEFN -void PsycoObject_EmergencyCodeRoom(PsycoObject* po) -{ - if (!is_respawning(po)) - { - /* non-respawning case: start a new buffer, and code a JMP at - the end of the current buffer. Note that it is exceptional - to reach this point. Normally, pycompiler.c regularly checks - that we are not reaching the end of the buffer, and if so, - pauses compilation. */ - psyco_emergency_enlarge_buffer(&po->code, &po->codelimit); - } - else - { - /* respawning case: trash everything written so far */ - po->code = (code_t*) po->respawn_proxy->codestart; - INIT_CODE_EMISSION(po->code); - } -} - - -/*****************************************************************/ - -#if !VLOCALS_OPC - -/* This implementation should probably not be used any more, but it - is kept around for reference. Once you understand the comparison - algorithm below you can read its more obscure implementation of - the VLOCALS_OPC case. -*/ -static bool compatible_array(vinfo_array_t* aa, vinfo_array_t* bb, - vinfo_array_t** result) -{ - /* 'aa' is the array from the live PsycoObject. 'bb' is from the snapshop. - Test for compatibility. More precisely, it must be allowable for the - living state 'aa' to jump back to the code already produced for the - state 'bb'. There might be more information in 'aa' than in 'bb' (which - will then just be discarded), but the converse is not allowable. - Moreover, if two slots in the arrays point to the same vinfo_t in 'bb', - they must also do so in 'aa' because the code compiled from 'bb' might - have used this fact. Conversely, shared pointers in 'aa' need *not* be - shared any more in 'bb'. - - The sharing rule only applies to run-time values: for compile-time and - virtual-time values, being shared or not is irrelevant to the compilation - process. - - Return value of compatible_array(): false if incompatible, otherwise - fills the 'result' array with the variables to un-promote. - */ - int i; - int count = bb->count; - if (aa->count != count) - { - if (aa->count < count) /* array too short; ok only if the extra items */ - { /* in 'bb' are all NULL. */ - for (i=aa->count; iitems[i] != NULL) - return false; /* differs */ - count = aa->count; - } - else /* array too long */ - { -#if 0 - /* the extra items in 'aa' must pass the test (b == NULL) below. */ - for (i=aa->count; i>count; ) - { - vinfo_t* a = aa->items[--i]; - if (a != NULL && is_compiletime(a->source) && - ((KNOWN_SOURCE(a)->refcount1_flags & SkFlagFixed) != 0)) - return false; /* incompatible */ - } -#else - /* the extra items in 'aa' must all be NULL. This is not strictly - necessary for a compatibility (the above condition is more - precise) but I guess that you get better results this way, - because you have more information for a recompilation. - XXX This assumption should be tested. - XXX What about requiring that no NULL goes non-NULL in the - rest of the array as well? */ - for (i=aa->count; i>count; ) - if (aa->items[--i] != NULL) - return false; /* differs */ -#endif - } - } - for (i=0; iitems[i]; - vinfo_t* b = bb->items[i]; - if (b == NULL) - { - /* if b == NULL, any value in 'a' is ok -- - with the exception of a fixed compile-time value, as - created by a promotion. Without the following test, - Psyco sometimes emits an infinite loop because the - PsycoObject after promotion is found to be compatible - with itself just before promotion. */ - if (a != NULL && is_compiletime(a->source) && - ((KNOWN_SOURCE(a)->refcount1_flags & SkFlagFixed) != 0)) - goto incompatible; - } - else - { - long diff; - /* we store in the 'tmp' fields of the 'bb' arrays pointers to the - vinfo_t that matched in 'aa'. We assume that all 'tmp' fields - are NULL initially. If, walking in the 'bb' arrays, we encounter - the same 'b' several times, we use these 'tmp' pointers to make - sure they all matched the same 'a'. */ - if (b->tmp != NULL) - { - /* This 'b' has already be seen. */ - if (b->tmp == a) - continue; /* quotient graph */ - - /* at this point, the graph 'aa' is not a quotient of the - graph 'bb', i.e. two nodes are shared in 'bb' but not - in 'aa'. This is not acceptable if it is a run-time - value, or if it is a virtual-time value whose identity - matters. */ - switch (gettime(b->source)) - { - case RunTime: - goto incompatible; - - case VirtualTime: - if (SVIRTUAL_MUTABLE(VirtualTime_Get(b->source))) - goto incompatible; - break; - - default: - ; - } - } - - /* A new 'b', let's check if its 'a' matches. */ - if (a == NULL) - goto incompatible; /* NULL not compatible with non-NULL */ - b->tmp = a; - diff = ((long)a->source) ^ ((long)b->source); - if (diff != 0) - { - if ((diff & TimeMask) != 0) - goto incompatible; /* not the same TIME_MASK */ - if (is_runtime(a->source)) - { - if ((diff & RunTime_NoRef) != 0) - { - /* from 'with ref' to 'without ref' or vice-versa: - a source in 'a' with reference cannot pass for - a source in 'b' without reference */ - if ((a->source & RunTime_NoRef) == 0) - goto incompatible; - } - } - else - { - if (is_virtualtime(a->source)) - goto incompatible; /* different virtual sources */ - if (KNOWN_SOURCE(a)->value != KNOWN_SOURCE(b)->value) - { - if ((KNOWN_SOURCE(b)->refcount1_flags & - SkFlagFixed) != 0) - goto incompatible; /* b's value is fixed */ - if ((KNOWN_SOURCE(a)->refcount1_flags & - SkFlagFixed) != 0 && KNOWN_SOURCE(a)->value == 0) - goto incompatible; /* hack: */ - /* fixed known-to-be-zero values have a special - role to play with local variables: undefined - variables. These must *never* be un-promoted - to run-time, because we will get a NULL - pointer and a segfault. Argh. */ - else { - /* approximative match, might un-promote 'a' from - compile-time to run-time. */ - /*fprintf(stderr, "psyco: compatible_array() with vinfo_t* a=%p, b=%p\n", a, b);*/ - int i, ocount = (*result)->count; - /* do not add several time the same value to the array */ - for (i=0; iitems[i] == a) - break; - if (i==ocount) - { - *result = array_grow1(*result, ocount+1); - (*result)->items[ocount] = a; - } - } - } - } - } - if (a->array != b->array) /* can only be equal if both ==NullArray */ - { - if (is_compiletime(a->source)) - { - /* For compile-time values we don't bother comparing - subarrays, because they only have a caching role - in this case; they should never contain information - different from what psyco_get_field() can load or - reload from immutable data. */ -#if PSYCO_DEBUG - /* we just verify that there are only compile-time - subitems. */ - int j; - for (j=0; jarray->count; j++) - extra_assert(a->array->items[j] == NULL || - is_compiletime(a->array->items[j]->source)); - for (j=0; jarray->count; j++) - extra_assert(b->array->items[j] == NULL || - is_compiletime(b->array->items[j]->source)); -#endif - } - else - if (!compatible_array(a->array, b->array, result)) - goto incompatible; - } - } - } - return true; - - incompatible: /* we have to reset the 'tmp' fields to NULL, - but only as far as we actually progressed */ - for (; i>=0; i--) - if (bb->items[i] != NULL) - { - bb->items[i]->tmp = NULL; - if (bb->items[i]->array != NullArray) - clear_tmp_marks(bb->items[i]->array); - } - return false; -} - -PSY_INLINE bool fz_compatible_array(vinfo_array_t* aa, FrozenPsycoObject* fpo, - vcompatible_t* result) { - return compatible_array(aa, fpo->fz_vlocals, &result->diff); -} - - -#else /* if VLOCALS_OPC */ - -/* forward */ -static bool compatible_array(vinfo_array_t* aa, int count, - vinfo_array_t** result, vinfo_array_t* reference, - int recdepth); -#if COMPRESS_COMPILETIME_SUBITEMS -static void skip_compatible_array(int count); -#endif - -static bool compatible_vinfo(vinfo_t* a, Source bsource, int bcount, - vinfo_array_t** result, vinfo_t* aref, - int recdepth) -{ - /* Check if 'a' matches 'bsource'. */ - long diff; - /*bool skip_subarray = false;*/ - - /* If 'aref!=a' then 'aref' is a vinfo_t* that already passed the test - against the same 'bsource'. In this case there is an extra test: - as the two nodes 'a' and 'aref' are not shared in 'aa', but shared - in 'bb', then they must not be run-time sources, because the - compiler could have used this fact when compiling from 'bb' - (typically, this single value was in a single register). Nor can - they be mutable virtual-time values, for identity reasons. */ - if (a != aref) - switch (gettime(bsource)) - { - case RunTime: - return false; - - case VirtualTime: - if (SVIRTUAL_MUTABLE(VirtualTime_Get(bsource))) - return false; - break; - - default: - ; - } - - /* invariant */ - extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); - - if (a == NULL) - return false; /* NULL not compatible with non-NULL */ - diff = ((long)a->source) ^ ((long)bsource); - if (diff != 0) - { - if ((diff & TimeMask) != 0) - return false; /* not the same TIME_MASK */ - - switch (gettime(a->source)) { - - case RunTime: - if ((diff & (RunTime_NoRef|RunTime_NonNeg|RunTime_Megamorphic)) != 0) - { - /* from 'with ref' to 'without ref' or vice-versa: - a source in 'a' with reference cannot pass for - a source in 'b' without reference */ - if ((a->source & RunTime_NoRef) == 0 && - ( bsource & RunTime_NoRef) != 0) - return false; - /* from 'non-negative' to 'possibly negative' or vice-versa: - a source in 'a' which may be negative cannot pass for - a source in 'b' which cannot */ - if ((a->source & RunTime_NonNeg) == 0 && - ( bsource & RunTime_NonNeg) != 0) - return false; - /* a source in 'a' which is flagged as megamorphic should - not fall back to a source in 'b' which is not */ - if ((a->source & RunTime_Megamorphic) != 0 && - ( bsource & RunTime_Megamorphic) == 0) - return false; - } - break; - - case CompileTime: - if (CompileTime_Get(a->source)->value != CompileTime_Get(bsource)->value) - { - if ((CompileTime_Get(bsource)->refcount1_flags & - SkFlagFixed) != 0) - return false; /* b's value is fixed */ - if ((CompileTime_Get(a->source)->refcount1_flags & - SkFlagFixed) != 0 && CompileTime_Get(a->source)->value == 0) - return false; /* hack: */ - /* fixed known-to-be-zero values have a special - role to play with local variables: undefined - variables. These must *never* be un-promoted - to run-time, because we will get a NULL - pointer and a segfault. Argh. */ - else { - /* approximative match, might un-promote 'a' from - compile-time to run-time. */ - int i, ocount = (*result)->count; - /* do not add several time the same value to the array */ - for (i=0; iitems[i] == a) - break; - if (i==ocount) - { - *result = array_grow1(*result, ocount+1); - (*result)->items[ocount] = a; - } - } - } - /*else - skip_subarray = true;*/ - break; - - default: /* case VirtualTime */ - return false; /* different virtual sources */ - } - } - /*else - skip_subarray = is_compiletime(bsource);*/ - - if (bcount == 0 && a->array == NullArray) - return true; /* shortcut */ - -#if COMPRESS_COMPILETIME_SUBITEMS - if (/*skip_subarray*/ is_compiletime(bsource)) - { - /* For compile-time values we don't bother comparing - subarrays, because they only have a caching role - in this case; they should never contain information - different from what psyco_get_field() can load or - reload from immutable data. */ -#if PSYCO_DEBUG - /* we just verify that there are only compile-time - subitems. */ - int j; - for (j=0; jarray->count; j++) - extra_assert(a->array->items[j] == NULL || - is_compiletime(a->array->items[j]->source)); -#endif - /* skip the subarray in the pseudo-code */ - skip_compatible_array(bcount); - return true; - } -#else /* !COMPRESS_COMPILETIME_SUBITEMS */ - if (is_compiletime(bsource)) - { - extra_assert(bcount == 0); - return true; - } -#endif /* COMPRESS_COMPILETIME_SUBITEMS */ - - return compatible_array(a->array, bcount, result, aref->array, recdepth+1); -} - -/* The following function is the composition of fz_uncompress() and - the above compatible_array(), optimized so that we need not build - a whole uncompressed copy of the pseudo-code. */ -static bool compatible_array(vinfo_array_t* aa, int count, - vinfo_array_t** result, vinfo_array_t* reference, - int recdepth) -{ - /* In the following comments, 'bb' refers to the implicit intermediate - array that would be created by fz_uncompress(). */ - /* 'reference' is a either 'aa', or another array of items that already - passed the test against the same pseudo-code. This lets us check - shared structures. */ - - /* special-case test. See comments below. */ -#define CHECK_FOR_NULL(a) \ - if (a != NULL) { \ - /* if there is no proved progress, and 'a' \ - might just have been promoted, \ - then we have to let compilation go on */ \ - if (*result == NullArray && \ - is_compiletime(a->source) && \ - ((CompileTime_Get(a->source)->refcount1_flags & SkFlagFixed) != 0)) \ - return false; \ - /* if we are not too deep in the array, then we might as \ - well try compiling with this extra information */ \ - if (recdepth <= 2) \ - return false; \ - } - - int i; - /* count = bb->count; */ - extra_assert(count >= 0); - if (aa->count != count) - { - if (aa->count < count) /* array too short; ok only if the extra items */ - { /* in 'bb' are all NULL. */ - do { - if (fz_getopc() != FZ_OPC_NULL) - return false; /* differs */ - } while (aa->count < --count); - } - else /* array too long */ - { - /* the extra items in 'aa' must all be NULL. This is not strictly - necessary for a compatibility (the above condition is more - precise) but I guess that you get better results this way, - because you have more information for a recompilation. - XXX This assumption should be tested. */ - - /* This potentially allows for unbounded array depth, - so we disable it after a given depth and revert to the - old behavior: all extra items are matched against b == NULL - life below. */ - for (i=aa->count; i>count; ) - { - vinfo_t* a = aa->items[--i]; - CHECK_FOR_NULL(a) - } - } - } - for (i=count; i--; ) - { - int opc = fz_getopc(); - vinfo_t* a = aa->items[i]; - - /* invariant */ - extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); - - if (opc == FZ_OPC_NULL) /* 'b' is NULL */ - { - /* if b == NULL, any value in 'a' is ok -- - with the exception of a fixed compile-time value, as - created by a promotion. Without the following test, - Psyco sometimes emits an infinite loop because the - PsycoObject after promotion is found to be compatible - with itself just before promotion. */ - CHECK_FOR_NULL(a) - } - else if (opc < 0) /* 'b' is a link to another 'b'. */ - { - /* We cannot compare right now the 'a' with the corresponding 'b' - because we do not know it yet. We record the comparison as - "to be done later" in the linked list. */ - if (a == NULL) - return false; /* shortcut: cannot match later */ - fz_pushstack(opc, a); - } - else /* 'b' is a vinfo_t */ - { - Source bsource = fz_getarg(); - - /* Save the current position (resolving links require backtracking) */ - signed char* saved_buf_opc = cmpinternal.buf_opc; - Source* saved_buf_args = cmpinternal.buf_args; - int saved_tmp_counter = cmpinternal.tmp_counter; - - /* Compare 'a' and 'bsource'. */ - extra_assert(i < reference->count); - if (!compatible_vinfo(a, bsource, opc, result, reference->items[i], - recdepth)) - return false; - - /* Only after the above call we know if any link previously pending - link just resolved into the current 'b'. */ - if (cmpinternal.tmp_counter == cmpinternal.vcilink->time) - { - bool ok = true; - struct vcilink_s* pending = NULL; /* links that resolve to 'b' */ - struct vcilink_s* p; - vinfo_t* preva; - - while (1) { - /* Move all links with the current time to 'pending' */ - while (cmpinternal.tmp_counter == cmpinternal.vcilink->time) - { - p = cmpinternal.vcilink; - cmpinternal.vcilink = p->next; - p->next = pending; - pending = p; - } - extra_assert(cmpinternal.tmp_countertime); - if (!pending) - break; /* done */ - - /* Resolve the next link */ - shortcut1: - p = pending; - pending = p->next; - preva = p->v.preva; - psyco_llfree_vci(p); - - /* First check if the same link is found later in the - linked list, and ignore it if so (optimization). */ - for (p = pending; p; p=p->next) - if (p->v.preva == preva) - goto shortcut1; - - if (ok && preva != a) - { - /* the two vinfo_ts shared in 'bb' are not shared in 'aa', - i.e. two nodes are shared in 'bb' but not in 'aa'. - We must compare the second node in 'aa' again with the - same single node of 'bb'. */ - /* Backtracking */ -#if ALL_CHECKS - signed char* buf_opc1 = cmpinternal.buf_opc; - Source* buf_args1 = cmpinternal.buf_args; - int tmp_counter1 = cmpinternal.tmp_counter; -#endif - cmpinternal.tmp_counter = saved_tmp_counter; - cmpinternal.buf_args = saved_buf_args; - cmpinternal.buf_opc = saved_buf_opc; - ok = compatible_vinfo(preva, bsource, opc, result, a, - recdepth); -#if ALL_CHECKS - if (ok) { - extra_assert(buf_opc1 == cmpinternal.buf_opc); - extra_assert(buf_args1 == cmpinternal.buf_args); - extra_assert(tmp_counter1 == cmpinternal.tmp_counter); - } -#endif - } - - /* go on with the loop even if !ok, to free all items left - in [pbegin, pend[. They must be freed now because they are - no longer members of the main linked list -- - the members of the linked list are freed automatically by - fz_compatible_array() */ - } - - if (!ok) - return false; - } - - cmpinternal.tmp_counter++; - extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); - } - } - return true; -#undef CHECK_FOR_NULL -} - -#if COMPRESS_COMPILETIME_SUBITEMS -/* same as 'compatible_array', faster, for when you are not - interested in the result */ -static void skip_compatible_array(int count) -{ - int i; - extra_assert(count >= 0); - for (i=count; i--; ) - { - int opc = fz_getopc(); - extra_assert(cmpinternal.tmp_counter <= cmpinternal.vcilink->time); - if (opc == FZ_OPC_NULL) - ; - else if (opc < 0) - ; - else - { -#if PSYCO_DEBUG - Source bsource = fz_getarg(); - extra_assert(is_compiletime(bsource)); -#else - fz_getarg(); -#endif - skip_compatible_array(opc); - - /* no link should resolve now, fz_compress() takes care of that */ - extra_assert(cmpinternal.tmp_counter < cmpinternal.vcilink->time); - cmpinternal.tmp_counter++; - } - } -} -#endif /* COMPRESS_COMPILETIME_SUBITEMS */ - -PSY_INLINE bool fz_compatible_array(vinfo_array_t* aa, FrozenPsycoObject* fpo, - vcompatible_t* result) { - bool ok; - fz_load_fpo_stack(fpo); - ok = compatible_array(aa, fz_getopc(), &result->diff, aa, 0); - - /* free the linked list (it should already be free if 'ok') */ - while (cmpinternal.vcilink != &cmpinternal.sentinel) - { - struct vcilink_s* p = cmpinternal.vcilink; - cmpinternal.vcilink = p->next; - psyco_llfree_vci(p); - } - - return ok; -} - - -#endif /* VLOCALS_OPC */ - - -DEFINEFN -void psyco_delete_unused_vars(PsycoObject* po, global_entries_t* ge) -{ - int i, limit; - PyObject* plist = ge->fatlist; - extra_assert(PyList_Check(plist)); - limit = PyList_GET_SIZE(plist); - for (i=0; ifatlist; - extra_assert(PyList_Check(plist)); - i = PyList_GET_SIZE(plist); - while (i--) /* the most dummy algorithm: step by step in the list, */ - { /* checking for a match at each step. */ - CodeBufferObject* codebuf; - PyObject* o1 = PyList_GET_ITEM(plist, i); - if (!CodeBuffer_Check(o1)) - break; - codebuf = (CodeBufferObject*) o1; - result.matching = codebuf; - result.diff = NullArray; - extra_assert(CodeBuffer_Check(codebuf)); - fz_check_invariant(&codebuf->snapshot); - if (fz_compatible_array(&po->vlocals, &codebuf->snapshot, &result)) - { - /* compatible_array() leaves data in the 'tmp' fields. - It must be cleared unless it is the final result of - psyco_compatible() itself. */ - if (result.diff == NullArray) - { - /* Total match */ - if (bestresult != NULL) - array_release(bestresult); - return &result; - } - else - { - /* Partial match, clear 'tmp' fields */ - fz_restore_invariant(&codebuf->snapshot); - if (bestresult != NULL) - { - if (bestresult->count <= result.diff->count) - { - array_release(result.diff); - continue; /* not better than the previous partial match */ - } - array_release(bestresult); - } - /* Record the best partial match we found so far */ - bestresult = result.diff; - bestbuf = codebuf; - } - } - else /* compatible_array() should have reset all 'tmp' fields */ - fz_check_invariant(&codebuf->snapshot); - } - if (bestresult == NULL) - return NULL; - else - { - result.matching = bestbuf; - result.diff = bestresult; - return &result; - } -} - -DEFINEFN -void psyco_stabilize(vcompatible_t* lastmatch) -{ - if (lastmatch->diff == NullArray) - fz_restore_invariant(&lastmatch->matching->snapshot); - else - fz_check_invariant(&lastmatch->matching->snapshot); - array_release(lastmatch->diff); -} - - - /***************************************************************/ -/*** Unification ***/ - /***************************************************************/ - - -/* psyco_unify() is implemented in idispatcher.c */ - - -DEFINEFN -CodeBufferObject* psyco_unify_code(PsycoObject* po, vcompatible_t* lastmatch) -{ - /* simplified interface to psyco_unify() without using a previously - existing code buffer. */ - - CodeBufferObject* target; - code_t localbuf[GUARANTEED_MINIMUM]; - /* relies on the fact that psyco_unify() has no room at all in localbuf. - Anything but the final JMP will trigger the creation of a new code - buffer. */ - po->code = localbuf; - INIT_CODE_EMISSION(po->code); - po->codelimit = NULL; - psyco_unify(po, lastmatch, &target); - return target; -} - -#define KEEP_MARK ((vinfo_t*) 1) - -static int mark_to_keep(vinfo_array_t* array, bool virtual_parent) -{ - int i, total=0; - for (i=array->count; i--; ) - { - vinfo_t* vi = array->items[i]; - if (vi != NULL) - { - if (is_runtime(vi->source) && vi->tmp == NULL) - { - if (!virtual_parent) - continue; - /* mark this item to be kept */ - vi->tmp = KEEP_MARK; - total++; - } - if (vi->array != NullArray) - total += mark_to_keep(vi->array, is_virtualtime(vi->source)); - } - } - return total; -} - -static void remove_non_marked(vinfo_array_t* array, PsycoObject* po) -{ - int i; - for (i=array->count; i--; ) - { - vinfo_t* vi = array->items[i]; - if (vi != NULL) - { - if (is_runtime(vi->source) && vi->tmp == NULL) - { - /* remove this item */ - array->items[i] = NULL; - vinfo_decref(vi, po); - } - else if (vi->array != NullArray) - { - if (is_compiletime(vi->source)) - { - /* remove all sub-items */ - vinfo_array_t* array = vi->array; -#if PSYCO_DEBUG - /* we just verify that there are only compile-time - subitems. */ - int j; - for (j=0; jcount; j++) - extra_assert(array->items[j] == NULL || - is_compiletime(array->items[j]->source)); -#endif - vi->array = NullArray; - array_delete(array, po); - } - else - remove_non_marked(vi->array, po); - } - } - } -} - -DEFINEFN -int psyco_simplify_array(vinfo_array_t* array, PsycoObject* po) -{ - /* We remove a run-time vinfo_t if it is not directly in 'array' and - if it is not in the sub-vinfo_array_t of any virtual-time source. */ - - /* First mark with a non-NULL value all run-time sources that must - be kept. */ - int total; - assert_cleared_tmp_marks(array); - total = mark_to_keep(array, true); - - /* Remove all non-marked run-time sources */ - remove_non_marked(array, po); - - /* Done */ - return total; -} - -static void remove_non_compiletime(vinfo_t* v, PsycoObject* po) -{ - vinfo_array_t* array = v->array; - int j, length=array->count, newlength=0; - for (j=0; jitems[j]; - if (vi != NULL) - { - if (!is_compiletime(vi->source)) - { - array->items[j] = NULL; - vinfo_decref(vi, po); - } - else - newlength = j+1; - } - } - vinfo_array_shrink(po, v, newlength); -} - - - /***************************************************************/ -/*** Promotion and un-promotion ***/ - /***************************************************************/ - - -/*****************************************************************/ - /*** Promotion of a run-time variable into a fixed ***/ - /*** compile-time one ***/ - - -/* Implementation tactics */ - -/* 0 -- use a plain Python dictionary whose keys - are the value to promote and values the code objects. - 1 -- put code buffers in a chained list, - with the most used items moving forward in the list. - 2 -- order the code buffers as a binary search tree, - with the most used nodes moving up in the tree (not implemented) -*/ -#define PROMOTION_TACTIC 1 - - -#if PROMOTION_TACTIC == 1 -typedef struct rt_local_buf_s { -# if CODE_DUMP - long signature; -# endif - struct rt_local_buf_s* next; - long key; -} rt_local_buf_t; -#endif - -typedef struct { /* produced at compile time and read by the dispatcher */ - INTERNAL_PROMOTION_FIELDS - - PsycoObject* po; /* state before promotion */ - vinfo_t* fix; /* variable to promote */ - -#if PROMOTION_TACTIC == 0 - PyObject* spec_dict; /* local cache (promotions to already-seen values) */ -# if CODE_DUMP - void** chained_list; /* must be last, with spec_dict just before */ -# endif -#endif - -#if PROMOTION_TACTIC == 1 - rt_local_buf_t* local_chained_list; -# if CODE_DUMP - long zero_tag; -# endif -#endif -} rt_promotion_t; - - -/* this macro might be redefined below */ -#define QUICK_LOOKUP_PROMOTION_VALUE(fs, value, result) \ - result = lookup_old_promotion_values(fs, value) - - -#if PROMOTION_TACTIC == 0 -#define NEED_PYOBJ_KEY -PSY_INLINE code_t* lookup_old_promotion_values(rt_promotion_t* fs, - PyObject* key) -{ - /* have we already seen this value? */ - CodeBufferObject* codebuf; - codebuf = (CodeBufferObject*) PyDict_GetItem(fs->spec_dict, key); - if (codebuf != NULL) /* yes */ - return (code_t*) codebuf->codestart; - return NULL; /* no */ -} -#endif /* PROMOTION_TACTIC == 0 */ - -#if PROMOTION_TACTIC == 1 -# if PROMOTION_FAST_COMMON_CASE -static -# else -PSY_INLINE -# endif -code_t* lookup_old_promotion_values(rt_promotion_t* fs, long value) -{ - rt_local_buf_t** ppbuf; - if (fs->local_chained_list == NULL) - return NULL; /* not found (list is empty) */ - -#if PROMOTION_FAST_COMMON_CASE - /* 'fs->local_chained_list' points to the current head - of the list, which we know is not what we are looking - for because otherwise the CMP/JE instructions - would have found it and we would not be here */ - extra_assert(fs->local_chained_list->key != value); -#else - if (fs->local_chained_list->key == value) - return (code_t*)(fs->local_chained_list+1); /* it is the head of the list */ -#endif - - ppbuf = &fs->local_chained_list->next; - while (1) - { - rt_local_buf_t* buf = *ppbuf; - if (buf == NULL) - return NULL; /* not found (list exhausted) */ - if (buf->key == value) - { - /* found inside the list, put it at the head */ - *ppbuf = buf->next; - buf->next = fs->local_chained_list; - fs->local_chained_list = buf; - return (code_t*)(buf+1); - } - ppbuf = &buf->next; - } -} - -#if PROMOTION_FAST_COMMON_CASE -static int quick_lookup_counter = 0; -# undef QUICK_LOOKUP_PROMOTION_VALUE -# define QUICK_LOOKUP_PROMOTION_VALUE(fs, value, res) do { \ - rt_local_buf_t* buf = (fs)->local_chained_list; \ - if (buf == NULL) { \ - res = NULL; /* not found (list is empty) */ \ - } \ - else if ((quick_lookup_counter-=13) >= 0) { \ - for (buf=buf->next; buf!=NULL; buf=buf->next) { \ - if (buf->key == (value)) \ - return (code_t*)(buf+1); \ - } \ - res = NULL; /* not found */ \ - } \ - else { \ - /* approximately once every 23 times, go through */ \ - /* the slower path that will move the item to */ \ - /* the head of the search list if it is found. */ \ - quick_lookup_counter += 307; \ - res = lookup_old_promotion_values(fs, value); \ - } \ - } while (0) -#endif - -PSY_INLINE int lookup_count_previous_values(rt_promotion_t* fs, - rt_local_buf_t** megabuf) -{ - int result = 0; - rt_local_buf_t* buf = fs->local_chained_list; - while (buf) { - if (buf->key == -1) /* use (PyObject*)(-1) as a marker */ - *megabuf = buf; - result++; - buf = buf->next; - } - return result; -} -#endif /* PROMOTION_TACTIC == 1 */ - - -static code_t* do_promotion_internal(rt_promotion_t* fs, -#ifdef NEED_PYOBJ_KEY - PyObject* key, -#else - long key, -#endif - source_known_t* sk) -{ - CodeBufferObject* codebuf; - code_t* result; - vinfo_t* v; - PsycoObject* newpo; - PsycoObject* po = fs->po; - mergepoint_t* mp; - - /* get a copy of the compiler state */ - newpo = PsycoObject_Duplicate(po); - if (newpo == NULL) - OUT_OF_MEMORY(); - /* store the copy back into 'fs' and use the old 'po' to compile. - We do so because in 'newpo' all 'tmp' fields are now NULL, - but no longer in 'po'. */ - fs->po = newpo; - v = fs->fix; /* get the variable we will promote to compile-time... */ - fs->fix = v->tmp; /* ...and update 'fs' with its copy in 'newpo' */ - - /* fix the value of 'v' */ - CHKTIME(v->source, RunTime); /* from run-time to compile-time */ -#if REG_TOTAL > 0 - if (!RSOURCE_REG_IS_NONE(v->source)) - { - /* remove this value from 'po->regarray' */ - REG_NUMBER(po, RSOURCE_REG(v->source)) = NULL; - SET_RUNTIME_REG_TO_NONE(v); - } -#endif - v->source = CompileTime_NewSk(sk); - /* compile from this new state, in which 'v' has been promoted to - compile-time. */ - mp = psyco_exact_merge_point(po->pr.merge_points, po->pr.next_instr); - -#if PROMOTION_TACTIC == 0 - codebuf = psyco_compile_code(po, mp); - - /* store the new code buffer into the local cache */ - RECLIMIT_SAFE_ENTER(); - if (PyDict_SetItem(fs->spec_dict, key, (PyObject*) codebuf)) - OUT_OF_MEMORY(); - RECLIMIT_SAFE_LEAVE(); - Py_DECREF(codebuf); /* there is a reference left - in the dictionary */ - result = (code_t*) codebuf->codestart; -#endif - -#if PROMOTION_TACTIC == 1 - codebuf = psyco_new_code_buffer(NULL, NULL, &po->codelimit); - { - code_t* codeend; - rt_local_buf_t* buf = (rt_local_buf_t*) codebuf->codestart; - code_t* code = (code_t*)(buf+1); - ALIGN_NO_FILL(); - result = code; - buf = ((rt_local_buf_t*) code) - 1; - -# if CODE_DUMP - memset(codebuf->codestart, 0xCC, ((char*) buf) - ((char*) codebuf->codestart)); - buf->signature = 0x66666666; -# endif - buf->next = fs->local_chained_list; - buf->key = key; - fs->local_chained_list = buf; - - po->code = insn_code_label(result); - codeend = psyco_compile(po, mp, false); - psyco_shrink_code_buffer(codebuf, codeend); - /* XXX don't know what to do with reference to 'codebuf' */ - } -#endif - - dump_code_buffers(); - return result; -} - -static code_t* detected_megamorphic_pyobj_site(rt_promotion_t* fs) -{ - CodeBufferObject* codebuf; - code_t* result; - vinfo_t* v; - PsycoObject* newpo; - PsycoObject* po = fs->po; - mergepoint_t* mp; - - /* get a copy of the compiler state */ - newpo = PsycoObject_Duplicate(po); - if (newpo == NULL) - OUT_OF_MEMORY(); - /* store the copy back into 'fs' and use the old 'po' to compile. - We do so because in 'newpo' all 'tmp' fields are now NULL, - but no longer in 'po'. */ - fs->po = newpo; - v = fs->fix; /* get the variable we will mark as megamorphic... */ - fs->fix = v->tmp; /* ...and update 'fs' with its copy in 'newpo' */ - - /* mark 'v' as megamorphic */ - CHKTIME(v->source, RunTime); - v->source |= RunTime_Megamorphic; - /* compile from this new state, in which 'v' has been flagged */ - mp = psyco_exact_merge_point(po->pr.merge_points, po->pr.next_instr); - -#if PROMOTION_TACTIC == 0 -# error "XXX reimplement" -#endif - -#if PROMOTION_TACTIC == 1 - codebuf = psyco_new_code_buffer(NULL, NULL, &po->codelimit); - { - code_t* codeend; - rt_local_buf_t* buf = (rt_local_buf_t*) codebuf->codestart; - code_t* code = (code_t*)(buf+1); - ALIGN_NO_FILL(); - result = code; - buf = ((rt_local_buf_t*) code) - 1; - -# if CODE_DUMP - memset(codebuf->codestart, 0xCC, ((char*) buf) - ((char*) codebuf->codestart)); - buf->signature = 0x66666666; -# endif - buf->next = fs->local_chained_list; - buf->key = -1; /* use (PyObject*)(-1) as a marker */ - fs->local_chained_list = buf; - - po->code = insn_code_label(result); - codeend = psyco_compile(po, mp, false); - psyco_shrink_code_buffer(codebuf, codeend); - /* XXX don't know what to do with reference to 'codebuf' */ - } -#endif - - dump_code_buffers(); - return result; -} - - -/* NOTE: the following two functions must be as fast as possible, because - they are called from the run-time code even during normal (non-compiling) - execution. */ -static code_t* do_promotion_long(rt_promotion_t* fs, long value) -{ - /* need a PyObject* key for the local cache dictionary */ - code_t* result; - -#ifdef NEED_PYOBJ_KEY - PyObject* key1 = PyInt_FromLong(value); - if (key1 == NULL) - OUT_OF_MEMORY(); -#else - long key1 = value; -#endif - - /* have we already seen this value? */ - QUICK_LOOKUP_PROMOTION_VALUE(fs, key1, result); - if (result == NULL) - { - /* no -> we must build new code */ - result = do_promotion_internal(fs, key1, sk_new(value, SkFlagFixed)); - } -#ifdef NEED_PYOBJ_KEY - Py_DECREF(key1); -#endif - /* done -> jump to the codebuf */ - return fix_fast_common_case(fs, value, result); -} - -static code_t* do_promotion_pyobj(rt_promotion_t* fs, PyObject* key) -{ - code_t* result; - -#ifdef NEED_PYOBJ_KEY - PyObject* key1 = key; -#else - long key1 = (long) key; -#endif - - /* have we already seen this value? */ - QUICK_LOOKUP_PROMOTION_VALUE(fs, key1, result); - if (result == NULL) - { - /* no -> we must build new code */ - Py_INCREF(key); - result = do_promotion_internal(fs, key1, sk_new((long) key, - SkFlagFixed|SkFlagPyObj)); - } - /* done -> jump to the codebuf */ - return fix_fast_common_case(fs, (long) key, result); -} - -static code_t* do_promotion_pyobj_mega(rt_promotion_t* fs, PyObject* key) -{ - code_t* result; - -#ifdef NEED_PYOBJ_KEY - PyObject* key1 = key; -#else - long key1 = (long) key; -#endif - - /* have we already seen this value? */ - QUICK_LOOKUP_PROMOTION_VALUE(fs, key1, result); - if (result == NULL) - { - /* no -> did we already promote many objects here? */ - rt_local_buf_t* megabuf = NULL; - if (lookup_count_previous_values(fs, &megabuf) >= MEGAMORPHIC_MAX) - { - /* yes -> stop specializing */ - if (megabuf == NULL) - return detected_megamorphic_pyobj_site(fs); - else - return (code_t*)(megabuf+1); /* mega version already compiled */ - } - /* no -> we must build new code */ - Py_INCREF(key); - result = do_promotion_internal(fs, key1, sk_new((long) key, - SkFlagFixed|SkFlagPyObj)); - } - /* done -> jump to the codebuf */ - return fix_fast_common_case(fs, (long) key, result); -} - -DEFINEFN -code_t* psyco_finish_promotion(PsycoObject* po, vinfo_t* fix, int pflags) -{ - rt_promotion_t* fs; - void* do_promotion; - - /* we remove the non-compile-time array values from 'fix' */ - if (fix->array != NullArray) - remove_non_compiletime(fix, po); - - TRACE_EXECUTION("PROMOTION"); - - /* write the code that calls the proxy 'do_promotion' */ - switch (pflags) { - case 0: - do_promotion = &do_promotion_long; - break; - case PFlagPyObj: - do_promotion = &do_promotion_pyobj; - break; - /*case PFlagMegamorphic: ... */ - case PFlagPyObj | PFlagMegamorphic: - do_promotion = &do_promotion_pyobj_mega; - break; - default: - psyco_fatal_msg("bad pflags"); - return NULL; - } - fs = (rt_promotion_t*) ipromotion_finish(po, fix, do_promotion); - - /* fill in the constant structure that 'do_promotion' will get as parameter */ - clear_tmp_marks(&po->vlocals); - psyco_assert_coherent(po); - fs->po = po; /* don't release 'po' */ - fs->fix = fix; - -#if PROMOTION_TACTIC == 0 - fs->spec_dict = PyDict_New(); - if (fs->spec_dict == NULL) - OUT_OF_MEMORY(); -# if CODE_DUMP - fs->chained_list = psyco_codebuf_spec_dict_list; - psyco_codebuf_spec_dict_list = (void**)&fs->chained_list; -# endif -#endif - -#if PROMOTION_TACTIC == 1 - fs->local_chained_list = NULL; -# if CODE_DUMP - fs->zero_tag = 0; -# endif -#endif - - return (code_t*)(fs+1); /* end of code == end of 'fs' structure */ -} - - -/*****************************************************************/ - /*** Promotion of certain run-time values into ***/ - /*** compile-time ones (promotion only occurs for certain ***/ - /*** values, e.g. for types that we know how to optimize). ***/ - -#if USE_RUNTIME_SWITCHES - -typedef struct { /* produced at compile time and read by the dispatcher */ - fixed_switch_t* rts; /* special values */ - PsycoObject* po; /* state before promotion */ - vinfo_t* fix; /* variable to promote */ - long kflags; /* flags after promotion */ - code_t* switchcodeend; /* end of the private copy of the switch code */ -} rt_fixed_switch_t; - -static code_t* do_fixed_switch(rt_fixed_switch_t* rtfxs, long value) -{ - int item; - CodeBufferObject* codebuf; - fixed_switch_t* rts = rtfxs->rts; - vinfo_t* v; - PsycoObject* newpo; - PsycoObject* po = rtfxs->po; - - /* get a copy of the compiler state */ - newpo = psyco_duplicate(po); - /* store the copy back into rtfxs and use the old 'po' to compile. - We do so because in 'newpo' all 'tmp' fields are now NULL, - but no longer in 'po'. */ - rtfxs->po = newpo; - v = rtfxs->fix; /* get the variable we will promote to compile-time... */ - rtfxs->fix = v->tmp; /* ...and update 'rtfxs' with its copy in 'newpo' */ - - item = psyco_switch_lookup(rts, value); /* which value did we found? */ - if (item == -1) - { - /* none --> go into 'default' mode */ - /* abuse the 'array' field to point to this fixed_switch_t - to mean 'known to be none of the special values'. - See known_to_be_default(). */ - v->array = NullArrayAt(rts->zero); - } - else - { - /* fix the value of 'v' to the one we found */ - CHKTIME(v->source, RunTime); /* from run-time to compile-time */ - if (!RUNTIME_REG_IS_NONE(v)) - REG_NUMBER(po, RUNTIME_REG(v)) = NULL; - v->source = CompileTime_NewSk(sk_new(value, rtfxs->kflags)); - } - - /* compile from this new state */ - codebuf = psyco_compile_code(po, psyco_exact_merge_point(po->pr.merge_points, - po->pr.next_instr)); - - /* store the pointer to the new code directly into - the original code that jumped to do_fixed_switch() */ - psyco_fix_switch_case(rts, rtfxs->switchcodeend, item, codebuf->codeptr); - - return codebuf->codeptr; /* jump there */ - /* XXX no place to store the reference to codebuf */ -} - -DEFINEFN -code_t* psyco_finish_fixed_switch(PsycoObject* po, vinfo_t* fix, long kflags, - fixed_switch_t* special_values) -{ - rt_fixed_switch_t* rtfxs; - code_t* switchcodeend; - CHKTIME(fix->source, RunTime); - extra_assert(fix->array->count == 0); /* cannot fix array values, - because of known_to_be_default() */ - TRACE_EXECUTION("FIXED_SWITCH"); - BEGIN_CODE - NEED_CC(); - RTVINFO_IN_REG(fix); - switchcodeend = code = psyco_write_run_time_switch(special_values, code, - RUNTIME_REG(fix)); - - TEMP_SAVE_REGS_FN_CALLS; /* save all registers that might be clobbered */ - CALL_SET_ARG_FROM_RT(fix->source, 1, 2);/* argument index 1 out of total 2 */ - END_CODE - - /* write the code that calls the proxy 'do_fixed_switch' */ - rtfxs = (rt_fixed_switch_t*) psyco_jump_proxy(po, &do_fixed_switch, 1, 2); - - /* fill in the constant struct that 'do_fixed_switch' will get as parameter */ - clear_tmp_marks(&po->vlocals); - psyco_assert_coherent(po); - rtfxs->rts = special_values; - rtfxs->po = po; - rtfxs->fix = fix; - rtfxs->kflags = kflags; - rtfxs->switchcodeend = switchcodeend; - return (code_t*)(rtfxs+1); -} - -#endif /* USE_RUNTIME_SWITCHES */ - - -/*****************************************************************/ - /*** Un-Promotion from non-fixed compile-time into run-time ***/ - -static void array_remove_vinfo(vinfo_array_t* array, vinfo_t* vi) -{ - int i = array->count; - while (i--) - { - vinfo_t* a = array->items[i]; - if (a != NULL) - { - if (a == vi) - { - extra_assert(a->refcount > 1); - vinfo_decref(a, NULL); /* other references expected */ - array->items[i] = NULL; - } - else if (a->array != NullArray) - array_remove_vinfo(a->array, vi); - } - } -} - -static void array_remove_inside_ct(vinfo_array_t* array, vinfo_t* vi) -{ - int i = array->count; - while (i--) - { - vinfo_t* a = array->items[i]; - if (a != NULL && a->array != NullArray) - { - if (is_compiletime(a->source)) - array_remove_vinfo(a->array, vi); - else - array_remove_inside_ct(a->array, vi); - } - } -} - -DEFINEFN -void psyco_unfix(PsycoObject* po, vinfo_t* vi) -{ - /* Convert 'vi' from compile-time to run-time variable. */ - vinfo_t* newvi; - source_known_t* sk; - CHKTIME(vi->source, CompileTime); - - /*printf("psyco_unfix(%p, %p, %p)\n", po, po->code, vi);*/ - - /* forget all sub-items of the compile-time 'vi', - which should all be compile-time */ - if (vi->array != NullArray) - { - array_delete(vi->array, po); - vi->array = NullArray; - } - - /* A particular case that *do* occur: - 'vi' was always selected as a compile-time vinfo_t not within - another compile-time vinfo_t's subarray; but it could - actually appear more than once in po->vlocals, and another - occurrence could be inside another compile-time vinfo_t. - As compile-time vinfo_ts are not allowed to contain anything - but compile-time vinfo_ts, unfixing 'vi' would break it. - In this situation we remove the faulty occurrences. */ - if (vi->refcount > 1) - array_remove_inside_ct(&po->vlocals, vi); - assert_array_contains_nonct(&po->vlocals, vi); - - newvi = make_runtime_copy(po, vi); - /* make_runtime_copy() never fails for compile-time sources */ - extra_assert(newvi != NULL); - - /* release 'vi->source' and move 'newvi->source' into it */ - sk = CompileTime_Get(vi->source); - if (sk->refcount1_flags & SkFlagPyObj) { - /* XXX can't release the PyObject anywhere, because we - write a pointer to it in the code itself. We should - somehow transfer the ownership of this reference to - the CodeBufferObject. Fix me when implementing - memory releasing! */ - sk->refcount1_flags &= ~SkFlagPyObj; - } - sk_decref(sk); - vinfo_move(po, vi, newvi); -} diff --git a/nodebox/ext/psyco/src/c/dispatcher.h b/nodebox/ext/psyco/src/c/dispatcher.h deleted file mode 100644 index ded8a65..0000000 --- a/nodebox/ext/psyco/src/c/dispatcher.h +++ /dev/null @@ -1,284 +0,0 @@ - /***************************************************************/ -/*** Structures used by the dispatcher part ***/ - /***************************************************************/ - -#ifndef _DISPATCHER_H -#define _DISPATCHER_H - - -#include "psyco.h" -#include "vcompiler.h" -#include "processor.h" -#include "codegen.h" - - -/* a frozen PsycoObject is a snapshot of an actual PsycoObject, - capturing the state of the compiler in a form that can be used - later to compare live states to it. - The FrozenPsycoObject's secondary goal is to capture enough - information to rebuild a "live" PsycoObject, close enough to - the original to let the next few Python instructions produce - exactly the same machine code as the original. See - psyco_prepare_respawn(). Be careful, there are a lot of such - snapshots around in memory; keep them as small as possible. - - The first implementation (with VLOCALS_OPC=0) stores a copy - of the PsycoObject vlocals. So does the second implementation - (VLOCALS_OPC=1), but it compresses the copy into a very compact - pseudo-code. */ -#define VLOCALS_OPC 1 - -struct FrozenPsycoObject_s { - union { - int fz_stack_depth; - struct respawn_s* respawning; - } fz_stuff; -#if VLOCALS_OPC - Source* fz_vlocals_opc; /* compact pseudo-code copy */ -#else - vinfo_array_t* fz_vlocals; /* verbatim copy */ -#endif - PROCESSOR_FROZENOBJECT_FIELDS - short fz_respawned_cnt; - CodeBufferObject* fz_respawned_from; - pyc_data_t* fz_pyc_data; /* only partially allocated */ -}; - - -/* construction */ -PSY_INLINE void fpo_mark_new(FrozenPsycoObject* fpo) { - fpo->fz_respawned_cnt = 0; - fpo->fz_respawned_from = NULL; -} -PSY_INLINE void fpo_mark_unused(FrozenPsycoObject* fpo) { -#if VLOCALS_OPC - fpo->fz_vlocals_opc = NULL; -#else - fpo->fz_vlocals = NullArray; -#endif - fpo->fz_pyc_data = NULL; -} -EXTERNFN void fpo_build(FrozenPsycoObject* fpo, PsycoObject* po); -EXTERNFN void fpo_release(FrozenPsycoObject* fpo); - -/* build a 'live' PsycoObject from frozen snapshot */ -EXTERNFN PsycoObject* fpo_unfreeze(FrozenPsycoObject* fpo); - -/* inspection */ -PSY_INLINE int get_stack_depth(FrozenPsycoObject* fpo) { - return fpo->fz_stuff.fz_stack_depth; -} - -/* psyco_compatible(): - search in the given global_entries_t for a match to the live PsycoObject. - Return NULL if no match is found, or a vcompatible_t structure otherwise. - The returned 'diff' is an array of the 'vinfo_t*' of 'po' which are - compile-time but should be un-promoted to run-time. In particular, the - array is empty (==NullArray) if an exact match is found. - - The current implementation is not re-entrent. The returned vcompatible_t - structure must be released by psyco_stabilize() or one of the psyco_unify - functions below, before another call to psyco_compatible() can be made. -*/ -typedef struct { - CodeBufferObject* matching; /* best match */ - vinfo_array_t* diff; /* array of differences */ -} vcompatible_t; -EXTERNFN vcompatible_t* psyco_compatible(PsycoObject* po, - global_entries_t* pattern); - -EXTERNFN void psyco_stabilize(vcompatible_t* lastmatch); - - -/*****************************************************************/ - /*** "Global Entries" ***/ - -/* global entry points for the compiler. One global entry point holds a list - of already-compiled code buffers corresponding to the various states - in which the compiler has already be seen at this point. See - psyco_compatible(). - - The dispatcher saves all CodeBufferObjects (with their copy of the - compiler state) in a list for each 'entry point' of the compiler - (the main entry point is spec_main_loop, the start of the main loop). - When coming back to this entry point later, the list let us determine - whether we already encountered the same state. - - The details of this structure are private. - XXX implemented as a list object holding CodeBufferObjects in no - XXX particular order. Must be optimized for reasonably fast searches - XXX if the lists become large (more than just a few items). - - The list starts with PyIntObjects whose numbers tell which local variables - may safely be deleted at that point. -*/ -struct global_entries_s { - PyObject* fatlist; /* list of PyIntObjects then CodeBufferObjects */ -}; - -/* initialize a global_entries_t structure */ -PSY_INLINE void psyco_ge_init(global_entries_t* ge) { - ge->fatlist = PyList_New(0); - if (ge->fatlist == NULL) - OUT_OF_MEMORY(); -} - -/* register the code buffer; it will be found by future calls to - psyco_compatible(). */ -PSY_INLINE int register_codebuf(global_entries_t* ge, CodeBufferObject* codebuf) { - return PyList_Append(ge->fatlist, (PyObject*) codebuf); -} - -/* for mergepoints.c */ -PSY_INLINE void psyco_ge_unused_var(global_entries_t* ge, int num) -{ - PyObject* o = PyInt_FromLong(num); - if (o == NULL || PyList_Append(ge->fatlist, o)) - OUT_OF_MEMORY(); -} - -EXTERNFN void psyco_delete_unused_vars(PsycoObject* po, global_entries_t* ge); - - -/*****************************************************************/ - /*** Unification ***/ - -/* Update 'po' to match 'lastmatch', then jump to 'lastmatch'. - For the conversion we might have to emit some code. - If po->code == NULL or there is not enough room between code and - po->codelimit, a new code buffer is created. A new reference to - the new or target code buffer is returned in 'target'. - If po->code != NULL, the return value points at the end of the - code that has been written there; otherwise, the return value is - undefined (but not NULL). - 'po' and 'lastmatch' are released. -*/ -EXTERNFN code_t* psyco_unify(PsycoObject* po, vcompatible_t* lastmatch, - CodeBufferObject** target); - -/* Simplified interface to psyco_unify() without using a previously - existing code buffer (i.e. 'po->code' is uninitialized). If needed, - return a new buffer with the necessary code followed by a JMP to - 'lastmatch'. If no code is needed, just return a new reference to - 'lastmatch->matching'. -*/ -EXTERNFN CodeBufferObject* psyco_unify_code(PsycoObject* po, - vcompatible_t* lastmatch); - -/* To "simplify" recursively a vinfo_array_t. The simplification done - is to replace run-time values inside a sub-array of a non-virtual - value with NULL, and to remove sub-arrays of constant-time values. - We assume that these can still be reloaded later if necessary. - Returns the number of run-time values left. - This assumes that all 'tmp' marks are cleared in 'array'. */ -EXTERNFN int psyco_simplify_array(vinfo_array_t* array, - PsycoObject* po); /* 'po' may be NULL */ - -/* Emit the code to prepare for Psyco code calling Psyco code in - a compiled function call */ -PSY_INLINE bool psyco_forking(PsycoObject* po, vinfo_array_t* array) { - /* Some virtual-time objects cannot remain virtualized across calls, - because if the called function pulls them out of virtual-time, - the caller will not know it. This is unacceptable for - mutable Python objects. We hope it does not hurt in other cases, - but could be defeated by the "is" operator. */ - return psyco_limit_nested_weight(po, array, NWI_FUNCALL, - NESTED_WEIGHT_END); -} - -/*****************************************************************/ - /*** Promotion ***/ - -/* Promotion of a run-time variable into a fixed compile-time one. - Finish the code block with a jump to the dispatcher that - promotes the run-time variable 'fix' to compile-time. This - usually means the compiler will be called back again, at the - given entry point. - Note: Releases 'po'. -*/ -EXTERNFN code_t* psyco_finish_promotion(PsycoObject* po, vinfo_t* fix, - int pflags); - -#if USE_RUNTIME_SWITCHES -/* Promotion of certain run-time values into compile-time ones - (promotion only occurs for values inside a given set, e.g. for - types that we know how to optimize). The special values are - described in an array of long, turned into a source_known_t - (see processor.h). - Note: Releases 'po'. -*/ -EXTERNFN code_t* psyco_finish_fixed_switch(PsycoObject* po, vinfo_t* fix, - long kflags, - fixed_switch_t* special_values); -#endif - -/* Un-Promotion from non-fixed compile-time into run-time. - Note: this does not release 'po'. Un-promoting is easy and - don't require encoding calls to the dispatcher. -*/ -EXTERNFN void psyco_unfix(PsycoObject* po, vinfo_t* vi); - - -/*****************************************************************/ - /*** Respawning ***/ - -/* internal use */ -EXTERNFN void* psyco_prepare_respawn_ex(PsycoObject* po, - condition_code_t jmpcondition, - void* fn, int extrasize); -EXTERNFN bool psyco_prepare_respawn(PsycoObject* po, - condition_code_t jmpcondition); -EXTERNFN code_t* psyco_do_respawn(void* arg, int extrasize); -EXTERNFN code_t* psyco_dont_respawn(void* arg, int extrasize); -EXTERNFN void psyco_respawn_detected(PsycoObject* po); -#define detect_respawn_ex(po) (!++(po)->respawn_cnt) -PSY_INLINE bool detect_respawn(PsycoObject* po) { - if (detect_respawn_ex(po)) { - psyco_respawn_detected(po); - return true; - } - else - return false; -} -PSY_INLINE bool is_respawning(PsycoObject* po) { return po->respawn_cnt < 0; } - -/* the following powerful function stands for 'if the processor flag (cond) is - set at run-time, then...'. Of course we do not know yet if this will be - the case or not, but the macro takes care of preparing the required - respawns if needed. 'cond' may be CC_ALWAYS_xxx or a real processor flag. - runtime_condition_f() assumes the outcome is generally false, - runtime_condition_t() assumes the outcome is generally true. */ -PSY_INLINE bool runtime_condition_f(PsycoObject* po, condition_code_t cond) { - extra_assert(cond != CC_ERROR); - if (cond == CC_ALWAYS_FALSE) return false; - if (cond == CC_ALWAYS_TRUE) return true; - return psyco_prepare_respawn(po, cond); -} -PSY_INLINE bool runtime_condition_t(PsycoObject* po, condition_code_t cond) { - extra_assert(cond != CC_ERROR); - if (cond == CC_ALWAYS_TRUE) return true; - if (cond == CC_ALWAYS_FALSE) return false; - return !psyco_prepare_respawn(po, INVERT_CC(cond)); -} -/* extreme care is needed when using the runtime_condition_x() functions: - they must *always* get called in a sequence that doesn't depend on external - factors that may change. If a call is in one branch on an if/else, for - example, then you must make sure that the "if" condition cannot give a - different result during later respawning. See load_global for a what to do - if this is not the case. */ - -/* the following functions let you test at compile-time the fact that a - value is 0 or not. Returns 0 or 1, or -1 in case of error. - Uses integer_NON_NULL() and so accepts 'vi==NULL' and !!consumes a ref!! - *Do not use* for values that might hold a reference to a PyObject; - use object_non_null() in this case. */ -EXTERNFN int runtime_NON_NULL_f(PsycoObject* po, vinfo_t* vi); -EXTERNFN int runtime_NON_NULL_t(PsycoObject* po, vinfo_t* vi); - -/* check if an integer is between the given *inclusive* bounds. - Same return values as above. Does not consume a ref. */ -EXTERNFN int runtime_in_bounds(PsycoObject* po, vinfo_t* vi, - long lowbound, long highbound); - - -#endif /* _DISPATCHER_H */ diff --git a/nodebox/ext/psyco/src/c/files.py b/nodebox/ext/psyco/src/c/files.py deleted file mode 100644 index fb101d6..0000000 --- a/nodebox/ext/psyco/src/c/files.py +++ /dev/null @@ -1,166 +0,0 @@ -#! /usr/bin/env python - -"""List of source files of Psyco, the Python specializing compiler - -This script can be used to rebuild various headers and the MANIFEST.""" - - -class Source: - def __init__(self, filename, initname=None): - self.filename = filename - self.initname = initname - -class Object(Source): - def __init__(self, name, has_init=1): - if has_init: - initname = 'psy_%s_init' % name - else: - initname = None - Source.__init__(self, 'Objects/p%s.c' % name, initname) - -class Module(Source): - def __init__(self, name): - Source.__init__(self, 'Modules/p%s.c' % name, 'psyco_init%s' % name) - - -SRC = [ - Source('dispatcher.c'), - Source('vcompiler.c', 'psyco_compiler_init'), - Source('psyco.c'), - Source('platform.c'), - Source('psyfunc.c'), - Source('stats.c', 'psyco_stats_init'), - Source('profile.c', 'psyco_profile_init'), - Source('cstruct.c', 'psyco_cstruct_init'), - Source('alarm.c', 'psyco_alarm_init'), - Source('codemanager.c'), - Source('codegen.c', 'psyco_codegen_init'), - Source('mergepoints.c'), - Source('linuxmemchk.c'), - Source('Python/pycompiler.c', 'psyco_pycompiler_init'), - Source('Python/frames.c', 'psyco_frames_init'), - Source('Python/pbltinmodule.c', 'psyco_bltinmodule_init'), - - Object('object'), - Object('abstract', 0), - Object('boolobject'), - Object('classobject'), - Object('descrobject'), - Object('dictobject'), - Object('floatobject'), - Object('funcobject'), - Object('intobject'), - Object('iterobject'), - Object('listobject'), - Object('longobject'), - Object('methodobject'), - Object('rangeobject'), - Object('stringobject'), - Object('structmember', 0), - Object('tupleobject'), - Object('typeobject'), - Source('Objects/compactobject.c', 'psyco_compact_init'), - Object('compactobject'), - - Module('array'), - Module('math'), - Module('psyco'), - ] - -PROCESSOR_SRC = { - 'i386': [ - Source('iprocessor.c', 'psyco_processor_init'), - Source('idispatcher.c'), - Source('iencoding.c'), - Source('ipyencoding.c'), - ], - 'ivm': [ - Source('iprocessor.c'), - Source('idispatcher.c'), - Source('iencoding.c'), - Source('ipyencoding.c'), - Source('ivm-insns.c'), - ], - } - -MAINFILE = 'psyco.c' -PLATFILE = 'platform.c' - - -def generate(processor=None): - if processor: - filename = '%s/iinitialize.h' % processor - src = PROCESSOR_SRC[processor] - else: - filename = 'initialize.h' - src = SRC - header = """\ - /***************************************************************/ -/*** Automatically generated support file ***/ - /***************************************************************/ - - /* This file is automatically generated by 'files.py'. - DO NOT MODIFY. Changes will be overwritten ! */ - -""" - print 'Rebuilding %s...' % filename - f = open(filename, 'w') - print >> f, header - if not processor: - print >> f, ' /* Including this file results in all headers Objects/xxx.h' - print >> f, ' being included, so that it has roughly the same result' - print >> f, ' for Psyco as a "#include " has for Python:' - print >> f, ' including all headers extension modules generally need.' - print >> f - print >> f, ' This file is moreover used internally by psyco.c. */' - print >> f - print >> f - print >> f, '#ifndef PSYCO_INITIALIZATION' - print >> f - for s in src: - if isinstance(s, Object): - if processor or s.filename != PLATFILE: - assert s.filename.endswith(".c") - print >> f, '# include "%s"' % (s.filename[:-2] + ".h") - print >> f - print >> f, '#else /* if PSYCO_INITIALIZATION */' - print >> f, '# undef PSYCO_INITIALIZATION' - print >> f - print >> f, '#include /* processor-specific initialization */' - print >> f - print >> f, ' /* internal part for psyco.c */' - print >> f, '#if ALL_STATIC' - for s in src: - if processor or s.filename not in (MAINFILE, PLATFILE): - print >> f, '# include "%s"' % s.filename - print >> f, '#else /* if !ALL_STATIC */' - for s in src: - if s.initname: - print >> f, ' EXTERNFN void %s(void);\t/* %s */' % (s.initname, s.filename) - print >> f, '#endif /* !ALL_STATIC */' - print >> f - if processor: - print >> f, 'PSY_INLINE void initialize_processor_files(void) {' - else: - print >> f, 'PSY_INLINE void initialize_all_files(void) {' - print >> f, ' initialize_processor_files();' - for s in src: - if s.initname: - print >> f, ' %s();\t/* %s */' % (s.initname, s.filename) - print >> f, '}' - if not processor: - print >> f - print >> f, '#endif /* PSYCO_INITIALIZATION */' - f.close() - -def main(): - generate() - for processor in PROCESSOR_SRC.keys(): - generate(processor) - - import os, sys; sys.path.insert(0, os.path.join(os.pardir, 'py-utils')) - import manifest - manifest.generate() - -if __name__ == '__main__': - main() diff --git a/nodebox/ext/psyco/src/c/i386/idispatcher.c b/nodebox/ext/psyco/src/c/i386/idispatcher.c deleted file mode 100644 index e4b4168..0000000 --- a/nodebox/ext/psyco/src/c/i386/idispatcher.c +++ /dev/null @@ -1,367 +0,0 @@ -#include "idispatcher.h" -#include "../dispatcher.h" -#include "../codemanager.h" -#include "ipyencoding.h" - - -/***************************************************************/ - /*** the hard processor-dependent part of dispatching: ***/ - /*** Unification. ***/ - - -struct dmove_s { - PsycoObject* po; - int original_stack_depth; - char* usages; /* buffer: array of vinfo_t*, see ORIGINAL_VINFO() below */ - int usages_size; - vinfo_t* copy_regs[REG_TOTAL]; - code_t* code_origin; - code_t* code_limit; - code_t* code; /* only used by data_update_stack() */ - CodeBufferObject* private_codebuf; -}; - -static code_t* data_new_buffer(code_t* code, struct dmove_s* dm) -{ - /* creates a new buffer containing a copy of the already-written code */ - CodeBufferObject* codebuf; - int codesize; - if (dm->private_codebuf != NULL) - { - /* overflowing the regular (large) code buffer */ - psyco_emergency_enlarge_buffer(&code, &dm->code_limit); - return code; - } - else - { - /* overflowing the small buffer, start a new (regular) one */ - codebuf = psyco_new_code_buffer(NULL, NULL, &dm->code_limit); - codebuf->snapshot.fz_stuff.fz_stack_depth = dm->original_stack_depth; - /* the new buffer should be at least as large as the old one */ - codesize = code - dm->code_origin; - if ((code_t*) codebuf->codestart + codesize > dm->code_limit) - Py_FatalError("psyco: unexpected unify buffer overflow"); - /* copy old code to new buffer */ - memcpy(codebuf->codestart, dm->code_origin, codesize); - dm->private_codebuf = codebuf; -#if PSYCO_DEBUG - dm->code_origin = (code_t*) 0xCDCDCDCD; -#endif - return ((code_t*) codebuf->codestart) + codesize; - } -} - -#define ORIGINAL_VINFO(spos) (*(vinfo_t**)(dm->usages + ( \ - extra_assert(0 <= (spos) && (spos) < dm->usages_size), \ - (spos)))) - -static void data_original_table(vinfo_t* a, RunTimeSource bsource, - struct dmove_s* dm) -{ - /* called on each run-time vinfo_t in the FrozenPsycoObject. - Record in the array dm->usages which vinfo_t is found at what position - in the stack. Ignore the ones after dm->usages_size: they correspond to - stack positions which will soon be deleted (because the stack will - shrink). Note: this uses the fact that RUNTIME_STACK_NONE is zero - and uses the 0th item of dm->usages_size as general trash. */ - if (RUNTIME_STACK(a) < dm->usages_size) - ORIGINAL_VINFO(RUNTIME_STACK(a)) = a; -} - -static void data_update_stack(vinfo_t* a, RunTimeSource bsource, - struct dmove_s* dm) -{ - PsycoObject* po = dm->po; - code_t* code = dm->code; - long dststack = getstack(bsource); - long srcstack = getstack(a->source); - char rg, rgb; - vinfo_t* overridden; - - /* check for values passing from no-reference to reference */ - if ((bsource & RunTime_NoRef) == 0) { /* destination has ref */ - if ((a->source & RunTime_NoRef) == 0) /* source has ref too */ - { - /* remove the reference from 'a' because it now belongs - to 'b' ('b->source' itself is in the frozen snapshot - and must not be modified!) */ - a->source = remove_rtref(a->source); - } - else - { - /* create a new reference for 'b'. Note that if the same - 'a' is copied to several 'b's during data_update_stack() - as is allowed by graph quotient detection in - psyco_compatible(), then only the first copy will get - the original reference owned by 'a' (if any) and for - the following copies the following increfing code is - executed as well. */ - RTVINFO_IN_REG(a); - rg = RUNTIME_REG(a); - INC_OB_REFCNT_CC(rg); - } - } - /* 'a' must no longer own a reference at this point. - The case of 'b' wanting no reference but 'a' having one - is forbidden by psyco_compatible() because decrefing 'a' - would potentially leave a freed pointer in 'b'. */ - extra_assert(!has_rtref(a->source)); - - /* The operation below is: copy the value currently held by 'a' - into the stack position 'dststack'. */ - rgb = getreg(bsource); - if (rgb != REG_NONE) - dm->copy_regs[(int)rgb] = a; - if (dststack == RUNTIME_STACK_NONE || dststack == srcstack) - ; /* nothing to do */ - else - { - rg = RUNTIME_REG(a); - if (rg == REG_NONE) /* load 'a' into a register before it can be */ - { /* stored back in the stack */ - NEED_FREE_REG(rg); - LOAD_REG_FROM_EBP_BASE(rg, srcstack); - REG_NUMBER(po, rg) = a; - /*SET_RUNTIME_REG_TO(a, rg); ignored*/ - } - /* is there already a pending value at 'dststack'? */ - overridden = ORIGINAL_VINFO(dststack); - if (overridden == NULL || RUNTIME_STACK(overridden) != dststack) - goto can_save_only; /* no -- just save the new value to 'dststack'. - The case RUNTIME_STACK(overridden) != dststack - corresponds to a vinfo_t which has been moved - elsewhere in the mean time. */ - - /* yes -- careful! We might have to save the current value of - 'dststack' before we can overwrite it. */ - SET_RUNTIME_STACK_TO_NONE(overridden); - - if (!RUNTIME_REG_IS_NONE(overridden)) - { - /* no need to save the value, it is already in a register too */ - can_save_only: - /* copy 'a' to 'dststack' */ - SAVE_REG_TO_EBP_BASE(rg, dststack); - /*if (rgb == REG_NONE) - { - REG_NUMBER(po, rg) = NULL; - rg = REG_NONE; - }*/ - } - else - { - /* save 'a' to 'dststack' and load the previous value of 'dststack' - back into the register 'rg' */ - XCHG_REG_AND_EBP_BASE(rg, dststack); - SET_RUNTIME_REG_TO(overridden, rg); - REG_NUMBER(po, rg) = overridden; - rg = REG_NONE; - } - /* Now 'a' is at 'dststack', but might still be in 'rg' too */ - a->source = RunTime_New1(dststack, rg, false, false); - ORIGINAL_VINFO(dststack) = a; /* 'a' is now there */ - - if (code > dm->code_limit) - /* oops, buffer overflow. Start a new buffer */ - code = data_new_buffer(code, dm); - - } - dm->code = code; -} - -static code_t* data_free_unused(code_t* code, struct dmove_s* dm, - vinfo_array_t* aa) -{ - /* decref any object that would be present in 'po' but not at all in - the snapshot. Note that it is uncommon that this function actually - finds any unused object at all. */ - int i = aa->count; - while (i--) - { - vinfo_t* a = aa->items[i]; - if (a != NULL) - { - if (has_rtref(a->source)) - { - PsycoObject* po = dm->po; - code_t* saved_code; - a->source = remove_rtref(a->source); - - saved_code = po->code; - po->code = code; - psyco_decref_rt(po, a); - code = po->code; - po->code = saved_code; - - if (code > dm->code_limit) - /* oops, buffer overflow. Start a new buffer */ - code = data_new_buffer(code, dm); - } - if (a->array != NullArray) - code = data_free_unused(code, dm, a->array); - } - } - return code; -} - -DEFINEFN -code_t* psyco_unify(PsycoObject* po, vcompatible_t* lastmatch, - CodeBufferObject** target) -{ - /* Update 'po' to match 'lastmatch', then jump to 'lastmatch'. */ - - int i; - struct dmove_s dm; - code_t* code = po->code; - code_t* backpointer; - CodeBufferObject* target_codebuf = lastmatch->matching; - int sdepth = get_stack_depth(&target_codebuf->snapshot); - int popsdepth; - char pops[REG_TOTAL+2]; -#if PSYCO_DEBUG - bool has_ccreg = HAS_CCREG(po); -#endif - - extra_assert(lastmatch->diff == NullArray); /* unify with exact match only */ - psyco_assert_coherent(po); - dm.usages_size = sdepth + sizeof(vinfo_t**); - dm.usages = (char*) PyMem_MALLOC(dm.usages_size); - if (dm.usages == NULL) - OUT_OF_MEMORY(); - memset(dm.usages, 0, dm.usages_size); /* set to all NULL */ - memset(dm.copy_regs, 0, sizeof(dm.copy_regs)); - fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, - (fz_find_fn) &data_original_table, - &dm, false); - - dm.po = po; - dm.original_stack_depth = po->stack_depth; - dm.code_origin = code; - dm.code_limit = po->codelimit == NULL ? code : po->codelimit; - dm.private_codebuf = NULL; - - if (sdepth > po->stack_depth) - { - /* more items in the target stack (uncommon case). - Let the stack grow. */ - STACK_CORRECTION(sdepth - po->stack_depth); - po->stack_depth = sdepth; - } - - /* update the stack */ - dm.code = code; - fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, - (fz_find_fn) &data_update_stack, - &dm, true); - code = dm.code; - - /* decref any object that would be present in 'po' but not at all in - the snapshot (data_update_stack() has removed the 'ref' tag of all - vinfo_ts it actually used from 'po') */ - code = data_free_unused(code, &dm, &po->vlocals); - - /* update the registers (1): reg-to-reg moves and exchanges */ - popsdepth = po->stack_depth; - memset(pops, -1, sizeof(pops)); - for (i=0; istack_depth - RUNTIME_STACK(a); - extra_assert(from_tos >= 0); - if (from_tos < REG_TOTAL*sizeof(void*)) - { - char* ptarget = pops + (from_tos / sizeof(void*)); - if (*ptarget == -1) - *ptarget = i; - else - *ptarget = -2; - } - } - } - } - /* update the registers (2): stack-to-register POPs */ - if (popsdepth == po->stack_depth) /* only if no PUSHes have messed things up */ - for (i=0; pops[i]>=0 || pops[i+1]>=0; i++) - { - char reg = pops[i]; - if (reg<0) - {/* If there is only one 'garbage' stack entry, POP it as well. - If there are more, give up and use regular MOVs to load the rest */ - po->stack_depth -= 4; - reg = pops[++i]; - POP_REG(reg); - } - POP_REG(reg); - dm.copy_regs[(int) reg] = NULL; - po->stack_depth -= 4; - } - if (code > dm.code_limit) /* start a new buffer if we wrote past the end */ - code = data_new_buffer(code, &dm); - - /* update the registers (3): stack-to-register loads */ - for (i=0; istack_depth); - if (code > dm.code_limit) /* start a new buffer if we wrote past the end */ - code = data_new_buffer(code, &dm); -#if PSYCO_DEBUG - extra_assert(has_ccreg == HAS_CCREG(po)); -#endif - backpointer = code; - JUMP_TO((code_t*) target_codebuf->codestart); - - /* start a new buffer if the last JUMP_TO overflowed, - but not if we had no room at all in the first place. */ - if (code > dm.code_limit && po->codelimit != NULL) - { - /* the JMP instruction emitted by JUMP_TO() is not position- - independent; we must emit it again at the new position */ - code = data_new_buffer(backpointer, &dm); - JUMP_TO((code_t*) target_codebuf->codestart); - psyco_assert(code <= dm.code_limit); - } - - PyMem_FREE(dm.usages); - if (dm.private_codebuf == NULL) - { - Py_INCREF(target_codebuf); /* no new buffer created */ - *target = target_codebuf; - } - else - { - SHRINK_CODE_BUFFER(dm.private_codebuf, code, "unify"); - *target = dm.private_codebuf; - /* add a jump from the original code buffer to the new one */ - code = po->code; - JUMP_TO((code_t*) dm.private_codebuf->codestart); - dump_code_buffers(); - } - PsycoObject_Delete(po); - return code; -} diff --git a/nodebox/ext/psyco/src/c/i386/idispatcher.h b/nodebox/ext/psyco/src/c/i386/idispatcher.h deleted file mode 100644 index ef85dd1..0000000 --- a/nodebox/ext/psyco/src/c/i386/idispatcher.h +++ /dev/null @@ -1,155 +0,0 @@ - /***************************************************************/ -/*** Processor-specific routines for dispatcher.c ***/ - /***************************************************************/ - -#ifndef _IDISPATCHER_H -#define _IDISPATCHER_H - -#include "../vcompiler.h" -#include "../codegen.h" -#include "iencoding.h" - -#define NEED_STACK_FRAME_HACK 1 - - -/***************************************************************/ - /*** Unification ***/ - -/* idispatcher.c implements psyco_unify(), - whose header is given in dispatcher.h. - Conversely, dispatcher.c implements the following function - which is declared here because it is really internal: */ -typedef void (*fz_find_fn) (vinfo_t* a, RunTimeSource bsource, void* extra); -EXTERNFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, - fz_find_fn callback, void* extra, bool clear); - - -/***************************************************************/ - /*** Promotion ***/ - -/* Define to 1 to emit a "compare/jump-if-equal" pair of instructions - that checks for the most common case (actually the last seen one). */ -#define PROMOTION_FAST_COMMON_CASE 1 - - -#if PROMOTION_FAST_COMMON_CASE - /* for FIX_JUMP_IF_EQUAL() */ -# define INTERNAL_PROMOTION_FIELDS code_t* jump_if_equal_code; -#else -# define INTERNAL_PROMOTION_FIELDS /* nothing */ -#endif - -struct ipromotion_s { - INTERNAL_PROMOTION_FIELDS - /* more stuff follows, this structure is only the head of what - dispatch.c defines as rt_promotion_t */ -}; - - -PSY_INLINE code_t* fix_fast_common_case(void* fs, long value, - code_t* codeptr) -{ -#if PROMOTION_FAST_COMMON_CASE - FIX_JUMP_IF_EQUAL(((struct ipromotion_s*)fs)->jump_if_equal_code, - value, codeptr); -#endif - return codeptr; -} - -PSY_INLINE void* ipromotion_finish(PsycoObject* po, vinfo_t* fix, void* do_promotion) -{ - long xsource; - struct ipromotion_s* fs; - -#if PROMOTION_FAST_COMMON_CASE - code_t* jeqcode; - BEGIN_CODE - NEED_CC(); - RTVINFO_IN_REG(fix); - xsource = fix->source; - RESERVE_JUMP_IF_EQUAL(RSOURCE_REG(xsource)); - jeqcode = code; - END_CODE -#else - xsource = fix->source; -#endif - - fs = (struct ipromotion_s*) psyco_call_code_builder(po, do_promotion, - PROMOTION_FAST_COMMON_CASE, - xsource); -#if PROMOTION_FAST_COMMON_CASE - fs->jump_if_equal_code = jeqcode; -#endif - return fs; -} - - -/***************************************************************/ - /*** Misc. ***/ - -PSY_INLINE void* conditional_jump_to(PsycoObject* po, code_t* target, - condition_code_t condition) -{ - BEGIN_CODE - switch (condition) { - case CC_ALWAYS_FALSE: /* never jumps */ - break; - case CC_ALWAYS_TRUE: - JUMP_TO(target); /* always jumps */ - break; - default: - FAR_COND_JUMP_TO(target, condition); - } - END_CODE - return po->code; -} - -PSY_INLINE void change_cond_jump_target(void* tag, code_t* newtarget) -{ - code_t* code = (code_t*) tag; - /* safety check: do not write a JMP whose target is itself... - would make an endless loop */ - psyco_assert(newtarget != code-5 && newtarget != code-6); - CHANGE_JUMP_TO(newtarget); -} - -PSY_INLINE code_t* resume_after_cond_jump(void* tag) -{ - return (code_t*) tag; -} - -/* reserve a small buffer of code behind po->code in which conditional - code can be stored. See make_code_conditional(). */ -PSY_INLINE void* setup_conditional_code_bounds(PsycoObject* po, PsycoObject* po2, - condition_code_t condition) -{ - code_t* code2 = po->code + SIZE_OF_SHORT_CONDITIONAL_JUMP; - po2->code = code2; - po2->codelimit = code2 + RANGE_OF_SHORT_CONDITIONAL_JUMP; - return NULL; -} - -/* mark a small buffer reserved by setup_conditional_code_bounds() to be - only executed if 'condition' holds. */ -PSY_INLINE void make_code_conditional(PsycoObject* po, code_t* codeend, - condition_code_t condition, void* extra) -{ - code_t* target; - code_t* code2 = po->code + SIZE_OF_SHORT_CONDITIONAL_JUMP; - extra_assert(code2 <= codeend && - codeend <= code2 + RANGE_OF_SHORT_CONDITIONAL_JUMP); - BEGIN_CODE - if (IS_A_SINGLE_JUMP(code2, codeend, target)) - FAR_COND_JUMP_TO(target, condition); /* replace a jump with a cond jump */ - else - { /* other cases: write a short cond jump to skip the block if !condition */ - SHORT_COND_JUMP_TO(codeend, INVERT_CC(condition)); - code = codeend; - } - END_CODE - /* record the known value of 'condition' in the 'po' (non-jump) branch */ - psyco_resolved_cc(po, INVERT_CC(condition)); -} - - -#endif /* _IDISPATCHER_H */ diff --git a/nodebox/ext/psyco/src/c/i386/iencoding.c b/nodebox/ext/psyco/src/c/i386/iencoding.c deleted file mode 100644 index 4d61177..0000000 --- a/nodebox/ext/psyco/src/c/i386/iencoding.c +++ /dev/null @@ -1,736 +0,0 @@ -#include "iencoding.h" -#include "../vcompiler.h" -#include "../codegen.h" -#include "../dispatcher.h" -#include "../codemanager.h" -#include "../Python/frames.h" - - -/* We make no special use of any register but ESP, and maybe EBP - * (if EBP_IF_RESERVED). - * We consider that we can call C functions with arbitrary values in - * all registers but ESP, and that only EAX, ECX and EDX will be - * clobbered. - * We do not use EBP as the frame pointer, unlike normal C compiled - * functions. This makes instruction encodings one byte longer - * (ESP-relative instead of EBP-relative). - */ - -DEFINEVAR -reg_t RegistersLoop[REG_TOTAL] = { - /* following EAX: */ REG_386_ECX, - /* following ECX: */ REG_386_EDX, - /* following EDX: */ REG_386_EBX, - /* following EBX: */ EBP_IS_RESERVED ? REG_386_ESI : REG_386_EBP, - /* following ESP: */ REG_NONE, - /* following EBP: */ EBP_IS_RESERVED ? REG_NONE : REG_386_ESI, - /* following ESI: */ REG_386_EDI, - /* following EDI: */ REG_386_EAX }; - - -#if 0 /* disabled */ -DEFINEFN -code_t* psyco_emergency_jump(PsycoObject* po, code_t* code) -{ - STACK_CORRECTION(INITIAL_STACK_DEPTH - po->stack_depth); /* at most 6 bytes */ - code[0] = 0xE9; /* JMP rel32 */ - code += 5; - *(long*)(code-4) = ((code_t*)(&PyErr_NoMemory)) - code; - /* total: at most 11 bytes. Check the value of EMERGENCY_PROXY_SIZE. */ - return code; -} -#endif - -DEFINEFN -void* psyco_call_code_builder(PsycoObject* po, void* fn, int restore, - RunTimeSource extraarg) -{ - code_t* code = po->code; - void* result; - code_t* fixvalue; - #ifdef __APPLE__ - int aligndelta; - #endif - - if (restore) - TEMP_SAVE_REGS_FN_CALLS; - else - SAVE_REGS_FN_CALLS(true); - - CALL_STACK_ALIGN_DELTA(1+(extraarg != SOURCE_DUMMY), aligndelta); - - /* first pushed argument */ - if (extraarg != SOURCE_DUMMY) - CALL_SET_ARG_FROM_RT(extraarg, 1, 2); /* argument index 1 out of total 2 */ - - /* last pushed argument (will be the first argument of 'fn') */ - code[0] = 0x68; /* PUSH IMM32 */ - fixvalue = code+1; /* will be filled below */ - code[5] = 0xE8; /* CALL fn */ - code += 10; - *(long*)(code-4) = ((code_t*)fn) - code; - - if (restore) - { - /* cancel the effect of CALL_SET_ARG_FROM_RT on po->stack_depth, - to match the 'ADD ESP' instruction below */ - int nb_args = 1 + (extraarg != SOURCE_DUMMY); - po->stack_depth -= 4*(nb_args-1); - - extra_assert(4*nb_args < 128); /* trivially true */ - CODE_FOUR_BYTES(code, - 0x83, /* ADD */ - 0xC4, /* ESP, */ - 4*nb_args, /* 4*nb_args */ - 0); /* not used */ - code += 3; - CALL_STACK_ALIGN_RESTORE(aligndelta); - TEMP_RESTORE_REGS_FN_CALLS_AND_JUMP; - } - else - { - po->stack_depth += 4; /* for the PUSH IMM32 above */ - code[0] = 0xFF; /* JMP *EAX */ - code[1] = 0xE0; - code += 2; - } - - /* make 'fs' point just after the end of the code, aligned */ - result = (void*)(((long)code + 3) & ~ 3); -#if CODE_DUMP - while (code != (code_t*) result) - *code++ = (code_t) 0xCC; /* fill with INT 3 (debugger trap) instructions */ -#endif - *(void**)fixvalue = result; /* set value at code+1 above */ - return result; -} - -DEFINEFN -vinfo_t* psyco_call_psyco(PsycoObject* po, CodeBufferObject* codebuf, - Source argsources[], int argcount, - struct stack_frame_info_s* finfo) -{ - /* this is a simplified version of psyco_generic_call() which - assumes Psyco's calling convention instead of the C's. */ - int i, initial_depth; - Source* p; - bool ccflags; - #ifdef __APPLE__ - int aligncount=0; - #endif - BEGIN_CODE - /* cannot use NEED_CC(): it might clobber one of the registers - mentioned in argsources */ - ccflags = HAS_CCREG(po); - #ifdef __APPLE__ - /* Calculate number of registers that will be pushed by - NEED_REGISTER */ - for (i=0; ilink_stack_depth = po->stack_depth; - ABOUT_TO_CALL_SUBFUNCTION(finfo); - initial_depth = po->stack_depth; - CALL_SET_ARG_IMMED(-1, argcount, argcount+1); - p = argsources; - for (i=argcount; i--; p++) - CALL_SET_ARG_FROM_RT(*p, i, argcount+1); - CALL_C_FUNCTION(codebuf->codestart, argcount+1); - po->stack_depth = initial_depth; /* callee removes arguments */ - RETURNED_FROM_SUBFUNCTION(); - if (ccflags) - POP_CC_FLAGS(); - END_CODE - return generic_call_check(po, CfReturnRef|CfPyErrIfNull, - bfunction_result(po, true)); -} - - -/* run-time vinfo_t creation */ -PSY_INLINE vinfo_t* new_rtvinfo(PsycoObject* po, reg_t reg, bool ref, bool nonneg) { - vinfo_t* vi = vinfo_new(RunTime_New(reg, ref, nonneg)); - REG_NUMBER(po, reg) = vi; - return vi; -} - -PSY_INLINE code_t* write_modrm(code_t* code, code_t middle, - reg_t base, reg_t index, int shift, - unsigned long offset) -{ - /* write a mod/rm encoding. */ - extra_assert(index != REG_386_ESP); - extra_assert(0 <= shift && shift < 4); - if (base == REG_NONE) - { - if (index == REG_NONE) - { - code[0] = middle | 0x05; - *(unsigned long*)(code+1) = offset; - return code+5; - } - else - { - code[0] = middle | 0x04; - code[1] = (shift<<6) | (index<<3) | 0x05; - *(unsigned long*)(code+2) = offset; - return code+6; - } - } - else if (index == REG_NONE) - { - if (base == REG_386_ESP) - { - code[0] = 0x84 | middle; - code[1] = 0x24; - *(unsigned long*)(code+2) = offset; - return code+6; - } - else if (COMPACT_ENCODING && offset == 0 && base!=REG_386_EBP) - { - code[0] = middle | base; - return code+1; - } - else if (COMPACT_ENCODING && offset < 128) - { - code[0] = 0x40 | middle | base; - code[1] = (code_t) offset; - return code+2; - } - else - { - code[0] = 0x80 | middle | base; - *(unsigned long*)(code+1) = offset; - return code+5; - } - } - else - { - code[1] = (shift<<6) | (index<<3) | base; - if (COMPACT_ENCODING && offset == 0 && base!=REG_386_EBP) - { - code[0] = middle | 0x04; - return code+2; - } - else if (COMPACT_ENCODING && offset < 128) - { - code[0] = middle | 0x44; - code[2] = (code_t) offset; - return code+3; - } - else - { - code[0] = middle | 0x84; - *(long*)(code+2) = offset; - return code+6; - } - } -} - -#define NewOutputRegister ((vinfo_t*) 1) - -static reg_t mem_access(PsycoObject* po, code_t opcodes[], vinfo_t* nv_ptr, - long offset, vinfo_t* rt_vindex, int size2, - vinfo_t* rt_extra) -{ - int i; - reg_t basereg, indexreg, extrareg; - - BEGIN_CODE - if (is_runtime(nv_ptr->source)) - { - RTVINFO_IN_REG(nv_ptr); - basereg = RUNTIME_REG(nv_ptr); - } - else - { - offset += CompileTime_Get(nv_ptr->source)->value; - basereg = REG_NONE; - } - - if (rt_vindex != NULL) - { - DELAY_USE_OF(basereg); - RTVINFO_IN_REG(rt_vindex); - indexreg = RUNTIME_REG(rt_vindex); - } - else - indexreg = REG_NONE; - - if (rt_extra == NULL) - extrareg = 0; - else - { - DELAY_USE_OF_2(basereg, indexreg); - if (rt_extra == NewOutputRegister) - NEED_FREE_REG(extrareg); - else - { - if (size2==0) - RTVINFO_IN_BYTE_REG(rt_extra, basereg, indexreg); - else - RTVINFO_IN_REG(rt_extra); - extrareg = RUNTIME_REG(rt_extra); - } - } - - for (i = *opcodes++; i--; ) *code++ = *opcodes++; - code = write_modrm(code, (code_t)(extrareg<<3), basereg, indexreg, size2, - (unsigned long) offset); - for (i = *opcodes++; i--; ) *code++ = *opcodes++; - END_CODE - return extrareg; -} - -DEFINEFN -vinfo_t* psyco_memory_read(PsycoObject* po, vinfo_t* nv_ptr, long offset, - vinfo_t* rt_vindex, int size2, bool nonsigned) -{ - code_t opcodes[4]; - reg_t targetreg; - switch (size2) { - case 0: - /* reading only one byte */ - opcodes[0] = 2; - opcodes[1] = 0x0F; - opcodes[2] = nonsigned - ? 0xB6 /* MOVZX reg, byte [...] */ - : 0xBE; /* MOVSX reg, byte [...] */ - opcodes[3] = 0; - break; - case 1: - /* reading only two bytes */ - opcodes[0] = 2; - opcodes[1] = 0x0F; - opcodes[2] = nonsigned - ? 0xB7 /* MOVZX reg, short [...] */ - : 0xBF; /* MOVSX reg, short [...] */ - opcodes[3] = 0; - break; - default: - /* reading a long */ - opcodes[0] = 1; - opcodes[1] = 0x8B; /* MOV reg, long [...] */ - opcodes[2] = 0; - break; - } - targetreg = mem_access(po, opcodes, nv_ptr, offset, rt_vindex, - size2, NewOutputRegister); - return new_rtvinfo(po, targetreg, false, false); -} - -DEFINEFN -bool psyco_memory_write(PsycoObject* po, vinfo_t* nv_ptr, long offset, - vinfo_t* rt_vindex, int size2, vinfo_t* value) -{ - code_t opcodes[8]; - if (!compute_vinfo(value, po)) return false; - - if (is_runtime(value->source)) - { - switch (size2) { - case 0: - /* writing only one byte */ - opcodes[0] = 1; - opcodes[1] = 0x88; /* MOV byte [...], reg */ - /* 'reg' is forced in mem_access to be an 8-bit register */ - opcodes[2] = 0; - break; - case 1: - /* writing only two bytes */ - opcodes[0] = 2; - opcodes[1] = 0x66; - opcodes[2] = 0x89; /* MOV short [...], reg */ - opcodes[3] = 0; - break; - default: - /* writing a long */ - opcodes[0] = 1; - opcodes[1] = 0x89; /* MOV long [...], reg */ - opcodes[2] = 0; - break; - } - } - else - { - code_t* code1; - long immed = CompileTime_Get(value->source)->value; - value = NULL; /* not run-time */ - switch (size2) { - case 0: - /* writing an immediate byte */ - opcodes[0] = 1; - opcodes[1] = 0xC6; - opcodes[2] = 1; - opcodes[3] = (code_t) immed; - break; - case 1: - /* writing an immediate short */ - opcodes[0] = 2; - opcodes[1] = 0x66; - opcodes[2] = 0xC7; - opcodes[3] = 2; - opcodes[4] = (code_t) immed; - opcodes[5] = (code_t) (immed >> 8); - break; - default: - /* writing an immediate long */ - code1 = opcodes; /* workaround for a GCC overoptimization */ - code1[0] = 1; - code1[1] = 0xC7; - code1[2] = 4; - *(long*)(code1+3) = immed; - break; - } - } - mem_access(po, opcodes, nv_ptr, offset, rt_vindex, size2, value); - return true; -} - - -/* internal, see NEED_CC() */ -EXTERNFN condition_code_t cc_from_vsource(Source source); /* in codegen.c */ - -DEFINEFN -code_t* psyco_compute_cc(PsycoObject* po, code_t* code, reg_t reserved) -{ - int i; - vinfo_t* v; - condition_code_t cc; - reg_t rg; - for (i=0; i<2; i++) { - v = po->ccregs[i]; - if (v == NULL) - continue; - cc = cc_from_vsource(v->source); - - NEED_FREE_BYTE_REG(rg, reserved, REG_NONE); - LOAD_REG_FROM_CONDITION(rg, cc); - - v->source = RunTime_New(rg, false, true); - REG_NUMBER(po, rg) = v; - po->ccregs[i] = NULL; - } - return code; -} - - -/*****************************************************************/ - /*** Emit common instructions ***/ - - -DEFINEFN -vinfo_t* bininstrgrp(PsycoObject* po, int group, bool ovf, bool nonneg, - vinfo_t* v1, vinfo_t* v2) -{ - reg_t rg; - BEGIN_CODE - NEED_CC(); - COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ - COMMON_INSTR_FROM(group, rg, v2->source); /* XXX rg, (v2) */ - END_CODE - if (ovf && runtime_condition_f(po, CC_O)) - return NULL; /* if overflow */ - return new_rtvinfo(po, rg, false, nonneg); -} - -DEFINEFN -vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, bool unsafe) -{ - reg_t rg, dst; - extra_assert(is_runtime(rt1->source)); - BEGIN_CODE - NEED_FREE_REG(dst); - rg = getreg(rt1->source); - if (rg == REG_NONE) - { - rg = dst; - LOAD_REG_FROM(rt1->source, rg); - } - LOAD_REG_FROM_REG_PLUS_IMMED(dst, rg, value2); - END_CODE - return new_rtvinfo(po, dst, false, - unsafe && value2>=0 && is_rtnonneg(rt1->source)); -} - -#define GENERIC_SHIFT_BY(rtmacro, nonneg) \ - { \ - reg_t rg; \ - extra_assert(0 < counter && counter < LONG_BIT); \ - BEGIN_CODE \ - NEED_CC(); \ - COPY_IN_REG(v1, rg); \ - rtmacro(rg, counter); \ - END_CODE \ - return new_rtvinfo(po, rg, false, nonneg); \ - } - -DEFINEFN -vinfo_t* bininstrshift(PsycoObject* po, int group, - bool nonneg, vinfo_t* v1, vinfo_t* v2) -{ - reg_t rg; - BEGIN_CODE - if (RSOURCE_REG(v2->source) != SHIFT_COUNTER) { - NEED_REGISTER(SHIFT_COUNTER); - LOAD_REG_FROM(v2->source, SHIFT_COUNTER); - } - NEED_CC_REG(SHIFT_COUNTER); - DELAY_USE_OF(SHIFT_COUNTER); - COPY_IN_REG(v1, rg); - SHIFT_GENERICCL(rg, group); /* SHx rg, CL */ - END_CODE - return new_rtvinfo(po, rg, false, nonneg); -} - - -DEFINEFN -vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter) - GENERIC_SHIFT_BY(SHIFT_LEFT_BY, false) - -DEFINEFN -vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter) - GENERIC_SHIFT_BY(SHIFT_SIGNED_RIGHT_BY, is_nonneg(v1->source)) - -DEFINEFN -vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter) - GENERIC_SHIFT_BY(SHIFT_RIGHT_BY, true) - -DEFINEFN -vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, bool ovf) -{ - reg_t rg; - BEGIN_CODE - NEED_CC(); - NEED_FREE_REG(rg); - IMUL_IMMED_FROM_RT(v1->source, value2, rg); - END_CODE - if (ovf && runtime_condition_f(po, CC_O)) - return NULL; - return new_rtvinfo(po, rg, false, - ovf && value2>=0 && is_rtnonneg(v1->source)); -} - -DEFINEFN -vinfo_t* bininstrmul(PsycoObject* po, bool ovf, - bool nonneg, vinfo_t* v1, vinfo_t* v2) -{ - reg_t rg; - BEGIN_CODE - NEED_CC(); - COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ - IMUL_REG_FROM_RT(v2->source, rg); /* IMUL rg, (v2) */ - END_CODE - if (ovf && runtime_condition_f(po, CC_O)) - return NULL; /* if overflow */ - return new_rtvinfo(po, rg, false, nonneg); -} - -DEFINEFN -vinfo_t* unaryinstrgrp(PsycoObject* po, int group, bool ovf, - bool nonneg, vinfo_t* v1) -{ - reg_t rg; - BEGIN_CODE - NEED_CC(); - COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ - UNARY_INSTR_ON_REG(group, rg); /* XXX rg */ - END_CODE - if (ovf && runtime_condition_f(po, CC_O)) - return NULL; /* if overflow */ - return new_rtvinfo(po, rg, false, nonneg); -} - -DEFINEFN -vinfo_t* unaryinstrabs(PsycoObject* po, bool ovf, - bool nonneg, vinfo_t* v1) -{ - reg_t rg; - BEGIN_CODE - NEED_CC(); - COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ - INT_ABS(rg, v1->source); /* 'ABS' rg */ - END_CODE - if (ovf && runtime_condition_f(po, CHECK_ABS_OVERFLOW)) - return NULL; /* if overflow */ - return new_rtvinfo(po, rg, false, nonneg); -} - -static const condition_code_t direct_results[16] = { - /***** signed comparison **/ - /* Py_LT: */ CC_L, - /* Py_LE: */ CC_LE, - /* Py_EQ: */ CC_E, - /* Py_NE: */ CC_NE, - /* Py_GT: */ CC_G, - /* Py_GE: */ CC_GE, - /* (6) */ CC_ERROR, - /* (7) */ CC_ERROR, - /***** unsigned comparison **/ - /* Py_LT: */ CC_uL, - /* Py_LE: */ CC_uLE, - /* Py_EQ: */ CC_E, - /* Py_NE: */ CC_NE, - /* Py_GT: */ CC_uG, - /* Py_GE: */ CC_uGE, - /* (14) */ CC_ERROR, - /* (15) */ CC_ERROR }; - -DEFINEFN -condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, - vinfo_t* rt1, long immed2) -{ - BEGIN_CODE - NEED_CC(); - COMPARE_IMMED_FROM_RT(rt1->source, immed2); /* CMP rt1, immed2 */ - END_CODE - return direct_results[base_py_op]; -} - -DEFINEFN -condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, - vinfo_t* v1, vinfo_t* v2) -{ - BEGIN_CODE - NEED_CC(); - RTVINFO_IN_REG(v1); /* CMP v1, v2 */ - COMMON_INSTR_FROM_RT(7, getreg(v1->source), v2->source); - END_CODE - return direct_results[base_py_op]; -} - -DEFINEFN -vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, - long immed_true, long immed_false) -{ - reg_t rg; - BEGIN_CODE - NEED_FREE_REG(rg); - LOAD_REG_FROM_IMMED(rg, immed_true); - SHORT_COND_JUMP_TO(code + SIZE_OF_SHORT_CONDITIONAL_JUMP - + SIZE_OF_LOAD_REG_FROM_IMMED, cc); - LOAD_REG_FROM_IMMED(rg, immed_false); - END_CODE - return new_rtvinfo(po, rg, false, immed_true >= 0 && immed_false >= 0); -} - -DEFINEFN -vinfo_t* bfunction_result(PsycoObject* po, bool ref) -{ - return new_rtvinfo(po, REG_FUNCTIONS_RETURN, ref, false); -} - -DEFINEFN -vinfo_t* make_runtime_copy(PsycoObject* po, vinfo_t* v) -{ - reg_t rg; - if (!compute_vinfo(v, po)) return NULL; - BEGIN_CODE - NEED_FREE_REG(rg); - LOAD_REG_FROM(v->source, rg); - END_CODE - return new_rtvinfo(po, rg, false, is_nonneg(v->source)); -} - - -#if 0 -DEFINEFN -- unused -- -vinfo_t* integer_and_i(PsycoObject* po, vinfo_t* v1, long value2) - GENERIC_BINARY_INSTR_2(4, a & b, /* AND */ - value2>=0 || is_rtnonneg(v1->source)) -#define GENERIC_BINARY_INSTR_2(group, c_code, nonneg) \ -{ \ - if (!compute_vinfo(v1, po)) return NULL; \ - if (is_compiletime(v1->source)) \ - { \ - long a = CompileTime_Get(v1->source)->value; \ - long b = value2; \ - long c = (c_code); \ - return vinfo_new(CompileTime_New(c)); \ - } \ - else \ - { \ - reg_t rg; \ - BEGIN_CODE \ - NEED_CC(); \ - COPY_IN_REG(v1, rg); /* MOV rg, (v1) */ \ - COMMON_INSTR_IMMED(group, rg, value2); /* XXX rg, value2 */ \ - END_CODE \ - return new_rtvinfo(po, rg, false, nonneg); \ - } \ -} -#endif - -#if 0 -DEFINEFN (not used) -vinfo_t* integer_seqindex(PsycoObject* po, vinfo_t* vi, vinfo_t* vn, bool ovf) -{ - NonVirtualSource vns, vis; - vns = vinfo_compute(vn, po); - if (vns == SOURCE_ERROR) return NULL; - vis = vinfo_compute(vi, po); - if (vis == SOURCE_ERROR) return NULL; - - if (!is_compiletime(vis)) - { - reg_t rg, tmprg; - BEGIN_CODE - NEED_CC_SRC(vis); - NEED_FREE_REG(rg); - LOAD_REG_FROM_RT(vis, rg); - DELAY_USE_OF(rg); - NEED_FREE_REG(tmprg); - - /* Increase 'rg' by 'vns' unless it is already in the range(0, vns). */ - /* CMP i, n */ - vns = vn->source; /* reload, could have been moved by NEED_FREE_REG */ - COMMON_INSTR_FROM(7, rg, vns); - /* SBB t, t */ - COMMON_INSTR_FROM_RT(3, tmprg, RunTime_New(tmprg, false...)); - /* AND t, n */ - COMMON_INSTR_FROM(4, tmprg, vns); - /* SUB i, t */ - COMMON_INSTR_FROM_RT(5, rg, RunTime_New(tmprg, false...)); - /* ADD i, n */ - COMMON_INSTR_FROM(0, rg, vns); - END_CODE - - if (ovf && runtime_condition_f(po, CC_NB)) /* if out of range */ - return NULL; - return new_rtvinfo(po, rg, false...); - } - else - { - long index = CompileTime_Get(vis)->value; - long reqlength; - if (index >= 0) - reqlength = index; /* index is known, length must be greater than it */ - else - reqlength = ~index; /* idem for negative index */ - if (ovf) - { - /* test for out of range index -- more precisely, test that the - length is not large enough for the known index */ - condition_code_t cc = integer_cmp_i(po, vn, reqlength, Py_LE); - if (cc == CC_ERROR || runtime_condition_f(po, cc)) - return NULL; - } - if (index >= 0) - { - vinfo_incref(vi); - return vi; - } - else - return integer_add_i(po, vn, index...); - } -} -#endif /* 0 */ diff --git a/nodebox/ext/psyco/src/c/i386/iencoding.h b/nodebox/ext/psyco/src/c/i386/iencoding.h deleted file mode 100644 index e3e88ac..0000000 --- a/nodebox/ext/psyco/src/c/i386/iencoding.h +++ /dev/null @@ -1,1120 +0,0 @@ - /***************************************************************/ -/*** Processor-specific code-producing macros ***/ - /***************************************************************/ - -#ifndef _IENCODING_H -#define _IENCODING_H - - -#include "../psyco.h" -#define MACHINE_CODE_FORMAT "i386" -#define HAVE_FP_FN_CALLS 1 - - - /* set to 0 to emit code that runs on 386 and 486 */ -#ifndef PENTIUM_INSNS -# define PENTIUM_INSNS 1 -#endif - - /* Define to 1 to always write the most compact encoding of instructions. - (a quite minor overhead). Set to 0 to disable. No effect on real - optimizations. */ -#ifndef COMPACT_ENCODING -#ifdef __APPLE__ -/* COMPACT_ENCODING not yet supported on MacOS X */ -# define COMPACT_ENCODING 0 -#else -# define COMPACT_ENCODING 1 -#endif -#endif - -/* Define to 0 to use EBP as any other register, or to 1 to reserve it */ -#ifndef EBP_IS_RESERVED -# define EBP_IS_RESERVED 0 -#endif - - -typedef enum { - REG_386_EAX = 0, - REG_386_ECX = 1, - REG_386_EDX = 2, - REG_386_EBX = 3, - REG_386_ESP = 4, - REG_386_EBP = 5, - REG_386_ESI = 6, - REG_386_EDI = 7, -#define REG_TOTAL 8 - - REG_NONE = -1} reg_t; - -#define REG_FUNCTIONS_RETURN REG_386_EAX -#define REG_ANY_CALLER_SAVED REG_386_EAX /* just any "trash" register */ -#define REG_ANY_CALLEE_SAVED REG_386_EBX /* saved by C functions */ - -typedef enum { - CC_O = 0, /* overflow */ - CC_NO = 1, - CC_B = 2, /* below (unsigned) */ - CC_NB = 3, - CC_E = 4, /* equal */ - CC_NE = 5, - CC_BE = 6, /* below or equal (unsigned) */ - CC_NBE = 7, - CC_S = 8, /* sign (i.e. negative) */ - CC_NS = 9, - CC_L = 12, /* lower than */ - CC_NL = 13, - CC_LE = 14, /* lower or equal */ - CC_NLE = 15, -#define CC_TOTAL 16 -/* synonyms */ - CC_NGE = CC_L, /* not greater or equal */ - CC_GE = CC_NL, /* greater or equal */ - CC_NG = CC_LE, /* not greater than */ - CC_G = CC_NLE, /* greater than */ - CC_uL = CC_B, /* unsigned test */ - CC_uNL = CC_NB, /* unsigned test */ - CC_uLE = CC_BE, /* unsigned test */ - CC_uNLE = CC_NBE, /* unsigned test */ - CC_uNGE = CC_uL, /* unsigned test */ - CC_uGE = CC_uNL, /* unsigned test */ - CC_uNG = CC_uLE, /* unsigned test */ - CC_uG = CC_uNLE, /* unsigned test */ - CC_ALWAYS_FALSE = 16, /* pseudo condition codes for known outcomes */ - CC_ALWAYS_TRUE = 17, - CC_ERROR = -1 } condition_code_t; - -#define INVERT_CC(cc) ((condition_code_t)((int)(cc) ^ 1)) -#define HAVE_CCREG 2 -#define INDEX_CC(cc) ((int)(cc) & 1) -#define HAS_CCREG(po) ((po)->ccregs[0] != NULL || (po)->ccregs[1] != NULL) - - -/* the registers we want Psyco to use in compiled code, - as a circular linked list (see iprocessor.c) */ -EXTERNVAR reg_t RegistersLoop[REG_TOTAL]; - -/* the first register in RegistersLoop that Psyco will use. - The best choice is probably the first callee-saved register */ -#define REG_LOOP_START REG_386_EBX - -/* returns the next register that should be used */ -#define next_free_reg(po) \ - ((po)->last_used_reg = RegistersLoop[(int)((po)->last_used_reg)]) - -/* processor-depend part of PsycoObject */ -#define PROCESSOR_PSYCOOBJECT_FIELDS \ - int stack_depth; /* the size of data currently pushed in the stack */ \ - vinfo_t* reg_array[REG_TOTAL]; /* the 'vinfo_t' currently stored in regs */ \ - vinfo_t* ccregs[2]; /* processor condition codes (aka flags) */ \ - /* ccregs[0] is for "positive" conditions */ \ - /* and ccregs[1] for "negative" ones */ \ - reg_t last_used_reg; /* the most recently used register */ -#define INIT_PROCESSOR_PSYCOOBJECT(po) \ - (po->last_used_reg = REG_LOOP_START) - -#define PROCESSOR_FROZENOBJECT_FIELDS \ - short fz_last_used_reg; -#define SAVE_PROCESSOR_FROZENOBJECT(fpo, po) \ - (fpo->fz_last_used_reg = (int) po->last_used_reg) -#define RESTORE_PROCESSOR_FROZENOBJECT(fpo, po) \ - (po->last_used_reg = (reg_t) fpo->fz_last_used_reg) - -#define INIT_CODE_EMISSION(code) do { /* nothing */ } while (0) -#define POST_CODEBUFFER_SIZE 0 -#define insn_code_label(code) ((code_t*)(code)) - -#define CHECK_STACK_SPACE() do { /* nothing */ } while (0) - - -/*****************************************************************/ - /*** Production of code (common instruction encodings) ***/ - -/* Most of the following macros implicitely use and update the - * local variable 'code'. Some also use 'po'. No macro outside the - * present header file must implicitely use or modify 'code'. - */ - - -/* Written as a large set of macro. */ - -#define RSOURCE_REG(src) getreg(src) -#define RSOURCE_REG_IS_NONE(src) is_reg_none(src) -#define RSOURCE_STACK(src) getstack(src) - -#define RUNTIME_STACK_MAX RunTime_StackMax -#define RUNTIME_STACK_NONE RunTime_StackNone -#define RUNTIME_REG(vi) RSOURCE_REG ((vi)->source) -#define RUNTIME_REG_IS_NONE(vi) RSOURCE_REG_IS_NONE ((vi)->source) -#define RUNTIME_STACK(vi) RSOURCE_STACK ((vi)->source) - -#define SET_RUNTIME_REG_TO(vi, rg) ((vi)->source = \ - set_rtreg_to((vi)->source, rg)) -#define SET_RUNTIME_REG_TO_NONE(vi) ((vi)->source = \ - set_rtreg_to_none((vi)->source)) -#define SET_RUNTIME_STACK_TO(vi, s) ((vi)->source = \ - set_rtstack_to((vi)->source, (s))) -#define SET_RUNTIME_STACK_TO_NONE(vi) ((vi)->source = \ - set_rtstack_to_none((vi)->source)) - -#define KSOURCE_SOURCE(src) CompileTime_Get(src) -#define KNOWN_SOURCE(vi) KSOURCE_SOURCE((vi)->source) - -#define NEXT_FREE_REG() next_free_reg(po) -#define REG_NUMBER(po, rg) ((po)->reg_array[(int)(rg)]) - -/* release a run-time vinfo_t */ -#define RTVINFO_RELEASE(rtsource) do { \ - if (!RSOURCE_REG_IS_NONE(rtsource)) \ - REG_NUMBER(po, RSOURCE_REG(rtsource)) = NULL; \ -} while (0) - -/* move a run-time vinfo_t */ -#define RTVINFO_MOVE(rtsource, vtarget) do { \ - if (!RSOURCE_REG_IS_NONE(rtsource)) \ - REG_NUMBER(po, RSOURCE_REG(rtsource)) = (vtarget); \ -} while (0) - -/* for PsycoObject_Duplicate() */ -#define DUPLICATE_PROCESSOR(result, po) do { \ - int i; \ - for (i=0; itmp; \ - for (i=0; i<2; i++) \ - if (po->ccregs[i] != NULL) \ - result->ccregs[i] = po->ccregs[i]->tmp; \ - \ - result->stack_depth = po->stack_depth; \ - result->last_used_reg = po->last_used_reg; \ -} while (0) - -#define RTVINFO_CHECK(po, vsource, found) do { \ - RunTimeSource _src = (vsource)->source; \ - if (!RSOURCE_REG_IS_NONE(_src)) \ - { \ - extra_assert(REG_NUMBER(po, RSOURCE_REG(_src)) == (vsource)); \ - found[(int) RSOURCE_REG(_src)] = 1; \ - } \ -} while (0) -#define RTVINFO_CHECKED(po, found) do { \ - int i; \ - for (i=0; istack_depth - (stack_pos); \ - extra_assert(0 < (stack_pos) && (stack_pos) <= RUNTIME_STACK_MAX); \ - extra_assert(0 <= _s_p); \ - code[2] = 0x24; \ - if (COMPACT_ENCODING && _s_p == 0) \ - { \ - code[1] = 0x04 | (middle); \ - code += 3; \ - } \ - else if (COMPACT_ENCODING && _s_p < 128) \ - { \ - code[1] = 0x44 | (middle); \ - code[3] = _s_p; \ - code += 4; \ - } \ - else \ - { \ - code[1] = 0x84 | (middle); \ - *(long*)(code+3) = _s_p; \ - code += 7; \ - } \ -} while (0) -#endif - -/* Emit instruction 'opcode' having a mod/rm as its second byte. - Insert 'middle' in the mod/rm. Let the mod/rm point to the given stack_pos. */ -#define INSTR_EBP_BASE(opcode, middle, stack_pos) do { \ - code[0] = (opcode); \ - MODRM_EBP_BASE(middle, stack_pos); \ -} while (0) - - -/* note: the following macro starts writing at code+1 */ -#define MODRM_FROM_RT(source, middle) do { \ - if (RSOURCE_REG_IS_NONE(source)) \ - MODRM_EBP_BASE(middle, RSOURCE_STACK(source)); \ - else { /* register source */ \ - code[1] = 0xC0 | (middle) | RSOURCE_REG(source); \ - code += 2; \ - } \ -} while (0) - -/* Same as INSTR_EBP_BASE but reading from the 'source' of a run-time vinfo_t */ -#define INSTR_MODRM_FROM_RT(source, opcode, middle) do { \ - code[0] = (opcode); \ - MODRM_FROM_RT(source, middle); \ -} while (0) - - -/* The "common instructions" groups: there are 8 arithmetic instructions - whose encodings are identical. Here they are, with their 'group' value: - ADD (group 0) - OR (group 1) - ADC (group 2) - SBB (group 3) - AND (group 4) - SUB (group 5) - XOR (group 6) - CMP (group 7) */ - -/* The following macro encodes "INSTR register, immediate" */ -#define COMMON_INSTR_IMMED(group, rg, value) do { \ - long _v; \ - code[1] = 0xC0 | (group<<3) | (rg); \ - _v = value; \ - if (COMPACT_ENCODING && -128 <= _v && _v < 128) { \ - code[2] = (code_t) _v; \ - code[0] = 0x83; \ - code += 3; \ - } \ - else { \ - *(long*)(code+2) = _v; \ - code[0] = 0x81; \ - code += 6; \ - } \ -} while (0) - -/* Encodes "INSTR register, source" for a run-time or compile-time vinfo_t */ -#define COMMON_INSTR_FROM(group, rg, source) do { \ - if (((source) & TimeMask) == RunTime) \ - COMMON_INSTR_FROM_RT(group, rg, source); \ - else \ - COMMON_INSTR_IMMED(group, rg, KSOURCE_SOURCE(source)->value); \ -} while(0) - -/* Encodes "INSTR register, source" for a run-time vinfo_t */ -#define COMMON_INSTR_FROM_RT(group, rg, source) do { \ - code[0] = group*8 + 3; \ - MODRM_FROM_RT(source, (rg)<<3); \ -} while(0) - -/* Encodes "INSTR reg" for the following instructions: - NOT (group 2) - NEG (group 3) - IDIV (group 7) */ -#define UNARY_INSTR_ON_REG(group, rg) do { \ - code[0] = 0xF7; \ - code[1] = 0xC0 | (group<<3) | (rg); \ - code += 2; \ -} while (0) - -/* Encodes "INSTR source" for the same instructions as above */ -#define UNARY_INSTR_FROM_RT(group, source) do { \ - INSTR_MODRM_FROM_RT(0xF7, source, (group)<<3); \ -} while (0) - -/* Encodes "INC rg" and "DEC rg" */ -#define INCREASE_REG(rg) (*code++ = 0x40 | (rg)) -#define DECREASE_REG(rg) (*code++ = 0x48 | (rg)) - -/* Encodes taking absolute value of the register 'rg' knowing that - 'sourcecopy' is a (run-time) copy of 'rg' */ -#define INT_ABS(rg, sourcecopy) do { \ - /* as you can check the following takes the absolute value of (say) EAX: \ - ADD EAX, EAX \ - SBB EAX, sourcecopy \ - SBB EDX, EDX \ - XOR EAX, EDX \ - (note: although the idea is not original, the above code might be \ - original as it has been found by an exhaustive search on *all* \ - short codes :-) \ - */ \ - reg_t _rg2; \ - code[0] = 0x01; \ - code[1] = 0xC0 | ((rg)<<3) | (rg); /* ADD rg, rg */ \ - code += 2; \ - COMMON_INSTR_FROM_RT(3, rg, sourcecopy); /* SBB rg, sourcecopy */ \ - DELAY_USE_OF(rg); \ - NEED_FREE_REG(_rg2); \ - code[0] = 0x19; \ - code[1] = 0xC0 | (_rg2<<3) | _rg2; /* SBB _rg2, _rg2 */ \ - code[2] = 0x31; \ - code[3] = 0xC0 | (_rg2<<3) | (rg); /* XOR rg, _rg2 */ \ - code += 4; \ -} while (0) -#define CHECK_ABS_OVERFLOW CC_S - -/* Encodes a check (zero/non-zero) on the given 'source' */ -#define CHECK_NONZERO_FROM_RT(source, rcc) do { \ - NEED_CC_SRC(source); \ - if (RSOURCE_REG_IS_NONE(source)) \ - { \ - INSTR_MODRM_FROM_RT(source, 0x83, 7<<3); /* CMP (source), imm8 */ \ - *code++ = 0; \ - } \ - else \ - CHECK_NONZERO_REG(RSOURCE_REG(source)); \ - rcc = CC_NE; /* a.k.a. NZ flag */ \ -} while (0) -#define CHECK_NONZERO_REG(rg) ( \ - code[0] = 0x85, /* TEST reg, reg */ \ - code[1] = 0xC0 | ((rg)*9), \ - code += 2) - -#define COMPARE_IMMED_FROM_RT(source, immed) do { \ - long _value = (immed); \ - if (COMPACT_ENCODING && -128 <= _value && _value < 128) \ - /*if (_value == 0 && !RSOURCE_REG_IS_NONE(source)) \ - CHECK_NONZERO_REG(RSOURCE_REG(source)); \ - else*/ { \ - INSTR_MODRM_FROM_RT(source, 0x83, 7<<3); /* CMP (source), imm8 */ \ - *code++ = (code_t) _value; \ - } \ - else { \ - INSTR_MODRM_FROM_RT(source, 0x81, 7<<3); /* CMP (source), imm32 */ \ - *(long*)code = _value; \ - code += 4; \ - } \ -} while (0) - -/* Signed integer multiplications */ -#define IMUL_REG_FROM_RT(source, rg) do { \ - *code++ = 0x0F; /* IMUL rg, source */ \ - INSTR_MODRM_FROM_RT(source, 0xAF, (rg)<<3); \ -} while (0) - -#define IMUL_IMMED_FROM_RT(source, immed, dstrg) do { \ - long _value = (immed); \ - code_t opcode = (COMPACT_ENCODING && -128 <= _value && _value < 128) \ - ? 0x6B : 0x69; /* IMUL dstrg, source, immed */ \ - INSTR_MODRM_FROM_RT(source, opcode, (dstrg)<<3); \ - if (opcode == 0x69) { \ - *(long*)code = _value; \ - code += 4; \ - } \ - else \ - *code++ = (code_t) _value; \ -} while (0) - -/* Shitfs. The counters must never be >=32. */ -#define SHIFT_GENERIC1(rg, cnt, middle) do { \ - code[1] = 0xC0 | ((middle)<<3) | (rg); \ - if (COMPACT_ENCODING && cnt==1) { \ - code[0] = 0xD1; \ - code += 2; \ - } \ - else { \ - code[0] = 0xC1; \ - code[2] = (cnt); \ - code += 3; \ - } \ -} while (0) -#define SHIFT_COUNTER REG_386_ECX /* must be in range(0,32) */ -#define SHIFT_GENERICCL(rg, middle) do { \ - code[0] = 0xD3; \ - code[1] = 0xC0 | ((middle)<<3) | (rg); \ - code += 2; \ -} while (0) - -#define SHIFT_LEFT_BY(rg, cnt) SHIFT_GENERIC1(rg, cnt, 4) -#define SHIFT_LEFT_CL(rg) SHIFT_GENERICCL(rg, 4) -#define SHIFT_RIGHT_BY(rg, cnt) SHIFT_GENERIC1(rg, cnt, 5) -#define SHIFT_RIGHT_CL(rg) SHIFT_GENERICCL(rg, 5) -#define SHIFT_SIGNED_RIGHT_BY(rg, cnt) SHIFT_GENERIC1(rg, cnt, 7) -#define SHIFT_SIGNED_RIGHT_CL(rg) SHIFT_GENERICCL(rg, 7) - - -EXTERNFN vinfo_t* bininstrgrp(PsycoObject* po, int group, bool ovf, - bool nonneg, vinfo_t* v1, vinfo_t* v2); -EXTERNFN vinfo_t* bininstrmul(PsycoObject* po, bool ovf, - bool nonneg, vinfo_t* v1, vinfo_t* v2); -EXTERNFN vinfo_t* bininstrshift(PsycoObject* po, int group, - bool nonneg, vinfo_t* v1, vinfo_t* v2); -EXTERNFN condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, - vinfo_t* v1, vinfo_t* v2); -EXTERNFN vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, - long immed_true, long immed_false); -EXTERNFN vinfo_t* unaryinstrgrp(PsycoObject* po, int group, bool ovf, - bool nonneg, vinfo_t* v1); -EXTERNFN vinfo_t* unaryinstrabs(PsycoObject* po, bool ovf, - bool nonneg, vinfo_t* v1); - -#define BINARY_INSTR_ADD(ovf, nonneg) bininstrgrp(po, 0, ovf, nonneg, v1, v2) -#define BINARY_INSTR_OR( ovf, nonneg) bininstrgrp(po, 1, ovf, nonneg, v1, v2) -#define BINARY_INSTR_AND(ovf, nonneg) bininstrgrp(po, 4, ovf, nonneg, v1, v2) -#define BINARY_INSTR_SUB(ovf, nonneg) bininstrgrp(po, 5, ovf, nonneg, v1, v2) -#define BINARY_INSTR_XOR(ovf, nonneg) bininstrgrp(po, 6, ovf, nonneg, v1, v2) -#define BINARY_INSTR_MUL(ovf, nonneg) bininstrmul(po, ovf, nonneg, v1, v2) -#define BINARY_INSTR_LSHIFT( nonneg) bininstrshift(po, 4, nonneg, v1, v2) -#define BINARY_INSTR_RSHIFT( nonneg) bininstrshift(po, 7, nonneg, v1, v2) -#define BINARY_INSTR_CMP(base_py_op) bininstrcmp(po, base_py_op, v1, v2) -#define BINARY_INSTR_COND(cc, i1, i2) bininstrcond(po, cc, i1, i2) -#define UNARY_INSTR_INV(ovf, nonneg) unaryinstrgrp(po, 2, ovf, nonneg, v1) -#define UNARY_INSTR_NEG(ovf, nonneg) unaryinstrgrp(po, 3, ovf, nonneg, v1) -#define UNARY_INSTR_ABS(ovf, nonneg) unaryinstrabs(po, ovf, nonneg, v1) - -EXTERNFN vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, - bool unsafe); -EXTERNFN vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, - bool ovf); -EXTERNFN vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter); -EXTERNFN vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter); -EXTERNFN vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter); -EXTERNFN condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, - vinfo_t* rt1, long immed2); -EXTERNFN vinfo_t* bfunction_result(PsycoObject* po, bool ref); - -/*****************************************************************/ - -/* PUSH the value described in the 'source' of a run-time vinfo_t */ -#define PUSH_FROM_RT(source) do { \ - if (RSOURCE_REG_IS_NONE(source)) \ - PUSH_EBP_BASE(RSOURCE_STACK(source)); \ - else \ - PUSH_REG(RSOURCE_REG(source)); \ -} while (0) - -/* insert a PUSH_FROM_RT at point 'insert_at' in the given 'code1' */ -/* EXTERNFN code_t* insert_push_from_rt(PsycoObject* po, code_t* code1, */ -/* long source, code_t* insert_at); */ - -/* PUSH a run-time or compile-time vinfo_t's value */ -#define PUSH_FROM(source) do { \ - if (((source) & TimeMask) == RunTime) \ - PUSH_FROM_RT(source); \ - else \ - PUSH_IMMED(KSOURCE_SOURCE(source)->value); \ -} while (0) - - -/*****************************************************************/ - /*** Some basic management instructions... ***/ - -/* these two macros do not actually emit the code. - They just give you the one-byte instruction encoding. */ -#define PUSH_REG_INSTR(reg) (0x50 | (reg)) -#define POP_REG_INSTR(reg) (0x58 | (reg)) - -#define PUSH_REG(reg) (*code++ = PUSH_REG_INSTR(reg)) -#define POP_REG(reg) (*code++ = POP_REG_INSTR(reg)) - -#define PUSH_CC_FLAGS_INSTR 0x9C /* PUSHF */ -#define POP_CC_FLAGS_INSTR 0x9D /* POPF */ - -#define PUSH_CC_FLAGS() (*code++ = PUSH_CC_FLAGS_INSTR) -#define POP_CC_FLAGS() (*code++ = POP_CC_FLAGS_INSTR) - -#define LOAD_REG_FROM_REG(dst, src) ( \ - code[0] = 0x89, /* MOV dst, src */ \ - code[1] = 0xC0 | ((src) << 3) | (dst), \ - code += 2 \ -) - -#define XCHG_REGS(rg1, rg2) do { \ - if (COMPACT_ENCODING && ((rg1) == REG_386_EAX)) \ - *code++ = 0x90 | (rg2); \ - else if (COMPACT_ENCODING && ((rg2) == REG_386_EAX)) \ - *code++ = 0x90 | (rg1); \ - else { \ - code[0] = 0x87; \ - code[1] = 0xC0 | ((rg2)<<3) | (rg1); \ - code += 2; \ - } \ -} while (0) - -#define LOAD_REG_FROM_IMMED(dst, immed) ( \ - code[0] = 0xB8 | (dst), /* MOV dst, immed */ \ - *(long*)(code+1) = (immed), \ - code += 5 \ -) -#define SIZE_OF_LOAD_REG_FROM_IMMED 5 - -/* loads 0 in a register. The macro name reminds you that this - clobbers po->ccreg (use NEED_CC() to save it first). */ -/* #define CLEAR_REG_CLOBBER_CC(rg) ( \ */ -/* code[0] = 0x33, * XOR rg, rg * \ */ -/* code[1] = 0xC0 | ((rg)<<3) | (rg), \ */ -/* code += 2 \ */ -/* ) */ - -#define LOAD_REG_FROM_EBP_BASE(dst, stack_pos) \ - INSTR_EBP_BASE(0x8B, (dst)<<3, stack_pos) /* MOV dst, [EBP-stack_pos] */ - -#define SAVE_REG_TO_EBP_BASE(src, stack_pos) \ - INSTR_EBP_BASE(0x89, (src)<<3, stack_pos) /* MOV [EBP-stack_pos], src */ - -#define XCHG_REG_AND_EBP_BASE(src, stack_pos) \ - INSTR_EBP_BASE(0x87, (src)<<3, stack_pos) /* XCHG src, [EBP-stack_pos] */ - -#define SAVE_IMMED_TO_EBP_BASE(immed, stack_pos) do { \ - INSTR_EBP_BASE(0xC7, 0<<3, stack_pos); /* MOV [EBP-stack_pos], immed */\ - *(long*)code = (immed); \ - code += 4; \ -} while (0) - -#define SAVE_IMM8_TO_EBP_BASE(imm8, stack_pos) do { \ - INSTR_EBP_BASE(0xC6, 0<<3, stack_pos); /* MOV byte [EBP-stack_pos], imm8 */\ - *code++ = (imm8); \ -} while (0) - -#define ABOUT_TO_CALL_SUBFUNCTION(finfo) \ - SAVE_IMMED_TO_EBP_BASE((long)(finfo), INITIAL_STACK_DEPTH) -#define RETURNED_FROM_SUBFUNCTION() \ - SAVE_IMM8_TO_EBP_BASE(-1, INITIAL_STACK_DEPTH) - -#define LOAD_REG_FROM_RT(source, dst) \ - INSTR_MODRM_FROM_RT(source, 0x8B, (dst)<<3) /* MOV dst, (...) */ - -#define SAVE_REG_TO_RT(source, src) \ - INSTR_MODRM_FROM_RT(source, 0x89, (src)<<3) /* MOV (...), src */ - -#define PUSH_EBP_BASE(ofs) \ - INSTR_EBP_BASE(0xFF, 0x30, ofs) /* PUSH [EBP-ofs] */ - -#define POP_EBP_BASE(ofs) \ - INSTR_EBP_BASE(0x8F, 0x00, ofs) /* POP [EBP-ofs] */ - -#define PUSH_IMMED(immed) do { \ - if (COMPACT_ENCODING && -128 <= (immed) && (immed) < 128) { \ - code[0] = 0x6A; /* PUSH imm8 */ \ - code[1] = (code_t) (immed); \ - code += 2; \ - } \ - else { \ - code[0] = 0x68; /* PUSH imm32 */ \ - *(long*)(code+1) = (immed); \ - code += 5; \ - } \ -} while (0) - -/* call a function written in C. Use the macros CALL_SET_ARG_xxx() for - each argument in reverse order, then use CALL_C_FUNCTION(). */ -/* Note: the update of po->stack_depth saves one "ADD ESP, 4*nb_args" - at the end of the call. If the stack is to be kept as compact as - possible we might as well write the instruction. We have to - update po->stack_depth at each CALL_SET_ARG_xxx (instead of just - in CALL_C_FUNCTION) because run-time arguments after the first one - would be fetched at the wrong place otherwise. */ -#define CALL_SET_ARG_IMMED(immed, arg_index, nb_args) do { \ - PUSH_IMMED(immed); \ - po->stack_depth += 4; \ -} while (0) -#define CALL_SET_ARG_FROM_RT(source, arg_index, nb_args) do { \ - PUSH_FROM_RT(source); \ - po->stack_depth += 4; \ -} while (0) -#define CALL_SET_ARG_FROM(source, arg_index, nb_args) do { \ - PUSH_FROM(source); \ - po->stack_depth += 4; \ -} while (0) -#define CALL_SET_ARG_FROM_ADDR_CLOBBER_REG REG_ANY_CALLER_SAVED -#define CALL_SET_ARG_FROM_ADDR(source, arg_index, nb_args) do { \ - LOAD_ADDRESS_FROM_RT(source, CALL_SET_ARG_FROM_ADDR_CLOBBER_REG); \ - CALL_SET_ARG_FROM_RT(RunTime_New(CALL_SET_ARG_FROM_ADDR_CLOBBER_REG, \ - false, false), arg_index, nb_args); \ -} while (0) -#define CALL_C_FUNCTION(target, nb_args) do { \ - code[0] = 0xE8; /* CALL */ \ - code += 5; \ - *(long*)(code-4) = (code_t*)(target) - code; \ -} while (0) -#define CALL_C_FUNCTION_FROM_RT(source, nb_args) \ - INSTR_MODRM_FROM_RT(source, 0xFF, 2<<3) /* CALL [source] */ -#define CALL_C_FUNCTION_FROM(source, nb_args) do { \ - if (((source) & CompileTime) != 0) \ - CALL_C_FUNCTION(KSOURCE_SOURCE(source)->value, nb_args); \ - else \ - CALL_C_FUNCTION_FROM_RT(source, nb_args); \ -} while (0) -/* optimization of a CALL followed by a JMP */ -#define CALL_C_FUNCTION_AND_JUMP(target, nb_args, jmptarget) do { \ - PUSH_IMMED((long)(jmptarget)); \ - JUMP_TO((code_t*)(target)); \ -} while (0) - -#ifdef __APPLE__ -/* Stack alignment for MacOS X IA-32 ABI */ -#define CALL_STACK_ALIGN_DELTA(nbargs, delta) do { \ - int sp = po->stack_depth-INITIAL_STACK_DEPTH+(nbargs)*4; \ - delta = ((sp+15)&~15)-sp; \ - po->stack_depth += delta; \ - STACK_CORRECTION(delta); \ -} while (0) - -#define CALL_STACK_ALIGN(nbargs) do { \ - int delta; \ - CALL_STACK_ALIGN_DELTA(nbargs, delta); \ -} while (0) - -#define CALL_STACK_ALIGN_RESTORE(delta) do { \ - po->stack_depth -= delta; \ - STACK_CORRECTION(-delta); \ -} while (0) -#else -/* Dummy stack alignment for non-MacOS X */ -#define CALL_STACK_ALIGN_DELTA(nbargs, delta) -#define CALL_STACK_ALIGN(nbargs) -#define CALL_STACK_ALIGN_RESTORE(delta) -#endif - -/* load the 'dst' register with the run-time address of 'source' - which must be in the stack */ -#define LOAD_ADDRESS_FROM_RT(source, dst) do { \ - extra_assert(RSOURCE_STACK(source) != RUNTIME_STACK_NONE); \ - INSTR_MODRM_FROM_RT(source, 0x8D, ((dst)<<3)); /* LEA dst, [source] */ \ -} while (0) - -#define LOAD_REG_FROM_REG_PLUS_REG(dst, rg1, rg2) do { \ - code[0] = 0x8D; \ - code[1] = 0x04 | ((dst)<<3); /* LEA dst, [rg1+rg2] */ \ - code[2] = ((rg1)<<3) | (rg2); \ - if (!EBP_IS_RESERVED && (rg2) == REG_386_EBP) \ - { \ - if ((rg1) != REG_386_EBP) \ - code[2] = ((rg2)<<3) | (rg1); \ - else \ - { \ - code[1] |= 0x40; \ - code[3] = 0; \ - code++; \ - } \ - } \ - code += 3; \ -} while (0) - -#define LOAD_REG_FROM_REG_PLUS_IMMED(dst, rg1, immed) do { \ - long _value = (immed); \ - code[0] = 0x8D; /* LEA dst,[rg1+immed] */ \ - if (COMPACT_ENCODING && -128 <= _value && _value < 128) { \ - code[1] = 0x40 | (dst)<<3 | (rg1); \ - code[2] = (code_t) _value; \ - code += 3; \ - } \ - else { \ - code[1] = 0x80 | (dst)<<3 | (rg1); \ - *(long*)(code+2) = _value; \ - code += 6; \ - } \ -} while (0) - - -/* saving and restoring the registers currently in use (see also - SAVE_REGS_FN_CALLS) */ -#define TEMP_SAVE_REGS_FN_CALLS do { \ - if (COMPACT_ENCODING) { \ - if (REG_NUMBER(po, REG_386_EAX) != NULL) PUSH_REG(REG_386_EAX); \ - if (REG_NUMBER(po, REG_386_ECX) != NULL) PUSH_REG(REG_386_ECX); \ - if (REG_NUMBER(po, REG_386_EDX) != NULL) PUSH_REG(REG_386_EDX); \ - if (HAS_CCREG(po)) PUSH_CC_FLAGS(); \ - } \ - else { \ - CODE_FOUR_BYTES(code, \ - PUSH_REG_INSTR(REG_386_EAX), \ - PUSH_REG_INSTR(REG_386_ECX), \ - PUSH_REG_INSTR(REG_386_EDX), \ - PUSH_CC_FLAGS_INSTR); \ - code += 4; \ - } \ -} while (0) - -#define TEMP_RESTORE_REGS_FN_CALLS do { \ - if (COMPACT_ENCODING) { \ - if (HAS_CCREG(po)) POP_CC_FLAGS(); \ - if (REG_NUMBER(po, REG_386_EDX) != NULL) POP_REG(REG_386_EDX); \ - if (REG_NUMBER(po, REG_386_ECX) != NULL) POP_REG(REG_386_ECX); \ - if (REG_NUMBER(po, REG_386_EAX) != NULL) POP_REG(REG_386_EAX); \ - } \ - else { \ - CODE_FOUR_BYTES(code, \ - POP_CC_FLAGS_INSTR, \ - POP_REG_INSTR(REG_386_EDX), \ - POP_REG_INSTR(REG_386_ECX), \ - POP_REG_INSTR(REG_386_EAX)); \ - code += 4; \ - } \ -} while (0) - -/* same as above, but concludes with a JMP *EAX */ -#define TEMP_RESTORE_REGS_FN_CALLS_AND_JUMP do { \ - if (COMPACT_ENCODING) { \ - if (HAS_CCREG(po)) POP_CC_FLAGS(); \ - if (REG_NUMBER(po, REG_386_EDX) != NULL) POP_REG(REG_386_EDX); \ - if (REG_NUMBER(po, REG_386_ECX) != NULL) POP_REG(REG_386_ECX); \ - } \ - else { \ - CODE_FOUR_BYTES(code, \ - POP_CC_FLAGS_INSTR, \ - POP_REG_INSTR(REG_386_EDX), \ - POP_REG_INSTR(REG_386_ECX), \ - 0 /* dummy */); \ - code += 3; \ - } \ - if (!COMPACT_ENCODING || REG_NUMBER(po, REG_386_EAX) != NULL) { \ - /* must restore EAX, but it contains the jump target... */ \ - CODE_FOUR_BYTES(code, \ - 0x87, \ - 0x04, \ - 0x24, /* XCHG EAX, [ESP] */ \ - 0xC3); /* RET */ \ - code += 4; \ - } \ - else { \ - code[0] = 0xFF; \ - code[1] = 0xE0; /* JMP *EAX */ \ - code += 2; \ - } \ -} while (0) - - -/* put an immediate value in memory */ -#define SET_REG_ADDR_TO_IMMED(rg, immed) do { \ - code[0] = 0xC7; /* MOV [reg], immed */ \ - if (EBP_IS_RESERVED || (rg) != REG_386_EBP) \ - { \ - extra_assert((rg) != REG_386_EBP); \ - code[1] = (rg); \ - } \ - else \ - { \ - *++code = 0x45; \ - code[1] = 0; \ - } \ - *(long*)(code+2) = (immed); \ - code += 6; \ -} while (0) - -/* put an immediate value in memory */ -#define SET_IMMED_ADDR_TO_IMMED(addr, immed) do { \ - code[0] = 0xC7; /* MOV [addr], immed */ \ - code[1] = 0x05; \ - *(long*)(code+2) = (addr); \ - *(long*)(code+6) = (immed); \ - code += 10; \ -} while (0) - -#define FUNCTION_RET(popbytes) do { \ - /* emit a 'RET xxx' instruction that pops and jumps to the address \ - which is now at the top of the stack, and finishes to clean the \ - stack by removing everything left past the return address \ - (typically the arguments, although it could be anything). */ \ - int _b = popbytes; \ - extra_assert(0 < _b); \ - if (_b >= 0x8000) \ - { \ - /* uncommon case: too many stuff left in the stack for the 16-bit \ - immediate we can encoding in RET */ \ - POP_REG(REG_386_EDX); \ - STACK_CORRECTION(-_b); \ - PUSH_REG(REG_386_EDX); \ - _b = 0; \ - } \ - code[0] = 0xC2; /* RET imm16 */ \ - *(short*)(code+1) = _b; \ - code += 3; \ -} while (0) - - -/*****************************************************************/ - /*** vinfo_t saving ***/ - -/* save 'vi', which is currently in register 'rg'. */ -#define SAVE_REG_VINFO(vi, rg) do { \ - PUSH_REG(rg); \ - po->stack_depth += 4; \ - SET_RUNTIME_STACK_TO(vi, po->stack_depth); \ -} while (0) - -/* * save 'vi' if needed. * */ -/* #define SAVE_VINFO(vi) do { */ -/* if (((vi)->source & (TIME_MASK | RUNTIME_STACK_MASK)) == */ -/* (RUN_TIME | RUNTIME_STACK_NONE)) */ -/* SAVE_REG_VINFO(vi, RUNTIME_REG(vi), 0); */ -/* } while (0) */ - -/* ensure that the register 'rg' is free */ -#define NEED_REGISTER(rg) do { \ - vinfo_t* _content = REG_NUMBER(po, (rg)); \ - if (_content != NULL) { \ - if (RUNTIME_STACK(_content) == RUNTIME_STACK_NONE) \ - SAVE_REG_VINFO(_content, rg); \ - SET_RUNTIME_REG_TO_NONE(_content); \ - REG_NUMBER(po, (rg)) = NULL; \ - } \ -} while (0) - -/* ensure that the condition code flags of the processor no - longer contain any useful information */ - -#define NEED_CC() NEED_CC_REG(REG_NONE) -/* same as NEED_CC() but don't overwrite rg */ -#define NEED_CC_REG(rg) do { \ - if (HAS_CCREG(po)) \ - code = psyco_compute_cc(po, code, (rg)); \ -} while (0) -/* same as NEED_CC() but don't overwrite the given source */ -#define NEED_CC_SRC(src) \ - NEED_CC_REG(is_runtime(src) ? RSOURCE_REG(src) : REG_NONE) -/* internal */ -EXTERNFN code_t* psyco_compute_cc(PsycoObject* po, code_t* code, reg_t reserved); - -#define LOAD_REG_FROM_CONDITION(rg, cc) do { /* 'rg' is an 8-bit reg */ \ - code[0] = 0x0F; /* SETcond rg8 */ \ - code[1] = 0x90 | (cc); \ - code[2] = 0xC0 | (rg); /* actually an 8-bit register, but the first four \ - 32-bit registers have the same number as their \ - respective lower-8-bit parts */ \ - code[3] = 0x0F; \ - code[4] = 0xB6; /* MOVZX rg32, rg8 */ \ - code[5] = 0xC0 | ((rg)*9); \ - code += 6; \ -} while (0) - -/* save all registers that might be clobbered by a call to a C function */ -#define SAVE_REGS_FN_CALLS(cc) do { \ - if (cc) NEED_CC(); \ - NEED_REGISTER(REG_386_EAX); \ - NEED_REGISTER(REG_386_ECX); \ - NEED_REGISTER(REG_386_EDX); \ -} while (0) - -#define NEED_FREE_REG_COND(targ, cond) do { \ - targ = po->last_used_reg; \ - if (!(cond) || REG_NUMBER(po, targ) != NULL) { \ - do { \ - targ = NEXT_FREE_REG(); \ - } while (!(cond)); \ - NEED_REGISTER(targ); \ - } \ -} while (0) - -/* like NEED_REGISTER but 'targ' is an output argument which will - receive the number of a now-free register */ -#define NEED_FREE_REG(targ) NEED_FREE_REG_COND(targ, 1) -#define IS_BYTE_REG(rg) (REG_386_EAX <= (rg) && (rg) <= REG_386_EBX) -#define NEED_FREE_BYTE_REG(targ, resrv1, resrv2) \ - NEED_FREE_REG_COND(targ, IS_BYTE_REG(targ) && \ - targ!=(resrv1) && targ!=(resrv2)) - -/* make sure that the register 'reg' will not - be returned by the next call to NEED_FREE_REG() */ -#define DELAY_USE_OF(reg) do { \ - if (RegistersLoop[(int) po->last_used_reg] == (reg)) \ - po->last_used_reg = (reg); \ - if (po->last_used_reg == (reg)) \ - NEXT_FREE_REG(); \ -} while (0) - -/* the same for two registers */ -#define DELAY_USE_OF_2(rg1, rg2) do { \ - DELAY_USE_OF(rg1); \ - DELAY_USE_OF(rg2); \ - DELAY_USE_OF(rg1); \ -} while (0) - -/* the same if the given source is run-time and in a register */ -#define DONT_OVERWRITE_SOURCE(src) do { \ - if (is_runtime_with_reg(src)) \ - DELAY_USE_OF(RSOURCE_REG(src)); \ -} while (0) - - -/*****************************************************************/ - /*** vinfo_t restoring ***/ - -/* ensure that a run-time vinfo is in a register */ -#define RTVINFO_IN_REG(vi) do { \ - if (RUNTIME_REG_IS_NONE(vi)) { \ - /* reload the vinfo from the stack */ \ - reg_t _rg; \ - long _stack; \ - NEED_FREE_REG(_rg); \ - REG_NUMBER(po, _rg) = (vi); \ - _stack = RUNTIME_STACK(vi); \ - SET_RUNTIME_REG_TO(vi, _rg); \ - LOAD_REG_FROM_EBP_BASE(_rg, _stack); \ - } \ -} while (0) - -#define RTVINFO_IN_BYTE_REG(vi, resrv1, resrv2) do { \ - reg_t _currg = RUNTIME_REG(vi); \ - if (!IS_BYTE_REG(_currg)) { \ - reg_t _rg; \ - NEED_FREE_BYTE_REG(_rg, resrv1, resrv2); \ - if (_currg != REG_NONE) \ - REG_NUMBER(po, _currg) = NULL; \ - REG_NUMBER(po, _rg) = (vi); \ - LOAD_REG_FROM_RT((vi)->source, _rg); \ - SET_RUNTIME_REG_TO(vi, _rg); \ - } \ -} while (0) - -/* load register 'dst' from the given non-virtual source vinfo */ -#define LOAD_REG_FROM(source, dst) do { \ - if (((source) & CompileTime) != 0) \ - LOAD_REG_FROM_IMMED(dst, KSOURCE_SOURCE(source)->value); \ - else { \ - if (RSOURCE_REG(source) != dst) \ - LOAD_REG_FROM_RT(source, dst); \ - } \ -} while (0) - - -/*****************************************************************/ - /*** conditional jumps ***/ - -#define JUMP_TO(addr) do { \ - code[0] = 0xE9; /* JMP rel32 */ \ - code += 5; \ - *(long*)(code-4) = (addr) - code; \ -} while (0) - -#define IS_A_JUMP(code, targetaddr) \ - (code[0]==(code_t)0xE9 && (targetaddr=code+5+*(long*)(code+1), 1)) - -#define IS_A_SINGLE_JUMP(code, codeend, targetaddr) \ - ((codeend)-(code) == SIZE_OF_FAR_JUMP && IS_A_JUMP(code, targetaddr)) - -#define FAR_COND_JUMP_TO(addr, condition) do { \ - code[0] = 0x0F; /* Jcond rel32 */ \ - code[1] = 0x80 | (code_t)(condition); \ - code += 6; \ - *(long*)(code-4) = (addr) - code; \ -} while (0) -#define CHANGE_JUMP_TO(addr) do { \ - *(long*)(code-4) = (addr) - code; \ -} while (0) - -#define SIZE_OF_FAR_JUMP 5 -#define MAXIMUM_SIZE_OF_FAR_JUMP SIZE_OF_FAR_JUMP -#define SIZE_OF_SHORT_CONDITIONAL_JUMP 2 /* Jcond rel8 */ -#define RANGE_OF_SHORT_CONDITIONAL_JUMP 127 /* max. positive offset */ - -#define SHORT_COND_JUMP_TO(addr, condition) do { \ - long _ofs = (addr) - (code+2); \ - extra_assert(-128 <= _ofs && _ofs < 128); \ - code[0] = 0x70 | (code_t)(condition); \ - code[1] = (code_t) _ofs; \ - code += 2; \ -} while (0) - -/* reverse room for a CMP/JE pair of instructions */ -#define RESERVE_JUMP_IF_EQUAL(rg) do { \ - code[0] = 0x81; \ - code[1] = 0xC0 | (7<<3) | (rg); /* CMP rg, imm32 */ \ - code[6] = 0x0F; \ - code[7] = 0x80 | (code_t)(CC_E); /* JE rel32 */ \ - code += 12; \ - *(long*)(code-4) = 0; /* by default, go nowhere else */ \ -} while (0) -#define FIX_JUMP_IF_EQUAL(codeend, value, targetaddr) do { \ - code_t* _codeend = (codeend); \ - *(long*)(_codeend-10) = (value); \ - *(long*)(_codeend-4) = (targetaddr) - _codeend; \ -} while (0) - - -#if PENTIUM_INSNS -/* #define CONDITIONAL_LOAD_REG_FROM_RT(source, dst, condition) do { \ */ -/* *code++ = 0x0F; * CMOVxx dst, (...) * \ */ -/* INSTR_MODRM_FROM_RT(source, 0x40 | (condition), (dst)<<3); \ */ -/* } while (0) */ -#endif - - -/* correct the stack pointer */ -#define STACK_CORRECTION(stack_correction) do { \ - if ((stack_correction) != 0) { \ - if (COMPACT_ENCODING && !HAS_CCREG(po) && \ - -128 <= (stack_correction) && (stack_correction) < 128) { \ - code[0] = 0x83; /* SUB */ \ - code[1] = 0xEC; /* ESP, imm8 */ \ - code[2] = (stack_correction); \ - code += 3; \ - } \ - else { \ - code[0] = 0x8D; /* LEA */ \ - code[1] = 0x84 | ((code_t)REG_386_ESP)<<3;/* ESP, */ \ - code[2] = 0x24; /* [ESP+imm32] */ \ - *(long*)(code+3) = -(stack_correction); \ - code += 7; \ - } \ - } \ -} while (0) - - - /* convenience macros */ -#define COPY_IN_REG(vi, rg) do { \ - NEED_FREE_REG(rg); \ - if (((vi)->source & (TimeMask|RunTime_StackMask)) == \ - (RunTime|RunTime_StackNone)) { \ - reg_t _rg2 = rg; \ - rg = RUNTIME_REG(vi); \ - extra_assert(rg!=_rg2); \ - LOAD_REG_FROM_REG(_rg2, rg); \ - SET_RUNTIME_REG_TO(vi, _rg2); \ - REG_NUMBER(po, _rg2) = vi; \ - REG_NUMBER(po, rg) = NULL; \ - } \ - else { \ - LOAD_REG_FROM(vi->source, rg); \ - } \ -} while (0) - -#define EMIT_TRACE(msg, fn) do { \ - TEMP_SAVE_REGS_FN_CALLS; \ - PUSH_IMMED((long) code); \ - PUSH_IMMED((long) (msg)); \ - CALL_C_FUNCTION(fn, 2); \ - STACK_CORRECTION(-8); \ - TEMP_RESTORE_REGS_FN_CALLS; \ -} while (0) - -#define ALIGN_PAD_CODE_PTR() do { \ - if ((((long)code) & 15) > 8) /* directive .p2align 4,,7 of 'as' */ \ - code = (code_t*)((((long)code) & ~15) + 16); \ -} while (0) - -#define ALIGN_WITH_BYTE(byte) do { \ - if ((((long)code) & 15) > 8) /* directive .p2align 4,,7 of 'as' */ \ - do { \ - *code++ = byte; \ - } while ((((long)code) & 15) != 0); \ -} while (0) - -/* XXX in the GNU 'as' padding is more subtle: it inserts only one or two - instructions that do nothing but take more space than a single NOP */ -#define ALIGN_WITH_NOP() ALIGN_WITH_BYTE(0x90) - -#if ALL_CHECKS -#define ALIGN_NO_FILL() ALIGN_WITH_BYTE(0xCC) /* INT 03 (debugging) */ -#else -#define ALIGN_NO_FILL() ALIGN_PAD_CODE_PTR() -#endif - - -#endif /* _IENCODING_H */ diff --git a/nodebox/ext/psyco/src/c/i386/iinitialize.h b/nodebox/ext/psyco/src/c/i386/iinitialize.h deleted file mode 100644 index 05be703..0000000 --- a/nodebox/ext/psyco/src/c/i386/iinitialize.h +++ /dev/null @@ -1,21 +0,0 @@ - /***************************************************************/ -/*** Automatically generated support file ***/ - /***************************************************************/ - - /* This file is automatically generated by 'files.py'. - DO NOT MODIFY. Changes will be overwritten ! */ - - - /* internal part for psyco.c */ -#if ALL_STATIC -# include "iprocessor.c" -# include "idispatcher.c" -# include "iencoding.c" -# include "ipyencoding.c" -#else /* if !ALL_STATIC */ - EXTERNFN void psyco_processor_init(void); /* iprocessor.c */ -#endif /* !ALL_STATIC */ - -PSY_INLINE void initialize_processor_files(void) { - psyco_processor_init(); /* iprocessor.c */ -} diff --git a/nodebox/ext/psyco/src/c/i386/iprocessor.c b/nodebox/ext/psyco/src/c/i386/iprocessor.c deleted file mode 100644 index ce553f7..0000000 --- a/nodebox/ext/psyco/src/c/i386/iprocessor.c +++ /dev/null @@ -1,152 +0,0 @@ -#include "../processor.h" -#include "iencoding.h" -#include "../dispatcher.h" -#include "../codemanager.h" -#include "../Python/frames.h" - - -/* define to copy static machine code in the heap before running it. - I've seen some Linux distributions in which the static data pages - are not executable by default. */ -#define COPY_CODE_IN_HEAP - - -/* glue code for psyco_processor_run(). */ -static code_t glue_run_code[] = { - 0x8B, 0x44, 0x24, 4, /* MOV EAX, [ESP+4] (code target) */ - 0x8B, 0x4C, 0x24, 8, /* MOV ECX, [ESP+8] (stack end) */ - 0x8B, 0x54, 0x24, 12, /* MOV EDX, [ESP+12] (initial stack) */ - PUSH_REG_INSTR(REG_386_EBP), /* PUSH EBP */ - PUSH_REG_INSTR(REG_386_EBX), /* PUSH EBX */ - PUSH_REG_INSTR(REG_386_ESI), /* PUSH ESI */ - PUSH_REG_INSTR(REG_386_EDI), /* PUSH EDI */ - 0x8B, 0x5C, 0x24, 32, /* MOV EBX, [ESP+32] (finfo frame stack ptr) */ -#ifdef __APPLE__ - /* Align stack on 16-byte boundary for MacOS X */ - 0x83, 0xEC, 8, /* SUB ESP, 8 */ -#endif - 0x6A, -1, /* PUSH -1 */ - 0x89, 0x23, /* MOV [EBX], ESP */ - 0xEB, +5, /* JMP Label2 */ - /* Label1: */ - 0x83, 0xE9, 4, /* SUB ECX, 4 */ - 0xFF, 0x31, /* PUSH [ECX] */ - /* Label2: */ - 0x39, 0xCA, /* CMP EDX, ECX */ - 0x75, -9, /* JNE Label1 */ - 0xFF, 0xD0, /* CALL *EAX (callee removes args) */ -#ifdef __APPLE__ - /* Restore stack from 16-byte alignment on MacOS X */ - 0x83, 0xC4, 8, /* ADD ESP, 8 */ -#endif - POP_REG_INSTR(REG_386_EDI), /* POP EDI */ - POP_REG_INSTR(REG_386_ESI), /* POP ESI */ - POP_REG_INSTR(REG_386_EBX), /* POP EBX */ - POP_REG_INSTR(REG_386_EBP), /* POP EBP */ - 0xC3, /* RET */ -}; - -typedef PyObject* (*glue_run_code_fn) (code_t* code_target, - long* stack_end, - long* initial_stack, - struct stack_frame_info_s*** finfo); - -#ifdef COPY_CODE_IN_HEAP -static glue_run_code_fn glue_run_code_1; -#else -# define glue_run_code_1 ((glue_run_code_fn) glue_run_code) -#endif - -DEFINEFN -PyObject* psyco_processor_run(CodeBufferObject* codebuf, - long initial_stack[], - struct stack_frame_info_s*** finfo, - PyObject* tdict) -{ - int argc = RUN_ARGC(codebuf); - return glue_run_code_1(codebuf->codestart, initial_stack + argc, - initial_stack, finfo); -} - -/* call a C function with a variable number of arguments */ -DEFINEVAR long (*psyco_call_var) (void* c_func, int argcount, long arguments[]); - -static code_t glue_call_var[] = { - 0x53, /* PUSH EBX */ - 0x8B, 0x5C, 0x24, 12, /* MOV EBX, [ESP+12] (argcount) */ - 0x8B, 0x44, 0x24, 8, /* MOV EAX, [ESP+8] (c_func) */ -#ifdef __APPLE__ - /* Align stack on 16-byte boundary for MacOS X */ - 0x83, 0xEC, 8, /* SUB ESP, 8 */ -#endif - 0x09, 0xDB, /* OR EBX, EBX */ - 0x74, +16, /* JZ Label1 */ -#ifdef __APPLE__ - /* Arguments are 8 bytes further up stack on MacOS X */ - 0x8B, 0x54, 0x24, 24, /* MOV EDX, [ESP+24] (arguments) */ -#else - 0x8B, 0x54, 0x24, 16, /* MOV EDX, [ESP+16] (arguments) */ -#endif - 0x8D, 0x0C, 0x9A, /* LEA ECX, [EDX+4*EBX] */ - /* Label2: */ - 0x83, 0xE9, 4, /* SUB ECX, 4 */ - 0xFF, 0x31, /* PUSH [ECX] */ - 0x39, 0xCA, /* CMP EDX, ECX */ - 0x75, -9, /* JNE Label2 */ - /* Label1: */ - 0xFF, 0xD0, /* CALL *EAX */ -#ifdef __APPLE__ - /* Restore stack from 16-byte alignment on MacOS X */ - 0x83, 0xC4, 8, /* ADD ESP, 8 */ -#endif - 0x8D, 0x24, 0x9C, /* LEA ESP, [ESP+4*EBX] */ - 0x5B, /* POP EBX */ - 0xC3, /* RET */ -}; - -/* check for signed integer multiplication overflow */ -DEFINEVAR char (*psyco_int_mul_ovf) (long a, long b); - -static code_t glue_int_mul[] = { - 0x8B, 0x44, 0x24, 8, /* MOV EAX, [ESP+8] (a) */ - 0x0F, 0xAF, 0x44, 0x24, 4, /* IMUL EAX, [ESP+4] (b) */ - 0x0F, 0x90, 0xC0, /* SETO AL */ - 0xC3, /* RET */ -}; - - -#ifdef COPY_CODE_IN_HEAP -static code_t* internal_copy_code(void* source, int size) { - CodeBufferObject* codebuf = psyco_new_code_buffer(NULL, NULL, NULL); - code_t* code = codebuf->codestart; - memcpy(code, source, size); - SHRINK_CODE_BUFFER(codebuf, code+size, "glue"); - return code; -} -# define COPY_CODE(target, source, type) do { \ - target = (type) internal_copy_code(source, sizeof(source)); \ -} while (0) -#else -# define COPY_CODE(target, source, type) (target = (type) source) -#endif - - -INITIALIZATIONFN -void psyco_processor_init(void) -{ -#ifdef COPY_CODE_IN_HEAP - COPY_CODE(glue_run_code_1, glue_run_code, glue_run_code_fn); -#endif - COPY_CODE(psyco_int_mul_ovf, glue_int_mul, char(*)(long, long)); - COPY_CODE(psyco_call_var, glue_call_var, long(*)(void*, int, long[])); -} - - -DEFINEFN struct stack_frame_info_s** -psyco_next_stack_frame(struct stack_frame_info_s** finfo) -{ - /* Hack to pick directly from the machine stack the stored - "stack_frame_info_t*" pointers */ - return (struct stack_frame_info_s**) - (((char*) finfo) - finfo_last(*finfo)->link_stack_depth); -} diff --git a/nodebox/ext/psyco/src/c/i386/ipyencoding.c b/nodebox/ext/psyco/src/c/i386/ipyencoding.c deleted file mode 100644 index 1b54f45..0000000 --- a/nodebox/ext/psyco/src/c/i386/ipyencoding.c +++ /dev/null @@ -1,104 +0,0 @@ -#include "ipyencoding.h" -#include "../pycodegen.h" - - -DEFINEFN -code_t* decref_dealloc_calling(code_t* code, PsycoObject* po, reg_t rg, - destructor fn) -{ - code_t* code_origin; - int save_eax, save_ecx, save_edx; - reg_t last_reg; - DEC_OB_REFCNT_NZ(rg); - extra_assert(offsetof(PyObject, ob_type) < 128); - extra_assert(offsetof(PyTypeObject, tp_dealloc) < 128); - code[0] = 0x75; /* JNZ rel8 */ - code += 2; - code_origin = code; - if (COMPACT_ENCODING) { - save_eax = REG_NUMBER(po, REG_386_EAX) != NULL; - save_ecx = REG_NUMBER(po, REG_386_ECX) != NULL; - save_edx = REG_NUMBER(po, REG_386_EDX) != NULL; - last_reg = REG_386_EAX; - if (save_eax) PUSH_REG(REG_386_EAX); - if (save_ecx) { PUSH_REG(REG_386_ECX); last_reg = REG_386_ECX; } - if (save_edx) { PUSH_REG(REG_386_EDX); last_reg = REG_386_EDX; } - PUSH_REG(rg); - } - else { - CODE_FOUR_BYTES(code, - PUSH_REG_INSTR(REG_386_EAX), - PUSH_REG_INSTR(REG_386_ECX), - PUSH_REG_INSTR(REG_386_EDX), - PUSH_REG_INSTR(rg)); - code += 4; - } - if (fn == NULL) { - code[0] = 0x8B; /* MOV EAX, [reg+ob_type] */ - code[1] = 0x40 | (rg); - CODE_FOUR_BYTES(code+2, - offsetof(PyObject, ob_type), - 0xFF, /* CALL [EAX+tp_dealloc] */ - 0x50, - offsetof(PyTypeObject, tp_dealloc)); - code += 6; - } - else { - code[0] = 0xE8; /* CALL */ - code += 5; - *(long*)(code-4) = (code_t*)(fn) - code; - } - if (COMPACT_ENCODING) { - POP_REG(last_reg); /* pop argument back */ - if (save_edx) POP_REG(REG_386_EDX); - if (save_ecx) POP_REG(REG_386_ECX); - if (save_eax) POP_REG(REG_386_EAX); - } - else { - CODE_FOUR_BYTES(code, - POP_REG_INSTR(REG_386_EDX), - POP_REG_INSTR(REG_386_EDX), - POP_REG_INSTR(REG_386_ECX), - POP_REG_INSTR(REG_386_EAX)); - code += 4; - } - extra_assert(code-code_origin < 128); - code_origin[-1] = (code_t)(code-code_origin); - return code; -} - -DEFINEFN -void decref_create_new_ref(PsycoObject* po, vinfo_t* w) -{ - /* we must Py_INCREF() the object */ - BEGIN_CODE - if (is_compiletime(w->source)) - INC_KNOWN_OB_REFCNT((PyObject*) - CompileTime_Get(w->source)->value); - else { - /* 'w' is in a register because of write_array_item() */ - extra_assert(!RUNTIME_REG_IS_NONE(w)); - INC_OB_REFCNT(RUNTIME_REG(w)); - } - END_CODE -} - -DEFINEFN -bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w) -{ - bool could_eat = eat_reference(w); - if (!could_eat) { - /* in this case we must Py_INCREF() the object */ - BEGIN_CODE - if (is_compiletime(w->source)) - INC_KNOWN_OB_REFCNT((PyObject*) - CompileTime_Get(w->source)->value); - else { - /* 'w' is in a register because of write_array_item() */ - extra_assert(!RUNTIME_REG_IS_NONE(w)); - INC_OB_REFCNT(RUNTIME_REG(w)); - } - END_CODE - } - return could_eat; -} diff --git a/nodebox/ext/psyco/src/c/i386/ipyencoding.h b/nodebox/ext/psyco/src/c/i386/ipyencoding.h deleted file mode 100644 index 9b152ef..0000000 --- a/nodebox/ext/psyco/src/c/i386/ipyencoding.h +++ /dev/null @@ -1,318 +0,0 @@ - /***************************************************************/ -/*** Processor- and language-dependent code producers ***/ - /***************************************************************/ - -#ifndef _IPYENCODING_H -#define _IPYENCODING_H - - -#include "../processor.h" -#include "../dispatcher.h" - -#include "../Objects/pobject.h" -#include "../Objects/pdictobject.h" - - -#define TRACE_START_COMPILING(c) do { /* nothing */ } while (0) - - -/* Note: the following macro must output a fixed number of bytes of - code, so that DICT_ITEM_UPDINDEX() can be called later - to update an existing code buffer */ -#define DICT_ITEM_KEYVALUE(code, index, key, value, mprg) do { \ - extra_assert(0 < offsetof(PyDictObject, ma_mask) && \ - offsetof(PyDictObject, ma_mask) < 128); \ - extra_assert(0 < offsetof(PyDictObject, ma_table) && \ - offsetof(PyDictObject, ma_table) < 128); \ - code[0] = 0x81; /* CMP [...], imm32 */ \ - code[1] = 0x40 | (7<<3) | mprg; /* CMP [mpreg->ma_mask], ... */ \ - code[2] = offsetof(PyDictObject, ma_mask); \ - *(long*)(code+3) = (index); \ - /* perform the load before checking the CMP outcome */ \ - code[7] = 0x8B; \ - code[8] = 0x40 | (mprg<<3) | mprg; /* MOV mpreg, [mpreg->ma_table] */ \ - CODE_FOUR_BYTES(code+9, \ - offsetof(PyDictObject, ma_table), \ - 0x70 | CC_L, /* JL +22 (skip rest of macro) */ \ - 34 - 12, \ - 0x81); /* CMP [mpreg+dictentry*index+me_key], key */ \ - code[13] = 0x80 | (7<<3) | mprg; \ - *(long*)(code+14) = (index)*sizeof(PyDictEntry) + \ - offsetof(PyDictEntry, me_key); \ - *(long*)(code+18) = (long)(key); \ - CODE_FOUR_BYTES(code+22, \ - 0x70 | CC_NE, /* JNE +10 (skip rest of macro) */ \ - 34 - 24, \ - 0x81, /* CMP [mpreg+dictentry*index+me_value], value */ \ - 0x80 | (7<<3) | mprg); \ - *(long*)(code+26) = (index)*sizeof(PyDictEntry) + \ - offsetof(PyDictEntry, me_value); \ - *(long*)(code+30) = (long)(value); \ - code += 34; \ -} while (0) - -#define DICT_ITEM_CHECK_CC CC_NE - -#define DICT_ITEM_UPDINDEX(index) do { \ - *(long*)(code+3) = (index); \ - *(long*)(code+14) = (index)*sizeof(PyDictEntry) + \ - offsetof(PyDictEntry, me_key); \ - *(long*)(code+26) = (index)*sizeof(PyDictEntry) + \ - offsetof(PyDictEntry, me_value); \ -} while (0) - - -/* A cleaner interface to the two big macros above: quickly - checking if a globals' dictionary still map the given key to - the given value. - XXX 'dict' must never be released! */ -PSY_INLINE void* dictitem_check_change(PsycoObject* po, - PyDictObject* dict, PyDictEntry* ep) -{ - int index = ep - dict->ma_table; - PyObject* key = ep->me_key; - PyObject* result = ep->me_value; - reg_t mprg; - code_t* codebase; - - Py_INCREF(key); /* XXX these become immortal */ - Py_INCREF(result); /* XXX */ - - BEGIN_CODE - NEED_CC(); - NEED_FREE_REG(mprg); - /* write code that quickly checks that the same - object is still in place in the dictionary */ - LOAD_REG_FROM_IMMED(mprg, (long) dict); - codebase = code; - DICT_ITEM_KEYVALUE(code, index, key, result, mprg); - END_CODE - return codebase; -} - -PSY_INLINE void dictitem_update_nochange(void* originalmacrocode, - PyDictObject* dict, PyDictEntry* new_ep) -{ - int index = new_ep - dict->ma_table; - code_t* code = (code_t*) originalmacrocode; - DICT_ITEM_UPDINDEX(index); -} - - -/* emit the equivalent of the Py_INCREF() macro */ -/* the PyObject* is stored in the register 'rg' */ -/* XXX if Py_REF_DEBUG is set (Python debug mode), the - following will not properly update _Py_RefTotal. - Don't trust _Py_RefTotal with Psyco. */ -#define INC_OB_REFCNT(rg) do { \ - NEED_CC_REG(rg); \ - INC_OB_REFCNT_internal(rg); \ -} while (0) -/* same as above, preserving the cc */ -#define INC_OB_REFCNT_CC(rg) do { \ - bool _save_ccreg = HAS_CCREG(po); \ - if (_save_ccreg) PUSH_CC_FLAGS(); \ - INC_OB_REFCNT_internal(rg); \ - if (_save_ccreg) POP_CC_FLAGS(); \ -} while (0) -#define INC_OB_REFCNT_internal(rg) do { \ - code[0] = 0xFF; /* INC [reg] */ \ - if ((EBP_IS_RESERVED || (rg) != REG_386_EBP) && \ - offsetof(PyObject, ob_refcnt) == 0) \ - { \ - extra_assert((rg) != REG_386_EBP); \ - code[1] = (rg); \ - } \ - else \ - { \ - code++; \ - extra_assert(offsetof(PyObject, ob_refcnt) < 128);\ - code[0] = 0x40 | (rg); \ - code[1] = (code_t) offsetof(PyObject, ob_refcnt); \ - } \ - code += 2; \ -} while (0) - -/* Py_INCREF() for a compile-time-known 'pyobj' */ -#define INC_KNOWN_OB_REFCNT(pyobj) do { \ - NEED_CC(); \ - code[0] = 0xFF; /* INC [address] */ \ - code[1] = 0x05; \ - *(int**)(code+2) = &(pyobj)->ob_refcnt; \ - code += 6; \ - } while (0) - -/* Py_DECREF() for a compile-time 'pyobj' assuming counter cannot reach zero */ -#define DEC_KNOWN_OB_REFCNT_NZ(pyobj) do { \ - NEED_CC(); \ - code[0] = 0xFF; /* DEC [address] */ \ - code[1] = (1<<3) | 0x05; \ - *(int**)(code+2) = &(pyobj)->ob_refcnt; \ - code += 6; \ - } while (0) - -/* like DEC_OB_REFCNT() but assume the reference counter cannot reach zero */ -#define DEC_OB_REFCNT_NZ(rg) do { \ - NEED_CC_REG(rg); \ - code[0] = 0xFF; /* DEC [reg] */ \ - if ((EBP_IS_RESERVED || (rg) != REG_386_EBP) && \ - offsetof(PyObject, ob_refcnt) == 0) \ - { \ - extra_assert((rg) != REG_386_EBP); \ - code[1] = 0x08 | (rg); \ - } \ - else \ - { \ - code++; \ - extra_assert(offsetof(PyObject, ob_refcnt) < 128);\ - code[0] = 0x48 | (rg); \ - code[1] = (code_t) offsetof(PyObject, ob_refcnt); \ - } \ - code += 2; \ -} while (0) - -/* internal utilities for the macros below */ -EXTERNFN code_t* decref_dealloc_calling(code_t* code, PsycoObject* po, reg_t rg, - destructor fn); - -/* the equivalent of Py_DECREF(). - XXX Same remark as INC_OB_REFCNT(). - We correctly handle the Py_TRACE_REFS case, - however, by calling the _Py_Dealloc() function. - Slow but correct (and you have the debugging Python - version anyway, so you are not looking for top speed - but just testing things). */ -#ifdef Py_TRACE_REFS -/* debugging only */ -# define DEC_OB_REFCNT(rg) (code=decref_dealloc_calling(code, po, rg, \ - _Py_Dealloc)) -#else -# define DEC_OB_REFCNT(rg) (code=decref_dealloc_calling(code, po, rg, NULL)) -#endif - -/* the equivalent of Py_DECREF() when we know the type of the object - (assuming that tp_dealloc never changes for a given type) */ -#ifdef Py_TRACE_REFS -/* debugging only */ -# define DEC_OB_REFCNT_T(rg, type) (code=decref_dealloc_calling(code, po, rg, \ - _Py_Dealloc)) -#else -# define DEC_OB_REFCNT_T(rg, type) (code=decref_dealloc_calling(code, po, rg, \ - (type)->tp_dealloc)) -#endif - - -/***************************************************************/ - /*** generic reference counting functions ***/ - -/* emit Py_INCREF(v) for run-time v */ -PSY_INLINE void psyco_incref_rt(PsycoObject* po, vinfo_t* v) -{ - reg_t rg; - BEGIN_CODE - RTVINFO_IN_REG(v); - rg = RUNTIME_REG(v); - INC_OB_REFCNT(rg); - END_CODE -} - -/* emit Py_INCREF(v) for non-virtual v */ -PSY_INLINE void psyco_incref_nv(PsycoObject* po, vinfo_t* v) -{ - if (!is_compiletime(v->source)) - psyco_incref_rt(po, v); - else - { - BEGIN_CODE - INC_KNOWN_OB_REFCNT((PyObject*) CompileTime_Get(v->source)->value); - END_CODE - } -} - -/* emit Py_DECREF(v) for run-time v. Used by vcompiler.c when releasing a - run-time vinfo_t holding a reference to a Python object. */ -PSY_INLINE void psyco_decref_rt(PsycoObject* po, vinfo_t* v) -{ - PyTypeObject* tp = Psyco_KnownType(v); - reg_t rg; - BEGIN_CODE - RTVINFO_IN_REG(v); - rg = RUNTIME_REG(v); - if (tp != NULL) - DEC_OB_REFCNT_T(rg, tp); - else - DEC_OB_REFCNT(rg); - END_CODE -} - -/* emit Py_DECREF(o) for a compile-time o */ -PSY_INLINE void psyco_decref_c(PsycoObject* po, PyObject* o) -{ - BEGIN_CODE - DEC_KNOWN_OB_REFCNT_NZ(o); - END_CODE -} - - -/* to store a new reference to a Python object into a memory structure, - use psyco_put_field() or psyco_put_field_array() to store the value - proper and then one of the following two functions to adjust the - reference counter: */ - -/* normal case */ -EXTERNFN void decref_create_new_ref(PsycoObject* po, vinfo_t* w); - -/* if 'w' is supposed to be freed soon, this function tries (if possible) - to move an eventual Python reference owned by 'w' to the memory - structure. This avoids a Py_INCREF()/Py_DECREF() pair. - Returns 'true' if the reference was successfully transfered; - 'false' does not mean failure. */ -EXTERNFN bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w); - - -/* called by psyco_emit_header() */ -#define INITIALIZE_FRAME_LOCALS(nframelocal) do { \ - STACK_CORRECTION(4*((nframelocal)-1)); \ - PUSH_IMMED(0); /* f_exc_type, initially NULL */ \ -} while (0) - -/* called by psyco_finish_return() */ -#define FINALIZE_FRAME_LOCALS(nframelocal) do { \ - CODE_FOUR_BYTES(code, \ - 0x83, \ - 0x3C, /* CMP [ESP], 0 */ \ - 0x24, \ - 0); \ - code[4] = 0x70 | CC_E; /* JE exit */ \ - code[5] = 11 - 6; \ - code[6] = 0xE8; /* CALL cimpl_finalize_frame_locals */ \ - code += 11; \ - *(long*)(code-4) = (code_t*)(&cimpl_finalize_frame_locals) - code; \ -} while (0) - -#define WRITE_FRAME_EPILOGUE(retval, nframelocal) do { \ - /* load the return value into EAX for regular functions, EBX for functions \ - with a prologue */ \ - if (retval != SOURCE_DUMMY) { \ - reg_t rg = nframelocal>0 ? REG_ANY_CALLEE_SAVED : REG_FUNCTIONS_RETURN; \ - LOAD_REG_FROM(retval, rg); \ - } \ - \ - if (nframelocal > 0) \ - { \ - /* psyco_emit_header() was used; first clear the stack only up to and not \ - including the frame-local data */ \ - int framelocpos = getstack(LOC_CONTINUATION->array->items[0]->source); \ - STACK_CORRECTION(framelocpos - po->stack_depth); \ - po->stack_depth = framelocpos; \ - \ - /* perform Python-specific cleanup */ \ - FINALIZE_FRAME_LOCALS(nframelocal); \ - LOAD_REG_FROM_REG(REG_FUNCTIONS_RETURN, REG_ANY_CALLEE_SAVED); \ - } \ -} while (0) - -/* implemented in pycompiler.c */ -EXTERNFN void cimpl_finalize_frame_locals(PyObject*, PyObject*, PyObject*); - -#endif /* _IPYENCODING_H */ diff --git a/nodebox/ext/psyco/src/c/initialize.h b/nodebox/ext/psyco/src/c/initialize.h deleted file mode 100644 index a992ba5..0000000 --- a/nodebox/ext/psyco/src/c/initialize.h +++ /dev/null @@ -1,150 +0,0 @@ - /***************************************************************/ -/*** Automatically generated support file ***/ - /***************************************************************/ - - /* This file is automatically generated by 'files.py'. - DO NOT MODIFY. Changes will be overwritten ! */ - - - /* Including this file results in all headers Objects/xxx.h - being included, so that it has roughly the same result - for Psyco as a "#include " has for Python: - including all headers extension modules generally need. - - This file is moreover used internally by psyco.c. */ - - -#ifndef PSYCO_INITIALIZATION - -# include "Objects/pobject.h" -# include "Objects/pabstract.h" -# include "Objects/pboolobject.h" -# include "Objects/pclassobject.h" -# include "Objects/pdescrobject.h" -# include "Objects/pdictobject.h" -# include "Objects/pfloatobject.h" -# include "Objects/pfuncobject.h" -# include "Objects/pintobject.h" -# include "Objects/piterobject.h" -# include "Objects/plistobject.h" -# include "Objects/plongobject.h" -# include "Objects/pmethodobject.h" -# include "Objects/prangeobject.h" -# include "Objects/pstringobject.h" -# include "Objects/pstructmember.h" -# include "Objects/ptupleobject.h" -# include "Objects/ptypeobject.h" -# include "Objects/pcompactobject.h" - -#else /* if PSYCO_INITIALIZATION */ -# undef PSYCO_INITIALIZATION - -#include /* processor-specific initialization */ - - /* internal part for psyco.c */ -#if ALL_STATIC -# include "dispatcher.c" -# include "vcompiler.c" -# include "psyfunc.c" -# include "stats.c" -# include "profile.c" -# include "cstruct.c" -# include "alarm.c" -# include "codemanager.c" -# include "codegen.c" -# include "mergepoints.c" -# include "linuxmemchk.c" -# include "Python/pycompiler.c" -# include "Python/frames.c" -# include "Python/pbltinmodule.c" -# include "Objects/pobject.c" -# include "Objects/pabstract.c" -# include "Objects/pboolobject.c" -# include "Objects/pclassobject.c" -# include "Objects/pdescrobject.c" -# include "Objects/pdictobject.c" -# include "Objects/pfloatobject.c" -# include "Objects/pfuncobject.c" -# include "Objects/pintobject.c" -# include "Objects/piterobject.c" -# include "Objects/plistobject.c" -# include "Objects/plongobject.c" -# include "Objects/pmethodobject.c" -# include "Objects/prangeobject.c" -# include "Objects/pstringobject.c" -# include "Objects/pstructmember.c" -# include "Objects/ptupleobject.c" -# include "Objects/ptypeobject.c" -# include "Objects/compactobject.c" -# include "Objects/pcompactobject.c" -# include "Modules/parray.c" -# include "Modules/pmath.c" -# include "Modules/ppsyco.c" -#else /* if !ALL_STATIC */ - EXTERNFN void psyco_compiler_init(void); /* vcompiler.c */ - EXTERNFN void psyco_stats_init(void); /* stats.c */ - EXTERNFN void psyco_profile_init(void); /* profile.c */ - EXTERNFN void psyco_cstruct_init(void); /* cstruct.c */ - EXTERNFN void psyco_alarm_init(void); /* alarm.c */ - EXTERNFN void psyco_codegen_init(void); /* codegen.c */ - EXTERNFN void psyco_pycompiler_init(void); /* Python/pycompiler.c */ - EXTERNFN void psyco_frames_init(void); /* Python/frames.c */ - EXTERNFN void psyco_bltinmodule_init(void); /* Python/pbltinmodule.c */ - EXTERNFN void psy_object_init(void); /* Objects/pobject.c */ - EXTERNFN void psy_boolobject_init(void); /* Objects/pboolobject.c */ - EXTERNFN void psy_classobject_init(void); /* Objects/pclassobject.c */ - EXTERNFN void psy_descrobject_init(void); /* Objects/pdescrobject.c */ - EXTERNFN void psy_dictobject_init(void); /* Objects/pdictobject.c */ - EXTERNFN void psy_floatobject_init(void); /* Objects/pfloatobject.c */ - EXTERNFN void psy_funcobject_init(void); /* Objects/pfuncobject.c */ - EXTERNFN void psy_intobject_init(void); /* Objects/pintobject.c */ - EXTERNFN void psy_iterobject_init(void); /* Objects/piterobject.c */ - EXTERNFN void psy_listobject_init(void); /* Objects/plistobject.c */ - EXTERNFN void psy_longobject_init(void); /* Objects/plongobject.c */ - EXTERNFN void psy_methodobject_init(void); /* Objects/pmethodobject.c */ - EXTERNFN void psy_rangeobject_init(void); /* Objects/prangeobject.c */ - EXTERNFN void psy_stringobject_init(void); /* Objects/pstringobject.c */ - EXTERNFN void psy_tupleobject_init(void); /* Objects/ptupleobject.c */ - EXTERNFN void psy_typeobject_init(void); /* Objects/ptypeobject.c */ - EXTERNFN void psyco_compact_init(void); /* Objects/compactobject.c */ - EXTERNFN void psy_compactobject_init(void); /* Objects/pcompactobject.c */ - EXTERNFN void psyco_initarray(void); /* Modules/parray.c */ - EXTERNFN void psyco_initmath(void); /* Modules/pmath.c */ - EXTERNFN void psyco_initpsyco(void); /* Modules/ppsyco.c */ -#endif /* !ALL_STATIC */ - -PSY_INLINE void initialize_all_files(void) { - initialize_processor_files(); - psyco_compiler_init(); /* vcompiler.c */ - psyco_stats_init(); /* stats.c */ - psyco_profile_init(); /* profile.c */ - psyco_cstruct_init(); /* cstruct.c */ - psyco_alarm_init(); /* alarm.c */ - psyco_codegen_init(); /* codegen.c */ - psyco_pycompiler_init(); /* Python/pycompiler.c */ - psyco_frames_init(); /* Python/frames.c */ - psyco_bltinmodule_init(); /* Python/pbltinmodule.c */ - psy_object_init(); /* Objects/pobject.c */ - psy_boolobject_init(); /* Objects/pboolobject.c */ - psy_classobject_init(); /* Objects/pclassobject.c */ - psy_descrobject_init(); /* Objects/pdescrobject.c */ - psy_dictobject_init(); /* Objects/pdictobject.c */ - psy_floatobject_init(); /* Objects/pfloatobject.c */ - psy_funcobject_init(); /* Objects/pfuncobject.c */ - psy_intobject_init(); /* Objects/pintobject.c */ - psy_iterobject_init(); /* Objects/piterobject.c */ - psy_listobject_init(); /* Objects/plistobject.c */ - psy_longobject_init(); /* Objects/plongobject.c */ - psy_methodobject_init(); /* Objects/pmethodobject.c */ - psy_rangeobject_init(); /* Objects/prangeobject.c */ - psy_stringobject_init(); /* Objects/pstringobject.c */ - psy_tupleobject_init(); /* Objects/ptupleobject.c */ - psy_typeobject_init(); /* Objects/ptypeobject.c */ - psyco_compact_init(); /* Objects/compactobject.c */ - psy_compactobject_init(); /* Objects/pcompactobject.c */ - psyco_initarray(); /* Modules/parray.c */ - psyco_initmath(); /* Modules/pmath.c */ - psyco_initpsyco(); /* Modules/ppsyco.c */ -} - -#endif /* PSYCO_INITIALIZATION */ diff --git a/nodebox/ext/psyco/src/c/ivm/idispatcher.c b/nodebox/ext/psyco/src/c/ivm/idispatcher.c deleted file mode 100644 index 127fa1f..0000000 --- a/nodebox/ext/psyco/src/c/ivm/idispatcher.c +++ /dev/null @@ -1,272 +0,0 @@ -#include "idispatcher.h" -#include "../dispatcher.h" -#include "../codemanager.h" -#include "ipyencoding.h" - - -/***************************************************************/ - /*** the hard processor-dependent part of dispatching: ***/ - /*** Unification. ***/ - -#define RUNTIME_STACK(v) getstack((v)->source) -#define RUNTIME_STACK_NONE RunTime_StackNone - - -struct dmove_s { - PsycoObject* po; - int original_stack_depth; - char* usages; /* buffer: array of vinfo_t*, see ORIGINAL_VINFO() below */ - int usages_size; - code_t* code_origin; - code_t* code_limit; - code_t* code; /* only used by data_update_stack() */ - CodeBufferObject* private_codebuf; -}; - -static code_t* data_new_buffer(code_t* code, struct dmove_s* dm) -{ - /* creates a new buffer containing a copy of the already-written code */ - CodeBufferObject* codebuf; - int codesize; - if (dm->private_codebuf != NULL) - { - /* overflowing the regular (large) code buffer */ - psyco_emergency_enlarge_buffer(&code, &dm->code_limit); - return code; - } - else - { - /* overflowing the small buffer, start a new (regular) one */ - codebuf = psyco_new_code_buffer(NULL, NULL, &dm->code_limit); - codebuf->snapshot.fz_stuff.fz_stack_depth = dm->original_stack_depth; - /* the new buffer should be at least as large as the old one */ - codesize = code - dm->code_origin; - code = insn_code_label(codebuf->codestart); - if (code + codesize > dm->code_limit) - Py_FatalError("psyco: unexpected unify buffer overflow"); - /* copy old code to new buffer */ - memcpy(code, dm->code_origin, codesize+POST_CODEBUFFER_SIZE); - dm->private_codebuf = codebuf; -#if PSYCO_DEBUG - dm->code_origin = (code_t*) 0xCDCDCDCD; -#endif - return code + codesize; - } -} - -#define ORIGINAL_VINFO(spos) (*(vinfo_t**)(dm->usages + ( \ - extra_assert(0 <= (spos) && (spos) < dm->usages_size), \ - (spos)))) - -static void data_original_table(vinfo_t* a, RunTimeSource bsource, - struct dmove_s* dm) -{ - /* called on each run-time vinfo_t in the FrozenPsycoObject. - Record in the array dm->usages which vinfo_t is found at what position - in the stack. Ignore the ones after dm->usages_size: they correspond to - stack positions which will soon be deleted (because the stack will - shrink). */ - if (RUNTIME_STACK(a) < dm->usages_size) - ORIGINAL_VINFO(RUNTIME_STACK(a)) = a; -} - -static void data_update_stack(vinfo_t* a, RunTimeSource bsource, - struct dmove_s* dm) -{ - PsycoObject* po = dm->po; - code_t* code = dm->code; - long dststack = getstack(bsource); - long srcstack = getstack(a->source); - vinfo_t* overridden; - RunTimeSource osrc; - - /* check for values passing from no-reference to reference */ - if ((bsource & RunTime_NoRef) == 0) { /* destination has ref */ - if ((a->source & RunTime_NoRef) == 0) /* source has ref too */ - { - /* remove the reference from 'a' because it now belongs - to 'b' ('b->source' itself is in the frozen snapshot - and must not be modified!) */ - a->source = remove_rtref(a->source); - } - else - { - /* create a new reference for 'b'. Note that if the same - 'a' is copied to several 'b's during data_update_stack() - as is allowed by graph quotient detection in - psyco_compatible(), then only the first copy will get - the original reference owned by 'a' (if any) and for - the following copies the following increfing code is - executed as well. */ - INSN_rt_push(a->source); - INSN_incref(); - } - } - /* 'a' must no longer own a reference at this point. - The case of 'b' wanting no reference but 'a' having one - is forbidden by psyco_compatible() because decrefing 'a' - would potentially leave a freed pointer in 'b'. */ - extra_assert(!has_rtref(a->source)); - - /* The operation below is: copy the value currently held by 'a' - into the stack position 'dststack'. */ - if (dststack == RUNTIME_STACK_NONE || dststack == srcstack) - ; /* nothing to do */ - else - { - /* is there already a pending value at 'dststack'? */ - overridden = ORIGINAL_VINFO(dststack); - if (overridden == NULL || RUNTIME_STACK(overridden) != dststack) - goto can_save_only; /* no -- just save the new value to 'dststack'. - The case RUNTIME_STACK(overridden) != dststack - corresponds to a vinfo_t which has been moved - elsewhere in the mean time. */ - - /* yes -- careful! We have to save the current value of - 'dststack' before we can overwrite it. */ - osrc = overridden->source; - INSN_rt_push(osrc); - osrc = set_rtstack_to_none(osrc); - INSNPUSHED(1); - overridden->source = set_rtstack_to(osrc, po->stack_depth); - - can_save_only: - /* copy 'a' to 'dststack' */ - INSN_rt_push(a->source); INSNPUSHED(1); - INSN_rt_pop(bsource); INSNPOPPED(1); - - /* Now 'a' is at 'dststack' */ - a->source = RunTime_New1(dststack, false, false); - ORIGINAL_VINFO(dststack) = a; /* 'a' is now there */ - - if (code > dm->code_limit) - /* oops, buffer overflow. Start a new buffer */ - code = data_new_buffer(code, dm); - - } - dm->code = code; -} - -static code_t* data_free_unused(code_t* code, struct dmove_s* dm, - vinfo_array_t* aa) -{ - /* decref any object that would be present in 'po' but not at all in - the snapshot. Note that it is uncommon that this function actually - finds any unused object at all. */ - int i = aa->count; - while (i--) - { - vinfo_t* a = aa->items[i]; - if (a != NULL) - { - if (has_rtref(a->source)) - { - PsycoObject* po = dm->po; - code_t* saved_code; - a->source = remove_rtref(a->source); - - saved_code = po->code; - po->code = code; - psyco_decref_rt(po, a); - code = po->code; - po->code = saved_code; - - if (code > dm->code_limit) - /* oops, buffer overflow. Start a new buffer */ - code = data_new_buffer(code, dm); - } - if (a->array != NullArray) - code = data_free_unused(code, dm, a->array); - } - } - return code; -} - -DEFINEFN -code_t* psyco_unify(PsycoObject* po, vcompatible_t* lastmatch, - CodeBufferObject** target) -{ - /* Update 'po' to match 'lastmatch', then jump to 'lastmatch'. */ - - struct dmove_s dm; - code_t* code = po->code; - CodeBufferObject* target_codebuf = lastmatch->matching; - int sdepth = get_stack_depth(&target_codebuf->snapshot); -#if PSYCO_DEBUG - bool has_ccreg = HAS_CCREG(po); -#endif - - extra_assert(lastmatch->diff == NullArray); /* unify with exact match only */ - psyco_assert_coherent(po); - dm.usages_size = sdepth + sizeof(vinfo_t**); - dm.usages = (char*) PyMem_MALLOC(dm.usages_size); - if (dm.usages == NULL) - OUT_OF_MEMORY(); - memset(dm.usages, 0, dm.usages_size); /* set to all NULL */ - fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, - (fz_find_fn) &data_original_table, - &dm, false); - - dm.po = po; - dm.original_stack_depth = po->stack_depth; - dm.code_origin = code; - dm.code_limit = po->codelimit == NULL ? code : po->codelimit; - dm.private_codebuf = NULL; - - if (sdepth > po->stack_depth) - { - /* more items in the target stack (uncommon case). - Let the stack grow. */ - STACK_CORRECTION(sdepth - po->stack_depth); - po->stack_depth = sdepth; - } - - /* update the stack */ - dm.code = code; - fz_find_runtimes(&po->vlocals, &target_codebuf->snapshot, - (fz_find_fn) &data_update_stack, - &dm, true); - code = dm.code; - - /* decref any object that would be present in 'po' but not at all in - the snapshot (data_update_stack() has removed the 'ref' tag of all - vinfo_ts it actually used from 'po') */ - code = data_free_unused(code, &dm, &po->vlocals); - - /* done */ - STACK_CORRECTION(sdepth - po->stack_depth); - if (code > dm.code_limit) /* start a new buffer if we wrote past the end */ - code = data_new_buffer(code, &dm); -#if PSYCO_DEBUG - extra_assert(has_ccreg == HAS_CCREG(po)); -#endif - JUMP_TO((code_t*) target_codebuf->codestart); - - /* start a new buffer if the last JUMP_TO overflowed, - but not if we had no room at all in the first place. */ - if (code > dm.code_limit && po->codelimit != NULL) - { - /* Note that the JMP instruction emitted by JUMP_TO() is - position-independent (a property of the vm) */ - code = data_new_buffer(code, &dm); - psyco_assert(code <= dm.code_limit); - } - - PyMem_FREE(dm.usages); - if (dm.private_codebuf == NULL) - { - Py_INCREF(target_codebuf); /* no new buffer created */ - *target = target_codebuf; - } - else - { - SHRINK_CODE_BUFFER(dm.private_codebuf, code, "unify"); - *target = dm.private_codebuf; - /* add a jump from the original code buffer to the new one */ - code = po->code; - JUMP_TO((code_t*) dm.private_codebuf->codestart); - dump_code_buffers(); - } - PsycoObject_Delete(po); - return code; -} diff --git a/nodebox/ext/psyco/src/c/ivm/idispatcher.h b/nodebox/ext/psyco/src/c/ivm/idispatcher.h deleted file mode 100644 index c78c65c..0000000 --- a/nodebox/ext/psyco/src/c/ivm/idispatcher.h +++ /dev/null @@ -1,121 +0,0 @@ - /***************************************************************/ -/*** Processor-specific routines for dispatcher.c ***/ - /***************************************************************/ - -#ifndef _IDISPATCHER_H -#define _IDISPATCHER_H - -#include "../vcompiler.h" -#include "../codegen.h" -#include "iencoding.h" -#include "ivm-insns.h" - -#define NEED_STACK_FRAME_HACK 0 - - -/***************************************************************/ - /*** Unification ***/ - -/* idispatcher.c implements psyco_unify(), - whose header is given in dispatcher.h. - Conversely, dispatcher.c implements the following function - which is declared here because it is really internal: */ -typedef void (*fz_find_fn) (vinfo_t* a, RunTimeSource bsource, void* extra); -EXTERNFN void fz_find_runtimes(vinfo_array_t* aa, FrozenPsycoObject* fpo, - fz_find_fn callback, void* extra, bool clear); - - -/***************************************************************/ - /*** Promotion ***/ - -#define PROMOTION_FAST_COMMON_CASE 0 /* not implemented for ivm */ -#define INTERNAL_PROMOTION_FIELDS /* nothing */ - - -PSY_INLINE code_t* fix_fast_common_case(void* fs, long value, code_t* codeptr) -{ - return codeptr; -} - -PSY_INLINE void* ipromotion_finish(PsycoObject* po, vinfo_t* fix, void* do_promotion) -{ - return psyco_call_code_builder(po, do_promotion, 0, fix->source); -} - - -/***************************************************************/ - /*** Misc. ***/ - -PSY_INLINE void* conditional_jump_to(PsycoObject* po, code_t* target, - condition_code_t condition) -{ - /* no INSN_PUSHED() in this function! Otherwise, fix - detect_respawn() calls to track the new stack depth! */ - if (condition == CC_ALWAYS_FALSE) - return NULL; /* never jumps */ - else if (condition == CC_ALWAYS_TRUE) { - word_t* arg; - BEGIN_CODE - INSN_jumpfar(&arg); /* always jumps */ - END_CODE - *arg = (word_t) target; - return arg; - } - else { - word_t* arg; - /* the condition code should be resolved by the caller */ - extra_assert(!HAS_CCREG(po)); - BEGIN_CODE - INSN_normalize_cc(condition); - INSN_jcondfar(&arg); - code = META_dynamicfreq2(code); - END_CODE - *arg = (word_t) target; - return arg; - } -} - -PSY_INLINE void change_cond_jump_target(void* tag, code_t* newtarget) -{ - word_t* arg = (word_t*)tag; - *arg = (word_t) newtarget; -} - -PSY_INLINE code_t* resume_after_cond_jump(void* tag) -{ - word_t* arg = (word_t*)tag; - return (code_t*) (arg+1); -} - - -/* reserve a small buffer of code behind po->code in which conditional - code can be stored. That code should only be executed if 'condition'. */ -PSY_INLINE void* setup_conditional_code_bounds(PsycoObject* po, PsycoObject* po2, - condition_code_t condition) -{ - code_t* forward_distance_ptr; - extra_assert(!HAS_CCREG(po)); /* the conditions should be resolved */ - extra_assert(!HAS_CCREG(po2)); /* by the caller */ - BEGIN_CODE - INSN_normalize_cc(INVERT_CC(condition)); - INSN_jcondnear(&forward_distance_ptr); - po2->code = code; - po2->codelimit = code + 255; - END_CODE - return forward_distance_ptr; -} - -/* Backpatch the distance over which to skip the conditional code. */ -PSY_INLINE void make_code_conditional(PsycoObject* po, code_t* codeend, - condition_code_t condition, void* extra) -{ - code_t* forward_distance_ptr = (code_t*) extra; - code_t* code = codeend; - int distance = code - po->code; - po->code = insn_code_label(code); - extra_assert(0 <= distance && distance <= 255); - *forward_distance_ptr = (code_t) distance; -} - - -#endif /* _IDISPATCHER_H */ diff --git a/nodebox/ext/psyco/src/c/ivm/iencoding.c b/nodebox/ext/psyco/src/c/ivm/iencoding.c deleted file mode 100644 index 04950a7..0000000 --- a/nodebox/ext/psyco/src/c/ivm/iencoding.c +++ /dev/null @@ -1,487 +0,0 @@ -#include "iencoding.h" -#include "ivm-insns.h" -#include "../vcompiler.h" -#include "../dispatcher.h" -#include "../codegen.h" -#include "../codemanager.h" -#include "../Python/frames.h" - - -/* building run-time values meaning "the top of stack" */ -#define RunTime_TOS() RunTime_TOSF(false, false) -#define RunTime_TOSF(ref, nonneg) RunTime_NewStack(po->stack_depth, ref, nonneg) - -/* building run-time values meaning "the nth item in the stack", - where n=0 is the top */ -#define RunTime_STACK(n) RunTime_STACKF(n, false, false) -#define RunTime_STACKF(n, ref, nonneg) \ - RunTime_NewStack(po->stack_depth - (n)*sizeof(long), ref, nonneg) - - -DEFINEFN -void* psyco_call_code_builder(PsycoObject* po, void* fn, int restore, - RunTimeSource extraarg) -{ - word_t* arg; - code_t* code = po->code; - /* the INSN_cbuildX() instructions call the given function - and then jump to whatever address the function has returned. */ - if (extraarg != SOURCE_DUMMY) { - INSN_rt_push(extraarg); - INSN_cbuild2(&arg); - } - else { - INSN_cbuild1(&arg); - } - *arg = (word_t) fn; -#if PSYCO_DEBUG - /* add a zero to seperate code from data for ivmextract.py */ - *code++ = 0; -#endif - /* make 'fs' point just after the end of the code, aligned */ - ALIGN_NO_FILL(); - return code; -} - -DEFINEFN -vinfo_t* psyco_call_psyco(PsycoObject* po, CodeBufferObject* codebuf, - Source argsources[], int argcount, - struct stack_frame_info_s* finfo) -{ - word_t* arg; - int i, initial_depth; - Source* p; - BEGIN_CODE - NEED_CC(); /* 'flag' and 'retval' are a single shared register */ - - ABOUT_TO_CALL_SUBFUNCTION(finfo); - /* no stack push between the INSN_pyenter above and the INSN_vmcall - below, apart from function arguments! See iprocessor.c:impl_vmcall */ - initial_depth = po->stack_depth; - p = argsources; - for (i=argcount; i--; p++) { - INSN_rt_push(*p); INSNPUSHED(1); - } - INSN_vmcall(&arg); - *arg = (word_t) codebuf->codestart; - po->stack_depth = initial_depth; /* callee removes arguments */ - RETURNED_FROM_SUBFUNCTION(); - INSN_pushretval(); INSNPUSHED(1); - END_CODE - META_assertdepth(po->stack_depth); - return generic_call_check(po, CfReturnRef|CfPyErrIfNull, - bfunction_result(po, true)); -} - - -/***************************************************************/ - /*** Memory reads and writes ***/ - -static void mem_access(PsycoObject* po, vinfo_t* nv_ptr, - long offset, vinfo_t* rt_vindex, int size2) -{ - BEGIN_CODE - if (is_runtime(nv_ptr->source)) { - INSN_rt_push(nv_ptr->source); - if (offset) { - INSN_immed(offset); - INSN_add(); - } - } - else { - offset += CompileTime_Get(nv_ptr->source)->value; - INSN_immed(offset); - } - INSNPUSHED(1); - if (rt_vindex != NULL) { - INSN_rt_push(rt_vindex->source); - if (size2 > 0) { - INSN_immed(size2); - INSN_lshift(); - } - INSN_add(); - } - END_CODE -} - -DEFINEFN -vinfo_t* psyco_memory_read(PsycoObject* po, vinfo_t* nv_ptr, - long offset, vinfo_t* rt_vindex, - int size2, bool nonsigned) -{ - mem_access(po, nv_ptr, offset, rt_vindex, size2); - BEGIN_CODE - switch (size2) { - case 0: /* load 1 byte */ - if (nonsigned) - INSN_load1u(); - else - INSN_load1(); - break; - case 1: /* load 2 bytes */ - if (nonsigned) - INSN_load2u(); - else - INSN_load2(); - break; - default: /* load 4 bytes */ - INSN_load4(); - } - END_CODE - return vinfo_new(RunTime_TOS()); -} - -DEFINEFN -bool psyco_memory_write(PsycoObject* po, vinfo_t* nv_ptr, - long offset, vinfo_t* rt_vindex, - int size2, vinfo_t* value) -{ - if (!compute_vinfo(value, po)) return false; - mem_access(po, nv_ptr, offset, rt_vindex, size2); - BEGIN_CODE - INSN_nv_push(value->source); - switch (size2) { - case 0: /* store 1 byte */ - INSN_store1(); - break; - case 1: /* store 2 bytes */ - INSN_store2(); - break; - default: /* store 4 bytes */ - INSN_store4(); - } - INSNPOPPED(1); - END_CODE - return true; -} - - -/* internal, see NEED_CC() */ -EXTERNFN condition_code_t cc_from_vsource(Source source); /* in codegen.c */ - -DEFINEFN -code_t* psyco_compute_cc(PsycoObject* po, code_t* code) -{ - vinfo_t* vf; - vinfo_t* vnf; - INSN_flag_push(); - INSNPUSHED(1); - - vf = po->ccregs[INDEX_CC(CC_FLAG)]; - vnf = po->ccregs[INDEX_CC(CC_NOT_FLAG)]; - if (vf != NULL) { - extra_assert(cc_from_vsource(vf->source) == CC_FLAG); - vf->source = RunTime_TOSF(false, true); - po->ccregs[INDEX_CC(CC_FLAG)] = NULL; - } - if (vnf != NULL) { - extra_assert(cc_from_vsource(vnf->source) == CC_NOT_FLAG); - if (vf != NULL) { - INSN_rt_push(vf->source); - INSNPUSHED(1); - } - INSN_cmpz(); - INSN_flag_push(); - vnf->source = RunTime_TOSF(false, true); - po->ccregs[INDEX_CC(CC_NOT_FLAG)] = NULL; - } - return code; -} - -DEFINEFN -void psyco_inverted_cc(PsycoObject* po) -{ - vinfo_t* v[2]; - int i; - for (i=0; i<2; i++) { - v[i] = po->ccregs[i]; - } - for (i=0; i<2; i++) { - condition_code_t cc = (condition_code_t) i; - if (v[i] != NULL) { - extra_assert(cc_from_vsource(v[i]->source) == cc); - v[i]->source = psyco_source_condition(INVERT_CC(cc)); - } - po->ccregs[INDEX_CC(INVERT_CC(cc))] = v[i]; - } -} - - -/*****************************************************************/ - /*** Emit common instructions ***/ - -DEFINEFN -condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, - vinfo_t* v1, vinfo_t* v2) -{ - condition_code_t result = CC_FLAG; - vinfo_t* tmp; - BEGIN_CODE - NEED_CC(); - /* the only operation with have is '<', so exchange v1 and v2 as needed */ - switch (base_py_op & COMPARE_BASE_MASK) { - - case Py_NE: - result = CC_NOT_FLAG; /* fall through */ - case Py_EQ: - INSN_rt_push(v1->source); INSNPUSHED(1); - INSN_rt_push(v2->source); - INSN_cmpeq(); - goto done; - - case Py_LE: - result = CC_NOT_FLAG; /* fall through */ - case Py_GT: - tmp=v1; v1=v2; v2=tmp; - break; - case Py_GE: - result = CC_NOT_FLAG; - break; - default: - ; - } - INSN_rt_push(v1->source); INSNPUSHED(1); - INSN_rt_push(v2->source); - if (base_py_op & COMPARE_UNSIGNED) - INSN_cmpltu(); - else - INSN_cmplt(); - - done: - INSNPOPPED(1); - END_CODE - return result; -} - -DEFINEFN -vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, - long immed_true, long immed_false) -{ - bool swap; - extra_assert(cc == CC_FLAG || cc == CC_NOT_FLAG); - swap = (cc == CC_NOT_FLAG); - BEGIN_CODE - if (!HAS_CCREG(po)) { - INSN_flag_push(); - } - else { - vinfo_t* v = po->ccregs[1]; - if (v) { - swap = !swap; - } - else { - v = po->ccregs[0]; - extra_assert(v); - } - code = psyco_compute_cc(po, code); - INSN_rt_push(v->source); - } - if (swap) { - long tmp = immed_true; - immed_true = immed_false; - immed_false = tmp; - } - INSN_immed(-1); - INSN_add(); - INSN_immed(immed_false - immed_true); - INSN_and(); - INSN_immed(immed_true); - INSN_add(); - INSNPUSHED(1); - END_CODE - return vinfo_new(RunTime_TOSF(false, - immed_true >= 0 && immed_false >= 0)); -} - -#define DEFINE_BINARY_INSTRO(insn) \ - DEFINEFN vinfo_t* bininstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ - vinfo_t* v1, vinfo_t* v2) { \ - BEGIN_CODE \ - NEED_CC(); \ - INSN_nv_push(v1->source); INSNPUSHED(1); \ - INSN_nv_push(v2->source); \ - INSN_##insn##_o(); \ - if (!ovf) INSN_flag_forget(); \ - END_CODE \ - if (ovf && runtime_condition_f(po, CC_FLAG)) \ - return NULL; /* if overflow */ \ - return vinfo_new(RunTime_TOSF(false, nonneg)); \ - } - -#define DEFINE_UNARY_INSTRO(insn) \ - DEFINEFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ - vinfo_t* v1) { \ - BEGIN_CODE \ - NEED_CC(); \ - INSN_rt_push(v1->source); INSNPUSHED(1); \ - INSN_##insn##_o(); \ - if (!ovf) INSN_flag_forget(); \ - END_CODE \ - if (ovf && runtime_condition_f(po, CC_FLAG)) \ - return NULL; /* if overflow */ \ - return vinfo_new(RunTime_TOSF(false, nonneg)); \ - } - -#define DEFINE_BINARY_INSTR(insn) \ - DEFINEFN vinfo_t* bininstr##insn(PsycoObject* po, bool nonneg, \ - vinfo_t* v1, vinfo_t* v2) { \ - BEGIN_CODE \ - INSN_nv_push(v1->source); INSNPUSHED(1); \ - INSN_nv_push(v2->source); \ - INSN_##insn(); \ - END_CODE \ - return vinfo_new(RunTime_TOSF(false, nonneg)); \ - } - -#define DEFINE_UNARY_INSTR(insn) \ - DEFINEFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool nonneg, \ - vinfo_t* v1) { \ - BEGIN_CODE \ - INSN_rt_push(v1->source); INSNPUSHED(1); \ - INSN_##insn(); \ - END_CODE \ - return vinfo_new(RunTime_TOSF(false, nonneg)); \ - } - -DEFINE_BINARY_INSTRO(add) -DEFINE_BINARY_INSTR(or ) -DEFINE_BINARY_INSTR(and) -DEFINE_BINARY_INSTRO(sub) -DEFINE_BINARY_INSTR(xor) -DEFINE_BINARY_INSTRO(mul) -DEFINE_BINARY_INSTR(lshift) -DEFINE_BINARY_INSTR(rshift) -DEFINE_UNARY_INSTR(inv) -DEFINE_UNARY_INSTRO(neg) -DEFINE_UNARY_INSTRO(abs) - -DEFINEFN -vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, bool unsafe) -{ - BEGIN_CODE - INSN_rt_push(rt1->source); INSNPUSHED(1); - INSN_immed(value2); - INSN_add(); - END_CODE - return vinfo_new(RunTime_TOSF(false, unsafe && - value2>=0 && is_rtnonneg(rt1->source))); -} - -DEFINEFN -vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, bool ovf) -{ - BEGIN_CODE - NEED_CC(); - INSN_rt_push(v1->source); INSNPUSHED(1); - INSN_immed(value2); - INSN_mul_o(); - if (!ovf) INSN_flag_forget(); - END_CODE - if (ovf && runtime_condition_f(po, CC_FLAG)) - return NULL; - return vinfo_new(RunTime_TOSF(false, - ovf && value2>=0 && is_rtnonneg(v1->source))); -} - -#define GENERIC_SHIFT_BY(Insn, nonneg) \ - { \ - extra_assert(0 < counter && counter < LONG_BIT); \ - BEGIN_CODE \ - INSN_rt_push(v1->source); INSNPUSHED(1); \ - INSN_immed(counter); \ - Insn (); \ - END_CODE \ - return vinfo_new(RunTime_TOSF(false, nonneg)); \ - } - -DEFINEFN -vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter) - GENERIC_SHIFT_BY(INSN_lshift, false) - -DEFINEFN -vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter) - GENERIC_SHIFT_BY(INSN_rshift, is_nonneg(v1->source)) - -DEFINEFN -vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter) - GENERIC_SHIFT_BY(INSN_urshift, true) - -DEFINEFN -condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, - vinfo_t* rt1, long immed2) -{ - condition_code_t result = CC_FLAG; - BEGIN_CODE - NEED_CC(); - /* the only operation with have is '<', so exchange v1 and v2 as needed */ - switch (base_py_op & COMPARE_BASE_MASK) { - - case Py_NE: - result = CC_NOT_FLAG; /* fall through */ - case Py_EQ: - INSN_rt_push(rt1->source); - INSN_immed(immed2); - INSN_cmpeq(); - break; - - case Py_LE: - result = CC_NOT_FLAG; /* fall through */ - case Py_GT: - INSN_immed(immed2); INSNPUSHED(1); /* reversed arguments */ - INSN_rt_push(rt1->source); - if (base_py_op & COMPARE_UNSIGNED) - INSN_cmpltu(); - else - INSN_cmplt(); - INSNPOPPED(1); - break; - - case Py_GE: - result = CC_NOT_FLAG; /* fall through */ - default: - INSN_rt_push(rt1->source); - INSN_immed(immed2); - if (base_py_op & COMPARE_UNSIGNED) - INSN_cmpltu(); - else - INSN_cmplt(); - } - END_CODE - return result; -} - -DEFINEFN -vinfo_t* bfunction_result(PsycoObject* po, bool ref) -{ - return vinfo_new(RunTime_TOSF(ref, false)); -} - -/* DEFINEFN */ -/* vinfo_t* psyco_vinfo_condition(PsycoObject* po, condition_code_t cc) */ -/* { */ -/* Source src; */ -/* if ((int)cc < CC_TOTAL) */ -/* { */ -/* BEGIN_CODE */ -/* INSN_flag_push(); */ -/* if (cc == CC_NOT_FLAG) */ -/* INSN_not(); */ -/* INSNPUSHED(1); */ -/* END_CODE */ -/* src = RunTime_TOSF(false, true); */ -/* } */ -/* else */ -/* src = CompileTime_New(cc == CC_ALWAYS_TRUE); */ -/* return vinfo_new(src); */ -/* } */ - -DEFINEFN -vinfo_t* make_runtime_copy(PsycoObject* po, vinfo_t* v) -{ - if (!compute_vinfo(v, po)) return NULL; - BEGIN_CODE - INSN_nv_push(v->source); - INSNPUSHED(1); - END_CODE - return vinfo_new(RunTime_TOSF(false, is_nonneg(v->source))); -} diff --git a/nodebox/ext/psyco/src/c/ivm/iencoding.h b/nodebox/ext/psyco/src/c/ivm/iencoding.h deleted file mode 100644 index c7dd79a..0000000 --- a/nodebox/ext/psyco/src/c/ivm/iencoding.h +++ /dev/null @@ -1,285 +0,0 @@ - /***************************************************************/ -/*** Processor-specific code-producing macros ***/ - /***************************************************************/ - - -#ifndef _IENCODING_H -#define _IENCODING_H - - -#include "../psyco.h" -#define MACHINE_CODE_FORMAT "ivm" -#define HAVE_FP_FN_CALLS 0 - - -#define REG_TOTAL 0 /* the virtual machine has only a stack */ - -/* the condition code is stored in the 'flag' register. */ -typedef enum { - CC_FLAG = 0, - CC_NOT_FLAG = 1, -#define CC_TOTAL 2 - CC_ALWAYS_FALSE = 2, /* pseudo condition codes for known outcomes */ - CC_ALWAYS_TRUE = 3, - CC_ERROR = -1 } condition_code_t; - -#define INVERT_CC(cc) ((condition_code_t)((int)(cc) ^ 1)) -#define HAVE_CCREG 2 -#define INDEX_CC(cc) (extra_assert((cc) == CC_FLAG || (cc) == CC_NOT_FLAG), \ - (int)(cc)) -#define HAS_CCREG(po) ((po)->ccregs[0] != NULL || (po)->ccregs[1] != NULL) - -#if PSYCO_DEBUG -struct cc_s; -# define CC_FLAG ((struct cc_s*) CC_FLAG) -# define CC_NOT_FLAG ((struct cc_s*) CC_NOT_FLAG) -# define CC_ALWAYS_FALSE ((struct cc_s*) CC_ALWAYS_FALSE) -# define CC_ALWAYS_TRUE ((struct cc_s*) CC_ALWAYS_TRUE) -# define CC_ERROR ((struct cc_s*) CC_ERROR) -# define condition_code_t struct cc_s* -#endif - - -/* processor-depend part of PsycoObject */ -#define PROCESSOR_PSYCOOBJECT_FIELDS \ - int stack_depth; /* the size of data currently pushed in the stack */ \ - int minimal_stack_size; /* total stack size that we are sure about */ \ - vinfo_t* ccregs[2]; /* processor condition codes (aka flags) */ -#define INIT_PROCESSOR_PSYCOOBJECT(po) \ - ((po)->minimal_stack_size = VM_INITIAL_MINIMAL_STACK_SIZE) - -#define PROCESSOR_FROZENOBJECT_FIELDS \ - unsigned short minimal_extra_stack_words; /* ~= minimal_stack_size */ -#define SAVE_PROCESSOR_FROZENOBJECT(fpo, po) do { \ - int extra_stack_words = ((po)->minimal_stack_size - \ - (po)->stack_depth) / sizeof(long); \ - if (extra_stack_words < 0) \ - extra_stack_words = 0; \ - else if (extra_stack_words > 0xFFFF) \ - extra_stack_words = 0xFFFF; \ - (fpo)->minimal_extra_stack_words = extra_stack_words; \ -} while (0) -#define RESTORE_PROCESSOR_FROZENOBJECT(fpo, po) do { \ - (po)->minimal_stack_size = (po)->stack_depth + \ - (fpo)->minimal_extra_stack_words * sizeof(long); \ -} while (0) - -#define CHECK_STACK_SPACE() do { \ - if (po->stack_depth >= po->minimal_stack_size) { \ - BEGIN_CODE \ - INSN_stackgrow(); \ - END_CODE \ - po->minimal_stack_size = po->stack_depth + VM_EXTRA_STACK_SIZE; \ - } \ - META_assertdepth(po->stack_depth); \ -} while(0) - - -#define CURRENT_STACK_POSITION(rtsource) ( \ - (po->stack_depth - getstack(rtsource)) / sizeof(long)) - -/* release a run-time vinfo_t */ -/* #define RTVINFO_RELEASE(rtsource) do { \ */ -/* // pop an item off the stack only if it is close to the top \ */ -/* switch (CURRENT_STACK_POSITION(rtsource)) { \ */ -/* case 0: \ */ -/* INSN_pop(); INSN_POPPED(1); \ */ -/* break; \ */ -/* case 1: \ */ -/* INSN_pop2nd(); ??? \ */ -/* break; \ */ -/* default: \ */ -/* break; // not removed \ */ -/* } \ */ -/* } while (0) */ -#define RTVINFO_RELEASE(rtsource) do { /* nothing */ } while (0) - -/* move a run-time vinfo_t */ -#define RTVINFO_MOVE(rtsource, vtarget) do { /*nothing*/ } while (0) - -/* for PsycoObject_Duplicate() */ -#define DUPLICATE_PROCESSOR(result, po) do { \ - int i; \ - result->stack_depth = po->stack_depth; \ - result->minimal_stack_size = po->minimal_stack_size; \ - for (i=0; i<2; i++) \ - if (po->ccregs[i] != NULL) \ - result->ccregs[i] = po->ccregs[i]->tmp; \ -} while (0) - -#define RTVINFO_CHECK(po, vsource, found) do { /*nothing*/ } while (0) -#define RTVINFO_CHECKED(po, found) do { /*nothing*/ } while (0) - -#define ABOUT_TO_CALL_SUBFUNCTION(finfo) do { \ - word_t* _arg; \ - INSN_pyenter(&_arg); \ - *_arg = (word_t)(finfo); \ -} while (0) -#define RETURNED_FROM_SUBFUNCTION() do { \ - INSN_pyleave(); \ -} while (0) - - -/*****************************************************************/ - /*** Emit common instructions ***/ - -#define EXTERN_BINARY_INSTRO(insn) \ - EXTERNFN vinfo_t* bininstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ - vinfo_t* v1, vinfo_t* v2); -#define EXTERN_UNARY_INSTRO(insn) \ - EXTERNFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool ovf, bool nonneg, \ - vinfo_t* v1); -#define EXTERN_BINARY_INSTR(insn) \ - EXTERNFN vinfo_t* bininstr##insn(PsycoObject* po, bool nonneg, \ - vinfo_t* v1, vinfo_t* v2); -#define EXTERN_UNARY_INSTR(insn) \ - EXTERNFN vinfo_t* unaryinstr##insn(PsycoObject* po, bool nonneg, \ - vinfo_t* v1); - -EXTERN_BINARY_INSTRO(add) -EXTERN_BINARY_INSTR (or) -EXTERN_BINARY_INSTR (and) -EXTERN_BINARY_INSTRO(sub) -EXTERN_BINARY_INSTR (xor) -EXTERN_BINARY_INSTRO(mul) -EXTERN_BINARY_INSTR (lshift) -EXTERN_BINARY_INSTR (rshift) -EXTERN_UNARY_INSTR (inv) -EXTERN_UNARY_INSTRO (neg) -EXTERN_UNARY_INSTRO (abs) - -EXTERNFN condition_code_t bininstrcmp(PsycoObject* po, int base_py_op, - vinfo_t* v1, vinfo_t* v2); -EXTERNFN vinfo_t* bininstrcond(PsycoObject* po, condition_code_t cc, - long immed_true, long immed_false); - -#define BINARY_INSTR_ADD(ovf, nonneg) bininstradd(po, ovf, nonneg, v1, v2) -#define BINARY_INSTR_OR( ovf, nonneg) bininstror (po, nonneg, v1, v2) -#define BINARY_INSTR_AND(ovf, nonneg) bininstrand(po, nonneg, v1, v2) -#define BINARY_INSTR_SUB(ovf, nonneg) bininstrsub(po, ovf, nonneg, v1, v2) -#define BINARY_INSTR_XOR(ovf, nonneg) bininstrxor(po, nonneg, v1, v2) -#define BINARY_INSTR_MUL(ovf, nonneg) bininstrmul(po, ovf, nonneg, v1, v2) -#define BINARY_INSTR_LSHIFT( nonneg) bininstrlshift(po, nonneg, v1, v2) -#define BINARY_INSTR_RSHIFT( nonneg) bininstrrshift(po, nonneg, v1, v2) -#define BINARY_INSTR_CMP(base_py_op) bininstrcmp(po, base_py_op, v1, v2) -#define BINARY_INSTR_COND(cc, i1, i2) bininstrcond(po, cc, i1, i2) -#define UNARY_INSTR_INV(ovf, nonneg) unaryinstrinv(po, nonneg, v1) -#define UNARY_INSTR_NEG(ovf, nonneg) unaryinstrneg(po, ovf, nonneg, v1) -#define UNARY_INSTR_ABS(ovf, nonneg) unaryinstrabs(po, ovf, nonneg, v1) - -EXTERNFN vinfo_t* bint_add_i(PsycoObject* po, vinfo_t* rt1, long value2, - bool unsafe); -EXTERNFN vinfo_t* bint_mul_i(PsycoObject* po, vinfo_t* v1, long value2, - bool ovf); -EXTERNFN vinfo_t* bint_lshift_i(PsycoObject* po, vinfo_t* v1, int counter); -EXTERNFN vinfo_t* bint_rshift_i(PsycoObject* po, vinfo_t* v1, int counter); -EXTERNFN vinfo_t* bint_urshift_i(PsycoObject* po, vinfo_t* v1, int counter); -EXTERNFN condition_code_t bint_cmp_i(PsycoObject* po, int base_py_op, - vinfo_t* rt1, long immed2); -EXTERNFN vinfo_t* bfunction_result(PsycoObject* po, bool ref); - -/***************************************************************/ - /*** some macro for code emission ***/ - -#define CHECK_NONZERO_FROM_RT(src, rcc) do { \ - NEED_CC(); \ - INSN_rt_push(src); \ - INSN_cmpz(); /* negative form, to normalize to 1 or 0 */ \ - rcc = CC_NOT_FLAG; \ -} while (0) - -#define NEED_CC() do { \ - if (HAS_CCREG(po)) \ - code = psyco_compute_cc(po, code); \ -} while (0) -/* internal */ -EXTERNFN code_t* psyco_compute_cc(PsycoObject* po, code_t* code); -EXTERNFN void psyco_inverted_cc(PsycoObject* po); - -#define SAVE_REGS_FN_CALLS(cc) do { if (cc) NEED_CC(); } while (0) - -#define TEMP_SAVE_REGS_FN_CALLS do { /* nothing */ } while (0) - -#define TEMP_RESTORE_REGS_FN_CALLS do { /* nothing */ } while (0) - -#define JUMP_TO(target) do { \ - word_t* _arg; \ - INSN_jumpfar(&_arg); \ - *_arg = (word_t) target; \ -} while (0) - -#define MAXIMUM_SIZE_OF_FAR_JUMP (sizeof(code_t)+sizeof(word_t)+sizeof(code_t)) - - -#define CALL_SET_ARG_IMMED(immed, arg_index, nb_args) do { \ - INSN_immed(immed); \ - INSNPUSHED(1); \ -} while (0) -#define CALL_SET_ARG_FROM_RT(source, arg_index, nb_args) do { \ - INSN_rt_push(source); \ - INSNPUSHED(1); \ -} while (0) -#define CALL_SET_ARG_FROM_ADDR(source, arg_index, nb_args) do { \ - INSN_ref_push(CURRENT_STACK_POSITION(source)); \ - INSNPUSHED(1); \ -} while (0) -#define CALL_C_FUNCTION(target, nb_args) do { \ - word_t* _arg; \ - switch (nb_args) { \ - case 0: INSN_ccall0(&_arg); break; \ - case 1: INSN_ccall1(&_arg); break; \ - case 2: INSN_ccall2(&_arg); break; \ - case 3: INSN_ccall3(&_arg); break; \ - case 4: INSN_ccall4(&_arg); break; \ - case 5: INSN_ccall5(&_arg); break; \ - case 6: INSN_ccall6(&_arg); break; \ - case 7: INSN_ccall7(&_arg); break; \ - default: psyco_fatal_msg("too many arguments to C function call"); \ - } \ - *_arg = (word_t)(target); \ - INSNPOPPED((nb_args)-1); /* can be -1, if nb_args is 0 */ \ -} while (0) - - -#define STACK_CORRECTION(stack_correction) do { \ - int _stackcorr = (int)(stack_correction); \ - if (_stackcorr < 0) \ - INSN_settos((-_stackcorr) / sizeof(long)); \ - else if (_stackcorr > 0) \ - INSN_pushn(_stackcorr / sizeof(long)); \ -} while (0) -/* Dummy stack alignment for non-MacOS X */ -#define CALL_STACK_ALIGN_DELTA(nbargs, delta) -#define CALL_STACK_ALIGN(nbargs) -#define CALL_STACK_ALIGN_RESTORE(delta) - -#define FUNCTION_RET(popbytes) do { \ - INSN_ret((popbytes) / sizeof(long) + 1); /* +1 for the retaddr itself */ \ -} while (0) - -#if defined(PSYCO_TRACE) -# error "This Trace not implemented for the ivm; use IVM_TRACE instead" -#endif - - -#define ALIGN_CODE_MASK (sizeof(long)-1) - -#define ALIGN_PAD_CODE_PTR() do { \ - code = (code_t*)((((long)code) + ALIGN_CODE_MASK) & ~ALIGN_CODE_MASK); \ -} while (0) - -#define ALIGN_WITH_BYTE(byte) do { \ - while (((long)code) & ALIGN_CODE_MASK) \ - *code++ = byte; \ -} while (0) - -#define ALIGN_WITH_NOP() do { /*nothing*/ } while (0) - -#if ALL_CHECKS -#define ALIGN_NO_FILL() ALIGN_WITH_BYTE(0xFF) /* debugging */ -#else -#define ALIGN_NO_FILL() ALIGN_PAD_CODE_PTR() -#endif - - -#endif /* _IENCODING_H */ diff --git a/nodebox/ext/psyco/src/c/ivm/iinitialize.h b/nodebox/ext/psyco/src/c/ivm/iinitialize.h deleted file mode 100644 index ba5b55e..0000000 --- a/nodebox/ext/psyco/src/c/ivm/iinitialize.h +++ /dev/null @@ -1,20 +0,0 @@ - /***************************************************************/ -/*** Automatically generated support file ***/ - /***************************************************************/ - - /* This file is automatically generated by 'files.py'. - DO NOT MODIFY. Changes will be overwritten ! */ - - - /* internal part for psyco.c */ -#if ALL_STATIC -# include "iprocessor.c" -# include "idispatcher.c" -# include "iencoding.c" -# include "ipyencoding.c" -# include "ivm-insns.c" -#else /* if !ALL_STATIC */ -#endif /* !ALL_STATIC */ - -PSY_INLINE void initialize_processor_files(void) { -} diff --git a/nodebox/ext/psyco/src/c/ivm/iprocessor.c b/nodebox/ext/psyco/src/c/ivm/iprocessor.c deleted file mode 100644 index b68041b..0000000 --- a/nodebox/ext/psyco/src/c/ivm/iprocessor.c +++ /dev/null @@ -1,476 +0,0 @@ -#include "../processor.h" -#include "../codemanager.h" -#include "../cstruct.h" -#include "../blockalloc.h" -#include "../Python/frames.h" -#include "ivm-insns.h" - - -/* We distinguish between different types of interpreters: - * - the most compatible one is switch()-based - * - a GCC extension allows absolute threaded jumps - * - a more recent GCC extension allows relative threaded jumps - * (not sure that it is better than the previous one, though; - * will need some tests) - */ -#ifdef __GNUC__ -# define VM_THREADED_INTERPRETER 1 -# define VM_RELATIVE_JUMPS 0 /* XXX check if this is really better */ -//# define VM_RELATIVE_JUMPS (__GNUC__>3||(__GNUC__==3&&__GNUC_MINOR__>=2)) -#else -# define VM_THREADED_INTERPRETER 0 -#endif - - -/***************************************************************/ - /*** Stack of the virtual machine ***/ - -/* Note that the stack grows downwards. */ -/* See ivm-insns.h for customizable parameters. */ - -/* XXX loafy stack overflow checking ahead */ - -#define FINFO_STOP ((struct stack_frame_info_s*) 1) - -typedef struct vmstackframe_s vmstackframe_t; -struct vmstackframe_s { - struct stack_frame_info_s* finfo; /* describes the *called* (i.e. next - frame's) function (this is for - compatibility with the hacks needed - for real machine code */ - char* limit; - char* sp; /* stack pointer: limit<=sp<=origin */ - char* origin; - vmstackframe_t* prevframe; /* the previous frame */ - vmstackframe_t* nextframe; /* the next more recent frame */ -}; - -BLOCKALLOC_STATIC(vmstackframe, vmstackframe_t, 256) - -typedef struct { - PyCStruct_HEAD - vmstackframe_t* topframe; /* most recent stack frame */ -} PyVMStack; - -PSY_INLINE PyVMStack* vm_get_stack(PyObject* tdict) -{ - PyVMStack* st; - RECLIMIT_SAFE_ENTER(); - st = (PyVMStack*) PyDict_GetItem(tdict, Py_None); - if (st == NULL) { - st = PyCStruct_NEW(PyVMStack, NULL); - st->topframe = NULL; - if (PyDict_SetItem(tdict, Py_None, (PyObject*) st)) - OUT_OF_MEMORY(); - } - RECLIMIT_SAFE_LEAVE(); - return st; -} - - -/***************************************************************/ - /*** Virtual machine interpreter ***/ - -#define bytecode_nextopcode() (*nextip++) -#define bytecode_nx_code_t() (*nextip++) -#define bytecode_nx_word_t() (tmp = *(word_t*) nextip, \ - nextip += sizeof(word_t), \ - tmp) -#define bytecode_nx_char() ((char)(*nextip++)) -#define bytecode_next(T) (bytecode_nx_##T()) - -#define stack_nth(N) sp[N] -#define stack_shift(N) (sp += (N), \ - extra_assert((char*)sp >= frame->limit)) -#define stack_shift_pos(N) (sp += (N)) -#define stack_savesp() (frame->sp = (char*) sp) - -#define macro_args /* nothing */ -#define macro_noarg () /* macro call with no argument */ - -PSY_INLINE long abs_o(long a) { return a < 0 ? -a : a; } -#define ovf_checkabs_o(a) (a == LONG_MIN) -#define ovf_checkneg_o(a) (a == LONG_MIN) -#define ovf_checkadd_o(a, b) (((a+b)^a) < 0 && (a^b) >= 0) -#define ovf_checksub_o(a, b) (((a-b)^a) < 0 && ((a-b)^b) >= 0) -#define ovf_checkmul_o(a, b) psyco_int_mul_ovf(a, b) -#define ovf_check(INSN, ARGS) ovf_check##INSN ARGS - -#define impl_stackgrow(sz) if ((char*)sp - frame->limit < \ - (sz) + VM_STACK_SIZE_MARGIN) \ - sp = vm_stackgrow(frame, sp) -#define impl_jcond(test, newip) if (test) nextip = (code_t*) newip -#define impl_jump(newip) nextip = (code_t*) newip -typedef code_t* (*cbuild1_fn) (char*); -typedef code_t* (*cbuild2_fn) (char*, word_t extra); -#define impl_cbuild1(fn) stack_savesp(); \ - nextip = ((cbuild1_fn) fn) ( \ - (char*)((((long)nextip) + PSYCO_DEBUG + \ - ALIGN_CODE_MASK)&~ALIGN_CODE_MASK)) -#define impl_cbuild2(fn, extra) stack_savesp(); \ - nextip = ((cbuild2_fn) fn) ( \ - (char*)((((long)nextip) + PSYCO_DEBUG + \ - ALIGN_CODE_MASK)&~ALIGN_CODE_MASK), \ - extra) -#define impl_incref(o) Py_INCREF((PyObject*) o) -#define impl_decref(o) stack_savesp(); Py_DECREF((PyObject*) o) -#define impl_decrefnz(o) ((PyObject*) o)->ob_refcnt-- -/* implemented in pycompiler.c */ -EXTERNFN void cimpl_finalize_frame_locals(PyObject*, PyObject*, PyObject*); -#define impl_exitframe(tb, val, exc) stack_savesp(); \ - if (exc) cimpl_finalize_frame_locals( \ - (PyObject*) exc, \ - (PyObject*) val, \ - (PyObject*) tb) -#define impl_pyenter(finfo) frame = vm_pyenter(vmst, frame, finfo, sp) -#define impl_pyleave frame = vm_pyleave(vmst, frame, sp); \ - sp = (word_t*) frame->sp; -/* XXX hack! We abuse the fact that frame->sp is not completely in sync with - the local sp (this is the case for optimization purposes). When impl_vmcall() - is called, frame->sp still has the value it had at the last impl_pyenter() - (see iencoding.c:psyco_call_psyco()). */ -#define impl_vmcall(target) (tmp=(word_t) nextip, \ - nextip=(code_t*) target, \ - frame->origin = frame->sp, \ - tmp) -#define impl_ret(retaddr) if (retaddr == 0) { \ - return retval; \ - } else { \ - nextip = (code_t*) retaddr; \ - } -/* XXX divide the stack in separately-growable blocks across INSN_vmcall() */ -typedef word_t (*ccalled_fn_t_0) (void); -typedef word_t (*ccalled_fn_t_1) (word_t); -typedef word_t (*ccalled_fn_t_2) (word_t,word_t); -typedef word_t (*ccalled_fn_t_3) (word_t,word_t,word_t); -typedef word_t (*ccalled_fn_t_4) (word_t,word_t,word_t,word_t); -typedef word_t (*ccalled_fn_t_5) (word_t,word_t,word_t,word_t,word_t); -typedef word_t (*ccalled_fn_t_6) (word_t,word_t,word_t,word_t,word_t,word_t); -typedef word_t (*ccalled_fn_t_7) (word_t,word_t,word_t,word_t,word_t,word_t,word_t); -#define impl_ccall(nbargs, fn, args) (stack_savesp(), \ - (((ccalled_fn_t_##nbargs)(fn)) args)) -#define impl_checkdict(dict, key, result, index) ( \ - (unsigned)((PyDictObject*)dict)->ma_mask < (unsigned)index || \ - ((PyDictObject*)dict)->ma_table[index].me_key != (PyObject*)key || \ - ((PyDictObject*)dict)->ma_table[index].me_value != (PyObject*)result) -#define impl_dynamicfreq (((word_t*) nextip)[-1] ++) -#if PSYCO_DEBUG -# define impl_debug_check_flag(x) extra_assert(x == 0 || x == 1) -# define impl_debug_forget_flag(x) x = 0xABABABAB -#else -# define impl_debug_check_flag(x) /* nothing */ -# define impl_debug_forget_flag(x) /* nothing */ -#endif - -PSY_INLINE vmstackframe_t* vm_pyenter(PyVMStack* vmst, vmstackframe_t* frame, - word_t finfo, word_t* currentsp) -{ - vmstackframe_t* top = psyco_llalloc_vmstackframe(); - top->finfo = FINFO_STOP; - top->limit = frame->limit; - top->sp = frame->sp = (char*) currentsp; - top->origin = frame->origin; - top->prevframe = frame; - top->nextframe = NULL; - frame->finfo = (struct stack_frame_info_s*) finfo; - frame->nextframe = top; - vmst->topframe = top; - return top; -} -PSY_INLINE vmstackframe_t* vm_pyleave(PyVMStack* vmst, vmstackframe_t* top, - word_t* currentsp) -{ - vmstackframe_t* prevtop = top->prevframe; - prevtop->finfo = FINFO_STOP; - prevtop->nextframe = NULL; - - if (prevtop->limit != top->limit) { - /* only when leaving an non-inlined subfunction. - Then prevtop->sp already contains the equivalent - pointer to restore. This only works if the pyleave - instruction is immediately after vmcall, because - it assumes that the stack has the same depth as when - pyenter was called (which is false when pyleave is - used for an inlined subfunction). */ - PyMem_Free(top->limit); - } - else { - prevtop->sp = (char*) currentsp; - } - vmst->topframe = prevtop; - psyco_llfree_vmstackframe(top); - return prevtop; -} -static word_t* vm_stackgrow(vmstackframe_t* frame, word_t* currentsp) -{ - /* enlarge the stack of the topmost frame 'frame' - and all the previous frames which share exactly the same stack */ - vmstackframe_t* f; - char* currentlimit = frame->limit; - char* currentorigin = frame->origin; - char* newsp; - size_t cursize = currentorigin - (char*)currentsp; - size_t newsize = cursize + VM_EXTRA_STACK_SIZE+2*VM_STACK_SIZE_MARGIN-1; - newsize &= -VM_STACK_SIZE_MARGIN; - frame->limit = PyMem_Malloc(newsize); - if (frame->limit == NULL) - OUT_OF_MEMORY(); - frame->origin = frame->limit + newsize; - newsp = frame->origin - cursize; - memcpy(newsp, currentsp, cursize); - - for (f = frame->prevframe; - f != NULL && f->limit == currentlimit; - f = f->prevframe) { - if (f->origin == currentorigin) { - /* exactly the same stack, fix it too */ - f->limit = frame->limit; - f->origin = frame->origin; - f->sp = newsp; - } - else { - /* previous frame has a larger stack starting - from the same position, which means it is from - a parent function -- the child function's stack - is smaller because it does not contain everything - past the input arguments. In this case there is - no old stack to free because the old stack is - still in use. */ - return (word_t*) newsp; - } - } - /* free old stack */ - PyMem_Free(currentlimit); - return (word_t*) newsp; -} - -/* on register-limited architectures it may help a little bit - to force these local variables in registers, as the compiler - may think it would be better not to. */ - -#if defined(__GNUC__) && !PSYCO_DEBUG -# ifdef __i386__ -# define F_SPREG asm("esi") -# define F_NEXTIPREG asm("edi") -# endif -#endif - - -#ifndef F_ACCUMREG -# define F_ACCUMREG /* nothing */ -#endif -#ifndef F_SPREG -# define F_SPREG /* nothing */ -#endif -#ifndef F_NEXTIPREG -# define F_NEXTIPREG /* nothing */ -#endif - - -#define retval flag /* same ivm register */ - -static word_t vm_interpreter_main_loop(PyVMStack* vmst) -{ - /* virtual machine "registers" */ - register word_t accum F_ACCUMREG; /* 1st stack item, for optimization */ - register word_t* sp F_SPREG; /* stack pointer */ - register code_t* nextip F_NEXTIPREG; /* next instruction pointer */ - word_t flag; /* flags OR retval register */ - word_t tmp; - vmstackframe_t* frame = vmst->topframe; - - /* initialization */ - nextip = (code_t*) frame->limit; /* hack from psyco_processor_run() */ - sp = (word_t*) frame->sp; - accum = 0xCDCDCDCD; /* unused */ - flag = 0xCDCDCDCD; /* unused */ - - /* Let's loop! */ -# if VM_THREADED_INTERPRETER - { -# if VM_RELATIVE_JUMPS -# include "prolog/insns-threaded-rel.i" -# else -# include "prolog/insns-threaded.i" -# endif - } -# else - while (1) { - switch (bytecode_nextopcode()) { -# include "prolog/insns-switch.i" - default: - psyco_fatal_msg("invalid vm opcode"); - } - } -# endif -} - -#undef retval - - -/***************************************************************/ - /*** Virtual machine entry point ***/ - -#define VM_ENOUGH_STACK \ - (top->origin - top->limit >= (int)(4*sizeof(long)*argc + \ - VM_INITIAL_MINIMAL_STACK_SIZE + VM_STACK_SIZE_MARGIN)) - -DEFINEFN -PyObject* psyco_processor_run(CodeBufferObject* codebuf, - long initial_stack[], - struct stack_frame_info_s*** finfo, - PyObject* tdict) -{ - PyObject* result; - PyVMStack* vmst = vm_get_stack(tdict); - vmstackframe_t* prevtop = vmst->topframe; - vmstackframe_t* top = psyco_llalloc_vmstackframe(); - *finfo = &top->finfo; - top->finfo = FINFO_STOP; - top->prevframe = prevtop; - top->nextframe = NULL; - if (prevtop) { - top->limit = prevtop->limit; - top->origin = prevtop->sp; /* start using the stack from - the prevtop's current sp */ - } - else { - top->limit = NULL; - top->origin = NULL; - } - - /* to store the incoming arguments on the stack, - the "cleanest" solution seems to be to build a temporary - pseudo-code. The not-so-clean hack is to abuse the stack - to write this code. */ - { - int argc = RUN_ARGC(codebuf); - word_t* arg; - code_t* code; - - if (!VM_ENOUGH_STACK) { - top->limit = PyMem_Malloc(VM_STACK_BLOCK); - if (!top->limit) - OUT_OF_MEMORY(); - top->origin = top->limit + VM_STACK_BLOCK; - extra_assert(VM_ENOUGH_STACK); - } - top->sp = top->origin; - - code = (code_t*) top->limit; - INIT_CODE_EMISSION(code); - while (argc) { /* incoming arguments */ - long argvalue = initial_stack[--argc]; - INSN_immed(argvalue); - } - INSN_immed(0); /* return address. Special value 0 means - "leave the interpreter main loop" */ - INSN_jumpfar(&arg); - *arg = (word_t) codebuf->codestart; - } - - vmst->topframe = top; - result = (PyObject*) vm_interpreter_main_loop(vmst); - vmst->topframe = prevtop; - - /* restore the stack */ - if (prevtop == NULL || top->limit != prevtop->limit) { - PyMem_Free(top->limit); - } - psyco_llfree_vmstackframe(top); - return result; -} - - -/***************************************************************/ - /*** Misc ***/ - -static struct stack_frame_info_s* finfo_stop = FINFO_STOP; - -DEFINEFN struct stack_frame_info_s** -psyco_next_stack_frame(struct stack_frame_info_s** finfo) -{ - vmstackframe_t* frame = (vmstackframe_t*) finfo; - extra_assert(finfo == &frame->finfo); - if (frame->nextframe == NULL) - return &finfo_stop; - else - return &frame->nextframe->finfo; -} - -/* check for signed integer multiplication overflow */ -/* code shamelessly ripped off Python's intobject.c */ -static char python_style_mul_ovf(long a, long b) -{ - long longprod; /* a*b in native long arithmetic */ - double doubled_longprod; /* (double)longprod */ - double doubleprod; /* (double)a * (double)b */ - - longprod = a * b; - doubleprod = (double)a * (double)b; - doubled_longprod = (double)longprod; - - /* Fast path for normal case: small multiplicands, and no info - is lost in either method. */ - if (doubled_longprod == doubleprod) - return false; /* no overflow */ - - /* Somebody somewhere lost info. Close enough, or way off? Note - that a != 0 and b != 0 (else doubled_longprod == doubleprod == 0). - The difference either is or isn't significant compared to the - true value (of which doubleprod is a good approximation). - */ - { - const double diff = doubled_longprod - doubleprod; - const double absdiff = diff >= 0.0 ? diff : -diff; - const double absprod = doubleprod >= 0.0 ? doubleprod : - -doubleprod; - /* absdiff/absprod <= 1/32 iff - 32 * absdiff <= absprod -- 5 good bits is "close enough" */ - return !(32.0 * absdiff <= absprod); - } -} - -DEFINEVAR char (*psyco_int_mul_ovf) (long a, long b) = &python_style_mul_ovf; - - -/* don't look */ -static long hacky_call_var(void* c_func, int argcount, long arguments[]) -{ - switch (argcount) { - case 0: return ((ccalled_fn_t_0) c_func) (); - case 1: return ((ccalled_fn_t_1) c_func) (arguments[0]); - case 2: return ((ccalled_fn_t_2) c_func) (arguments[0], - arguments[1]); - case 3: return ((ccalled_fn_t_3) c_func) (arguments[0], - arguments[1], - arguments[2]); - case 4: return ((ccalled_fn_t_4) c_func) (arguments[0], - arguments[1], - arguments[2], - arguments[3]); - case 5: return ((ccalled_fn_t_5) c_func) (arguments[0], - arguments[1], - arguments[2], - arguments[3], - arguments[4]); - case 6: return ((ccalled_fn_t_6) c_func) (arguments[0], - arguments[1], - arguments[2], - arguments[3], - arguments[4], - arguments[5]); - case 7: return ((ccalled_fn_t_7) c_func) (arguments[0], - arguments[1], - arguments[2], - arguments[3], - arguments[4], - arguments[5], - arguments[6]); - default: psyco_fatal_msg("too many arguments to C function call"); - } - return 0; -} - -DEFINEVAR long (*psyco_call_var) (void* c_func, int argcount, long arguments[]) = - &hacky_call_var; diff --git a/nodebox/ext/psyco/src/c/ivm/ipyencoding.c b/nodebox/ext/psyco/src/c/ivm/ipyencoding.c deleted file mode 100644 index 8cbef75..0000000 --- a/nodebox/ext/psyco/src/c/ivm/ipyencoding.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "ipyencoding.h" -#include "../pycodegen.h" - - -DEFINEFN -void decref_create_new_ref(PsycoObject* po, vinfo_t* w) -{ - psyco_incref_nv(po, w); -} - -DEFINEFN -bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w) -{ - bool could_eat = eat_reference(w); - if (!could_eat) { - /* in this case we must Py_INCREF() the object */ - psyco_incref_nv(po, w); - } - return could_eat; -} diff --git a/nodebox/ext/psyco/src/c/ivm/ipyencoding.h b/nodebox/ext/psyco/src/c/ivm/ipyencoding.h deleted file mode 100644 index 014f9a7..0000000 --- a/nodebox/ext/psyco/src/c/ivm/ipyencoding.h +++ /dev/null @@ -1,117 +0,0 @@ - /***************************************************************/ -/*** Processor- and language-dependent code producers ***/ - /***************************************************************/ - -#ifndef _IPYENCODING_H -#define _IPYENCODING_H - -#include "iencoding.h" -#include "ivm-insns.h" - -/* See comments in i386/ipyencoding.h about these functions */ - -PSY_INLINE void* dictitem_check_change(PsycoObject* po, - PyDictObject* dict, PyDictEntry* ep) -{ - int index = ep - dict->ma_table; - PyObject* key = ep->me_key; - PyObject* result = ep->me_value; - word_t* arg1; - word_t* arg2; - word_t* arg3; - word_t* arg4; - - Py_INCREF(key); /* XXX these become immortal */ - Py_INCREF(result); /* XXX */ - BEGIN_CODE - NEED_CC(); - /* this special instruction quickly checks that the same - object is still in place in the dictionary */ - INSN_checkdict(&arg1, &arg2, &arg3, &arg4); - *arg1 = (word_t) dict; - *arg2 = (word_t) key; - *arg3 = (word_t) result; - *arg4 = index; - END_CODE - return arg4; -} - -#define DICT_ITEM_CHECK_CC CC_FLAG - -PSY_INLINE void dictitem_update_nochange(void* originalmacrocode, - PyDictObject* dict, PyDictEntry* new_ep) -{ - int index = new_ep - dict->ma_table; - word_t* arg5 = (word_t*) originalmacrocode; - *arg5 = index; -} - -PSY_INLINE void psyco_incref_nv(PsycoObject* po, vinfo_t* v) -{ - BEGIN_CODE - INSN_nv_push(v->source); - INSN_incref(); - END_CODE -} - -PSY_INLINE void psyco_incref_rt(PsycoObject* po, vinfo_t* v) -{ - BEGIN_CODE - INSN_rt_push(v->source); - INSN_incref(); - END_CODE -} - -PSY_INLINE void psyco_decref_rt(PsycoObject* po, vinfo_t* v) -{ - BEGIN_CODE - INSN_rt_push(v->source); - INSN_decref(); - END_CODE -} - -PSY_INLINE void psyco_decref_c(PsycoObject* po, PyObject* o) -{ - word_t* arg; - BEGIN_CODE - INSN_decrefnz(&arg); - *arg = (word_t) o; - END_CODE -} - -EXTERNFN void decref_create_new_ref(PsycoObject* po, vinfo_t* w); -EXTERNFN bool decref_create_new_lastref(PsycoObject* po, vinfo_t* w); - - -/* called by psyco_emit_header() */ -#define INITIALIZE_FRAME_LOCALS(nframelocal) do { \ - STACK_CORRECTION(sizeof(long)*((nframelocal)-1)); \ - INSN_immed(0); /* f_exc_type, initially NULL */ \ -} while (0) - -/* called by psyco_finish_return() */ -#define WRITE_FRAME_EPILOGUE(retval, nframelocal) do { \ - /* load the return value into the dedicated 'retval' register */ \ - /* which actually shares with 'flag' */ \ - if (retval != SOURCE_DUMMY) { \ - if (is_runtime(retval) && getstack(retval) == po->stack_depth) \ - INSNPOPPED(1); \ - else \ - INSN_nv_push(retval); \ - INSN_retval(); \ - } \ - if (nframelocal > 0) \ - { \ - /* psyco_emit_header() was used; first clear the stack only up to and not \ - including the frame-local data */ \ - int framelocpos = getstack(LOC_CONTINUATION->array->items[0]->source); \ - STACK_CORRECTION(framelocpos - po->stack_depth); \ - po->stack_depth = framelocpos; \ - \ - /* perform Python-specific cleanup */ \ - INSN_exitframe(); \ - INSNPOPPED(3); \ - } \ -} while (0) - -#endif /* _IPYENCODING_H */ diff --git a/nodebox/ext/psyco/src/c/ivm/ivm-insns.c b/nodebox/ext/psyco/src/c/ivm/ivm-insns.c deleted file mode 100644 index f194888..0000000 --- a/nodebox/ext/psyco/src/c/ivm/ivm-insns.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "ivm-insns.h" - - -#define setlatestopcode(opcode) (*code = (opcode)) -#define INSN_EMIT_opcode(opcode) (*code++ = (opcode)) -#define INSN_EMIT_modified_opcode(opcode, totalargs) \ - (code[-((int)(totalargs))-1] = (opcode)) - -#define bytecode_size(T) sizeof(T) -#define INSN_EMIT_void(arg) do { /*nothing*/ } while (0) -#define INSN_EMIT_byte(arg) (*code++ = (code_t)(arg)) -#define INSN_EMIT_char(arg) (*code++ = (code_t)(arg)) -#define INSN_EMIT_int(arg) (*(int*)code = (int)(arg), code += sizeof(int)) -#define INSN_EMIT_word_t(arg) (*(word_t*)code=(word_t)(arg),code+=sizeof(word_t)) -#define INSN_EMIT_placeholder_byte(ppbyte) (*(ppbyte)=code++) -#define INSN_EMIT_placeholder_long(ppword) (*(ppword)=(word_t*)code, \ - code+=sizeof(word_t)) - - -#include "prolog/insns-igen.i" diff --git a/nodebox/ext/psyco/src/c/ivm/ivm-insns.h b/nodebox/ext/psyco/src/c/ivm/ivm-insns.h deleted file mode 100644 index 5d3001e..0000000 --- a/nodebox/ext/psyco/src/c/ivm/ivm-insns.h +++ /dev/null @@ -1,111 +0,0 @@ - /***************************************************************/ -/*** Link to the Prolog-generated instruction producers ***/ - /***************************************************************/ - -#ifndef _IVMINSNS_H -#define _IVMINSNS_H - -#include "../vcompiler.h" - -#ifndef META_ASSERT_DEPTH -# define META_ASSERT_DEPTH 0 -#endif - -#ifndef VM_STRESS_STACK -# define VM_STRESS_STACK 0 -#endif - -/* Some tunable run-time virtual machine parameters. - Keep in mind that each thread has its own VM stack. */ -#if !VM_STRESS_STACK -# define VM_INITIAL_MINIMAL_STACK_SIZE 4096 -# define VM_EXTRA_STACK_SIZE 8192 -# define VM_STACK_SIZE_MARGIN 2048 /* power of 2 */ -# define VM_STACK_BLOCK 16384 -#else -# define VM_INITIAL_MINIMAL_STACK_SIZE 512 -# define VM_EXTRA_STACK_SIZE 512 -# define VM_STACK_SIZE_MARGIN 1024 /* power of 2 */ -# define VM_STACK_BLOCK 2048 -#endif - - -/* The virtual machine uses opcode compression: some sequences of opcodes - can be compressed into a single opcode which expects all the arguments of - the individual opcodes. A single, slightly more complicated opcode is - typically much faster to interpret than several simpler opcodes. - - Each INSN_xxx() macro detects if the most recently generated opcode can - be combined with the new one. For this purpose, we store an extra byte - at '*code' which is the most recently emitted opcode. In other words, - 'code' points (as normally) just past the most recently written byte of - the vm bytecode, but during code generation this bytecode is immediately - following by an extra byte which is a copy of the most recently emitted - opcode instruction. - (This is necessary: the most recent opcode instruction starts just a few - bytes before '*code', but we don't know how many exactly -- it depends on - the number of arguments.) -*/ - -#define LATEST_OPCODE (extra_assert(*code <= LAST_DEFINED_OPCODE), *code) -#define INIT_CODE_EMISSION(code) (*(code) = 0) -#define POST_CODEBUFFER_SIZE 1 /* byte for the LATEST_OPCODE */ -#define INSN_EMIT_macro_opcode(opcode) (*code++ = (opcode), \ - *code = (opcode)) - -typedef long word_t; - -#include "prolog/insns-igen-h.i" - - -/* stack handling */ -#define INSNPOPPED(N) (po->stack_depth -= (N)*sizeof(long)) -#define INSNPUSHED(N) (po->stack_depth += (N)*sizeof(long)) - -/* meta-instructions */ -#if CODE_DUMP -PSY_INLINE code_t* META_dynamicfreq2(code_t* code) { - word_t* arg; - INSN_dynamicfreq(&arg); - *arg = 0; - return code; -} -# define INSN_label_marker() (code = META_dynamicfreq2(code)) -#else -# define META_dynamicfreq2(code) code -# define INSN_label_marker() (void)0 /* nothing */ -#endif - -#define INSN_nv_push(nvsource) do { \ - if (is_compiletime(nvsource)) \ - INSN_immed(CompileTime_Get(nvsource)->value); \ - else \ - INSN_rt_push(nvsource); \ -} while (0) - -#define INSN_rt_push(rtsource) INSN_s_push(CURRENT_STACK_POSITION(rtsource)) -#define INSN_rt_pop(rtsource) INSN_s_pop(CURRENT_STACK_POSITION(rtsource)) -#define INSN_normalize_cc(cc) do { \ - if ((cc) == CC_NOT_FLAG) { \ - INSN_flag_push(); \ - INSN_cmpz(); \ - if (HAS_CCREG(po)) psyco_inverted_cc(po); \ - } \ -} while (0) - -#if META_ASSERT_DEPTH -# define META_assertdepth(x) BEGIN_CODE INSN_assertdepth(x); END_CODE -#else -# define META_assertdepth(x) /* nothing */ -#endif - - -PSY_INLINE code_t* insn_code_label(void* code1) -{ - code_t* code = (code_t*) code1; - INSN_label_marker(); - INIT_CODE_EMISSION(code); - return code; -} - -#endif /* _IVMINSNS_H */ diff --git a/nodebox/ext/psyco/src/c/ivm/localsetup.py b/nodebox/ext/psyco/src/c/ivm/localsetup.py deleted file mode 100644 index 555f8f7..0000000 --- a/nodebox/ext/psyco/src/c/ivm/localsetup.py +++ /dev/null @@ -1,20 +0,0 @@ -import os - -dir = os.path.join(os.path.dirname(__file__), 'prolog') -for filename in os.listdir(dir): - if filename.lower().endswith('.default'): - basename = os.path.join(dir, filename[:-8]) - filename = os.path.join(dir, filename) - if not os.path.exists(basename): - copy = 2 - else: - try: - copy = os.stat(filename).st_mtime > os.stat(basename).st_mtime - except OSError: - copy = 0 - if copy: - print 'Copying', filename, '->', basename - if copy != 2: - print '(OVERRIDING the older file)' - import shutil - shutil.copy(filename, basename) diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/Makefile b/nodebox/ext/psyco/src/c/ivm/prolog/Makefile deleted file mode 100644 index e447026..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/Makefile +++ /dev/null @@ -1,57 +0,0 @@ -#################################################################### -## ## -## SWI-Prolog Virtual Machine Generator ## -## ## -#################################################################### - -# -# To run this you will need SWI-Prolog. -# http://www.swi-prolog.org/ -# - -VMWRITER = vm.pl vmwriter.pl utils.pl ccode.pl detcheck.pl mode_combine.pl -GENERATED = insns-switch.i insns-threaded.i insns-igen.i insns-igen-h.i \ - insns-table.py -# insns-threaded-rel.i -TEMP = optimize.tmp - - -all: $(GENERATED) - -clean: - rm -f $(GENERATED) $(TEMP) - -default: $(addsuffix .default,$(GENERATED) mode_combine.pl) - -minimal: empty_mode_combine all - -empty_mode_combine: - echo > mode_combine.pl - - -$(GENERATED): insns.pl $(VMWRITER) - pl -f insns.pl -g main_emit -t halt - -%.default: % - cp $< $@ - -#%-switch.i: %.pl $(VMWRITER) -# pl -f $< -g "main_emit(modes, switch)" -t halt > $@ -# -#%-threaded-rel.i: %.pl $(VMWRITER) -# pl -f $< -g "main_emit(modes, threaded(relative))" -t halt > $@ -# -#%-threaded.i: %.pl $(VMWRITER) -# pl -f $< -g "main_emit(modes, threaded(absolute))" -t halt > $@ -# -#%-immed.i: %.pl $(VMWRITER) -# pl -f $< -g "main_emit(modes, single([immed(int)]))" -t halt > $@ -# -#%-igen.i: %.pl $(VMWRITER) -# pl -f $< -g "main_emit(insns, functions('DEFINEFN '))" -t halt > $@ -# -#%-igen-h.i: %.pl $(VMWRITER) -# pl -f $< -g "main_emit(insns, headers('EXTERNFN '))" -t halt > $@ -# -#%-table.py: %.pl $(VMWRITER) -# pl -f $< -g "main_emit(pytable)" -t halt > $@ diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/ccode.pl b/nodebox/ext/psyco/src/c/ivm/prolog/ccode.pl deleted file mode 100644 index 5cf54b5..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/ccode.pl +++ /dev/null @@ -1,274 +0,0 @@ -:- consult(utils). -:- multifile goal_to_C/2, unary_prolog_to_C/2, binary_prolog_to_C/2. - - -unary_prolog_to_C(not, '!'). -unary_prolog_to_C(inv, '~'). -unary_prolog_to_C('-', '-'). -unary_prolog_to_C(addr, '(word_t) &'). -unary_prolog_to_C(unsigned, '(unsigned)'). -unary_prolog_to_C(mem1, '*(char*)'). -unary_prolog_to_C(mem1u, '*(unsigned char*)'). -unary_prolog_to_C(mem2, '*(short*)'). -unary_prolog_to_C(mem2u, '*(unsigned short*)'). -unary_prolog_to_C(mem4, '*(long*)'). -unary_prolog_to_C(cast1, '(char)'). -unary_prolog_to_C(cast2, '(short)'). - -binary_prolog_to_C('=', '='). -binary_prolog_to_C('=<', '<='). -binary_prolog_to_C('<', '<'). -binary_prolog_to_C('>=', '>='). -binary_prolog_to_C('>', '>'). -binary_prolog_to_C('=:=', '=='). -binary_prolog_to_C('=/=', '!='). -binary_prolog_to_C('>>', '>>'). -binary_prolog_to_C('<<', '<<'). -binary_prolog_to_C(or, '|'). -binary_prolog_to_C(and, '&'). -binary_prolog_to_C(xor, '^'). -binary_prolog_to_C(',', '&&'). - -goal_to_C(fail, '0'). -goal_to_C(true, '1'). -goal_to_C(c_unary(COp, X), Code) :- - goal_to_C(X, XCode), - concat_atom(['(', COp, XCode, ')'], Code). -goal_to_C(c_binary(COp, X, Y), Code) :- - goal_to_C(X, XCode1), - goal_to_C(Y, YCode1), - (COp = '=' -> - remove_paren(XCode1, XCode), - remove_paren(YCode1, YCode) - ; - XCode1 = XCode, - YCode1 = YCode - ), - concat_atom(['(', XCode, ' ', COp, ' ', YCode, ')'], Code). - -goal_to_C(Term, Code) :- - Term =.. [PrologOp, Arg1, Arg2], - binary_prolog_to_C(PrologOp, COp), - goal_to_C(c_binary(COp, Arg1, Arg2), Code). -goal_to_C(Term, Code) :- - Term =.. [PrologOp, Arg1], - unary_prolog_to_C(PrologOp, COp), - goal_to_C(c_unary(COp, Arg1), Code). -goal_to_C(Term, Code) :- - Term =.. [Code]. -goal_to_C(Term, Code) :- - Term =.. [Functor | Args], - maplist(goal_to_C, Args, ArgsCode), - NewTerm =.. [Functor | ArgsCode], - sformat(SCode, '~w', [NewTerm]), - string_to_atom(SCode, Code). - -%goal_to_C([], ''). -%goal_to_C([H|T], Code) :- -% goal_to_C(H, Code1), -% goal_to_C(T, Code2), -% concat_atom([Code1, ';\n', Code2], Code). - -remove_paren(Inp, Outp) :- - sub_atom(Inp, 0, _, _, '('), - sub_atom(Inp, _, _, 0, ')'), - sub_atom(Inp, 1, _, 1, Outp), - !. -remove_paren(C, C). - -% C structures -declare_local(Type, (V, Index), var(Type, V)) :- - int_to_atom(Index, Suffix), - atom_concat(local, Suffix, V). - -block_locals(CodeL1, Type, block(DeclList, CodeL1)) :- - free_variables(CodeL1, FreeVars), - enumerate_list(FreeVars, NumberedFreeVars, 1, _), - maplist(declare_local(Type), NumberedFreeVars, DeclList). - -% C code emission -write_codelist([], _, _). -write_codelist([C1], _, EndSep) :- - write_code(C1), - write(EndSep). -write_codelist([C1, C2 | Tail], MiddleSep, EndSep) :- - write_code(C1), - write(MiddleSep), - write_codelist([C2 | Tail], MiddleSep, EndSep). - -arg_name_only(var(_, V), var(V)). - -write_code1(var(V)) :- - write(V). - -write_code1(var(Type, V)) :- - write(Type), write(' '), write(V). - -write_code1(var(Type, V, Init)) :- - write(Type), write(' '), write(V), write(' = '), - write_code(Init). - -write_code1(function_header(Name, RetType, ArgList)) :- - write(RetType), write(' '), - write(Name), write('('), - (ArgList = [] -> - write(void) - ; - write_codelist(ArgList, ', ', '') - ), - write(')'). - -write_code1(macro_call(Name, ArgList)) :- - write(Name), write('('), - maplist(arg_name_only, ArgList, ArgList1), - write_codelist(ArgList1, ', ', ''), - write(')'). - -write_code1(function_def(Name, RetType, ArgList, Body)) :- - write_code(function_header(Name, RetType, ArgList)), - nl, - write_codestmt(Body). - -write_code1(error(Descr)) :- - write('psyco_fatal_msg("'), - write(Descr), - write('");\nreturn NULL'). - -write_code1(comment(Descr)) :- - write('/* '), - write(Descr), - write(' */'). - -write_code1(emit(Type, Value)) :- - write('INSN_EMIT_'), - write(Type), - write('('), - write(Value), - write(')'). - -write_code1(emit(Type, Value, Extra)) :- - write('INSN_EMIT_'), - write(Type), - write('('), - write(Value), - write(', '), - write(Extra), - write(')'). - -write_code1(Expr) :- - goal_to_C(Expr, Code), - remove_paren(Code, Code1), - write(Code1). - -:- det(write_code/1). -write_code(Code) :- - write_code1(Code), - !. - -write_codestmt1([]). -write_codestmt1([H|T]) :- - write_codestmt(H), - write_codestmt(T). - -write_codestmt1(block(DeclList, CodeList)) :- - write('{\n'), - write_codelist(DeclList, ';\n', ';\n'), - write_codestmt(CodeList), - write('}\n'). - -write_codestmt1(block_locals(Type, CodeList)) :- - block_locals(CodeList, Type, Outp), - write_codestmt(Outp). - -write_codestmt1(ift(Cond, Then)) :- - write('if ('), - write_code(Cond), - write(') '), - write_codeblock(Then). - -write_codestmt1(ifte(Cond, Then, Else)) :- - write('if ('), - write_code(Cond), - write(') '), - write_codeblock(Then), - write('else '), - write_codeblock(Else). - -write_codestmt1(switch(Expr, Body)) :- - write('switch ('), - write_code(Expr), - write(') {\n'), - write_codestmt(Body), - write('} /* switch */\n'). - -write_codestmt1(case(Expr, Body)) :- - write('case '), - write_code(Expr), - write(':\n'), - write_codeblock(Body). - -write_codestmt1(comment(Descr)) :- - write('/* '), - write(Descr), - write(' */\n'). - -write_codestmt1(Expr) :- - write_code(Expr), - write(';\n'). - -:- det(write_codestmt/1). -write_codestmt(Code) :- - write_codestmt1(Code), - !. - -write_codeblock(Block) :- - write_codestmt(block([], Block)). - -code_simplify1([], []). -code_simplify1([Code1], Code2) :- - code_simplify1(Code1, Code2). -code_simplify1([H1|T1], Code2) :- - code_simplify1(H1, H2), - code_simplify1(T1, T2), - (H2 = [] -> Code2 = T2 ; - (T2 = [] -> Code2 = H2 ; - Code2 = [H2|T2])). - -code_simplify1(block([], block(Decl1, Body1)), Code2) :- - code_simplify1(block(Decl1, Body1), Code2). -code_simplify1(block(Decl, Stmt1), block(Decl, Stmt2)) :- - code_simplify1(Stmt1, Stmt2). - -code_simplify1(ift(true, Then), Code2) :- - code_simplify1(Then, Code2). -code_simplify1(ift(fail, _), []). - -code_simplify1(ifte(true, Then, _), Code2) :- - code_simplify1(Then, Code2). -code_simplify1(ifte(fail, _, Else), Code2) :- - code_simplify1(Else, Code2). - -code_simplify1(switch(_, []), []). -code_simplify1(switch(Expr, Body1), switch(Expr, Body2)) :- - code_simplify1(Body1, Body2). - -code_simplify1(case(Expr, Body1), case(Expr, Body2)) :- - code_simplify1(Body1, Body2). - -code_simplify1(Code, Code). - -:- det(code_simplify/1). -code_simplify(Code1, Code2) :- - code_simplify1(Code1, Code2), - !. - - -trivial_c_arg(Term) :- var(Term). -trivial_c_arg(Term) :- Term =.. [_]. - -trivial_c_op(X=Y) :- trivial_c_arg(X), trivial_c_arg(Y). -trivial_c_op(extra_assert(_)). - -codecost(block_locals(_, L), Cost) :- - closelist(L, FlatL), - countsuccesses((member(X, FlatL), \+trivial_c_op(X)), Cost). diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/detcheck.pl b/nodebox/ext/psyco/src/c/ivm/prolog/detcheck.pl deleted file mode 100644 index 4cd4bd2..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/detcheck.pl +++ /dev/null @@ -1,37 +0,0 @@ -:- dynamic detchecked/1, detdebug/0. - -det(Functor/Arity) :- - ignore(retract(detchecked(Functor/Arity))), - assert(detchecked(Functor/Arity)), - length(Args, Arity), - Head =.. [Functor | Args], - atom_concat('__detcheck$', Functor, MangledFunctor), - MangledHead =.. [MangledFunctor | Args], - ignore(retract(Head :- _)), - assert(Head :- ((detdebug -> writeq(Head), nl ; true), MangledHead, ! ; - deterror(Head))). - -deterror(Head) :- - user_error('*** Predicate call should not have failed:', Head). - -user_error(Msg, Object) :- - tell(user_error), - nl, - write(Msg), - nl, - write_term(Object, [quoted(true), max_depth(8)]), - nl, - throw(user_error). - - -term_expansion(Head :- Body, MangledHead :- Body) :- - !, - term_expansion(Head, MangledHead). - -term_expansion(Head, MangledHead) :- - Head =.. [Functor | Args], - length(Args, Arity), - detchecked(Functor/Arity), - !, - atom_concat('__detcheck$', Functor, MangledFunctor), - MangledHead =.. [MangledFunctor | Args]. diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default b/nodebox/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default deleted file mode 100644 index c68dbfb..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insns-igen-h.i.default +++ /dev/null @@ -1,89 +0,0 @@ -#define LAST_DEFINED_OPCODE 73 - -#define INSN_inv() INSN_EMIT_macro_opcode(1) -#define INSN_abs_o() INSN_EMIT_macro_opcode(2) -#define INSN_neg_o() INSN_EMIT_macro_opcode(3) -#define INSN_load1() INSN_EMIT_macro_opcode(4) -#define INSN_load1u() INSN_EMIT_macro_opcode(5) -#define INSN_load2() INSN_EMIT_macro_opcode(6) -#define INSN_load2u() INSN_EMIT_macro_opcode(7) -#define INSN_load4() INSN_EMIT_macro_opcode(8) -#define INSN_or() INSN_EMIT_macro_opcode(9) -#define INSN_and() INSN_EMIT_macro_opcode(10) -#define INSN_xor() INSN_EMIT_macro_opcode(11) -#define INSN_add() INSN_EMIT_macro_opcode(12) -#define INSN_add_o() INSN_EMIT_macro_opcode(13) -#define INSN_sub_o() INSN_EMIT_macro_opcode(14) -#define INSN_mul_o() INSN_EMIT_macro_opcode(15) -#define INSN_lshift() INSN_EMIT_macro_opcode(16) -#define INSN_rshift() INSN_EMIT_macro_opcode(17) -#define INSN_urshift() INSN_EMIT_macro_opcode(18) -#define INSN_cmpeq() INSN_EMIT_macro_opcode(19) -#define INSN_cmplt() INSN_EMIT_macro_opcode(20) -#define INSN_cmpltu() INSN_EMIT_macro_opcode(21) -#define INSN_settos(arg1) (code = psyco_insn_settos(code, arg1)) -EXTERNFN code_t* psyco_insn_settos(code_t* code, int arg1); -#define INSN_pushn(arg1) (code = psyco_insn_pushn(code, arg1)) -EXTERNFN code_t* psyco_insn_pushn(code_t* code, word_t arg1); -#define INSN_immed(arg1) (code = psyco_insn_immed(code, arg1)) -EXTERNFN code_t* psyco_insn_immed(code_t* code, word_t arg1); -#define INSN_s_push(arg1) (code = psyco_insn_s_push(code, arg1)) -EXTERNFN code_t* psyco_insn_s_push(code_t* code, int arg1); -#define INSN_s_pop(arg1) (code = psyco_insn_s_pop(code, arg1)) -EXTERNFN code_t* psyco_insn_s_pop(code_t* code, int arg1); -#define INSN_ref_push(arg1) (code = psyco_insn_ref_push(code, arg1)) -EXTERNFN code_t* psyco_insn_ref_push(code_t* code, word_t arg1); -#define INSN_stackgrow() INSN_EMIT_macro_opcode(39) -#define INSN_assertdepth(arg1) (code = psyco_insn_assertdepth(code, arg1)) -EXTERNFN code_t* psyco_insn_assertdepth(code_t* code, word_t arg1); -#define INSN_dynamicfreq(arg1) (code = psyco_insn_dynamicfreq(code, arg1)) -EXTERNFN code_t* psyco_insn_dynamicfreq(code_t* code, word_t** arg1); -#define INSN_flag_push() INSN_EMIT_macro_opcode(43) -#define INSN_cmpz() INSN_EMIT_macro_opcode(44) -#define INSN_flag_forget() (code = psyco_insn_flag_forget(code)) -EXTERNFN code_t* psyco_insn_flag_forget(code_t* code); -#define INSN_jcondnear(arg1) (code = psyco_insn_jcondnear(code, arg1)) -EXTERNFN code_t* psyco_insn_jcondnear(code_t* code, code_t** arg1); -#define INSN_jcondfar(arg1) (code = psyco_insn_jcondfar(code, arg1)) -EXTERNFN code_t* psyco_insn_jcondfar(code_t* code, word_t** arg1); -#define INSN_jumpfar(arg1) (code = psyco_insn_jumpfar(code, arg1)) -EXTERNFN code_t* psyco_insn_jumpfar(code_t* code, word_t** arg1); -#define INSN_cbuild1(arg1) (code = psyco_insn_cbuild1(code, arg1)) -EXTERNFN code_t* psyco_insn_cbuild1(code_t* code, word_t** arg1); -#define INSN_cbuild2(arg1) (code = psyco_insn_cbuild2(code, arg1)) -EXTERNFN code_t* psyco_insn_cbuild2(code_t* code, word_t** arg1); -#define INSN_store1() INSN_EMIT_macro_opcode(50) -#define INSN_store2() INSN_EMIT_macro_opcode(51) -#define INSN_store4() INSN_EMIT_macro_opcode(52) -#define INSN_incref() INSN_EMIT_macro_opcode(53) -#define INSN_decref() INSN_EMIT_macro_opcode(54) -#define INSN_decrefnz(arg1) (code = psyco_insn_decrefnz(code, arg1)) -EXTERNFN code_t* psyco_insn_decrefnz(code_t* code, word_t** arg1); -#define INSN_exitframe() INSN_EMIT_macro_opcode(56) -#define INSN_ret(arg1) (code = psyco_insn_ret(code, arg1)) -EXTERNFN code_t* psyco_insn_ret(code_t* code, int arg1); -#define INSN_retval() INSN_EMIT_macro_opcode(60) -#define INSN_pushretval() INSN_EMIT_macro_opcode(61) -#define INSN_pyenter(arg1) (code = psyco_insn_pyenter(code, arg1)) -EXTERNFN code_t* psyco_insn_pyenter(code_t* code, word_t** arg1); -#define INSN_pyleave() INSN_EMIT_macro_opcode(63) -#define INSN_vmcall(arg1) (code = psyco_insn_vmcall(code, arg1)) -EXTERNFN code_t* psyco_insn_vmcall(code_t* code, word_t** arg1); -#define INSN_ccall0(arg1) (code = psyco_insn_ccall0(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall0(code_t* code, word_t** arg1); -#define INSN_ccall1(arg1) (code = psyco_insn_ccall1(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall1(code_t* code, word_t** arg1); -#define INSN_ccall2(arg1) (code = psyco_insn_ccall2(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall2(code_t* code, word_t** arg1); -#define INSN_ccall3(arg1) (code = psyco_insn_ccall3(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall3(code_t* code, word_t** arg1); -#define INSN_ccall4(arg1) (code = psyco_insn_ccall4(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall4(code_t* code, word_t** arg1); -#define INSN_ccall5(arg1) (code = psyco_insn_ccall5(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall5(code_t* code, word_t** arg1); -#define INSN_ccall6(arg1) (code = psyco_insn_ccall6(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall6(code_t* code, word_t** arg1); -#define INSN_ccall7(arg1) (code = psyco_insn_ccall7(code, arg1)) -EXTERNFN code_t* psyco_insn_ccall7(code_t* code, word_t** arg1); -#define INSN_checkdict(arg1, arg2, arg3, arg4) (code = psyco_insn_checkdict(code, arg1, arg2, arg3, arg4)) -EXTERNFN code_t* psyco_insn_checkdict(code_t* code, word_t** arg1, word_t** arg2, word_t** arg3, word_t** arg4); diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insns-igen.i.default b/nodebox/ext/psyco/src/c/ivm/prolog/insns-igen.i.default deleted file mode 100644 index d678b7a..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insns-igen.i.default +++ /dev/null @@ -1,377 +0,0 @@ - -DEFINEFN code_t* psyco_insn_settos(code_t* code, int arg1) -{ -if (arg1 == 0) { -INSN_EMIT_opcode(22); -INSN_EMIT_void(arg1); -setlatestopcode(22); -return(code); -} -else { -if ((1 <= arg1) && (arg1 <= 255)) { -INSN_EMIT_opcode(23); -INSN_EMIT_byte(arg1); -setlatestopcode(23); -return(code); -} -else { -if (1 <= arg1) { -INSN_EMIT_opcode(24); -INSN_EMIT_int(arg1); -setlatestopcode(24); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(settos)"); -return NULL; -} -} -} -} - -DEFINEFN code_t* psyco_insn_pushn(code_t* code, word_t arg1) -{ -if ((-128 <= arg1) && (arg1 <= 127)) { -INSN_EMIT_opcode(25); -INSN_EMIT_char(arg1); -setlatestopcode(25); -return(code); -} -else { -if (1) { -INSN_EMIT_opcode(26); -INSN_EMIT_word_t(arg1); -setlatestopcode(26); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(pushn)"); -return NULL; -} -} -} - -DEFINEFN code_t* psyco_insn_immed(code_t* code, word_t arg1) -{ -if (arg1 == 0) { -INSN_EMIT_opcode(27); -INSN_EMIT_void(arg1); -setlatestopcode(27); -return(code); -} -else { -if (arg1 == 1) { -INSN_EMIT_opcode(28); -INSN_EMIT_void(arg1); -setlatestopcode(28); -return(code); -} -else { -if ((-128 <= arg1) && (arg1 <= 127)) { -INSN_EMIT_opcode(29); -INSN_EMIT_char(arg1); -setlatestopcode(29); -return(code); -} -else { -if (1) { -INSN_EMIT_opcode(30); -INSN_EMIT_word_t(arg1); -setlatestopcode(30); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(immed)"); -return NULL; -} -} -} -} -} - -DEFINEFN code_t* psyco_insn_s_push(code_t* code, int arg1) -{ -if (arg1 == 0) { -INSN_EMIT_opcode(31); -INSN_EMIT_void(arg1); -setlatestopcode(31); -return(code); -} -else { -if ((1 <= arg1) && (arg1 <= 255)) { -INSN_EMIT_opcode(32); -INSN_EMIT_byte(arg1); -setlatestopcode(32); -return(code); -} -else { -if (1 <= arg1) { -INSN_EMIT_opcode(33); -INSN_EMIT_int(arg1); -setlatestopcode(33); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(s_push)"); -return NULL; -} -} -} -} - -DEFINEFN code_t* psyco_insn_s_pop(code_t* code, int arg1) -{ -if (arg1 == 0) { -INSN_EMIT_opcode(34); -INSN_EMIT_void(arg1); -setlatestopcode(34); -return(code); -} -else { -if ((1 <= arg1) && (arg1 <= 255)) { -INSN_EMIT_opcode(35); -INSN_EMIT_byte(arg1); -setlatestopcode(35); -return(code); -} -else { -if (1 <= arg1) { -INSN_EMIT_opcode(36); -INSN_EMIT_int(arg1); -setlatestopcode(36); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(s_pop)"); -return NULL; -} -} -} -} - -DEFINEFN code_t* psyco_insn_ref_push(code_t* code, word_t arg1) -{ -if ((-128 <= arg1) && (arg1 <= 127)) { -INSN_EMIT_opcode(37); -INSN_EMIT_char(arg1); -setlatestopcode(37); -return(code); -} -else { -if (1) { -INSN_EMIT_opcode(38); -INSN_EMIT_word_t(arg1); -setlatestopcode(38); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(ref_push)"); -return NULL; -} -} -} - -DEFINEFN code_t* psyco_insn_assertdepth(code_t* code, word_t arg1) -{ -if ((-128 <= arg1) && (arg1 <= 127)) { -INSN_EMIT_opcode(40); -INSN_EMIT_char(arg1); -setlatestopcode(40); -return(code); -} -else { -if (1) { -INSN_EMIT_opcode(41); -INSN_EMIT_word_t(arg1); -setlatestopcode(41); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(assertdepth)"); -return NULL; -} -} -} - -DEFINEFN code_t* psyco_insn_dynamicfreq(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(42); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(42); -return(code); -} - -DEFINEFN code_t* psyco_insn_flag_forget(code_t* code) -{ -/* suffix only */ -return(code); -} - -DEFINEFN code_t* psyco_insn_jcondnear(code_t* code, code_t** arg1) -{ -INSN_EMIT_opcode(45); -INSN_EMIT_placeholder_byte(arg1); -setlatestopcode(45); -return(code); -} - -DEFINEFN code_t* psyco_insn_jcondfar(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(46); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(46); -return(code); -} - -DEFINEFN code_t* psyco_insn_jumpfar(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(47); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(47); -return(code); -} - -DEFINEFN code_t* psyco_insn_cbuild1(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(48); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(48); -return(code); -} - -DEFINEFN code_t* psyco_insn_cbuild2(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(49); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(49); -return(code); -} - -DEFINEFN code_t* psyco_insn_decrefnz(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(55); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(55); -return(code); -} - -DEFINEFN code_t* psyco_insn_ret(code_t* code, int arg1) -{ -if (arg1 == 0) { -INSN_EMIT_opcode(57); -INSN_EMIT_void(arg1); -setlatestopcode(57); -return(code); -} -else { -if ((1 <= arg1) && (arg1 <= 255)) { -INSN_EMIT_opcode(58); -INSN_EMIT_byte(arg1); -setlatestopcode(58); -return(code); -} -else { -if (1 <= arg1) { -INSN_EMIT_opcode(59); -INSN_EMIT_int(arg1); -setlatestopcode(59); -return(code); -} -else { -psyco_fatal_msg("invalid_mode(ret)"); -return NULL; -} -} -} -} - -DEFINEFN code_t* psyco_insn_pyenter(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(62); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(62); -return(code); -} - -DEFINEFN code_t* psyco_insn_vmcall(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(64); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(64); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall0(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(65); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(65); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall1(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(66); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(66); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall2(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(67); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(67); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall3(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(68); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(68); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall4(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(69); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(69); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall5(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(70); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(70); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall6(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(71); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(71); -return(code); -} - -DEFINEFN code_t* psyco_insn_ccall7(code_t* code, word_t** arg1) -{ -INSN_EMIT_opcode(72); -INSN_EMIT_placeholder_long(arg1); -setlatestopcode(72); -return(code); -} - -DEFINEFN code_t* psyco_insn_checkdict(code_t* code, word_t** arg1, word_t** arg2, word_t** arg3, word_t** arg4) -{ -INSN_EMIT_opcode(73); -INSN_EMIT_placeholder_long(arg1); -INSN_EMIT_placeholder_long(arg2); -INSN_EMIT_placeholder_long(arg3); -INSN_EMIT_placeholder_long(arg4); -setlatestopcode(73); -return(code); -} diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insns-switch.i.default b/nodebox/ext/psyco/src/c/ivm/prolog/insns-switch.i.default deleted file mode 100644 index 2098a6d..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insns-switch.i.default +++ /dev/null @@ -1,853 +0,0 @@ -case 1: /* [inv] */ -{ -word_t local1; -word_t local2; -local1 = ~accum; -local2 = local1; -accum = local2; -} -continue; - -case 2: /* [abs_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = abs_o(accum); -local2 = ovf_check(abs_o, macro_args(accum)); -local3 = local1; -accum = local3; -flag = local2; -} -continue; - -case 3: /* [neg_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = -accum; -local2 = ovf_check(neg_o, macro_args(accum)); -local3 = local1; -accum = local3; -flag = local2; -} -continue; - -case 4: /* [load1] */ -{ -word_t local1; -word_t local2; -local1 = *(char*)accum; -local2 = local1; -accum = local2; -} -continue; - -case 5: /* [load1u] */ -{ -word_t local1; -word_t local2; -local1 = *(unsigned char*)accum; -local2 = local1; -accum = local2; -} -continue; - -case 6: /* [load2] */ -{ -word_t local1; -word_t local2; -local1 = *(short*)accum; -local2 = local1; -accum = local2; -} -continue; - -case 7: /* [load2u] */ -{ -word_t local1; -word_t local2; -local1 = *(unsigned short*)accum; -local2 = local1; -accum = local2; -} -continue; - -case 8: /* [load4] */ -{ -word_t local1; -word_t local2; -local1 = *(long*)accum; -local2 = local1; -accum = local2; -} -continue; - -case 9: /* [or] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) | accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -continue; - -case 10: /* [and] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) & accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -continue; - -case 11: /* [xor] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) ^ accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -continue; - -case 12: /* [add] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0)+accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -continue; - -case 13: /* [add_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = stack_nth(0)+accum; -local2 = ovf_check(add_o, macro_args(stack_nth(0), accum)); -local3 = local1; -accum = local3; -stack_shift_pos(1); -flag = local2; -} -continue; - -case 14: /* [sub_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = stack_nth(0)-accum; -local2 = ovf_check(sub_o, macro_args(stack_nth(0), accum)); -local3 = local1; -accum = local3; -stack_shift_pos(1); -flag = local2; -} -continue; - -case 15: /* [mul_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = stack_nth(0)*accum; -local2 = ovf_check(mul_o, macro_args(stack_nth(0), accum)); -local3 = local1; -accum = local3; -stack_shift_pos(1); -flag = local2; -} -continue; - -case 16: /* [lshift] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) << accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -continue; - -case 17: /* [rshift] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) >> accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -continue; - -case 18: /* [urshift] */ -{ -word_t local1; -word_t local2; -local1 = ((unsigned)stack_nth(0)) >> accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -continue; - -case 19: /* [cmpeq] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) == accum; -local2 = stack_nth(1); -accum = local2; -stack_shift_pos(2); -flag = local1; -} -continue; - -case 20: /* [cmplt] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) < accum; -local2 = stack_nth(1); -accum = local2; -stack_shift_pos(2); -flag = local1; -} -continue; - -case 21: /* [cmpltu] */ -{ -word_t local1; -word_t local2; -local1 = ((unsigned)stack_nth(0)) < ((unsigned)accum); -local2 = stack_nth(1); -accum = local2; -stack_shift_pos(2); -flag = local1; -} -continue; - -case 22: /* [settos(0)] */ -{ -} -continue; - -case 23: /* [settos(1:255)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(code_t); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -continue; - -case 24: /* [settos(1:maxint)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -continue; - -case 25: /* [pushn(char)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(char); -local2 = accum; -stack_nth(-1) = local2; -stack_shift(-1); -stack_shift((-local1)); -local3 = stack_nth(0); -accum = local3; -stack_shift_pos(1); -} -continue; - -case 26: /* [pushn(int)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = accum; -stack_nth(-1) = local2; -stack_shift(-1); -stack_shift((-local1)); -local3 = stack_nth(0); -accum = local3; -stack_shift_pos(1); -} -continue; - -case 27: /* [immed(0)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = 0; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -continue; - -case 28: /* [immed(1)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = 1; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -continue; - -case 29: /* [immed(char)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(char); -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -continue; - -case 30: /* [immed(int)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -continue; - -case 31: /* [s_push(0)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = accum; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -continue; - -case 32: /* [s_push(1:255)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(code_t); -local2 = stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -continue; - -case 33: /* [s_push(1:maxint)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -continue; - -case 34: /* [s_pop(0)] */ -{ -word_t local1; -accum = accum; -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -continue; - -case 35: /* [s_pop(1:255)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(code_t); -stack_nth(local1-1) = accum; -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -continue; - -case 36: /* [s_pop(1:maxint)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -stack_nth(local1-1) = accum; -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -continue; - -case 37: /* [ref_push(char)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(char); -local2 = (word_t) &stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -continue; - -case 38: /* [ref_push(int)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = (word_t) &stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -continue; - -case 39: /* [stackgrow] */ -{ -impl_stackgrow(VM_EXTRA_STACK_SIZE); -} -continue; - -case 40: /* [assertdepth(char)] */ -{ -word_t local1; -local1 = bytecode_next(char); -/* debugging assertion */ -} -continue; - -case 41: /* [assertdepth(int)] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -/* debugging assertion */ -} -continue; - -case 42: /* [dynamicfreq(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_dynamicfreq; -} -continue; - -case 43: /* [flag_push] */ -{ -word_t local1; -word_t local2; -word_t local3; -impl_debug_check_flag(flag); -local1 = flag; -impl_debug_forget_flag(flag); -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -continue; - -case 44: /* [cmpz] */ -{ -word_t local1; -word_t local2; -local1 = !accum; -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -flag = local1; -} -continue; - -case 45: /* [jcondnear(indirect(code_t))] */ -{ -word_t local1; -local1 = bytecode_next(code_t); -impl_debug_check_flag(flag); -impl_jcond(flag, nextip+local1); -impl_debug_forget_flag(flag); -} -continue; - -case 46: /* [jcondfar(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_debug_check_flag(flag); -impl_jcond(flag, local1); -impl_debug_forget_flag(flag); -} -continue; - -case 47: /* [jumpfar(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_jump(local1); -} -continue; - -case 48: /* [cbuild1(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_cbuild1(local1); -} -continue; - -case 49: /* [cbuild2(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -impl_cbuild2(local1, accum); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -continue; - -case 50: /* [store1] */ -{ -word_t local1; -*(char*)stack_nth(0) = (char)accum; -local1 = stack_nth(1); -accum = local1; -stack_shift_pos(2); -} -continue; - -case 51: /* [store2] */ -{ -word_t local1; -*(short*)stack_nth(0) = (short)accum; -local1 = stack_nth(1); -accum = local1; -stack_shift_pos(2); -} -continue; - -case 52: /* [store4] */ -{ -word_t local1; -*(long*)stack_nth(0) = accum; -local1 = stack_nth(1); -accum = local1; -stack_shift_pos(2); -} -continue; - -case 53: /* [incref] */ -{ -word_t local1; -impl_incref(accum); -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -continue; - -case 54: /* [decref] */ -{ -word_t local1; -impl_decref(accum); -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -continue; - -case 55: /* [decrefnz(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_decrefnz(local1); -} -continue; - -case 56: /* [exitframe] */ -{ -word_t local1; -impl_exitframe(stack_nth(1), stack_nth(0), accum); -local1 = stack_nth(2); -accum = local1; -stack_shift_pos(3); -} -continue; - -case 57: /* [ret(0)] */ -{ -impl_ret(accum); -} -continue; - -case 58: /* [ret(1:255)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(code_t); -impl_ret(accum); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -continue; - -case 59: /* [ret(1:maxint)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -impl_ret(accum); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -continue; - -case 60: /* [retval] */ -{ -word_t local1; -retval = accum; -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -continue; - -case 61: /* [pushretval] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = retval; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -continue; - -case 62: /* [pyenter(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_pyenter(local1); -} -continue; - -case 63: /* [pyleave] */ -{ -impl_pyleave; -} -continue; - -case 64: /* [vmcall(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = impl_vmcall(local1); -impl_stackgrow(VM_INITIAL_MINIMAL_STACK_SIZE); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -continue; - -case 65: /* [ccall0(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = impl_ccall(0, local1, macro_noarg); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -continue; - -case 66: /* [ccall1(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(1, local1, macro_args(accum)); -local3 = local2; -accum = local3; -} -continue; - -case 67: /* [ccall2(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(2, local1, macro_args(accum, stack_nth(0))); -local3 = local2; -accum = local3; -stack_shift_pos(1); -} -continue; - -case 68: /* [ccall3(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(3, local1, macro_args(accum, stack_nth(0), stack_nth(1))); -local3 = local2; -accum = local3; -stack_shift_pos(2); -} -continue; - -case 69: /* [ccall4(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(4, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2))); -local3 = local2; -accum = local3; -stack_shift_pos(3); -} -continue; - -case 70: /* [ccall5(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(5, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3))); -local3 = local2; -accum = local3; -stack_shift_pos(4); -} -continue; - -case 71: /* [ccall6(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(6, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4))); -local3 = local2; -accum = local3; -stack_shift_pos(5); -} -continue; - -case 72: /* [ccall7(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(7, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4), stack_nth(5))); -local3 = local2; -accum = local3; -stack_shift_pos(6); -} -continue; - -case 73: /* [checkdict(indirect(word_t), indirect(word_t), indirect(word_t), indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -word_t local5; -local1 = bytecode_next(word_t); -local2 = bytecode_next(word_t); -local3 = bytecode_next(word_t); -local4 = bytecode_next(word_t); -local5 = impl_checkdict(local1, local2, local3, local4); -flag = local5; -} -continue; - diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insns-table.py.default b/nodebox/ext/psyco/src/c/ivm/prolog/insns-table.py.default deleted file mode 100644 index c45d133..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insns-table.py.default +++ /dev/null @@ -1,201 +0,0 @@ -insntable = { - 1: [("inv",), ], - 2: [("abs_o",), ], - 3: [("neg_o",), ], - 4: [("load1",), ], - 5: [("load1u",), ], - 6: [("load2",), ], - 7: [("load2u",), ], - 8: [("load4",), ], - 9: [("or",), ], - 10: [("and",), ], - 11: [("xor",), ], - 12: [("add",), ], - 13: [("add_o",), ], - 14: [("sub_o",), ], - 15: [("mul_o",), ], - 16: [("lshift",), ], - 17: [("rshift",), ], - 18: [("urshift",), ], - 19: [("cmpeq",), ], - 20: [("cmplt",), ], - 21: [("cmpltu",), ], - 22: [("settos",stack(0),), ], - 23: [("settos",stack(byte),), ], - 24: [("settos",stack(long),), ], - 25: [("pushn",char,), ], - 26: [("pushn",int,), ], - 27: [("immed",0,), ], - 28: [("immed",1,), ], - 29: [("immed",char,), ], - 30: [("immed",int,), ], - 31: [("s_push",stack(0),), ], - 32: [("s_push",stack(byte),), ], - 33: [("s_push",stack(long),), ], - 34: [("s_pop",stack(0),), ], - 35: [("s_pop",stack(byte),), ], - 36: [("s_pop",stack(long),), ], - 37: [("ref_push",char,), ], - 38: [("ref_push",int,), ], - 39: [("stackgrow",), ], - 40: [("assertdepth",char,), ], - 41: [("assertdepth",int,), ], - 42: [("dynamicfreq",indirect(word_t),), ], - 43: [("flag_push",), ], - 44: [("cmpz",), ], - 45: [("jcondnear",indirect(code_t),), ], - 46: [("jcondfar",indirect(word_t),), ], - 47: [("jumpfar",indirect(word_t),), ], - 48: [("cbuild1",indirect(word_t),), ], - 49: [("cbuild2",indirect(word_t),), ], - 50: [("store1",), ], - 51: [("store2",), ], - 52: [("store4",), ], - 53: [("incref",), ], - 54: [("decref",), ], - 55: [("decrefnz",indirect(word_t),), ], - 56: [("exitframe",), ], - 57: [("ret",stack(0),), ], - 58: [("ret",stack(byte),), ], - 59: [("ret",stack(long),), ], - 60: [("retval",), ], - 61: [("pushretval",), ], - 62: [("pyenter",indirect(word_t),), ], - 63: [("pyleave",), ], - 64: [("vmcall",indirect(word_t),), ], - 65: [("ccall0",indirect(word_t),), ], - 66: [("ccall1",indirect(word_t),), ], - 67: [("ccall2",indirect(word_t),), ], - 68: [("ccall3",indirect(word_t),), ], - 69: [("ccall4",indirect(word_t),), ], - 70: [("ccall5",indirect(word_t),), ], - 71: [("ccall6",indirect(word_t),), ], - 72: [("ccall7",indirect(word_t),), ], - 73: [("checkdict",indirect(word_t),indirect(word_t),indirect(word_t),indirect(word_t),), ], -} -stackpushes = { - 1: 0, - 2: 0, - 3: 0, - 4: 0, - 5: 0, - 6: 0, - 7: 0, - 8: 0, - 9: -1, - 10: -1, - 11: -1, - 12: -1, - 13: -1, - 14: -1, - 15: -1, - 16: -1, - 17: -1, - 18: -1, - 19: -2, - 20: -2, - 21: -2, - 27: 1, - 28: 1, - 29: 1, - 30: 1, - 31: 1, - 32: 1, - 33: 1, - 34: -1, - 35: -1, - 36: -1, - 37: 1, - 38: 1, - 39: 0, - 40: 0, - 41: 0, - 42: 0, - 43: 1, - 44: -1, - 45: 0, - 46: 0, - 47: 0, - 48: 0, - 49: -1, - 50: -2, - 51: -2, - 52: -2, - 53: -1, - 54: -1, - 55: 0, - 56: -3, - 60: -1, - 61: 1, - 62: 0, - 63: 0, - 65: 1, - 66: 0, - 67: -1, - 68: -2, - 69: -3, - 70: -4, - 71: -5, - 72: -6, - 73: 0, -} -chainable = { - 1: 1, - 2: 1, - 3: 1, - 4: 1, - 5: 1, - 6: 1, - 7: 1, - 8: 1, - 9: 1, - 10: 1, - 11: 1, - 12: 1, - 13: 1, - 14: 1, - 15: 1, - 16: 1, - 17: 1, - 18: 1, - 19: 1, - 20: 1, - 21: 1, - 27: 1, - 28: 1, - 29: 1, - 30: 1, - 31: 1, - 32: 1, - 33: 1, - 34: 1, - 35: 1, - 36: 1, - 37: 1, - 38: 1, - 39: 1, - 40: 1, - 41: 1, - 43: 1, - 44: 1, - 50: 1, - 51: 1, - 52: 1, - 53: 1, - 54: 1, - 55: 1, - 56: 1, - 60: 1, - 61: 1, - 62: 1, - 63: 1, - 65: 1, - 66: 1, - 67: 1, - 68: 1, - 69: 1, - 70: 1, - 71: 1, - 72: 1, - 73: 1, -} diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default b/nodebox/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default deleted file mode 100644 index 78df2f1..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insns-threaded.i.default +++ /dev/null @@ -1,1118 +0,0 @@ -static const void* opcodetable[] = { - &&lblorigin, /* 0 */ - &&lblopcode1, /* [inv] */ - &&lblopcode2, /* [abs_o] */ - &&lblopcode3, /* [neg_o] */ - &&lblopcode4, /* [load1] */ - &&lblopcode5, /* [load1u] */ - &&lblopcode6, /* [load2] */ - &&lblopcode7, /* [load2u] */ - &&lblopcode8, /* [load4] */ - &&lblopcode9, /* [or] */ - &&lblopcode10, /* [and] */ - &&lblopcode11, /* [xor] */ - &&lblopcode12, /* [add] */ - &&lblopcode13, /* [add_o] */ - &&lblopcode14, /* [sub_o] */ - &&lblopcode15, /* [mul_o] */ - &&lblopcode16, /* [lshift] */ - &&lblopcode17, /* [rshift] */ - &&lblopcode18, /* [urshift] */ - &&lblopcode19, /* [cmpeq] */ - &&lblopcode20, /* [cmplt] */ - &&lblopcode21, /* [cmpltu] */ - &&lblopcode22, /* [settos(0)] */ - &&lblopcode23, /* [settos(1:255)] */ - &&lblopcode24, /* [settos(1:maxint)] */ - &&lblopcode25, /* [pushn(char)] */ - &&lblopcode26, /* [pushn(int)] */ - &&lblopcode27, /* [immed(0)] */ - &&lblopcode28, /* [immed(1)] */ - &&lblopcode29, /* [immed(char)] */ - &&lblopcode30, /* [immed(int)] */ - &&lblopcode31, /* [s_push(0)] */ - &&lblopcode32, /* [s_push(1:255)] */ - &&lblopcode33, /* [s_push(1:maxint)] */ - &&lblopcode34, /* [s_pop(0)] */ - &&lblopcode35, /* [s_pop(1:255)] */ - &&lblopcode36, /* [s_pop(1:maxint)] */ - &&lblopcode37, /* [ref_push(char)] */ - &&lblopcode38, /* [ref_push(int)] */ - &&lblopcode39, /* [stackgrow] */ - &&lblopcode40, /* [assertdepth(char)] */ - &&lblopcode41, /* [assertdepth(int)] */ - &&lblopcode42, /* [dynamicfreq(indirect(word_t))] */ - &&lblopcode43, /* [flag_push] */ - &&lblopcode44, /* [cmpz] */ - &&lblopcode45, /* [jcondnear(indirect(code_t))] */ - &&lblopcode46, /* [jcondfar(indirect(word_t))] */ - &&lblopcode47, /* [jumpfar(indirect(word_t))] */ - &&lblopcode48, /* [cbuild1(indirect(word_t))] */ - &&lblopcode49, /* [cbuild2(indirect(word_t))] */ - &&lblopcode50, /* [store1] */ - &&lblopcode51, /* [store2] */ - &&lblopcode52, /* [store4] */ - &&lblopcode53, /* [incref] */ - &&lblopcode54, /* [decref] */ - &&lblopcode55, /* [decrefnz(indirect(word_t))] */ - &&lblopcode56, /* [exitframe] */ - &&lblopcode57, /* [ret(0)] */ - &&lblopcode58, /* [ret(1:255)] */ - &&lblopcode59, /* [ret(1:maxint)] */ - &&lblopcode60, /* [retval] */ - &&lblopcode61, /* [pushretval] */ - &&lblopcode62, /* [pyenter(indirect(word_t))] */ - &&lblopcode63, /* [pyleave] */ - &&lblopcode64, /* [vmcall(indirect(word_t))] */ - &&lblopcode65, /* [ccall0(indirect(word_t))] */ - &&lblopcode66, /* [ccall1(indirect(word_t))] */ - &&lblopcode67, /* [ccall2(indirect(word_t))] */ - &&lblopcode68, /* [ccall3(indirect(word_t))] */ - &&lblopcode69, /* [ccall4(indirect(word_t))] */ - &&lblopcode70, /* [ccall5(indirect(word_t))] */ - &&lblopcode71, /* [ccall6(indirect(word_t))] */ - &&lblopcode72, /* [ccall7(indirect(word_t))] */ - &&lblopcode73, /* [checkdict(indirect(word_t), indirect(word_t), indirect(word_t), indirect(word_t))] */ -#if PSYCO_DEBUG - &&lblorigin, /* 74 */ - &&lblorigin, /* 75 */ - &&lblorigin, /* 76 */ - &&lblorigin, /* 77 */ - &&lblorigin, /* 78 */ - &&lblorigin, /* 79 */ - &&lblorigin, /* 80 */ - &&lblorigin, /* 81 */ - &&lblorigin, /* 82 */ - &&lblorigin, /* 83 */ - &&lblorigin, /* 84 */ - &&lblorigin, /* 85 */ - &&lblorigin, /* 86 */ - &&lblorigin, /* 87 */ - &&lblorigin, /* 88 */ - &&lblorigin, /* 89 */ - &&lblorigin, /* 90 */ - &&lblorigin, /* 91 */ - &&lblorigin, /* 92 */ - &&lblorigin, /* 93 */ - &&lblorigin, /* 94 */ - &&lblorigin, /* 95 */ - &&lblorigin, /* 96 */ - &&lblorigin, /* 97 */ - &&lblorigin, /* 98 */ - &&lblorigin, /* 99 */ - &&lblorigin, /* 100 */ - &&lblorigin, /* 101 */ - &&lblorigin, /* 102 */ - &&lblorigin, /* 103 */ - &&lblorigin, /* 104 */ - &&lblorigin, /* 105 */ - &&lblorigin, /* 106 */ - &&lblorigin, /* 107 */ - &&lblorigin, /* 108 */ - &&lblorigin, /* 109 */ - &&lblorigin, /* 110 */ - &&lblorigin, /* 111 */ - &&lblorigin, /* 112 */ - &&lblorigin, /* 113 */ - &&lblorigin, /* 114 */ - &&lblorigin, /* 115 */ - &&lblorigin, /* 116 */ - &&lblorigin, /* 117 */ - &&lblorigin, /* 118 */ - &&lblorigin, /* 119 */ - &&lblorigin, /* 120 */ - &&lblorigin, /* 121 */ - &&lblorigin, /* 122 */ - &&lblorigin, /* 123 */ - &&lblorigin, /* 124 */ - &&lblorigin, /* 125 */ - &&lblorigin, /* 126 */ - &&lblorigin, /* 127 */ - &&lblorigin, /* 128 */ - &&lblorigin, /* 129 */ - &&lblorigin, /* 130 */ - &&lblorigin, /* 131 */ - &&lblorigin, /* 132 */ - &&lblorigin, /* 133 */ - &&lblorigin, /* 134 */ - &&lblorigin, /* 135 */ - &&lblorigin, /* 136 */ - &&lblorigin, /* 137 */ - &&lblorigin, /* 138 */ - &&lblorigin, /* 139 */ - &&lblorigin, /* 140 */ - &&lblorigin, /* 141 */ - &&lblorigin, /* 142 */ - &&lblorigin, /* 143 */ - &&lblorigin, /* 144 */ - &&lblorigin, /* 145 */ - &&lblorigin, /* 146 */ - &&lblorigin, /* 147 */ - &&lblorigin, /* 148 */ - &&lblorigin, /* 149 */ - &&lblorigin, /* 150 */ - &&lblorigin, /* 151 */ - &&lblorigin, /* 152 */ - &&lblorigin, /* 153 */ - &&lblorigin, /* 154 */ - &&lblorigin, /* 155 */ - &&lblorigin, /* 156 */ - &&lblorigin, /* 157 */ - &&lblorigin, /* 158 */ - &&lblorigin, /* 159 */ - &&lblorigin, /* 160 */ - &&lblorigin, /* 161 */ - &&lblorigin, /* 162 */ - &&lblorigin, /* 163 */ - &&lblorigin, /* 164 */ - &&lblorigin, /* 165 */ - &&lblorigin, /* 166 */ - &&lblorigin, /* 167 */ - &&lblorigin, /* 168 */ - &&lblorigin, /* 169 */ - &&lblorigin, /* 170 */ - &&lblorigin, /* 171 */ - &&lblorigin, /* 172 */ - &&lblorigin, /* 173 */ - &&lblorigin, /* 174 */ - &&lblorigin, /* 175 */ - &&lblorigin, /* 176 */ - &&lblorigin, /* 177 */ - &&lblorigin, /* 178 */ - &&lblorigin, /* 179 */ - &&lblorigin, /* 180 */ - &&lblorigin, /* 181 */ - &&lblorigin, /* 182 */ - &&lblorigin, /* 183 */ - &&lblorigin, /* 184 */ - &&lblorigin, /* 185 */ - &&lblorigin, /* 186 */ - &&lblorigin, /* 187 */ - &&lblorigin, /* 188 */ - &&lblorigin, /* 189 */ - &&lblorigin, /* 190 */ - &&lblorigin, /* 191 */ - &&lblorigin, /* 192 */ - &&lblorigin, /* 193 */ - &&lblorigin, /* 194 */ - &&lblorigin, /* 195 */ - &&lblorigin, /* 196 */ - &&lblorigin, /* 197 */ - &&lblorigin, /* 198 */ - &&lblorigin, /* 199 */ - &&lblorigin, /* 200 */ - &&lblorigin, /* 201 */ - &&lblorigin, /* 202 */ - &&lblorigin, /* 203 */ - &&lblorigin, /* 204 */ - &&lblorigin, /* 205 */ - &&lblorigin, /* 206 */ - &&lblorigin, /* 207 */ - &&lblorigin, /* 208 */ - &&lblorigin, /* 209 */ - &&lblorigin, /* 210 */ - &&lblorigin, /* 211 */ - &&lblorigin, /* 212 */ - &&lblorigin, /* 213 */ - &&lblorigin, /* 214 */ - &&lblorigin, /* 215 */ - &&lblorigin, /* 216 */ - &&lblorigin, /* 217 */ - &&lblorigin, /* 218 */ - &&lblorigin, /* 219 */ - &&lblorigin, /* 220 */ - &&lblorigin, /* 221 */ - &&lblorigin, /* 222 */ - &&lblorigin, /* 223 */ - &&lblorigin, /* 224 */ - &&lblorigin, /* 225 */ - &&lblorigin, /* 226 */ - &&lblorigin, /* 227 */ - &&lblorigin, /* 228 */ - &&lblorigin, /* 229 */ - &&lblorigin, /* 230 */ - &&lblorigin, /* 231 */ - &&lblorigin, /* 232 */ - &&lblorigin, /* 233 */ - &&lblorigin, /* 234 */ - &&lblorigin, /* 235 */ - &&lblorigin, /* 236 */ - &&lblorigin, /* 237 */ - &&lblorigin, /* 238 */ - &&lblorigin, /* 239 */ - &&lblorigin, /* 240 */ - &&lblorigin, /* 241 */ - &&lblorigin, /* 242 */ - &&lblorigin, /* 243 */ - &&lblorigin, /* 244 */ - &&lblorigin, /* 245 */ - &&lblorigin, /* 246 */ - &&lblorigin, /* 247 */ - &&lblorigin, /* 248 */ - &&lblorigin, /* 249 */ - &&lblorigin, /* 250 */ - &&lblorigin, /* 251 */ - &&lblorigin, /* 252 */ - &&lblorigin, /* 253 */ - &&lblorigin, /* 254 */ - &&lblorigin, /* 255 */ -#endif -}; -goto *opcodetable[bytecode_nextopcode()]; - -lblorigin: -psyco_fatal_msg("invalid vm opcode"); - -lblopcode1: /* [inv] */ -{ -word_t local1; -word_t local2; -local1 = ~accum; -local2 = local1; -accum = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode2: /* [abs_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = abs_o(accum); -local2 = ovf_check(abs_o, macro_args(accum)); -local3 = local1; -accum = local3; -flag = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode3: /* [neg_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = -accum; -local2 = ovf_check(neg_o, macro_args(accum)); -local3 = local1; -accum = local3; -flag = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode4: /* [load1] */ -{ -word_t local1; -word_t local2; -local1 = *(char*)accum; -local2 = local1; -accum = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode5: /* [load1u] */ -{ -word_t local1; -word_t local2; -local1 = *(unsigned char*)accum; -local2 = local1; -accum = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode6: /* [load2] */ -{ -word_t local1; -word_t local2; -local1 = *(short*)accum; -local2 = local1; -accum = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode7: /* [load2u] */ -{ -word_t local1; -word_t local2; -local1 = *(unsigned short*)accum; -local2 = local1; -accum = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode8: /* [load4] */ -{ -word_t local1; -word_t local2; -local1 = *(long*)accum; -local2 = local1; -accum = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode9: /* [or] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) | accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode10: /* [and] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) & accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode11: /* [xor] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) ^ accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode12: /* [add] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0)+accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode13: /* [add_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = stack_nth(0)+accum; -local2 = ovf_check(add_o, macro_args(stack_nth(0), accum)); -local3 = local1; -accum = local3; -stack_shift_pos(1); -flag = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode14: /* [sub_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = stack_nth(0)-accum; -local2 = ovf_check(sub_o, macro_args(stack_nth(0), accum)); -local3 = local1; -accum = local3; -stack_shift_pos(1); -flag = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode15: /* [mul_o] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = stack_nth(0)*accum; -local2 = ovf_check(mul_o, macro_args(stack_nth(0), accum)); -local3 = local1; -accum = local3; -stack_shift_pos(1); -flag = local2; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode16: /* [lshift] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) << accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode17: /* [rshift] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) >> accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode18: /* [urshift] */ -{ -word_t local1; -word_t local2; -local1 = ((unsigned)stack_nth(0)) >> accum; -local2 = local1; -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode19: /* [cmpeq] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) == accum; -local2 = stack_nth(1); -accum = local2; -stack_shift_pos(2); -flag = local1; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode20: /* [cmplt] */ -{ -word_t local1; -word_t local2; -local1 = stack_nth(0) < accum; -local2 = stack_nth(1); -accum = local2; -stack_shift_pos(2); -flag = local1; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode21: /* [cmpltu] */ -{ -word_t local1; -word_t local2; -local1 = ((unsigned)stack_nth(0)) < ((unsigned)accum); -local2 = stack_nth(1); -accum = local2; -stack_shift_pos(2); -flag = local1; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode22: /* [settos(0)] */ -{ -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode23: /* [settos(1:255)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(code_t); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode24: /* [settos(1:maxint)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode25: /* [pushn(char)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(char); -local2 = accum; -stack_nth(-1) = local2; -stack_shift(-1); -stack_shift((-local1)); -local3 = stack_nth(0); -accum = local3; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode26: /* [pushn(int)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = accum; -stack_nth(-1) = local2; -stack_shift(-1); -stack_shift((-local1)); -local3 = stack_nth(0); -accum = local3; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode27: /* [immed(0)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = 0; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode28: /* [immed(1)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = 1; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode29: /* [immed(char)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(char); -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode30: /* [immed(int)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode31: /* [s_push(0)] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = accum; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode32: /* [s_push(1:255)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(code_t); -local2 = stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode33: /* [s_push(1:maxint)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode34: /* [s_pop(0)] */ -{ -word_t local1; -accum = accum; -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode35: /* [s_pop(1:255)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(code_t); -stack_nth(local1-1) = accum; -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode36: /* [s_pop(1:maxint)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -stack_nth(local1-1) = accum; -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode37: /* [ref_push(char)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(char); -local2 = (word_t) &stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode38: /* [ref_push(int)] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = (word_t) &stack_nth(local1-1); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode39: /* [stackgrow] */ -{ -impl_stackgrow(VM_EXTRA_STACK_SIZE); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode40: /* [assertdepth(char)] */ -{ -word_t local1; -local1 = bytecode_next(char); -/* debugging assertion */ -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode41: /* [assertdepth(int)] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -/* debugging assertion */ -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode42: /* [dynamicfreq(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_dynamicfreq; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode43: /* [flag_push] */ -{ -word_t local1; -word_t local2; -word_t local3; -impl_debug_check_flag(flag); -local1 = flag; -impl_debug_forget_flag(flag); -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode44: /* [cmpz] */ -{ -word_t local1; -word_t local2; -local1 = !accum; -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -flag = local1; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode45: /* [jcondnear(indirect(code_t))] */ -{ -word_t local1; -local1 = bytecode_next(code_t); -impl_debug_check_flag(flag); -impl_jcond(flag, nextip+local1); -impl_debug_forget_flag(flag); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode46: /* [jcondfar(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_debug_check_flag(flag); -impl_jcond(flag, local1); -impl_debug_forget_flag(flag); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode47: /* [jumpfar(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_jump(local1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode48: /* [cbuild1(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_cbuild1(local1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode49: /* [cbuild2(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -impl_cbuild2(local1, accum); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode50: /* [store1] */ -{ -word_t local1; -*(char*)stack_nth(0) = (char)accum; -local1 = stack_nth(1); -accum = local1; -stack_shift_pos(2); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode51: /* [store2] */ -{ -word_t local1; -*(short*)stack_nth(0) = (short)accum; -local1 = stack_nth(1); -accum = local1; -stack_shift_pos(2); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode52: /* [store4] */ -{ -word_t local1; -*(long*)stack_nth(0) = accum; -local1 = stack_nth(1); -accum = local1; -stack_shift_pos(2); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode53: /* [incref] */ -{ -word_t local1; -impl_incref(accum); -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode54: /* [decref] */ -{ -word_t local1; -impl_decref(accum); -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode55: /* [decrefnz(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_decrefnz(local1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode56: /* [exitframe] */ -{ -word_t local1; -impl_exitframe(stack_nth(1), stack_nth(0), accum); -local1 = stack_nth(2); -accum = local1; -stack_shift_pos(3); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode57: /* [ret(0)] */ -{ -impl_ret(accum); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode58: /* [ret(1:255)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(code_t); -impl_ret(accum); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode59: /* [ret(1:maxint)] */ -{ -word_t local1; -word_t local2; -local1 = bytecode_next(word_t); -impl_ret(accum); -stack_shift(local1-1); -local2 = stack_nth(0); -accum = local2; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode60: /* [retval] */ -{ -word_t local1; -retval = accum; -local1 = stack_nth(0); -accum = local1; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode61: /* [pushretval] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = retval; -local2 = local1; -local3 = accum; -stack_nth(-1) = local3; -accum = local2; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode62: /* [pyenter(indirect(word_t))] */ -{ -word_t local1; -local1 = bytecode_next(word_t); -impl_pyenter(local1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode63: /* [pyleave] */ -{ -impl_pyleave; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode64: /* [vmcall(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = impl_vmcall(local1); -impl_stackgrow(VM_INITIAL_MINIMAL_STACK_SIZE); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode65: /* [ccall0(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -local1 = bytecode_next(word_t); -local2 = impl_ccall(0, local1, macro_noarg); -local3 = local2; -local4 = accum; -stack_nth(-1) = local4; -accum = local3; -stack_shift(-1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode66: /* [ccall1(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(1, local1, macro_args(accum)); -local3 = local2; -accum = local3; -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode67: /* [ccall2(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(2, local1, macro_args(accum, stack_nth(0))); -local3 = local2; -accum = local3; -stack_shift_pos(1); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode68: /* [ccall3(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(3, local1, macro_args(accum, stack_nth(0), stack_nth(1))); -local3 = local2; -accum = local3; -stack_shift_pos(2); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode69: /* [ccall4(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(4, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2))); -local3 = local2; -accum = local3; -stack_shift_pos(3); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode70: /* [ccall5(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(5, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3))); -local3 = local2; -accum = local3; -stack_shift_pos(4); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode71: /* [ccall6(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(6, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4))); -local3 = local2; -accum = local3; -stack_shift_pos(5); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode72: /* [ccall7(indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -local1 = bytecode_next(word_t); -local2 = impl_ccall(7, local1, macro_args(accum, stack_nth(0), stack_nth(1), stack_nth(2), stack_nth(3), stack_nth(4), stack_nth(5))); -local3 = local2; -accum = local3; -stack_shift_pos(6); -} -goto *opcodetable[bytecode_nextopcode()]; - -lblopcode73: /* [checkdict(indirect(word_t), indirect(word_t), indirect(word_t), indirect(word_t))] */ -{ -word_t local1; -word_t local2; -word_t local3; -word_t local4; -word_t local5; -local1 = bytecode_next(word_t); -local2 = bytecode_next(word_t); -local3 = bytecode_next(word_t); -local4 = bytecode_next(word_t); -local5 = impl_checkdict(local1, local2, local3, local4); -flag = local5; -} -goto *opcodetable[bytecode_nextopcode()]; - diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insns.pl b/nodebox/ext/psyco/src/c/ivm/prolog/insns.pl deleted file mode 100644 index 9523f18..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insns.pl +++ /dev/null @@ -1,111 +0,0 @@ -:- consult(vmwriter). -:- consult(mode_combine). - - -unary_insn(inv). -unary_insn(neg_o, '-'). -overflow_flag(neg_o). -unary_insn(abs_o). -overflow_flag(abs_o). - -binary_insn(add, '+'). -binary_insn(add_o, '+'). -overflow_flag(add_o). -binary_insn(sub_o, '-'). -overflow_flag(sub_o). -binary_insn(mul_o, '*'). -overflow_flag(mul_o). -binary_insn(or). -binary_insn(and). -binary_insn(xor). -%binary_insn(div). -binary_insn(lshift, '<<'). -binary_insn(rshift, '>>'). -insn(urshift, [], [out(0)=(unsigned(in(1))>>in(0))], [stack(2->1)]). -insn(cmpeq, [], [setflag=(in(1)=:=in(0))], [flag(set), stack(2->0)]). -insn(cmplt, [], [setflag=(in(1) < in(0))], [flag(set), stack(2->0)]). -insn(cmpltu, [], [setflag=(unsigned(in(1)) < unsigned(in(0)))], - [flag(set), stack(2->0)]). - -%insn(pop, [], [], [stack(pop(0))]). % note: this is the same as s_pop(0) -%insn(pop2nd, [], [], [stack(pop(1))]). -insn(settos, [s], [], [stack(settos), nonchainable]). -insn(pushn, [i], [], [stack(pushn), nonchainable]). - -insn(immed, [i([0,1])], [out(0) = arg(0)], [stack(push)]). -insn(s_push, [s], [out(0) = arg(0)], [stack(push)]). -insn(s_pop, [s], [arg(0) = in(0)], [stack(pop)]). -insn(ref_push, [i], [out(0) = addr(stack_nth(arg(0)-stkshft))], [stack(push)]). -insn(stackgrow, [], [impl_stackgrow('VM_EXTRA_STACK_SIZE')], []). - -insn(assertdepth, [i], [comment('debugging assertion')], []). -insn(dynamicfreq, [l], [impl_dynamicfreq], [nonchainable]). - -insn(flag_push, [], [out(0)=flag], [stack(push), flag(get)]). -insn(cmpz, [], [setflag=not(in(0))], [stack(pop), flag(set)]). -insn(flag_forget, [],[], [flag(get), suffixonly]). -insn(jcondnear,[b], [impl_jcond(flag, nextip+arg(0))],[nonchainable,flag(get)]). -insn(jcondfar, [l], [impl_jcond(flag, arg(0))], [nonchainable,flag(get)]). -insn(jumpfar, [l], [impl_jump(arg(0))], [nonchainable]). - -insn(cbuild1, [l], [impl_cbuild1(arg(0))], [nonchainable]). -insn(cbuild2, [l], [impl_cbuild2(arg(0), in(0))], - [stack(1->0), nonchainable]). - -unary_insn(load1, mem1). -unary_insn(load1u, mem1u). -unary_insn(load2, mem2). -unary_insn(load2u, mem2u). -unary_insn(load4, mem4). -insn(store1, [], [mem1(in(1)) = cast1(in(0))], [stack(2->0)]). -insn(store2, [], [mem2(in(1)) = cast2(in(0))], [stack(2->0)]). -insn(store4, [], [mem4(in(1)) = in(0)], [stack(2->0)]). - -insn(incref, [], [impl_incref(in(0))], [stack(1->0)]). -insn(decref, [], [impl_decref(in(0))], [stack(1->0)]). -insn(decrefnz, [l], [impl_decrefnz(arg(0))], []). - -insn(exitframe, [], [impl_exitframe(in(2), in(1), in(0))], [stack(3->0)]). -insn(ret, [s], [impl_ret(in(0))], [stack(settos), nonchainable]). -insn(retval, [], [retval=in(0)], [stack(pop)]). -insn(pushretval,[], [out(0)=retval], [stack(push)]). - -insn(pyenter, [l], [impl_pyenter(arg(0))], []). % enter a Python sub-function -insn(pyleave, [], [impl_pyleave], []). % exit a Python sub-function -insn(vmcall, [l], [out(0)=impl_vmcall(arg(0)), % call a Python sub-function - impl_stackgrow('VM_INITIAL_MINIMAL_STACK_SIZE')], - [stack(0->1), nonchainable, nostackanalysis]). -% The normal sequence is pyenter/vmcall/pyleave, but vmcall might be -% omitted if the called function is inlined. - -insn(ccall0, [l], [out(0)=impl_ccall(0, arg(0), macro_noarg)],[stack(0->1)]). -insn(CallInsn, [l], [out(0)=impl_ccall(N, arg(0), ArgDef)], [stack(N->1)]) :- - between(1, 7, N), - sformat(SInsn, 'ccall~d', [N]), - N1 is N-1, - findall(S, (S=in(M), between(0, N1, M)), Args), - ArgDef =.. [macro_args | Args], - string_to_atom(SInsn, CallInsn). - -insn(checkdict, [l,l,l,l], [setflag=impl_checkdict(arg(0), arg(1), arg(2), - arg(3))], [flag(set)]). - - -% custom operand modes -standard_mode(small, _, i([H|_]), H). -standard_mode(Size, _, i([_|T]), Value) :- standard_mode(Size, _, i(T), Value). -standard_mode(Size, _, i([]), Cond) :- standard_mode(Size, _, i, Cond). - - -%mode_combine([s_push(0), immed(char), cmplt, jcondfar(long)]). -%mode_combine([s_push(0), immed(char), add, pop2nd]). -%mode_combine([s_push(truestack(byte)), immed(char), add, pop2nd]). -% -%mode_combine([not, jcondfar(long)]). -% -%mode_combine([immed(long), immed(long), threeway(0)]). -%mode_combine([immed(long), immed(long), threeway(1)]). - -%XXX fix duplicate [immed(long), immed(long)] - -%mode_combine([s_push(1:255), s_push(2:255)]). diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insns.py b/nodebox/ext/psyco/src/c/ivm/prolog/insns.py deleted file mode 100644 index b037185..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insns.py +++ /dev/null @@ -1,88 +0,0 @@ -from insnset import InstructionSet - - - --- IN-PROGRESS --- - - -class Immed: - def __init__(self, *commonvalues): - self.commonvalues = commonvalues - - def modes(self, ivm): - for n in self.commonvalues: - if ivm.nextarg('void', min=n, max=n) is not None: - return str(n) - return ivm.nextarg('word_t') - -class Address: - def modes(self, ivm): - return ivm.nextarg('word_t') - -class Stack: - def modes(self, ivm): - for i in range(len(ivm.stack)): - if ivm.nextarg('void', min=i, max=i) is not None: - return ivm.stack[i] - n = ivm.nextarg('code_t', min=len(stack), max=255) - if n is None: - n = ivm.nextarg('word_t') - return ivm.compute('stack_nth(%s-%d)' % (n, len(stack))) - -class StackRef: - def modes(self, ivm): - ... - - -class IVM(InstructionSet): - - def insn_inv(self): - x = self.pop(); self.push('~%s' % x) - - def insn_neg_o(self): - x = self.pop(); self.push('-%s' % x) - self.setflag('%s == LONG_MIN' % x) - - def insn_abs_o(self): - x = self.pop(); self.push('%s<0 ? -%s : %s' % (x,x,x)) - self.setflag('%s == LONG_MIN' % x) - - def insn_add(self): - y = self.pop(); x = self.pop(); self.push('%s+%s' % (x,y)) - - def insn_add_o(self): - y = self.pop(); x = self.pop(); self.push('%s+%s' % (x,y)) - self.setflag('((%s+%s)^%s) < 0 && (%s^%s) >= 0' % (x,y,x,x,y)) - - def insn_immed(self, x=Immed(0,1)): - self.push(x) - - def insn_s_push(self, s=Stack()): - self.push(s) - - def insn_s_pop(self, s=StackRef()): - s.write(self.pop()) - - def insn_flag_push(self): - self.push(self.consumeflag()) - - def insn_cmpz(self): - self.pop('x'); self.setflag('x == 0') - - def insn_jumpfar(self, target=Address()): - self.do('nextip = (code_t*) %s;' % target) - insn_jumpfar.chainable = False - - def insn_load1(self): - self.pop('addr'); self.push('*(char*) addr') - - def insn_store1(self): - self.pop('value'); self.pop('addr') - self.do('*(char*) addr = value;') - - -ivm = IVM(['accum']) -ivm.insn_add_o() -ivm.insn_add() -ivm.insn_flag_push() -ivm.normalize(['accum']) -ivm.write() diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/insnset.py b/nodebox/ext/psyco/src/c/ivm/prolog/insnset.py deleted file mode 100644 index 2c6c9c7..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/insnset.py +++ /dev/null @@ -1,81 +0,0 @@ - - -class InstructionSet: - - def __init__(self, stack): - self.locals = {} - self.stack = stack - self.popped = 0 - self.flag = 'flag' - self.codelines = [] - - def do(self, code): - self.codelines.append(code) - - def push(self, expr): - self.stack.append(expr) - - def compute(self, expr): - if expr in self.locals: - return expr - name = 'l%d' % len(self.locals) - self.locals[name] = expr - self.do('%s = %s;' % (name, expr)) - return name - - def pop(self): - if self.stack: - name = self.compute(self.stack.pop()) - else: - name = self.compute('stack_nth(%d);' % self.popped) - self.popped += 1 - return name - - def setflag(self, expr): - self.flag = expr - - def forgetflag(self): - self.flag = None - - def consumeflag(self): - result = self.flag - self.forgetflag() - return result - - def normalize(self, stack): - rstack = list(stack) - rstack.reverse() - code = ['%s = %s;' % (target, self.pop()) for target in rstack] - shift = self.popped-len(self.stack) - code += ['stack_nth(%d) = %s;' % (i, self.pop()) - for i in range(len(self.stack))] - if self.flag is not None and self.flag != 'flag': - self.do('flag = %s;' % self.flag) - if shift != 0: - if shift > 0: - self.do('stack_shift_pos(%d);' % shift) - else: - self.do('stack_shift(%d);' % shift) - for line in code: - self.do(line) - self.stack = list(stack) - self.popped = 0 - - def write(self): - print '{' - if self.locals: - locals = self.locals.keys() - locals.sort() - print '\tword_t %s;' % (', '.join(locals),) - for line in self.codelines: - print '\t' + line - print '}' - - -class InstructionSetWriter: - - def __init__(self, InsnSet, nbaccum=1): - self.InsnSet = InsnSet - self.nbaccum = nbaccum - - diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default b/nodebox/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default deleted file mode 100644 index f1d00cf..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/mode_combine.pl.default +++ /dev/null @@ -1,12 +0,0 @@ -% This file defines combination of instructions, or more precisely instruction -% modes, that should be produced as a single larger instruction with its -% own bytecode. There are about 73 basic instruction modes, so this leaves -% room for 182 extra combined instructions. For example: - -%% mode_combine([s_push(0), immed(char)]). -%% mode_combine([s_push(0), immed(char), cmplt]). -%% mode_combine([s_push(0), immed(char), cmplt, jcondfar(long)]). - -% See py-utils/ivmoptimize.py for a way to generate automatically the 182 best -% combinations for your own program. Optimizing Psyco/IVM in this way for a -% specific program can make it run quite faster. diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/optimize.pl b/nodebox/ext/psyco/src/c/ivm/prolog/optimize.pl deleted file mode 100644 index 62c5c75..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/optimize.pl +++ /dev/null @@ -1,186 +0,0 @@ -:- consult(insns). -:- dynamic psycodump/2, stackpush/2. -:- dynamic frequency/2. - - -%%% interactive usage %%% - -clear :- - retractall(psycodump(_,_)). - -load(DumpDir) :- - atom_concat('python ../../../py-utils/ivmextract.py ', DumpDir, CmdLine), - see(pipe(CmdLine)), - read(Filename), - seen, - loaddumpfile(Filename). - -loaddumpfile(Filename) :- - write('loading '), write(Filename), write('...'), nl, - see(Filename), - load_rec, - seen. - -measure(MaxLength) :- - write('measuring frequencies...'), nl, - tell(pipe('python samelines.py "frequency(%s, %d)." > optimize.tmp')), - ( - L1 = [_,_|_], - codeslice(DynFreq, L1, MaxLength), - generalize(L1, L), - write(DynFreq), write('*'), - write(L), nl, - fail - ) ; - told, - retractall(frequency(_,_)), - loadmeasures. - -loadmeasures :- - see('optimize.tmp'), - load_rec, - seen. - -show :- - findall(F, (F=(Rank,L), frequency(L, Freq), modecost(L, Cost), - Rank is Freq/Cost), Results), - sort(Results, Sorted), - ( - member(X, Sorted), - write(X), nl, - fail - ) ; - true. - -emitmodes(HighestOpcode) :- - write('creating mode_combine.pl...'), nl, - findall(F, (F=(Rank,L), frequency(L, Freq), modecost(L, Cost), - Rank is Cost/Freq), Results), - sort(Results, Sorted), - initial_stack(InitialStack), - countsuccesses(insn_single_mode(_, _, InitialStack), NbBaseOpcodes), - LenMax is HighestOpcode - NbBaseOpcodes, - processmodes(Result, LenMax, Sorted), - FirstOpcode is NbBaseOpcodes+1, - tell('mode_combine.pl'), - ( - enumerate(member(Clause, Result), Opcode, FirstOpcode), - Opcode =< HighestOpcode, - write(Clause), - write('.'), - nl, - fail - ) ; - told. - - -%%% end interactive usage %%% - - -%preprocess(psycodump(L1), psycodump(L2)) :- -% joinlist(basemodes, L1, L2). - -load_rec :- - read(Term), - Term \= end_of_file, - !, - %preprocess(Term, Term1), - assert(Term), - load_rec. -load_rec. - -codeslice(DynFreq, L1, MaxLength) :- - psycodump(DynFreq, L), - subslice(L, L1, MaxLength). - -subslice(L, L1, MaxLength) :- - subslice1(L, L1, MaxLength). -subslice([_|Tail], L1, MaxLength) :- - subslice(Tail, L1, MaxLength). - -subslice1(_, [], _). -subslice1([X|Xs], [X|Ys], MaxLength) :- - MaxLength > 0, - N is MaxLength-1, - subslice1(Xs, Ys, N). - -generalize(L, G) :- - initial_stack(InitialStack), - chainlist(generalize1, L, G, ([], InitialStack), _). - -%:- det(generalize1/4). -generalize1(Term, Mode, (OldOptions, OldStack), (Options, Stack1)) :- - (memberchk(stack(StackOp), OldOptions) -> - insn_stack(StackOp, OldStack, Stack1, dummy) ; - Stack1 = OldStack - ), - Term =.. [Insn | Args], - insn(Insn, FormalArgs, _, Options), - maplist(generalize_arg(Stack1), FormalArgs, Args, ArgModes), - Mode =.. [Insn | ArgModes]. - -%:- det(generalize_arg/4). -generalize_arg(Stack, FormalArg, RealArg, ArgMode) :- - standard_mode(_, Stack, FormalArg, ArgMode), - condition_test(ArgMode, RealArg), - !. - - -complexity(Term, P, Q) :- - (var(Term) -> Subterms = [] ; Term =.. [_ | Subterms]), - S is P+1, - chainlist(complexity, Subterms, S, Q). - -modecost(Mode, Cost) :- - mode_operate(Mode, Code), - codecost(Code, Cost1), - (Cost1 == 0 -> Cost = 1 ; Cost = Cost1). - -length_ex(A, Length) :- - var(A) -> Length = 0 ; - A = [_|B] -> length_ex(B, L), Length is L+1 ; - A = [] -> Length = 0 ; - Length = 1. - -initialslice(_, []). -initialslice([X|Xs], [X|Ys]) :- - initialslice(Xs, Ys). - -regmode(Result, Mode) :- - memberchk(mode_combine(Mode), Result). - -closelist([], []) :- !. -closelist([X|Xs], [X|Ys]) :- !, closelist(Xs, Ys). -closelist(A, [A]). - -processmodes(Result, LenMax, [(_Cost, Mode) | Tail]) :- - length_ex(Result, Len1), - Len1 < LenMax, - !, - InitialMode = [_,_|_], - findall(InitialMode, initialslice(Mode, InitialMode), InitialModes), - maplist(regmode(Result), InitialModes), - processmodes(Result, LenMax, Tail). -processmodes(Result, _, _) :- - closelist(Result, Result). - - -remotecontrol :- - read(Term), - Term \= end_of_file, - !, - Term, - remotecontrol. -remotecontrol. - - -setup :- - retractall(stackpush(_,_)), - ( - count_stackpush(Insn, P), - assert(stackpush(Insn, P)), - fail - ) ; - true. - -:- setup. diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/samelines.py b/nodebox/ext/psyco/src/c/ivm/prolog/samelines.py deleted file mode 100644 index 394902e..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/samelines.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# Search for identical lines in stdin. Line starting with "*" -# are assumed to be repeated that number of times. -# stdout report is formatted according to sys.argv[1]. -# -import sys, re - -re1 = re.compile(r"([0-9]+)[*](.*)") - -def samelines(infile, outfile, format, verbose=1, minimum=2): - lines = {} - total = 0 - try: - for line in infile: - verbose -= 1 - if not verbose: - if total: - print >> sys.stderr, '%d lines, %d without duplicates...' % ( - total, len(lines)) - total += 5000 - verbose = 5000 - if line.endswith('\n'): - line = line[:-1] - match = re1.match(line) - if match: - count = int(match.group(1)) - line = match.group(2) - else: - count = 1 - lines[line] = lines.get(line, 0) + count - finally: - for line, count in lines.iteritems(): - if count >= minimum: - print >> outfile, format % (line, count) - -if __name__ == '__main__': - format = sys.argv[1] - samelines(sys.stdin, sys.stdout, format) diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/utils.pl b/nodebox/ext/psyco/src/c/ivm/prolog/utils.pl deleted file mode 100644 index b958389..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/utils.pl +++ /dev/null @@ -1,110 +0,0 @@ -:- consult(detcheck). - -% succnat(N, N+1) only with N>=0 -succnat(N, Ns) :- succ(N, Ns), N>=0. - -% same as reverse/2, but accepts any instantiation pattern. -reverse1([], []). -reverse1([H1|T1], [H2|T2]) :- - same_length(T1, T2, T2r), - append(T2r, [H2], [H1|T1]), - reverse1(T2, T2r). - -same_length([], []). -same_length([_|T1], [_|T2]) :- - same_length(T1, T2). - -same_length([], [], []). -same_length([_|T1], [_|T2], [_|T3]) :- - same_length(T1, T2, T3). - -% longer versions of append. -% Deterministic if all arguments but the last one are bound. -% Finitely backtracking if the last argument is bound. -append(L1, L2, L3, L123) :- - append(L1, L23, L123), - append(L2, L3, L23). -append(L1, L2, L3, L4, L1234) :- - append(L1, L234, L1234), - append(L2, L34, L234), - append(L3, L4, L34). - -% a shorter and some longer versions of maplist. -maplist(_Pred, []). -maplist(Pred, [H1|T1]) :- - call(Pred, H1), - maplist(Pred, T1). -maplist(_Pred, [], [], []). -maplist(Pred, [H1|T1], [H2|T2], [H3|T3]) :- - call(Pred, H1, H2, H3), - maplist(Pred, T1, T2, T3). -maplist(_Pred, [], [], [], []). -maplist(Pred, [H1|T1], [H2|T2], [H3|T3], [H4|T4]) :- - call(Pred, H1, H2, H3, H4), - maplist(Pred, T1, T2, T3, T4). - -% Succeeds as many times as Goal, with N successfully bound to N0, N0+1, N0+2... -% Can also be used with N bound to get the Nth success of Goal. -enumerate(Goal, N, N0) :- - flag(enumerate, Old, N0), - ( - Goal, - flag(enumerate, Current, Current+1), - N = Current - ; - flag(enumerate, _, Old), - fail). - -% Count the number of successes of Goal -countsuccesses(Goal, N) :- - flag(countsuccesses, Old, 0), - ( - Goal, - flag(countsuccesses, Current, Current+1), - fail - ; - flag(countsuccesses, N, Old)). - -% [X,Y,Z...] --> [(X,0), (Y,1), (Z,2)...] -enumerate_list([], [], Index, Index). -enumerate_list([H|T], [(H, Start)|Tail], Start, End) :- - succ(Start, Next), - enumerate_list(T, Tail, Next, End). - - -% joinlist(+Map, +List, -ResultList) -% calls Map(X,L) for all X in List. ResultList is the concatenation of all L's. -joinlist(_, [], []). -joinlist(Map, [Head|Tail], ResultList) :- - call(Map, Head, L1), - joinlist(Map, Tail, L2), - append(L1, L2, ResultList). - -joinlist(_, [], [], []). -joinlist(Map, [H1|T1], [H2|T2], ResultList) :- - call(Map, H1, H2, L1), - joinlist(Map, T1, T2, L2), - append(L1, L2, ResultList). - -joinlist(_, [], [], [], []). -joinlist(Map, [H1|T1], [H2|T2], [H3|T3], ResultList) :- - call(Map, H1, H2, H3, L1), - joinlist(Map, T1, T2, T3, L2), - append(L1, L2, ResultList). - -% chainlist(+Map, +List, +Input, -Output) -% DCG chain: calls Map(X1, Input, A), Map(X2, A, B), Map(X3, B, C), ... -chainlist(_, [], IO, IO). -chainlist(Map, [Head|Tail], Input, Output) :- - call(Map, Head, Input, Middle), - chainlist(Map, Tail, Middle, Output). - -chainlist(_, [], [], IO, IO). -chainlist(Map, [H1|T1], [H2|T2], Input, Output) :- - call(Map, H1, H2, Input, Middle), - chainlist(Map, T1, T2, Middle, Output). - -chainlist(_, [], [], [], IO, IO). -chainlist(Map, [H1|T1], [H2|T2], [H3|T3], Input, Output) :- - call(Map, H1, H2, H3, Input, Middle), - chainlist(Map, T1, T2, T3, Middle, Output). diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/vm.pl b/nodebox/ext/psyco/src/c/ivm/prolog/vm.pl deleted file mode 100644 index 0d52b85..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/vm.pl +++ /dev/null @@ -1,567 +0,0 @@ -:- consult(ccode). -:- consult(utils). - -:- multifile insn/4, overflow_flag/1. -:- discontiguous insn/4, overflow_flag/1. -:- multifile unary_insn/2, binary_insn/2, unary_insn/1, binary_insn/1. -:- discontiguous unary_insn/2, binary_insn/2, unary_insn/1, binary_insn/1. -:- multifile mode_combine/1, standard_mode/4. - - -% conditions -condition_range(char, -128:127). -condition_range(positive, 0:maxint). -condition_range(byte, 0:255). -%condition_range(truestack(byte), A:B) :- initial_stack_depth(A), B = 255. -%condition_range(truestack(long), A:B) :- initial_stack_depth(A), B = maxint. -condition_range(int, minint:maxint). -condition_range(long, minint:maxint). -condition_range(minint:maxint, minint:maxint) :- !. -condition_range(minint:B, minint:Bx ) :- !, Bx is B. -condition_range(A :maxint, Ax :maxint) :- !, Ax is A. -condition_range(A :B, Ax :Bx ) :- !, Ax is A, Bx is B. -condition_range((C1, C2), A:B) :- - condition_range(C1, A1:B1), - condition_range(C2, A2:B2), - mmax(A1, A2, A), - mmin(B1, B2, B). -condition_range(C1+Offset, A:B) :- - condition_range(C1, A1:B1), - mplus(A1, Offset, A), - mplus(B1, Offset, B). -condition_range(C1-Offset, A:B) :- - condition_range(C1, A1:B1), - mplus(A, Offset, A1), - mplus(B, Offset, B1). -condition_range(A, A:A) :- - integer(A). - -goal_condition(Cond, V, unsigned(V) =< B) :- - condition_range(Cond, 0:B), - integer(B), B>0, !. -goal_condition(Cond, V, V =:= A) :- - condition_range(Cond, A:A), - integer(A), !. -goal_condition(Cond, V, G) :- - condition_range(Cond, A:B), - goal_in_range(V, A, B, G), !. -goal_condition(indirect(_), _, true). - -goal_conj(_, fail, fail) :- !. -goal_conj(fail, _, fail) :- !. -goal_conj(G1, true, G1) :- !. -goal_conj(true, G2, G2) :- !. -goal_conj(G1, G2, (G1, G2)). - -goal_leq(A, A, true) :- !. -goal_leq(minint, _, true) :- !. -goal_leq(maxint, _, fail) :- !. -goal_leq(_, maxint, true) :- !. -goal_leq(_, minint, fail) :- !. -goal_leq(A, B, A =< B). - -goal_add(0, A, A) :- !. -goal_add(A, 0, A) :- !. -goal_add(A, B, B+A). - -mmin(A, B, A) :- goal_leq(A, B, G), G, !. -mmin(_, B, B). -mmax(A, B, B) :- goal_leq(A, B, G), G, !. -mmax(A, _, A). -mplus(minint, _, minint). -mplus(maxint, _, maxint). -mplus(_, minint, minint). -mplus(_, maxint, maxint). -mplus(A, B, C) :- - A \== minint, - A \== maxint, - B \== minint, - B \== maxint, - C \== minint, - C \== maxint, - plus(A, B, C). - -goal_in_range(V, A, B, G) :- - goal_leq(A, B, GCheck), - (GCheck -> - goal_leq(A, V, G1), - goal_leq(V, B, G2), - goal_conj(G1, G2, G) - ; - G = fail). - -condition_test(indirect(_), _) :- !. -condition_test(Cond, V) :- - condition_range(Cond, A:B), - goal_in_range(V, A, B, G), - G. - -goal_nonemptycondition(Cond, G) :- - condition_range(Cond, A:B), - goal_leq(A, B, G). - -goal_subcondition(C1, C2, G) :- - condition_range(C1, A1:B1), - condition_range(C2, A2:B2), - goal_leq(A2, A1, G1), - goal_leq(B1, B2, G2), - goal_conj(G1, G2, G). - -condition_type(Cond, singleton(A)) :- - condition_range(Cond, A:B), - goal_leq(B, A, G), G. -condition_type(Cond, char) :- - goal_subcondition(Cond, char, G), G. -condition_type(Cond, code_t) :- - goal_subcondition(Cond, byte, G), G. -condition_type(indirect(T), T). -condition_type(_, word_t). - - -% instruction helpers -unary_insn(Name, Name) :- unary_insn(Name). -binary_insn(Name, Name) :- binary_insn(Name). - -overflow_code(Name, Args, Ovf, [flag(set)]) :- - overflow_flag(Name), - !, - Op =.. [macro_args | Args], - Ovf = [setflag=ovf_check(Name, Op)]. -overflow_code(_, _, [], []). - -build_simple_insn(Name, COp, Code, Args, Opts) :- - Code = [out(0) = Op | OvfCode], - Op =.. [COp | Args], - overflow_code(Name, Args, OvfCode, Opts). - -insn(Name, [], Code, [stack(1->1)|Opts]) :- - unary_insn(Name, COp), - atom(COp), - build_simple_insn(Name, COp, Code, [in(0)], Opts). - -insn(Name, [], Code, [stack(2->1)|Opts]) :- - binary_insn(Name, COp), - atom(COp), - build_simple_insn(Name, COp, Code, [in(1), in(0)], Opts). - -%insn(Name, [], Code, [stack(1->N)]) :- -% unary_insn(Name, COp), -% is_list(COp), -% length(COp, N), -% build_insn(COp, [in(0)], Code). -% -%insn(Name, [], Code, [stack(2->N)]) :- -% binary_insn(Name, COp), -% is_list(COp), -% length(COp, N), -% build_insn(COp, [in(1), in(0)], Code). -% -%build_insn([COp1|Tail], CArgs, [out(TN) = Op | CodeTail]) :- -% Op =.. [COp1 | CArgs], -% length(Tail, TN), -% build_insn(Tail, CArgs, CodeTail). -%build_insn([], _, []). - - -% combined instructions -mode_pair(Modes, StdMode) :- - mode_combine(MList), - %append(MList1, _, MList), - %Modes = [_|_], - append(Modes, [StdMode], MList). - - -% insn_mode([insn(conditions...), insn(conditions...), ...]) - -% register all standard modes for a single instruction -insn_single_mode(Insn, StdMode, InputStack) :- - insn(Insn, Args, _, Options), - \+ memberchk(suffixonly, Options), - % the first arg of standard_mode/4 is a singleton var that must - % unify to the same atom for all the arguments. In other words - % we are only interested in condlists containing all small or all - % large conditions. - maplist(standard_mode(_, InputStack), Args, CondList), - StdMode =.. [Insn | CondList]. - -insn_mode([StdMode]) :- - initial_stack(Stack), - insn_single_mode(_, StdMode, Stack). - -% register combined modes -insn_mode(MList) :- - mode_pair(Modes, StdMode), - append(Modes, [StdMode], MList). - -standard_mode(small, _, i, char). -standard_mode(large, _, i, int). -standard_mode(_, _, l, indirect(word_t)). -standard_mode(_, _, b, indirect(code_t)). -standard_mode(Sz, Stack, s, Cond) :- - standard_mode_stack(Stack, Sz, 0, Cond). - -standard_mode_stack(push(_, _), _, N, N). -standard_mode_stack(push(_, Queue), Sz, N, Cond) :- - N1 is N+1, - standard_mode_stack(Queue, Sz, N1, Cond). -standard_mode_stack(slice(_), small, N, N:255). -standard_mode_stack(slice(_), large, N, N:maxint). - -% convert between mode and opcode number -:- det(mode_opcode/2). -mode_opcode(Mode, Opcode) :- - enumerate(insn_mode(M), Opcode, 1), - (M = Mode ; M = [Mode]), - !. - -% context stack manipulation -%initial_stack(slice(0)). -initial_stack(push(accum, slice(0))). -%initial_stack(push(accum, push(accum2, slice(0)))). - -initial_stack_depth(N) :- - initial_stack(S0), stack_depth(S0, N). - -cell_length(push(_, Tail), Ns) :- - cell_length(Tail, N), - succ(N, Ns). -cell_length(slice(_), 0). - -stack_depth(push(_, Tail), Ns) :- - stack_depth(Tail, N), - succ(N, Ns). -stack_depth(slice(ExtraPops), N) :- - plus(ExtraPops, N, 0). - -% stack_top(+-Item, +-Tail, -+Stack) <=> Stack = push(Item, Tail) -stack_top(Item, Tail, push(Item, Tail)) :- !. -stack_top(Item, slice(Ns), slice(N)) :- - succ(N, Ns), - stack_nth(slice(N), 0, Item). - -% stack_nth(+Stack, +N, -Item) -stack_nth(push(Item, _), 0, Item). -stack_nth(push(_, Tail), Ns, Item) :- - succnat(N, Ns), - stack_nth(Tail, N, Item). -stack_nth(slice(ExtraPops), N, stack_nth(P)) :- - plus(N, ExtraPops, P). - -% stack_shift(+stack_nth(N), +Shift, -stack_nth(N+Shift)) -stack_shift(stack_nth(N), Shift, stack_nth(M)) :- - plus(N, Shift, M), - !. -stack_shift(Item, _, Item). - - -% instruction stack operations -:- det(insn_stack/4). -insn_stack(none, Stack, Stack, _). - -insn_stack(push, OldStack, NewStack, X) :- - insn_stack(0->1, OldStack, NewStack, X). -insn_stack(pop, OldStack, NewStack, X) :- - insn_stack(1->0, OldStack, NewStack, X). -insn_stack(pop(0), OldStack, NewStack, X) :- - insn_stack(1->0, OldStack, NewStack, X). -insn_stack(pop(Ns), OldStack, NewStack, X) :- - succnat(N, Ns), - stack_top(Top, S1, OldStack), - insn_stack(pop(N), S1, S2, X), - stack_top(Top, S2, NewStack). - -%insn_stack(swap, OldStack, NewStack) :- -% stack_top(X1, S1, OldStack), -% stack_top(X2, S2, S1), -% stack_top(X1, S2, S3), -% stack_top(X2, S3, NewStack). - -insn_stack(unary, OldStack, NewStack, X) :- - insn_stack(1->1, OldStack, NewStack, X). -insn_stack(binary, OldStack, NewStack, X) :- - insn_stack(2->1, OldStack, NewStack, X). - -insn_stack(0->0, Stack, Stack, _). -insn_stack(0->Ns, OldStack, NewStack, X) :- - succnat(N, Ns), - stack_top(_, OldStack, S1), % push a new unnamed variable - insn_stack(0->N, S1, NewStack, X). -insn_stack(Ms->N, OldStack, NewStack, X) :- - succnat(M, Ms), - stack_top(_, S1, OldStack), % pop away the first element - insn_stack(M->N, S1, NewStack, X). - -insn_stack(settos, _, NewStack, extra([_:_|_],[stack_nth(N)])) :- - NewStack = trashed(N). % optimization for the next line - %NewStack = specialop(stack_shift(N), OldStack). -insn_stack(settos, OldStack, NewStack, extra([N|_], _)) :- - integer(N), - insn_stack(N->0, OldStack, NewStack, _). -insn_stack(pushn, OldStack, NewStack, extra(_, [N])) :- - NewStack = specialop(stack_shift(-N), OldStack). - -:- det(insn_operate_stack/4). -insn_operate_stack(Insn, OldStack, NewStack, Extra) :- - insn(Insn, _, _, Options), - (memberchk(stack(StackOp), Options), !; StackOp = none), - insn_stack(StackOp, OldStack, NewStack, Extra). -insn_operate_stack(Insn, OldStack, NewStack) :- - insn_operate_stack(Insn, OldStack, NewStack, dummy). - -:- det(insn_operate_flag/3). -insn_operate_flag(Insn, OldFlag, NewFlag, PreCode, PostCode) :- - insn(Insn, _, _, Options), - (memberchk(flag(get), Options) -> - PreCode = [impl_debug_check_flag(OldFlag)], - PostCode = [impl_debug_forget_flag(OldFlag)], - NewFlag = consumed - ; - PreCode = [], - PostCode = [], - (memberchk(flag(set), Options) -> - true % NewFlag stays a variable - ; - NewFlag = OldFlag)). - -map_operate((OldStack,_), _, _, in(N), Item) :- !, stack_nth(OldStack, N, Item). -map_operate(_, (NewStack,_), _, out(N), Item) :- !, stack_nth(NewStack, N, Item). -map_operate(_, _, InputArgs, arg(N), Item) :- !, nth0(N, InputArgs, Item). -map_operate((OldStack,_), _, _, stkshft, N) :- !, stack_depth(OldStack, N). -map_operate((_,OldFlag), _, _, flag, OldFlag) :- !. -map_operate(_, (_,NewFlag), _, setflag, NewFlag) :- !. -map_operate(P1, P2, P3, Compound, Item) :- - Compound =.. [Functor|Args], - !, - maplist(map_operate(P1, P2, P3), Args, MappedArgs), - Item =.. [Functor|MappedArgs]. -map_operate(_, _, _, Item, Item). - -map_operate_top(P1, P2, P3, X=Y, []) :- - map_operate(P1, P2, P3, X, Item1), var(Item1), - map_operate(P1, P2, P3, Y, Item2), var(Item2), - Item1 = Item2, - !. -map_operate_top(P1, P2, P3, Input, Item) :- - map_operate(P1, P2, P3, Input, Item). - -:- det(insn_operate_code/5). -insn_operate_code(Insn, OldState, NewState, InputArgs, Code) :- - insn(Insn, _, CodeTemplate, _), - maplist(map_operate_top(OldState, NewState, InputArgs), - CodeTemplate, Code). - -:- det(load_initexpr/5). -load_initexpr(CurrentStack, s, Cond, _, A2) :- - condition_range(Cond, N:N), - stack_nth(CurrentStack, N, A2), - !. -load_initexpr(slice(0), s, Cond, A1, stack_nth(A1)) :- - condition_range(Cond, A:_), - goal_leq(0, A, G), G, - !. -load_initexpr(slice(ExtraPops), s, Cond, A1, stack_nth(A1+ExtraPops)) :- - condition_range(Cond, A:_), - goal_leq(0, A, G), G, - !. -load_initexpr(slice(_), s, Cond, _, _) :- - user_error('*** Reading too deep from the stack', Cond). -load_initexpr(push(_, TailStack), s, Cond, A1, stack_nth(A2-1)) :- - load_initexpr(TailStack, s, Cond-1, A1, stack_nth(A2)), - !. -load_initexpr(_, _, _, V, V). - -:- det(init_arg/3). -init_arg(Cond, [], A) :- - condition_type(Cond, singleton(A)), - !. -init_arg(Cond, V=bytecode_next(T), V) :- - condition_type(Cond, T), - !. - -:- det(size_arg/2). -size_arg(Cond, 0) :- - condition_type(Cond, singleton(_)), - !. -size_arg(Cond, bytecode_size(T)) :- - condition_type(Cond, T), - !. - -:- det(mode_operate1/3). -mode_operate1(Mode, (Stack1, Flag1, InitU1, CodeL1), - (Stack2, Flag2, InitU2, CodeL2)) :- - Mode =.. [Insn|CondList], - insn(Insn, Args, _, _), - maplist(init_arg, CondList, InitUnif, InitArgs), - maplist(load_initexpr(Stack1), Args, CondList, InitArgs, UseArgs), - insn_operate_stack(Insn, Stack1, Stack2, extra(CondList, UseArgs)), - insn_operate_flag(Insn, Flag1, Flag2, FlagPreCode, FlagPostCode), - insn_operate_code(Insn, (Stack1, Flag1), (Stack2, Flag2), UseArgs, Code), - append(InitU1, InitUnif, InitU2), - append(CodeL1, FlagPreCode, Code, FlagPostCode, CodeL2). - -:- det(mode_operate/2). -mode_operate(Mode, block_locals(word_t, CodeBlock)) :- - initial_stack(OldStack), - chainlist(mode_operate1, Mode, - (OldStack, flag, [], []), (NewStack, NewFlag, U1, C3)), - mode_unify((NewStack, NewFlag), (OldStack, flag), C4), - append(U1, C3, C4, CodeBlock1), - code_simplify(CodeBlock1, CodeBlock). - -mode_nonclobber_flag(Mode) :- - initial_stack(OldStack), - chainlist(mode_operate1, Mode, - (OldStack, _, [], []), (_, NewFlag, _, _)), - var(NewFlag). - -% stack_unify(+CurrentStack, +TargetStack, -UnificationsList1, -2, -StackShift) -stack_unify(slice(E1), slice(E2), [], [], StackShift) :- - !, - plus(E2, StackShift, E1). -stack_unify(trashed(N), TargetStack, UnifList1, UnifList2, StackShift) :- - !, - stack_unify(slice(0), TargetStack, UnifL1, UnifList2, StackShift), - UnifList1 = [stack_shift(N) | UnifL1]. -stack_unify(specialop(Op, Cur), TargetStack, UnifList1, UnifList2, StackShift) :- - !, - stack_unify(Cur, slice(0), UnifL1, UnifL2, StackShift1), - UnifExtra = [stack_shift(StackShift1), Op], - stack_unify(slice(0), TargetStack, UnifL1bis, UnifList2, StackShift), - reverse(UnifL2, UnifL2r), - append(UnifL1, UnifL2r, UnifExtra, UnifL1bis, UnifList1). -stack_unify(CurrentStack, TargetStack, UnifList1, UnifList2, StackShift) :- - stack_top(Src, S1, CurrentStack), - stack_top(PreDest, S2, TargetStack), - stack_unify(S1, S2, UnifL1, UnifL2, StackShift), - stack_shift(PreDest, StackShift, Dest), - (Src == Dest -> - UnifList1 = UnifL1, - UnifList2 = UnifL2 - ; - UnifList1 = [Temp=Src | UnifL1], - UnifList2 = [Dest=Temp | UnifL2]). - -:- det(mode_unify/3). -mode_unify((S1,F1), (S2,F2), Code) :- - stack_unify(S1, S2, UnifList1, UnifList2, StackShift), - reverse(UnifList2, UnifList2r), - (StackShift > 0 -> - CodeL4 = [stack_shift_pos(StackShift)|CodeTail] - ; - (StackShift < 0 -> - CodeL4 = [stack_shift(StackShift)|CodeTail] - ; - CodeL4 = CodeTail)), - (var(F1) -> - CodeTail = [F2=F1] - ; - CodeTail = []), - append(UnifList1, UnifList2r, CodeL4, Code). - -% instruction emitters -insn_inputargname((_, Index), Name) :- - int_to_atom(Index, Suffix), - atom_concat(arg, Suffix, Name). - -insn_inputargtype(s, 'int') :- !. -insn_inputargtype(l, 'word_t**') :- !. -insn_inputargtype(b, 'code_t**') :- !. -insn_inputargtype(_, 'word_t'). - -insn_declarearg(Name, Type, var(Type, Name)). - -insn_defarglist(Insn, ArgList) :- - insn(Insn, Args, _, _), - enumerate_list(Args, NumberedArgs, 1, _), - maplist(insn_inputargname, NumberedArgs, ArgNames), - maplist(insn_inputargtype, Args, ArgTypes), - maplist(insn_declarearg, ArgNames, ArgTypes, ArgList). - -%insn_preparearg(s, Name, ModifiedName, [var(int, ModifiedName, Init)]) :- -% !, -% atom_concat(Name, s, ModifiedName), -% Init = 'CURRENT_STACK_POSITION'(Name). -insn_preparearg(_, Name, Name, []). - -mode_outputargtype(_, l, 'placeholder_long'). -mode_outputargtype(_, b, 'placeholder_byte'). -mode_outputargtype(Cond, _, void) :- - condition_range(Cond, A:A). -mode_outputargtype(Cond, _, char) :- - goal_subcondition(Cond, char, G), G. -mode_outputargtype(Cond, _, byte) :- - goal_subcondition(Cond, byte, G), G. -mode_outputargtype(_, s, 'int'). -mode_outputargtype(_, _, 'word_t'). - -mode_conditions(Mode, Conditions) :- - Mode =.. [_ | Conditions]. - -mode_emitarg(Cond, Arg, V, emit(Type, V)) :- - mode_outputargtype(Cond, Arg, Type), - !. - -:- det(mode_emit/4). -mode_emit(PrevMode, Mode, InputArgs, Code) :- - Mode =.. [Insn | Conditions], - insn(Insn, Args, _, _), - append(PrevMode, [Mode], FullMode), - mode_opcode(FullMode, Opcode), - (PrevMode = [] -> - Emitter = emit(opcode, Opcode) - ; - joinlist(mode_conditions, PrevMode, PrevConditions), - maplist(size_arg, PrevConditions, Sizes), - chainlist(goal_add, Sizes, 0, TotalSize), - Emitter = emit(modified_opcode, Opcode, TotalSize) - ), - maplist(mode_emitarg, Conditions, Args, InputArgs, CodeL2), - append([Emitter], CodeL2, [setlatestopcode(Opcode), return(code)], Code). - -:- det(insn_definemode/5). -insn_definemode(InputArgs, PrevMode, Mode, Code, ElseCode) :- - Mode =.. [_ | Conditions], - maplist(goal_condition, Conditions, InputArgs, Goals), - chainlist(goal_conj, Goals, true, FinalGoal), - Code = ifte(FinalGoal, CodeL1, ElseCode), - mode_emit(PrevMode, Mode, InputArgs, CodeL1). - -insn_combination(InputArgs, Insn, Case) :- - % setof backtracks over each value of PrevMode, - % giving for each a list of possible Modes. - setof(Mode, Cond^(mode_pair(PrevMode, Mode), Mode=..[Insn|Cond]), - Modes), - mode_opcode(PrevMode, Opcode), - Case = case(Opcode, [comment(PrevMode), Body1]), - chainlist(insn_definemode(InputArgs, PrevMode), Modes, - Body1, FinalCase), - FinalCase = break. - -:- det(insn_defbody/2). -insn_defbody(Insn, block(DeclCode, BodyCode)) :- - insn(Insn, Args, _, Options), - %(memberchk(flag(get), Options) -> - % BodyCode = [extra_assert('FLAG_NONCLOBBERING'('LATEST_OPCODE')) | - % MainBodyCode] - %; - MainBodyCode = BodyCode, - enumerate_list(Args, NumberedArgs, 1, _), - maplist(insn_inputargname, NumberedArgs, ArgNames), - joinlist(insn_preparearg, Args, ArgNames, InputArgs, DeclCode), - MainBodyCode = [switch('LATEST_OPCODE', Cases) | RegularBodyCode], - findall(Code, insn_combination(InputArgs, Insn, Code), Cases), - initial_stack(InitialStack), - findall(StdMode, insn_single_mode(Insn,StdMode,InitialStack), StdModes), - chainlist(insn_definemode(InputArgs, []), StdModes, - RegularBodyCode, FinalCase), - (memberchk(suffixonly, Options) -> - FinalCase = [comment('suffix only'), return(code)] - ; - FinalCase = error(invalid_mode(Insn)) - ). - -:- det(insn_define/4). -insn_define(Insn, Insn, ArgList, Body) :- - insn_defarglist(Insn, ArgList), - insn_defbody(Insn, Body1), - code_simplify(Body1, Body). diff --git a/nodebox/ext/psyco/src/c/ivm/prolog/vmwriter.pl b/nodebox/ext/psyco/src/c/ivm/prolog/vmwriter.pl deleted file mode 100644 index bf3711c..0000000 --- a/nodebox/ext/psyco/src/c/ivm/prolog/vmwriter.pl +++ /dev/null @@ -1,241 +0,0 @@ -:- consult(vm). -:- discontiguous main_emit/2. - - -% large-scale code emission: the virtual machine interpreter -main_emit(modes, switch) :- - ( - enumerate(insn_mode(M), Opcode, 1), - mode_operate(M, Code), - format('case ~d: /* ~w */\n', [Opcode, M]), - write_codestmt(Code), - write('continue;\n\n'), - fail - ; - true). - - -threaded_table(absolute, 'void*', - ' &&lblopcode~d, /* ~w */\n', - ' &&lblorigin, /* ~d */\n'). -threaded_table(relative, 'int', - ' &&lblopcode~d - &&lblorigin, /* ~w */\n', - ' 0, /* ~d */\n'). - -threaded_initial(_) :- - write('lblorigin:\npsyco_fatal_msg("invalid vm opcode");\n\n'). - -threaded_jump(absolute) :- - write('goto *opcodetable[bytecode_nextopcode()];\n\n'). -threaded_jump(relative) :- - write('goto *(&&lblorigin + opcodetable[bytecode_nextopcode()]);\n\n'). - -main_emit(modes, threaded(Origin)) :- - threaded_table(Origin, CType, LineFormatStr, MissingFormatStr), - format('static const ~w opcodetable[] = {\n', [CType]), - format(MissingFormatStr, [0]), - ( - enumerate(insn_mode(M), Opcode, 1), - format(LineFormatStr, [Opcode, M]), - fail - ; - countsuccesses(insn_mode(_), NbOpcodes), - FirstMissing is NbOpcodes+1, - write('#if PSYCO_DEBUG\n'), - ( - between(FirstMissing, 255, Opcode), - format(MissingFormatStr, [Opcode]), - fail - ; - write('#endif\n'), - write('};\n'), - threaded_jump(Origin), - threaded_initial(Origin), - ( - enumerate(insn_mode(M), Opcode, 1), - mode_operate(M, Code), - format('lblopcode~d: /* ~w */\n', [Opcode, M]), - write_codestmt(Code), - threaded_jump(Origin), - fail - ; - true))). - -% emits only the definition of a single instruction -main_emit(modes, single(Mode)) :- - mode_operate(Mode, Code), - write_codestmt(Code). - - -% large-scale code emission: the instruction writer helpers -insn_definition(MacroName, MacroArgList, FunctionName, FunctionArgList, Body, - SingleInstr) :- - insn(Insn, _, _, _), - insn_define(Insn, Name, MacroArgList, Body), - atom_concat('INSN_', Name, MacroName), - (Body=block([],[emit(opcode,Op),setlatestopcode(Op)|return(_)]) -> - % macro only - SingleInstr = emit(macro_opcode, Op), - FunctionName = '' - ; - atom_concat('psyco_insn_', Name, FunctionName), - FunctionArgList = [var('code_t*', code) | MacroArgList]). - -main_emit(insns, headers(Prefix)) :- - countsuccesses(insn_mode(_), NbOpcodes), - (NbOpcodes > 255 -> user_error('too many opcodes', NbOpcodes) ; true), - write('#define LAST_DEFINED_OPCODE '), - write(NbOpcodes), - nl, - nl, - ( - insn_definition(MacroName, MacroArgList, - FunctionName, FunctionArgList, _, SingleInstr), - write('#define '), - write_code(macro_call(MacroName, MacroArgList)), - write(' '), - (FunctionName = '' -> - % write as a macro - write_code(SingleInstr), - nl - ; - % write as a call to an EXTERN function - write('(code = '), - write_code(macro_call(FunctionName, FunctionArgList)), - write(')'), - nl, - write(Prefix), - write_code(function_header(FunctionName, 'code_t*', - FunctionArgList)), - write(';'), - nl), - fail - ; - true). - -main_emit(insns, functions(Prefix)) :- - %write('#define FLAG_NONCLOBBERING(op) ( \\'), nl, - %( - % enumerate(insn_mode(M), Opcode, 1), - % mode_nonclobber_flag(M), - % write('\t(op)=='), write(Opcode), write(' || \\\n'), - % fail - %; - %write('\t0)\n'), - ( - insn_definition(_, _, FunctionName, FunctionArgList, Body, _), - (FunctionName = '' -> - % only exists as a macro - true - ; - % write the function definition - nl, - write(Prefix), - write_code(function_def(FunctionName, 'code_t*', - FunctionArgList, Body))), - fail - ; - true). - -% write the instruction table in Python -:- det(objdump_mode/2). -:- det(objdump_insn/1). - -objdump_mode(Opcode, M) :- - format(' ~d: [', [Opcode]), - maplist(objdump_insn, M), - write('],'), - nl. - -objdump_insn(M) :- - M =.. [Insn | Args], - insn(Insn, ArgLetters, _, _), - format('("~w",', [Insn]), - maplist(objdump_arg, Args, ArgLetters), - write('), '). - -objdump_arg(_:255, s) :- !, - write(stack(byte)), - write(','). -objdump_arg(_:maxint, s) :- !, - write(stack(long)), - write(','). -objdump_arg(A, s) :- !, - write(stack(A)), - write(','). -objdump_arg(A, _) :- - write(A), - write(','). - -objdump_stackpushes(M, P) :- - chainlist(objdump_stackpush, M, 0, P). - -objdump_stackpush(M, P1, P2) :- - M =.. [Insn | _], - count_stackpush(Insn, P), - P2 is P1+P. - -count_stackpush(Insn, P) :- - insn(Insn, _, _, Options), - \+ memberchk(nostackanalysis, Options), - (memberchk(stack(StackOp), Options) -> true ; StackOp = none), - objdump_stackop(StackOp, P). - -objdump_chainables(M) :- - maplist(objdump_chainable, M). - -objdump_chainable(M) :- - M =.. [Insn | _], - chainable(Insn). - -chainable(Insn) :- - insn(Insn, _, _, Options), - \+ memberchk(nonchainable, Options). - -objdump_stackop(none, 0). -objdump_stackop(push, 1). -objdump_stackop(pop, -1). -objdump_stackop(pop(_), -1). -objdump_stackop(N->M, P) :- P is M-N. -objdump_stackop(unary, 0). -objdump_stackop(binary, -1). - -main_emit(pytable) :- - write('insntable = {'), - nl, - ( - enumerate(insn_mode(M), Opcode, 1), - objdump_mode(Opcode, M), - fail - ; - write('}'), - nl, - write('stackpushes = {'), - nl, - ( - enumerate(insn_mode(M), Opcode, 1), - objdump_stackpushes(M, P), - format(' ~d: ~d,\n', [Opcode, P]), - fail - ; - write('}'), - nl, - write('chainable = {'), - nl, - ( - enumerate(insn_mode(M), Opcode, 1), - objdump_chainables(M), - format(' ~d: 1,\n', [Opcode]), - fail - ; - write('}'), - nl))). - - -% generate all files -main_emit :- - tell('insns-igen-h.i'), main_emit(insns, headers('EXTERNFN ')), told, - tell('insns-igen.i'), main_emit(insns, functions('DEFINEFN ')), told, - tell('insns-threaded.i'), main_emit(modes, threaded(absolute)), told, - tell('insns-switch.i'), main_emit(modes, switch), told, - tell('insns-table.py'), main_emit(pytable), told. diff --git a/nodebox/ext/psyco/src/c/linuxmemchk.c b/nodebox/ext/psyco/src/c/linuxmemchk.c deleted file mode 100644 index ae16493..0000000 --- a/nodebox/ext/psyco/src/c/linuxmemchk.c +++ /dev/null @@ -1,102 +0,0 @@ -/* custom checking allocators a la Electric Fence */ -#include "linuxmemchk.h" -#if HEAVY_MEM_CHECK -#undef NDEBUG -#include -#include -#include -#include -#include -#include -#include -#define PAGESIZE 4096 -#ifndef MALLOC_BIGBUFFER -# define MALLOC_BIGBUFFER PAGESIZE*16384 -#endif - - -struct _alloc_s { - void* ptr; - int npages; -}; -static void* _na_start = NULL; -static char* _na_cur; - -static struct _alloc_s* _na_find(void* data) -{ - int err; - long data1; - struct _alloc_s* s; - assert(_na_start+PAGESIZE <= data && - data < _na_start+MALLOC_BIGBUFFER-PAGESIZE); - data1 = (long) data; - data1 &= ~(PAGESIZE-1); - data1 -= PAGESIZE; - err = mprotect((void*) data1, PAGESIZE, PROT_READ|PROT_WRITE); - assert(!err); - s = (struct _alloc_s*) data1; - assert(s->npages > 0); - return s; -} - -DEFINEFN -void* memchk_ef_malloc(int size) -{ - int err, npages = (size + PAGESIZE-1) / PAGESIZE + 1; - struct _alloc_s* s; - char* data; - if (_na_start == NULL) - { - _na_start = mmap(NULL, MALLOC_BIGBUFFER, PROT_NONE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - assert(_na_start != MAP_FAILED); - _na_cur = (char*) _na_start; - } - s = (struct _alloc_s*) _na_cur; - _na_cur += npages * PAGESIZE; - if (_na_cur >= ((char*) _na_start) + MALLOC_BIGBUFFER) - { - fprintf(stderr, "Nothing wrong so far, but MALLOC_CHECK is running out\n of mmap'ed memory. Increase MALLOC_BIGBUFFER.\n"); - assert(0); - } - err = mprotect(s, npages * PAGESIZE, PROT_READ|PROT_WRITE|PROT_EXEC); - assert(!err); - s->ptr = data = _na_cur - /*((size+3)&~3)*/ size; - s->npages = npages; - err = mprotect(s, PAGESIZE, PROT_NONE); - assert(!err); - return data; -} - -DEFINEFN -void memchk_ef_free(void* data) -{ - int err, npages; - struct _alloc_s* s; - if (data == NULL) - return; - s = _na_find(data); - assert(s->ptr == data); - npages = s->npages; - s->npages = 0; - err = mprotect(s, npages * PAGESIZE, PROT_NONE); - assert(!err); - //fprintf(stderr, "PyMem_FREE(%p): mprotect %p %x\n", data, s, npages*PAGESIZE); -} - -DEFINEFN -void* memchk_ef_realloc(void* data, int nsize) -{ - int size; - struct _alloc_s* s = _na_find(data); - void* ndata = PyMem_MALLOC(nsize); - - assert(s->ptr == data); - size = ((char*)s) + s->npages * PAGESIZE - (char*)data; - memcpy(ndata, data, size -#undef PyMem_MALLOC -#undef PyMem_REALLOC -#undef PyMem_FREE - -EXTERNFN void* memchk_ef_malloc(int size); -EXTERNFN void memchk_ef_free(void* data); -EXTERNFN void* memchk_ef_realloc(void* data, int nsize); - -#define PyMem_MALLOC memchk_ef_malloc -#define PyMem_REALLOC memchk_ef_realloc -#define PyMem_FREE memchk_ef_free - -#endif diff --git a/nodebox/ext/psyco/src/c/mergepoints.c b/nodebox/ext/psyco/src/c/mergepoints.c deleted file mode 100644 index 4b08701..0000000 --- a/nodebox/ext/psyco/src/c/mergepoints.c +++ /dev/null @@ -1,947 +0,0 @@ -#include "mergepoints.h" -#include "vcompiler.h" -#include "stats.h" -#include "Python/pycinternal.h" - -/* set to 1 to compute the detailed control flow - which allows for early variable deletion */ -#define FULL_CONTROL_FLOW 1 -#define DUMP_CONTROL_FLOW 0 - -/* the list of builtins whose usage should disable control flow - because they use the current frame's locals */ -static char* NoControlFlowIfBuiltin[] = { - "eval", "execfile", "locals", "vars", "dir", "input", - NULL -}; - -#define CONFLUENCE_TOTAL_DELAY 3 /* see comments in the code */ -#define INLINE_MAXIMUM_WEIGHT 6 /* see comments in the code */ - - - /***************************************************************/ -/*** Tables of code merge points ***/ - /***************************************************************/ - -/* for each code object we build a bitarray specifying which - positions in the byte code are potential merge points. - A "merge point" is an instruction which can be executed - immediately after two or more other instructions, - typically jump targets. - - The respawn mecanisms (see psyco_prepare_respawn()) require - that a merge point be also added after each instruction - whose produced machine code might depend on external data. - We should also avoid too long uninterrupted ranges of - instructions without a single merge point. -*/ - -/* instructions that cause an unconditional jump: */ -#define IS_JUMP_INSTR(op) (op == BREAK_LOOP || \ - op == RETURN_VALUE || \ - op == JUMP_FORWARD || \ - op == JUMP_ABSOLUTE || \ - op == CONTINUE_LOOP || \ - op == RAISE_VARARGS || \ - IS_EPILOGUE_INSTR(op)) - -/* instructions with a target: */ -#define HAS_JREL_INSTR(op) (op == JUMP_FORWARD || \ - op == JUMP_IF_FALSE || \ - op == JUMP_IF_TRUE || \ - op == FOR_ITER || \ - /* SETUP_LOOP replaced by FOR_ITER */ \ - op == SETUP_EXCEPT || \ - op == SETUP_FINALLY) - -#define HAS_JABS_INSTR(op) (op == JUMP_ABSOLUTE || \ - op == CONTINUE_LOOP) - -/* instructions whose target may be jumped to several times: */ -#define HAS_J_MULTIPLE(op) (op == FOR_ITER || \ - /* SETUP_LOOP replaced by FOR_ITER */ \ - op == SETUP_EXCEPT || \ - op == SETUP_FINALLY) - -/* instructions through which it is not safe to respawn: - LOAD_GLOBAL may produce a run-time or various compile-time values - each time it is respawned */ -#define IS_CTXDEP_INSTR(op) (op == LOAD_GLOBAL || \ - op == LOAD_NAME) - -#define MAX_UNINTERRUPTED_RANGE 170 /* bytecode instructions */ - -/* opcodes that never or seldom produce machine code are listed as - lightweight instructions and don't account for the mesured code weight. */ -#define IS_LIGHT_INSTR(op) (IS_JUMP_INSTR(op) || \ - HAS_JREL_INSTR(op) || \ - HAS_JABS_INSTR(op) || \ - IS_SET_LINENO(op) || \ - IS_NOP(op) || \ - op == POP_TOP || \ - op == ROT_TWO || \ - op == ROT_THREE || \ - op == ROT_FOUR || \ - op == DUP_TOP || \ - op == DUP_TOPX || \ - op == POP_BLOCK || \ - op == END_FINALLY || \ - op == LOAD_CONST || \ - op == LOAD_FAST || \ - op == STORE_FAST || \ - op == DELETE_FAST || \ - op == UNPACK_SEQUENCE || \ - op == BUILD_TUPLE || \ - op == BUILD_LIST || \ - op == BUILD_MAP) - -/* opcodes that can only be compiled at module top-level, - when locals() is globals() */ -#define IS_MODULE_INSTR(op) (op == STORE_NAME || \ - op == DELETE_NAME || \ - op == LOAD_NAME || \ - op == IMPORT_STAR) - -/* all other supported instructions must be listed here. */ -#define OTHER_OPCODE(op) (op == UNARY_POSITIVE || \ - op == UNARY_NEGATIVE || \ - op == UNARY_NOT || \ - op == UNARY_CONVERT || \ - op == UNARY_INVERT || \ - op == BINARY_POWER || \ - op == BINARY_MULTIPLY || \ - op == BINARY_DIVIDE || \ - op == BINARY_MODULO || \ - op == BINARY_ADD || \ - op == BINARY_SUBTRACT || \ - op == BINARY_SUBSCR || \ - op == BINARY_LSHIFT || \ - op == BINARY_RSHIFT || \ - op == BINARY_AND || \ - op == BINARY_XOR || \ - op == BINARY_OR || \ - op == BINARY_FLOOR_DIVIDE || \ - op == BINARY_TRUE_DIVIDE || \ - op == INPLACE_FLOOR_DIVIDE || \ - op == INPLACE_TRUE_DIVIDE || \ - IS_LIST_APPEND(op) || \ - op == INPLACE_POWER || \ - op == INPLACE_MULTIPLY || \ - op == INPLACE_DIVIDE || \ - op == INPLACE_MODULO || \ - op == INPLACE_ADD || \ - op == INPLACE_SUBTRACT || \ - op == INPLACE_LSHIFT || \ - op == INPLACE_RSHIFT || \ - op == INPLACE_AND || \ - op == INPLACE_XOR || \ - op == INPLACE_OR || \ - op == SLICE+0 || \ - op == SLICE+1 || \ - op == SLICE+2 || \ - op == SLICE+3 || \ - op == STORE_SLICE+0 || \ - op == STORE_SLICE+1 || \ - op == STORE_SLICE+2 || \ - op == STORE_SLICE+3 || \ - op == DELETE_SLICE+0 || \ - op == DELETE_SLICE+1 || \ - op == DELETE_SLICE+2 || \ - op == DELETE_SLICE+3 || \ - op == STORE_SUBSCR || \ - op == DELETE_SUBSCR || \ - op == PRINT_EXPR || \ - op == PRINT_ITEM || \ - op == PRINT_ITEM_TO || \ - op == PRINT_NEWLINE || \ - op == PRINT_NEWLINE_TO || \ - op == BUILD_CLASS || \ - op == STORE_ATTR || \ - op == DELETE_ATTR || \ - op == STORE_GLOBAL || \ - op == DELETE_GLOBAL || \ - op == LOAD_GLOBAL || \ - op == LOAD_ATTR || \ - /* COMPARE_OP special-cased */ \ - op == IMPORT_NAME || \ - op == IMPORT_FROM || \ - op == GET_ITER || \ - op == CALL_FUNCTION || \ - op == CALL_FUNCTION_VAR || \ - op == CALL_FUNCTION_KW || \ - op == CALL_FUNCTION_VAR_KW || \ - op == MAKE_FUNCTION || \ - op == BUILD_SLICE || \ - op == SETUP_LOOP) - -#define SUPPORTED_COMPARE_ARG(oparg) ( \ - (oparg) == Py_LT || \ - (oparg) == Py_LE || \ - (oparg) == Py_EQ || \ - (oparg) == Py_NE || \ - (oparg) == Py_GT || \ - (oparg) == Py_GE || \ - (oparg) == PyCmp_IS || \ - (oparg) == PyCmp_IS_NOT || \ - (oparg) == PyCmp_IN || \ - (oparg) == PyCmp_NOT_IN || \ - (oparg) == PyCmp_EXC_MATCH || \ - 0) - - /***************************************************************/ - -#ifdef RETURN_NONE -# define IS_EPILOGUE_INSTR(op) (op == RETURN_NONE) -#else -# define IS_EPILOGUE_INSTR(op) 0 -#endif - -#ifdef SET_LINENO -# define IS_SET_LINENO(op) (op == SET_LINENO) -#else -# define IS_SET_LINENO(op) 0 -#endif - -#ifdef NOP -# define IS_NOP(op) (op == NOP) -#else -# define IS_NOP(op) 0 -#endif - -#ifdef LIST_APPEND -# define IS_LIST_APPEND(op) (op == LIST_APPEND) -#else -# define IS_LIST_APPEND(op) 0 -#endif - -/***************************************************************/ - - -#define MP_OTHER 0x01 -#define MP_IS_JUMP 0x02 -#define MP_HAS_JREL 0x04 -#define MP_HAS_JABS 0x08 -#define MP_HAS_J_MULTIPLE 0x10 -#define MP_LIGHT 0x20 -#define MP_IS_CTXDEP 0x40 -#define MP_IS_MODULE 0x80 - -#define F(op) ((IS_JUMP_INSTR(op) ? MP_IS_JUMP : 0) | \ - (HAS_JREL_INSTR(op) ? MP_HAS_JREL : 0) | \ - (HAS_JABS_INSTR(op) ? MP_HAS_JABS : 0) | \ - (HAS_J_MULTIPLE(op) ? MP_HAS_J_MULTIPLE : 0) | \ - (IS_LIGHT_INSTR(op) ? MP_LIGHT : 0) | \ - (IS_CTXDEP_INSTR(op) ? MP_IS_CTXDEP : 0) | \ - (IS_MODULE_INSTR(op) ? MP_IS_MODULE : 0) | \ - (OTHER_OPCODE(op) ? MP_OTHER : 0)) - -/* opcode table -- the preprocessor expands this into several hundreds KB - of code (which reduces down to 256 bytes!). Hopefully not a problem - for modern C compilers */ -static const unsigned char instr_control_flow[256] = { - F(0x00), F(0x01), F(0x02), F(0x03), F(0x04), F(0x05), F(0x06), F(0x07), - F(0x08), F(0x09), F(0x0A), F(0x0B), F(0x0C), F(0x0D), F(0x0E), F(0x0F), - F(0x10), F(0x11), F(0x12), F(0x13), F(0x14), F(0x15), F(0x16), F(0x17), - F(0x18), F(0x19), F(0x1A), F(0x1B), F(0x1C), F(0x1D), F(0x1E), F(0x1F), - F(0x20), F(0x21), F(0x22), F(0x23), F(0x24), F(0x25), F(0x26), F(0x27), - F(0x28), F(0x29), F(0x2A), F(0x2B), F(0x2C), F(0x2D), F(0x2E), F(0x2F), - F(0x30), F(0x31), F(0x32), F(0x33), F(0x34), F(0x35), F(0x36), F(0x37), - F(0x38), F(0x39), F(0x3A), F(0x3B), F(0x3C), F(0x3D), F(0x3E), F(0x3F), - F(0x40), F(0x41), F(0x42), F(0x43), F(0x44), F(0x45), F(0x46), F(0x47), - F(0x48), F(0x49), F(0x4A), F(0x4B), F(0x4C), F(0x4D), F(0x4E), F(0x4F), - F(0x50), F(0x51), F(0x52), F(0x53), F(0x54), F(0x55), F(0x56), F(0x57), - F(0x58), F(0x59), F(0x5A), F(0x5B), F(0x5C), F(0x5D), F(0x5E), F(0x5F), - F(0x60), F(0x61), F(0x62), F(0x63), F(0x64), F(0x65), F(0x66), F(0x67), - F(0x68), F(0x69), F(0x6A), F(0x6B), F(0x6C), F(0x6D), F(0x6E), F(0x6F), - F(0x70), F(0x71), F(0x72), F(0x73), F(0x74), F(0x75), F(0x76), F(0x77), - F(0x78), F(0x79), F(0x7A), F(0x7B), F(0x7C), F(0x7D), F(0x7E), F(0x7F), - F(0x80), F(0x81), F(0x82), F(0x83), F(0x84), F(0x85), F(0x86), F(0x87), - F(0x88), F(0x89), F(0x8A), F(0x8B), F(0x8C), F(0x8D), F(0x8E), F(0x8F), - F(0x90), F(0x91), F(0x92), F(0x93), F(0x94), F(0x95), F(0x96), F(0x97), - F(0x98), F(0x99), F(0x9A), F(0x9B), F(0x9C), F(0x9D), F(0x9E), F(0x9F), - F(0xA0), F(0xA1), F(0xA2), F(0xA3), F(0xA4), F(0xA5), F(0xA6), F(0xA7), - F(0xA8), F(0xA9), F(0xAA), F(0xAB), F(0xAC), F(0xAD), F(0xAE), F(0xAF), - F(0xB0), F(0xB1), F(0xB2), F(0xB3), F(0xB4), F(0xB5), F(0xB6), F(0xB7), - F(0xB8), F(0xB9), F(0xBA), F(0xBB), F(0xBC), F(0xBD), F(0xBE), F(0xBF), - F(0xC0), F(0xC1), F(0xC2), F(0xC3), F(0xC4), F(0xC5), F(0xC6), F(0xC7), - F(0xC8), F(0xC9), F(0xCA), F(0xCB), F(0xCC), F(0xCD), F(0xCE), F(0xCF), - F(0xD0), F(0xD1), F(0xD2), F(0xD3), F(0xD4), F(0xD5), F(0xD6), F(0xD7), - F(0xD8), F(0xD9), F(0xDA), F(0xDB), F(0xDC), F(0xDD), F(0xDE), F(0xDF), - F(0xE0), F(0xE1), F(0xE2), F(0xE3), F(0xE4), F(0xE5), F(0xE6), F(0xE7), - F(0xE8), F(0xE9), F(0xEA), F(0xEB), F(0xEC), F(0xED), F(0xEE), F(0xEF), - F(0xF0), F(0xF1), F(0xF2), F(0xF3), F(0xF4), F(0xF5), F(0xF6), F(0xF7), - F(0xF8), F(0xF9), F(0xFA), F(0xFB), F(0xFC), F(0xFD), F(0xFE), F(0xFF), -}; -#undef F - - -struct instrnode_s { - struct instrnode_s* next1; /* next instruction */ - struct instrnode_s* next2; /* next instr (jump target) */ - struct instrnode_s* next3; /* next instr (exception handler) */ - unsigned char opcode; /* copy of the instruction opcode */ - unsigned char back; /* # of bytes to go back to find the instruction */ - unsigned char inpaths; /* number of incoming paths to this point */ - unsigned char pending; /* parse bytecode pending */ - global_entries_t* mp; /* set a mergepoint here? (see MPSET_XXX) */ - int mask; /* mask of bits for needed variables */ - int storemask; /* mask of bits for stored variables */ -}; - -#define MPSET_NEVER ((global_entries_t*) NULL) -#define MPSET_MAYBE ((global_entries_t*) -1) -#define MPSET_YES ((global_entries_t*) -2) -#define MPSET_FORCE ((global_entries_t*) -3) - - -/***************************************************************/ -#if FULL_CONTROL_FLOW - -/* how many variables fit in the 'int' bitfield of instrnode_s */ -#define VARS_PER_PASS (sizeof(int)*8-1) - -PSY_INLINE bool back_propagate_mask(struct instrnode_s* instrnodes, - struct instrnode_s* node, - int var0) -{ - bool modif = false; - int prevmask, mask, oparg; - while (node > instrnodes) - { - node--; - oparg = node->mask; - node -= node->back; /* skip back argument */ - if (node->next1 != NULL) - { - prevmask = mask = node->mask; - mask |= node->next1->mask; - /*fprintf(stderr, "propagate1 %d <- %d\n", - node-instrnodes, node->next1-instrnodes);*/ - if (node->next2 != NULL) - { - mask |= node->next2->mask; - /*fprintf(stderr, "propagate2 %d <- %d\n", - node-instrnodes, node->next1-instrnodes);*/ - if (node->next3 != NULL) { - mask |= node->next3->mask; - /*fprintf(stderr, "propagate3 %d <- %d\n", - node-instrnodes, node->next1-instrnodes);*/ - } - } - if (node->opcode == STORE_FAST) - { - int bit = oparg - var0; - if (0 <= bit && bit < VARS_PER_PASS) - mask &= ~(1< %x\n", - node-instrnodes, mask, node->mask);*/ - node->mask = mask; - modif = true; - } - } - - } - return modif; -} - -PSY_INLINE void mark_var_uses(struct instrnode_s* instrnodes, - struct instrnode_s* node, - int var0) -{ - while (node > instrnodes) - { - int m1 = 1<back) - { - int oparg = node->mask; - node -= node->back; /* skip back argument */ - if (node->opcode == LOAD_FAST || node->opcode == DELETE_FAST) - { - int bit = oparg - var0; - if (0 <= bit && bit < VARS_PER_PASS) - m1 |= (1<mask = m1; - node->storemask = 0; - } -} - -PSY_INLINE int function_args_mask(int var0, int ninitialized) -{ - int bits = ninitialized - var0; - if (bits <= 0) - return 0; - else if (bits >= VARS_PER_PASS) - return -1; - else - return (1<storemask) != node->storemask) - { - node->storemask = newmask; - if (!node->next1) - break; - if (node->mp) - { - /* at each mergepoint, we only keep variables that are - also present in mode->mask. */ - newmask &= node->mask; - } - if (node->opcode == STORE_FAST) - { - /* after each STORE_FAST, add the corresponding bit into newmask */ - int oparg = node[1].mask; - int bit = oparg - var0; - if (0 <= bit && bit < VARS_PER_PASS) - newmask |= (1<next2) - { - forward_propagate(node->next2, newmask, var0); - if (node->next3) - forward_propagate(node->next3, newmask, var0); - } - node = node->next1; - } -} - -PSY_INLINE void find_unused_vars(struct instrnode_s* instrnodes, - struct instrnode_s* node, - int var0) -{ - while (node > instrnodes) - { - node--; - node -= node->back; /* skip back argument */ - if (node->mp) - { - /* if at that mergepoint we have no use for a variable, - write a note to say it can be deleted. */ - int remove = node->storemask & ~node->mask; - int i; - psyco_assert(node->mask & (1<>=1) - if (remove & 1) - psyco_ge_unused_var(node->mp, i); - } - } -} - -static void analyse_variables(struct instrnode_s* instrnodes, - struct instrnode_s* end, - PyCodeObject* co) -{ - int var0; - int nlocals = co->co_nlocals; - int ninitialized = co->co_argcount; - if (co->co_flags & CO_VARKEYWORDS) ninitialized++; - if (co->co_flags & CO_VARARGS) ninitialized++; - - for (var0 = 0; var0 < nlocals; var0 += VARS_PER_PASS) - { - mark_var_uses(instrnodes, end, var0); - while (back_propagate_mask(instrnodes, end, var0)) - ; - forward_propagate(instrnodes, (function_args_mask(var0, ninitialized) | - (1<mp) - { - PyObject* plist = instrnodes->mp->fatlist; - int j; - fprintf(stderr, " line %d: %d ", PyCode_Addr2Line(co, i), i); - for (j=0; jco_varnames, num); - fprintf(stderr, " [%s]", PyString_AsString(o1)); - } - fprintf(stderr, "\n"); - } - } -#endif -} - -#endif /* FULL_CONTROL_FLOW */ -/***************************************************************/ - - -DEFINEFN -PyObject* psyco_build_merge_points(PyCodeObject* co, int module) -{ - PyObject* s; - mergepoint_t* mp; - int mp_flags = MP_FLAGS_EXTRA; - int length = PyString_GET_SIZE(co->co_code); - unsigned char* source = (unsigned char*) PyString_AS_STRING(co->co_code); - size_t ibytes = (length+1) * sizeof(struct instrnode_s); - struct instrnode_s* instrnodes; - int i, lasti, count; - bool modif; - PyTryBlock blockstack[CO_MAXBLOCKS]; - int iblock, bytecodeweight, iblockmax = 0; - bool valid_controlflow = true; - PyObject *etype, *evalue, *etb; - - if (length == 0) - { - /* normally a code object's code string is never empty, - but pyexpat.c has some hacks that we have to work around */ - Py_INCREF(Py_None); - return Py_None; - } -#ifdef CO_GENERATOR - /* check for this flag -- it is not enough to check for the presence of - a YIELD_VALUE instruction because such an instruction might exist but - be unreachable. */ - if (co->co_flags & CO_GENERATOR) - { - debug_printf(1 + (strcmp(PyCodeObject_NAME(co), "?")==0), - ("unsupported generator at %s\n", - PyCodeObject_NAME(co))); - Py_INCREF(Py_None); - return Py_None; - } -#endif /* CO_GENERATOR */ - - instrnodes = (struct instrnode_s*) PyMem_MALLOC(ibytes); - if (instrnodes == NULL) - OUT_OF_MEMORY(); - memset(instrnodes, 0, ibytes); - - PyErr_Fetch(&etype, &evalue, &etb); - - /* parse the bytecode once, filling the instrnodes[].opcode,back,mask fields */ - iblock = 0; - for (i=0; i iblockmax) iblockmax = iblock; - break; - - case POP_BLOCK: - psyco_assert(iblock > 0); - iblock--; - break; - - case BREAK_LOOP: - /* break the innermost loop */ - btop = iblock; - do { - psyco_assert(btop>0); - btop--; - } while (blockstack[btop].b_type != SETUP_LOOP && - blockstack[btop].b_type != SETUP_FINALLY); - /* jump to the loop bottom or finally handler */ - instrnodes[i0].next3 = instrnodes + blockstack[btop].b_handler; - if (blockstack[btop].b_type != SETUP_LOOP) - { /* argh, this gets messy */ - /* because END_FINALLY will then jump to the loop bottom */ - valid_controlflow = false; - } - break; - - case CONTINUE_LOOP: - btop = iblock; - do { - psyco_assert(btop>0); - btop--; - } while (blockstack[btop].b_type != SETUP_LOOP && - blockstack[btop].b_type != SETUP_FINALLY); - if (blockstack[btop].b_type == SETUP_LOOP) - { /* jump to the loop head */ - instrnodes[i0].next3 = instrnodes + oparg; - } - else - { /* argh, this gets messy */ - instrnodes[i0].next3 = instrnodes + blockstack[btop].b_handler; - valid_controlflow = false; - } - break; - - case LOAD_GLOBAL: - case LOAD_NAME: - { - PyObject* namev = PyTuple_GET_ITEM(co->co_names, oparg); - char** p; - for (p = NoControlFlowIfBuiltin; *p; p++) - if (strcmp(PyString_AS_STRING(namev), *p) == 0) - valid_controlflow = false; - } - break; - } - } - if (iblock != 0) - valid_controlflow = false; /* ?? */ - - /* control flow analysis */ - bytecodeweight = 0; - instrnodes[0].pending = 1; - do - { - modif = false; - for (i=0; ipending |= 1; - if (instrnodes[i].next2 != NULL) - { - instrnodes[i].next2->pending |= 1; - if (instrnodes[i].next3 != NULL) - instrnodes[i].next3->pending |= 1; - } - } - instrnodes[i].pending = 3; /* the current instruction is done */ - modif = true; - } - } while (modif); - - /* check with the user-defined filter function, if any */ - if (psyco_codeobj_filter_fn != NULL) - { - int res; - PyObject* o = PyObject_CallFunction(psyco_codeobj_filter_fn, "O", - (PyObject*) co); - res = o == NULL ? -1 : PyObject_IsTrue(o); - Py_XDECREF(o); - if (res < 0) - PyErr_WriteUnraisable(psyco_codeobj_filter_fn); - if (res <= 0) - { - s = Py_None; - Py_INCREF(s); - goto done; - } - } - - /* set and count merge points */ - /* a confluence point is an instruction with more than one incoming path */ - /* a merge point is generally set for each confluence point, but it may be - set a bit later than the actual confluence point or completely - omitted if there is another confluence point just after */ - - /* ensure there are confluence points at regular intervals */ - lasti = MAX_UNINTERRUPTED_RANGE; - for (i=1; i 0) - { - if (instrnodes[i].inpaths >= 2) - lasti = MAX_UNINTERRUPTED_RANGE; /* fine */ - else - if (!--lasti) - { - /* it's been too long, force a confluence point */ - instrnodes[i].inpaths = 99; - } - } - - instrnodes[0].inpaths = 99; - instrnodes[0].mp = MPSET_YES; /* there is a merge point at the beginning */ - count = 1; - { - /* the "weight" of a confluence point is the number of important - intructions that have to be done to reach the next confluence point. - It may be zero. The un-important instructions are listed in - IS_LIGHT_INSTR() and are marked MPSET_NEVER. - Some confluence points need not induce a merge point, but the total - weight of such omitted confluence points must not exceed - CONFLUENCE_TOTAL_DELAY. */ - - /* Confluence points of weight zero are stripped right away. - 'cpnodes' is a list of the best non-null lightweight confluence points, - sorted by weight, ended by a sentinel with cpnodes==NULL and cpweight== - CONFLUENCE_TOTAL_DELAY+1 - (sum of the previous cpweights). */ - struct instrnode_s* cpnodes[CONFLUENCE_TOTAL_DELAY+1]; - int cpweight[CONFLUENCE_TOTAL_DELAY+1]; - int weight, insertat, nextweight, insertweight; - struct instrnode_s* node; - struct instrnode_s* mpnode; - struct instrnode_s* nextnode; - cpnodes[0] = NULL; - cpweight[0] = CONFLUENCE_TOTAL_DELAY+1; - for (i=1; i= 2) /* confluence point */ - { - /* compute the weight */ - weight = 0; - insertat = 0; - mpnode = node = instrnodes + i; - if (mpnode->mp == MPSET_FORCE) - goto set_merge_point; - - while (1) - { - if (node->next2 != NULL) - goto set_merge_point; /* give up in case of fork */ - node = node->next1; - if (node == NULL || node->inpaths >= 2) - break; - if (node->mp == MPSET_MAYBE) - { - /* skipping over an important instruction */ - weight++; - while (weight >= cpweight[insertat]) - { - if (cpnodes[insertat] == NULL) /* sentinel */ - goto set_merge_point; /* too heavy, give up */ - insertat++; - } - } - } - /* reached the next confluence point or the end of the code */ - if (weight > 0) - { - /* record the confluence point */ - insertweight = weight; - do - { - nextnode = cpnodes [insertat]; - nextweight = cpweight[insertat]; - cpnodes [insertat] = mpnode; - cpweight[insertat] = insertweight; - mpnode = nextnode; - insertweight = nextweight; - insertat++; - } - while (mpnode != NULL); /* sentinel */ - - if (insertweight > weight) - { - /* no need to discard a confluence point, the - total weight is still low enough */ - cpnodes [insertat] = NULL; - cpweight[insertat] = insertweight - weight; - } - else - { - /* total weight exceeded, force the latest (heaviest) - confluence point into a merge point */ - insertat--; - mpnode = cpnodes[insertat]; - cpnodes [insertat] = NULL; - cpweight[insertat] += insertweight - weight; - extra_assert(cpweight[insertat] >= 1); - goto set_merge_point; - } - } - /* if we get here, the merge point is not needed */ - continue; - - set_merge_point: - mpnode->mp = MPSET_YES; - count++; - } - /* confluence points left in 'cpnodes' are discarded */ - } - -/* { */ -/* static int stats = 0, statsc = 0; */ -/* stats++; */ -/* statsc += count; */ -/* fprintf(stderr, "%d mergepoints in %d code obj\n", statsc, stats); */ -/* } */ - - /* inlinable functions are those not too heavy, with no merge point - after the mandatory first one, and with no iblock stack use */ - if (count == 1 && bytecodeweight <= INLINE_MAXIMUM_WEIGHT && iblockmax == 0) - { - mp_flags |= MP_FLAGS_INLINABLE; - debug_printf(2, ("inlining code object '%s'\n", PyCodeObject_NAME(co))); - } - - /* allocate the string buffer, one mergepoint_t per merge point plus - the room for a final negative bitfield flags. */ - ibytes = count * sizeof(mergepoint_t) + sizeof(int); - s = PyString_FromStringAndSize(NULL, ibytes); - if (s == NULL) - OUT_OF_MEMORY(); - mp = (mergepoint_t*) PyString_AS_STRING(s); - - for (i=0; ibytecode_position = i; - instrnodes[i].mp = &mp->entries; - psyco_ge_init(&mp->entries); - mp++; - } - } - extra_assert(mp - (mergepoint_t*) PyString_AS_STRING(s) == count); - mp->bytecode_position = mp_flags; -#if FULL_CONTROL_FLOW - if (valid_controlflow) - { - mp->bytecode_position |= MP_FLAGS_CONTROLFLOW; - analyse_variables(instrnodes, instrnodes+length, co); - } -#endif - - done: - PyMem_FREE(instrnodes); - PyErr_Restore(etype, evalue, etb); - return s; -} - -DEFINEFN -mergepoint_t* psyco_next_merge_point(PyObject* mergepoints, - int position) -{ - mergepoint_t* array; - int bufsize; - extra_assert(PyString_Check(mergepoints)); - array = (mergepoint_t*) PyString_AS_STRING(mergepoints); - bufsize = PyString_GET_SIZE(mergepoints); - extra_assert((bufsize % sizeof(mergepoint_t)) == sizeof(int)); - bufsize /= sizeof(mergepoint_t); - extra_assert(bufsize > 0); - do { - int test = bufsize/2; - if (position > array[test].bytecode_position) - { - ++test; - array += test; - bufsize -= test; - } - else - { - bufsize = test; - } - } while (bufsize > 0); - return array; -} - -DEFINEFN -PyObject* psyco_get_merge_points(PyCodeObject* co, int module) -{ - return PyCodeStats_MergePoints(PyCodeStats_Get(co), module); -} - -DEFINEVAR PyObject* psyco_codeobj_filter_fn = NULL; diff --git a/nodebox/ext/psyco/src/c/mergepoints.h b/nodebox/ext/psyco/src/c/mergepoints.h deleted file mode 100644 index 415c2c1..0000000 --- a/nodebox/ext/psyco/src/c/mergepoints.h +++ /dev/null @@ -1,89 +0,0 @@ - /***************************************************************/ -/*** Tables of code merge points ***/ - /***************************************************************/ - -#ifndef _MERGEPOINTS_H -#define _MERGEPOINTS_H - - -#include "psyco.h" -#include "dispatcher.h" -#include - -/* A merge point is a point reached by two or more control paths in - the bytecode. They are a subset of the targets found by the standard - module function dis.findlabels(). It may be a subset because some - targets can only be reached by jumping from a single point, e.g. 'else:'. - Such targets are not merge points. -*/ - -struct mergepoint_s { - int bytecode_position; - global_entries_t entries; -}; - -/* 'bytecode_ptr' gives the position of the merge point in the bytecode. - An array of mergepoint_t structures is sorted against this field. - - 'entries' is a list of snapshots of the compiler states previously - encountered at this point. -*/ - -/* Caching version of the following function */ -EXTERNFN PyObject* psyco_get_merge_points(PyCodeObject* co, int module); - -/* The following function detects the merge points and builds an array of - mergepoint_t structures, stored into a Python string object. It returns - Py_None if the bytecode uses unsupported instructions. */ -EXTERNFN PyObject* psyco_build_merge_points(PyCodeObject* co, int module); - -/* Get a pointer to the first mergepoint_t structure in the array whose - 'bytecode_ptr' is >= position. */ -EXTERNFN mergepoint_t* psyco_next_merge_point(PyObject* mergepoints, - int position); - -/* Get a pointer to the very first mergepoint_t structure in the array */ -PSY_INLINE mergepoint_t* psyco_first_merge_point(PyObject* mergepoints) -{ - extra_assert(PyString_Check(mergepoints)); - return (mergepoint_t*) PyString_AS_STRING(mergepoints); -} - -/* Same as psyco_next_merge_point() but returns NULL if bytecode_ptr!=position */ -PSY_INLINE mergepoint_t* psyco_exact_merge_point(PyObject* mergepoints, - int position) -{ - mergepoint_t* mp = psyco_next_merge_point(mergepoints, position); - if (mp->bytecode_position != position) - mp = NULL; - return mp; -} - - -#define MP_FLAGS_HAS_EXCEPT 1 /* the code block has an 'except' clause */ -#define MP_FLAGS_HAS_FINALLY 2 /* the code block has a 'finally' clause */ -#define MP_FLAGS_INLINABLE 4 /* function could be inlined */ -#define MP_FLAGS_MODULE 8 /* can only run as module top-level code */ -#define MP_FLAGS_CONTROLFLOW 16 /* can use early deletion of locals */ -#define MP_FLAGS_EXTRA (-256) - -PSY_INLINE int psyco_mp_flags(PyObject* mergepoints) -{ - char* endptr = PyString_AS_STRING(mergepoints)+PyString_GET_SIZE(mergepoints); - return ((int*) endptr)[-1]; -} - -/* end of PsycoObject construction */ -PSY_INLINE mergepoint_t* PsycoObject_Ready(PsycoObject* po) { - mergepoint_t* mp; - psyco_assert_coherent(po); - mp = psyco_first_merge_point(po->pr.merge_points); - psyco_delete_unused_vars(po, &mp->entries); - return mp; -} - -/* A user-defined filter function to prevent compilation of some code objs */ -EXTERNVAR PyObject* psyco_codeobj_filter_fn; - - -#endif /* _MERGEPOINTS_H */ diff --git a/nodebox/ext/psyco/src/c/mkincl.py b/nodebox/ext/psyco/src/c/mkincl.py deleted file mode 100644 index 5f69558..0000000 --- a/nodebox/ext/psyco/src/c/mkincl.py +++ /dev/null @@ -1,16 +0,0 @@ -import sys, os - -def getincl(): - PY_VER = sys.version[:3] - for p in (sys.prefix, sys.exec_prefix): - if sys.executable.startswith(p): - return [os.path.join(sys.prefix, 'include', 'python'+PY_VER)] - base = os.path.dirname(sys.executable) - if os.path.exists(os.path.join(base, 'Include')): - return [os.path.join(base, 'Include'), base, os.path.join(base, 'Stackless')] - raise IOError, 'cannot find the include directories for %s' % sys.executable - -INCLUDE_STR = ' '.join(['-I%s' % s for s in getincl()]) - -if __name__ == '__main__': - print INCLUDE_STR diff --git a/nodebox/ext/psyco/src/c/mychecker.py b/nodebox/ext/psyco/src/c/mychecker.py deleted file mode 100644 index 3e85d9d..0000000 --- a/nodebox/ext/psyco/src/c/mychecker.py +++ /dev/null @@ -1,78 +0,0 @@ -import re, dis -recase = re.compile(r'case\s+([A-Z_][A-Z_+0-9]*)\s*[:]') -rebin = re.compile(r'BINARY_OPCODE[(]([A-Z_][A-Z_+0-9]*),') -remiss = re.compile(r'[/*]*MISSING_OPCODE[(]([A-Z_][A-Z_+0-9]*)[)]') - -if dis.opname[86] == 'YIELD_STMT': - dis.opname[86] = 'YIELD_VALUE' - -inswitch = 0 -lst = [] -miss = [] -warn = 0 - -def register(op): - global warn - print "%29s" % op, - if op not in lst: - lst.append(op) - if op not in dis.opname: - print "%29s" % "<--- unknown opcode", - #warn += 1 - print - -print "+++ Found +++" -print - -for line in open('Python/pycompiler.c').readlines(): - line = line.strip() - if line.startswith('switch (opcode)'): - inswitch = 1 - elif line.endswith('/* switch (opcode) */'): - inswitch = 0 - elif inswitch: - m = recase.match(line) or rebin.match(line) - if m: - register(m.group(1)) - else: - m = remiss.match(line) - if m: - miss.append(m.group(1)) -print -print - -assert not inswitch - -print '+++ Not implemented +++' -print -for i, opname in zip(range(1,256), dis.opname[1:]): - if not opname.startswith('<') and opname not in lst: - print "%4d %29s" % (i, opname), - if opname not in miss: - print "%29s" % "<--- forgotten ?", - warn += 1 - else: - miss.remove(opname) - print -print - -for opname in miss: - print "%29s" % opname, "%29s" % "<--- marked as missing, don't know why" - -print - -for line in open('mergepoints.c').readlines(): - for word in lst: - if line.find(word) >= 0: - lst.remove(word) - break - -for word in lst: - print '!!! Not found in mergepoints.c !!!' - print - print word - print - warn += 1 - -if warn: - print ' !!! %d warning(s) !!!' % warn diff --git a/nodebox/ext/psyco/src/c/platform.c b/nodebox/ext/psyco/src/c/platform.c deleted file mode 100644 index 916f63f..0000000 --- a/nodebox/ext/psyco/src/c/platform.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * OS-specific utilities. - * - * The rationale is that #include cannot be put anywhere else - * because it messes up things like default alignments; if included in the - * body of Psyco, we get crashes at run-time. - * - * This file is compiled separated. - */ - -/************************************************************/ -#ifdef _WIN32 -/************************************************************/ - -#include - -long psyco_allocate_executable_buffer(long basicsize, char **result) -{ - DWORD old; - char *p = (char*) VirtualAlloc(NULL, basicsize, MEM_COMMIT|MEM_RESERVE, - PAGE_EXECUTE_READWRITE); - if (p == NULL) - return 0; - VirtualProtect(p, basicsize, PAGE_EXECUTE_READWRITE, &old); - /* ignore errors, just try */ - *result = p; - return basicsize; -} - -/************************************************************/ -#else /* Assume UNIX */ -/************************************************************/ - -#include -#include -#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) -# define MAP_ANONYMOUS MAP_ANON -#endif - -long psyco_allocate_executable_buffer(long basicsize, char **result) -{ -#if defined(MAP_ANONYMOUS) && defined(MAP_PRIVATE) -/* note that some platforms *require* the allocation to be performed - by mmap, because PyMem_MALLOC() doesn't set the PROT_EXEC flag. - On these platforms we just hope that the first allocation is - successful, so that when another allocation fails, Psyco correctly - signals the OUT_OF_MEMORY. */ - long bigsize = basicsize * 32; /* allocate 32 blocks at a time */ - char *p = (char*) mmap(NULL, bigsize, - PROT_EXEC|PROT_READ|PROT_WRITE, - MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); - if (p == MAP_FAILED || p == NULL) - return 0; - *result = p; - return bigsize; - -#else - - return 0; - -#endif -} - -/************************************************************/ -#endif /* !MS_WINDOWS */ -/************************************************************/ diff --git a/nodebox/ext/psyco/src/c/platform.h b/nodebox/ext/psyco/src/c/platform.h deleted file mode 100644 index 45ccff6..0000000 --- a/nodebox/ext/psyco/src/c/platform.h +++ /dev/null @@ -1,9 +0,0 @@ -/* - * OS-specific utilities. - */ - -/* allocate 'basicsize' bytes, or possibly a multiple of it if allocating - large blocks of memory is better. The allocated address is stored - in '*result'. The total allocated size is returned, or 0 to try some - other allocation method. */ -extern long psyco_allocate_executable_buffer(long basicsize, char **result); diff --git a/nodebox/ext/psyco/src/c/processor.h b/nodebox/ext/psyco/src/c/processor.h deleted file mode 100644 index 7df5f10..0000000 --- a/nodebox/ext/psyco/src/c/processor.h +++ /dev/null @@ -1,43 +0,0 @@ - /***************************************************************/ -/*** Processor-specific execution ***/ - /***************************************************************/ - -#ifndef _PROCESSOR_H -#define _PROCESSOR_H - -#include "psyco.h" - - -/***************************************************************/ - /*** Execution ***/ - -/* executes a block of code. A new stack frame is created and - the 'initial_stack' values are PUSHed into it. The number - of values pushed are determined by the saved arguments_count of - the 'codebuf'. -*/ -struct stack_frame_info_s; -EXTERNFN PyObject* psyco_processor_run(CodeBufferObject* codebuf, - long initial_stack[], - struct stack_frame_info_s*** finfo, - PyObject* tdict); - -#define RUN_ARGC(codebuf) \ - (extra_assert(CodeBuffer_Check((codebuf))), \ - (int)((get_stack_depth(&((CodeBufferObject*)(codebuf))->snapshot) \ - - INITIAL_STACK_DEPTH - sizeof(long)) / sizeof(long))) - -/* call a C function with a variable number of arguments - (implemented as a pointer to assembler code) */ -EXTERNVAR long (*psyco_call_var) (void* c_func, int argcount, long arguments[]); - -/* check for signed integer multiplication overflow */ -EXTERNVAR char (*psyco_int_mul_ovf) (long a, long b); - -/* find the next stack frame - ("next" = more recent in time = towards innermost frames) */ -EXTERNFN struct stack_frame_info_s** -psyco_next_stack_frame(struct stack_frame_info_s** finfo); - - -#endif /* _PROCESSOR_H */ diff --git a/nodebox/ext/psyco/src/c/profile.c b/nodebox/ext/psyco/src/c/profile.c deleted file mode 100644 index 6271e6e..0000000 --- a/nodebox/ext/psyco/src/c/profile.c +++ /dev/null @@ -1,673 +0,0 @@ -#include "profile.h" -#include "stats.h" -#include "cstruct.h" -#include "Python/pyver.h" -#include "Python/frames.h" -#include "codemanager.h" - - -/* There are three profilers you can choose from: - - 1) Profiling via Python's profiler hooks - (active profiling) - 2) Have a parallel thread that peeks for info - (passive profiling, rough precision, requires threads) - 3) Both - (XXX test and compare all three choices) - - We use the tick_counter field of the PyThreadState to - measure "execution time", on the basis that Psyco is - good at removing opcode dispatching and the inter-opcode - allocations, so the theory is that the more opcodes are - executed, the better Psyco will perform on that code. -*/ - -/* Internal invariants in PyCodeStats: - - st_codebuf is NULL if not compiled yet, - None if the compilation failed, - or a real code buffer object. - - st_globals is NULL if the code should be normally executed, - an int if we want to accelerate that code object, - or the globals dictionary that st_codebuf we compiled with. - - Valid states are: (st_codebuf, st_globals) - - (NULL, NULL) normal execution - (NULL, rec-level) compile at the next occasion - (None, NULL) compilation failed - (codebuf, globals) compilation succeeded -*/ - - -/***************************************************************/ - /*** Flexibly hooking routines into Python's profiler and ***/ - /*** tracing hooks ***/ - -#define PyTrace_TOTAL 4 - - -/* a hook routine returns NULL or the code buffer object containing - the compiled code to run now. */ -typedef PyObject* (*ceval_event_fn) (PyFrameObject* frame, PyObject* arg); - -struct cevent_s { - ceval_event_fn fn; - PyObject* arg; -}; -struct cevents_s { - int count; - struct cevent_s* items; -}; -typedef struct { - PyCStruct_HEAD - /*PyThread_type_lock lock; not needed, changes protected by the GIL */ - struct cevents_s events[PyTrace_TOTAL]; - PyThreadState* tstate; - int events_total; - char current_hook; /* 'P'rofile, 'T'race */ -} ceval_events_t; - -static PyObject* ceval_events_key; /* interned string */ - -static void ceval_events_dealloc(ceval_events_t* cev) -{ - int i; - /*extra_assert(PyThread_acquire_lock(cev->lock, NOWAIT_LOCK));*/ - for (i=0; ievents[i].items); - } - /*PyThread_free_lock(cev->lock);*/ -} - -static ceval_events_t* new_cevents(PyThreadState* tstate) -{ - ceval_events_t* cev; - PyObject* dict = tstate->dict; - - RECLIMIT_SAFE_ENTER(); - if (dict == NULL) { - dict = tstate->dict = PyDict_New(); - if (dict == NULL) - OUT_OF_MEMORY(); - } - cev = PyCStruct_NEW(ceval_events_t, ceval_events_dealloc); - /*cev->lock = PyThread_allocate_lock();*/ - memset(cev->events, 0, sizeof(cev->events)); - cev->tstate = tstate; - cev->events_total = 0; - cev->current_hook = 0; - if (PyDict_SetItem(dict, ceval_events_key, (PyObject*) cev)) - OUT_OF_MEMORY(); - RECLIMIT_SAFE_LEAVE(); - Py_DECREF(cev); /* one ref left in dict */ - return cev; -} - -PSY_INLINE ceval_events_t* get_cevents(PyThreadState* tstate) -{ - PyObject* dict = tstate->dict; - if (dict != NULL) { - PyObject* o = PyDict_GetItem(dict, ceval_events_key); - if (o != NULL) { - extra_assert(PyCStruct_Check(o)); - return (ceval_events_t*) o; - } - } - return new_cevents(tstate); -} - - -static PyObject* deleted_ceval_hook(PyFrameObject* frame, PyObject* arg) -{ - return NULL; -} - -static void set_ceval_hook(ceval_events_t* cev, int when, - ceval_event_fn fn, PyObject* arg) -{ - int n, i, allow; - struct cevents_s* events; - extra_assert(0 <= when && when < PyTrace_TOTAL); - events = cev->events + when; - n = events->count++; - PyMem_RESIZE(events->items, struct cevent_s, events->count); - if (events->items == NULL) - OUT_OF_MEMORY(); - events->items[n].fn = fn; - events->items[n].arg = arg; - cev->events_total++; - if (arg != NULL) { - /* bound the total number of hooks by checking if there are - too many other hooks with the same 'fn' */ - allow = 8; - for (i=n; --i >= 0; ) { - if (events->items[i].fn == fn && !--allow) { - /* too many! remove an arbitrary one */ - events->items[i].fn = &deleted_ceval_hook; - cev->events_total--; - break; - } - } - } -} - -static void unset_ceval_hook(ceval_events_t* cev, int when, - ceval_event_fn fn, PyObject* arg) -{ - /* warning: do not shuffle values in the events->items array to - compact it, because this might be called while the array is - being enumerated by call_ceval_hooks() */ - int n; - struct cevents_s* events; - extra_assert(0 <= when && when < PyTrace_TOTAL); - events = cev->events + when; - n = events->count; - while (n--) { - if (events->items[n].fn == fn && events->items[n].arg == arg) { - events->items[n].fn = &deleted_ceval_hook; - cev->events_total--; - } - } -} - -#if VERBOSE_STATS -# define set_ceval_hook(cev, when, fn, arg) do { \ - stats_printf(("set_ceval_hook: " #when ", " #fn ", " #arg " = 0x%x\n", (int)arg)); \ - set_ceval_hook(cev, when, fn, arg); \ - } while (0) -# define unset_ceval_hook(cev, when, fn, arg) do { \ - stats_printf(("unset_ceval_hook: " #when ", " #fn ", " #arg " = 0x%x\n", (int)arg)); \ - unset_ceval_hook(cev, when, fn, arg); \ - } while (0) -#endif - -PSY_INLINE bool call_ceval_hooks(ceval_events_t* cev, int what, PyFrameObject* f) -{ - bool r = true; - int n; - struct cevents_s* events; - PyObject* codebuf; - PyObject* obj; - extra_assert(what >= 0); - if (what >= PyTrace_TOTAL) - return true; /* Python >= 2.4 defines PyTrace_C_xxx */ -#if VERBOSE_LEVEL >= 3 - stats_printf(("hook: %d %s\n", what, PyCodeObject_NAME(f->f_code))); -#endif - events = cev->events + what; - n = events->count; - do { - if (n == 0) - return true; /* done */ - n--; - extra_assert(n < events->count); - codebuf = events->items[n].fn(f, events->items[n].arg); - if (events->items[n].fn == &deleted_ceval_hook) { - events->items[n] = events->items[--events->count]; - } - } while (codebuf == NULL); - - /* call the other hooks, if any */ - while (n != 0) { - n--; - extra_assert(n < events->count); - obj = events->items[n].fn(f, events->items[n].arg); - Py_XDECREF(obj); - if (events->items[n].fn == &deleted_ceval_hook) { - events->items[n] = events->items[--events->count]; - } - } - /* enable recursive calls to call_ceval_hooks() */ - f->f_tstate->use_tracing = 1; - f->f_tstate->tracing--; - /* run the compiled code */ - r = PsycoCode_Run(codebuf, f, what == PyTrace_CALL); - f->f_tstate->tracing++; - Py_DECREF(codebuf); -#if (PY_VERSION_HEX >= 0x02030000) && (PY_VERSION_HEX < 0x020300f0) - if (!r) f->f_stacktop = NULL; /* work around a bug in Python 2.3b1 */ -#endif - return r; -} - - -static int do_trace_or_profile(PyObject *v, PyFrameObject *frame, - int what, PyObject *arg) -{ - return !call_ceval_hooks((ceval_events_t*) v, what, frame); -} -static void extended_SetProfile(PyThreadState* tstate, Py_tracefunc func, - PyObject* arg) -{ - /* cannot use PyEval_SetProfile() because it cannot set the - hook for another tstate than the current one */ - PyObject *temp = tstate->c_profileobj; - Py_XINCREF(arg); - tstate->c_profilefunc = NULL; - tstate->c_profileobj = NULL; - tstate->use_tracing = tstate->c_tracefunc != NULL; - Py_XDECREF(temp); - tstate->c_profilefunc = func; - tstate->c_profileobj = arg; - tstate->use_tracing = (func != NULL) || (tstate->c_tracefunc != NULL); -} -static void extended_SetTrace(PyThreadState* tstate, Py_tracefunc func, - PyObject* arg) -{ - /* cannot use PyEval_SetProfile() because it cannot set the - hook for another tstate than the current one */ - PyObject *temp = tstate->c_traceobj; - Py_XINCREF(arg); - tstate->c_tracefunc = NULL; - tstate->c_traceobj = NULL; - tstate->use_tracing = tstate->c_profilefunc != NULL; - Py_XDECREF(temp); - tstate->c_tracefunc = func; - tstate->c_traceobj = arg; - tstate->use_tracing = ((func != NULL) - || (tstate->c_profilefunc != NULL)); -} -PSY_INLINE bool pstartprofile(PyThreadState* tstate) -{ - /* Set Python profile function to our function */ - if (tstate->c_profilefunc == NULL) { - ceval_events_t* cev = get_cevents(tstate); - extended_SetProfile(tstate, &do_trace_or_profile, - (PyObject*) cev); - } - return tstate->c_profilefunc == &do_trace_or_profile; -} -PSY_INLINE void pstopprofile(PyThreadState* tstate) -{ - if (tstate->c_profilefunc == &do_trace_or_profile) { - extended_SetProfile(tstate, NULL, NULL); - } -} -PSY_INLINE bool pstarttrace(PyThreadState* tstate) -{ - /* Set Python profile function to our function */ - if (tstate->c_tracefunc == NULL) { - ceval_events_t* cev = get_cevents(tstate); - extended_SetTrace(tstate, &do_trace_or_profile, - (PyObject*) cev); - } - return tstate->c_tracefunc == &do_trace_or_profile; -} -PSY_INLINE void pstoptrace(PyThreadState* tstate) -{ - if (tstate->c_tracefunc == &do_trace_or_profile) { - extended_SetTrace(tstate, NULL, NULL); - } -} - - -static bool update_ceval_hooks(ceval_events_t* cev) -{ - char needed; - if (cev->events_total == 0) { - needed = 0; - } - else if (cev->events[PyTrace_LINE].count == 0) { - needed = 'P'; /* profile hook only, no line-by-line tracing */ - } - else { - needed = 'T'; /* line-by-line tracing hook */ - } - if (cev->current_hook != needed) { - PyThreadState* tstate = cev->tstate; - switch (cev->current_hook) { - case 'P': - pstopprofile(tstate); - break; - case 'T': - pstoptrace(tstate); - break; - } - switch (needed) { - case 'P': - if (pstartprofile(tstate)) - break; /* ok */ - needed = 'T'; - /* cannot use profile hook, try to fall through - to trace hook */ - debug_printf(1, ("profiler hooks busy, " - "trying with the slower trace hooks")); - - case 'T': - if (pstarttrace(tstate)) - break; /* ok */ - cev->current_hook = 0; - stats_printf(("stats: update_ceval_hooks() cancel\n")); - return false; - } - cev->current_hook = needed; - } - return true; -} - - -/***************************************************************/ - /*** Profiling all threads ***/ - -typedef void (*profile_fn) (ceval_events_t*, int); -static profile_fn profile_function = NULL; - -DEFINEFN -void psyco_profile_threads(int start) -{ - PyInterpreterState* istate; - PyThreadState* tstate; - - if (!profile_function) - return; - istate = PyThreadState_Get()->interp; - for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { - ceval_events_t* cev; - if (!measuring_state(tstate)) - continue; - cev = get_cevents(tstate); - if (start == !cev->current_hook) { - stats_printf(("stats: %s hooks on thread %p\n", - start?"adding":"removing", tstate)); - profile_function(cev, start); - if (!update_ceval_hooks(cev) && start) { - /* cannot start, stop again */ - profile_function(cev, 0); - } - } - } -} - -DEFINEFN bool psyco_set_profiler(void (*rs)(void*, int)) -{ - if (rs == NULL) { - psyco_profile_threads(0); - } - else { - ceval_events_t* cev = get_cevents(PyThreadState_Get()); - profile_fn f = (profile_fn) rs; - f(cev, 1); - if (!update_ceval_hooks(cev)) { - psyco_profile_threads(0); - return false; - } - profile_function = f; - psyco_profile_threads(1); - } - return true; -} - - -/***************************************************************/ - /*** Active profiling via Python's profiler hooks ***/ - -static PyObject* profile_call(PyFrameObject* frame, PyObject* arg) -{ - PyCodeStats* cs; - psyco_stats_append(frame->f_tstate, frame->f_back); - - cs = PyCodeStats_Get(frame->f_code); - if (cs->st_globals != NULL) { - /* we want to accelerate this code object */ - if (cs->st_codebuf == NULL) { - /* not already compiled, compile it now */ - PyObject* g = frame->f_globals; - int rec, module; - stats_printf(("stats: compile code: %s\n", - PyCodeObject_NAME(frame->f_code))); - if (PyInt_Check(cs->st_globals)) - rec = PyInt_AS_LONG(cs->st_globals); - else - rec = DEFAULT_RECURSION; - module = frame->f_globals == frame->f_locals; - cs->st_codebuf = PsycoCode_CompileCode(frame->f_code, - g, rec, module); - if (cs->st_codebuf == Py_None) - g = NULL; /* failed */ - else { - Py_INCREF(g); - extra_assert - (CodeBuffer_Check(cs->st_codebuf)); - } - Py_DECREF(cs->st_globals); - cs->st_globals = g; - } - /* already compiled a Psyco version, run it - if the globals match */ - extra_assert(frame->f_globals != NULL); - if (cs->st_globals == frame->f_globals) { - Py_INCREF(cs->st_codebuf); - return cs->st_codebuf; - } - } - return NULL; -} - -static PyObject* profile_return(PyFrameObject* frame, PyObject* arg) -{ - psyco_stats_append(frame->f_tstate, frame); - return NULL; -} - -DEFINEFN -void psyco_rs_profile(void* cev_raw, int start) -{ - ceval_events_t* cev = (ceval_events_t*) cev_raw; - if (start) { - set_ceval_hook(cev, PyTrace_CALL, &profile_call, NULL); - set_ceval_hook(cev, PyTrace_RETURN, &profile_return, NULL); - } - else { - unset_ceval_hook(cev, PyTrace_CALL, &profile_call, NULL); - unset_ceval_hook(cev, PyTrace_RETURN, &profile_return, NULL); - } -} - - -/***************************************************************/ - /*** Full compiling via Python's profiler hooks ***/ - -static PyObject* do_fullcompile(PyFrameObject* frame, PyObject* arg) -{ - PyCodeStats* cs; - cs = PyCodeStats_Get(frame->f_code); - if (cs->st_codebuf == NULL) { - /* not already compiled, compile it now */ - PyObject* g = frame->f_globals; - int rec, module; - stats_printf(("stats: full compile code: %s\n", - PyCodeObject_NAME(frame->f_code))); - if (cs->st_globals && PyInt_Check(cs->st_globals)) - rec = PyInt_AS_LONG(cs->st_globals); - else - rec = DEFAULT_RECURSION; - module = frame->f_globals == frame->f_locals; - cs->st_codebuf = PsycoCode_CompileCode(frame->f_code, - g, rec, module); - if (cs->st_codebuf == Py_None) - g = NULL; /* failed */ - else { - Py_INCREF(g); - extra_assert(CodeBuffer_Check(cs->st_codebuf)); - } - Py_XDECREF(cs->st_globals); - cs->st_globals = g; - } - /* already compiled a Psyco version, run it if the globals match */ - extra_assert(frame->f_globals != NULL); - if (cs->st_globals == frame->f_globals) { - Py_INCREF(cs->st_codebuf); - return cs->st_codebuf; - } - return NULL; -} - -DEFINEFN -void psyco_rs_fullcompile(void* cev_raw, int start) -{ - ceval_events_t* cev = (ceval_events_t*) cev_raw; - if (start) { - set_ceval_hook(cev, PyTrace_CALL, &do_fullcompile, NULL); - } - else { - unset_ceval_hook(cev, PyTrace_CALL, &do_fullcompile, NULL); - } -} - - -/***************************************************************/ - /*** No compiling, but execution of already compiled code ***/ - -static PyObject* do_nocompile(PyFrameObject* frame, PyObject* arg) -{ - PyCodeStats* cs; - cs = PyCodeStats_MaybeGet(frame->f_code); - /* if already compiled a Psyco version, run it if the globals match */ - if (cs != NULL && cs->st_codebuf != NULL && - cs->st_globals == frame->f_globals) { - extra_assert(frame->f_globals != NULL); - Py_INCREF(cs->st_codebuf); - return cs->st_codebuf; - } - return NULL; -} - -DEFINEFN -void psyco_rs_nocompile(void* cev_raw, int start) -{ - ceval_events_t* cev = (ceval_events_t*) cev_raw; - if (start) { - set_ceval_hook(cev, PyTrace_CALL, &do_nocompile, NULL); - } - else { - unset_ceval_hook(cev, PyTrace_CALL, &do_nocompile, NULL); - } -} - - -/***************************************************************/ - /*** Turbo-ing a frame via Python's tracing hooks ***/ - -/* Careful when changing the fields of a Python frame: ceval.c's - interpreter will reload the changes and go on seamlessly only - when hitting a line-trace step. */ - -static PyObject* turbo_wait(PyFrameObject* frame, PyObject* target_frame); - -static PyObject* turbo_go(PyFrameObject* frame, PyObject* target_frame) -{ - PyObject* result; - ceval_events_t* cev = get_cevents(frame->f_tstate); - - /* single-shooting callback */ - unset_ceval_hook(cev, PyTrace_LINE, &turbo_go, target_frame); - - if ((PyObject*) frame == target_frame) { - /* the target is the current frame, compile it now */ - stats_printf(("stats: compile frame: %s\n", - PyCodeObject_NAME(frame->f_code))); - result = PsycoCode_CompileFrame(frame, DEFAULT_RECURSION); - if (result == Py_None) { - Py_DECREF(result); - result = NULL; - } - } - else { - /* hey, where is my frame? */ - PyFrameObject* f = frame->f_back; - stats_printf(("stats: where is my frame?\n")); - for (; f; f = f->f_back) { - if ((PyObject*) f == target_frame) { - /* it is lower in the stack, wait until - we return to it */ - stats_printf(("stats: lower in the stack.\n")); - set_ceval_hook(cev, PyTrace_RETURN, &turbo_wait, - target_frame); - break; - } - } - /* if nowhere to be seen, forget it */ - result = NULL; - } - if (!update_ceval_hooks(cev)) - unset_ceval_hook(cev, PyTrace_RETURN, &turbo_wait, target_frame); - return result; -} - -static PyObject* turbo_wait(PyFrameObject* frame, PyObject* target_frame) -{ - if ((PyObject*)(frame->f_back) == target_frame) { - /* here is my frame, we are returning back to it */ - ceval_events_t* cev = get_cevents(frame->f_tstate); - unset_ceval_hook(cev, PyTrace_RETURN, &turbo_wait, target_frame); - set_ceval_hook(cev, PyTrace_LINE, &turbo_go, target_frame); - if (!update_ceval_hooks(cev)) - unset_ceval_hook(cev, PyTrace_LINE, - &turbo_go, target_frame); - } - return NULL; -} - -DEFINEFN -bool psyco_turbo_frame(PyFrameObject* frame) -{ - if (frame->f_lasti >= 0) { - /* turbo-run the frame at the next possible occasion - unless the frame is actually emulated from a Psyco frame */ - ceval_events_t* cev = get_cevents(frame->f_tstate); - stats_printf(("stats: turbo frame: %s\n", - PyCodeObject_NAME(frame->f_code))); -/* if (frame->f_tstate != PyThreadState_GET()) { */ -/* stats_printf(("stats: TSTATE = %p, F_TSTATE=%p\n", */ -/* PyThreadState_GET(), */ -/* frame->f_tstate)); */ -/* } */ - set_ceval_hook(cev, PyTrace_LINE, &turbo_go, (PyObject*) frame); - if (!update_ceval_hooks(cev)) { - unset_ceval_hook(cev, PyTrace_LINE, &turbo_go, - (PyObject*) frame); - return false; - } - } - return true; -} - -DEFINEFN -void psyco_turbo_code(PyCodeObject* code, int recursion) -{ - PyCodeStats* cs = PyCodeStats_Get(code); - if (cs->st_codebuf == NULL && cs->st_globals == NULL) { - /* trigger compilation at the next occasion - by storing something non-NULL in st_globals */ - cs->st_globals = PyInt_FromLong(recursion); - if (cs->st_globals == NULL) - OUT_OF_MEMORY(); - } -} - -DEFINEFN -void psyco_turbo_frames(PyCodeObject* code) -{ - /* search all reachable Python frames - (this might overlook pending generators) */ - PyInterpreterState* istate = PyThreadState_Get()->interp; - PyThreadState* tstate; - for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { - PyFrameObject* f = tstate->frame; - for (; f; f = f->f_back) { - if (f->f_code == code) - psyco_turbo_frame(f); - } - } -} - - - /***************************************************************/ - -INITIALIZATIONFN -void psyco_profile_init(void) -{ - ceval_events_key = PyString_InternFromString("PsycoC"); -} diff --git a/nodebox/ext/psyco/src/c/profile.h b/nodebox/ext/psyco/src/c/profile.h deleted file mode 100644 index 9f1d090..0000000 --- a/nodebox/ext/psyco/src/c/profile.h +++ /dev/null @@ -1,37 +0,0 @@ - /***************************************************************/ -/*** Profilers to collect statistics ***/ - /***************************************************************/ - -#ifndef _PROFILE_H -#define _PROFILE_H - - -#include "psyco.h" -#include "Python/frames.h" -#include -#include - - -/* enable profiling, see comments in profile.c for the various methods */ -EXTERNFN bool psyco_set_profiler(void (*rs)(void*, int)); -/* where 'rs' may be: */ -EXTERNFN void psyco_rs_profile(void*, int); -EXTERNFN void psyco_rs_fullcompile(void*, int); -EXTERNFN void psyco_rs_nocompile(void*, int); - -/* enable the same profiling feature on all threads */ -EXTERNFN void psyco_profile_threads(int start); - -/* call this when it is detected to be worthwhile to give a frame a - little Psyco help */ -EXTERNFN bool psyco_turbo_frame(PyFrameObject* frame); - -/* call this to mark the code object as being worthwhile to - systematically accelerate */ -EXTERNFN void psyco_turbo_code(PyCodeObject* code, int recursion); - -/* call this to accelerate all frames currently executing the given code */ -EXTERNFN void psyco_turbo_frames(PyCodeObject* code); - - -#endif /* _PROFILE_H */ diff --git a/nodebox/ext/psyco/src/c/psyco.c b/nodebox/ext/psyco/src/c/psyco.c deleted file mode 100644 index 6ad5a6c..0000000 --- a/nodebox/ext/psyco/src/c/psyco.c +++ /dev/null @@ -1,1054 +0,0 @@ -#include "psyco.h" -#include "psyfunc.h" -#include "codemanager.h" -#include "stats.h" -#include "profile.h" -#include "dispatcher.h" -#include "Python/pycompiler.h" -#include "Python/frames.h" -#include "alarm.h" -#include "timing.h" -#include "mergepoints.h" - -#define PSYCO_INITIALIZATION -#include "initialize.h" /* generated by files.py */ - -static PyObject* thread_dict_key; - -DEFINEFN -PyObject* psyco_thread_dict() -{ - PyObject* dict = PyThreadState_GetDict(); - PyObject* result; - bool err; - - if (dict == NULL) - return NULL; - result = PyDict_GetItem(dict, thread_dict_key); - if (result == NULL) - { - result = PyDict_New(); - if (result == NULL) - return NULL; - err = PyDict_SetItem(dict, thread_dict_key, result); - Py_DECREF(result); /* one reference left in 'dict' */ - if (err) - result = NULL; - } - return result; -} - -DEFINEFN -void psyco_out_of_memory(char *filename, int lineno) -{ - char *msg; - if (PyErr_Occurred()) - { - PyErr_Print(); - msg = "psyco cannot recover from the error above"; - } - else - msg = "psyco: out of memory"; - fprintf(stderr, "%s:%d: ", filename, lineno); - Py_FatalError(msg); -} - - /***************************************************************/ -/*** Implementation of the '_psyco' built-in module ***/ - /***************************************************************/ - -DEFINEVAR PyObject* PyExc_PsycoError; -DEFINEVAR long psyco_memory_usage = 0; -DEFINEVAR PyObject* CPsycoModule; -DEFINEVAR PyObject* psyco_logger = NULL; - - -#if VERBOSE_LEVEL -DEFINEFN -void psyco_debug_printf(char* msg, ...) -{ - va_list vargs; - fprintf(stderr, "psyco: "); - -#ifdef HAVE_STDARG_PROTOTYPES - va_start(vargs, msg); -#else - va_start(vargs); -#endif - vfprintf(stderr, msg, vargs); - va_end(vargs); -} -#endif /* VERBOSE_LEVEL */ - - -/* Trace */ -#if defined(PSYCO_TRACE) -static void* trace_buffer[4096]; -static int trace_bufdata = 4096; -static FILE* trace_f = NULL; -DEFINEFN void psyco_trace_execution(char* msg, void* code_position) -{ - if (trace_bufdata == 4096) - { - if (trace_f == NULL) - trace_f = fopen(PSYCO_TRACE, "wb"); - else - fwrite(trace_buffer, sizeof(void*), 4096, trace_f); - trace_bufdata = 0; - } - trace_buffer[trace_bufdata++] = code_position; -} -static void trace_flush(void) -{ - if (trace_f != NULL) - { - fwrite(trace_buffer, sizeof(void*), trace_bufdata, trace_f); - fclose(trace_f); - trace_f = NULL; - trace_bufdata = 4096; - } -} -#elif VERBOSE_LEVEL >= 4 -DEFINEFN void psyco_trace_execution(char* msg, void* code_position) -{ - debug_printf(4, ("trace %p for %s\n", code_position, msg)); -} -DEFINEFN void psyco_trace_execution_noerr(char* msg, void* code_position) -{ - debug_printf(4, ("trace %p for %s\n", code_position, msg)); - psyco_assert(!PyErr_Occurred()); -} -#endif - - -DEFINEFN -void psyco_flog(char* msg, ...) -{ - va_list vargs; - PyObject* s; - PyObject* r; - PyObject *etype, *evalue, *etb; - extra_assert(psyco_logger != NULL); - - PyErr_Fetch(&etype, &evalue, &etb); - -#ifdef HAVE_STDARG_PROTOTYPES - va_start(vargs, msg); -#else - va_start(vargs); -#endif - s = PyString_FromFormatV(msg, vargs); - va_end(vargs); - - if (s == NULL) - OUT_OF_MEMORY(); - r = PyObject_CallFunction(psyco_logger, "O", s); - if (r == NULL) - PyErr_WriteUnraisable(psyco_logger); - else - Py_DECREF(r); - Py_DECREF(s); - - PyErr_Restore(etype, evalue, etb); -} - - -DEFINEFN -int psyco_fatal_error(char* msg, char* filename, int lineno) -{ - fprintf(stderr, "\n%s:%d: %s\n", filename, lineno, msg); - Py_FatalError("Psyco assertion failed"); - return 0; -} - -#if CODE_DUMP -static void vinfo_array_dump(vinfo_array_t* array, FILE* f, PyObject* d) -{ - int i = array->count; - fprintf(f, "%d\n", i); - while (i--) - { - vinfo_t* vi = array->items[i]; - PyObject* key = PyInt_FromLong((long)vi); - psyco_assert(key); - fprintf(f, "%ld\n", (long)vi); - if (vi != NULL && !PyDict_GetItem(d, key)) - { - switch (gettime(vi->source)) { - case CompileTime: - fprintf(f, "ct %ld %ld\n", - CompileTime_Get(vi->source)->refcount1_flags, - CompileTime_Get(vi->source)->value); - break; - case RunTime: - fprintf(f, "rt %ld\n", vi->source); - break; - case VirtualTime: - fprintf(f, "vt 0x%lx\n", (long) VirtualTime_Get(vi->source)); - break; - default: - psyco_fatal_msg("gettime() corrupted"); - } - PyDict_SetItem(d, key, Py_None); - vinfo_array_dump(vi->array, f, d); - } - Py_DECREF(key); - } -} -#ifndef MS_WIN32 -static void vinfo_dump_a1(vinfo_array_t* array) -{ - char cmdline[999]; - FILE* f; - sprintf(cmdline, "\"%s\" ../py-utils/vinfo_dump.py", Py_GetProgramFullPath()); - f = popen(cmdline, "w"); - if (f == NULL) - fprintf(stderr, "shell cannot execute: %s\n", cmdline); - else - { - PyObject* d = PyDict_New(); - psyco_assert(d); - vinfo_array_dump(array, f, d); - Py_DECREF(d); - pclose(f); - } -} -DEFINEFN void vinfo_dump(vinfo_t* vi) -{ - /* use this interactively, within the C debugger. Unix only */ - vinfo_array_t array; - array.count = 1; - array.items[0] = vi; - vinfo_dump_a1(&array); - if (&vinfo_dump) ; /* force the compiler to consider it as used */ -} -DEFINEFN void po_dump(PsycoObject* po) -{ - /* use this interactively, within the C debugger. Unix only */ - vinfo_dump_a1(&po->vlocals); - if (&po_dump) ; /* force the compiler to consider it as used */ -} -DEFINEFN void po_inlined_in(PsycoObject* po) -{ - if (po->pr.is_inlining) - { - fprintf(stderr, "inlined from position %d in\n", - (int) (CompileTime_Get(po->vlocals.items[0]-> - array->items[1]->source)->value)); - _PyObject_Dump((PyObject*) - (CompileTime_Get(po->vlocals.items[0]-> - array->items[0]->source)->value)); - } - else - fprintf(stderr, "not inlined\n"); - if (&po_inlined_in) ; /* force the compiler to consider it as used */ -} -#endif /* !MS_WIN32 */ -#if !ALL_STATIC - EXTERNFN int psyco_top_array_count(FrozenPsycoObject* fpo); /*in dispatcher.c*/ -#else -# define psyco_top_array_count fz_top_array_count -#endif -DEFINEFN -void psyco_dump_code_buffers(void) -{ - static int is_dumping = 0; - FILE* f; - -#if CODE_DUMP >= 3 - static int alt = 1; - char filename[200]; - sprintf(filename, "%s-%d", CODE_DUMP_FILE, alt); - alt = 3-alt; -#else - char* filename = CODE_DUMP_FILE; -#endif - -#if defined(PSYCO_TRACE) - trace_flush(); -#endif - - if (is_dumping) return; - is_dumping = 1; - f = fopen(filename, "wb"); - if (f != NULL) - { - CodeBufferObject* obj; - PyObject *exc, *val, *tb; - long buftablepos; - void** chain; - int bufcount = 0; - long* buftable; - PyErr_Fetch(&exc, &val, &tb); - debug_printf(1, ("writing %s\n", filename)); - - for (obj=psyco_codebuf_chained_list; obj != NULL; obj=obj->chained_list) - bufcount++; - buftable = PyMem_NEW(long, bufcount); - fprintf(f, "Psyco dump [%s]\n", MACHINE_CODE_FORMAT); - fwrite(&bufcount, sizeof(bufcount), 1, f); - buftablepos = ftell(f); - fwrite(buftable, sizeof(long), bufcount, f); - - /* give the address of an arbitrary symbol from the Python interpreter - and from the Psyco module */ - fprintf(f, "PyInt_FromLong: 0x%lx\n", (long) &PyInt_FromLong); - fprintf(f, "psyco_dump_code_buffers: 0x%lx\n", - (long) &psyco_dump_code_buffers); - - for (obj=psyco_codebuf_chained_list; obj != NULL; obj=obj->chained_list) - { - PyCodeObject* co = obj->snapshot.fz_pyc_data ? - obj->snapshot.fz_pyc_data->co : NULL; - fprintf(f, "CodeBufferObject 0x%lx %d '%s' '%s' %d '%s'\n", - (long) obj->codestart, get_stack_depth(&obj->snapshot), - co?PyString_AsString(co->co_filename):"", - co?PyCodeObject_NAME(co):"", - co?obj->snapshot.fz_pyc_data->next_instr:-1, - obj->codemode); - } - - psyco_dump_bigbuffers(f); - - for (chain = psyco_codebuf_spec_dict_list; chain; chain=(void**)*chain) - { - PyObject* spec_dict = (PyObject*)(chain[-1]); - int i = 0; - PyObject *key, *value; - fprintf(f, "spec_dict 0x%lx\n", (long) chain); - while (PyDict_Next(spec_dict, &i, &key, &value)) - { - PyObject* repr; - if (PyInt_Check(key)) - { - repr = (key->ob_type->tp_as_number->nb_hex)(key); - } - else - { - repr = PyObject_Repr(key); - } - psyco_assert(!PyErr_Occurred()); - psyco_assert(PyString_Check(repr)); - psyco_assert(CodeBuffer_Check(value)); - fprintf(f, "0x%lx %s\n", - (long)((CodeBufferObject*)value)->codestart, - PyString_AsString(repr)); - Py_DECREF(repr); - } - fprintf(f, "\n"); - } - { - int i = 0; - fprintf(f, "vinfo_array\n"); - for (obj=psyco_codebuf_chained_list; obj != NULL; obj=obj->chained_list) - { - PsycoObject* live_po; - PyObject* d; - if (psyco_top_array_count(&obj->snapshot) > 0) - live_po = fpo_unfreeze(&obj->snapshot); - else - live_po = NULL; - d = PyDict_New(); - psyco_assert(d); - buftable[i++] = ftell(f); - vinfo_array_dump(live_po ? &live_po->vlocals : NullArray, f, d); - Py_DECREF(d); - if (live_po) - PsycoObject_Delete(live_po); - } - psyco_assert(i==bufcount); - fseek(f, buftablepos, 0); - fwrite(buftable, sizeof(long), bufcount, f); - } - PyMem_FREE(buftable); - psyco_assert(!PyErr_Occurred()); - fclose(f); - PyErr_Restore(exc, val, tb); - } - is_dumping = 0; -} -static PyObject* Psyco_dumpcodebuf(PyObject* self, PyObject* args) -{ - psyco_dump_code_buffers(); - Py_INCREF(Py_None); - return Py_None; -} -#endif /* CODE_DUMP */ - - -/***************************************************************/ - /*** Replacements for PyEval_GetXxx() ***/ - -DEFINEFN -PyObject* need_cpsyco_obj(char* name) -{ - PyObject* d = PyModule_GetDict(CPsycoModule); - PyObject* result = PyDict_GetItemString(d, name); - if (result == NULL) - PyErr_Format(PyExc_PsycoError, "missing _psyco.%s", name); - return result; -} - -static PyObject* psyco_get_locals_msg(char* msg, int flag) -{ - static int already_logged = 0; - PyObject* o; - PyObject* result; - - o = psyco_find_frame(Py_False); - if (o == NULL) - return PyDict_New(); /* no frame at all -- no locals */ - - if (!PyFrame_Check(o)) { - /* it is a Psyco frame -- no locals available */ - char buffer[400]; - int i; - PyObject* w = need_cpsyco_obj("NoLocalsWarning"); - if (w == NULL) { - Py_DECREF(o); - return NULL; - } - for (i=0; msg[i] != '\\' && msg[i] != 0; i++) - buffer[i] = msg[i]; - if (psyco_logger && (flag & already_logged) == 0) { - already_logged |= flag; - buffer[i] = '\n'; - buffer[i+1] = 0; - debug_printf(1, (buffer)); - } - if (msg[i] == '\\') { - buffer[i++] = ' '; - for (; msg[i] != 0; i++) - buffer[i] = msg[i]; - } - buffer[i] = 0; - if (PyErr_Warn(w, buffer)) - result = NULL; - else - result = PyDict_New(); - } - else { - PyFrame_FastToLocals((PyFrameObject*) o); - result = ((PyFrameObject*) o)->f_locals; - Py_INCREF(result); - } - Py_DECREF(o); - return result; -} - -static PyObject* psyco_get_locals(void) -{ - return psyco_get_locals_msg("no locals() in functions bound by Psyco", - 0x01); -} - -#define WARN_IMPLICIT_LOCALS " cannot see the locals\\in functions bound by " \ - "Psyco; consider using eval() in its two- or " \ - "three-arguments form" - -/*****************************************************************/ - -static PyObject* Psyco_proxycode(PyObject* self, PyObject* args) -{ - int recursion = DEFAULT_RECURSION; - PyFunctionObject* function; - - if (!PyArg_ParseTuple(args, "O!|i", - &PyFunction_Type, &function, - &recursion)) - return NULL; - - return psyco_proxycode(function, recursion); -} - -static PyObject* Psyco_unproxycode(PyObject* self, PyObject* args) -{ - PyCodeObject* code; - PsycoFunctionObject* proxy; - PyObject* func; - - if (!PyArg_ParseTuple(args, "O!", &PyCode_Type, &code)) - return NULL; - - if (!is_proxycode(code)) { - PyErr_SetString(PyExc_PsycoError, "code object is not a proxy"); - return NULL; - } - proxy = (PsycoFunctionObject*) PyTuple_GET_ITEM(code->co_consts, 1); - - func = PyFunction_New((PyObject*) proxy->psy_code, proxy->psy_globals); - if (func == NULL) - return NULL; - if (proxy->psy_defaults != NULL && - PyFunction_SetDefaults(func, proxy->psy_defaults)) { - Py_DECREF(func); - return NULL; - } - return func; -} - -static PyObject* Psyco_cannotcompile(PyObject* self, PyObject* args) -{ - PyCodeObject* code; - PyCodeStats* cs; - - if (!PyArg_ParseTuple(args, "O!", &PyCode_Type, &code)) - return NULL; - cs = PyCodeStats_Get(code); - if (cs->st_mergepoints == NULL) { - Py_INCREF(Py_None); - cs->st_mergepoints = Py_None; - } - else if (cs->st_mergepoints != Py_None) { - PyErr_SetString(PyExc_PsycoError, "code is already compiled"); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* Psyco_setfilter(PyObject* self, PyObject* args) -{ - PyObject* func; - PyObject* prev; - - if (!PyArg_ParseTuple(args, "O", &func)) - return NULL; - - if (func == Py_None) - func = NULL; - else { - if (!PyCallable_Check(func)) { - PyErr_SetString(PyExc_TypeError, - "setfilter() arg must be callable"); - return NULL; - } - Py_INCREF(func); - } - prev = psyco_codeobj_filter_fn; - psyco_codeobj_filter_fn = func; - if (prev == NULL) { - prev = Py_None; - Py_INCREF(prev); - } - return prev; -} - -/* replacement for sys._getframe() (together with _getframe() in support.py) */ -static PyObject* Psyco_getframe(PyObject* self, PyObject* args) -{ - PyObject* o = Py_False; - int emulate = 0; - if (!PyArg_ParseTuple(args, "|Oi:getframe", &o, &emulate)) - return NULL; - - o = psyco_find_frame(o); - if (emulate && o != NULL) { - PyObject* f = (PyObject*) psyco_emulate_frame(o); - Py_DECREF(o); - return f; - } - else - return o; -} - -/* replacement for __builtin__.globals() */ -static PyObject * -Psyco_globals(PyObject* self, PyObject* args) -{ - PyObject *d; - - if (!PyArg_ParseTuple(args, ":globals")) - return NULL; - d = psyco_get_globals(); - Py_INCREF(d); - return d; -} - -/* replacement for __builtin__.locals() */ -static PyObject * -Psyco_locals(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, ":locals")) - return NULL; - return psyco_get_locals(); -} - -static PyObject* builtinevaluator(PyObject* args, char* oname) -{ - PyObject *o; - PyObject *cmd; - PyObject *freeme; - PyObject *globals = Py_None, *locals = Py_None; - - o = need_cpsyco_obj(oname); - if (o == NULL) - return NULL; - - if (!PyArg_ParseTuple(args, "O|O!O!", - &cmd, - &PyDict_Type, &globals, - &PyDict_Type, &locals)) { - /* let the original function report the problem, if any */ - PyErr_Clear(); - } - else if (globals == Py_None) { - globals = psyco_get_globals(); - if (locals == Py_None) { - locals = psyco_get_locals_msg("eval()/execfile()" - WARN_IMPLICIT_LOCALS, - 0x02); - if (locals == NULL) - return NULL; - freeme = locals; - } - else { - freeme = NULL; - } - o = PyObject_CallFunction(o, "OOO", cmd, globals, locals); - Py_XDECREF(freeme); - return o; - } - - /* fallback */ - return PyObject_CallObject(o, args); -} - -/* replacement for __builtin__.eval() */ -static PyObject * -Psyco_eval(PyObject* self, PyObject* args) -{ - return builtinevaluator(args, "original_eval"); -} - -/* replacement for __builtin__.execfile() */ -static PyObject * -Psyco_execfile(PyObject *self, PyObject *args) -{ - return builtinevaluator(args, "original_execfile"); -} - -/* replacement for __builtin__.vars() */ -static PyObject * -Psyco_vars(PyObject *self, PyObject *args) -{ - PyObject* o; - if (PyTuple_Size(args) == 0) { - return psyco_get_locals(); - } - /* fallback */ - o = need_cpsyco_obj("original_vars"); - if (o == NULL) - return NULL; - return PyObject_CallObject(o, args); -} - -/* replacement for __builtin__.dir() */ -static PyObject * -Psyco_dir(PyObject *self, PyObject *args) -{ - PyObject* o; - if (PyTuple_Size(args) == 0) { - PyObject* locals = psyco_get_locals(); - if (locals == NULL) - return NULL; - o = PyMapping_Keys(locals); - Py_DECREF(locals); - if (o == NULL) - return NULL; - if (!PyList_Check(o)) { - Py_DECREF(o); - PyErr_SetString(PyExc_TypeError, - "Expected keys() to be a list."); - return NULL; - } - if (PyList_Sort(o) != 0) { - Py_DECREF(o); - return NULL; - } - return o; - } - /* fallback */ - o = need_cpsyco_obj("original_dir"); - if (o == NULL) - return NULL; - return PyObject_CallObject(o, args); -} - -/* replacement for __builtin__.input() */ -static PyObject * -Psyco_input(PyObject *self, PyObject *args) -{ - PyObject* cmd; - PyObject* o = need_cpsyco_obj("original_raw_input"); - if (o == NULL) - return NULL; - - cmd = PyObject_CallObject(o, args); - if (cmd != NULL) { - PyObject* globals = psyco_get_globals(); - PyObject* locals = psyco_get_locals_msg("input()" - WARN_IMPLICIT_LOCALS, - 0x04); - if (locals == NULL) { - o = NULL; - } - else { - o = need_cpsyco_obj("original_eval"); - if (o != NULL) - o = PyObject_CallFunction(o, "OOO", cmd, - globals, locals); - Py_DECREF(locals); - } - Py_DECREF(cmd); - return o; - } - /* error in original_raw_input() */ - return NULL; -} - -static PyObject* hooks_busy(void) -{ - PyErr_SetString(PyExc_PsycoError, "Python trace/profile hooks are busy"); - return NULL; -} - -/* Enable or disable profiling. */ -static PyObject* Psyco_profiling(PyObject* self, PyObject* args) -{ - char mode; - void (*rs)(void*, int); - if (!PyArg_ParseTuple(args, "c", &mode)) - return NULL; - - switch (mode) { - case 'p': rs = &psyco_rs_profile; break; - case 'f': rs = &psyco_rs_fullcompile; break; - case 'n': rs = &psyco_rs_nocompile; break; - case '.': rs = NULL; break; - default: - PyErr_SetString(PyExc_ValueError, "unknown or unsupported mode"); - return NULL; - } - if (!psyco_set_profiler(rs)) - return hooks_busy(); - - Py_INCREF(Py_None); - return Py_None; -} - -/* turbo-mark a frame or all frames running a given code */ -static PyObject* Psyco_turbo_frame(PyObject* self, PyObject* args) -{ - PyObject* o = NULL; - - if (!PyArg_ParseTuple(args, "O", &o)) - return NULL; - - if (PyCode_Check(o)) - psyco_turbo_frames((PyCodeObject*) o); - else if (PyFrame_Check(o)) - { - if (!psyco_turbo_frame((PyFrameObject*) o)) - return hooks_busy(); - } - else - { - PyErr_SetString(PyExc_TypeError, "frame or code object"); - return NULL; - } - - Py_INCREF(Py_None); - return Py_None; -} - -/* turbo-mark a code object (does not affect frames currently running it) */ -static PyObject* Psyco_turbo_code(PyObject* self, PyObject* args) -{ - int rec = DEFAULT_RECURSION; - PyCodeObject* co; - if (!PyArg_ParseTuple(args, "O!|i", &PyCode_Type, &co, &rec)) - return NULL; - - psyco_turbo_code(co, rec); - Py_INCREF(Py_None); - return Py_None; -} - -/* update collected statistics */ -static PyObject* Psyco_statcollect(PyObject* self, PyObject* args) -{ - psyco_profile_threads(1); - psyco_stats_collect(); - Py_INCREF(Py_None); - return Py_None; -} - -/* return the top n code objects */ -static PyObject* Psyco_stattop(PyObject* self, PyObject* args) -{ - int n; - if (!PyArg_ParseTuple(args, "i", &n)) - return NULL; - - return psyco_stats_top(n); -} - -/* clear all collected statistics now */ -static PyObject* Psyco_statreset(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - - psyco_stats_reset(); - Py_INCREF(Py_None); - return Py_None; -} - -/* get tunable parameters */ -static PyObject* Psyco_statread(PyObject* self, PyObject* args) -{ - char* name; - if (!PyArg_ParseTuple(args, "s", &name)) - return NULL; - - return psyco_stats_read(name); -} - -/* set tunable parameters */ -static PyObject* Psyco_statwrite(PyObject* self, PyObject* args, PyObject* kwds) -{ - if (!psyco_stats_write(args, kwds)) - return NULL; - Py_INCREF(Py_None); - return Py_None; -} - -/* return a dump of all current statistics - (it also prints a nice table to stderr in verbose mode) */ -static PyObject* Psyco_statdump(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - - psyco_stats_collect(); - return psyco_stats_dump(); -} - -/* get the current usage charge of a code object */ -static PyObject* Psyco_getcharge(PyObject* self, PyObject* args) -{ - PyCodeStats* cs; - PyCodeObject* co; - if (!PyArg_ParseTuple(args, "O!", &PyCode_Type, &co)) - return NULL; - - cs = PyCodeStats_Get(co); - return PyFloat_FromDouble((double) cs->st_charge); -} - -/* set the usage charge of a code object */ -static PyObject* Psyco_setcharge(PyObject* self, PyObject* args) -{ - PyCodeStats* cs; - PyCodeObject* co; - float new_charge; - if (!PyArg_ParseTuple(args, "O!f", &PyCode_Type, &co, &new_charge)) - return NULL; - - cs = PyCodeStats_Get(co); - cs->st_charge = new_charge; - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject* Psyco_memory(PyObject* self, PyObject* args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - return PyInt_FromLong(psyco_memory_usage / 1024); -} - -#if 0 ---- disabled --- -static PyObject* t_finalizer(PyObject* self, PyObject* args, PyObject* kwds) -{ - PyObject* f; - PyObject* g; - PyObject* fres; - PyObject* gres; - PyObject *exc, *val, *tb; - - if (!PyArg_ParseTuple(self, "OO:finalizer", &f, &g)) - return NULL; - fres = PyEval_CallObjectWithKeywords(f, args, kwds); - PyErr_Fetch(&exc, &val, &tb); - gres = PyEval_CallObject(g, NULL); - if (gres == NULL) - { - Py_XDECREF(exc); - Py_XDECREF(val); - Py_XDECREF(tb); - Py_XDECREF(fres); - return NULL; - } - else - { - Py_DECREF(gres); - PyErr_Restore(exc, val, tb); - return fres; - } -} -static PyMethodDef m_finalizer = { - "finalizer_fn", (PyCFunction)t_finalizer, METH_VARARGS|METH_KEYWORDS }; - -/* finalizer(f,g) returns a built-in function object h - such that h(*args, **kw) is equivalent to - - try: - f(*args, **kw) - finally: - g() - - The purpose is for g() to be a lock.release() so that when the - lock is released we are sure that the thread will not run any - Python code any more (which cannot be done in Python). */ -static PyObject* Psyco_finalizer(PyObject* self, PyObject* args) -{ - return PyCFunction_New(&m_finalizer, args); -} -#endif - - -/*****************************************************************/ - -static char proxycode_doc[] = -"proxycode(func[, rec]) -> code object\n\ -\n\ -Return a proxy code object that invokes Psyco on the argument. The code\n\ -object can be used to replace func.func_code. Raise psyco.error if func\n\ -uses unsupported features. Return func.func_code itself if it is already\n\ -a proxy code object. The optional second argument specifies the number of\n\ -recursive compilation levels: all functions called by func are compiled\n\ -up to the given depth of indirection."; - -static char unproxycode_doc[] = -"unproxycode(code) -> function object\n\ -\n\ -Return a new copy of the original function that was used to build the\n\ -given proxy code object. Raise psyco.error if code is not a proxy."; - -static char getframe_doc[] = -"getframe([location, emulate]) -> frameobject or (code, globals, addr)\n\ -\n\ -Return a frame object from the call stack.\n\ -If location is an integer, return the nth frame (0=top).\n\ -If location was returned by a previous call to getframe(),\n\ -return the previous frame (as if by reading f_back)."; - -static char globals_doc[] = -"globals() -> dictionary\n\ -\n\ -Return the dictionary containing the current scope's global variables.\n\ -This is the Psyco-aware version."; - -static char gennolocals_doc[] = -"This is the Psyco-aware version of the builtin function of the same name.\n\ -For more information see psyco._psyco.original_<<>>.__doc__.\n\ -\n\ -Functions have no locals() dictionary with Psyco.\n\ -Accessing it returns {} and throws a NoLocalsWarning."; - -static char setfilter_doc[] = -"setfilter(func or None) -> previous filter or None\n\ -\n\ -Set a global filter function: func(co) will be called once per code object\n\ -'co' considered by Psyco. If it returns False, the code object will not\n\ -be compiled."; - -static PyMethodDef PsycoMethods[] = { - {"proxycode", &Psyco_proxycode, METH_VARARGS, proxycode_doc}, - {"unproxycode", &Psyco_unproxycode, METH_VARARGS, unproxycode_doc}, - {"getframe", &Psyco_getframe, METH_VARARGS, getframe_doc}, - {"globals", &Psyco_globals, METH_VARARGS, globals_doc}, - {"eval", &Psyco_eval, METH_VARARGS, gennolocals_doc}, - {"execfile", &Psyco_execfile, METH_VARARGS, gennolocals_doc}, - {"locals", &Psyco_locals, METH_VARARGS, gennolocals_doc}, - {"vars", &Psyco_vars, METH_VARARGS, gennolocals_doc}, - {"dir", &Psyco_dir, METH_VARARGS, gennolocals_doc}, - {"input", &Psyco_input, METH_VARARGS, gennolocals_doc}, - {"profiling", &Psyco_profiling, METH_VARARGS}, - {"turbo_frame", &Psyco_turbo_frame, METH_VARARGS}, - {"turbo_code", &Psyco_turbo_code, METH_VARARGS}, - {"statcollect", &Psyco_statcollect, METH_VARARGS}, - {"stattop", &Psyco_stattop, METH_VARARGS}, - {"statreset", &Psyco_statreset, METH_VARARGS}, - /*{"statread", &Psyco_statread, METH_VARARGS},*/ - {"statwrite", (PyCFunction)&Psyco_statwrite, METH_VARARGS|METH_KEYWORDS}, - {"statread", &Psyco_statread, METH_VARARGS}, - {"statdump", &Psyco_statdump, METH_VARARGS}, - {"getcharge", &Psyco_getcharge, METH_VARARGS}, - {"setcharge", &Psyco_setcharge, METH_VARARGS}, - {"memory", &Psyco_memory, METH_VARARGS}, - {"cannotcompile",&Psyco_cannotcompile, METH_VARARGS}, - {"setfilter", &Psyco_setfilter, METH_VARARGS, setfilter_doc}, -#if 0 - {"finalizer", &Psyco_finalizer, METH_VARARGS}, -#endif -#if CODE_DUMP - {"dumpcodebuf", &Psyco_dumpcodebuf, METH_VARARGS}, -#endif - ALARM_FUNCTIONS, - {NULL, NULL} /* Sentinel */ -}; - -/* Initialization */ -PyMODINIT_FUNC init_psyco(void) -{ - PsycoFunction_Type.ob_type = &PyType_Type; - CodeBuffer_Type.ob_type = &PyType_Type; - thread_dict_key = PyString_InternFromString("PsycoT"); - if (thread_dict_key == NULL) - return; - - CPsycoModule = Py_InitModule("_psyco", PsycoMethods); - if (CPsycoModule == NULL) - return; - PyExc_PsycoError = PyErr_NewException("psyco.error", NULL, NULL); - if (PyExc_PsycoError == NULL) - return; - Py_INCREF(PyExc_PsycoError); - if (PyModule_AddObject(CPsycoModule, "error", PyExc_PsycoError)) - return; - Py_INCREF(&PsycoFunction_Type); - if (PyModule_AddObject(CPsycoModule, "PsycoFunctionType", - (PyObject*) &PsycoFunction_Type)) - return; -/*if (PyModule_AddIntConstant(CPsycoModule, "DEFAULT_RECURSION", DEFAULT_RECURSION)) - return;*/ -#if ALL_CHECKS - if (PyModule_AddIntConstant(CPsycoModule, "ALL_CHECKS", ALL_CHECKS)) - return; -#endif -#if VERBOSE_LEVEL - if (PyModule_AddIntConstant(CPsycoModule, "VERBOSE_LEVEL", VERBOSE_LEVEL)) - return; -#endif -#ifdef PY_PSYCO_MODULE - PyPsycoModule = PyImport_ImportModule("psyco"); - if (PyPsycoModule == NULL) - return; -#endif - if (PyModule_AddIntConstant(CPsycoModule, "PYVER", PY_VERSION_HEX)) - return; - if (PyModule_AddIntConstant(CPsycoModule, "PSYVER", PSYCO_VERSION_HEX)) - return; - if (PyModule_AddIntConstant(CPsycoModule, "MEASURE_ALL_THREADS", - MEASURE_ALL_THREADS)) - return; - if (PyModule_AddStringConstant(CPsycoModule, "PROCESSOR", - MACHINE_CODE_FORMAT)) - return; - - initialize_all_files(); -} diff --git a/nodebox/ext/psyco/src/c/psyco.h b/nodebox/ext/psyco/src/c/psyco.h deleted file mode 100644 index b2eb30f..0000000 --- a/nodebox/ext/psyco/src/c/psyco.h +++ /dev/null @@ -1,302 +0,0 @@ - /***************************************************************/ -/*** Global Psyco definitions ***/ - /***************************************************************/ - -#ifndef _PSYCO_H -#define _PSYCO_H - - -#include -#include /* for offsetof() */ - - -/*****************************************************************/ - /*** Various customizable parameters (use your compilers' ***/ - /*** option to override them, e.g. -DXXX=value in gcc) ***/ - - /* set to 0 to disable all debugging checks and output */ -#ifndef PSYCO_DEBUG -# define PSYCO_DEBUG 0 -#endif - - - /* define to 1 for extra assert()'s */ -#ifndef ALL_CHECKS -# define ALL_CHECKS (PSYCO_DEBUG ? 1 : 0) -#endif - - /* level of debugging outputs: 0 = none, 1 = a few, 2 = more, - 3 = detailled, 4 = full execution trace */ -#ifndef VERBOSE_LEVEL -# define VERBOSE_LEVEL (PSYCO_DEBUG ? 0 : 0) -#endif - - /* dump information about profiling and statistics */ -#ifndef VERBOSE_STATS -# define VERBOSE_STATS (VERBOSE_LEVEL>=2) -#endif - - /* define for *heavy* memory checking: 0 = off, 1 = reasonably heavy, - 2 = unreasonably heavy */ -#ifndef HEAVY_MEM_CHECK -# define HEAVY_MEM_CHECK (PSYCO_DEBUG ? 0 : 0) -#endif -#ifdef MS_WIN32 -# undef HEAVY_MEM_CHECK -# define HEAVY_MEM_CHECK 0 /* not supported on Windows */ -#endif - - /* define to write produced blocks of code into a file; see 'xam.py' - 0 = off, 1 = only manually (from a debugger or with _psyco.dumpcodebuf()), - 2 = only when returning from Psyco, - 3 = every time a new code block is built */ -#ifndef CODE_DUMP -# define CODE_DUMP (PSYCO_DEBUG ? 1 : 0) -#endif - -#if CODE_DUMP && !defined(CODE_DUMP_FILE) -# define CODE_DUMP_FILE "psyco.dump" -#endif - - /* define to inline the most common functions in the produced code - (should be enabled unless you want to trade code size for speed) */ -#ifndef INLINE_COMMON_FUNCTIONS -# define INLINE_COMMON_FUNCTIONS 1 -#endif - -#if CODE_DUMP && defined(HAVE_DLFCN_H) - /* define to locate shared symbols and write them in CODE_DUMP_FILE - requires the GNU extension dladdr() in - Not really useful, only finds non-static symbols. */ -/*# include - # define CODE_DUMP_SYMBOLS*/ -#endif - -#define DEFAULT_RECURSION 10 /* default value for the 'rec' argument */ - - -/*****************************************************************/ - -/* Size of buffer to allocate when emitting code. - Can be as large as you like (most OSes will not actually allocate - RAM pages before they are actually used). We no longer perform - any realloc() on this; a single allocated code region is reused - for all code buffers until it is exhausted. There are BUFFER_MARGIN - unused bytes at the end, so BIG_BUFFER_SIZE has better be large to - minimize this effect. - Linux note: I've seen in my version of glibc's malloc() that it - uses mmap for sizes >= 128k, and that it will refuse the use mmap - more than 1024 times, which means that if you allocate blocks of - 128k you cannot allocate more than 128M in total. - Note that Psyco will usually allocate and fill two buffers in - parallel, by the way vcompiler.c works. However, it occasionally - needs more; codemanager.c can handle any number of parallely-growing - buffers. There is a safeguard in vcompiler.c to put an upper bound - on this number (currently should not exceed 4). - In debugging mode, we use a small size to stress the buffer- - continuation coding routines. */ -#ifndef BIG_BUFFER_SIZE -# define BIG_BUFFER_SIZE (PSYCO_DEBUG ? 2*BUFFER_MARGIN : 0x100000) -#endif - -/* A safety margin for occasional overflows: we might write a few - instructions too much before we realize we wrote past 'codelimit'. - XXX carefully check that it is impossible to overflow by more - We need more than 128 bytes because of the way conditional jumps - are emitted; see pycompiler.c. - The END_CODE macro triggers a silent buffer change if space is - getting very low -- less than GUARANTEED_MINIMUM */ -#ifndef BUFFER_MARGIN -# define BUFFER_MARGIN 1024 -#endif - -/* When emitting code, all called functions can assume that they - have at least this amount of room to write their code. If they - might need more, they have to allocate new buffers and write a - jump to these from the original code (jumps can be done in less - than GUARANTEED_MINIMUM bytes). */ -#ifndef GUARANTEED_MINIMUM -# define GUARANTEED_MINIMUM 64 -#endif - - -#ifndef ALL_STATIC -# define ALL_STATIC 0 /* make all functions static; set to 1 by hack.c */ -#endif - -#if ALL_STATIC -# define EXTERNVAR staticforward -# define EXTERNFN static -# define DEFINEVAR statichere -# define DEFINEFN static -# define INITIALIZATIONFN PSY_INLINE -#else -# define EXTERNVAR -# define EXTERNFN -# define DEFINEVAR -# define DEFINEFN -# define INITIALIZATIONFN DEFINEFN -#endif - -#if defined(_MSC_VER) -# if _MSC_VER < 1310 /* not an exact number */ -# define BROKEN_CPP -# endif -#endif -#ifndef BROKEN_CPP -# define psyco_assert(x) ((void)((x) || psyco_fatal_msg(#x))) -#else -/* The VC++ preprocessor is not even able to produce from #x a C string that - is correctly escaped for the VC++ compiler !! */ -# define psyco_assert(x) ((void)((x) || psyco_fatal_msg("assertion failed"))) -#endif -#define psyco_fatal_msg(msg) psyco_fatal_error(msg, __FILE__, __LINE__) -EXTERNFN int psyco_fatal_error(char* msg, char* filename, int lineno); - -#if ALL_CHECKS -# define MALLOC_CHECK_ 2 /* GCC malloc() checks */ -# define extra_assert(x) psyco_assert(x) -#else -# define extra_assert(x) (void)0 /* nothing */ -#endif - -#if VERBOSE_LEVEL -# define debug_printf(level, args) do { \ - if (VERBOSE_LEVEL >= (level)) { \ - psyco_debug_printf args; \ - } \ - if (psyco_logger && (level) == 1) { \ - psyco_flog args; \ - } \ - } while (0) -EXTERNFN void psyco_debug_printf(char* msg, ...); -#else -# define debug_printf(level, args) do { \ - if (psyco_logger && (level) == 1) { \ - psyco_flog args; \ - } \ - } while (0) -#endif -EXTERNVAR PyObject* psyco_logger; -EXTERNFN void psyco_flog(char* msg, ...); - -#if (VERBOSE_LEVEL >= 4) || defined(PSYCO_TRACE) -# define TRACE_EXECUTION(msg) do { \ - BEGIN_CODE EMIT_TRACE(msg, psyco_trace_execution); END_CODE } while (0) -# define TRACE_EXECUTION_NOERR(msg) do { \ - BEGIN_CODE EMIT_TRACE(msg, psyco_trace_execution_noerr); END_CODE } while (0) -EXTERNFN void psyco_trace_execution(char* msg, void* code_position); -# if defined(PSYCO_TRACE) -# define psyco_trace_execution_noerr psyco_trace_execution -# else -EXTERNFN void psyco_trace_execution_noerr(char* msg, void* code_position); -# endif -#else -# define TRACE_EXECUTION(msg) do { } while (0) /* nothing */ -# define TRACE_EXECUTION_NOERR(msg) do { } while (0) /* nothing */ -#endif - -#define RECLIMIT_SAFE_ENTER() PyThreadState_GET()->recursion_depth-- -#define RECLIMIT_SAFE_LEAVE() PyThreadState_GET()->recursion_depth++ - - -#if INLINE_COMMON_FUNCTIONS -# define PSY_INLINE __inline static -#else -# define PSY_INLINE static -#endif - -#if HEAVY_MEM_CHECK -# include "linuxmemchk.h" -# if HEAVY_MEM_CHECK > 1 -# define PSYCO_NO_LINKED_LISTS -# endif -#endif - - -#ifndef bool -typedef int bool; -#endif -#ifndef false -# define false 0 -#endif -#ifndef true -# define true 1 -#endif - -#ifndef PyObject_TypeCheck -# define PyObject_TypeCheck(o,t) ((o)->ob_type == (t)) -#endif - - -typedef unsigned char code_t; - -typedef struct vinfo_s vinfo_t; /* defined in compiler.h */ -typedef struct vinfo_array_s vinfo_array_t; /* defined in compiler.h */ -typedef struct PsycoObject_s PsycoObject; /* defined in compiler.h */ -typedef struct FrozenPsycoObject_s FrozenPsycoObject; /* def in dispatcher.h */ -typedef struct CodeBufferObject_s CodeBufferObject; /* def in codemanager.h */ -typedef struct global_entries_s global_entries_t; /* def in dispatcher.h */ -typedef struct mergepoint_s mergepoint_t; /* defined in mergepoint.h */ -typedef struct stack_frame_info_s stack_frame_info_t; /* def in pycompiler.h */ - -EXTERNVAR PyObject* PyExc_PsycoError; -EXTERNVAR long psyco_memory_usage; /* approximative */ -EXTERNVAR PyObject* CPsycoModule; - - -/* moved here from vcompiler.h because needed by numerous header files. - See vcompiler.h for comments */ -typedef bool (*compute_fn_t)(PsycoObject* po, vinfo_t* vi); -typedef PyObject* (*direct_compute_fn_t)(vinfo_t* vi, char* data); -typedef struct { - compute_fn_t compute_fn; - direct_compute_fn_t direct_compute_fn; - long pyobject_mask; - signed char nested_weight[2]; -} source_virtual_t; - - -#if CODE_DUMP -EXTERNFN void psyco_dump_code_buffers(void); -#endif -#if CODE_DUMP >= 3 -# define dump_code_buffers() psyco_dump_code_buffers() -#else -# define dump_code_buffers() do { } while (0) /* nothing */ -#endif - -/* to display code object names */ -#define PyCodeObject_NAME(co) (co->co_name ? PyString_AS_STRING(co->co_name) \ - : "") - - -/* defined in pycompiler.c */ -#define GLOBAL_ENTRY_POINT psyco_pycompiler_mainloop -EXTERNFN code_t* psyco_pycompiler_mainloop(PsycoObject* po); - - -/* XXX no handling of out-of-memory conditions. We have to define precisely - what should occur in various cases, like when we run out of memory in the - middle of writing code, when the beginning is already executing. When - should we report the exception? */ -EXTERNFN void psyco_out_of_memory(char *filename, int lineno); -#define OUT_OF_MEMORY() psyco_out_of_memory(__FILE__, __LINE__) - -/* Thread-specific state */ -EXTERNFN PyObject* psyco_thread_dict(void); - -/* Getting data from the _psyco module */ -EXTERNFN PyObject* need_cpsyco_obj(char* name); - -/* defined in dispatcher.c */ -EXTERNFN void PsycoObject_EmergencyCodeRoom(PsycoObject* po); - -/* Convenience macros to start/end a code-emitting instruction block: */ -#define BEGIN_CODE { code_t* code = po->code; -#define END_CODE po->code = code; \ - if (code >= po->codelimit) \ - PsycoObject_EmergencyCodeRoom(po); \ - } - -#endif /* _PSYCO_H */ diff --git a/nodebox/ext/psyco/src/c/psyfunc.c b/nodebox/ext/psyco/src/c/psyfunc.c deleted file mode 100644 index 055921c..0000000 --- a/nodebox/ext/psyco/src/c/psyfunc.c +++ /dev/null @@ -1,890 +0,0 @@ -#include "psyfunc.h" -#include "vcompiler.h" -#include "codemanager.h" -#include "mergepoints.h" -#include "stats.h" -#include "Objects/ptupleobject.h" -#include "Python/frames.h" -#include "Python/pycompiler.h" - -#include /* for PyEval_EvalCodeEx() */ - - - /***************************************************************/ -/*** Frame and arguments building ***/ - /***************************************************************/ - -static void fix_run_time_args(PsycoObject * po, vinfo_array_t* target, - vinfo_array_t* source, RunTimeSource* sources) -{ - int i = target->count; - extra_assert(target->count <= source->count); - while (i--) - { - vinfo_t* a = source->items[i]; - if (a != NULL && a->tmp != NULL) - { - vinfo_t* b = a->tmp; - if (is_runtime(a->source)) - { - if (target->items[i] == NULL) - continue; /* item was removed by psyco_simplify_array() */ - if (sources != NULL) { - int argc = (po->stack_depth-INITIAL_STACK_DEPTH) / sizeof(long); - sources[argc] = a->source; - } - po->stack_depth += sizeof(long); - /* arguments get borrowed references */ - b->source = RunTime_NewStack(po->stack_depth, false, false); - } - extra_assert(b == target->items[i]); - a->tmp = NULL; - if (a->array != NullArray) - fix_run_time_args(po, b->array, a->array, sources); - } - } -} - -struct fncall_arg_s { - PyCodeObject* co; - PyObject* merge_points; - vinfo_array_t* inputvinfos; - int po_size; -}; - -static bool fncall_init(struct fncall_arg_s* fncall, - PyCodeObject* co) -{ - int ncells = PyTuple_GET_SIZE(co->co_cellvars); - int nfrees = PyTuple_GET_SIZE(co->co_freevars); - if (co->co_flags & CO_VARKEYWORDS) - { - debug_printf(1, ("unsupported ** argument in call to %s\n", - PyCodeObject_NAME(co))); - return false; - } - if (ncells != 0 || nfrees != 0) - { - debug_printf(1, ("unsupported free or cell vars in %s\n", - PyCodeObject_NAME(co))); - return false; - } - fncall->co = co; - fncall->merge_points = psyco_get_merge_points(co, 0); - return fncall->merge_points != Py_None; -} - -static bool fncall_collect_arguments(struct fncall_arg_s* fncall, - vinfo_t* vglobals, - vinfo_t** argarray, int argcount, - vinfo_t** defarray, int defcount) -{ - PyCodeObject* co = fncall->co; - vinfo_array_t* inputvinfos; - int i, minargcnt, inputargs, extras; - - minargcnt = co->co_argcount - defcount; - inputargs = argcount; - if (inputargs != co->co_argcount) - { - if (inputargs > co->co_argcount && (co->co_flags & CO_VARARGS)) - /* ok, extra args will be collected below */ ; - else - { - if (inputargs < minargcnt || inputargs > co->co_argcount) - { - int n = co->co_argcount < minargcnt ? minargcnt : co->co_argcount; - PyErr_Format(PyExc_TypeError, - "%.200s() takes %s %d %sargument%s (%d given)", - PyCodeObject_NAME(co), - minargcnt == co->co_argcount ? "exactly" : - (inputargs < n ? "at least" : "at most"), - n, - /*kwcount ? "non-keyword " :*/ "", - n == 1 ? "" : "s", - inputargs); - return false; - } - inputargs = co->co_argcount; /* add default arguments */ - } - } - - /* Collect all input vinfo_t's (globals, arguments, needed default values) - into a new array that mimics the PsycoObject's vlocals. */ - inputvinfos = array_new(INDEX_LOC_LOCALS_PLUS + inputargs); - inputvinfos->items[INDEX_LOC_GLOBALS] = vglobals; - for (i=0; iitems[INDEX_LOC_LOCALS_PLUS+i] = argarray[i]; - for (; iitems[INDEX_LOC_LOCALS_PLUS+i] = defarray[i-minargcnt]; - - extras = co->co_stacksize + co->co_nlocals; /*+ncells+nfrees, both 0 now */ - fncall->inputvinfos = inputvinfos; - fncall->po_size = INDEX_LOC_LOCALS_PLUS + extras; - return true; -} - -PSY_INLINE void fncall_finish_store(struct fncall_arg_s* fncall, - PsycoObject* po) -{ - array_release(fncall->inputvinfos); - - /* store the code object */ - po->pr.co = fncall->co; - Py_INCREF(fncall->co); /* XXX never freed */ - pyc_data_build(po, fncall->merge_points); -} - -static void fncall_store_arguments(struct fncall_arg_s* fncall, - vinfo_t** vlocals) -{ - PyCodeObject* co = fncall->co; - vinfo_array_t* arraycopy = fncall->inputvinfos; - vinfo_t** pp; - int i; - int inputargs = arraycopy->count - INDEX_LOC_LOCALS_PLUS; - - /* initialize po->vlocals */ - vlocals[INDEX_LOC_GLOBALS] = arraycopy->items[INDEX_LOC_GLOBALS]; - - /* move the arguments into their target place, - excluding the ones that map to the '*' parameter */ - pp = arraycopy->items + INDEX_LOC_LOCALS_PLUS; - for (i=0; ico_argcount; i++) - vlocals[INDEX_LOC_LOCALS_PLUS + i] = *pp++; - if (co->co_flags & CO_VARARGS) - { - /* store the extra args in a virtual-time tuple */ - vlocals[INDEX_LOC_LOCALS_PLUS + i] = PsycoTuple_New(inputargs - i, pp); - for (; inputargs > i; inputargs--) - vinfo_decref(*pp++, NULL); - i++; - } - else - extra_assert(i == inputargs); - - /* the rest of locals is uninitialized */ - for (; ico_nlocals; i++) - vlocals[INDEX_LOC_LOCALS_PLUS + i] = psyco_vi_Zero(); - /* the rest of the array is the currently empty stack, - set to NULL by array_new(). */ -} - -/* Build a PsycoObject "frame" corresponding to the call of a Python - function. If 'sources!=NULL', it is set to an array of the sources of - the values that must be pushed to make the call. */ -static PsycoObject* psyco_build_frame(struct fncall_arg_s* fncall, - int recursion, RunTimeSource** sources) -{ - /* build a "frame" in a PsycoObject according to the given code object. */ - vinfo_array_t* arraycopy; - PsycoObject* po; - int rtcount; - RunTimeSource* source1; - - po = PsycoObject_New(fncall->po_size); - po->stack_depth = INITIAL_STACK_DEPTH; - po->vlocals.count = fncall->po_size; - INIT_PROCESSOR_PSYCOOBJECT(po); - po->pr.auto_recursion = AUTO_RECURSION(recursion); - - /* duplicate the inputvinfos. If two arguments share some common part, they - will also share it in the copy. */ - clear_tmp_marks(fncall->inputvinfos); - arraycopy = array_new(fncall->inputvinfos->count); - duplicate_array(arraycopy, fncall->inputvinfos); - - /* simplify arraycopy in the sense of psyco_simplify_array() */ - rtcount = psyco_simplify_array(arraycopy, NULL); - - /* all run-time arguments or argument parts must be corrected: in the - input vinfo_t's they have arbitrary sources, but in the new frame's - sources they will have to be fetched from the machine stack, where - the caller will have pushed them. */ - if (sources != NULL) - { - source1 = PyMem_NEW(RunTimeSource, rtcount); - if (source1 == NULL && rtcount > 0) - OUT_OF_MEMORY(); - *sources = source1; - } - else - source1 = NULL; - fix_run_time_args(po, arraycopy, fncall->inputvinfos, source1); - array_release(fncall->inputvinfos); - fncall->inputvinfos = arraycopy; - - /* initialize po->vlocals */ - fncall_store_arguments(fncall, po->vlocals.items); - fncall_finish_store(fncall, po); - - /* set up the CALL return address */ - po->stack_depth += sizeof(long); - LOC_CONTINUATION = vinfo_new(RunTime_NewStack(po->stack_depth, false, false)); - return po; -} - -/* extra data that must be saved about a parent frame when a child - frame is about to be run in-line in the same PsycoObject */ -#define LOC_INLINE_CO 0 -#define LOC_INLINE_NEXT_INSTR 1 -#define TOTAL_LOC_INLINE 2 - -static vinfo_t* call_with_inline_frame(PsycoObject* po, - struct fncall_arg_s* fncall, - int recursion) -{ - /* note: 'recursion' is ignored */ - vinfo_t* vresult; - if (LOC_INLINING != NULL) /* we have the result ready from the - initial case below */ - { - vresult = LOC_INLINING; - LOC_INLINING = NULL; - } - else - { - /* initial case: collect the arguments from the call into an - EInline pseudo-exception */ - int i; - vinfo_t** pp = fncall->inputvinfos->items; - vinfo_t* v = vinfo_new(SOURCE_NOT_IMPORTANT); - v->array = array_new(TOTAL_LOC_INLINE + fncall->po_size); - v->array->items[LOC_INLINE_CO] = - vinfo_new(CompileTime_New((long) fncall->co)); - Py_INCREF(fncall->co); /* XXX never freed */ - for (i=fncall->inputvinfos->count; i--; ) - if (pp[i] != NULL) - vinfo_incref(pp[i]); - fncall_store_arguments(fncall, v->array->items + TOTAL_LOC_INLINE); - PycException_Raise(po, vinfo_new(VirtualTime_New(&EInline)), v); - vresult = NULL; - } - array_release(fncall->inputvinfos); - return vresult; -} - -DEFINEFN -vinfo_t* psyco_save_inline_po(PsycoObject* po) -{ - int i = po->vlocals.count; - vinfo_t** pp = po->vlocals.items; - vinfo_t* v = vinfo_new(VirtualTime_New(&EInline)); - v->array = array_new(TOTAL_LOC_INLINE + i); - v->array->items[LOC_INLINE_CO] = - vinfo_new(CompileTime_New((long) po->pr.co)); - v->array->items[LOC_INLINE_NEXT_INSTR] = - vinfo_new(CompileTime_New(po->pr.next_instr)); - while (i--) - { - v->array->items[TOTAL_LOC_INLINE + i] = pp[i]; - pp[i] = NULL; - } - return v; -} - -DEFINEFN -PsycoObject* psyco_restore_inline_po(PsycoObject* po, vinfo_array_t** a) -{ - int i; - vinfo_t* v; - vinfo_array_t* array = *a; - *a = NullArray; - - for (i=po->vlocals.count; i--; ) - vinfo_xdecref(po->vlocals.items[i], po); - i = array->count - TOTAL_LOC_INLINE; - po = PsycoObject_Resize(po, i); - po->vlocals.count = i; /* attention, vlocals.count cannot be larger than i - even if there is enough memory already allocated */ - while (i--) - po->vlocals.items[i] = array->items[TOTAL_LOC_INLINE + i]; - - v = array->items[LOC_INLINE_CO]; - po->pr.co = (PyCodeObject*) CompileTime_Get(v->source)->value; - vinfo_decref(v, NULL); - v = array->items[LOC_INLINE_NEXT_INSTR]; - po->pr.next_instr = v ? CompileTime_Get(v->source)->value : 0; - vinfo_xdecref(v, NULL); - array_release(array); - - pyc_data_build(po, psyco_get_merge_points(po->pr.co, -1)); - po->pr.f_builtins = NULL; /* because the globals might have changed */ - return po; -} - - -static PyObject* cimpl_call_pyfunc(PyCodeObject* co, PyObject* globals, - PyObject* defaults, PyObject* arg) -{ - /* simple wrapper around PyEval_EvalCodeEx, for the fail_to_default - case of psyco_call_pyfunc() */ - int defcount = (defaults ? PyTuple_GET_SIZE(defaults) : 0); - PyObject** defs = (defcount ? &PyTuple_GET_ITEM(defaults, 0) : NULL); - return PyEval_EvalCodeEx(co, globals, (PyObject*)NULL, - &PyTuple_GET_ITEM(arg, 0), PyTuple_GET_SIZE(arg), - (PyObject**)NULL, 0, - defs, defcount, NULL); -} - -#define COMPUTE_DEFCOUNT() do { \ - /* is vdefaults!=NULL at run-time ? */ \ - condition_code_t cc = object_non_null(po, vdefaults); \ - if (cc == CC_ERROR) /* error or more likely promotion */ \ - return NULL; \ - if (runtime_condition_t(po, cc)) \ - defcount = PsycoTuple_Load(vdefaults); \ - else \ - defcount = 0; /* vdefaults==NULL at run-time */ \ -} while (0) - -DEFINEFN -vinfo_t* psyco_call_pyfunc(PsycoObject* po, PyCodeObject* co, - vinfo_t* vglobals, vinfo_t* vdefaults, - vinfo_t* arg_tuple, int recursion) -{ - CodeBufferObject* codebuf; - PsycoObject* mypo; - Source* sources; - vinfo_t* result; - stack_frame_info_t* finfo; - int tuple_size, argcount, defcount=-2; - struct fncall_arg_s fncall; - - if (is_proxycode(co)) - { - PsycoFunctionObject* pf; - pf = (PsycoFunctionObject*) PyTuple_GET_ITEM(co->co_consts, 1); - co = pf->psy_code; - if (pf->psy_defaults == NULL) - vdefaults = PsycoTuple_New(0, NULL); - else - { - Py_INCREF(pf->psy_defaults); /* XXX looses a ref */ - vdefaults = vinfo_new( - CompileTime_NewSk(sk_new((long) pf->psy_defaults, - SkFlagPyObj))); - } - /* the recursion limit only applies to non-proxified functions */ - recursion++; - result = psyco_call_pyfunc(po, co, vglobals, vdefaults, - arg_tuple, recursion); - vinfo_decref(vdefaults, po); - return result; - } - if (--recursion < 0) - goto fail_to_default; - extra_assert(PyCode_GetNumFree(co) == 0); - - tuple_size = PsycoTuple_Load(arg_tuple); - if (tuple_size == -1) - goto fail_to_default; - /* XXX calling with an unknown-at-compile-time number of arguments - is not implemented, revert to the default behaviour */ - - COMPUTE_DEFCOUNT(); - if (defcount == -1) - goto fail_to_default; - /* calling with an unknown-at-compile-time number of default arguments - is not implemented (but this is probably not useful to implement); - revert to the default behaviour */ - - /* Force mutable arguments out of virtual-time, - including the processor condition codes */ - /* This is expected to have already been done on default arguments; - see PsycoFunction_New() */ - if (!psyco_forking(po, arg_tuple->array)) - return NULL; - - /* prepare a frame */ - if (!fncall_init(&fncall, co)) - goto fail_to_default; /* unsupported bytecode features */ - if (!fncall_collect_arguments(&fncall, vglobals, - &PsycoTuple_GET_ITEM(arg_tuple, 0), tuple_size, - &PsycoTuple_GET_ITEM(vdefaults, 0), defcount)) - goto pyerr; /* Python exception (wrong # of arguments) */ - - /* try to inline the call */ - if (!po->pr.is_inlining && - (psyco_mp_flags(fncall.merge_points) & MP_FLAGS_INLINABLE)) - { - /* inlining call */ - result = call_with_inline_frame(po, &fncall, recursion); - } - else - { - /* non-inlining call */ - mypo = psyco_build_frame(&fncall, recursion, &sources); - if (mypo == NULL) - goto pyerr; - argcount = get_arguments_count(&mypo->vlocals); - finfo = psyco_finfo(po, mypo); - - /* compile the function (this frees mypo) */ - codebuf = psyco_compile_code(mypo, PsycoObject_Ready(mypo)); - - /* get the run-time argument sources and push them on the stack - and write the actual CALL */ - result = psyco_call_psyco(po, codebuf, sources, argcount, finfo); - PyMem_FREE(sources); - } - return result; - - fail_to_default: - return psyco_generic_call(po, cimpl_call_pyfunc, - CfReturnRef|CfPyErrIfNull, - "lvvv", co, vglobals, vdefaults, arg_tuple); - - pyerr: - psyco_virtualize_exception(po); - return NULL; -} - - - /***************************************************************/ -/*** PsycoFunctionObjects ***/ - /***************************************************************/ - -DEFINEFN -PsycoFunctionObject* psyco_PsycoFunction_NewEx(PyCodeObject* code, - PyObject* globals, - PyObject* defaults, - int rec) -{ - PsycoFunctionObject* result = PyObject_GC_New(PsycoFunctionObject, - &PsycoFunction_Type); - if (result != NULL) { - result->psy_code = code; Py_INCREF(code); - result->psy_globals = globals; Py_INCREF(globals); - result->psy_defaults = NULL; - result->psy_recursion = rec; - result->psy_fastcall = PyList_New(0); - PyObject_GC_Track(result); - - if (result->psy_fastcall == NULL) { - Py_DECREF(result); - return NULL; - } - - if (defaults != NULL) { - if (!PyTuple_Check(defaults)) { - Py_DECREF(result); - PyErr_SetString(PyExc_PsycoError, - "Psyco proxies need a tuple " - "for default arguments"); - return NULL; - } - if (PyTuple_GET_SIZE(defaults) > 0) { - result->psy_defaults = defaults; - Py_INCREF(defaults); - } - } - } - return result; -} - -#if 0 /* unneeded */ -DEFINEFN -PyObject* psyco_PsycoFunction_New(PyFunctionObject* func, int rec) -{ - /* return 'func' itself if the PsycoFunctionObject cannot be made */ - if (func->func_closure != NULL) { - Py_INCREF(func); - return (PyObject*) func; - } - return (PyObject*) - psyco_PsycoFunction_NewEx((PyCodeObject*) func->func_code, - func->func_globals, - func->func_defaults, - rec); -} -#endif /* 0 */ - -DEFINEFN -PyObject* psyco_proxycode(PyFunctionObject* func, int rec) -{ - PsycoFunctionObject *psyco_fun; - PyCodeObject *code, *newcode; - PyObject *consts, *proxy_cobj; - static PyObject *varnames = NULL; - static PyObject *free_cell_vars = NULL; - static PyObject *empty_string = NULL; - unsigned char proxy_bytecode[] = { - LOAD_CONST, 1, 0, - LOAD_FAST, 0, 0, - LOAD_FAST, 1, 0, - CALL_FUNCTION_VAR_KW, 0, 0, - RETURN_VALUE - }; - code = (PyCodeObject *)func->func_code; - if (is_proxycode(code)) - { - /* already a proxy code object */ - Py_INCREF(code); - return (PyObject*) code; - } - if (PyCode_GetNumFree(code) > 0) - { - /* it would be dangerous to continue in this case: the calling - convention changes when a function has free variables */ - PyErr_SetString(PyExc_PsycoError, "function has free variables"); - return NULL; - } - - newcode = NULL; - consts = NULL; - proxy_cobj = NULL; - psyco_fun = psyco_PsycoFunction_NewEx(code, - func->func_globals, - func->func_defaults, - rec); - if (psyco_fun == NULL) - goto error; - - consts = PyTuple_New(2); - if (consts == NULL) - goto error; - Py_INCREF(Py_None); - PyTuple_SET_ITEM(consts, 0, Py_None); /* if a __doc__ is expected there */ - PyTuple_SET_ITEM(consts, 1, (PyObject *)psyco_fun); /* consumes reference */ - psyco_fun = NULL; - - if (varnames == NULL) - { - if (free_cell_vars == NULL) - { - free_cell_vars = PyTuple_New(0); - if (free_cell_vars == NULL) - goto error; - } - if (empty_string == NULL) - { - empty_string = PyString_FromString(""); - if (empty_string == NULL) - goto error; - } - varnames = Py_BuildValue("ss", "args", "kwargs"); - if (varnames == NULL) - goto error; - } - - proxy_cobj = PyString_FromStringAndSize((char*)proxy_bytecode, - sizeof(proxy_bytecode)); - if (proxy_cobj == NULL) - goto error; - - newcode = PyCode_New(0, 2, 3, - CO_OPTIMIZED|CO_NEWLOCALS|CO_VARARGS|CO_VARKEYWORDS, - proxy_cobj, consts, - varnames, varnames, free_cell_vars, - free_cell_vars, code->co_filename, - code->co_name, code->co_firstlineno, - empty_string); - /* fall through */ - error: - Py_XDECREF(psyco_fun); - Py_XDECREF(proxy_cobj); - Py_XDECREF(consts); - return (PyObject*) newcode; -} - -static void psycofunction_dealloc(PsycoFunctionObject* self) -{ - PyObject_GC_UnTrack(self); - Py_XDECREF(self->psy_fastcall); - Py_XDECREF(self->psy_defaults); - Py_DECREF(self->psy_globals); - Py_DECREF(self->psy_code); - PyObject_GC_Del(self); -} - -#if 0 -/* Disabled -- not supposed to be seen at user level */ -static PyObject* psycofunction_repr(PsycoFunctionObject* self) -{ - char buf[100]; - if (self->psy_func->func_name == Py_None) - sprintf(buf, "", self); - else - sprintf(buf, "", - PyString_AsString(self->psy_func->func_name), self); - return PyString_FromString(buf); -} -#endif - -static PyObject* psycofunction_call(PsycoFunctionObject* self, - PyObject* arg, PyObject* kw) -{ - PyObject* codebuf; - PyObject* result; - PyObject* tdict; - PyFrameRuntime* fruntime; - PyObject* f; - stack_frame_info_t** finfo; - long* initial_stack; - int key; - bool err; - - if (kw != NULL && PyDict_Check(kw) && PyDict_Size(kw) > 0) { - /* keyword arguments not supported yet */ - goto unsupported; - } - - key = PyTuple_GET_SIZE(arg); - if (key < PyList_GET_SIZE(self->psy_fastcall)) - codebuf = PyList_GET_ITEM(self->psy_fastcall, key); - else - codebuf = NULL; - - if (codebuf == NULL) { - /* not already seen with this number of arguments */ - vinfo_t* vglobals; - vinfo_array_t* vdefaults; - vinfo_array_t* arginfo; - PsycoObject* po = NULL; - source_known_t* sk; - struct fncall_arg_s fncall; - bool support; - int i = key; - - /* make an array of run-time values */ - arginfo = array_new(i); - while (i--) { - /* arbitrary values for the source */ - arginfo->items[i] = vinfo_new(SOURCE_DUMMY); - } - - /* build the globals and defaults as compile-time values */ - Py_INCREF(self->psy_globals); - sk = sk_new((long) self->psy_globals, SkFlagPyObj); - vglobals = vinfo_new(CompileTime_NewSk(sk)); - - if (self->psy_defaults == NULL) - vdefaults = NullArray; - else { - i = PyTuple_GET_SIZE(self->psy_defaults); - vdefaults = array_new(i); - while (i--) { - PyObject* v = PyTuple_GET_ITEM( - self->psy_defaults, i); - Py_INCREF(v); - sk = sk_new((long) v, SkFlagPyObj); - vdefaults->items[i] = - vinfo_new(CompileTime_NewSk(sk)); - } - } - - /* make a "frame" */ - support = fncall_init(&fncall, self->psy_code); - if (support && fncall_collect_arguments(&fncall, vglobals, - arginfo->items, arginfo->count, - vdefaults->items, vdefaults->count)) { - po = psyco_build_frame(&fncall, - self->psy_recursion, NULL); - } - array_delete(vdefaults, NULL); - vinfo_decref(vglobals, NULL); - array_delete(arginfo, NULL); - - if (po == NULL) { - if (!support) { - /* unsupported bytecode features */ - codebuf = Py_None; - Py_INCREF(codebuf); - } - else /* Python exception (wrong # of arguments) */ - return NULL; - } - else { - /* compile the function */ - codebuf = (PyObject*) psyco_compile_code(po, - PsycoObject_Ready(po)); - } - /* cache 'codebuf' (note that this is not necessary, as - multiple calls to psyco_compile_code() will just return - the same codebuf, but it makes things faster because we - don't have to build a whole PsycoObject the next time. */ - i = key+1 - PyList_GET_SIZE(self->psy_fastcall); - if (i > 0) { - /* list too short, first enlarge it with NULLs */ - PyObject* tmp = PyList_New(i); - if (tmp != NULL) { - PyList_SetSlice(self->psy_fastcall, - PyList_GET_SIZE(self->psy_fastcall), - PyList_GET_SIZE(self->psy_fastcall), - tmp); - Py_DECREF(tmp); - } - /* errors are detected by the failing PyList_SetItem() - call below */ - } - /* Eats a reference to codebuf */ - if (PyList_SetItem(self->psy_fastcall, key, codebuf)) - PyErr_Clear(); /* not fatal, ignore error */ - } - - if (codebuf == Py_None) - goto unsupported; - - /* over the current Python frame, a lightweight chained list of - Psyco frames will be built. Mark the current Python frame as - the starting point of this chained list. */ - f = (PyObject*) PyEval_GetFrame(); - if (f == NULL) { - debug_printf(1, ("warning: empty Python frame stack\n")); - goto unsupported; - } - tdict = psyco_thread_dict(); - if (tdict==NULL) return NULL; - fruntime = PyCStruct_NEW(PyFrameRuntime, PyFrameRuntime_dealloc); - Py_INCREF(f); - fruntime->cs_key = f; - fruntime->psy_frames_start = &finfo; - fruntime->psy_code = self->psy_code; - fruntime->psy_globals = self->psy_globals; - extra_assert(PyDict_GetItem(tdict, f) == NULL); - err = PyDict_SetItem(tdict, f, (PyObject*) fruntime); - Py_DECREF(fruntime); - if (err) return NULL; - /* Warning, no 'return' between this point and the PyDict_DelItem() - below */ - - /* get the actual arguments */ - extra_assert(RUN_ARGC(codebuf) == PyTuple_GET_SIZE(arg)); - initial_stack = (long*) (&PyTuple_GET_ITEM(arg, 0)); - - /* run! */ - Py_INCREF(codebuf); - result = psyco_processor_run((CodeBufferObject*) codebuf, - initial_stack, &finfo, tdict); - Py_DECREF(codebuf); - psyco_trash_object(NULL); /* free any trashed object now */ - -#if CODE_DUMP >= 2 - psyco_dump_code_buffers(); -#endif - if (PyDict_DelItem(tdict, f)) { - Py_XDECREF(result); - result = NULL; - } - - if (result==NULL) - extra_assert(PyErr_Occurred()); - else - extra_assert(!PyErr_Occurred()); - return result; - - unsupported: - { /* Code copied from function_call() in funcobject.c */ - PyObject **d, **k; - int nk, nd; - - PyObject* argdefs = self->psy_defaults; - if (argdefs != NULL) { - d = &PyTuple_GET_ITEM((PyTupleObject *)argdefs, 0); - nd = PyTuple_Size(argdefs); - } - else { - d = NULL; - nd = 0; - } - - if (kw != NULL && PyDict_Check(kw)) { - int pos, i; - nk = PyDict_Size(kw); - k = PyMem_NEW(PyObject *, 2*nk); - if (k == NULL) { - PyErr_NoMemory(); - return NULL; - } - pos = i = 0; - while (PyDict_Next(kw, &pos, &k[i], &k[i+1])) - i += 2; - nk = i/2; - } - else { - k = NULL; - nk = 0; - } - - result = PyEval_EvalCodeEx(self->psy_code, - self->psy_globals, (PyObject *)NULL, - &PyTuple_GET_ITEM(arg, 0), PyTuple_Size(arg), - k, nk, d, nd, - NULL); - - if (k != NULL) - PyMem_DEL(k); - - return result; - } -} - -static int psycofunction_traverse(PsycoFunctionObject *f, - visitproc visit, void *arg) -{ - int err; - if (f->psy_fastcall) { - err = visit(f->psy_fastcall, arg); - if (err) - return err; - } - if (f->psy_defaults) { - err = visit(f->psy_defaults, arg); - if (err) - return err; - } - err = visit(f->psy_globals, arg); - if (err) - return err; - return 0; -} - -static int psycofunction_clear(PsycoFunctionObject *f) -{ - PyObject* o; - o = f->psy_fastcall; - if (o) { - f->psy_fastcall = NULL; - Py_DECREF(o); - } - o = f->psy_defaults; - if (o) { - f->psy_defaults = NULL; - Py_DECREF(o); - } - o = f->psy_globals; - f->psy_globals = Py_None; - Py_INCREF(Py_None); - Py_DECREF(o); - return 0; -} - -DEFINEVAR -PyTypeObject PsycoFunction_Type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "Psyco_function", /*tp_name*/ - sizeof(PsycoFunctionObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)psycofunction_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash*/ - (ternaryfunc)psycofunction_call, /*tp_call*/ - 0, /* tp_str */ - 0, /* tp_getattro */ - 0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ - 0, /* tp_doc */ - (traverseproc)psycofunction_traverse, /* tp_traverse */ - (inquiry)psycofunction_clear, /* tp_clear */ -}; diff --git a/nodebox/ext/psyco/src/c/psyfunc.h b/nodebox/ext/psyco/src/c/psyfunc.h deleted file mode 100644 index 451e01d..0000000 --- a/nodebox/ext/psyco/src/c/psyfunc.h +++ /dev/null @@ -1,59 +0,0 @@ - /***************************************************************/ -/*** Psyco Function objects (a.k.a. proxies) ***/ - /***************************************************************/ - -#ifndef _PSYFUNC_H -#define _PSYFUNC_H - - -#include "psyco.h" -#include /* for PyCodeObject */ - - -/* Encode a call to the given Python function, compiling it as needed. */ -EXTERNFN vinfo_t* psyco_call_pyfunc(PsycoObject* po, PyCodeObject* co, - vinfo_t* vglobals, vinfo_t* vdefaults, - vinfo_t* arg_tuple, int recursion); - -/* for pycompiler.c */ -EXTERNFN vinfo_t* psyco_save_inline_po(PsycoObject* po); -EXTERNFN PsycoObject* psyco_restore_inline_po(PsycoObject* po,vinfo_array_t** a); - - -/* Psyco proxies for Python functions. Calling a proxy has the same effect - as calling the function it has been built from, except that the function - is compiled first. As proxies are real Python objects, calling them is - the only way to go from Python's base level to Psyco's meta-level. - Note that (unlike in previous versions of Psyco) proxies should not be - seen by user Python code. Use _psyco.proxycode() to build a proxy and - emcompass it in a code object. */ -typedef struct { - PyObject_HEAD - PyCodeObject* psy_code; /* */ - PyObject* psy_globals; /* same as in Python function object */ - PyObject* psy_defaults; /* */ - int psy_recursion; /* # levels to automatically compile called functions */ - PyObject* psy_fastcall; /* cache mapping arg count to code bufs */ -} PsycoFunctionObject; - -EXTERNVAR PyTypeObject PsycoFunction_Type; - -#define PsycoFunction_Check(op) PyObject_TypeCheck(op, &PsycoFunction_Type) - - -#if 0 /* unneeded */ -EXTERNFN PyObject* psyco_PsycoFunction_New(PyFunctionObject* func, int rec); -#endif -EXTERNFN PsycoFunctionObject* psyco_PsycoFunction_NewEx(PyCodeObject* code, - PyObject* globals, - PyObject* defaults, /* or NULL */ - int rec); -EXTERNFN PyObject* psyco_proxycode(PyFunctionObject* func, int rec); - -PSY_INLINE bool is_proxycode(PyCodeObject* code) { - return PyTuple_Size(code->co_consts) > 1 && - PsycoFunction_Check(PyTuple_GET_ITEM(code->co_consts, 1)); -} - - -#endif /* _PSYFUNC_H */ diff --git a/nodebox/ext/psyco/src/c/pycodegen.h b/nodebox/ext/psyco/src/c/pycodegen.h deleted file mode 100644 index 4b6d4b8..0000000 --- a/nodebox/ext/psyco/src/c/pycodegen.h +++ /dev/null @@ -1,68 +0,0 @@ - /***************************************************************/ -/*** Generic support code for Python-specific code generation ***/ - /***************************************************************/ - -#ifndef _PYCODEGEN_H -#define _PYCODEGEN_H - -#include "vcompiler.h" -#include - - -/* emit Py_INCREF(v) */ -PSY_INLINE bool psyco_incref_v(PsycoObject* po, vinfo_t* v) -{ - if (!compute_vinfo(v, po)) return false; - psyco_incref_nv(po, v); - return true; -} - -/* emit Py_DECREF(v) */ -PSY_INLINE void psyco_decref_v(PsycoObject* po, vinfo_t* v) -{ - switch (gettime(v->source)) { - - case RunTime: - psyco_decref_rt(po, v); - break; - - case CompileTime: - psyco_decref_c(po, (PyObject*) CompileTime_Get(v->source)->value); - break; - } -} - - -/* can eat a reference if we had one in the first place, and - if no one else will require it (i.e. there is only one reference - left to 'vi') */ -PSY_INLINE bool eat_reference(vinfo_t* vi) -{ - if (has_rtref(vi->source) && vi->refcount == 1) - { - vi->source = remove_rtref(vi->source); - return true; - } - else - return false; -} - -/* force a reference to be consumed */ -PSY_INLINE void consume_reference(PsycoObject* po, vinfo_t* vi) -{ - if (!eat_reference(vi)) - psyco_incref_v(po, vi); -} - -/* make sure we have a reference on 'vi' */ -PSY_INLINE void need_reference(PsycoObject* po, vinfo_t* vi) -{ - if ((vi->source & (TimeMask | RunTime_NoRef)) == (RunTime | RunTime_NoRef)) - { - vi->source = add_rtref(vi->source); - psyco_incref_rt(po, vi); - } -} - - -#endif /* _PYCODEGEN_H */ diff --git a/nodebox/ext/psyco/src/c/stats.c b/nodebox/ext/psyco/src/c/stats.c deleted file mode 100644 index 1b7e698..0000000 --- a/nodebox/ext/psyco/src/c/stats.c +++ /dev/null @@ -1,387 +0,0 @@ -#include "stats.h" -#include "mergepoints.h" -#include "profile.h" -#include "cstruct.h" -#include -#include - - -static PyObject* codestats_dict; /* dict of {cs: cs} */ - - -static void PyCodeStats_dealloc(PyCodeStats* cs) -{ - Py_XDECREF(cs->st_codebuf); - Py_XDECREF(cs->st_globals); - Py_XDECREF(cs->st_mergepoints); -} - -DEFINEFN -PyCodeStats* PyCodeStats_Get(PyCodeObject* co) -{ - PyCodeStats* cs; - RECLIMIT_SAFE_ENTER(); - cs = (PyCodeStats*) PyCStruct_DictGet(codestats_dict, (PyObject*) co); - if (cs == NULL) { - cs = PyCStruct_NEW(PyCodeStats, PyCodeStats_dealloc); - - Py_INCREF(co); - cs->cs_key = (PyObject*) co; - cs->st_charge = 0.0f; - cs->st_mergepoints = NULL; - cs->st_codebuf = NULL; - cs->st_globals = NULL; - - if (PyDict_SetItem(codestats_dict, (PyObject*) cs, - (PyObject*) cs) < 0) - OUT_OF_MEMORY(); - Py_DECREF(cs); /* two references left in codestats_dict */ - } - RECLIMIT_SAFE_LEAVE(); - return cs; -} - -DEFINEFN -PyCodeStats* PyCodeStats_MaybeGet(PyCodeObject* co) -{ - PyCodeStats* cs; - RECLIMIT_SAFE_ENTER(); - cs = (PyCodeStats*) PyCStruct_DictGet(codestats_dict, (PyObject*) co); - RECLIMIT_SAFE_LEAVE(); - return cs; -} - - -/***************************************************************/ - /*** Collecting statistics ***/ - -/* to give recently executed code objects more chances to be compiled, - be simulate a "decay" of the st_charge associated with them. - We don't actually lower their st_charge; instead, we make their - value comparatively less important by increasing how much charge - the currently executing code objects will recieve. */ - -static double charge_total = 0.0; /* total of all st_charges */ -static float charge_prelimit = 0.0; /* optimization only */ -static float charge_watermark = 1.0f; /* see below */ -static float charge_unit = 1E-38f; /* current unit of charge */ -static float charge_parent2 = 1.0f; /* see below */ -static PyObject* charge_callback = NULL; - -/* When a single PyCodeStats.st_charge reaches - 'charge_total * charge_watermark', the callback function is called - (and typically, compilation starts). So charge_watermark gives the - charge limit expressed in a fraction of the total charge. This is - why decaying is important: a single function can reach a relatively - high percentage of the total charge only if the other functions' - charge decay quickly enough. - - 'charge_total' is a double because it is an accumulator and its - value must be accurate. */ - -/* the parent of a running frame is also charged, and its own parent too, - and so on, but the charge is less and less. Satistically, each parent - is charged only 'charge_parent2 / 2' as much as its child. */ - - -DEFINEFN -PyObject* psyco_stats_read(char* name) -{ - if (strcmp(name, "total") == 0) - return PyFloat_FromDouble( charge_total); - if (strcmp(name, "unit") == 0) - return PyFloat_FromDouble((double) charge_unit); - if (strcmp(name, "watermark") == 0) - return PyFloat_FromDouble((double) charge_watermark); - if (strcmp(name, "parent2") == 0) - return PyFloat_FromDouble((double) charge_parent2); - - PyErr_SetString(PyExc_ValueError, "no such readable parameter"); - return NULL; -} - -static int writeobj_with_ref(PyObject* obj, PyObject** target) -{ - PyObject* prev = *target; - if (obj == Py_None) - obj = NULL; - else - Py_INCREF(obj); - *target = obj; - Py_XDECREF(prev); - return 1; -} - -DEFINEFN -bool psyco_stats_write(PyObject* args, PyObject* kwds) -{ - static char *kwlist[] = {"unit", - "total", - "watermark", - "parent2", - "callback", - "logger", 0}; - charge_prelimit = 0.0f; - return PyArg_ParseTupleAndKeywords(args, kwds, "|fdffO&O&", kwlist, - &charge_unit, - &charge_total, - &charge_watermark, - &charge_parent2, - &writeobj_with_ref, &charge_callback, - &writeobj_with_ref, &psyco_logger); -} - - -/* very cheap very weak pseudo-random number generator */ -static unsigned int c_seek = 1; -PSY_INLINE unsigned int c_random(void) -{ - return (c_seek = c_seek * 9); -} - - -#if VERBOSE_STATS -# define STATLINES 10 -static void stats_dump(void) -{ - float top[STATLINES]; - char* top_names[STATLINES]; - int i, j, k=0; - PyObject *key, *value; - for (i=0; ics_key)); - co = (PyCodeObject*) cs->cs_key; - for (i=0; ist_charge > top[i]) { - for (j=STATLINES-1; j>i; j--) { - top [j] = top [j-1]; - top_names[j] = top_names[j-1]; - } - top [i] = cs->st_charge; - top_names[i] = PyCodeObject_NAME(co); - break; - } - } - } - for (i=0; if_code); - cs_charge = (float)(cs->st_charge + charge); - cs->st_charge = cs_charge; - charge_total += charge; - if (cs_charge > charge_prelimit && charge_callback) { - /* update charge_prelimit */ - charge_prelimit = (float)(charge_total * charge_watermark); - if (cs_charge > charge_prelimit) { - /* still over the up-to-date limit */ - cs->st_charge = 0.0f; - break; - } - } - if (bits >= 0) - return; /* triggers in about 50% of the cases */ - bits <<= 1; - f = f->f_back; - if (!f) - return; - charge *= charge_parent2; - } - - /* charge limit reached, invoke callback */ - { - PyObject* r; - r = PyObject_CallFunction(charge_callback, "Of", f, cs_charge); - if (r == NULL) { - PyErr_WriteUnraisable((PyObject*) f); - } - else { - Py_DECREF(r); - } - } -} - -DEFINEFN -void psyco_stats_collect(void) -{ - /* collect statistics for all registered threads */ - PyInterpreterState* istate = PyThreadState_Get()->interp; - PyThreadState* tstate; - for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { - psyco_stats_append(tstate, tstate->frame); - } -} - -DEFINEFN -void psyco_stats_reset(void) -{ - /* reset all stats */ - int i = 0; - PyObject *key, *value, *d; - stats_printf(("stats: reset\n")); - - /* reset the charge of all PyCodeStats, keep only the used ones */ - RECLIMIT_SAFE_ENTER(); - d = PyDict_New(); - if (d == NULL) - OUT_OF_MEMORY(); - while (PyDict_Next(codestats_dict, &i, &key, &value)) { - PyCodeStats* cs = (PyCodeStats*) key; - if (cs->st_mergepoints) { - /* clear the charge and keep alive */ - cs->st_charge = 0.0f; - if (PyDict_SetItem(d, key, value)) - OUT_OF_MEMORY(); - } - } - RECLIMIT_SAFE_LEAVE(); - Py_DECREF(codestats_dict); - codestats_dict = d; - charge_total = 0.0; - charge_prelimit = 0.0f; - - /* reset the time measure in all threads */ - { -#if MEASURE_ALL_THREADS - PyInterpreterState* istate = PyThreadState_Get()->interp; - PyThreadState* tstate; - for (tstate=istate->tstate_head; tstate; tstate=tstate->next) { - (void) get_measure(tstate); - } -#else - (void) get_measure(NULL); -#endif - } -} - -DEFINEFN -PyObject* psyco_stats_dump(void) -{ - PyObject* d = PyDict_New(); - int i = 0; - PyObject *key, *value; - if (d == NULL) - return NULL; - - while (PyDict_Next(codestats_dict, &i, &key, &value)) { - PyCodeStats* cs = (PyCodeStats*) key; - PyObject* o = PyFloat_FromDouble(cs->st_charge); - extra_assert(PyCStruct_Check(key)); - extra_assert(PyCode_Check(cs->cs_key)); - if (o == NULL || PyDict_SetItem(d, cs->cs_key, o)) { - Py_DECREF(d); - return NULL; - } - } - stats_dump(); - return d; -} - -DEFINEFN -PyObject* psyco_stats_top(int n) -{ - PyObject* l; - PyObject* l2 = NULL; - int i, k=0, full=0; - PyObject *key, *value; - float charge_min = (float)(charge_total * 0.001); - - extra_assert(n>0); - l = PyList_New(n); - if (l == NULL) - goto fail; - - while (PyDict_Next(codestats_dict, &k, &key, &value)) { - PyCodeStats* cs = (PyCodeStats*) key; - extra_assert(PyCStruct_Check(key)); - extra_assert(PyCode_Check(cs->cs_key)); - if (cs->st_charge <= charge_min) - continue; - if (full < n) - full++; - i = full; - while (--i > 0) { - PyObject* o = PyList_GetItem(l, i-1); - PyCodeStats* current = (PyCodeStats*) o; - if (cs->st_charge <= current->st_charge) - break; - Py_INCREF(o); - if (PyList_SetItem(l, i, o)) - goto fail; - } - Py_INCREF(cs); - if (PyList_SetItem(l, i, (PyObject*) cs)) - goto fail; - cs = (PyCodeStats*) PyList_GetItem(l, full-1); - charge_min = cs->st_charge; - } - - l2 = PyList_New(full); - if (l2 == NULL) - goto fail; - - for (i=0; ics_key, - (double)(cs->st_charge / charge_total)); - if (!x || PyList_SetItem(l2, i, x)) - goto fail; - } - Py_DECREF(l); - return l2; - - fail: - Py_XDECREF(l2); - Py_XDECREF(l); - return NULL; -} - - - /***************************************************************/ - -#if !MEASURE_ALL_THREADS -DEFINEVAR PyThreadState* psyco_main_threadstate; -#endif - - -INITIALIZATIONFN -void psyco_stats_init(void) -{ - codestats_dict = PyDict_New(); - -#if !MEASURE_ALL_THREADS - psyco_main_threadstate = PyThreadState_Get(); -#endif -} diff --git a/nodebox/ext/psyco/src/c/stats.h b/nodebox/ext/psyco/src/c/stats.h deleted file mode 100644 index 44ac1a6..0000000 --- a/nodebox/ext/psyco/src/c/stats.h +++ /dev/null @@ -1,74 +0,0 @@ - /***************************************************************/ -/*** Statistics management and usage about code objects ***/ - /***************************************************************/ - -#ifndef _STATS_H -#define _STATS_H - -/* NB.: the real-time profilers are in profile.c */ - -#include "psyco.h" -#include "cstruct.h" -#include "mergepoints.h" -#include "timing.h" -#include "Python/frames.h" -#include -#include - - -#if VERBOSE_STATS -# define stats_printf(args) debug_printf(1, args) -#else -# define stats_printf(args) do { } while (0) /* nothing */ -#endif - - -/* extra data attached to code objects */ -typedef struct { - PyCStruct_HEAD /* cs_key is the code object */ - float st_charge; /* usage statistics */ - PyObject* st_mergepoints; - PyObject* st_codebuf; /* as compiled from PsycoCode_CompileCode() */ - PyObject* st_globals; /* globals used in st_codebuf */ -} PyCodeStats; - - -/* return the PyCodeStats for 'co' */ -EXTERNFN PyCodeStats* PyCodeStats_Get(PyCodeObject* co); -EXTERNFN PyCodeStats* PyCodeStats_MaybeGet(PyCodeObject* co); - -/* compute and return a Borrowed reference to st_mergepoints */ -PSY_INLINE PyObject* PyCodeStats_MergePoints(PyCodeStats* cs, int module) { - PyObject* mp = cs->st_mergepoints; - if (mp == NULL) { - mp = psyco_build_merge_points((PyCodeObject*) cs->cs_key, - module); - cs->st_mergepoints = mp; - } - else if (!module && mp != Py_None && - (psyco_mp_flags(mp) & MP_FLAGS_MODULE)) - mp = Py_None; /* can only run as top-level module code */ - return mp; -} - - -EXTERNFN void psyco_stats_reset(void); -EXTERNFN void psyco_stats_append(PyThreadState* tstate, PyFrameObject* f); -EXTERNFN void psyco_stats_collect(void); -EXTERNFN PyObject* psyco_stats_top(int n); - /* set tunable parameters */ -EXTERNFN bool psyco_stats_write(PyObject* args, PyObject* kwds); -EXTERNFN PyObject* psyco_stats_read(char* name); -EXTERNFN PyObject* psyco_stats_dump(void); - - -/* private timing data, based on timing.h */ -#if MEASURE_ALL_THREADS -# define measuring_state(ts) 1 -#else -# define measuring_state(ts) ((ts) == psyco_main_threadstate) -EXTERNVAR PyThreadState* psyco_main_threadstate; -#endif - - -#endif /* _STATS_H */ diff --git a/nodebox/ext/psyco/src/c/timing.h b/nodebox/ext/psyco/src/c/timing.h deleted file mode 100644 index fe115f7..0000000 --- a/nodebox/ext/psyco/src/c/timing.h +++ /dev/null @@ -1,32 +0,0 @@ - /***************************************************************/ -/*** Measuring processor time ***/ - /***************************************************************/ - -#ifndef _TIMING_H -#define _TIMING_H - -#include "psyco.h" -#include "Python/pyver.h" - - -#define measure_is_zero(m) ((m) == (time_measure_t) 0) - - -/***************************************************************/ -/* Use the tick_counter field of the PyThreadState for timing */ - -#define MEASURE_ALL_THREADS 1 - -typedef int time_measure_t; - -PSY_INLINE time_measure_t get_measure(PyThreadState* tstate) -{ - int result = tstate->tick_counter; - tstate->tick_counter = 0; - return result; -} - -/***************************************************************/ - - -#endif /* _TIMING_H */ diff --git a/nodebox/ext/psyco/src/c/vcompiler.c b/nodebox/ext/psyco/src/c/vcompiler.c deleted file mode 100644 index c9a2b7c..0000000 --- a/nodebox/ext/psyco/src/c/vcompiler.c +++ /dev/null @@ -1,1004 +0,0 @@ -#include "vcompiler.h" -#include "dispatcher.h" -#include "codemanager.h" -#include "mergepoints.h" -#include "Python/pycompiler.h" -#include "pycodegen.h" -#include - - -DEFINEVAR const long psyco_zero = 0; -DEFINEVAR source_virtual_t psyco_vsource_not_important; - - -/*****************************************************************/ - -BLOCKALLOC_IMPLEMENTATION(vinfo, vinfo_t, 8192) -BLOCKALLOC_IMPLEMENTATION(sk, source_known_t, 4096) - -/*****************************************************************/ - -DEFINEFN -vinfo_array_t* array_grow1(vinfo_array_t* array, int ncount) -{ - int i = array->count; - extra_assert(ncount > i); - if (i == 0) - array = PyMem_MALLOC(sizeof(int) + ncount * sizeof(vinfo_t*)); - else - array = PyMem_REALLOC(array, sizeof(int) + ncount * sizeof(vinfo_t*)); - if (array == NULL) - OUT_OF_MEMORY(); - array->count = ncount; - while (iitems[i++] = NULL; - return array; -} - -DEFINEFN -void vinfo_array_shrink(PsycoObject* po, vinfo_t* vi, int ncount) -{ - vinfo_array_t* array = vi->array; - int i = array->count; - if (i <= ncount) - return; - - while (i > ncount) - { - vinfo_t* v1 = array->items[--i]; - if (v1 != NULL) - { - array->items[i] = NULL; - vinfo_decref(v1, po); - } - } - if (ncount == 0) - array = NullArray; - else - { - array = PyMem_REALLOC(array, sizeof(int) + ncount * sizeof(vinfo_t*)); - if (array == NULL) - OUT_OF_MEMORY(); - array->count = ncount; - } - vi->array = array; -} - - -/*****************************************************************/ - -DEFINEFN -void sk_release(source_known_t *sk) -{ -#if 0 - XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX - The Python objects who get once in a source_known_t are never - freed. This is so because we might have references to them left - in the code buffers. This is tricky because the references can - be indirect (to a sub-objects, to a field in the object structure, - etc...) - So not freeing them at all is the easy way out. It is expected - that not too many objects will get lost this way. This must be - carefully worked out when implementing releasing of code - buffers. It will probably require careful checks for all - instructions that might emit an immediate value in the code, - and for where this immediate value (indirectly or not) comes from. - XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX --- XXX - if ((sk->refcount1_flags & SkFlagPyObj) != 0) { - Py_XDECREF((PyObject*)(sk->value)); - } -#endif - sk_delete(sk); -} - -DEFINEFN -vinfo_t* vinfo_copy(vinfo_t* vi) -{ - vinfo_t* result = vinfo_new_skref(vi->source); - result->array = vi->array; - if (result->array->count > 0) - { - result->array = array_new(result->array->count); - duplicate_array(result->array, vi->array); - } - return result; -} - - -DEFINEFN -void vinfo_release(vinfo_t* vi, PsycoObject* po) -{ - switch (gettime(vi->source)) { - - case RunTime: - if (po != NULL) - { - if (has_rtref(vi->source)) - { - /* write Py_DECREF() when releasing the last reference to - a run-time vinfo_t holding a reference to a Python object */ - psyco_decref_rt(po, vi); - } - RTVINFO_RELEASE(vi->source); - } - break; - - case CompileTime: - sk_decref(CompileTime_Get(vi->source)); - break; - -#if HAVE_CCREG - case VirtualTime: - if (po != NULL) - { - int i; - for (i=0; iccregs[i]) - po->ccregs[i] = NULL; - } - break; -#endif - } - - /* must be after the switch because psyco_decref_rt() did use the - array to extract any available type information to speed up Py_DECREF(). */ - if (vi->array != NullArray) - array_delete(vi->array, po); - -#if HAVE_CCREG && PSYCO_DEBUG - /* only virtual-time vinfos are allowed in po->ccreg */ - if (po != NULL) - { - int i; - for (i=0; iccregs[i]); - } -#endif - psyco_llfree_vinfo(vi); -} - -DEFINEFN -void vinfo_move(PsycoObject* po, vinfo_t* vtarget, vinfo_t* vsource) -{ - Source src = vsource->source; - -#if PSYCO_DEBUG - extra_assert(!is_virtualtime(src)); - if (is_compiletime(src)) - { - /* a compile-time vinfo may only hold compile-time subitems */ - int j; - for (j=0; jarray->count; j++) - extra_assert(vtarget->array->items[j] == NULL || - is_compiletime(vtarget->array->items[j]->source)); - } -#endif - - extra_assert(vsource->array == NullArray); - vtarget->source = src; - if (is_runtime(src)) - RTVINFO_MOVE(src, vtarget); - extra_assert(vsource->refcount == 1); - psyco_llfree_vinfo(vsource); - clear_tmp_marks(vtarget->array); - psyco_simplify_array(vtarget->array, po); -} - - -DEFINEFN -void clear_tmp_marks(vinfo_array_t* array) -{ - /* clear all 'tmp' fields in the array, recursively */ - int i = array->count; - while (i--) - if (array->items[i] != NULL) - { - array->items[i]->tmp = NULL; - if (array->items[i]->array != NullArray) - clear_tmp_marks(array->items[i]->array); - } -} - -#if ALL_CHECKS -DEFINEFN -void assert_cleared_tmp_marks(vinfo_array_t* array) -{ - /* assert that all 'tmp' fields are NULL */ - int i = array->count; - while (i--) - if (array->items[i] != NULL) - { - extra_assert(array->items[i]->tmp == NULL); - if (array->items[i]->array != NullArray) - assert_cleared_tmp_marks(array->items[i]->array); - } -} - -static bool array_contains(vinfo_array_t* array, vinfo_t* vi) -{ - bool result = false; - int i = array->count; - while (i--) - if (array->items[i] != NULL) - { - if (array->items[i] == vi) - result = true; - if (array->items[i]->array != NullArray) - { - if (is_compiletime(array->items[i]->source)) - extra_assert(!array_contains(array->items[i]->array, vi)); - else - if (array_contains(array->items[i]->array, vi)) - result = true; - } - } - return result; -} - -DEFINEFN -void assert_array_contains_nonct(vinfo_array_t* array, vinfo_t* vi) -{ - /* check that 'vi' appears at least once in 'array', and - never appears as subitem of a compile-time vinfo_t */ - extra_assert(array_contains(array, vi)); -} - -static void coherent_array(vinfo_array_t* source, PsycoObject* po, int found[], - bool allow_any) -{ - int i = source->count; - while (i--) - if (source->items[i] != NULL) - { - Source src = source->items[i]->source; - extra_assert(allow_any || is_compiletime(src)); - switch (gettime(src)) { - case RunTime: - /* test that we don't have an unreasonably high value - although it might still be correct in limit cases */ - extra_assert(getstack(src) < RunTime_StackMax/2); - RTVINFO_CHECK(po, source->items[i], found); - break; - case CompileTime: - case VirtualTime: - break; - default: - psyco_fatal_msg("gettime() corrupted"); - } -#if HAVE_CCREG - if (psyco_vsource_cc(src) != CC_ALWAYS_FALSE) - { - int index = INDEX_CC(psyco_vsource_cc(src)); - extra_assert(po->ccregs[index] == source->items[i]); - found[REG_TOTAL+index] = 1; - } -#endif - if (source->items[i]->array != NullArray) - coherent_array(source->items[i]->array, po, found, - !is_compiletime(src)); - } -} - -static void hack_refcounts(vinfo_array_t* source, int delta, int mvalue) -{ - int i = source->count; - while (i--) - if (source->items[i] != NULL) - { - long rc = source->items[i]->refcount; - rc = ((rc + delta) & 0xFFFF) + (rc & 0x10000); - source->items[i]->refcount = rc; - if ((rc & 0x10000) == mvalue) - { - source->items[i]->refcount ^= 0x10000; - if (source->items[i]->array != NullArray) - hack_refcounts(source->items[i]->array, delta, mvalue); - } - } -} - -static vinfo_t* nonnull_refcount(vinfo_array_t* source) -{ - int i = source->count; - while (i--) - if (source->items[i] != NULL) - { - if (source->items[i]->refcount != 0x10000) - { - fprintf(stderr, "nonnull_refcount: item %d\n", i); - return source->items[i]; - } - if (source->items[i]->array != NullArray) - { - vinfo_t* result = nonnull_refcount(source->items[i]->array); - if (result != NULL) - { - fprintf(stderr, "nonnull_refcount: in array item %d\n", i); - return result; - } - } - } - return NULL; -} - -DEFINEFN -void psyco_assert_coherent1(PsycoObject* po, bool full) -{ - vinfo_array_t debug_extra_refs; - int found[REG_TOTAL+HAVE_CCREG]; - int i; - vinfo_t* err; - for (i=0; ipr.exc; /* normally private to pycompiler.c,*/ - debug_extra_refs.items[1] = po->pr.val; /* but this is for debugging only */ - coherent_array(&po->vlocals, po, found, true); - coherent_array(&debug_extra_refs, po, found, true); - if (full) - { - RTVINFO_CHECKED(po, found); -#if HAVE_CCREG - for (i=0; iccregs[i] == NULL); -#endif - hack_refcounts(&po->vlocals, -1, 0); - hack_refcounts(&debug_extra_refs, -1, 0); - err = nonnull_refcount(&po->vlocals); - hack_refcounts(&debug_extra_refs, +1, 0x10000); - hack_refcounts(&po->vlocals, +1, 0x10000); - extra_assert(!err); /* see nonnull_refcounts() */ - } -} -#endif /* ALL_CHECKS */ - -DEFINEFN -void duplicate_array(vinfo_array_t* target, vinfo_array_t* source) -{ - /* make a depth copy of an array. - Same requirements as psyco_duplicate(). - Do not use for arrays of length 0. */ - int i; - for (i=0; icount; i++) - { - vinfo_t* sourcevi = source->items[i]; - if (sourcevi == NULL) - target->items[i] = NULL; - else if (sourcevi->tmp != NULL) - { - target->items[i] = sourcevi->tmp; - target->items[i]->refcount++; - } - else - { - vinfo_t* targetvi = vinfo_copy(sourcevi); - targetvi->tmp = NULL; - target->items[i] = sourcevi->tmp = targetvi; - } - } - target->count = source->count; - - /*return true; - - fail: - while (i--) - if (items[i] != NULL) - { - items[i]->tmp = NULL; - target->items[i]->decref(NULL); - } - return false;*/ -} - -DEFINEFN -PsycoObject* psyco_duplicate(PsycoObject* po) -{ - /* Requires that all 'tmp' marks in 'po' are cleared. - In the new copy all 'tmp' marks will be cleared. */ - - PsycoObject* result = PsycoObject_New(po->vlocals.count); - psyco_assert_coherent(po); - assert_cleared_tmp_marks(&po->vlocals); - duplicate_array(&result->vlocals, &po->vlocals); - - /* set the register pointers of 'result' to the new vinfo_t's */ - DUPLICATE_PROCESSOR(result, po); - - /* the rest of the data is copied with no change */ - result->respawn_cnt = po->respawn_cnt; - result->respawn_proxy = po->respawn_proxy; - result->code = po->code; - result->codelimit = po->codelimit; - pyc_data_duplicate(&result->pr, &po->pr); - - assert_cleared_tmp_marks(&result->vlocals); - psyco_assert_coherent(result); - return result; -} - -DEFINEFN void PsycoObject_Delete(PsycoObject* po) -{ - pyc_data_release(&po->pr); - deallocate_array(&po->vlocals, NULL); - PyMem_FREE(po); -} - -DEFINEFN -bool psyco_limit_nested_weight(PsycoObject* po, vinfo_array_t* array, - int nw_index, signed char nw_end) -{ - signed char nw; - int i; - for (i=array->count; i--; ) - { - vinfo_t* vi = array->items[i]; - if (vi != NULL) - { - nw = nw_end; - if (is_virtualtime(vi->source)) - { - source_virtual_t* sv = VirtualTime_Get(vi->source); - nw -= sv->nested_weight[nw_index]; - if (nw <= 0) - { - /* maximum reached, force out of virtual-time */ - if (!sv->compute_fn(po, vi)) - return false; - /* vi->array may be modified by compute_fn() */ - continue; - } - } - if (vi->array != NullArray) - if (!psyco_limit_nested_weight(po, vi->array, nw_index, nw)) - return false; - } - } - return true; -} - -DEFINEFN -long direct_read_vinfo(vinfo_t* vi, char* data) -{ - int sindex; - if (vi == NULL) - { - PyErr_SetString(PyExc_PsycoError, "undefined value"); - return -1; - } - switch (gettime(vi->source)) { - - case RunTime: - sindex = getstack(vi->source); - return *(long*)(data+sindex); - - case CompileTime: - return CompileTime_Get(vi->source)->value; - - default: - Py_FatalError("Psyco: virtual-time direct_read_vinfo"); - return 0; - } -} - -DEFINEFN -PyObject* direct_xobj_vinfo(vinfo_t* vi, char* data) -{ - int sindex; - PyObject* o = NULL; - if (vi != NULL) - { - switch (gettime(vi->source)) { - - case RunTime: - sindex = getstack(vi->source); - o = *(PyObject**)(data+sindex); - break; - - case CompileTime: - o = (PyObject*) CompileTime_Get(vi->source)->value; - break; - - case VirtualTime: - if (VirtualTime_Get(vi->source)->direct_compute_fn == NULL) - Py_FatalError("Psyco: value not directly computable"); - return VirtualTime_Get(vi->source)->direct_compute_fn(vi, data); - } - Py_XINCREF(o); - } - return o; -} - - -/*****************************************************************/ - - -PSY_INLINE vinfo_t* field_read(PsycoObject* po, vinfo_t* vi, long offset, - vinfo_t* vindex, defield_t df, bool newref) -{ - vinfo_t* result = psyco_memory_read(po, vi, offset, vindex, - FIELD_SIZE2(df), (long)df & FIELD_UNSIGNED); - if ((long)df & FIELD_NONNEG) { - assert_nonneg(result); - } - if (newref && FIELD_HAS_REF(df)) { - /* the container 'vi' could be freed while the - field 'result' is still in use */ - need_reference(po, result); - } - return result; -} - -DEFINEFN -vinfo_t* psyco_internal_getfld(PsycoObject* po, int findex, defield_t df, - vinfo_t* vi, long offset) -{ - bool newref = !((long)df & FIELD_INTL_NOREF); - vinfo_t* vf; - if (is_virtualtime(vi->source)) { - vf = vinfo_getitem(vi, findex); - if (vf != NULL) - goto done; - if (!compute_vinfo(vi, po)) - return NULL; - } - if ((long)df & FIELD_MUTABLE) { - extra_assert(newref); - return field_read(po, vi, offset, NULL, df, newref); - } - vf = vinfo_getitem(vi, findex); - if (vf != NULL) - goto done; - - if (is_runtime(vi->source)) { - vf = field_read(po, vi, offset, NULL, df, newref); - } - else { - long result; - long sk_flag = 0; - char* ptr = (char*)(CompileTime_Get(vi->source)->value); - ptr += offset; - switch (FIELD_SIZE2(df)) { - case 0: - if ((long)df & FIELD_UNSIGNED) - result = *((unsigned char*) ptr); - else - result = *((signed char*) ptr); - break; - case 1: - if ((long)df & FIELD_UNSIGNED) - result = *((unsigned short*) ptr); - else - result = *((signed short*) ptr); - break; - default: - result = *((long*) ptr); - if ((long)df & FIELD_PYOBJ_REF) { - extra_assert(result); - extra_assert(newref); - Py_INCREF((PyObject*) result); - sk_flag = SkFlagPyObj; - } - break; - } - vf = vinfo_new(CompileTime_NewSk(sk_new(result, sk_flag))); - } - - if (((long)df & FIELD_ARRAY) && newref) - return vf; - CHECK_FIELD_INDEX(findex); - vinfo_setitem(po, vi, findex, vf); - - done: - if (newref) - vinfo_incref(vf); - return vf; -} - -DEFINEFN -vinfo_t* psyco_get_field_array(PsycoObject* po, vinfo_t* vi, defield_t df, - vinfo_t* vindex) -{ - long offset = FIELD_C_OFFSET(df); - if (!compute_vinfo(vindex, po)) - return NULL; - - extra_assert((long)df & FIELD_ARRAY); - if (is_compiletime(vindex->source)) { - return psyco_get_nth_field(po, vi, df, - CompileTime_Get(vindex->source)->value); - } - else { - if (!compute_vinfo(vi, po)) - return NULL; - return field_read(po, vi, offset, vindex, df, true); - } -} - -DEFINEFN -bool psyco_internal_putfld(PsycoObject* po, int findex, defield_t df, - vinfo_t* vi, long offset, vinfo_t* value) -{ - if (is_virtualtime(vi->source)) { - vinfo_t* vf = vinfo_getitem(vi, findex); - if (vf != NULL) { - /* can only set field virtually if a value was - previously found */ - vinfo_incref(value); - vinfo_setitem(po, vi, findex, value); - return true; - } - if (!compute_vinfo(vi, po)) - return false; - } - extra_assert((long)df & FIELD_MUTABLE); - if (!psyco_memory_write(po, vi, offset, NULL, FIELD_SIZE2(df), value)) - return false; - - if (FIELD_HAS_REF(df)) { - /* 'value' is a PyObject* that wants to hold a reference */ - if (vinfo_getitem(vi, findex) == value) { - /* special case: writing a value that is already - virtually there. This is common when promoting - objects out of virtual-time. In this case, we try - to transfer the reference to the new memory - location. If this succeeds, the original 'value' - must be removed from 'vi', because it no longer - holds the reference and might become invalid if - its new no-longer-virtual container object is - deleted too early. - - This causes the 'value' to be reloaded from the - memory location the next time it is used, but in a - lot of cases it avoids a Py_INCREF()/Py_DECREF() - pair, which costs more. */ - if (decref_create_new_lastref(po, value)) { - vinfo_setitem(po, vi, findex, NULL); - } - } - else { - /* common case */ - decref_create_new_ref(po, value); - } - } - return true; -} - -DEFINEFN -bool psyco_put_field_array(PsycoObject* po, vinfo_t* vi, defield_t df, - vinfo_t* vindex, vinfo_t* value) -{ - long offset = FIELD_C_OFFSET(df); - if (!compute_vinfo(vindex, po)) - return false; - - extra_assert((long)df & FIELD_ARRAY); - if (is_compiletime(vindex->source)) { - return psyco_put_nth_field(po, vi, df, - CompileTime_Get(vindex->source)->value, - value); - } - else { - if (!compute_vinfo(vi, po)) - return false; - if (!psyco_memory_write(po, vi, offset, vindex, - FIELD_SIZE2(df), value)) - return false; - if (FIELD_HAS_REF(df)) { - /* 'value' is a PyObject* that wants to - hold a reference */ - decref_create_new_ref(po, value); - } - return true; - } -} - -DEFINEFN -void psyco_assert_field(PsycoObject* po, vinfo_t* vi, defield_t df, - long value) -{ - long sk_flag = 0; - extra_assert(!((long)df & FIELD_MUTABLE)); - - if (is_compiletime(vi->source)) { -#if PSYCO_DEBUG - /* check assertion at compile-time */ - vinfo_t* vf = psyco_get_field(po, vi, df); - extra_assert(CompileTime_Get(vf->source)->value == value); - vinfo_decref(vf, po); -#endif - } - else { - if (FIELD_HAS_REF(df)) { - Py_INCREF((PyObject*) value); - sk_flag = SkFlagPyObj; - } - CHECK_FIELD_INDEX(df); - vinfo_setitem(po, vi, FIELD_INDEX(df), - vinfo_new(CompileTime_NewSk(sk_new(value, sk_flag)))); - } -} - - -/*****************************************************************/ - - -typedef struct { - CodeBufferObject* self; - PsycoObject* po; - resume_fn_t resume_fn; - void* jump_to_fix; -} coding_pause_t; - -static code_t* do_resume_coding(coding_pause_t* cp) -{ - /* called when entering a coding_pause (described by 'cp') */ - code_t* target = (cp->resume_fn) (cp->po, cp+1); /* resume compilation work */ - - /* then fix the jump to point to 'target' */ - change_cond_jump_target(cp->jump_to_fix, target); - - /* cannot Py_DECREF(cp->self) because the current function is returning into - that code now, but any time later is fine: use the trash of codemanager.c */ - dump_code_buffers(); - psyco_trash_object((PyObject*) cp->self); - return target; -} - -/* Prepare a 'coding pause', i.e. a short amount of code (proxy) that will be - called only if the execution actually reaches it to go on with compilation. - 'po' is the PsycoObject corresponding to the proxy. - 'jmpcondition' should not be CC_ALWAYS_FALSE. - The (possibly conditional) jump to the proxy is encoded in 'calling_code'. - When the execution reaches the proxy, 'resume_fn' is called and the proxy - destroys itself and replaces the original jump to it by a jump to the newly - compiled code. */ -DEFINEFN -void psyco_coding_pause(PsycoObject* po, condition_code_t jmpcondition, - resume_fn_t resume_fn, void* extra, int extrasize) -{ - coding_pause_t* cp; - code_t* calling_code; - code_t* calling_limit; - code_t* limit; - CodeBufferObject* codebuf = psyco_new_code_buffer(NULL, NULL, &limit); - - /* the proxy contains only a jump to do_resume_coding, - followed by a coding_pause_t structure, itself followed by the - 'extra' data. */ - calling_code = po->code; - calling_limit = po->codelimit; - po->code = insn_code_label(codebuf->codestart); - po->codelimit = limit; - cp = (coding_pause_t*) psyco_call_code_builder(po, &do_resume_coding, - true, SOURCE_DUMMY); - SHRINK_CODE_BUFFER(codebuf, - (code_t*)(cp+1) + extrasize, - "coding_pause"); - /* fill in the coding_pause_t structure and the following 'extra' data */ - psyco_resolved_cc(po, jmpcondition); /* jmpcondition is true if we follow - the branch */ - cp->self = codebuf; - cp->po = po; - cp->resume_fn = resume_fn; - memcpy(cp+1, extra, extrasize); - - /* write the jump to the proxy */ - po->code = calling_code; - po->codelimit = calling_limit; - cp->jump_to_fix = conditional_jump_to(po, (code_t*) codebuf->codestart, - jmpcondition); - dump_code_buffers(); -} - -/* for psyco_coding_pause(): a resume function that simply resumes compilation. - */ -static code_t* psyco_resume_compile(PsycoObject* po, void* extra) -{ - mergepoint_t* mp = psyco_exact_merge_point(po->pr.merge_points, - po->pr.next_instr); - /* check that we are not compiling recursively, or at least not too deeply */ - extra_assert(psyco_locked_buffers() < WARN_TOO_MANY_BUFFERS-1); - return (code_t*) psyco_compile_code(po, mp)->codestart; - /* XXX don't know what to do with the reference returned by - XXX psyco_compile_code() */ -} - - -/* Main compiling function. Emit machine code corresponding to the state - 'po'. The compiler produces its code into 'code' and the return value is - the end of the written code. 'po' is freed. */ -DEFINEFN -code_t* psyco_compile(PsycoObject* po, mergepoint_t* mp, - bool continue_compilation) -{ - vcompatible_t* cmp = mp==NULL ? NULL : psyco_compatible(po, &mp->entries); - - /*psyco_assert_cleared_tmp_marks(&po->vlocals); -- not needed -- */ - - if (cmp != NULL && cmp->diff == NullArray) /* exact match, jump there */ - { - CodeBufferObject* oldcodebuf; - code_t* code2 = psyco_unify(po, cmp, &oldcodebuf); - /* XXX store reference to oldcodebuf somewhere */ - return code2; - } - else - { - if (po->codelimit - po->code <= BUFFER_MARGIN && cmp == NULL) - { - /* Running out of space in this buffer. */ - - /* Instead of going on we stop now and make ready to - start the new buffer later, when the execution actually - reaches this point. This forces the emission of code to - pause at predicible intervals. Among other advantages it - prevents long or infinite loops from exploding the memory - while the user sees no progression in the execution of - her program. - */ - psyco_coding_pause(po, CC_ALWAYS_TRUE, &psyco_resume_compile, NULL, 0); - return po->code; - } - - /* Enough space left, continue in the same buffer. */ - { - CodeBufferObject* codebuf = psyco_proxy_code_buffer(po, - mp != NULL ? &mp->entries : NULL); -#if CODE_DUMP - codebuf->chained_list = psyco_codebuf_chained_list; - psyco_codebuf_chained_list = codebuf; -#endif - /*Py_DECREF(codebuf); XXX cannot loose reference if mp == NULL*/ - po->code = insn_code_label(codebuf->codestart); - } - - if (cmp != NULL) /* partial match */ - { - /* cmp->diff points to an array of vinfo_ts: make them run-time */ - int i; - for (i=cmp->diff->count; i--; ) - psyco_unfix(po, cmp->diff->items[i]); - psyco_stabilize(cmp); - /* start over (maybe we have already seen this new state) */ - return psyco_compile(po, mp, continue_compilation); - } - - if (continue_compilation) - return NULL; /* I won't actually compile myself, let the caller know */ - - /* call the entry point function which performs the actual compilation */ - return GLOBAL_ENTRY_POINT(po); - } -} - -DEFINEFN -void psyco_compile_cond(PsycoObject* po, mergepoint_t* mp, - condition_code_t condition) -{ - PsycoObject* po2 = PsycoObject_Duplicate(po); - vcompatible_t* cmp; - psyco_resolved_cc(po2, condition); - psyco_resolved_cc(po, INVERT_CC(condition)); - cmp = mp==NULL ? NULL : psyco_compatible(po2, &mp->entries); - - extra_assert((int)condition < CC_TOTAL); - - if (cmp != NULL && cmp->diff == NullArray) /* exact match */ - { - /* try to emit: - JNcond Label - - Label: - - if is only a JMP, recode the whole as a single - Jcond - */ - CodeBufferObject* oldcodebuf; - code_t* codeend; - void* extra = setup_conditional_code_bounds(po, po2, condition); - codeend = psyco_unify(po2, cmp, &oldcodebuf); - make_code_conditional(po, codeend, condition, extra); - /* XXX store reference to oldcodebuf somewhere */ - } - else - { - /* Use the conditional-compiling abilities of - coding_pause(); it will write a Jcond to a proxy - which will perform the actual compilation later. - */ - if (cmp != NULL) - psyco_stabilize(cmp); - psyco_coding_pause(po2, condition, &psyco_resume_compile, NULL, 0); - po->code = po2->code; - } -} - -/* Simplified interface to compile() without using a previously - existing code buffer. Return a new code buffer. */ -DEFINEFN -CodeBufferObject* psyco_compile_code(PsycoObject* po, mergepoint_t* mp) -{ - code_t* code1; - CodeBufferObject* codebuf; - bool compile_now; - vcompatible_t* cmp = mp==NULL ? NULL : psyco_compatible(po, &mp->entries); - - /*psyco_assert_cleared_tmp_marks(&po->vlocals); -- not needed -- */ - - if (cmp != NULL && cmp->diff == NullArray) /* exact match */ - return psyco_unify_code(po, cmp); - - /* We compile the new code right now if we have a full mismatch and if - there are not too many locked big buffers in codemanager.c */ - compile_now = cmp==NULL && psyco_locked_buffers() < WARN_TOO_MANY_BUFFERS-1; - if (cmp==NULL && !compile_now) - mp = NULL; /* we are about to write a coding pause, - don't register it in mp->entries */ - - /* Normal case. Start a new buffer */ - codebuf = psyco_new_code_buffer(po, mp==NULL ? NULL : &mp->entries, &po->codelimit); - po->code = insn_code_label(codebuf->codestart); - - if (compile_now) - { - /* call the entry point function which performs the actual compilation - (this is the usual case) */ - code1 = GLOBAL_ENTRY_POINT(po); - } - else if (cmp != NULL) /* partial match */ - { - int i; - for (i=cmp->diff->count; i--; ) - psyco_unfix(po, cmp->diff->items[i]); - psyco_stabilize(cmp); - /* start over (maybe we have already seen this new state) */ - code1 = psyco_compile(po, mp, false); - } - else - { - /* detected too many locked buffers. This occurs when compiling a - function that calls a function that needs compiling, recursively. - Delay compilation until run-time, when psyco_locked_buffers() will - be much smaller. */ - psyco_coding_pause(po, CC_ALWAYS_TRUE, &psyco_resume_compile, NULL, 0); - code1 = po->code; - } - - /* we have written some code into a new codebuf, now shrink it to - its actual size */ - psyco_shrink_code_buffer(codebuf, code1); - dump_code_buffers(); - return codebuf; -} - - -/*****************************************************************/ - -static bool computed_do_not_use(PsycoObject* po, vinfo_t* vi) -{ - fprintf(stderr, "psyco: internal error (computed_do_not_use)\n"); - extra_assert(0); /* stop if debugging */ - vi->source = SOURCE_DUMMY; - return true; -} - -static PyObject* direct_computed_do_not_use(vinfo_t* vi, char* data) -{ - PyErr_SetString(PyExc_PsycoError, - "internal error (direct_computed_do_not_use)"); - extra_assert(0); /* stop if debugging */ - return NULL; -} - -INITIALIZATIONFN -void psyco_compiler_init(void) -{ - INIT_SVIRTUAL(psyco_vsource_not_important, - computed_do_not_use, - direct_computed_do_not_use, - 0, 0, 0); -} - - -/*****************************************************************/ diff --git a/nodebox/ext/psyco/src/c/vcompiler.h b/nodebox/ext/psyco/src/c/vcompiler.h deleted file mode 100644 index e40e1bb..0000000 --- a/nodebox/ext/psyco/src/c/vcompiler.h +++ /dev/null @@ -1,760 +0,0 @@ - /***************************************************************/ -/*** Structures used by the compiler part ***/ - /***************************************************************/ - -#ifndef _VCOMPILER_H -#define _VCOMPILER_H - -#include "psyco.h" -#include -#include "blockalloc.h" -#include "Python/pycheader.h" - - -/*****************************************************************/ - /*** Definition of the "sources" of vinfo_t structures ***/ - - -/* A "source" defines the stage of the variable (run-time, - compile-time or virtual-time), and gives information about - the value of the variable */ -typedef long Source; /* Implemented as a bitfield 32-bit integer. */ - -/* the next typedefs are for documentation purposes only, as the C compiler - will not make any difference between them all */ -typedef long RunTimeSource; -typedef long CompileTimeSource; -typedef long VirtualTimeSource; - -#define RunTime 0 -#define CompileTime 1 /* a.k.a. "Known value" */ -#define VirtualTime 2 -#define TimeMask (CompileTime | VirtualTime) - -PSY_INLINE bool is_runtime(Source s) { return (s & TimeMask) == RunTime; } -PSY_INLINE bool is_compiletime(Source s) { return (s & CompileTime) != 0; } -PSY_INLINE bool is_virtualtime(Source s) { return (s & VirtualTime) != 0; } -PSY_INLINE long gettime(Source s) { return s & TimeMask; } -#define CHKTIME(src, time) extra_assert(gettime(src) == (time)) - - -/************************ Run-time sources ******************************* - * - * If the last two bits of 'source' are 'RunTime', we have a run-time value. - * The rest of 'source' encodes both the position of the value in the stack - * (or StackNone) and the register holding this value (or REG_NONE). - * - **/ - -#if REG_TOTAL > 8 -# error "fix the masks below" -#endif - -/* flags */ -#define RunTime_StackMask 0x01FFFFFC -#define RunTime_StackMax RunTime_StackMask -#define RunTime_StackNone 0 -#define RunTime_RegMask 0xF0000000 -#define RunTime_NoRef 0x08000000 -#define RunTime_NonNeg 0x04000000 -#define RunTime_Megamorphic 0x02000000 -#define RunTime_FlagsMask RunTime_NoRef - -/* construction */ -PSY_INLINE RunTimeSource RunTime_New1(int stack_position, -#if REG_TOTAL > 0 - reg_t reg, -#endif - bool ref, bool nonneg) -{ - long result = RunTime + stack_position; -#if REG_TOTAL > 0 - result += (long) reg << 28; -#endif - if (!ref) - result += RunTime_NoRef; - if (nonneg) - result += RunTime_NonNeg; - return (RunTimeSource) result; -} -#if REG_TOTAL > 0 -# define RunTime_NewStack(stackpos, ref, nonneg) \ - RunTime_New1(stackpos, REG_NONE, ref, nonneg) -# define RunTime_New(reg, ref, nonneg) \ - RunTime_New1(RunTime_StackNone, reg, ref, nonneg) -#else -# define RunTime_NewStack RunTime_New1 -#endif - -/* field inspection */ -PSY_INLINE bool has_rtref(Source s) { - return (s & (TimeMask|RunTime_NoRef)) == RunTime; -} -#if REG_TOTAL > 0 -PSY_INLINE reg_t getreg(RunTimeSource s) { CHKTIME(s, RunTime); return (reg_t)(s >> 28); } -#endif -PSY_INLINE bool is_reg_none(RunTimeSource s) { CHKTIME(s, RunTime); return s < 0; } -PSY_INLINE int getstack(RunTimeSource s) { CHKTIME(s, RunTime); return s & RunTime_StackMask; } -PSY_INLINE bool is_runtime_with_reg(Source s) { - return (s & (TimeMask|(1<<31))) == 0; -} -PSY_INLINE bool is_rtnonneg(RunTimeSource s) { CHKTIME(s, RunTime); return s & RunTime_NonNeg; } - - -/* mutation */ -PSY_INLINE RunTimeSource remove_rtref(RunTimeSource s) { CHKTIME(s, RunTime); return s | RunTime_NoRef; } -PSY_INLINE RunTimeSource add_rtref(RunTimeSource s) { CHKTIME(s, RunTime); return s & ~RunTime_NoRef; } -#if REG_TOTAL > 0 -PSY_INLINE RunTimeSource set_rtreg_to(RunTimeSource s, reg_t newreg) { - CHKTIME(s, RunTime); - return (s & ~RunTime_RegMask) | ((long) newreg << 28); -} -PSY_INLINE RunTimeSource set_rtreg_to_none(RunTimeSource s) { - CHKTIME(s, RunTime); - return s | ((long) REG_NONE << 28); -} -#endif -PSY_INLINE RunTimeSource set_rtstack_to(RunTimeSource s, int stack) { - CHKTIME(s, RunTime); - extra_assert(getstack(s) == RunTime_StackNone); - return s | stack; -} -PSY_INLINE RunTimeSource set_rtstack_to_none(RunTimeSource s) { - CHKTIME(s, RunTime); - return s & ~RunTime_StackMask; -} -PSY_INLINE RunTimeSource set_rtnonneg(RunTimeSource s) { - CHKTIME(s, RunTime); - return s | RunTime_NonNeg; -} - - -/************************ Compile-time sources ******************************* - * - * if the last two bits of 'source' are 'CompileTime', - * the rest of 'source' points to a 'source_known_t' structure: - * - **/ -typedef struct { - long refcount1_flags; /* flags and reference counter */ - long value; /* compile-time known value */ -} source_known_t; - -/* flags for source_known_t::refcount1_flags: */ - -/* flag added when producing code that relies - essentially on this value to be constant */ -#define SkFlagFixed 0x01 - -/* value is a PyObject* and holds a reference */ -#define SkFlagPyObj 0x02 - -/* first unused flag */ -#define SkFlagEnd 0x04 -#define SkFlagMask (SkFlagEnd-1) - -/* refcounting */ -EXTERNFN void sk_release(source_known_t *sk); -PSY_INLINE void sk_incref(source_known_t *sk) { sk->refcount1_flags += SkFlagEnd; } -PSY_INLINE void sk_decref(source_known_t *sk) { - if ((sk->refcount1_flags -= SkFlagEnd)<0) sk_release(sk); -} - -/* construction */ -BLOCKALLOC_INTERFACE(sk, source_known_t) - -PSY_INLINE source_known_t* sk_new(long v, long flags) { - source_known_t* sk = psyco_llalloc_sk(); - sk->refcount1_flags = flags; - sk->value = v; - return sk; -} -PSY_INLINE void sk_delete(source_known_t* sk) { - psyco_llfree_sk(sk); -} - - -/* Compile-time sources */ -/* construction */ -PSY_INLINE CompileTimeSource CompileTime_NewSk(source_known_t* newsource) { - extra_assert((((long) newsource) & TimeMask) == 0); - return (CompileTimeSource) (((char*) newsource) + CompileTime); -} -PSY_INLINE CompileTimeSource CompileTime_New(long value) { - return CompileTime_NewSk(sk_new(value, 0)); -} - -/* inspection */ -PSY_INLINE source_known_t* CompileTime_Get(CompileTimeSource s) { - CHKTIME(s, CompileTime); - return (source_known_t*)(((char*) s) - CompileTime); -} -PSY_INLINE CompileTimeSource set_ct_value(CompileTimeSource s, long v) { - source_known_t* sk = CompileTime_Get(s); - extra_assert((sk->refcount1_flags & SkFlagPyObj) == 0); - if (sk->refcount1_flags < SkFlagEnd) { - sk->value = v; /* reuse object when only one reference */ - return s; - } - else { - sk_decref(sk); - return CompileTime_NewSk(sk_new(v, sk->refcount1_flags & - SkFlagMask)); - } -} - - -/************************ Virtual-time sources ******************************* - * - * if the last two bits of 'source' are VIRTUAL_TIME, - * the rest of 'source' points to a 'source_virtual_t' structure (in psyco.h). - * Description of the fields of source_virtual_t: - * - * compute_fn_t compute_fn; - * the function to be called to move the vinfo_t out of virtual-time. - * - * direct_compute_fn_t direct_compute_fn - * a non-meta function that computes the PyObject* out of raw data. - * 'compute_fn' is the meta version of 'direct_compute_fn'. - * - * long pyobject_mask - * a bitfield, one bit per item in the vinfo_t's array: the bit is set - * to 1 if the array item represents a PyObject (and hence needs to be - * forced to have a reference if the virtual object escapes the current - * scope, which so far is only possible through compactobject attrs). - * - * signed char nested_weight[2]; - * a value > 0 prevents infinite nesting of virtual 'vinfo_t's inside - * of other virtual 'vinfo_t's: the sum of all 'nested_weight' fields - * of a chain of nested 'vinfo_t's should always be less than - * NESTED_WEIGHT_END. There are two values because limiting some kind - * of virtual 'vinfo_t's is more important across function calls than - * inside the same function. - **/ -#define NESTED_WEIGHT_END 15 -#define NWI_NORMAL 0 /* use nested_weight[0] */ -#define NWI_FUNCALL 1 /* use nested_weight[1] */ -#define INIT_SVIRTUAL(sv, fn, directfn, objmask, w_normal, w_funcall) do { \ - (sv).compute_fn = fn; \ - (sv).direct_compute_fn = directfn; \ - (sv).pyobject_mask = objmask; \ - (sv).nested_weight[NWI_NORMAL] = w_normal; \ - (sv).nested_weight[NWI_FUNCALL] = w_funcall; \ -} while (0) -#define INIT_SVIRTUAL_NOCALL(sv, fn, w_normal) \ - INIT_SVIRTUAL(sv, fn, NULL, 0, w_normal, NW_FORCE) -#define SVIRTUAL_MUTABLE(sv) ((sv)->nested_weight[NWI_FUNCALL] == NW_FORCE) - -/* some weights for common virtual-time objects, grouped here to better - show their relative importance. A careful tuning is required to avoid - code size explosion. (The following figures are only a guess; some - real-code testing would be welcome.) */ -#define NW_VLISTS 5 -#define NW_TUPLES_NORMAL 4 -#define NW_TUPLES_FUNCALL 4 -#define NW_STRSLICES_NORMAL 5 -#define NW_STRSLICES_FUNCALL 9 -#define NW_CATSTRS_NORMAL 4 /* catstrs also have a vlist internally */ -#define NW_CATSTRS_FUNCALL 7 -#define NW_BUFSTRS_NORMAL 5 -#define NW_FORCE NESTED_WEIGHT_END /* always force */ - -/* construction */ -PSY_INLINE VirtualTimeSource VirtualTime_New(source_virtual_t* sv) { - extra_assert((((long) sv) & TimeMask) == 0); - return (VirtualTimeSource) (((char*) sv) + VirtualTime); -} - -/* inspection */ -PSY_INLINE source_virtual_t* VirtualTime_Get(VirtualTimeSource s) { - CHKTIME(s, VirtualTime); - return (source_virtual_t*)(((char*) s) - VirtualTime); -} - - -EXTERNVAR source_virtual_t psyco_vsource_not_important; - -#define SOURCE_NOT_IMPORTANT VirtualTime_New(&psyco_vsource_not_important) -#define SOURCE_DUMMY RunTime_NewStack(RunTime_StackNone, false, false) -#define SOURCE_DUMMY_WITH_REF RunTime_NewStack(RunTime_StackNone, true, false) -#define SOURCE_ERROR ((Source) -1) - - - - /***************************************************************/ -/*** Definition of the fundamental vinfo_t structure ***/ - /***************************************************************/ - - -/* 'array' fields are never NULL, but point to a fraction of vinfo_array_t - * in which 'count' is 0, like 'NullArray'. - * This allows 'array->count' to always return a sensible value. - * Invariant: the array is dynamically allocated if and only if 'array->count' - * is greater than 0. - */ -EXTERNVAR const long psyco_zero; -#define NullArrayAt(zero_variable) ((vinfo_array_t*)(&(zero_variable))) -#define NullArray NullArrayAt(psyco_zero) - - -struct vinfo_array_s { - int count; - vinfo_t* items[7]; /* always variable-sized */ -}; - -/* construction */ -EXTERNFN vinfo_array_t* array_grow1(vinfo_array_t* array, int ncount); -PSY_INLINE void array_release(vinfo_array_t* array) { - if (array->count > 0) PyMem_FREE(array); -} -PSY_INLINE vinfo_array_t* array_new(int ncount) { - if (ncount > 0) - return array_grow1(NullArray, ncount); - else - return NullArray; -} - - -/* 'vinfo_t' defines for the compiler the stage of a - variable and where it is found. It is a wrapper around a 'Source'. - For pointers to structures, 'array' is used to decompose the structure - fields into 'vinfo_t'-described variables which can in turn - be at various stages. */ -struct vinfo_s { - int refcount; /* reference counter */ - Source source; - vinfo_array_t* array; /* substructure variables or a NullArray */ - vinfo_t* tmp; /* internal use of the dispatcher */ -}; - -/* construction */ -BLOCKALLOC_INTERFACE(vinfo, vinfo_t) - -PSY_INLINE vinfo_t* vinfo_new(Source src) { - vinfo_t* vi = psyco_llalloc_vinfo(); - vi->refcount = 1; - vi->source = src; - vi->array = NullArray; - return vi; -} -PSY_INLINE vinfo_t* vinfo_new_skref(Source src) { - if (is_compiletime(src)) sk_incref(CompileTime_Get(src)); - return vinfo_new(src); -} - -/* copy constructor */ -EXTERNFN vinfo_t* vinfo_copy(vinfo_t* vi); - -/* refcounting */ -#define VINFO_CHECKREF \ - extra_assert(vi->refcount >= 1); \ - extra_assert(vi->refcount < 0x1000000 /* arbitrary */); -EXTERNFN void vinfo_release(vinfo_t* vi, PsycoObject* po); -PSY_INLINE void vinfo_incref(vinfo_t* vi) { VINFO_CHECKREF ++vi->refcount; } -PSY_INLINE void vinfo_decref(vinfo_t* vi, PsycoObject* po) { - VINFO_CHECKREF - if (!--vi->refcount) vinfo_release(vi, po); -} -PSY_INLINE void vinfo_xdecref(vinfo_t* vi, PsycoObject* po) { - if (vi != NULL) vinfo_decref(vi, po); -} - -/* promoting out of virtual-time */ -PSY_INLINE bool compute_vinfo(vinfo_t* vi, PsycoObject* po) { - if (is_virtualtime(vi->source)) { - if (!VirtualTime_Get(vi->source)->compute_fn(po, vi)) - return false; - extra_assert(!is_virtualtime(vi->source)); - } - return true; -} -EXTERNFN bool psyco_limit_nested_weight(PsycoObject* po, vinfo_array_t* array, - int nw_index, signed char nw_end); -EXTERNFN long direct_read_vinfo(vinfo_t* vi, char* data); -EXTERNFN PyObject* direct_xobj_vinfo(vinfo_t* vi, char* data); - -PSY_INLINE bool vinfo_known_equal(vinfo_t* v, vinfo_t* w) { - return (v->source == w->source && - (v == w || !is_virtualtime(v->source))); -} - -/* misc */ -PSY_INLINE bool is_nonneg(Source s) { - switch (gettime(s)) { - case RunTime: return is_rtnonneg(s); - case CompileTime: return CompileTime_Get(s)->value >= 0; - default: return false; - } -} -PSY_INLINE void assert_nonneg(vinfo_t* v) { - if (is_runtime(v->source)) - v->source = set_rtnonneg(v->source); - else - extra_assert(is_virtualtime(v->source) || is_nonneg(v->source)); -} - -/* sub-array (see also psyco_get_field()&co.) */ -PSY_INLINE void vinfo_array_grow(vinfo_t* vi, int ncount) { - if (ncount > vi->array->count) - vi->array = array_grow1(vi->array, ncount); -} -EXTERNFN void vinfo_array_shrink(PsycoObject* po, vinfo_t* vi, int ncount); -PSY_INLINE vinfo_t* vinfo_getitem(vinfo_t* vi, int index) { - if (((unsigned int) index) < ((unsigned int) vi->array->count)) - return vi->array->items[index]; - else - return NULL; -} -PSY_INLINE vinfo_t* vinfo_needitem(vinfo_t* vi, int index) { - vinfo_array_grow(vi, index+1); - return vi->array->items[index]; -} -PSY_INLINE void vinfo_setitem(PsycoObject* po, vinfo_t* vi, int index, - vinfo_t* newitem) { - /* consumes a reference to 'newitem' */ - if (newitem != NULL) { - extra_assert(!(is_compiletime(vi->source) && - !is_compiletime(newitem->source))); - } - vinfo_array_grow(vi, index+1); - vinfo_xdecref(vi->array->items[index], po); - vi->array->items[index] = newitem; -} - - -/* array management */ -EXTERNFN void clear_tmp_marks(vinfo_array_t* array); -#if ALL_CHECKS -EXTERNFN void assert_cleared_tmp_marks(vinfo_array_t* array); -EXTERNFN void assert_array_contains_nonct(vinfo_array_t* array, vinfo_t* vi); -#else -PSY_INLINE void assert_cleared_tmp_marks(vinfo_array_t* array) { } /* nothing */ -PSY_INLINE void assert_array_contains_nonct(vinfo_array_t* a, vinfo_t* v) { } -#endif -EXTERNFN void duplicate_array(vinfo_array_t* target, vinfo_array_t* source); -PSY_INLINE void deallocate_array(vinfo_array_t* array, PsycoObject* po) { - int i = array->count; - while (i--) vinfo_xdecref(array->items[i], po); -} -PSY_INLINE void array_delete(vinfo_array_t* array, PsycoObject* po) { - deallocate_array(array, po); - array_release(array); -} - - -/*****************************************************************/ - /*** read and write fields of structures in memory ***/ - -/* Implementation of defield_t as a single packed bitfield, - stored as a pointer to enable type checks in the C compiler */ -/* [This is internal stuff: see comments below for an introduction.] */ -/* type is defined by its size (given as the nth power of two) - and a handful of flags */ -typedef struct undefined_fld_s* defield_t; -EXTERNFN vinfo_t* psyco_internal_getfld(PsycoObject* po, int findex, - defield_t df, vinfo_t* vi, long offset); -EXTERNFN bool psyco_internal_putfld(PsycoObject* po, int findex, defield_t df, - vinfo_t* vi, long offset, vinfo_t* value); -#define FIELD_INDEX_MASK 0x00FF -#define FIELD_MUTABLE 0x0100 -#define FIELD_ARRAY 0x0200 -#define FIELD_UNSIGNED 0x0400 -#define FIELD_NONNEG 0x0800 -#define FIELD_PYOBJ_REF 0x1000 -#define FIELD_SIZE2_SHIFT 13 -#define FIELD_INTL_NOREF 0x8000 -#define FIELD_OFS_SHIFT 16 -#define NO_PREV_FIELD ((defield_t) -1) -#define FIELD_RESERVED_INDEX 0xCC -#define SIZE2_FROM_CTYPE(ctype) \ - (sizeof(ctype)==1 ? 0 : \ - sizeof(ctype)==2 ? 1 : \ - sizeof(ctype)==4 ? 2 : \ - sizeof(ctype)==8 ? 3 : \ - (extra_assert(!"field size is not a small power of two"), 0)) -/*#define FIELD_NTH(df, n) - (extra_assert(FIELD_INDEX(df)+(n) == FIELD_INDEX((df)+(n))), - ((df) + (n) + (((n) << FIELD_SIZE2(df)) << FIELD_OFS_SHIFT))*/ -#define STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, flags) \ - ((defield_t) ((offsetof(cstruct, cfield) << FIELD_OFS_SHIFT) | \ - (SIZE2_FROM_CTYPE(ctype) << FIELD_SIZE2_SHIFT) | \ - field_next_index(prevf, true) | \ - flags)) -#define ARRAY_FIELD_BUILD(ctype, baseofs, flags) \ - ((defield_t) (((baseofs) << FIELD_OFS_SHIFT) | \ - (SIZE2_FROM_CTYPE(ctype) << FIELD_SIZE2_SHIFT) | \ - FIELD_RESERVED_INDEX | FIELD_ARRAY | \ - flags)) - - -/***************************************************************** - * You must describe the fields of each C structure of the interpreter - * that you want Psyco to work with. Use the following macros field - * by field. Each macro returns a defield_t which contains the - * definition of the field. */ - -/* build the field definition corresponding to: - - the C structure whose name is in 'cstruct'; - - the C type given by 'ctype'; - - the field name given by 'cfield'. - For the field order you must give in 'prevf' the defield_t - corresponding to the previous field of the C structure, - or NO_PREV_FIELD if you are defining the first field. */ -#define DEF_FIELD(cstruct, ctype, cfield, prevf) \ - STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, 0) - -/* special case: use the following macro instead of DEF_FIELD - if 'ctype' is an unsigned numeric type. */ -#define UNSIGNED_FIELD(cstruct, ctype, cfield, prevf) \ - STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, FIELD_UNSIGNED) - -/* signed fields that are known to be non-negative */ -#define NONNEG_FIELD(cstruct, ctype, cfield, prevf) \ - STRUCT_FIELD_BUILD(cstruct, ctype, cfield, prevf, FIELD_NONNEG) - -/* the same, for pure arrays instead of structures */ -#define DEF_ARRAY(ctype, baseofs) \ - ARRAY_FIELD_BUILD(ctype, baseofs, 0) -#define UNSIGNED_ARRAY(ctype, baseofs) \ - ARRAY_FIELD_BUILD(ctype, baseofs, FIELD_UNSIGNED) - -/* you can surround DEF_FIELD() by FARRAY(), FMUT(), FPYREF(): - - FARRAY() means that the field is actually an array in the - structure, as for example 'ob_items' in PyTupleObject; - - FMUT() means that the field is mutable; - - FPYREF() means that we want to read or store a PyObject* reference */ -#define FARRAY(df) ((defield_t) ((long)(df) | FIELD_ARRAY)) -#define FMUT(df) ((defield_t) ((long)(df) | FIELD_MUTABLE)) -#define FPYREF(df) (extra_assert(1<array; - - 1<> FIELD_SIZE2_SHIFT) & 3) -#define FIELD_C_OFFSET(df) ((long)(df) >> FIELD_OFS_SHIFT) -#define FIELD_HAS_REF(df) ((long)(df) & FIELD_PYOBJ_REF) -#define CHECK_FIELD_INDEX(n) extra_assert((unsigned)FIELD_INDEX(n) < \ - FIELD_RESERVED_INDEX) - -/* functions to read or write a field from or to the structure - pointed to by 'vi': */ -PSY_INLINE vinfo_t* psyco_get_field(PsycoObject* po, vinfo_t* vi, defield_t df) { - return psyco_internal_getfld(po, FIELD_INDEX(df), df, - vi, FIELD_C_OFFSET(df)); -} -PSY_INLINE vinfo_t* psyco_get_nth_field(PsycoObject* po, vinfo_t* vi, defield_t df, - int index) { - long ofs = index << FIELD_SIZE2(df); - return psyco_internal_getfld(po, FIELD_INDEX(df) + index, df, - vi, FIELD_C_OFFSET(df) + ofs); -} -PSY_INLINE vinfo_t* psyco_get_field_offset(PsycoObject* po, vinfo_t* vi, - defield_t df, long offset) { - extra_assert((long)df & FIELD_MUTABLE); - return psyco_internal_getfld(po, FIELD_RESERVED_INDEX, df, - vi, FIELD_C_OFFSET(df) + offset); -} -EXTERNFN vinfo_t* psyco_get_field_array(PsycoObject* po, vinfo_t* vi, - defield_t df, vinfo_t* vindex); -PSY_INLINE bool psyco_put_field(PsycoObject* po, vinfo_t* vi, defield_t df, - vinfo_t* value) { - return psyco_internal_putfld(po, FIELD_INDEX(df), df, - vi, FIELD_C_OFFSET(df), value); -} -PSY_INLINE bool psyco_put_nth_field(PsycoObject* po, vinfo_t* vi, defield_t df, - int index, vinfo_t* value) { - long ofs = index << FIELD_SIZE2(df); - return psyco_internal_putfld(po, FIELD_INDEX(df) + index, df, - vi, FIELD_C_OFFSET(df) + ofs, value); -} -EXTERNFN bool psyco_put_field_array(PsycoObject* po, vinfo_t* vi, defield_t df, - vinfo_t* vindex, vinfo_t* value); - -/* fields of size 8 (like those of type 'double') are accessed as two - vinfo_t's, for the second of which we use the following macro */ -#define FIELD_PART2(df) ((defield_t) ((long)(df) + 1 + /* next index */ \ - (sizeof(long)<source' into 'vtarget->source'. Must be the last reference - to 'vsource', which is freed. 'vsource' must have no array, and - 'vtarget->source' must hold no reference to anything. In short, this - function must not be used except by virtual-time computers. */ -EXTERNFN void vinfo_move(PsycoObject* po, vinfo_t* vtarget, vinfo_t* vsource); - - -/*****************************************************************/ - /*** Compiler language-independent functions ***/ - -/* compilation */ - -/* Main compiling function. Emit machine code corresponding to the state - 'po'. The compiler produces its code into 'code' and the return value is - the end of the written code. 'po' is freed. 'mp' is the current mergepoint - position or NULL if there is no mergepoint here. - - Be sure to call clear_tmp_marks(&po->vlocals) before this function. - - 'continue_compilation' is normally false. When compile() is called - during the compilation of 'po', 'continue_compilation' is true and - psyco_compile() may return NULL to tell the caller to continue the - compilation of 'po' itself. The sole purpose of this is to reduce the - depth of recursion of the C stack. -*/ -EXTERNFN code_t* psyco_compile(PsycoObject* po, mergepoint_t* mp, - bool continue_compilation); - -/* Conditional compilation: the state 'po' is compiled to be executed only if - 'condition' holds. In general this creates a coding pause for it to be - compiled later. It always makes a copy of 'po' so that the original can be - used to compile the other case ('not condition'). 'condition' must not be - CC_ALWAYS_xxx here. 'mp' is the current mergepoint position or NULL if there - is no mergepoint here. -*/ -EXTERNFN void psyco_compile_cond(PsycoObject* po, mergepoint_t* mp, - condition_code_t condition); - -/* Simplified interface to compile() without using a previously - existing code buffer. Return a new code buffer. */ -EXTERNFN CodeBufferObject* psyco_compile_code(PsycoObject* po, mergepoint_t* mp); - -/* Prepare a 'coding pause', i.e. a short amount of code (proxy) that will be - called only if the execution actually reaches it to go on with compilation. - 'po' is the PsycoObject corresponding to the proxy. - 'condition' may not be CC_ALWAYS_FALSE. - The (possibly conditional) jump to the proxy is encoded in 'calling_code'. - When the execution reaches the proxy, 'resume_fn' is called and the proxy - destroys itself and replaces the original jump to it by a jump to the newly - compiled code. */ -typedef code_t* (*resume_fn_t)(PsycoObject* po, void* extra); -EXTERNFN void psyco_coding_pause(PsycoObject* po, condition_code_t jmpcondition, - resume_fn_t resume_fn, - void* extra, int extrasize); - -/* management functions; see comments in compiler.c */ -#if ALL_CHECKS -EXTERNFN void psyco_assert_coherent1(PsycoObject* po, bool full); -#else -# define psyco_assert_coherent1(po, full) do { } while (0) /* nothing */ -#endif -#define psyco_assert_coherent(po) psyco_assert_coherent1(po, true) - -/* construction */ -PSY_INLINE PsycoObject* PsycoObject_New(int vlocalscnt) { - int psize = PSYCOOBJECT_SIZE(vlocalscnt); - PsycoObject* po = (PsycoObject*) PyMem_MALLOC(psize); - if (po == NULL) - OUT_OF_MEMORY(); - memset(po, 0, psize); - return po; -} -EXTERNFN PsycoObject* psyco_duplicate(PsycoObject* po); /* internal */ -PSY_INLINE PsycoObject* PsycoObject_Duplicate(PsycoObject* po) { - clear_tmp_marks(&po->vlocals); - return psyco_duplicate(po); -} -EXTERNFN void PsycoObject_Delete(PsycoObject* po); -PSY_INLINE PsycoObject* PsycoObject_Resize(PsycoObject* po, int nvlocalscnt) { - int psize = PSYCOOBJECT_SIZE(nvlocalscnt); - return (PsycoObject*) PyMem_REALLOC(po, psize); -} - - -#endif /* _VCOMPILER_H */ diff --git a/nodebox/ext/psyco/src/c/versionchecker.py b/nodebox/ext/psyco/src/c/versionchecker.py deleted file mode 100644 index faed865..0000000 --- a/nodebox/ext/psyco/src/c/versionchecker.py +++ /dev/null @@ -1,46 +0,0 @@ -import re - - -explicitnumber = { - '0x010100f0': '1.1.1', # bugfix release, no change in hex version - '0x010200f0': '1.2', - '0x010300f0': '1.3', - '0x010400f0': '1.4', - '0x010500f0': '1.5', - '0x010501f0': '1.5.1', - '0x010502f0': '1.5.2', - } - -FILES = { - 'Python/pyver.h': re.compile(r'PSYCO_VERSION_HEX\s+(0x[0-9a-fA-F]+)'), - '../py-support/support.py': re.compile(r'__version__\s*=\s*(0x[0-9a-fA-F]+)'), - '../doc/psycoguide.tex': re.compile(r'\\release\{([0-9.]+)\}'), - '../setup.py': re.compile(r'version\s*=\s*\"([0-9.]+)\"'), - '../../www/dist/Makefile': re.compile(r'version\s*=\s*([0-9.]+)'), - '../../www/content/index.rst': re.compile(r'`Psyco ([0-9.]+)@'), - '../../www/content/download.rst': re.compile(r'Current version is ([0-9.]+)'), - '../../www/content/./download.rst': re.compile(r'[dD]ownload Release ([0-9.]+)'), - '../../www/content/doc.rst': re.compile(r'Psyco release ([0-9.]+)'), - '../README.txt': re.compile(r'VERSION ([0-9.]+)'), - } - -versions = {} -for filename, regexp in FILES.items(): - for line in open(filename, 'r'): - match = regexp.search(line) - if match: - break - else: - raise Exception, "No version number found in " + filename - ver = match.group(1) - print '%20s %s' % (ver, filename) - if ver.startswith('0x'): - ver = explicitnumber[ver] - versions[ver] = filename - -if len(versions) != 1: - raise Exception, versions -else: - print "versionchecker: ok" - -import files; files.main() diff --git a/nodebox/ext/psyco/src/c/win32/psyco.vcproj b/nodebox/ext/psyco/src/c/win32/psyco.vcproj deleted file mode 100644 index 370fa73..0000000 --- a/nodebox/ext/psyco/src/c/win32/psyco.vcproj +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/nodebox/ext/psyco/src/doc/Makefile b/nodebox/ext/psyco/src/doc/Makefile deleted file mode 100644 index e76afc9..0000000 --- a/nodebox/ext/psyco/src/doc/Makefile +++ /dev/null @@ -1,43 +0,0 @@ - -# Makefile.local should define MKHOWTO to point to the Python -# distribution's Doc/tools/mkhowto, e.g. -# MKHOWTO = ${HOME}/cvs/python/dist/src/Doc/tools/mkhowto -include Makefile.local - -PAPER=a4 -DVIPS=dvips -N0 -t $(PAPER) - -html = psycoguide -dvi = psycoguide.dvi -ps = psycoguide.ps -ps-gz= psycoguide.ps.gz -all = $(html) $(dvi) $(ps) $(ps-gz) - -html : $(html) -dvi : $(dvi) -ps : $(ps) -ps-gz: $(ps-gz) -all : $(all) - -%: %.tex - -rm -fr $@ - ${MKHOWTO} $< - -%.dvi: %.tex - ${MKHOWTO} --paper=$(PAPER) --dvi $< - -%.ps.gz: %.ps - gzip -c < $< > $@ - -%.ps: %.dvi - $(DVIPS) -o $@ $< - -%.pdf: %.tex - rm -f $*.log $*.out $*.aux - pdflatex $< - pdflatex $< - rm -f $*.log $*.out $*.aux - -clean: - rm -fr $(all) - rm -f *.log *.aux *.ind *.idx *.l2h *.toc *.syn diff --git a/nodebox/ext/psyco/src/doc/README.txt b/nodebox/ext/psyco/src/doc/README.txt deleted file mode 100644 index aa0fde3..0000000 --- a/nodebox/ext/psyco/src/doc/README.txt +++ /dev/null @@ -1,21 +0,0 @@ -To compile psycoguide.tex, see instructions at the top of the Makefile. - -See also: - -- Psyco presentations: - - http://codespeak.net/svn/user/arigo/talks/accu2004-psyco - http://codespeak.net/svn/user/arigo/talks/pepm04-psyco - - The two presentations are very similar, but introduce concepts in a - different order. The second one is best suited for people with an - academic background. - -- Papers about Psyco: - - Representation-Based Just-In-Time Specialization - and the Psyco Prototype for Python - PEPM'04 - http://codespeak.net/svn/user/arigo/papers/psyco/compiled/theory_psyco.ps.gz - http://codespeak.net/svn/user/arigo/papers/psyco/compiled/theory_psyco.pdf - diff --git a/nodebox/ext/psyco/src/doc/psycoguide.tex b/nodebox/ext/psyco/src/doc/psycoguide.tex deleted file mode 100644 index b61abdd..0000000 --- a/nodebox/ext/psyco/src/doc/psycoguide.tex +++ /dev/null @@ -1,1131 +0,0 @@ -\documentclass{manual} - -\title{The Ultimate Psyco Guide} - -\author{Armin Rigo} - -\authoraddress{ - Email: \email{arigo@tunes.org} \\ - Psyco Home page: \url{http://psyco.sourceforge.net/} -} - -\date{updated June 10th, 2007} - -\release{1.5.2+SVN} % release version - -\makeindex - - - -\begin{document} -\catcode`\@=11 -\renewcommand{\py@reset}{} -\catcode`\@=13 - -\maketitle - - -\begin{abstract} - -\noindent -Psyco is a Python extension module which can massively speed up the execution of any Python code. - -%\strong{This document is an evolving Draft.} - -\end{abstract} - -\tableofcontents - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% INSTALLATION %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Installation} - -\section{Requirements}\label{req} - -Psyco currently requires: - -\begin{itemize} - -\item \strong{A 32-bit Pentium or any other Intel 386 compatible processor.} Sorry, no other processor is supported. Psyco does not support the 64-bit x86 architecture, unless you have a Python compiled in 32-bit compatibility mode. - -\item \strong{Linux, Windows, BSD} are known to work. Mac OS/X support should be easy but no one bothered so far (see below). - -\item \strong{A regular Python installation, version 2.2.2 or up.} Psyco is not a replacement for the Python interpreter and libraries, it works on top of them. - -\end{itemize} - -Psyco is not strongly dependent on a particular OS. Precompiled binaries are provided for Windows. Compiling on Linux (or other Unixes) should be easy. - -Mac OS/X is not supported because of a difference in the calling convention. If you want to help, see \url{http://mail.python.org/pipermail/pythonmac-sig/2006-June/017533.html} for instructions about how to fix it. - - -\section{Installing}\label{binaries} - -Binaries are now only available for Windows as installers for recent Python versions. You need to compile from the source (see \ref{sources}) in all other cases (it is trivial on non-Windows platforms, though). - -Be sure to download the version of Psyco that corresponds to your Python version. Binary releases are at \url{http://sourceforge.net/project/showfiles.php?group_id=41036}. Only some pre-compiled versions are available (contributions for missing ones are welcome). - -\begin{tableiii}{l|l|l}{filenq}{File name}{Python versions}{Well-tested with} - \lineiii{ psyco-x.y-win32-py2.2.2.exe }{2.2.2 and up} {2.2.2 and 2.2.3} - \lineiii{ psyco-x.y-win32-py2.3.exe }{2.3 and up} {2.3 and 2.3.3} - \lineiii{ psyco-x.y-win32-py2.4.exe }{2.4 and up} {2.4.*} - \lineiii{ psyco-x.y-win32-py2.5.exe }{2.5 and up} {2.4} -\end{tableiii} - -Note that the 2.2.2 version will **not** work on the 2.2 or 2.2.1 Pythons! - - -\section{Installing from the sources}\label{sources} - -You should get the source code from its most current Subversion version at \url{http://codespeak.net/svn/psyco/dist/}. The command is: - -\begin{verbatim} - svn co http://codespeak.net/svn/psyco/dist/ psyco-dist -\end{verbatim} - -People unfamiliar with Subversion or whose Subversion access is firewalled can use a web grabber (e.g.\ ``wget -r http://codespeak.net/svn/psyco/dist/ -I /svn/psyco/dist``), or download a snapshop at \url{http://wyvern.cs.uni-duesseldorf.de/psyco/psyco-snapshot.tar.gz}. - -Note that the Subversion tree is considered the latest official release. It evolves slowly and it is more stable than the packaged version. But if you really really prefer official releases (though there is not much point, Psyco being stable and slow-changing nowadays), have a look at \url{http://sourceforge.net/project/showfiles.php?group_id=41036}. - -To install from the source, run the top-level installation script \file{setup.py}: - -\begin{verbatim} - python setup.py install -\end{verbatim} - -Warning, many Linux distributions (e.g.\ Debian) ship with an incomplete Python. You need to install the ``python-dev'' package for this to work. - -As usual, other commands are available, e.g.\ - -\begin{verbatim} - python setup.py build_ext -i -\end{verbatim} - -will compile the C source and put the result directly into the \file{py-support/} subdirectory (no administrator priviledge is required). After this step, the \file{py-support/} directory is a complete package (exactly as found in the binary distributions) that you can rename to \file{psyco} and copy around. - - -\section{Compiling Psyco in Debug mode}\label{debugpsyco} - -In case of trouble that you suspect to be a bug in Psyco, you can recompile it with additional coherency checks that will be done during the compilation of your Python functions (they should not slow down the execution of the compiled code). - -Additionally, Psyco will dump debugging information to the standard error. The debugging version of Psyco can also dump the whole compiled code buffers and associated data structures, using \function{psyco.dumpcodebuf}. - -Follow the instructions in \file{setup.py} to enable debugging. For fine-grained control under Unix, I use a custom \file{Makefile} instead of \file{setup.py}; this \file{Makefile} is present in the CVS tree too. - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TUTORIAL %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{Tutorial} - -The goal of Psyco is to be extremely easy to use, and ideally it should be completely transparent. If this were the case, this user guide would be empty. This is not the case because it is still experimental, and because you will probably like to keep control over what you trust Psyco to accelerate and how much resources (mainly memory) you are ready to let it spend. - - -\section{Quick examples} - -Psyco comes as a package module that you can use in your applications, althought you will seldom need to use functions that are not exported via the top-level \module{psyco} module. Try adding the following two lines at the beginning of your main \file{.py} source file: - -\begin{verbatim} -import psyco -psyco.full() -\end{verbatim} - -This instructs Psyco to compile and run as much of your application code as possible. This is the simplest interface to Psyco. In good cases you can just add these two lines and enjoy the speed-up. If your application does a lot of initialization stuff before the real work begins, you can put the above two lines after this initialization -- e.g. after importing modules, creating constant global objects, etc. Psyco usually doesn't speed up the initialization of a program; it rather tends to make start-up slower. A good place to put these lines is at the beginning of the \code{__main__} part of the script: - -\begin{verbatim} -if __name__ == '__main__': - # Import Psyco if available - try: - import psyco - psyco.full() - except ImportError: - pass - # ...your code here... -\end{verbatim} - -For larger applications, try: - -\begin{verbatim} -import psyco -psyco.profile() -\end{verbatim} - -Psyco will do some profiling behind the scene to discover which functions are worth being compiled. - -\begin{verbatim} -import psyco -psyco.log() -psyco.profile() -\end{verbatim} - -Enable logging to a file named \file{xxx.log-psyco} by default, where \file{xxx} is the name of the script you ran. - -\begin{verbatim} -import psyco -psyco.log() -psyco.profile(0.2) -\end{verbatim} - -The extra argument \code{0.2} to \function{profile} is called the watermark; it means that Psyco will compile all functions that take at least 20\% of the time. The exact meaning of the watermark will be given in the reference manual; simply keep in mind that smaller numbers (towards \code{0.0}) mean more functions compiled, and larger numbers (towards \code{1.0}) mean less functions compiled. The default watermark is \code{0.09}. - -\begin{verbatim} -import psyco -psyco.log() -psyco.full(memory=100) -psyco.profile(0.05, memory=100) -psyco.profile(0.2) -\end{verbatim} - -This example combines the previous ones. All functions are compiled until it takes 100 kilobytes of memory. Aggressive profiling (watermark \code{0.05}) is then used to select further functions until it takes an extra 100 kilobytes of memory. Then less aggressive profiling (watermark \code{0.2}) is used for the rest of the execution. \note{The limit of 100 kilobytes is largely underestimated by Psyco: your process' size will grow by much more than that before Psyco switches to the next profiler.} - -If you want to keep control over what gets compiled, you can select individual functions: - -\begin{verbatim} -import psyco -psyco.bind(myfunction1) -psyco.bind(myfunction2) -\end{verbatim} - -This only selects the two given functions for compilation. Typically, you would select functions that do CPU-intensive computations, like walking lists or working on strings or numbers. Note that the functions called by the functions you select will also be compiled. - -\begin{verbatim} -import psyco -g = psyco.proxy(f) -g(args) # Psyco-accelerated call -f(args) # regular slow call -\end{verbatim} - -Unlike \function{psyco.bind}, \function{psyco.proxy} does not affect your original function at all, but only creates a Psyco-accelerated copy of it (a ``proxy''). Useful if you only want to use Psyco at a very specific moment. One can also argue that \code{f=psyco.proxy(f)} looks more Pythonic than \code{psyco.bind(f)}. - - -\section{Zope's TAL: a real example with benchmarks} - -As an example of a good real-life candidate for Psyco acceleration, I chose \strong{TAL}, the simpler of the two templating languages of Zope (\url{http://www.zope.org}). TAL is an extension of HTML in which you can write templates which are used to generate real HTML pages dynamically. The translation from templates to real pages is a typical data-manipulation algorithm that is much faster in C than in Python, but much more obfuscated too. TAL is currently implemented in Python only. - -For these tests, we will use the file \file{TAL.markbench.py} of a Zope 2 installation (if you did not install Zope, the file is in the \file{lib/python} subdirectory of the source archive). You may have to create a file named \file{.path} to be able to run \file{markbench.py}, as explained when you first try to run it. - -On a Dual Pentium Linux running Python 2.2.2, using the Zope 2.6.1 distribution, I get the following times (lower numbers mean faster runs; I have added the horizontal line at test 9 for emphasis): - -\begin{verbatim} -##: ZPT TAL DTML -01: 0 0 0 -02: 0 0 0 -03: 2 1 0 -04: 9 6 3 -05: 16 12 4 -06: 19 13 10 -07: 15 10 1 -08: 10 7 1 -09: ------ 123 ------- 90 ------- 32 -10: 14 6 3 -11: 28 18 10 -12: 20 15 6 -\end{verbatim} - -If I add the following line at the top of \file{markbench.py} the times drop massively --- the longest-running tests run two to three times faster! - -\begin{verbatim} -import psyco; psyco.log(); psyco.full() -\end{verbatim} - -Results: - -\begin{verbatim} -##: ZPT TAL DTML -01: 0 0 0 -02: 0 0 0 -03: 1 0 0 -04: 5 2 2 -05: 8 4 4 -06: 11 5 10 -07: 7 4 1 -08: 6 2 1 -09: ------- 61 ------- 34 ------- 32 -10: 10 3 2 -11: 17 7 10 -12: 11 6 6 -\end{verbatim} - -Here you see in the DTML test the first rule about Psyco: some code is obviously not seen by Psyco at all. In other words for some reason this code runs in the normal interpreter only. There are a lot of potential reasons for this, which range from Psyco failing to ``steal'' the code from the Python interpreter before it executes it to code using unsupported constructs (see appendix \ref{unsupported}). - -\begin{verbatim} -import psyco; psyco.log(); psyco.profile() -\end{verbatim} - -Results: - -\begin{verbatim} -##: ZPT TAL DTML -01: 0 0 0 -02: 0 0 0 -03: 4 3 0 -04: 15 11 3 -05: 20 13 5 -06: 16 5 12 -07: 7 5 1 -08: 5 2 1 -09: ------- 65 ------- 35 ------- 40 -10: 11 3 2 -11: 18 8 10 -12: 12 6 6 -\end{verbatim} - -If you use the profiler instead of compiling everything, the small tests won't run much faster, but the long-running ones will be about as fast as above. It means that the profiler is a powerful tool that can be useful on arbitrarily large programs. However, in the case of a large program in which you know where most of the processor time is spent, you can choose to selectively compile this part: - -\begin{verbatim} -from TALInterpreter import TALInterpreter -import psyco; psyco.bind(TALInterpreter) -\end{verbatim} - -Results: - -\begin{verbatim} -##: ZPT TAL DTML -01: 0 0 0 -02: 0 0 0 -03: 2 0 0 -04: 9 2 2 -05: 16 4 4 -06: 19 5 10 -07: 14 4 1 -08: 10 3 1 -09: ------ 122 ------- 33 ------- 32 -10: 13 3 3 -11: 28 8 10 -12: 20 6 6 -\end{verbatim} - -Here you can see that only the TAL test is accelerated. If you have a Zope server using TAL, you could try to add the above two lines to it. You may get very interesting speed-ups for a very reasonable memory overweight! (untested: please tell me about it --- there is no real Zope server I can play with myself.) - -Another ceveat of Psyco is that it is not always easy to know which module or class Psyco has just acclerated in \code{psyco.full()} mode. It took me some time to discover what I should bind to accelerate specifically the ZPT test. Here is how: I ran Psyco in \code{psyco.log();psyco.profile()} mode, running only the ZPT test, and inspected the log file. Indeed, when a function is about to be accelerated, Psyco writes a line \samp{tag function: xxx}. In this case I figured out from the \file{markbench.log-psyco} file that I had to write this: - -\begin{verbatim} -import TAL.TALInterpreter -import psyco; psyco.bind(TAL.TALInterpreter.TALInterpreter.interpret) -\end{verbatim} - -Results: - -\begin{verbatim} -##: ZPT TAL DTML -01: 0 0 0 -02: 0 0 0 -03: 1 2 0 -04: 5 6 2 -05: 9 11 4 -06: 11 13 10 -07: 8 10 1 -08: 6 7 1 -09: ------- 66 ------- 90 ------- 32 -10: 10 6 4 -11: 18 18 10 -12: 12 15 6 -\end{verbatim} - - -\section{Old-style classes vs. Built-in types}\label{metaclass} - -Althought Psyco can plug itself over various versions of the interpreter, there are some features that depend on specific extensions. - -A major introduction of Python 2.2 are the so-called new-style classes, which have a (positive) performance impact on Psyco. So you should, as much as possible, let your classes be built-in types and not old-style classes (which is done by inheriting from another new-style class, or from \class{object} for root classes). - -In addition, Psyco 1.4 provides a compact alternative to Python's new-style instances: the \class{psyco.compact} root class. Currently, you have to use or inherit from \class{psyco.compact} explicitely. This lets Psyco produce faster code and reduces the memory used by your instances. Even better, if you add the line - -\begin{verbatim} -from psyco.classes import * -\end{verbatim} - -at the top of the module(s) that define the classes, then not only will all your classes automatically inherit from \class{psyco.compact}, but all the methods defined in your classes will automatically be compiled as if you had called \function{psyco.bind()} on them. - -\warning{In Python, instances of classes that inherit from a built-in type are subject to some semantic differences that you should know about. These are described in \url{http://www.python.org/2.2.2/descrintro.html}. An immediate difference is that if \var{x} contains an instance of such a new-style class, then \code{type(x)} will be \code{x.__class__} instead of \constant{types.InstanceType}.} - -For more information see sections \ref{psycodotclasses} and \ref{psycocompact}. - - -\section{Known bugs}\label{tutknownbugs} - -Almost any Python code should execute correctly when run under Psyco, including code that uses arbitrary C extension modules. Some features of Python which are marked as ``not supported'' by Psyco will not cause Psyco to fail to produce the correct result; instead, it will revert to the regular Python interpreter and the code will run non-accelerated. - -All exceptions to this rule are bugs, but there are a couple of them because they would be either very hard to fix or fixing them would severely hurt performance. They correspond to uncommon situations. The current list is in appendix \ref{bugs}. - -There are also performance bugs: situations in which Psyco slows down the code instead of accelerating it. It is difficult to make a complete list of the possible reasons, but here are a few common ones: - -\begin{itemize} -\item The built-in \function{map} and \function{filter} functions must be avoided and replaced by list comprehension. For example, \code{map(lambda x: x*x, lst)} should be replaced by the more readable but more recent syntax \code{[x*x for x in lst]}. -\item The compilation of regular expressions doesn't seem to benefit from Psyco. (The execution of regular expressions is unaffected, since it is C code.) Don't enable Psyco on this module; if necessary, disable it explicitely, e.g.\ by calling \code{psyco.cannotcompile(re.compile)}. -\end{itemize} - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% USER REFERENCE GUIDE %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{User Reference Guide} - -\declaremodule{}{psyco} - -This chapter describes in detail what you will find in the \module{psyco} package module. - -The various functions described here are all concerned with how you tell Psyco what it should compile and what it should leave to the standard interpreter to execute. Compiling everything is often overkill for medium- or large-sized applications. The drawbacks of compiling too much are in the time spent compiling, plus the amount of memory that this process consumes. It is a subtle balance to keep. - - -\section{Selecting the functions to compile} - -With the following functions you can explicitely control what parts of your application get compiled. - -\begin{funcdesc}{bind}{object, rec=10} - Tells Psyco that the given \var{object} should be compiled for faster execution. - - If \var{object} is a Python function, \function{bind} modifies the function object in-place (specifically, its \member{func_code} attribute is changed). All future calls to the function will go through Psyco. Remember that in Python no behavior can depend on which reference to the function you use to make the call; in other words, after - -\begin{verbatim} -g = f -bind(f) -\end{verbatim} - - calls to both \var{f} and \var{g} will go through Psyco. - - The \var{object} argument can also be: - \begin{itemize} - \item a method, either bound or unbound, implemented in Python; it underlying implementation is bound. - \item a class (or anything with a \member{__dict__} attribute); in this case, all functions and methods found in \code{c.__dict__} are bound (which means, for classes, all methods defined in the class but not in its parents). - \end{itemize} - - Note that compilation never actually starts before a function is first called. - - All functions called by a compiled function are also compiled, as well as the functions called by these, and so on, up to some limit (by default 10) that you can specify as the optional second argument. -\end{funcdesc} - -\begin{funcdesc}{proxy}{function-or-method, rec=10} - Makes a Psyco-enabled copy of \var{object}. - - This function returns a new object, which is a copy of the \var{function-or-method} with the same behavior but going through Psyco. The function or method must be implemented in Python. The argument itself is not affected; if you call it, it will still be run by the regular interpreter. - - Thus, \samp{bind(f)} is similar to \samp{f=proxy(f)}, except that any reference to \var{f} that might previously have been taken (for example by a \samp{from spam import *} statement) are unaffected in the second case. -\end{funcdesc} - -\begin{funcdesc}{unbind}{object} - Cancels the action of \function{bind}. - - Note that Psyco currently cannot release the memory occupied by the compilation of a function. -\end{funcdesc} - -\begin{funcdesc}{unproxy}{proxy-object} - Reverse of \function{proxy}. - - \code{unproxy(proxy(f))} is a new function object equal to \var{f}. Calling it does no longer invoke Psyco. -\end{funcdesc} - -\begin{funcdesc}{cannotcompile}{object} - Prevents the given function to be ever compiled by Psyco. \var{object} can also be a method object or directly a code object. Raises \exception{psyco.error} if the object is already being compiled. Note that this does not prevent functions called by \var{object} to be compiled, if they are bound or proxied or if the profiler chooses to compile them. -\end{funcdesc} - -\begin{funcdesc}{setfilter}{func or None} - Sets a global filter function: ``func(co)`` will be called once per code object \var{co} considered by Psyco. If it returns \var{False}, the code object will not be compiled. Note that ``func(co)`` will not be called if Psyco already started to compile the code object before you called \function{setfilter}, nor if the code object contains constructs that prevents Psyco from compiling it anyway. The return value of \function{setfilter} is the previous filter function or \var{None}. -\end{funcdesc} - -The same function will never be compiled over and over again, so that you can freely mix calls to \function{bind}, \function{proxy}, \function{unbind} and \function{unproxy} and to the profile-based routines described in the next section. - - -\section{Profile-based compilation} - -This section lists the functions that use the Python profiler and line tracer to discover which functions it should compile. These routines are best to use if your application doesn't have a clear "slow spot" where a lot of time is spent algorithmically. If it does, the previous section is all you need. - -\begin{funcdesc}{full}{memory=None, time=None, memorymax=None, timemax=None} - Compile as much as possible. - - Very efficient for small scripts and applications. Might be overkill for large applications: the memory blow-up and the time spent compiling a large amount of code could outweight the benefits. - - The (optional) arguments are described in the next sections. -\end{funcdesc} - -\begin{funcdesc}{profile}{watermark=0.09, halflife=0.5, pollfreq=20, parentframe=0.25, memory=None, time=None, memorymax=None, timemax=None} - Do profiling to detect the functions that consume a lot of interpretation time, and only compile those. - - As far as I can tell, the best solution for large applications. If a function takes a long time to run, it will be detected and compiled \emph{while it is still running,} in the middle of its execution. Psyco takes it away from the standard interpreter. - - The (optional) arguments are used for fine-tuning. They are described in the next sections. -\end{funcdesc} - -\begin{funcdesc}{background}{watermark=0.09, halflife=0.5, pollfreq=100, parentframe=0.25, memory=None, time=None, memorymax=None, timemax=None} - This is similar to \function{psyco.profile}, but does not use active profiling. It only starts a background thread that periodically checks where the execution point is in all the other threads, and collects statistics based on this. - - While quite less accurate, this method has the advantage of adding only a very small overhead to the standard execution and might be suited to large applications with an occasional algorithmically-intensive function. - - The (optional) arguments are used for fine-tuning. They are described in the next sections. Try putting a \samp{psyco.background()} call in your \file{site.py} file, with a larger \var{watermark}. Psyco will stay in the shadow and you should not notice it at all until you do some heavy work in Python. -\end{funcdesc} - -\begin{funcdesc}{runonly}{memory=None, time=None, memorymax=None, timemax=None} - Run the compiled functions but don't compile new ones. - - The usefulness of this routine is unknown. See below. -\end{funcdesc} - -\begin{funcdesc}{stop}{} - Stop the current profiler and purge the profiler queue (described below). - - Calling this function prevents Psyco from compiling any new function. It will still execute the ones that have already been compiled. -\end{funcdesc} - -\note{most comments on the performance are based on small tests and extrapolations. Just don't trust what I guess and try yourself. Any comment about which routine you found most useful or what value you often give to parameters are welcome!} - - -\subsection{Charge profilers}\label{charges} - -The ``profilers'' invoked by the above functions \function{profile} or \function{background} work on the following principles. During the regular execution of your application, Psyco measures the time spent by your functions. Individual functions are selected for compilation based on these data. - -Python 2.2.2 (and up) maintains a counter of executed bytecode instructions; this number is the most accurate (well, the least inaccurate) method I found out to guess how much a function could benefit from being run by Psyco. This number counts the number of bytecode instructions (or elementary steps) taken during the interpretation, which gives a ``time'' estimate. This ``time'' does not include things like time spent waiting for data to be read or written to a file, for example, which is a good thing because Psyco cannot optimize this anyway. - -The ``time'' thus charged to various functions is accumulated, until some limit is reached. To favour functions that have recently be seen running over old-timers, the charge of each function ``decays'' with time, following an exponential law as if the amount of time was stored as a dissipating electric charge. The limit at which a function is compiled is given as a fraction of the total charge; in other words, when a function's charge reaches at least xx percents of the total current charge, it is compiled. As all the charges decay with time, reaching such a limit is easier than it may seem; for example, if the limit is set at 10\%, and if the execution stays for several seconds within the same 10 functions, then at least one of them will eventually reach the limit. In practice, it seems to be a very good way to measure the charge; a few CPU-intensive functions will very quickly reach the limit, even if the program has already been running for a long time. - -The functions \function{profile} and \function{background} take the following optional keyword arguments: -% -\withsubitem{(profiling)}{ - \ttindex{watermark} - \ttindex{halflife} - \ttindex{pollfreq} - \ttindex{parentframe}} -% -\begin{description} - -\item[watermark] - The limit, as a fraction of the total charge, between \code{0.0} and \code{1.0}. The default value is \code{0.09}, or 9\%. - -\item[halflife] - The time (in seconds) it takes for the charge to drop to half its initial value by decay. After two half-lifes, the charge is one-fourth of the initial value; after three, one-eighth; and so on. The default value is \code{0.5} seconds. - -\item[pollfreq] - How many times per second statistics must be collected. This parameter is central to \function{background}'s operation. The default value is \code{100}. This is a maximum for a number of operating systems, whose \function{sleep} function is quite limited in resolution. - - \var{pollfreq} also applies to \function{profile}, whose main task is to do active profiling, but which collects statistics in the background too so that it can discover long-running functions that never call other functions. The default value in this case is \code{20}. - -\item[parentframe] - When a function is charged, its parent (the function that called it) is also charged a bit. The purpose is to discover functions that call several other functions, each of which does a part of the job, but none of which does enough to be individually identified and compiled. When a function is charged some amount of time, its the parent is additionally charged a fraction of it. The parent of the parent is charged too, and so on recursively, althought the effect is more and more imperceptible. This parameter controls the fraction. The default value of \code{0.25} means that the parent is charged one-fourth of what a child is charged. \note{Do not use values larger than \code{0.5}.} - -\end{description} - -\note{All default values need tuning. Any comments about values that seem to give better results in common cases are welcome.} - -Profiling data is not stored on disk (currently). Profiling starts anew each time you restart your application. This is consistent with the way the ``electric charges'' approach works: any charge older than a few half-lifes gets very close to zero anyway. Moreover, in the current implementation, a full reset of the charges occurs every 120 half-lifes, but the effect should go unnoticed. - - -\subsection{Limiting memory usage}\label{memlimits} - -Psyco can and will use large amounts of memory. To give you more control, the effect of the various ``profilers'' selected by the functions \function{full}, \function{profile} and \function{background} can be limited. - -Here are the corresponding optional keyword arguments. -% -\withsubitem{(profiler limit)}{ - \ttindex{memory} - \ttindex{time} - \ttindex{memorymax} - \ttindex{timemax}} -% -\begin{description} - -\item[memory] - Stop when the profiler has caused the given amount of memory to be consumed in code compilation (in kilobytes). - - Note that the value is very approximative because it only takes some of the data structures of Psyco in account. The actual amount of memory consumed by Psyco will be much larger than that. - -\item[time] - Only run the profiler for the given amount of seconds. - -\item[memorymax] - Stop when the memory consumed by Psyco reached the limit (in kilobytes). This limit includes the memory consumed before this profiler started. - -\item[timemax] - Stop after the given number of seconds has elapsed, counting from now. - - The difference with \var{time} is only apparent when the profiler does not actually start immediately, if it is queued as explained in the next section. - -\end{description} - - -\subsection{The profilers queue} - -Profilers can be chained. By calling several of the above profiling functions (or maybe the same function several times with different arguments), only the first one is started. The second one will only be started when the first one reaches one of its limits, and so on. For example: - -\begin{verbatim} -import psyco -psyco.full(memory=100) -psyco.profile() -\end{verbatim} - -causes Psyco to compile everything until it takes 100 kilobytes of memory, and then only compile based on collected statistics. Remember that the limit of 100 kilobytes is largely underestimated by Psyco: your process' size will grow by much more than that before Psyco switches to profiling. - -If all profilers reach their limits, profiling is stopped. Already-compiled functions will continue to run faster. - -You may try to add a line \samp{psyco.runonly()} after the last profiler, if all your profilers may stop (i.e.\ all of them have limits). It might help, or it might not. Feedback appreciated. - -\note{Besides the limits, external events may prevent a specific profiler from running. When this occurs, Psyco falls back to the next profiler but may come back later when the external condition changes again. This occurs if some other program (e.g.\ the \module{pdb} debugger) sets a profiling or line-by-line tracing hook. Psyco always gracefully leaves the priority to other programs when they want to occupy Python's hooks.} - - -\section{Exceptions and warnings} - -\begin{excdesc}{error} - The \exception{psyco.error} exception is raised in case of a Psyco-specific error during the call of one of the above functions or during profiling. It is never automatically raised within one of your function that is accelerated by Psyco. -\end{excdesc} - -\begin{excdesc}{warning} - The \exception{psyco.warning} warning is issued in the hopefully rare cases where the meaning of your functions may change because of Psyco. Unlike \exception{psyco.error}, this warning is typically issued while Psyco is running your own Python code, during a call to one of the functions described in appendix \ref{patchedfunctions}. -\end{excdesc} - - -\section{The \module{psyco.classes} module}\label{psycodotclasses} - -The \module{psyco.classes} module defines a practical metaclass that you can use in your applications. - -A metaclass is the type of a class. Just like a class controls how its instances behave, a metaclass controls how its classes behave. The purpose of the present metaclass is to make your classes more Psyco-friendly. - -\begin{classdesc*}{psymetaclass} -The new metaclass. This is a subclass of \class{psyco.compacttype}. Any user-defined class using this metaclass will be a new-style class and will automatically bind all the methods defined in the class body for compilation with Psyco. It will also automatically inherit from \class{psyco.compact} (see section \ref{psycocompact}). -\end{classdesc*} - -\begin{classdesc*}{__metaclass__} -A synonym for \class{psymetaclass}. -\end{classdesc*} - -\begin{classdesc*}{psyobj} -An empty class whose metaclass is \class{psymetaclass}, suitable for subclassing in the same way that the built-in \class{object} is the generic empty new-style class which you can subclass. -\end{classdesc*} - -See \url{http://www.python.org/2.2.2/descrintro.html} for more information about old-style vs.\ new-style classes. Be aware of the changes in semantics, as recalled in section \ref{metaclass} (Psyco tutorial). - -By using \class{psyco.classes.__metaclass__} as the metaclass of your commonly-used classes, Psyco will call \function{psyco.bind} for you on all methods defined in the class (this does not include inherited parent methods or methods added after the class is first created). Additionally, these classes are ``compact'' (section \ref{psycocompact}), i.e.\ Psyco can produce quite fast code to handle instances of these classes and they use less memory each. - -\subsection{Examples} - -The following examples both define a Psyco-friendly class \class{X} and bind the method \function{f}. - -\begin{verbatim} -from psyco.classes import __metaclass__ -class X: - def f(x): - return x+1 -\end{verbatim} - -\samp{import __metaclass__} affects all classes defined in the module. To select individual classes instead: - -\begin{verbatim} -import psyco.classes -class X(psyco.classes.psyobj): - def f(x): - return x+1 -\end{verbatim} - - -\section{The \module{psyco.compact} type}\label{psycocompact} - -Starting from version 1.4, Psyco exports two extension types: \class{psyco.compact} and \class{psyco.compacttype}. (In some future version, Psyco may be able to patch the features implemented by these types directly into the standard interpreter's built-in types). - -\begin{classdesc*}{psyco.compact} -A base class whose instances are stored more compactly in memory. Can be directly instantiated or subclassed. The instances behave roughly like normal Python instances, i.e.\ you can store and read attributes, and put methods and other attributes in the subclasses, including Python's special methods (\function{__init__}, \function{__str__}, etc.). Their advantages over regular instances are: -% -\begin{itemize} -\item They are more compact in memory, with a footprint similar to that of Python's \code{__slots__}-constrained instances. For example, an instance with two integer attributes uses around 180 bytes in plain Python, and only around 44 if you use \code{__slots__} or with \class{psyco.compact}. The advantage over \code{__slots__} is that you don't have to know all possible attributes in advance. -\item In non-Psyco-accelerated function, there is a space/time trade-off: attribute accesses are a bit slower. However, -\item Psyco-accelerated functions handle \class{psyco.compact} instances extremely efficiently, both in space and in time. For example, an assignment like \code{x.attr=(a,b,c)} stores the individual values of \code{a}, \code{b} and \code{c} directly into the instance data without building a tuple in memory. -\end{itemize} - -There are a few visible differences and limitations: -% -\begin{enumerate} -\item Explicit use of \code{__slots__} is forbidden. -\item Weak references to instances are not allowed. (Please write me if you would like me to remove this limitation.) -\item Instances are not based on a real dictionary; the \code{__dict__} attribute returns a dictionary proxy (which however supports all dict operations, including writes). -\item When assigning to \code{__dict__}, a copy of the data is stored into the instance; the dict and the instance do not reflect each other's future changes (they do in plain Python). -\item Instances have a \code{__members__} attribute which lists the current attributes, in the order in which they have been set. -\item For internal reasons, the subclasses' \code{__bases__} attribute will always contain \class{psyco.compact} as the last item, even if one or several other base classes were specified. -\item Three methods \code{__getslot__}, \code{__setslot__} and \code{__delslot__} show up for internal purposes. -\end{enumerate} -\end{classdesc*} - -\begin{classdesc*}{psyco.compacttype} -The metaclass of \class{psyco.compact}. It inherits from \class{type}. It means that when you subclass \class{psyco.compact}, your classes are by default of type \class{psyco.compacttype} instead of \class{type}. The sole purpose of this metaclass is to force \class{psyco.compact} to appear in the subclasses' bases, and to check for \code{__slots__}. - -Note that you should not mix \class{psyco.compacttype} classes and normal classes in the same hierarchy. Although this might work, the instances will still each have an unused allocated dictionary. -\end{classdesc*} - -\subsection{Examples} - -\begin{verbatim} -import psyco -class Rectangle(psyco.compact): - def __init__(self, w, h): - self.w = w - self.h = h - def getarea(self): - return self.w * self.h - -r = Rectangle(6, 7) -assert r.__dict__ == {'w': 6, 'h': 7} -print r.getarea() -\end{verbatim} - -The above example runs without using Psyco's compilation features. The \code{r} instance is stored compactly in memory. (Thus this feature of Psyco probably works on any processor, but this hasn't been tested.) - -The same example using the metaclass: - -\begin{verbatim} -import psyco -class Rectangle: - __metaclass__ = psyco.compacttype - def __init__(self, w, h): - self.w = w - self.h = h - def getarea(self): - return self.w * self.h - -r = Rectangle(6, 7) -assert r.__dict__ == {'w': 6, 'h': 7} -print r.getarea() -\end{verbatim} - - -\section{Logging} - -\begin{funcdesc}{log}{logfile='', mode='w', top=10} -This function enables logging. Psyco will write information to the file \var{logfile}, opened in the given \var{mode} (which should be \code{'w'} for overwriting or \code{'a'} for appending). - -If unspecified, \var{logfile} defaults to the base script name (i.e.\ the content of \code{sys.argv[0]} without the final \file{.py}) with a \file{.log-psyco} extension appened. - -See below for the meaning of \var{top}. -\end{funcdesc} - -A log file has the structure outlined in the following example (from \file{test/bpnn.py}): - -\begin{verbatim} -11:33:53.19 Logging started, 12/22/02 %%%%%%%%%%%%%%%%%%%% -11:33:53.29 ActivePassiveProfiler: starting %%%%% -11:33:53.40 ______ - #1 |95.1 %| active_start ...psyco\profiler.py:258 - #2 | 0.9 %| ? ...\lib\traceback.py:1 - #3 | 0.8 %| ? bpnn.py:8 - #4 | 0.7 %| time bpnn.py:22 - #5 | 0.4 %| seed ...222\lib\random.py:140 - #6 | 0.3 %| ? ...\lib\linecache.py:6 - #7 | 0.3 %| write ...s\psyco\logger.py:22 - #8 | 0.3 %| __init__ bpnn.py:48 - #9 | 0.2 %| go ...psyco\profiler.py:31 -11:33:53.62 tag function: backPropagate % -11:33:53.62 tag function: update % -11:33:53.67 tag function: train % -11:33:54.12 ______ - #1 |58.4 %| active_start ...psyco\profiler.py:258 - #2 | 2.5 %| random ...222\lib\random.py:168 - #3 | 2.1 %| __init__ bpnn.py:48 - #4 | 2.1 %| demo bpnn.py:167 - #5 | 2.0 %| dumpcharges ...s\psyco\logger.py:56 - #6 | 1.2 %| do_profile ...psyco\profiler.py:299 - #7 | 1.2 %| rand bpnn.py:36 - #8 | 0.9 %| makeMatrix bpnn.py:40 - #9 | 0.8 %| time bpnn.py:22 - #10 | 0.6 %| ? bpnn.py:8 -(...cut...) -11:33:55.50 ______ - #1 |42.5 %| active_start ...psyco\profiler.py:258 - #2 | 8.3 %| random ...222\lib\random.py:168 - #3 | 6.7 %| dumpcharges ...s\psyco\logger.py:56 - #4 | 6.6 %| __init__ bpnn.py:48 - #5 | 4.0 %| rand bpnn.py:36 - #6 | 3.4 %| demo bpnn.py:167 - #7 | 2.9 %| makeMatrix bpnn.py:40 - #8 | 2.3 %| do_profile ...psyco\profiler.py:299 - #9 | 1.3 %| time bpnn.py:22 - #10 | 1.0 %| test bpnn.py:140 -11:33:55.50 tag function: random % -11:33:55.94 memory usage: 220+ kb % -11:33:55.94 program exit, 12/22/02 %%%%%%%%%%%%%%%%%%%% -\end{verbatim} - -The first column is a time (hours, minutes, seconds, hundredths). Most lines end in a number of percent signs; the more percent signs, the more important the line is, so that you can for example do a \samp{grep \%\%\% bpnn.log-psyco} to see the lines of importance 3 or more. As an exception, lines produced by the Psyco C core (as opposed to the Python glue, e.g.\ the profiler logic) end in \samp{\%\ \%} (percent, space, percent). - -The most common lines you will find in logs are: -% -\begin{description} - -\item[\#1, \#2, \#3,\ldots] - List (on several lines) of the functions which currently have the highest charge. You can typically use this to tune the watermark (section \ref{charges}). The displayed list is limited to the first 10 items by default; this can be customized with the \var{top} argument of \function{psyco.log}. - -\item[memory usage: \var{x}+ kb] - Psyco's current notion of how much memory is consumes for the emitted machine code and supporting data structures. This is a rouch estimation of the memory overhead (the \code{+} sign is supposed to remind you that this figure is highly underestimated). Use this info to tune the memory limits (section \ref{memlimits}). - -\item[unsupported opcode \var{x} at \var{y}:\var{z}] - The function \var{y} cannot be compiled. Look up the opcode number \var{x} in the table of appendix \ref{unsupported}. - -\item[tag function: \var{x}] - The function charge has reached the watermark. Its code object is compiled. Execution of the function goes on in the compiled version. - -\item[bind function: \var{x}] - The function charge has reached the watermark and it is bound (with \function{psyco.bind}). Only when function tagging is impossible (when doing passive profiling only). Bound functions are only compiled the next time the function is called, which means that any work that is still done before the current call returns will be done uncompiled. The profiler will continue to charge the function for that work and possibly bind the same function several times (with no bad consequences). - -\item[cannot find function \var{x} in \var{y}] - The profiler's attempt to use \function{psyco.bind} failed because the function object could not be found. Indeed, the profiler charges code objects, and \function{psyco.bind} only applies to function objects. Looking for a function when we only have the code object is difficult (not to mention that some code objects may have been created by \function{compile} or \function{execfile} and are not owned by any function whatsoever). Psyco currently only locates the functions defined at the module top-level and the methods of top-level classes. (This is one reason why profilers tag and don't bind if they can.) - -\item[profiling stopped, binding \var{n} functions] - When active profiling stops, the profiler calls \function{psyco.bind} on all currently tagged functions. If you feel that this operation is too heavy (e.g.\ makes a visible pause in your real-time application) use the \function{psyco.runonly} profiler to prevent this from occuring. Normally it only applies if you have set limits on all the profilers queued so far. - -\item[disabled (\var{L} limit reached)] - The profiler is stopped because it reached the limit \var{L}. The next queued profiler can start. - -\item[disabled by psyco.error] - Failed to set the profiling or tracing hooks. Normally means that some other code (e.g.\ a debugger) is already using them. Psyco profiling will restart when the other program let go of the hooks. - -\item[resetting stats] - Profiling charges are reset to zero. Occurs periodically. - -\item[no locals() in functions bound by Psyco] - Logged the first time the corresponding \exception{psyco.warning} is issued. This is just a reminder. To locate the problem, use the information Python prints to the terminal. - -\item[unsupported ** argument in call to \var{x}] - The call to the function \var{x} cannot be compiled because of the \code{**} argument. This is a limitation of Psyco; try to avoid \code{**} arguments (or write to me and insist on this feature). - -\item[unsupported free or cell vars in \var{x}] - Psyco currently cannot compile functions that use nested scopes. - -\end{description} - - -\section{Machine code inspection} - -Psyco works by directly emitting machine code for the processor. Typically, it will write a large number of small blocks of code, with numerous jumps from one to the other. - -As you can guess, debugging this machine code with traditional tools was difficult, so I had to write helpers. They can be found in the \file{py-utils} subdirectory. You need a version of Psyco compiled in debugging mode; see section \ref{debugpsyco} for instructions on how to build it. - -\begin{funcdesc}{dumpcodebuf}{} - This function (to be called near the end of your program) dumps all the machine code and supporting data structures into a file \file{psyco.dump}. This function has no effect if Psyco was not compiled in debugging mode. -\end{funcdesc} - -Run the script \program{httpxam.py} with as argument the name of the directory which contains the \file{psyco.dump} file to examine. This script formats the data as HTML pages and presents them via a web server built on Python's standard \class{SimpleHTTPServer}. When it is running, point your browser to \url{http://127.0.0.1:8000}. - -\program{httpxam.py} probably only works on Linux. It requires the programs \program{objdump} or \program{ndisasm} to disassemble the code and \program{nm} to list symbol addresses in the Python and Psyco executables. - -The cross-calling code buffers are presented as cross-linked HTML pages. Bold lines show the targets of another jump. If preceeded by a blank line, a bold line shows that another code buffer jumps directly at this position. The end of the buffer is often garbage; it is not code, but data added there (typically for the promotion of a value). There are various kind of code buffers, depending (only) on why Psyco produced it: -% -\begin{description} -\item[normal] normal mainstream compilation -\item[respawn] execution jumps here when an error occurs, but never did so yet -\item[respawned] replaces a respawn buffer when execution has jumped here -\item[unify] small buffer whose purpose is to jump back to an existing one -\item[load_global] called when a change is detected in a global variable -\item[coding_pause] not yet compiled, will be compiled if execution jumps here -\end{description} - - - -%%%%%%%%%%%%%%% -%% CAVEATS %% -%%%%%%%%%%%%%%% -\appendix -\chapter{Caveats} - - -\section{Known bugs}\label{bugs} - -Apart from speed, functions are supposed to run identically under Psyco and under Python, with the following known exceptions: -% -\withsubitem{(in frame objects)}{ - \ttindex{f_back} - \ttindex{f_code} - \ttindex{f_globals} - \ttindex{f_locals}} -\withsubitem{(exception)}{ - \ttindex{KeyboardInterrupt}} -% -\begin{itemize} - -\item The functions \function{locals}, \function{eval}, \function{execfile}, \function{vars}, \function{dir} and \function{input} should work as expected starting from Psyco 1.3, but see section \ref{patchedfunctions}. - -\item \strong{Frame objects} are emulated. The \function{sys._getframe} function returns an instance of a custom class which emulates the standard frame objects' behavior as much as possible. The frames corresponding to a Psyco-accelerated frame have some placeholder attributes, notably \member{f_locals}. \emph{There is no way to read the local variables of a Psyco-accelerated frame.} Actually, only the \member{f_code}, \member{f_globals}, \member{f_back} and \member{f_lineno} fields are well-tested. Also keep in mind that if you obtain a real frame object (which you can do with some other mean than \function{sys._getframe}, e.g.\ via a traceback object), the \member{f_back} chained list will not include the Psyco-accelerated frames. - -\item The compiled machine code does not include the regular polling done by Python, meaning that a \exception{KeyboardInterrupt} will not be detected before execution comes back to the regular Python interpreter. Your program cannot be interrupted if caught into an infinite Psyco-compiled loop. (This could be fixed if requested.) - -\item Infinite recursions are not correctly detected. They are likely to result in segmentation faults (or whatever a stack overflow triggers on your system) instead of Python's nice \exception{RuntimeError}. Similarily, circularities among data structures can cause troubles (e.g.\ printing or comparing lists that contain themselves). - -\end{itemize} - -At other points, Psyco makes assumptions that may be wrong (and will cause damage if they turn out to be): -% -\withsubitem{(module)}{ - \ttindex{rexec}} -% -\begin{itemize} - -\item \strong{Built-ins} are assumed never to change. Global variables can change, of course, but you must not add or remove a global variable to shadow or expose a built-in (at least not after a module is initialized). - -\item Do not \strong{dynamically change the methods} of the new-style classes (classes that inherit from a built-in type). - -\item Psyco assumes that \strong{types never change}. This is basically wrong (you can assign to \code{__class__}). This might cause Psyco to randomly believe that instances are still of their previous type. - -\item Do not use Psyco together with \strong{restricted execution} (the \module{rexec} module). (Given that \module{rexec} is deprecated and not safe in the first place, not using it is probably a good idea anyway.) - -\end{itemize} - -Some minor points: -% -\begin{itemize} - -\item The error message coming with exceptions will occasionally differ from Python's (but not the exception class). - -\item The \code{is} operator might occasionally work unexpectedly on immutable built-in objects across function calls. For example, in -\begin{verbatim} -def save(x): - global g - g = x -def test(i): - n = i+1 - save(n) - return n is g -\end{verbatim} - there is no guarantee with Psyco that the integer object stored in \var{g} is identical to the object seen as \var{n} by the operator \code{is} (althought they would of course be equal). Well, \code{is} is not supposed to be too useful for immutable objects anyway. There are interesting exceptions, but these work as expected. Consider the above \function{test} function as broken because it should be (but is not) equivalent to -\begin{verbatim} -def test(i): - f(i+1) - return (i+1) is g -\end{verbatim} - -\item I did not test these artificial examples of tricky code accessing a list while it is being sorted. The potential problem here is that Psyco assumes that the type of an object never changes, while Python (before 2.3) changes the type of the list to make it immutable during the sort. - -\item Running out of memory during compilation is hard to recover from. I made it a fatal error. - -\item Occasionally, objects become immortal. An example of such a situation that comes in mind is the initial value of a then-changing global variable. In general, however, this concerns objects that are immortal anyway (like a global variable that does not change or constants in the code). - -\end{itemize} - - -\section{Patched functions}\label{patchedfunctions} - -When Psyco starts, it replaces a few functions from the \module{__builtin__} and \module{sys} modules with a version of its own. This trick fails if you made a copy of one of these functions elsewhere before Psyco has a chance to replace it, because the old copy will not behave properly in the presence of Psyco. - -\withsubitem{(built-in function)}{ - \ttindex{globals} - \ttindex{locals} - \ttindex{vars} - \ttindex{dir} - \ttindex{eval} - \ttindex{execfile} - \ttindex{input} - \ttindex{sys._getframe} - \ttindex{_getframe (sys)}} -% -\begin{tableii}{c|l}{function}{Built-in function}{Notes} - \lineii{ globals }{} - \lineii{ locals }{(1)} - \lineii{ vars }{(1) when called with no argument} - \lineii{ dir }{(1) when called with no argument} - \lineii{ eval }{(1)(2) when called with a single argument} - \lineii{ execfile }{(1) when called with a single argument} - \lineii{ input }{(1)} - \lineii{ sys._getframe }{(3)} -\end{tableii} - -\noindent -Notes: -% -\begin{description} -\item[(1)] - A function run by Psyco has no native \function{locals} dictionary. Psyco 1.3 and above can emulate it properly if a certain optimization (early dead variable deletion) is disabled. Psyco should turn off this optimization automatically for functions where it detects a call to one of the above built-in functions, but this detection is a guess over the function's bytecode. It means that certain indirect calls can be missed. If this occurs at run-time, a \exception{psyco.warning} is issued and the emulated \function{locals} dictionary is empty. -\item[(2)] - Note that it is common to find Python programs that use dynamic code evaluation for an effect that can be obtained by calling an ad-hoc built-in function instead. For example, \code{eval('self.'+attr)} is better written as \code{getattr(self, attr)} and \code{exec 'import '+module} is better written as \code{__import__(module, globals(), locals(), [])}. -\item[(3)] - Frames corresponding to Psyco-evaluated functions are incomplete, as described in section \ref{bugs}. -\end{description} - -Additionally, the \code{exec} statement is not supported yet, as seen in section \ref{unsupported}. - - -\section{Unsupported Python constructs}\label{unsupported} - -Psyco only compiles functions. It will not accelerate any code that runs outside any function, like: - -\begin{itemize} -\item top-level module code\footnote{Support for top-level module code is possible but disabled by default in recent versions of Psyco; contact me for more information.} -\item the code defining a class --- i.e.\ the execution of the \code{class} statement. Methods themselves are accelerated just fine when you actually call them. -\item the code run by an \code{exec} statement or \function{execfile} or \function{eval}. -\end{itemize} - -You can always work around the above limitations by creating functions and calling them instead of directly executing a time-consuming source. For example, instead of writing a short test script like -% -\begin{verbatim} -some_big_list = ... -for x in some_big_list: - do_something() -\end{verbatim} -% -write instead -% -\begin{verbatim} -def process_list(lst): - for x in lst: - do_something() -process_list(...) -\end{verbatim} - -As another example, a function like -% -\begin{verbatim} -def f(some_expr): - for x in range(100): - print eval(some_expr) # where some_expr can depend on x -\end{verbatim} -% -should instead be written -% -\begin{verbatim} -def f(some_expr): - my_func = eval("lambda x: " + some_expr) # -> a function object - for x in range(100): - print my_func(x) -\end{verbatim} - -In addition, inside a function, some syntactic constructs are not supported by Psyco. It does not mean that a function using them will fail; it merely means that the whole function will not be accelerated. The following table lists the unsupported constructs, along with the corresponding bytecode instruction name and number. Log files only report the bytecode instruction number, which you need to look up here. - -\begin{tableiii}{cl|l}{code}{Bytecode}{Instruction name}{Appears in} - \lineiii{ 82}{\code{LOAD_LOCALS }}{(1) class definitions} - \lineiii{ 84}{\code{IMPORT_STAR }}{(5) \code{from xx import *}} - \lineiii{ 85}{\code{EXEC_STMT }}{(2) \code{exec xx}} - \lineiii{ 86}{\code{YIELD_VALUE }}{(3) generators} - \lineiii{ 90}{\code{STORE_NAME }}{(5) outside functions} - \lineiii{ 91}{\code{DELETE_NAME }}{(5) outside functions} - \lineiii{101}{\code{LOAD_NAME }}{(5) outside functions} - \lineiii{134}{\code{MAKE_CLOSURE }}{(4) nested scopes} - \lineiii{135}{\code{LOAD_CLOSURE }}{(4) nested scopes} - \lineiii{136}{\code{LOAD_DEREF }}{(4) nested scopes} - \lineiii{137}{\code{STORE_DEREF }}{(4) nested scopes} -\end{tableiii} - -\noindent -Notes: -% -\begin{description} -\item[(1)] - Psyco cannot accelerate class definitions, i.e.\ the execution of the body of the class statement -- i.e.\ the creation of the class object itself. This does not prevent it from accelerating methods in the class. -\item[(2)] - Functions using this construct cannot be accelerated. -\item[(3)] - Generators (i.e.\ any function using the \code{yield} keyword) cannot be accelerated currently. If there is enough interest I can consider implementing them. This includes generator expressions (Python 2.4). Warning! The function containing a generator expression will be compiled by Psyco, but not the generator expression itself. If the latter calls other functions compiled by Psyco, then performance will be very bad: calling from Psyco to Python to Psyco comes with a significant overhead. -\item[(4)] - Using nested scopes (i.e.\ variables shared by a function and an inner sub-function) will prevent both the outer and the inner function to be accelerated. This too could be worked around if there is enough interest, at least for accelerating the unrelated parts of the functions -- the accesses to the shared variables themselves might be difficult to optimize. -\item[(5)] - These constructs can appear in class definitions (see (1)) or at the module top-level. It is possible to enable support for module top-level code, but not recommended; instead, try to put all the code you want accelerated in function bodies. -\end{description} - - -\chapter{Performance expectations} - -Psyco can compile code that uses arbitrary object types and extension modules. Operations that it does not know about will be compiled into direct calls to the C code that implements them. However, some specific operations can be optimized, and sometimes massively so --- this is the core idea around which Psyco is built, and the reason for the sometimes impressive results. - -The other reason for the performance improvement is that the machine code does not have to decode the pseudo-code (``bytecode'') over and over again while interpreting it. Removing this overhead is what compilers classically do. They also simplify the frame objects, making function calls more efficients. So does Psyco. But doing \emph{only} this would be ineffective with Python, because each bytecode instruction still has a lot of run-time decoding to do (typically, looking up the type of the arguments in tables, invoking the corresponding operation and building a resulting Python object). - -The type-based look-ups and the successive construction and destruction of objects for all intermediate values is what Psyco can most successfully cancel, but it needs to be taught about a type and its operations before it can do so. - -We list below the specifically optimized types and operations. Possible performance gains are just wild guesses; specialization is known to give often-good-but-hard-to-predict gains. Remember, all operations not listed below work well --- they just cannot be much accelerated. - -A \strong{performance killer} is the usage of the built-in functions \function{map} and \function{filter}. \strong{Never} use them with Psyco. Replace them with list comprehensions (see \ref{tutknownbugs}). The reason is that entering code compiled by Psyco from non-Psyco-accelerated (Python or C) code is quite slow, slower than a normal Python function call. The \function{map} and \function{filter} functions will typically result in a very large number of calls from C code to a \code{lambda} expression foolishly compiled by Psyco. An exception to this rule is when using \function{map} or \function{filter} with a built-in function, when they are typically slightly faster than list comprehension because the only difference is then that the loop is performed by C code instead of by Psyco-generated code. Still, I generally recommend that you forget about \function{map} and \function{filter} and use the "Pythonic" way. - -\strong{Virtual-time} objects are objects that, when used as intermediate values, are simply not be built at run-time at all. The noted performance gains only apply if the object can actually remain virtualized. Any unsupported operation will force the involved objects to be normally built. - -\begin{tableiii}{c|ll}{textrm}{Type}{Operations}{Notes} - - \lineiii{Any built-in type}{reading members and methods}{(1)} - - \lineiii{Built-in function and method}{call}{(1)} - - \lineiii{Integer}{truth testing, unary \code{+} \code{-} \code{\~} \code{abs()}, binary \code{+} \code{-} \code{*} \code{|} \code{\&} \code{<{}<} \code{>{}>} \code{\^}, comparison}{(2)} - - \lineiii{Dictionary}{\code{len()}}{(4)} - - \lineiii{Float}{truth testing, unary \code{+} \code{-} \code{abs()}, binary \code{+} \code{-} \code{*} \code{/}, comparison}{(5)} - - \lineiii{Function}{call}{(6)} - - \lineiii{Sequence iterators}{\code{for}}{(7)} - - \lineiii{List}{\code{len()}, item get and set, concatenation}{(8)} - - \lineiii{Long}{all arithmetic operations}{(9)} - - \lineiii{Instance method}{call}{(1)} - - \lineiii{String}{\code{len()}, item get, slicing, concatenation}{(10)} - - \lineiii{Tuple}{\code{len()}, item get, concatenation}{(11)} - - \lineiii{Type}{call}{} - - \lineiii{array.array}{item get, item set}{(15)} - -\end{tableiii} - -\begin{tableii}{c|l}{textrm}{Built-in function}{Notes} - \lineii{\function{range}}{(8)} - \lineii{\function{xrange}}{(13)} - \lineii{\function{chr}, \function{ord}}{(10)} - \lineii{\function{id}}{} - \lineii{\function{type}}{} - \lineii{\function{len}, \function{abs}, \function{divmod}}{} - \lineii{\function{apply}}{(14)} - \lineii{the whole \module{math} module}{(16)} - \lineii{\function{map}, \function{filter}}{\strong{not supported}(17)} -\end{tableii} - -\noindent -Notes: -% -\begin{description} - -\item[(1)] - In the common \samp{object.method(args)} the intermediate bound method object is never built; it is translated into a direct call to the function that implements the method. For C methods, the underlying \ctype{PyMethodDef} structure is decoded at compile-time. Algorithms doing repetitive calls to methods of e.g.\ lists or strings can see huge benefits. - -\item[(2)] - Virtual-time integers can be 100 times faster than their regular counterpart. - -\item[(4)] - Complex data structures are not optimized yet, beyond (1). In a future version it is planned to allow these structures to be re-implemented differently by Psyco, with an implementation that depends on actual run-time usage. - -\item[(5)] - Psyco does not know about the Intel FPU instruction set. It emits calls to C functions that just add or multiply two \ctype{double}s together. Virtual-time floats are still about 10 times faster than Python. - -\item[(6)] - Virtual-time functions occur when defining a function inside another function, with some default arguments. - -\item[(7)] - Sequence iterators are virtual-time, making \code{for} loops over sequences as efficient as what you would write in C. - -\item[(8)] - Short lists and \function{range}s of step 1 are virtualized. A \code{for} looping over a range is as efficient as the common C \code{for} loop. For the other cases of lists see (4). - -\item[(9)] - Minimal support only. Objects of this type are never virtualized. The majority of the CPU time is probably spent doing the actual operation anyway, not in the Python glue. - -\item[(10)] - Virtual-time strings come in many flavors: single characters implemented as a single byte; slices implemented as a pointer to a portion of the full string; concatenated strings implemented as a (possibly virtual) list of the strings this string is the join of. Text-manipulation algorithms should see massive speed-ups. - -\item[(11)] - Programs manipulating small tuples in local variables can see them completely virtualized away. In general however, the gains with tuples are mostly derived from the various places where Python (and Psyco that mimics it) internally manipulates tuples. - -\item[(13)] - Psyco can optimize \function{range} well enough to make \function{xrange} useless. Indeed, with no specific support \function{xrange} would be less efficient than \function{range}! Currently \function{xrange} is almost identical to \function{range}. - -\item[(14)] - Without keyword argument dictionary. - -\item[(15)] - Type codes \code{'I'} and \code{'L'} are not supported. Type code \code{'f'} does not support item assignment. The speed of a complex algorithm using an array as buffer (like manipulating an image pixel-by-pixel) should be very high; closer to C than plain Python. - -\item[(16)] - Missing: \function{frexp}, \function{ldexp}, \function{log}, \function{log10}, \function{modf}. See note (5). - -\item[(17)] - Systematically avoid \function{map} and \function{filter} and replace them with list comprehension (section \ref{tutknownbugs}). - -\end{description} - - -\input{psycoguide.ind} % Index - -\end{document} diff --git a/nodebox/ext/psyco/src/psyco-mactel.diff b/nodebox/ext/psyco/src/psyco-mactel.diff deleted file mode 100644 index c1b01b4..0000000 --- a/nodebox/ext/psyco/src/psyco-mactel.diff +++ /dev/null @@ -1,210 +0,0 @@ -Index: c/codegen.c -=================================================================== ---- c/codegen.c (revision 45659) -+++ c/codegen.c (working copy) -@@ -308,7 +308,12 @@ - #endif - } - } -+ #ifdef __APPLE__ -+ /* Adjust # of arguments for MacOS 16-byte stack alignment */ -+ result = psyco_call_var(c_function, (count+3)&~3, args); -+ #else - result = psyco_call_var(c_function, count, args); -+ #endif - if (PyErr_Occurred()) { - if (has_refs) - for (i = 0; i < count; i++) -@@ -387,6 +392,7 @@ - stackbase = po->stack_depth; - po->stack_depth += totalstackspace; - STACK_CORRECTION(totalstackspace); -+ CALL_STACK_ALIGN(count); - for (i=count; i--; ) { - switch (argtags[i]) { - -@@ -467,6 +473,7 @@ - } - } - } -+ - return NULL; - } - -Index: c/ivm/iencoding.h -=================================================================== ---- c/ivm/iencoding.h (revision 45659) -+++ c/ivm/iencoding.h (working copy) -@@ -248,6 +248,10 @@ - else if (_stackcorr > 0) \ - INSN_pushn(_stackcorr / sizeof(long)); \ - } while (0) -+/* Dummy stack alignment for non-MacOS X */ -+#define CALL_STACK_ALIGN_DELTA(nbargs, delta) -+#define CALL_STACK_ALIGN(nbargs) -+#define CALL_STACK_ALIGN_RESTORE(delta) - - #define FUNCTION_RET(popbytes) do { \ - INSN_ret((popbytes) / sizeof(long) + 1); /* +1 for the retaddr itself */ \ -Index: c/i386/iencoding.c -=================================================================== ---- c/i386/iencoding.c (revision 45659) -+++ c/i386/iencoding.c (working copy) -@@ -48,12 +48,17 @@ - code_t* code = po->code; - void* result; - code_t* fixvalue; -+ #ifdef __APPLE__ -+ int aligndelta; -+ #endif - - if (restore) - TEMP_SAVE_REGS_FN_CALLS; - else - SAVE_REGS_FN_CALLS(true); - -+ CALL_STACK_ALIGN_DELTA(1+(extraarg != SOURCE_DUMMY), aligndelta); -+ - /* first pushed argument */ - if (extraarg != SOURCE_DUMMY) - CALL_SET_ARG_FROM_RT(extraarg, 1, 2); /* argument index 1 out of total 2 */ -@@ -79,6 +84,7 @@ - 4*nb_args, /* 4*nb_args */ - 0); /* not used */ - code += 3; -+ CALL_STACK_ALIGN_RESTORE(aligndelta); - TEMP_RESTORE_REGS_FN_CALLS_AND_JUMP; - } - else -@@ -109,10 +115,25 @@ - int i, initial_depth; - Source* p; - bool ccflags; -+ #ifdef __APPLE__ -+ int aligncount=0; -+ #endif - BEGIN_CODE - /* cannot use NEED_CC(): it might clobber one of the registers - mentioned in argsources */ - ccflags = HAS_CCREG(po); -+ #ifdef __APPLE__ -+ /* Calculate number of registers that will be pushed by -+ NEED_REGISTER */ -+ for (i=0; istack_depth-INITIAL_STACK_DEPTH+(nbargs)*4; \ -+ delta = ((sp+15)&~15)-sp; \ -+ po->stack_depth += delta; \ -+ STACK_CORRECTION(delta); \ -+} while (0) -+ -+#define CALL_STACK_ALIGN(nbargs) do { \ -+ int delta; \ -+ CALL_STACK_ALIGN_DELTA(nbargs, delta); \ -+} while (0) -+ -+#define CALL_STACK_ALIGN_RESTORE(delta) do { \ -+ po->stack_depth -= delta; \ -+ STACK_CORRECTION(-delta); \ -+} while (0) -+#else -+/* Dummy stack alignment for non-MacOS X */ -+#define CALL_STACK_ALIGN_DELTA(nbargs, delta) -+#define CALL_STACK_ALIGN(nbargs) -+#define CALL_STACK_ALIGN_RESTORE(delta) -+#endif -+ - /* load the 'dst' register with the run-time address of 'source' - which must be in the stack */ - #define LOAD_ADDRESS_FROM_RT(source, dst) do { \ -Index: c/i386/iprocessor.c -=================================================================== ---- c/i386/iprocessor.c (revision 45659) -+++ c/i386/iprocessor.c (working copy) -@@ -21,6 +21,10 @@ - PUSH_REG_INSTR(REG_386_ESI), /* PUSH ESI */ - PUSH_REG_INSTR(REG_386_EDI), /* PUSH EDI */ - 0x8B, 0x5C, 0x24, 32, /* MOV EBX, [ESP+32] (finfo frame stack ptr) */ -+#ifdef __APPLE__ -+ /* Align stack on 16-byte boundary for MacOS X */ -+ 0x83, 0xEC, 8, /* SUB ESP, 8 */ -+#endif - 0x6A, -1, /* PUSH -1 */ - 0x89, 0x23, /* MOV [EBX], ESP */ - 0xEB, +5, /* JMP Label2 */ -@@ -31,6 +35,10 @@ - 0x39, 0xCA, /* CMP EDX, ECX */ - 0x75, -9, /* JNE Label1 */ - 0xFF, 0xD0, /* CALL *EAX (callee removes args) */ -+#ifdef __APPLE__ -+ /* Restore stack from 16-byte alignment on MacOS X */ -+ 0x83, 0xC4, 8, /* ADD ESP, 8 */ -+#endif - POP_REG_INSTR(REG_386_EDI), /* POP EDI */ - POP_REG_INSTR(REG_386_ESI), /* POP ESI */ - POP_REG_INSTR(REG_386_EBX), /* POP EBX */ -@@ -67,9 +75,18 @@ - 0x53, /* PUSH EBX */ - 0x8B, 0x5C, 0x24, 12, /* MOV EBX, [ESP+12] (argcount) */ - 0x8B, 0x44, 0x24, 8, /* MOV EAX, [ESP+8] (c_func) */ -+#ifdef __APPLE__ -+ /* Align stack on 16-byte boundary for MacOS X */ -+ 0x83, 0xEC, 8, /* SUB ESP, 8 */ -+#endif - 0x09, 0xDB, /* OR EBX, EBX */ - 0x74, +16, /* JZ Label1 */ -+#ifdef __APPLE__ -+ /* Arguments are 8 bytes further up stack on MacOS X */ -+ 0x8B, 0x54, 0x24, 24, /* MOV EDX, [ESP+24] (arguments) */ -+#else - 0x8B, 0x54, 0x24, 16, /* MOV EDX, [ESP+16] (arguments) */ -+#endif - 0x8D, 0x0C, 0x9A, /* LEA ECX, [EDX+4*EBX] */ - /* Label2: */ - 0x83, 0xE9, 4, /* SUB ECX, 4 */ -@@ -78,6 +95,10 @@ - 0x75, -9, /* JNE Label2 */ - /* Label1: */ - 0xFF, 0xD0, /* CALL *EAX */ -+#ifdef __APPLE__ -+ /* Restore stack from 16-byte alignment on MacOS X */ -+ 0x83, 0xC4, 8, /* ADD ESP, 8 */ -+#endif - 0x8D, 0x24, 0x9C, /* LEA ESP, [ESP+4*EBX] */ - 0x5B, /* POP EBX */ - 0xC3, /* RET */ diff --git a/nodebox/ext/psyco/src/py-support/__init__.py b/nodebox/ext/psyco/src/py-support/__init__.py deleted file mode 100644 index d25e197..0000000 --- a/nodebox/ext/psyco/src/py-support/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -########################################################################### -# -# Psyco top-level file of the Psyco package. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco -- the Python Specializing Compiler. - -Typical usage: add the following lines to your application's main module, -preferably after the other imports: - -try: - import psyco - psyco.full() -except ImportError: - print 'Psyco not installed, the program will just run slower' -""" -########################################################################### - - -# -# This module is present to make 'psyco' a package and to -# publish the main functions and variables. -# -# More documentation can be found in core.py. -# - - -# Try to import the dynamic-loading _psyco and report errors -try: - import _psyco -except ImportError, e: - extramsg = '' - import sys, imp - try: - file, filename, (suffix, mode, type) = imp.find_module('_psyco', __path__) - except ImportError: - ext = [suffix for suffix, mode, type in imp.get_suffixes() - if type == imp.C_EXTENSION] - if ext: - extramsg = (" (cannot locate the compiled extension '_psyco%s' " - "in the package path '%s')" % (ext[0], '; '.join(__path__))) - else: - extramsg = (" (check that the compiled extension '%s' is for " - "the correct Python version; this is Python %s)" % - (filename, sys.version.split()[0])) - raise ImportError, str(e) + extramsg - -# Publish important data by importing them in the package -from support import __version__, error, warning, _getrealframe, _getemulframe -from support import version_info, __version__ as hexversion -from core import full, profile, background, runonly, stop, cannotcompile -from core import log, bind, unbind, proxy, unproxy, dumpcodebuf -from _psyco import setfilter -from _psyco import compact, compacttype diff --git a/nodebox/ext/psyco/src/py-support/classes.py b/nodebox/ext/psyco/src/py-support/classes.py deleted file mode 100644 index 0563f84..0000000 --- a/nodebox/ext/psyco/src/py-support/classes.py +++ /dev/null @@ -1,42 +0,0 @@ -########################################################################### -# -# Psyco class support module. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco class support module. - -'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes. -Any class inheriting from it or using the metaclass '__metaclass__' might -get optimized specifically for Psyco. It is equivalent to call -psyco.bind() on the class object after its creation. - -Importing everything from psyco.classes in a module will import the -'__metaclass__' name, so all classes defined after a - - from psyco.classes import * - -will automatically use the Psyco-optimized metaclass. -""" -########################################################################### - -__all__ = ['psyobj', 'psymetaclass', '__metaclass__'] - - -from _psyco import compacttype -import core -from types import FunctionType - -class psymetaclass(compacttype): - "Psyco-optimized meta-class. Turns all methods into Psyco proxies." - - def __new__(cls, name, bases, dict): - bindlist = dict.get('__psyco__bind__') - if bindlist is None: - bindlist = [key for key, value in dict.items() - if isinstance(value, FunctionType)] - for attr in bindlist: - dict[attr] = core.proxy(dict[attr]) - return super(psymetaclass, cls).__new__(cls, name, bases, dict) - -psyobj = psymetaclass("psyobj", (), {}) -__metaclass__ = psymetaclass diff --git a/nodebox/ext/psyco/src/py-support/core.py b/nodebox/ext/psyco/src/py-support/core.py deleted file mode 100644 index 42a6c2f..0000000 --- a/nodebox/ext/psyco/src/py-support/core.py +++ /dev/null @@ -1,232 +0,0 @@ -########################################################################### -# -# Psyco main functions. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco main functions. - -Here are the routines that you can use from your applications. -These are mostly interfaces to the C core, but they depend on -the Python version. - -You can use these functions from the 'psyco' module instead of -'psyco.core', e.g. - - import psyco - psyco.log('/tmp/psyco.log') - psyco.profile() -""" -########################################################################### - -import _psyco -import types, new -from support import * - - -# Default charge profiler values -default_watermark = 0.09 # between 0.0 (0%) and 1.0 (100%) -default_halflife = 0.5 # seconds -default_pollfreq_profile = 20 # Hz -default_pollfreq_background = 100 # Hz -- a maximum for sleep's resolution -default_parentframe = 0.25 # should not be more than 0.5 (50%) - - -def full(memory=None, time=None, memorymax=None, timemax=None): - """Compile as much as possible. - -Typical use is for small scripts performing intensive computations -or string handling.""" - import profiler - if PYTHON_SUPPORT: - p = profiler.FullCompiler() - else: - p = profiler.ActiveProfiler(0.0, 0.5) - p.run(memory, time, memorymax, timemax) - - -def profile(watermark = default_watermark, - halflife = default_halflife, - pollfreq = default_pollfreq_profile, - parentframe = default_parentframe, - memory=None, time=None, memorymax=None, timemax=None): - """Turn on profiling. - -The 'watermark' parameter controls how easily running functions will -be compiled. The smaller the value, the more functions are compiled.""" - import profiler - p = profiler.ActivePassiveProfiler(watermark, halflife, - pollfreq, parentframe) - p.run(memory, time, memorymax, timemax) - - -def background(watermark = default_watermark, - halflife = default_halflife, - pollfreq = default_pollfreq_background, - parentframe = default_parentframe, - memory=None, time=None, memorymax=None, timemax=None): - """Turn on passive profiling. - -This is a very lightweight mode in which only intensively computing -functions can be detected. The smaller the 'watermark', the more functions -are compiled.""" - import profiler - p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe) - p.run(memory, time, memorymax, timemax) - - -def runonly(memory=None, time=None, memorymax=None, timemax=None): - """Nonprofiler. - -XXX check if this is useful and document.""" - if PYTHON_SUPPORT: - import profiler - p = profiler.RunOnly() - p.run(memory, time, memorymax, timemax) - - -def stop(): - """Turn off all automatic compilation. bind() calls remain in effect.""" - import profiler - profiler.go([]) - - -def log(logfile='', mode='w', top=10): - """Enable logging to the given file. - -If the file name is unspecified, a default name is built by appending -a 'log-psyco' extension to the main script name. - -Mode is 'a' to append to a possibly existing file or 'w' to overwrite -an existing file. Note that the log file may grow quickly in 'a' mode.""" - import profiler, logger - if not logfile: - import os - logfile, dummy = os.path.splitext(sys.argv[0]) - if os.path.basename(logfile): - logfile += '.' - logfile += 'log-psyco' - if hasattr(_psyco, 'VERBOSE_LEVEL'): - print >> sys.stderr, 'psyco: logging to', logfile - # logger.current should be a real file object; subtle problems - # will show up if its write() and flush() methods are written - # in Python, as Psyco will invoke them while compiling. - logger.current = open(logfile, mode) - logger.print_charges = top - profiler.logger = logger - logger.writedate('Logging started') - cannotcompile(logger.psycowrite) - _psyco.statwrite(logger=logger.psycowrite) - - -def bind(x, rec=None): - """Enable compilation of the given function, method, or class object. - -If C is a class (or anything with a '__dict__' attribute), bind(C) will -rebind all functions and methods found in C.__dict__ (which means, for -classes, all methods defined in the class but not in its parents). - -The optional second argument specifies the number of recursive -compilation levels: all functions called by func are compiled -up to the given depth of indirection.""" - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - if rec is None: - x.func_code = _psyco.proxycode(x) - else: - x.func_code = _psyco.proxycode(x, rec) - return - if hasattr(x, '__dict__'): - funcs = [o for o in x.__dict__.values() - if isinstance(o, types.MethodType) - or isinstance(o, types.FunctionType)] - if not funcs: - raise error, ("nothing bindable found in %s object" % - type(x).__name__) - for o in funcs: - bind(o, rec) - return - raise TypeError, "cannot bind %s objects" % type(x).__name__ - - -def unbind(x): - """Reverse of bind().""" - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - try: - f = _psyco.unproxycode(x.func_code) - except error: - pass - else: - x.func_code = f.func_code - return - if hasattr(x, '__dict__'): - for o in x.__dict__.values(): - if (isinstance(o, types.MethodType) - or isinstance(o, types.FunctionType)): - unbind(o) - return - raise TypeError, "cannot unbind %s objects" % type(x).__name__ - - -def proxy(x, rec=None): - """Return a Psyco-enabled copy of the function. - -The original function is still available for non-compiled calls. -The optional second argument specifies the number of recursive -compilation levels: all functions called by func are compiled -up to the given depth of indirection.""" - if isinstance(x, types.FunctionType): - if rec is None: - code = _psyco.proxycode(x) - else: - code = _psyco.proxycode(x, rec) - return new.function(code, x.func_globals, x.func_name) - if isinstance(x, types.MethodType): - p = proxy(x.im_func, rec) - return new.instancemethod(p, x.im_self, x.im_class) - raise TypeError, "cannot proxy %s objects" % type(x).__name__ - - -def unproxy(proxy): - """Return a new copy of the original function of method behind a proxy. -The result behaves like the original function in that calling it -does not trigger compilation nor execution of any compiled code.""" - if isinstance(proxy, types.FunctionType): - return _psyco.unproxycode(proxy.func_code) - if isinstance(proxy, types.MethodType): - f = unproxy(proxy.im_func) - return new.instancemethod(f, proxy.im_self, proxy.im_class) - raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__ - - -def cannotcompile(x): - """Instruct Psyco never to compile the given function, method -or code object.""" - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - x = x.func_code - if isinstance(x, types.CodeType): - _psyco.cannotcompile(x) - else: - raise TypeError, "unexpected %s object" % type(x).__name__ - - -def dumpcodebuf(): - """Write in file psyco.dump a copy of the emitted machine code, -provided Psyco was compiled with a non-zero CODE_DUMP. -See py-utils/httpxam.py to examine psyco.dump.""" - if hasattr(_psyco, 'dumpcodebuf'): - _psyco.dumpcodebuf() - - -########################################################################### -# Psyco variables -# error * the error raised by Psyco -# warning * the warning raised by Psyco -# __in_psyco__ * a new built-in variable which is always zero, but which -# Psyco special-cases by returning 1 instead. So -# __in_psyco__ can be used in a function to know if -# that function is being executed by Psyco or not. diff --git a/nodebox/ext/psyco/src/py-support/kdictproxy.py b/nodebox/ext/psyco/src/py-support/kdictproxy.py deleted file mode 100644 index c764e5e..0000000 --- a/nodebox/ext/psyco/src/py-support/kdictproxy.py +++ /dev/null @@ -1,133 +0,0 @@ -########################################################################### -# -# Support code for the 'psyco.compact' type. - -from __future__ import generators - -try: - from UserDict import DictMixin -except ImportError: - - # backported from Python 2.3 to Python 2.2 - class DictMixin: - # Mixin defining all dictionary methods for classes that already have - # a minimum dictionary interface including getitem, setitem, delitem, - # and keys. Without knowledge of the subclass constructor, the mixin - # does not define __init__() or copy(). In addition to the four base - # methods, progressively more efficiency comes with defining - # __contains__(), __iter__(), and iteritems(). - - # second level definitions support higher levels - def __iter__(self): - for k in self.keys(): - yield k - def has_key(self, key): - try: - value = self[key] - except KeyError: - return False - return True - def __contains__(self, key): - return self.has_key(key) - - # third level takes advantage of second level definitions - def iteritems(self): - for k in self: - yield (k, self[k]) - def iterkeys(self): - return self.__iter__() - - # fourth level uses definitions from lower levels - def itervalues(self): - for _, v in self.iteritems(): - yield v - def values(self): - return [v for _, v in self.iteritems()] - def items(self): - return list(self.iteritems()) - def clear(self): - for key in self.keys(): - del self[key] - def setdefault(self, key, default): - try: - return self[key] - except KeyError: - self[key] = default - return default - def pop(self, key, *args): - if len(args) > 1: - raise TypeError, "pop expected at most 2 arguments, got "\ - + repr(1 + len(args)) - try: - value = self[key] - except KeyError: - if args: - return args[0] - raise - del self[key] - return value - def popitem(self): - try: - k, v = self.iteritems().next() - except StopIteration: - raise KeyError, 'container is empty' - del self[k] - return (k, v) - def update(self, other): - # Make progressively weaker assumptions about "other" - if hasattr(other, 'iteritems'): # iteritems saves memory and lookups - for k, v in other.iteritems(): - self[k] = v - elif hasattr(other, '__iter__'): # iter saves memory - for k in other: - self[k] = other[k] - else: - for k in other.keys(): - self[k] = other[k] - def get(self, key, default=None): - try: - return self[key] - except KeyError: - return default - def __repr__(self): - return repr(dict(self.iteritems())) - def __cmp__(self, other): - if other is None: - return 1 - if isinstance(other, DictMixin): - other = dict(other.iteritems()) - return cmp(dict(self.iteritems()), other) - def __len__(self): - return len(self.keys()) - -########################################################################### - -from _psyco import compact - - -class compactdictproxy(DictMixin): - - def __init__(self, ko): - self._ko = ko # compact object of which 'self' is the dict - - def __getitem__(self, key): - return compact.__getslot__(self._ko, key) - - def __setitem__(self, key, value): - compact.__setslot__(self._ko, key, value) - - def __delitem__(self, key): - compact.__delslot__(self._ko, key) - - def keys(self): - return compact.__members__.__get__(self._ko) - - def clear(self): - keys = self.keys() - keys.reverse() - for key in keys: - del self[key] - - def __repr__(self): - keys = ', '.join(self.keys()) - return '' % (keys,) diff --git a/nodebox/ext/psyco/src/py-support/logger.py b/nodebox/ext/psyco/src/py-support/logger.py deleted file mode 100644 index a3c5219..0000000 --- a/nodebox/ext/psyco/src/py-support/logger.py +++ /dev/null @@ -1,96 +0,0 @@ -########################################################################### -# -# Psyco logger. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco logger. - -See log() in core.py. -""" -########################################################################### - - -import _psyco -from time import time, localtime, strftime - - -current = None -print_charges = 10 -dump_delay = 0.2 -dump_last = 0.0 - -def write(s, level): - t = time() - f = t-int(t) - try: - current.write("%s.%02d %-*s%s\n" % ( - strftime("%X", localtime(int(t))), - int(f*100.0), 63-level, s, - "%"*level)) - current.flush() - except (OSError, IOError): - pass - -def psycowrite(s): - t = time() - f = t-int(t) - try: - current.write("%s.%02d %-*s%s\n" % ( - strftime("%X", localtime(int(t))), - int(f*100.0), 60, s.strip(), - "% %")) - current.flush() - except (OSError, IOError): - pass - -##def writelines(lines, level=0): -## if lines: -## t = time() -## f = t-int(t) -## timedesc = strftime("%x %X", localtime(int(t))) -## print >> current, "%s.%03d %-*s %s" % ( -## timedesc, int(f*1000), -## 50-level, lines[0], -## "+"*level) -## timedesc = " " * (len(timedesc)+5) -## for line in lines[1:]: -## print >> current, timedesc, line - -def writememory(): - write("memory usage: %d+ kb" % _psyco.memory(), 1) - -def dumpcharges(): - global dump_last - if print_charges: - t = time() - if not (dump_last <= t < dump_last+dump_delay): - if t <= dump_last+1.5*dump_delay: - dump_last += dump_delay - else: - dump_last = t - #write("%s: charges:" % who, 0) - lst = _psyco.stattop(print_charges) - if lst: - f = t-int(t) - lines = ["%s.%02d ______\n" % ( - strftime("%X", localtime(int(t))), - int(f*100.0))] - i = 1 - for co, charge in lst: - detail = co.co_filename - if len(detail) > 19: - detail = '...' + detail[-17:] - lines.append(" #%-3d |%4.1f %%| %-26s%20s:%d\n" % - (i, charge*100.0, co.co_name, detail, - co.co_firstlineno)) - i += 1 - current.writelines(lines) - current.flush() - -def writefinalstats(): - dumpcharges() - writememory() - writedate("program exit") - -def writedate(msg): - write('%s, %s' % (msg, strftime("%x")), 20) diff --git a/nodebox/ext/psyco/src/py-support/profiler.py b/nodebox/ext/psyco/src/py-support/profiler.py deleted file mode 100644 index ef7bf8e..0000000 --- a/nodebox/ext/psyco/src/py-support/profiler.py +++ /dev/null @@ -1,388 +0,0 @@ -########################################################################### -# -# Psyco profiler (Python part). -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco profiler (Python part). - -The implementation of the non-time-critical parts of the profiler. -See profile() and full() in core.py for the easy interface. -""" -########################################################################### - -import _psyco -from support import * -import math, time, types, atexit -now = time.time -try: - import thread -except ImportError: - import dummy_thread as thread - - -# current profiler instance -current = None - -# enabled profilers, in order of priority -profilers = [] - -# logger module (when enabled by core.log()) -logger = None - -# a lock for a thread-safe go() -go_lock = thread.allocate_lock() - -def go(stop=0): - # run the highest-priority profiler in 'profilers' - global current - go_lock.acquire() - try: - prev = current - if stop: - del profilers[:] - if prev: - if profilers and profilers[0] is prev: - return # best profiler already running - prev.stop() - current = None - for p in profilers[:]: - if p.start(): - current = p - if logger: # and p is not prev: - logger.write("%s: starting" % p.__class__.__name__, 5) - return - finally: - go_lock.release() - # no profiler is running now - if stop: - if logger: - logger.writefinalstats() - else: - tag2bind() - -atexit.register(go, 1) - - -def buildfncache(globals, cache): - if hasattr(types.IntType, '__dict__'): - clstypes = (types.ClassType, types.TypeType) - else: - clstypes = types.ClassType - for x in globals.values(): - if isinstance(x, types.MethodType): - x = x.im_func - if isinstance(x, types.FunctionType): - cache[x.func_code] = x, '' - elif isinstance(x, clstypes): - for y in x.__dict__.values(): - if isinstance(y, types.MethodType): - y = y.im_func - if isinstance(y, types.FunctionType): - cache[y.func_code] = y, x.__name__ - -# code-to-function mapping (cache) -function_cache = {} - -def trytobind(co, globals, log=1): - try: - f, clsname = function_cache[co] - except KeyError: - buildfncache(globals, function_cache) - try: - f, clsname = function_cache[co] - except KeyError: - if logger: - logger.write('warning: cannot find function %s in %s' % - (co.co_name, globals.get('__name__', '?')), 3) - return # give up - if logger and log: - modulename = globals.get('__name__', '?') - if clsname: - modulename += '.' + clsname - logger.write('bind function: %s.%s' % (modulename, co.co_name), 1) - f.func_code = _psyco.proxycode(f) - - -if PYTHON_SUPPORT: - # the list of code objects that have been tagged - tagged_codes = [] - - def tag(co, globals): - if logger: - try: - f, clsname = function_cache[co] - except KeyError: - buildfncache(globals, function_cache) - try: - f, clsname = function_cache[co] - except KeyError: - clsname = '' # give up - modulename = globals.get('__name__', '?') - if clsname: - modulename += '.' + clsname - logger.write('tag function: %s.%s' % (modulename, co.co_name), 1) - tagged_codes.append((co, globals)) - _psyco.turbo_frame(co) - _psyco.turbo_code(co) - - def tag2bind(): - if tagged_codes: - if logger: - logger.write('profiling stopped, binding %d functions' % - len(tagged_codes), 2) - for co, globals in tagged_codes: - trytobind(co, globals, 0) - function_cache.clear() - del tagged_codes[:] - -else: - # tagging is impossible, always bind - tag = trytobind - def tag2bind(): - pass - - - -class Profiler: - MemoryTimerResolution = 0.103 - - def run(self, memory, time, memorymax, timemax): - self.memory = memory - self.memorymax = memorymax - self.time = time - if timemax is None: - self.endtime = None - else: - self.endtime = now() + timemax - self.alarms = [] - profilers.append(self) - go() - - def start(self): - curmem = _psyco.memory() - memlimits = [] - if self.memorymax is not None: - if curmem >= self.memorymax: - if logger: - logger.writememory() - return self.limitreached('memorymax') - memlimits.append(self.memorymax) - if self.memory is not None: - if self.memory <= 0: - if logger: - logger.writememory() - return self.limitreached('memory') - memlimits.append(curmem + self.memory) - self.memory_at_start = curmem - - curtime = now() - timelimits = [] - if self.endtime is not None: - if curtime >= self.endtime: - return self.limitreached('timemax') - timelimits.append(self.endtime - curtime) - if self.time is not None: - if self.time <= 0.0: - return self.limitreached('time') - timelimits.append(self.time) - self.time_at_start = curtime - - try: - self.do_start() - except error, e: - if logger: - logger.write('%s: disabled by psyco.error:' % ( - self.__class__.__name__), 4) - logger.write(' %s' % str(e), 3) - return 0 - - if memlimits: - self.memlimits_args = (time.sleep, (self.MemoryTimerResolution,), - self.check_memory, (min(memlimits),)) - self.alarms.append(_psyco.alarm(*self.memlimits_args)) - if timelimits: - self.alarms.append(_psyco.alarm(time.sleep, (min(timelimits),), - self.time_out)) - return 1 - - def stop(self): - for alarm in self.alarms: - alarm.stop(0) - for alarm in self.alarms: - alarm.stop(1) # wait for parallel threads to stop - del self.alarms[:] - if self.time is not None: - self.time -= now() - self.time_at_start - if self.memory is not None: - self.memory -= _psyco.memory() - self.memory_at_start - - try: - self.do_stop() - except error: - return 0 - return 1 - - def check_memory(self, limit): - if _psyco.memory() < limit: - return self.memlimits_args - go() - - def time_out(self): - self.time = 0.0 - go() - - def limitreached(self, limitname): - try: - profilers.remove(self) - except ValueError: - pass - if logger: - logger.write('%s: disabled (%s limit reached)' % ( - self.__class__.__name__, limitname), 4) - return 0 - - -class FullCompiler(Profiler): - - def do_start(self): - _psyco.profiling('f') - - def do_stop(self): - _psyco.profiling('.') - - -class RunOnly(Profiler): - - def do_start(self): - _psyco.profiling('n') - - def do_stop(self): - _psyco.profiling('.') - - -class ChargeProfiler(Profiler): - - def __init__(self, watermark, parentframe): - self.watermark = watermark - self.parent2 = parentframe * 2.0 - self.lock = thread.allocate_lock() - - def init_charges(self): - _psyco.statwrite(watermark = self.watermark, - parent2 = self.parent2) - - def do_stop(self): - _psyco.profiling('.') - _psyco.statwrite(callback = None) - - -class ActiveProfiler(ChargeProfiler): - - def active_start(self): - _psyco.profiling('p') - - def do_start(self): - self.init_charges() - self.active_start() - _psyco.statwrite(callback = self.charge_callback) - - def charge_callback(self, frame, charge): - tag(frame.f_code, frame.f_globals) - - -class PassiveProfiler(ChargeProfiler): - - initial_charge_unit = _psyco.statread('unit') - reset_stats_after = 120 # half-lives (maximum 200!) - reset_limit = initial_charge_unit * (2.0 ** reset_stats_after) - - def __init__(self, watermark, halflife, pollfreq, parentframe): - ChargeProfiler.__init__(self, watermark, parentframe) - self.pollfreq = pollfreq - # self.progress is slightly more than 1.0, and computed so that - # do_profile() will double the change_unit every 'halflife' seconds. - self.progress = 2.0 ** (1.0 / (halflife * pollfreq)) - - def reset(self): - _psyco.statwrite(unit = self.initial_charge_unit, callback = None) - _psyco.statreset() - if logger: - logger.write("%s: resetting stats" % self.__class__.__name__, 1) - - def passive_start(self): - self.passivealarm_args = (time.sleep, (1.0 / self.pollfreq,), - self.do_profile) - self.alarms.append(_psyco.alarm(*self.passivealarm_args)) - - def do_start(self): - tag2bind() - self.init_charges() - self.passive_start() - - def do_profile(self): - _psyco.statcollect() - if logger: - logger.dumpcharges() - nunit = _psyco.statread('unit') * self.progress - if nunit > self.reset_limit: - self.reset() - else: - _psyco.statwrite(unit = nunit, callback = self.charge_callback) - return self.passivealarm_args - - def charge_callback(self, frame, charge): - trytobind(frame.f_code, frame.f_globals) - - -class ActivePassiveProfiler(PassiveProfiler, ActiveProfiler): - - def do_start(self): - self.init_charges() - self.active_start() - self.passive_start() - - def charge_callback(self, frame, charge): - tag(frame.f_code, frame.f_globals) - - - -# -# we register our own version of sys.settrace(), sys.setprofile() -# and thread.start_new_thread(). -# - -def psyco_settrace(*args, **kw): - "This is the Psyco-aware version of sys.settrace()." - result = original_settrace(*args, **kw) - go() - return result - -def psyco_setprofile(*args, **kw): - "This is the Psyco-aware version of sys.setprofile()." - result = original_setprofile(*args, **kw) - go() - return result - -def psyco_thread_stub(callable, args, kw): - _psyco.statcollect() - if kw is None: - return callable(*args) - else: - return callable(*args, **kw) - -def psyco_start_new_thread(callable, args, kw=None): - "This is the Psyco-aware version of thread.start_new_thread()." - return original_start_new_thread(psyco_thread_stub, (callable, args, kw)) - -original_settrace = sys.settrace -original_setprofile = sys.setprofile -original_start_new_thread = thread.start_new_thread -sys.settrace = psyco_settrace -sys.setprofile = psyco_setprofile -if PYTHON_SUPPORT: - thread.start_new_thread = psyco_start_new_thread - # hack to patch threading._start_new_thread if the module is - # already loaded - if (sys.modules.has_key('threading') and - hasattr(sys.modules['threading'], '_start_new_thread')): - sys.modules['threading']._start_new_thread = psyco_start_new_thread diff --git a/nodebox/ext/psyco/src/py-support/support.py b/nodebox/ext/psyco/src/py-support/support.py deleted file mode 100644 index a61224e..0000000 --- a/nodebox/ext/psyco/src/py-support/support.py +++ /dev/null @@ -1,193 +0,0 @@ -########################################################################### -# -# Psyco general support module. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco general support module. - -For internal use. -""" -########################################################################### - -import sys, _psyco, __builtin__ - -error = _psyco.error -class warning(Warning): - pass - -_psyco.NoLocalsWarning = warning - -def warn(msg): - from warnings import warn - warn(msg, warning, stacklevel=2) - -# -# Version checks -# -__version__ = 0x010502f0 -if _psyco.PSYVER != __version__: - raise error, "version mismatch between Psyco parts, reinstall it" - -version_info = (__version__ >> 24, - (__version__ >> 16) & 0xff, - (__version__ >> 8) & 0xff, - {0xa0: 'alpha', - 0xb0: 'beta', - 0xc0: 'candidate', - 0xf0: 'final'}[__version__ & 0xf0], - __version__ & 0xf) - - -VERSION_LIMITS = [0x02020200, # 2.2.2 - 0x02030000, # 2.3 - 0x02040000] # 2.4 - -if ([v for v in VERSION_LIMITS if v <= sys.hexversion] != - [v for v in VERSION_LIMITS if v <= _psyco.PYVER ]): - if sys.hexversion < VERSION_LIMITS[0]: - warn("Psyco requires Python version 2.2.2 or later") - else: - warn("Psyco version does not match Python version. " - "Psyco must be updated or recompiled") - -PYTHON_SUPPORT = hasattr(_psyco, 'turbo_code') - - -if hasattr(_psyco, 'ALL_CHECKS') and hasattr(_psyco, 'VERBOSE_LEVEL'): - print >> sys.stderr, ('psyco: running in debugging mode on %s' % - _psyco.PROCESSOR) - - -########################################################################### -# sys._getframe() gives strange results on a mixed Psyco- and Python-style -# stack frame. Psyco provides a replacement that partially emulates Python -# frames from Psyco frames. The new sys._getframe() may return objects of -# a custom "Psyco frame" type, which is a subtype of the normal frame type. -# -# The same problems require some other built-in functions to be replaced -# as well. Note that the local variables are not available in any -# dictionary with Psyco. - - -class Frame: - pass - - -class PythonFrame(Frame): - - def __init__(self, frame): - self.__dict__.update({ - '_frame': frame, - }) - - def __getattr__(self, attr): - if attr == 'f_back': - try: - result = embedframe(_psyco.getframe(self._frame)) - except ValueError: - result = None - except error: - warn("f_back is skipping dead Psyco frames") - result = self._frame.f_back - self.__dict__['f_back'] = result - return result - else: - return getattr(self._frame, attr) - - def __setattr__(self, attr, value): - setattr(self._frame, attr, value) - - def __delattr__(self, attr): - delattr(self._frame, attr) - - -class PsycoFrame(Frame): - - def __init__(self, tag): - self.__dict__.update({ - '_tag' : tag, - 'f_code' : tag[0], - 'f_globals': tag[1], - }) - - def __getattr__(self, attr): - if attr == 'f_back': - try: - result = embedframe(_psyco.getframe(self._tag)) - except ValueError: - result = None - elif attr == 'f_lineno': - result = self.f_code.co_firstlineno # better than nothing - elif attr == 'f_builtins': - result = self.f_globals['__builtins__'] - elif attr == 'f_restricted': - result = self.f_builtins is not __builtins__ - elif attr == 'f_locals': - raise AttributeError, ("local variables of functions run by Psyco " - "cannot be accessed in any way, sorry") - else: - raise AttributeError, ("emulated Psyco frames have " - "no '%s' attribute" % attr) - self.__dict__[attr] = result - return result - - def __setattr__(self, attr, value): - raise AttributeError, "Psyco frame objects are read-only" - - def __delattr__(self, attr): - if attr == 'f_trace': - # for bdb which relies on CPython frames exhibiting a slightly - # buggy behavior: you can 'del f.f_trace' as often as you like - # even without having set it previously. - return - raise AttributeError, "Psyco frame objects are read-only" - - -def embedframe(result): - if type(result) is type(()): - return PsycoFrame(result) - else: - return PythonFrame(result) - -def _getframe(depth=0): - """Return a frame object from the call stack. This is a replacement for -sys._getframe() which is aware of Psyco frames. - -The returned objects are instances of either PythonFrame or PsycoFrame -instead of being real Python-level frame object, so that they can emulate -the common attributes of frame objects. - -The original sys._getframe() ignoring Psyco frames altogether is stored in -psyco._getrealframe(). See also psyco._getemulframe().""" - # 'depth+1' to account for this _getframe() Python function - return embedframe(_psyco.getframe(depth+1)) - -def _getemulframe(depth=0): - """As _getframe(), but the returned objects are real Python frame objects -emulating Psyco frames. Some of their attributes can be wrong or missing, -however.""" - # 'depth+1' to account for this _getemulframe() Python function - return _psyco.getframe(depth+1, 1) - -def patch(name, module=__builtin__): - f = getattr(_psyco, name) - org = getattr(module, name) - if org is not f: - setattr(module, name, f) - setattr(_psyco, 'original_' + name, org) - -_getrealframe = sys._getframe -sys._getframe = _getframe -patch('globals') -patch('eval') -patch('execfile') -patch('locals') -patch('vars') -patch('dir') -patch('input') -_psyco.original_raw_input = raw_input -__builtin__.__in_psyco__ = 0==1 # False - -if hasattr(_psyco, 'compact'): - import kdictproxy - _psyco.compactdictproxy = kdictproxy.compactdictproxy diff --git a/nodebox/ext/psyco/src/py-utils/cvs.py b/nodebox/ext/psyco/src/py-utils/cvs.py deleted file mode 100644 index a37bc93..0000000 --- a/nodebox/ext/psyco/src/py-utils/cvs.py +++ /dev/null @@ -1,116 +0,0 @@ -import sys, os - -def data2unix(lines): - data = [] - modif = 0 - for line in lines: - line1 = line.replace('\r', '') - modif = modif + (line!=line1) - data.append(line1) - return data, modif - -def data2win(lines): - data = [] - modif = 0 - for line in lines: - if line[-1:] == '\n': - line1 = line[:-1].replace('\r', '') + '\r\n' - modif = modif + (line!=line1) - data.append(line1) - return data, modif - -def file2unix(name, verbose=1): - "Turn a file's end-of-line into Unix flavor without changing the timestamp." - s = os.stat(name) - f = open(name, 'rb') - data, modif = data2unix(f) - f.close() - if modif: - if verbose: - print "Unix'ed %d lines in %s" % (modif, name) - f = open(name, 'wb') - f.writelines(data) - f.close() - os.utime(name, (s.st_atime, s.st_mtime)) - return modif - -def file2win(name, verbose=1): - "Turn a file's end-of-line into Windows flavor without changing the timestamp." - s = os.stat(name) - f = open(name, 'rb') - data, modif = data2win(f) - f.close() - if modif: - if verbose: - print "Win'ed %d lines in %s" % (modif, name) - f = open(name, 'wb') - f.writelines(data) - f.close() - os.utime(name, (s.st_atime, s.st_mtime)) - return modif - -class Directory: - def __init__(self, srcpath, relpath=''): - self.path = srcpath - self.relpath = relpath - self.subdirs = [] - self.fileinfo = {} - entryname = os.path.join(srcpath, 'CVS', 'Entries') - try: - f = open(entryname, 'r') - except IOError: - print >> sys.stderr, "note: cannot read", entryname - return - lines = f.readlines() - f.close() - entryname2 = os.path.join(srcpath, 'CVS', 'Entries.Log') - try: - f = open(entryname2, 'r') - except IOError: - pass - else: - for line in f.readlines(): - if line[:2] == 'A ': - lines.append(line[2:]) - elif line[:2] == 'R ': - lines.remove(line[2:]) - f.close() - for line in lines: - line = line.split('/') - if len(line) >= 6: - fname1 = line[1] - if 'D' in line[0]: - self.subdirs.append(fname1) - else: - self.fileinfo[fname1] = line - def subdir(self, name): - return Directory(os.path.join(self.path, name), - os.path.join(self.relpath, name)) - def alldirs(self): - result = [self] - for name in self.subdirs: - result += self.subdir(name).alldirs() - return result - def unknownfiles(self): - try: - return [filename for filename in os.listdir(self.path) - if not self.fileinfo.has_key(filename) and - filename not in self.subdirs and - filename != 'CVS'] - except OSError: - return [] - - -if __name__ == '__main__': - # print the full name of all the files - root = Directory('.') - for dir in root.alldirs(): - for name, info in dir.fileinfo.items(): - print os.path.join(dir.path, name) - -## # Example: print the full name of the files with revision 1.1.1.1 -## root = Directory('.') -## for dir in root.alldirs(): -## for name, info in dir.fileinfo.items(): -## if info[2] == '1.1.1.1': -## print os.path.join(dir.path, name) diff --git a/nodebox/ext/psyco/src/py-utils/httpxam.py b/nodebox/ext/psyco/src/py-utils/httpxam.py deleted file mode 100644 index e60a5ca..0000000 --- a/nodebox/ext/psyco/src/py-utils/httpxam.py +++ /dev/null @@ -1,448 +0,0 @@ -import sys, re, cStringIO, os, dis, types, struct -import xam, psyco -from SimpleHTTPServer import SimpleHTTPRequestHandler, test - -# -# Adapted from SimpleHTTPServer.py. -# - -def show_vinfos(array, d, co=None, path=[]): - text = "
    " - for i in range(len(array)): - vi = array[i] - text += "
  1. " - if hasattr(co, 'co_code') and path == []: - j = i - xam.LOC_LOCALS_PLUS - if 0 <= j < len(co.co_varnames): - text += "(%s):\t" % co.co_varnames[j] - #if name is not None: - # text += "%s " % name - if vi is None: - text += "[NULL]" - else: - text += "[%x] %s" % (vi.addr, vi.gettext()) - if d.has_key(vi.addr): - text += " (already seen above)" - else: - d[vi.addr] = 1 - if vi.array: - text += show_vinfos(vi.array, d, co, path+[i]) - text += '
  2. \n' - text += '
\n' - return text - -def summary_vinfos(array, d, path=[]): - text = '' - indent = ' ' * len(path) - for i in range(len(array)): - vi = array[i] - text += indent - if vi is None: - text += "[NULL]\n" - else: - text += "%d. %s" % (i, vi.getsummarytext()) - if d.has_key(vi.addr): - text += " (already seen above)" - else: - d[vi.addr] = 1 - text += '\n' - if vi.array: - text += summary_vinfos(vi.array, d, path+[i]) - return text - -def find4(f, s4): - result = [] - while 1: - base = f.tell() - buffer = f.read(8192) - if not buffer: - return result - p = -1 - while 1: - p = buffer.find(s4, p+1) - if p<0: - break - if not (p&3): - result.append(base + p) - -re_codebuf = re.compile(r'[/]0x([0-9A-Fa-f]+)$') -re_proxy = re.compile(r'[/]proxy(\d+)$') -re_summary = re.compile(r'[/]summary(\d+)$') -re_trace = re.compile(r'[/]trace0x([0-9A-Fa-f]+)$') -re_traces = re.compile(r'[/]traces0x([0-9A-Fa-f]+)$') -re_trlist = re.compile(r'[/]trace0x([0-9A-Fa-f]+)[-]0x([0-9A-Fa-f]+)$') - -##def cache_load(filename, cache={}): -## try: -## return cache[filename] -## except KeyError: -## data = {} -## try: -## f = execfile(filename, data) -## except: -## data = None -## cache[filename] = data -## return data - -def cache_load(filename, codename, cache={}): - try: - modulecode = cache[filename] - except KeyError: - source = None - try: - f = open(filename, 'rU') - source = f.read() - f.close() - modulecode = compile(source, filename, 'exec') - except Exception, e: - print repr(source) - print '*** While loading %s:' % (filename,) - import traceback - traceback.print_exc() - return None - - return recfindcode(modulecode, codename) - -def recfindcode(code, codename): - if code.co_name == codename: - return code - else: - for c in code.co_consts: - if type(c) is type(code): - result = recfindcode(c, codename) - if result: - return result - return '' - - -class CodeBufHTTPHandler(SimpleHTTPRequestHandler): - - def symhtml(self, sym, addr, inbuf=None, lineaddr=None): - text = xam.symtext(sym, addr, inbuf, lineaddr) - if isinstance(sym, xam.CodeBuf): - if addr == sym.addr: - name = '' - else: - name = '#0x%x' % addr - text = "%s" % (sym.addr, name, text) - if addr == lineaddr: - text += "\ttraces" % addr - return text - - def linehtml(self, line, addr): - line = "%s" % (addr, line) - if addr in self.trace_addr: - line = "%s" % line - i = self.trace_addr.index(addr) - if i == 0 and self.trace_prev is not None: - line += ("\t<<<<<" % - self.trace_prev) - if i == len(self.trace_addr)-1 and self.trace_next is not None: - line += ("\t>>>>>" % - self.trace_next) - return line - - def proxyhtml(self, proxy): - return "(snapshot %s:%s)\n" % ( - codebufs.index(proxy), proxy.co_name, proxy.get_next_instr()) - - def htmlpage(self, title, data): - return ('%s\n' % title - + '

%s

\n' % title - # + '
\n' - + data - + '
\n') - - def bufferpage(self, codebuf): - rev = {} - for o, c in codebuf.reverse_lookup: - if c is not codebuf: - rev[c] = rev.get(c,0) + 1 - if rev: - data = '

Other code buffers pointing to this one:

    \n' - for c in codebufs: # display them in original load order - if rev.has_key(c): - if rev[c] == 1: - extra = '' - else: - extra = '\t(%d times)' % rev[c] - data += '
  • %s\t(%d bytes)%s
  • \n' % \ - (self.symhtml(c, c.addr), - len(c.data), - extra) - data += '
\n' - else: - data = '

No other code buffer points to this one.

\n' - data += '
\n' - data += '
%s
\n' % codebuf.disassemble(self.symhtml, - self.linehtml, - self.proxyhtml) - data += "
Back to the list of code objects\n" - if codebuf.co_name: - data = '

Code object %s from file %s, at position %s

%s' % ( - codebuf.co_name, codebuf.co_filename, codebuf.get_next_instr(), - data) - return data - - def try_hard_to_name(self, addr): - def result(codebuf): - return '%s:%s:%s' % (codebuf.co_filename, codebuf.co_name, - codebuf.get_next_instr()) - codebuf = xam.codeat(addr) - if codebuf is not None: - codemap = codebuf.codemap - proxylist = [] - for lineaddr in range(addr, codebuf.addr-1, -1): - if codemap.has_key(lineaddr): - for proxy in codemap[lineaddr]: - if proxy.co_name: - return result(proxy) - if codebuf.co_name: - return result(codebuf) - else: - return '?' - - def send_head(self): - global codebufs # CT - self.trace_prev = None - self.trace_next = None - self.trace_addr = () - - if self.path == '/' or self.path == '/all': - all = self.path == '/all' - if all: - title = 'List of ALL code objects' - else: - title = 'List of all named code objects' - data = ['
    '] - named = 0 - proxies = 0 - for codebuf in codebufs: - if codebuf.data and codebuf.co_name: - named += 1 - else: - if not codebuf.data: - proxies += 1 - if not all: - continue - data.append('
  • %s:\t%s:\t%s:\t%s\t(%d bytes)
  • \n' % ( - codebuf.co_filename, codebuf.co_name, - codebuf.get_next_instr(), - self.symhtml(codebuf, codebuf.addr), - len(codebuf.data))) - data.append('
\n') - data.append('
%d named buffers; ' % named + - '%d buffers in total, ' % len(codebufs) + - 'including %d proxies' % proxies) - data = ''.join(data) - return self.donepage(title, data) - - match = re_codebuf.match(self.path) - if match: - addr = long(match.group(1), 16) - codebuf = xam.codeat(addr) - if not codebuf: - self.send_error(404, "No code buffer at this address") - return None - if codebuf.addr != addr: - self.trace_addr = [addr] - title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), - codebuf.addr) - data = self.bufferpage(codebuf) - return self.donepage(title, data) - - match = re_trace.match(self.path) - if match: - tracepos = int(match.group(1), 16) - f = open(tracefilename, 'rb') - try: - def traceat(p, f=f): - f.seek(p) - data = f.read(4) - if len(data) == 4: - addr, = struct.unpack('L', data) - return addr - else: - raise IOError - addr = traceat(tracepos) - codebuf = xam.codeat(addr) - if not codebuf: - self.send_error(404, "No code buffer at 0x%x" % addr) - return None - start = codebuf.addr - end = start + len(codebuf.data) - while tracepos > 0: - addr1 = traceat(tracepos-4) - if not (start <= addr1 < addr): - break - tracepos -= 4 - addr = addr1 - self.trace_prev = tracepos-4 - self.trace_addr = [] - while 1: - self.trace_addr.append(addr) - addr1 = traceat(tracepos+4) - if not (addr < addr1 < end): - break - tracepos += 4 - addr = addr1 - self.trace_next = tracepos+4 - finally: - f.close() - title = '%s code buffer at 0x%x' % (codebuf.mode.capitalize(), - codebuf.addr) - data = self.bufferpage(codebuf) - return self.donepage(title, data) - - match = re_traces.match(self.path) - if match: - traceaddr = long(match.group(1), 16) - f = open(tracefilename, 'rb') - plist = find4(f, struct.pack('L', traceaddr)) - f.close() - title = 'Traces through 0x%x' % traceaddr - data = ['
    '] - for p in plist: - data.append("
  • 0x%x\n" % (p, p)) - data.append('
') - data = ''.join(data) - return self.donepage(title, data) - - match = re_trlist.match(self.path) - if match: - start = int(match.group(1), 16) - end = int(match.group(2), 16) - title = 'Traces timed 0x%x to 0x%x' % (start, end) - data = ["

<<<<

\n" % - (start-(end-start), start), - '
    '] - f = open(tracefilename, 'rb') - f.seek(start) - prevname = None - for p in range(start, end, 4): - addr, = struct.unpack('L', f.read(4)) - s = self.try_hard_to_name(addr) - if s == prevname: - continue - data.append("
  • 0x%x: %s\n" % (p,p,s)) - prevname = s - data.append('
') - data.append( - "

>>>>

\n" % - (end, end+(end-start))) - f.close() - data = ''.join(data) - return self.donepage(title, data) - - match = re_proxy.match(self.path) - if match: - title = 'Snapshot' - n = int(match.group(1)) - proxy = codebufs[n] - for n1 in xrange(n-1, -1, -1): - pprev = codebufs[n1] - if (pprev.nextinstr == proxy.nextinstr and - pprev.co_name == proxy.co_name and - pprev.co_filename == proxy.co_filename): - pprev = n1 - break - else: - pprev = None - for n1 in xrange(n+1, len(codebufs)): - pnext = codebufs[n1] - if (pnext.nextinstr == proxy.nextinstr and - pnext.co_name == proxy.co_name and - pnext.co_filename == proxy.co_filename): - pnext = n1 - break - else: - pnext = None - filename = os.path.join(DIRECTORY, proxy.co_filename) - co = cache_load(filename, proxy.co_name) - data = '

PsycoObject structure at this point:' - data += ' ' * 20 - data += '[' - data += '  summary  ' % n - if pprev is not None or pnext is not None: - if pprev is not None: - data += '  <<< previous  ' % pprev - if pnext is not None: - data += '  next >>>  ' % pnext - data += ']' - data += '

\n' - data += show_vinfos(proxy.vlocals, {}, co) - data += '

Disassembly of %s:%s:%s:

\n' % ( - proxy.co_filename, proxy.co_name, proxy.get_next_instr()) - if co is None: #moduledata is None: - txt = "(exception while loading the file '%s')\n" % ( - filename) - else: - if not hasattr(co, 'co_code'): - txt = "(no function object '%s' in file '%s')\n" % ( - proxy.co_name, filename) - else: - txt = cStringIO.StringIO() - oldstdout = sys.stdout - try: - sys.stdout = txt - dis.disassemble(co, proxy.get_next_instr()) - finally: - sys.stdout = oldstdout - txt = txt.getvalue() - data += '
%s
\n' % txt - data += "
Back\n" % proxy.addr - return self.donepage(title, data) - - match = re_summary.match(self.path) - if match: - n = int(match.group(1)) - proxy = codebufs[n] - data = summary_vinfos(proxy.vlocals, {}) - f = cStringIO.StringIO(data) - self.send_response(200) - self.send_header("Content-type", "text/plain") - self.end_headers() - return f - - if self.path == '/checkall': - for codebuf in codebufs: - codebuf.cache_text - f = cStringIO.StringIO('done') - self.send_response(200) - self.send_header("Content-type", "text/plain") - self.end_headers() - return f - - ## CT: simple reload feature - if self.path == "/reload": - codebufs = xam.readdump(FILENAME) - self.path = "/all" - return self.send_head() - - self.send_error(404, "Invalid path") - return None - - def donepage(self, title, data): - f = cStringIO.StringIO(self.htmlpage(title, data)) - self.send_response(200) - self.send_header("Content-type", "text/html") - self.end_headers() - return f - - -if __name__ == '__main__': - if len(sys.argv) <= 1: - print "Usage: python httpxam.py " - print " psyco.dump and any .py files containing code objects" - print " are loaded from the ." - sys.exit(1) - DIRECTORY = sys.argv[1] - del sys.argv[1] - filename = os.path.join(DIRECTORY, 'psyco.dump') - if not os.path.isfile(filename) and os.path.isfile(DIRECTORY): - filename = DIRECTORY - DIRECTORY = os.path.dirname(DIRECTORY) - tracefilename = os.path.join(DIRECTORY, 'psyco.trace') - codebufs = xam.readdump(filename) - FILENAME = filename # CT hack - test(CodeBufHTTPHandler) diff --git a/nodebox/ext/psyco/src/py-utils/ivmdump.py b/nodebox/ext/psyco/src/py-utils/ivmdump.py deleted file mode 100644 index 3ace03a..0000000 --- a/nodebox/ext/psyco/src/py-utils/ivmdump.py +++ /dev/null @@ -1,110 +0,0 @@ -import sys, os -from struct import unpack, calcsize, error - - -class argtypes: - char = "b", "0x%x" - byte = code_t = "B", "0x%x" - int = "i", "0x%x" - long = word_t = "l", "0x%x" - def stack(t): - if isinstance(t, tuple): - return t[0], "[%d]" - else: - return "", "[%s]" % t, t - def indirect(t): - return t - -fn = os.path.join(os.path.dirname(__file__), '../c/ivm/prolog/insns-table.py') -execfile(fn, argtypes.__dict__, globals()) - - -class Mode: - - def __init__(self, opcode): - self.opcode = opcode - if opcode in insntable: - self.insns = insntable[opcode] - else: - self.insns = [("<%d>" % opcode,)] - if len(self.insns) == 1: - self.singleinsn = self.insns[0][0] - else: - self.singleinsn = None - self.stackpushes = stackpushes.get(opcode) - self.unpackfmt = "=" - self.template = "" - self.constantargs = [] - i = 0 - line = '%10x\t' - for insn in self.insns: - args = [] - for arg in insn[1:]: - if isinstance(arg, tuple): - self.unpackfmt += arg[0] - args.append(arg[1]) - if len(arg)>2: - self.constantargs.append((i, arg[2])) - else: - args.append(str(arg)) - self.constantargs.append((i, arg)) - i += 1 - line += '%-11s %s' % (insn[0], ', '.join(args)) - self.template += line - line = '\n \t' - self.unpacksize = calcsize(self.unpackfmt) - - def dump(self, data, address, position): - data = data[position:position+self.unpacksize] - args = unpack(self.unpackfmt, data) - result = self.template % ((address,) + args) - return position+self.unpacksize, result.split('\n'), args - - def getargs(self, data, position): - data = data[position:position+self.unpacksize] - args = list(unpack(self.unpackfmt, data)) - for i, value in self.constantargs: - args.insert(i, value) - return args - -insnlist = [Mode(opcode) for opcode in range(256)] - - -def dump(data, originaddr): - l = len(data) - if l>8 and data[-4:] == '\x00\x00\x00\x00': - p, = unpack("l", data[-8:-4]) - queue = ["", " (promotion chained list: 0x%x)" % p] - l -= 4 - else: - queue = [] - depth = None - result = [] - p = 0 - try: - while p < l: - mode = insnlist[ord(data[p])] - p, lines, args = mode.dump(data, originaddr+p, p+1) - if depth is not None: - if mode.stackpushes is None: - depth = None - else: - depth += mode.stackpushes - lines[-1] = '%-40s [%d]' % (lines[-1], depth) - if mode.singleinsn == 'assertdepth': - asserteddepth = args[0]/4 - if depth is not None and asserteddepth != depth: - err = '************* assertion error **************' - lines.append(err) - print >> sys.stderr, err - print >> sys.stderr, originaddr - else: - lines = [(s+' ')[:s.find('assertdepth')] for s in lines] - depth = asserteddepth - result += lines - except error: - while p < l: - result.append(" %10x\t<%d>" % (originaddr+p, ord(data[p]))) - p += 1 - result += queue - return result diff --git a/nodebox/ext/psyco/src/py-utils/ivmextract.py b/nodebox/ext/psyco/src/py-utils/ivmextract.py deleted file mode 100644 index 12c67a3..0000000 --- a/nodebox/ext/psyco/src/py-utils/ivmextract.py +++ /dev/null @@ -1,73 +0,0 @@ -import os, sys -import xam -from ivmdump import insnlist, insntable, stackpushes, chainable -from struct import unpack - - -IGNORE_INSNS = ('assertdepth', 'dynamicfreq') - -def dump(data): - l = len(data) - p = 0 - results = [] - result = [] - freq = 1 - while p < l: - mode = insnlist[ord(data[p])] - if mode.opcode not in insntable: - break - p += mode.unpacksize + 1 - if p > l: - break - args = mode.getargs(data, p-mode.unpacksize) - for insn in mode.insns: - if insn[0] in IGNORE_INSNS: - if insn[0] == 'dynamicfreq': - freq = args[0] - continue - a = len(insn)-1 - if a: - txt = '%s(%s)' % (insn[0], ','.join(map(str,args[:a]))) - del args[:a] - else: - txt = insn[0] - result.append(txt) - if mode.opcode not in chainable: - results.append((freq, result)) - result = [] - results.append((freq, result)) - return results - - -def main(DIRECTORY): - filename = os.path.join(DIRECTORY, 'psyco.dump') - if not os.path.isfile(filename) and os.path.isfile(DIRECTORY): - filename = DIRECTORY - DIRECTORY = os.path.dirname(DIRECTORY) - outfilename = filename + '.ivm' - if os.path.isfile(filename): - codebufs = xam.readdump(filename) - f = open(outfilename, 'w') - for codebuf in codebufs: - if codebuf.data: - data, addr, next, key = codebuf.splitheader() - for freq, lst in dump(data): - if len(lst) > 1: - print >> f, 'psycodump(%d, [%s]).' % (freq, - ', '.join(lst)) - f.close() - elif not os.path.isfile(outfilename): - print >> sys.stderr, filename, "not found." - sys.exit(1) - else: - print >> sys.stderr, "reusing text dump from", outfilename - return outfilename - - -if __name__ == '__main__': - if len(sys.argv) <= 1: - print "Usage: python ivmextract.py " - print " psyco.dump is loaded from the ." - sys.exit(2) - for dir in sys.argv[1:]: - print "'%s'." % main(dir) diff --git a/nodebox/ext/psyco/src/py-utils/ivmoptimize.py b/nodebox/ext/psyco/src/py-utils/ivmoptimize.py deleted file mode 100644 index fd5a916..0000000 --- a/nodebox/ext/psyco/src/py-utils/ivmoptimize.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -python ivmoptimize.py path [ path ... ] - -This script optimizes and regenerates the 'ivm' virtual machine -used by Psyco on non-i386 platforms. You need to compile Psyco -in debugging mode (see below) and use 'psyco.dumpcodebuf()' to -generate one or more dump files called 'psyco.dump'. Run then -the present script with the path(s) to the 'psyco.dump' file(s). -Finally, you have to recompile Psyco in normal (optimized) mode. - -You need SWI Prolog to do that. http://www.swi-prolog.org/ - -To compile Psyco in debugging mode, create a file 'preferences.py' -in the same directory as 'setup.py' with the following content: - -PROCESSOR = 'ivm' -PSYCO_DEBUG = 1 -VERBOSE_LEVEL = 1 -CODE_DUMP = 1 - -and re-run 'python setup.py build -f install'. -""" -import sys, os -import ivmextract - -try: - LOCALDIR = __file__ -except NameError: - LOCALDIR = sys.argv[0] -LOCALDIR = os.path.dirname(LOCALDIR) - - -def main(paths, maxlength=8, optmode='optimize.pl'): - outfilenames = [os.path.abspath(ivmextract.main(dir)) for dir in paths] - os.chdir(os.path.join(LOCALDIR, os.pardir, 'c', 'ivm', 'prolog')) - g = open("mode_combine.pl", "w") - g.close() # empty file - g = os.popen('pl -f %s -g remotecontrol -t halt' % optmode, 'w') - for fn in outfilenames: - print >> g, "loaddumpfile('%s')." % fn - print >> g, "measure(%d)." % maxlength - print >> g, "emitmodes(255)." - g.close() - g = open("mode_combine.pl", "r") - if not g.readline(): - print >> sys.stderr, "*** the Prolog program %s failed" % optmode - sys.exit(1) - g.close() - err = os.system('pl -f insns.pl -g main_emit -t halt') - if err == 0: - print - print 'Done. If you compile Psyco, its ivm virtual machine will now' - print 'be optimized for the usage patterns found in the dump files.' - - -if __name__ == '__main__': - if len(sys.argv) <= 1: - print >> sys.stderr, __doc__ - sys.exit(2) - else: - main(sys.argv[1:]) diff --git a/nodebox/ext/psyco/src/py-utils/manifest.py b/nodebox/ext/psyco/src/py-utils/manifest.py deleted file mode 100644 index 5b6344a..0000000 --- a/nodebox/ext/psyco/src/py-utils/manifest.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import generators -import os -import py # the py lib, see http://codespeak.net/py - -def psycofiles(): - path = py.path.svnwc(os.pardir) - for p in path.visit(lambda x: x.check(versioned=1)): - if p.check(dir=1): - print p - else: - yield p.relto(path) - -def generate(): - filename = os.path.join('..', 'MANIFEST') - print 'Rebuilding %s...' % filename - lst = list(psycofiles()) - lst.sort() - f = open(filename, 'w') - for filename in lst: - print >> f, filename - f.close() - -if __name__ == '__main__': - generate() diff --git a/nodebox/ext/psyco/src/py-utils/symbols.py b/nodebox/ext/psyco/src/py-utils/symbols.py deleted file mode 100644 index a034948..0000000 --- a/nodebox/ext/psyco/src/py-utils/symbols.py +++ /dev/null @@ -1,38 +0,0 @@ -import sys, os -import xam - -""" -This script loads a psyco.dump file (like httpxam.py) and -reads on its standard input a list of addresses. For each -address that it recognizes it prints the name of the -corresponding symbol or the address of the code buffer -that contains the address. Use this on debugger memory -dumps. - -This could be enhanced by detecting the addresses of -vinfo_t's as well. -""" - - -def main(codebufs, f): - while 1: - line = f.readline() - if not line: - break - for addr in xam.lineaddresses(line): - sym = xam.symbols.get(addr) - if sym: - print '0x%x\tis\t' % addr, xam.symtext(sym, addr) - break - - -if __name__ == '__main__': - if len(sys.argv) <= 1: - print "Usage: python symbols.py " - print " psyco.dump is loaded from the ." - sys.exit(1) - DIRECTORY = sys.argv[1] - del sys.argv[1] - codebufs = xam.readdump(os.path.join(DIRECTORY, 'psyco.dump')) - print >> sys.stderr, "Reading for addresses from stdin..." - main(codebufs, sys.stdin) diff --git a/nodebox/ext/psyco/src/py-utils/vinfo_dump.py b/nodebox/ext/psyco/src/py-utils/vinfo_dump.py deleted file mode 100644 index 54a2e09..0000000 --- a/nodebox/ext/psyco/src/py-utils/vinfo_dump.py +++ /dev/null @@ -1,56 +0,0 @@ -from xam import * -import httpxam - - -def load_vi_array(dumpfile, d): - match = re_int.match(dumpfile.readline()) - assert match - count = int(match.group(1)) - a = [] - for i in range(count): - line = dumpfile.readline() - match = re_int.match(line) - assert match - addr = long(match.group(1)) - if d.has_key(addr): - vi = d[addr] - else: - line = dumpfile.readline() - match = re_ctvinfo.match(line) - if match: - vi = CompileTimeVInfo(int(match.group(1)), - long(match.group(2))) - else: - match = re_rtvinfo.match(line) - if match: - vi = RunTimeVInfo(long(match.group(1))) - else: - match = re_vtvinfo.match(line) - assert match - vi = VirtualTimeVInfo(long(match.group(1), 16)) - d[addr] = vi - vi.addr = addr - vi.array = load_vi_array(dumpfile, d) - a.append(vi) - a.reverse() - return a - -def main(dumpfile): - import os, tempfile - array = load_vi_array(dumpfile, {0: None}) - text = httpxam.show_vinfos(array, {}) - if os.fork() == 0: - TMP = tempfile.mktemp('.html') - g = open(TMP, 'w') - g.write('\n') - g.write(text) - g.write('\n') - g.close() - try: - os.system('xterm -e lynx -force_html %s' % TMP) - finally: - os.unlink(TMP) - -if __name__ == '__main__': - import sys - main(sys.stdin) diff --git a/nodebox/ext/psyco/src/py-utils/win32/README.TXT b/nodebox/ext/psyco/src/py-utils/win32/README.TXT deleted file mode 100644 index 5f88631..0000000 --- a/nodebox/ext/psyco/src/py-utils/win32/README.TXT +++ /dev/null @@ -1,16 +0,0 @@ -Windows users who want to explore the generated machine code need to download -the following files and put them in this directory: - - objdump.exe: - -http://cvs.sourceforge.net/viewcvs.py/psyco/psyco/py-utils/win32/objdump.exe?rev=1.1&view=auto - - cygwin1.dll: - -http://cvs.sourceforge.net/viewcvs.py/psyco/psyco/py-utils/win32/cygwin1.dll?rev=1.1&view=auto - - -Both are GPL software distributed (with source) in Red Hat's Cygwin -(http://www.redhat.com/software/cygwin/). - -For more information on exploring the machine code see the top-level README.TXT file. diff --git a/nodebox/ext/psyco/src/py-utils/xam.py b/nodebox/ext/psyco/src/py-utils/xam.py deleted file mode 100644 index 80fc982..0000000 --- a/nodebox/ext/psyco/src/py-utils/xam.py +++ /dev/null @@ -1,570 +0,0 @@ -from __future__ import nested_scopes -import os, sys, re, htmlentitydefs, struct, bisect -__metaclass__ = type - -tmpfile = '~tmpfile.tmp' - -# the disassembler to use. 'objdump' writes GNU-style instructions. -# 'ndisasm' uses Intel syntax. - -objdump = 'objdump -b binary -m i386 --adjust-vma=%(origin)d -D %(file)s' -if sys.platform == "win32": - try: - from xam import __file__ as _xamfile - except ImportError: - raise ImportError, "could not import xam module" - _win32_path = os.path.join(os.path.split(_xamfile)[0], "win32") - objdump = os.path.join(_win32_path, objdump) - _objdumpexe = objdump.split()[0]+".exe" - # test whether it works: - if os.system(_objdumpexe + " -v"): - raise IOError, "file %s and cygwin1.dll must exist" % _objdumpexe -#objdump = 'ndisasm -o %(origin)d -u %(file)s' - -# the files from which symbols are loaded. -# the order and number of files must match -# psyco_dump_code_buffers() in psyco.c. -symbolfiles = [sys.executable] -try: - from psyco import _psyco - symbolfiles.append(_psyco.__file__) -except ImportError: - pass - -# the program that lists symbols, and the output it gives -symbollister = 'nm %s' -re_symbolentry = re.compile(r'([0-9a-fA-F]+)\s\w\s(.*)') - -if sys.platform == "win32": - # no way to get full info into the executables by - # VC7. /PDB:NONE no longer supported. - # so we have to read the map files. - if sys.executable.lower().endswith("_d.exe"): - _mapfiles = ("python23_d.map", "_psyco_d.map") - else: - _mapfiles = ("python23.map", "_psyco.map") - symbolfiles = [os.path.join(_win32_path, x) for x in _mapfiles] - for _filepath in symbolfiles: - if not os.path.exists(_filepath): - raise IOError, "please make sure that '%s' exists" % _filepath - - class symbollister: - def __init__(self, filename): - self.file = file(filename) - self.generator = self._readline() - - def _readline(self): - for line in self.file: - # 0001:000661e0 _PyEval_CallFunction 1e0671e0 f modsupport.obj - # 0003:0000e770 _PyClass_Type 1e0d8770 classobject.obj - pieces = line.split() - if len(pieces) == 5: - colonadr, name, adr, dummy, obj = pieces - elif len(pieces) == 4: - colonadr, name, adr, obj = pieces - dummy = "d" - else: - continue - if colonadr.count(":") == 1 and obj.endswith(".obj"): - yield "%s %s %s\n" % (adr, dummy, name[1:]) - - def readline(self): - try: - return self.generator.next() - except StopIteration: - return "" - - def close(self): - self.file.close() - - def __iter__(self): - return self.generator - - -re_addr = re.compile(r'[\s,$]0x([0-9a-fA-F]+)') -re_lineaddr = re.compile(r'\s*0?x?([0-9a-fA-F]+)') - - -symbols = {} -#rawtargets = {} -codeboundary = [] - -try: - from xamsupport import any_pointer -except ImportError: - def any_pointer(addr0, data, start, end, unpack=struct.unpack): - for i in range(4, len(data)+1): - offset, = unpack('l', data[i-4:i]) - if start <= addr0+i+offset < end or start <= offset < end: - return 1 - return 0 - -def machine_code_dump(data, originaddr, format): - if format == 'ivm': - import ivmdump - result = ivmdump.dump(data, originaddr) - elif format == 'i386': - f = open(tmpfile, 'wb') - f.write(data) - f.close() - try: - g = os.popen(objdump % {'file': tmpfile, 'origin': originaddr}, 'r') - result = g.readlines() - g.close() - finally: - os.unlink(tmpfile) - return result - -def load_symbol_file(filename, symb1, addr1): - d = {} - if type(symbollister) is str: - g = os.popen(symbollister % filename, "r") - else: - g = symbollister(filename) - while 1: - line = g.readline() - if not line: - break - match = re_symbolentry.match(line) - if match: - d[match.group(2)] = long(match.group(1), 16) - g.close() - if d.has_key(symb1): - delta = addr1 - d[symb1] - else: - delta = 0 - print >> sys.stderr,"Warning: no symbol '%s' in '%s'" % (symb1, filename) - for key, value in d.items(): - symbols[value + delta] = key - - -def symtext(sym, addr, inbuf=None, lineaddr=None): - if isinstance(sym, CodeBuf): - if sym is inbuf: - name = 'top' - else: - name = '%s codebuf 0x%x' % (sym.mode, sym.addr) - if addr > sym.addr: - name += ' + %d' % (addr-sym.addr) - return name - else: - return sym - -revmap = {} -for key, value in htmlentitydefs.entitydefs.items(): - if type(value) is type(' '): - revmap[value] = '&%s;' % key - -def htmlquote(text): - return ''.join([revmap.get(c,c) for c in text]) - -def lineaddresses(line): - result = [] - i = 0 - while 1: - match = re_addr.search(line, i) - if not match: - break - i = match.end() - addr = long(match.group(1), 16) - result.append(addr) - return result - -def codeat(addr): - i = bisect.bisect(codeboundary, (addr, None)) - if i>0: - addrend, codebuf = codeboundary[i-1] - if isinstance(codebuf, CodeBuf): - return codebuf - - -re_int = re.compile(r"(\-?\d+)$") -re_ctvinfo = re.compile(r"ct (\d+) (\-?\d+)$") -re_rtvinfo = re.compile(r"rt (\-?\d+)$") -re_vtvinfo = re.compile(r"vt 0x([0-9a-fA-F]+)$") - -LOC_LOCALS_PLUS = 3 - -class CodeBuf: - __slots__ = ['mode', 'co_filename', 'co_name', 'nextinstr', 'addr', - 'stackdepth', 'specdict', 'data', 'cache_text', - 'disass_text', 'reverse_lookup', 'vlocals', - 'complete_list', 'dumpfile', 'vlocalsofs', 'codemap'] - machine_code_format = '?' - - def __init__(self, mode, co_filename, co_name, nextinstr, - addr, stackdepth): - self.mode = mode - self.co_filename = co_filename - self.co_name = co_name - self.nextinstr = nextinstr - self.addr = addr - #self.data = data - self.stackdepth = stackdepth - #self.reverse_lookup = [] # list of (offset, codebuf pointing there) - self.specdict = [] - if self.mode != "proxy": - codeboundary.append((self.addr-0.5, self)) - else: - self.data = "" - #for i in range(4, len(data)+1): - # offset, = struct.unpack('l', data[i-4:i]) - # rawtargets.setdefault(addr+i+offset, {})[self] = 1 - - def getboundary(self): - i = bisect.bisect(codeboundary, (self.addr-0.5, self)) - prev = codeboundary[i-1][1] - next = codeboundary[i][1] - #while not isinstance(next, BigBuffer) and next.addr == self.addr: - # i = i + 1 - # next = codeboundary[i][1] - while not isinstance(codeboundary[i][1], BigBuffer): - i = i + 1 - bigbuf = codeboundary[i][1] - return prev, next, bigbuf - - def splitheader(self): - data = self.data - addr = self.addr - k = 0 - while data[k:k+1] == '\xCC': - k = k + 1 - if data[k:k+4] == '\x66\x66\x66\x66': - # detected a rt_local_buf_t structure - next, key = struct.unpack('LL', data[k+4:k+12]) - data = data[k+12:] - addr += k+12 - else: - next = key = None - return data, addr, next, key - - def __getattr__(self, attr): - if attr == 'data': - prev, next, bigbuf = self.getboundary() - assert prev is self - self.data = data = bigbuf.load(self.addr, next.addr) - return data - if attr == 'cache_text': - # produce the disassembly listing - data, addr, next, key = self.splitheader() - self.cache_text = [] - if key is not None: - self.cache_text.append( - 'Created by promotion of the value 0x%x\n' % key) - if next is not None: - self.cache_text.append( - 'Next promoted value at buffer 0x%x\n' % next) - self.cache_text += machine_code_dump(data, addr, - CodeBuf.machine_code_format) - return self.cache_text - if attr == 'disass_text': - txt = self.cache_text - if self.specdict: - txt.append('\n') - txt.append("'do_promotion' dictionary:\n") - for key, value in self.specdict: - txt.append('.\t%s:\t\t\n' % htmlquote(key)) - txt.append('.\t\t0x%x\t\t\n' % value) - self.disass_text = txt - return txt - if attr == 'reverse_lookup': - # 'reverse_lookup' is a list of (offset, codebuf pointing there) - self.reverse_lookup = [] - start = self.addr - end = start + len(self.data) - for codebuf in self.complete_list: - if any_pointer(codebuf.addr, codebuf.data, start, end): - for line in codebuf.disass_text: - for addr in lineaddresses(line): - if start <= addr < end: - self.reverse_lookup.append((addr-start, codebuf)) - return self.reverse_lookup - if attr == 'vlocals': - self.dumpfile.seek(self.vlocalsofs) - self.vlocals = self.load_vi_array({0: None}) - return self.vlocals - raise AttributeError, attr - - def load_vi_array(self, d): - dumpfile = self.dumpfile - match = re_int.match(dumpfile.readline()) - assert match - count = int(match.group(1)) - a = [] - for i in range(count): - line = dumpfile.readline() - match = re_int.match(line) - assert match - addr = long(match.group(1)) - if d.has_key(addr): - vi = d[addr] - else: - line = dumpfile.readline() - match = re_ctvinfo.match(line) - if match: - vi = CompileTimeVInfo(int(match.group(1)), - long(match.group(2))) - else: - match = re_rtvinfo.match(line) - if match: - vi = RunTimeVInfo(long(match.group(1)), self.stackdepth) - else: - match = re_vtvinfo.match(line) - assert match - vi = VirtualTimeVInfo(long(match.group(1), 16)) - d[addr] = vi - vi.addr = addr - vi.array = self.load_vi_array(d) - a.append(vi) - a.reverse() - return a - - def get_next_instr(self): - if self.nextinstr >= 0: - return self.nextinstr - - def spec_dict(self, key, value): - self.specdict.append((key, value)) - #rawtargets.setdefault(value, {})[self] = 1 - try: - del self.disass_text - except: - pass - try: - del self.reverse_lookup - except: - pass - -## def build_reverse_lookup(self): -## for line in self.disass_text: -## for addr in lineaddresses(line): -## sym = symbols.get(addr) -## if isinstance(sym, CodeBuf): -## sym.reverse_lookup.append((addr-sym.addr, self)) - - def disassemble(self, symtext=symtext, linetext=None, snapshot=None): - seen = {} - data = [] - for line in self.disass_text: - if line.endswith('\n'): - line = line[:-1] - match = re_lineaddr.match(line) - if match: - lineaddr = long(match.group(1), 16) - if not seen.has_key(lineaddr): - if self.codemap.has_key(lineaddr) and snapshot: - for proxy in self.codemap[lineaddr]: - data.append(snapshot(proxy)) - seen[lineaddr] = 1 - ofs = lineaddr - self.addr - sources = [c for o, c in self.reverse_lookup if o == ofs] - if sources and linetext: - line = linetext(line, lineaddr) - if sources != [self]*len(sources): - data.append('\n') - else: - lineaddr = None - for addr in lineaddresses(line): - sym = symbols.get(addr) or codeat(addr) - if sym: - line = '%s\t(%s)' % (line, symtext(sym, addr, self,lineaddr)) - break - data.append(line + '\n') - return ''.join(data) - - -class BigBuffer: - __slots__ = ['file', 'offset', 'start', 'length', 'addr', 'priority'] - def __init__(self, file, start, length): - #if sys.stderr.softspace: - # print >> sys.stderr - #print >> sys.stderr, 'BigBuffer:', hex(start), hex(start+length), - #print >> sys.stderr, '(%d)' % length - self.file = file - self.offset = file.tell() - self.start = start - self.length = length - self.addr = start + length # end address - self.priority = -len(codeboundary) - codeboundary.append((self.addr-0.25, self)) - file.seek(self.length, 1) - def load(self, begin, end): - assert self.start <= begin <= self.addr, \ - (hex(self.start), hex(begin), hex(end), hex(self.addr)) - self.file.seek(self.offset + (begin-self.start)) - return self.file.read(min(self.addr, end) - begin) - - -class VInfo: - __slots__ = ['addr', 'array'] - -class CompileTimeVInfo(VInfo): - __slots__ = ['flags', 'value'] - def __init__(self, flags, value): - self.flags = flags - self.value = value - def gettext(self): - text = "Compile-time value 0x%x" % self.value - if self.flags & 1: - text += ", fixed" - if self.flags & 2: - text += ", reference" - return text - def getsummarytext(self): - text = "Compile-time" - if self.flags & 1: - text += " fixed" - text += " 0x%x" % self.value - return text - -class RunTimeVInfo(VInfo): - __slots__ = ['source', 'stackdepth'] - REG_NAMES = ["eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"] - def __init__(self, source, stackdepth=None): - self.source = source - self.stackdepth = stackdepth - def gettext(self): - text = "Run-time source," - reg = self.source >> 28 - stack = self.source & 0x03FFFFFC - if CodeBuf.machine_code_format == 'ivm': - if reg: - text += " in a register ??????" - if not stack: - text += " not in stack ??????" - else: - text += " in stack [%d] or from top #%d" % ( - (self.stackdepth-stack)/4, - stack/4) - else: - if 0 <= reg < 8: - text += " in register %s" % self.REG_NAMES[reg].upper() - if stack: - text += " and" - if stack: - if self.stackdepth is None: - sd = "" - else: - sd = "[ESP+0x%x] or " % (self.stackdepth - stack) - text += " in stack %sfrom top %d" % (sd, stack) - if not (self.source & 0x08000000): - text += " holding a reference" - if self.source & 0x04000000: - text += " >=0" - return text - def getsummarytext(self): - return "Run-time" - -class VirtualTimeVInfo(VInfo): - __slots__ = ['vs'] - def __init__(self, vs): - self.vs = vs - def gettext(self): - return "Virtual-time source (%x)" % self.vs - def getsummarytext(self): - return "Virtual-time (%x)" % self.vs - -def readdump(filename = 'psyco.dump'): - del codeboundary[:] - re_header = re.compile(r"Psyco dump [[](\w+?)[]]") - re_symb1 = re.compile(r"(\w+?)[:]\s0x([0-9a-fA-F]+)") - re_codebuf = re.compile(r"CodeBufferObject 0x([0-9a-fA-F]+) (\-?\d+) \'(.*?)\' \'(.*?)\' (\-?\d+) \'(.*?)\'$") - re_specdict = re.compile(r"spec_dict 0x([0-9a-fA-F]+)") - re_vinfo_array = re.compile(r"vinfo_array") - re_spec1 = re.compile(r"0x([0-9a-fA-F]+)\s(.*)$") - re_bigbuffer = re.compile(r"BigBuffer 0x([0-9a-fA-F]+) (\d+)$") - - codebufs = [] - dumpfile = open(filename, 'rb') - match = re_header.match(dumpfile.readline()) - if not match: - raise ValueError, "'%s' does not look like a Psyco dump" % filename - CodeBuf.machine_code_format = match.group(1) - - bufcount, = struct.unpack("i", dumpfile.read(4)) - buftable = list(struct.unpack("l"*bufcount, dumpfile.read(4*bufcount))) - buftable.reverse() - if buftable: - filesize = buftable[-1] - else: - filesize = sys.maxint - filesize *= 1.0 - nextp = 0.1 - cbsortedsize = 0 - for filename in symbolfiles: - line = dumpfile.readline() - match = re_symb1.match(line) - assert match - load_symbol_file(filename, match.group(1), long(match.group(2), 16)) - while 1: - line = dumpfile.readline() - if not line: - print "Note: unexpected end of file" - break - #print line.strip() - match = re_codebuf.match(line) - if match: - percent = dumpfile.tell() / filesize - if percent >= nextp: - print >> sys.stderr, '%d%%...' % int(100*percent), - nextp += 0.1 - #size = int(match.group(2)) - #data = dumpfile.read(size) - #assert len(data) == size - codebuf = CodeBuf(match.group(6), match.group(3), match.group(4), - int(match.group(5)), long(match.group(1), 16), - int(match.group(2))) - codebuf.dumpfile = dumpfile - codebuf.vlocalsofs = buftable.pop() - codebufs.append(codebuf) - else: - match = re_specdict.match(line) - if match: - addr = long(match.group(1), 16) - if len(codeboundary) != cbsortedsize: - codeboundary.sort() - cbsortedsize = len(codeboundary) - codebuf = codeat(addr-4) - if codebuf is None: - raise "spec_dict with no matching code buffer", line - while 1: - line = dumpfile.readline() - if len(line)<=1: - break - match = re_spec1.match(line) - assert match - codebuf.spec_dict(match.group(2), long(match.group(1), 16)) - elif re_vinfo_array.match(line): - assert len(codebufs) == bufcount - break - else: - match = re_bigbuffer.match(line) - if match: - BigBuffer(dumpfile, long(match.group(1), 16), - int(match.group(2))) - else: - raise "invalid line", line - print >> sys.stderr, 'sorting...', - if len(codeboundary) != cbsortedsize: - codeboundary.sort() - codemap = {} - #cblist = [] - codebufs.reverse() - for codebuf in codebufs: - codebuf.complete_list = codebufs - codebuf.codemap = codemap - codemap.setdefault(codebuf.addr, []).insert(0, codebuf) - #prev, next, bigbuf = codebuf.getboundary() - #cblist.append((bigbuf.priority, codebuf.addr, codebuf)) - #cblist.sort() - #codebufs[:] = [codebuf for priority, addr, codebuf in cblist] - print >> sys.stderr, '100%' - return codebufs - -if __name__ == '__main__': - if len(sys.argv) > 1: - codebufs = readdump(sys.argv[1]) - else: - codebufs = readdump() - for codebuf in codebufs: - print codebuf.disassemble() diff --git a/nodebox/ext/psyco/src/py-utils/xamsupport.c b/nodebox/ext/psyco/src/py-utils/xamsupport.c deleted file mode 100644 index 5858c55..0000000 --- a/nodebox/ext/psyco/src/py-utils/xamsupport.c +++ /dev/null @@ -1,31 +0,0 @@ -#include - -static PyObject* any_pointer(PyObject* self, PyObject* args) -{ - char* from; - int fromlen, i; - long addr0, start, end, intervallen; - if (!PyArg_ParseTuple(args, "ls#ll", &addr0, &from, &fromlen, &start, &end)) - return NULL; - - intervallen = end-start; - for (i=0; i<=fromlen-4; i++) - { - long offset = *(long*) (from+i); - offset -= start; - if (((unsigned long)(addr0+i+offset)) < intervallen || - ((unsigned long) offset) < intervallen) - return PyInt_FromLong(1); - } - return PyInt_FromLong(0); -} - -static PyMethodDef XamMethods[] = { - {"any_pointer", any_pointer, METH_VARARGS}, - {NULL, NULL} /* Sentinel */ -}; - -void initxamsupport() -{ - Py_InitModule("xamsupport", XamMethods); -} diff --git a/nodebox/ext/psyco/src/setup.py b/nodebox/ext/psyco/src/setup.py deleted file mode 100644 index 5963d95..0000000 --- a/nodebox/ext/psyco/src/setup.py +++ /dev/null @@ -1,180 +0,0 @@ -#! /usr/bin/env python - -"""Psyco shows that it is possible to execute Python code at speeds -approaching that of fully compiled languages, by "specialization". -This extension module for the unmodified interpreter accelerates -user programs with little or not change in their sources, by a -factor that can be very interesting (2-10 times is common).""" - -import os, sys -from distutils.core import setup -from distutils.extension import Extension - -PROCESSOR = None # autodetect - -#################################################################### -# -# Customizable debugging flags. -# Copy the following section in a new file 'preferences.py' to -# avoiding changing setup.py. Uncomment and change the options there -# at your will. Setting PsycoDebug to 1 is probably the first thing -# you want to do to enable all internal checks. - -#PSYCO_DEBUG = 1 - -# level of debugging outputs: 0 = none, 1 = a few, 2 = more, -# 3 = detailled, 4 = full execution trace -#VERBOSE_LEVEL = 0 - -# write produced blocks of code into a file; see 'xam.py' -# 0 = off, 1 = only manually (from a debugger or with _psyco.dumpcodebuf()), -# 2 = only when returning from Psyco, -# 3 = every time a new code block is built -#CODE_DUMP = 1 - -# Linux-only *heavy* memory checking: 0 = off, 1 = reasonably heavy, -# 2 = unreasonably heavy. -#HEAVY_MEM_CHECK = 0 - -# If the following is set to 1, Psyco is compiled by #including all .c -# files into psyco.c. -# It provides a version of _psyco.so whose only exported (non-static) -# symbol is init_psyco(). It also seems that the GDB debugger doesn't locate -# too well non-static symbols in shared libraries. Recompiling after minor -# changes is faster if ALL_STATIC=0. -ALL_STATIC = 1 - -# Be careful with ALL_STATIC=0, because I am not sure the distutils can -# correctly detect all the dependencies. In case of doubt always compile -# with `setup.py build_ext -f'. - - -#################################################################### - -# override options with the ones from preferences.py, if the file exists. -try: - execfile('preferences.py') -except IOError: - pass - - -# processor auto-detection -class ProcessorAutodetectError(Exception): - pass -def autodetect(): - platform = sys.platform.lower() - if platform.startswith('win'): # assume an Intel Windows - return 'i386' - # assume we have 'uname' - mach = os.popen('uname -m', 'r').read().strip() - if not mach: - raise ProcessorAutodetectError, "cannot run 'uname -m'" - if mach == 'x86_64' and sys.maxint == 2147483647: - mach = 'x86' # it's a 64-bit processor but in 32-bits mode, maybe - try: - return {'i386': 'i386', - 'i486': 'i386', - 'i586': 'i386', - 'i686': 'i386', - 'i86pc': 'i386', # Solaris/Intel - 'x86': 'i386', # Apple - }[mach] - except KeyError: - raise ProcessorAutodetectError, "unsupported processor '%s'" % mach - - -# loads the list of source files from SOURCEDIR/files.py -# and make the appropriate options for the Extension class. -SOURCEDIR = 'c' - -data = {} -execfile(os.path.join(SOURCEDIR, 'files.py'), data) - -SRC = data['SRC'] -MAINFILE = data['MAINFILE'] -PLATFILE = data['PLATFILE'] - -macros = [] -for name in ['PSYCO_DEBUG', 'VERBOSE_LEVEL', - 'CODE_DUMP', 'HEAVY_MEM_CHECK', 'ALL_STATIC', - 'PSYCO_NO_LINKED_LISTS']: - if globals().has_key(name): - macros.append((name, str(globals()[name]))) - -if PROCESSOR is None: - try: - PROCESSOR = autodetect() - except ProcessorAutodetectError: - PROCESSOR = 'ivm' # fall back to the generic virtual machine - print "PROCESSOR = %r" % PROCESSOR -processor_dir = os.path.join('c', PROCESSOR) -localsetup = os.path.join(processor_dir, 'localsetup.py') -if os.path.isfile(localsetup): - d = globals().copy() - d['__file__'] = localsetup - execfile(localsetup, d) - -if ALL_STATIC: - sources = [SOURCEDIR + '/' + MAINFILE, - SOURCEDIR + '/' + PLATFILE] -else: - sources = [SOURCEDIR + '/' + s.filename for s in SRC] - -extra_compile_args = [] -extra_link_args = [] -if sys.platform == 'win32': - if globals().get('PSYCO_DEBUG'): - # how do we know if distutils will use the MS compilers ??? - # these are just hacks that I really need to compile psyco debug versions - # on Windows - extra_compile_args.append('/Od') # no optimizations, override the default /Ox - extra_compile_args.append('/ZI') # debugging info - extra_link_args.append('/debug') # debugging info - macros.insert(0, ('NDEBUG', '1')) # prevents from being linked against python2x_d.lib - - -CLASSIFIERS = [ - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: C', - 'Topic :: Software Development :: Compilers', - 'Topic :: Software Development :: Interpreters', - ] - -try: - import distutils.command.register -except ImportError: - kwds = {} -else: - kwds = {'classifiers': CLASSIFIERS} - -py_modules = ['psyco.%s' % os.path.splitext(fn)[0] - for fn in os.listdir('py-support') - if os.path.splitext(fn)[1].lower() == '.py'] -py_modules.remove('psyco.__init__') - -if sys.version_info < (2, 2, 2): - raise Exception("Psyco >= 1.5.3 requires Python >= 2.2.2") - - -setup ( name = "psyco", - version = "1.5.2", - description = "Psyco, the Python specializing compiler", - author = "Armin Rigo", - author_email = "arigo@users.sourceforge.net", - url = "http://psyco.sourceforge.net/", - license = "MIT License", - long_description = __doc__, - platforms = ["i386"], - py_modules = py_modules, - package_dir = {'psyco': 'py-support'}, - ext_modules=[Extension(name = 'psyco._psyco', - sources = sources, - extra_compile_args = extra_compile_args, - extra_link_args = extra_link_args, - define_macros = macros, - include_dirs = [processor_dir])], - **kwds ) diff --git a/nodebox/ext/psyco/src/test/bpnn.py b/nodebox/ext/psyco/src/test/bpnn.py deleted file mode 100755 index d6aeabf..0000000 --- a/nodebox/ext/psyco/src/test/bpnn.py +++ /dev/null @@ -1,192 +0,0 @@ -#!/usr/bin/python -# Back-Propagation Neural Networks -# -# Written in Python. See http://www.python.org/ -# -# Neil Schemenauer - -import math -import random -import operator -import string -import psyco -#psyco.full() -from psyco.classes import * -#psyco.log() -#psyco.profile() -#__metaclass__ = type - - -random.seed(0) - -def time(fn, *args): - import time, traceback - begin = time.clock() - try: - result = fn(*args) - except: - end = time.clock() - traceback.print_exc() - result = '' - else: - end = time.clock() - return result, end-begin - -# calculate a random number where: a <= rand < b -def rand(a, b): - return (b-a)*random.random() + a - -# Make a matrix (we could use NumPy to speed this up) -def makeMatrix(I, J, fill=0.0): - m = [] - for i in range(I): - m.append([fill]*J) - return m - -class NN: - - def __init__(self, ni, nh, no): - # number of input, hidden, and output nodes - self.ni = ni + 1 # +1 for bias node - self.nh = nh - self.no = no - - # activations for nodes - self.ai = [1.0]*self.ni - self.ah = [1.0]*self.nh - self.ao = [1.0]*self.no - - # create weights - self.wi = makeMatrix(self.ni, self.nh) - self.wo = makeMatrix(self.nh, self.no) - # set them to random vaules - for i in range(self.ni): - for j in range(self.nh): - self.wi[i][j] = rand(-2.0, 2.0) - for j in range(self.nh): - for k in range(self.no): - self.wo[j][k] = rand(-2.0, 2.0) - - # last change in weights for momentum - self.ci = makeMatrix(self.ni, self.nh) - self.co = makeMatrix(self.nh, self.no) - - def update(self, inputs): - if len(inputs) != self.ni-1: - raise ValueError, 'wrong number of inputs' - - # input activations - for i in range(self.ni-1): - #self.ai[i] = 1.0/(1.0+math.exp(-inputs[i])) - self.ai[i] = inputs[i] - - # hidden activations - for j in range(self.nh): - sum = 0.0 - for i in range(self.ni): - sum = sum + self.ai[i] * self.wi[i][j] - self.ah[j] = 1.0/(1.0+math.exp(-sum)) - - # output activations - for k in range(self.no): - sum = 0.0 - for j in range(self.nh): - sum = sum + self.ah[j] * self.wo[j][k] - self.ao[k] = 1.0/(1.0+math.exp(-sum)) - - return self.ao[:] - - - def backPropagate(self, targets, N, M): - if len(targets) != self.no: - raise ValueError, 'wrong number of target values' - - # calculate error terms for output - output_deltas = [0.0] * self.no - for k in range(self.no): - ao = self.ao[k] - output_deltas[k] = ao*(1-ao)*(targets[k]-ao) - - # calculate error terms for hidden - hidden_deltas = [0.0] * self.nh - for j in range(self.nh): - sum = 0.0 - for k in range(self.no): - sum = sum + output_deltas[k]*self.wo[j][k] - hidden_deltas[j] = self.ah[j]*(1-self.ah[j])*sum - - # update output weights - for j in range(self.nh): - for k in range(self.no): - change = output_deltas[k]*self.ah[j] - self.wo[j][k] = self.wo[j][k] + N*change + M*self.co[j][k] - self.co[j][k] = change - #print N*change, M*self.co[j][k] - - # update input weights - for i in range(self.ni): - for j in range(self.nh): - change = hidden_deltas[j]*self.ai[i] - self.wi[i][j] = self.wi[i][j] + N*change + M*self.ci[i][j] - self.ci[i][j] = change - - # calculate error - error = 0.0 - for k in range(len(targets)): - error = error + 0.5*(targets[k]-self.ao[k])**2 - return error - - - def test(self, patterns): - for p in patterns: - print p[0], '->', self.update(p[0]) - - def weights(self): - print 'Input weights:' - for i in range(self.ni): - print self.wi[i] - print - print 'Output weights:' - for j in range(self.nh): - print self.wo[j] - - def train(self, patterns, iterations=2000, N=0.5, M=0.1): - # N: learning rate - # M: momentum factor - for i in xrange(iterations): - error = 0.0 - for p in patterns: - inputs = p[0] - targets = p[1] - self.update(inputs) - error = error + self.backPropagate(targets, N, M) - if i % 100 == 0: - print 'error %-14f' % error - - -def demo(): - # Teach network XOR function - pat = [ - [[0,0], [0]], - [[0,1], [1]], - [[1,0], [1]], - [[1,1], [0]] - ] - - # create a network with two input, two hidden, and two output nodes - n = NN(2, 3, 1) - # train it with some patterns - n.train(pat, 2000) - # test it - n.test(pat) - - - -if __name__ == '__main__': - v, t1 = time(demo) - v, t2 = time(demo) - v, t3 = time(demo) - v, t4 = time(demo) - v, t5 = time(demo) - print t1, t2, t3, t4, t5 - psyco.dumpcodebuf() diff --git a/nodebox/ext/psyco/src/test/btrun.py b/nodebox/ext/psyco/src/test/btrun.py deleted file mode 100644 index 9b6384a..0000000 --- a/nodebox/ext/psyco/src/test/btrun.py +++ /dev/null @@ -1,778 +0,0 @@ - -##### Prelude ##### - ->>> import sys, uu, psyco ->>> psyco.full() ->>> import test1, test3, test5 ->>> import test_compactobject as compactobject - ->>> def prep(): -... uu.decode('file2-basetests.uu', 'file2-basetests') - ->>> def g1(f): -... prep() -... d = f(['file1-basetests', 'BIN:file2-basetests']) -... return [d[chr(n)] for n in range(256)] - ->>> def protect(f, *args): -... try: -... return f(*args) -... except: -... return 'exception: ' + sys.exc_info()[0].__name__ - ->>> def assert_true(cond): -... if cond: -... print 'Ok' -... else: -... print 'Assert failed!' - ->>> True,False = 1==1,1==0 - ->>> PY21 = sys.hexversion < 0x02020000 - ->>> if sys.hexversion >= 0x02040000: -... def clamp(x): -... return x -... else: -... def clamp(x): -... if x & (sys.maxint+1L): -... return int(x & sys.maxint) - sys.maxint - 1 -... else: -... return int(x & sys.maxint) - - ################### - #### TEST1 #### - ################### - ->>> print test1.f1(217) -1115467 - ->>> print test1.f2(0) -0 - ->>> print test1.f2(-192570368) --385140736 - ->>> test1.f3([3,4,0,'testing',12.75,(5,3,1),0]) -6 -8 -testingtesting -25.5 -(5, 3, 1, 5, 3, 1) - ->>> print g1(test1.f5) -[20, 14, 19, 9, 12, 25, 13, 9, 17, 23, 289, 26, 15, 13, 17, 19, 23, 18, 15, 14, 18, 22, 14, 18, 18, 17, 21, 27, 21, 20, 15, 12, 1745, 18, 17, 136, 25, 14, 27, 18, 92, 87, 386, 12, 52, 29, 63, 102, 49, 39, 26, 26, 18, 14, 16, 13, 22, 16, 29, 49, 24, 34, 30, 20, 16, 100, 98, 61, 20, 85, 61, 75, 54, 49, 19, 47, 32, 18, 67, 47, 86, 66, 184, 61, 42, 42, 74, 14, 26, 55, 74, 16, 37, 15, 19, 211, 17, 348, 369, 130, 12, 248, 264, 328, 162, 68, 69, 41, 128, 29, 240, 95, 244, 288, 673, 295, 108, 134, 380, 40, 42, 224, 137, 30, 15, 24, 11, 15, 6, 15, 19, 26, 19, 17, 15, 18, 16, 17, 11, 14, 11, 15, 11, 11, 19, 13, 18, 25, 14, 20, 12, 14, 8, 13, 17, 15, 16, 17, 15, 13, 12, 12, 10, 19, 15, 15, 16, 12, 24, 21, 14, 10, 19, 17, 14, 13, 20, 18, 11, 17, 21, 13, 21, 19, 17, 15, 19, 10, 17, 12, 16, 13, 16, 15, 13, 16, 16, 16, 15, 14, 11, 14, 18, 15, 25, 9, 19, 12, 13, 12, 18, 12, 13, 16, 13, 17, 18, 19, 16, 11, 18, 18, 27, 11, 22, 17, 13, 22, 20, 16, 9, 17, 14, 12, 20, 17, 15, 18, 16, 15, 15, 16, 16, 18, 18, 17, 21, 17, 12, 12, 17, 10, 20, 19, 18, 25] - ->>> assert_true(PY21 or g1(test1.f4) == g1(test1.f5)) -Ok - ->>> print test1.f6(n=100, p=10001) -803 - ->>> test1.f7(-2-1j, 1+1j, 0.04+0.08j) -!!!!!!!""""""####################$$$$$$$$%%%&'*.)+ %$$$$$######"""""""""""" -!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" -!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" -!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" -!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" -!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" -!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" -!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" -!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" -!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## -!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## -!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## -!%%&&')''((()-+/S ('&%%$$$$####### -!%%&&')''((()-+/S ('&%%$$$$####### -!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## -!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## -!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## -!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" -!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" -!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" -!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" -!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" -!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" -!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" -!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" -!!!!!!!""""""####################$$$$$$$$%%%&'*.)+J%$$$$$######"""""""""""" - ->>> test1.f7bis((-2.0, -1.0), (1.0, 1.0), (0.04, 0.08)) -!!!!!!!""""""####################$$$$$$$$%%%&'*.)+ %$$$$$######"""""""""""" -!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" -!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" -!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" -!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" -!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" -!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" -!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" -!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" -!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## -!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## -!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## -!%%&&')''((()-+/S ('&%%$$$$####### -!%%&&')''((()-+/S ('&%%$$$$####### -!$$$$$$$%&&&&'(I+,-j 9 ~*&%%$$$######## -!#$$$$$$$$%%%%%&'',+2~ // ?*&%$$$######## -!###$$$$$$$$%%%%&'(*.IB24 0J,**+~ -(&%$$$######## -!"######$$$$$$%%&&*+)(((2*(''(()2p :@:'%$$########" -!!"###########$$$%'&&&&%%%&&&&'')U ~ G,('%%$$#######"" -!!"###############$$$%%%%%%%%&&&&()+/? ='&%$$########"" -!!!"#################$$$$$%%%%%&&&(,b~~/: 0,,:/;/&%$########""" -!!!"""##################$$$$$$$%%&(,32)),5+,/M E-,*+)''''-&$$#######""""" -!!!!"""###################$$$$$$$$%%&&&&''(+B @('&&%%%%%$$#######"""""" -!!!!!""""###################$$$$$$$$$%%%&&'6E0~ 9=6(&%%%%$$$$######"""""""" -!!!!!!"""""####################$$$$$$$$%%%%&'(+2-)'&%%$$$$$######"""""""""" -!!!!!!!""""""####################$$$$$$$$%%%&'*.)+J%$$$$$######"""""""""""" - ->>> print protect(test1.f8) -in finally clause -exception: ZeroDivisionError - ->>> test1.f9(50) -0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 - ->>> test1.f10() -0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 - ->>> print test1.f11(50) -950 - ->>> print test1.f11(-1.0) -1001.0 - - ################### - #### TEST2 #### - ################### - ->>> def f1(): -... return -abs(-10) ->>> print f1() --10 - ->>> def f11(): -... return -abs(-10.125)+5.0+6.0 ->>> print f11() -0.875 - - ################### - #### TEST3 #### - ################### - ->>> test3.f11([5,6,7,5,3,5,6,2,5,5,6,7,5]) -[0, 0, 0, 1, 0, 1, 2, 0, 1, 1, 2, 3, 4] - ->>> print test3.f13((None, 'hello')) -None hello -None hello -('hello', None) - ->>> print test3.f13([12, 34]) -12 34 -12 34 -(34, 12) - ->>> test3.f14(5) -${True} - ->>> test3.f14(-2) -${False} - ->>> print test3.f16(123) --124 - ->>> print test3.f17('abc') -('abc', 0, ()) - ->>> print test3.f17('abc', 'def', 'ghi', 'jkl') -('abc', 'def', ('ghi', 'jkl')) - ->>> print test3.f19([1,2,3,4]) -hello -${([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4], True, 0)} - ->>> print test3.f20('l', 12) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] ->>> print test3.f20('L', 12) -[0L, 10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 110L] ->>> print test3.f20('i', 12) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] ->>> print test3.f20('I', 12) -[0L, 10L, 20L, 30L, 40L, 50L, 60L, 70L, 80L, 90L, 100L, 110L] ->>> print test3.f20('c', 12, 'x') -['\x00', '\n', '\x14', '\x1e', '(', '2', '<', 'F', 'P', 'Z', 'd', 'n'] ->>> print test3.f20('b', 12) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] ->>> print test3.f20('B', 12) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] ->>> print test3.f20('h', 12) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] ->>> print test3.f20('H', 12) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110] ->>> print test3.f20('B', 17) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160] ->>> print test3.f20('h', 28) -[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270] - ->>> print test3.f21([2,6,'never',9,3,0.123]) -3 - ->>> test3.f22(0) -Catch! - ->>> print test3.f22(-2.0) -None - ->>> test3.f23(0.0) -Catch! -Catch! -NameError - ->>> test3.f23(23) -NameError - ->>> print [x.__name__ for x in test3.f26()] -['float', 'list', 'urllib', 'psyco.classes', 'full'] - ->>> test3.N=5; print test3.f28(), test3.f28_1(), test3.f28_b(), test3.f28_b1() -test_getframe(): -test_getframe -f28 -? -5 test_getframe(): -test_getframe -test_getframe1 -f28_1 -? -5 test_getframe_b(): -test_getframe_b -f28_b -? -5 test_getframe_b(): -test_getframe_b -test_getframe_b1 -f28_b1 -? -5 - ->>> print test3.f27(), test3.f27_1(), test3.f27_b(), test3.f27_b1() -test_getframe(): -test_getframe -f28 -f27 -? -test_getframe(): -test_getframe -f28 -f27 -? -test_getframe(): -test_getframe -f28 -f27 -? -(5, 6, 7) test_getframe(): -test_getframe -test_getframe1 -f28_1 -f27_1 -? -test_getframe(): -test_getframe -test_getframe1 -f28_1 -f27_1 -? -test_getframe(): -test_getframe -test_getframe1 -f28_1 -f27_1 -? -(51, 61, 71) test_getframe_b(): -test_getframe_b -f28_b -f27_b -? -test_getframe_b(): -test_getframe_b -f28_b -f27_b -? -test_getframe_b(): -test_getframe_b -f28_b -f27_b -? -(95, 96, 97) test_getframe_b(): -test_getframe_b -test_getframe_b1 -f28_b1 -f27_b1 -? -test_getframe_b(): -test_getframe_b -test_getframe_b1 -f28_b1 -f27_b1 -? -test_getframe_b(): -test_getframe_b -test_getframe_b1 -f28_b1 -f27_b1 -? -(951, 961, 971) - ->>> print test3.f29(range(10,0,-1)) -[10, 9, 7, 6, 5, 4, 3, 2, 1] - ->>> print test3.f32('c:/temp') -('c:', '/temp') ->>> print test3.f32('*') -('', '*') ->>> print test3.f32('/dev/null') -('', '/dev/null') - ->>> test3.f33(31) -31 ->>> print test3.f33(33) -None ->>> print test3.f33(32) -None - ->>> test3.f34(70000) -0 -1 -3 -7 -15 -31 -63 -127 -255 -511 -1023 -2047 -4095 -8191 -16383 -32767 -65535 - ->>> test3.f35() -[[5 5 5] - [5 5 5] - [5 5 5]] - ->>> test3.f37(None) -${True} -1 - ->>> print test3.f38(12) -[234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234] - - ################### - #### TEST5 #### - ################### - ->>> print hash(test5.f('file1-basetests')) -33961417 ->>> prep(); print hash(test5.f('file2-basetests', 'rb')) -2034921519 - ->>> print test5.f2(4,5,6) -(6, 5, 4) ->>> print test5.f2(4,5,(6,)) -(6, 5, 4) - ->>> assert_true(test5.f3(15, 32) == (clamp(64424509440L), 30, -... clamp(32212254720L), 0, 7, 0)) -Ok ->>> assert_true(test5.f3(15, 31) == (clamp(32212254720L), 30, -... clamp(32212254720L), 0, 7, 0)) -Ok ->>> assert_true(test5.f3(15, 33) == (clamp(128849018880L), 30, -... clamp(32212254720L), 0, 7, 0)) -Ok ->>> assert_true(test5.f3(15, 63) == (clamp(138350580552821637120L), 30, -... clamp(32212254720L), 0, 7, 0)) -Ok ->>> assert_true(test5.f3(-15, 63) == (clamp(-138350580552821637120L), -30, -... clamp(-32212254720L), -1, -8, -1)) -Ok ->>> assert_true(test5.f3(-15, 32) == (clamp(-64424509440L), -30, -... clamp(-32212254720L), -1, -8, -1)) -Ok ->>> assert_true(test5.f3(-15, 31) == (clamp(-32212254720L), -30, -... clamp(-32212254720L), -1, -8, -1)) -Ok ->>> assert_true(test5.f3(-15, 33) == (clamp(-128849018880L), -30, -... clamp(-32212254720L), -1, -8, -1)) -Ok ->>> assert_true(test5.f3(-15, 2) == (-60, -30, -... clamp(-32212254720L), -4, -8, -1)) -Ok ->>> assert_true(test5.f3(-15, 1) == (-30, -30, -... clamp(-32212254720L), -8, -8, -1)) -Ok ->>> assert_true(test5.f3(-15, 0) == (-15, -30, -... clamp(-32212254720L), -15, -8, -1)) -Ok ->>> assert_true(test5.f3(15, 0) == (15, 30, -... clamp(32212254720L), 15, 7, 0)) -Ok ->>> assert_true(test5.f3(15, 1) == (30, 30, -... clamp(32212254720L), 7, 7, 0)) -Ok ->>> assert_true(test5.f3(15, 2) == (60, 30, -... clamp(32212254720L), 3, 7, 0)) -Ok ->>> assert_true(test5.f3(-1, 0) == (-1, -2, -2147483648L, -1, -1, -1)) -Ok - ->>> print test5.f4("some-string") -abcsome-string - ->>> print test5.overflowtest() --3851407362L - ->>> test5.booltest() -${False} -${True} -${False} -${True} -${False} -${True} -${[a & b for a in (False,True) for b in (False,True)]} -${[a | b for a in (False,True) for b in (False,True)]} -${[a ^ b for a in (False,True) for b in (False,True)]} -${True} - ->>> test5.exc_test() -IndexError list index out of range -2 - ->>> test5.seqrepeat() -'abcabcabcabcabc' -'abcabcabcabcabc' -[3, 'z', 3, 'z', 3, 'z', 3, 'z', 3, 'z'] -[6, 3, 6, 3, 6, 3, 6, 3, 6, 3] -'yyyyyx' -'abcabcabcabcabcabc' -'abcabcabcabcabcabc' -[3, 'z', 3, 'z', 3, 'z', 3, 'z', 3, 'z', 3, 'z'] -[6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3] -'yyyyyyx' -'' -'' -[] -[] -'x' - ->>> test5.f5(99) -100 -100 -4 -100 - ->>> test5.f5(-3.0) --2.0 --2.0 -4 --2.0 - ->>> test5.f6(3) -None -None -None -None -5 - ->>> test5.f6(-2) --1 --1 -None --1 -48 - ->>> test5.f6(99) -100 -100 -None -100 -IndexError - ->>> test5.f6("error") -TypeError - ->>> test5.f7(8) -[8, 75, 121] -[8, 15, 11] - ->>> test5.f7(8.5) -[8.5, 75, 121] -[8.5, 15, 11] - ->>> test5.f8(8) -[0, 30, 44] -[0.0, 0.0, 0.0] - ->>> test5.f8(8.5) -[0.0, 30, 44] -[0.0, 0.0, 0.0] - ->>> print test5.f9(10) -(4, 11) - ->>> assert_true(PY21 or test5.f9(sys.maxint) == (4, 2147483648L)) -Ok - ->>> test5.teststrings() -'userhruuiadsfz1if623opadoa8ua09q34rx093q\x00qw09exdqw0e9dqw9e8d8qw9r8qw\x1d\xd7\xae\xa2\x06\x10\x1a\x00a\xff\xf6\xee\x15\xa2\xea\x89akjsdfhqweirewru 3498cr 3849rx398du389du389dur398d31623' -'someanother' -'userhru.' -'.userhru' -'userhruuiadsfz' -'akjsdfhqweirewru 3498cr 3849rx398du389du389dur398d31623\x1d\xd7\xae\xa2\x06\x10\x1a\x00a\xff\xf6\xee\x15\xa2\xea\x89qw09exdqw0e9dqw9e8d8qw9r8qw\x0009q34rx093qoa8uaopad623if1uiadsfzuserhru' -1 -'a' -'sdfhqweirewru 3498cr 3849rx398du389du389dur398d3' -1 -1 -0 -1 - ->>> test5.testslices('hello') -'' -'hello' -'hello' -'' -'hello' -'hello' -'' -'ello' -'ello' -'' -'' -'' - ->>> test5.testovf(1987654321, 2012345789) -4000000110 -4012345789 -3987654321 --24691468 --12345789 --12345679 -3999847802852004269 -4024691578000000000 -3975308642000000000 -1987654321 --1987654321 -1987654321 - ->>> test5.testovf(-2147483647-1, 2012345789) --135137859 -4012345789 --147483648 --4159829437 --12345789 --4147483648 --4321479675999158272 -4024691578000000000 --4294967296000000000 --2147483648 -2147483648 -2147483648 - ->>> test5.testovf(-2147483647-1, -2147483647-1) --4294967296 --147483648 --147483648 -0 -4147483648 --4147483648 -4611686018427387904 --4294967296000000000 --4294967296000000000 --2147483648 -2147483648 -2147483648 - ->>> test5.rangetypetest(12) -list -list -list -xrange -xrange -xrange - ->>> test5.rangetest(15) -0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -10 11 12 13 14 -15 14 13 12 11 - ->>> test5.xrangetest(15) -0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -10 11 12 13 14 -15 14 13 12 11 - ->>> test5.longrangetest() -[1234567890123456789L, 1234567890123456790L] - ->>> print list(xrange(10)) -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - ->>> x = xrange(10); print sys.getrefcount(x); print list(x) -2 -[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] - ->>> print list(xrange(-2, 5)) -[-2, -1, 0, 1, 2, 3, 4] - ->>> print list(xrange(-2, 5, 2)) -[-2, 0, 2, 4] - ->>> print list(xrange(-2, 5, -2)) -[] - ->>> print list(xrange(5, -2, -2)) -[5, 3, 1, -1] - ->>> test5.arraytest() -S - ->>> test5.proxy_defargs() -12 - ->>> test5.setfilter() -('f1', 1) -('f2', 0) - ->>> test5.makeSelection() -do stuff here - ->>> test5.class_creation_1(1111) -ok - ->>> test5.class_creation_2(1111) -ok - ->>> test5.class_creation_3() -ok - ->>> test5.class_creation_4(1111) -ok - ->>> test5.power_int(1) -332833500 - ->>> test5.power_int(10) -332833500 - ->>> test5.power_int_long(1) -long 332833500 - ->>> test5.power_int_long(10) -long 332833500 - ->>> test5.power_float(1) -float 7038164 - ->>> test5.power_float(10) -float 7038164 - ->>> test5.conditional_doubletest_fold() -ok(1) -ok(2) - ->>> test5.importname(['ab', 'cd', 'ef']) -Ok - ->>> test5.sharedlists(3); test5.sharedlists(12) -4 -8 - ->>> test5.variousslices() -slice(4, None, None) -slice(None, 7, None) -slice(9, 'hello', None) -slice('world', None, None) -slice(1, 10, 'hello') -4 2147483647 -0 7 -slice(9, 'hello', None) -slice('world', None, None) -slice(1, 10, 'hello') - ->>> test5.listgetitem() -foobar -Ok - ->>> test5.negintpow(8) -0.015625 - - ########################### - #### COMPACTOBJECT #### - ########################### - ->>> for i in range(5): print compactobject.do_test(i) or i -0 -1 -2 -3 -4 - ->>> for i in range(5, 10): -... compactobject.do_test(i, -... do_test_1=psyco.proxy(compactobject.do_test_1)) -... print i -5 -6 -7 -8 -9 - ->>> compactobject.pcompact_test() -13 -hello -None - ->>> compactobject.pcompact_creat('hel' + 'lo') -(0, 0, 0) 3 None hello -(0, 1, 2) 4 None hello -(0, 2, 4) 5 None hello -(0, 3, 6) 6 None hello -(0, 4, 8) 7 None hello -(0, 5, 10) 8 None hello -(0, 6, 12) 9 None hello -(0, 7, 14) 10 None hello -(0, 8, 16) 11 None hello -(0, 9, 18) 12 None hello -(0, 10, 20) 13 None hello -11 -0 - ->>> compactobject.pcompact_modif('hel' + 'lo') -hello 1 0 1 -hello 1 0 2 -hello 1 0 3 -hello 1 0 4 -hello 1 0 5 -hello 1 0 6 -hello 1 0 7 -hello 1 0 8 -hello 1 0 9 -hello 1 0 10 -hello 1 0 11 -hello 1 0 12 -hello 1 0 13 -hello 1 0 14 -hello 1 0 15 -hello 1 0 16 -hello 1 0 17 -hello 1 0 18 -hello 1 0 19 -hello 1 0 20 -hello 1 0 21 -0 diff --git a/nodebox/ext/psyco/src/test/classicregrtest.py b/nodebox/ext/psyco/src/test/classicregrtest.py deleted file mode 100644 index 7d72223..0000000 --- a/nodebox/ext/psyco/src/test/classicregrtest.py +++ /dev/null @@ -1,178 +0,0 @@ -import sys, os, StringIO, psyco, psyco.logger - -LOGFILE = 'log-regrtest-psyco' - - -#NO_SYS_GETFRAME = """using sys._getframe() fails with Psyco""" - -#NO_THREAD = """XXX not reliable, check if Psyco is generally -# unreliable with threads or if there is another problem""" - -#NO_PICKLE = """pickles function objects that Psyco rebinds""" - -#NO_SYS_EXC = """XXX Psyco does not set sys.exc_xxx upon exception""" - - -SKIP = {'test_gc': "test_gc.test_frame() does not create a cycle with Psyco's limited frames", -# 'test_thread': NO_THREAD, -# 'test_asynchat': NO_THREAD, -# 'test_extcall': 'prints to stdout a function object that Psyco rebinds', - 'test_descr': 'seems that it mutates user-defined types and Psyco does not like it at all', -# 'test_pickle': NO_PICKLE, -# 'test_cpickle': NO_PICKLE, -# 'test_re': NO_PICKLE, -# 'test_sre': NO_SYS_EXC, -# 'test_string': NO_SYS_EXC, -# 'test_unicode': NO_SYS_EXC, -# 'test_inspect': 'gets confused with Psyco rebinding functions', - 'test_profilehooks': 'profiling does not see all functions run by Psyco', - 'test_profile': 'profiling does not see all functions run by Psyco', - 'test_repr': 'self-nested tuples and lists not supported', - 'test_builtin': 'vars() and locals() not supported', - 'test_inspect': 'does not run even in Python (when called the way classicregrtest.py calls it) and leaves buggy temp files around', - 'test_trace': 'no line tracing with Psyco', - 'test_threaded_import': 'Python hang-ups', - 'test_hotshot': "PyEval_SetProfile(NULL,NULL) doesn't allow Psyco to take control back", - 'test_coercion': 'uses eval() with locals', - 'test_weakref': 'incompatible with early unused variable deletion', - } -# SKIP['test_operator'] = NO_SYS_EXC -# SKIP['test_strop'] = NO_SYS_EXC -if sys.version_info[:2] >= (2,3): - SKIP['test_threadedtempfile'] = 'Python bug: Python test just hangs up' - -if hasattr(psyco._psyco, 'VERBOSE_LEVEL'): - SKIP['test_popen2'] = 'gets confused by Psyco debugging output to stderr' - -GROUP_TESTS = 5 # number of tests to run per Python process - - -if '' in sys.path: - sys.path.remove('') # don't import the test.py in this directory! - -from test import regrtest, test_support - -repeat_counter = 4 - - -def alltests(): - import random - # randomize the list of tests, but try to ensure that we start with - # not-already-seen tests and only after go on with the rest - try: - os.unlink(LOGFILE) - except OSError: - pass - filename = "tmp_tests_passed" - try: - f = open(filename) - tests_passed = eval(f.read()) - f.close() - except IOError: - tests_passed = {} - testlist = regrtest.findtests() - testlist = [test for test in testlist if not tests_passed.has_key(test)] - random.shuffle(testlist) - testlist1 = tests_passed.keys() - random.shuffle(testlist1) - print '\t'.join(['Scheduled tests:']+testlist) - if testlist1: - print '%d more tests were already passed and are scheduled to run thereafter.' % len(testlist1) - testlist += testlist1 - while testlist: - print '='*40 - tests1 = testlist[:GROUP_TESTS] - del testlist[:GROUP_TESTS] - err = os.system('"%s" %s %s' % (sys.executable, sys.argv[0], - ' '.join(tests1))) - if err: - print '*** exited with error code', err - return err - for test in tests1: - tests_passed[test] = 1 - f = open(filename, 'w') - f.write(repr(tests_passed)) - f.close() - print "="*60 - print - print "Classic Regression Tests with Psyco successfully completed." - print "All tests that succeeded twice in the same Python process" - print "also succeeded %d more times with Psyco activated." % repeat_counter - print - try: - os.unlink(filename) - except: - pass - print "Psyco compilation flags:", - d = psyco._psyco.__dict__ - if not d.has_key('ALL_CHECKS'): - print "Release mode", - for key in d.keys(): - if key == key.upper() and type(d[key]) == type(0): - print "%s=%s" % (key, hex(d[key])), - print - -def python_check(test): - if SKIP.has_key(test): - print '%s skipped -- %s' % (test, SKIP[test]) - return 0 - for i in range(min(repeat_counter, 2)): - print '%s, Python iteration %d' % (test, i+1) - ok = regrtest.runtest(test, 0, 0, 0) - special_cleanup() - if ok <= 0: - return 0 # skipped or failed -- don't test with Psyco - return 1 - -def main(testlist, verbose=0, use_resources=None): - if use_resources is None: - use_resources = [] - test_support.verbose = verbose # Tell tests to be moderately quiet - test_support.use_resources = use_resources - - if type(testlist) == type(""): - testlist = [testlist] - if not verbose: - testlist = filter(python_check, testlist) - - # Psyco selective compilation is only activated here - psyco.log(LOGFILE, 'a') - for test in testlist: - psyco.logger.write('with test ' + test, 1) - psyco.full() - #print "sleeping, time for a Ctrl-C !..." - #import time; time.sleep(1.5) - - - for test in testlist: - for i in range(repeat_counter): - print '%s, Psyco iteration %d' % (test, i+1) - ok = regrtest.runtest(test, 0, verbose, 0) - special_cleanup() - if ok == 0: - return 0 - elif ok < 0: - break - return 1 - -def special_cleanup(): - try: - dircache = sys.modules['dircache'] - except KeyError: - pass - else: - for key in dircache.cache.keys(): - del dircache.cache[key] - - -if __name__ == '__main__': - if len(sys.argv) <= 1: - sys.exit(alltests() or 0) - else: - try: - err = not main(sys.argv[1:]) - finally: - # Write psyco.dump - psyco.dumpcodebuf() - if err: - sys.exit(2) diff --git a/nodebox/ext/psyco/src/test/file1-basetests b/nodebox/ext/psyco/src/test/file1-basetests deleted file mode 100644 index 24b52a7..0000000 --- a/nodebox/ext/psyco/src/test/file1-basetests +++ /dev/null @@ -1,271 +0,0 @@ - /***************************************************************/ -/*** Tybony Cflpb qrsvavgvbaf ***/ - /***************************************************************/ - -#vsaqrs _CFLPB_U -#qrsvar _CFLPB_U - - -#vapyhqr -#vapyhqr /* sbe bssfrgbs() */ - - -/*****************************************************************/ - /*** Inevbhf phfgbzvmnoyr cnenzrgref (hfr lbhe pbzcvyref' ***/ - /*** bcgvba gb bireevqr gurz, r.t. -QKKK=inyhr va tpp) ***/ - - /* frg gb 0 gb qvfnoyr nyy qrohttvat purpxf naq bhgchg */ -#vsaqrs CFLPB_QROHT -# qrsvar CFLPB_QROHT 0 -#raqvs - - - /* qrsvar gb 1 sbe rkgen nffreg()'f */ -#vsaqrs NYY_PURPXF -# qrsvar NYY_PURPXF (CFLPB_QROHT ? 1 : 0) -#raqvs - - /* yriry bs qrohttvat bhgchgf: 0 = abar, 1 = n srj, 2 = zber, - 3 = qrgnvyyrq, 4 = shyy rkrphgvba genpr */ -#vsaqrs IREOBFR_YRIRY -# qrsvar IREOBFR_YRIRY (CFLPB_QROHT ? 0 : 0) -#raqvs - - /* qhzc vasbezngvba nobhg cebsvyvat naq fgngvfgvpf */ -#vsaqrs IREOBFR_FGNGF -# qrsvar IREOBFR_FGNGF (IREOBFR_YRIRY>=2) -#raqvs - - /* qrsvar sbe *urnil* zrzbel purpxvat: 0 = bss, 1 = ernfbanoyl urnil, - 2 = haernfbanoyl urnil */ -#vsaqrs URNIL_ZRZ_PURPX -# qrsvar URNIL_ZRZ_PURPX (CFLPB_QROHT ? 0 : 0) -#raqvs -#vsqrs ZF_JVA32 -# haqrs URNIL_ZRZ_PURPX -# qrsvar URNIL_ZRZ_PURPX 0 /* abg fhccbegrq ba Jvaqbjf */ -#raqvs - - /* qrsvar gb jevgr cebqhprq oybpxf bs pbqr vagb n svyr; frr 'knz.cl' - 0 = bss, 1 = bayl znahnyyl (sebz n qrohttre be jvgu _cflpb.qhzcpbqrohs()), - 2 = bayl jura ergheavat sebz Cflpb, - 3 = rirel gvzr n arj pbqr oybpx vf ohvyg */ -#vsaqrs PBQR_QHZC -# qrsvar PBQR_QHZC (CFLPB_QROHT ? 1 : 0) -#raqvs - -#vs PBQR_QHZC && !qrsvarq(PBQR_QHZC_SVYR) -# qrsvar PBQR_QHZC_SVYR "cflpb.qhzc" -#raqvs - - /* qrsvar gb vayvar gur zbfg pbzzba shapgvbaf va gur cebqhprq pbqr - (fubhyq or ranoyrq hayrff lbh jnag gb genqr pbqr fvmr sbe fcrrq) */ -#vsaqrs VAYVAR_PBZZBA_SHAPGVBAF -# qrsvar VAYVAR_PBZZBA_SHAPGVBAF 1 -#raqvs - -#vs PBQR_QHZC && qrsvarq(UNIR_QYSPA_U) - /* qrsvar gb ybpngr funerq flzobyf naq jevgr gurz va PBQR_QHZC_SVYR - erdhverf gur TAH rkgrafvba qynqqe() va - Abg ernyyl hfrshy, bayl svaqf aba-fgngvp flzobyf. */ -/*# vapyhqr - # qrsvar PBQR_QHZC_FLZOBYF*/ -#raqvs - -#qrsvar QRSNHYG_ERPHEFVBA 10 /* qrsnhyg inyhr sbe gur 'erp' nethzrag */ - - -/*****************************************************************/ - -/* Fvmr bs ohssre gb nyybpngr jura rzvggvat pbqr. - Pna or nf ynetr nf lbh yvxr (zbfg BFrf jvyy abg npghnyyl nyybpngr - ENZ cntrf orsber gurl ner npghnyyl hfrq). Jr ab ybatre cresbez - nal ernyybp() ba guvf; n fvatyr nyybpngrq pbqr ertvba vf erhfrq - sbe nyy pbqr ohssref hagvy vg vf rkunhfgrq. Gurer ner OHSSRE_ZNETVA - hahfrq olgrf ng gur raq, fb OVT_OHSSRE_FVMR unf orggre or ynetr gb - zvavzvmr guvf rssrpg. - Yvahk abgr: V'ir frra va zl irefvba bs tyvop'f znyybp() gung vg - hfrf zznc sbe fvmrf >= 128x, naq gung vg jvyy ershfr gur hfr zznc - zber guna 1024 gvzrf, juvpu zrnaf gung vs lbh nyybpngr oybpxf bs - 128x lbh pnaabg nyybpngr zber guna 128Z va gbgny. - Abgr gung Cflpb jvyy hfhnyyl nyybpngr naq svyy gjb ohssref va - cnenyyry, ol gur jnl ipbzcvyre.p jbexf. Ubjrire, vg bppnfvbanyyl - arrqf zber; pbqrznantre.p pna unaqyr nal ahzore bs cnenyyryl-tebjvat - ohssref. Gurer vf n fnsrthneq va ipbzcvyre.p gb chg na hccre obhaq - ba guvf ahzore (pheeragyl fubhyq abg rkprrq 4). - Va qrohttvat zbqr, jr hfr n fznyy fvmr gb fgerff gur ohssre- - pbagvahngvba pbqvat ebhgvarf. */ -#vsaqrs OVT_OHSSRE_FVMR -# qrsvar OVT_OHSSRE_FVMR (CFLPB_QROHT ? 2*OHSSRE_ZNETVA : 0k100000) -#raqvs - -/* N fnsrgl znetva sbe bppnfvbany biresybjf: jr zvtug jevgr n srj - vafgehpgvbaf gbb zhpu orsber jr ernyvmr jr jebgr cnfg 'pbqryvzvg'. - KKK pnershyyl purpx gung vg vf vzcbffvoyr gb biresybj ol zber - Jr arrq zber guna 128 olgrf orpnhfr bs gur jnl pbaqvgvbany whzcf - ner rzvggrq; frr clpbzcvyre.p. - Gur RAQ_PBQR znpeb gevttref n fvyrag ohssre punatr vs fcnpr vf - trggvat irel ybj -- yrff guna THNENAGRRQ_ZVAVZHZ */ -#vsaqrs OHSSRE_ZNETVA -# qrsvar OHSSRE_ZNETVA 1024 -#raqvs - -/* Jura rzvggvat pbqr, nyy pnyyrq shapgvbaf pna nffhzr gung gurl - unir ng yrnfg guvf nzbhag bs ebbz gb jevgr gurve pbqr. Vs gurl - zvtug arrq zber, gurl unir gb nyybpngr arj ohssref naq jevgr n - whzc gb gurfr sebz gur bevtvany pbqr (whzcf pna or qbar va yrff - guna THNENAGRRQ_ZVAVZHZ olgrf). */ -#vsaqrs THNENAGRRQ_ZVAVZHZ -# qrsvar THNENAGRRQ_ZVAVZHZ 64 -#raqvs - - -#vsaqrs NYY_FGNGVP -# qrsvar NYY_FGNGVP 0 /* znxr nyy shapgvbaf fgngvp; frg gb 1 ol unpx.p */ -#raqvs - -#vs NYY_FGNGVP -# qrsvar RKGREAINE fgngvpsbejneq -# qrsvar RKGREASA fgngvp -# qrsvar QRSVARINE fgngvpurer -# qrsvar QRSVARSA fgngvp -# qrsvar VAVGVNYVMNGVBASA vayvar -#ryfr -# qrsvar RKGREAINE -# qrsvar RKGREASA -# qrsvar QRSVARINE -# qrsvar QRSVARSA -# qrsvar VAVGVNYVMNGVBASA QRSVARSA -#raqvs - -#vs NYY_PURPXF -# qrsvar ZNYYBP_PURPX_ 2 /* TPP znyybp() purpxf */ -# haqrs AQROHT -# vapyhqr -# vs PBQR_QHZC -# qrsvar rkgen_nffreg(k) ((k) ? (ibvq)0 : (cflpb_qhzc_pbqr_ohssref(), \ - nffreg(k), nffreg(!"ibyngvyr nffregvba"))) -# ryfr -# qrsvar rkgen_nffreg(k) nffreg(k) -# raqvs -#ryfr -# qrsvar rkgen_nffreg(k) (ibvq)0 /* abguvat */ -#raqvs - -#vs IREOBFR_YRIRY -# qrsvar qroht_cevags(yriry, netf) qb { \ - vs (IREOBFR_YRIRY >= (yriry)) { \ - cflpb_qroht_cevags netf; \ - } \ - vs (cflpb_ybttre && (yriry) == 1) { \ - cflpb_sybt netf; \ - } \ - } juvyr (0) -RKGREASA ibvq cflpb_qroht_cevags(pune* zft, ...); -#ryfr -# qrsvar qroht_cevags(yriry, netf) qb { \ - vs (cflpb_ybttre && (yriry) == 1) { \ - cflpb_sybt netf; \ - } \ - } juvyr (0) -#raqvs -RKGREAINE ClBowrpg* cflpb_ybttre; -RKGREASA ibvq cflpb_sybt(pune* zft, ...); - -#vs IREOBFR_YRIRY >= 4 -# qrsvar GENPR_RKRPHGVBA(zft) qb { \ - ORTVA_PBQR RZVG_GENPR(zft, cflpb_genpr_rkrphgvba); RAQ_PBQR } juvyr (0) -# qrsvar GENPR_RKRPHGVBA_ABREE(zft) qb { \ - ORTVA_PBQR RZVG_GENPR(zft, cflpb_genpr_rkrphgvba_abree); RAQ_PBQR } juvyr (0) -RKGREASA ibvq cflpb_genpr_rkrphgvba(pune* zft, ibvq* pbqr_cbfvgvba); -RKGREASA ibvq cflpb_genpr_rkrphgvba_abree(pune* zft, ibvq* pbqr_cbfvgvba); -#ryfr -# qrsvar GENPR_RKRPHGVBA(zft) qb { } juvyr (0) /* abguvat */ -# qrsvar GENPR_RKRPHGVBA_ABREE(zft) qb { } juvyr (0) /* abguvat */ -#raqvs - - -#vs VAYVAR_PBZZBA_SHAPGVBAF -# qrsvar vayvar __vayvar fgngvp -#ryfr -# qrsvar vayvar fgngvp -#raqvs - -#vs URNIL_ZRZ_PURPX -# vapyhqr "yvahkzrzpux.u" -# vs URNIL_ZRZ_PURPX > 1 -# qrsvar CFLPB_AB_YVAXRQ_YVFGF -# raqvs -#raqvs - - -#vsaqrs obby -glcrqrs vag obby; -#raqvs -#vsaqrs snyfr -# qrsvar snyfr 0 -#raqvs -#vsaqrs gehr -# qrsvar gehr 1 -#raqvs - -#vsaqrs ClBowrpg_GlcrPurpx -# qrsvar ClBowrpg_GlcrPurpx(b,g) ((b)->bo_glcr == (g)) -#raqvs - - -glcrqrs hafvtarq pune pbqr_g; - -glcrqrs fgehpg ivasb_f ivasb_g; /* qrsvarq va pbzcvyre.u */ -glcrqrs fgehpg ivasb_neenl_f ivasb_neenl_g; /* qrsvarq va pbzcvyre.u */ -glcrqrs fgehpg CflpbBowrpg_f CflpbBowrpg; /* qrsvarq va pbzcvyre.u */ -glcrqrs fgehpg SebmraCflpbBowrpg_f SebmraCflpbBowrpg; /* qrs va qvfcngpure.u */ -glcrqrs fgehpg PbqrOhssreBowrpg_f PbqrOhssreBowrpg; /* qrs va pbqrznantre.u */ -glcrqrs fgehpg tybony_ragevrf_f tybony_ragevrf_g; /* qrs va qvfcngpure.u */ -glcrqrs fgehpg zretrcbvag_f zretrcbvag_g; /* qrsvarq va zretrcbvag.u */ -glcrqrs fgehpg fgnpx_senzr_vasb_f fgnpx_senzr_vasb_g; /* qrs va clpbzcvyre.u */ - -RKGREAINE ClBowrpg* ClRkp_CflpbReebe; -RKGREAINE ybat cflpb_zrzbel_hfntr; /* nccebkvzngvir */ - - -/* zbirq urer sebz ipbzcvyre.u orpnhfr arrqrq ol ahzrebhf urnqre svyrf */ -glcrqrs obby (*pbzchgr_sa_g)(CflpbBowrpg* cb, ivasb_g* iv, obby sbexvat); -glcrqrs fgehpg { - pbzchgr_sa_g pbzchgr_sa; -} fbhepr_iveghny_g; - - -#vs PBQR_QHZC -RKGREASA ibvq cflpb_qhzc_pbqr_ohssref(ibvq); -#raqvs -#vs PBQR_QHZC >= 3 -# qrsvar qhzc_pbqr_ohssref() cflpb_qhzc_pbqr_ohssref() -#ryfr -# qrsvar qhzc_pbqr_ohssref() qb { } juvyr (0) /* abguvat */ -#raqvs - -/* gb qvfcynl pbqr bowrpg anzrf */ -#qrsvar ClPbqrBowrpg_ANZR(pb) (pb->pb_anzr ? ClFgevat_NF_FGEVAT(pb->pb_anzr) \ - : "") - - -/* qrsvarq va clpbzcvyre.p */ -#qrsvar TYBONY_RAGEL_CBVAG cflpb_clpbzcvyre_znvaybbc -RKGREASA pbqr_g* cflpb_clpbzcvyre_znvaybbc(CflpbBowrpg* cb); - - -/* KKK ab unaqyvat bs bhg-bs-zrzbel pbaqvgvbaf. Jr unir gb qrsvar cerpvfryl - jung fubhyq bpphe va inevbhf pnfrf, yvxr jura jr eha bhg bs zrzbel va gur - zvqqyr bs jevgvat pbqr, jura gur ortvaavat vf nyernql rkrphgvat. Jura - fubhyq jr ercbeg gur rkprcgvba? */ -#qrsvar BHG_BS_ZRZBEL() Cl_SngnyReebe("cflpb: bhg bs zrzbel") - -/* Guernq-fcrpvsvp fgngr */ -RKGREASA ClBowrpg* cflpb_guernq_qvpg(ibvq); - -/* qrsvarq va qvfcngpure.p */ -RKGREASA ibvq CflpbBowrpg_RzretraplPbqrEbbz(CflpbBowrpg* cb); - - -#raqvs /* _CFLPB_U */ diff --git a/nodebox/ext/psyco/src/test/file2-basetests.uu b/nodebox/ext/psyco/src/test/file2-basetests.uu deleted file mode 100644 index 6186947..0000000 --- a/nodebox/ext/psyco/src/test/file2-basetests.uu +++ /dev/null @@ -1,95 +0,0 @@ -begin 644 file2-basetests -ML&">,WFJ:%-/]+?H7,%/!1MX8]5(.#Z$;FMMEFHA8N\]<]CRG8@SGKY3*\$1Q@PV7+8JZZQG -MK>P<,C_W1#0A\8@<.&VVX,&-W>FP@%63QMP=$1%\'Y$29N=,$GG -MJ[0.AZ#[P$V^6C% :D2&R>\0"W89VICRX*24;:BEX#"7K5QSS@:;+A%4^_R5 -M@9HF2XGUUS%_0QASXV 2_[4@@C%P"(2<&^HZLW;].HV]O&YZ=GE&V[N$JI-= -M#F9^[ISE:$UAJ66_K=K2DCF8857+!*P7E*-LYX1UE6W8V2J;++6 [#!.[4_B -M_$>J_Q:3)-'5TLRF_QIR%0R*.:'/\N11E4D=$[WAY#HQ&M0#?YR3VCH;_ ,JE??@HW]H=FY%L_Y":?IED\)5 -M;L[PT?)G>PVH]B7#?<2)DQC.$2'35>M,RO\CJ)EE!>FO1BS>2%7ES#Q)3?!/ -MSA"%UG7$W+FEMV@DF5OPJLI*@R0:KTLNQ"YF,BNJR&ES7(%(D-2^FM?,&G&Z -M6?ME_C!-/$MQ)B^=Q[V7>-QQF6Y=A,,G0Z89E -M^N98$#NX7;_R%^SK"E',0*@/W DTI0Z$?E+=;C?>*MD7;=XF,RW:[H@A201 -M$D.=]@%B7B@-[1XY]:FC\@D.P#&Y7JM")L=I]ZGTP7UYQKO<7AR?"UKN2V Q -M*P$9:@SU*:&PKF<*+4#_VA]B_/'!3#5[=R%HA9E8.3X_=,'8(2**"_:>F"/M -MPPQ_7M>NI0RYX=@S,",-K]D=0J8(/70\E4Q'&7PAU/+M%[2U^-M4R)' '00; -MH99#U*B;[EDF7SJX3,V#TJA1DXD+#CBMBY)?U7@S*="' L++"M("%(5QN/$) -M@H;XXA?VFAW/;(OC6 LOTO<+LY.\A%1R,O^)O-B7+[JH$-\L@J!2^^176^26 -M7LXQ1!-Y>)/,T"MR#7B-?V\W>I)!12W_=(A0D%F/;]FF8NHR8W?'T\-40GR! -MH6M0WG()XANDMC;\UB_C)V&=E;WRA<61D)C%RH,/"@%JUXV'KH-HFM'M\-[. -MB.V@73,Q(:BVE998U78C4_WU7'#OOI!%YX9K_U-R+SA:0^0=G/Y%?.^\^RB< -M6P)KC[:'LA-CZZ>L$@='5*U[5]Z$4?J'46U/3EO7G ^Y.2Y' O7]>\:1#/5VGC#C/'1"5H$BUF -M9<>9KP^&E$>D="*.+WG=M%SSJIQ8WM>\292#>(! >$0@]1(+NJA(<:8DCM$F -M%[%"'MXH9G9.1>H4>9$8YORS+05> &>M+!#E?O@ZDP(A-WS5$S[ 7C6CFE'! -MV >BR@N$5"HZ0LP8\29?#KU+.><=7'%)8(U+:XO!\Q08!Q)N#-DFX:'?D+6- -M&BSG!C2G[X(U8P5SNA[1"3G9[SVTQ[[,/.[>0W&5.$>@'AM$,7?0:5PV_0[= -M -?-" H:>V2C@<;T"0#Z+7<,HBV(=#RLSA1ZH@N\IB%^KAAI_P,1M _YON#K -ML",:MI_*;SOAQ"3\^/HY5\\XY2K3V6'$T(F@4Y3:0_1=>.NV;=OH B9#+87I -M,E6GXUB&Z4NY?RFH!&[ [[YQDU[4#U%Y1'32M'ATMCXWTMR&O)%G &7VJ-C&SZI]>$;A_)6HU.%N6GC/P -MD6VY]&CFSZ^RS-I%_.G0^%)]&/7.9784 -MF2P]"7,K"// V>E;M@;\>09=5B"XRR%)I=9;0FK=F/$J!8(;G%@"%5E+4Q[9 -MGB.*PA#Y!>=AC[OCA-)5.U\T5GC!;4-A__S,V-J6+7$H91T]'^* _GZ -M"5+5X\8Z_NKPBPGJC)_B3FN=Q&6]"67Y950<8$!W@ALS*,<;;47R&A=5+'4< -M:AL+-;;+'#OH>]X[LMG!8D>S]NQ:&N3*?#9X) NZ7W%S;R1'8 &L'V(FVHQT -M@#\H60RP,Q[PK^#CBM77:K?=X0?%2?DHXQ+@"/["<@"S97_<>:F$)AJL\75H -M4^G+A>/6ZNIOR/825=EZ1SK\G\PHRIM;LP&SIH29@[IM/FE*Y8X!@6H3KL,D -M!6XE2E]7RCO+PKVL09P%BX,0\S:QYV?H9B21L(*#:>Z Y>(U=SBNM?K@[-,9 -M6%8)G@;,J"IY#)L"!*FV&OPT^VI+T% -M5*B@:L/+MYW*6&V<%@KC%WVI6M22,Q[7 '>3W/1D;WLZ]^1J52J3F=@]M,*0 -M7H33-%QPEY8+O)QKYF!!.^6OHVXJUBH=-5\I%R!>*O32E!F#N'6'D^-J%>4ENY>[/2UC%=__1A@D -M7T/([EG^6\@X/XZWHSFI"*%;">;DMY4=P-IL_3S7"TM<'"6NX'5?&.I%M7:L -MD6C]N%ED3<,_Q!SI8M!<&Y$XW[#VYY RNJ,&N#<%O[_A=)0L0A\\5H?']BM -M@B3X1>_HQ%;?>H+K:P"YD0=8/,Q2 3H2O^)!@]FSXL!F__^/))1)@!U/AZ%Q -M<:PX%FUVN&0"E%KG#8T %$2S-?5'%]%))%NR1:0"& 8\104@FNY@^6HV&@/> -M*+?#(Z1$:T\WX-SS1WU]W%!=7>IB,D(K0K)@:L]2)/3U^C,C'W!VH?YXW)=KY&'** _4"IY;Z.00BM76 -MB *ZM'"TZ#_ MRU/V)UH"IIVEQ4$G3*2'$0,W/11$$*0 8W26(^U+',5A_<< -MK\$WFSD;>[,N>%'&$'(@\.R+V2AN8/*)L\DQ7/3@^5T'5?L75"6L7.MXI;=-0$E2%UUW[O;QD;)[#GZ(:3RQ!20V]O#R2G$#: 3FO++.TF -MD 3+#4D5V*507K'[3V@(O,1"G.(\+\X<_:#DB<(=,+# -MS@A[6J"*ALS W4-\^J*4WNH47WJR]TAGB?A>B?-?>6[1B%YP[!MIOO+;\I+< -MD6J,&X:A9L!HG5;*9"6XEQS,.C))&/#&!63-4#,Q13L3_'O -M\>WWX>,!_CC8#YV5D*MW7&2QY.L.T$*;-"J1;V5U/PK.$@94#GXM*Z95H_T0 -MX-)6RSD+:G.;FJS')1()FOS. 'D\J-Z$%*!#U,)91'M"V' 5Z !XS"1:/S \ -MO/;YKF/%=^BMW]Z$"X*"56,<";'TUS9+S+>[1Q[L2K=,*!;J!)L2"G',^BH[+D!=.B-TS*P0><25<)Y'96MX5K"J -M_!3H/.0+XP3^]'CN[1KT,WC!%1J*[>#D(QZ6U78*.,=KMQ< -M0-JM&;?\L(-BS[ZI4'LP'738.S$(-3&DX-1E_IV=W=I,)MUECH'C9>:,MPMC -M1> +WE/\%8SL.P"%NIX=V(H/;HT+-OUUVIP5#[@)/GMI'133]FW7F!K\16\" -M3'TD6@53HRS\][\-]^E"[4VBK>"(>1B)5S]-B*]WZL75X!N5SZ4SRS[\W\G* -MP!L";:F0]XN'_RX_ !@$6"+0+_P3@B=+VTK'VXN<'G>+)S7K&O)4'24?TZC -M(-'A+%.0M]891,*E:O.@J,<%H\?-HF6.?(WN/*A%O3@TYY+UB=8ZR>V:AT1? -M>2/CHD8C9QXL7ZW1@JJ??MBK>7D;0(\O6,S]QJR3>'RP@\3*M/TT'QI.TOTF0E5Y)6DR%-L46;M3@<:_TO/^3U8.?A-!"P2=% -M2!7MW5W1A9H8Q=W.>?=3&Y)5U42-!KD"5CZ%9GO-H^EIDA'DEC81NT8NDDG4 -MOE5U5?YO7P&=?XII8R7,4E3CJ:D -M\PBC/";ZV@"<;+E 9_AS =SAA.@<=BHFLKG5G:!'E<:NL=^\7W[V9M-EJ/$I -M+8X4NXAPQ3ZW=0GS3N$0M$K@A8D[S(,+ 8(0J .Q?.(X *<"\X$IQ01B0OCD -M%9O_;4V&1U+6#>IC.7)L]HB3[^YB8>\J1[E,\N+.Y,+]>P]>?A4K#ZF7TKX7 -MV:YA2W'@$R>5707:<6)%5(_L<(-Z':=Z-;8*FZ\ESL0BN.M(A -M%%A=DU)>=7TX/D*"YV0@F?_!68CS)=S^GG)@%NH'NI]A8[>&['\3Q>@#2ZLI -M!J0.>:%SKXLQI/[M!1!.QGOV9\VP);2UT@7]=QE9'L+'ETH%X9!U1C-7W(.I -MTJ2E@;85=B26B"3A;6@'L'&0;BV$70X> sys.stderr, "You must create a file 'fulltester.local' containing a" - print >> sys.stderr, "list of Python executables of various versions." - sys.exit(2) - -PYTHON_VERSIONS = [s.strip() for s in f.readlines()] -f.close() - -PSYCO_MODES = [ - # debugging mode, static compiling - {'PSYCO_DEBUG': 1, 'VERBOSE_LEVEL': 1, 'CODE_DUMP': 1, 'ALL_STATIC': 1}, - # optimized mode, static compiling - {'PSYCO_DEBUG': 0, 'VERBOSE_LEVEL': 0, 'CODE_DUMP': 0, 'ALL_STATIC': 1}, - # debugging mode, IVM virtual processor - {'PSYCO_DEBUG': 1, 'VERBOSE_LEVEL': 1, 'CODE_DUMP': 1, 'ALL_STATIC': 1, - 'PROCESSOR': 'ivm'}, - # optimized mode, IVM virtual processor - {'PSYCO_DEBUG': 0, 'VERBOSE_LEVEL': 0, 'CODE_DUMP': 0, 'ALL_STATIC': 1, - 'PROCESSOR': 'ivm'}, - ] - -FRACTION = 10 - -RUNNING_MODES = [ - ("test_base.py", {}), - ] -for n in range(FRACTION): - RUNNING_MODES.append( - ("regrtester2.py %d/%d -nodump" % (n, FRACTION), - {"regrtester.local": "psyco.full()"})) -for n in range(FRACTION): - RUNNING_MODES.append( - ("regrtester2.py %d/%d -nodump" % (n, FRACTION), - {"regrtester.local": "psyco.profile()"})) - -compiled_version = None - - -def run(path, *argv): - print '='*10, path, ' '.join(argv) - sys.stdout.flush() - path = os.path.expanduser(path) - err = os.spawnv(os.P_WAIT, path, [path]+list(argv)) - if err: - print '='*60 - print '*** exited with error code', err - sys.exit(err) - -def do_compile(python_version, psyco_mode): - print '~'*60 - print psyco_mode - preffile = os.path.join(os.pardir, 'preferences.py') - try: - f = open(preffile, 'r') - backup = f.read() - f.close() - except IOError: - backup = '' - if backup: - print "===== Note: ignoring your custom preferences.py" - cwd = os.getcwd() - try: - f = open(preffile, 'w') - for varvalue in psyco_mode.items(): - f.write('%s = %r\n' % varvalue) - f.close() - os.chdir(os.pardir) - run(python_version, 'setup.py', 'build', '-f') - run(python_version, 'setup.py', 'install_lib') - finally: - os.chdir(cwd) - f = open(preffile, 'w') - f.write(backup) - f.close() - -def test_with(python_version, psyco_mode, running_mode): - # - # Compile the appropriate Psyco version - # - global compiled_version - if (python_version, psyco_mode) != compiled_version: - do_compile(python_version, psyco_mode) - compiled_version = (python_version, psyco_mode) - # - # Prepare the running mode - # - script, prefiles = running_mode - for filename, content in prefiles.items(): - f = open(filename, 'w') - print >> f, content - f.close() - # - # Run it - # - print '='*10, '%s: %s' % ( - psyco_mode['PSYCO_DEBUG'] and "DEBUG" or "RELEASE", - running_mode) - run(python_version, *script.split()) - # - # Passed - # - tests_passed.append((python_version, psyco_mode, running_mode)) - f = open(passed_filename, 'w') - f.write(repr(tests_passed)) - f.close() - # - # Make a little pause to catch our breath again - # - time.sleep(1) - - -def test(): - global tests_passed, passed_filename - passed_filename = "tmp_fulltests_passed" - try: - f = open(passed_filename) - tests_passed = eval(f.read()) - f.close() - except IOError: - tests_passed = [] - - tests = [(python_version, psyco_mode, running_mode) - for python_version in PYTHON_VERSIONS - for psyco_mode in PSYCO_MODES - for running_mode in RUNNING_MODES] - tests.sort() - tests.reverse() - later_tests = [] - for mode in tests: - if mode in tests_passed: - later_tests.append(mode) - else: - test_with(*mode) - for mode in later_tests: - test_with(*mode) - try: - os.unlink(passed_filename) - except: - pass - try: - os.unlink("regrtester.local") - except: - pass - print "="*60 - print - print "The Ultimate Test Suite (tm) passed !" - print - print "="*60 - - -if __name__ == '__main__': - test() diff --git a/nodebox/ext/psyco/src/test/life-psyco.py b/nodebox/ext/psyco/src/test/life-psyco.py deleted file mode 100755 index 7411349..0000000 --- a/nodebox/ext/psyco/src/test/life-psyco.py +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env python -# ------------------------------------------------ -# Based on "life.py" from the Python distribution. -# The same copyrights apply. -# I only added two lines: -# import psyco -# psyco.bind(LifeBoard) -# Compare this with the speed of the original. -# Armin Rigo -# ------------------------------------------------ -# life.py -- A curses-based version of Conway's Game of Life. -# Contributed by AMK -# -# An empty board will be displayed, and the following commands are available: -# E : Erase the board -# R : Fill the board randomly -# S : Step for a single generation -# C : Update continuously until a key is struck -# Q : Quit -# Cursor keys : Move the cursor around the board -# Space or Enter : Toggle the contents of the cursor's position -# -# TODO : -# Support the mouse -# Use colour if available -# Make board updates faster -# - -class LifeBoard: - """Encapsulates a Life board - - Attributes: - X,Y : horizontal and vertical size of the board - state : dictionary mapping (x,y) to 0 or 1 - - Methods: - display(update_board) -- If update_board is true, compute the - next generation. Then display the state - of the board and refresh the screen. - erase() -- clear the entire board - makeRandom() -- fill the board randomly - set(y,x) -- set the given cell to Live; doesn't refresh the screen - toggle(y,x) -- change the given cell from live to dead, or vice - versa, and refresh the screen display - - """ - def __init__(self, scr, char=ord('*')): - """Create a new LifeBoard instance. - - scr -- curses screen object to use for display - char -- character used to render live cells (default: '*') - """ - self.state={} ; self.scr=scr - Y, X = self.scr.getmaxyx() - self.X, self.Y = X-2, Y-2-1 - self.char = char - self.scr.clear() - - # Draw a border around the board - border_line='+'+(self.X*'-')+'+' - self.scr.addstr(0, 0, border_line) - self.scr.addstr(self.Y+1,0, border_line) - for y in range(0, self.Y): - self.scr.addstr(1+y, 0, '|') - self.scr.addstr(1+y, self.X+1, '|') - self.scr.refresh() - - def set(self, y, x): - """Set a cell to the live state""" - if x<0 or self.X<=x or y<0 or self.Y<=y: - raise ValueError, "Coordinates out of range %i,%i"% (y,x) - self.state[x,y] = 1 - - def toggle(self, y, x): - """Toggle a cell's state between live and dead""" - if x<0 or self.X<=x or y<0 or self.Y<=y: - raise ValueError, "Coordinates out of range %i,%i"% (y,x) - if self.state.has_key( (x,y) ): - del self.state[x,y] - self.scr.addch(y+1, x+1, ' ') - else: - self.state[x,y]=1 - self.scr.addch(y+1, x+1, self.char) - self.scr.refresh() - - def erase(self): - """Clear the entire board and update the board display""" - self.state={} - self.display(update_board=0) - - def display(self, update_board=1): - """Display the whole board, optionally computing one generation""" - M,N = self.X, self.Y - if not update_board: - for i in range(0, M): - for j in range(0, N): - if self.state.has_key( (i,j) ): - self.scr.addch(j+1, i+1, self.char) - else: - self.scr.addch(j+1, i+1, ' ') - self.scr.refresh() - return - - d={} ; self.boring=1 - for i in range(0, M): - L=range( max(0, i-1), min(M, i+2) ) - for j in range(0, N): - s=0 - live=self.state.has_key( (i,j) ) - for k in range( max(0, j-1), min(N, j+2) ): - for l in L: - if self.state.has_key( (l,k) ): - s=s+1 - s=s-live - if s==3: - # Birth - d[i,j]=1 - self.scr.addch(j+1, i+1, self.char) - if not live: self.boring=0 - elif s==2 and live: d[i,j]=1 # Survival - elif live: - # Death - self.scr.addch(j+1, i+1, ' ') - self.boring=0 - self.state=d - self.scr.refresh() - - def makeRandom(self): - "Fill the board with a random pattern" - import whrandom - self.state={} - for i in range(0, self.X): - for j in range(0, self.Y): - if whrandom.random()*10>5.0: self.set(j,i) - - -import psyco -psyco.bind(LifeBoard) - - -def erase_menu(stdscr, menu_y): - "Clear the space where the menu resides" - stdscr.move(menu_y, 0) ; stdscr.clrtoeol() - stdscr.move(menu_y+1, 0) ; stdscr.clrtoeol() - -def display_menu(stdscr, menu_y): - "Display the menu of possible keystroke commands" - erase_menu(stdscr, menu_y) - stdscr.addstr(menu_y, 4, - 'Use the cursor keys to move, and space or Enter to toggle a cell.') - stdscr.addstr(menu_y+1, 4, - 'E)rase the board, R)andom fill, S)tep once or C)ontinuously, Q)uit') - -def main(stdscr): - import string, curses - - # Clear the screen and display the menu of keys - stdscr.clear() - stdscr_y, stdscr_x = stdscr.getmaxyx() - menu_y=(stdscr_y-3)-1 - display_menu(stdscr, menu_y) - - # Allocate a subwindow for the Life board and create the board object - subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0) - board=LifeBoard(subwin, char=ord('*')) - board.display(update_board=0) - - # xpos, ypos are the cursor's position - xpos, ypos = board.X/2, board.Y/2 - - # Main loop: - while (1): - stdscr.move(1+ypos, 1+xpos) # Move the cursor - c=stdscr.getch() # Get a keystroke - if 00: ypos=ypos-1 - elif c==curses.KEY_DOWN and ypos0: xpos=xpos-1 - elif c==curses.KEY_RIGHT and xpos5.0: self.set(j,i) - - -def erase_menu(stdscr, menu_y): - "Clear the space where the menu resides" - stdscr.move(menu_y, 0) ; stdscr.clrtoeol() - stdscr.move(menu_y+1, 0) ; stdscr.clrtoeol() - -def display_menu(stdscr, menu_y): - "Display the menu of possible keystroke commands" - erase_menu(stdscr, menu_y) - stdscr.addstr(menu_y, 4, - 'Use the cursor keys to move, and space or Enter to toggle a cell.') - stdscr.addstr(menu_y+1, 4, - 'E)rase the board, R)andom fill, S)tep once or C)ontinuously, Q)uit') - -def main(stdscr): - import string, curses - - # Clear the screen and display the menu of keys - stdscr.clear() - stdscr_y, stdscr_x = stdscr.getmaxyx() - menu_y=(stdscr_y-3)-1 - display_menu(stdscr, menu_y) - - # Allocate a subwindow for the Life board and create the board object - subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0) - board=LifeBoard(subwin, char=ord('*')) - board.display(update_board=0) - - # xpos, ypos are the cursor's position - xpos, ypos = board.X/2, board.Y/2 - - # Main loop: - while (1): - stdscr.move(1+ypos, 1+xpos) # Move the cursor - c=stdscr.getch() # Get a keystroke - if 00: ypos=ypos-1 - elif c==curses.KEY_DOWN and ypos0: xpos=xpos-1 - elif c==curses.KEY_RIGHT and xpos 100: - EnumParOut = Ident1 - else: - EnumParOut = Ident4 - elif EnumParIn == Ident3: - EnumParOut = Ident2 - elif EnumParIn == Ident4: - pass - elif EnumParIn == Ident5: - EnumParOut = Ident3 - return EnumParOut - -def Proc7(IntParI1, IntParI2): - IntLoc = IntParI1 + 2 - IntParOut = IntParI2 + IntLoc - return IntParOut - -def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): - global IntGlob - - IntLoc = IntParI1 + 5 - Array1Par[IntLoc] = IntParI2 - Array1Par[IntLoc+1] = Array1Par[IntLoc] - Array1Par[IntLoc+30] = IntLoc - for IntIndex in range(IntLoc, IntLoc+2): - Array2Par[IntLoc][IntIndex] = IntLoc - Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1 - Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc] - IntGlob = 5 - -def Func1(CharPar1, CharPar2): - CharLoc1 = CharPar1 - CharLoc2 = CharLoc1 - if CharLoc2 != CharPar2: - return Ident1 - else: - return Ident2 - -def Func2(StrParI1, StrParI2): - IntLoc = 1 - while IntLoc <= 1: - if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1: - CharLoc = 'A' - IntLoc = IntLoc + 1 - if CharLoc >= 'W' and CharLoc <= 'Z': - IntLoc = 7 - if CharLoc == 'X': - return TRUE - else: - if StrParI1 > StrParI2: - IntLoc = IntLoc + 7 - return TRUE - else: - return FALSE - -def Func3(EnumParIn): - EnumLoc = EnumParIn - if EnumLoc == Ident3: return TRUE - return FALSE - -if __name__ == '__main__': - import psyco - psyco.jit(1) - main() - psyco.dumpcodebuf() diff --git a/nodebox/ext/psyco/src/test/pystone.py b/nodebox/ext/psyco/src/test/pystone.py deleted file mode 100644 index 8131ed1..0000000 --- a/nodebox/ext/psyco/src/test/pystone.py +++ /dev/null @@ -1,307 +0,0 @@ -#! /usr/bin/env python - -""" -"PYSTONE" Benchmark Program - -Version: Python/1.1 (corresponds to C/1.1 plus 2 Pystone fixes) - -Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg. 1013. - - Translated from ADA to C by Rick Richardson. - Every method to preserve ADA-likeness has been used, - at the expense of C-ness. - - Translated from C to Python by Guido van Rossum. - -Version History: - - Version 1.1 corrects two bugs in version 1.0: - - First, it leaked memory: in Proc1(), NextRecord ends - up having a pointer to itself. I have corrected this - by zapping NextRecord.PtrComp at the end of Proc1(). - - Second, Proc3() used the operator != to compare a - record to None. This is rather inefficient and not - true to the intention of the original benchmark (where - a pointer comparison to None is intended; the != - operator attempts to find a method __cmp__ to do value - comparison of the record). Version 1.1 runs 5-10 - percent faster than version 1.0, so benchmark figures - of different versions can't be compared directly. - -""" - -LOOPS = 100000 -LOOPS1 = 100000 # number of loops for the first run of Psyco - -from time import clock - -__version__ = "1.1" - -[Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6) - -class Record: - - def __init__(self, PtrComp = None, Discr = 0, EnumComp = 0, - IntComp = 0, StringComp = 0): - self.PtrComp = PtrComp - self.Discr = Discr - self.EnumComp = EnumComp - self.IntComp = IntComp - self.StringComp = StringComp - - def copy(self): - return Record(self.PtrComp, self.Discr, self.EnumComp, - self.IntComp, self.StringComp) - -TRUE = 1 -FALSE = 0 - -def mydiv(a,b): - try: - return float(a) / b - except: - return float("nan") - -def main(): - print "Pystone(%s) time loops per second" % __version__ - py_time, = pystones_reg(LOOPS1+LOOPS) - pyloop_time = py_time / (LOOPS1+LOOPS) - print "regular Python for %d passes %g %g" % \ - (LOOPS1+LOOPS, py_time, mydiv(1, pyloop_time)) - psy_time1, psy_time = pystones_psycho(LOOPS1, LOOPS) - print "Psyco for %d passes %g %g" % \ - (LOOPS1, psy_time1, mydiv(LOOPS1, psy_time1)) - print "Psyco for %d more passes %g %g" % \ - (LOOPS, psy_time, mydiv(LOOPS, psy_time)) - print "Total for %d passes %g %g" % \ - (LOOPS1+LOOPS, psy_time1+psy_time, - mydiv(LOOPS1+LOOPS, psy_time1+psy_time)) - - # invert the equation system: - # psy_time1 = start_time + LOOPS1*loop_time - # psy_time1+psy_time = start_time + (LOOPS1+LOOPS)*loop_time - loop_time = psy_time/LOOPS - start_time = psy_time1 - LOOPS1*loop_time - print "Separated compilation/execution timings for %d passes" % \ - (LOOPS1+LOOPS) - print "Compilation (i.e. start-up) %g %g" % \ - (start_time, mydiv(1, start_time)) - print "Machine code execution %g %g" % \ - (loop_time*(LOOPS1+LOOPS), mydiv(1, loop_time)) - print - print "Relative execution frequencies (iterations per second)" - print "iterations Psyco Python Psyco is ... times faster" - for d in range(8): - n = 10**d - psyco1 = mydiv(n, start_time+n*loop_time) - print " %8d %g %g %.2f" % \ - (n, psyco1, mydiv(1, pyloop_time), psyco1*pyloop_time) - - # invert the equation - # start_time + c*loop_time = c*pyloop_time - if pyloop_time <= loop_time: - print "Psyco is always slower than regular Python." - else: - c = mydiv(start_time, pyloop_time - loop_time) - print "Cut-off point: %.1f iterations" % c - if start_time < 0.07: - print "Note: start-up time is very low, the above figure is not reliable." - print "You should consider running the same benchmark a large number of times" - print "and taking the mean value for the cut-off point." - -def pystones_psycho(*loopslist): - import psyco - #old_dict = Record.__dict__.copy() - #try: - # replace all methods of Record by proxies - #for key, value in old_dict.items(): - # if type(value) is type(main): - # Record.__dict__[key] = _psyco.proxy(value, 99) - f = psyco.proxy(Proc0) - return map(f, loopslist) - #finally: - # Record.__dict__.update(old_dict) - -def pystones_reg(*loopslist): - return map(Proc0, loopslist) - -IntGlob = 0 -BoolGlob = FALSE -Char1Glob = '\0' -Char2Glob = '\0' -Array1Glob = [0]*51 -Array2Glob = map(lambda x: x[:], [Array1Glob]*51) -PtrGlb = None -PtrGlbNext = None - -def Proc0(loops=LOOPS): - global IntGlob - global BoolGlob - global Char1Glob - global Char2Glob - global Array1Glob - global Array2Glob - global PtrGlb - global PtrGlbNext - - PtrGlbNext = Record() - PtrGlb = Record() - PtrGlb.PtrComp = PtrGlbNext - PtrGlb.Discr = Ident1 - PtrGlb.EnumComp = Ident3 - PtrGlb.IntComp = 40 - PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING" - String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING" - Array2Glob[8][7] = 10 - - starttime = clock() - - for i in range(loops): - Proc5() - Proc4() - IntLoc1 = 2 - IntLoc2 = 3 - String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING" - EnumLoc = Ident2 - BoolGlob = not Func2(String1Loc, String2Loc) - while IntLoc1 < IntLoc2: - IntLoc3 = 5 * IntLoc1 - IntLoc2 - IntLoc3 = Proc7(IntLoc1, IntLoc2) - IntLoc1 = IntLoc1 + 1 - Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3) - PtrGlb = Proc1(PtrGlb) - CharIndex = 'A' - while CharIndex <= Char2Glob: - if EnumLoc == Func1(CharIndex, 'C'): - EnumLoc = Proc6(Ident1) - CharIndex = chr(ord(CharIndex)+1) - IntLoc3 = IntLoc2 * IntLoc1 - IntLoc2 = IntLoc3 / IntLoc1 - IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1 - IntLoc1 = Proc2(IntLoc1) - - benchtime = clock() - starttime - return benchtime - -def Proc1(PtrParIn): - PtrParIn.PtrComp = NextRecord = PtrGlb.copy() - PtrParIn.IntComp = 5 - NextRecord.IntComp = PtrParIn.IntComp - NextRecord.PtrComp = PtrParIn.PtrComp - NextRecord.PtrComp = Proc3(NextRecord.PtrComp) - if NextRecord.Discr == Ident1: - NextRecord.IntComp = 6 - NextRecord.EnumComp = Proc6(PtrParIn.EnumComp) - NextRecord.PtrComp = PtrGlb.PtrComp - NextRecord.IntComp = Proc7(NextRecord.IntComp, 10) - else: - PtrParIn = NextRecord.copy() - NextRecord.PtrComp = None - return PtrParIn - -def Proc2(IntParIO): - IntLoc = IntParIO + 10 - while 1: - if Char1Glob == 'A': - IntLoc = IntLoc - 1 - IntParIO = IntLoc - IntGlob - EnumLoc = Ident1 - if EnumLoc == Ident1: - break - return IntParIO - -def Proc3(PtrParOut): - global IntGlob - - if PtrGlb is not None: - PtrParOut = PtrGlb.PtrComp - else: - IntGlob = 100 - PtrGlb.IntComp = Proc7(10, IntGlob) - return PtrParOut - -def Proc4(): - global Char2Glob - - BoolLoc = Char1Glob == 'A' - BoolLoc = BoolLoc or BoolGlob - Char2Glob = 'B' - -def Proc5(): - global Char1Glob - global BoolGlob - - Char1Glob = 'A' - BoolGlob = FALSE - -def Proc6(EnumParIn): - EnumParOut = EnumParIn - if not Func3(EnumParIn): - EnumParOut = Ident4 - if EnumParIn == Ident1: - EnumParOut = Ident1 - elif EnumParIn == Ident2: - if IntGlob > 100: - EnumParOut = Ident1 - else: - EnumParOut = Ident4 - elif EnumParIn == Ident3: - EnumParOut = Ident2 - elif EnumParIn == Ident4: - pass - elif EnumParIn == Ident5: - EnumParOut = Ident3 - return EnumParOut - -def Proc7(IntParI1, IntParI2): - IntLoc = IntParI1 + 2 - IntParOut = IntParI2 + IntLoc - return IntParOut - -def Proc8(Array1Par, Array2Par, IntParI1, IntParI2): - global IntGlob - - IntLoc = IntParI1 + 5 - Array1Par[IntLoc] = IntParI2 - Array1Par[IntLoc+1] = Array1Par[IntLoc] - Array1Par[IntLoc+30] = IntLoc - for IntIndex in range(IntLoc, IntLoc+2): - Array2Par[IntLoc][IntIndex] = IntLoc - Array2Par[IntLoc][IntLoc-1] = Array2Par[IntLoc][IntLoc-1] + 1 - Array2Par[IntLoc+20][IntLoc] = Array1Par[IntLoc] - IntGlob = 5 - -def Func1(CharPar1, CharPar2): - CharLoc1 = CharPar1 - CharLoc2 = CharLoc1 - if CharLoc2 != CharPar2: - return Ident1 - else: - return Ident2 - -def Func2(StrParI1, StrParI2): - IntLoc = 1 - while IntLoc <= 1: - if Func1(StrParI1[IntLoc], StrParI2[IntLoc+1]) == Ident1: - CharLoc = 'A' - IntLoc = IntLoc + 1 - if CharLoc >= 'W' and CharLoc <= 'Z': - IntLoc = 7 - if CharLoc == 'X': - return TRUE - else: - if StrParI1 > StrParI2: - IntLoc = IntLoc + 7 - return TRUE - else: - return FALSE - -def Func3(EnumParIn): - EnumLoc = EnumParIn - if EnumLoc == Ident3: return TRUE - return FALSE - -if __name__ == '__main__': - main() diff --git a/nodebox/ext/psyco/src/test/regrtester.py b/nodebox/ext/psyco/src/test/regrtester.py deleted file mode 100644 index 5cb14fe..0000000 --- a/nodebox/ext/psyco/src/test/regrtester.py +++ /dev/null @@ -1,76 +0,0 @@ -import sys, os, test.regrtest - -import psyco -import time; print "Break!"; time.sleep(0.5) -psyco.log() -if os.path.exists('regrtester.local'): - execfile('regrtester.local') -else: - psyco.full() - - -################################################################################# -SKIP = {'test_gc': "test_gc.test_frame() does not create a cycle with Psyco's limited frames", - 'test_descr': 'seems that it mutates user-defined types and Psyco does not like it at all', - 'test_profilehooks': 'no profiling allowed with Psyco!', - 'test_profile': 'no profiling allowed with Psyco!', - 'test_cProfile': 'no profiling allowed with Psyco!', - 'test_repr': 'self-nested tuples and lists not supported', - 'test_trace': 'no line tracing with Psyco', - 'test_threaded_import': 'Python hang-ups', - 'test_hotshot': "PyEval_SetProfile(NULL,NULL) doesn't allow Psyco to take control back", - 'test_richcmp': 'uses eval() with locals and circular data structure cmps', - 'test_longexp': 'run it separately if you want, but it takes time and memory', - 'test_weakref': 'only run with FULL_CONTROL_FLOW set to 0 in mergepoints.c', - 'test_gettext': 'gettext mutates _ in the builtins!', - 'test_inspect': 'isframe() does not recognize our Frame instances', - 'test_exceptions': 'uses tb.tb_frame.f_back', - 'test_largefile': 'fails on Python on my old Linux box', - 'test_popen2': 'log file descriptor messed up in Python < 2.2.2', - 'test_sys': 'getrefcount() cannot be reliably tested', - 'test_socket': 'refcounting stuff as well', - #'test_copy': 'xrange() is very similar to range() with Psyco', - 'test_tarfile': 'we get permission denied with Python', - 'test_scope': 'refcounting: relies on the __del__ of instances', - 'test_sax': 'fails without Psyco due to my Expat installation', - 'test_email': 'broken? on \n vs. \r\n', - 'test_mmap': '"invalid handle" with Python 2.2.2', - 'test_winsound': 'winsound fails on Python 2.3 on my machine', - 'test_strptime': "fails about my timezone ending in (heure d'ete) in 2.3", - 'test_atexit': "windows: tired to work around w9xpopen magic", - 'test_popen': "windows: tired to work around w9xpopen magic", - 'test_mimetypes': 'fail in 2.3 if run after test_urllib', - 'test_doctest': 'doctest uses the debugger!?', - 'test_subprocess': 'suspect subprocess messes up stdout with Psyco messages', - 'test_linuxaudiodev': 'this /dev is absent or unreliable on a few machines of mine', - 'test_tcl': 'requires $DISPLAY', - 'test_pep352': 'no warning for string exceptions', - 'test_ctypes': 'it is full of sys.getrefcount() assertions', - 'test_import': 'I hack my pythons to not import bare .pyc files any more', - 'test_runpy': 'I hack my pythons to not import bare .pyc files any more', - 'test_genexps': 'doctests checking the exact error message', - } -# SKIP['test_operator'] = NO_SYS_EXC -# SKIP['test_strop'] = NO_SYS_EXC -#if sys.version_info[:2] >= (2,3): -# SKIP['test_threadedtempfile'] = 'Python bug: Python test just hangs up' - -if sys.version_info[:3] == (2,4,0): - SKIP['test_distutils'] = 'distutils/tests/* not copied by the installer' - -if hasattr(psyco._psyco, 'VERBOSE_LEVEL'): - SKIP['test_popen2'] = 'gets confused by Psyco debugging output to stderr' - -if os.path.exists('regrtester.skip'): - execfile('regrtester.skip') - -################################################################################# - - -# the tests that don't work with Psyco -test.regrtest.NOTTESTS += SKIP.keys() -if __name__ == '__main__': - try: - test.regrtest.main(randomize=1) - finally: - psyco.dumpcodebuf() diff --git a/nodebox/ext/psyco/src/test/regrtester2.py b/nodebox/ext/psyco/src/test/regrtester2.py deleted file mode 100644 index f72d313..0000000 --- a/nodebox/ext/psyco/src/test/regrtester2.py +++ /dev/null @@ -1,48 +0,0 @@ -# -# A less memory-exploding version of regrtester.py. -# It runs only a fraction of the tests. -# - -import sys, re, psyco - - -assert len(sys.argv) >= 2 -match = re.match(r"(\d+)[/](\d+)", sys.argv[1]) -assert match, "syntax: regrtester2.py n/m [-nodump] [seed]" -n = int(match.group(1)) -m = int(match.group(2)) -assert 0 <= n < m - - -import test.regrtest -import regrtester - -def confirm_still_in_psyco(): - return __in_psyco__ - -tests = [s for s in test.regrtest.findtests() - if hash(s) % m == n and s not in test.regrtest.NOTTESTS] -if __name__ == '__main__': - if len(sys.argv) > 2 and sys.argv[2] == '-nodump': - dump = 0 - del sys.argv[2] - else: - dump = 1 - - import random, time - seed = time.ctime() - if len(sys.argv) > 2: - seed = sys.argv[2] - del sys.argv[2] - print 'Random seed is %r' % seed - random.seed(seed) - random.shuffle(tests) - - fully_in_psyco = confirm_still_in_psyco() - try: - test.regrtest.main(tests) #, verbose=1) - finally: - if dump: - psyco.dumpcodebuf() - if fully_in_psyco: - assert confirm_still_in_psyco() diff --git a/nodebox/ext/psyco/src/test/test1.py b/nodebox/ext/psyco/src/test/test1.py deleted file mode 100644 index fb7ed86..0000000 --- a/nodebox/ext/psyco/src/test/test1.py +++ /dev/null @@ -1,211 +0,0 @@ -import os -import psyco - -def time(fn, *args): - "Measure the execution time of fn(*args)." - import time, traceback - begin = time.clock() - try: - result = fn(*args) - except: - end = time.clock() - traceback.print_exc() - result = '' - else: - end = time.clock() - return result, end-begin - - -ZERO = 0 - -def f1(n): - "Arbitrary test function." - i = 0 - x = 1 - while i 2: - if i > 126-33: i = 126-33 - return chr(33+i) - return " " - -def f7(start, end, step): - "Computes the Mandelbrot set. All args are complex numbers." - width = int((end.real - start.real) / step.real) - while start.imag < end.imag: - line = [mandelbrot(start + n*step.real) for n in range(width)] - print ''.join(line) - start += complex(0, step.imag) - -def mandelbrotbis(c_r, c_i): - z_r = z_i = 0.0 - for i in xrange(1000): - z_r, z_i = z_r*z_r-z_i*z_i + c_r, 2*z_r*z_i + c_i - if z_r*z_r+z_i*z_i > 4.0: - if i > 126-33: i = 126-33 - return chr(33+i) - return " " - -def f7bis((start_r, start_i), (end_r, end_i), (step_r, step_i)): - "Computes the Mandelbrot set. All args are (real, imag) tuples." - width = int((end_r - start_r) / step_r) - while start_i < end_i: - line = [mandelbrotbis(start_r + n*step_r, start_i) for n in range(width)] - print ''.join(line) - start_i += step_i - -def f8(): - try: - x = 1.0 / 0.0 - #except StandardError, e: - # print "in except clause:", e - finally: - print "in finally clause" - x = 5 - print "x is now", x - -def f9(n): - for i in range(n): - print i, - print - -def f10(): - apply(f9, (50,)) - -def f11(n): - def subtracter(x, y=n): - return x-y - return subtracter(1000) - - -ALLTESTS = [] - -def go(f, *args): - print '-'*78 - v1, t1 = time(psyco.proxy(f), *args) - print v1 - print '^^^ computed by Psyco in %s seconds' % t1 - v2, t2 = time(f, *args) - if v1 == v2: - if t1 and t2: - ok = '%.2f times faster' % (t2/float(t1)) - s = ', Psyco is %s' % ok - else: - ok = s = '' - print 'Python got the same result in %s seconds%s' % (t2, s) - else: - print v2 - print '^^^ by Python in %s seconds' % t2 - print '*'*78 - print '!!! different results !!!' - ok = 'DIFFERENT RESULTS' - ALLTESTS.append((f.func_name,t2,t1,ok)) - -def print_results(): - import sys - print - print '='*23, 'Summary (Python %d.%d.%d)' % sys.version_info[:3], '='*23 - format = '%-15s %-15s %-15s %s' - print format % ('function', 'Python time', 'Psyco time', '') - for r in ALLTESTS: - print format % r - -def go1(arg=2117): - go(f1, arg) - -FILEPATH = '../c' -FILELIST = [os.path.join(FILEPATH, s) for s in os.listdir(FILEPATH)] -FILELIST = [s for s in FILELIST if os.path.isfile(s) and s!='psyco.dump'] - -def go4(arg=FILELIST): - go(f4, arg) - -def go5(arg=FILELIST): - go(f5, arg) - -def go6(n=100000, p=100000000000001L): - go(f6, n, p) - -def go7(start=-2-1j, end=1+1j, step=0.04+0.08j): - go(f7, start, end, step) - -def go7bis(start=(-2.0, -1.0), end=(1.0, 1.0), step=(0.04, 0.08)): - go(f7bis, start, end, step) - - -if __name__ == "__main__": - go(f11, 50) - go1() - go4() - go5() - go6() - go7() - go7bis() - go(f10) - psyco.dumpcodebuf() - print_results() diff --git a/nodebox/ext/psyco/src/test/test3.py b/nodebox/ext/psyco/src/test/test3.py deleted file mode 100644 index 2327c4c..0000000 --- a/nodebox/ext/psyco/src/test/test3.py +++ /dev/null @@ -1,424 +0,0 @@ -#from __future__ import generators -#from __future__ import division -import psyco, os, sys, array, operator, traceback -from time import sleep, clock - -def time(fn, *args): - "Measure the execution time of fn(*args)." - begin = clock() - try: - result = apply(fn, args) - except: - end = clock() - traceback.print_exc() - result = '' - else: - end = clock() - return result, end-begin - - -ZERO = 0 - -def f1(n): - "Arbitrary test function." - i = 0 - x = 1 - while i 4.0: - if i > 126-33: i = 126-33 - return chr(33+i) - za, zb = za2-zb2+c.real, 2*za*zb+c.imag - del za2, zb2 - return " " - -def f7(start, end, step): - "Computes the Mandelbrot set. All args are complex numbers." - width = int((end.real - start.real) / step.real) - while start.imag < end.imag: - line = [mandelbrot(start + n*step.real) for n in range(width)] - print ''.join(line) - start += complex(0, step.imag) - -def f8(): - try: - x = 1.0 / 0.0 - #except StandardError, e: - # print "in except clause:", e - finally: - print "in finally clause" - x = 5 - print "x is now", x - -def f9(n): - for i in range(n): - print i, - print - -def f10(): - apply(f9, (50,)) - - -def go(f, *args): - print '-'*80 - v1, t1 = time(psyco.proxy(f), *args) - print v1 - print '^^^ computed by Psyco in %s seconds' % t1 - v2, t2 = time(f, *args) - if v1 == v2: - if t1 and t2: - s = ', Psyco is %.2f times faster' % (t2/float(t1)) - else: - s = '' - print 'Python got the same result in %s seconds%s' % (t2, s) - else: - print v2 - print '^^^ by Python in %s seconds' % t2 - print '*'*80 - print '!!! different results !!!' - -def go1(arg=2117): - go(f1, arg) - -FILEPATH = '../c' -FILELIST = [os.path.join(FILEPATH, s) for s in os.listdir(FILEPATH)] -FILELIST = [s for s in FILELIST if os.path.isfile(s) and s!='psyco.dump'] - -def go4(arg=FILELIST): - go(f4, arg) - -def go5(arg=FILELIST): - go(f5, arg) - -def go6(n=100000, p=100000000000001L): - go(f6, n, p) - -def go7(start=-2-1j, end=1+1j, step=0.04+0.08j): - go(f7, start, end, step) - - -def f11(prefix): - #prefix = [60, 115, 116, 114, 114, 114, 114, 62] - - table = [-1] + ([0]*len(prefix)) - for i in range(len(prefix)): - table[i+1] = table[i]+1 - while table[i+1] > 0 and prefix[i] != prefix[table[i+1]-1]: - table[i+1] = table[table[i+1]-1]+1 - #code.extend(table[1:]) # don't store first entry - print table[1:] - -def f12(arg): - def g(x, y=arg): - return x+y - return g(123) - -def f13(arg): - x,y = arg - print x, y - u,v = x,y - print u, v - return v,u - -def f15(x): - print x - -def f14(n): - f15(n==5) - -def f16(x): - return ~x - -def f17(x, y=0, *args): - return x, y, args - -#def f18(): -# yield 5 -# yield 6 - -def f19(seq): - class C: - def __init__(self): - print "hello" - c = C() - seq = list(seq) - seq1 = seq - seq *= 3 - n = seq[0] - n /= 3 - return seq, seq1 is seq, n - -def f20(code, n, fill=0): - a = array.array(code, [fill]*n) - for i in range(n): - item = i*10 - if code == 'c': - item = chr(item) - a[i] = item - return [a[i] for i in range(len(a))] - -def f21(lst): - return operator.indexOf(lst, 9) - -def f22(n): - try: - x = 1/n - except: - print "Catch!" - -def f23(n): - f22(n) - try: - x = undefined_name - except: - f22(n) - print sys.exc_type.__name__ - -def f24(n): - return 1/n - -def f25(n): - try: - return f24(n) - except AttributeError: - auwsziazsi - -def f26(): - import psyco.classes - import array - import urllib - from types import FloatType, ListType - from psyco.core import full - return FloatType, ListType, urllib, psyco.classes, full - -def test_getframe(): - import sys - i = 0 - print 'test_getframe():' - while 1: - try: - f = sys._getframe(i) - except ValueError: - break - #print '%-26s %-60s %-40s' % (f, f.f_code, f.f_locals.keys()) - print f.f_code.co_name.replace('', '?') - i += 1 - -def test_getframe1(): - return test_getframe() -psyco.cannotcompile(test_getframe1) - -def test_getframe_b(): - import sys - i = 0 - print 'test_getframe_b():' - f = sys._getframe() - while f is not None: - print f.f_code.co_name.replace('', '?') - f = f.f_back # walk the stack with f_back - -def test_getframe_b1(): - return test_getframe_b() -psyco.cannotcompile(test_getframe_b1) - -def f28(): - test_getframe() - return N - -def f27(): - global N - N = 5 - a = f28() - N = 6 - b = f28() - N = 7 - c = f28() - return a,b,c - -def f28_1(): - test_getframe1() - return N - -def f27_1(): - global N - N = 51 - a = f28_1() - N = 61 - b = f28_1() - N = 71 - c = f28_1() - return a,b,c - -def f28_b(): - test_getframe_b() - return N - -def f27_b(): - global N - N = 95 - a = f28_b() - N = 96 - b = f28_b() - N = 97 - c = f28_b() - return a,b,c - -def f28_b1(): - test_getframe_b1() - return N - -def f27_b1(): - global N - N = 951 - a = f28_b1() - N = 961 - b = f28_b1() - N = 971 - c = f28_b1() - return a,b,c - -def f29(lst): - lst = lst[:] - del lst[2] - lst[3] = 6 - return lst - -def f30(): - Baz - -def f31(): - f30() - -def f32(p): - if p[1:2] == ':': - return p[0:2], p[2:] - return '', p - -def f33(n): - if ((n+1) & n) == 0: - print n - -def f34(m=2000000): - for i in xrange(m): - f33(i) - -def f35(): - try: - import Numeric - except ImportError: - print "[[5 5 5]" - print " [5 5 5]" - print " [5 5 5]]" - else: - a = Numeric.zeros((3,3)) - a += 5 - print a - -def f36(): - class X: - pass - class Y(X): - pass - return Y(), Y.__module__, __in_psyco__ - -def f37(x): - print 'ZERO' in globals().keys() - dir() - print eval('ZERO+1') - -def f38(n): - f = f1 - r = [ - f(n, *[]), - f(n), - apply(f, (n,)), - apply(f, [n]), - f(*(n,)), - f(*[n]), - f(n=n), - f(**{'n': n}), - apply(f, (n,), {}), - apply(f, [n], {}), - f(*(n,), **{}), - f(*[n], **{}), - f(n, **{}), - f(n, *[], **{}), - f(n=n, **{}), - f(n=n, *[], **{}), - f(*(n,), **{}), - f(*[n], **{}), - f(*[], **{'n':n}), - ] - return r - -if __name__ == "__main__": - print "Break!" - sleep(0.5) - #go(f36) - #go(f38, 100) - psyco.full() - try: - print f35() - #f23(0.0) - finally: - psyco.dumpcodebuf() diff --git a/nodebox/ext/psyco/src/test/test5.py b/nodebox/ext/psyco/src/test/test5.py deleted file mode 100644 index 4c8ae5e..0000000 --- a/nodebox/ext/psyco/src/test/test5.py +++ /dev/null @@ -1,453 +0,0 @@ -import psyco, dis, types, sys, math - -def f(filename, mode='r'): - s = "" - for line in open(filename, mode).readlines(): - s += "! " + line # extreme optimization case - return s - -def f2(x, y, z): - coords = (x, y) - if type(z) is types.IntType: - coords += (z,) - else: - coords += z - a, b, c = coords - return c, b, a - -def f3(x, y): - return x << y, x << 1, x << 31, x >> y, x >> 1, x >> 31 - -def f4(s): - return "abc" + s - -def double2(x): - return x * 2 - -def overflowtest(): - n = double2(-1925703681) - return `n` - -def booltest(): - True,False = 1==1,1==0 - print 'abcdefghijklmnop'=='abcdefghijklMNop' - print 'abcdefghijklmnop'=='abcdefghijklmnop' - print str('abcdefghijklmnop'=='abcdefghijklMNop') - print str('abcdefghijklmnop'=='abcdefghijklmnop') - print (lambda x: x==1)(0) - print (lambda x: x==1)(1) - print [a & b for a in (False,True) for b in (False,True)] - print [a | b for a in (False,True) for b in (False,True)] - print [a ^ b for a in (False,True) for b in (False,True)] - print not (False in ()) - -def exc_test(): - try: - failure = [][1] # opcode 9, line 2 from the start of the function - except: - exc, value, tb = sys.exc_info() - print exc.__name__, str(value) - print tb.tb_lineno - tb.tb_frame.f_code.co_firstlineno - -def seqrepeat(): - for i in [5, 6L, -999]: - print `i*'abc'` - print `'abc'*i` - print i*[3,'z'] - print [6,3]*i - print `('y'*i) + 'x'` - -def inplacerepeat(): - l = l1 = range(100) - l *= 2 - return l is l1 - -def g5(x): - return x+1 - -def f5(n): - "Function inlining tests" - print g5(n) - print g5(n) - print g5(3) - print g5(x=n) - -def g6(x): - if x != 3: - return x+1 - else: - return None - -def g6bis(n): - return range(2, 50)[n] - -def f6(n): - "Function inlining tests" - try: - print g6(n) - print g6(n) - print g6(3) - print g6(x=n) - print g6bis(n) - except: - print sys.exc_type.__name__ - -def g7(x, *args): - if not g7len(args): - last = g5(0) - else: - last = args[-1] - return last * x - -def g7bis(tuple): - return 0.0 - -def f7(n): - global g7len - g7len = len - "Function inlining tests" - print [g7(n), 5*g7(3,4,5), g7(*((11,)*5))] - g7len = g7bis - print [g7(n), 5*g7(3,4,5), g7(*((11,)*5))] - -def g8(x, *args): - return g7len(args) * x - -def f8(n): - global g7len - g7len = len - "Function inlining tests" - print [g8(n), 5*g8(3,4,5), g8(*((11,)*5))] - g7len = g7bis - print [g8(n), 5*g8(3,4,5), g8(*((11,)*5))] - -def f9(n): - return g5(3), g5(n) - - -# virtual string tests - -TEST = ['userhru', 'uiadsfz', '', '1', 'if', '623', 'opad', 'oa8ua', - '09q34rx093q', '\x00', - 'qw09exdqw0e9dqw9e8d8qw9r8qw', '', - '\x1d\xd7\xae\xa2\x06\x10\x1a\x00a\xff\xf6\xee\x15\xa2\xea\x89', - 'akjsdfhqweirewru 3498cr 3849rx398du389du389dur398d31623'] - -def s1(): - s = '' - for t in TEST: - s += t - return s - -def s2(): - return "some" + "another" - -def s3(): - return TEST[0] + '.' - -def s4(): - return '.' + TEST[0] - -def s5(): - return TEST[0] + (TEST[1] + TEST[2]) - -def s6(): - s = '' - for t in TEST: - s = t + s - return s - -def s7(): - return int(TEST[-1][5:10] == 'fhqwe') - -def s8(): - return TEST[-2][5:10][3] - -def s9(): - return TEST[-1][:-1][1:][2:-3] - -def s10(): - return int('t' < TEST[1][:1] == 'u') - -def s11(): - return int('ia' == TEST[1][1:3] < 'ib' and - 'dsf' == TEST[1][-4:-1] < 'dsf!' and - 'dsfz' == TEST[1][-4:] <= 'dsfz') - -def s12(): - return int(TEST[0] + TEST[1] != 'userhruuiadsfz') - -def s13(): - return int(TEST[3] + TEST[5] == TEST[-1][-4:]) - -def teststrings(): - print `s1()` - print `s2()` - print `s3()` - print `s4()` - print `s5()` - print `s6()` - print `s7()` - print `s8()` - print `s9()` - print `s10()` - print `s11()` - print `s12()` - print `s13()` - -def testslices(s): - "Test the various paths the code can take in pstring_slice()." - print `s[:-9999]` - print `s[:9999]` - print `s[:]` - print `s[-9999:-9999]` - print `s[-9999:9999]` - print `s[-9999:]` - print `s[1:-9999]` - print `s[1:9999]` - print `s[1:]` - print `s[9999:-9999]` - print `s[9999:9999]` - print `s[9999:]` - -def testovf(x, y): - print x+y - print 2000000000+y - print x+2000000000 - print x-y - print 2000000000-y - print x-2000000000 - print x*y - print 2000000000*y - print x*2000000000 - print x - print -x - print abs(x) - -def rangetypetest(n): - print type(range(n)).__name__ - print type(range(2, n)).__name__ - print type(range(n, 2, -1)).__name__ - print type(xrange(n)).__name__ - print type(xrange(2, n)).__name__ - print type(xrange(n, 2, -1)).__name__ - -def rangetest(n): - for i in range(n): - print i, - print - for i in range(10, n): - print i, - print - for i in range(n, 10, -1): - print i, - print - -def xrangetest(n): - for i in xrange(n): - print i, - print - for i in xrange(10, n): - print i, - print - for i in xrange(n, 10, -1): - print i, - print - -def longrangetest(): - L = 1234567890123456789L - if sys.hexversion >= 0x02030000: - print range(L, L+2) - else: - print [L, L+1] - -def proxy_defargs(): - d = {} - exec """ -def f(): - g() -def g(a=12): - print a -""" in d - d['f'] = psyco.proxy(d['f']) - d['g'] = psyco.proxy(d['g']) - d['f']() - -def setfilter(): - def f1(): - return ('f1', int(__in_psyco__)) - def f2(): - "TAGGY" - return ('f2', int(__in_psyco__)) - def myfilter(co): - return co.co_consts[0] != 'TAGGY' - psyco.setfilter(myfilter) - try: - print psyco.proxy(f1)() # ('f1', 1) - print psyco.proxy(f2)() # ('f2', 0) - finally: - prev = psyco.setfilter(None) - assert prev is myfilter - -if sys.version_info < (2,3): - def arraytest(): - print "S" -else: - def arraytest(): - import array - class S(array.array): pass - print type(S('i')).__name__ - - -class CompositeElement: - def __init__(self): - self.children = [] - - def append(self, child): - self.children.append(child) - return self - -def makeSelection(): - """Segfault bug (thanks xorAxAx)""" - result = CompositeElement() - result.append(CompositeElement().append(42)) - print 'do stuff here' - assert isinstance(result.children[0], CompositeElement) - -class Class1: - __metaclass__ = type -def class_creation_1(n=400000): - for i in xrange(n): - Class1() - print "ok" - -class Class2: - __metaclass__ = type - def __init__(self, a): - self.a = a -def class_creation_2(n=400000): - for i in xrange(n): - c = Class2(i) - assert c.a == i - print "ok" - -class Class3: - __metaclass__ = type - def __init__(self): - return 42 -def class_creation_3(): - try: - Class3() - except TypeError: - if (2,2) <= sys.version_info < (2,5): - print "got a TypeError, but new-style classes don't" - print "check the __init__() return value before 2.5" - else: - print "ok" - else: - if (2,2) <= sys.version_info < (2,5): - print "ok" - else: - print "__init__() => 42: should have raised TypeError!" - -class Class4: - __metaclass__ = type - def __init__(self, a=None): - self.a = a -def class_creation_4(n=200000): - for i in xrange(n): - c = Class4(a=i) - assert c.a == i - print "ok" - -def power_int(n=2000): - for j in range(n): - x = 0 - for i in range(1000): - x += i ** 2 - print x - -def power_int_long(n=200): - for j in range(n): - x = 0 - for i in range(1000): - x += i ** 2L - print type(x).__name__[:4], int(x) - -def power_float(n=500): - for j in range(n): - x = 0.0 - for i in range(1000): - x += i ** 1.409999992 - print type(x).__name__, int(x) - -def conditional_doubletest_fold(): - n = sys.getrefcount(conditional_doubletest_fold) # anything > 0 - if n < 0 and expression_not_evaluated: - print "BUG" - else: - print "ok(1)" - n = sys.getrefcount(conditional_doubletest_fold) # anything > 0 - if n >= 0 or expression_not_evaluated: - print "ok(2)" - else: - print "BUG" - -def importname(value): - for v in value: - import sys - print "Ok" - -def sharedlists(n): - if n > 5: - a = b = [4, 5] - else: - a = [4, 5] - b = [4, 5] - double2(21) - a[0] = 8 - print b[0] - -def variousslices(): - class X(object): - def __getitem__(self, x): - print x - class Y(object): - def __getitem__(self, x): - print x - def __getslice__(self, i, j): - print i, j - for o in [X(), Y()]: - o[4:] - o[:7] - o[9:'hello'] - o['world':] - o[1:10:'hello'] - -def listgetitem(): - class X(list): - def __getitem__(self, key): - return key - x = X(["Ok"]) - print x["foobar"] - for item in x: - print item - -def negintpow(x): - print x ** -2 - -if __name__ == '__main__': - from test1 import go, print_results - import time - print "break!" - time.sleep(0.5) - #go(class_creation_1) - #go(class_creation_2) - #go(class_creation_3) - #go(class_creation_4) - #go(power_int) - #go(power_int_long) - #go(power_float) - psyco.proxy(negintpow)(8) - psyco.dumpcodebuf() - print_results() diff --git a/nodebox/ext/psyco/src/test/test_base.py b/nodebox/ext/psyco/src/test/test_base.py deleted file mode 100755 index 5cfc419..0000000 --- a/nodebox/ext/psyco/src/test/test_base.py +++ /dev/null @@ -1,92 +0,0 @@ -#! /usr/bin/env python - -""" Run base Psyco tests. -""" - -import sys, os, random, doctest, cStringIO -True,False = 1==1,1==0 - - -SEPARATOR = """ -========== %r ========== -""" -LASTLINE = "Tests completed." -BUFFERFILE = "buffer-basetests.txt" -EXPECTEDFILE = "expected-basetests.txt" -INPUTSCRIPT = "input-basetexts.py" - -TESTS = open('btrun.py', 'r').read() - - -if hasattr(doctest, '_extract_examples'): - tests = doctest._extract_examples(TESTS) -else: - examples = doctest.DocTestParser().get_examples(TESTS) - tests = [(example.source, example.want, example.lineno) - for example in examples] - -# --- - -def main(quiet=False): - PRELUDE = '' - for inp, outp, line in tests[:]: - if not outp: - PRELUDE += inp + '\n' - tests.remove((inp, outp, line)) - random.shuffle(tests) # first run all tests in any order - tests_again = tests[:] - random.shuffle(tests_again) - all_tests = tests + tests_again # then run them all again in any other order - - childin = open(INPUTSCRIPT, 'w') - expected = open(EXPECTEDFILE, 'w') - - print >> childin, 'import sys' - print >> childin, PRELUDE - - def filterline(line): - if line.startswith('${') and line.endswith('}'): - line = str(eval(line[2:-1])) - return line - - for inp, outp, line in all_tests: - sep = SEPARATOR % inp - print >> childin, 'print %r' % sep - if not quiet: - print >> childin, 'print >> sys.stderr, %r' % inp.strip() - print >> expected, sep - print >> childin, inp - outplines = [filterline(line) for line in outp.split('\n')] - expected.write('\n'.join(outplines)) - - print >> childin, 'print %r' % LASTLINE - print >> expected, LASTLINE - expected.close() - childin.close() - - # run in a child process - err = os.system('"%s" %s > %s' % (sys.executable, INPUTSCRIPT, BUFFERFILE)) - print >> sys.stderr - if err: - print >> sys.stderr, 'FAIL: child process returned %d, %d' % (err>>8, err&255) - sys.exit(1) - else: - data1 = open(EXPECTEDFILE, 'r').read() - data2 = open(BUFFERFILE, 'r').read() - if data1 != data2: - print >> sys.stderr, 'FAIL: different output' - if sys.argv[1:2] != ['-q']: - cmd = 'diff -c %s %s' % (EXPECTEDFILE, BUFFERFILE) - os.system(cmd) - return False - else: - print >> sys.stderr, 'Passed.' - return True - -def test_main(): - ok = main(quiet=True) - assert ok - -if __name__ == '__main__': - if not main(): - sys.exit(1) diff --git a/nodebox/ext/psyco/src/test/test_compactobject.py b/nodebox/ext/psyco/src/test/test_compactobject.py deleted file mode 100644 index 27b4d7b..0000000 --- a/nodebox/ext/psyco/src/test/test_compactobject.py +++ /dev/null @@ -1,280 +0,0 @@ -from __future__ import generators -import os, sys, random -import psyco - - -def do_test_1(objects): - d = [{} for i in range(20)] - s = [psyco.compact() for i in range(20)] - attrnames = list('abcdefghijklmnopqrstuvwxyz') - for j in range(5000): - i = random.randrange(0, 20) - attr = random.choice(attrnames) - if random.randrange(0, 2): - if attr in d[i]: - if random.randrange(0,5) == 3: - delattr(s[i], attr) - del d[i][attr] - else: - assert d[i][attr] == getattr(s[i], attr) - else: - try: - getattr(s[i], attr) - except AttributeError: - pass - else: - raise AssertionError, attr - else: - obj = random.choice(objects) - setattr(s[i], attr, obj) - d[i][attr] = obj - for i in range(20): - d1 = {} - for attr in attrnames: - try: - d1[attr] = getattr(s[i], attr) - except AttributeError: - pass - assert d[i] == d1 - -def do_test(n, do_test_1=do_test_1): - random.jumpahead(n*111222333444555666777L) - N = 1 - TAIL = 'lo' - objects = [None, -1, 0, 1, 123455+N, -99-N, - 'hel'+TAIL, [1,2], {(5,): do_test}, 5.43+0.01*N, xrange(5)] - do_test_1(objects) - for o in objects[4:]: - #print '%5d -> %r' % (sys.getrefcount(o), o) - assert sys.getrefcount(o) == 4 - -psyco.cannotcompile(do_test) - - -def subprocess_test(n): - sys.stdout.flush() - childpid = os.fork() - if not childpid: - do_test(n) - sys.exit(0) - childpid, status = os.wait() - return os.WIFEXITED(status) and os.WEXITSTATUS(status) == 0 - -##def test_compact_stress(repeat=20): -## for i in range(repeat): -## yield subprocess_test, i - -# ____________________________________________________________ - -def read_x(k): - return k.x + 1 - -def read_y(k): - return k.y - -def read_z(k): - return k.z - -psyco.bind(read_x) -psyco.bind(read_y) - -def pcompact_test(): - k = psyco.compact() - k.x = 12 - k.z = None - k.y = 'hello' - print read_x(k) - print read_y(k) - print read_z(k) - #psyco.dumpcodebuf() - -def pcompact_creat(obj): - base = sys.getrefcount(obj) - items = [] - for i in range(11): - k = psyco.compact() - k.x = (0,i,i*2) - k.y = i+1 - k.z = None - k.t = obj - k.y = i+2 - k.y = i+3 - print k.x, k.y, k.z, k.t - items.append(k) - del k - print sys.getrefcount(obj) - base - del items[:] - print sys.getrefcount(obj) - base - -psyco.bind(pcompact_creat) - -def pcompact_modif(obj): - base = sys.getrefcount(obj) - for i in range(21): - k = psyco.compact() - #k.x = i+1 - #k.y = (i*2,i*3,i*4,i*5,i*6,i*7) - k.x = obj - print k.x, - print sys.getrefcount(obj) - base, - k.x = i+1 - print sys.getrefcount(obj) - base, - print k.x - #k.x = len - #k.x = i+2 - #print k.x, k.y - print sys.getrefcount(obj) - base - -psyco.bind(pcompact_modif) - -# ____________________________________________________________ - -class Rect(psyco.compact): - def __init__(self, w, h): - self.w = w - self.h = h - def getarea(self): - return self.w * self.h - -def test_rect(): - assert Rect(10, 12).getarea() == 120 - assert Rect(0.5, 2.5).getarea() == 1.25 - assert Rect([1,2,3], 2).getarea() == [1,2,3,1,2,3] - -class ClassWithNoInit(psyco.compact): - pass - -def test_init_arguments(): - import py - def f1(): Rect() - def f2(): psyco.compact(12) - def f3(): ClassWithNoInit(21) - py.test.raises(TypeError, f1) - if sys.version >= (2, 3): - py.test.raises(TypeError, f2) - py.test.raises(TypeError, f3) - py.test.raises(TypeError, psyco.proxy(f1)) - if sys.version >= (2, 3): - py.test.raises(TypeError, psyco.proxy(f2)) - py.test.raises(TypeError, psyco.proxy(f3)) - -def test_special_attributes(): - missing = object() - r = Rect(6, 7) - assert r.__members__ == ['w', 'h'] - assert r.__dict__.items() == [('w', 6), ('h', 7)] - assert r.__dict__ == {'w': 6, 'h': 7} - assert {'w': 6, 'h': 7} == r.__dict__ - assert list(r.__dict__) == ['w', 'h'] - del r.__dict__['w'] - assert getattr(r, 'w', missing) is missing - assert r.h == 7 - assert r.__members__ == ['h'] - assert r.__dict__.items() == [('h', 7)] - assert r.__dict__ == {'h': 7} - assert {'h': 7} == r.__dict__ - assert list(r.__dict__) == ['h'] - del r.h - assert r.__members__ == [] - assert getattr(r, 'w', missing) is missing - assert getattr(r, 'h', missing) is missing - -def test_inheritance(): - class X(psyco.compact): - pass - class Y(psyco.compact): - pass - class Z(X): - pass - x = X() - x.a = 5 - assert [s for s in dir(x) if not s.startswith('__')] == ['a'] - x.__class__ = Y - assert type(x) is Y - assert x.__class__ is Y - assert Y.__bases__ == (psyco.compact,) - assert Z.__bases__ == (X,) - if sys.version >= (2,3): # can't assign to __bases__ in Python 2.2 - Z.__bases__ = (Y,) - assert Z.__bases__ == (Y,) - -psyco.cannotcompile(test_inheritance) # because of type mutation - -def test_data_descr(): - global done - done = [] - class X(psyco.compact): - def g(self): done.append('g') - def s(self, value): done.append(value) - def d(self): done.append('d') - a = property(g,s,d) - x = X() - x.__dict__['a'] = 'this is hidden' - r = x.a - assert r is None - x.a = 123 - del x.a - del x.a - assert done == ['g', 123, 'd', 'd'] - assert x.__dict__ == {'a': 'this is hidden'} - x.__dict__ = {'a': 'this too'} - assert x.__dict__ == {'a': 'this too'} - assert done == ['g', 123, 'd', 'd'] - -def test_ass_dict(): - missing = object() - x = psyco.compact() - x.a = 5 - assert x.__dict__ == {'a': 5} - x.__dict__ = {'b': 6} - assert x.b == 6 - assert getattr(x, 'a', missing) is missing - assert x.__dict__ == {'b': 6} - y = psyco.compact() - y.__dict__ = x.__dict__ - assert y.__dict__ == {'b': 6} - y.__dict__ = y.__dict__ - assert y.__dict__ == {'b': 6} - -def test_with_psyco(): - yield psyco.proxy(test_rect) - yield psyco.proxy(test_special_attributes) - yield psyco.proxy(test_data_descr) - -def test_compact_stress(repeat=20): - for i in range(repeat): - yield do_test, i - -rect1 = Rect(0, 0) - -def test_constant_obj(): - def f1(): - return rect1.w * rect1.h - def f2(a): - rect1.w = a - psyco.bind(f1) - psyco.bind(f2) - rect1.w = 6 - rect1.h = 7 - res = f1() - assert res == 42 - f2(4) - res = f1() - assert res == 28 - f2(0.5) - res = f1() - assert res == 3.5 - -# ____________________________________________________________ - -if __name__ == '__main__': - import time; print "break!"; time.sleep(1) - #subprocess_test(10) - #pcompact_test() - #pcompact_creat('hel' + 'lo') - #pcompact_modif('hel' + 'lo') - #test_constant_obj() - psyco.proxy(test_rect)() - #psyco.proxy(test_special_attributes)() - #psyco.proxy(test_data_descr)() - psyco.dumpcodebuf() diff --git a/nodebox/ext/psyco/src/test/test_misc.py b/nodebox/ext/psyco/src/test/test_misc.py deleted file mode 100644 index 9758b70..0000000 --- a/nodebox/ext/psyco/src/test/test_misc.py +++ /dev/null @@ -1,102 +0,0 @@ -import py, sys, psyco - - -def test_index(): - if sys.version_info < (2, 5): - py.test.skip("for Python 2.5") - - class X(object): - def __index__(self): - return -3 - - def f(x): - return (12, 23, 34, 45)[x] - - res = psyco.proxy(f)(X()) - assert res == 23 - - -def test_index_slice(): - if sys.version_info < (2, 5): - py.test.skip("for Python 2.5") - - class Observer(object): - def __getslice__(self, i, j): - return "slice", i, j - def __getitem__(self, x): - raise Exception("in __getitem__") - class X(object): - def __index__(self): - return 5 - class Y(object): - def __index__(self): - return -2 - - def f(o, x, y): - return o[x:y] - - res = psyco.proxy(f)(Observer(), X(), Y()) - assert res == ("slice", 5, -2) - -def test_index_repeat(): - if sys.version_info < (2, 5): - py.test.skip("for Python 2.5") - - class X(object): - def __index__(self): - return 3 - - def f(x): - return (12, 23) * x - - res = psyco.proxy(f)(X()) - assert res == (12, 23, 12, 23, 12, 23) - -def test_slice_overflow(): - class X(object): - def __len__(self): - return sys.maxint - def __getslice__(self, i, j): - return i, j - def f(X): - return X()[-(2**100):2**100] - - res = psyco.proxy(f)(X) - assert res == f(X) - -def test_id(): - def f(x): - return id(x) - obj = [] - res = psyco.proxy(f)(obj) - assert res == id(obj) - -def test_math_module(): - import math - global _operation - for name in ["acos", "asin", "atan", "ceil", "cos", "cosh", "exp", - "fabs", "floor", "sin", "sinh", "sqrt", "tan", "tanh"]: - _operation = getattr(math, name) - - def tester(a): - return _operation(a) - res = psyco.proxy(tester)(0.17) - assert abs(res - _operation(0.17)) < 1e6 - - def tester(a): - return _operation(*a) - res = psyco.proxy(tester)((0.71,)) - assert abs(res - _operation(0.71)) < 1e6 - - for name in ["atan2", "fmod", "hypot", "pow"]: - _operation = getattr(math, name) - - def tester(a, b): - return _operation(a, b) - res = psyco.proxy(tester)(0.17, 0.081) - assert abs(res - _operation(0.17, 0.081)) < 1e6 - - def tester(a): - return _operation(*a) - res = psyco.proxy(tester)((0.71, 0.2643)) - assert abs(res - _operation(0.71, 0.2643)) < 1e6 diff --git a/nodebox/ext/psyco/support.py b/nodebox/ext/psyco/support.py deleted file mode 100644 index a61224e..0000000 --- a/nodebox/ext/psyco/support.py +++ /dev/null @@ -1,193 +0,0 @@ -########################################################################### -# -# Psyco general support module. -# Copyright (C) 2001-2002 Armin Rigo et.al. - -"""Psyco general support module. - -For internal use. -""" -########################################################################### - -import sys, _psyco, __builtin__ - -error = _psyco.error -class warning(Warning): - pass - -_psyco.NoLocalsWarning = warning - -def warn(msg): - from warnings import warn - warn(msg, warning, stacklevel=2) - -# -# Version checks -# -__version__ = 0x010502f0 -if _psyco.PSYVER != __version__: - raise error, "version mismatch between Psyco parts, reinstall it" - -version_info = (__version__ >> 24, - (__version__ >> 16) & 0xff, - (__version__ >> 8) & 0xff, - {0xa0: 'alpha', - 0xb0: 'beta', - 0xc0: 'candidate', - 0xf0: 'final'}[__version__ & 0xf0], - __version__ & 0xf) - - -VERSION_LIMITS = [0x02020200, # 2.2.2 - 0x02030000, # 2.3 - 0x02040000] # 2.4 - -if ([v for v in VERSION_LIMITS if v <= sys.hexversion] != - [v for v in VERSION_LIMITS if v <= _psyco.PYVER ]): - if sys.hexversion < VERSION_LIMITS[0]: - warn("Psyco requires Python version 2.2.2 or later") - else: - warn("Psyco version does not match Python version. " - "Psyco must be updated or recompiled") - -PYTHON_SUPPORT = hasattr(_psyco, 'turbo_code') - - -if hasattr(_psyco, 'ALL_CHECKS') and hasattr(_psyco, 'VERBOSE_LEVEL'): - print >> sys.stderr, ('psyco: running in debugging mode on %s' % - _psyco.PROCESSOR) - - -########################################################################### -# sys._getframe() gives strange results on a mixed Psyco- and Python-style -# stack frame. Psyco provides a replacement that partially emulates Python -# frames from Psyco frames. The new sys._getframe() may return objects of -# a custom "Psyco frame" type, which is a subtype of the normal frame type. -# -# The same problems require some other built-in functions to be replaced -# as well. Note that the local variables are not available in any -# dictionary with Psyco. - - -class Frame: - pass - - -class PythonFrame(Frame): - - def __init__(self, frame): - self.__dict__.update({ - '_frame': frame, - }) - - def __getattr__(self, attr): - if attr == 'f_back': - try: - result = embedframe(_psyco.getframe(self._frame)) - except ValueError: - result = None - except error: - warn("f_back is skipping dead Psyco frames") - result = self._frame.f_back - self.__dict__['f_back'] = result - return result - else: - return getattr(self._frame, attr) - - def __setattr__(self, attr, value): - setattr(self._frame, attr, value) - - def __delattr__(self, attr): - delattr(self._frame, attr) - - -class PsycoFrame(Frame): - - def __init__(self, tag): - self.__dict__.update({ - '_tag' : tag, - 'f_code' : tag[0], - 'f_globals': tag[1], - }) - - def __getattr__(self, attr): - if attr == 'f_back': - try: - result = embedframe(_psyco.getframe(self._tag)) - except ValueError: - result = None - elif attr == 'f_lineno': - result = self.f_code.co_firstlineno # better than nothing - elif attr == 'f_builtins': - result = self.f_globals['__builtins__'] - elif attr == 'f_restricted': - result = self.f_builtins is not __builtins__ - elif attr == 'f_locals': - raise AttributeError, ("local variables of functions run by Psyco " - "cannot be accessed in any way, sorry") - else: - raise AttributeError, ("emulated Psyco frames have " - "no '%s' attribute" % attr) - self.__dict__[attr] = result - return result - - def __setattr__(self, attr, value): - raise AttributeError, "Psyco frame objects are read-only" - - def __delattr__(self, attr): - if attr == 'f_trace': - # for bdb which relies on CPython frames exhibiting a slightly - # buggy behavior: you can 'del f.f_trace' as often as you like - # even without having set it previously. - return - raise AttributeError, "Psyco frame objects are read-only" - - -def embedframe(result): - if type(result) is type(()): - return PsycoFrame(result) - else: - return PythonFrame(result) - -def _getframe(depth=0): - """Return a frame object from the call stack. This is a replacement for -sys._getframe() which is aware of Psyco frames. - -The returned objects are instances of either PythonFrame or PsycoFrame -instead of being real Python-level frame object, so that they can emulate -the common attributes of frame objects. - -The original sys._getframe() ignoring Psyco frames altogether is stored in -psyco._getrealframe(). See also psyco._getemulframe().""" - # 'depth+1' to account for this _getframe() Python function - return embedframe(_psyco.getframe(depth+1)) - -def _getemulframe(depth=0): - """As _getframe(), but the returned objects are real Python frame objects -emulating Psyco frames. Some of their attributes can be wrong or missing, -however.""" - # 'depth+1' to account for this _getemulframe() Python function - return _psyco.getframe(depth+1, 1) - -def patch(name, module=__builtin__): - f = getattr(_psyco, name) - org = getattr(module, name) - if org is not f: - setattr(module, name, f) - setattr(_psyco, 'original_' + name, org) - -_getrealframe = sys._getframe -sys._getframe = _getframe -patch('globals') -patch('eval') -patch('execfile') -patch('locals') -patch('vars') -patch('dir') -patch('input') -_psyco.original_raw_input = raw_input -__builtin__.__in_psyco__ = 0==1 # False - -if hasattr(_psyco, 'compact'): - import kdictproxy - _psyco.compactdictproxy = kdictproxy.compactdictproxy diff --git a/nodebox/ext/setup.py b/nodebox/ext/setup.py deleted file mode 100644 index 6e3f7d5..0000000 --- a/nodebox/ext/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -from distutils.core import setup, Extension - -bezier = Extension("bezier", sources=["bezier.c"]) -geometry = Extension("geometry", sources=["geometry.c"]) -noise = Extension("noise", sources=["noise.c"]) - -setup( - name = "extensions", - version = "1.0", - author = "Tom De Smedt, Frederik De Bleser", - description = "Fast C Bezier, geometry and noise math.", - ext_modules = [bezier, geometry, noise] -) \ No newline at end of file diff --git a/nodebox/font/Droid Sans Mono.ttf b/nodebox/font/Droid Sans Mono.ttf deleted file mode 100644 index 6e79dad17fc95ac20b6f52097f70b2ca652316f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117072 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 diff --git a/nodebox/font/Droid Sans.ttf b/nodebox/font/Droid Sans.ttf deleted file mode 100644 index 767c63ad000e3eea20f3cb7a43ba9f4154ed7a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190044 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%0D=-PBu&{ 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 diff --git a/nodebox/font/Droid Serif-BoldItalic.ttf b/nodebox/font/Droid Serif-BoldItalic.ttf deleted file mode 100644 index 9d8e798b041a7abb86acd2ebb61be7bf11898a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189916 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

%(YI$knULGlShzQ%lqVQEhDH4F!+aHdLE zl|U2X=d1V%GzQgl6{9O?xlgb3@-C}Oujjz&AQ9bd#ioFCeNw0@5t#GP>^&N{|Ykm9wn#OKrF^eaF4lW?!_+LLdCw{N^|*IhSUc9a|YEE@24{OMO%+za3P zB{9P*jG*rNmuXNJTH>CmJ@PH`EOMSAOkXaH9M}K@SEjj;DKxkM6BRaC?Pj~ZP@^^l zd>#+W@U%kwxwQVdbklQGt@qS@2D6Aro9MABut}62l7m&a zvEalG?VBG7D}{UfyDu&H-6Xkne$kdK)`xy~SLCA2w(tK|_T(2fdxhVg5}ulTykg6k zhr~{iS~mOfKjy8dV>wbtoc#-yHcXxtJ{JCh@eEBJM7O}7Al4URHs%6WmCC5~F^r4X z@;b+W9JxG^F$CDzppH(f&P;`bL#6LBTa8w$wm@a|dHi_kak(&5+AV|*H8wNWm^jno z<|D2Ij9eUae!RQ^F&a9yu%U8#v~WC1qeW-$t27s_*OH~e3&KZ+jcawn9VCHLmv-;= z>jwR8o!*PCE)qlIobDv+tZp!rn)~D=(l*iMu$U%IF-5|Kgq6SW8>^-7u@u{nLwbu*WxzP_=H<)>M|PZ zdimCPtfZv5-Q;$|RjuAF*TJEP>cF%U$|U$#vb!J}f!_f+K(%=~-28k~Q9wg^_>b8K zuN$CLik0h-@Zz2e2vU&=(u4*vW`geWGXXvm`fbtO`%}R^@J8TFa8D5`DcSYqFW1g1 zQSB>zcuUv8gIgxQQuxK9qPFDfuL<8scOmlk%7dBaKmJSD?~}_O5I&rV`YGiZ8RXp=KAynefIgu*Z@#H_66}qX( zIml)sLTA%)Z%MlV>-wjItRlvfD4w$NlIbZ??kjru;;t`YN^aJDv7mL^>g)DKUi`r? zx9&>*@K-ng_}9W6!b@+A9{!EcNahmVrC)y`R(HuapMQ3z{3UTNuDn~Ei)f}m5e=?c z-2bK1OI{@3Ale5`?b*2f^=E_=!loNLSe(n_g! z{v+ih9eAg3?Jynm&uknQcoT30&>{tm2 zNG44@7)mArKHe2#D5a6>la3W7bpb?uQJEkTxyT;V`{Mf0bTmBu`xzpG1GCAFAd(tp z268G!uV-~SliNXMuis?vaufwVFp)&jPmA6!;!JL@*UAHMP;XKe6sXUQpTgV$`pStI z>d8dzqHYlyzY@KFVgxH&L^sxe$R{);3a$yHxR=yRl(o%S>twgBHCL@o{m&H4v%QbK zbo<`>{*UlGvSQ9d!f?c14u5KU?i~+tzD=%TYcJb2ypohmzArqDASZ#=WTQQqVb8SZ zfT=1@v|g)qSrt?)`CLt|Wv&SquRw?o{pRg<-U?VCs6=_)KObKbB@m8@cOEbyV}9mt z#id|Dng>@{aJ}%{%J2M`jFafC_s|gJ#ozwJ@bSqD$*Zo{?#3Sf3 z7s9Na`k3D#Q$uUHHrJ{)L76j%;W3Rt&M8<{#VCO?WUwGJMXBIrGKF4i(3sT5f&vYF zUqRnjYBah+gApmntc<4>WFmpZN4m3#P#9RnbeG4k$du9oM~NXlGV_+mi}VQiQKpD+ zQBwqv+w|AQ;WgVw+?~Rk$M+l;-s&K}r-c9RB%TK+9wfdV;Vp9P&hewd(>bgHSO1(PZSCYC_xz>JJ^XtY4r?lgR}5*RBcR()__w&1k-=a>e!E_+L!UW?QOg^5 zn~Z9;5k$a_LERe|Erc7Y-$YjrL=Y|fq((IS|9{_n&)uCXFXHztsK5K3-6bWmqt(@y zkNW+VCDk>+fg%cFrnres!kV@peKE>~jWl=J%W0XYB{z#~*e$|IoXd2Qw)uTY6^(~U#=!7Ue2 zLo-BmsI#61&Ue&mJMZDoILePHCOT?mz1k;E7|4h6iOw2XUm>1ixxhPbDm!ita|)$;Y~a|@r3wCaL_|*7E5nv z&U)j|;vtdx6N+7snsV@t8Q!BHs`V-`2g`G*(zq6`=~Tv8SX5F{m?7%8+z0nwP0*(- zFdIC6hqax0v}~{_5IxEnJqKPY?&=HnaoTklSwj}Op?hSk_-?a1PqIa>{}8f zkPsv+A|Oyp5fGQRY87`yYpq4l%IrrRi&pqdV&cQ3KUI*k=y%wK`ag)8&6q~)W+HvO3wt15$uUmqQ*f$-W z^6=%?neRIG%d1bVG2b@)%d0h2wmDNLuU~j3EMEN>J`{td(z*DOW;1_E{)c$u(W&3P zB4)j4a{ItS`EN>-&B{aa8u98!r#^gnsddgYeEJA)k$Yj}xj+Qo3`(^FkGsxlv6;+FI>SCdqr1{2lN=t{JZFE?}@2YI9FT_~X>sQ&&vYRC!PqHxi+zB6%l@ zUMmuh6|sXww*qV6uCAWYP*GME(=)BHF(y@cJd^#vv)Qdd7p|zccnnTADZcb4^Px|_-|>q4i2RuJzz1(J!;#O^>qXC@YJyyeKmw2V>OH zjEI)PCP$}3%yIY~afjs4v)x)_2?~u>RaR6Wve8^rRFkwrPvRt37#Tzd)d{pp)F!gy z@KG&SX@enEwo)lg^86f1|0{s6x+GW(I$LVk>z`Pz`Q-Z@FU!Z|$JvUn0Qer{sNU0W zGksOVr#ic@tVW?`;#A=LDBm-y4>khUd*)4cfA$H$VmRVM^E%EZC+v&sQ^`C^HD)Y8 zf}eb+!rTm*SorKDGY1n1$gZ7{!^C{WDvIvScTVUqx>`p374mu{msbAU=Abmo-WJiB6pe| zXi<$MI8n0*kUJQD9kuPLe_vC&I2(d>EZ0)!eT}+`wT_WCuV043!us zj%o&yP@UvgKnR)fxa-k+R*PgVF8Rk30Ux|u{>?{nl^gKE`<4Pec;*BEgv=;^u7C%> z{XDDhTCIWyMWEUF3TjalhuhiiPc1?HORqQLDay->y2^i1&X$*7TP_C32v?S!O;RV@ zR1^*i!U@xBCh?ew9W>pFR8HZdqCljuFyQg|3i1RXLPW0@j{Jb$US_k|C5^$Lx097Q zt!NVS6D1UHfU-ptvS4#4Kf;d7*B>!E9%P3YRo|eLo=4DBYY-CR*5m3+F|_s3dUsu| zH5?WN!;MHEkIeUJKu+gBnN7Z7?V`OcefvBM>Z>nVym8MT~qLb_8>It2#^ZTr25=tu9(XaFLydCXA#=AzC0E)8GZTwf?r25M&bElzd-%Lit4j0tz0N%nOPF zTv;V4E*BVlB|t_w;7~*b7{%rVID>LoA?pICB+$&{o@rq&b7UH7Xg^+SzWCS`SKs;C z_m(VL+tGRX#ZrzRpLE&VC(JJouUNEX&g#KM$C1@d>zm|CLo zH#-vXy8ZlZ@rFk0{?@%0u?Yv?k^ctErc(261-LN;9J8?x$S}a~^7DOk37eAZ>hOhw zVfX^@D}-oFVn>H1Xk)oHrlCd9oUpuR5m9pMpygJJXo36NE1|Hw-Ea4syb>-C>F8`O zY!v#99)KL?0SF=y45Hck0&Z|XB|;99n91Zh+Lz?LA^IVuZ8#)uV-dIf)&lzov-Ljb z{_&!$8@vw9vME<-^f$V6U2pqlx*(hQIXonc0-udaQ#bhzTVPs^OY6TADR1C_h)P6 zlWQJwi;G@Y*7eAOWmWRte%a1G>8I6`1=LWZY&NS?$wWm(JnqOxiDzxCrIw*yLBx#A zIFST|AutVYQ4Ez!1%-tnWbZVaZ8if?!fhu=OcL0O%492A2WG`_BRC!DeZ`5$U*Zga zTohof=HWnfyev3)6}q+(4m3^~QP*m7Ya_f#b@D~>w}1KT-92m8KK-{_uW6~AJ-T?W zk6k#oQU2TCps2(zU47Bo!`s+vXKsJkAn%!P<09jem_}VltmI5ciJ4f*QekN-Va&=h z7{U&^c{?02zt>xe!q_FHR`9exSQ@e0^+3+LeMZD(A+wOOf|xB1L_T+-1fRLGgE3`T z4AqH`;@lK)J;#`jrvs58^bd6jYxmOdNvcE@g3PfmYj|bR>$G7w;;*wpdeKoD)ppx)9VXXA2ij$3e^3Od$tcl6--P z0Rc$-&PhVFQq);>8}O>SU~fE#%s!~LQGG%!ubW)TBSMj>j(fxudo0g?M*D-)mv)7s z)M8zLpbPOcC6{0p#l&37CD%m&ue2P1`CKo-Pe#&|pci!W7WFQ;Ox;N-OdAYeRl#bPF|K`&{u0x+lBW`)4m%h9W#S`P`5&KNK5g$#?f% zck*gV?lT4g3EsS+bh^p5hKUR&+I+*$j#f@7fNg2m*tS-J^8(_XPx@o@vyj33(wV`)1%V5?0tK`D1ziP(F7|mB zJJ|J7msr}>*Cis=5iEz(XQ6~jw7s>pwk(QVBW-h*&-u|DBr-Hxy_L`p;D1d)e(Nsi za?YGJE12*v_YeB-^grxJf^B!zRM*4_r zbM5AhkN)V+KD$<@ow5J2BL`y(+aBn#E?)P;S99(eko(w|f0W<7ynFg``3tuG|1j$< z-nvECzIwc>gMB7vf5IH}5%kor{Zjt&u(!^Z=gpTdd!}o>m)T>%pZ%a^wyZ88Z95MK<9Q(jJZsdf!n43@^JnLdJp00M z*L3Yf^;s^_=jv8t&$kE@ z{u>@jePiLe>Kh%G?sHdMysXnH+85W$EovwVKNJv(GPCcCAKa*Ju~P-vAIk52Lx1Lj zbyF5?tgKzy4Dt&xIj;FcvjmlzzLQ!O@p?@quH4d6rv{c#mn7tvObwQXwua>m?>1;y zc^oCUs;Vjifq1;RVn&5n5k#RoOGTg}0f2z3#93NWnrG7(%5xd3sI9XW`tu?c&bTuN zG`3ReL9Ty8Vk%{>a1cWg!XG+d=weFMPWfFcts>yC#j!iiAOnR+s;;l6+&$PF3ZP71 zt-xI~_6futNy|}8w%9e$vb1OS+!ZYsTzJ#mSyyeH_{^fFMkG^e{l?d5W3(PyuGxQU zK< z)cZiY90k9&316i4Hdhw3wEA1~T3Krw!VmJ>^7GqFmF%%Lw!iI`w(qn_ZJumvN34x` z+nA}1RklTPg5?$Ec{L?g6kDFiya+$w@dqVkW#RH*Fsx~9ZELP&M)N?dQ({hI{j7S zmwNJNFgXfy(r5S=x;|N4)2oD5m#POC*5<2OKZy!6b%247KcUhvWeEpVSiHYOVg9)k zcK13ze2!5p){<%MTPLkNvEjrH<@~vS8qOboXG-th_2B-}!AMDJt9WE&1N`5JT{&ae zMERtZO&Y#Q-34chtnbV3b+rx5+sdZ(JLOks51jog5J5|XBr8chUQt|}h&V!FTb0dP zZM9ZcqjF|PXZ50Lv9X#}o0As&elYSxO4T+%=Q*Ot1l8+}} zM8ZZ7KAMnZ#-uk{h95%_Nh|?C0IFzP?ef}pYc)B@Mj>YF)&O20HcK;Lf##b@3P=e_ zl8P%TpsAwHW6TxuL9d3kO!L61?~(Mc7q0=2RuL)1~j&u9JBJJrpl%=j~i}a z2Vz!vU?zg5kTBAt_vp=<%IfOo=7}23#EGa}h`j}Q&vz1s(Q+sc;lJ=6|DzI{p5eQY zex`jzv?kiBHzIWnkRAkw3HREeuCKCqRh5eBhkr8;5uN~-P*LaZC6(Y5Re_DDYI+GW zKRo$E_tPdiN{+gG5BLz@_~UlxIp<03T{_R#eso`Cy}x6TgKKkM7mQPv4kWC!oeTr= zvupk_?nF5>uxx;#e$va)#_Pwde}8=s%}OFTn9{wXI>tEV)f78#SbdYUHvUS z#PZU)|4qbdbzsLdB8$Y-1fr#i!_H7~$X4R_Hruq>Mw3aaO=_H>kjGBaN5dZ}uCETi zXlDugaxx3RQ>xQhvNa{KSpCR$0O#^65lT34OS8HM#_&HV$@yC`tf_RuTUC`1BpK1! z=Tn$~D#xWJgUwY<>k&FG{R;21)a`-OG82Yxi)A@c~F%S@mO2=tn%du6)G2s^NN|Sm=zZRXBjES6*JDi z;X;;67#qS+ks@&`j_ru59ubB3Uuc~QGAb>sxr`y!Ll^{@3&Mk6Kjnz8`$IYD(V3);03aUb(S#a=^cT9@m0? zJ!O)YYe5I{U)(t~v47!?M^d$r&#yNvnZuSSy1G69>q~?1RBBzax*8bK@_D4i8oLbs>yqQz`LOPk3D2d5vY`kRMWcldq>&BVa9-JpZ0$DbGaLK8 zjXh~&M{KOuw%H~wu(4@2)?i~X8>5U9Hg|c*=|a^@?;6Cox!i<)b_XpEr?c=>hR0#GK_aG_yf`NFoPWbOsZ&@iEZiz%Fs6~1RV#QG9 zu;zD~&oolAX1hi##WAI^H|PQd`htSoTzVi^f5QHnT|8!I2ko~)6hd7HzKHD40dro$ z1Cx5FAm8JO=1F>u$y9^DR5g?mdzS3O$rv%Hsw;3Qsn~|b+JrOI z1BHZX>o8XYxMx&~l85u(a;Ws&)IA!_v^kqTBIWyE@h8m3OD{V00Npu>JCWbu7`U@o z_*v@moZ_$CK_EZ<^k(sw21J8 zaWxoZN)s3S$61tQD-Qw8U{uxD#eF_wazH8H+4sydblDuok*dX0b$O;4mwh;n9mUtl zYQ1j=JUOlE8~;r#J4T;nZ^>l7KJ(UrCQ4Prd6i31!LSFM*#?B-JZ(Wh6M$MnJQoX; zuyjqwu=uQiCr8rZ>xTN}g%O?kP9OJYHOzE-cVX_Ersa8(po z9|83M5ObSTTtgSaQ7bp63_oz_7y*G49fzjR{SajI=GhIo^_$+~yBLQJ7l!|t`TKl~ zsy9Ll^(<{_Wce_K&yyd3DZKlV{-^(X>ov{sC0REh8AprT_wBro&&Z#Q+Cq404obTs zcXFHf_vMO9SI_T*P5hT<@BE%Yo*vV{CcZ;6`_uyw3>#vu zBth%sW@3}a=ZSeFkEa|Ju(dj3IGvS5pbiN*d=PyORP@zZHQCuY7Ln<|Vzh~gS}N)A z106Mr6eK#*5sl(V8QDt|MpDI_dVavTOODlZ?dFA=ZD|_4G;%=&OW5O z6ww_qcn`OvQst59TR29&_umn}_0ys__a4sgC9A|S$n_8r7MdGlbf!G?+Qj4djr zPhU*wTL3_;AA$LaT1sHV!x}V?HTEuUEBwabiEFm4mfw<}Kvs>tJ0Ga+KOmo$-(bl) z&py_`qz9k-SU$GY2~wVR@_O?mwd({Js|- zdQ~3M?O``Qzf11^#X)$Xfz5tS8-;bb6gjFMJ{~Zlwq3M}kZ0Yv{MS^qSBVk8=Biw% zoO?MjhNax)aFpLt&Mqszs$5)K&Zd{Mvht>K(NoT{kjfyc(?z2-J|$j&a@h$*)}mmM zR8&-8hZD_iEei+*1;%U_2&zE6)I)*TN;wk{gvpa_kRaoyDCvHqWL>Hx;m9B?r)yym z$4bIzTnzeArOYI(#Q@9`<+XK$)rR2G2(2@^;?5_pzis`xzazobLDv3EB6ZQpHxF%# z>^=R{Z+-8u{MJLw(-$uC6uJWalfA$FIpUzMnjecqEB!ZX zUiHD%SCb8Rk35O+tH{L*8BKOw5iu014S4x*Q?0#V)CN2kHeldH@hm_9+y;!eK=s+( zna^V99t2wEeMrP0FkOv_LS`+5%?qe)heOI$qwR;K*PvWVF{xQv4C9Fhu^U0V`8p$; zMR<^0trlQozG3M~!tK1IP6K14@Guu{eS!G#sXr8T4pX(sG_cP|U> zU9neeoYC3b+1awDg|#$KAgMKB=N8*i>x_%%G$xyqbF3YmmS$(jxn6+gR!!C+E~j9? zYg0fVaOb5}HcCy34_bh@2D4$urt^xC`xZZPdk~(WilXFxg0V+ZD-l3unzhal>Nt*h z6UV0d2;9_qly~H{ES%{V$bw9H3wVSjLFY&pBqSZA1RB@rbgMUCVX=j^Ij9$94|+or zTkGRNy;Wn%&d$=xKh|f%=C2PxzcOfYeD1=@tqrK|G$fyVXtX*Fdn;-wowuy7B{jd+ zm0dh%+4@Os^XuFOQ;s%~PMe!QXWQxvubv$XbXLsUUulh8VBXLjyS(cjM^jr{o};wT zRWW1b>h6;H>_O%&0SDPnff8*+qeCbDP>ydATJaXW7(6%a<0Pk)_0F;hR@lFRsrk zYMmXowk&B06i>V;;cZ5qpttH*#o`H%d+NRNudWQm2aUFCuZ-Jl*g3%Y@yYpC8ql}%2Lu<1TUdG$z`q@csGK<2(iw6_8kt2STq|< zy4#=Mx1{T^{Kbb!OQfSK_snNWsg=SO7p~ZQFIzmccV5ra-6vwIx|RB z#IMK8D#|Lz=vKz-1m=~M8C-~zCUYDa9z4V3=DuQf>jDF z5;BOv1*@9fFnlHCRoTLr6z5Y2PeylQa4l&ns>u?c;zU-Sq_ba?m=kVka zrtZ2-@F4J=ROVf;gTdi_cm19Dh4OD*s8Rh+Ze;`aiY}S&>5OSg2Y%YRGv*QV+{KA0 z&9YX@N?r0BC64>6p+Da4s<#ryjwM3>3$etY49!z{G0wV}ViZq}K$?12{+3}mi( zsc?I0UO_>=KNuO2R94aJP}w5(Y>1NCLX z#l@vT+zS1Ynyxb6tkGnZ`W$YnAxmWmPp*b859!i9{iygu{QVV#8I;R~4&TSGB$BV3pQHF;p$qmfbC4$m!JQ z!WrnT%7u34s4NVH6V7Z)EHBURm6F+rNp7yATsNv2fuF>%tf<5xOe8TBox!T9phe{_ zVlRGnU?U}~DOnhl!!!mJiNeOPmOH~$54Iv3mU_a7F9$Y7cgnw=yFu?hbK31_UERe_ zeBf>Eu)6>qty~cq_)Etsor}HW%B^2CU*2`PVmVG6*SlX1Olz3Wyz(0t)wB!@Oq`3N zMds#;{{E)I1u_#as7&_v*DjUUojKl5UUjN{diD)?``+UCkV{i3U5P0g^#y~185aYe z&tUNYv}Co$V9C;#GJr*>b^@YwVr?-IVGt!cmsu0FWLu(w7l|c+PlO$Sh{U}P#7Rp@ z;UgV|NQS>SP@o#(5xl6ZB1`rtQBV*SR|wdmcq*U_OF&3srA}}2oC}zED8FU0$HDeo z$MU~)L?+H|fAz*-+hkwkh$+A*pFS){IejFql=kFINHcm}X$A0Uzi)2|m`k_fNEa67=iebe}Xd`cD=pt8p z`cJiMI%{}x!qfT1&WUNQBqYamlfVs4!X2skezzTqYyfB|Y(k`qVM44bubLU)^Qtbd zd$X3^RLiE-iXyzR}1lYR?-6FK8(dtw+G3Hok$rIRZK?d zy8@Ru3Z+yKs!9ynTSP0;$vBz#m0cwijw!~KuxcS~n5(WIXFH-ahC19TDE~0$D&+Q5 z&}8Dtf$-MLnKp`y!mtk|r&Le4>Z?adD5+o zd!n_{>#~({3tNw}->Rr%`MY0meu@{KXz6(J>i4JLEQY6FJRO0#_e}0<0e_K6>p;#rdrpo};75f~Mpt##QVU`p2hsAJxwh>_q45)gcwzeP`%+tpJcJ!mBk|Qt8dwd6y(OBUvF4`fP zI8h&R$7!*bfK6a}I=QY3qCzzu>wDBhI-f0`}lFk>j9a zBdnZx;L0lD?o~;_9_w4Xo?U5FHSeJ*jd04h5-&2n3eVL^c0D70p91K~6%1X07D+^b8Zq`hsS(IO9 ziDU>VR0xR74iu)Z+B31Q6)KaAgV-O(hlI=_gbw}#$+&K%&})QqHNUThDN|)Y^Q;TD z>~@A;fAsI(T=L(r_v^z8`fuyytXh?6%3Qyqa>L=B@3-%qoj^9t&u^cwYW|2dQ+N>i zBXM4%@KWkB!C%l=(AZEP3^W893Ib+HvIKg(H+YYDhrPe^e&*H9@UmjcZdTM>9gVuM zm5Z(|V*N!sio|6_tf{E8NQ@P+oFYHqHBF5T4fO>x1FSiKoSv|629f3_7_5i0uD;$C zugo@-muJPLTnJIJD-k2&AN(b|NSaQ{*@++V)+kqU(WsKOk@F~GPgFyvik2FqiH${6 z!g3PMr7+`jdD9J)LF1CaG3*ID=9yN`o4vhLw@z~T#xv-FDO<(k*2*zF3PTdx8u6eG zZKGx^m)`DXlp}G-*mak%1nhq*kaJ>Op4^idW+2Dhdy+nz|&4DG%b8Zfl&^;Y>Oo!z+jY=?;aHDR(-!zs(#+oTizo6*Nq>Q#U;8XLJ&Bu9g+Gx9 z!qK0dCorVB&&eSvn*-Z%bv10oxiub_-JUCz6lqyjR@6ZJ$$1kzO0y%f;03f_Zt7H6 zk9&paZStm#s&bh(0>xzK;1?uZ3P?)gzREXyp}4xosKgHC-IxE%G;ZsD-|Ro{V^>BZ zhMjKrnL(F(PKTu^uwwQG@mV=hL4fQX(#Hhig;{g|eEEa9w?iJz85o$-{@{OA&YllG zn+ZOf4T%^*{`7LK+ntr0>yI*DK7wB8ra<{!{RnJ>OU+*tvG|?&PN;BJ*C^s@M5cHwXE` zO_;s&{ieAWMz}${yLREivQ_ith!mgXAvK=c**?}?4?AQOF?uUfHRXO$^!uwzLLsPP zM!$iP=HZCvwB#U>Eu&PmB_Ws9YC?2vPIo%)h5Y# z99jcxUK%nkLOFnDfC;+!nyT5LHKDMM(m>atU}6zBH)@)?iqe;*b6jdPtP{ry^my?0w2NbI- z?N`iGC4;+8N%RaVz#fZROSMur655mI9`CQ7{P`)3{1zv{&`h@S58u33zDqt6ao9EQ z9+R)M-~Q9y1$VM|Vcml3-#^iq7d_g(A~d;ve$I!?xohKh{waFu{=uHSYscQd)0#ss zqBT#zGrT#~W-?@DiDFG8(o|Vm8jA(&cE1%CFJ{e;J6oJ$z{zqT&`NW2D+@fHf`X>P zLF@pims)L8U7;pRz{Hi41s8ha0b&8{;}Is{sA_rw8#_UpTqOXEO$fgvAT;u<{O1g@ zeegRQiudI&?3GXd$4oKjP)XNQPwtz&d}rN$*7>iQ1H1wICh>Rm`b z;dU|P2FB0(5pMm4{$?PDkKr)Ti*=$~sc3PSSD>>D-+9#0&5g`T1v*61Wv$gs#q+;V zpI;688r93#ghCZ>ZoA5;z>@K_;(6m3vXrnl)lpbe6LA2zke@dR8SFJyEwX;)bZDDS zkSP|1s)L$aVUooYZX0qjAn8G&&1MqJMx#k1z}#O^RaMeDVyja8ZJckp)KXumwwDZF zTL%0qjr<}JOa@ev!>)4>Uz958D}zrs>?;#Kyy^OzN8rN`Hof{A_}zF2isE;hT(N{a zZGd}?pogWk{~Q5(oy`x+r(Tk|%Z-Pj{PHY?p-fl3zcECf5RSM;cp$Yr%a&&oBLyyI zLd=lMl%>f7u@DJ`V+qhN+?!)UEEk)44NTv$@<4umbNLM9p%YqnGoRwS(;#@bM(569I^bFpHtVohv zl*o)d21bn7%JUL*^aSi0oPJ>jhGEn0v{d- z8sB+RJ}FY z$x=b2BT>LTbA;qoOu?$ar2oh&oDQlEi2}dPAhroPmoiw9AEerw|1Skj?;*3qr}Ag( zUZBLUGQ-ys7R zKn9iz*QK&0QG}hhv@{FB$N5!C*B4@h3tM6|f&U4b*=yeV)Q^ zgdB9mQ=*#b_@odV9FP*3tLP-9^pFao*{xV8w9%^5Z^2PmzvYV1e7~-^;F6s^{da%u z!CBSiMH83Ye9_(CeBsgk9Hqj8m%bo}t0L+!JQo9<#a{`SV`nQi-< zm#R{UqpIqWox0l^E4S2_my;+e7e2GFX3GrAc8gR>xCwt_s*%~sO6{e{VNFjI*!@{L z-3k9|e({)}9rWMo7g11#?$UWhwN>S%(QvrBNOIXNaHa`FHdG@an?fc!AgwcJ>dPRN zy2H|N0Kh2H28OhS0dx~p$yBdUNyYN~TTGR~TL! zkbNgNkni=O?wK9=s3`M7nE`z@5SlhcaP{WZ;p+_jrw=^8KAzVdQ+9^0#K#b|nn ze+!( z>kYC6LDq@#fI;R1v{K9pvS3gwQV>(p8sI8b#ME+_b;J;03f_EI;klqGvnk7H$zv2Y zkbGerCn~$1K$96*DY`9Ynh1y&$5Z$mtQ5ak)MrT0`g3qn3T$thDmTvqlgiBcprWKk zY^}Azt*NC*GVT%l`6GtboSys}@{i;X=l?GMvwYo*d{&&#^7HGFVeHxv>ksV+iOWK) zDbyJfV-$P3Q4ew>E3a!ZB-wF&jY1TfO0;+`6@Zyvm zKGP~Vtx=wF7p@(%%665BHnWzS zqO|OGE$i3r&|a;T7He6TmbGbFwl*Iadr4d3k3@n<@h03UJ}iDJo)rOV$temtU4ToG z)uj!QL&~1z#2aIJN*h)=N$FT2vhmaP{03A)euoMrg@jVzJeJd=x>TFXCI97bvqJ|r zByRAt&&HcgPe0^$CBp;q$?c*KR|<+7pKG96$#I;q)h1(zgk3ydQeub}W@VA!$_l|S z@tJ|WWPtJoBZbcp4&(wb`|PR=Dm4l(V_d_G~P%a$I;{z%?Ct}INRmB-v{fJsnef{=DA{L=krlr-P@6ztlvETV#Vv#?(3O={PC=-$0ODMbbh`^+(?m%uQvp}v z`22|m^qb$N_$#i~ss!W5ChVH{K&2NaAATg`-iRGDL$||0goqiDbUWyJs&Z$qCzX#N z655y8ibMX6%IS)vYS?^5aAnS!N0;xgdDiYa+}k>BYE^krdB^64_JZ;)J|FviHyJgd z#iw#VuQ9A_14*p;pU0s>#d{xZ0(on_Jy@EL2##XP&(a)ue5i~ z8(VAr?ESd0hxrZuDxUY9a-a&DRY1Btz;E`?Jr%Tkj0J~lCTG^P zmVeiJMg08VM>gFX5o0-z1rk)Fs4&wu_MXfqYqBOi0Vg5q$UvRghP*Rn6!weHTp%C9WH=)j*Pd&2^@>xbTg9X~+L$WP@f z&%DZ}y~~6hPkisXU(#zk#KQh^yWp?zZZ z!Al)9xdOBY0sm1fKZ&KvVMV(^89g`rlTkaDGd8e*>Ls@*M7fp8_Q`OqAtPYjG1&fo zc1FHje)+%dWy_c*;)KcX5w^>I+ecpe zR-ln@7|(vFd5319#Ij=+L+L)csE_}dbFsE5b5uNIlacoUex_OcM(qK+LS*-L&C}M6 zK999R4_X7xo1m}^2S+gIclga_hD853X|f6p07bY<9gU9Z4#|r<1|F~(+-{_E%GE{#MTg zzTADQqn42mw6%=IYeKeP>pg}jAQboEPc++Npmf^Aai~w>0@T#O5 z0dMlnrp^Gv=6XG(wK{&t>9ONixt6jg&_)cisiIN7w!O2+cll~*bLh;QuYDxnDgXSr zH-7!XO;5?McClmZ*~(e1?55k~MDDBK1Jk~?r~8Qf;rlPL7}*oCTKa(QBv$$n;#YP7 z+lQ4V`yeloJLkeN^>KO4TkUqpz6HwD!XDL{NM&!kCQliyd7EyVa}jSF(sgy3i!LHA zI=*0;()tMBDeaSNrS`!^Ln;?dBQ9FeIa_IeeL9r#RI6`*9|;MhNX-%1!!jyvNFnY}Dim1=QU^wq@ijI!h_4t>WaATY=b2LL zjeG9?`+4eW^fz9Nx*8wK2iGq{L5)U?m(LH9(*#(KS7=Wa=VG|Lo<{y){+;<^Hi=TD zo`xe%p(7rh%a&0+gCr)68UmjWn>2+HVQCelP))rZqLRi84$Q2PVPi*id5=8Fn&hsW zJ67C0t}sTf)Xa+I#HN}SvTouhW7kb1g|)>R>FMI~Eb08~CVrZ^Ziub3;rYYi z(s9p|e2H=1`-##6KUKNRn@GI(!}d;X?U)`QC8d9G3HE!XhZ8FAH4^V#H(^o%uPi;n zdppm5u3N%)&JU>v?3^}r=d|G9-rkzB3e>)$X~+*iMhx&k3KE%w)yCJ+p1o|M?Z;1zjw+ErSPU{G<{YCLpqJ&uBkSAHU)iuc;3`yHI!zyPtZ&G^m$bhTB`l^}=x( zd?wG*cW{#YHQmcn>czccbvsf$WSoZ_QNY*XJ))GbwnbfsiPXuG_Re_5j#h3iJmXb? zaLIq?Aio%0MQV_!%oKzf!R@x&C7TM7KLLomcuZmkrCTZ0K#;jG`T{_dD0IrGz~f2t zAq#0bTrv|LucRZZtcudrRdq^8Jo%V%?@$5qd5AP0o4)E@`@t@NgMI^?p6XektYfEs zbCG?DibFg5E>MY-f2>fLlq#UCRYf5L+*k{duBy=IE6j5i!Z|uVN!1BllrqpbFpN<; zG3Yp4v_NA|XA|QRCP`|&nn7nIClyaCc9*WDuD<0P`_$+{qkKa;9TgAH3i|@p0r`=? zDp*4G)G%!2tNOgMs-jU@RSmAj*pEk-_4p@`Syf1O-JkfXexQ5s zZA0nsG5|S&wq~Vej#$hFA7QB>9Ek*gu=JKXEv5jHCz`BQp6-vUzF2+I9~1B&k~5u@ z3%YI6trS1286y>3@M!u-+(@l2(C1%~%#Bb5ba4klkC0K2_w~3?oiD#zEiFc*VDFCG z8xu`KL92Y-dD6Xoo?lQMc=4VaH%u%l{nl(s{f6`QL3w~9go}X@<`mP+2F1*eqH=3T z2eR9eG^)jOZ-8b%z(Q6mR-Thkiitm0Qc@BQE6-tP(cUG*@dQ{(W+67-5p~oUvXWVj ztgPB$iU@68-pZ2E%Ayo-Qn;kL3LQdIthqcHjUu~T*l9o()?#e}vELCt{8$HiYUA%U=@1JR8YZxEUBHw~PEQb*Vn;&Gfu_yZdgea?-YgwCeeL}=}L2GBK+ zh$k${xgca<+|Q3g)^&0?@gcU#BftE5Vi_<}OWfxok)M!n^RW0+d9BmO!;!U}fERB^ z_Pzdr@kr#K^s}Rlm6=dv5c}*KfI|`bxLDYe>Wt|0MvbMY$m@rYGWk$D#fRcv8iT_i z8VtD(M~S7R4WXeHOK}>A?6O#_5x*XpJG^%Adal(HLI^bBkO}xf(Ew>Gf=rNN2_Qlg z>^9ZLBFa)t05G*1VJs>dISQgtnjpI2rxD4Vp4`wh3Pm=`&$>>}FKC%KibrmoI{ywz zyZFkUP}?M*6G1;J6xr8*a$22&MXp-)Xutf%jHv@0ge(G~r{I^oi0!x})#UXd5Kj=Y zJ40*&g_VU17P;2C#0jpMF0stT@?6XU2dds03g!Bc;3qE+T2_{z)gn_h_v7(IeSESs zU2Z6%3Lj*RBvv6?BvcqxT5}gNsV-ze!!>~yEpHZYy!(Y z`gi#wHi6aOmN#EM`f*(IdZ`Zhr0u6m8_ZJ%-g@>!CT^9#A-}Kal-eq)$ zS|wL=v(V5WdJ_pzDQrNCi9gC@={5fHca$402d~lkDsSUoW!@1;8{Bts$4#GCBNP~c zY$={~T#ndY(&s&^2jt zjkzi+%m0vHUZI&JADKCE=JJ9gkG=HmcTcn1c#ga6r*Ek#zI)@IKSY9Ie}DhP_RpSq z;4v{E?_IgR`v6gk>>)2BPf9g1ob5=ZtQK=lw#k@mv9-8uHjmI!UeHpYZ7XijQW8fk zQpUT4WNodXqzG9h0ueD1!FABuA~ZFL`5>2q4C2I5r3$@Pu300r;veHpE=SBtmR2x{ zNW{Vg3-$n*yhe<#id!=i0IU!T59b#12u&#O^^$n?Kd-r+tzkKvFP0>&*^bDLL@xW& zpL}Kl#svLVk>)dun zBHDlI$gbGke;X%)*E!ZA?o&)S!OHJG1@RfIx` zpvRe&@8}x^lHLGA>-H@74T;z6_n)N6#T2Wy(*X9@4?FFeUOGkk?n9mCGnT4DkUT>(_ zo(ser3o-_{5Hp3WF^&nvE<*k<>=w=k^bd&*2oG*7B0{7$6378caOerGxw4x`QgXUr z@p&am9$CsOPvUKbPc#u)?)a=)i?8g!LwUvc;??!t=4 zge9qp;z$Jfo&zyAF6t&zEZ-}N$oyjgLVTC)T3D047_Or@9J5<;auDiDk`g{HuF8z8 zH;z_5PaLkC67(ZxtLl#DTX}@ka&+WK)Xp2(+wMDey<^!?&AcTPp0kX7v!SZ{qOogS z@ODMr4+SmQ;th-U~MaDZ7ZxrjHXuUHX18wUVz9|R#sbVTCI(&LpDHuqm_A- zohn@E93(uLAFNLEOxylcyd-uE0$B8ZKmEVTJ_(*+jW%6 zhu#x?>tkgppVepUhU%O59^eY}!%L0wVOCXGa7Zl`N~?+Lpe;9hd~JceIr77ws+u(P zfxFIr%p-E@gv(Ns0`a zC``~2u97G_o(8F)Mh^=me=T2E9E$*XxH-I8IUm#PP4oZ_l)L=78=7OwbH57zqIt-8 z`?A&EDnm)}BEGLXs&cTePsv3&Km7_I3|m`Sap#tu*xh9=Dxve)55LPM*CeIk@t_#u zcihJfR#-A>g`QMxVP!3f=y@GRqf;+cvdZXu!1wiDeSMiF8i*#MQq)5E%gm8L(pnae zM>HN!Wb`OdjKPY206|Ba-%b&d3VF_@f{Hd%wmi(+^(5zY=Yzaxw&omOxIW}DE|~2W zzv-%JUM?lnS> zm;#^pI-f8le@ZkzpPXy?B~w}|D_egz<+CZ`_9+ZiYnrF9(kU!4WlADvnwN>lnrKE2 zbC}1)6FINth{tl+!JJ!B8Lg=f!IAa87b*B5%aI=nMe^LaxrGjCN_qLjiCH?7?N#$7 za@vs8zzap)z!oAMoqo)4(2amJM&a`+UDMDQ$P~rb^lx!5%1N7X^rnv%&WW1s{}~MC zxbgNyYkbwjms~}eMtmusk|WvTQ(ujUIej~LbHkNTQ!;onSwozNtS$yKboL72`P5K> zFOHLz7fXcI$N(vDBvK|yfycY5&qFQ5a%61yOjhS8N?c1v!S3`jq}iNvcv(M=s!SgL zr+nt^KRWI5wc}F0uqw{tn|EJQ8dO;PnFnq-P`zy4SZEEXx(6qE7tXUnp)*zLoNr=5 zQzc!+h2=pOq<9?NpTVVE!nyq@6)gERNOFgxY}8`TFE|LyK*C{^`Q!B(ptTh8R2q~$ zBdywsA;nY06&TGsTLwOrUtpyV9`CPoi`(4Z)+W#8XWo@xm!A-G*|*+;a;3?;>f2|& zl%JNjGHJ`a{{GY=C@T@*N)Cwe18e5->~YXrwFcxfC=^nukPd~MoEEA}SmeznMKxP= zI^Avyc3YOk>dzusG$N9bVT4;*`MH}Q39Nuyp@6HoD>z!6=RfAUIHn@L=N7H5td5e! zXN4EOkpIGNVAG#?>A;5jkG{2``?8H)?Ee1#MK9g>o1d{tcH5RqE?msA<%92jsDLbOhVm5IMWEC;ICFXBwUv^&qJo4)g=IMYTKu!P6pJrLVuq04Ur?aS zEy>NAMH%GHsHuTj5T&sMbe@9z$~6l+onS|#NZ?H{nCfv+qdC8NThryFK3CL@$tLmg z`SS;cHSl8|P*3N0urqApX~a!)pJIz2HfnjnR{DM2w@El#r+DTe%% zAX5Z+niR8}6yB44%f5jHvq=@KZ*Dc~iqFb88TJg;O^mpZQqJ7CC)^~xe&(*mvim-p zh0A4fcHqbN^8;Z~>zc_tta3T7luVcnYj!>MN-?~l(Sia)Zm!8-D4_y*qNj-1t%&Qp zPQh;1hH_0N6bwvj`ZQ_`A383dh^qTQ)5kmDJY0f{MyudKFwl*d{Gdoiqr{HT6JkjI zk}YJW*WW*~X>XToFNA3pU5mLtELFTeOcWb4~ZkPI_l{>ghg2NtemrH}pBtGn*I z>Eq{I)mtBU?y399kW05>4PpF?gte&_zu%cFP|C~P++w5G`y|3#azchwmaW4OFg~8o z;-tZAtpR5OSzWP_km*7Q;<6}&!|C7;XnCZ#)3VT2UzuH6ljV0|gz78tFT`dMy)GQhwH5DwB^MtasOfANd={=hom@z49!voFc-@0)e;O}Bb)ljT=_!9t$0?(4p_ z_w!~``Q!g}@A^dt-r0Kb9ap}34=ibS!QuwAGHmESz!YJl#C1bZa=5Tf!?QbcDpX?{ ztOSC*jqtsA_I2f1=^v=RM%FoD+BCg>#5#AI+@n24ZK`;O9xZ%f@D+%4j;Q$9*&hri z8^+=t@O(DUBSY5&z1X9TE6-1N)AM_Vr_MMJ=HcU!_Pcd{*ly8&4earcu~oyZlgGAC zcn95KJg>ChttG1>Au7lzclDh4<6GBF(Z7;zUD~82|99STNrc;l5ETy(Ppdl*qGFkD zSGosjlLlT%#b-W`ymCKUG<_VV;x>-k80}>O6g9XY{doTp#A?7oOXP zPBg?uX0l~uCNq?oTr)gJrPPQ|h0X+@?#+>zY#Hrk8O`L59+g_@Zzu>9!`6{rw(1tC z^iq47Gd!o}d~-pCM0G`^ty;KA6?*YrR`yIAKNsRDs-R9hB}9=eCB)`(ULoE>rEX~! zn5zx*0)zcv<{Wg0rHT*FXjQuAZmbw=$B1MCw{ag3xIrjpGnz+vt{CmC0@KaKRKa+u z?BzWehuFGojxwB)R@7PNj?DTp?H+a3?Fwy|dT0;mLW{F31*GtRq$*&}nge6*L9d@c)?jbB0H_zXVT zKE9W0hNt{HKG{C5mpc}mpHBvqxqwf)*gfO;qyu~c;1%bSDV++RtQ>Aox7)}Ht9;^9 zW=JgwPh?0Z;*`bU6kxIxPFb*&IAy~ObrX)X120gIb_th;3OcGstHY|pb6V|)qOiiy zaH3``I!f-*v~X!i=qN}-4f5}hbZh3)aKmsz%P2xh!6;~#=t&wX?RRT$11A#xp%Px) zzcjUtZ5?M=3zvmT>)p_b6j?}4;zuTToTu%9h)V7Yz zMbji@C!^(iyIRj_`5i80`KTdfXY>7|x^5q17Y|RaR$5O>8nUx$XK)F~#||m`G{#Pn znN|UO>KLBctn`xp4v#fnlF`p*-VgUfb06{j)f3L`MKdjh zXO+2Z8JWv8au7epYKJdSS0OzvJ{JR*v&vkyjP^2{CiB<%>Pn=)q0EHuAElSA+7UlA z@8+KuRGw!h*K#SV^s!aD0`%fD;e8yR-#C6I#H(D&q7Ra?!u#s(A)W=#i!;Eq&2-G3 z9ZF?)TtGdZoz|puJi_y|cQl<`#-eAEv8AJ&Ogm>DSh=0=oDHe$IrA|J@rK!xmBEa( zLNk_r!Z{m}gV+h(nx|Cmi-P;!s;U!mxz2%aK(50-EB={t_TSW}5p2%)K?D$m-HDn) z)9BN*D>+897|}|~*fe+=yRww;%I4wX*qGJ_s0K9ScTR3RdZ_0)7UwhJ2-8W*1NS+(K_wTIQHh_^%KTCO>Ot{J;U3^-h7wu zO-XE3&V%yd_N4NSG-cQ^-;?Arqaijk-2mzb1@Bfsk9n1mpZ;Tm0q@t z_Cic6{<%}7*T^^cO!(eZdfBQYZGex9ck}Zub@fKRK{I)Z?@gtTt=dDN7ykzDQh`w z+%0UOY$t*P{Fem(9Zi<0PXlU%ojktn$->QO8+!rU9)f4faC!1yw5}5-KgxFw@Njtg z>%*m$W1d!8$IekkE{^V;QZ!##T|ee&I&+?ze_eor0 zDXn*F2hlodHP9y5t_$XlZ(F~ebK^3Fzt~~5ZGg?#HzqfEkiVaA0rjNN-NCtWxyp@? zscqvv$XYwvEF~FFW87ofp3L#kpbKuBnCHN7W9nbD4sQIuLPf&KAxmWIl=HMs+{i}` zZX~Lp^*Y}Am&0xC=V_hzk&hkxNOZyTU>UUk%5eMi^R!PK$=e4J0hyArc?o{uub zkJLK&aTRYH5(#bpV0hLz%77!cbB*jH8RNC%FF?vO7#`T+BGGq3+Epu*ETJF}IRz^}!l)?RI;?yzdN2PVr zn|bSK`E#{(+=*G&{Hf=(zM1RI)H00SdNh76BHK(dJIAzE{@`dmp7I_t?R#I?wNf*TEwy|zOLDSL-Fz>*K3bo zF~h%Z@dGywu08DAQ8BF>c#PAtHE*8Xua2fYWzoX2XO)6TDNKVxIiNqJ>_$rmhGbTT zq}`1m5U$VQ>o=js61Qp7d5JD@#iG9J~2o zz3)_ee_oxio_zacH7vG-$oLtGXJVB>Pw-X}7=$PR55jebTLFxaWl~jsY-_`JCNExG zJlnpt;k%O-FOJMQvu<>-UBmyScmJ-ka?bmem2yHIX){EicxC}c`k?Mv@St5NOWAdz zq}S&l!p0!#bUB9ICY!?PjfsGUpim6Y12+9YGZpVN?D}c$e)}tXc=<I(lc_692*tPTrB)k3Jjp&j+ryh>0a8ONU=%*<^YK=j=9JM=mE%3NM@P-%6fnw7?s|Ev~ z!x|aHTC=6*du=mkhB;s0MX2k{>!TwaVT#}K(Xq3e;qF3M8)RQW3N~sa&@&)(Ux#aK z0&qfdyP+jbOG3Gzn@Cbwg2Ad<;C6tpEyk`yCtw8y!f4T>)07UtZPA;QQ6rI>9MiroPq-UBV&twE zU*`xFBKg+nmsuziyAgfCkeo>n)`*AH*GzDURL`E?7X_DOQeR6#yA)DiBUz4Auf9eG zBdJ$?trN($qK;Wp_>^|e7L(Oj&)Hi}nkcB!vTLW4ftezvegKUsZ02e0o`Uz>$_ z`cv(Fm-KDwyS%q2*t2re%3$~4hHV@BE?KiF_?=*NWo3PNaN6MDCH=j@$%7j=3~pSx zsc&$7Mf=9VzMkNPy&L;hPa5p+2~OX%vcIo;;!t<*`kvm6!FVv^fndfH^LsZA;rqcV zB(CO<@FwE)gwllay}qH~%HXDrD|>neR&HDu99*3q!^-tN!GV?Af~$Ii8+$M58`{*n z5##P#AMEbkxM?N+M{(D_p`N~O8s$*M$bd4&o;fn!Pxs*ZO}zs&wT;_?Lo}t}rfnN~ zSFh~u4X$1}(AU2$*wZ`IcgcG6w0dwO2sD8IHmzI*nr!S{+0(cFk|3ru)V;B{cYVc} znWO!oexfDXKsPxa~W&f9faYG*-UW)fJU%Hf`F_lt^sdy0u~@f2v||<0T1j47D+o zm^pp&l&%Y>#PKAYN`1m5_`3;zFBf`+9{BlsP~dtK{sx6^VNlp0Y!f!}r`F)zpzt01 ztp-@EQmBXdDG1Q*Abwwhjogc$Cgb%+e24y}R{HR2JsjWd_<0aNQTrF-NosMmFbVJV z^Y^Cn9{cfbw=hu{!oR)vUJrjVh_LwJSF{lPiZcOP#XMK?aR<0kqT4pCx(_{VzdV%A8iC-Hm)!gP?)( z6U}Xv$~!dom3(IF@hzeu(SUe?J|TXnz|a4B{6lDq`XpXe#-YrHMzfxepEz(6+E&)# zGCWOVCf=v_*YN*W;=Mu8ny8RoOIn@F_|HW9Afh1Q>Vn8uTy3GH8MAx%M|DXjy&PwTc7 z^P->W8|h~^;A!fK)+EhGwEpQaY{ApChn3l6uBIXvh&QOk0sK|ylx~?uN}p0&%Kjg} zYV--wgjQ)2o@_#D#so%5zbo*)vHPFeBbibGx>3uC|L^amc{X!4G|Ti@1~8+U7_%aM zh}&sBh!5x+#Jm5my)%K6qB#41RW-W{djN_WQLYf>250YG6~dk@sGN%^j>obr%gVA# z@1b}hqOFGbn#ACd@xUk|UX#Q-iWiM|V?40E#VaQ8Yox`l;u6>ZzK35)xA4x3AX7%Z}gCTCuDC$)Wa<-PT+8RZ!L#zpeGOQQy7J zdbIM+kzykHwF2j82LDH+xpbNQu`#3LBQOtv*~Oo=1P4uVmBsI4Q$#AWjP9a`NXJ9V z#3$^DpV=E9eQ(hRUu$2nA0FEN{PzC%r`T8Omzia4~|t z(4(lv7^)WW6=^QsUp`N3D&#qv#oW}xh#-s=t6<{5~owju$706U9k%(5>Qnah`C*1L89AdvU(FSo~02 zjX7E+EwNm76X%jqbgTGZJjct$g)&9FDgG+1Ay)gb_(*IM*NNN26XG!uXK2)lA9F*W z;+8%xo)piDr^Pd3qxb{8_k#G1cuxER1@fWziFir8C^m7^{v`e^e!y=h8&K_9M4H64 z+$I|l(4wP<;wcF3A5jmdGu+M)XNfb#z2fKMY_UWv73YX8;sbFXv5_>{UG|XaGDCbW zzTja&Sv*Ulm*|i}_Lh6ez1bwckK9-8N8ELP*_WRr97s}u{&IjED7K4F z5gRW{WGO!@DVG)eT6==5k`v`5b|f6hFK8!=Uy5JJDRQcuMyzdytd=w7(Q=kNMtmwh z6Yq)l*@QG(9w(#ncpl7fqC82~$T_lB&Xsliw!EHSUo^;*LU3+@?!ZT`D6JLd5QcfoA54`m&wcJ74m1qOs|wz$*bixa;3ah z{+yNb>*XqWgIq0dlxyTo@@9F9yj9*NOj>`^;ZMbKs88xR}EI*QwJ&bsi>if=PHTY#T{yd8Y%7; z_lWgs6q#}E5|4^yVx71^+#)up(Q1r%P&}j#5o=XM{7q%69F?o`RK6+@7x84JLRF-S z)uHMzafRYHiKGPji?~5tBCZlQiXVv;;!^QzHCByN-&f;Ri7HiPs$5m5N;N@MsflWm zIzk<(j#87=6g5>%Q`6N9Rjp>Kqtz^Rj5=1$R>!HRI$oWiPE;qU8Z}4Ns=2C8%~SPi zzG_e>s|Bi2EmTdaSuIkwYEiAKO|`32)TwH*I!&Ff&QNEnv(yrGwpyyrQOnf1>OAGB z^VJ3FLiGc+T>Vg8r2a=;tbU|^tbU>{Q9o5H)TQb&b-B7i{Y=HwmFg;WwYo;FRM)DX ztLxPDYL&V{tyVXxHR>jHv${pys%}$po-p-G^(%F|x-p{)f4JT^^|&AJ)<_NXVq`ibLx5Zf_hPHQZFe_y{ukQ zud3J7>*@{lrg}?lR&T3!)Vu0E^}hP8`knf{`h)tT`jgtC{;WRW`BopQzpAb3f7M6o zW3^5FO>I}7sK2XE)o1E+^@ZxN1kYeogbce`DOReLW_7oESm{=Vm1$*JJ*{2@6!)_B zw)$B6So>Q0S>LhtxB6NKSO;4Dtp3&j(!UR~zH1G(zGod|k)6pJY7HY>?g(<5jj~2t zV@M7kv9hfkE7!`i@~r}^&?>TutwYItcDOax8fSgq8gG?YrB<0$ZdF*7){nrKZT z!TgcdQPyN)xKpiZ)^uxzRc+0*j<#l5$5_W&v&owlwT`z=uuim2vTCe3R;@MHson_h>kR8m>nv-Db+)zCI>%aO zook(EIoA0pW189<8`IjG8X}RB@*d4hzFKRWTk3i)V(!^ImpPF?t4%9eSX0~5+>}-m z(A1JSEp?~VrPlZ)t)#iWxv6eJT1`MR%4!>0YTFmiYph$GQQLXkt!!>{Ten*NrIy#$ zP+aQVfRs~qO&e#Lq*WMR%(peq)QW&tolnv$_@(n&^D=k*!$JCD0n&8cbWHlKf~6WbaZ=hmeX zw}7NgG_`LqwVxQ&z9HzTiKdDx*r<(mpVE4epB%M$w^Dd^v(nnle70h$-hud^ze>aDt_`m`ygADT@+ObPm-*(X_3=C?Q1*R-@RY^-T- z%W6(OOPwCnp(Uup^dz>KElDS-(}Oy+1Y}0=tyZ68%;@a8jMmQM%<7~9GTV|)Qmcbv z+I-TjTHoC^eRpRDceg#byE9Fz+D)rw2CZuMNy^L?;x8#geVXdCW+t~Ot3CNFZKjce z_JC&0>a1bLsY%DjCLN#Fd7L^sXzS@dNuM3cQ2OcNVM=3jQ+;cCiLOgtho(DzFG-@>9h2b#zpgM z{KFnKP0ej}jdcw*nH7s#8>o^0cK3=l^Z7)Evj0}*l!Xm?tOqAElP*r5vaqf`xM;5i zF5iJyiqETCX48}+`7iLnlw{Zx6}E+ z(jOAxNLt1mtKC5MZb1DJEg*DkJKC#+pqv3BYqJ6c1 z>ZCO5j?dJ^CaTq|OEoi1nZaE%ANnWh{+Ip39yRkC8nXG7WNzXpKRZ0i36DBI%?sbl z5047Mqr&j0C_E}o92G>uqmV~If=6~l3Z$Rju8kr(pF3wh*)Jn}*w zc_EL^e#r}YrXe!fzCW-zW&bQ5e>$Fsw^qSeL@EE`?#qg<;8s zVabJI$%SFbMPbQBVS9^09z`LKqL4>X$fGFaQ55nh3V9TTJc>ge#UYR4kVkRIqd4SI z9P%g*c@&2{3Oh?l@L+@(+0Bk5KFy9Kc#se?{4~KMJCfj$9ZB#YMQ(Uqq8-_hkVkgN zqqENWiT5JKMX9suTWWCYP7TN`-y)=*>XRO`5^A8wsfnZ1V}lD%^NG)yfgUN!@&oa{ zBRO|YW0u{H8PNV>3qktSg$+&GMQN?mix55P7T2P#xT;4}YrF4swglxA73XEAE~;zQ zx~-zUrP+VCAUns%BS+@`6lCY-=k%y+ZNuYgtDD;cPqa=ibIi|dn~!G{9Jgl7Yd9rw zoY_iUn#>0&<-S(M1FkHMWNW1f&B>}|-Kmj90pGB9$E-H8#Bp+O-#bV$gc(W4dnFyW zXw_bqIj_0BCDE)*U4z6)mS2VN%&$x0OxJ zXo;bvnpRd+R{FHEvdqwOO(WTrKHo@AssDZ?x7_Cs_4z}6KG_wy75aLpUru&KP+zEj zeRgGDP+m@DZjZS&tqnEJiyM6NOz-+Ffaax4ncv*fl+x_~pXvW^*Z=*RIKd66RzBw;2=LJD2c?Cf`c*FlXwXl21qptBzwo}_FOj@L!@tn*FEsqw38VWvuh8%> zH2ez<|3bsR(C{xb{0j~LLc_n%@Gms{3l0B5!@tPzFEad#4F4j-zsT?}GW?4S|02V; z$nY&Pe2Wa8Er!720GTWt6g8$QLRoyCS zml^(LhJTsiUuO818UAI4f0^N5X84yG{$-~9Wrly5;a_I>mmB^@U*s8mkymc`mmB`& zhJT<(B6;P8f4SjbZuplQ{^f>$x#3@K_?H|0<%WNS;a_3eUt!u`Vfa@V{uPFQg=v3< z;a_3+R~Y^khJS_OUt#!H82%N8e}&<1^k!bA;a_R^R~r76hJU5uUupPP8vd1rf2HAH zY4}$f{(+v3BNFg`gq?GMIhc118gp{D)8_~hKQKNz2!oAxK{d@w$F-|!E{ zC+CKLFg`gq{Dbkyx#1s-&+Lj|d_oQXV0?0J_y^;YbHhIvpPZZi55_0wrvHQS$+_wO zV0?0J`ac+-oSXg+#%Fd#Fg~HCzk~6}x#{m}I#_gMv z^q%hv>-YBVyiWTqT`u$EN&3B>zKa=_6r6^IWci;az8`!TezkYPOVyt@*3E0%EAhr0 zJYe3NSr)8-c4rH5hu&w!X(r&|qO5pwW}U@<{rf2WN$@|NHO)~%HrBK?u@b63(>v?+ z=W;<^i+(S-PJfT5q4No-%F|cMl|-|vtmpatOH=oyJ;wD|oKcW*QP%SAOS3-gzO-jc zug$%m?^Dz##-oXs^o<_4wO_w}-$c=di>zY_K7Q?%dy{om;u?Z3TmwA)(!&0d=it~z)F z*gm9k$eJPR4&E^2HwRZ~I&|=m%Ar$--ahobVQT2qVRMI_K5Qwt#y?s!Y~!%khi%iZ z;oS^9V0iV2*vJ*UR*xD#dfAw#BNq>^9)7^6@sW#1jn95KXZi5z(aW+Q&h4hJ$$prl z+jBSPrGohZ`2T8tdEz+tc0Rj3Z+?FH@ap^)UGD^R{quiWFdZx!y!gPa2X83sS$xu= zBgT#&JALemadSql7{_b;33>B1N>=4=E`4+CirmfRk^FKE{nF#HCkhY6aHid|9NTV0_gME77<1hS&#rT=zz5ggPJ6_YyR zVj1*Ya2{~L`QQR@VMn@H2VD;~bVOwtsOU(SCqf&*%^guS6EuUDz{}v(j&$pQj;PfS z3;=_`U;r;`2p9%NfKgx!h*0*Sq8FU@0ta=(s7;L8#HdY-+Qg_$jM~JgO_bWis7;L8 z#HdY-+C-^MOwQ?WsZmU>>agXS4v(6}WSrx>zyq9b7W`M1CHhT*&VKkQu+$cF9nx@%fS^O2Cf8GfvdqaU?pYV1icyD0&WGjf!o2I;4W}C zxCh(|?gRIOwSe9f4}yo__Xv2L<0rtA;3@Dlcm`|)&w}T`3t$uQz$@T2@CJAjyahIc zx4}E$UGN@wpS#u*^a8!XUSMy~2kZm(1qXFFatIg(=tDUYi~^&<7;p%PfNVhj%3P2K z@<9QTQHazOL5qDCx8=? z5O`RWZxw=Ka2Oa1z7I+O_tJuo1s`i7;C@<1fFr?CU^18jrh;jJdu`1C)nFz#8q5OR zd+S&*8yp9yhebUs>S5`6oCIpX98e49f;un{)Pwn;0h|mLfJP*GAyV1|Wh7XOpf>ln z97*+%RFAQ#rBh309LaPAEkioviG3H(Fkjov~!X0wC zLtD5*E_Y}PcPP#s^0-4DcgW)od5mw5@$E5IJ;tiXSoIjI9%I#Gta^-9kFn}8Rz1e5 z$5{0ktGY+x^oU1~#OV=_9*NT<9($~I>c%4G#HAH3EpXXmM!)(sJ{-D|(hEQlpcP#>>ORoz*KPOMXLS&Iqnx`~ z2_}FlpzX(WPz{#x`MKac;DGbN1>nMtf#NzozaFdtH-OdPMz99l1a1bmfLp#to&wK+XTfve1+WQt;1%#1cmuoz-Ujc2_mQ$* zU@y=I>Pwx+0FAh@&Io=!ZDEA&y>%vzt&$Z7_a2@Bf8H26h~So$^re4`kx(o$Oa7 zC8FPUX{!P|hVZEK1FedF60ZC|u)(RM`w zw5M-JwC?^_+Yns`Z9BBx&^DtUXj`G}#6t8)GqCCBzIZbZ-i(8dh$3G$@@1o6V(6C` zw!uNaIOum9{cfY*ZFEfxUE`o@9CS?#?G{73#n5gJIy;Kaj-s=p=p6^WCl(-&j=+ax->II&LXFQFBcM({@ zz`O8_ci|cD!t=e0uWyI-_z5g(&|=ST@z0R(DzO*9quoiPmLngPU;?NDlfZOP4VH2J zx!^qDfb+oxK+ly{(CSOUW#Dpf1&D#`_}=wk6}SPc1~-B=;3jZ0xCPt_ZUeW2JHcJx zZg3B{7u*Nd!OMlNhdv730DTOq<@gDxmgT3QTArVQYMFi(`W$!xYyuv51-u5{09xkX zf@-;c8>(ghT`2O8rFPA%z%{c1*USoBGb_;ElY`}U{kb9iW;CvgCa7Z0SH+yK3QsDA zHFvP)3C-)G6&x(Oi$!;^=q?uB!J@lZbO(#>V$mHex{F13u;?xp-NB-}7PAj5x{F13 zu;?xp-NB-}Sab)A?qbm$EV_$Ucd_U$7Tv|7yI6D=i|%64T`an5W(KaA8MtO<;F_6% zYi0(nnHjidX5gBcfoo<4u9+FQ{un%tav8gL04~2IKwIqAKTRGdc-dda&lD?>>$Sua_k_-4sz@u#}3&7_Yj5nV%r{M*+G^aWZ6NM9c0--mK|i-L6#k4 z*+G^aWZ6NM9c0--mK|i-L6#k4*+G^aWZ6NMqsX#@EJu-L2U(6H%Z`y{$H=l{WZ5yY z>>$eyvg{zs4zlbZ%MP;aAj^)CWyi>}V`SMevg{aHc8n}LMwT5T%Z|jelz5dAk5b}I zBHK}9+mRJtY{M&cjBGm+FC6(EhIetwnWYOKVXb-O^e#5nK7!NM4{t ziLm*S7E4GPQno8C8cUKgtwnWIOlwgc8Pi%+N5`}l)e$nSMRk-+Yf&93(^^zV%d{5N z5i_ktb<|92Q5`wcT2x2Rv=)v1%cZPvC%smH4;RdAb{~ODj+T8D|E?eY+W;^K3*=TWFRDnrgI;aL{n?1w;s?g#t9*K)b;^L9GcqA?!iHk?FCoOKH#ci~>jTX1j z;x<~`MvL2MaT_geqs48sxQ!OKO>97GaUC1bT3p8lv=(>qNNlvYi$`Lk#a%oS8!hhQ zk=ST)8!c|5#ci~>jTX1j;x<~`MvJ?6BsN;y#UruN;w~PEjTU$DNNlvYOZ>n_i@U@S zY_zyb9KlA5yTlS~*$-b6jmw?%(B=+z(?g>>+))p$?wD8uTD_ynXmyu4qAiIJqS+nB zTolb7MYBhZX4i2Dt=V1XjJAnIXw9x;5n8kBScKN>Iu@ZdyN*R@&8}k+TC?j|gx2gj z7NIq}jzwtAu455ev+G!d*6cbKp*6dWX1CGoHk#c=v)gEP8_jN`*=;1wB_3g;*a?h>c4(d;g<3LDMt60fk)>@G128_n(#x3JOd zE}o0c?;}(257L32SDCqz_SzNm6yKxP-n5=ObpMA}kTOfGqQq6KP2S6IE?4o3$b0!! z=fN5X`m5A!QyC z<{@1klI3wPSWQ9S*vPnzjN8b#?Z0d9@?C$H#I>Ofk_R9g-}Z`1>>uj$E2;Zc;A(IU z`0t9!o>x?mG&v72`;|5tuLbSa%5gh%F*uFm)4>w3l$g*m=yK>q&>w?Kz)!&n-eXQH znbS(aQ2bUC1HDh~Yx_$BxiU@oJug6b~H!3wH-pv+^`1AK;#RO`Tc@H}_}&`yPhQOv6q z?Nzi@(N^^V_zUFo0u%d;Nt<=GC}$C-}3o{qhq&a))CSWbBy{SA+QmX=mY>*jc0 zgRz_FKD}NnPXxq>C3+M4;9(zJ*#>QgE=CU$apjp9SzO)qTl7uRx8mkoalRGDl4vWU ztp=V7$N>1>l;#l)OGFFI?B8$wiAdudbieL}296g(wVgVRdYlfHfMwt!@MG{(z-$IP zv{QVMr+W;h4mM~3t+Xy^O`IQvw@_v~SWHd!*`eP9ZpqeAbJXq7T)SFBcURVsr->w1 zOw3*y`ZwGogZH$<-WR_of;rzZd@t5-sgKJyYC-lx5o1SoKgG*1?^n^`M*wo9W zPBuMZ(-Ss5Vbc@Zm)l{!vdep&eAl|(Yfq%@)F;|2&>jIEz#eO?@7*`8aSRXC%s7%| zNJxFApM)CBktLbCq_)yY?d5S1TI$YWX4qo~uSVa)#Qpmz$J&FzdqEbKQeWM&pYWYj z%69O49m@46*TE-t@QEG&x=@;Z4>`_tI_ekanmE_QMNfb46ZT)e$G7pR@Haes4Nu(& z?gV#(`@u(G8`zFU*_T>O+i5hcq?A?Eg9s`+sT_7vb$VCYvw93@uZsCJo|TJN<+8)d zVTYB2cje+;xp-DCUX_bi<>FPj?7Y%*+0b`q9L9W4shRiBpf+dHmw`v*8jr{|9+B&N zM1eQt8c)bIo{$@QI!{r~(||fCRu$CCP*xWFU0l=$FUU1skgGPskJSYgctNi5f?VST zx!McD>v8dVT)Z9^ug7Kgm&5Ka$9Oxg@pN2vgE{O5b9lZ^vUXZU@2m!Ekdm9B_-_*5 zjh@v0sV5)c{fD5B&@=0y_-Oc@T03pQcie*S=&5FaMhNfa5{~u#M8@zBw=z%E)$vs?Fron?2r6(LpSSvQ89FE3>_Qe*+jt(H=91NX|GK?ZQ5zmPM3DN z$<~1OdbHQ3oiSuKhL7yh&KT`!KMB# zb$6+|O`UD(>``Z%I_vt{VyZt|pm+S4f|lh+Kti6M;dmo>7SKaxmY`)hm?aSN=`vGr zLvKHjVb8C^bH-?vrSTXTY;y6W6e7 zlwNk|WrrSi=vfDC;h-%X`2kjQE0(0|x&}T1<05J_hGTl!F&e`$8pBD_7>T))V>E`7 zq%opsj9~XFYd4IEC>q02uYR#jQ73xVF+J-Tjo}!L;TVnK7>(f=jp3j%95jZ5#&8%T zQ8Y%>XpF?%$YIPx(HK#lTh-ME(|T9WWZ4%L_Mo24KEQb(t5rMAYPGCx62s+7pi^c$ zXSVP0-9K^-y3U{7Zsj^=xI2tM-K*dBjFtUeJIVF#X07*g?OJRD){D_xwS$~LErv6? ztG<@3e?+-@HoFa~XSCa)dRF^)%KH>~P6cV8JLmzr&TM;$;XBN3*&CJ^2UcI6y>{eI zUMcJ9M(?{u@4H6tyGHN3M(@Xcy}yaOfWHVH4u$$~f9a+l2T| zHsMCz59~r5ovH0Y9F5Xx7qlO+miHb6j8ANX%UIC%A)aI(Tw@sFRL3 z>1fjhAQ5Rwj8`3D(orQHQPSgb9q07FuL-r^gdXv=pN<$It^W8j(IP)8l&~9StS}!* zc+&|VN6W1CVYFOonfw@Nxk9G!o4?Fe`};9#R$X+QIFt-5c^#$%!e$hpl^DR)&LJqmZ% z$Mk8~kHh@6L^HQ!r&5=_!C$=Xui4=l>a{w5Ev({;xBdC2o_7Xbg&leo8{x{D5gvfe zsL__&#%kMG?6-Yut1asR)LXBG>2)x@2Bz1)4gz}JORst9^{!DsuXC}+#fhJgaE*1OjAj`dy4`O$H4 z^qJQ9@h&?b*dBMSHPA`|Yik z^=G6G1m6YU0|(*t3;{ebRTh9k-YbF@L+LXlFP>P}lJpn%pPhibkCz}ngMJSE0@}eS z7I-8Q%1&#&?&Yt_9l#wqkdfRE3U8z@ZowZ3jQeY0NRhuD#=Y{_#D+kJ@;TCD4Tp|^ zj)abaj)snb9s-R(v!S^lA5iaI#?!ga)_=`kEMd{ARSPaJXnmC zL&0z`lJn8v5ReUWK|UztvtsZm_#AYgwIxWSr!&AHPz_F`mKrsn7Sw@y&;S;Ig<`DL z3~cK1DC1&R`zd$c3B<~@m?&Yf>b;%et|We$mDu0;|Lx8sOSiEG)Pg!t4;sJ%pvSo$<9d7(t6>}^ zjVsYRj2pgAKfXsFo(9eWXM-ET9pFxIH@F{s1h#?gl({cu=6-FT9(x{oZ~rcSeJ0*f z;8%97UD7TEJ%b2+oR)889={Pi_$+teKWQ$1hwrECybArFI-j5R9}ykIMlg5!_l*!v z{>D)e9fREjUIK3bw9>a8840x7zgKjm8r`$wYTQa}-?g+pSdGy$p~Py8O9a~`D(Dhl zb(#6Qtj6g0s!asjMw94yaWK1MhD40jCdO(rd$oxK+C&0v<~NR+`R%Y`N7TUeXIN)I z&t!JRdKUXsY+|e~GhLg=fy->yCVHUvsJP5}Z6bXxGhdq+tIO=yCThTQw?VKfWBW6; zAjWD3F;-@qL5$TVvfwgPwu!O2tjgF#7+hw|Hcv6K!yrJ=;X=Y$A3x z5j&e%pI()*iPE|3L9vO>xy+_*vnpfb!G6t{NtBg@G?qMocK{X{dlOa_o`dyph0ksK@si^XI!IY^vFK9eEhbTXO@6K9aqWP~`A ztR|zxS>!btBbLYrxlPU{t4W?%N?wyg#X00JDHG?Dy=0=efD9!^lmF#7d7StmIZ0~8 zMdTuxCw`){k%&ulE)ubVOeD?XGIEi$i_6JAvRGUt&mjNE)#MsEM_i*bjfkIvy6y)$TIRP@oO@S+$q+QUF2Tz0Qp7k6AzMMm&_uMi}mCc zc~U$^W|58Jah+F0JVjQK7sWH=6nR-}B&*1);#u;Fyd{34^N5HSbruov5}8A`iI?Se zq7|>{3?bru@`I#{-;wEKnD{+;HD-xFkWb@8v4tEOb>c(SpcaU~k~^bWd_?vPTYOCZ zjMKz6vSwT;J|`1KOlFY(;zqeQnJ#XY1ITr8s~kv{i+kiCvRnLG4k4?>!*VEjE!N3l zWVTo@hm+aj2|0oc7O%?DmZ$yTvd9!8FePh_diOd+etOQGZ> zos~i!MNW$Datc`~(&bcgQuLJ5$V$;$PA4zL-f{++DfW@oiE*-(j1%K!8@VP$Ch>@qC>Xl9&qX9cT J?~4zF_&+mqNJszx diff --git a/nodebox/font/Droid Serif-Italic.ttf b/nodebox/font/Droid Serif-Italic.ttf deleted file mode 100644 index 6acc86dae06a9204452f65dbcf7a186579398c76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177176 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 diff --git a/nodebox/font/Droid Serif-Regular.ttf b/nodebox/font/Droid Serif-Regular.ttf deleted file mode 100644 index 8c1c2c4d021a57dd79dc139137b60640c0bae5d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172532 zcmeFaX<$@E);C^tZ{OaR+k1Bsl1@4sgpiFSgltVVvakdaAS?+1!=eHKSp*aT6&2J$ zMnwk|Q4!Y}gX17Bn<&`#W{JLqunu_rw3g|HE6AyVb2* zb?Th+JLgpO?GEFNF*kNPmOs9(zJX=RmoaI64@#5Aw@z-G{QTWsTwl&u^`!A_(`uIN zShbx=cO1d}(1iB3#-~zW@G_>VjLDZyZp$mY>xt`6Fvbt!e)l;`=Pf^U{gHIWT5e^` zu=|`ft3qS<7Jb6l93AR>w{ZEQr7K?#_c7L1f&0p$c`KJQ1F|%~1J7F*Em^lvjh<{| zYyqmjnY6fP>DnpZ&$jYddb@c~-I*1=g?3m*9F8uG1GUUA0z@ zJX_9~6kyEu&63`8=6$?l4W949ZGCj(!lZy7A*I^ylN$5v+D57(~NkB&G13X9djKO|6)NS3K)B4*XV!H z@%c7W<@Z}pKX3ZhI3JfLCQ&I8J+m}Aj4^Zj_gkaeP2Y-^w0mMNZ=e$S61JcD*pp1b zlPb$&v+(E~?qxFW%DVsI*Wr#)*`*YrJXt%+e_{*yKO`nedZx#75}5f_)%p%LN%|7o+XEjd zyR>_T&1{lB5%<4jD|JV;qf(7~v)Fvy2W+_VBuh~+LSr{`DUD23*uXcsCt0&}j2$AH zrG7SnXp$d9`EI^dx0x+O-x>0kp!*|ijckSVH7nIkVtI;(Wk}mup0se_1KqE1ei2JF zY-eT4a8{<xplNt5zf!BMOS+|85b$&KoUW$I!@u)a% zKp!#QgO)q7^WsM;d!f7k=_6bQCg=9|eDiPU6#lIg&mLo%#<)(sk0e z*f9(qTcqs+e-b?3&Uow?j2-jhM`Z{4{RTP;jF6rRoIqDeUx_Bt*`GXq6Dz-&l?gdQ zr+;*;WIRSsnZO(IlyEoXXn2sVG*qG-7$h8=eI#5GHvZ!gm?hj0c84B?-jMuAfBr9y zgm=Q6z&pt|hI_&u;eY5+dJ|(`H}I>t>=15e632A)*D#D;Ude&9*zL8ee0Ve2+PX78|S zp);UO@ECk0nUefqzofXG(|yaP6I~=5!jA4uV2A7+#-|U1->`A|JuIl#v*~!gNsRjh z?8djO7j>^kzc1;Yf-ay;_cqSq5kYq^-IpKM>cC#D5cS?dJ+vq6$er+0&*DDG+RSQn z{p=C>CA4uAZGVkxw5eQ=>#~7wm20858KMnE^o3{WNM$re{V+CMM`I?t0(}s=OLhc0 zYk;>jJc~LvV@x#mIgka}cfu#x3i1tjR$0x4QCo(iD1V*J(J#d_*u*ot(FXYi!q8A& zQGdiMYBSC&w5_+Y9OIpA5^c&pHr!AX%cD)X zlU3?(MSbe$b2e3f4CgB$1F|LWu`u;b?Fj!uzGyoO5zh5*V$2PA-UFZeChQ^gfwsZl zNiyoi@o@Grjt?F5#~9n>=7DeEpH~Y1PCg#z@-DGe;#eu~WR0{*@39{JJ8ZAHoz0>6 zfZ_(=VGFh^br-SM*~aL0c`Eb3{?EeJqrVn@bRBC4zscv!F&4wd{EC&5uIj#K3*nF2 zuyw_@HS#IeK)4Wcyppxz*)6&}R-@btAJ!^#h+>N~F~odUsZ3&}%6#;*o4qFdG~+vf z&n?(C!2hLU>%g`U8_~chl8Yau2Y^{z^Jyqshx0m|??S;LY_Wv;?X*$b#2@ISOGz2{ z#?Z@ZNasX6uoushFZnWhKG_FEdDk0ttkfuBtYxs5Z?hFRrYMUM>#1Y(+c9481TkLuY3})>opR159tE>wPQ_I>(gVOm7N;j%y)% zNC3K-L-v3$8MkLRXSzPed@sfp#MnOtA5Q@jasLcl>wqnx&xp4MkM{#R?=iC> z18r@=2CNg_h8!p1I!}Kg^C-iZCw?TGM7D+S4L(gm8yVm&6WGRBlwLd&qb=T+usOiJ zu-kDRh#d_vpF*+~a@_)3+6Wzq9pin)`9epGXKI|U@#CNj&+@ylYjen6kZlv#KkFE$ zk!&Z~5VCQ?&cx+IcAo4}>2p_60pbkJp!^2AsYmo6o0$V@{7F;IrcB4NAU%!|!+c0zSXu^s8a7 zH$4!@^aq03!EC=x33~iUXiE*M?m*DvbK|L`px@(hT78bpfDb(4URw}s2!K056a-YX zmaPVYj=+duFx}ze9&aGbJtF(SZ-^a9FgQ8ju|g4orU2&-NDp-PB_Nlw4R6GV?-7jzUoWm`QVo^3Y!V|t}&*UXh}Oa8uWVn z=?${1*P9Fmx=;)TlU~tNZ9I%K1@~|vn@~}&!LfwD$j{7Tfpj!LO*Em7xaRxgXJ)5~-l zId;&SOnRNju{ITqONmz!RZT>W)`^VHO~j%Yf#P704MrWB!$YWrmSw%cBznMYI?D7k zScZg#^k9)TA_e`@(CHSDL!`h)%#1`Gx#kVIYT3Rf77 zK~YTTf%q@WMk95p=uAe+sAMwfh%bV0oyjWUO5vyr(I{q&3_?ORgLq0*0;yD6hlF-b zvLq?81g$ceNJ9)J6GkBGZ~z@b*FbD5GpdmhqGrHWiq_b|DmEJ!vdGqt&H7F^V$IbZ8L$Ak!dG&txCE-sfDG{wDVkZ$L$c9EirAQ#) zBIq?k>N-41gCsJ9R>$#2+{3VeHPUsefkyy4*@zMy`a^LHeOz1fgO0MsFH&5} zu}Y#XQlMCuIuwx5NNI?F#16etHke4mWN?cv(HilKfTD>S9QXnLwC1!XA@msjXjtHg z2}}n!1Z`$;-e5ohH6>VNwHm-Y3w1lX!~gr`;g_%!*l-CB49(8K-#64BQC(fnx}wkQT}G{HUf$1j7aTEQGR{Y>jB_j6^UPsz}wSH6g3`(?VA0F5V#x zgEAPXL$|0)9hyvpcC(4hff%Zg^O+vboW&`KA4#h;D&zYzb;TJGC35Tu!4ld@lEseC zFoe#SjlcsaLSth1Vkdw?+C{`0O*+^MVjm6MXtd!B)zPR>4A^aOU$zi-AZjohO%SsN z5o1F8vPr|A!9Y->QPYMbo)d)xJ0$7?iL{B*kNhLqL}3BZ0`lP4iPSS!F)qTu60NaJ zbc6dalazIY63WmHEnCb+7=NRt5a=87q#V0TM;n9%DN)8C^cG>6iA;@SdXvs*R^VN9 z@ibHnEF>J!DOq0hObLYG3_BW;aDH$hbjyT}(7sM*M*Bt>1rmc5{6Yh8U0PEn zqt!~xvqFss9^@bCQ6%u5t}GVRg?}U`1YyW#)CS#(%|sb|uvmmEBl7h+lN}L_PR~VC z+Q>*e3dR6Nh&pIfxNadqi{7G(UD5F%%=!3cycFkZm6ND{hs|9t8C`nmL(6E+WU}LczCnuMBRG%hIxFr`P(w%+ z7890`lmXSu3ff1UglGtCfcH~i?aV*IABh_YVGI%xF4B+uqo#hit&KF!5sIne=Ni}P zJ{ee27cCiaPEr<54uXz_VnV5@b{v0XB`FIu#wt*xUO8-Y(F)E)j2`b|Is9;r9QZl;Vbt=1v8XT|zRzM5%QL<7U!3|VJHR3kLjS#?MvJp1PF5@wHLy{M=kSzv@B08lT zkS*e>Nvxh7kC(nh{b6X=`v1%nF-XE6v=mxx)bIz{ zP>>-MB91>O1+}l?4?`yW!8Tijc+F;bQ&EUMAQ_|>{=jUJEJ8dqRt!N)^Z+hMO<_!9 zR*k5mQZ2_v{zLr19bqIOL1fr!x{VCs32ws%YL+U-XU!YN+oGdGvy#*aA}d2&F@y;s zvY-LLpBcd!su1EZDzFh+B(ALHLHt3~&?uS+L%C_AeGGrV4cRH3744%jj0^l1_=6Ov zDZ-!GZZ}(vMmxAoVu<@kRK*ooDf}bc4!8!)pfw9>W0-n}g))k5Hi17d75A;qLHt29 z7#S2FNlz0aJS7r(CM6;K8Egg{;ZG-H{%5lZ{8<4e#5y>@N(*JfKnOfSdC;QC0dH*; zhTLRSVFPSt8?l^NWg`VcB9z#G90C;0$|y3llP1REB9n=bN|~Ie4q%T}Gou$BX#|=S zT0!_DP7vTJBXSi-hz58=KS)NSg~&yZc32Hi0Q_ls_2WGWeP||~)LM-1HM(dobcQ+* zDfZML{$$zi2L52PF>ZlBC?>Hmp2WEUHjs!nTPQvz_7R7`M6?O~35Jj!iuhCquSm>; z;ir&*)OfH#D^yEo6;TWXLu)VwD@|TRvIz<)0x?@e0pNgyQjM4)@oB6CZHSxNXorqH zey;hwxQw(}9PJTaVgtP*BUmI6B3q!;lx<|Wg`_|}W#Iv7-0|!nach+ndH||`YTz%q zb|h#328O_ntQEN{n0qK7A~RgW+FKxB%n-%U$ku{+!l((CKscpaP&o(?w#){_BbP^d zXa^i%tt|1TEEb2uY&Ss~cmiUG`$s$pN{D{~pNLO!Q$({iI2>x%VWo^}cDpw3CT!`g zZd#f$a*W1mv=|(4y%3Vsfc`0@5ebBdzzD)J*bR0?Cm99)>~?6P$!Y_l5bM|xS(-Kc z!9kmGCHRCE&8iKKJjQIN!(y^qNbQAO?Shv$#iavIo!X$mQ)K7>8^EEMR@)%2c-9k# zv})ug#e|ZKBB94FLNaPWlP+~cnZi1{M`}b?it5{K4jT|nLyeKAJu`H#iT%u8)2N{} z;#6t0$90C}NBNBZlVyj;h?ko6RQ7tHolc=fotB%q@~u zu0arYH2+8@7td0Hl4>`#(ZK2 z6UwBrl(mXlC2g<5CK0rd6$lba17T9X;2{xb(V1-qgpCMrh+J_31+vcz_6_LA6mvHHTv;{yc;~vxYw_AOL+PDUtg&T1b*WH3W|X8B3$X z=uj~Kfe&QNfm4&&W(T4yiopSJTg}4Qn?MzThftz|ekZ8GC_tmxVF(Boup=0n zF!unvifV%27!M*ts|sSsr_f{2FOnCD4WooH0s2HWa+8=ckx)<*S=dU7ieq?1nRp(e zq2O0|Mzlso4#QPROh6*F@Y5M&{veZH{jercq-8-LNl9d_U(F;DUu0R;@CVhgTM33h z1uX%`6W9r*asYA|p4EogF<3=1hvY3zC5^K(m z_7ywKJ@97%1mF(O;14QRE8mdBMue1CR`p_J)6yH zbznnFpv7i&xvXFwq=6|RHo(S-cu>P1nV1;oF{nZOsYVs}GvNaWdPf{_1@P{Gz9a@uSbmjeWW*`&4}rw#rPh5$N*qyq88Btn1_)kvNejK^lN+nj)ikTXdg_|hZ- zHktK+4JuMKxJeuIl!QXHEG7zYDf+-IAzdwEC9nd22-~R+Me*eMRJ)VJgrQQeKb_BL zmv%;a71y)a5v0Vj(3ZI7#GVu^(eUT=niv3r7|>w@{xHRZfN1zyB6gC+!r1T!{K4AV zC|D=_xgcotjlrSLApTV19^{De6BD7`I$C9+Dt1~|u*2MAHjK~=6FS63b`57%6-6-n zgg=ru^+G5l7KjA>K_dLcOT+`Xr;Ri=HdtJ6PVk-falZT*e~_d_5!ql-=r%I`AWNtN zrbPmOF+2BT{JEfF!nI-C=um~ngs}w;#6zMF}%|NASi+BP2S)qxT zEs*N~{~RPDXqd}E8KZDIhvLtR6*WEZ2bBbDTyX95F+EHInP4$E7(O!@X^K}(PLmUh z=4OFErxOZeb)ZADO%MDLQ-!iw0A&IX?35WTTHWy0cB@T@&g-&S@Y;g_35MiU31mnB zy9?C_P-qUrci3EnO^~4B!U57KgPj)O4}u4c$WT!|X#sgMl0WbV^%S>+bZH%xGTJf% zqr$_I)gbTcbhvQ9P|074T0h>O(Jt+b@Tcj`;9k&0v=Q<&Drv9Lt%U>{{#<_G4@f}# zqTvs14aFaw!(ve*7MoqK2dik*APP(bI%4<(Apjbtb{4&hL=OC6{CJcC0I|wR9CZMH zdWVKTtA;<=N)g`JY)*ooz@N=d@WWUr5gSBu2+wg4u(}q!N^!sugh@mJMSWYkbH;f+S!XJ5&r-lCqv2fbAqZG>AW& zVpEMaOsoh92p4TQaRMxe-mU0MwF8ePa*BWg*;>F6GN&d1MChfk;7~0L0VF%2cvkS8 z`g8#f;Fdk!l-=g>*i?(fO$G%dsImA|v;_!R;U8@XN+1m@@Q2obKhc|8r3_TLTw*Cj zgq8+}e-M8(uXG_6fRG#}_-rU~obe)b7Wi|ST=?wQj5#1gjXaEiO9@0dxq-1)PE{z=qZAMm522Fp!w$1~$MpfeW&d znk*=I)gy|9j*=9K(O9-6q0le^c$JzKw}f;DTL8z^xQB(6BD}g(H>?I&P5x5U{_$Qz z(V0Ez)DLTsMbI))7*j4BHOe)UM10Zd+yOIQJTxF?aoQ1pz$E~GG<+?Ib670W8H?S4 zr82OQ#%rScz#MQ zLX(w5YA1OkhH+3aoS;UEI*32WOiT0tF0_%xJspi!8z=3xHFmq0V4PVqwqr#MlGI=Y zpv9IVXk=nd(B;%xBY07^VpYS6x%!#xB`c|kzyJbV@R-C0j1S94NOr~UG+_`xHifkg zhrtFFv!Vw$G6#YjaFXyxql--s3C`dg_7J9nph@IlfzDuXLGkbuDwEZ7IH;|7Qx3b= zYXkGVWKf`ID(o4>r>KhM9#Ti(4;qO06k?%hR&`QCW}{c7j8VAVQ)_A2nnbr-(wSl1Ez)R7E?jD*$w>R6GY(8jZ+K!F@WdL8{KXPjE2A;0%V&T z4Zu!WJiv|51%hA|h>3oW!|HaRE&@U%H#s@t3&4(->)8w0-3Els*s5sOj_gg3;oXx|E}L6N7+>4BICe`qT3)WM~FHVxuM*6=4JC@MN^UJQ<+0A#|S8?pl*a0wem;{g6#G!epr8eOUm zqumY_(?FvlkfL>V8_f{$5Ntfm6#-If5~|^#TSN*z3NadiKRXr%aNBP601jwNjW?w_ z@X{@q2mFz4T3lj&C@NEYiV(u%v12BN*+OhK3HKxx`@Bxd=+fhf8HTho*kJTDv5{;& za1vTIhs~{Ga!EqbY_kWg(7Z{FNmqNGFl{xVj)=b~NYOcWCBS|++NxFPuSCR!K(0@ZP=_;k*KX)_djFoB)W0E!qutiuUxfK?a? zA}Q7Gvt#v^K364a+OWc9hujSCiZnF=QXyvOB;GL9)C_?MK4dXC5m;bp8xa}sXThj7 zoH;xcZHh%s%pWKTvkSc=pdh(OIKn^1;!`YhBVjz+s5RSS!{plm^@!)VMWU64_-ZCT z^2IqMiI1)*8*K)SJx~mi64b%1`OSEYfhvQQw5mQKZXpN*2=LIXf!qQJ6m&ZD4!0SD zKvysmR;P-Y1{4sy!#W$Ok`XgTJ3e_s!bA&HAn2ipn_?aitZYUmnCRl;c z%?3jaPY`bkub>Brc|Pz70iD&Y#iyuDfW!g*(Seu>5QX=m5AY$mK zkKzER8bJ*(BY7bU*?I^zpwa12?H(uAJV_|12{w4p3eB6GG3k=$qYPU>9v0lE4qa}F zJn^19i3y$%&BZk9>|CFJ#J_#<0OS>O+AV`s7-gM)%oHlhnJ8EwGFVgvq2dsMv&{9$2( z3I-Y(4l6Gidh# zf2s;8;GWHaVtkK6_1f%y0yPgcJN_ygBrd{n2y?evo- z68>--Fav3nF?qBbeZU_rULr$9jpTj27#m@SPz)1D&=eSfa~9>mxfzQ;SQLUH+uiso ziQVG$_`PTbo)G=Ubm#2j8ST=}{x|#yqKL3qysU);#1}>JCtDf4F=2xV0{$@Xhk?ZK zV+rhpCGx6Z03hfBHtaqcHOwmPF64~9F*q_6Hlvm1hX$Y$v7?1NCB#hTTpwFuvAGdo z8Qci$(VxRkudrF&ZnuUr72Y(4Kc|ZV9>|UoEeng}7U3qS!~9TG#m7uY5MYd}!lu!z z0ON#wv>fLht@NGoe}q3+(lhwemI7Ta2#>PQtNBd~O=P=~@)e+!eRfUQKxBBr8v(2C&{`C6| zdb`8x^Q$(e5%|LZ@GTo83`F%KjDj7p2iz_-!H4h=tGXn*q=3uecfk-K0zmS^<6`XK zhQk){YVxFj!KHd!0YHT89%a?;g*T;4lSd;#Q>*3#(v8$G7Ishz9P`jK)Pg2mSZtv) z&|)n9pdV5w2doC7TYOK*hgt~m@T92qc^wBZsKrbB7?;ld_n;>;32{v$b|yZtk(*! z=hW~AzXiUUOkRAY5DRl;za0U<0o-znrm%kLawQ}X^Mb@DsIV9IjJklAMTCxL=xc@0 zK+M(&fB3l3>qD=Im$ffOVibXZ_}o>@?Tp?OyfX*~Zs;EW`aroUPY8VSU z;`^M0VnkzfOP~Vbg@|Nmp+|UF@QADwT&UIWO&~GB6Qa48W}SVE>sI_oIu*y8cEq@2 zS6cvWbVies4iXQj@MYCfR zIfqcx1By5(IyEpbaAM&11AX`{t%q3GK+{0M!1d8B(aWQ21{Mr-56m5y#d-$Do&MA5 z*G|8B`cQOZ^kV$p0)F8kiq|2c`jgX6dQYrBxt_5T=69?6zv%zG|Fiy&`}_Nk_rKl$ z*Z$Z0f6>3De-&f>fqqNB>3H<`_s73J{)gik$J34{91k9M9d{g;k9~0LPsa}Z?Ocd- zg4C)>6I}YgPu-}x7TXO&9=UbM`HxS3_T!?TC|RPFNelR`{5HOu-wv7G!SCdE@xA1JEfcW zxBTDu1u`x#k(bKLYO?(CQ&nas1E*d^M7`A9Cxg zQ|(Ea>6iip81RD~CT3<9W@R>JXAWS($z06MJj}~{%+CTW$P!p0OJc)VGE0Germ{4A z=RKWeuuPVP-$onGMz9<Nvp9jj*zY&>gZO{|%;RvAfwl>^}AYyPrMCehH2J73;$yHLuK zMo7c?wbCfIgk3D9vU}O%Y%@EDEt5v_8Yxf8W=q)yNoDidrECkk313e3N|Gc?X2~My zB?Eg*Dq_#@v63H>^hjPIO*>mB86~UaWS6sR*k$ZmwvBCvRocOR#%^RgF~S?zt?V{- z3;QQ;;ZxZPK8a7}t!zDS<5T#A|7XSipB00C{I~S~Un|BU^)oxBwYN>3(mHw4#0f3U zO^xFl>g#H2#zm^DDl5vzmW?SbDK5y*8{D07%Xex^*4OshQ1jy zvOe6<9qP;M?$c$48yj=!Iy?^r^M(|3_k~c@@WVQNA$o2eZvCKU1T`0)RWqX1j11P~ zYN&!$cXLeeAbi>oL^fPo*C-?=ekUBVZ%jgDxL_{2Nu_b`gnJ! zzOP};;%)Wab-5$?ev7#_T)V)WJCf};TX1T@SzmT|`F@^V#l?w~T|aie#EdrTwolHe zpV!mZI;Eq&E-^KAX70$QK6@A~;TEeEP4?+)`wXJV(7Ameon0N;Kl15q*BpeA>dvwD zgnQ=A>FAT^;n{6+{kCma_BnI{EZRvAQncdMRWi*5q&%^NXR~=3rlbGtn00cuC z@cd8TW?%%^0iLF&(!j4i7-92q(YI+zhjtxe^AjItk-VIleNs2wc{+Z_JB{vair*Q0 zygLkOwzPF@>(ga4^@Quea;@WYwSB)*&9zO6&VPwSBDn zoY+%+dG&Y}%3i;Xbc;x!w!%|79%DrV$M=s8CH|Vc{meQP_xWm}SDE$OI(ioNrF19u z0BH+D9f_%Zk(m(i%y7qonWSjo(D38v4hh5RlWN;LTH3-bQ)YEQs;M)@9lAly=`!li zY9`!~s5JwX>oaB;Lmg70JQEdF6oeXZ60WJhzR!?h#HNDbqLfs%rXtkA6Ir}A$mkm$ zs$WnSt4G&AXcQN6Mr~ufH9cLTo!Z94RDfEf+>sJ)hhiP$aU(Ick?zqgIU|JIM(AfP zm1(>Tkj{rX!VAJP!;3?Gk=71k5wS;bImQgZb4@BO?Hxm}hA<0kVyU<-I2U7PUqj9y z4~e;be&`<>!=X5VL>(|uBX0TtcAC<*W`|bF{{}h=2uPGAK_QE&FXjz zGuqHq?HvzGT&nG^nYlk5_c|U6F%}V}5|vURRSD4rwKNqMMo~ZUu?Skkfm7P;WKWBiokT!|d#qmOg_v7&dT{k=$@_70b){Y@T7dH%Uz z%BDwo=+vfDQsj1%wPDXK+;L0FEz;dL^EEeLar4fb<p+)@Qz|)ay7Mg7hDGTxzNclaHo;^KsHy)Xb ztqYsG$Tdv?0Xh)kkT=R-$Z}+cH_(tjJu&WG^Mru%XUd_9B)n; zJ|5pV7|)Xu2U2`R-f2$mn5Gsvronel?Z z+dBHXhs|v1>%mEcPB!609k$=cYG$rnxpGyGNPOkol{s^9ox@hfOIGHrWOUByz;SQo zO15$(M=5sN9Xz2uhZB|)n2XPafXk2R^N zy_(Jk(`)P~W_5qtp#(pU7&!{a?BT7wcCUHr!Y6% zz|O~fvLaSCPC0Pu2Id|3f<26x;=x$yRLtqLbeO#+Yp=7u1RhYDfw?D=-V^1cFKheL*|DgXF|5y0st(?Gwzzf0p;Oz`Sum z8Gg<1*G60gWpBt?l+!zM^2h}ve?4*_cUtbz+;2wBAN9njPx8Wf)AM%Zy_K)zNAfSo z|GL0h5H1*7Fs0zUf^CI`h2sn77OpA0ws2qJQ-wzhKPxg6^%h-Gw7cjxMXwZ{EQ*ev zF#564hev-ndZ0K^Tvq&G$<&f_OE#A5Ea@wGspP%VJ4=64`bz1$rQeQmju}2CGG@-0 zHD%Vaw6e0Y$z==6Hk9oes~fv~?3H78kNwTqSI3?#Uta$6^83r5DSxZ{%L;u(N<~S< zq>A2(trdGJep_**;?qi9WnyKx@<8RG$`h5}RjE~3RgtRcRp(Z1s@hq#zv>TFC#t@y z4ptXbH&)NBUQ_+E$f(G{$ZL@gBGGZaak=BhkDEPi#kj5GUKn?xMyW}v8C^4>W_~TJ z4b_&`PO4p4yP@{_+Iwn`)D_oluiIDm+qxrlpVUkBf%>uaPc-B<)Hlp&SlO_x;jV@! z#!ndkX`|d2Y%FMOYMj@&uJO9YeT~0ue7*6bCf4L{%5AD^n$>hc)6beM&0Wo_o3ClU ztNHQf!_6PU!6mkgZkgCJuVr1!buIU{{I2C_%jXl635gR5Cp1myp0H-Z;}eS}xhI{T z?43Mva_!`qlb27va`I!7ziidD=C#gf-Pii}DZ{4BnsV`!SEqbFHFfILsaH(>-PB`k zfwq#i32p6dbK34}+u!zB+cRx1wXbTwxc&0>_uD^j|7O~Q(;k`bo}M^;-So}Vx6Wvu zF?B|?X-4}PiH!m`8$Gi{cFE~ek&YB)`PkK*9Pe;$Po-2FyEEv6@Wx-PmURdzzf)5vb zx$wqCV-_7=^x>j`#TyoHS^Ul7=(+lH*PgrSyvNU5Z4(cIhLRzI<8pW!o=%#x54s~ax7;pH1`H%`8B?Tz2;T(k4;oyTrsH-&B*chjz$<(o@xKJ=gSt}(j~ z>^i#Zom(!xRe$RfxBmIok8YE1OTMk*wySS@b@#5@=iUDFp2R)d_WX0tsXLTA?02-^ zvE+`+@3{4jU*GZaoh5hPeOK~b7vJ^G-rl>}-MjXU+V|EyEAJV&_mTUS-S55s`TGyu zfAoPd58U{`M-R3ci1r zum1Jhk1TlPe||IRH+v6+58V5x^ys`tUq4v+Sn#n=9*aKieEfzdhCT7yCzt(J{q4c0 zCO!4x@233jcTbl-eg8A5&+Pnt!teL~{?XsR{A~8KTb{l4IqP%xJzxI(sTbaQaq^2V z{UP@cJ6^K9wC$z-mrGyX^GEw1x4+_gCE=BVR~lb={!qoCJ+GQxUGwS(uXVllmp_gD z(`|>e2I$UVe1<(E~>h9X)aM)Ek~Ra^I+bqw9?|Z#?y;?aiz= zBX7=n^O863eDkTlocC7pTT9ZwKFA`S#0yEBV`f@1(wS<2#@Hz4Gt3 z9kU!e@7UAFjvqU9+;e>7@!I3FkFPp@?eTk#KXd%A$N$-H?a%CQ?qAk_RsWs+Pximj z|K+>pcf;>izB~WjE8gAx?r+|G<=qqSes@AWG5kc$i8&|MoY;Qi-V@K9`0I)2$&`~N zCnugyf3{Uct8LB@$b)l z|HAjTzrXMOr`~_#{m(y8K1lkY=!51D=6$g4gX=!H_k*WD_{#@hd}#PE<-?K>CwzF$ zhwDGw@!>rmKJnqFAC3BG`A2{JIP2s2AK&uvm!H&sa{edei6uk@Ox}g)N5(4h@Q7bw zvMS@}-b@JLLRbbyF_(3WP%fIk3O9zEj#^l<-m8% z^L6;g9};_g;2->`XwlCaBDpg-Z@>>bmfQJoJGbw|o9)3sZ*XJqq2L$6fuIr!wg%B3 zGu`5Lqqpkn&zxm>ytC8kD$6VSth2MQv$G)IU4&0?MpsEig~<}$z>&gfqoj8}Z|s`t z3Fjpy6s1QT!PxyO3y5#6mY~Q?9)fKJ5PB{=w;r-DR8sk*Fp`Rt%OJVm% zIunyq^o9gOK;kB2(CC+$nSPKHA8=Z|)?k9s;PYCn8x4H9m%Ee%gBP!)8WI$jJ_3fM zB;_SZNvUSN{g;ju=17)ZzjP!>MtVqiR`Rax%pF>iAwCDH`i+fY$u$#7UaS^suFqgI>Z&>En@?jIAC#2$Nbkh2X z(UX%dnso0|lfLGbrVTATX~IPl_8gcX1^JF>@49F=-$UCvzGEG~KDv~)b47Y-~cT71sz%;`Ckm)3M|nVL~BYjf+Or#+*Zis$r1 zi@hT%v$Ly)dzE!kM&;D}n%dmiEu;0(wCvW-6-~PyaDV%?$s6+V^0M=%l`8zZoc7Ko zwe`!}icGhEf6?%9WAX#hGIh0V$r)Fe?c%>QWtBGIqf|C$;8Xo;${+E0P!?n|8K29{ zkBpt#);i^jHr_U+ZA!Me;*r8r4Uc3`>z&4vA7Q6FkEEEnxlNwpZ8@;1l$VY>kn0W} z*bcCS4>)wJy8lRLzqYF;#C+Y~ss0^%V3wFjY6zCaa7v6J+$!KmQDK!-3=W0U?9%^w zAMle-jcC85y<_9ltgNY0?KX7#nst!ed5^D9=!pCq$i1Q+`w@&EZJX z>YUzurS$d{I{l)1*Vfdmy?4=~doGMbF1%+^$JO11h22+o%(!Z9LBZUsPR~GvapV3= zg?|amHxGQOyaRq#;j^x8))!e(SHd$g(ks*J)j4w}&lo>B#fxmo&CRcjRJK;imGhe$ zTP@sSNwMTvWXo0c-_}cI_53RJTU9Esb4wgxrZaIn`H|yjUVZfv(JWF+(cJ z;4h~07w7Of=@})uiiGOPdSAsvOjxVI|2&t!tWzY|%6_P=b{SXc!n~N#fIh=y6hS(4 zD9BIEvdd&ah01E08#k;5UL_Y7r+P_1c-_u$Y3rJ^%CkHpyRKh2f7^_#%(lzA_-eb$qT?&vX*FfJHdkKwDMu)$ ze1z-NqKZY+8;3>9^ID3NMowAIM|pCaM$ewFhD)+4W{ypIWJFU*O4W+p^JZ+G-<&dP zT6;%f-Llr4QLX2d*DRbqF*~|?)ZE!KGFqn_hn42l?3(yThsUa$-W42Kna)Ww(1W&+ewlA}!h$BxSKY&k5@ww|J@&O5lNS|XK zXLZcz(^Jv!q|3xgLH2&9f@PLR&9+9x&%Uz6&Mhj_{~O+m=jFhhl2 zDJk{ZW!~(LY&iGYKWrR3cHDw$v8 z9(OT1yQIAQ5_ER)IMLaWUq|MQx&3d^{>L7R9(!lcn6AhpM?Xhj?f7}fJ?P5`%h0@9 z<*QA6y@9W1oYOBbss%p`R>-Z$U~j*P~a)-ufMDypOLz{OBK0D&hX<0aWdRtx0037-pI>~A1>pSjnRF4 zR%7(pvWJVJFE;WH-Pd=%$m^rOefstVJ-dGweUjHbyJsOf-NG~EuXWes6YthY!Ep

So#mZu<)Gg^G$!7gR;;mSWglu)cG#NH2e^Mj|7zlsR`9jfGg$XZ{+jMc5 zd%C16u+kZJrWU8dh^2a^br(gi(GB?^m+J7Bi4-aBEw8K zF)ASJhy^5zGr#2PX%0%DwJe0!;n-Bp1=l$SfCT*q zHEcKBjvqoa+I;$9SWpar%EIbHTF8J9xL9~IC)v_W0IsyO$Vo&Nd7s}JuFOr$YKT-O z=Z;OO9^Y1U-DL@*D#Ja~%_(E^b))kqjY+92F#0o!GtT=yCx2{;84GEgEd~`Qz$N@I zmq?a>+3!$fYqCeYfkt~lYNlTA(`VwhJylz(EmfbiD#xH-qY_Eg{ld)iyrRw{&!~UT z>DLSbsToft!(EE_u9)n4%<+0-rk_+#?iNt%g681`GcN)07eeY1#?#E^MoL}1dvbVAX@052QmgcqPDn~^V70uqp`j|@vg%{& zcUCFS%I7BCo+Me5tVx+{byd*6D$^jwr-f#S)5>USkk|PPjgx{jSDA`H1el746^Ll# zr*L3H2THRBL$ZQ{PIG-F6u9wImCM=-i@LW>A2+UU^^C$maa(yqM{LjwG3ebZstP*R zj?bLlKCwJJa^k{O>&qAXd~R+-dAMfYth7m&%o%rX^YF#FQ&%@tbk(E{<-y3db(8AX zpVQ#fxzkG~EvlP(>AboT?u@Fo+^YJL*)3Yp&%g(fwdLfhp_Qo`Z;GJ{h|j#7;#Io>9g({dbF0!4Pv10_)b{jNY2ELm(JK5j zzRr-4nvoH*Mql73`Hp*qq6!thw_QGbYSK#ndG3pa_ZrYUx9W*&i#c5U1)$L{O3BcMybA$(~l^AsO%|X$#SQM*mppOYxecRTf{#lDn2He(<8&tcs?zvdG8@ zr6H2(257wstsjB+rK%%ona9ICJZ71#Le5{t{M;|Qa#k5Lk&D@?WJB?4muC9}gjFD! zj9?+O`$*?AFobE6TqVb2vzSG!(rE=^HX_rg5u+8tpJYnc@7iq%RyIy6?7I2lgR(e!IC|8ZHOw`3$*uF3 zJhHiQ+M_(><#~_qyJo?d^omKt%Oiy|#$}wo*PEK--SyXPkp~`sh};L(?{$92*~~^p z{M^iBeA!NEVtS4*p)!-S20yM3y{zspgVcmwe-*(gB2S*0W-ws(iT|;&g`YV6{xTCx zj(kJZsHlq<@(aqpBU6lb6hGA^f`?gfs}tGM$auw^n;dLPt{c12v)yyMNA@I7u6xM* zJM(L1*<73gdhRRaV+uP8r4fbvK82Syjc;1iBxg7Arl3-&b7Zdy2dh^(V%8)cGz&}8 z2~z@I)67ME#t9PLgp0F+Vw&-3iw;W6ykzM`1gr(aur$yuM8jQq?HAOJo!^jEc;0<$ zx_2%r$!=U&HDSZ7f`&~8maqKP>T>>e?b3-OGN*4nXWj+j`o;K{Af+?MmCdY3!A0HJ zmXR*r+uS>&A(T3C4n}?X!m8q~%@b=EP8pYyKDB#!?Yv){S6XrIwMT|G_LPsF*)}<6 z^uAS*#Vx~i8F{nD=VXkVRb1N9SREQx*)#*1xOm_r`IOMaN|ql96v(~)>dbIiuPw)D zEXmx&RwoBbR=YH&B)kGaJ;U?*VOrnlhvmp9bh*#W5`+sLVmnKdWj8!tF_4y~G2-?6 z?=<_$TV|Kcyz%_VXCrR;`z9+QpnUCz6miyn48l91Czfq@v+lf@&_|vnc_uVUwcArm$O?$~5Y+kcPGwyrXLwo}UeMi%uVW3yih9I~xg#C9 zdAZfOlXFF^I5O*&VJd>M!HDsFM2uK)`wV3NRM>bHlPdeDh-`X0zI=X!;c(#QfmA{tzfqw(bj(8Pj zisE>=Sr+^nZSvQrcF4V_c1V*DcV54aV)Qfg zH%IIe{?P#5y%tpK1kpA@bVyG{dNDFH&XiVZlO#z$9zc=$0u7+Fm~(WvMd~}`X08EoiR_7tY<*(Z211uB_AFozWC+ag`(&eMkQf#4)q+Y4rSvf6kv5WM-6PNEyZy zym64ynsw1q|vcaJ3`1a{Af zl{hTOVm|$bR*KaNEX&dSfQ)fwR(Q}r!6o|qh;!*Hsv_Ju69wwx*QI`{o-QU8ZY!mxhYc%7Sn$y@TTPk zbGs%KO#j8vO+C*%c>Q@5^Y3}*;`W`F^^VLhy5#!%=H4Cs^u^`X7v6W|-`70Ib-$YN z{d+U&@rh~3G|4tDqw<`VlCUa=Z}{TgS@S!x>k5-bOuu|q>86br&Mr+4=A8Z}5b)%C z(~HAuva>D2 z5uJEE2?dS<&Yez6IGuInjT)8hcFDtn21{p>*@fw4HLZnW{l5q+@>oB`Ov71(1yrm< zW7QPvrB^=vG;L0fwWZFSPA-Jt8w@#1c@dURW0we1va;mNOe{ee_WHL_O8!C1h+`c5&)%;cd(VKxh=ji*3^552%2VJ$D&A)=$0|Xdl4mKNy&QHSd$wg! z<;F@LspNTSvwS@j%BZe9j4Dqp?;6&bEUTSqT@Dv!9?(YM4;H74t6%pcu2#RHg-^r^ znhqMg6d34IW0AF!=2uux59#>eEM&-pB&^$&Qe(|JYm(e=5bK{g3o)_`A{Aq4! zvT6GM@8^ZaUof?G&7{nQq1yABTNYF$V0^0)J?(`Z%44G`Bt@0Gj1ePGt<;`NWNul(mf zACca4*er5j{RxGT^Zlr8wmgE>w(mTbj`HEO@mDOh++*J*A8 z7k_59F7zj^Pq7&dmZMVnF@AMH{ip=Re!l(t0|{xBqY`Oh0l!OPKF_T4=ZqT_y_bI; zbuA>d>WJ=|Zb~Z6l|L6Vx9F}8s(<=ePi!pR7)u6gisZ<$C*`~3EJs#e*4!+aE3-U3 znYyk#J{Pb1;ByvxA_kBoo9&%88bzT%1+DXIL(sew=;uUXYzgEnfoMYj^`MO=n{}rz z6T}Pc*N6|~*5xa$r~7)M6Saw^ApIMm=pdb@rkZXm+o9WKtojj;BXd@%a4KfCv9x?+ zIZvLgEF7CZvUAj^aB!~2tP9UYc!(8}R|v-ag+kY9h2+Rf1^G(M6_lh8&aZx;_9dlp z{)@$MuM_{ErTF3K|2#B(_HVd#{{{E07?WI7pPhvG`_e~OjV@XL`)kU3b7(+D$zvQg zI@7o4ubwmdeKrt&@%f$YRvT~5Egc36W=<*3k6xD#vrJm1H$yVDYZSdp%l`N2h!3R0tE`cmICGBK*+a#9X?>SfUmXw)! z|N1%kSeAWs?pdDmoM-($OMkggTvcbuW%e)3oPQWIw?n5az1K;mozFXY(MgOG$}NuK zqDhrtC77*5g4j%Wov7(DYlq8l-^_HR;iuTB*b(8S@v?bHC;gYpMqyz;1#Zi&H5 z4^RBfS2w%T*SN<%b%pHLjI!BC&b#h-c2{Qa<=?;xh};iE=k0`SBcz9rMnZ1q$Tp7j zaHNqVA8E+jnqO;p4VAp@8f_wB8@KTdHd0|Dxi*uH*Vr8K{DFKvKR=|W$0LNRU*8^Y zC!%8_w59Dww*Rp4+ihg^$5!-<`kM)jO|;8=jrlpT$=o`@t@lkDD>9@e(Hm6y02NK? zmvlp_Uk*^;DU@mYJN!{HL9qr@Z1v!J)KQZKA$lqxP*a?jC@;-4GCL_8aaNl0BT@3Q ztF3KKMfz=WylGd1OuzM(i4ITt=u=tBq|9ykV#}`bG=PZ{AYpE1S&8|Bw7X=kvGczn0Jc+Wmjr{H^X+ z+p?7qZZeP4(%l5-V9^D1k2H9L+5Bb_XG?M>vi*}7NSy}dX)nD~gh(DkUFOg7 zVkItpJ)aKjPP?_*&NL^NBy#{bH9+A&cAWd#+=_J`wUy4 z3yY_e$qJ{jCY6XV@heL8rJhnD7dehTXpiRem6r!g`SY4BRm9AB%8ZjPlK^3sqn9w7 zF4!d03_8<@`lH`4JE`-pO>Nc5mfbziNfeh};&|j*{->1m%skJ2DSPlj<`Sa@{|xgx z|98Tj%g%fh63<@vk@q9wnEK`YqR|G4$M>|4h(3sGd9xL+X_d@0EoWC4WjNqB%VeI9 z_m9Z;k34$jfk*yyY;f?{*+(Au!=oeTe^RyO=+##ry{xkGvM*kJ^|8yVR{BSDFYVm< z@^b&khmVeqKKdcGW>CrJFjm`zfS_iv+`mD$HKIb4=$cQdSkN^7f5NLJo-W#~rYrHqkFr$su?@tgno#+HV^{nz_%rtdpH*fn{}h?fe- zcS`3*l7^dhKeT1T<2NVMkFgtt|AKey_D$66NoTM(?PDwLK#oh7=q)G+Y~bV@N({2% zVgt7|_H>MhG2+}{n5_*@TV$Rod2vbJR3TMJqd4W6wSOPH4F=8A>OY>O;to}~nO?)V zSk}>dNpF>WfBVh*gFDuI+|Jy0;p9#F?RT#$p9yS#`WDr- z-yzDQPmqt_BY8jeh-y1yV$@eaeEFmx7^>aiQ_CH4UXD-%62kwY3G0^Tpt}${kD+O* ze9|qH2!=_8KFivf&I5&8+O|pcTa#~6D+J{P?qy6nyJuPHB6IyZpl@Sc+)EmeYXFmlaM?$0${TzCTH)hb?~XO@y&P!(+lBjgE*#GnRE+Qp+vE%<>L{fn@fT zjKk#Imd|gkNp=g)_SwW84>)?SpP2sSRIuZ^M>lQ!7GOGC5H-_oUEBt--f-@DRYtU)*5G%4v&770SJ9mxC$kwngwDba{`U}Qww7xY-H!9s zm)EK4>~#m~p07Jq_hH>aol-v`-x3RW)diCkg@QRF%`;h-9Z4{6D#&B6R&nW!;(F1q zi+KK5*PlGxCGizWD2r~msc-$w>wMDhcqY}h9r(63y8G#y1oINdzHoZ|O{wzmx@)?G z(6ZmYHT%d_&6o?dxy)iNer`w%JzYsEsl`Qsg512a*ig)yd_F%15IR?-suHEuiBiXv zJMxv2PFN+e5gCCB?jLGZQNP3@cJL!Tb%9AIfuWs>PR!b_H=y9R0U;$NG>X8J`2!WI z_}O$Z{6_K z-rmP%_&ZHOO>Jm&w7}IGIUlF{Q_OKWG*+gb`;xdd)EI9ZXneX+mQzO*)x>8f-DZ-b zBwj)kgm^ik;7CqssR_H5&sz~Lv%%SM0oUYMXudS-wrb<6{BK?i@cmFAUd!DH*i1n<& zdgdv2jVos#wR^a7bilhD-G);OJIj+jHO);OJxGF4emPolOq zR?}PK&}ekMKmihUM3+j$VvS`rHC4`9b&o9AlB;N(R5l3#qb@jUsLC*Mh;@r=hy|nO zI-F{l;qitp9fCx2Udlm`=<4relDV~(R#1}FDHot21YVQ|gV}4jeUHF?nr+TpVI?3< z;aeJOg;7CH7TcGP)_w066hptQQ;{|ny6Zwg3mHv6<(>?h z`GCR|EQMpQMDxuT4Hmh(*ia}R9W6q*UwUNz;pXbm(awCmt+I@CrH>an%aOrs9UWDb z#VW{ed3O{3oU7IYnb2HrPQOLGNbZAH_Yu}zfpu@?j*7cH)|i!7TD+Dzi;$CBk;~ib zCfv2PXG3Inh=2wl(rZH`2PQ!Scxi6#Jt~q^kvbJItB4Y8RjoXzJf=KOYs8B2khohs zDn5;z6FDc6oS0o8;mQ)#WR+TIUKE5DcY=l+fypA?6kpg18W)xM@ie<)C$r3UiDcg!oifeIZFC|&mg)}bK!d@vjhghiK9jF{e zYn1X(mEy0n$O_V63YEV8I%Ham4D6CObd%$^r{~h&yaQQwJNb9!!QK}>O8-=NW?>W` zL%bI!C*R^})Lj= z9cbgV1}+gB6?2n;>PBs&)*@8vy-B}Lm9oHjiXDr;0C|r3keJ;5<_lD)!v()13erx~KT~nbV zTQwBh-#Ijn=EMfE^O|+x|M=Y#1r>e7H#1$)yQA$fh0GP-$bZJ!JREN9uI&x!-6Kaf z&;LG9Usg1FJdmiddWZIpJo1oIvA=Gz!;Lw+F=tQ(aw^-nHKMO2!Hso%*g*z6NW6pO zN4u@v+L3lwo;*0{Q=5|(t|(cks~?mjkdICq|Ck_q_Vj6Le#xkcQrv>q1&w@#rAniv z^*p206Nb1Lx*l1f3DcHcU$^7I%bRABP5Q#}^a(Y!0n#(0CfCC`%I6pw`)8Uje{e@# zx@mByXg0U)9O|5Iu~=F*@!r4t(On&-;r5DSj1Xn8aKcrQzRk74AC89lYpor3{t)DH z#iP4-KDwu&Vb7PZ*!9R2@R>`oL&vb=KCVUdx{Fm~0aYLr*d4eha4PU&Kw(M9NBxGB zy_gi|sY7L?%s$A`nSXzhitrhEFakFQ69}_AD+TRK!aAINv5YT+@0@+|#x-m9e`S++ zU{>6?LGA6RX`1dV|J0YKKj~6wE64s;8^7(X&prCnTkB0V1GU|a;n6mCd2m;U8o`zhX_6_cA!&Y4})G^ay*>{@l%L&9^(;fLtcGn`6p1$J8+277> zkalTzW8KqV~=vMOL4K>ElU{2*!J*)0U{t$anxT{W;G57f|VQ4sI7y! z5^>_vgGvcg8IB?&%~xlx1qSmR5@`(IP=YK4Ba|YbN)i#y+1e%mql4C;?bw}d}&*? zu_9_wcuMWv%@v?9s7}Hmg^#P|I>d^K%I;jNu~5t%%srX=M(%s4B$ykCs-vVVSwaH& zsfq$swUFd#s67*&L*JC)z=5BUZE zjj9{%H^y%qxN-N5@?G6rr@E8x9PfT3@?PXjL{LTS5k8W4U8+aEwx@2}VELYuE>##W zmFap!-HeVe*Olvf)RU=@nQ|H_#{-Tmge06s1m;Uv4P4Zdr~e(1^Xi{XzB&2QY4%rY zE`ia9x$D`ID3n=GBE(24MAE>-tPx0J$1LcTN&^K9zMdq&F4wW;W9fuXqP+Of+bYbr}dwp_MOX4iYI zfL_%BPd0GPc>m2)hzAi!p3&wpm~0w(aOkS`@lReBd+6@w39%wK*XEBoTh{xF<3lsi z^>=Nq$uBV$s=ZFV#_Bz9tV-28-0d4;p%zz>%HJ={9J;~Qx~b!iTaJKM5g;o22{=n5 zbmKB#w{uHh6$$y&>Qr(;{f9U9x;mmZ{s9LhyP_;wBEW`zB=QFOU_O{(sb2+n^G zSzz*D)k2Usf}~=tjnf*F23hJXN_+DR|aeIBim|%1J5Mi9tY5 zhIg=W!_*8WkqHgRST0tNnmp8e#b?($Rdu6HcDl}rPZ!$*NSdQ#X0OGv-t&)9ztJY@ zP7-clV<-I=jaj0k;}~-@_nCi;HQ(3FH=kHIBUWgQiS=RP3lU#%eULX6Ruu9L6kFd| zP*EV{OH(ZiVV68e3MKRkP3`tI3hVm4 zBVB>lKgZVSV!|byGfL&`H|%d{Z(jvXFd9NV)J^%a}i0 zON{P%zf)DJ8XeuT0VmOnjh|uEip)_}w_ILoS|}xamNp^Rvr{+CZU-E?OOs`7R)#7i zEE%A5{<-A>(z&-Js>AadpaP8IjveE+i=DRC?tNXPyKAg#YnRZ~l^f~yuUj8lA74L> z4F03*pI?7!{fFyO&u17+VZ45@Tx}~6`XOt8HK;nnLb5Bucte&sKtQBo$Jsx=fatQb zkQXW6hT?eqq;ESm)Ek%a75)ID>&F^;e2~hzqxAJ6=2AU!WotUl z)=%O#v5nWYXSoeqPuUr)XFV4aZQgGCy2b;Iq$G+3YtU9@mdXt->ir*c(f?*qc&vdY zyWI)^K;${P2i8{)9atYSfP*U24^R%;HQi|XD>J=lhRY@-$(&V~j|%>n8qrY-Ey4Yv zo1AhJ(M?qDkegR0az@MTseH9AB}noY6OR{_0))jZ$y^s@)>Qr12fL5&Z~MTx*QVws1 zd~!X;SOQByr&ys%Xvg|L>?ec$B;HR%xwktu($~ffcBxyEt*UTUGHABt4Vvg!sYN<- zjX_p~u$WO~n6xX!BQeE{vQX+hcIlC$sJk@Z$nFzAw@OPPH!tcpIXsUH3$mJjl#*H9 zlA0s@WVOPQ?$1ihwZRf!xi#k{L~`UxksPuejA*}^(RS#1T!r;`8S4S>6Z}uU#`2u* z;JU;Xq>T^S)U|_N{1kPu zx}{jijLuNE!d$UhX?S`5flf-Hk~Vj--ryz)4Gr(0%c7azvqE!7Yr(jh!pEsb7g?=8 zP_3^ieEvSV0=#^c0ztS=NZ^lQ9jbAAItF1~gTNh*^2LGfoRLT|?;3O%)kR6Qsv47* zB=6I4NR!zMav2+ZZym?xG%S7j%UAkbRCfw|4 zuCkZp&=Vamu-Z0J}tHc<}1jr zD@cX5yJf6H)e-7A1zlYh?Y8B~N87bgRWSL90GSOCOMu9c`s7lpw&W35HIab_@gWYw z-wX5`_%GAiKYAhKe!}mU>9EVh-qk)RI@c90sHc)Qjfc(Ns$zZ3y4Jdp2AiQ_bML@4 z{hqqnPmcBM>GveN*KMeQ9RhlK=g=qm${TllR%@;siuvjsg|Vq_pSgOC&r=tUI9zT0 zn>xC#=oV>}} zU1U)Y7)>fJC8>VQiU*|+cMP;|WWh4l1CJt{cx$OehL+<<8z4#`!0QZ7$FDfeY8nr?zjVV+cV5{}oWWC`CCdpnXRV zM2|*KMFks-C6PQ;(3}igR4!=V@+8&0shtG3A@y(KG)Yo2(?fJi)}O35iOH19g-lr; z;}hxUaIN)?Y>W*3&1e<-4cV=$UfbHaDQ=^7I7piBGU?*6#)MB5++>x1SO2p0F8LfNgj8eaPmH9gR{pe{#?&%6k3yt+&T47Q`*Y#3@c2b9Jjwsy$c4wH)gK*&+aPR6KkgnM>n|-`GcfGtchb`aL^auc z*pmeJns`&Zcc6E=SLhW>j0sOC@!80lHC-s1qUuyZt+(49wi;Vek;-njISL(X)^tXr zHCS95N-%Vx>a+vvsrYKib0z$2$*m=PNv|Uk33S%fG|)dZd^PY~fZratJ-`Rn6h-Z_ z$|j|(J}GZd`Sc}~NnL=hJH&(KPOizxmjW5@7Hs8{NW%XgxVmV(`f?wtu*%uxg|+zO zoLzc@0c=btj)x>qS14ltH&RtK@Zk_6K(^f2TP4F{p<8j$;oA~S2|9-THq*iF&9^XE$RV)_)Kj*TwEG` zfzIbR@p-tnka+{?;xKllk$Xt=zNROS>rd!;pT0rgqZf=wF3G9VSH-IMDqBRUT+SE# zSZNMuYtJ|H>Spqamwd(hte5wAW8N;WVDJ*J!BAuCw2jyV8$AJ9G`CghbDA_MmAS!T zB}p5E(0GLH1JX63KnPmmDez(ksEccfuRvyDE)*pxl0*HaX1*ma7xFgX;C6kJGeGO@ z!hF4kI>T1OwT5R6a){I50QvR#+w!l=Kanpt0dqjF=uwWDG(9DH zB?f)LfL4`f7|6|tF*M=~G1ItpB9lKnjl1U+dMASX0t{Val`~66_!H$JdxB{BoaO zZz(^MuTjgx2mo^ApH&qM6dWixTJUti^QiDyz!}f#IB(X&#G*fF0&4V?KStp5lJXp~ z(G^~#xFen-#-cVA5U~_W9jtk{y73$SKw@{V$K5_2jgGgwKl|w;EgOR4*5OQo{ zyuo0o3{)DL8}qMInChqd%R0pdqu%fH>l$K3`<0f4N#1MnROxhHTk$8Z7Z1*gr4?bF z)@{-3znZ?I8qB|?KSkb>QSYAtzNyO92wr0x>B1bEWW*;UvinF;k;#ZOI-q(X30g$3r0+7fXFI!7Q*7%k{}1KvB-61I!8#v%s`~0Kq3FAK25{e)Si|XPfp- zHEq~XTwd?-uS<0rYd^nX_Pt$utB0GNb9vo|zxT=e-#pTh^V!eJtkZoHK(>BEI5L??r@pyb7F2v!|8sK_`a8<3} zUpuYctvvuyW^J!)x|VRYq?QYQVjvV!b$_B!nHNVej?1XpSIU4Qeh7_&(mAGvxlX?H z0szEdqsM$-0CUnbVDeBsZ~+49N{Lt+YDHzvn2gj;2~1gA#{z7;Fkeb*BiULrF>x&W z&Vcmpv#Qd|hUNaAGT-J+>+R(&v8s~dNc-Aobn}+2b)Ea#&2CR$v&W|U$wG>nyX|0jzb*j3K##=*4@D) zW49rex9pDfM}laI_oGJ~o^o_W-^ZrA{r>K0e5%{$>&AQ}8EiMGzMtDKcDeIgM6q)M zW&N&E5~b3h1qIZmMhsgFyu(1WxRqiNlYY{G^pU)_Jh5=9sKs4WBq9xy7T~Ti2z^UI zDwOU6xW=;wf|_s{r9gV6LH$@58X>L$)h$AQ|5H(Gom#V51%*N(D>j(&t}&V#Iu+#Ml2VV; zWjL2kpC*wLG4)#eAHwYtB=HW>UB2p}qN z4bA^$=AKPAGfN>TW7&P9%q5>EC6ae!+8%YeXnimNBXDd^2ey_eGc1C$_k z2kqa_pBAEj=7btbYsVH0!k=)1=}=kbo6i;{75hxY#4=x73)G3hSX9i{B%&U{cddqK z1`}^2-br>jvCwq3NgX%8ESCCWw_{OS#k8GXxL?bKGqJ~ z&5!opT&uTQI`@vZURSNrYa6!i`kNc|efL~9v^U}G#P!;+<<22My!i&&wV}Sc*{gg* z`%+_nGwjusRT`~jRnwo{HgNOC2(@njS3oekI{n&upRX<69O&NtGMRE?YpO{ zIy#1$D%Nh?-jdwwuG-z3x_)iI)dJ4Y6b4Gd?50>x6PWYJhS_F!Pe+rnVoQAJ)=e>c z^LV4b&RH0{JVo78#3e5hu9u$$B9@CYiv^a$C^USSbE-ZKh)e)e;#>fL1lE3vqq5{~ z^0-&NB`&qaqt|<^YPHp)uWBNPSH73u?5H#s6qqX=_DV}ZO?<^W+_i`=Pz)nOpbGVs zF6Xw1*1*ff7E4Ys{sqUs)4WyOdVK52t#52SvsK>voggI=2aa}-EA+f(P!-w>dCs6V z@P&p#L+#M39VOGR*3$eX7AOK?lqQt}^dSH{$PcA!4+mXMCq-|#C135*UgNfAo?L2p z(qrlri-bmeQ&1fl_#xi60@f;s_eC<{a0q#~s1xZ;?oG~qervRT_aj$yZ|`#HJyENw ztj?FXT(sUXe`Rdb?O!>$ZQBc9xnpxIw)u{)ys&NC$*#EG*soU0n{dscb>OMEu z)^4WHlDd()AAj^7sr!2#p(i*YqDxy=wRS9u#CQNmS(4YGoGT{oqN}`<8#l@|ONPJ#m3I5j%Do7CxM@H)*^;)?>4Px7$6soYaUvF%#?D(&6+*zU$5_4%CX?%dUR- zE8|LCh47A8P0e(h1fp}-kQ?YC`@*iUt;kqA(vp5HShi+L3juG(*4a%tvL<`ft)ufj z%sndHFFb|lutI1J9>wp34|rMO@A5v#r%@5SD%XzdQKjI7LSU*JD6GQoNNH*ZGf5tCg4}xAv+i>Uzh?S+AQk*v7?Ed)z!8HF1^62%byq7^o z<7rhum?{>}j}Nw?VW1N{AXettOYMA~t<=Wr?Ha%1B}MpU3u;m-G|cA zyjFPeDm$?3&*3ndd)7p4)N)=Sy|PorW$+4B$k?bWD3tv*&_Wcr{aWGw1h)_YRV$DS zHBssmS_WQ7Q4E&=3@JRyauCD$8H$lI%J=f$gNES)j$x_p=iC`Y;s)$xWq>B$Q^XgQ zzVH2+;@3q#Wp@UZe{k#}F#M2S5zyR}N++~TX1Z`wtpJ2cT@u;ANRpjI|UgSnM1 zhLd9|A%JYR+^R6HpQozc5s%o{PAArln1XG-&TcwcrMApWr)#O{3s-f=yajnmQ?RGLZ)+SCP{|R* z)M^)FYUKwDmSSolYDb}@DP81$|D>dMV%nFIowfE44VCH4L*s}@A>47;390qA z4iT1~NO`w+T|>O#`G!*sA2!GuL{)J@Fm)S8>Z_6=of}1~&4{q1DR8iGBWB>E)5!M4 zcTkxe;42XDm+9_xu=8cLq0EmoyO&|K@C~E;eSDr%Y|yx3Zbx&_0<=(aQX3j*YS<{c zP8!`oy>j=+Oi7NhZp}JvykXtFS9Iih+rnmJ!_=CVyTAIzLH?%s!Hz2j0@QQD-+SSo zt2!$6qictJonZuLfHD@WvIik`dpS|e<&WhZ&pV0y0V)j{a|;rAc^a?Xrzt3q8IvTX z=gMVCFCyq5%S-qk0MGm(6ksYAg9PZMA_dAaM->(4R(Mi@p1twK^hp-Y_h~6z?Yc3c zkfjZ=@S^ld`ICRSin$a8P228I4GtqTk-a_llZ@s;xX1Vud0f~6|F{Ea-i!Pl18!2(LC#U#62dy=6zfU~?#A3thmi3W z0+tDsI(n29bgtf7r1vo(Id5GQ54{ za$0Mfo8?Exb1p;AhxvZ~IHV>MXA%pFf3D1ZKTrKLk~wfcq=FDQZFXJR>mpj_r>2W- zhQjB!8fwCx+}R?7y?Bc6Un5uBOZik6HK5PiO6_X-nv87rD?BA1&p|AX;=Ka1h;%pZ zy<*{g)ydrVbs6akkE56-^qDkDkY!1gDdcpT?100rajt88w7X|?w2S=ii7!8N{E5et zH;e{lvxo6@=;oUb9e?s`PapqkVDxWSNl3k-pM!)Xlmr$!e;P6pWj3&X2~pHYVlTq|=~re?oth<$>ATb4rQ#B4;B(Rs z0w(Wp`oZ?>4;*A11fnT!$0~TZ{a@ucFK-Y4Nl%n~lW_C=KO)A(CGg&2@}8NzVJ7#Q z$w4!jhNGR^&5>!244_UB_De%`!CLlxvX+b2)@J(MwY*;*Su;e*eL{G6{#kBBY~U-4 z`8O)bu}X5VlBkj5Mj!ILnH*!!*~6YAnn{xxLdW6*vro%BZ0Wi5v3M$w^f8<7VK%gK z5uHt9*=*XyN`X%nle2B)WE(lwM(%AR2iwS=HsWX_ZQMzY9OuX}j@-+UgV||i=Yb2&J@TJO*c`X*&U z?H~@IFi?ap^>TzRYAvL>Y0R>ZnPoA$qA&?E69@GjFUGe9kx~k^>LQcpNB=vFF8&EP zLuRhLuC;cobs0uii-gg2=hc&5Ua{I#igm`9{88mzcuC9Y`T}312o-5{b9`9t;ZH2w zH5Uu#mAXlwmc#!`wBN^lg!Uz3KHrQFTosOeTx-$?G`FSJe7NZnt*f(RLCb9GCiKm9 zU8?V{Y-`kRqOA>LAufEm2Q@^){Zj9A=*z~g&VGUnlABSr$}JiMzV_)_BGwW|Em7AJ zffpJxv#w>x)JVXik|e&AU9hl4kxTu6xUOP1TwysSw4P~AleVcT%uO_uyLLy2CZdVh zfdA7HY8hzZwPiMKX~|T5bSnIpFbRc8eYiesYjTCAo=2DnO|&k}x8)s&nU0&XBFE{y z?@vZwph1#IU!brp)ICH=2&w`J!8-&7CjAnQwbO`9zv)O3iaNX`f9WNrZQ-(7g&0() zaVn|VCYzcUt0SnBXiV?Yl~&iZ_SS z05Dt^;0KS%cIWNLm+2QFh0^DTx9)2p4_jAY3z59H9gW36v>fdpk@*08C(lwAffJlY?@G#oDfdHb5Q;T_ot0#T+;eZ^3H%YkxMH+aFQ7H{D0hKPi zfxXtvkqWs7sC|#k1uOD$mQm^I_WQUmNOVVP@PSwABg8+Hu_3w^ywF+(L31azcA-5Z#rPq4Eu?t<{0h1hH%h2W?XUDo1d+`pM9guGl}7Gnq^EDOi+1 zwah+>;8Hk*At&NJ?%!xOmWE<-F>v}turAkPP#R<|1OcU9q@gsWJOk$%dF=dS8OW{| z`3?%y)pGr_*UyoS=|_bS0mK86iYQ3eQ%lfY7a zA3qN2`qm|-{f-P@iwT8iMrhG+_79iP~+!%At8(l0?JvQ5zFb{ z6y1t31(b36Hw1xE0o7H{h^%Hwas!Pe+Lu zC6*1E*@)d=RW_}cRZZte7%8}jSyUHQQF~OaT==&KJ{XbZ4Ff~v{?Gq@?fJ8VK%J-Dkf9zhDyz>> z8RbIYaWQs|pPp-u6#%Mnk;+!LU!*e9jt^WFYyP;_pt5JsJML}P+7oNLL~BYl(pYwI z-$HBLtvp#nnS?JkEVa+_I4P5wjUJU4!J+q|g5xmf6-!AUMsshR9E_7aaWWGp;W#-E zU!w|QDpcx&G=?cjJcgmk_@Rdmi;?OLmaPq{hUtdg4No`70!A0$Wa`VN0(DbHJM#bd zkdXvXAyL9!s#x?^QQV5f8mE|Pv6AU-p3y6y!J~|2cOtlNj|%4 zRvQ^^Np7y!h1VY(O6(g68q0lZT_~B_I91jdi`g8l{WEQ?vpp4??ws&f^lWQ8zfsbS zxlJusePP<)bN3rZ)~>ZjLm{hcV00pwx^B?7JSLT%7?umHaDqxZL30YO;}(ueuA+u= z<-6y)#8}0$^Rl}2K3FlR+}e-kqhi;`wIzMOWIfZSCl)@K6Z z8mvvs6ZkdsLtHQJ?vLhrrCCoxWTj%SKtHD#L2R`e+VKYNpxA9~)Al9;`MDcV4lBp2 zON{l5O&*vegOkKQNn#CL!aKTAJwirC26_kDI;;a)ZO1@|raIM{ABY8FWv%J~VX(9e zvC5S2*lBwK)@oWu2zGy@SJNAx@>`@>LvRHi9uonmu*#f>RP}DF02`+YxXDCyjEQ~y%#b$lsB`x8g2uKr#oU(}o2 zH&iv!)1*bd==kAmg7$v1T1wHrGn+rUZ*Op<&9fpcdntRnsr{zKyi&cl#+Jz|#U3NN zUqI$EcC3r>#2eU-T!8t4ic606HVH$~db`X61yE{IU8E>&d^=6S1DC>O=LsD^W6vdPNGm#io#j zt)i7Lvl6S7GZjTrl8NA;{+M2_uSgZ?Wn9?+1_4$LuRAra(U^%zmjA{wHzw8Z1IGsV zuQVr)>UppN!NKm<0Y^-?EGb8CfCFA$3opC3Bx_a8uyPWenj0cH|CqRLT_~HU)A@<0 zZf9zNdoucoHreWQ9fiTr7yH6BTbm#F_D}YwUroQ!cFT8frHES=Q|IS8KfQNzS%db% z==O(p#$r1k+P>|J+iPmJQ^^@wXtFbm*9}o>CBqUIC7syA+<`bRk+ozikk*w_2#AzY z_LmrCmov(Kc+Ov*vs|)W-FhFqH)>2p%qVy<;fU_$H8U1;#Tx1UcM=nB*(bppt69PIAC(vL*652uy7?$iQ!z5%OA8p1z@s+W`(bhDv`=3$~O}i?0-sh42DU2HZC*gA0QE%3=i`3G{yc^zxVjy~m0QYf(T}E)xuMqqbnhdg+2_Ce+dyW zL{uPL-k4C02F-4tEmf@cr4&+j*`nM{uK|#?MAwX>CAr(f^7|1;6LX^wa^6L=NfujE>Gr-1?`p*d)<^0;rZqDCAm4&7(xxXC&do(yE^f`}O&ZA#95Jem zw}Cv-ets^JlG-nFUKZEQMzfKPeINW_l#h1f0oOIP0irgeC4lPOu(8nCSq&wIq4=O)Yo@s-S5~wzan?=$#VI?Nt3&)sgj}kOJi&UmL#^@Piz**b}7%B8l zAk&brpWNdQGigcE6w!WF?-`2;)ir7FXTs!QnCuCYnJ`g@$ra%y$&R?FYhL_B(g)!J z5<7dM+D|w?Y4X=f4_)=tS*!w^6B!^+X66KQGuaz%yu_TeXiev&goEV_*32$y2_z~y ztL$THGLKpH9BPr5p3~2LCi5Js*RKmVU*b9Rj%8~{`u`}cT{E77N7VUaE7y)$^4QLJ z*|_?-afzy6_`==!uXCP=Vv&DHD<$8hp!4Xa?fH8C1I$DF4}1s5pWr9v#7?cmD4EwL zV<+Sl+^5k>lB~W9?o-RH;bz6QCSPG?Hz!-y{b4s5>?ZMU(vdKZcJclsi3bJ((*Yq6 zutt+LxNiritp}_}t*5LXTIJTl*kFl1FPYEOU5Z3WeYA^)MJfB0nipwkHi3gV3;OWa zAaihqN;*ESQtFFgLKL--%L<-*j#?W(4mT(LFqvX)mSg7}xn`f-zUhLCF&l=SBi{Ni zpSIJY6X^}+44U)&k{(Z8Jf7fS!kTFv+fvnYd)+?m;N zYTnlPR@%1dX*tcf2$R$a>;X(pq6&i|uu@xKJu@C6^_=3Wm-Q^Ks$F5(mU^ZfMCv*9 z+ohgWp}H0Ng4A;l+Dbj+J|VU27J^-om?|O{_spn>_DoO1yPyxsL2w%QK|eARYgqS- zryvEM^BCh#QvX9_2R@&v^egeYwcXovpj#hza=x~OZX5- zKNrZXMI%PcRn%N!#PnQAYtau20F_2@uJ}BEY{goDAIa}wXUflJ*T=n$o+&@+LeGPZ zMBPZr8`sD~xR<5tgGnHmVJ+i&V0X9;`d*>@S~vnJ^Tfh0=JwwjS$+51w(d zkxoTqv#D$B%sgrJd?=@&&!T&L0y~Bo-NByrL~Ax=pT;*JdQy^OTC`qL z+}O&Vki8=qveD9N@r_Na@4sPvr{@mrU(q+HQ<2AZ1XnD^(#QQYv)6-kuR8~dYqByD z&L6|nQ9gl@z*ECo2LP=PiLDzhUn;RRb@AS8dvG<@JN$rssF}S-Y){r}CJ=@@l&UM9 z@VK@Nrno#;smt#YTvI)D1s;p1(u2x2RmD?(86cqnGB99nkB6%!+k%2APidLVF|S1C zWXd6pz(82lX%sbtDTT5&={xvambqoZCXgkKbPPlRE`?EKd0WQDxyb9XHcy?r)~S;x zm|JE3$xBpncroL0xl}EO7t_1vXNB|y0EMAI1GCw!D(axyvX`+z_P3oonGIC>dCRF& zr(gqhL5HLmM(yyr$E&-2>pBl~9_>8UDU=#ox(jnhIvjO_uG0LZA&$JX=>nmkVA^%S zb<}mr^`T4dprwhDIyj<)Wc3m>2XrR7VlW%uZO`lx`ezb zH;mMKa^bp6@6-j!Iam5030hynZWyWek{8YN zPI)}I1VxZSyMA_(hZdA*$E4bYKh9N&850w`HKb8fZYT9Qz`3v{m?hkx7zF&L{-tqK z%RL=8qU4N-iL@*Ored%^j#82Z{>gw+EkaWLHRPX508m{DZ;HwXkk!Y*Z?YcSD*hSF z$}SeZ8z;}l$|Rd> z*OT~q1U;PK<#RQujBSke!1`d7PbB|xmBbyHf0^o=ek@eA&Bv*-ym4WHB4P1sD4*sj zAUQa1`c*s;tLkEu`Qtf5SrG!jA^1zOe+st%YMWpeg0wx~z-**w--%1$#KQY?sO_=b z{^?FP$$(mg_Siq7;2ZWzcZP_(WO+-QfrbpQzOiGJuOG*bHFNj;zam^!E+Sn0b$Bb) ze+zHLOdoK1X1@Oafo{bglr-bHi_xtp&0+1Nhzrm?)!-KX9;d?tc_WBjKUPNWEh7iZ zh@%Xfbkkf}1?QmW6<>7m@p&^&%jL=^u}=e;&kvD1nSAKRrMk&vFIa9H1{GwaJ@zzE z0i{z)W2h5CipxB#`z+0v(@hk4E892UumBm6(wGHAaAM&<=1kU=z0+8-9bu&~lTfj9V&ee1QJvjvLv6U4j4uPxR=rd9Y#tiF;GpH;|pPU@!|#RZwj z3>xFQWOL30XZ(ytMy{@J<<`kj?GXWLES_5mfmNnnTr8eM3)YC~lS@TwP=Jh9uzQhD z?BR9NE7$A5x1le*kOafY-M+uc(`&*7QN^N$VTd_pA!5 zwamFd>1?pR;9 zPe@sNf!^w7a_EH@G6;Z77J7<*l0U-E#=P>%Yp+OmEJ-jVwRvwwV?+E1)zPaZ>LyK@ z`?LY4#~s<(u+nNyIU;Jlan&!tYxqkYgfzE z)E)pSkz|QS5}Z*n(3|>1DrAZD*O)J43QVmi_akKLHcHhZzK}&>ES4R=(6B^A*}^{$ z3Wt{DMy@@t-XNG`+opYH_z&pG5ksXEh^|P zgQ>&Kz@np=EE=Jw0oIPQOzz4=Q_au8-mzTsWqu(hjWT}>NkYAZmtXQCou6~B^dd>I zS5!}ydQUAzQ_)~80*lAReN$Of>Ko@{sqck3U-b$<(yF*FvX=V*BWDq(=v?4CD&or{ zsW4YIc6Rcm{@21t$J%4`aNCzRN&VA{4L$-^`AIp7yv|Bcz&5ef$4!I-;ea;Bd2Y9Z zI1o}ASI5I~zF~uQwzYD~_ZJ@t`H0fzbo!J6S21N1YNkzyds3BTN=s780BtNQE=j?y zvc)Cga%6zTi|n2H;601cP>2DMqC{ORN|Yd{M}vwE8FVq(J>)JLEh<;-D7tV+SKCl; z%$AihHZ;`egoc&1C)3-TxA=UUn`x*NDo$m?MdeDlfO3e2Cs=$G>cuNEgm#7%+4LSp^_V$+g0i#i_Q>Ur}>Xt#9O`dX5M+XwyX($6UZfa9R7=sio7RZJ! zz}hGUF5ryNi;$H!M}E&DPBpTkomt>ST5RN!u?lt61KYp7-A0I`eMcYlUkQK8hAg=M z_SxoZ(;rFriZ?#j+V~IGXF?Rp5?8NXg0$wn6jZTs?-P40SAKbS9lTm(EE}Y-ZOiww z=!=`TY}w3W5-$7VZe%hqVqHseoxGpjTp&0Wr9%) z>(ZW!#lDa0ne;ud)U&xgxw2129p!IN5}O7BniUsytdn2CGP@Dqh8N zRU}}VatgXBPG9aoB8kHZ5ofXhCP3WdG;$GXav3WYmGfCy7`&INZ?ViQ34e)3Mz1vd z!KtC4%z0%gE;5mRj0(5ea$M;r$mpd?atX36>7IFdbt|0 z)M<5h7Z;VQQyQnnp&hVlP*KLZ1n>xcN|Tr=YzRt&V+t2RJp%D>1>7U^+^m9pyz8#z zppSq4^9tBU5||;*Eb?Re-I?^M?VCZnQe-TRkp@SBgfYxLo}t|~(5|6>Wn?Ui1You_ z=6@%{Fmr$&TNs!4<6L5;Z=dzeq!+30B#~wMrbOnhTN$G(^*xM{NPQ=-Vtq?d2EU$* zu8cB}#!Y1xsqaPEg@pi{nmSg*=t_N4*+uF*C5>C^`;T*V@fA@9Qr~Ya_C1JFo0*7S znp{InVrJx$EP_>(A|z76(8z>e%{6DnzxWyHDO4|#X0Vn!mwgJB zhbP-($(3=#tKu+}kg0CQQ&^-iW`c0zNYAS12Rp1`s1CRIj3Mq6K0$4Pm9d`83T148 z6ajQ`{6k~}?Xa^%6~VEV&qda-o?)?I{IQr;HDlbPkwatqJU!w0FdaVr@P`jA(^+sr~BsXm})QGriOJXhpo21w>~p9IGNcNMDh} z^=O2LzNu>|!UGn!k8m$4SU!godA)<{%&s}T8HqN&LF#*PmmomPX4yvMn=~ za*SotXv@!C8o7jj$7VW-*0|}Qj#A4EH8o#jwB;(7wUv6NHdWR$>>R#K&t7^ujAfVT znc8t^&(ve|I@XZ(?M2_^#(iUaCR!tLT%4ZvwI1S5CJyl1uFk02n3yhJ9;-=x|^^lrB; z)|@QSTeK~@sb-Im?3fCwrybMBrUiA9G$(`8)4^o3Y%I6XEZ9*4q<9SAbJ5cVT1pV% zYb?PIiMZ<1QHr{O)x(ViXjV0?jt7Je18}a?M^2u^f1+kME)A$#RUL*Q7m#Q~Lg9c) zjjAJFuas=J=#i@fYEl*`2W~*bIV%OHkX5`hVVuHZroQl6R}(p2U;-+xdH(g#{@k45 z`S(+~dAEhq1zrZ5OCD+M^K?u^qo{NJkG47u>|kciVe(>B=dQL`s@=Nm>reFbLd&qKzo)=xC@Eerwn|5F4qtTI)yVKRtX;r=zvKCy;(p z*zXKki;AovXXceO8C%*!i(22--L40A28%hu{uOc-#FuSCuI}f=8HHF_IKKJNOlnW+ zSn7D{z0{eMB6Y=~r^lZk=Mil(KJHE!y2Is^y4ueys{ z`^MV$)(UGihGauLQI;t4YvOv;kR_il?GrW8 ziFOZOqcwQFQjhI4SEIJByV{Ix)hkXcTl;f||DTG9kxylIIaarp?)KWcRU3?ZA79EY zb~`|br?&$DcUVR+RS-{*k-6q}>+)Pn(12ou-4BmT?a4Lh0$g0!1|!Gi8#j9s%Wepk zzr}ioos#xWGP!X=D@-Wkk$TN?iJnEDvcA8C*0_75Xk(!fJ*R>-s^x7rL!VsIg`g=| z*?ru>^olbGR9dOAp!G6sh;Mj~wO+$?&)>|ocP;5Gz}RpCV*|14usT@8!u*q*R;`A0 zL7f5Hhy;KTSo-}8k=X=;&V_>xAV?Q+8XFrT>KE0KhDPIH)4pKn6ODrz_>D4J(av0U zd3E*WWtiOJGmM<=nSzsC0e6t**UjNMiW0z51WLaTIhs9%R>@l=XOzt&&OvKaL#@G3 z+t_R!T=qnTv$(Q4YBEKuD~rv*{1|k(25A{R+<9+fMn3s4EGmWn08DKP-9%U&KBy6b zZ~iHMSoRK(U`PnfRxHr>cLpv9GPIuW_~?QYzuzl^e)wu=$s8s(;M8m6Ly3#gHvfyk|A6 z#k*2X9!E(DYSYr1Jo5W4s%67-Q?i%&Ud18wM=Pe6Y7fl-+J}Z+zlX3p1!p^yXSxe0 zKX*~9Fa!CaMX9h~%M+Y%ov%LCd~cS~W?y$_nQQh{{%H0jWlz?s6NNRLf#z+%nXqzt zF&C&axBOquz67wX>Pq|F_q17FBwLcT*;*~jlC0g5EZdTvSILXyC5{~1k?jO0&Wf{; zjS!p!!cqzeg%AQ1G8AY^X-V5O1GF8ImSsAW37t|H+EQTJVM?I`)1gcoV&y;gKFJ$l z>7UiIWxsdNJNMjkzH`oZDCuo#xD^*KaUVjFzOjHS<{BU9H36R(^M-)q6&{-4(%t}UEmkNc3ldVR5 zl|qbP2YShC{#cpbs&Egr)zo-v%5?ByntTWt=Fj2kFTh@r!1Xn(SSb~G10>gF%)7aWJ;Xe3(F(|LErmkJ~Q&b)gluOGt@|7ro@YrZx8TrA&%4Z+&CEPqz3K z-a&tbEAt2wPU-grEHy`kv)KNlzZR*LGX4{S+Qw#WEAK;Xa$vxyQ1uNjhei)1=NB%k*VzP-?%DCTF%BVqx{ug~OYkmeYeEqktzwE%r3-ANw{6Q0t z{VjN5o!hAhcnM`@jkKZKR*$}4U&DP|Q~#49wMxdr_rq%2_}hb?B6YPk;PVCMKI*LK zS=MiqtNVrrD>(}dwYyJ%Z(9Y+7DD6f@k_@j3oE4q3=OrfQ25GvkjI0b$hM!(F*0B< zAppD=c=z2wC(!K-p2AYiDsAF0jGnj)te;$>z?3t+3SN$BhM*6Bg09`AoAM61$)(k} zO>()(4Ji+koc=|1z$lRz1F&|JRBEb&xa5Zzuj4-fJFvw zk_(-6p;In&!iD-=5H*#tRXcbwhhaVE-RNmIdfbi1N!x_pO%{chHMcJA3E?Y3Md4oli|~ZGEC#nO{Dhqh z{Xq>nTZ2y2AVUp$Vz&EquAdx>h&@x-MYPs{CPB*r9c zH1Gvdw=TfC4|@UEDPS}aik9I^Tt0jdusI_YVvVv3WoGS&XwoDxyUo+)r_FDe`7#-; zkz}NdfzBWfbtBFq&JVstxPgrMN;>S~K^BmkYM(>f=oe7#Gk2fiX7j;04BwT;n`; zq9LP*AxZcLyzBq@F?iLPw}2lO(u{L2!2DrmaZD`^^i5`%N@~slk)?b&{LqC-C7^p) zI$4UgiUkTwlgmHQUkF6Kg@yeCepi!4ArPmTM{(PIKCg7|e?K(%@vk9yv<>&z*Ix0} zZKUu1L2J2LRqS_Ivxlt?f3eD3Zbe(4CC&HqnWc@-X5alLP9j0KJtUJJN<&g9CuLGu zCcsr-oYYA@k^t8ufj$Aw!(RvbWTRTxs>fkq4~|W3lw58E5=9}5q6IX;D4(z~ILp`L=auK8-xTA5|&!SKfhlAiH0yqCWISZV}P>O|~D%6;qIt`8h zMWVO#&Qgin@Rq2st&N0%Fx8_Jo#dbSxERkwNvBtrRw?NdqYrg=KQJ+SrOI7ehsUOv zqdwl*+?s@bqDh{)HR1{b0j^#E%}Rr2LUkSZcxKSjZ?jtr7mQVr3sJZ4f)}>Xe&Z1% zZH#)$%Dhn{kCt92ZDuZbXqG-fGq_((O8bD98HON)ChYE*%*fK{Z1jUDJrg|~rKM5i zwj+0JJVw(|d(3Ez*`qYSKx1NVC_qyMyMRR$Z$lV=67zF;N*s;jUs&s;ZvpW%XdaH` zFz-z+TE}cSxX=@G(i)A7A8TJeiD`x=ck|rz?@v`s-rXPnvv{M3C%492bcriwmGeX! zqZ{B8HBnb~Q|=Rm%nxV%g#vkXlWPlTr+8>c4BENH)l@AP6sFM~5q-T~t+vCG>7!`xY<5m3_s;3$A^a?IyBK5-mYuU#{1-v?n9D-18Yx%8_>2TT0>|?}`%|67{zHqOw z71Qv~5Ic6UY`(;oH}&!Hr4M2w`iNBW8b z9{GaF7--HuBL!koo;Ih3UjSp?pFodhuVc=MH;Or~qBL@6_x`Z5E@6*k+gj*b=x;Z2 zoJ88$H}tclBQTfMfwe&P2+q)tVCM_S+5lGt;kUu-*I;c$V5x^-w(gob4?MqTTT$!C zkol4vy&`{GPJdaB_Q?@{SiW9P$K^;auM~`W8jz#`H4I-GMlaz~%kkmEFrbmwKYF4P z#VW^PT9M11aZu^8@|N<#3@7oTzp_)2G|m25_1Pzz8sumBIB9!92h8{;`jTRt?tbAgH}_| zo}pxRH>r+lTXW*-bWq*2??(r=Vy1O1-9_|h%YlEoCZZ0euRgK1l^l-QJ*lDHJtphm z^%*zX?ixF?Dt&0B`{PH6ZrQ3^Gn;lrCLi9}oU0MT12+}TJ0G5m?AnxRt+o+u7~BJ4pYynkVl2gDx?~TS<6(N)^cU%D^_%i z743u4&|&L(E6uc7k-%#82u37p`rZA#{WJZS`g#4BU_CtIne6Kd7Ib7nRCG)Ur24`T zQ)$c?xF_KEllchJH!<}+;7f$^5~>BpLGW1g4hPig1E(__g>ogZO09eQd@lUu{CYn9zBzL0(WojfJyHle6&r|zANL& zJqNP4=`qL3TUVjq5iw^YSFKCO%-MJ6_b$xZiKW+F70HrMWh+U&wm|s8qNdk z%K^*T|FZum2nWME!;GLlSiiHL+2uk(7gD;cE?VG1yPQaXCkX9UqXKnUP48BrFvwq3 zqoNB`sGuZVvZn;no8jU;#f)xLthi7vudl1Ws{YRUhw7iH|FB*tch$MBa^2~A$n}it zLzhsiYEIK!uDxtQdv1D(_y(Ql)d7hhDp9aPXej4*f^=ZRhC{y~os=y$3xe?%e(G z)Yk9pVc9+3**f*`?oM%b5Up)BdGsZxok)XsLMIdp{aqYhd3*ME<%w|h(z6(SL)XGl zB|w9);h>%)0eLyh64ulrUC2i?4cYY5km|#|p5RoqZq=5nyxFnQE7H?_ zxBk;~U)TCp!&|Ta>fdq2*-t_88-R~U4}ES)wzd=k@HTUzJRC15AL{DsLXxgn7u}|h zQ-hslHK|}wU`T1pqe%fbd5IJrx`8tpL+*HI!2lx2I*}3uD80qYB>YN37>Wa276fjq zww6LE8Mc4m{LVA4LfsUxiP&tG>X@HmE}>UmDL1=R_3`-j0cT|ULu=RH?nK(XhxAS9 zkfyoXNGYEa>tKMa80fnccSlPPz#*v-h-P!1~ z&;E>V`R)&v?Ma793(HIfvyI^i8O_nF8&|bkF$>W}r@Gc82O9|e(L4vK#Dq!YLY>PM zE{ZFMVv?8}hV48JC7JxNO9w@F)!H%`%ZlfnLAfceK88%uN8r4;&*AE0pN=U5s21mi z@|aKwZ*B?($qR*Cd^|u0V4~L@@n~bL%hfy;hnbjdep^6aR2AtTop92O*4qk{yKeMz3Rc8 zEwQ@#O{-T}uK&xc-?_F!S{N-eYNhb(VaEdRi5~p^4r&Ek7ioamS01Uy;9)$T3TQi` z;uS-Q^9jTzkR;(w(BgP?I_^*gpcuC$89h!Q)q;O@~>d4LaT4;Up}+k(HE}>COzJ`Q-OZkHM4QZSem%%YnwZErae#dM715Q z9kq3v_a0d>bMCs<$c{&^-0C7Rth$NPuE4n$NUiyMV<*l2S{CYv5ADMY18)muPT!Rhivxl~|mypv2*F zNGz;Jd-L^8lgn6DiQ2v9#I}uJUF)?r4?104{)+IG53Ehk4BGno*G)C_y5vk_|3(2% zB;c9MW-m`vC=^-hyWMM7D{Ja1fV;@j88&;eL2mb$qE&Q))J|;Z?8x_Vx9H8{@U|VoP18FSv1Kn`C2=-s;lo z-4>msv}x6?API7Eft_#w-efk!70aCxT<7Iv<;sMUEh$UbXS(MU?;Gl z!0UAo9}X_l#2lJ`DwfC#wwv6g#pU7d)v@90hwOsF645gS zB_iII(T?#(%~|@4_o^+cboSAptvhVOqrxvfR6VseEtd^#*yd(Z2d)dQxqWo@F^FXF zx$YHI0{*K5T%(J1ThwuC2(S#dV5|8-&zo&)g&pw~-A8Cf|7v8NR?3Lc7=4a#|`;&N=DIktK{rwO08 z09MUS9Y!}Vk6RYZ8Rm6ed~N;e1@na&Ben^EFhW1sAXP_Q!8Y5xo!((D)8!fQ&|wd< z!yk8-d&JEQyO7=0<)Xb+A{F4YHNg`>B=Q5#N}$SHS7%q~`V79qjIh-FI*#0POeuZ)H;oPsIJ=WY z1(J}{o@iywT}WNGpC6<+u&eYT+`Q%(ywKI2x|uiiPr)(G9Jp$YGb}$-?)#lQiX+{3ZL6U)kr;_N(H}9 z3OgFF2_FYA5(3r(jPh9GfXToiH(v>XM|$ROANDtlDHkF$?FK^mge{y_mzJr41|qs< zS*!Mpwz<7SU+7^+I_fL6c6})=;Au_P((J`w@G5s7OB?+9qS^|r$D*(d-M(qozu~S4 zXIjy`XL9A~JJ*$}2S$cXvmaoeIXC41;`?1BdW3&?Uf8*{(03H9(IaaGS|LWAVw5OY zQ9#=mq!QJL=o(=45{f{3VTZURF1PEvi;-1|%FAn{cx-eG#{1^Zd=gaT!wJYN@`UEx z(M~GDmpB4EueCk1d1vEhb91Dzp;2FIDYMk9kJh#|hN4~WmMsG=e~|U#3Ea%xU5`BW z&3g}dum8W-zIPxlE@aJq^Wc|$mVM{UqBEbIT40y&0=vA18fHCRaeHIj&DdL7hN>iX z$r$t+bf9y?=_@ge;RuZ_B1f~VXXHpKrg`_6UYsh z6XD(}G6ZV=2wz})@iCP@u9jHr655=b8kRHR@CokJLxI}#elW`&)zu5l^3hF^=;otC zk?q4lYwHSc_42`#AzazFa2}L%eC4&QU8Jed6!o2 zdaDY>;Ak5wWH2;`W_YM<*|r-&mq=d+)UFF~-w5oEmP;S-&Vco4fQgJP287hTz^#bk zA()~&)AT^o`%OH5oz3iY+Kj{Q^={hj?z5pfTbqq`*bo^SWHTa9AB-`sQ54IG191+6 zeHi!zSO*&0NkJE8|9&L{li47ig-vA^2H_X zzk^9lGz}PlL!q?FRm)w@uDS}IK*TRB&hF9j^s&iAx~4T?5jUn98-!_9a45>$&YU=O zO<>E$2^eB#6pIC8a&1M!%4W-&t-I>4KRo-x;p@`&bY*<^C@t%(k8B$7;JD&6_|IEm zcPSxu3bR!(PgZM2kb|}5_1s) zo+xY1vz*Ok=}S4DFy7Y4j*}Zl?{A^$bHT0O+BN-;*L6N`>E4!1u4z)m?w+V0YqikQ zBQG6_)%q$%L)qQDwteTWZ%ZEi&5`Zj+uPi*=~yPaE7=)l_0wo^os|RPvAi3 z(l}fohZn+2{Oxbk-@CTGZuFWXC;HHjvp=b5kJv80WAEM3eZ%cAM^_|dXIS#?%GN@zt4*+fTSLK zmN?->+0Gh~5o!CXC1r4@uuX8x^_&CF8muu!0nDJ&LExD?-?<=*_)**@U|!4~t+A_W zg1YJfv&`m;SZ}#O1+e|o&PbIcUERLAk-m;O@vqtMZ>sBdm6w)`6qOYTj~r}1_KhE` z)p}x8nS;x!i8p{T1l|aoA0D?N17b*6RHrys} zxblHD=p}NL&raNXqWjR9jp;*U^!G0AF=I z+hQ%{X-nSYU*toHW_fw%zrbiqexVVzsq=j&+V4E&q^F(8;AEY&#EHrih3Q%eRb7!P zEsSI#{yB3~9#xV|9^f^MuB&GPUb-|mJQWn7BIK9EcarxNq zEsZjKbM{Z!zwVv+=Uci^DJtB%@1MWiby05VKR7mau;0R1;G>loNu#aV|IWT$oUKN` z5+-jwe>0NewC5Aqgs|t<7jN3|@Kvn^%-y2qZ4Yf&|Fvz+qKg{}TCaK-s%rlVmZ*c* z2U*i^vOQr9%uj*34N5IkLdOSE(kgVf3f-(i8&p@T=wTJ=QX!ivtfGOp5im^EVHniu zsb;JDfWyTb^Y(hjz05HR;3fnL`3KfgEKT6%8(N9W(+~v%j*+R?rgdv*C67`|M7^aF z$k<}1AC6D3ZZIJalBoa~V`04lTMJAb_X|5sq~U{1eS><_Z72kEb3%E7TI-B zjWme9XKk<3@k9lJ7PHe3TN%mTO^;lBKdXRG>v*l8scCw?&*?v7D8T(m+`!Tkwl%O zKoW?L1cnc<30gZQ!f8{zRbg)GtMw(kdZDniq##&h3yMpmLXpm!@H+dN%nEDBoDNTP zSc8*C6(C((z(DnD6T66H31I^&|kU9;_naH87)Q0STfcJyBDuLVs*J|uOE%)SV zHAqKm9%&`tLy%UO(vs`$z(iVza(3p>*8Ka4XGJPL!L!1cGju)x5=>ZNIqp?M6^i8O zU_r`xB$z{VF%nF!g9cl;dVk;-L))Bw?kYL7nLKZTRNn>HfT|(VHHR4oN8#OuUgYXs zF73idbN;8}Dw9VDb`G@~NC>O=%$XmcQ;<#MpMl&|JJ{MLz7FYx#Z9UaYuyF^DLI4Z-E9mMs(Xcdv{PHJDSs{`|l>@n4# zGK|LKCkIj`%#Y9^;iHzZ-tux+m6%`0PS?Re>rvNQzjDkiABVB$hvo0fFUbXRIi-?G zDkh+6PbL``L%TujXK%$cKg0MWKBRKc1xy4x_Y7DfkRNyS&dstF5 zSby)7U+ZbER)5Ee~vZWZUsSe6?@z;g9$);1T4; zfJN>Z>vpG({_57r{l7T2tkM%R6;|u5{VfhCR4M<)BS`+-l^_$+dkI~g0^HTf$!JlH z%KuOH=N;hX!3;_QVDZKNId$pJ0$g{{4iU@-wzV=U>KM^ZM2|#IL>X2)p{1=_6xBwx z_MXv_sX@u$`-Ai#E`+oXjJYvyyu2+_F@`ejjL$0T7*k~AI8O?pKm3EyZxAj{-D4!2 zXep>E6vBXrb5sgBFNdC+`T}knjl-E-LV$R1U>&1;k`yopxU?#PMEF*>G2*INap%vk zZ;D*=PX}h-(c;(H4+I*ES630~UKt)3@Ytb>Qe9E!^J>a;YFV*B<7_nP8TIO+J&==L zeto7DsvHWmetWj7apRrCBS$wil9#+a`?LR*efQGZ%uLGI-4;lc7%SzaP1{zr-2c$m zj$CD~FqQJt7ap^8Zs|_%fr$<@)?ndwkR+r?s7ba-lo*L=wayfXEiFk;ryoc^o<5&` zKP`yrMx2w&2P?-!ZeYQPR(FI@T_zr26jfE$Om$gejEE36dMOluz?LU14DbOi^&kKn zh!tLbmJFA4gc4~1*%@(up-Gc_y-<=*Xf7wo*(W|x5<=&w;1VR&jK1=DVnlz=8s>A# zImQbvCA}KmPrkB1h@8C?>;WluQkz*eBpWfgFSz!a&@HZCyWVv%z>7ocUC87zxg5fg zmNnh6?(^NW{eq*o$?a%@-xa~Cv05gsLKPWmo=r0C>h7u@PB8rS#t#H`{ zSF%(VhSDw|MdRuuF0Z3`o#mvAtGN`UCC!-9;L~W1dot~s2i(l zSy`W5pT^`v%zN|7`0;Vx6!!`rP8Z9_$KLf1Zrk?YdT&lrm>HQ=m~#7@%%!owsnf^$ z=nK7Q9GX^YN2ODBlDb&kc-?f}<8^#-^+@HUzX0aB`NrJ9ML~;c3sbGkl+Ty&Kn>f1 z?F`M_u$S}IrJpc}pV+KC8=kx-vqE{=3kQzAl(T*3<^_Uozl9h#D7e|oKa;1?cx~Ri z%?o0|-s8@f`5M~XYp9{61^7$`2~>hM1V9@K0Qv4>YlI(*sgETF2@*@h62J9=MKq#c z6O09s?}EQdSm!MBSF7YyIXwMy=gvVj8^nRcW%&@QFSz3X?>$&McJqxux~$2SD$SWH z^4LqcCr+MyDSg-&?p~Izp=W04&M$3j*7=%E0_NMAihxyxpSf+!p4t-6(j8k<_A!3n zn%}$y?V1C;KYm<(H)@74Q~F(%MljrjVDF;Y)2J8EzK5STe(tn9x8}KOT-X8dOZZFv zPpD(mTkPQeLv`(8ChAt1q|f!Bs-DRnx@TncnAP<3m1z6n-K($UkN$ZSjpBl%QS|&M zIys7tkD^;f(Y{f{pBhEOqbM{QAEghCnoOgIm~|)M0KjlY6V#GMqsQ6f`;VVJ&bW`G zb=Lj0dnYQt#Oq#}*=+7Y ztpHa#+3Kn^#hRY5wRdQ;2~P%x5#=&ona-|l+8i@@?N(JV+2~ZB^=ySa#_EGBqWT}G zY~dAfB1KJt+5Z$^!;n}JwyA!gkFGelx>C@-)pJ(qY)l4KR=d{_+uWqJ>&kc-$t|<8 z&ZfzsUTe4qE?E_*;r()+i7DGGgd~XJ?ybqaLvFdrqpkFq%Xvy@J=%FqY@#!$pw+d_ z_Ut1=$+Xnb-H0Y#p~`}6j^7EJ6!i0g%8)C2Ut_mJnobU(5qop3npOlmCt}y^gmxw+ zuiWgZ)Ot*E_t4(t*1HW-l>}%i5w-HtJG?Y_w{dEUWy?H;4r8IiQD|gX{%CNj^YKn( z=wv%-NhfMGupX9W83_xG9))A?6#cD;cEE`4qH1cqwNX~79IM6!P}q;ax{)7h%>|{L zRsh-nPo9*Va8I9@WBeiBa5*43Zh`6~~8Z`!-E&zzVZF{Q3u$!_Sft*c$OqqAwO#pD~j zGE$`XTN~GO+G_?64EJ3<(kK-RtCIUy@A~=%ue)=kwx=h!ei@XQlKOta5!OmAf0D98 zg}b{%l@LkcA8-ts*0k?$f2p0ei$~OxZ4QyWfL9juRT(mVBhxHFvJ6$0i>GpBv>=O| zdj&ogOs8`=^2Prscf#jiFWw?3=anu#r1b$DG`tqvR(r z0ctxdHY+R228x+3J_c1!OXUfw0-Ga0n4^kJ42D6ykzu;*BjL%FV*U`%mML?0jd#s- z9qxL(i{I7dZ(}pfj9cr^=zI&qQ%t`LHFr6IzT$YraSr4QW`>yhzsHI!7WN{0#P5<; znB}~(%7td3!L`^dxME|(EZ`bvY!((i15cAxy~xb)TmIe+&U`fge3n`ZtfLTH@%!Ms zY^Lg2L%mYT1V^lET4Sv>Fg}A!G}-UXg-a!i;+*>)g32KaiF1fHUaXk+ zop@6Vq9g9qT-sSM-?IW=UsUbRy&wCP;8|Rmk8J1b$KmU__#S*OfY{+RpeQ-d1ZuLe zWU&_ul5L>Yd|x8b`2`l3#KTHqn!81*EO!V6{K|*mZCII2pv+X0yD8Rm7^mNK4?!X~ z95SHFOu0j%W29pe?3m&CWjNNt!iOO1IY)+^iMZ>4AOZw0K_&bgtP;YBY|I}GIW;KR z!G|H#rG#X-b`6?d0!IE?tIlTB%d?Ld8yZ{FS9TuVQg_Aj=F+TNqA}WZS~_BgMxdj^ z>@O9{loh4t3JO}=9OzH{iQ=lL=i-^ZUCRQMg%i3^kBfO$Z&O1*3@{N?DYM$dk(eRM z#_i}0wW~DXPJ?uE73m;NAi;&#OY5Vt7yoOJR)}h2?bL;ke#El|(z`JjsW=mUI($AX z(2W#N)`#riuVt(XCLqk{#spX_oGSrZnRnV>#{L@KmU)$1yhZb|@z@ZN2oa~Od;0<;K4xYK9cdiEkUVS)y9z7lWX?sv#1SA*6u=C^N#DB;Rh*pCv zx82Nu8@0Jn(2Xq6b29RK-G@5*6&-qBhrX;s`*a{n9mrCLfW5CyhXguZ5xPKmMw-`j zN;>tOvCf&!2RhGpzTYXV94VSiG=^%bl(I~HwVZKRj&%q!{4!{MzPvzR#%S4PMT*Q| zQoh)BTPjf!KZ#b4-GBIRyFN#dbm1c5<4`I)@Y*jwSC)(9PfiFNDPq(+4bsK2axd!< zRgXN4b469Pqa_e4yCGWct(&Rin=e#BkPI+lm8eQlF-F4-^y(ah2!~-VNCX5CHtBDP z2m6_@7qQWRX)ge_nETrBxqn~|BILs4d-EtZy>DTtOrpZSRdY7F=#9yxBv%`_y9Eh5UT_M2R;of<&5uw^`cyB$zrR_p(peUL>4RN zAcH^7s|33JihPew8-0#=uZuiXPzNo>Ng=9PBA*9+aW^p zP^;L8-Xw?L{4&L8?G%>@6&d&*KFdGB=Sd))E*txs99=8FO-^Uz$bp-|iuIatE3bH5 zMBF~83V^a6QsD!-4rM+VFXswiaa2x<1h`;}q#%p|sGj7avmBvNesnrrw(sOx$I3ok z^HgW%OBoMu_60h?vkzXEX`Sk*>RB0@KDq6tSMTiYzxQ`?S7Mk%Q-gJ*|L~jrlehlr zC{#4B3AV)iV+qIj53=um|6AF&|9KOBW|!U*z7AbLLFjh_Tst)ClwgWgZSyEK)$@1{ z>S4j{sx1N~?{*dNJH~yy!m+>AB6lsStyNTm(le#_DK?Gsxn^Q6hlQh2TrR`KUAYti zjvR21kna_?=K7-MhMFwaYa@mxF4IUXe7*m^-`{ck_s3IA_Qg+&!BC)J@c3`$s?Z*U?2bMx5qErPfXF5-T{yG&tM^n z06Sg7Mg*f1P^@BXl4y!6G!=@XqNWii#!erP(H;d-_=A~1Sw-=f1PIMzh0}$+!a_xL zh8nA4avOkHLofzdcvwfU(}D{Ha7Pmk?XlR1PLRDW#NG^-0K}eZpsvce$RnGRCo?fQ zeq*}ElDw+-j(^GipD8l9du652Q1AC?pjLHt3L3hRh*si2feTY}ffRqxlDc|%=T!r> z6WQi)+$KrOZ4ov4Upd9IpfV4y?fR z4G~gJqS!FhC~0&z(n?>PN;f!DN;e*+S`cW-o!X zkSiSGDR+cm3Oi<;@i>91|vc2jo+UnGqTZ|ivHy@uUq z_Wtot^j|7lH~05%jH(ab-oLrElHR-Zg~xB-)Lv9jQf{hPenq{exHz!p!M*N*h&lUy z_M_|mn04|0H59>DO zY6bEQHH%yXTy0H45j7MNaYaRDH$C|3^Tx>XK=V|WwQl_bn`RHqKUjLOZB?}LmIKc| z9~}y+RDq!wuj{7$kB*mh8kM854wqYq;CeNReW&+^msOH8qSU|w`H%c40P7k zboh1Hvx1c~2Vmt!m=Y?cJAs1)C?jFO0>olkI1Z6{+>E4VB#x^GO@?Ga68J)7$ug*+ z#mWtj7P13S5#t~#4I~0M&{_g6a#nyjFj**67(C{m;}hCF`^fxacwN~i+B`s$bMb%Y zb&$L7H0Yf+JHXoqcjyFm%67K8P6X}mTSSP5^O?1}&PrcgwYVxu<&jWFfyg)MCntJaLbfFP=mzG*xo+i|k*;8l8E}_nm$AUDs^4+Prw+5@3tY z*&We_g4qv`rZzO|Xv`~plrDN>Xk#UF+t?3I{R8Yc*kNQMngF`G@Uww-Eg_GWrtY9# zWg}yoH&3s<U|mq!B>m4WRNb|l#y{;y&B8^h?HVRY^AZNoHw(=g%< z53ehRe-up|-GB7NQ6_e@_b5#rH5{d{TiZF3ny!;N?m&0k z5xK!~?H>D{J(V{|r}`QN%g{2Q+F2V>6coVe$W_2+aEJkLG(_N}T~qpFY~FHkHgdyE zdrSlXST-(9UJ!N68$n_WbHOPWnZv#>U4R*Jl{MVai7f?$?0`S#i_fv1Em1R!VdG3R zhhgJK3>bFq`>|0acV2VfMxOHh*Lj>w?bb2y&fD|8V&Veu>!=t$}Zq z5#U;Ga8}f}8=KO>-VLfEshAJCH2}J{2Rfyq)Hb%WTwM}3+k|Gd&}yC?5&fhHIq^2sQ4P=vBhx{}m>=M4a>mW$ z*SMa5pwEy1*g527&e{PmgR!%@LP~luc&%v?&()>;YMCSMpW4*l zU%T?~>J?CQi;^gE{-nk^jxgQa~k z>RsOIlN1))qRT?@t5??9n^RTS1v72doIT{@lc1Hl;(Iqh|39W<34tMmT0@l-{%?eu z+vV-2+CONgr`wUC9W`j;w!yYK+LLTlHK=)}R<8u|sOF^91V)m?;e;Xsf(FhT=DY!n zT0>?B<&lep7)9w9L$Ub-^CoomDf02`?}&-Yy&@me9po!?C4ME~b>%G4yrD(eY|(iB|2O2K{|y8spo9CkTCGl~z7nU}Omh<&K)Z0y&8uL! zhN&^OREXs!931ScZDNP}hUsB!jm+@5;nCWnxOQ-)BP{JJOgXR%N?D9avqVw0B8iJ$ zV*qC49Z;MXAri!=4OISsEqCM^bT4BK7Q3F8wJW%81*gV1v%))^+Omw*uTj=E_B9Y$ z%|2_%BS99rQGiP>bhSopk){JIMcZKBQj}HHsC|QV#7=k;jUMGj&z5!p&M|#rpVBi# zn3vn|m9=EU>t)GaTLiW{$yWUkl2uqI0htDAc2O~4;c^%;LEc%4*-9Y~#lrbWx%6@A z^5#>`$Q5*ys})J5LM%ucIZI6rK@c1PskyKP_TQ4!As2DxJrX$ZupM0jWi#kiqEETw zk9<6Po}}-%15aMj5Fef^;i>dP2@gIqnH>uczzO-HkADOUX&^19Nthk=q z&wAGtp#tC`p^FM@Y9uyM+_$_T)_|rkDMY!Iwn{p6gW+0BvY`0uHUC)ie>F@E-m|*G zlElg4CyM`C%oI!ErZ!G%=@f!qLe&u*EQ zQf@b1e1>USuyGgLsU+*>jM4|~Xd2)_dd?`RlkSG`hUo^Tp}`FH2`tkByM%2MRtVz5 zIgwosDqLidINjhZl3@1y{8DKz(VEY&NS5rcKOq9nApI4XEAsY;)SNEp z=E3&K20G&fF3ECirTy44`?w{mVf|k06=IKtE9Zcx{P!)FZ<}94UiFJOQ?X!qmoc$S z@nt+)u&7$7aoW_0yzU_WAI_tMU`1xC8zPdpT5aOo^Ec54h>tAiE$Ea5 z9k!q?78JAeT4;j>nF_REKNq;@B>u$ynDn^}1SfdOT=B|MRmPDQ9zwu#6itdna)YPp zBwkzIQ-9R#F~~)QlSP;H)?trTvz|7TfK?F|bYO57P%B{-xQC&P-vf2%cIeJwsT1yST9B0lk4q!moYqO9@nhL|8Z)v~AyWH+N?Loc$XI zT)c3TId$#m=(Q;`(_&8T8yVe~GG*6^^^Kkn3wm$+*&!rG%Cgr$g$vTz4sqX?e|mlP zFWI-tKE$Oh=`{27)Pq;G7czGiwrzW0YVC<_ZG{&%6}DgXAV^gVx^Nef>L}3-H)M$- z#6mVffpsTk#AdOtVSmG^hBq5{hPY%f?5I(fCzX6V4C8HjZS6NXV8q zaf?sQ%iz;WKR+@l=2zFZm@YPvZA=b=ypzERg>ENMrLrcVhr2wQ+SF1>AO>vADs!>W z#SfXH`B$@h?RAyVR}Pk659|B@*3}BLv`h|RylFXPJ;11$;L2nCnKN(s#{DHZ4(=eNA0_+TJF;?hV;l4}lPykH zkmWAxw{~_7c<`r$v~S)X5c`eHdS8{?(zdGUo!mhWQQxca9&x!zg-Yf>HM@hDH}0Gh zt|qJ9&i2^jZ>!O*YBZxptJP?k8u9DYZECt&jRb17(1AtqW;=329%#IMn&g6>2FZw2 zKz!d8G#g5iehAK+?W(+7NN~nUg+%EDp@yUd&Rc+YzJL}VaF_WYZ0TcP`kE7xdw%V- zg@^|IloOP6!7CwcA-aISqWK&pSfUcU$S%P$$_@}2bx~KdeN<;xt2h3(0o`gqGX}KU zfR-6RPKGuEU2Q-DgQ3J1Z(ZK=W)E`r#Cpbirh8_39_V?x=X{SyA1@i~j@Ye=WJ684 z1X?geNg?bCETEh-kV7+;$Vp1}3HCAbD)rghP>3ou%60jA95;khp$I2@;b z!A-P8e(S58YB8Gq5IjU+rsR7;%PfF^$D!rc6NluEBT+KsoA4oX=l&{GMOP**?xb5Z z4vfT%NMw7ee&g(q7d(F@M)AIU;6~mfbGB44`#Yhj3FEg-CgJ4;l6MN{#KF9` zz&YfqC3Ek=xGnfabJ%8>HG-UmJVZL~C9*L~Krl-lI(CJ@rp`M``QoxAn_&*YEX^(W z`MIZkIoR?GE(~@*#wqqemzNVNpiDr=(2C2|)wXK7+L(g63&`XEeDL`o`uoCrc8RhL=s8|BoA$dp zeVTZ0_41o|W3iiFzU#hU-xA{>hm~#BFTZrRkAJ6d>I5-ncN z??<-ccV6A_jUBOBe?{bqMEr_~wjz2(Jh3_g-7DEQvTwH>`sq!d5dff%+i(5l5j;?@ zX~(y>ZF_8c1I*LIQo~#q*di1GrZvje@e^)+Oi%0eO|qz_M5R#`$_ks}&gE<`pjxy{ z6HOHsTKvIeKvA76N?P(RGvLM`A#4D!#lz}9m$)I(66gd;QDDHP6en&-bQqFhh!N1M zMRDL<;>Jvu#L@vJp2GQj_OWt*-_>J6tMTZKBz^U9Zi-H;*#!nZjK) zwY`mI^vK1h>`|K{jfZ-mP=Og zxZjVVp{ow&g~N<=dq)YG&W#(iNQaggB9RdI=yAYn8tdZL&JQ}#1D#KI(rjm6C#_Ja z*m$9EFyTr$wW>c9{1xb5Q;J^kIF!qa%NqKOlCq?X%DElb`Non0W<`K*;7A1whxE=u zQNX;*0b-l;$e>>fD5QXF%ujUcGiIH_uoNlw!Jm2xI~2g1g2u8B((p^X^5>WqsDARx z%XCHFo&Xtm%4Q-u;*xMF?q9Cr3QqpA>S#qoqpN%hv+d0G;Gs9%)YHfC)Ke(#?auBY z5(P-jeeb0T^lk-m1E1=2#nTnMii#>_N-V9)_nc$lVPgbl7dH@{15TxUS{W3K z7^K{!9|+iTy>7t}*Xl;Mt$pm8_V&GBU&YR>WjP9h&}d5y4?Uj^@vPn3QscJ)i&E{- zL3!+^Umknt^&9Hvi3hBi`*vQr`YRLAFI!YoVeY6mg9OOLM3_G)!2FV&MCctbeNO-! zTllpBw%$&nYyS%pf*#B4EW{_cyR?SuF8$kSbs#sLo@g6z8p5=B^eFimNq8^U)wULP zZY!MR8`yRWB~8W625?qbm9mxQ zN`QWE zv;&Ybg|Kjvd2bQwhiB7^S74Z|HTz^v;}%XXq*~Ea&!m9P_>@0|y$ zELbop5hgy}0awF1jz=Y4$#z`kT6o@T19uA0Zdi+zRnrL1pF$H0u9gfhpT8RCfx!MF z*CXf12=@~ZJS~`BR7|5@e2|FQmE0Bc-?4NyBh`B8-#Gcji2NQp-5&d_>5Nn>RF;DD z8j1A2cDi{{FXg3=&^tUay&57->Gu)EM^AyFg){j%+;9&5KTrJedptRMXAj&gey`{= z-YXLS-+Q9J|Go63kFt}@;HC3$4?+rN9P%j0zzd!_%YO+lQtpN@d=HFmn7W7$cU201 znZb(>GGqAfqkFPP@%>TTnH}gSFjqtgY=>2Z_k{m|^jN{&FycfCXDoX^D$ z&6AzvL*e!B5jVs(^VaO|Aqhel9f7L~uu&eS`-E_4dsYAb(KTb`rfO4pGOQ2Rs(IGt ztJf{lrVT5bJ|2>e!fR(^85t;ZP z1^vK(ai)yS!&~79Y-g-Q z-fr-}>x_4EbU?>ooeQ6PjkHGk$>mk@Pdc#fEnc1!YXbQP*7iwt;D7Q{m(fjh4_4R7 zaq`f5!iKOz^C{~38EeZv3*+L57K4Wu`uo2E^BY8qD)dG6%=~RvkEn545>Ev{Bcy zDXorDDGDlqFc2sM`5GRNp#%kdf!-!A7sg6KeYCU`3R2gvF7wzMx(YKpL2CebPS0FQ>k zXb)>Rq4+>Sj{}7(%_@*Yfy7)0cY@+c;H?r^>5CX)dl9=C+>tUDa>02rX-iBt)UWQc z+q+iRH%umM^lO9L+I712ZG(ebJ9N5^t#A%L1pFsq*a>)IU?a7Y?W^&j8eKh<)7=HS z5(3`VyMEw%!S`z)bCvIU-<>`t;6uL1yAkwq1pOd_UYZ%s>n1$Af^7`%n2i3EV86*OB=X@IvFyLiyl=G9`QxVk5V3B}-pFBsaTZ?wVPl zFvHw6w^>eied05nOFy%(CSWKjF$8L?LHvKv`Z=$mR1nAN1%HJ)cTPIJ)G}&{+Djc^ zdk2>F!N?4>tbbX5jkxKw?_$U4nsukgE^a$LxNpn8{rgVrW5)MQ@1u36sf+T{dMFrQ z#`G&TH=l9t>OOPD{tyZcJ7wxKhapXCJ|n?R%23xD^S_({YzI;Uz>Exz2+1-17XHJ3 za|Z-hZ^`jN;wEHHP)kw6&;7a?IMl$}=9x0Fu$TS}`l5aC+QAhw16J$6{^7xW%j{X; z#BH$Kfi+rUuD9D8EmHmu$b0tpf8sqRiNwUcXZFC2^sjH=o%#HC@&r>Scek|cJ~=h@ z^<6Bx>+4f1Zkh1;CT>|Vbkn%kJATvb5WJze`7_?|7Z?VW{hT*}Z@h!~B}x%)3&;X< zuj%vTH6MIrL>;0Y0@jLeLo8dxmI~fw-lNa*UgFU_5zvP6A?yLN+lU*=*Ivo^X5WFG zhx`l>)g40Nsq^Qjvd`09XfnGuyBAHu&$BT<~ zuz^_|upzUI@gqQQpT|ECsQN_N`{2hP%HD_X_7|7_%m7CN^oH`_W`z_F{T%MPmen!z zvD0k$+#%-a@Zdt3cm>D#5h z0YwH?#zkgWfdTO#slGYbmcxhq9K| ztY5diL}QW*vVRV=!3fY2X@y0>tZZ)=0EIu=uF{tZ+9%BpO~KZ^+1D$~GC@0fI5nvA zw^%N!^`*Ev6Jj8q8`k5bRj_E{}F;k(*tsB?Ty-Y}7Dyirw1f1{Ss6I1?Y{e}n%dpN{c+A+(8%tEN>mDn>P0AMi1*$PmRa z1A;5Jxc0k_xEPmf;7V`kNw7)Q@d$YMC?fD&hGe~0 zweYNEB|9O`H_LYFa7zoeTqO5_{Z}Fx@((_lp273-{^uO10&XV;;ep{V#q5s$S27qc zgcFsBL?Bdh^rDXC@=c`k4h@aOBy!ayXuNB zrL9BVrOp9%*R)hsQG`~~=k;CI3DJrhLk03ul}@EFIh2Pqf!c~nQ>9g3v`MLKUOp9- zPguM36NdJ#KKqIx3Zt6an4CU0*4v4sNlJDiS>- zkv;|LjUYut5fOIP^-22l7=o>;7!gkPmQddDdYN{tsyjBGs7iEnB&rxB@swmFjB!pK z|K}_gDP--4G7?fvoL(Vx)$_P4*c1O^{3@S<%NHyWDorkV024{(7?ewaH<>s?egzP$ z13hbqYn~^V42{QJg%AGQ-K|)ITi?yi$J#xV;t4Enji$G$eWFQwpJmu&c1XK^_dAxu zk2pq$#_9VfM^7F|W*;GG0s0>6(9NsxY=)0v9>YjUnX&8Y6=))%Ggq(gy|^)Z&-&G{ zg9nM8KM$SGgRI9NX{_UgY}KOH(1yNt2 zidB}LtNJER-L_hG^j4a_`Sz00o4+-lni=(t4#{id{=n+qkQjYCo1!7Z@@R46itUqf zlT#(q>9vtMQ{={fzjs0zR5(|C^FP1TpbzypF>^6%acz70$SSWQD4W>)^{wDH^KkZ- z{}fnbu-Z`B(@pJVdwHkbs+ekAby)SZ>b&ZGl~5&}KtLIZ3K#^9CyYgWTAFkxr;|Xp z&Bjrjjh=Q}VixeSn!{)8&1Vc}?Y!bMTHzU)3{E4kbg-L$0|bG;fg*)cOzQrY=4Tln z!2LNZ2WNJHjc+8cPP;z-W7jn!KHrKxaaX3xT@EzOqVnoWL!CuFJleBb zT_n@T#^JpG%Ap%>ICR~C1J^zNEyvKo6{j9`qz|Ia_T|@&TyaC6sm$m#C>&-*Ws^@Y zZ&e7SvATdIu98aS_D(&&Q=o5@L;9W%zbSXB zf=c0`(J-b1Z!NI>Zs{v{a25di1kWeK_;Mqp0|AH@0AvZ3VuXcjyufE28D)S)0Cbb| zb>>Ewv7oQW-MOZ%V>)H`ZwQ9hdv7{+%?+Vdhf*?Y)0br?pP|~L6-OspOlfufaBOg9 zsJ3>+!R2Sm^d%z_V=3*w|FLg9u=(*@Hrlcu21c5zc#*(R#8|}+`Lj-AdfV+-W5VFb z;(2|wQ2W~fJ&ZT9gBps~UZ|Z&Y)Q}w=bLWeE~8^Jov73Q=5!c^dnBaLXQt(~9K9zB`dn|95fq!qmTE+*&c26FU#AK%H`Le5)a zvOfNQq`eDZQ&qM%e)c&hujc(ulQz#LX_~falco>)N@<}Fnzob@ppdp=DQ_z(D0UDS zL_|@`t$#~qY=s@Tt@^FiBEria;`=>L(7TrVTb zW$R^Zn{2*}4ata8nlH3xen-;7Mne7)uCF10yd>lXI;w8-x4w>S+sth`Rj zret+;-djAtepY4jkz*6b*czceWT~n$`NF&71rVzK!w16A@43`8u5XdF2sfha^>& zpKmiHBN1CDsnXh#3?f-SX#4;M=LguZ(Az#h5Ka`TdnUUWwcP2U=t01$sDYp`v5}Gr zB$Dab_1}N~x*5ftBkMLbu6gFB*=L@!B$D$>JFXZ=dfN)-T(avWV{I}WkIieZv-t*o z{L&>C@4aSGU4HkTSGEXu+KRnqcip_IP|cELF}nkaC`CSt(NkmRnT*{CHg`)`rjbHqVpMQt8c5B29#xa0#v_gjrFl&KA&~d;n zLUqIjZV2O8k!ZsZmWtz8N??yXy_9q>B}>U4o5&kYWM326-9)ZvA}vjWO>9LIDQF_5 zCZfbh;b|sQ$CMq)*@0kKnfu=w3#=QqPMR4D;!w_x<&wlKjAem1mIdU*0`l|%(!GEz zAb*UJH)3R8jO>n)O)+vsjI_iCV{Ao?6u{Jt5oL_T{)ypydpzqz+R*XTV<4anduYmd z+7c0tHF---PN>P#YVxmYvQkYJs)-xTsV5iVg8u|=o{7k; z`>+Zzc%Gw)+?p8?1L|swwzD%_61l4(5KvdxEsPpy0sQY^W%%HKb3}Ip2lEjc(IAG= zOwIYq)R7fWVemJyF)J%8DyW{vQD>XT-V_LD!X?s#EUQAedKHh1;fE6SIRVb0lZ z;6Uv(3}{)XAoyQ}GGdb!q7U~%T0cOi*-KDraumfTM|Hb&Z|S%kj+3yOA*!pOsUVVZ z(h!0%*cQ-rDW`ipsFO>AB-2-#@OOQE4|)3$a{Q0Nm##{^uGlNQwOZ1C`Z*2fTlhdn z`>lg#Uc{23+NX(DZ9=|7Ny2LFmoJIg`$NM~WICkFIhul&)%jt|#LmgkBp?GrB z^9Aq*1tT(^Sq?NM=XDtt&UP6Nu{9H)^F7pvwS=2WCte^=O}r<(l3&qU)F3op%q`;f z^kmx%pAkCFoWQ8JvU|DDxm@V64%8cmJMgEQ*q2$B_R(grm{S~s+~+ihhuym#@0yOh ztsT-E895V3=#kC~?K?**BOK4;Rt8)KC|TqPZm3_8YV{JBsTeegvD<(Q+)wgOljknc zaOJ}j(dfp(cv#r+PAJfl3p;|+j!T~nODpy6`oCwHPnptMP|kG@+&(hDmpgRRc-8}&2Dm| zNw%lwrj-qAx2_+nT5@xL@2=(bj@m`jue`E)WcR;q-FDq|MeP??S6|c?n)u|}>$h&B zD01acI|@#rsym|F9H?B-!1xk+uQzrHXEZh@iY|8%~a_(yPC>a<(!3<24XIsKP+H_#A#2V!3CbFO0L*ldND+%ckt7H8Y!kS`jFlNoH!? zIX^XO@_z~$75U9c-J2(mVr%^7=t-zsP`~itD4isXMk-U$WQa};m;_ZODrsQ`?(aP( zcP1KZtk&Xiv9)fR@+xU=^ui5=>})~dM@>A}Ky2f0^htXf|q93!a?v>`hA#vAK}_txW< z*x`L=F-iubd>!a)4(i{la-<5Lk+LeqPvsI?22X<`m=Y-`#~+S$Baj1?@o=9o^a|6% zZvv3ZvIi!5xKTQWliSG}vUa-=Y@2AKV?Z7P?}zM{peC^+p;X9NiBc|w%@2bC7_}${ z#jd+PLShP@?e7)h}G=_6|PNE`I zAZe|f+oWqsH0^ETD&(z>gtf#ER}COyQ~<gfRYgw^ zDg-DdMfpHXjsoB()>%ab_6y7n8oEjy8KR{umOG}l3Doh)*Ku;1;sF~Eps0W1fN1JH z`Q)_qhpu`0u%o=C$WpPOrF*2-%04ERZJIbC0;gQg1T)3DV=k&6#GX$lol&33)t(5~ zq}Mmqp1C{olI+~e(c7xrf}VoI1uqx8T_7pYq2w%E3p`wz zEG7Of^mlPMoXPrpv#ASBZZK)lKoh5rW>`>7vIL+yT803VNC?G)&(2ZI+y~~Cr3K_i z?Cf)#lmfqwn*K&QOKg(ozfFnU>UfFj_~iU)Jvd$;?yT{|``0zqUi2+W+_Ab&B9(Ec zU(HS*^FP7A&K;M00;MZU>I%TWD8EM`N^S0or_u>o>d-Krlf@Muxr+(q$6q~U*k z-`Tih?rIttmSPCGnLo~Mh96wX7#`&lm=DJ=jdnOq?QnAt05maR%`zXkS?^XqqA84& znP>9v&$z3@jSo)`v4);ayR{eK70Tn8~E4R z)rf-3j)2<)!|L1!02BGpxU~uxgWjXcjzB8K2bi-XU>OhF$;n|O+MuJfA|TD<(f`4+ z5zEDReeOnJ2YTi`kFnb_Xc@I|7K_64ds)tViZ?;UD6R8|ir5+1OI0JviejZ}(bIBP zSp~jMuw%`nqOuA@;$m!z20oRLP+y~WS~bG0WaGZ0!d9t7Zjik7KU~imyGtjTF+-wr z+1J#w6%+5zCynmjfZi(?dt}aM>)AI&J$iZ~bhnmhC4V@D&Mz^WDiOLg#D?VWX&o-d z3CCLw-r-O)@A=-ezOT->j;L-#WybSSs)-(@F)(!5Mes+4Zbv{QaK?IM)LW2|7LzC= zLTl}Hul18N(wPv&x;(4!C#!v7(>)KD_HUinH#$8}onPv)l_c2P&5_Q^ zzLZU^B}ZTPtI-?dFFD4|TN2AULXMJ}d?T94`5H6u=vcE&_#PexA$TH1(DZF`{n3MB{|`f&gR?(XXQx~B_Y){OBL!iXKTaTIpuHD zXl}L<Et2K`=8em&(dsSJkXyUsHL$r{l`G(^t$Y%qwduh;~=y z7xiuIo4tN^i1g0r9T|=^m_l`Xb?$O^LnA2bERJy{MUByb&QMy5x=G!QLE5p}-w-QA zSW0bsS;fNUK%i;fCGAa33j+2sk zXzz9(Xcq<+6vH`Ii!-blmh?hqC37uvBXb+jk^h@mP*Lp8tG12avTD`#%P-%0=baBM zZfjd~)7GtHi+bH-Lt|`WZ1>p9V{eb~4~+Hpjy=GsS_%sk)~5P$MpZO@WBXDgxJh!;OqD>M%*ebH(uh3ygh0)Q|<3xi-q1w~6t5=izFu)Ev zmNS45*Awl;GNNm3xuho??zyC;WwbjS?jCJfyJgGTX^RqGZ(`A$$|@bNX`gm)*yttO z-Ij2>0O+8ux}vPQx=3O23cs$JRbq^2y)_{caht-B0e!*|88SI=F9hvwX2R>PAQctb zBH}9grid*n$~S5>Y(CGkKI(?xYzhU()JI}Ak&h_boO?jIX-zD$ro2qSovQ=~@AH)C z8ksc)LyUH#7mwGhV!{dBLudNVq$K5aEBDOn-;xS>8~S2uSJdw!rz%Gd80zzc^1*G^@sAk2DpQ4bAV& zJ9eA5EwyZ7xC^3oVq$NT-0hIIu9SqzEC!!&cH~B`sD` zVI>1rpNwV-QS)LlzB(Hb%Su@^5rA%NfWPnwboW*<-Kap=C~s|Uwlg)YWx9l}hi13T z*3NF6Jvf^yZ?z|M#x{FHce0D=@+SioU4#kf0&G{HD^MxvYGW$9%$Y(6A~FK+7fLR{ zg^12hC*e$_aSk}PsHP&Cf1+JZw}@E9F=NhWoU7O;0GYAB#M2j5`ao_RXOnW*8Z&bv z>Ui7yvRU)OOYSFaESuPTbj#=+Lq#%$TwyNAn|?#0ugoY{$a5>_)coW}G+b`~C$}`x zW&um?x}wvti+gVEqt{GNch_GwziN@S)_tGw&VOE6HE>O9XkdP)%^I+4QjW6bkgt1A zswg(UDM03sZk5ZOr{rd=+11&wJQ<#Q*IPHtqY>D!1F9s?!C%y!C@(0V(VweS&gzW7 zC-g8s(+^_K51_XInp z74+rSFP}Z*#;sS!T6W)XO|)-igRQ$UzuapqX)sk^-0e-TTzmQI(if?U433(PN}whD zmpEMpm{o~lsbqE&?UC5jq+8gw8}*VSLp?)7Lz{+94e^abgc))Vu~lt{bua5!9X%Y( z0ErNW+1_4PQEcjQX;XFQS|-9&#&)GGv{CpEG!xkhTopb-4`}M7IM+C_vPyK_WV*Og z?I=b?wlC{Y&79Msc1~GqQcuExp4s7nApcIhABjqGZM+Sw6n76-_B3rg+w+zGb4k5F z)Bd%msi$(ut_e*fiWZ9{#)=h}J-X%kk1m>Q z4=euN(i^zw!|huhy{v*eIQ;JJM|+`kSp;fSuN&DG$R#ZMOD2iI3;(8dN@;5ZomtddG#qs0Ge4b z47ssx{s3Dx<<-o@a}wIuD8LlZSF`g8%5I6-oQ8JT#F5221s zfN9CRhxrKaaU^sc+ik_0m=03gk*M@ik#zQ5!b(N40Z!@O=d^oq{ z_;yMT=k5g1auS|;5;-Zla;osfj(eRM*(a` zuqU2F;J|ZK#T4U8sNfT`9Rd<+^@zsTo~y2|t8w{V(a5wJq(hZ!Ge{0ei)#~(7XJON z%UuoTNWf^&+4KCtnf|=a-d>L>w`W0LKD1t(60#3~Rjg#TCg#lT=~>(=sjaLWlDD>6 zt)VgrP3t%%;U$vQ8&|)z`kU39ZgpZcJJa4;k_h#L4u@V2y&aN-`jbhLNS31!Zn$e` zX0dkVGPhpiORmUNn}fYXzcS@4M7uO&&WjtAYGUwt12sPxr7GBWqZ{98;foIJ^P(c4 zr2TyiMDmn~fhehkUoi1A(X&kvk$N9RL}+2PC!c)bVEfXh{9J5dwW}gnTw9bY3 zGHv9B*}C&_6xsX0QC2V;65Vah%>YpP3JNMOYMrtst2VBBYt=WaINhqmDt1n=by}jb z2a$y@BeqadsZ92hWU_$?n5w(x=xek~OPmg-EV(>CLgA&qyC(2nWEW*}J^l{Z^1oaf zoKfc>8OhIm=pJIP=}%CSk{aQK|Cfca)l>kqnOu%@piSk__h&gT0B!z>g|V%A@QV8L zU>)SGAo|RY)v#i(CKIsd6iSA%FWjXjI<;G!Q1_q-y+rLf;UUh2#t}E3%p0`GWES2w zs1xI+Vu*I3XE=OaV&FD?@S9^emI&4O;}x-}*(9@|(38i_=;vbOdN^&;OU%TPU zF5v;;H^MRD5z=t(O z#KwsYkTkR=+2;}|W5VcXC(1LUx3$5kN=JUFdXt)0dz@|hl>3y2Xg#|;EGFRSGRkB| zow-XZ>TQz~5Gz*!S4h(t{O&tuKnIQCXDk_5FFNjxjdTX(f=lp|lf)=|xcj=Td-hz* z-JBi!Z_`&l3`t$fR(<{D|NZN!H{LiUL?D@5S(*poJ8yD&JfrX<kyqK`hQKl&#l*2K%b&T6U>+kW|DcVKf6>q3IB$0`qadkaXXrIjFZ&9gX4D6 zcmVSh9wqm_{2uug=h%@-?KyK&IP|~|xyX)`@LAp(aixTh>gd^oY8sNwSd&87DDXL= zyqIEBp|@2vcVp=8(1{Qia<*Fgide+31eM4~40=qboZDo+9ZXD0SrSwM75A9 z6N;oiKN+*Xl$pwu;p$D)s~Yr4&rVLSi%rhc$X8`XJ}woWbmUz0p|F2kN=9EJEdE^b zCb!i&Iyv%*2e+s0dxG3dKHQm_s2Bc3W|8}DO?~|+^o=vS`PT&}P&ygY{57nHZ@!sm z!If9UE9<`g4|?T{0$2VZc?VDS+t)BI=pYSJQRl5WIjpH~YN-H~L&z{x_)!bHU7@i3|! zpsLn>6P%I@153lYh5SfSzGhJ7Qkn5xAmgnjQ!Zl|DrB*j#N&hZmZb_x#*o8y!Vfj# zkS&z4q|3_vl;L!YXpQ&~d`7oZ74Q=am`{gQ0ZA+AU5}T0<3}e1mKZ)C+jo8a)-Orh zj`_b{yM@F~UthW9sawfQ6R*BJd=>jXSxt6a*1qvLB-?FGt9Q9P zM%L-n8qFSs1+f;iW-x_{a8lxr0aHS(BJHS6dz+Pp^yOwbL$}$X{vc#PhGR3xAClmG-o2*eAG`% zF=ih-u$lD>!e1ti*vH!!bQ$;|IT?VU9Pp2m(VQV(JAK)r9Y6U$_dL0pj|iuQ)ldC4 zwS(*O4OqTtgUH<8@r7k}*_qh&_dJB{2RRAvTraR3JL1#kBubnpd|#l2sjN^)y{*>V zT*lhx^CXoyxm|XdU5RgrDd|lb&3qDBC{#RBcs9$UG}!>ThBVY0^rEFVDC8&31i+sM z6NS+%ot$Z0Ji|Ob{b%D2vW0|&S6?9Hx4(M{74OHNW&3sj7JH7@5#Nr~#F-)Ckz0Pa z>%r7^_LZSCT`R{9qZ$}uVX((|?6Gpxuc_c=3yX|Kz%)!*EM)F?4o5M)!4h6-8sNVI zbQL0@kj+n9T{r*%7?g@3QFDNZr$1DlQO5)BihZ=A@B&98bcIgRIvA|aP5r@IN% zZia(imW`yz9$(^d<}om0&41~9^RI;6TJohJHjCN-a*OyDL}c@Ai60GBW9Skr{BdX(f|2@Uj#C zAQt(6P8`294i-^|$6}B=VxUT9{(oz-;#_@@|L0SOeM5L{oR)zaA9tYe>o^HH$o|`Y z_2~ZpQIqF|Y844RIoJ0ecMH>4UU*|Wn3CPTGnKkQ_>!EtY;f~O!ir0T4Z9ri?zNOd z@g>=YJ(&+%csw!BSKuVPm-iKTd0wURn~;i-uklv9NV}bQ+%9{r)oaaldpN7w>ow%( z%MDho)*v?ow1JHQ){5j&hn)<#oKBfnEjB$dp+RfD4Eq%`rA88s4Ho04sPh4sPz;Ht zqKJY{qmLOF=ul-dwLnO-b~8KKW5T8OdLl&*tS5Iql^kH{@!ST8B1_ z5G{i|msR6z_ENefDc#g4ES5BZY{`6DNpX^FlT^zP3m{R1=GBPq0t&EE;(=HjwjCvC zA%JJ-?}apz{Ue(B5I698|8QQjaFp+AA*&9OD@$9Y!kTv5(&2|<#HDX6m+@Dz{AVr2 z(@|P=FUlf}foQVk!aBlCoM9J-ZhufIybYQ`SCDsrtKv)@vp&&i&`+D@?k^}U4TpJ; zr-9Em8XL;{`QiF$dcDHuDjTT$N=qV8o3unFPb)ZcZf;>=I2Ps{R|`w!Lv@c#{2Uw5PwK%;`3ug86Lwpcm-6c=FHPYxG_ru;5t(c8CzQ8v zK1iuYyc|fzBZ+0XvE?zgG*(incB?!dYjkN8(O&FzUb4hXD!ntkDKF=(tSl=mENhkB zR!+8+leOg}RZdJODNt?-uqu^Yj(U9#hZej+BEaU9W1oS7oe z{&XS#J-sC>)1;l?zH&rp>`HV+iLt*lFR!vd%kvtEq_QFrA$khd#@*<0TT~P;h;3wc zF>Hb=U`j>0G7v``VZ~6HAwL}@B_%m!=s{#P1w;M?Ia*QvHityvtpS7UKkXPdYxl$hpjW?Tb3;j850+j6anKqx@wPZ;-VU9!bZ< z$=8JYmNcejUqOaOS_C_eyzS&v>&3#}D`uyfFCzV~v947UJIRMxDJQvIkfrL|S@J;cdp>V{Pxv|a z-@^Wn+d509#bn_hFDq&F^v*AxEfo^-p2$##r>$)Cmaw$0*3ZUsNae(j$)i8ZAy+I} zBJ7kM{P~(#YUbGU3**8snrEg`t(~N_X5RDH)~99+k}C-kMny@c$OSL8!VhvwqN7dc z?GG!%b&+Y);$<~8@eY+L9&ZhYJ6oMbW4_7M*{;=g<}~!T4$rc}ZJbE76np9i+H^TN ze7q%H5wtfOI%Hg0jrss3tTi%|InlO_)kBP>Bk*39bht|%cxDhDv0>*V~wT6ANb8!>#7Z$_|7E7&X^Pq=z+5Mc*X9;_o@$%`hybJZhGHTj2da@G$$1 z*#_|ItPo@eg#X|^5cYpKYgTYttu%c7n(8)hs+Y2KBUpMxn=QlA@y0^R((#GA$fFhZ z^W@?du=fV#!}}Mur>br^l&TS4%d)qtp_#IG!w6YMmP6caL?5UX(&LDGz9rG4P^kMG zo0=LML#1xFzI36fs$Z)$Ep65|4>q&4_4T1>G`BxAGTnJmL4jj181(AP2O>1XA{J8@ zTMbG{f)I&%Q=_`Jwq}5%NeVH*J9-LFMI(0IF;Vw}s}ypQ!ajho#N!4hi|##ieb!++ zWR&6vun-z*7PDAkg92KF?JeVhCYpJ@Nh-mK9g7xBJ^{oFW_Urydc%Q_I{@)un)?Gm zQs1*=0m z9~>ZSnlF{U*s%4vw%k0`kIIBU2q$}TBEqZx@v>R7b@L^=hH{7EA7A!;&uzQ5-L~w& zje>Au>&M>3+d$2*u$tR1=|J@0V~I5~nOa@f(7@Hz6&8DN0vETLDq2C$b4`Hw>S@yo zk)PD6Ep!z|3P%e!7VavP7TTaB_V7NFkM-HR0s)UhS?#C}qeD=2r9RRfLDkD|XrDB7 zk;PJ(R4Wq_3E5P~sj1|p;910eOoyW#e2QlG^tKVShG&Sz{)qI3=6H_YVvi|Ak%;FN z?8);<4$_+e>s~-{pdysw0H&zh7W4+v2zplqf=`?!_tGTMocK&A|M|8a!gu{})VeVC zr!L`zz2yBrKYe8Al0(0~_jK7hNn4i6TT5PhrcF8RsPI~We(kyyTl;LOvR9X^EBwu| z(Ul9HeRJ&Af|+}O5#>T#f~|rs&oEu^*pIx2d|LC8`~YSQH`!ww(Lfd;C@qPA(YjEv z)TeSTB8#Sq^|*=D=PdwJ8a!_H%d^0Cn52XUCZg-FOp?6W-R-$30I`OPjIHek2X(j0 z$dAeGrb&of7!~fJkT=)dxuuGYOsvG8iJR#xDBfKH8&n3xH=pTBlxmG_(s?eqy_HQl z|Lh_sTqNNlT35uyYSrCFvplEUZnNd-yLeq*7iRvg*_=Ngz*T^(=v*x4=0Z0ZolB<( za=$T=Gq<+k`FK^t0Epu>>+Y*>c&@T4svriUHBqR0;us+B&5=|P(UB(n5vbc0Yrsfu zmplucenz6e=yIU|mQKgp)GRCE?Rf}Hl%%CxN{8}*q(Vn@GM5@;C2X-t34hy9wiz!=if*os`^&aSyl|t(LdzY-KjqZM)QV z*!H%Kw>_qMLB-yuB3o%tdjM^6X!{!jg6mX-h*Oa#C0ZTAWNFL#n2rX=V$5PN3XQm- zhc%!z&jrJe8LFzLj-MkR2#*!6kg|+@Ot+)WAZzs1Pv1B;)>2R!ZK*iPZCjm6U7TMk zYF z!xraFF;@1P%zOAp@iFv0o=jcYI}R3m_$lw9drB}VUX>ijo-!hyZdsyQv#^5FVTZHl&sVwrv*%QK>!V9E^_=$}qgu}vn zbzh3{^r$*8@D(os5mXZ&pW4c>95tLD6-Dub*HIbdjYFtXTiTm>> z!m3LqJyG1LRNe5IeZu`aE+TuljdW?yAbQ6$gC(10kzF;eB`Lah1(Q6L-MiC(O_x>J zY{p`br$E^j$#oa7Qg^;lnlH^~jmA1{9nrV3soH6NZJtAe-76P&@5hZFH`1^FScYhnI`kU>Az7mMGq@#nRsGZSsS>7%MpO4cC27=K3e-GP&zl{O*fC z|L(QVg$VcgKcolsJZ_O7Kpas59;PP|GBAuqC3o_?T`rfJ7HXIJ@)k-*yf&M~KB&r( zb8ff6Imj|R6%5BejUJ0M9*2^AjArX*;Ca!q(jB9AKS%%}94yf5{16FNo`Hn+(?|3w zRTglSJCM6>y>;RbtkXPpC8QC_7v2-TAWg#4P*C%Qr^xiY)yw2-*ABARvzr!QdTFU} zweYg=YvHOHb6E##pW8ow!Nf-s@6St7OJL16H}m7zF|_JJIuSE5j7=ri@jR-3Ni8S~ z3?HP_t+l)Ctle(Q>&AR^CLLqY8CZis*Ns_0G-FoBP)RM8omZNmq5|for#k`)s5mh& z|9KP3P7qm(L3&-P*KsPt$~7uskld4V`KXHAH8HANw#4wp8-^vzbZ_S@xwwV=nS9zX zw75mE3fj`nj#_dZ*-+m;t47!$Tm>$@l6p_%HOOVMBg%MR;-Z+F0ti8e*lV^f7_4qG zt{f~??vgOO2+=A=6&n>N6mKaciiF!rtebRN zcPZakTStoONNycb){(m4v>|^e>vMsur(G_8f6V^U8vCzMPy$6JsM3v?#mNPZoO}s6 zV-v?S{0>DNdmv45eC&OC;L3bhRvueM}5ye z()Q)dUfHqDm!|BWUMe&t{Ee1aQR|9-7uq(qUnX25+&-ba@kaIw=+xg|)3I?w4|VVS z@|V=LLuJA;_)0&L$wg|nGKUiz>vgqdwLP^%wYzH%)E=&VxmI3VTkdxS8-s(v(cs;| zr-LVgZw2MSU~74Kait-*ZE__lU2Vnl+MC-dQ*HkGdT*ku+OWyG+qxIoIJ{MxU6qKU zQNd0w%%2q!C47(CqH0}hYkB^R?nsPsA-p8Nj9?*tl}@k8tinrc5DI?&N__lXD**uG zZ?6Prflmoe6bPe9*BBg0lxtZm4vp#aWuDbR^Wbj_UGp7l(b<3Sz21?Yx*LD6nSB5C zV?VoO<-ucbkj-0ey|J!mr1wt;`=z&kYaPD+%Om8uZ+_dmbhKk+;)w9M@cPIIgujMu zT-rXmwD-5)2(^#U9V~hcWjvz>+V(GrMRr?B#Enu}5nIF=Qsm?)B~qze#v{>CrsTB5 zMIxx3!l>Lh{#Az1!U~PQABb+n(i-PN!$@^-sM1(sw}VJw z_W>^rb;12U8htZ*JVRY%Ls3qDPY-H~vGO0+Fh!5?4N#>rw59d>HvU!VO2rtO%)$5M?ABVHuT9 z#YR*SRWNs6xwd?;oYkTVmaC*BKcWQ?RL~PrOB6Cr8PXPe%({HD*-E{f;`dn!gWU9- zq*)G>#*~iYm!SsAg^m_UynxmjqEpMC+MDMS`ycv6`L}vO;7KCi`*)qBl6{i|7Vi6} z+@*wBD_Hq`@V|M`89ZMJ*LE)B@<|rvj(A}u4Ce6)*^tGk(d((B4V(il8b6t%@>gOw zGWIIA8#o4jHAF2<`qSdRj7>xLqm=vXn#+U~d2l$T7^msz<3{0i;c>Ev#Gn7|FrQj? z3zcPlVHtIoeMI(<0kV+nxn^0So9g>(1S@wJv>gjmlW?0_&1P01vmp(d)v<1tV^dau zhe{|m23?P6mxu$TBSZ<<$svk*Ohzkop@~j4OfxMp$`6tiH)(1 zmk(_I=)F&co|1|6=8&M5)9E*P)_-L`Gjh-=S2|*U1zNdhV9dAV#f5Z!i#Qv(Q`(@rT|36T;5SpxAtajq<`OreWa#cIEn|9^2hjH+yPV~)}n^BTCP$t z2|i~NlaOtKOTqpozF(sGX|c$0{AY+?8mHjF!AbqYWQTh0P`HX5$(g@6T*H4dxU$wi zu&gG8PyL*KmwQX{8cr%#LL>dYM55+)DKxv(QYrR14WXh@rif3$hf@57)`s!HSBPvA z_A-p_HNzraJy0hc-58RLtoh85TC*8rB`5jU*k4QIupr73j^}d7qdDY$RKx5+x;{xL zRBeQ#&65eT3^86>ZR&XVc={OjD*g@P4#l_xKtAlRKihcG#S&j<{kI=gzN}Y3@AupF8<-{p^{|mn@j@u{#gpN!G0l_2NzZTJcrFm+TMr&-~YG z!n(Q5Evpv@|C9O1+RTfDW$ez!WF47E=+Xb9C~rk&7EA?vh(qgc>Y5gv7n~2d?bH*A(m#_z zcuI^O5sg+44RGKewF^HGZqq&}@4NCDJ?Wditar=!gAZ*86JRZ=rq7Nz~ zX@yl*KDSQixA)Z^s5@21j@A)(9VrQUoJp5Ro3Kk8S1M8UE@|=Wbki)=)fNh-13LtL zKoqL7OeGP3G-Q1riR%7H^vGF^5&nQOvVjFDam)_2|pBR)Vuz$akpc9 z;vJCY3DJc((=pEGk4xEd$9Thv-p%(tC@_*wgb#^%N$Sbd%eIScxu*m~&{o_uGGgM& z#ukx!ly86yZ58WgJAu80>r>P?vZ+B-(>oWf12eCz+=$uhGm$z|LXys=&2>FdP`NR8nWW4`EpYX|*d#et3g!{Iq*gKq0 zRvnuAKmn|ogL&r#A7C5=&1;PVwb>`J)r%N?N} zr_Pql)vEPLox@jvh!bz5M}oqw65>XY99BY2xr~mH*?usjMJ*6F)XadC!WFs+>4eYC z*Dub{8}wO_R&~BWLV+k6&?upkrXh|vcOl2PrzKV>P<%?fK znT|bUz3WrLZJVyWwIaN$`cBiq-{D0Njod)PwU)Tx69q=-snEz{xiyC$;0?J;R3Z29;E(-$7Rh^@wOc)-aPwL~L#95_x`Wz+^B4`ij|hV(-ey342|1*T|AZ z$*|V#OL|QvWcXORbYi&)ECwbcPExEp0ZsP<%2(MbPFWJ@(U=or7R4z=^?;qk8Hv$o znfXty&y3_dB2&}|^=%FZr%BJK!kZN_lqD%gAq7v6H`wjgwAql8Rv74i zk#}{;(qfD)bpFE>!#LUau?S_*yBUXhCR#x}@Tt8GAFe28v(>}E$QgBjUZmgIXX#x~ z5_@q9Q%{L`q3)fk0A&$T@3$B%*$qsUBYm`zHptAlgBjY2!HCchJs>5hrIO*Yg}We} z-j$Buw5aUK8Tb5KzI12*;rOy8#ll}#Uu;=?--ZX?nmqvBz#$z^&wlH{4fid!T)bNN zYw_@kio*;4#Wm1&^NKdszbGQqKzZ6uUWqIc?u4rxw%1@cpT{aL&t0?murR%fydcIn zG*yzPj%;3&d-=p)^Z4#T;l6znXI^-yvFt{yn-txZOWVIUws*|&78LYiIeIN{#MkPuWHTL(mVA@}?Wzoi z6;TxNEz^44?f}%?R=R9Sig?>0iT%h=9)`M#9g5`wtuwelR#f6~=7(OTOGdwG zy*K(iPKmSebeU)9bAM~SCWCO`&Z-K~Sn;#VbxxN(Z@E|*jq9PS6+|8@e{h8@ zQS8~dA~;z@@9+Yj547Apb4BwY}}#RhJ%EY#!+SL-9{9 zS~>TI(6BP6`=v&*ZC-_N9D8LC2{m>;KiZqx_w$FOxuoNA+wu*|ga?Cvg<`i^5DLlM zWgC{;E*Bonl|FR%_KDAbuybwCcKFX03DfzMeg+XK{WiApi; z0k7&6rgQ7jsWCw7>x-}QWL_niIla16e3d9)dnNm^Pb;XU!Ng)Jqe7uMt*RWXByy8U zA}O}@dxql-%a-#dY-ou!U0j@B=uZbYh0*A6rjc8z%Ez(x3uzjAn5Bwc2J z2zT){H8Q-lili-tc8d+)h%!&>xZ;Wm*sEz8TAj7LD9=!5VT>MGlv!#-!<8B$H0m7a zR7}j2z;(LWfv`Y76y@<$X?%`el+7xtDgifNAacP@0R%1v^*%Or3I=no7WZ@0cyaW4YK2g~;#vVAIb5PvjBbN8DDN%}kna_6(L5ikouOq`tO~O&i zQJ|j*997M{kQghf=&0zgxVnO?MLCQ@dkvZuv|I15eyp0kt(x3eO)9HNaW$c_GHi9V zG8VoeOvb{bBTT}Om!;Fh*!>!mSt(6M%#gB99dt2mQAI^%WluG!t|ncSzCE@f8w+=& zMMfj}X&}EONx2XbHKTD-V4l)9f`mH|2$#iMJUEZa^t{UmRVr2~p($tL==&R_j>pVX z4mT8F%7{ym(m37BKGwB*Dub@R!g=rJbq5w((lrZqyRW`zW%_z)>rZa3AFhmCaUq9( z@kRlOTt#_w!MlF)v!CxvC9imXl^#)_84eu-hfZUDl9-MNd%a>7br%5!t&=L@PQxeubm?FHZRdpu_s?5?9U25 zkxTj4fEdJ?Clic{oJ)w4g+lbw2UwVtfjlZATHr6+ZIVu#)ayT)9lv;V?Q9=8*i zQ6cDO6%|np<7^FvL!n?_Wjxds)fKsm%8EErgaCM)_>4Xm!2?O3&TdB*K9wpyvngpd zE0jt}Ce;hXgK+$qZrSYar3C?5jLiBFl+ zB_%;eKrFZcW()+}=^&R&xl!aq^;u4gHh%hxNElo=d8~-L8HE(6K{JK@D24t>2BZM$^QJdm-;R?!TwKT8kVr&gB^Y2h7K>k9S(WK)zDbxign$)ZGRNS;5?$ z=;X>CDkIyeEJ6_GiU>YvDQqRay_Oe4BWsio*q^cSdB%909Xg6PDb>@SftSmNE_Ar zbRHTS8K-qF&l>ONPFA!Hrl^F-B&L`&cTjlYMc|ktQ_oWN4&;{fAqNHdc@)+qZ(oqJ zb{EBX&*bgFj-j}2FKpikGWDv9+mWxvw+82ypQ3G_PL#6>Z2r%X-E*vrfdD@gSR1d(D9|LI9lO`k<3mXyM?Q*zZN;n~~6 z!%FkdU}vGn^rXcrrl@5A*|BXD?HcYvePBm%QYB19*)|6q^ z%rr%Tmtj|NmefxFU(b@?1x7vboh$pXBF(ERx^Jhm{LZ!g+}cu4S5;u-VXSH;I{B1H z^7;cty*?0#TKkpNq5kM_Rk6<u;k^S*+%QHSLmYbc}yD3?-(OPVAf9p{UNjN9g!YG^&;^Fu(Nc zA7ym*lqk^k|>wi}avaml{p$)n7i<7Rf z*#H5pH+HEhIt6tzle8`>p>)=C4bPu55yiz0;hp{POX~o)O0Gy=`w-tlm^s)G*&R8M%FNg}#QC zCXv5SrlS>Lp76dP2v?;O0!w(7nRXK#9OIA4Z8nBeLKwJ>df_f8y43@$ogpwjIv#VlZ$t2>k z28hdEvCbBtG7)hB08d}lSzaRXPa-ZMU=2?}e%KL_+^9eOwBZ{>S*k3j517eDGwOCT zlG8lT^y_Fm2S%Gmdh$pluQ88h@`%}Bu&W2q=t_~6^E|~l#e=W$Qxp!M!T-?qsIUZi zDcK+)X%mEukUV#=1M`x>8A%-rs2T9ufzW{P>(3(NM{hMLSLE=Ub5`USfB3>%+r_hc zJHKXpK9KD@=8seTgO0rl(jXsw2&bvrk+X@&nY@fk;capXEal2WjQ;@_+2taax=5p| z+r_$Fgw2y#lKEOC;}1@+(<_Hnq90+-oHJi#j^NaGPF=seg|wkM<6od{O2rNVgF!+;d54wbOiU8ZZZSbo$r5=RTuck&Wwc9b*qk%4Pty9e zQ<4N?X9L0MDS)VjDLNP|Ncq`ld)eR~<2EgMEH_bIARNKT{iJV396b@0Fj3-j>)`PU z+7w07fkK5wD{~=8Nyd0ITqNu0%p8I6B2h~^1Nu-#5Sf=ci|Rp*|Hbl ztf87*+=FkBiivnEFhd ziLy=sSjR-2#cWY9Xt5ZRg(fYd>MD0;%IlbUSyC(}9&HqBU{i*o=Lu4w!jywxsDLJ- zW(30ENeD|Zu>71`^t(v(Ed~RLSolOm{y9T<%0uUJI?m@ZA|2XGxoCWd2OE7ipXCgJ zMmp&9D=RM%}@>N0;(vN zD`QeAn^2liJ`~+NGlvT162#2`s=Arc{FdWv!u%MIYcsOn{-s49H4rgu#Xm<39bS{hd*o zKz>wyRQIi0nlMQjji5QvS@BvC|V4s_Kd zQmJ@9`ES+_maPqU39pi1SELpzkOMjWD5P5rF(-a1m&?#NDW-_!=GtM$7TOBsaz$>g z4P{#@Dq_K4VIXc(C{z`}Ks*qa$#ZdC#=60tce7*%OE$9TNJkpkZgvoXk*ub@OqEde zs1B=mRc&K!ckR=)Z`JZlt-JP81cmc46hENv9RYZ04+Q?z`=pm$?%nQXz42H~2A!W{ z!pYpAyn^?TVy(??R|Eo1qsp5^2^EdTBOVQz<)X`j6*#+CnTIq!7FVB7hw+&Doat(b zvLP(ikU$JtOt%f;WdyG(FZa#9&b%WsG$jA-*#1cS6Fz;~~mRTM7lU0Ayr zvul1$N@gvI;QTpwCTFZ``>v{uSUh9<{068DLeG$cl}p!_ZCiofGLXpCv!H0LTq4?q zsTTjTL%&E?VC^cpNf#NyPO5V>ANo;8tPU%O6IS{z_D%q`C)&OJRsBxIBvRg(*WMsCCSamX)&dRBo(*f0KwbPN#3R;kPS!_U(c00>Mq{bPFRHsQIi5xlfTR2;as zlq;b)j3B;C&vqcB2{VE5zk?s0R3N^#@Jk^-wx2QVnK+ZxCZs8FX^6Qh(P3&g+FKP` zBROFt2aIIYND{^#BkMx4l%i6>rWETGtWjZ9=tz4g9B6fD+jU-7(ycY>bh$Zz!$Z=f zJt-kXOp*rBAzE6{B`0SJi$nA=q}PbtvL-uKYU-b-U1S3;eCJQs8k44|)&KQT+5M|B z$_BTAsv(uh)$GP`6Uw%kFMWy_Lm$yV{I;6gFjEMP)=Lyba! zfB^@HC=uY$0xUJO5X#aFF(m|IN(gZ%_UivTGqbCeEC|W_{lE8lzUM_8&%L{M=bSTh z&Y5%1oSEq$SMYTtqFud<4X_1bmh6$gZDvoQ+Yql=*dWZ$WyD7kEX)_^yIgHqRbJNo z%*+@=ecHSn@$8Sg;~v zHEM(pHDRu%)GH=Fl^>0h5txliOpI>|M33TyZkO*RzSrT93d-S*Fr#-V$SSrL zIi7jyVhF37e^Now22%A*J~-g>`0hq>TjX)=LEU}&i9-IrH+-v7CHrJ`K4Dk?h?g&$BaRfK8~|#7 zSk;$X#606=`e)Q(q-Th!88!6POi-H^Q6I1}dsp_0+1wagpSmK8Wj4-~3YIj}93L8F zX-uL%_+Dy>lu(3Oyp!jkV8_wShoMq;oqq+wDDRv0-w2gbVNelId1vp%+dl!ld!3gz zyZ%NO{3jQzLgXLF$?fOz$6mfZI{Tzutd4aYi$C$$Q+yOhBuS3oN44U8H%05iUZ`OjxuiTG zfG0JC&X^IpI_C5VnSX+o1p56gbEBlD?WzU6wFIp00Rqo2GyI=^gIDSN~9*H+i6OCk#w?qVs}9%c*i z22X=}%YwP;v#S;-C#(sK3N(G270CPpW07PR?Bf%h(j3ou{H9EE<{g>5Gh#S`uZUo^ z5v(kNMKmMvV_kAoa!AO!WQIxBv~@8CpKwh}TIVMg!QxdOxw=z(5zIt4|UqIXlFUFTLU(dQe| z;u`!S{LFqye%#<^@C!(9z{00#j$rU?OAUxvps!tX2hVFy` z^5JFd8m!Kz{pf#z%~G`+uI@TXgtFw`rzSjYFn)%o|Dc}6nhWvt&#?WecJ1XGXStsy z+ly?@1(+W#*H%{*Xk}%Q&3>CI3rum%X$UK)byR?q5(6!0&=Zr_!m?Vz!q)}H$Ie(+ zV4~6WQH_^X794%(%i;Lqjvrtoj&w2K+0eBkBo#TYvi z-eEr8G^3-#l6`$MlbXXiv*%z0yCeJEYy(DMO-~Px!t8cTOk7xSz}n>2Ks8AsXHCN`GxTfo*eMyFxxcxPo z{1ER38)D{1 zFg3vt`9N--(u--vRnc868JvzkezR%6>+6&qBZK?EU43`={y5#?Suqkx5l`2{$3DO1 zk~30gU(615?IL$~ckO(+L_}zyJS8|6BXoHRmKAm8CkHi0nGA-gj=ZFNHivxoz}9b) zSpiw~u&j)P*tMB)dPw-%Fq0`P%(sv*1RIer3?=8|te)^$&h`FSj)Oqy;o8JuCJO3WnZYi(7P zS)ujDl~%KLm-St%?mIK0J|QR|AYny8cw@m#TB(6a)|lKhmfV=1VvdS!j0pnuzQ zX^!cznp?j?_7n|Ek-3`HZR`$-5 zQBJ1k{lqUNBO~R9g9Gl@Ejgp|FJc2Qp9mgc%?36%m@YK1KlW+YdY>C=Y>@P6r9 z#tl;<15H)A@Tm+5zV$O#=8K>}OnvZ*JY!B{ZbDoWGQh%f5x|X1OO6a{ObJ($CJ;vN z5XU4guvxhe(TMlqe;FHy)Sb771#}c#K22<3f1K;1D|q19)5Zqyk|=e}r&sjE#;OYF znZb}78UhC|Js2i4cXcX@!r9#6-z9Y9m~)eId1e?EUZ&_#{)X7KF=^NtHpa(CygE`& zt8j5;Dg(uA=1ZN;WOh{oL-;2GB<{HkV^44H^lhQ4_}cpCzmDo z8KWEHX21w(@KLhOGiS#7kgJ0ETAIBPZ=k}aNOp4s&%`b?Oz0T+rEWwU9-mgKxRl(} zpspV_?KiuwX?5Lf#z6_mv|N(ii&?m3?1l-Y!&~U3bja|rt?oJfqmS#epmd%ElGFRT z#(m`Ls?(Ipw7t^T<)zq(%IH2xN$vB$5xbjZk*_PxQ8MweKZ{cVYQ?DlpN`=OrI~JD z7r5{r>aKIwt!>uqs5`nU2nQ$`Gjz_Zi>98_BUF|*KVSInpb-7p%1s)kYbC!pCxQ5z3898BuN5j^J`cXUv1sxs3F6cP!CwQO z27m7fPo5WmL7x(@GY|0g*pHoILh$y8ZLhUCRjKCiHNKl-5VeeG4%#^5ju=)I!y?uN z2OFc-1>l`9bUk(?fX@y;2=74f6=)nK_f>cb;TS~I)M_hBXer*_Qy8WLEQdl^;LYqr z96EZ3>)m57=?}-cI-ciyj>Y-m|J@zi5o$3{ULT0wW> zt(|CFSydX&8iH2GAZ8WO5VmT@i!q+0*K5DqnEB+5?;dqkKKm}e*_HL~ zd%T$4dPzj#g0o#t*Vo5>ckFP8>k9OaXhV_^j*ezNkdRjNP7F@i$|M0fF#hS-jFKR6 zj)kYk1#d>k2!EIQNZb5-DI=LuM!v-_v>=i~&o4+uUL`E@eNNjf-sd2PoZUj(t!Y<} z$u~OBFXTHNaL9K${DR);#4m27&DONb@04$Ko?o<#e{5JKaEKKt;KU#};cT_s(e0bD zh7P$j#q*nG=%pRRiCCWkPA--ExhXN_E@B7XsEC9uFICnEdN8jzS69=j%p zUE+V8{~i9izkkpsi|Jb{c4qL23=deBnCKfBNoN50W9pf=QE*o5AW7XSM6dvhGbrDL zmeq=U6MA`M@~~UvU@>ghX%OxmdE?^UDwPegr(LJ5$12KI{`x5{UtaEd{n(+eZvVvv zY~I7azCurDf6ZGK#>!V5`yj;C^YWj6+H>{kzhVn6xfZl9b4BPBbETD|g+zN?LlE28w=P0_E}+50-M`;>~Oqm&EH)A z=v%XA!+Fm=#N21vnUYNV&|BD!2)kc2;(YgI;*=9{g39<vblIv{N{rg=AFJ4*B^=$6{E*CO7 zZ@oNq#UpPxNy>N{;n0eRBH-Akw5?of+jnC#=lRpQoD;eu_Om1z)s{&d-$-pMmfH69 zSXz~@*DsLbC$PXS2H;$sNbSU`l%P=T;~9NNG{ZrlfwbjdR9I^P<@Q9FvAbY|dv`%{ zzD150`3Ax&PTIbcBAUV`9=~O$K38qldG!A8+oqHD=)?w{-urU~Vqd%3svMlgY+4=u zV)*CbyegcT!wbT>Z!k9N3=3Xd;JeP3`}&5^E;u1xn{#@|^w0?dh>R=|b(J)Fw&LXO zT{w?DKXn66+I`d2gueIm3;#^@%dO}aSQ~?$Zp<)Xind7io4!~0=dxEISuyt-aPS5m zKQKN%7M9OVlYY^Hk#$hW*Ha1ySMpUQoVY|9qB((sB>qIGNZPCuaR>usOZgJMSo3Qq{m@#dcGkF2YR8Gt zj-)Biikb!WqGm|$MY4rBTR`N`JaM(G+e3@2o#a;3u5C_Gv@amq(~f&yV!)1^Owztw zd)|!!#B-N!vI=Gg=fumeK-4!AKaB@Cf+Tg};%+F#64 ziS|Dv+kdXNe*4Z_ALC^Yq{lAS=ErC?RWk#>4Ty{WHYzF%uT8P$xB_I3{|+a%8;eV@{Y1pBSTr~VQQBR1g*H}Tg zvG0+D;v#?ioNmf>Ft_3Mf7F^+LT`$mb*XE^1`)9P4`ebG%u{=s}N)DsCf)he5 zYePhK6TNKFTa{SNCnnX!o0oVAqt9vTRW667iD=ABBhwPAspRGx^iJmehtQTvYN8cV zp4ZRglA4lnwu5)_-K4yxL+n-;=F;Y^k3Hs`lG(HZCl+~Pr>^1rWr?Wg%H9Y5}B`2*rNk6Fy8WoBC&jNhQ%d<0P%*a0hULWNlaWm5L z0{nCQxxfEy<_FAtqxoFSJ)TsOlao*1=O@SEo!2lkZDt7t1#e4!Aenb3@5OjqsB2hn zIU``^;&R`tEG(=sC*mc)G1Nlux$+H{qSACJ+FE2L$(iqvCn-A#?Tm(oNQyhLPb%74 zGm&YCZd}{~l z=`ZVDBh=KB@{ss?mvpC-v=kf8 zqv*x4dtKq!yE0@O?N9T-FGp^?kQOT(#p*g{f9fC`-Mi{o_)l-Yp4PyVXZ8f`pRUzI z8$m7Jd}&rc1M$KYRfVa|>+mK}n1ghEYf^JWKvlu|fyuRDCZ9&#;a2`mh3@iSugKl#Ld*W%tsfBxYI{AHw5e&V|LrkmJBFT6+m zf!oVmU$WqLFZaLdF4yz#gEMf7Jqsc*OIv{1l!Byit$tO;#tfd3F~e9Nys|K-0Xxp8 zHl}IuSxvD47(@J`Vnf37nxdlk;!w;!P=dYSi^NoI;(0_Q*dL;ezL_Fi2^jdZNd7{S zi=vC&2{<~>?dcqE`H$!Ud~S(dnj%HPgWf@fAO@d&b8P93ppE{6=0Xhe4NsrmDQY(kfW^$ z4^K5To2|*IF)_4qw>1OlPkw&6Gg`43O@@KDhKimN-K6@7ricn~h|Oyvw15Bs%!#HRlcLAmiR9T0$n84M9mJRuTmZgKUvPX6spqoY5$7rUE$a@Xgtf8xT)3j=Ju z>=fBuY+%u@tGn*Hkd99{{i?h7x!zk!hb(}jbVy-=p#@n{4OQuBN%hGA;o&h^^*;I0 zF~Pwx*jT4AUe_8~a_|zfIX)y~G0hH%!vKq+Bk)L_7g5jjs2M>)SYIB|8fOV= z4G#8=L+&?s@3taU$ISz*AI?LiRS5XRYXJhyQGQ=1X!|MsEb{o~Z~a*KRP5H{T0O`0 z61BQ(nf@wTUC^8~ANy=Y`PN57q}Io-Ob-m!_24LdiNO$>nwXf-n2J#X>4NU~j*K-Q zq7kwngf_$@p~5IhGDIO)Audx|8#_-ae=C)5{Ls6Z4_y|AB*ELN*qmo3wQtGqPjUC{4HmS+b zNt30@M7gy={}PUo;0r4-uv1fK)vTEMT(0^0VV&cAGmiJjZOUDrt4Eue$&9SuT(c5A|Z(2vw@uyKfoke>q!Lf!$6`$)Ekj1)51CPTx||I0Oty}`>mWo^EG=Wy~ zeGVbModjCbK&x+kSh6*_D!D0HH^3RN1P3%?=~yJ(qQ!9`rp1xU32+k&QpHw0l2*CN zvPXMNv_DdchgSWX!>;q#wr}?)v-f?gv;5-za`>OFzp)CIc-Nb{=}T9EtKjJ7RjbM? z@41bou^?=fU36||FKEm{dme$FBqQEg9@K2H7<|9gd@MdzpC%uJ)n}{Er9OB1eBpzr zd}wogXR7|KAtrKdRFu(-gEuhQ7O1rvDP&9Q+T@%8>;O4q2-@0&`9nKW~s>gs|&ABG}ou382#qY@m=D}@9=%s z_j6x;z3*1vvwZa>zRcpw%*gulOJ`cLvC3^=64y*v+N<@9`Isuc7iY9-ucQ|8V-U%vd<5b+j6epssOVz&(& zq-Z^4J&kq=MPhS8g2r(QD)UQT<1?c@zmtx{vw% z>GjX=MB307_gyeLded)NA%rL?wruq!?0R-$h5tepaJ%EG)9u(o^rAbvt~%HCJS2-| zKu*JGp9UW*BN7MuCJN$X>Vtxk8+=!#CoKtxk53K3ChLtMcn42yqP-?Twm0b{M^FMR z$Hidprd#B4UFBtMQ zw3zb6r~c~7muCme`^~QFx2!zvprd(n|1&S(Ek#2NqKRS<>>d?6cmr=M8CB8wc{QxD z5&KK#G5jAQ{@3zU^kE`~f!`aP6nnsq;WGBH9=}KIAv&s>EnK)K`jKdc|FvlE*n_~k z*SJr_KGNuSyu(fD`9TuASyJO_$(lS$n(TB3XMiVuc6BKN(xNWSZJv za@Vd88EMuM5n-L5M4|d^6~)ucoHm+vxiRQNhD(4!`~uTSI$z&VbNtLHW@jgG3>))A z{7dH*ayH9r89SwIK@s|s9L51gD^Pn4)d z;5(-jvbm9DO+=2tpO(QEejp@NNZd@+vJxV<2vk7q?pd=ML_kCik5w&{2QS?Ub@2dJutensNQ>*rMrsa01Vc{{YX9AC2c^4?jCS zcxv4I)K*X1k0uX4J3V+X2`2ejxpZnj3W=PMmeVGrWiBD||CiEong`1=iRGW)CoS_N zH(I8&K$sO-tnGrHQ9nb^$Q+@czq@C4EeVUaVVdY?Auq-+C6ADo#ebeGFUue=RZ3n? zULob>)3Msdsq(TIa(A<^i82?W!*CFNA34TmMr2|!_xM>gOwYM9-l@^g@(dU) z8FrJiGMbe+&zd9a_ShQoJ?n)H6qMr^G*SplTS3CGy(mv&@ccry3|U%O59Jz@`|RzBP^}NbLs>y$hYCFrBd~QhcfV@ z|4mq0iRIJ@UNAE0yzxZU51wBLUVKS+B#vzpI50AC7MWEzg%iSYNLX5lW7`A{5?XG` zDW1v)$*Hijz#;4`PRA4SNAe0g%V$GiOMp(;*_t_oF>GeBL_DE4LVksv1!l6d?@UN> zN>!9T2U1)H5?F0DDByXV13*E${;ra{WXN4WPJtHUr2&{7;=@9w z|E`|C6L@LhBjK1HfE$ut{u-0Bi@^#EmF_l zE}rLkVB^5}k+I@}N%aq6v^vfBJf0V`{jfin2^AU!b>|v%-Fr3`ZAIr+;%S=aCtbf= z)}AJ6A0Nxkkn{Y?Hpn?^(so&UyK%j284hjdLD2R|wL@p}M9aw9+r`<1r0wa@$$*05 zY3e3@5p~1+StWH+=g>)bKhR09oC6gL?+`jE>W5C=4C;kW3U%qv&GgPvz%L~I6F7#A za`sQ>&`BCME+Czpj3q~KK{_e13>$6$78-AJrB3c1%gmh)kI+fU%c&E*h#a^@(8z^h?QBq_t(|HAKZ zIysGqkOl~x7!h;JL4X($-J&;94>&fZi}N#ScHc)kl~FbW$x|+*Pq$=*i+l<9IEEJe zim>vvgiSkjhtvb~8jrAKgnBCzF;iF@`H8P{8GGS(2<-6#^>Pa zX=;boa6vbhT7%kCMC}L0atfxY9q$c-a@ZfCH}t%ye?Oj|rhbf*vVOD)tz5$MIimh+ z$I7N@85${N%dlnW2YOo6ekGosT)S(pDczLiu3hy!o`=N(x3`aFq)etBHsvcLd^1J8 z$EH|>P5C*VpHzPmBq8tq<9bi+eo0a*oc-VzDAC)Hh}(OI$N zwV~<*<6Fk^XZ}F#CavZ!(T3Tm`oMVBSV7h_wUa~&${~@|DyThM)c&`z;__)~Cy5la zLn5hN=y_59!($~C)6`EADe6bv`(^#)xE&aOW$dJB+D1qu)eqkd%gs^y98vp?V{@jo zjYlFS^&LhfG18-b5FYJh>LFog3yGA}cL<3={aFy01LJp(736qRKYj$y)1FBgm}?gj zY4}+6)EtPUskYiIw-JYB!k8j*j)Xi)?e0JtsiuYA#gJLJa;$o`N`Inf<^DrL8fDGx zhR@J0Bm>CDVi5}#A78VOMrAh)4=Xxmp<&|c7IGbo z2mAUa1s4R*3D$#y4O*2R5bA3j({%po-mOhnmp)Q_jq#e3PmSzbb8uDD`ntFqHnhUUk?qiBI)q%C1gt2{jR=p8 z4UN|J=(<^>1M`e~%;p)<(ea_N;n8RL`CJ%;g}Jm1ZxBz222D6{el0RMLOv~u^)wLT zf}oG)*Ran9vNb@WPiiJ@D<$&1X+v>pw~6-p%x{(dj#ZVJ348887U11xZxy!$)XcU7 zC)Dq4a~+##I)1bRE%&ic2&5w(`=}L!hsDIiM@L1)#m5Kh0VdtVd}#%80aiJQll^q; zzh$~40J;$qc2;~82#-Bj6pPs9p^&#fr72^|1%3uIEF#-S9Qx-bolcy^+%OJ6LozTH z4SQ35^wG7kH16{!%qG5VMwRk5_YiMFR--=*VdRgX+X#_q=P zKD#4hBWFyKsu`DtYX!&9GeWE|*YzB=0H_i93iPSSB$+BuUi3MHG*!%mG@b25qe&CO zlpGS*u(z#pg3>PZ$Y(;5VrVuwW_L(P6Zo=twUFzBg z>*@#8wJ)snBkJ0p)oHJ&>mV(k$ExdKEt@wWLz@{eK4@KhKwUE}iodC@xfaa7P}jPa z%U$Z);Ps4A%hj{h=O!&er&FA%P9Ne`=QXvkOB0a}IWesvA5Okb+& zAg#rR&SIl_g0&Ssx6bR{)IHR_v$Mm}(Kgg(Y46{ZI+>dwvNu;wt+2{{*7)#ZG9b<-nJc<4V{*O&Q0BeL!AR4uDj3D z-Z?PThH~@pK=)urcRP_XnD4>tMW7c67J;X|zi+6sm*^kZVHqU4EkirDc5ZBI@3d@e z>+SB@Vd>}`?B3J|OdIfAnL>F6HZ+S9fJ4^pkYZ9P4z?!kNu z8f~b%y$zoX4Rj8omCzpjTRZ!Ru--w!F*MMi=HJms<*ba zqfp=E60M?xi}I~qLql6nC@9#rZCieucq+etU{gVltYffX(fpd)#mj5+@FeC!y0uM! zA;3;i_Hh*S2aqpmFq67e2LUzXB9thf6vIG#A(Pc%~oU_TbkRtp?Wv z_znF_wRGdE4>>vWaNmzRs((42q#8FO;?ap;4&%3N_@r7J1jbH0-yxo`Am_#MJ-=Kf zo)}d1Td?O+zM#pXZ9sk9sF5%g;;+c7h6&8x^mGHSMesW$s3z>af}$<>ydQK<<+4rC zXc15Cz_%Ol3k!Zr+)!;pf;!on-FTK-l6a<8mG_%LCAGmI=T=f`01Z zA=EAVVLP5Cnn{Z3^Da@g;j@0UHMN4fFR6F7i+gJOLGVuUw*#M2jc!^=0($T_nQrPI z3&u#HIX$``zD0*};t6LbvXlSSHm zSjt-XGRyIA9&8lV$)(dYz7f(g&42otaHcq((lrA%FEhdS@YVd_8wJ2u3W5h=hG!j$ zwKw7Liz4AyMQbx~vT7{$4U5NnTq5$CEXW&5LGDc&vYs=vOw6`qVU2nY?06n1C;$y) zFN@)+m10Moa-6bMi5@)>Z~U{hli;&e!8XkW{Y5)hyIA{)_6v+E` zzzo_R?K164?eE$}+Ev>5%&5Ji{Y|@8yH)##_LX)-yFvT4_KfzFHVVCH*DghGK8yZ* zTKhdtfOt-OUVB0N7_IlR_6O}HoC>i?`$GFK?KOCYucF8Ps(q^M#VW6EZ3|?t2eNQI z`pAa*Gi&2aV<9Y*g|TpKb`;5?STvi#VpuGTWAR8+Ph?5j*V;GC!jiF9SSm7d z(pd(}WHVV74)w`lxh#+6vjS$t`nEz=#EMx7)`FI?a%6>7vJ|a*zIgP4)NK^PSal34zbg#J&qRv76Z~*n#0!>{fOgyPf@-jj}t~o$M}lH~S46Ll)4_v2($Fh=~1`-OnCi z53+~Y!|ZqL5%ws1j5*lj>^r>_hfv_7VFF`l!sPuXYebL`CiH})m_ zJNt_LgB@Z2WM8vy*thIEc9b1sE;bHjMK&#V_cd@MH*p{C%l)`N58#13hzD~s58q<~iEE+I`yN zJXagj?$Msmc59Dm=V`ZTPx3sTkNDZ|c!BmHw`%|7g}ey6`;_of>{4){b{&=sRPaiE z0yg5in$OZkw4Z68Yd2{>)vnQQ(Js+0*RIfh%V+bG_#9rvtNC1B!{_l@UdQWs1E0?q z@P&L4Z{&-yZ*db}%9ruwd<9?0SMk;SWPS>7=4*HhU&~vutMPi?#y9YG-oZQhM!t!6 z@ov7EZ{a<>m-q30zLnef03YN-e3+lgxAEU{CWNYf06%zzr_E@U*@mySNUt)$zSJh z@HhEe{B3@azk_q_|HKdR_xSt#1O6fZGyjPHg@4RH;eX|a`KSCd{yG1G|BZji|IWYS z|KLaXKl#`E8~!c-jvwX6xQmbL8Wyr4Jfa(Pqi)iDbYI<1_tyjTKs`tg*3Ei|9;%1w z;d+D~sYmJ2`V2irkJaP!cs)T+)RT0Jo~)C+TzaD!p2ttJmoB^jf`6uh$#&`T7EVp}t6O z)EDbZ^d^0&zD!@Puh3WOtMt|S$@(dJv%W@e(bwv&`Z|5R-llKR+w~5;Q{Sj>(!2C- zeY3tr@6mhpKD}Sxs@wDdeNZ3LhxJqSZTfb7hrUxkO+Q^fLq8Ltp|kX}_1*d&{T$t{ zpKHwT8}8}x8Sd-0TC3;z_2V6Cu)TkvGk7arA^SVeX4ug+6VgkeA;Abs@^cr zd1|MrO%y)W{hRvxI=A?=$ugj(y?da2xOZbu=k|d1iEBemNB@wa9sii-wYQ-_( zq3*UJ+)?3Et8n49nQ)qFC9Y0U_}Aj+ZS6#uf2Zftr&dwWDN9qWthiGY0re9!1ZCy{+ho0go4jrU8YZ3(=$g1TG;C-aFm&M`)BK_Co{mlvVhkvJ<}2#E z74`Ea_1&_i<|{h8W$8cP!vdebfOl^WSTKPiVDrRv;6g8&0=G=M*+j4GJ$Q-kZZ|Dz zYsY)DsYeuni@cxf@wzcBlI_zY3d165haUW6S}cFxCx5@#>nDMIUN@%2^7nnRef!$B z_Tyc?e`{B#UfZ`x@9f*;vqZH+ziNjivK{(G5wxUhxNlS2z;JI*+wf3OzxSPKnWSMr z(y+`6ZQy{{jcJ*rVL%qk<*x=s5wLus=>i5Pt^-$iRS-Djbz@o~s~Hl7VFmT>5cTd# z*}KECcULN|h80&UC0E0uFs>Xx7{!R-P2Z-VmEJrB4SV1DtW;7kEX#n^6BGt)^SVC8 z>w3q;wW(S1x>FSX%^n%@-|4wD_Vo8{8uYIwTI6GGo=czVTJe!jTc;=kmJIf^4R*=v z{)y|r5tC%!IMmAJjG>GiPxlHSfu@}bafJU$7RQQ$Jn?Hp<|*0+H= zVaSRrOMDbQLo>e8fzP<23s(k0Xk6H~b!!_mrFTO|8*d!ui--Bi-H=y70dMNomv!|U zmv?XKZPQn@4f`l+^ro(Ey#~-U*e%giR|ZmjZi>w6LHE6Xo2MZHJH0sa1tGF|h#zqk zF)Y7#|5SWv6u&oYz~jbE#GJ9CvuCKyN7ZH6i7#~e5@9Q_MwJ=22-bQ8Ym&&hHN0<_ zZ}0Z$m;C7iUHvA+0ejmDjiS(pz@x&iZv}tt0FYzsr-l!tYTaa+r;r(_>Xf~vz7#k9 z;>Y6BuWe&@ccIlbWZOT$OvSDm+(}?yEAZ=gNbl%#EY4 z#8Y3Pri)LS>c)Y6G(6wBaTHqJI0~(99N2Ew^PHQHLaPTyp$EqV&86CpX$C290VI>sMVO8M)*UhyS zlF>w26x5D6q8`Nd#lY^1VYLS{6`MnZci=S;26$bEdR-5YY3~f&*grhrW-E{=aNh(8 z5+I5fgh#7Q&?MEOV6Ve^%T}hdQpn!3+qZ`eMNP}ejROt-EIBb zyT$N~))gF}EHN(W>L2Jc_KSa4ihqacUqMN+tkH_326bO-=<4s^LY=Xpv!{QX__Rbl zRbrL+N=haDC8g@VOx>5sT1v_!A6Paee_tlr(OOa_+7YGT52a{Fl%gF`igrXP+7YE_ zN0hRiO3K{$M7!W~(Jt1Ka)rNK;V)PC%N71|g}+?kFIV`>75;LCzg*!jSNO{n{&I!C zT;VTQ_{$ak3WdKy;jd8mD-`|;g}*}KuTc0a6y6Gjw?g5qP3D;2&KnOA96crG=9J(n5j1uvY3PO7T5P@jXiS_kup$3;IwB`cMk`Pzw4`3i?nA z`cMk`Pzw4`iuOS%=tC*!E3B3JiBjR0`iXmmU+O3B6@ICoxL5e4e&Sx?m->l&g^aOZ~*>3cu7(+$;Q2KXI?{OZ~*X!Y}o+uvY3PN`+tQ zC+-z~sh_x4_@#d0UbVl}Pu#2am->l&)&5dHaj)86>L>11`%C>Std;tSQnk0#N8GFS zmimZ$#jn)IBC8q)imi3w6OkC<8N=<{;PsjCh3T`fiRZ{~nev#3C(&oY!o~E|ByT;H z1c`6mzn5Qnej4KTQtA7i&W%H%?hiJ=1IA}7YiPz3dz&EXcbsyfa2E)O5})Eur*k6= zxTA06zy6rh%+**=+fW~VN8eGtG=0yubPmvG@;Uk))r?a{HFo0V^d!3$5$!tt4~Bbv zx_o!~Rrn1ASOd-tI>&cs&?mk-gL}+xhCCNu6n=SB*o^HltKtsFN5xmfx5l3%uA&kK z5)LOENeoO(nfOB;>d$wl_aABze=)0kcg9D>9iI53JJjp>OAL&UN({8TLUsD?Ox-Q$ zQgwnl@khT7I5+;B_;Z5rm%4kRHmcnXeigwz2?K60zbXGho})iEJ>f-BVF^cKRwV|; ztg^g9zcjy@dVN|Vpdszzw7;bDw8Zp~)aymLA?@Py^V8qU2+YV%KR@G~jFF7%0S}9- zr!zjwIGPzH{?b%=Lgwi+@6OtXzk9QraxTt&I{$*q(=$)VZpyzPyQ$zo>zSFS=Uj~P z3woyD!GZ@1Z!UbL@Y|w_!dD3BIx*05eRJWrg*O*fBnD=lUid9h?FOR0=-T2cKwV-= z+~Ksu;t$Ho%C!@sGEXRY@PwIJ`*NSoeLB0TsDdE>g2Go$SOr|KNI-vdFM*yf ze8qZZ;VXoPD3`x+|K43@o}P6tJ#hlC6BJcs-Ag>s_gVMmK3#Y-LFNfWgREQDlz)Ny zUY2eusHFM`vYSLL)N-O_vi1>Q{|>mN&|SJ^V!D!AYbua@Pzz24DJdi^iGj!=NE>g_ z7L1Q-yHV}|oCB}}&IOzYIDgz^aEZ4ybgGC z++U9!Z_(oci2w^A1pr)n24E&28;}dg2Ut;erDg`EP(a%F2&fqWH6x&A1k{Xxnh{Vl z0%}@7%?PL&0W~9_W(3rV<#xPKM!<@gBq z9rx#ffDpjUaR)dU0S6=e*>M|x4&`fr*8y*Wo3F;5{0QLdai<{YXH9h zTno4kb^Z$Ft$^DAw*!6+xEnAAxCd}A;6A_s!2N&+01pDtlG?+7-vQsFfTwZ&4B+>G zX93Rvo(H@DcoFat;AOz804LxLz*~TWfOi1z0{#Rz1b7edKHvkuhv>0jfEf@12nB=z z!T}M0NI=@Son-)K0?>vm2apTM1LOk=09HUD0PV|)0VRM^KpCW>91>H3vJz5(wq|H! zoQ3XW-{Sf^e0LP(F_bQp!(!n4VJ}3hK7C;LmV=bT+unrOe96IXP%K?>u69KaU za{$!<^ra3wI`HW80q9SCAz%@p5wIAr1keOn3P4}$%K<9@D*>wjs{!bH{S-hmU=09t z=%7Of9Xipm9?%BZ0B8qv06GC10h<6_fNsEMz!pFcB)S(;+J_RFpl?NKL;uc$q&gv~ zPUs~`CrRcgB-5dRGf3wsb}4j10uMt1ozPn+^wtTzbwY2Q&|4?;)(O3JKgl~D#f3^*8C5c=+fzB|xE4)oAr^pFER zbQnG4Ko1>84~?RSoaiAZddP_$azekI&~GPn)d^j7LRX#8RVQ@S30-wUSDnyRCv?>b zU3EfNozPWkkx{gW6D=}|7IC6QM$sZpWLHgY4JTT|sanJF11&Iu7I6Fk=T30#0LKo+ zuBicEGOzcLT-%_WU5xd9OV-zpG5f-%4Y!20-guF2zUwbGT>E! z6YvJ$ExV5%FKXJKsX>0Py?L@uaLGR27X}|M$z^*z6#}9NJ1?1BMxOe z$^?{&D3egaCg{m1Q&6U&M4Rd9C^JxIqMV5`3uQLS9F(~z^HAoaEI?^RS%|V2Pzopq zK;vLXMqx)rVMj(`M@C^oMqxijVLL`)H%4JIMqw{TVJk*qCq`i-MqwXDVH-wa7eSq49>sno0oLMvO5uzR=i0;|c@7dWvy`Z1?~47(z7A*g@k4jTxH&G*-|! z(F;4$53r$~W8lr$;mz1FMzlb_Y>+P-?8^x3%Lv8>JM4=c_T2{iZi9Wd!Pbnx*4SZd z?65T>ux=x;ZX>X6cG&C|*z6YA>=xJ^JM4}fcE_$+wEu=@$fxo2{%x;q4fvB|AjXO* z-kKBM+F|hQ5M$yjl+Absz4^UT{&PHk4d54mYXLMW{0`64xcD^S_kiaBF96;FkazSR z-~&ibFdzg#o)CFK-g=vjaWEH<53mA?03`r9rpnPpj;T@#u+MBKmuo=(;DU#zW zNfeDSBvtS!eqen4F`kAP)jTcw7;1bR@Z^-%qESzJ8cyYDxV;NG3QF(7sk{rP@-Cdh zyZFz?VbUKtqDqdPg5#e-!W*2}Xz?Fcj09OM>05{-wHv;wnZUWp4xCO8u@GHQrfZG7K1AYy-8!!gA2XHUo zKEMIM{eZ`S%YpK7luw|166I4UNsgaENwWMbN|NX2QIbr*i1H=C%Yat_PQV+0w*UtL zB=hg0B)LC?l4SpVl#qXn)DHDl;81S`4)s>xP;Uj~J=rmGJH&e-+D%zp2P{DY-uW8v z&es4>Y6PRX9izG1@;YD@>=@A<7}4z*(H$7k?HJJ=7}4z*(H$7k?HJJ=7}4z*(H$7k z?HJJ=I^I4oqB}66+cBa$FrwQrqB}66+cBa$FrwQrqB~&K9T?Fa7||UV(H$7k9T?Fa z7||UV(H-i|z@gp@9O})$q23G}>dnBR-V7Y-&A_4F3>@msz@gp@96|@zpkC-MJOBsQ z5Wre|uYc;TC-AcW6F*bC4sx6XIZgtmmTBbJ4mq|%j_r_RJLK37IkrQN?Har)Q1(3$ z2-lGxkYzh$*$!E@LzeB3Wjkcq4q3KCmhF&bJ7n1oS++x#?T}?VWZ4c`wnLWfkYzh$ z*$!E@LzY`0%XY|e3uM_2S#E(W+m$Tal`PwpEZdbV+ab$#$g&->Y=f(St3JZ@cm=?2zvk$hRHx-2(ZxL%v%e-*(7%3*_4l`EG%H+acdA zkZ(KWy9M%XhkUm{zU`3j7Ra|9^4$XYwnM&KAm4V#cMIg(4*9l2zU`22JLKCA`L;v8 z?T~LfuH@UUuH@UUuH@UUAi>#tCdD4m^x+WxT z#4Tx%vgxeoh?kU+6{V;cSy76Nkrk!r7+Fz@kdYOoC>dE%ij!VTBhax@{?YRj$)B+2R-GkxDXJFLG1{48G0PvYKSRd$- z4OZNyH2@X>mH}1(U~PUN2G9U2?tn+)fJfqhN8*4-;($lufJgE}R@??FZi5xK!HU~p z#ciIirZ9dfUG#h2FQw2Y=Eq|10IPDR@?!P#0D$wfJb73 z6?ecRvB8SlV8v~);x<@u8?3kuR@??FZi5wfz$3B2iaX$u*kHvS@JMX1;tqHuHdt{7 z;s-WZaR*`uHdt{7;s`caaR*`vHWm+G6BZXe>4Y`6qc@$f=yvp|6IR`>VhynB;|=cV2%TBQfvg{O#Aj?j%2(s)Hiy+HRu?Vv4HduBWEV~Vs-3H5UgJrkDvfE(U zZICzz;t@7jb_Ze-Hb|ZWaS0nNy92Qa8!Wp6@d+C&y8|%_8!Wp6aS9tOy92Qb8!Wp6 z@d_I(y8|%`8!Wp6aSIzPy91t!4J#v!@DKa}^j@XjmB?%7cux@?HF?wY?%?|`pYX$q z%YCSEA7&*FV728wtc5&)^^6C&kG78o04(?nPyGmNCqfgZk9PdKk&I_h&$EE%0WShx z0=x`(72pKC0eA~=5b!SG5a4~lhma66AQTV|hy+0QDUyI*`{775A`v12y%1$1U32-yu7QlXh1MmdkDNurEA{Mmj36U_Zq-20M`Qkcdq4s=UTcT$K8O<0E(gY zz_v{{*K!-I&i~oj!GGnK{I9hB@62EaB(f8*5wHpHW2Myx?&M(6r1yf|1VH{z=!4LssHh4V)@NfokJ&bZYU!cVv+%`YOmNxgdtF4uv(4WN>^?Z!26Oq}ij-kpFm z0lNVg0xkty27pftPL7LGVRwiW;I;t<0N8(4Q9p`B#RI5w7_c22L`-U5iOst`2_w-@ zSf{q9W4iW)52WJmXh%YM*Ag(L7rlwayC z8ycfK?CGK2q}bW$v-3sIdicY30whgm75eg;OK)uh_$YrvOg_ z@YaR=8#_bn7dbd~_BzV90C=-vp8!4ud@0^^JpLQBbA&^4c|Sfs4dv-*!?RIBbNC*V z=b*HsJQwA8DE9&&-+UD19VqWac^AsZP(BWL7WF&_cnyG8QGS8)Zz#V+OPKI>;sfvn_yL0Pri6ac!|+`=?xRpfqnv@y zV$e5YUIVS=WH$r$Ln>}X32GTAMawzagMf$d`R`CZiWULY>>z;Jp5`1dYr^3_phcV< z8t&;gSWMA(kSTsXo`L_#frH--pngQ%qA%}5iQeJ&10Dny4+GFcXc;Ge3D>Wod>!y6 z;61=ssOujnkD&Y~%CAv=gYsK&#lf8c;13AEY)&A`Ae6xXL4SYJlr^DNdgI_23wSmtO$ma-$-2|T_9J&BLiANiFw1LMF z@aO=KBm6#;hy#E>8~C$+&ut*q;P03ICOGIi$}&^!u1~kkQyb+P9@7uCCg4F%T6WBPLky* zE#&0ip;b%(AAm2w4-kM}4+2Q}CQIO!aVPc+Qjveriu+_5mE|R)qma=Nw5D4|M?Et7C7wG1P4V)VJTkil++wWu$nF_vjWhA=E|eHk zf3ysPe#r5tYV`>@#{3Ipc@!FJgFKHwV{Opb5ooL(ay<&UZcuXFFiEbT)3Tt+4gZmB ze}#Jg0USqA{uAZbD8E7ZE$W+2&i&DABjW z{a1xG7!@PoZPOf)N`>c9-+ z_F;4T#``dK?FWUog8ETh-vfYU2F2f>ZH#F9znf`{v+u|*To3QSdyE24!oPYOZA1G0 z0ZP(svXJgEi1gR3yW}^K&vYKZJ?6Oel>8;qP0~x!NzzBR?*uy{tRMM9B*%>r zp;OSON#ldk5$tH^_K-=w$&VpiMJ2$ig0m zS@5H?L=?IX?OYFN04xA31FQh70yG2G09pXM@%uf1a{zY0xq$Nk*P)&p@coT|eSn() zu-=|X_OEaayM&piAD1ByKTLzqh@Kr4QE;?|_5|*qL0b7=HrfHVKdnK=hoY zVNA~eU>`_U1}Mj86(}oFqRk*-qwZ)tLwjLX30Y3~9OEB5it-pr7s_$SwT7{lp+pub zMeD^}LM(bD4zeAO61X8{qdM?I(nduDA5tWu_~Wu8K%iu^XO-NK42lB5wHZX6tEny60jO@3IKhsuLbmA%dt1)N?v`2D-EuZ|x16p02G$~^0p9_R0mfmUaFRUYWm&LQ zS+G%Ad<9?~s3d3uv;#T;n*iN_Er4Eaw%!l0ftDwr7t`g69iQcZSvPGdfO2h?qm=nJ zcI{+blb(={P=3(&WkFny@2>z{3AhSyHDCmA1MJ7Yn*o9M814J=Z}47&6($a>FmYgo z$wW@%W1##0a(0AHu1^9~0o>UZb+ELMb?7MN^w@=dl5Ub-l1^gA6naT{Yo3e?tU7V$uKhoob)gfF zZGd(_Ctwqx8?XgHdQLh{`i+PK^vFxE;DJo%DR|8ul0WG24wm3)8O^*7y>dNTUPiZQ zEOtk?9Eff?@FwQK8<+#$mjlr)dY84qv#`NSwc#zyhId&T-o9+`E^K(0wc%aX4&VN` zC?`BMhZxsSLwP#BM@$f2hz;+u4tOFqcxw)LBQ|(!6d`cHE3xrWly{)K6XjhfA4B;# zKt{N1!atDjvNriHi#HwlE^EWPtb-$$0p6Sg-i!_JvJQAOHh6Uocr`Y7b`E$pHh6aq zL;!4fm$l(t)`oXk8+;9laM|!S_Vdj-Wrv0B$3e++#QgwJS? zVjZ4FHonQn>KQ*+;aTXHd6+kd!oI`vk(sy-bxty@|h-*zfjj>~j1L{#Ik(+dpAEcn^Q4V29lgfd3=> zt-)@@AA^dovGeX)>=t}XYr`(VnzjME2%EHa>?7=}b%>pWJF$y!gtiI02FGjt*ef^@ zr_Wg!_WNcjEJfRn-GcwWvhE)w3OEeo`19NpH$+8iwxpdQQ6f=?gwhZ~*dHYaA%#eg z$m`S~)Bd=W)F~8UBq)W0bs8x|{vk8!Ad{>?r8oi?(V(Hoih_o|KOCFi@f}{?;rTq< z)PfhBrwfR|F|}d_?@$|RaDgu32Jh4*@4^ngj2c{|E4aaNwc`UH&{cHcGF?LeK8~+k z?P}e?{5`1@)^D9|2JKh3g7vH0NWTenWBs1f9dzIG^t`p=`}Sh_wyQ5lzPgX(+o66O z-|I-gDW^1m<=aL77LKnT;`nxJ5XbkfhJxg)M@YVXdW_|JPs2#Q50Ht|PU~qRnnCTI*IUfqkD5j8 z&FUR)@1ouZr&n`9>D2->rl~`PBz;Un4FH>Z=c7 zzOHjQ>TA@8F<;mF2aIMr#b)S=^0A@0J_#u;s5{u diff --git a/nodebox/font/glyph.p b/nodebox/font/glyph.p deleted file mode 100644 index 11ad217..0000000 --- a/nodebox/font/glyph.p +++ /dev/null @@ -1,160310 +0,0 @@ -(dp1 -S'Droid Serif' -p2 -(dp3 -S'bold italic' -p4 -(dp5 -V -(lp6 -(lp7 -S'moveto' -p8 -aI346 -aI0 -aa(lp9 -S'close' -p10 -aa(lp11 -g8 -aI346 -aI0 -aasV$ -(lp12 -(lp13 -g8 -aI670 -aI-312 -aa(lp14 -S'curveto' -p15 -aI648 -aI-202 -aI670 -aI-271 -aI663 -aI-234 -aa(lp16 -g15 -aI583 -aI-120 -aI633 -aI-170 -aI611 -aI-143 -aa(lp17 -g15 -aI482 -aI-68 -aI555 -aI-98 -aI521 -aI-80 -aa(lp18 -g15 -aI348 -aI-49 -aI442 -aI-56 -aI397 -aI-49 -aa(lp19 -S'lineto' -p20 -aI315 -aI105 -aa(lp21 -g20 -aI241 -aI105 -aa(lp22 -g20 -aI274 -aI-50 -aa(lp23 -g15 -aI93 -aI-106 -aI193 -aI-56 -aI133 -aI-75 -aa(lp24 -g15 -aI33 -aI-228 -aI53 -aI-138 -aI33 -aI-178 -aa(lp25 -g15 -aI71 -aI-320 -aI33 -aI-270 -aI46 -aI-301 -aa(lp26 -g15 -aI181 -aI-349 -aI97 -aI-339 -aI134 -aI-349 -aa(lp27 -g15 -aI189 -aI-266 -aI181 -aI-317 -aI184 -aI-290 -aa(lp28 -g15 -aI211 -aI-204 -aI194 -aI-242 -aI202 -aI-221 -aa(lp29 -g15 -aI246 -aI-161 -aI221 -aI-187 -aI233 -aI-172 -aa(lp30 -g15 -aI292 -aI-135 -aI260 -aI-150 -aI275 -aI-141 -aa(lp31 -g20 -aI352 -aI-419 -aa(lp32 -g15 -aI268 -aI-470 -aI320 -aI-436 -aI292 -aI-453 -aa(lp33 -g15 -aI206 -aI-526 -aI243 -aI-487 -aI223 -aI-506 -aa(lp34 -g15 -aI168 -aI-592 -aI189 -aI-546 -aI177 -aI-568 -aa(lp35 -g15 -aI156 -aI-675 -aI160 -aI-617 -aI156 -aI-644 -aa(lp36 -g15 -aI178 -aI-774 -aI156 -aI-712 -aI163 -aI-745 -aa(lp37 -g15 -aI239 -aI-849 -aI192 -aI-803 -aI213 -aI-828 -aa(lp38 -g15 -aI334 -aI-896 -aI266 -aI-869 -aI297 -aI-885 -aa(lp39 -g15 -aI458 -aI-915 -aI372 -aI-907 -aI413 -aI-914 -aa(lp40 -g20 -aI479 -aI-1012 -aa(lp41 -g20 -aI554 -aI-1012 -aa(lp42 -g20 -aI531 -aI-912 -aa(lp43 -g15 -aI690 -aI-868 -aI602 -aI-907 -aI654 -aI-892 -aa(lp44 -g15 -aI742 -aI-778 -aI725 -aI-844 -aI742 -aI-814 -aa(lp45 -g15 -aI735 -aI-729 -aI742 -aI-759 -aI740 -aI-743 -aa(lp46 -g15 -aI709 -aI-692 -aI729 -aI-715 -aI721 -aI-702 -aa(lp47 -g15 -aI663 -aI-670 -aI697 -aI-682 -aI682 -aI-675 -aa(lp48 -g15 -aI591 -aI-662 -aI643 -aI-664 -aI620 -aI-662 -aa(lp49 -g15 -aI587 -aI-711 -aI591 -aI-678 -aI590 -aI-694 -aa(lp50 -g15 -aI573 -aI-759 -aI584 -aI-728 -aI579 -aI-744 -aa(lp51 -g15 -aI549 -aI-801 -aI567 -aI-775 -aI559 -aI-788 -aa(lp52 -g15 -aI514 -aI-830 -aI540 -aI-813 -aI528 -aI-823 -aa(lp53 -g20 -aI458 -aI-567 -aa(lp54 -g20 -aI489 -aI-551 -aa(lp55 -g15 -aI625 -aI-446 -aI550 -aI-519 -aI596 -aI-484 -aa(lp56 -g15 -aI670 -aI-312 -aI655 -aI-407 -aI670 -aI-363 -aa(lp57 -g10 -aa(lp58 -g8 -aI500 -aI-252 -aa(lp59 -g15 -aI496 -aI-286 -aI500 -aI-264 -aI498 -aI-276 -aa(lp60 -g15 -aI484 -aI-317 -aI494 -aI-297 -aI490 -aI-307 -aa(lp61 -g15 -aI459 -aI-348 -aI478 -aI-327 -aI469 -aI-338 -aa(lp62 -g15 -aI418 -aI-381 -aI448 -aI-358 -aI435 -aI-369 -aa(lp63 -g20 -aI363 -aI-125 -aa(lp64 -g15 -aI420 -aI-135 -aI384 -aI-125 -aI403 -aI-128 -aa(lp65 -g15 -aI462 -aI-161 -aI436 -aI-141 -aI451 -aI-150 -aa(lp66 -g15 -aI490 -aI-202 -aI474 -aI-172 -aI483 -aI-186 -aa(lp67 -g15 -aI500 -aI-252 -aI496 -aI-217 -aI500 -aI-234 -aa(lp68 -g10 -aa(lp69 -g8 -aI328 -aI-719 -aa(lp70 -g15 -aI344 -aI-655 -aI328 -aI-693 -aI333 -aI-672 -aa(lp71 -g15 -aI391 -aI-607 -aI354 -aI-638 -aI370 -aI-622 -aa(lp72 -g20 -aI441 -aI-839 -aa(lp73 -g15 -aI398 -aI-827 -aI426 -aI-837 -aI411 -aI-833 -aa(lp74 -g15 -aI361 -aI-805 -aI384 -aI-822 -aI372 -aI-814 -aa(lp75 -g15 -aI337 -aI-769 -aI351 -aI-795 -aI343 -aI-783 -aa(lp76 -g15 -aI328 -aI-719 -aI331 -aI-755 -aI328 -aI-738 -aa(lp77 -g10 -aa(lp78 -g8 -aI745 -aI0 -aa(lp79 -g10 -aa(lp80 -g8 -aI745 -aI0 -aasV( -(lp81 -(lp82 -g8 -aI261 -aI-185 -aa(lp83 -g15 -aI266 -aI-103 -aI261 -aI-157 -aI263 -aI-130 -aa(lp84 -g15 -aI286 -aI-24 -aI270 -aI-75 -aI277 -aI-49 -aa(lp85 -g15 -aI322 -aI45 -aI295 -aI0 -aI307 -aI23 -aa(lp86 -g15 -aI377 -aI100 -aI337 -aI66 -aI355 -aI85 -aa(lp87 -g20 -aI360 -aI186 -aa(lp88 -g15 -aI221 -aI113 -aI306 -aI167 -aI260 -aI143 -aa(lp89 -g15 -aI127 -aI13 -aI183 -aI84 -aI151 -aI50 -aa(lp90 -g15 -aI73 -aI-109 -aI102 -aI-24 -aI84 -aI-65 -aa(lp91 -g15 -aI55 -aI-247 -aI61 -aI-153 -aI55 -aI-199 -aa(lp92 -g15 -aI71 -aI-414 -aI55 -aI-302 -aI61 -aI-358 -aa(lp93 -g15 -aI117 -aI-577 -aI81 -aI-470 -aI96 -aI-524 -aa(lp94 -g15 -aI194 -aI-729 -aI137 -aI-630 -aI163 -aI-681 -aa(lp95 -g15 -aI302 -aI-860 -aI224 -aI-777 -aI260 -aI-821 -aa(lp96 -g15 -aI442 -aI-963 -aI343 -aI-900 -aI390 -aI-934 -aa(lp97 -g15 -aI614 -aI-1028 -aI494 -aI-992 -aI551 -aI-1014 -aa(lp98 -g20 -aI601 -aI-944 -aa(lp99 -g15 -aI512 -aI-881 -aI568 -aI-926 -aI538 -aI-905 -aa(lp100 -g15 -aI442 -aI-805 -aI485 -aI-857 -aI462 -aI-832 -aa(lp101 -g15 -aI388 -aI-721 -aI421 -aI-778 -aI403 -aI-750 -aa(lp102 -g15 -aI349 -aI-634 -aI373 -aI-692 -aI360 -aI-663 -aa(lp103 -g15 -aI321 -aI-551 -aI338 -aI-606 -aI328 -aI-578 -aa(lp104 -g15 -aI301 -aI-476 -aI313 -aI-524 -aI307 -aI-499 -aa(lp105 -g15 -aI268 -aI-304 -aI284 -aI-409 -aI274 -aI-352 -aa(lp106 -g15 -aI261 -aI-185 -aI263 -aI-256 -aI261 -aI-216 -aa(lp107 -g10 -aa(lp108 -g8 -aI533 -aI0 -aa(lp109 -g10 -aa(lp110 -g8 -aI533 -aI0 -aasV, -(lp111 -(lp112 -g8 -aI278 -aI-82 -aa(lp113 -g15 -aI260 -aI14 -aI278 -aI-48 -aI272 -aI-16 -aa(lp114 -g15 -aI204 -aI96 -aI247 -aI44 -aI229 -aI72 -aa(lp115 -g15 -aI112 -aI160 -aI180 -aI121 -aI149 -aI142 -aa(lp116 -g15 -aI-14 -aI201 -aI76 -aI178 -aI33 -aI192 -aa(lp117 -g20 -aI0 -aI131 -aa(lp118 -g15 -aI137 -aI20 -aI91 -aI109 -aI137 -aI72 -aa(lp119 -g15 -aI131 -aI-3 -aI137 -aI11 -aI135 -aI3 -aa(lp120 -g15 -aI117 -aI-21 -aI128 -aI-9 -aI123 -aI-15 -aa(lp121 -g15 -aI99 -aI-37 -aI112 -aI-26 -aI106 -aI-32 -aa(lp122 -g15 -aI82 -aI-55 -aI93 -aI-42 -aI87 -aI-48 -aa(lp123 -g15 -aI68 -aI-78 -aI76 -aI-61 -aI71 -aI-69 -aa(lp124 -g15 -aI62 -aI-111 -aI64 -aI-87 -aI62 -aI-98 -aa(lp125 -g15 -aI70 -aI-149 -aI62 -aI-125 -aI65 -aI-138 -aa(lp126 -g15 -aI92 -aI-178 -aI76 -aI-161 -aI83 -aI-170 -aa(lp127 -g15 -aI124 -aI-197 -aI101 -aI-186 -aI112 -aI-193 -aa(lp128 -g15 -aI162 -aI-203 -aI136 -aI-201 -aI149 -aI-203 -aa(lp129 -g15 -aI208 -aI-195 -aI178 -aI-203 -aI193 -aI-200 -aa(lp130 -g15 -aI244 -aI-171 -aI222 -aI-189 -aI234 -aI-181 -aa(lp131 -g15 -aI269 -aI-133 -aI255 -aI-161 -aI263 -aI-148 -aa(lp132 -g15 -aI278 -aI-82 -aI275 -aI-119 -aI278 -aI-101 -aa(lp133 -g10 -aa(lp134 -g8 -aI391 -aI0 -aa(lp135 -g10 -aa(lp136 -g8 -aI391 -aI0 -aasV0 -(lp137 -(lp138 -g8 -aI49 -aI-307 -aa(lp139 -g15 -aI60 -aI-452 -aI49 -aI-353 -aI53 -aI-401 -aa(lp140 -g15 -aI95 -aI-600 -aI68 -aI-502 -aI79 -aI-551 -aa(lp141 -g15 -aI153 -aI-740 -aI110 -aI-649 -aI130 -aI-696 -aa(lp142 -g15 -aI236 -aI-856 -aI177 -aI-784 -aI204 -aI-823 -aa(lp143 -g15 -aI345 -aI-936 -aI268 -aI-890 -aI304 -aI-916 -aa(lp144 -g15 -aI479 -aI-966 -aI385 -aI-956 -aI430 -aI-966 -aa(lp145 -g15 -aI586 -aI-948 -aI518 -aI-966 -aI553 -aI-960 -aa(lp146 -g15 -aI672 -aI-893 -aI619 -aI-936 -aI648 -aI-918 -aa(lp147 -g15 -aI730 -aI-798 -aI697 -aI-868 -aI716 -aI-836 -aa(lp148 -g15 -aI751 -aI-661 -aI744 -aI-759 -aI751 -aI-713 -aa(lp149 -g15 -aI740 -aI-517 -aI751 -aI-616 -aI748 -aI-568 -aa(lp150 -g15 -aI707 -aI-365 -aI733 -aI-466 -aI722 -aI-415 -aa(lp151 -g15 -aI650 -aI-221 -aI692 -aI-315 -aI673 -aI-267 -aa(lp152 -g15 -aI568 -aI-99 -aI627 -aI-175 -aI600 -aI-134 -aa(lp153 -g15 -aI460 -aI-15 -aI537 -aI-64 -aI501 -aI-36 -aa(lp154 -g15 -aI326 -aI15 -aI420 -aI5 -aI375 -aI15 -aa(lp155 -g15 -aI213 -aI-5 -aI285 -aI15 -aI247 -aI8 -aa(lp156 -g15 -aI126 -aI-67 -aI179 -aI-19 -aI150 -aI-39 -aa(lp157 -g15 -aI69 -aI-168 -aI101 -aI-94 -aI83 -aI-128 -aa(lp158 -g15 -aI49 -aI-307 -aI56 -aI-208 -aI49 -aI-254 -aa(lp159 -g10 -aa(lp160 -g8 -aI231 -aI-250 -aa(lp161 -g15 -aI259 -aI-118 -aI231 -aI-190 -aI241 -aI-146 -aa(lp162 -g15 -aI334 -aI-75 -aI278 -aI-89 -aI303 -aI-75 -aa(lp163 -g15 -aI406 -aI-106 -aI360 -aI-75 -aI384 -aI-86 -aa(lp164 -g15 -aI466 -aI-189 -aI429 -aI-127 -aI449 -aI-154 -aa(lp165 -g15 -aI513 -aI-306 -aI484 -aI-223 -aI500 -aI-262 -aa(lp166 -g15 -aI548 -aI-441 -aI527 -aI-350 -aI539 -aI-395 -aa(lp167 -g15 -aI569 -aI-580 -aI557 -aI-488 -aI564 -aI-534 -aa(lp168 -g15 -aI576 -aI-704 -aI573 -aI-625 -aI576 -aI-667 -aa(lp169 -g15 -aI549 -aI-834 -aI576 -aI-763 -aI567 -aI-806 -aa(lp170 -g15 -aI473 -aI-877 -aI531 -aI-863 -aI505 -aI-877 -aa(lp171 -g15 -aI402 -aI-846 -aI448 -aI-877 -aI424 -aI-866 -aa(lp172 -g15 -aI343 -aI-765 -aI381 -aI-826 -aI361 -aI-799 -aa(lp173 -g15 -aI296 -aI-648 -aI325 -aI-731 -aI310 -aI-692 -aa(lp174 -g15 -aI261 -aI-513 -aI282 -aI-604 -aI270 -aI-559 -aa(lp175 -g15 -aI239 -aI-375 -aI251 -aI-466 -aI244 -aI-420 -aa(lp176 -g15 -aI231 -aI-250 -aI234 -aI-329 -aI231 -aI-287 -aa(lp177 -g10 -aa(lp178 -g8 -aI745 -aI0 -aa(lp179 -g10 -aa(lp180 -g8 -aI745 -aI0 -aasV4 -(lp181 -(lp182 -g8 -aI438 -aI-568 -aa(lp183 -g15 -aI451 -aI-626 -aI442 -aI-586 -aI446 -aI-605 -aa(lp184 -g15 -aI466 -aI-692 -aI455 -aI-647 -aI461 -aI-669 -aa(lp185 -g15 -aI483 -aI-759 -aI471 -aI-714 -aI477 -aI-737 -aa(lp186 -g15 -aI502 -aI-825 -aI489 -aI-782 -aI496 -aI-804 -aa(lp187 -g15 -aI469 -aI-774 -aI493 -aI-809 -aI481 -aI-793 -aa(lp188 -g15 -aI430 -aI-719 -aI456 -aI-756 -aI443 -aI-738 -aa(lp189 -g15 -aI391 -aI-667 -aI417 -aI-701 -aI404 -aI-684 -aa(lp190 -g15 -aI358 -aI-625 -aI379 -aI-651 -aI368 -aI-636 -aa(lp191 -g20 -aI122 -aI-335 -aa(lp192 -g20 -aI389 -aI-335 -aa(lp193 -g10 -aa(lp194 -g8 -aI171 -aI0 -aa(lp195 -g20 -aI185 -aI-70 -aa(lp196 -g20 -aI223 -aI-70 -aa(lp197 -g15 -aI263 -aI-72 -aI236 -aI-70 -aI250 -aI-71 -aa(lp198 -g15 -aI301 -aI-84 -aI277 -aI-74 -aI289 -aI-78 -aa(lp199 -g15 -aI332 -aI-113 -aI313 -aI-90 -aI323 -aI-100 -aa(lp200 -g15 -aI353 -aI-166 -aI341 -aI-125 -aI348 -aI-143 -aa(lp201 -g20 -aI370 -aI-247 -aa(lp202 -g20 -aI0 -aI-247 -aa(lp203 -g20 -aI18 -aI-330 -aa(lp204 -g20 -aI529 -aI-951 -aa(lp205 -g20 -aI716 -aI-951 -aa(lp206 -g20 -aI583 -aI-335 -aa(lp207 -g20 -aI722 -aI-335 -aa(lp208 -g20 -aI703 -aI-247 -aa(lp209 -g20 -aI565 -aI-247 -aa(lp210 -g20 -aI548 -aI-164 -aa(lp211 -g15 -aI544 -aI-143 -aI546 -aI-159 -aI545 -aI-152 -aa(lp212 -g15 -aI542 -aI-123 -aI543 -aI-134 -aI542 -aI-127 -aa(lp213 -g15 -aI549 -aI-95 -aI542 -aI-111 -aI545 -aI-102 -aa(lp214 -g15 -aI566 -aI-79 -aI553 -aI-88 -aI559 -aI-83 -aa(lp215 -g15 -aI594 -aI-72 -aI574 -aI-76 -aI583 -aI-73 -aa(lp216 -g15 -aI630 -aI-70 -aI605 -aI-71 -aI617 -aI-70 -aa(lp217 -g20 -aI654 -aI-70 -aa(lp218 -g20 -aI639 -aI0 -aa(lp219 -g10 -aa(lp220 -g8 -aI745 -aI0 -aa(lp221 -g10 -aa(lp222 -g8 -aI745 -aI0 -aasV8 -(lp223 -(lp224 -g8 -aI329 -aI13 -aa(lp225 -g15 -aI201 -aI-3 -aI282 -aI13 -aI240 -aI7 -aa(lp226 -g15 -aI103 -aI-50 -aI163 -aI-14 -aI130 -aI-30 -aa(lp227 -g15 -aI40 -aI-123 -aI76 -aI-71 -aI55 -aI-95 -aa(lp228 -g15 -aI17 -aI-215 -aI25 -aI-151 -aI17 -aI-182 -aa(lp229 -g15 -aI37 -aI-312 -aI17 -aI-253 -aI24 -aI-285 -aa(lp230 -g15 -aI93 -aI-383 -aI51 -aI-338 -aI69 -aI-362 -aa(lp231 -g15 -aI176 -aI-437 -aI116 -aI-403 -aI144 -aI-421 -aa(lp232 -g15 -aI279 -aI-481 -aI208 -aI-452 -aI242 -aI-467 -aa(lp233 -g15 -aI227 -aI-529 -aI260 -aI-496 -aI243 -aI-512 -aa(lp234 -g15 -aI187 -aI-586 -aI212 -aI-547 -aI198 -aI-566 -aa(lp235 -g15 -aI161 -aI-649 -aI176 -aI-606 -aI167 -aI-627 -aa(lp236 -g15 -aI151 -aI-718 -aI154 -aI-671 -aI151 -aI-694 -aa(lp237 -g15 -aI170 -aI-813 -aI151 -aI-751 -aI157 -aI-783 -aa(lp238 -g15 -aI229 -aI-891 -aI182 -aI-843 -aI202 -aI-869 -aa(lp239 -g15 -aI334 -aI-945 -aI256 -aI-914 -aI291 -aI-931 -aa(lp240 -g15 -aI489 -aI-965 -aI377 -aI-958 -aI428 -aI-965 -aa(lp241 -g15 -aI602 -aI-950 -aI531 -aI-965 -aI569 -aI-960 -aa(lp242 -g15 -aI685 -aI-909 -aI635 -aI-940 -aI663 -aI-927 -aa(lp243 -g15 -aI737 -aI-847 -aI708 -aI-892 -aI726 -aI-871 -aa(lp244 -g15 -aI755 -aI-770 -aI749 -aI-823 -aI755 -aI-798 -aa(lp245 -g15 -aI739 -aI-680 -aI755 -aI-736 -aI750 -aI-706 -aa(lp246 -g15 -aI693 -aI-611 -aI728 -aI-655 -aI713 -aI-631 -aa(lp247 -g15 -aI622 -aI-556 -aI673 -aI-591 -aI650 -aI-572 -aa(lp248 -g15 -aI531 -aI-509 -aI595 -aI-540 -aI564 -aI-524 -aa(lp249 -g15 -aI596 -aI-462 -aI554 -aI-495 -aI576 -aI-479 -aa(lp250 -g15 -aI647 -aI-408 -aI615 -aI-446 -aI632 -aI-427 -aa(lp251 -g15 -aI680 -aI-343 -aI661 -aI-388 -aI672 -aI-366 -aa(lp252 -g15 -aI693 -aI-269 -aI689 -aI-320 -aI693 -aI-295 -aa(lp253 -g15 -aI666 -aI-142 -aI693 -aI-220 -aI684 -aI-178 -aa(lp254 -g15 -aI591 -aI-54 -aI648 -aI-107 -aI623 -aI-77 -aa(lp255 -g15 -aI476 -aI-3 -aI559 -aI-31 -aI520 -aI-14 -aa(lp256 -g15 -aI329 -aI13 -aI431 -aI7 -aI382 -aI13 -aa(lp257 -g10 -aa(lp258 -g8 -aI339 -aI-63 -aa(lp259 -g15 -aI406 -aI-73 -aI363 -aI-63 -aI385 -aI-66 -aa(lp260 -g15 -aI460 -aI-105 -aI427 -aI-80 -aI445 -aI-91 -aa(lp261 -g15 -aI498 -aI-157 -aI476 -aI-119 -aI488 -aI-136 -aa(lp262 -g15 -aI511 -aI-231 -aI507 -aI-178 -aI511 -aI-203 -aa(lp263 -g15 -aI501 -aI-291 -aI511 -aI-253 -aI508 -aI-272 -aa(lp264 -g15 -aI473 -aI-342 -aI495 -aI-309 -aI485 -aI-326 -aa(lp265 -g15 -aI426 -aI-389 -aI460 -aI-359 -aI444 -aI-374 -aa(lp266 -g15 -aI360 -aI-431 -aI407 -aI-403 -aI385 -aI-417 -aa(lp267 -g15 -aI240 -aI-346 -aI309 -aI-411 -aI269 -aI-382 -aa(lp268 -g15 -aI197 -aI-210 -aI211 -aI-310 -aI197 -aI-265 -aa(lp269 -g15 -aI235 -aI-102 -aI197 -aI-164 -aI209 -aI-128 -aa(lp270 -g15 -aI339 -aI-63 -aI260 -aI-76 -aI295 -aI-63 -aa(lp271 -g10 -aa(lp272 -g8 -aI587 -aI-760 -aa(lp273 -g15 -aI581 -aI-811 -aI587 -aI-778 -aI585 -aI-795 -aa(lp274 -g15 -aI562 -aI-851 -aI577 -aI-826 -aI571 -aI-839 -aa(lp275 -g15 -aI529 -aI-877 -aI553 -aI-862 -aI542 -aI-871 -aa(lp276 -g15 -aI482 -aI-887 -aI516 -aI-884 -aI500 -aI-887 -aa(lp277 -g15 -aI424 -aI-876 -aI461 -aI-887 -aI442 -aI-883 -aa(lp278 -g15 -aI378 -aI-843 -aI406 -aI-868 -aI391 -aI-857 -aa(lp279 -g15 -aI347 -aI-792 -aI365 -aI-829 -aI354 -aI-812 -aa(lp280 -g15 -aI335 -aI-724 -aI339 -aI-772 -aI335 -aI-749 -aa(lp281 -g15 -aI449 -aI-551 -aI335 -aI-655 -aI373 -aI-597 -aa(lp282 -g15 -aI514 -aI-594 -aI474 -aI-565 -aI496 -aI-579 -aa(lp283 -g15 -aI557 -aI-644 -aI532 -aI-610 -aI546 -aI-626 -aa(lp284 -g15 -aI580 -aI-699 -aI568 -aI-661 -aI575 -aI-679 -aa(lp285 -g15 -aI587 -aI-760 -aI585 -aI-718 -aI587 -aI-739 -aa(lp286 -g10 -aa(lp287 -g8 -aI745 -aI0 -aa(lp288 -g10 -aa(lp289 -g8 -aI745 -aI0 -aasV< -(lp290 -(lp291 -g8 -aI108 -aI-448 -aa(lp292 -g20 -aI108 -aI-503 -aa(lp293 -g20 -aI679 -aI-815 -aa(lp294 -g20 -aI679 -aI-710 -aa(lp295 -g20 -aI250 -aI-475 -aa(lp296 -g20 -aI679 -aI-243 -aa(lp297 -g20 -aI679 -aI-138 -aa(lp298 -g10 -aa(lp299 -g8 -aI745 -aI0 -aa(lp300 -g10 -aa(lp301 -g8 -aI745 -aI0 -aasV@ -(lp302 -(lp303 -g8 -aI1165 -aI-522 -aa(lp304 -g15 -aI1141 -aI-344 -aI1165 -aI-455 -aI1157 -aI-396 -aa(lp305 -g15 -aI1078 -aI-212 -aI1125 -aI-292 -aI1104 -aI-248 -aa(lp306 -g15 -aI989 -aI-130 -aI1052 -aI-176 -aI1022 -aI-149 -aa(lp307 -g15 -aI890 -aI-102 -aI957 -aI-111 -aI924 -aI-102 -aa(lp308 -g15 -aI790 -aI-131 -aI851 -aI-102 -aI817 -aI-112 -aa(lp309 -g15 -aI726 -aI-227 -aI762 -aI-150 -aI741 -aI-182 -aa(lp310 -g20 -aI718 -aI-227 -aa(lp311 -g15 -aI687 -aI-178 -aI709 -aI-210 -aI699 -aI-193 -aa(lp312 -g15 -aI647 -aI-138 -aI675 -aI-163 -aI662 -aI-150 -aa(lp313 -g15 -aI597 -aI-112 -aI633 -aI-127 -aI616 -aI-118 -aa(lp314 -g15 -aI534 -aI-102 -aI578 -aI-105 -aI557 -aI-102 -aa(lp315 -g15 -aI454 -aI-116 -aI506 -aI-102 -aI479 -aI-106 -aa(lp316 -g15 -aI388 -aI-157 -aI429 -aI-125 -aI407 -aI-139 -aa(lp317 -g15 -aI342 -aI-228 -aI368 -aI-176 -aI353 -aI-200 -aa(lp318 -g15 -aI325 -aI-330 -aI331 -aI-257 -aI325 -aI-291 -aa(lp319 -g15 -aI333 -aI-407 -aI325 -aI-354 -aI328 -aI-379 -aa(lp320 -g15 -aI360 -aI-490 -aI339 -aI-435 -aI348 -aI-463 -aa(lp321 -g15 -aI407 -aI-570 -aI372 -aI-518 -aI388 -aI-545 -aa(lp322 -g15 -aI475 -aI-639 -aI426 -aI-596 -aI449 -aI-619 -aa(lp323 -g15 -aI567 -aI-686 -aI502 -aI-658 -aI532 -aI-674 -aa(lp324 -g15 -aI684 -aI-704 -aI601 -aI-698 -aI640 -aI-704 -aa(lp325 -g15 -aI763 -aI-692 -aI715 -aI-704 -aI741 -aI-700 -aa(lp326 -g15 -aI817 -aI-664 -aI785 -aI-685 -aI803 -aI-675 -aa(lp327 -g20 -aI873 -aI-692 -aa(lp328 -g20 -aI905 -aI-692 -aa(lp329 -g20 -aI849 -aI-359 -aa(lp330 -g15 -aI846 -aI-339 -aI848 -aI-354 -aI847 -aI-347 -aa(lp331 -g15 -aI843 -aI-314 -aI844 -aI-331 -aI843 -aI-322 -aa(lp332 -g15 -aI840 -aI-288 -aI842 -aI-305 -aI841 -aI-296 -aa(lp333 -g15 -aI839 -aI-269 -aI840 -aI-280 -aI839 -aI-274 -aa(lp334 -g15 -aI845 -aI-224 -aI839 -aI-250 -aI841 -aI-235 -aa(lp335 -g15 -aI860 -aI-196 -aI849 -aI-212 -aI854 -aI-203 -aa(lp336 -g15 -aI881 -aI-182 -aI866 -aI-189 -aI873 -aI-185 -aa(lp337 -g15 -aI904 -aI-179 -aI889 -aI-180 -aI896 -aI-179 -aa(lp338 -g15 -aI957 -aI-201 -aI921 -aI-179 -aI939 -aI-186 -aa(lp339 -g15 -aI1007 -aI-266 -aI975 -aI-216 -aI992 -aI-237 -aa(lp340 -g15 -aI1043 -aI-371 -aI1021 -aI-294 -aI1033 -aI-329 -aa(lp341 -g15 -aI1057 -aI-517 -aI1052 -aI-414 -aI1057 -aI-462 -aa(lp342 -g15 -aI1029 -aI-676 -aI1057 -aI-577 -aI1048 -aI-631 -aa(lp343 -g15 -aI952 -aI-791 -aI1011 -aI-722 -aI985 -aI-760 -aa(lp344 -g15 -aI834 -aI-860 -aI919 -aI-822 -aI880 -aI-845 -aa(lp345 -g15 -aI686 -aI-883 -aI789 -aI-875 -aI740 -aI-883 -aa(lp346 -g15 -aI562 -aI-866 -aI644 -aI-883 -aI603 -aI-877 -aa(lp347 -g15 -aI444 -aI-814 -aI521 -aI-854 -aI482 -aI-837 -aa(lp348 -g15 -aI342 -aI-731 -aI407 -aI-792 -aI373 -aI-764 -aa(lp349 -g15 -aI261 -aI-619 -aI311 -aI-698 -aI284 -aI-661 -aa(lp350 -g15 -aI207 -aI-480 -aI238 -aI-577 -aI220 -aI-531 -aa(lp351 -g15 -aI188 -aI-316 -aI194 -aI-429 -aI188 -aI-375 -aa(lp352 -g15 -aI223 -aI-115 -aI188 -aI-238 -aI199 -aI-170 -aa(lp353 -g15 -aI318 -aI20 -aI246 -aI-59 -aI278 -aI-14 -aa(lp354 -g15 -aI459 -aI97 -aI358 -aI55 -aI405 -aI81 -aa(lp355 -g15 -aI629 -aI121 -aI512 -aI113 -aI569 -aI121 -aa(lp356 -g15 -aI735 -aI111 -aI665 -aI121 -aI700 -aI118 -aa(lp357 -g15 -aI832 -aI86 -aI769 -aI105 -aI801 -aI96 -aa(lp358 -g15 -aI918 -aI50 -aI863 -aI75 -aI892 -aI64 -aa(lp359 -g15 -aI989 -aI9 -aI945 -aI37 -aI968 -aI23 -aa(lp360 -g20 -aI1021 -aI60 -aa(lp361 -g15 -aI941 -aI110 -aI998 -aI78 -aI971 -aI94 -aa(lp362 -g15 -aI844 -aI151 -aI911 -aI126 -aI879 -aI139 -aa(lp363 -g15 -aI733 -aI179 -aI809 -aI163 -aI772 -aI172 -aa(lp364 -g15 -aI610 -aI189 -aI693 -aI186 -aI652 -aI189 -aa(lp365 -g15 -aI464 -aI175 -aI559 -aI189 -aI511 -aI185 -aa(lp366 -g15 -aI332 -aI133 -aI417 -aI166 -aI373 -aI152 -aa(lp367 -g15 -aI220 -aI61 -aI291 -aI114 -aI253 -aI90 -aa(lp368 -g15 -aI133 -aI-37 -aI186 -aI33 -aI157 -aI0 -aa(lp369 -g15 -aI77 -aI-166 -aI109 -aI-76 -aI90 -aI-119 -aa(lp370 -g15 -aI57 -aI-325 -aI63 -aI-214 -aI57 -aI-267 -aa(lp371 -g15 -aI79 -aI-495 -aI57 -aI-384 -aI64 -aI-441 -aa(lp372 -g15 -aI140 -aI-646 -aI93 -aI-549 -aI114 -aI-600 -aa(lp373 -g15 -aI238 -aI-772 -aI167 -aI-692 -aI200 -aI-734 -aa(lp374 -g15 -aI366 -aI-868 -aI276 -aI-809 -aI319 -aI-841 -aa(lp375 -g15 -aI520 -aI-929 -aI413 -aI-895 -aI465 -aI-915 -aa(lp376 -g15 -aI695 -aI-951 -aI575 -aI-944 -aI634 -aI-951 -aa(lp377 -g15 -aI899 -aI-918 -aI772 -aI-951 -aI840 -aI-940 -aa(lp378 -g15 -aI1046 -aI-827 -aI957 -aI-896 -aI1006 -aI-865 -aa(lp379 -g15 -aI1135 -aI-691 -aI1085 -aI-788 -aI1115 -aI-743 -aa(lp380 -g15 -aI1165 -aI-522 -aI1155 -aI-638 -aI1165 -aI-582 -aa(lp381 -g10 -aa(lp382 -g8 -aI489 -aI-316 -aa(lp383 -g15 -aI513 -aI-214 -aI489 -aI-272 -aI497 -aI-238 -aa(lp384 -g15 -aI574 -aI-179 -aI528 -aI-191 -aI549 -aI-179 -aa(lp385 -g15 -aI623 -aI-192 -aI593 -aI-179 -aI609 -aI-183 -aa(lp386 -g15 -aI658 -aI-229 -aI637 -aI-202 -aI648 -aI-214 -aa(lp387 -g15 -aI681 -aI-279 -aI667 -aI-244 -aI675 -aI-260 -aa(lp388 -g15 -aI695 -aI-336 -aI687 -aI-298 -aI692 -aI-317 -aa(lp389 -g20 -aI749 -aI-608 -aa(lp390 -g15 -aI737 -aI-624 -aI746 -aI-614 -aI742 -aI-620 -aa(lp391 -g15 -aI720 -aI-636 -aI732 -aI-629 -aI727 -aI-633 -aa(lp392 -g15 -aI699 -aI-643 -aI714 -aI-639 -aI707 -aI-642 -aa(lp393 -g15 -aI678 -aI-646 -aI692 -aI-645 -aI685 -aI-646 -aa(lp394 -g15 -aI617 -aI-629 -aI655 -aI-646 -aI635 -aI-640 -aa(lp395 -g15 -aI569 -aI-584 -aI599 -aI-617 -aI583 -aI-602 -aa(lp396 -g15 -aI533 -aI-521 -aI555 -aI-566 -aI543 -aI-545 -aa(lp397 -g15 -aI508 -aI-449 -aI523 -aI-497 -aI514 -aI-473 -aa(lp398 -g15 -aI494 -aI-378 -aI501 -aI-425 -aI497 -aI-401 -aa(lp399 -g15 -aI489 -aI-316 -aI491 -aI-354 -aI489 -aI-334 -aa(lp400 -g10 -aa(lp401 -g8 -aI1227 -aI0 -aa(lp402 -g10 -aa(lp403 -g8 -aI1227 -aI0 -aasVD -(lp404 -(lp405 -g8 -aI-17 -aI-70 -aa(lp406 -g20 -aI1 -aI-70 -aa(lp407 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp408 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp409 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp410 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp411 -g20 -aI262 -aI-804 -aa(lp412 -g15 -aI266 -aI-821 -aI264 -aI-809 -aI265 -aI-815 -aa(lp413 -g15 -aI268 -aI-835 -aI267 -aI-827 -aI268 -aI-832 -aa(lp414 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp415 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp416 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp417 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp418 -g20 -aI154 -aI-881 -aa(lp419 -g20 -aI169 -aI-951 -aa(lp420 -g20 -aI595 -aI-951 -aa(lp421 -g15 -aI766 -aI-927 -aI659 -aI-951 -aI716 -aI-943 -aa(lp422 -g15 -aI893 -aI-858 -aI816 -aI-912 -aI859 -aI-889 -aa(lp423 -g15 -aI972 -aI-744 -aI928 -aI-827 -aI954 -aI-790 -aa(lp424 -g15 -aI1000 -aI-588 -aI990 -aI-699 -aI1000 -aI-647 -aa(lp425 -g15 -aI983 -aI-434 -aI1000 -aI-535 -aI994 -aI-484 -aa(lp426 -g15 -aI934 -aI-294 -aI972 -aI-385 -aI956 -aI-338 -aa(lp427 -g15 -aI854 -aI-175 -aI913 -aI-251 -aI886 -aI-211 -aa(lp428 -g15 -aI744 -aI-81 -aI823 -aI-138 -aI786 -aI-107 -aa(lp429 -g15 -aI605 -aI-21 -aI703 -aI-55 -aI656 -aI-35 -aa(lp430 -g15 -aI437 -aI0 -aI553 -aI-6 -aI497 -aI0 -aa(lp431 -g20 -aI-31 -aI0 -aa(lp432 -g10 -aa(lp433 -g8 -aI380 -aI-82 -aa(lp434 -g15 -aI547 -aI-120 -aI442 -aI-82 -aI498 -aI-94 -aa(lp435 -g15 -aI671 -aI-227 -aI596 -aI-145 -aI638 -aI-181 -aa(lp436 -g15 -aI749 -aI-390 -aI705 -aI-272 -aI731 -aI-327 -aa(lp437 -g15 -aI776 -aI-599 -aI767 -aI-454 -aI776 -aI-523 -aa(lp438 -g15 -aI759 -aI-720 -aI776 -aI-646 -aI770 -aI-686 -aa(lp439 -g15 -aI713 -aI-804 -aI748 -aI-754 -aI733 -aI-782 -aa(lp440 -g15 -aI639 -aI-854 -aI693 -aI-827 -aI668 -aI-843 -aa(lp441 -g15 -aI542 -aI-869 -aI610 -aI-864 -aI578 -aI-869 -aa(lp442 -g20 -aI486 -aI-869 -aa(lp443 -g20 -aI320 -aI-82 -aa(lp444 -g10 -aa(lp445 -g8 -aI1024 -aI0 -aa(lp446 -g10 -aa(lp447 -g8 -aI1024 -aI0 -aasVH -(lp448 -(lp449 -g8 -aI525 -aI0 -aa(lp450 -g20 -aI539 -aI-70 -aa(lp451 -g20 -aI557 -aI-70 -aa(lp452 -g15 -aI598 -aI-73 -aI571 -aI-70 -aI585 -aI-71 -aa(lp453 -g15 -aI636 -aI-84 -aI612 -aI-74 -aI624 -aI-78 -aa(lp454 -g15 -aI665 -aI-108 -aI647 -aI-90 -aI657 -aI-98 -aa(lp455 -g15 -aI682 -aI-151 -aI673 -aI-119 -aI679 -aI-133 -aa(lp456 -g20 -aI746 -aI-455 -aa(lp457 -g20 -aI398 -aI-455 -aa(lp458 -g20 -aI333 -aI-146 -aa(lp459 -g15 -aI329 -aI-129 -aI332 -aI-141 -aI330 -aI-135 -aa(lp460 -g15 -aI328 -aI-115 -aI328 -aI-123 -aI328 -aI-118 -aa(lp461 -g15 -aI335 -aI-92 -aI328 -aI-105 -aI330 -aI-98 -aa(lp462 -g15 -aI355 -aI-78 -aI340 -aI-86 -aI346 -aI-81 -aa(lp463 -g15 -aI386 -aI-72 -aI364 -aI-75 -aI374 -aI-73 -aa(lp464 -g15 -aI425 -aI-70 -aI398 -aI-71 -aI411 -aI-70 -aa(lp465 -g20 -aI442 -aI-70 -aa(lp466 -g20 -aI427 -aI0 -aa(lp467 -g20 -aI-30 -aI0 -aa(lp468 -g20 -aI-16 -aI-70 -aa(lp469 -g20 -aI1 -aI-70 -aa(lp470 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp471 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp472 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp473 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp474 -g20 -aI259 -aI-789 -aa(lp475 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp476 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp477 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp478 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp479 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp480 -g20 -aI154 -aI-881 -aa(lp481 -g20 -aI169 -aI-951 -aa(lp482 -g20 -aI629 -aI-951 -aa(lp483 -g20 -aI614 -aI-881 -aa(lp484 -g20 -aI597 -aI-881 -aa(lp485 -g15 -aI555 -aI-878 -aI582 -aI-881 -aI568 -aI-880 -aa(lp486 -g15 -aI517 -aI-866 -aI541 -aI-876 -aI528 -aI-872 -aa(lp487 -g15 -aI488 -aI-841 -aI506 -aI-861 -aI496 -aI-852 -aa(lp488 -g15 -aI470 -aI-799 -aI480 -aI-831 -aI474 -aI-817 -aa(lp489 -g20 -aI416 -aI-536 -aa(lp490 -g20 -aI764 -aI-536 -aa(lp491 -g20 -aI820 -aI-795 -aa(lp492 -g15 -aI825 -aI-819 -aI822 -aI-804 -aI824 -aI-812 -aa(lp493 -g15 -aI826 -aI-835 -aI826 -aI-826 -aI826 -aI-832 -aa(lp494 -g15 -aI819 -aI-858 -aI826 -aI-845 -aI824 -aI-852 -aa(lp495 -g15 -aI798 -aI-872 -aI814 -aI-864 -aI807 -aI-869 -aa(lp496 -g15 -aI767 -aI-879 -aI790 -aI-876 -aI779 -aI-878 -aa(lp497 -g15 -aI729 -aI-881 -aI755 -aI-880 -aI743 -aI-881 -aa(lp498 -g20 -aI712 -aI-881 -aa(lp499 -g20 -aI726 -aI-951 -aa(lp500 -g20 -aI1186 -aI-951 -aa(lp501 -g20 -aI1171 -aI-881 -aa(lp502 -g20 -aI1154 -aI-881 -aa(lp503 -g15 -aI1113 -aI-878 -aI1140 -aI-881 -aI1126 -aI-880 -aa(lp504 -g15 -aI1076 -aI-866 -aI1099 -aI-876 -aI1087 -aI-872 -aa(lp505 -g15 -aI1047 -aI-841 -aI1064 -aI-861 -aI1055 -aI-852 -aa(lp506 -g15 -aI1029 -aI-799 -aI1039 -aI-831 -aI1033 -aI-817 -aa(lp507 -g20 -aI891 -aI-146 -aa(lp508 -g15 -aI888 -aI-129 -aI890 -aI-141 -aI889 -aI-135 -aa(lp509 -g15 -aI886 -aI-115 -aI887 -aI-123 -aI886 -aI-118 -aa(lp510 -g15 -aI893 -aI-92 -aI886 -aI-105 -aI889 -aI-98 -aa(lp511 -g15 -aI913 -aI-78 -aI898 -aI-86 -aI905 -aI-81 -aa(lp512 -g15 -aI944 -aI-72 -aI922 -aI-75 -aI932 -aI-73 -aa(lp513 -g15 -aI982 -aI-70 -aI955 -aI-71 -aI968 -aI-70 -aa(lp514 -g20 -aI1000 -aI-70 -aa(lp515 -g20 -aI985 -aI0 -aa(lp516 -g10 -aa(lp517 -g8 -aI1091 -aI0 -aa(lp518 -g10 -aa(lp519 -g8 -aI1091 -aI0 -aasVL -(lp520 -(lp521 -g8 -aI542 -aI-80 -aa(lp522 -g15 -aI606 -aI-90 -aI567 -aI-80 -aI588 -aI-83 -aa(lp523 -g15 -aI652 -aI-117 -aI623 -aI-96 -aI639 -aI-105 -aa(lp524 -g15 -aI687 -aI-162 -aI665 -aI-128 -aI677 -aI-144 -aa(lp525 -g15 -aI714 -aI-226 -aI697 -aI-180 -aI706 -aI-201 -aa(lp526 -g20 -aI738 -aI-297 -aa(lp527 -g20 -aI824 -aI-297 -aa(lp528 -g20 -aI750 -aI0 -aa(lp529 -g20 -aI-30 -aI0 -aa(lp530 -g20 -aI-16 -aI-70 -aa(lp531 -g20 -aI1 -aI-70 -aa(lp532 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp533 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp534 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp535 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp536 -g20 -aI259 -aI-789 -aa(lp537 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp538 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp539 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp540 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp541 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp542 -g20 -aI154 -aI-881 -aa(lp543 -g20 -aI169 -aI-951 -aa(lp544 -g20 -aI629 -aI-951 -aa(lp545 -g20 -aI614 -aI-881 -aa(lp546 -g20 -aI597 -aI-881 -aa(lp547 -g15 -aI555 -aI-878 -aI582 -aI-881 -aI568 -aI-880 -aa(lp548 -g15 -aI517 -aI-866 -aI541 -aI-876 -aI528 -aI-872 -aa(lp549 -g15 -aI488 -aI-841 -aI506 -aI-861 -aI496 -aI-852 -aa(lp550 -g15 -aI470 -aI-799 -aI480 -aI-831 -aI474 -aI-817 -aa(lp551 -g20 -aI320 -aI-80 -aa(lp552 -g10 -aa(lp553 -g8 -aI871 -aI0 -aa(lp554 -g10 -aa(lp555 -g8 -aI871 -aI0 -aasVP -(lp556 -(lp557 -g8 -aI397 -aI-440 -aa(lp558 -g20 -aI453 -aI-440 -aa(lp559 -g15 -aI555 -aI-459 -aI493 -aI-440 -aI527 -aI-447 -aa(lp560 -g15 -aI623 -aI-510 -aI583 -aI-471 -aI606 -aI-488 -aa(lp561 -g15 -aI661 -aI-588 -aI641 -aI-532 -aI653 -aI-558 -aa(lp562 -g15 -aI673 -aI-687 -aI669 -aI-618 -aI673 -aI-651 -aa(lp563 -g15 -aI661 -aI-772 -aI673 -aI-721 -aI669 -aI-749 -aa(lp564 -g15 -aI630 -aI-830 -aI654 -aI-796 -aI643 -aI-815 -aa(lp565 -g15 -aI581 -aI-862 -aI616 -aI-845 -aI600 -aI-855 -aa(lp566 -g15 -aI520 -aI-872 -aI562 -aI-869 -aI542 -aI-872 -aa(lp567 -g20 -aI490 -aI-872 -aa(lp568 -g10 -aa(lp569 -g8 -aI333 -aI-146 -aa(lp570 -g15 -aI329 -aI-129 -aI332 -aI-141 -aI330 -aI-135 -aa(lp571 -g15 -aI328 -aI-115 -aI328 -aI-123 -aI328 -aI-118 -aa(lp572 -g15 -aI335 -aI-92 -aI328 -aI-105 -aI330 -aI-98 -aa(lp573 -g15 -aI355 -aI-78 -aI340 -aI-86 -aI346 -aI-81 -aa(lp574 -g15 -aI386 -aI-72 -aI364 -aI-75 -aI374 -aI-73 -aa(lp575 -g15 -aI425 -aI-70 -aI398 -aI-71 -aI411 -aI-70 -aa(lp576 -g20 -aI469 -aI-70 -aa(lp577 -g20 -aI454 -aI0 -aa(lp578 -g20 -aI-30 -aI0 -aa(lp579 -g20 -aI-16 -aI-70 -aa(lp580 -g20 -aI1 -aI-70 -aa(lp581 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp582 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp583 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp584 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp585 -g20 -aI259 -aI-789 -aa(lp586 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp587 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp588 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp589 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp590 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp591 -g20 -aI154 -aI-881 -aa(lp592 -g20 -aI169 -aI-951 -aa(lp593 -g20 -aI550 -aI-951 -aa(lp594 -g15 -aI692 -aI-934 -aI602 -aI-951 -aI649 -aI-945 -aa(lp595 -g15 -aI799 -aI-885 -aI734 -aI-923 -aI769 -aI-907 -aa(lp596 -g15 -aI866 -aI-803 -aI828 -aI-863 -aI851 -aI-836 -aa(lp597 -g15 -aI890 -aI-691 -aI882 -aI-771 -aI890 -aI-734 -aa(lp598 -g15 -aI884 -aI-619 -aI890 -aI-669 -aI888 -aI-645 -aa(lp599 -g15 -aI861 -aI-545 -aI879 -aI-594 -aI872 -aI-570 -aa(lp600 -g15 -aI815 -aI-476 -aI849 -aI-521 -aI834 -aI-498 -aa(lp601 -g15 -aI740 -aI-418 -aI795 -aI-454 -aI770 -aI-435 -aa(lp602 -g15 -aI631 -aI-378 -aI710 -aI-401 -aI674 -aI-388 -aa(lp603 -g15 -aI482 -aI-363 -aI589 -aI-368 -aI539 -aI-363 -aa(lp604 -g20 -aI381 -aI-363 -aa(lp605 -g10 -aa(lp606 -g8 -aI884 -aI0 -aa(lp607 -g10 -aa(lp608 -g8 -aI884 -aI0 -aasVT -(lp609 -(lp610 -g8 -aI138 -aI0 -aa(lp611 -g20 -aI153 -aI-70 -aa(lp612 -g20 -aI170 -aI-70 -aa(lp613 -g15 -aI211 -aI-73 -aI184 -aI-70 -aI198 -aI-71 -aa(lp614 -g15 -aI247 -aI-84 -aI224 -aI-74 -aI236 -aI-78 -aa(lp615 -g15 -aI275 -aI-108 -aI258 -aI-89 -aI267 -aI-97 -aa(lp616 -g15 -aI293 -aI-149 -aI283 -aI-118 -aI289 -aI-132 -aa(lp617 -g20 -aI444 -aI-869 -aa(lp618 -g20 -aI337 -aI-869 -aa(lp619 -g15 -aI284 -aI-862 -aI316 -aI-869 -aI298 -aI-867 -aa(lp620 -g15 -aI246 -aI-839 -aI269 -aI-856 -aI257 -aI-849 -aa(lp621 -g15 -aI219 -aI-801 -aI235 -aI-828 -aI226 -aI-816 -aa(lp622 -g15 -aI198 -aI-750 -aI212 -aI-786 -aI205 -aI-769 -aa(lp623 -g20 -aI179 -aI-692 -aa(lp624 -g20 -aI90 -aI-692 -aa(lp625 -g20 -aI151 -aI-951 -aa(lp626 -g20 -aI981 -aI-951 -aa(lp627 -g20 -aI934 -aI-692 -aa(lp628 -g20 -aI845 -aI-692 -aa(lp629 -g15 -aI847 -aI-713 -aI845 -aI-695 -aI846 -aI-702 -aa(lp630 -g15 -aI850 -aI-747 -aI848 -aI-724 -aI849 -aI-735 -aa(lp631 -g15 -aI854 -aI-781 -aI852 -aI-759 -aI853 -aI-770 -aa(lp632 -g15 -aI856 -aI-799 -aI855 -aI-791 -aI856 -aI-797 -aa(lp633 -g15 -aI834 -aI-852 -aI856 -aI-823 -aI849 -aI-840 -aa(lp634 -g15 -aI762 -aI-869 -aI820 -aI-864 -aI796 -aI-869 -aa(lp635 -g20 -aI656 -aI-869 -aa(lp636 -g20 -aI502 -aI-146 -aa(lp637 -g15 -aI499 -aI-129 -aI501 -aI-141 -aI500 -aI-135 -aa(lp638 -g15 -aI497 -aI-115 -aI498 -aI-123 -aI497 -aI-118 -aa(lp639 -g15 -aI504 -aI-92 -aI497 -aI-105 -aI499 -aI-98 -aa(lp640 -g15 -aI524 -aI-78 -aI509 -aI-86 -aI516 -aI-81 -aa(lp641 -g15 -aI555 -aI-72 -aI533 -aI-75 -aI543 -aI-73 -aa(lp642 -g15 -aI594 -aI-70 -aI567 -aI-71 -aI580 -aI-70 -aa(lp643 -g20 -aI611 -aI-70 -aa(lp644 -g20 -aI597 -aI0 -aa(lp645 -g10 -aa(lp646 -g8 -aI870 -aI0 -aa(lp647 -g10 -aa(lp648 -g8 -aI870 -aI0 -aasVX -(lp649 -(lp650 -g8 -aI1048 -aI-881 -aa(lp651 -g20 -aI1035 -aI-881 -aa(lp652 -g15 -aI1000 -aI-876 -aI1022 -aI-881 -aI1010 -aI-879 -aa(lp653 -g15 -aI966 -aI-860 -aI989 -aI-873 -aI977 -aI-868 -aa(lp654 -g15 -aI930 -aI-831 -aI954 -aI-853 -aI942 -aI-843 -aa(lp655 -g15 -aI885 -aI-786 -aI917 -aI-819 -aI902 -aI-804 -aa(lp656 -g20 -aI634 -aI-522 -aa(lp657 -g20 -aI798 -aI-140 -aa(lp658 -g15 -aI841 -aI-85 -aI810 -aI-113 -aI825 -aI-94 -aa(lp659 -g15 -aI890 -aI-70 -aI857 -aI-75 -aI874 -aI-70 -aa(lp660 -g20 -aI908 -aI-70 -aa(lp661 -g20 -aI893 -aI0 -aa(lp662 -g20 -aI453 -aI0 -aa(lp663 -g20 -aI468 -aI-70 -aa(lp664 -g20 -aI488 -aI-70 -aa(lp665 -g15 -aI545 -aI-82 -aI514 -aI-70 -aI533 -aI-74 -aa(lp666 -g15 -aI563 -aI-116 -aI557 -aI-90 -aI563 -aI-101 -aa(lp667 -g15 -aI557 -aI-158 -aI563 -aI-129 -aI561 -aI-143 -aa(lp668 -g15 -aI538 -aI-209 -aI552 -aI-174 -aI546 -aI-190 -aa(lp669 -g20 -aI457 -aI-392 -aa(lp670 -g20 -aI270 -aI-199 -aa(lp671 -g15 -aI232 -aI-151 -aI254 -aI-182 -aI241 -aI-167 -aa(lp672 -g15 -aI217 -aI-110 -aI222 -aI-136 -aI217 -aI-122 -aa(lp673 -g15 -aI220 -aI-93 -aI217 -aI-103 -aI218 -aI-98 -aa(lp674 -g15 -aI232 -aI-80 -aI222 -aI-88 -aI226 -aI-84 -aa(lp675 -g15 -aI254 -aI-73 -aI237 -aI-77 -aI244 -aI-74 -aa(lp676 -g15 -aI290 -aI-70 -aI263 -aI-71 -aI275 -aI-70 -aa(lp677 -g20 -aI294 -aI-70 -aa(lp678 -g20 -aI279 -aI0 -aa(lp679 -g20 -aI-55 -aI0 -aa(lp680 -g20 -aI-41 -aI-70 -aa(lp681 -g20 -aI-27 -aI-70 -aa(lp682 -g15 -aI9 -aI-75 -aI-14 -aI-70 -aI-2 -aI-72 -aa(lp683 -g15 -aI44 -aI-91 -aI20 -aI-78 -aI32 -aI-83 -aa(lp684 -g15 -aI83 -aI-120 -aI56 -aI-98 -aI69 -aI-108 -aa(lp685 -g15 -aI129 -aI-166 -aI96 -aI-132 -aI112 -aI-147 -aa(lp686 -g20 -aI423 -aI-470 -aa(lp687 -g20 -aI274 -aI-812 -aa(lp688 -g15 -aI254 -aI-848 -aI268 -aI-827 -aI261 -aI-839 -aa(lp689 -g15 -aI232 -aI-869 -aI248 -aI-857 -aI240 -aI-864 -aa(lp690 -g15 -aI204 -aI-878 -aI224 -aI-874 -aI214 -aI-877 -aa(lp691 -g15 -aI170 -aI-881 -aI194 -aI-880 -aI183 -aI-881 -aa(lp692 -g20 -aI158 -aI-881 -aa(lp693 -g20 -aI173 -aI-951 -aa(lp694 -g20 -aI614 -aI-951 -aa(lp695 -g20 -aI600 -aI-881 -aa(lp696 -g20 -aI569 -aI-881 -aa(lp697 -g15 -aI521 -aI-871 -aI546 -aI-881 -aI530 -aI-877 -aa(lp698 -g15 -aI506 -aI-843 -aI511 -aI-864 -aI506 -aI-855 -aa(lp699 -g15 -aI512 -aI-811 -aI506 -aI-834 -aI508 -aI-823 -aa(lp700 -g15 -aI530 -aI-763 -aI516 -aI-798 -aI522 -aI-782 -aa(lp701 -g20 -aI601 -aI-598 -aa(lp702 -g20 -aI758 -aI-766 -aa(lp703 -g15 -aI791 -aI-807 -aI770 -aI-779 -aI781 -aI-792 -aa(lp704 -g15 -aI805 -aI-847 -aI800 -aI-822 -aI805 -aI-835 -aa(lp705 -g15 -aI789 -aI-872 -aI805 -aI-859 -aI799 -aI-867 -aa(lp706 -g15 -aI741 -aI-881 -aI778 -aI-878 -aI762 -aI-881 -aa(lp707 -g20 -aI737 -aI-881 -aa(lp708 -g20 -aI751 -aI-951 -aa(lp709 -g20 -aI1062 -aI-951 -aa(lp710 -g10 -aa(lp711 -g8 -aI975 -aI0 -aa(lp712 -g10 -aa(lp713 -g8 -aI975 -aI0 -aasV\u005C -(lp714 -(lp715 -g8 -aI143 -aI-1012 -aa(lp716 -g20 -aI237 -aI-1012 -aa(lp717 -g20 -aI309 -aI161 -aa(lp718 -g20 -aI216 -aI161 -aa(lp719 -g10 -aa(lp720 -g8 -aI384 -aI0 -aa(lp721 -g10 -aa(lp722 -g8 -aI384 -aI0 -aasV` -(lp723 -(lp724 -g8 -aI541 -aI-807 -aa(lp725 -g15 -aI480 -aI-850 -aI521 -aI-818 -aI501 -aI-833 -aa(lp726 -g15 -aI417 -aI-904 -aI458 -aI-867 -aI437 -aI-885 -aa(lp727 -g15 -aI362 -aI-960 -aI398 -aI-923 -aI379 -aI-942 -aa(lp728 -g15 -aI324 -aI-1007 -aI346 -aI-978 -aI333 -aI-994 -aa(lp729 -g20 -aI328 -aI-1021 -aa(lp730 -g20 -aI524 -aI-1021 -aa(lp731 -g15 -aI544 -aI-968 -aI529 -aI-1004 -aI536 -aI-987 -aa(lp732 -g15 -aI570 -aI-914 -aI553 -aI-950 -aI561 -aI-932 -aa(lp733 -g15 -aI598 -aI-864 -aI580 -aI-896 -aI589 -aI-879 -aa(lp734 -g15 -aI623 -aI-825 -aI607 -aI-848 -aI616 -aI-835 -aa(lp735 -g20 -aI619 -aI-807 -aa(lp736 -g10 -aa(lp737 -g8 -aI769 -aI0 -aa(lp738 -g10 -aa(lp739 -g8 -aI769 -aI0 -aasVd -(lp740 -(lp741 -g8 -aI255 -aI-228 -aa(lp742 -g15 -aI261 -aI-164 -aI255 -aI-203 -aI257 -aI-182 -aa(lp743 -g15 -aI276 -aI-122 -aI265 -aI-147 -aI270 -aI-133 -aa(lp744 -g15 -aI299 -aI-99 -aI282 -aI-112 -aI290 -aI-104 -aa(lp745 -g15 -aI328 -aI-92 -aI308 -aI-95 -aI317 -aI-92 -aa(lp746 -g15 -aI388 -aI-118 -aI347 -aI-92 -aI367 -aI-101 -aa(lp747 -g15 -aI446 -aI-184 -aI408 -aI-134 -aI428 -aI-157 -aa(lp748 -g15 -aI495 -aI-277 -aI464 -aI-211 -aI481 -aI-242 -aa(lp749 -g15 -aI529 -aI-383 -aI510 -aI-312 -aI521 -aI-347 -aa(lp750 -g20 -aI576 -aI-605 -aa(lp751 -g15 -aI537 -aI-632 -aI566 -aI-617 -aI553 -aI-626 -aa(lp752 -g15 -aI488 -aI-642 -aI520 -aI-638 -aI504 -aI-642 -aa(lp753 -g15 -aI418 -aI-621 -aI463 -aI-642 -aI439 -aI-635 -aa(lp754 -g15 -aI361 -aI-567 -aI397 -aI-607 -aI378 -aI-589 -aa(lp755 -g15 -aI315 -aI-490 -aI343 -aI-545 -aI328 -aI-519 -aa(lp756 -g15 -aI282 -aI-401 -aI302 -aI-461 -aI291 -aI-432 -aa(lp757 -g15 -aI262 -aI-310 -aI273 -aI-370 -aI267 -aI-340 -aa(lp758 -g15 -aI255 -aI-228 -aI258 -aI-280 -aI255 -aI-253 -aa(lp759 -g10 -aa(lp760 -g8 -aI710 -aI-286 -aa(lp761 -g15 -aI705 -aI-258 -aI709 -aI-279 -aI707 -aI-270 -aa(lp762 -g15 -aI698 -aI-220 -aI703 -aI-246 -aI700 -aI-233 -aa(lp763 -g15 -aI693 -aI-182 -aI696 -aI-207 -aI694 -aI-195 -aa(lp764 -g15 -aI690 -aI-151 -aI691 -aI-169 -aI690 -aI-159 -aa(lp765 -g15 -aI705 -aI-105 -aI690 -aI-130 -aI695 -aI-115 -aa(lp766 -g15 -aI737 -aI-91 -aI714 -aI-96 -aI725 -aI-91 -aa(lp767 -g15 -aI775 -aI-100 -aI748 -aI-91 -aI761 -aI-94 -aa(lp768 -g15 -aI811 -aI-119 -aI788 -aI-106 -aI800 -aI-112 -aa(lp769 -g20 -aI841 -aI-67 -aa(lp770 -g15 -aI801 -aI-38 -aI829 -aI-57 -aI816 -aI-48 -aa(lp771 -g15 -aI752 -aI-12 -aI786 -aI-29 -aI770 -aI-20 -aa(lp772 -g15 -aI695 -aI6 -aI735 -aI-4 -aI716 -aI1 -aa(lp773 -g15 -aI630 -aI13 -aI675 -aI11 -aI653 -aI13 -aa(lp774 -g15 -aI577 -aI6 -aI611 -aI13 -aI593 -aI11 -aa(lp775 -g15 -aI536 -aI-13 -aI561 -aI2 -aI547 -aI-4 -aa(lp776 -g15 -aI509 -aI-46 -aI524 -aI-21 -aI515 -aI-32 -aa(lp777 -g15 -aI500 -aI-92 -aI503 -aI-59 -aI500 -aI-74 -aa(lp778 -g15 -aI500 -aI-114 -aI500 -aI-100 -aI500 -aI-108 -aa(lp779 -g15 -aI502 -aI-133 -aI501 -aI-121 -aI501 -aI-127 -aa(lp780 -g15 -aI504 -aI-154 -aI502 -aI-140 -aI503 -aI-147 -aa(lp781 -g15 -aI509 -aI-179 -aI505 -aI-161 -aI507 -aI-169 -aa(lp782 -g20 -aI501 -aI-179 -aa(lp783 -g15 -aI449 -aI-91 -aI484 -aI-144 -aI467 -aI-115 -aa(lp784 -g15 -aI390 -aI-31 -aI430 -aI-67 -aI411 -aI-47 -aa(lp785 -g15 -aI324 -aI2 -aI370 -aI-15 -aI348 -aI-4 -aa(lp786 -g15 -aI248 -aI13 -aI300 -aI9 -aI275 -aI13 -aa(lp787 -g15 -aI159 -aI-6 -aI213 -aI13 -aI184 -aI6 -aa(lp788 -g15 -aI99 -aI-58 -aI135 -aI-19 -aI115 -aI-36 -aa(lp789 -g15 -aI64 -aI-136 -aI83 -aI-80 -aI71 -aI-106 -aa(lp790 -g15 -aI53 -aI-230 -aI57 -aI-165 -aI53 -aI-197 -aa(lp791 -g15 -aI65 -aI-339 -aI53 -aI-264 -aI57 -aI-301 -aa(lp792 -g15 -aI101 -aI-451 -aI73 -aI-377 -aI85 -aI-414 -aa(lp793 -g15 -aI159 -aI-556 -aI117 -aI-488 -aI136 -aI-523 -aa(lp794 -g15 -aI240 -aI-644 -aI183 -aI-590 -aI209 -aI-619 -aa(lp795 -g15 -aI341 -aI-704 -aI270 -aI-669 -aI304 -aI-689 -aa(lp796 -g15 -aI462 -aI-727 -aI378 -aI-719 -aI419 -aI-727 -aa(lp797 -g15 -aI535 -aI-718 -aI488 -aI-727 -aI513 -aI-724 -aa(lp798 -g15 -aI595 -aI-695 -aI558 -aI-713 -aI578 -aI-705 -aa(lp799 -g15 -aI599 -aI-715 -aI597 -aI-701 -aI598 -aI-707 -aa(lp800 -g15 -aI603 -aI-738 -aI600 -aI-722 -aI602 -aI-730 -aa(lp801 -g15 -aI608 -aI-759 -aI605 -aI-745 -aI606 -aI-752 -aa(lp802 -g15 -aI611 -aI-775 -aI609 -aI-766 -aI611 -aI-771 -aa(lp803 -g20 -aI623 -aI-828 -aa(lp804 -g15 -aI627 -aI-846 -aI625 -aI-834 -aI626 -aI-840 -aa(lp805 -g15 -aI630 -aI-863 -aI628 -aI-852 -aI629 -aI-858 -aa(lp806 -g15 -aI632 -aI-877 -aI631 -aI-869 -aI632 -aI-873 -aa(lp807 -g15 -aI633 -aI-886 -aI633 -aI-881 -aI633 -aI-884 -aa(lp808 -g15 -aI629 -aI-915 -aI633 -aI-898 -aI632 -aI-908 -aa(lp809 -g15 -aI617 -aI-932 -aI626 -aI-922 -aI622 -aI-928 -aa(lp810 -g15 -aI595 -aI-940 -aI611 -aI-936 -aI604 -aI-939 -aa(lp811 -g15 -aI562 -aI-942 -aI585 -aI-941 -aI575 -aI-942 -aa(lp812 -g20 -aI531 -aI-942 -aa(lp813 -g20 -aI544 -aI-1012 -aa(lp814 -g20 -aI865 -aI-1012 -aa(lp815 -g10 -aa(lp816 -g8 -aI886 -aI0 -aa(lp817 -g10 -aa(lp818 -g8 -aI886 -aI0 -aasVh -(lp819 -(lp820 -g8 -aI490 -aI-123 -aa(lp821 -g15 -aI495 -aI-191 -aI490 -aI-142 -aI492 -aI-165 -aa(lp822 -g15 -aI511 -aI-282 -aI499 -aI-218 -aI504 -aI-248 -aa(lp823 -g20 -aI534 -aI-387 -aa(lp824 -g15 -aI541 -aI-419 -aI536 -aI-396 -aI539 -aI-406 -aa(lp825 -g15 -aI549 -aI-458 -aI544 -aI-432 -aI547 -aI-445 -aa(lp826 -g15 -aI555 -aI-499 -aI552 -aI-472 -aI554 -aI-486 -aa(lp827 -g15 -aI558 -aI-536 -aI557 -aI-513 -aI558 -aI-525 -aa(lp828 -g15 -aI556 -aI-562 -aI558 -aI-544 -aI557 -aI-553 -aa(lp829 -g15 -aI548 -aI-587 -aI554 -aI-571 -aI552 -aI-580 -aa(lp830 -g15 -aI531 -aI-605 -aI544 -aI-594 -aI538 -aI-600 -aa(lp831 -g15 -aI502 -aI-612 -aI523 -aI-610 -aI514 -aI-612 -aa(lp832 -g15 -aI457 -aI-597 -aI487 -aI-612 -aI472 -aI-607 -aa(lp833 -g15 -aI414 -aI-557 -aI442 -aI-587 -aI427 -aI-573 -aa(lp834 -g15 -aI374 -aI-499 -aI400 -aI-540 -aI387 -aI-521 -aa(lp835 -g15 -aI340 -aI-433 -aI362 -aI-478 -aI351 -aI-456 -aa(lp836 -g15 -aI314 -aI-367 -aI330 -aI-411 -aI321 -aI-389 -aa(lp837 -g15 -aI297 -aI-308 -aI307 -aI-345 -aI301 -aI-326 -aa(lp838 -g20 -aI227 -aI0 -aa(lp839 -g20 -aI27 -aI0 -aa(lp840 -g20 -aI203 -aI-828 -aa(lp841 -g15 -aI207 -aI-846 -aI205 -aI-834 -aI206 -aI-840 -aa(lp842 -g15 -aI210 -aI-863 -aI208 -aI-852 -aI210 -aI-858 -aa(lp843 -g15 -aI212 -aI-877 -aI211 -aI-869 -aI212 -aI-873 -aa(lp844 -g15 -aI213 -aI-886 -aI213 -aI-881 -aI213 -aI-884 -aa(lp845 -g15 -aI209 -aI-915 -aI213 -aI-898 -aI212 -aI-908 -aa(lp846 -g15 -aI197 -aI-932 -aI207 -aI-922 -aI202 -aI-928 -aa(lp847 -g15 -aI175 -aI-940 -aI191 -aI-936 -aI184 -aI-939 -aa(lp848 -g15 -aI142 -aI-942 -aI166 -aI-941 -aI155 -aI-942 -aa(lp849 -g20 -aI114 -aI-942 -aa(lp850 -g20 -aI126 -aI-1012 -aa(lp851 -g20 -aI449 -aI-1012 -aa(lp852 -g20 -aI386 -aI-719 -aa(lp853 -g15 -aI375 -aI-674 -aI383 -aI-706 -aI379 -aI-690 -aa(lp854 -g15 -aI363 -aI-625 -aI371 -aI-657 -aI367 -aI-641 -aa(lp855 -g15 -aI349 -aI-571 -aI358 -aI-608 -aI353 -aI-590 -aa(lp856 -g20 -aI357 -aI-571 -aa(lp857 -g15 -aI409 -aI-640 -aI374 -aI-598 -aI391 -aI-621 -aa(lp858 -g15 -aI468 -aI-689 -aI427 -aI-660 -aI447 -aI-676 -aa(lp859 -g15 -aI536 -aI-717 -aI488 -aI-702 -aI511 -aI-711 -aa(lp860 -g15 -aI617 -aI-727 -aI560 -aI-724 -aI587 -aI-727 -aa(lp861 -g15 -aI688 -aI-715 -aI645 -aI-727 -aI669 -aI-723 -aa(lp862 -g15 -aI736 -aI-681 -aI708 -aI-706 -aI724 -aI-695 -aa(lp863 -g15 -aI761 -aI-632 -aI747 -aI-667 -aI756 -aI-651 -aa(lp864 -g15 -aI769 -aI-574 -aI766 -aI-614 -aI769 -aI-594 -aa(lp865 -g15 -aI766 -aI-538 -aI769 -aI-563 -aI768 -aI-551 -aa(lp866 -g15 -aI760 -aI-499 -aI765 -aI-525 -aI763 -aI-512 -aa(lp867 -g15 -aI752 -aI-460 -aI758 -aI-486 -aI755 -aI-473 -aa(lp868 -g15 -aI745 -aI-423 -aI750 -aI-447 -aI747 -aI-435 -aa(lp869 -g20 -aI714 -aI-280 -aa(lp870 -g15 -aI701 -aI-212 -aI709 -aI-256 -aI704 -aI-233 -aa(lp871 -g15 -aI695 -aI-153 -aI697 -aI-191 -aI695 -aI-171 -aa(lp872 -g15 -aI708 -aI-108 -aI695 -aI-133 -aI700 -aI-118 -aa(lp873 -g15 -aI742 -aI-92 -aI716 -aI-97 -aI728 -aI-92 -aa(lp874 -g15 -aI780 -aI-100 -aI756 -aI-92 -aI769 -aI-95 -aa(lp875 -g15 -aI821 -aI-123 -aI792 -aI-105 -aI805 -aI-113 -aa(lp876 -g20 -aI853 -aI-78 -aa(lp877 -g15 -aI817 -aI-44 -aI842 -aI-67 -aI830 -aI-55 -aa(lp878 -g15 -aI771 -aI-15 -aI803 -aI-33 -aI788 -aI-23 -aa(lp879 -g15 -aI716 -aI5 -aI755 -aI-6 -aI736 -aI0 -aa(lp880 -g15 -aI649 -aI13 -aI695 -aI10 -aI673 -aI13 -aa(lp881 -g15 -aI531 -aI-22 -aI598 -aI13 -aI559 -aI1 -aa(lp882 -g15 -aI490 -aI-123 -aI504 -aI-46 -aI490 -aI-80 -aa(lp883 -g10 -aa(lp884 -g8 -aI874 -aI0 -aa(lp885 -g10 -aa(lp886 -g8 -aI874 -aI0 -aasVl -(lp887 -(lp888 -g8 -aI318 -aI-92 -aa(lp889 -g15 -aI356 -aI-100 -aI332 -aI-92 -aI345 -aI-95 -aa(lp890 -g15 -aI397 -aI-123 -aI368 -aI-105 -aI381 -aI-113 -aa(lp891 -g20 -aI429 -aI-78 -aa(lp892 -g15 -aI393 -aI-44 -aI418 -aI-67 -aI406 -aI-55 -aa(lp893 -g15 -aI347 -aI-15 -aI379 -aI-33 -aI364 -aI-23 -aa(lp894 -g15 -aI292 -aI5 -aI331 -aI-6 -aI312 -aI0 -aa(lp895 -g15 -aI225 -aI13 -aI271 -aI10 -aI249 -aI13 -aa(lp896 -g15 -aI107 -aI-22 -aI174 -aI13 -aI134 -aI1 -aa(lp897 -g15 -aI66 -aI-123 -aI80 -aI-46 -aI66 -aI-80 -aa(lp898 -g15 -aI87 -aI-282 -aI66 -aI-161 -aI73 -aI-214 -aa(lp899 -g20 -aI203 -aI-828 -aa(lp900 -g15 -aI207 -aI-846 -aI205 -aI-834 -aI206 -aI-840 -aa(lp901 -g15 -aI210 -aI-863 -aI208 -aI-852 -aI210 -aI-858 -aa(lp902 -g15 -aI212 -aI-877 -aI211 -aI-869 -aI212 -aI-873 -aa(lp903 -g15 -aI213 -aI-886 -aI213 -aI-881 -aI213 -aI-884 -aa(lp904 -g15 -aI209 -aI-915 -aI213 -aI-898 -aI212 -aI-908 -aa(lp905 -g15 -aI197 -aI-932 -aI207 -aI-922 -aI202 -aI-928 -aa(lp906 -g15 -aI175 -aI-940 -aI191 -aI-936 -aI184 -aI-939 -aa(lp907 -g15 -aI142 -aI-942 -aI166 -aI-941 -aI155 -aI-942 -aa(lp908 -g20 -aI114 -aI-942 -aa(lp909 -g20 -aI126 -aI-1012 -aa(lp910 -g20 -aI449 -aI-1012 -aa(lp911 -g20 -aI290 -aI-280 -aa(lp912 -g15 -aI277 -aI-212 -aI285 -aI-256 -aI280 -aI-233 -aa(lp913 -g15 -aI272 -aI-153 -aI273 -aI-191 -aI272 -aI-171 -aa(lp914 -g15 -aI284 -aI-108 -aI272 -aI-133 -aI276 -aI-118 -aa(lp915 -g15 -aI318 -aI-92 -aI292 -aI-97 -aI303 -aI-92 -aa(lp916 -g10 -aa(lp917 -g8 -aI472 -aI0 -aa(lp918 -g10 -aa(lp919 -g8 -aI472 -aI0 -aasVp -(lp920 -(lp921 -g8 -aI576 -aI-476 -aa(lp922 -g15 -aI572 -aI-529 -aI576 -aI-494 -aI574 -aI-512 -aa(lp923 -g15 -aI560 -aI-575 -aI570 -aI-546 -aI566 -aI-562 -aa(lp924 -g15 -aI538 -aI-608 -aI555 -aI-589 -aI548 -aI-600 -aa(lp925 -g15 -aI503 -aI-620 -aI529 -aI-616 -aI517 -aI-620 -aa(lp926 -g15 -aI459 -aI-607 -aI489 -aI-620 -aI474 -aI-616 -aa(lp927 -g15 -aI417 -aI-573 -aI445 -aI-599 -aI431 -aI-588 -aa(lp928 -g15 -aI379 -aI-524 -aI403 -aI-559 -aI391 -aI-542 -aa(lp929 -g15 -aI346 -aI-466 -aI367 -aI-505 -aI356 -aI-486 -aa(lp930 -g15 -aI321 -aI-405 -aI336 -aI-445 -aI328 -aI-425 -aa(lp931 -g15 -aI305 -aI-347 -aI314 -aI-384 -aI308 -aI-365 -aa(lp932 -g20 -aI254 -aI-108 -aa(lp933 -g15 -aI270 -aI-96 -aI258 -aI-105 -aI263 -aI-100 -aa(lp934 -g15 -aI292 -aI-84 -aI276 -aI-91 -aI284 -aI-87 -aa(lp935 -g15 -aI319 -aI-75 -aI300 -aI-80 -aI309 -aI-77 -aa(lp936 -g15 -aI349 -aI-71 -aI329 -aI-73 -aI339 -aI-71 -aa(lp937 -g15 -aI416 -aI-91 -aI373 -aI-71 -aI395 -aI-78 -aa(lp938 -g15 -aI472 -aI-143 -aI436 -aI-104 -aI455 -aI-121 -aa(lp939 -g15 -aI516 -aI-217 -aI489 -aI-165 -aI503 -aI-189 -aa(lp940 -g15 -aI549 -aI-304 -aI529 -aI-245 -aI540 -aI-274 -aa(lp941 -g15 -aI569 -aI-394 -aI558 -aI-334 -aI564 -aI-364 -aa(lp942 -g15 -aI576 -aI-476 -aI573 -aI-424 -aI576 -aI-451 -aa(lp943 -g10 -aa(lp944 -g8 -aI-39 -aI320 -aa(lp945 -g20 -aI141 -aI-530 -aa(lp946 -g15 -aI144 -aI-547 -aI142 -aI-535 -aI143 -aI-541 -aa(lp947 -g15 -aI147 -aI-564 -aI145 -aI-553 -aI146 -aI-559 -aa(lp948 -g15 -aI149 -aI-578 -aI148 -aI-570 -aI149 -aI-575 -aa(lp949 -g15 -aI150 -aI-587 -aI150 -aI-582 -aI150 -aI-585 -aa(lp950 -g15 -aI146 -aI-616 -aI150 -aI-599 -aI149 -aI-609 -aa(lp951 -g15 -aI134 -aI-633 -aI143 -aI-624 -aI139 -aI-629 -aa(lp952 -g15 -aI112 -aI-641 -aI128 -aI-637 -aI121 -aI-640 -aa(lp953 -g15 -aI80 -aI-643 -aI103 -aI-642 -aI92 -aI-643 -aa(lp954 -g20 -aI55 -aI-643 -aa(lp955 -g20 -aI67 -aI-714 -aa(lp956 -g20 -aI354 -aI-714 -aa(lp957 -g20 -aI320 -aI-536 -aa(lp958 -g20 -aI329 -aI-536 -aa(lp959 -g15 -aI376 -aI-613 -aI344 -aI-564 -aI360 -aI-590 -aa(lp960 -g15 -aI429 -aI-674 -aI392 -aI-636 -aI410 -aI-657 -aa(lp961 -g15 -aI496 -aI-713 -aI449 -aI-690 -aI471 -aI-704 -aa(lp962 -g15 -aI582 -aI-727 -aI520 -aI-722 -aI549 -aI-727 -aa(lp963 -g15 -aI662 -aI-711 -aI611 -aI-727 -aI638 -aI-722 -aa(lp964 -g15 -aI723 -aI-665 -aI686 -aI-701 -aI707 -aI-685 -aa(lp965 -g15 -aI763 -aI-590 -aI740 -aI-645 -aI754 -aI-619 -aa(lp966 -g15 -aI777 -aI-486 -aI772 -aI-560 -aI777 -aI-525 -aa(lp967 -g15 -aI765 -aI-382 -aI777 -aI-454 -aI773 -aI-419 -aa(lp968 -g15 -aI731 -aI-271 -aI758 -aI-345 -aI746 -aI-308 -aa(lp969 -g15 -aI674 -aI-164 -aI716 -aI-234 -aI697 -aI-198 -aa(lp970 -g15 -aI594 -aI-73 -aI652 -aI-129 -aI625 -aI-99 -aa(lp971 -g15 -aI490 -aI-10 -aI563 -aI-47 -aI528 -aI-26 -aa(lp972 -g15 -aI363 -aI13 -aI452 -aI5 -aI409 -aI13 -aa(lp973 -g15 -aI288 -aI5 -aI337 -aI13 -aI311 -aI10 -aa(lp974 -g15 -aI227 -aI-17 -aI265 -aI0 -aI245 -aI-7 -aa(lp975 -g15 -aI225 -aI4 -aI227 -aI-10 -aI226 -aI-3 -aa(lp976 -g15 -aI222 -aI24 -aI224 -aI10 -aI223 -aI17 -aa(lp977 -g15 -aI217 -aI47 -aI220 -aI32 -aI219 -aI39 -aa(lp978 -g20 -aI198 -aI136 -aa(lp979 -g15 -aI194 -aI154 -aI197 -aI142 -aI196 -aI148 -aa(lp980 -g15 -aI192 -aI171 -aI193 -aI160 -aI192 -aI165 -aa(lp981 -g15 -aI190 -aI185 -aI191 -aI176 -aI190 -aI181 -aa(lp982 -g15 -aI189 -aI193 -aI189 -aI189 -aI189 -aI192 -aa(lp983 -g15 -aI193 -aI223 -aI189 -aI205 -aI190 -aI215 -aa(lp984 -g15 -aI205 -aI240 -aI195 -aI230 -aI200 -aI236 -aa(lp985 -g15 -aI227 -aI247 -aI211 -aI243 -aI218 -aI246 -aa(lp986 -g15 -aI259 -aI249 -aI236 -aI249 -aI247 -aI249 -aa(lp987 -g20 -aI310 -aI249 -aa(lp988 -g20 -aI298 -aI320 -aa(lp989 -g10 -aa(lp990 -g8 -aI830 -aI0 -aa(lp991 -g10 -aa(lp992 -g8 -aI830 -aI0 -aasVt -(lp993 -(lp994 -g8 -aI360 -aI-95 -aa(lp995 -g15 -aI416 -aI-105 -aI380 -aI-95 -aI399 -aI-98 -aa(lp996 -g15 -aI464 -aI-130 -aI433 -aI-112 -aI449 -aI-120 -aa(lp997 -g20 -aI494 -aI-79 -aa(lp998 -g15 -aI448 -aI-43 -aI480 -aI-67 -aI464 -aI-55 -aa(lp999 -g15 -aI395 -aI-14 -aI431 -aI-32 -aI414 -aI-22 -aa(lp1000 -g15 -aI333 -aI5 -aI376 -aI-5 -aI355 -aI0 -aa(lp1001 -g15 -aI262 -aI13 -aI311 -aI10 -aI287 -aI13 -aa(lp1002 -g15 -aI194 -aI4 -aI238 -aI13 -aI215 -aI10 -aa(lp1003 -g15 -aI139 -aI-24 -aI173 -aI-2 -aI154 -aI-11 -aa(lp1004 -g15 -aI102 -aI-73 -aI123 -aI-37 -aI111 -aI-53 -aa(lp1005 -g15 -aI89 -aI-142 -aI93 -aI-92 -aI89 -aI-115 -aa(lp1006 -g15 -aI90 -aI-168 -aI89 -aI-149 -aI89 -aI-158 -aa(lp1007 -g15 -aI93 -aI-197 -aI90 -aI-177 -aI91 -aI-187 -aa(lp1008 -g15 -aI97 -aI-227 -aI94 -aI-207 -aI95 -aI-217 -aa(lp1009 -g15 -aI102 -aI-254 -aI99 -aI-236 -aI101 -aI-245 -aa(lp1010 -g20 -aI182 -aI-623 -aa(lp1011 -g20 -aI80 -aI-623 -aa(lp1012 -g20 -aI94 -aI-691 -aa(lp1013 -g15 -aI156 -aI-701 -aI113 -aI-691 -aI134 -aI-694 -aa(lp1014 -g15 -aI226 -aI-733 -aI179 -aI-707 -aI202 -aI-718 -aa(lp1015 -g15 -aI297 -aI-791 -aI249 -aI-748 -aI273 -aI-767 -aa(lp1016 -g15 -aI363 -aI-878 -aI320 -aI-815 -aI343 -aI-844 -aa(lp1017 -g20 -aI441 -aI-878 -aa(lp1018 -g20 -aI406 -aI-714 -aa(lp1019 -g20 -aI567 -aI-714 -aa(lp1020 -g20 -aI549 -aI-623 -aa(lp1021 -g20 -aI386 -aI-623 -aa(lp1022 -g20 -aI306 -aI-258 -aa(lp1023 -g15 -aI296 -aI-204 -aI301 -aI-238 -aI298 -aI-220 -aa(lp1024 -g15 -aI293 -aI-162 -aI294 -aI-189 -aI293 -aI-174 -aa(lp1025 -g15 -aI311 -aI-112 -aI293 -aI-140 -aI299 -aI-123 -aa(lp1026 -g15 -aI360 -aI-95 -aI324 -aI-100 -aI340 -aI-95 -aa(lp1027 -g10 -aa(lp1028 -g8 -aI555 -aI0 -aa(lp1029 -g10 -aa(lp1030 -g8 -aI555 -aI0 -aasVx -(lp1031 -(lp1032 -g8 -aI-26 -aI0 -aa(lp1033 -g20 -aI-13 -aI-70 -aa(lp1034 -g20 -aI3 -aI-70 -aa(lp1035 -g15 -aI38 -aI-73 -aI16 -aI-70 -aI27 -aI-71 -aa(lp1036 -g15 -aI68 -aI-85 -aI48 -aI-75 -aI58 -aI-79 -aa(lp1037 -g15 -aI102 -aI-111 -aI78 -aI-91 -aI90 -aI-100 -aa(lp1038 -g15 -aI145 -aI-155 -aI114 -aI-122 -aI128 -aI-137 -aa(lp1039 -g20 -aI313 -aI-340 -aa(lp1040 -g20 -aI221 -aI-562 -aa(lp1041 -g15 -aI200 -aI-603 -aI214 -aI-578 -aI207 -aI-592 -aa(lp1042 -g15 -aI179 -aI-627 -aI194 -aI-613 -aI186 -aI-621 -aa(lp1043 -g15 -aI152 -aI-640 -aI171 -aI-633 -aI162 -aI-638 -aa(lp1044 -g15 -aI119 -aI-643 -aI143 -aI-642 -aI132 -aI-643 -aa(lp1045 -g20 -aI104 -aI-643 -aa(lp1046 -g20 -aI117 -aI-714 -aa(lp1047 -g20 -aI367 -aI-714 -aa(lp1048 -g20 -aI461 -aI-461 -aa(lp1049 -g20 -aI646 -aI-714 -aa(lp1050 -g20 -aI809 -aI-714 -aa(lp1051 -g20 -aI796 -aI-643 -aa(lp1052 -g20 -aI772 -aI-643 -aa(lp1053 -g15 -aI737 -aI-639 -aI759 -aI-643 -aI747 -aI-642 -aa(lp1054 -g15 -aI706 -aI-624 -aI727 -aI-636 -aI716 -aI-632 -aa(lp1055 -g15 -aI674 -aI-595 -aI696 -aI-617 -aI685 -aI-607 -aa(lp1056 -g15 -aI633 -aI-547 -aI662 -aI-583 -aI649 -aI-567 -aa(lp1057 -g20 -aI496 -aI-388 -aa(lp1058 -g20 -aI593 -aI-164 -aa(lp1059 -g15 -aI616 -aI-118 -aI601 -aI-146 -aI609 -aI-130 -aa(lp1060 -g15 -aI638 -aI-89 -aI623 -aI-106 -aI630 -aI-96 -aa(lp1061 -g15 -aI664 -aI-74 -aI646 -aI-82 -aI655 -aI-77 -aa(lp1062 -g15 -aI698 -aI-70 -aI674 -aI-71 -aI685 -aI-70 -aa(lp1063 -g20 -aI716 -aI-70 -aa(lp1064 -g20 -aI702 -aI0 -aa(lp1065 -g20 -aI444 -aI0 -aa(lp1066 -g20 -aI343 -aI-269 -aa(lp1067 -g20 -aI136 -aI0 -aa(lp1068 -g10 -aa(lp1069 -g8 -aI805 -aI0 -aa(lp1070 -g10 -aa(lp1071 -g8 -aI805 -aI0 -aasV| -(lp1072 -(lp1073 -g8 -aI441 -aI320 -aa(lp1074 -g20 -aI345 -aI320 -aa(lp1075 -g20 -aI345 -aI-1012 -aa(lp1076 -g20 -aI441 -aI-1012 -aa(lp1077 -g10 -aa(lp1078 -g8 -aI745 -aI0 -aa(lp1079 -g10 -aa(lp1080 -g8 -aI745 -aI0 -aasV# -(lp1081 -(lp1082 -g8 -aI674 -aI-358 -aa(lp1083 -g20 -aI665 -aI-266 -aa(lp1084 -g20 -aI498 -aI-266 -aa(lp1085 -g20 -aI421 -aI0 -aa(lp1086 -g20 -aI326 -aI0 -aa(lp1087 -g20 -aI404 -aI-266 -aa(lp1088 -g20 -aI265 -aI-266 -aa(lp1089 -g20 -aI186 -aI0 -aa(lp1090 -g20 -aI91 -aI0 -aa(lp1091 -g20 -aI170 -aI-266 -aa(lp1092 -g20 -aI37 -aI-266 -aa(lp1093 -g20 -aI46 -aI-358 -aa(lp1094 -g20 -aI197 -aI-358 -aa(lp1095 -g20 -aI269 -aI-599 -aa(lp1096 -g20 -aI114 -aI-599 -aa(lp1097 -g20 -aI125 -aI-692 -aa(lp1098 -g20 -aI297 -aI-692 -aa(lp1099 -g20 -aI370 -aI-951 -aa(lp1100 -g20 -aI466 -aI-951 -aa(lp1101 -g20 -aI391 -aI-692 -aa(lp1102 -g20 -aI530 -aI-692 -aa(lp1103 -g20 -aI606 -aI-951 -aa(lp1104 -g20 -aI701 -aI-951 -aa(lp1105 -g20 -aI625 -aI-692 -aa(lp1106 -g20 -aI753 -aI-692 -aa(lp1107 -g20 -aI742 -aI-599 -aa(lp1108 -g20 -aI597 -aI-599 -aa(lp1109 -g20 -aI526 -aI-358 -aa(lp1110 -g10 -aa(lp1111 -g8 -aI292 -aI-358 -aa(lp1112 -g20 -aI432 -aI-358 -aa(lp1113 -g20 -aI503 -aI-599 -aa(lp1114 -g20 -aI363 -aI-599 -aa(lp1115 -g10 -aa(lp1116 -g8 -aI745 -aI0 -aa(lp1117 -g10 -aa(lp1118 -g8 -aI745 -aI0 -aasV' -(lp1119 -(lp1120 -g8 -aI221 -aI-951 -aa(lp1121 -g20 -aI429 -aI-951 -aa(lp1122 -g20 -aI290 -aI-584 -aa(lp1123 -g20 -aI202 -aI-584 -aa(lp1124 -g10 -aa(lp1125 -g8 -aI386 -aI0 -aa(lp1126 -g10 -aa(lp1127 -g8 -aI386 -aI0 -aasV+ -(lp1128 -(lp1129 -g8 -aI441 -aI-428 -aa(lp1130 -g20 -aI441 -aI-190 -aa(lp1131 -g20 -aI345 -aI-190 -aa(lp1132 -g20 -aI345 -aI-428 -aa(lp1133 -g20 -aI108 -aI-428 -aa(lp1134 -g20 -aI108 -aI-523 -aa(lp1135 -g20 -aI345 -aI-523 -aa(lp1136 -g20 -aI345 -aI-761 -aa(lp1137 -g20 -aI441 -aI-761 -aa(lp1138 -g20 -aI441 -aI-523 -aa(lp1139 -g20 -aI679 -aI-523 -aa(lp1140 -g20 -aI679 -aI-428 -aa(lp1141 -g10 -aa(lp1142 -g8 -aI745 -aI0 -aa(lp1143 -g10 -aa(lp1144 -g8 -aI745 -aI0 -aasV/ -(lp1145 -(lp1146 -g8 -aI-33 -aI161 -aa(lp1147 -g20 -aI-137 -aI161 -aa(lp1148 -g20 -aI430 -aI-1012 -aa(lp1149 -g20 -aI534 -aI-1012 -aa(lp1150 -g10 -aa(lp1151 -g8 -aI384 -aI0 -aa(lp1152 -g10 -aa(lp1153 -g8 -aI384 -aI0 -aasV3 -(lp1154 -(lp1155 -g8 -aI297 -aI-80 -aa(lp1156 -g15 -aI361 -aI-93 -aI319 -aI-80 -aI341 -aI-85 -aa(lp1157 -g15 -aI417 -aI-133 -aI382 -aI-102 -aI401 -aI-115 -aa(lp1158 -g15 -aI456 -aI-198 -aI433 -aI-150 -aI446 -aI-172 -aa(lp1159 -g15 -aI470 -aI-289 -aI465 -aI-224 -aI470 -aI-255 -aa(lp1160 -g15 -aI421 -aI-408 -aI470 -aI-341 -aI454 -aI-380 -aa(lp1161 -g15 -aI282 -aI-450 -aI388 -aI-436 -aI342 -aI-450 -aa(lp1162 -g20 -aI225 -aI-450 -aa(lp1163 -g20 -aI238 -aI-532 -aa(lp1164 -g20 -aI281 -aI-532 -aa(lp1165 -g15 -aI384 -aI-549 -aI318 -aI-532 -aI353 -aI-538 -aa(lp1166 -g15 -aI467 -aI-597 -aI416 -aI-560 -aI443 -aI-577 -aa(lp1167 -g15 -aI521 -aI-672 -aI490 -aI-618 -aI508 -aI-643 -aa(lp1168 -g15 -aI541 -aI-769 -aI534 -aI-701 -aI541 -aI-733 -aa(lp1169 -g15 -aI535 -aI-814 -aI541 -aI-785 -aI539 -aI-800 -aa(lp1170 -g15 -aI518 -aI-851 -aI531 -aI-829 -aI526 -aI-841 -aa(lp1171 -g15 -aI490 -aI-875 -aI511 -aI-861 -aI502 -aI-869 -aa(lp1172 -g15 -aI449 -aI-883 -aI479 -aI-880 -aI465 -aI-883 -aa(lp1173 -g15 -aI387 -aI-867 -aI424 -aI-883 -aI404 -aI-878 -aa(lp1174 -g15 -aI343 -aI-823 -aI369 -aI-856 -aI355 -aI-841 -aa(lp1175 -g15 -aI315 -aI-760 -aI332 -aI-805 -aI322 -aI-784 -aa(lp1176 -g15 -aI297 -aI-685 -aI307 -aI-736 -aI301 -aI-711 -aa(lp1177 -g15 -aI237 -aI-689 -aI276 -aI-685 -aI256 -aI-686 -aa(lp1178 -g15 -aI190 -aI-703 -aI219 -aI-692 -aI203 -aI-696 -aa(lp1179 -g15 -aI158 -aI-729 -aI176 -aI-709 -aI166 -aI-718 -aa(lp1180 -g15 -aI146 -aI-770 -aI150 -aI-740 -aI146 -aI-753 -aa(lp1181 -g15 -aI172 -aI-846 -aI146 -aI-797 -aI155 -aI-823 -aa(lp1182 -g15 -aI242 -aI-908 -aI189 -aI-870 -aI212 -aI-891 -aa(lp1183 -g15 -aI346 -aI-950 -aI271 -aI-926 -aI306 -aI-940 -aa(lp1184 -g15 -aI473 -aI-965 -aI385 -aI-960 -aI428 -aI-965 -aa(lp1185 -g15 -aI584 -aI-952 -aI514 -aI-965 -aI551 -aI-960 -aa(lp1186 -g15 -aI671 -aI-915 -aI618 -aI-943 -aI647 -aI-931 -aa(lp1187 -g15 -aI727 -aI-855 -aI695 -aI-898 -aI714 -aI-878 -aa(lp1188 -g15 -aI746 -aI-774 -aI740 -aI-831 -aI746 -aI-804 -aa(lp1189 -g15 -aI730 -aI-682 -aI746 -aI-743 -aI741 -aI-712 -aa(lp1190 -g15 -aI680 -aI-600 -aI719 -aI-652 -aI702 -aI-625 -aa(lp1191 -g15 -aI596 -aI-535 -aI657 -aI-575 -aI629 -aI-553 -aa(lp1192 -g15 -aI478 -aI-495 -aI562 -aI-516 -aI523 -aI-503 -aa(lp1193 -g15 -aI561 -aI-475 -aI509 -aI-492 -aI537 -aI-485 -aa(lp1194 -g15 -aI624 -aI-435 -aI586 -aI-465 -aI607 -aI-452 -aa(lp1195 -g15 -aI664 -aI-376 -aI641 -aI-419 -aI655 -aI-399 -aa(lp1196 -g15 -aI678 -aI-299 -aI673 -aI-354 -aI678 -aI-328 -aa(lp1197 -g15 -aI661 -aI-194 -aI678 -aI-260 -aI672 -aI-225 -aa(lp1198 -g15 -aI615 -aI-113 -aI650 -aI-163 -aI634 -aI-136 -aa(lp1199 -g15 -aI546 -aI-54 -aI595 -aI-90 -aI572 -aI-70 -aa(lp1200 -g15 -aI463 -aI-15 -aI520 -aI-38 -aI493 -aI-25 -aa(lp1201 -g15 -aI372 -aI6 -aI434 -aI-5 -aI403 -aI2 -aa(lp1202 -g15 -aI279 -aI13 -aI340 -aI11 -aI309 -aI13 -aa(lp1203 -g15 -aI148 -aI-1 -aI227 -aI13 -aI183 -aI8 -aa(lp1204 -g15 -aI61 -aI-38 -aI112 -aI-10 -aI83 -aI-23 -aa(lp1205 -g15 -aI13 -aI-90 -aI39 -aI-54 -aI23 -aI-71 -aa(lp1206 -g15 -aI-1 -aI-147 -aI3 -aI-109 -aI-1 -aI-128 -aa(lp1207 -g15 -aI37 -aI-230 -aI-1 -aI-182 -aI11 -aI-210 -aa(lp1208 -g15 -aI145 -aI-260 -aI63 -aI-250 -aI99 -aI-260 -aa(lp1209 -g15 -aI154 -aI-188 -aI145 -aI-234 -aI148 -aI-210 -aa(lp1210 -g15 -aI182 -aI-132 -aI160 -aI-166 -aI169 -aI-147 -aa(lp1211 -g15 -aI229 -aI-94 -aI194 -aI-116 -aI210 -aI-103 -aa(lp1212 -g15 -aI297 -aI-80 -aI248 -aI-85 -aI271 -aI-80 -aa(lp1213 -g10 -aa(lp1214 -g8 -aI745 -aI0 -aa(lp1215 -g10 -aa(lp1216 -g8 -aI745 -aI0 -aasV7 -(lp1217 -(lp1218 -g8 -aI138 -aI0 -aa(lp1219 -g20 -aI665 -aI-806 -aa(lp1220 -g20 -aI322 -aI-806 -aa(lp1221 -g15 -aI263 -aI-788 -aI298 -aI-806 -aI278 -aI-800 -aa(lp1222 -g15 -aI230 -aI-738 -aI247 -aI-777 -aI236 -aI-760 -aa(lp1223 -g20 -aI212 -aI-671 -aa(lp1224 -g20 -aI130 -aI-671 -aa(lp1225 -g20 -aI185 -aI-951 -aa(lp1226 -g20 -aI821 -aI-951 -aa(lp1227 -g20 -aI806 -aI-872 -aa(lp1228 -g20 -aI251 -aI0 -aa(lp1229 -g10 -aa(lp1230 -g8 -aI745 -aI0 -aa(lp1231 -g10 -aa(lp1232 -g8 -aI745 -aI0 -aasV; -(lp1233 -(lp1234 -g8 -aI278 -aI-82 -aa(lp1235 -g15 -aI260 -aI14 -aI278 -aI-48 -aI272 -aI-16 -aa(lp1236 -g15 -aI204 -aI96 -aI247 -aI44 -aI229 -aI72 -aa(lp1237 -g15 -aI112 -aI160 -aI180 -aI121 -aI149 -aI142 -aa(lp1238 -g15 -aI-14 -aI201 -aI76 -aI178 -aI33 -aI192 -aa(lp1239 -g20 -aI0 -aI131 -aa(lp1240 -g15 -aI137 -aI20 -aI91 -aI109 -aI137 -aI72 -aa(lp1241 -g15 -aI131 -aI-3 -aI137 -aI11 -aI135 -aI3 -aa(lp1242 -g15 -aI117 -aI-21 -aI128 -aI-9 -aI123 -aI-15 -aa(lp1243 -g15 -aI99 -aI-37 -aI112 -aI-26 -aI106 -aI-32 -aa(lp1244 -g15 -aI82 -aI-55 -aI93 -aI-42 -aI87 -aI-48 -aa(lp1245 -g15 -aI68 -aI-78 -aI76 -aI-61 -aI71 -aI-69 -aa(lp1246 -g15 -aI62 -aI-111 -aI64 -aI-87 -aI62 -aI-98 -aa(lp1247 -g15 -aI70 -aI-149 -aI62 -aI-125 -aI65 -aI-138 -aa(lp1248 -g15 -aI92 -aI-178 -aI76 -aI-161 -aI83 -aI-170 -aa(lp1249 -g15 -aI124 -aI-197 -aI101 -aI-186 -aI112 -aI-193 -aa(lp1250 -g15 -aI162 -aI-203 -aI136 -aI-201 -aI149 -aI-203 -aa(lp1251 -g15 -aI208 -aI-195 -aI178 -aI-203 -aI193 -aI-200 -aa(lp1252 -g15 -aI244 -aI-171 -aI222 -aI-189 -aI234 -aI-181 -aa(lp1253 -g15 -aI269 -aI-133 -aI255 -aI-161 -aI263 -aI-148 -aa(lp1254 -g15 -aI278 -aI-82 -aI275 -aI-119 -aI278 -aI-101 -aa(lp1255 -g10 -aa(lp1256 -g8 -aI399 -aI-625 -aa(lp1257 -g15 -aI389 -aI-568 -aI399 -aI-602 -aI396 -aI-583 -aa(lp1258 -g15 -aI362 -aI-531 -aI382 -aI-552 -aI374 -aI-540 -aa(lp1259 -g15 -aI325 -aI-510 -aI351 -aI-521 -aI339 -aI-515 -aa(lp1260 -g15 -aI283 -aI-504 -aI311 -aI-506 -aI297 -aI-504 -aa(lp1261 -g15 -aI205 -aI-528 -aI251 -aI-504 -aI225 -aI-512 -aa(lp1262 -g15 -aI175 -aI-601 -aI185 -aI-543 -aI175 -aI-568 -aa(lp1263 -g15 -aI183 -aI-649 -aI175 -aI-618 -aI178 -aI-635 -aa(lp1264 -g15 -aI207 -aI-687 -aI189 -aI-664 -aI197 -aI-677 -aa(lp1265 -g15 -aI244 -aI-712 -aI217 -aI-698 -aI229 -aI-706 -aa(lp1266 -g15 -aI292 -aI-720 -aI258 -aI-717 -aI274 -aI-720 -aa(lp1267 -g15 -aI334 -aI-715 -aI307 -aI-720 -aI321 -aI-718 -aa(lp1268 -g15 -aI369 -aI-697 -aI348 -aI-711 -aI359 -aI-705 -aa(lp1269 -g15 -aI391 -aI-667 -aI378 -aI-689 -aI386 -aI-679 -aa(lp1270 -g15 -aI399 -aI-625 -aI397 -aI-655 -aI399 -aI-641 -aa(lp1271 -g10 -aa(lp1272 -g8 -aI477 -aI0 -aa(lp1273 -g10 -aa(lp1274 -g8 -aI477 -aI0 -aasV? -(lp1275 -(lp1276 -g8 -aI730 -aI-743 -aa(lp1277 -g15 -aI705 -aI-637 -aI730 -aI-705 -aI722 -aI-669 -aa(lp1278 -g15 -aI635 -aI-550 -aI688 -aI-605 -aI664 -aI-576 -aa(lp1279 -g15 -aI530 -aI-479 -aI605 -aI-524 -aI570 -aI-500 -aa(lp1280 -g15 -aI398 -aI-422 -aI489 -aI-458 -aI445 -aI-439 -aa(lp1281 -g20 -aI350 -aI-303 -aa(lp1282 -g20 -aI265 -aI-303 -aa(lp1283 -g20 -aI262 -aI-468 -aa(lp1284 -g15 -aI369 -aI-516 -aI301 -aI-483 -aI337 -aI-499 -aa(lp1285 -g15 -aI451 -aI-574 -aI401 -aI-533 -aI428 -aI-552 -aa(lp1286 -g15 -aI504 -aI-649 -aI474 -aI-596 -aI491 -aI-621 -aa(lp1287 -g15 -aI522 -aI-746 -aI516 -aI-677 -aI522 -aI-709 -aa(lp1288 -g15 -aI515 -aI-804 -aI522 -aI-768 -aI520 -aI-787 -aa(lp1289 -g15 -aI495 -aI-847 -aI510 -aI-821 -aI503 -aI-836 -aa(lp1290 -g15 -aI464 -aI-874 -aI486 -aI-859 -aI476 -aI-868 -aa(lp1291 -g15 -aI426 -aI-883 -aI452 -aI-880 -aI439 -aI-883 -aa(lp1292 -g15 -aI372 -aI-867 -aI405 -aI-883 -aI387 -aI-878 -aa(lp1293 -g15 -aI335 -aI-824 -aI357 -aI-856 -aI345 -aI-842 -aa(lp1294 -g15 -aI311 -aI-761 -aI325 -aI-806 -aI317 -aI-785 -aa(lp1295 -g15 -aI298 -aI-689 -aI306 -aI-738 -aI301 -aI-714 -aa(lp1296 -g15 -aI134 -aI-791 -aI189 -aI-689 -aI134 -aI-723 -aa(lp1297 -g15 -aI156 -aI-859 -aI134 -aI-815 -aI141 -aI-838 -aa(lp1298 -g15 -aI217 -aI-914 -aI170 -aI-880 -aI191 -aI-898 -aa(lp1299 -g15 -aI314 -aI-951 -aI244 -aI-929 -aI276 -aI-942 -aa(lp1300 -g15 -aI442 -aI-965 -aI352 -aI-960 -aI395 -aI-965 -aa(lp1301 -g15 -aI562 -aI-952 -aI486 -aI-965 -aI526 -aI-960 -aa(lp1302 -g15 -aI652 -aI-911 -aI598 -aI-943 -aI628 -aI-929 -aa(lp1303 -g15 -aI710 -aI-842 -aI677 -aI-893 -aI696 -aI-870 -aa(lp1304 -g15 -aI730 -aI-743 -aI723 -aI-814 -aI730 -aI-781 -aa(lp1305 -g10 -aa(lp1306 -g8 -aI391 -aI-108 -aa(lp1307 -g15 -aI381 -aI-52 -aI391 -aI-86 -aI388 -aI-68 -aa(lp1308 -g15 -aI355 -aI-15 -aI375 -aI-37 -aI366 -aI-24 -aa(lp1309 -g15 -aI317 -aI4 -aI344 -aI-6 -aI331 -aI0 -aa(lp1310 -g15 -aI276 -aI10 -aI303 -aI8 -aI289 -aI10 -aa(lp1311 -g15 -aI197 -aI-12 -aI243 -aI10 -aI217 -aI3 -aa(lp1312 -g15 -aI167 -aI-84 -aI177 -aI-28 -aI167 -aI-52 -aa(lp1313 -g15 -aI176 -aI-134 -aI167 -aI-103 -aI170 -aI-119 -aa(lp1314 -g15 -aI199 -aI-172 -aI181 -aI-149 -aI189 -aI-161 -aa(lp1315 -g15 -aI236 -aI-196 -aI209 -aI-182 -aI221 -aI-190 -aa(lp1316 -g15 -aI283 -aI-204 -aI250 -aI-201 -aI266 -aI-204 -aa(lp1317 -g15 -aI326 -aI-198 -aI299 -aI-204 -aI313 -aI-202 -aa(lp1318 -g15 -aI361 -aI-181 -aI339 -aI-194 -aI351 -aI-189 -aa(lp1319 -g15 -aI383 -aI-151 -aI370 -aI-173 -aI378 -aI-163 -aa(lp1320 -g15 -aI391 -aI-108 -aI389 -aI-139 -aI391 -aI-124 -aa(lp1321 -g10 -aa(lp1322 -g8 -aI713 -aI0 -aa(lp1323 -g10 -aa(lp1324 -g8 -aI713 -aI0 -aasVC -(lp1325 -(lp1326 -g8 -aI535 -aI-98 -aa(lp1327 -g15 -aI619 -aI-108 -aI566 -aI-98 -aI594 -aI-101 -aa(lp1328 -g15 -aI685 -aI-136 -aI643 -aI-115 -aI666 -aI-125 -aa(lp1329 -g15 -aI736 -aI-175 -aI705 -aI-148 -aI722 -aI-161 -aa(lp1330 -g15 -aI776 -aI-219 -aI751 -aI-189 -aI764 -aI-204 -aa(lp1331 -g15 -aI791 -aI-201 -aI781 -aI-215 -aI786 -aI-209 -aa(lp1332 -g15 -aI798 -aI-174 -aI796 -aI-193 -aI798 -aI-184 -aa(lp1333 -g15 -aI778 -aI-107 -aI798 -aI-151 -aI792 -aI-129 -aa(lp1334 -g15 -aI719 -aI-46 -aI765 -aI-84 -aI745 -aI-64 -aa(lp1335 -g15 -aI621 -aI-3 -aI692 -aI-28 -aI660 -aI-14 -aa(lp1336 -g15 -aI488 -aI13 -aI583 -aI7 -aI538 -aI13 -aa(lp1337 -g15 -aI317 -aI-10 -aI424 -aI13 -aI367 -aI5 -aa(lp1338 -g15 -aI190 -aI-79 -aI267 -aI-26 -aI224 -aI-49 -aa(lp1339 -g15 -aI111 -aI-192 -aI155 -aI-110 -aI129 -aI-148 -aa(lp1340 -g15 -aI83 -aI-344 -aI93 -aI-237 -aI83 -aI-287 -aa(lp1341 -g15 -aI102 -aI-502 -aI83 -aI-397 -aI90 -aI-450 -aa(lp1342 -g15 -aI157 -aI-649 -aI115 -aI-553 -aI133 -aI-602 -aa(lp1343 -g15 -aI245 -aI-777 -aI181 -aI-695 -aI210 -aI-738 -aa(lp1344 -g15 -aI362 -aI-879 -aI279 -aI-816 -aI318 -aI-850 -aa(lp1345 -g15 -aI505 -aI-946 -aI405 -aI-907 -aI453 -aI-930 -aa(lp1346 -g15 -aI673 -aI-970 -aI557 -aI-962 -aI613 -aI-970 -aa(lp1347 -g15 -aI789 -aI-958 -aI717 -aI-970 -aI756 -aI-966 -aa(lp1348 -g15 -aI872 -aI-926 -aI822 -aI-951 -aI850 -aI-940 -aa(lp1349 -g15 -aI921 -aI-876 -aI893 -aI-913 -aI910 -aI-896 -aa(lp1350 -g15 -aI937 -aI-811 -aI932 -aI-857 -aI937 -aI-835 -aa(lp1351 -g15 -aI923 -aI-759 -aI937 -aI-791 -aI932 -aI-774 -aa(lp1352 -g15 -aI883 -aI-722 -aI913 -aI-745 -aI900 -aI-732 -aa(lp1353 -g15 -aI824 -aI-699 -aI867 -aI-712 -aI847 -aI-704 -aa(lp1354 -g15 -aI749 -aI-691 -aI801 -aI-694 -aI776 -aI-691 -aa(lp1355 -g15 -aI745 -aI-753 -aI749 -aI-710 -aI748 -aI-730 -aa(lp1356 -g15 -aI729 -aI-816 -aI742 -aI-776 -aI737 -aI-797 -aa(lp1357 -g15 -aI695 -aI-865 -aI721 -aI-836 -aI710 -aI-852 -aa(lp1358 -g15 -aI636 -aI-884 -aI680 -aI-878 -aI660 -aI-884 -aa(lp1359 -g15 -aI538 -aI-860 -aI600 -aI-884 -aI568 -aI-876 -aa(lp1360 -g15 -aI457 -aI-795 -aI509 -aI-844 -aI481 -aI-823 -aa(lp1361 -g15 -aI392 -aI-699 -aI432 -aI-767 -aI411 -aI-735 -aa(lp1362 -g15 -aI344 -aI-583 -aI373 -aI-662 -aI357 -aI-624 -aa(lp1363 -g15 -aI315 -aI-459 -aI331 -aI-543 -aI322 -aI-501 -aa(lp1364 -g15 -aI305 -aI-336 -aI308 -aI-417 -aI305 -aI-376 -aa(lp1365 -g15 -aI363 -aI-160 -aI305 -aI-260 -aI324 -aI-202 -aa(lp1366 -g15 -aI535 -aI-98 -aI401 -aI-119 -aI459 -aI-98 -aa(lp1367 -g10 -aa(lp1368 -g8 -aI890 -aI0 -aa(lp1369 -g10 -aa(lp1370 -g8 -aI890 -aI0 -aasVG -(lp1371 -(lp1372 -g8 -aI1005 -aI-383 -aa(lp1373 -g20 -aI1003 -aI-383 -aa(lp1374 -g15 -aI961 -aI-380 -aI989 -aI-383 -aI974 -aI-382 -aa(lp1375 -g15 -aI924 -aI-369 -aI947 -aI-378 -aI935 -aI-374 -aa(lp1376 -g15 -aI895 -aI-344 -aI913 -aI-363 -aI903 -aI-355 -aa(lp1377 -g15 -aI877 -aI-302 -aI886 -aI-333 -aI881 -aI-319 -aa(lp1378 -g20 -aI826 -aI-47 -aa(lp1379 -g15 -aI747 -aI-20 -aI799 -aI-37 -aI773 -aI-28 -aa(lp1380 -g15 -aI668 -aI-1 -aI721 -aI-13 -aI695 -aI-6 -aa(lp1381 -g15 -aI586 -aI9 -aI642 -aI3 -aI614 -aI7 -aa(lp1382 -g15 -aI497 -aI13 -aI558 -aI12 -aI528 -aI13 -aa(lp1383 -g15 -aI317 -aI-11 -aI428 -aI13 -aI368 -aI5 -aa(lp1384 -g15 -aI188 -aI-82 -aI265 -aI-27 -aI222 -aI-51 -aa(lp1385 -g15 -aI110 -aI-194 -aI153 -aI-113 -aI127 -aI-150 -aa(lp1386 -g15 -aI83 -aI-343 -aI92 -aI-238 -aI83 -aI-288 -aa(lp1387 -g15 -aI104 -aI-508 -aI83 -aI-400 -aI90 -aI-455 -aa(lp1388 -g15 -aI162 -aI-657 -aI117 -aI-562 -aI136 -aI-611 -aa(lp1389 -g15 -aI254 -aI-783 -aI187 -aI-703 -aI218 -aI-745 -aa(lp1390 -g15 -aI377 -aI-880 -aI291 -aI-821 -aI332 -aI-853 -aa(lp1391 -g15 -aI527 -aI-942 -aI423 -aI-907 -aI473 -aI-928 -aa(lp1392 -g15 -aI701 -aI-965 -aI582 -aI-957 -aI639 -aI-965 -aa(lp1393 -g15 -aI834 -aI-951 -aI752 -aI-965 -aI796 -aI-960 -aa(lp1394 -g15 -aI929 -aI-915 -aI872 -aI-942 -aI903 -aI-930 -aa(lp1395 -g15 -aI985 -aI-864 -aI954 -aI-900 -aI972 -aI-883 -aa(lp1396 -g15 -aI1003 -aI-806 -aI997 -aI-845 -aI1003 -aI-826 -aa(lp1397 -g15 -aI988 -aI-757 -aI1003 -aI-788 -aI998 -aI-772 -aa(lp1398 -g15 -aI947 -aI-718 -aI978 -aI-742 -aI964 -aI-729 -aa(lp1399 -g15 -aI885 -aI-692 -aI929 -aI-707 -aI909 -aI-698 -aa(lp1400 -g15 -aI810 -aI-682 -aI862 -aI-685 -aI837 -aI-682 -aa(lp1401 -g15 -aI801 -aI-760 -aI810 -aI-710 -aI807 -aI-736 -aa(lp1402 -g15 -aI774 -aI-823 -aI795 -aI-784 -aI786 -aI-805 -aa(lp1403 -g15 -aI727 -aI-864 -aI762 -aI-840 -aI746 -aI-854 -aa(lp1404 -g15 -aI660 -aI-879 -aI708 -aI-874 -aI686 -aI-879 -aa(lp1405 -g15 -aI563 -aI-858 -aI626 -aI-879 -aI593 -aI-872 -aa(lp1406 -g15 -aI477 -aI-800 -aI532 -aI-845 -aI503 -aI-825 -aa(lp1407 -g15 -aI405 -aI-712 -aI450 -aI-776 -aI426 -aI-746 -aa(lp1408 -g15 -aI350 -aI-599 -aI383 -aI-678 -aI365 -aI-640 -aa(lp1409 -g15 -aI315 -aI-469 -aI335 -aI-559 -aI323 -aI-515 -aa(lp1410 -g15 -aI302 -aI-327 -aI306 -aI-423 -aI302 -aI-375 -aa(lp1411 -g15 -aI313 -aI-225 -aI302 -aI-290 -aI306 -aI-256 -aa(lp1412 -g15 -aI349 -aI-146 -aI321 -aI-195 -aI333 -aI-168 -aa(lp1413 -g15 -aI411 -aI-95 -aI365 -aI-124 -aI386 -aI-107 -aa(lp1414 -g15 -aI503 -aI-77 -aI437 -aI-83 -aI467 -aI-77 -aa(lp1415 -g15 -aI566 -aI-82 -aI524 -aI-77 -aI545 -aI-78 -aa(lp1416 -g15 -aI622 -aI-95 -aI587 -aI-85 -aI606 -aI-90 -aa(lp1417 -g20 -aI666 -aI-293 -aa(lp1418 -g15 -aI674 -aI-338 -aI671 -aI-316 -aI674 -aI-331 -aa(lp1419 -g15 -aI667 -aI-361 -aI674 -aI-347 -aI672 -aI-355 -aa(lp1420 -g15 -aI647 -aI-375 -aI662 -aI-367 -aI655 -aI-372 -aa(lp1421 -g15 -aI617 -aI-382 -aI638 -aI-378 -aI628 -aI-380 -aa(lp1422 -g15 -aI578 -aI-383 -aI605 -aI-383 -aI592 -aI-383 -aa(lp1423 -g20 -aI561 -aI-383 -aa(lp1424 -g20 -aI576 -aI-453 -aa(lp1425 -g20 -aI1020 -aI-453 -aa(lp1426 -g10 -aa(lp1427 -g8 -aI1061 -aI0 -aa(lp1428 -g10 -aa(lp1429 -g8 -aI1061 -aI0 -aasVK -(lp1430 -(lp1431 -g8 -aI674 -aI-722 -aa(lp1432 -g15 -aI719 -aI-765 -aI692 -aI-738 -aI707 -aI-752 -aa(lp1433 -g15 -aI746 -aI-800 -aI730 -aI-778 -aI739 -aI-789 -aa(lp1434 -g15 -aI760 -aI-827 -aI753 -aI-810 -aI757 -aI-819 -aa(lp1435 -g15 -aI764 -aI-847 -aI763 -aI-834 -aI764 -aI-841 -aa(lp1436 -g15 -aI751 -aI-873 -aI764 -aI-859 -aI759 -aI-867 -aa(lp1437 -g15 -aI705 -aI-882 -aI742 -aI-879 -aI727 -aI-882 -aa(lp1438 -g20 -aI720 -aI-951 -aa(lp1439 -g20 -aI1080 -aI-951 -aa(lp1440 -g20 -aI1065 -aI-882 -aa(lp1441 -g15 -aI1013 -aI-875 -aI1047 -aI-882 -aI1030 -aI-880 -aa(lp1442 -g15 -aI963 -aI-855 -aI997 -aI-871 -aI980 -aI-864 -aa(lp1443 -g15 -aI910 -aI-821 -aI946 -aI-846 -aI928 -aI-835 -aa(lp1444 -g15 -aI850 -aI-771 -aI892 -aI-807 -aI872 -aI-790 -aa(lp1445 -g20 -aI634 -aI-580 -aa(lp1446 -g20 -aI790 -aI-205 -aa(lp1447 -g15 -aI819 -aI-142 -aI801 -aI-181 -aI811 -aI-160 -aa(lp1448 -g15 -aI847 -aI-100 -aI828 -aI-125 -aI837 -aI-111 -aa(lp1449 -g15 -aI877 -aI-77 -aI856 -aI-90 -aI866 -aI-82 -aa(lp1450 -g15 -aI917 -aI-70 -aI888 -aI-72 -aI902 -aI-70 -aa(lp1451 -g20 -aI921 -aI-70 -aa(lp1452 -g20 -aI908 -aI0 -aa(lp1453 -g20 -aI838 -aI0 -aa(lp1454 -g15 -aI728 -aI-7 -aI794 -aI0 -aI757 -aI-2 -aa(lp1455 -g15 -aI653 -aI-36 -aI698 -aI-13 -aI674 -aI-22 -aa(lp1456 -g15 -aI602 -aI-92 -aI633 -aI-50 -aI616 -aI-69 -aa(lp1457 -g15 -aI559 -aI-183 -aI588 -aI-116 -aI574 -aI-146 -aa(lp1458 -g20 -aI461 -aI-438 -aa(lp1459 -g20 -aI382 -aI-382 -aa(lp1460 -g20 -aI333 -aI-146 -aa(lp1461 -g15 -aI330 -aI-129 -aI332 -aI-141 -aI331 -aI-135 -aa(lp1462 -g15 -aI328 -aI-115 -aI328 -aI-123 -aI328 -aI-118 -aa(lp1463 -g15 -aI335 -aI-92 -aI328 -aI-105 -aI330 -aI-98 -aa(lp1464 -g15 -aI355 -aI-78 -aI340 -aI-86 -aI346 -aI-81 -aa(lp1465 -g15 -aI386 -aI-72 -aI364 -aI-75 -aI374 -aI-73 -aa(lp1466 -g15 -aI425 -aI-70 -aI398 -aI-71 -aI411 -aI-70 -aa(lp1467 -g20 -aI442 -aI-70 -aa(lp1468 -g20 -aI427 -aI0 -aa(lp1469 -g20 -aI-30 -aI0 -aa(lp1470 -g20 -aI-16 -aI-70 -aa(lp1471 -g20 -aI1 -aI-70 -aa(lp1472 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp1473 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp1474 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp1475 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp1476 -g20 -aI259 -aI-789 -aa(lp1477 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp1478 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp1479 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp1480 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp1481 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp1482 -g20 -aI154 -aI-881 -aa(lp1483 -g20 -aI169 -aI-951 -aa(lp1484 -g20 -aI629 -aI-951 -aa(lp1485 -g20 -aI614 -aI-881 -aa(lp1486 -g20 -aI597 -aI-881 -aa(lp1487 -g15 -aI555 -aI-878 -aI582 -aI-881 -aI568 -aI-880 -aa(lp1488 -g15 -aI517 -aI-866 -aI541 -aI-876 -aI528 -aI-872 -aa(lp1489 -g15 -aI488 -aI-841 -aI506 -aI-861 -aI496 -aI-852 -aa(lp1490 -g15 -aI470 -aI-799 -aI480 -aI-831 -aI474 -aI-817 -aa(lp1491 -g20 -aI404 -aI-483 -aa(lp1492 -g10 -aa(lp1493 -g8 -aI988 -aI0 -aa(lp1494 -g10 -aa(lp1495 -g8 -aI988 -aI0 -aasVO -(lp1496 -(lp1497 -g8 -aI83 -aI-354 -aa(lp1498 -g15 -aI99 -aI-488 -aI83 -aI-396 -aI89 -aI-441 -aa(lp1499 -g15 -aI147 -aI-626 -aI110 -aI-535 -aI126 -aI-581 -aa(lp1500 -g15 -aI227 -aI-756 -aI169 -aI-672 -aI195 -aI-715 -aa(lp1501 -g15 -aI337 -aI-864 -aI258 -aI-797 -aI295 -aI-833 -aa(lp1502 -g15 -aI479 -aI-938 -aI379 -aI-895 -aI426 -aI-920 -aa(lp1503 -g15 -aI651 -aI-966 -aI531 -aI-957 -aI589 -aI-966 -aa(lp1504 -g15 -aI791 -aI-944 -aI700 -aI-966 -aI747 -aI-959 -aa(lp1505 -g15 -aI909 -aI-878 -aI836 -aI-930 -aI875 -aI-908 -aa(lp1506 -g15 -aI990 -aI-764 -aI943 -aI-848 -aI970 -aI-810 -aa(lp1507 -g15 -aI1020 -aI-599 -aI1010 -aI-718 -aI1020 -aI-663 -aa(lp1508 -g15 -aI1004 -aI-468 -aI1020 -aI-559 -aI1015 -aI-515 -aa(lp1509 -g15 -aI958 -aI-330 -aI994 -aI-422 -aI979 -aI-376 -aa(lp1510 -g15 -aI881 -aI-200 -aI938 -aI-285 -aI912 -aI-241 -aa(lp1511 -g15 -aI771 -aI-89 -aI850 -aI-158 -aI813 -aI-121 -aa(lp1512 -g15 -aI629 -aI-13 -aI729 -aI-57 -aI682 -aI-32 -aa(lp1513 -g15 -aI455 -aI15 -aI577 -aI5 -aI519 -aI15 -aa(lp1514 -g15 -aI308 -aI-8 -aI403 -aI15 -aI354 -aI7 -aa(lp1515 -g15 -aI191 -aI-78 -aI263 -aI-24 -aI224 -aI-47 -aa(lp1516 -g15 -aI112 -aI-194 -aI157 -aI-110 -aI131 -aI-148 -aa(lp1517 -g15 -aI83 -aI-354 -aI93 -aI-240 -aI83 -aI-294 -aa(lp1518 -g10 -aa(lp1519 -g8 -aI301 -aI-322 -aa(lp1520 -g15 -aI315 -aI-209 -aI301 -aI-278 -aI306 -aI-240 -aa(lp1521 -g15 -aI353 -aI-132 -aI324 -aI-178 -aI337 -aI-152 -aa(lp1522 -g15 -aI411 -aI-87 -aI370 -aI-111 -aI389 -aI-96 -aa(lp1523 -g15 -aI482 -aI-73 -aI433 -aI-77 -aI457 -aI-73 -aa(lp1524 -g15 -aI583 -aI-99 -aI519 -aI-73 -aI552 -aI-82 -aa(lp1525 -g15 -aI664 -aI-171 -aI613 -aI-117 -aI640 -aI-141 -aa(lp1526 -g15 -aI726 -aI-273 -aI687 -aI-200 -aI708 -aI-234 -aa(lp1527 -g15 -aI769 -aI-392 -aI743 -aI-311 -aI758 -aI-351 -aa(lp1528 -g15 -aI795 -aI-516 -aI781 -aI-434 -aI789 -aI-475 -aa(lp1529 -g15 -aI804 -aI-630 -aI801 -aI-557 -aI804 -aI-595 -aa(lp1530 -g15 -aI790 -aI-742 -aI804 -aI-673 -aI799 -aI-711 -aa(lp1531 -g15 -aI752 -aI-819 -aI781 -aI-773 -aI768 -aI-799 -aa(lp1532 -g15 -aI695 -aI-865 -aI737 -aI-840 -aI718 -aI-855 -aa(lp1533 -g15 -aI623 -aI-879 -aI673 -aI-874 -aI649 -aI-879 -aa(lp1534 -g15 -aI523 -aI-853 -aI586 -aI-879 -aI553 -aI-870 -aa(lp1535 -g15 -aI442 -aI-781 -aI492 -aI-835 -aI465 -aI-811 -aa(lp1536 -g15 -aI379 -aI-679 -aI418 -aI-752 -aI397 -aI-717 -aa(lp1537 -g15 -aI335 -aI-559 -aI361 -aI-641 -aI347 -aI-601 -aa(lp1538 -g15 -aI309 -aI-436 -aI324 -aI-518 -aI315 -aI-477 -aa(lp1539 -g15 -aI301 -aI-322 -aI304 -aI-395 -aI301 -aI-357 -aa(lp1540 -g10 -aa(lp1541 -g8 -aI1055 -aI0 -aa(lp1542 -g10 -aa(lp1543 -g8 -aI1055 -aI0 -aasVS -(lp1544 -(lp1545 -g8 -aI348 -aI13 -aa(lp1546 -g15 -aI203 -aI-1 -aI293 -aI13 -aI245 -aI8 -aa(lp1547 -g15 -aI100 -aI-42 -aI162 -aI-11 -aI128 -aI-25 -aa(lp1548 -g15 -aI39 -aI-104 -aI73 -aI-59 -aI53 -aI-80 -aa(lp1549 -g15 -aI18 -aI-181 -aI25 -aI-127 -aI18 -aI-153 -aa(lp1550 -g15 -aI31 -aI-235 -aI18 -aI-202 -aI23 -aI-220 -aa(lp1551 -g15 -aI67 -aI-274 -aI40 -aI-251 -aI51 -aI-264 -aa(lp1552 -g15 -aI122 -aI-298 -aI82 -aI-285 -aI101 -aI-293 -aa(lp1553 -g15 -aI192 -aI-306 -aI143 -aI-303 -aI166 -aI-306 -aa(lp1554 -g15 -aI205 -aI-200 -aI192 -aI-265 -aI196 -aI-230 -aa(lp1555 -g15 -aI241 -aI-125 -aI213 -aI-170 -aI225 -aI-145 -aa(lp1556 -g15 -aI297 -aI-81 -aI257 -aI-105 -aI275 -aI-91 -aa(lp1557 -g15 -aI369 -aI-67 -aI319 -aI-72 -aI343 -aI-67 -aa(lp1558 -g15 -aI436 -aI-77 -aI394 -aI-67 -aI416 -aI-70 -aa(lp1559 -g15 -aI486 -aI-107 -aI455 -aI-85 -aI472 -aI-94 -aa(lp1560 -g15 -aI517 -aI-150 -aI499 -aI-119 -aI510 -aI-134 -aa(lp1561 -g15 -aI527 -aI-204 -aI524 -aI-167 -aI527 -aI-185 -aa(lp1562 -g15 -aI521 -aI-256 -aI527 -aI-223 -aI525 -aI-240 -aa(lp1563 -g15 -aI496 -aI-301 -aI516 -aI-271 -aI508 -aI-286 -aa(lp1564 -g15 -aI445 -aI-346 -aI483 -aI-316 -aI467 -aI-331 -aa(lp1565 -g15 -aI363 -aI-396 -aI424 -aI-361 -aI397 -aI-378 -aa(lp1566 -g15 -aI272 -aI-455 -aI329 -aI-415 -aI298 -aI-435 -aa(lp1567 -g15 -aI206 -aI-521 -aI246 -aI-475 -aI224 -aI-497 -aa(lp1568 -g15 -aI166 -aI-598 -aI189 -aI-544 -aI175 -aI-570 -aa(lp1569 -g15 -aI153 -aI-692 -aI158 -aI-626 -aI153 -aI-657 -aa(lp1570 -g15 -aI177 -aI-802 -aI153 -aI-732 -aI161 -aI-769 -aa(lp1571 -g15 -aI246 -aI-889 -aI193 -aI-836 -aI216 -aI-865 -aa(lp1572 -g15 -aI355 -aI-945 -aI276 -aI-913 -aI312 -aI-931 -aa(lp1573 -g15 -aI498 -aI-965 -aI398 -aI-958 -aI445 -aI-965 -aa(lp1574 -g15 -aI628 -aI-953 -aI548 -aI-965 -aI591 -aI-961 -aa(lp1575 -g15 -aI720 -aI-921 -aI665 -aI-945 -aI695 -aI-934 -aa(lp1576 -g15 -aI775 -aI-873 -aI744 -aI-907 -aI763 -aI-892 -aa(lp1577 -g15 -aI793 -aI-815 -aI787 -aI-855 -aI793 -aI-836 -aa(lp1578 -g15 -aI752 -aI-730 -aI793 -aI-779 -aI779 -aI-750 -aa(lp1579 -g15 -aI618 -aI-699 -aI725 -aI-709 -aI680 -aI-699 -aa(lp1580 -g15 -aI612 -aI-761 -aI618 -aI-719 -aI616 -aI-740 -aa(lp1581 -g15 -aI591 -aI-821 -aI608 -aI-783 -aI601 -aI-803 -aa(lp1582 -g15 -aI551 -aI-866 -aI581 -aI-839 -aI568 -aI-854 -aa(lp1583 -g15 -aI486 -aI-883 -aI534 -aI-877 -aI513 -aI-883 -aa(lp1584 -g15 -aI433 -aI-875 -aI469 -aI-883 -aI451 -aI-880 -aa(lp1585 -g15 -aI386 -aI-849 -aI416 -aI-869 -aI400 -aI-861 -aa(lp1586 -g15 -aI352 -aI-807 -aI372 -aI-838 -aI361 -aI-824 -aa(lp1587 -g15 -aI339 -aI-746 -aI344 -aI-790 -aI339 -aI-769 -aa(lp1588 -g15 -aI350 -aI-686 -aI339 -aI-722 -aI343 -aI-702 -aa(lp1589 -g15 -aI384 -aI-640 -aI358 -aI-669 -aI369 -aI-654 -aa(lp1590 -g15 -aI439 -aI-599 -aI398 -aI-626 -aI417 -aI-612 -aa(lp1591 -g15 -aI517 -aI-555 -aI461 -aI-586 -aI487 -aI-571 -aa(lp1592 -g15 -aI666 -aI-434 -aI584 -aI-519 -aI634 -aI-478 -aa(lp1593 -g15 -aI714 -aI-283 -aI698 -aI-390 -aI714 -aI-340 -aa(lp1594 -g15 -aI689 -aI-157 -aI714 -aI-236 -aI706 -aI-193 -aa(lp1595 -g15 -aI615 -aI-64 -aI671 -aI-120 -aI647 -aI-89 -aa(lp1596 -g15 -aI500 -aI-6 -aI583 -aI-38 -aI545 -aI-19 -aa(lp1597 -g15 -aI348 -aI13 -aI454 -aI6 -aI404 -aI13 -aa(lp1598 -g10 -aa(lp1599 -g8 -aI781 -aI0 -aa(lp1600 -g10 -aa(lp1601 -g8 -aI781 -aI0 -aasVW -(lp1602 -(lp1603 -g8 -aI1541 -aI-881 -aa(lp1604 -g20 -aI1509 -aI-881 -aa(lp1605 -g15 -aI1474 -aI-877 -aI1496 -aI-881 -aI1484 -aI-879 -aa(lp1606 -g15 -aI1446 -aI-862 -aI1464 -aI-874 -aI1455 -aI-869 -aa(lp1607 -g15 -aI1421 -aI-832 -aI1438 -aI-855 -aI1430 -aI-845 -aa(lp1608 -g15 -aI1394 -aI-783 -aI1413 -aI-819 -aI1404 -aI-803 -aa(lp1609 -g20 -aI1021 -aI0 -aa(lp1610 -g20 -aI869 -aI0 -aa(lp1611 -g20 -aI777 -aI-635 -aa(lp1612 -g20 -aI453 -aI0 -aa(lp1613 -g20 -aI287 -aI0 -aa(lp1614 -g20 -aI216 -aI-816 -aa(lp1615 -g15 -aI207 -aI-849 -aI214 -aI-830 -aI211 -aI-841 -aa(lp1616 -g15 -aI188 -aI-869 -aI202 -aI-857 -aI196 -aI-864 -aa(lp1617 -g15 -aI162 -aI-878 -aI180 -aI-874 -aI172 -aI-877 -aa(lp1618 -g15 -aI132 -aI-881 -aI153 -aI-880 -aI143 -aI-881 -aa(lp1619 -g20 -aI114 -aI-881 -aa(lp1620 -g20 -aI129 -aI-951 -aa(lp1621 -g20 -aI565 -aI-951 -aa(lp1622 -g20 -aI550 -aI-881 -aa(lp1623 -g20 -aI520 -aI-881 -aa(lp1624 -g15 -aI451 -aI-870 -aI491 -aI-881 -aI468 -aI-877 -aa(lp1625 -g15 -aI426 -aI-827 -aI434 -aI-863 -aI426 -aI-848 -aa(lp1626 -g15 -aI427 -aI-802 -aI426 -aI-820 -aI426 -aI-811 -aa(lp1627 -g15 -aI429 -aI-769 -aI427 -aI-792 -aI428 -aI-781 -aa(lp1628 -g20 -aI454 -aI-437 -aa(lp1629 -g15 -aI458 -aI-390 -aI455 -aI-425 -aI457 -aI-409 -aa(lp1630 -g15 -aI461 -aI-329 -aI459 -aI-371 -aI460 -aI-350 -aa(lp1631 -g15 -aI464 -aI-266 -aI462 -aI-308 -aI463 -aI-287 -aa(lp1632 -g15 -aI465 -aI-214 -aI465 -aI-246 -aI465 -aI-228 -aa(lp1633 -g15 -aI497 -aI-292 -aI474 -aI-240 -aI485 -aI-266 -aa(lp1634 -g15 -aI535 -aI-371 -aI509 -aI-319 -aI522 -aI-345 -aa(lp1635 -g20 -aI833 -aI-942 -aa(lp1636 -g20 -aI930 -aI-942 -aa(lp1637 -g20 -aI1006 -aI-433 -aa(lp1638 -g15 -aI1022 -aI-312 -aI1012 -aI-391 -aI1017 -aI-350 -aa(lp1639 -g15 -aI1029 -aI-211 -aI1027 -aI-273 -aI1029 -aI-240 -aa(lp1640 -g15 -aI1048 -aI-263 -aI1034 -aI-226 -aI1040 -aI-243 -aa(lp1641 -g15 -aI1072 -aI-325 -aI1055 -aI-282 -aI1063 -aI-303 -aa(lp1642 -g15 -aI1100 -aI-392 -aI1081 -aI-347 -aI1090 -aI-369 -aa(lp1643 -g15 -aI1130 -aI-458 -aI1110 -aI-414 -aI1120 -aI-436 -aa(lp1644 -g20 -aI1278 -aI-776 -aa(lp1645 -g15 -aI1293 -aI-814 -aI1284 -aI-789 -aI1289 -aI-802 -aa(lp1646 -g15 -aI1298 -aI-847 -aI1296 -aI-827 -aI1298 -aI-838 -aa(lp1647 -g15 -aI1281 -aI-874 -aI1298 -aI-860 -aI1292 -aI-869 -aa(lp1648 -g15 -aI1225 -aI-881 -aI1269 -aI-878 -aI1250 -aI-881 -aa(lp1649 -g20 -aI1194 -aI-881 -aa(lp1650 -g20 -aI1207 -aI-951 -aa(lp1651 -g20 -aI1555 -aI-951 -aa(lp1652 -g10 -aa(lp1653 -g8 -aI1422 -aI0 -aa(lp1654 -g10 -aa(lp1655 -g8 -aI1422 -aI0 -aasV[ -(lp1656 -(lp1657 -g8 -aI27 -aI171 -aa(lp1658 -g20 -aI279 -aI-1012 -aa(lp1659 -g20 -aI649 -aI-1012 -aa(lp1660 -g20 -aI634 -aI-942 -aa(lp1661 -g20 -aI577 -aI-942 -aa(lp1662 -g15 -aI534 -aI-939 -aI562 -aI-942 -aI548 -aI-941 -aa(lp1663 -g15 -aI496 -aI-925 -aI521 -aI-936 -aI508 -aI-932 -aa(lp1664 -g15 -aI466 -aI-896 -aI485 -aI-918 -aI474 -aI-909 -aa(lp1665 -g15 -aI446 -aI-845 -aI457 -aI-884 -aI450 -aI-867 -aa(lp1666 -g20 -aI266 -aI4 -aa(lp1667 -g15 -aI263 -aI22 -aI265 -aI11 -aI264 -aI17 -aa(lp1668 -g15 -aI262 -aI37 -aI262 -aI27 -aI262 -aI32 -aa(lp1669 -g15 -aI269 -aI70 -aI262 -aI51 -aI264 -aI62 -aa(lp1670 -g15 -aI289 -aI89 -aI274 -aI79 -aI280 -aI85 -aa(lp1671 -g15 -aI319 -aI98 -aI297 -aI93 -aI307 -aI96 -aa(lp1672 -g15 -aI354 -aI100 -aI330 -aI99 -aI342 -aI100 -aa(lp1673 -g20 -aI412 -aI100 -aa(lp1674 -g20 -aI397 -aI171 -aa(lp1675 -g10 -aa(lp1676 -g8 -aI552 -aI0 -aa(lp1677 -g10 -aa(lp1678 -g8 -aI552 -aI0 -aasV_ -(lp1679 -(lp1680 -g8 -aI502 -aI189 -aa(lp1681 -g20 -aI-121 -aI189 -aa(lp1682 -g20 -aI-104 -aI111 -aa(lp1683 -g20 -aI520 -aI111 -aa(lp1684 -g10 -aa(lp1685 -g8 -aI611 -aI0 -aa(lp1686 -g10 -aa(lp1687 -g8 -aI611 -aI0 -aasVc -(lp1688 -(lp1689 -g8 -aI404 -aI-87 -aa(lp1690 -g15 -aI467 -aI-96 -aI427 -aI-87 -aI448 -aI-90 -aa(lp1691 -g15 -aI518 -aI-121 -aI486 -aI-103 -aI503 -aI-111 -aa(lp1692 -g15 -aI559 -aI-157 -aI534 -aI-132 -aI547 -aI-144 -aa(lp1693 -g15 -aI590 -aI-196 -aI570 -aI-170 -aI581 -aI-183 -aa(lp1694 -g15 -aI604 -aI-173 -aI596 -aI-191 -aI600 -aI-183 -aa(lp1695 -g15 -aI610 -aI-138 -aI608 -aI-163 -aI610 -aI-151 -aa(lp1696 -g15 -aI595 -aI-85 -aI610 -aI-120 -aI605 -aI-103 -aa(lp1697 -g15 -aI547 -aI-36 -aI585 -aI-67 -aI569 -aI-50 -aa(lp1698 -g15 -aI466 -aI0 -aI526 -aI-21 -aI499 -aI-9 -aa(lp1699 -g15 -aI348 -aI13 -aI433 -aI8 -aI393 -aI13 -aa(lp1700 -g15 -aI234 -aI-3 -aI307 -aI13 -aI269 -aI7 -aa(lp1701 -g15 -aI140 -aI-54 -aI198 -aI-14 -aI166 -aI-31 -aa(lp1702 -g15 -aI76 -aI-140 -aI113 -aI-77 -aI92 -aI-106 -aa(lp1703 -g15 -aI53 -aI-261 -aI61 -aI-175 -aI53 -aI-215 -aa(lp1704 -g15 -aI65 -aI-365 -aI53 -aI-294 -aI57 -aI-329 -aa(lp1705 -g15 -aI102 -aI-470 -aI74 -aI-400 -aI86 -aI-436 -aa(lp1706 -g15 -aI164 -aI-568 -aI119 -aI-505 -aI139 -aI-537 -aa(lp1707 -g15 -aI250 -aI-650 -aI188 -aI-599 -aI217 -aI-627 -aa(lp1708 -g15 -aI359 -aI-706 -aI282 -aI-674 -aI319 -aI-692 -aa(lp1709 -g15 -aI492 -aI-727 -aI399 -aI-720 -aI444 -aI-727 -aa(lp1710 -g15 -aI587 -aI-716 -aI529 -aI-727 -aI560 -aI-723 -aa(lp1711 -g15 -aI653 -aI-685 -aI614 -aI-708 -aI636 -aI-698 -aa(lp1712 -g15 -aI691 -aI-640 -aI670 -aI-672 -aI683 -aI-657 -aa(lp1713 -g15 -aI703 -aI-586 -aI699 -aI-623 -aI703 -aI-605 -aa(lp1714 -g15 -aI694 -aI-545 -aI703 -aI-572 -aI700 -aI-558 -aa(lp1715 -g15 -aI666 -aI-509 -aI689 -aI-532 -aI679 -aI-520 -aa(lp1716 -g15 -aI616 -aI-483 -aI653 -aI-499 -aI636 -aI-490 -aa(lp1717 -g15 -aI541 -aI-474 -aI595 -aI-477 -aI570 -aI-474 -aa(lp1718 -g15 -aI534 -aI-540 -aI541 -aI-497 -aI538 -aI-519 -aa(lp1719 -g15 -aI516 -aI-596 -aI530 -aI-561 -aI524 -aI-580 -aa(lp1720 -g15 -aI486 -aI-633 -aI508 -aI-612 -aI497 -aI-624 -aa(lp1721 -g15 -aI444 -aI-647 -aI474 -aI-642 -aI460 -aI-647 -aa(lp1722 -g15 -aI390 -aI-628 -aI424 -aI-647 -aI407 -aI-640 -aa(lp1723 -g15 -aI344 -aI-577 -aI373 -aI-615 -aI358 -aI-598 -aa(lp1724 -g15 -aI307 -aI-505 -aI330 -aI-556 -aI318 -aI-532 -aa(lp1725 -g15 -aI280 -aI-421 -aI296 -aI-477 -aI287 -aI-449 -aa(lp1726 -g15 -aI263 -aI-335 -aI272 -aI-392 -aI266 -aI-363 -aa(lp1727 -g15 -aI257 -aI-259 -aI259 -aI-307 -aI257 -aI-282 -aa(lp1728 -g15 -aI294 -aI-132 -aI257 -aI-205 -aI269 -aI-162 -aa(lp1729 -g15 -aI404 -aI-87 -aI319 -aI-102 -aI355 -aI-87 -aa(lp1730 -g10 -aa(lp1731 -g8 -aI703 -aI0 -aa(lp1732 -g10 -aa(lp1733 -g8 -aI703 -aI0 -aasVg -(lp1734 -(lp1735 -g8 -aI118 -aI-438 -aa(lp1736 -g15 -aI138 -aI-535 -aI118 -aI-469 -aI125 -aI-501 -aa(lp1737 -g15 -aI200 -aI-629 -aI152 -aI-569 -aI173 -aI-601 -aa(lp1738 -g15 -aI304 -aI-699 -aI228 -aI-657 -aI263 -aI-681 -aa(lp1739 -g15 -aI451 -aI-727 -aI346 -aI-718 -aI395 -aI-727 -aa(lp1740 -g15 -aI534 -aI-717 -aI481 -aI-727 -aI509 -aI-724 -aa(lp1741 -g15 -aI602 -aI-685 -aI560 -aI-710 -aI583 -aI-699 -aa(lp1742 -g15 -aI634 -aI-720 -aI612 -aI-697 -aI623 -aI-709 -aa(lp1743 -g15 -aI670 -aI-749 -aI646 -aI-731 -aI657 -aI-741 -aa(lp1744 -g15 -aI710 -aI-768 -aI683 -aI-757 -aI696 -aI-763 -aa(lp1745 -g15 -aI757 -aI-775 -aI725 -aI-773 -aI740 -aI-775 -aa(lp1746 -g15 -aI817 -aI-755 -aI784 -aI-775 -aI804 -aI-768 -aa(lp1747 -g15 -aI835 -aI-704 -aI829 -aI-742 -aI835 -aI-725 -aa(lp1748 -g15 -aI831 -aI-671 -aI835 -aI-693 -aI834 -aI-682 -aa(lp1749 -g15 -aI817 -aI-640 -aI828 -aI-660 -aI824 -aI-649 -aa(lp1750 -g15 -aI791 -aI-618 -aI811 -aI-631 -aI802 -aI-624 -aa(lp1751 -g15 -aI750 -aI-610 -aI780 -aI-613 -aI766 -aI-610 -aa(lp1752 -g15 -aI738 -aI-652 -aI750 -aI-628 -aI746 -aI-642 -aa(lp1753 -g15 -aI703 -aI-667 -aI730 -aI-662 -aI718 -aI-667 -aa(lp1754 -g15 -aI670 -aI-661 -aI691 -aI-667 -aI680 -aI-665 -aa(lp1755 -g15 -aI642 -aI-643 -aI660 -aI-656 -aI651 -aI-650 -aa(lp1756 -g15 -aI666 -aI-595 -aI652 -aI-630 -aI660 -aI-614 -aa(lp1757 -g15 -aI675 -aI-536 -aI672 -aI-576 -aI675 -aI-557 -aa(lp1758 -g15 -aI667 -aI-475 -aI675 -aI-517 -aI672 -aI-496 -aa(lp1759 -g15 -aI641 -aI-411 -aI661 -aI-453 -aI653 -aI-432 -aa(lp1760 -g15 -aI598 -aI-350 -aI630 -aI-390 -aI616 -aI-370 -aa(lp1761 -g15 -aI537 -aI-299 -aI581 -aI-331 -aI560 -aI-314 -aa(lp1762 -g15 -aI455 -aI-264 -aI513 -aI-284 -aI486 -aI-273 -aa(lp1763 -g15 -aI354 -aI-251 -aI425 -aI-255 -aI391 -aI-251 -aa(lp1764 -g15 -aI339 -aI-251 -aI350 -aI-251 -aI345 -aI-251 -aa(lp1765 -g15 -aI320 -aI-252 -aI333 -aI-252 -aI326 -aI-252 -aa(lp1766 -g15 -aI301 -aI-253 -aI313 -aI-252 -aI307 -aI-253 -aa(lp1767 -g15 -aI286 -aI-255 -aI295 -aI-253 -aI290 -aI-254 -aa(lp1768 -g15 -aI234 -aI-223 -aI265 -aI-246 -aI248 -aI-235 -aa(lp1769 -g15 -aI213 -aI-185 -aI220 -aI-211 -aI213 -aI-198 -aa(lp1770 -g15 -aI219 -aI-166 -aI213 -aI-177 -aI215 -aI-171 -aa(lp1771 -g15 -aI234 -aI-155 -aI222 -aI-162 -aI227 -aI-158 -aa(lp1772 -g15 -aI256 -aI-148 -aI240 -aI-152 -aI247 -aI-150 -aa(lp1773 -g15 -aI285 -aI-144 -aI265 -aI-146 -aI274 -aI-145 -aa(lp1774 -g20 -aI434 -aI-130 -aa(lp1775 -g15 -aI586 -aI-77 -aI500 -aI-124 -aI550 -aI-106 -aa(lp1776 -g15 -aI641 -aI51 -aI623 -aI-48 -aI641 -aI-5 -aa(lp1777 -g15 -aI613 -aI161 -aI641 -aI91 -aI632 -aI128 -aa(lp1778 -g15 -aI532 -aI246 -aI595 -aI194 -aI568 -aI223 -aa(lp1779 -g15 -aI402 -aI301 -aI497 -aI269 -aI454 -aI288 -aa(lp1780 -g15 -aI226 -aI320 -aI351 -aI314 -aI292 -aI320 -aa(lp1781 -g15 -aI87 -aI308 -aI172 -aI320 -aI125 -aI316 -aa(lp1782 -g15 -aI-6 -aI274 -aI49 -aI300 -aI17 -aI289 -aa(lp1783 -g15 -aI-60 -aI220 -aI-30 -aI259 -aI-48 -aI241 -aa(lp1784 -g15 -aI-77 -aI150 -aI-71 -aI199 -aI-77 -aI176 -aa(lp1785 -g15 -aI-59 -aI87 -aI-77 -aI127 -aI-71 -aI106 -aa(lp1786 -g15 -aI-11 -aI37 -aI-47 -aI67 -aI-31 -aI51 -aa(lp1787 -g15 -aI56 -aI1 -aI8 -aI23 -aI31 -aI11 -aa(lp1788 -g15 -aI136 -aI-19 -aI82 -aI-7 -aI108 -aI-14 -aa(lp1789 -g15 -aI110 -aI-37 -aI127 -aI-24 -aI118 -aI-30 -aa(lp1790 -g15 -aI88 -aI-63 -aI102 -aI-45 -aI95 -aI-53 -aa(lp1791 -g15 -aI73 -aI-94 -aI82 -aI-73 -aI77 -aI-83 -aa(lp1792 -g15 -aI67 -aI-129 -aI69 -aI-105 -aI67 -aI-117 -aa(lp1793 -g15 -aI76 -aI-168 -aI67 -aI-142 -aI70 -aI-156 -aa(lp1794 -g15 -aI102 -aI-203 -aI81 -aI-180 -aI90 -aI-192 -aa(lp1795 -g15 -aI147 -aI-239 -aI113 -aI-215 -aI128 -aI-227 -aa(lp1796 -g15 -aI212 -aI-278 -aI165 -aI-251 -aI187 -aI-264 -aa(lp1797 -g15 -aI143 -aI-340 -aI182 -aI-292 -aI159 -aI-312 -aa(lp1798 -g15 -aI118 -aI-438 -aI126 -aI-367 -aI118 -aI-400 -aa(lp1799 -g10 -aa(lp1800 -g8 -aI469 -aI113 -aa(lp1801 -g15 -aI440 -aI55 -aI469 -aI88 -aI459 -aI69 -aa(lp1802 -g15 -aI342 -aI29 -aI421 -aI42 -aI388 -aI33 -aa(lp1803 -g20 -aI223 -aI19 -aa(lp1804 -g15 -aI168 -aI34 -aI204 -aI21 -aI186 -aI26 -aa(lp1805 -g15 -aI123 -aI61 -aI151 -aI41 -aI136 -aI50 -aa(lp1806 -g15 -aI92 -aI98 -aI110 -aI72 -aI100 -aI84 -aa(lp1807 -g15 -aI81 -aI141 -aI85 -aI112 -aI81 -aI126 -aa(lp1808 -g15 -aI88 -aI180 -aI81 -aI155 -aI83 -aI168 -aa(lp1809 -g15 -aI114 -aI211 -aI93 -aI192 -aI102 -aI202 -aa(lp1810 -g15 -aI165 -aI232 -aI127 -aI220 -aI144 -aI227 -aa(lp1811 -g15 -aI246 -aI240 -aI187 -aI238 -aI214 -aI240 -aa(lp1812 -g15 -aI347 -aI230 -aI285 -aI240 -aI319 -aI237 -aa(lp1813 -g15 -aI416 -aI202 -aI375 -aI223 -aI398 -aI213 -aa(lp1814 -g15 -aI456 -aI161 -aI434 -aI190 -aI447 -aI176 -aa(lp1815 -g15 -aI469 -aI113 -aI465 -aI146 -aI469 -aI130 -aa(lp1816 -g10 -aa(lp1817 -g8 -aI358 -aI-332 -aa(lp1818 -g15 -aI401 -aI-343 -aI374 -aI-332 -aI388 -aI-336 -aa(lp1819 -g15 -aI436 -aI-373 -aI414 -aI-351 -aI426 -aI-361 -aa(lp1820 -g15 -aI464 -aI-414 -aI447 -aI-385 -aI456 -aI-399 -aa(lp1821 -g15 -aI483 -aI-462 -aI472 -aI-429 -aI478 -aI-445 -aa(lp1822 -g15 -aI494 -aI-510 -aI488 -aI-478 -aI492 -aI-495 -aa(lp1823 -g15 -aI498 -aI-554 -aI497 -aI-526 -aI498 -aI-541 -aa(lp1824 -g15 -aI480 -aI-622 -aI498 -aI-585 -aI492 -aI-608 -aa(lp1825 -g15 -aI426 -aI-644 -aI467 -aI-637 -aI449 -aI-644 -aa(lp1826 -g15 -aI365 -aI-621 -aI403 -aI-644 -aI383 -aI-637 -aa(lp1827 -g15 -aI322 -aI-565 -aI348 -aI-606 -aI333 -aI-587 -aa(lp1828 -g15 -aI295 -aI-493 -aI310 -aI-542 -aI301 -aI-518 -aa(lp1829 -g15 -aI286 -aI-424 -aI289 -aI-467 -aI286 -aI-445 -aa(lp1830 -g15 -aI305 -aI-354 -aI286 -aI-392 -aI292 -aI-368 -aa(lp1831 -g15 -aI358 -aI-332 -aI317 -aI-340 -aI335 -aI-332 -aa(lp1832 -g10 -aa(lp1833 -g8 -aI773 -aI0 -aa(lp1834 -g10 -aa(lp1835 -g8 -aI773 -aI0 -aasVk -(lp1836 -(lp1837 -g8 -aI285 -aI-265 -aa(lp1838 -g20 -aI227 -aI0 -aa(lp1839 -g20 -aI27 -aI0 -aa(lp1840 -g20 -aI203 -aI-828 -aa(lp1841 -g15 -aI207 -aI-846 -aI205 -aI-834 -aI206 -aI-840 -aa(lp1842 -g15 -aI210 -aI-863 -aI208 -aI-852 -aI210 -aI-858 -aa(lp1843 -g15 -aI212 -aI-877 -aI211 -aI-869 -aI212 -aI-873 -aa(lp1844 -g15 -aI213 -aI-886 -aI213 -aI-881 -aI213 -aI-884 -aa(lp1845 -g15 -aI209 -aI-915 -aI213 -aI-898 -aI212 -aI-908 -aa(lp1846 -g15 -aI197 -aI-932 -aI207 -aI-922 -aI202 -aI-928 -aa(lp1847 -g15 -aI175 -aI-940 -aI191 -aI-936 -aI184 -aI-939 -aa(lp1848 -g15 -aI142 -aI-942 -aI166 -aI-941 -aI155 -aI-942 -aa(lp1849 -g20 -aI114 -aI-942 -aa(lp1850 -g20 -aI126 -aI-1012 -aa(lp1851 -g20 -aI449 -aI-1012 -aa(lp1852 -g20 -aI378 -aI-687 -aa(lp1853 -g15 -aI358 -aI-593 -aI371 -aI-652 -aI364 -aI-621 -aa(lp1854 -g15 -aI340 -aI-515 -aI352 -aI-566 -aI346 -aI-539 -aa(lp1855 -g15 -aI322 -aI-440 -aI334 -aI-490 -aI328 -aI-465 -aa(lp1856 -g15 -aI301 -aI-359 -aI316 -aI-416 -aI309 -aI-389 -aa(lp1857 -g20 -aI509 -aI-547 -aa(lp1858 -g15 -aI535 -aI-573 -aI519 -aI-557 -aI528 -aI-565 -aa(lp1859 -g15 -aI550 -aI-592 -aI541 -aI-580 -aI546 -aI-586 -aa(lp1860 -g15 -aI557 -aI-606 -aI554 -aI-597 -aI556 -aI-602 -aa(lp1861 -g15 -aI559 -aI-618 -aI559 -aI-610 -aI559 -aI-614 -aa(lp1862 -g15 -aI543 -aI-639 -aI559 -aI-627 -aI554 -aI-634 -aa(lp1863 -g15 -aI497 -aI-647 -aI532 -aI-644 -aI517 -aI-647 -aa(lp1864 -g20 -aI510 -aI-714 -aa(lp1865 -g20 -aI846 -aI-714 -aa(lp1866 -g20 -aI833 -aI-647 -aa(lp1867 -g15 -aI736 -aI-620 -aI802 -aI-647 -aI770 -aI-638 -aa(lp1868 -g15 -aI621 -aI-534 -aI702 -aI-602 -aI664 -aI-573 -aa(lp1869 -g20 -aI514 -aI-435 -aa(lp1870 -g20 -aI614 -aI-218 -aa(lp1871 -g15 -aI656 -aI-142 -aI628 -aI-187 -aI642 -aI-161 -aa(lp1872 -g15 -aI694 -aI-97 -aI669 -aI-123 -aI682 -aI-108 -aa(lp1873 -g15 -aI726 -aI-76 -aI705 -aI-87 -aI716 -aI-79 -aa(lp1874 -g15 -aI753 -aI-70 -aI736 -aI-72 -aI745 -aI-70 -aa(lp1875 -g20 -aI758 -aI-70 -aa(lp1876 -g20 -aI744 -aI0 -aa(lp1877 -g20 -aI675 -aI0 -aa(lp1878 -g15 -aI588 -aI-6 -aI643 -aI0 -aI614 -aI-1 -aa(lp1879 -g15 -aI520 -aI-28 -aI562 -aI-10 -aI540 -aI-18 -aa(lp1880 -g15 -aI470 -aI-67 -aI501 -aI-38 -aI484 -aI-51 -aa(lp1881 -g15 -aI436 -aI-125 -aI456 -aI-83 -aI445 -aI-102 -aa(lp1882 -g20 -aI357 -aI-311 -aa(lp1883 -g10 -aa(lp1884 -g8 -aI796 -aI0 -aa(lp1885 -g10 -aa(lp1886 -g8 -aI796 -aI0 -aasVo -(lp1887 -(lp1888 -g8 -aI53 -aI-266 -aa(lp1889 -g15 -aI65 -aI-369 -aI53 -aI-299 -aI57 -aI-334 -aa(lp1890 -g15 -aI100 -aI-474 -aI72 -aI-405 -aI84 -aI-440 -aa(lp1891 -g15 -aI160 -aI-572 -aI116 -aI-509 -aI136 -aI-541 -aa(lp1892 -g15 -aI244 -aI-652 -aI184 -aI-602 -aI212 -aI-629 -aa(lp1893 -g15 -aI354 -aI-707 -aI276 -aI-675 -aI313 -aI-693 -aa(lp1894 -g15 -aI490 -aI-727 -aI395 -aI-720 -aI440 -aI-727 -aa(lp1895 -g15 -aI598 -aI-711 -aI529 -aI-727 -aI565 -aI-722 -aa(lp1896 -g15 -aI687 -aI-661 -aI632 -aI-700 -aI662 -aI-684 -aa(lp1897 -g15 -aI747 -aI-574 -aI712 -aI-639 -aI732 -aI-610 -aa(lp1898 -g15 -aI769 -aI-447 -aI762 -aI-539 -aI769 -aI-496 -aa(lp1899 -g15 -aI758 -aI-346 -aI769 -aI-415 -aI765 -aI-381 -aa(lp1900 -g15 -aI724 -aI-242 -aI751 -aI-311 -aI739 -aI-276 -aa(lp1901 -g15 -aI665 -aI-145 -aI708 -aI-208 -aI689 -aI-176 -aa(lp1902 -g15 -aI582 -aI-63 -aI642 -aI-114 -aI614 -aI-86 -aa(lp1903 -g15 -aI472 -aI-7 -aI549 -aI-39 -aI513 -aI-21 -aa(lp1904 -g15 -aI335 -aI13 -aI431 -aI6 -aI386 -aI13 -aa(lp1905 -g15 -aI221 -aI-3 -aI294 -aI13 -aI256 -aI7 -aa(lp1906 -g15 -aI132 -aI-55 -aI186 -aI-15 -aI156 -aI-32 -aa(lp1907 -g15 -aI74 -aI-143 -aI107 -aI-79 -aI88 -aI-108 -aa(lp1908 -g15 -aI53 -aI-266 -aI60 -aI-178 -aI53 -aI-219 -aa(lp1909 -g10 -aa(lp1910 -g8 -aI360 -aI-82 -aa(lp1911 -g15 -aI424 -aI-102 -aI383 -aI-82 -aI405 -aI-89 -aa(lp1912 -g15 -aI476 -aI-156 -aI444 -aI-116 -aI461 -aI-134 -aa(lp1913 -g15 -aI516 -aI-233 -aI492 -aI-179 -aI505 -aI-204 -aa(lp1914 -g15 -aI544 -aI-321 -aI528 -aI-261 -aI537 -aI-291 -aa(lp1915 -g15 -aI560 -aI-411 -aI551 -aI-352 -aI557 -aI-382 -aa(lp1916 -g15 -aI566 -aI-490 -aI564 -aI-440 -aI566 -aI-466 -aa(lp1917 -g15 -aI539 -aI-603 -aI566 -aI-542 -aI557 -aI-580 -aa(lp1918 -g15 -aI465 -aI-638 -aI521 -aI-626 -aI496 -aI-638 -aa(lp1919 -g15 -aI402 -aI-618 -aI442 -aI-638 -aI422 -aI-631 -aa(lp1920 -g15 -aI351 -aI-566 -aI383 -aI-605 -aI366 -aI-588 -aa(lp1921 -g15 -aI310 -aI-492 -aI335 -aI-544 -aI322 -aI-520 -aa(lp1922 -g15 -aI280 -aI-405 -aI298 -aI-464 -aI288 -aI-435 -aa(lp1923 -g15 -aI263 -aI-315 -aI272 -aI-375 -aI266 -aI-345 -aa(lp1924 -g15 -aI257 -aI-233 -aI259 -aI-285 -aI257 -aI-258 -aa(lp1925 -g15 -aI284 -aI-117 -aI257 -aI-179 -aI266 -aI-140 -aa(lp1926 -g15 -aI360 -aI-82 -aI302 -aI-93 -aI327 -aI-82 -aa(lp1927 -g10 -aa(lp1928 -g8 -aI824 -aI0 -aa(lp1929 -g10 -aa(lp1930 -g8 -aI824 -aI0 -aasVs -(lp1931 -(lp1932 -g8 -aI297 -aI-65 -aa(lp1933 -g15 -aI348 -aI-72 -aI315 -aI-65 -aI332 -aI-68 -aa(lp1934 -g15 -aI388 -aI-92 -aI363 -aI-77 -aI377 -aI-83 -aa(lp1935 -g15 -aI415 -aI-123 -aI399 -aI-100 -aI408 -aI-111 -aa(lp1936 -g15 -aI425 -aI-166 -aI421 -aI-135 -aI425 -aI-150 -aa(lp1937 -g15 -aI416 -aI-206 -aI425 -aI-181 -aI422 -aI-194 -aa(lp1938 -g15 -aI388 -aI-239 -aI410 -aI-218 -aI401 -aI-229 -aa(lp1939 -g15 -aI342 -aI-269 -aI376 -aI-249 -aI361 -aI-259 -aa(lp1940 -g15 -aI274 -aI-303 -aI323 -aI-279 -aI300 -aI-290 -aa(lp1941 -g15 -aI204 -aI-342 -aI248 -aI-315 -aI225 -aI-328 -aa(lp1942 -g15 -aI150 -aI-388 -aI183 -aI-356 -aI165 -aI-371 -aa(lp1943 -g15 -aI116 -aI-445 -aI135 -aI-405 -aI124 -aI-424 -aa(lp1944 -g15 -aI104 -aI-515 -aI108 -aI-466 -aI104 -aI-489 -aa(lp1945 -g15 -aI125 -aI-603 -aI104 -aI-548 -aI111 -aI-577 -aa(lp1946 -g15 -aI184 -aI-670 -aI138 -aI-629 -aI158 -aI-651 -aa(lp1947 -g15 -aI279 -aI-712 -aI210 -aI-688 -aI242 -aI-702 -aa(lp1948 -g15 -aI405 -aI-727 -aI316 -aI-722 -aI358 -aI-727 -aa(lp1949 -g15 -aI519 -aI-716 -aI450 -aI-727 -aI488 -aI-723 -aa(lp1950 -g15 -aI594 -aI-689 -aI550 -aI-710 -aI575 -aI-700 -aa(lp1951 -g15 -aI636 -aI-649 -aI614 -aI-677 -aI627 -aI-664 -aa(lp1952 -g15 -aI649 -aI-602 -aI644 -aI-634 -aI649 -aI-618 -aa(lp1953 -g15 -aI608 -aI-524 -aI649 -aI-566 -aI635 -aI-540 -aa(lp1954 -g15 -aI496 -aI-500 -aI580 -aI-508 -aI543 -aI-500 -aa(lp1955 -g15 -aI490 -aI-554 -aI496 -aI-518 -aI494 -aI-536 -aa(lp1956 -g15 -aI473 -aI-603 -aI487 -aI-572 -aI481 -aI-588 -aa(lp1957 -g15 -aI441 -aI-639 -aI465 -aI-618 -aI454 -aI-630 -aa(lp1958 -g15 -aI393 -aI-653 -aI428 -aI-648 -aI412 -aI-653 -aa(lp1959 -g15 -aI346 -aI-645 -aI375 -aI-653 -aI360 -aI-650 -aa(lp1960 -g15 -aI311 -aI-625 -aI333 -aI-640 -aI321 -aI-633 -aa(lp1961 -g15 -aI289 -aI-595 -aI301 -aI-617 -aI294 -aI-607 -aa(lp1962 -g15 -aI281 -aI-559 -aI283 -aI-584 -aI281 -aI-572 -aa(lp1963 -g15 -aI290 -aI-521 -aI281 -aI-544 -aI284 -aI-531 -aa(lp1964 -g15 -aI317 -aI-490 -aI295 -aI-510 -aI305 -aI-499 -aa(lp1965 -g15 -aI364 -aI-462 -aI329 -aI-480 -aI345 -aI-471 -aa(lp1966 -g15 -aI432 -aI-430 -aI383 -aI-452 -aI406 -aI-442 -aa(lp1967 -g15 -aI506 -aI-389 -aI460 -aI-417 -aI485 -aI-403 -aa(lp1968 -g15 -aI558 -aI-341 -aI527 -aI-374 -aI544 -aI-358 -aa(lp1969 -g15 -aI588 -aI-285 -aI571 -aI-324 -aI582 -aI-305 -aa(lp1970 -g15 -aI598 -aI-218 -aI595 -aI-265 -aI598 -aI-243 -aa(lp1971 -g15 -aI578 -aI-121 -aI598 -aI-182 -aI592 -aI-149 -aa(lp1972 -g15 -aI516 -aI-48 -aI564 -aI-92 -aI544 -aI-68 -aa(lp1973 -g15 -aI415 -aI-2 -aI489 -aI-28 -aI455 -aI-13 -aa(lp1974 -g15 -aI274 -aI13 -aI374 -aI8 -aI328 -aI13 -aa(lp1975 -g15 -aI170 -aI3 -aI236 -aI13 -aI201 -aI10 -aa(lp1976 -g15 -aI91 -aI-24 -aI139 -aI-2 -aI113 -aI-12 -aa(lp1977 -g15 -aI40 -aI-71 -aI69 -aI-37 -aI52 -aI-52 -aa(lp1978 -g15 -aI22 -aI-133 -aI28 -aI-89 -aI22 -aI-110 -aa(lp1979 -g15 -aI35 -aI-185 -aI22 -aI-153 -aI26 -aI-171 -aa(lp1980 -g15 -aI67 -aI-220 -aI43 -aI-200 -aI54 -aI-211 -aa(lp1981 -g15 -aI112 -aI-240 -aI80 -aI-229 -aI95 -aI-235 -aa(lp1982 -g15 -aI165 -aI-246 -aI130 -aI-244 -aI147 -aI-246 -aa(lp1983 -g15 -aI172 -aI-177 -aI165 -aI-222 -aI167 -aI-199 -aa(lp1984 -g15 -aI195 -aI-120 -aI177 -aI-156 -aI184 -aI-137 -aa(lp1985 -g15 -aI236 -aI-80 -aI205 -aI-103 -aI219 -aI-90 -aa(lp1986 -g15 -aI297 -aI-65 -aI252 -aI-70 -aI273 -aI-65 -aa(lp1987 -g10 -aa(lp1988 -g8 -aI685 -aI0 -aa(lp1989 -g10 -aa(lp1990 -g8 -aI685 -aI0 -aasVw -(lp1991 -(lp1992 -g8 -aI1136 -aI-614 -aa(lp1993 -g15 -aI1106 -aI-468 -aI1136 -aI-568 -aI1126 -aI-519 -aa(lp1994 -g15 -aI1028 -aI-311 -aI1087 -aI-417 -aI1061 -aI-364 -aa(lp1995 -g15 -aI916 -aI-152 -aI996 -aI-258 -aI958 -aI-205 -aa(lp1996 -g15 -aI786 -aI0 -aI874 -aI-100 -aI831 -aI-49 -aa(lp1997 -g20 -aI623 -aI13 -aa(lp1998 -g15 -aI622 -aI-75 -aI623 -aI-13 -aI623 -aI-43 -aa(lp1999 -g15 -aI620 -aI-174 -aI622 -aI-107 -aI621 -aI-140 -aa(lp2000 -g15 -aI618 -aI-275 -aI620 -aI-207 -aI619 -aI-241 -aa(lp2001 -g15 -aI616 -aI-372 -aI618 -aI-309 -aI617 -aI-341 -aa(lp2002 -g15 -aI613 -aI-457 -aI615 -aI-403 -aI614 -aI-431 -aa(lp2003 -g15 -aI611 -aI-524 -aI613 -aI-483 -aI612 -aI-506 -aa(lp2004 -g15 -aI492 -aI-268 -aI577 -aI-442 -aI537 -aI-356 -aa(lp2005 -g15 -aI337 -aI-3 -aI448 -aI-179 -aI396 -aI-91 -aa(lp2006 -g20 -aI162 -aI8 -aa(lp2007 -g20 -aI149 -aI-546 -aa(lp2008 -g15 -aI141 -aI-595 -aI148 -aI-566 -aI146 -aI-583 -aa(lp2009 -g15 -aI122 -aI-625 -aI136 -aI-608 -aI130 -aI-618 -aa(lp2010 -g15 -aI93 -aI-639 -aI114 -aI-632 -aI104 -aI-637 -aa(lp2011 -g15 -aI57 -aI-643 -aI82 -aI-642 -aI70 -aI-643 -aa(lp2012 -g20 -aI49 -aI-643 -aa(lp2013 -g20 -aI70 -aI-714 -aa(lp2014 -g20 -aI328 -aI-714 -aa(lp2015 -g15 -aI335 -aI-581 -aI330 -aI-670 -aI333 -aI-625 -aa(lp2016 -g15 -aI340 -aI-458 -aI337 -aI-537 -aI339 -aI-496 -aa(lp2017 -g15 -aI343 -aI-354 -aI341 -aI-419 -aI342 -aI-385 -aa(lp2018 -g15 -aI345 -aI-282 -aI344 -aI-324 -aI345 -aI-299 -aa(lp2019 -g15 -aI344 -aI-200 -aI345 -aI-248 -aI344 -aI-221 -aa(lp2020 -g15 -aI343 -aI-166 -aI343 -aI-179 -aI343 -aI-168 -aa(lp2021 -g20 -aI353 -aI-166 -aa(lp2022 -g15 -aI419 -aI-281 -aI375 -aI-201 -aI397 -aI-239 -aa(lp2023 -g15 -aI485 -aI-412 -aI442 -aI-323 -aI463 -aI-366 -aa(lp2024 -g15 -aI549 -aI-555 -aI507 -aI-458 -aI528 -aI-506 -aa(lp2025 -g15 -aI609 -aI-702 -aI570 -aI-604 -aI590 -aI-652 -aa(lp2026 -g20 -aI772 -aI-707 -aa(lp2027 -g15 -aI779 -aI-625 -aI774 -aI-685 -aI777 -aI-657 -aa(lp2028 -g15 -aI786 -aI-522 -aI782 -aI-593 -aI784 -aI-559 -aa(lp2029 -g15 -aI792 -aI-411 -aI788 -aI-486 -aI790 -aI-449 -aa(lp2030 -g15 -aI797 -aI-302 -aI794 -aI-372 -aI796 -aI-336 -aa(lp2031 -g15 -aI801 -aI-210 -aI799 -aI-268 -aI800 -aI-237 -aa(lp2032 -g15 -aI802 -aI-146 -aI802 -aI-182 -aI802 -aI-161 -aa(lp2033 -g20 -aI811 -aI-146 -aa(lp2034 -g15 -aI908 -aI-276 -aI850 -aI-194 -aI883 -aI-237 -aa(lp2035 -g15 -aI969 -aI-383 -aI934 -aI-315 -aI954 -aI-350 -aa(lp2036 -g15 -aI1001 -aI-470 -aI984 -aI-415 -aI995 -aI-444 -aa(lp2037 -g15 -aI1010 -aI-542 -aI1007 -aI-496 -aI1010 -aI-520 -aa(lp2038 -g15 -aI1004 -aI-577 -aI1010 -aI-555 -aI1008 -aI-567 -aa(lp2039 -g15 -aI989 -aI-604 -aI1000 -aI-588 -aI995 -aI-597 -aa(lp2040 -g15 -aI968 -aI-622 -aI983 -aI-612 -aI976 -aI-618 -aa(lp2041 -g15 -aI944 -aI-633 -aI960 -aI-627 -aI952 -aI-630 -aa(lp2042 -g15 -aI954 -aI-676 -aI945 -aI-649 -aI948 -aI-664 -aa(lp2043 -g15 -aI976 -aI-705 -aI960 -aI-688 -aI967 -aI-698 -aa(lp2044 -g15 -aI1007 -aI-722 -aI985 -aI-713 -aI995 -aI-718 -aa(lp2045 -g15 -aI1042 -aI-727 -aI1018 -aI-725 -aI1030 -aI-727 -aa(lp2046 -g15 -aI1111 -aI-698 -aI1072 -aI-727 -aI1095 -aI-717 -aa(lp2047 -g15 -aI1136 -aI-614 -aI1127 -aI-678 -aI1136 -aI-650 -aa(lp2048 -g10 -aa(lp2049 -g8 -aI1166 -aI0 -aa(lp2050 -g10 -aa(lp2051 -g8 -aI1166 -aI0 -aasV{ -(lp2052 -(lp2053 -g8 -aI317 -aI167 -aa(lp2054 -g15 -aI174 -aI128 -aI253 -aI167 -aI206 -aI154 -aa(lp2055 -g15 -aI126 -aI21 -aI142 -aI103 -aI126 -aI67 -aa(lp2056 -g15 -aI127 -aI8 -aI126 -aI18 -aI127 -aI13 -aa(lp2057 -g15 -aI128 -aI-8 -aI127 -aI4 -aI128 -aI-1 -aa(lp2058 -g15 -aI132 -aI-34 -aI129 -aI-15 -aI131 -aI-24 -aa(lp2059 -g15 -aI139 -aI-71 -aI134 -aI-44 -aI136 -aI-57 -aa(lp2060 -g20 -aI179 -aI-258 -aa(lp2061 -g15 -aI184 -aI-294 -aI182 -aI-270 -aI184 -aI-282 -aa(lp2062 -g15 -aI174 -aI-337 -aI184 -aI-311 -aI180 -aI-326 -aa(lp2063 -g15 -aI146 -aI-364 -aI167 -aI-348 -aI158 -aI-357 -aa(lp2064 -g15 -aI104 -aI-378 -aI134 -aI-371 -aI120 -aI-375 -aa(lp2065 -g15 -aI52 -aI-383 -aI88 -aI-381 -aI70 -aI-382 -aa(lp2066 -g20 -aI69 -aI-465 -aa(lp2067 -g15 -aI131 -aI-471 -aI91 -aI-465 -aI112 -aI-467 -aa(lp2068 -g15 -aI185 -aI-490 -aI151 -aI-474 -aI169 -aI-481 -aa(lp2069 -g15 -aI225 -aI-527 -aI201 -aI-499 -aI214 -aI-512 -aa(lp2070 -g15 -aI250 -aI-588 -aI237 -aI-543 -aI245 -aI-563 -aa(lp2071 -g20 -aI298 -aI-817 -aa(lp2072 -g15 -aI328 -aI-904 -aI305 -aI-851 -aI315 -aI-880 -aa(lp2073 -g15 -aI379 -aI-965 -aI341 -aI-929 -aI358 -aI-949 -aa(lp2074 -g15 -aI457 -aI-1000 -aI400 -aI-981 -aI426 -aI-993 -aa(lp2075 -g15 -aI567 -aI-1012 -aI488 -aI-1008 -aI525 -aI-1012 -aa(lp2076 -g20 -aI694 -aI-1012 -aa(lp2077 -g20 -aI679 -aI-942 -aa(lp2078 -g20 -aI628 -aI-942 -aa(lp2079 -g15 -aI579 -aI-933 -aI609 -aI-942 -aI592 -aI-939 -aa(lp2080 -g15 -aI545 -aI-909 -aI566 -aI-928 -aI555 -aI-919 -aa(lp2081 -g15 -aI522 -aI-868 -aI536 -aI-898 -aI528 -aI-884 -aa(lp2082 -g15 -aI506 -aI-812 -aI516 -aI-852 -aI511 -aI-833 -aa(lp2083 -g20 -aI457 -aI-586 -aa(lp2084 -g15 -aI402 -aI-486 -aI448 -aI-545 -aI430 -aI-512 -aa(lp2085 -g15 -aI278 -aI-430 -aI374 -aI-461 -aI332 -aI-442 -aa(lp2086 -g20 -aI276 -aI-419 -aa(lp2087 -g15 -aI364 -aI-373 -aI316 -aI-408 -aI346 -aI-393 -aa(lp2088 -g15 -aI393 -aI-299 -aI383 -aI-353 -aI393 -aI-329 -aa(lp2089 -g15 -aI389 -aI-261 -aI393 -aI-287 -aI391 -aI-275 -aa(lp2090 -g20 -aI339 -aI-34 -aa(lp2091 -g15 -aI334 -aI-2 -aI337 -aI-22 -aI335 -aI-12 -aa(lp2092 -g15 -aI333 -aI25 -aI333 -aI7 -aI333 -aI17 -aa(lp2093 -g15 -aI350 -aI78 -aI333 -aI48 -aI338 -aI66 -aa(lp2094 -g15 -aI408 -aI96 -aI361 -aI90 -aI380 -aI96 -aa(lp2095 -g20 -aI460 -aI96 -aa(lp2096 -g20 -aI444 -aI167 -aa(lp2097 -g10 -aa(lp2098 -g8 -aI589 -aI0 -aa(lp2099 -g10 -aa(lp2100 -g8 -aI589 -aI0 -aasV" -(lp2101 -(lp2102 -g8 -aI525 -aI-951 -aa(lp2103 -g20 -aI733 -aI-951 -aa(lp2104 -g20 -aI594 -aI-584 -aa(lp2105 -g20 -aI506 -aI-584 -aa(lp2106 -g10 -aa(lp2107 -g8 -aI234 -aI-951 -aa(lp2108 -g20 -aI442 -aI-951 -aa(lp2109 -g20 -aI290 -aI-584 -aa(lp2110 -g20 -aI202 -aI-584 -aa(lp2111 -g10 -aa(lp2112 -g8 -aI677 -aI0 -aa(lp2113 -g10 -aa(lp2114 -g8 -aI677 -aI0 -aasV& -(lp2115 -(lp2116 -g8 -aI722 -aI0 -aa(lp2117 -g20 -aI656 -aI-91 -aa(lp2118 -g15 -aI527 -aI-15 -aI619 -aI-60 -aI576 -aI-34 -aa(lp2119 -g15 -aI357 -aI13 -aI478 -aI3 -aI422 -aI13 -aa(lp2120 -g15 -aI218 -aI-5 -aI303 -aI13 -aI257 -aI7 -aa(lp2121 -g15 -aI121 -aI-58 -aI179 -aI-17 -aI146 -aI-35 -aa(lp2122 -g15 -aI64 -aI-137 -aI95 -aI-80 -aI76 -aI-107 -aa(lp2123 -g15 -aI45 -aI-237 -aI51 -aI-167 -aI45 -aI-201 -aa(lp2124 -g15 -aI69 -aI-350 -aI45 -aI-281 -aI53 -aI-319 -aa(lp2125 -g15 -aI132 -aI-432 -aI84 -aI-382 -aI105 -aI-409 -aa(lp2126 -g15 -aI224 -aI-491 -aI158 -aI-455 -aI189 -aI-475 -aa(lp2127 -g15 -aI335 -aI-537 -aI259 -aI-508 -aI296 -aI-523 -aa(lp2128 -g15 -aI289 -aI-638 -aI315 -aI-572 -aI300 -aI-605 -aa(lp2129 -g15 -aI273 -aI-735 -aI278 -aI-671 -aI273 -aI-703 -aa(lp2130 -g15 -aI293 -aI-835 -aI273 -aI-773 -aI280 -aI-806 -aa(lp2131 -g15 -aI351 -aI-907 -aI307 -aI-864 -aI326 -aI-888 -aa(lp2132 -g15 -aI445 -aI-950 -aI377 -aI-926 -aI408 -aI-940 -aa(lp2133 -g15 -aI572 -aI-965 -aI482 -aI-960 -aI524 -aI-965 -aa(lp2134 -g15 -aI678 -aI-951 -aI613 -aI-965 -aI648 -aI-960 -aa(lp2135 -g15 -aI751 -aI-914 -aI707 -aI-942 -aI732 -aI-930 -aa(lp2136 -g15 -aI795 -aI-859 -aI771 -aI-899 -aI785 -aI-880 -aa(lp2137 -g15 -aI809 -aI-791 -aI804 -aI-838 -aI809 -aI-816 -aa(lp2138 -g15 -aI795 -aI-710 -aI809 -aI-761 -aI804 -aI-734 -aa(lp2139 -g15 -aI750 -aI-646 -aI786 -aI-687 -aI771 -aI-666 -aa(lp2140 -g15 -aI670 -aI-591 -aI730 -aI-627 -aI703 -aI-608 -aa(lp2141 -g15 -aI549 -aI-535 -aI637 -aI-573 -aI597 -aI-554 -aa(lp2142 -g20 -aI713 -aI-319 -aa(lp2143 -g15 -aI752 -aI-418 -aI728 -aI-351 -aI741 -aI-384 -aa(lp2144 -g15 -aI778 -aI-517 -aI763 -aI-451 -aI772 -aI-484 -aa(lp2145 -g20 -aI789 -aI-567 -aa(lp2146 -g20 -aI1055 -aI-567 -aa(lp2147 -g20 -aI1041 -aI-496 -aa(lp2148 -g20 -aI1029 -aI-496 -aa(lp2149 -g15 -aI985 -aI-494 -aI1014 -aI-496 -aI999 -aI-496 -aa(lp2150 -g15 -aI943 -aI-482 -aI970 -aI-492 -aI956 -aI-488 -aa(lp2151 -g15 -aI904 -aI-455 -aI929 -aI-476 -aI916 -aI-466 -aa(lp2152 -g15 -aI870 -aI-407 -aI892 -aI-443 -aI880 -aI-427 -aa(lp2153 -g15 -aI827 -aI-324 -aI856 -aI-381 -aI842 -aI-354 -aa(lp2154 -g15 -aI776 -aI-235 -aI812 -aI-295 -aI795 -aI-265 -aa(lp2155 -g20 -aI860 -aI-125 -aa(lp2156 -g15 -aI910 -aI-84 -aI873 -aI-106 -aI890 -aI-93 -aa(lp2157 -g15 -aI983 -aI-70 -aI930 -aI-75 -aI955 -aI-70 -aa(lp2158 -g20 -aI993 -aI-70 -aa(lp2159 -g20 -aI978 -aI0 -aa(lp2160 -g10 -aa(lp2161 -g8 -aI241 -aI-247 -aa(lp2162 -g15 -aI251 -aI-178 -aI241 -aI-222 -aI245 -aI-199 -aa(lp2163 -g15 -aI282 -aI-124 -aI258 -aI-157 -aI269 -aI-139 -aa(lp2164 -g15 -aI332 -aI-88 -aI296 -aI-109 -aI312 -aI-97 -aa(lp2165 -g15 -aI398 -aI-75 -aI351 -aI-80 -aI373 -aI-75 -aa(lp2166 -g15 -aI512 -aI-99 -aI440 -aI-75 -aI477 -aI-83 -aa(lp2167 -g15 -aI604 -aI-163 -aI546 -aI-115 -aI576 -aI-136 -aa(lp2168 -g20 -aI386 -aI-465 -aa(lp2169 -g15 -aI319 -aI-419 -aI360 -aI-450 -aI337 -aI-435 -aa(lp2170 -g15 -aI274 -aI-369 -aI300 -aI-403 -aI285 -aI-387 -aa(lp2171 -g15 -aI249 -aI-313 -aI262 -aI-352 -aI254 -aI-333 -aa(lp2172 -g15 -aI241 -aI-247 -aI244 -aI-292 -aI241 -aI-271 -aa(lp2173 -g10 -aa(lp2174 -g8 -aI657 -aI-772 -aa(lp2175 -g15 -aI633 -aI-855 -aI657 -aI-808 -aI649 -aI-835 -aa(lp2176 -g15 -aI562 -aI-884 -aI617 -aI-875 -aI594 -aI-884 -aa(lp2177 -g15 -aI518 -aI-875 -aI546 -aI-884 -aI532 -aI-881 -aa(lp2178 -g15 -aI484 -aI-849 -aI505 -aI-869 -aI493 -aI-860 -aa(lp2179 -g15 -aI461 -aI-805 -aI474 -aI-837 -aI466 -aI-822 -aa(lp2180 -g15 -aI453 -aI-746 -aI455 -aI-788 -aI453 -aI-768 -aa(lp2181 -g15 -aI466 -aI-673 -aI453 -aI-720 -aI457 -aI-696 -aa(lp2182 -g15 -aI505 -aI-599 -aI474 -aI-650 -aI487 -aI-625 -aa(lp2183 -g15 -aI575 -aI-634 -aI532 -aI-611 -aI555 -aI-623 -aa(lp2184 -g15 -aI622 -aI-672 -aI594 -aI-646 -aI610 -aI-659 -aa(lp2185 -g15 -aI649 -aI-717 -aI634 -aI-686 -aI643 -aI-701 -aa(lp2186 -g15 -aI657 -aI-772 -aI654 -aI-733 -aI657 -aI-752 -aa(lp2187 -g10 -aa(lp2188 -g8 -aI1067 -aI0 -aa(lp2189 -g10 -aa(lp2190 -g8 -aI1067 -aI0 -aasV* -(lp2191 -(lp2192 -g8 -aI192 -aI-860 -aa(lp2193 -g20 -aI278 -aI-980 -aa(lp2194 -g20 -aI442 -aI-798 -aa(lp2195 -g20 -aI445 -aI-1019 -aa(lp2196 -g20 -aI591 -aI-989 -aa(lp2197 -g20 -aI500 -aI-788 -aa(lp2198 -g20 -aI723 -aI-883 -aa(lp2199 -g20 -aI754 -aI-741 -aa(lp2200 -g20 -aI541 -aI-732 -aa(lp2201 -g20 -aI733 -aI-636 -aa(lp2202 -g20 -aI646 -aI-521 -aa(lp2203 -g20 -aI479 -aI-698 -aa(lp2204 -g20 -aI481 -aI-476 -aa(lp2205 -g20 -aI335 -aI-507 -aa(lp2206 -g20 -aI423 -aI-711 -aa(lp2207 -g20 -aI201 -aI-614 -aa(lp2208 -g20 -aI169 -aI-755 -aa(lp2209 -g20 -aI384 -aI-766 -aa(lp2210 -g10 -aa(lp2211 -g8 -aI824 -aI0 -aa(lp2212 -g10 -aa(lp2213 -g8 -aI824 -aI0 -aasV. -(lp2214 -(lp2215 -g8 -aI282 -aI-108 -aa(lp2216 -g15 -aI272 -aI-52 -aI282 -aI-86 -aI279 -aI-68 -aa(lp2217 -g15 -aI245 -aI-15 -aI265 -aI-37 -aI256 -aI-24 -aa(lp2218 -g15 -aI208 -aI4 -aI234 -aI-6 -aI222 -aI0 -aa(lp2219 -g15 -aI166 -aI10 -aI194 -aI8 -aI180 -aI10 -aa(lp2220 -g15 -aI88 -aI-12 -aI134 -aI10 -aI108 -aI3 -aa(lp2221 -g15 -aI58 -aI-84 -aI68 -aI-28 -aI58 -aI-52 -aa(lp2222 -g15 -aI66 -aI-134 -aI58 -aI-103 -aI61 -aI-119 -aa(lp2223 -g15 -aI90 -aI-172 -aI72 -aI-149 -aI79 -aI-161 -aa(lp2224 -g15 -aI126 -aI-196 -aI100 -aI-182 -aI112 -aI-190 -aa(lp2225 -g15 -aI174 -aI-204 -aI140 -aI-201 -aI156 -aI-204 -aa(lp2226 -g15 -aI217 -aI-198 -aI189 -aI-204 -aI203 -aI-202 -aa(lp2227 -g15 -aI251 -aI-181 -aI230 -aI-194 -aI241 -aI-189 -aa(lp2228 -g15 -aI274 -aI-151 -aI261 -aI-173 -aI268 -aI-163 -aa(lp2229 -g15 -aI282 -aI-108 -aI279 -aI-139 -aI282 -aI-124 -aa(lp2230 -g10 -aa(lp2231 -g8 -aI405 -aI0 -aa(lp2232 -g10 -aa(lp2233 -g8 -aI405 -aI0 -aasV2 -(lp2234 -(lp2235 -g8 -aI-18 -aI0 -aa(lp2236 -g20 -aI9 -aI-136 -aa(lp2237 -g20 -aI320 -aI-399 -aa(lp2238 -g15 -aI431 -aI-504 -aI365 -aI-437 -aI402 -aI-472 -aa(lp2239 -g15 -aI500 -aI-593 -aI460 -aI-535 -aI483 -aI-565 -aa(lp2240 -g15 -aI535 -aI-675 -aI517 -aI-621 -aI529 -aI-648 -aa(lp2241 -g15 -aI545 -aI-756 -aI542 -aI-701 -aI545 -aI-728 -aa(lp2242 -g15 -aI539 -aI-807 -aI545 -aI-774 -aI543 -aI-791 -aa(lp2243 -g15 -aI521 -aI-846 -aI535 -aI-822 -aI529 -aI-835 -aa(lp2244 -g15 -aI491 -aI-872 -aI513 -aI-857 -aI503 -aI-866 -aa(lp2245 -g15 -aI451 -aI-882 -aI479 -aI-879 -aI466 -aI-882 -aa(lp2246 -g15 -aI392 -aI-864 -aI429 -aI-882 -aI410 -aI-876 -aa(lp2247 -g15 -aI348 -aI-816 -aI375 -aI-853 -aI361 -aI-837 -aa(lp2248 -g15 -aI319 -aI-745 -aI336 -aI-796 -aI327 -aI-772 -aa(lp2249 -g15 -aI306 -aI-657 -aI312 -aI-718 -aI308 -aI-688 -aa(lp2250 -g15 -aI245 -aI-663 -aI284 -aI-657 -aI264 -aI-659 -aa(lp2251 -g15 -aI196 -aI-684 -aI226 -aI-668 -aI210 -aI-675 -aa(lp2252 -g15 -aI165 -aI-720 -aI183 -aI-694 -aI172 -aI-706 -aa(lp2253 -g15 -aI153 -aI-771 -aI157 -aI-735 -aI153 -aI-752 -aa(lp2254 -g15 -aI174 -aI-846 -aI153 -aI-798 -aI160 -aI-823 -aa(lp2255 -g15 -aI234 -aI-908 -aI187 -aI-869 -aI207 -aI-890 -aa(lp2256 -g15 -aI331 -aI-949 -aI260 -aI-925 -aI292 -aI-939 -aa(lp2257 -g15 -aI465 -aI-965 -aI370 -aI-959 -aI415 -aI-965 -aa(lp2258 -g15 -aI586 -aI-952 -aI511 -aI-965 -aI551 -aI-960 -aa(lp2259 -g15 -aI675 -aI-915 -aI621 -aI-943 -aI651 -aI-931 -aa(lp2260 -g15 -aI729 -aI-856 -aI699 -aI-899 -aI717 -aI-879 -aa(lp2261 -g15 -aI748 -aI-779 -aI741 -aI-833 -aI748 -aI-808 -aa(lp2262 -g15 -aI729 -aI-692 -aI748 -aI-749 -aI741 -aI-721 -aa(lp2263 -g15 -aI675 -aI-605 -aI717 -aI-664 -aI699 -aI-634 -aa(lp2264 -g15 -aI585 -aI-510 -aI651 -aI-575 -aI621 -aI-543 -aa(lp2265 -g15 -aI460 -aI-403 -aI549 -aI-478 -aI507 -aI-442 -aa(lp2266 -g20 -aI139 -aI-146 -aa(lp2267 -g20 -aI450 -aI-146 -aa(lp2268 -g15 -aI504 -aI-155 -aI471 -aI-146 -aI489 -aI-149 -aa(lp2269 -g15 -aI542 -aI-180 -aI519 -aI-161 -aI532 -aI-170 -aa(lp2270 -g15 -aI569 -aI-215 -aI553 -aI-190 -aI562 -aI-202 -aa(lp2271 -g15 -aI589 -aI-255 -aI576 -aI-228 -aI583 -aI-241 -aa(lp2272 -g20 -aI598 -aI-279 -aa(lp2273 -g20 -aI677 -aI-279 -aa(lp2274 -g20 -aI611 -aI0 -aa(lp2275 -g10 -aa(lp2276 -g8 -aI745 -aI0 -aa(lp2277 -g10 -aa(lp2278 -g8 -aI745 -aI0 -aasV6 -(lp2279 -(lp2280 -g8 -aI539 -aI-886 -aa(lp2281 -g15 -aI389 -aI-794 -aI482 -aI-886 -aI432 -aI-855 -aa(lp2282 -g15 -aI283 -aI-517 -aI346 -aI-733 -aI311 -aI-641 -aa(lp2283 -g15 -aI318 -aI-540 -aI293 -aI-524 -aI305 -aI-532 -aa(lp2284 -g15 -aI362 -aI-561 -aI331 -aI-548 -aI346 -aI-555 -aa(lp2285 -g15 -aI415 -aI-577 -aI378 -aI-568 -aI396 -aI-573 -aa(lp2286 -g15 -aI478 -aI-583 -aI435 -aI-581 -aI455 -aI-583 -aa(lp2287 -g15 -aI579 -aI-564 -aI517 -aI-583 -aI550 -aI-577 -aa(lp2288 -g15 -aI649 -aI-513 -aI607 -aI-552 -aI630 -aI-535 -aa(lp2289 -g15 -aI690 -aI-438 -aI667 -aI-492 -aI681 -aI-466 -aa(lp2290 -g15 -aI703 -aI-347 -aI699 -aI-409 -aI703 -aI-379 -aa(lp2291 -g15 -aI681 -aI-212 -aI703 -aI-300 -aI696 -aI-255 -aa(lp2292 -g15 -aI615 -aI-97 -aI667 -aI-169 -aI645 -aI-130 -aa(lp2293 -g15 -aI503 -aI-16 -aI585 -aI-63 -aI548 -aI-36 -aa(lp2294 -g15 -aI345 -aI13 -aI458 -aI3 -aI405 -aI13 -aa(lp2295 -g15 -aI237 -aI-6 -aI306 -aI13 -aI270 -aI6 -aa(lp2296 -g15 -aI149 -aI-66 -aI203 -aI-19 -aI174 -aI-39 -aa(lp2297 -g15 -aI89 -aI-167 -aI123 -aI-93 -aI104 -aI-127 -aa(lp2298 -g15 -aI67 -aI-308 -aI74 -aI-207 -aI67 -aI-254 -aa(lp2299 -g15 -aI83 -aI-472 -aI67 -aI-364 -aI72 -aI-419 -aa(lp2300 -g15 -aI127 -aI-626 -aI93 -aI-526 -aI108 -aI-577 -aa(lp2301 -g15 -aI200 -aI-761 -aI147 -aI-675 -aI171 -aI-720 -aa(lp2302 -g15 -aI298 -aI-868 -aI229 -aI-802 -aI261 -aI-838 -aa(lp2303 -g15 -aI420 -aI-939 -aI335 -aI-899 -aI375 -aI-922 -aa(lp2304 -g15 -aI563 -aI-965 -aI464 -aI-956 -aI512 -aI-965 -aa(lp2305 -g15 -aI659 -aI-953 -aI600 -aI-965 -aI632 -aI-961 -aa(lp2306 -g15 -aI729 -aI-923 -aI687 -aI-946 -aI710 -aI-936 -aa(lp2307 -g15 -aI771 -aI-879 -aI747 -aI-910 -aI761 -aI-896 -aa(lp2308 -g15 -aI785 -aI-827 -aI780 -aI-863 -aI785 -aI-845 -aa(lp2309 -g15 -aI741 -aI-744 -aI785 -aI-792 -aI770 -aI-764 -aa(lp2310 -g15 -aI618 -aI-714 -aI712 -aI-724 -aI671 -aI-714 -aa(lp2311 -g15 -aI616 -aI-777 -aI618 -aI-736 -aI617 -aI-757 -aa(lp2312 -g15 -aI605 -aI-832 -aI614 -aI-798 -aI611 -aI-816 -aa(lp2313 -g15 -aI582 -aI-871 -aI600 -aI-848 -aI592 -aI-861 -aa(lp2314 -g15 -aI539 -aI-886 -aI571 -aI-881 -aI557 -aI-886 -aa(lp2315 -g10 -aa(lp2316 -g8 -aI417 -aI-502 -aa(lp2317 -g15 -aI374 -aI-495 -aI402 -aI-502 -aI388 -aI-500 -aa(lp2318 -g15 -aI333 -aI-480 -aI360 -aI-491 -aI347 -aI-486 -aa(lp2319 -g15 -aI297 -aI-457 -aI320 -aI-473 -aI308 -aI-466 -aa(lp2320 -g15 -aI266 -aI-433 -aI286 -aI-449 -aI276 -aI-441 -aa(lp2321 -g15 -aI250 -aI-266 -aI256 -aI-368 -aI250 -aI-312 -aa(lp2322 -g15 -aI281 -aI-119 -aI250 -aI-199 -aI260 -aI-150 -aa(lp2323 -g15 -aI363 -aI-73 -aI301 -aI-88 -aI329 -aI-73 -aa(lp2324 -g15 -aI425 -aI-93 -aI386 -aI-73 -aI407 -aI-79 -aa(lp2325 -g15 -aI473 -aI-148 -aI444 -aI-106 -aI460 -aI-125 -aa(lp2326 -g15 -aI505 -aI-232 -aI487 -aI-172 -aI497 -aI-200 -aa(lp2327 -g15 -aI516 -aI-336 -aI512 -aI-264 -aI516 -aI-299 -aa(lp2328 -g15 -aI491 -aI-459 -aI516 -aI-390 -aI507 -aI-431 -aa(lp2329 -g15 -aI417 -aI-502 -aI474 -aI-488 -aI449 -aI-502 -aa(lp2330 -g10 -aa(lp2331 -g8 -aI745 -aI0 -aa(lp2332 -g10 -aa(lp2333 -g8 -aI745 -aI0 -aasV: -(lp2334 -(lp2335 -g8 -aI282 -aI-108 -aa(lp2336 -g15 -aI272 -aI-52 -aI282 -aI-86 -aI279 -aI-68 -aa(lp2337 -g15 -aI245 -aI-15 -aI265 -aI-37 -aI256 -aI-24 -aa(lp2338 -g15 -aI208 -aI4 -aI234 -aI-6 -aI222 -aI0 -aa(lp2339 -g15 -aI166 -aI10 -aI194 -aI8 -aI180 -aI10 -aa(lp2340 -g15 -aI88 -aI-12 -aI134 -aI10 -aI108 -aI3 -aa(lp2341 -g15 -aI58 -aI-84 -aI68 -aI-28 -aI58 -aI-52 -aa(lp2342 -g15 -aI66 -aI-134 -aI58 -aI-103 -aI61 -aI-119 -aa(lp2343 -g15 -aI90 -aI-172 -aI72 -aI-149 -aI79 -aI-161 -aa(lp2344 -g15 -aI126 -aI-196 -aI100 -aI-182 -aI112 -aI-190 -aa(lp2345 -g15 -aI174 -aI-204 -aI140 -aI-201 -aI156 -aI-204 -aa(lp2346 -g15 -aI217 -aI-198 -aI189 -aI-204 -aI203 -aI-202 -aa(lp2347 -g15 -aI251 -aI-181 -aI230 -aI-194 -aI241 -aI-189 -aa(lp2348 -g15 -aI274 -aI-151 -aI261 -aI-173 -aI268 -aI-163 -aa(lp2349 -g15 -aI282 -aI-108 -aI279 -aI-139 -aI282 -aI-124 -aa(lp2350 -g10 -aa(lp2351 -g8 -aI399 -aI-625 -aa(lp2352 -g15 -aI389 -aI-568 -aI399 -aI-602 -aI396 -aI-583 -aa(lp2353 -g15 -aI362 -aI-531 -aI382 -aI-552 -aI374 -aI-540 -aa(lp2354 -g15 -aI325 -aI-510 -aI351 -aI-521 -aI339 -aI-515 -aa(lp2355 -g15 -aI283 -aI-504 -aI311 -aI-506 -aI297 -aI-504 -aa(lp2356 -g15 -aI205 -aI-528 -aI251 -aI-504 -aI225 -aI-512 -aa(lp2357 -g15 -aI175 -aI-601 -aI185 -aI-543 -aI175 -aI-568 -aa(lp2358 -g15 -aI183 -aI-649 -aI175 -aI-618 -aI178 -aI-635 -aa(lp2359 -g15 -aI207 -aI-687 -aI189 -aI-664 -aI197 -aI-677 -aa(lp2360 -g15 -aI244 -aI-712 -aI217 -aI-698 -aI229 -aI-706 -aa(lp2361 -g15 -aI292 -aI-720 -aI258 -aI-717 -aI274 -aI-720 -aa(lp2362 -g15 -aI334 -aI-715 -aI307 -aI-720 -aI321 -aI-718 -aa(lp2363 -g15 -aI369 -aI-697 -aI348 -aI-711 -aI359 -aI-705 -aa(lp2364 -g15 -aI391 -aI-667 -aI378 -aI-689 -aI386 -aI-679 -aa(lp2365 -g15 -aI399 -aI-625 -aI397 -aI-655 -aI399 -aI-641 -aa(lp2366 -g10 -aa(lp2367 -g8 -aI477 -aI0 -aa(lp2368 -g10 -aa(lp2369 -g8 -aI477 -aI0 -aasV> -(lp2370 -(lp2371 -g8 -aI108 -aI-138 -aa(lp2372 -g20 -aI108 -aI-243 -aa(lp2373 -g20 -aI537 -aI-475 -aa(lp2374 -g20 -aI108 -aI-710 -aa(lp2375 -g20 -aI108 -aI-815 -aa(lp2376 -g20 -aI679 -aI-503 -aa(lp2377 -g20 -aI679 -aI-448 -aa(lp2378 -g10 -aa(lp2379 -g8 -aI745 -aI0 -aa(lp2380 -g10 -aa(lp2381 -g8 -aI745 -aI0 -aasVB -(lp2382 -(lp2383 -g8 -aI-16 -aI-70 -aa(lp2384 -g20 -aI1 -aI-70 -aa(lp2385 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp2386 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp2387 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp2388 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp2389 -g20 -aI259 -aI-791 -aa(lp2390 -g15 -aI265 -aI-817 -aI261 -aI-800 -aI263 -aI-809 -aa(lp2391 -g15 -aI268 -aI-835 -aI267 -aI-826 -aI268 -aI-832 -aa(lp2392 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp2393 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp2394 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp2395 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp2396 -g20 -aI154 -aI-881 -aa(lp2397 -g20 -aI169 -aI-951 -aa(lp2398 -g20 -aI582 -aI-951 -aa(lp2399 -g15 -aI816 -aI-900 -aI685 -aI-951 -aI763 -aI-934 -aa(lp2400 -g15 -aI894 -aI-751 -aI868 -aI-867 -aI894 -aI-817 -aa(lp2401 -g15 -aI877 -aI-655 -aI894 -aI-715 -aI888 -aI-682 -aa(lp2402 -g15 -aI832 -aI-583 -aI866 -aI-627 -aI851 -aI-603 -aa(lp2403 -g15 -aI763 -aI-533 -aI812 -aI-563 -aI789 -aI-546 -aa(lp2404 -g15 -aI677 -aI-503 -aI736 -aI-520 -aI707 -aI-510 -aa(lp2405 -g20 -aI675 -aI-498 -aa(lp2406 -g15 -aI741 -aI-476 -aI699 -aI-493 -aI721 -aI-486 -aa(lp2407 -g15 -aI792 -aI-436 -aI761 -aI-465 -aI778 -aI-452 -aa(lp2408 -g15 -aI826 -aI-378 -aI807 -aI-419 -aI818 -aI-400 -aa(lp2409 -g15 -aI838 -aI-303 -aI834 -aI-356 -aI838 -aI-331 -aa(lp2410 -g15 -aI813 -aI-174 -aI838 -aI-254 -aI830 -aI-211 -aa(lp2411 -g15 -aI740 -aI-78 -aI797 -aI-136 -aI773 -aI-104 -aa(lp2412 -g15 -aI620 -aI-19 -aI708 -aI-52 -aI668 -aI-33 -aa(lp2413 -g15 -aI454 -aI0 -aI572 -aI-6 -aI517 -aI0 -aa(lp2414 -g20 -aI-30 -aI0 -aa(lp2415 -g10 -aa(lp2416 -g8 -aI318 -aI-80 -aa(lp2417 -g20 -aI410 -aI-80 -aa(lp2418 -g15 -aI506 -aI-95 -aI448 -aI-80 -aI480 -aI-85 -aa(lp2419 -g15 -aI570 -aI-140 -aI533 -aI-105 -aI554 -aI-120 -aa(lp2420 -g15 -aI607 -aI-212 -aI587 -aI-159 -aI599 -aI-183 -aa(lp2421 -g15 -aI618 -aI-312 -aI614 -aI-241 -aI618 -aI-274 -aa(lp2422 -g15 -aI585 -aI-421 -aI618 -aI-361 -aI607 -aI-397 -aa(lp2423 -g15 -aI482 -aI-456 -aI563 -aI-444 -aI528 -aI-456 -aa(lp2424 -g20 -aI398 -aI-456 -aa(lp2425 -g10 -aa(lp2426 -g8 -aI416 -aI-539 -aa(lp2427 -g20 -aI490 -aI-539 -aa(lp2428 -g15 -aI627 -aI-588 -aI553 -aI-539 -aI599 -aI-555 -aa(lp2429 -g15 -aI669 -aI-728 -aI655 -aI-621 -aI669 -aI-667 -aa(lp2430 -g15 -aI637 -aI-834 -aI669 -aI-776 -aI658 -aI-811 -aa(lp2431 -g15 -aI544 -aI-869 -aI616 -aI-858 -aI585 -aI-869 -aa(lp2432 -g20 -aI485 -aI-869 -aa(lp2433 -g10 -aa(lp2434 -g8 -aI895 -aI0 -aa(lp2435 -g10 -aa(lp2436 -g8 -aI895 -aI0 -aasVF -(lp2437 -(lp2438 -g8 -aI334 -aI-157 -aa(lp2439 -g15 -aI329 -aI-131 -aI332 -aI-147 -aI330 -aI-138 -aa(lp2440 -g15 -aI328 -aI-115 -aI328 -aI-124 -aI328 -aI-118 -aa(lp2441 -g15 -aI335 -aI-92 -aI328 -aI-105 -aI330 -aI-98 -aa(lp2442 -g15 -aI355 -aI-78 -aI340 -aI-86 -aI346 -aI-81 -aa(lp2443 -g15 -aI386 -aI-72 -aI364 -aI-75 -aI374 -aI-73 -aa(lp2444 -g15 -aI425 -aI-70 -aI398 -aI-71 -aI411 -aI-70 -aa(lp2445 -g20 -aI442 -aI-70 -aa(lp2446 -g20 -aI427 -aI0 -aa(lp2447 -g20 -aI-30 -aI0 -aa(lp2448 -g20 -aI-16 -aI-70 -aa(lp2449 -g20 -aI1 -aI-70 -aa(lp2450 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp2451 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp2452 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp2453 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp2454 -g20 -aI259 -aI-789 -aa(lp2455 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp2456 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp2457 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp2458 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp2459 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp2460 -g20 -aI154 -aI-881 -aa(lp2461 -g20 -aI169 -aI-951 -aa(lp2462 -g20 -aI902 -aI-951 -aa(lp2463 -g20 -aI856 -aI-703 -aa(lp2464 -g20 -aI761 -aI-703 -aa(lp2465 -g15 -aI763 -aI-726 -aI761 -aI-710 -aI762 -aI-718 -aa(lp2466 -g15 -aI765 -aI-750 -aI764 -aI-735 -aI765 -aI-742 -aa(lp2467 -g15 -aI767 -aI-770 -aI766 -aI-758 -aI767 -aI-764 -aa(lp2468 -g15 -aI768 -aI-780 -aI768 -aI-775 -aI768 -aI-779 -aa(lp2469 -g15 -aI763 -aI-815 -aI768 -aI-793 -aI766 -aI-805 -aa(lp2470 -g15 -aI746 -aI-844 -aI759 -aI-826 -aI753 -aI-836 -aa(lp2471 -g15 -aI715 -aI-863 -aI738 -aI-852 -aI727 -aI-858 -aa(lp2472 -g15 -aI667 -aI-869 -aI702 -aI-867 -aI686 -aI-869 -aa(lp2473 -g20 -aI486 -aI-869 -aa(lp2474 -g20 -aI409 -aI-506 -aa(lp2475 -g20 -aI725 -aI-506 -aa(lp2476 -g20 -aI709 -aI-427 -aa(lp2477 -g20 -aI393 -aI-427 -aa(lp2478 -g10 -aa(lp2479 -g8 -aI828 -aI0 -aa(lp2480 -g10 -aa(lp2481 -g8 -aI828 -aI0 -aasVJ -(lp2482 -(lp2483 -g8 -aI301 -aI4 -aa(lp2484 -g15 -aI244 -aI145 -aI290 -aI58 -aI271 -aI105 -aa(lp2485 -g15 -aI151 -aI243 -aI218 -aI185 -aI187 -aI217 -aa(lp2486 -g15 -aI31 -aI301 -aI115 -aI269 -aI75 -aI289 -aa(lp2487 -g15 -aI-101 -aI320 -aI-11 -aI314 -aI-55 -aI320 -aa(lp2488 -g15 -aI-161 -aI316 -aI-125 -aI320 -aI-145 -aI319 -aa(lp2489 -g15 -aI-210 -aI305 -aI-178 -aI314 -aI-194 -aI310 -aa(lp2490 -g20 -aI-192 -aI232 -aa(lp2491 -g15 -aI-172 -aI237 -aI-186 -aI234 -aI-180 -aI236 -aa(lp2492 -g15 -aI-150 -aI241 -aI-165 -aI239 -aI-158 -aI240 -aa(lp2493 -g15 -aI-126 -aI243 -aI-142 -aI242 -aI-134 -aI243 -aa(lp2494 -g15 -aI-105 -aI244 -aI-119 -aI244 -aI-111 -aI244 -aa(lp2495 -g15 -aI-41 -aI232 -aI-82 -aI244 -aI-61 -aI240 -aa(lp2496 -g15 -aI12 -aI191 -aI-21 -aI223 -aI-3 -aI210 -aa(lp2497 -g15 -aI56 -aI117 -aI28 -aI172 -aI43 -aI147 -aa(lp2498 -g15 -aI90 -aI4 -aI69 -aI86 -aI80 -aI49 -aa(lp2499 -g20 -aI262 -aI-804 -aa(lp2500 -g15 -aI266 -aI-821 -aI264 -aI-809 -aI265 -aI-815 -aa(lp2501 -g15 -aI268 -aI-835 -aI267 -aI-827 -aI268 -aI-832 -aa(lp2502 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp2503 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp2504 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp2505 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp2506 -g20 -aI154 -aI-881 -aa(lp2507 -g20 -aI169 -aI-951 -aa(lp2508 -g20 -aI629 -aI-951 -aa(lp2509 -g20 -aI614 -aI-881 -aa(lp2510 -g20 -aI597 -aI-881 -aa(lp2511 -g15 -aI555 -aI-878 -aI582 -aI-881 -aI568 -aI-880 -aa(lp2512 -g15 -aI517 -aI-866 -aI541 -aI-876 -aI528 -aI-872 -aa(lp2513 -g15 -aI488 -aI-841 -aI506 -aI-861 -aI496 -aI-852 -aa(lp2514 -g15 -aI470 -aI-799 -aI480 -aI-831 -aI474 -aI-817 -aa(lp2515 -g10 -aa(lp2516 -g8 -aI534 -aI0 -aa(lp2517 -g10 -aa(lp2518 -g8 -aI534 -aI0 -aasVN -(lp2519 -(lp2520 -g8 -aI712 -aI0 -aa(lp2521 -g20 -aI350 -aI-754 -aa(lp2522 -g20 -aI225 -aI-157 -aa(lp2523 -g15 -aI220 -aI-131 -aI223 -aI-147 -aI221 -aI-138 -aa(lp2524 -g15 -aI218 -aI-115 -aI219 -aI-124 -aI218 -aI-118 -aa(lp2525 -g15 -aI225 -aI-92 -aI218 -aI-105 -aI221 -aI-98 -aa(lp2526 -g15 -aI246 -aI-78 -aI230 -aI-86 -aI237 -aI-81 -aa(lp2527 -g15 -aI277 -aI-72 -aI254 -aI-75 -aI265 -aI-73 -aa(lp2528 -g15 -aI315 -aI-70 -aI288 -aI-71 -aI301 -aI-70 -aa(lp2529 -g20 -aI320 -aI-70 -aa(lp2530 -g20 -aI305 -aI0 -aa(lp2531 -g20 -aI-30 -aI0 -aa(lp2532 -g20 -aI-16 -aI-70 -aa(lp2533 -g20 -aI1 -aI-70 -aa(lp2534 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp2535 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp2536 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp2537 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp2538 -g20 -aI259 -aI-789 -aa(lp2539 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp2540 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp2541 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp2542 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp2543 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp2544 -g20 -aI154 -aI-881 -aa(lp2545 -g20 -aI169 -aI-951 -aa(lp2546 -g20 -aI465 -aI-951 -aa(lp2547 -g20 -aI790 -aI-267 -aa(lp2548 -g20 -aI902 -aI-794 -aa(lp2549 -g15 -aI909 -aI-835 -aI907 -aI-814 -aI909 -aI-828 -aa(lp2550 -g15 -aI902 -aI-858 -aI909 -aI-845 -aI907 -aI-852 -aa(lp2551 -g15 -aI881 -aI-872 -aI897 -aI-864 -aI890 -aI-869 -aa(lp2552 -g15 -aI850 -aI-879 -aI872 -aI-876 -aI862 -aI-878 -aa(lp2553 -g15 -aI811 -aI-881 -aI838 -aI-880 -aI825 -aI-881 -aa(lp2554 -g20 -aI807 -aI-881 -aa(lp2555 -g20 -aI822 -aI-951 -aa(lp2556 -g20 -aI1158 -aI-951 -aa(lp2557 -g20 -aI1143 -aI-881 -aa(lp2558 -g20 -aI1126 -aI-881 -aa(lp2559 -g15 -aI1086 -aI-878 -aI1113 -aI-881 -aI1099 -aI-880 -aa(lp2560 -g15 -aI1050 -aI-866 -aI1073 -aI-876 -aI1060 -aI-872 -aa(lp2561 -g15 -aI1021 -aI-842 -aI1039 -aI-861 -aI1029 -aI-853 -aa(lp2562 -g15 -aI1003 -aI-800 -aI1013 -aI-832 -aI1007 -aI-818 -aa(lp2563 -g20 -aI834 -aI0 -aa(lp2564 -g10 -aa(lp2565 -g8 -aI1050 -aI0 -aa(lp2566 -g10 -aa(lp2567 -g8 -aI1050 -aI0 -aasVR -(lp2568 -(lp2569 -g8 -aI404 -aI-490 -aa(lp2570 -g20 -aI486 -aI-490 -aa(lp2571 -g15 -aI566 -aI-502 -aI515 -aI-490 -aI541 -aI-494 -aa(lp2572 -g15 -aI629 -aI-541 -aI590 -aI-511 -aI611 -aI-523 -aa(lp2573 -g15 -aI672 -aI-609 -aI647 -aI-559 -aI662 -aI-581 -aa(lp2574 -g15 -aI688 -aI-711 -aI682 -aI-637 -aI688 -aI-671 -aa(lp2575 -g15 -aI680 -aI-787 -aI688 -aI-741 -aI685 -aI-766 -aa(lp2576 -g15 -aI656 -aI-837 -aI675 -aI-807 -aI667 -aI-824 -aa(lp2577 -g15 -aI615 -aI-864 -aI645 -aI-849 -aI631 -aI-859 -aa(lp2578 -g15 -aI557 -aI-872 -aI598 -aI-869 -aI579 -aI-872 -aa(lp2579 -g20 -aI489 -aI-872 -aa(lp2580 -g10 -aa(lp2581 -g8 -aI597 -aI-951 -aa(lp2582 -g15 -aI835 -aI-896 -aI703 -aI-951 -aI783 -aI-932 -aa(lp2583 -g15 -aI914 -aI-728 -aI888 -aI-859 -aI914 -aI-803 -aa(lp2584 -g15 -aI892 -aI-613 -aI914 -aI-683 -aI907 -aI-645 -aa(lp2585 -g15 -aI836 -aI-533 -aI878 -aI-581 -aI859 -aI-555 -aa(lp2586 -g15 -aI760 -aI-482 -aI814 -aI-512 -aI788 -aI-495 -aa(lp2587 -g15 -aI677 -aI-453 -aI732 -aI-470 -aI704 -aI-460 -aa(lp2588 -g20 -aI769 -aI-205 -aa(lp2589 -g15 -aI796 -aI-142 -aI778 -aI-180 -aI787 -aI-159 -aa(lp2590 -g15 -aI823 -aI-100 -aI804 -aI-124 -aI814 -aI-110 -aa(lp2591 -g15 -aI855 -aI-77 -aI833 -aI-89 -aI844 -aI-81 -aa(lp2592 -g15 -aI895 -aI-70 -aI867 -aI-72 -aI880 -aI-70 -aa(lp2593 -g20 -aI901 -aI-70 -aa(lp2594 -g20 -aI886 -aI0 -aa(lp2595 -g20 -aI873 -aI0 -aa(lp2596 -g15 -aI752 -aI-5 -aI826 -aI0 -aI786 -aI-1 -aa(lp2597 -g15 -aI664 -aI-27 -aI718 -aI-9 -aI689 -aI-16 -aa(lp2598 -g15 -aI604 -aI-74 -aI640 -aI-38 -aI620 -aI-54 -aa(lp2599 -g15 -aI565 -aI-151 -aI588 -aI-93 -aI575 -aI-119 -aa(lp2600 -g20 -aI481 -aI-412 -aa(lp2601 -g20 -aI389 -aI-412 -aa(lp2602 -g20 -aI337 -aI-168 -aa(lp2603 -g15 -aI330 -aI-132 -aI333 -aI-152 -aI331 -aI-140 -aa(lp2604 -g15 -aI328 -aI-115 -aI328 -aI-124 -aI328 -aI-118 -aa(lp2605 -g15 -aI335 -aI-92 -aI328 -aI-105 -aI330 -aI-98 -aa(lp2606 -g15 -aI355 -aI-78 -aI340 -aI-86 -aI346 -aI-81 -aa(lp2607 -g15 -aI386 -aI-72 -aI364 -aI-75 -aI374 -aI-73 -aa(lp2608 -g15 -aI425 -aI-70 -aI398 -aI-71 -aI411 -aI-70 -aa(lp2609 -g20 -aI469 -aI-70 -aa(lp2610 -g20 -aI454 -aI0 -aa(lp2611 -g20 -aI-30 -aI0 -aa(lp2612 -g20 -aI-16 -aI-70 -aa(lp2613 -g20 -aI1 -aI-70 -aa(lp2614 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp2615 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp2616 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp2617 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp2618 -g20 -aI259 -aI-789 -aa(lp2619 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp2620 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp2621 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp2622 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp2623 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp2624 -g20 -aI154 -aI-881 -aa(lp2625 -g20 -aI169 -aI-951 -aa(lp2626 -g10 -aa(lp2627 -g8 -aI942 -aI0 -aa(lp2628 -g10 -aa(lp2629 -g8 -aI942 -aI0 -aasVV -(lp2630 -(lp2631 -g8 -aI429 -aI-827 -aa(lp2632 -g15 -aI430 -aI-803 -aI429 -aI-820 -aI429 -aI-812 -aa(lp2633 -g15 -aI432 -aI-782 -aI430 -aI-795 -aI431 -aI-788 -aa(lp2634 -g20 -aI474 -aI-430 -aa(lp2635 -g15 -aI479 -aI-376 -aI476 -aI-414 -aI477 -aI-396 -aa(lp2636 -g15 -aI482 -aI-313 -aI481 -aI-355 -aI482 -aI-334 -aa(lp2637 -g15 -aI484 -aI-253 -aI483 -aI-292 -aI483 -aI-272 -aa(lp2638 -g15 -aI485 -aI-207 -aI484 -aI-234 -aI485 -aI-219 -aa(lp2639 -g15 -aI501 -aI-245 -aI490 -aI-219 -aI495 -aI-232 -aa(lp2640 -g15 -aI518 -aI-284 -aI507 -aI-259 -aI513 -aI-272 -aa(lp2641 -g15 -aI533 -aI-319 -aI523 -aI-297 -aI529 -aI-309 -aa(lp2642 -g15 -aI546 -aI-345 -aI538 -aI-330 -aI542 -aI-339 -aa(lp2643 -g20 -aI786 -aI-776 -aa(lp2644 -g15 -aI805 -aI-816 -aI795 -aI-792 -aI801 -aI-805 -aa(lp2645 -g15 -aI810 -aI-847 -aI808 -aI-827 -aI810 -aI-838 -aa(lp2646 -g15 -aI791 -aI-874 -aI810 -aI-860 -aI804 -aI-869 -aa(lp2647 -g15 -aI733 -aI-881 -aI777 -aI-878 -aI758 -aI-881 -aa(lp2648 -g20 -aI702 -aI-881 -aa(lp2649 -g20 -aI716 -aI-951 -aa(lp2650 -g20 -aI1063 -aI-951 -aa(lp2651 -g20 -aI1049 -aI-881 -aa(lp2652 -g20 -aI1017 -aI-881 -aa(lp2653 -g15 -aI984 -aI-877 -aI1004 -aI-881 -aI993 -aI-879 -aa(lp2654 -g15 -aI957 -aI-865 -aI974 -aI-875 -aI965 -aI-871 -aa(lp2655 -g15 -aI932 -aI-838 -aI949 -aI-858 -aI941 -aI-849 -aa(lp2656 -g15 -aI904 -aI-791 -aI924 -aI-826 -aI915 -aI-810 -aa(lp2657 -g20 -aI460 -aI0 -aa(lp2658 -g20 -aI326 -aI0 -aa(lp2659 -g20 -aI214 -aI-816 -aa(lp2660 -g15 -aI204 -aI-849 -aI212 -aI-830 -aI209 -aI-841 -aa(lp2661 -g15 -aI185 -aI-869 -aI199 -aI-857 -aI193 -aI-864 -aa(lp2662 -g15 -aI161 -aI-878 -aI178 -aI-874 -aI170 -aI-877 -aa(lp2663 -g15 -aI130 -aI-881 -aI151 -aI-880 -aI141 -aI-881 -aa(lp2664 -g20 -aI113 -aI-881 -aa(lp2665 -g20 -aI128 -aI-951 -aa(lp2666 -g20 -aI567 -aI-951 -aa(lp2667 -g20 -aI553 -aI-881 -aa(lp2668 -g20 -aI522 -aI-881 -aa(lp2669 -g15 -aI454 -aI-870 -aI494 -aI-881 -aI471 -aI-877 -aa(lp2670 -g15 -aI429 -aI-827 -aI437 -aI-863 -aI429 -aI-848 -aa(lp2671 -g10 -aa(lp2672 -g8 -aI930 -aI0 -aa(lp2673 -g10 -aa(lp2674 -g8 -aI930 -aI0 -aasVZ -(lp2675 -(lp2676 -g8 -aI926 -aI-883 -aa(lp2677 -g20 -aI268 -aI-80 -aa(lp2678 -g20 -aI542 -aI-80 -aa(lp2679 -g15 -aI599 -aI-88 -aI562 -aI-80 -aI581 -aI-83 -aa(lp2680 -g15 -aI648 -aI-113 -aI617 -aI-93 -aI633 -aI-102 -aa(lp2681 -g15 -aI688 -aI-158 -aI663 -aI-124 -aI676 -aI-139 -aa(lp2682 -g15 -aI717 -aI-226 -aI699 -aI-176 -aI709 -aI-199 -aa(lp2683 -g20 -aI731 -aI-274 -aa(lp2684 -g20 -aI828 -aI-274 -aa(lp2685 -g20 -aI764 -aI0 -aa(lp2686 -g20 -aI-2 -aI0 -aa(lp2687 -g20 -aI9 -aI-65 -aa(lp2688 -g20 -aI666 -aI-869 -aa(lp2689 -g20 -aI434 -aI-869 -aa(lp2690 -g15 -aI337 -aI-842 -aI394 -aI-869 -aI362 -aI-860 -aa(lp2691 -g15 -aI283 -aI-754 -aI313 -aI-824 -aI295 -aI-794 -aa(lp2692 -g20 -aI261 -aI-676 -aa(lp2693 -g20 -aI165 -aI-676 -aa(lp2694 -g20 -aI230 -aI-951 -aa(lp2695 -g20 -aI940 -aI-951 -aa(lp2696 -g10 -aa(lp2697 -g8 -aI888 -aI0 -aa(lp2698 -g10 -aa(lp2699 -g8 -aI888 -aI0 -aasV^ -(lp2700 -(lp2701 -g8 -aI370 -aI-951 -aa(lp2702 -g20 -aI427 -aI-951 -aa(lp2703 -g20 -aI710 -aI-349 -aa(lp2704 -g20 -aI606 -aI-349 -aa(lp2705 -g20 -aI398 -aI-806 -aa(lp2706 -g20 -aI193 -aI-349 -aa(lp2707 -g20 -aI89 -aI-349 -aa(lp2708 -g10 -aa(lp2709 -g8 -aI745 -aI0 -aa(lp2710 -g10 -aa(lp2711 -g8 -aI745 -aI0 -aasVb -(lp2712 -(lp2713 -g8 -aI205 -aI-828 -aa(lp2714 -g15 -aI208 -aI-846 -aI206 -aI-834 -aI207 -aI-840 -aa(lp2715 -g15 -aI212 -aI-863 -aI210 -aI-852 -aI211 -aI-858 -aa(lp2716 -g15 -aI214 -aI-877 -aI213 -aI-869 -aI213 -aI-873 -aa(lp2717 -g15 -aI214 -aI-886 -aI214 -aI-881 -aI214 -aI-884 -aa(lp2718 -g15 -aI210 -aI-915 -aI214 -aI-898 -aI213 -aI-908 -aa(lp2719 -g15 -aI198 -aI-932 -aI208 -aI-922 -aI204 -aI-928 -aa(lp2720 -g15 -aI176 -aI-940 -aI192 -aI-936 -aI185 -aI-939 -aa(lp2721 -g15 -aI143 -aI-942 -aI167 -aI-941 -aI156 -aI-942 -aa(lp2722 -g20 -aI113 -aI-942 -aa(lp2723 -g20 -aI125 -aI-1012 -aa(lp2724 -g20 -aI449 -aI-1012 -aa(lp2725 -g20 -aI395 -aI-759 -aa(lp2726 -g15 -aI387 -aI-728 -aI394 -aI-751 -aI391 -aI-740 -aa(lp2727 -g15 -aI375 -aI-687 -aI384 -aI-715 -aI379 -aI-701 -aa(lp2728 -g15 -aI360 -aI-641 -aI370 -aI-672 -aI365 -aI-657 -aa(lp2729 -g15 -aI345 -aI-597 -aI354 -aI-626 -aI349 -aI-611 -aa(lp2730 -g15 -aI332 -aI-560 -aI340 -aI-583 -aI335 -aI-571 -aa(lp2731 -g15 -aI322 -aI-534 -aI328 -aI-548 -aI325 -aI-540 -aa(lp2732 -g20 -aI329 -aI-534 -aa(lp2733 -g15 -aI379 -aI-619 -aI345 -aI-566 -aI362 -aI-594 -aa(lp2734 -g15 -aI436 -aI-679 -aI396 -aI-643 -aI415 -aI-663 -aa(lp2735 -g15 -aI502 -aI-715 -aI456 -aI-695 -aI478 -aI-707 -aa(lp2736 -g15 -aI582 -aI-727 -aI526 -aI-723 -aI553 -aI-727 -aa(lp2737 -g15 -aI660 -aI-711 -aI610 -aI-727 -aI636 -aI-722 -aa(lp2738 -g15 -aI722 -aI-665 -aI684 -aI-701 -aI705 -aI-686 -aa(lp2739 -g15 -aI762 -aI-590 -aI739 -aI-645 -aI752 -aI-620 -aa(lp2740 -g15 -aI777 -aI-486 -aI772 -aI-560 -aI777 -aI-525 -aa(lp2741 -g15 -aI764 -aI-374 -aI777 -aI-450 -aI773 -aI-413 -aa(lp2742 -g15 -aI725 -aI-260 -aI755 -aI-335 -aI742 -aI-298 -aa(lp2743 -g15 -aI663 -aI-155 -aI708 -aI-223 -aI688 -aI-188 -aa(lp2744 -g15 -aI579 -aI-68 -aI639 -aI-122 -aI611 -aI-93 -aa(lp2745 -g15 -aI473 -aI-8 -aI547 -aI-43 -aI511 -aI-23 -aa(lp2746 -g15 -aI348 -aI13 -aI434 -aI6 -aI393 -aI13 -aa(lp2747 -g15 -aI295 -aI9 -aI330 -aI13 -aI312 -aI12 -aa(lp2748 -g15 -aI248 -aI0 -aI278 -aI6 -aI262 -aI3 -aa(lp2749 -g15 -aI208 -aI-15 -aI233 -aI-5 -aI220 -aI-10 -aa(lp2750 -g15 -aI178 -aI-34 -aI196 -aI-21 -aI186 -aI-27 -aa(lp2751 -g20 -aI102 -aI4 -aa(lp2752 -g20 -aI27 -aI4 -aa(lp2753 -g10 -aa(lp2754 -g8 -aI574 -aI-476 -aa(lp2755 -g15 -aI569 -aI-543 -aI574 -aI-503 -aI573 -aI-525 -aa(lp2756 -g15 -aI554 -aI-588 -aI565 -aI-562 -aI560 -aI-576 -aa(lp2757 -g15 -aI531 -aI-612 -aI547 -aI-599 -aI539 -aI-607 -aa(lp2758 -g15 -aI503 -aI-620 -aI522 -aI-618 -aI513 -aI-620 -aa(lp2759 -g15 -aI456 -aI-605 -aI487 -aI-620 -aI471 -aI-615 -aa(lp2760 -g15 -aI413 -aI-567 -aI441 -aI-596 -aI426 -aI-583 -aa(lp2761 -g15 -aI375 -aI-515 -aI399 -aI-552 -aI386 -aI-534 -aa(lp2762 -g15 -aI344 -aI-457 -aI363 -aI-496 -aI353 -aI-476 -aa(lp2763 -g15 -aI322 -aI-402 -aI335 -aI-438 -aI328 -aI-420 -aa(lp2764 -g15 -aI309 -aI-360 -aI316 -aI-385 -aI311 -aI-371 -aa(lp2765 -g20 -aI254 -aI-108 -aa(lp2766 -g15 -aI291 -aI-82 -aI264 -aI-98 -aI276 -aI-89 -aa(lp2767 -g15 -aI341 -aI-71 -aI305 -aI-75 -aI322 -aI-71 -aa(lp2768 -g15 -aI412 -aI-92 -aI367 -aI-71 -aI391 -aI-78 -aa(lp2769 -g15 -aI471 -aI-146 -aI434 -aI-105 -aI453 -aI-124 -aa(lp2770 -g15 -aI516 -aI-222 -aI488 -aI-168 -aI503 -aI-194 -aa(lp2771 -g15 -aI548 -aI-310 -aI529 -aI-251 -aI540 -aI-280 -aa(lp2772 -g15 -aI568 -aI-398 -aI557 -aI-340 -aI564 -aI-370 -aa(lp2773 -g15 -aI574 -aI-476 -aI572 -aI-427 -aI574 -aI-453 -aa(lp2774 -g10 -aa(lp2775 -g8 -aI830 -aI0 -aa(lp2776 -g10 -aa(lp2777 -g8 -aI830 -aI0 -aasVf -(lp2778 -(lp2779 -g8 -aI566 -aI-623 -aa(lp2780 -g20 -aI397 -aI-623 -aa(lp2781 -g20 -aI270 -aI-27 -aa(lp2782 -g15 -aI232 -aI96 -aI260 -aI19 -aI247 -aI61 -aa(lp2783 -g15 -aI178 -aI188 -aI216 -aI132 -aI198 -aI163 -aa(lp2784 -g15 -aI114 -aI253 -aI158 -aI214 -aI137 -aI236 -aa(lp2785 -g15 -aI43 -aI293 -aI91 -aI269 -aI67 -aI283 -aa(lp2786 -g15 -aI-30 -aI314 -aI19 -aI303 -aI-5 -aI310 -aa(lp2787 -g15 -aI-104 -aI320 -aI-55 -aI318 -aI-80 -aI320 -aa(lp2788 -g15 -aI-125 -aI319 -aI-110 -aI320 -aI-117 -aI320 -aa(lp2789 -g15 -aI-148 -aI317 -aI-133 -aI319 -aI-141 -aI318 -aa(lp2790 -g15 -aI-169 -aI313 -aI-155 -aI316 -aI-162 -aI314 -aa(lp2791 -g15 -aI-185 -aI309 -aI-175 -aI312 -aI-181 -aI311 -aa(lp2792 -g20 -aI-169 -aI232 -aa(lp2793 -g15 -aI-140 -aI238 -aI-161 -aI234 -aI-152 -aI236 -aa(lp2794 -g15 -aI-108 -aI241 -aI-128 -aI240 -aI-118 -aI241 -aa(lp2795 -g15 -aI-50 -aI230 -aI-86 -aI241 -aI-67 -aI238 -aa(lp2796 -g15 -aI-5 -aI193 -aI-33 -aI223 -aI-18 -aI211 -aa(lp2797 -g15 -aI30 -aI122 -aI7 -aI175 -aI19 -aI152 -aa(lp2798 -g15 -aI59 -aI12 -aI40 -aI93 -aI50 -aI56 -aa(lp2799 -g20 -aI194 -aI-623 -aa(lp2800 -g20 -aI73 -aI-623 -aa(lp2801 -g20 -aI86 -aI-686 -aa(lp2802 -g20 -aI214 -aI-714 -aa(lp2803 -g20 -aI225 -aI-763 -aa(lp2804 -g15 -aI266 -aI-878 -aI235 -aI-807 -aI249 -aI-846 -aa(lp2805 -g15 -aI331 -aI-960 -aI284 -aI-911 -aI305 -aI-938 -aa(lp2806 -g15 -aI421 -aI-1009 -aI356 -aI-982 -aI387 -aI-999 -aa(lp2807 -g15 -aI541 -aI-1026 -aI456 -aI-1020 -aI495 -aI-1026 -aa(lp2808 -g15 -aI631 -aI-1017 -aI575 -aI-1026 -aI605 -aI-1023 -aa(lp2809 -g15 -aI697 -aI-992 -aI658 -aI-1011 -aI680 -aI-1002 -aa(lp2810 -g15 -aI737 -aI-955 -aI715 -aI-981 -aI728 -aI-969 -aa(lp2811 -g15 -aI750 -aI-910 -aI746 -aI-941 -aI750 -aI-926 -aa(lp2812 -g15 -aI711 -aI-841 -aI750 -aI-880 -aI737 -aI-857 -aa(lp2813 -g15 -aI597 -aI-816 -aI685 -aI-824 -aI647 -aI-816 -aa(lp2814 -g15 -aI594 -aI-865 -aI597 -aI-833 -aI596 -aI-849 -aa(lp2815 -g15 -aI584 -aI-907 -aI592 -aI-881 -aI589 -aI-895 -aa(lp2816 -g15 -aI565 -aI-936 -aI579 -aI-919 -aI573 -aI-929 -aa(lp2817 -g15 -aI535 -aI-947 -aI557 -aI-943 -aI547 -aI-947 -aa(lp2818 -g15 -aI471 -aI-911 -aI507 -aI-947 -aI486 -aI-935 -aa(lp2819 -g15 -aI434 -aI-799 -aI456 -aI-886 -aI444 -aI-849 -aa(lp2820 -g20 -aI417 -aI-714 -aa(lp2821 -g20 -aI585 -aI-714 -aa(lp2822 -g10 -aa(lp2823 -g8 -aI538 -aI0 -aa(lp2824 -g10 -aa(lp2825 -g8 -aI538 -aI0 -aasVj -(lp2826 -(lp2827 -g8 -aI311 -aI-834 -aa(lp2828 -g15 -aI270 -aI-839 -aI297 -aI-834 -aI283 -aI-835 -aa(lp2829 -g15 -aI237 -aI-854 -aI258 -aI-842 -aI247 -aI-847 -aa(lp2830 -g15 -aI215 -aI-880 -aI228 -aI-861 -aI221 -aI-869 -aa(lp2831 -g15 -aI207 -aI-916 -aI210 -aI-890 -aI207 -aI-902 -aa(lp2832 -g15 -aI217 -aI-966 -aI207 -aI-936 -aI211 -aI-952 -aa(lp2833 -g15 -aI244 -aI-1000 -aI224 -aI-980 -aI233 -aI-991 -aa(lp2834 -g15 -aI284 -aI-1020 -aI256 -aI-1009 -aI269 -aI-1015 -aa(lp2835 -g15 -aI332 -aI-1026 -aI299 -aI-1024 -aI315 -aI-1026 -aa(lp2836 -g15 -aI372 -aI-1021 -aI346 -aI-1026 -aI359 -aI-1024 -aa(lp2837 -g15 -aI406 -aI-1006 -aI385 -aI-1018 -aI396 -aI-1013 -aa(lp2838 -g15 -aI430 -aI-980 -aI416 -aI-999 -aI424 -aI-990 -aa(lp2839 -g15 -aI438 -aI-942 -aI435 -aI-969 -aI438 -aI-957 -aa(lp2840 -g15 -aI428 -aI-894 -aI438 -aI-924 -aI435 -aI-908 -aa(lp2841 -g15 -aI399 -aI-860 -aI420 -aI-880 -aI411 -aI-869 -aa(lp2842 -g15 -aI358 -aI-840 -aI387 -aI-851 -aI373 -aI-845 -aa(lp2843 -g15 -aI311 -aI-834 -aI343 -aI-836 -aI327 -aI-834 -aa(lp2844 -g10 -aa(lp2845 -g8 -aI404 -aI-714 -aa(lp2846 -g20 -aI249 -aI10 -aa(lp2847 -g15 -aI200 -aI159 -aI237 -aI70 -aI220 -aI119 -aa(lp2848 -g15 -aI129 -aI255 -aI180 -aI199 -aI156 -aI231 -aa(lp2849 -g15 -aI42 -aI305 -aI103 -aI278 -aI74 -aI295 -aa(lp2850 -g15 -aI-54 -aI320 -aI11 -aI315 -aI-20 -aI320 -aa(lp2851 -g15 -aI-127 -aI316 -aI-82 -aI320 -aI-107 -aI319 -aa(lp2852 -g15 -aI-186 -aI304 -aI-148 -aI313 -aI-167 -aI309 -aa(lp2853 -g20 -aI-170 -aI234 -aa(lp2854 -g15 -aI-142 -aI241 -aI-164 -aI236 -aI-154 -aI239 -aa(lp2855 -g15 -aI-110 -aI244 -aI-130 -aI243 -aI-120 -aI244 -aa(lp2856 -g15 -aI-56 -aI233 -aI-89 -aI244 -aI-71 -aI240 -aa(lp2857 -g15 -aI-14 -aI194 -aI-40 -aI225 -aI-27 -aI212 -aa(lp2858 -g15 -aI17 -aI122 -aI-2 -aI176 -aI8 -aI152 -aa(lp2859 -g15 -aI46 -aI10 -aI27 -aI92 -aI37 -aI55 -aa(lp2860 -g20 -aI161 -aI-530 -aa(lp2861 -g15 -aI165 -aI-547 -aI162 -aI-535 -aI163 -aI-541 -aa(lp2862 -g15 -aI167 -aI-564 -aI166 -aI-553 -aI167 -aI-559 -aa(lp2863 -g15 -aI169 -aI-578 -aI168 -aI-570 -aI169 -aI-575 -aa(lp2864 -g15 -aI170 -aI-587 -aI170 -aI-582 -aI170 -aI-585 -aa(lp2865 -g15 -aI166 -aI-616 -aI170 -aI-599 -aI169 -aI-609 -aa(lp2866 -g15 -aI154 -aI-633 -aI164 -aI-624 -aI159 -aI-629 -aa(lp2867 -g15 -aI132 -aI-641 -aI148 -aI-637 -aI141 -aI-640 -aa(lp2868 -g15 -aI100 -aI-643 -aI123 -aI-642 -aI112 -aI-643 -aa(lp2869 -g20 -aI76 -aI-643 -aa(lp2870 -g20 -aI87 -aI-714 -aa(lp2871 -g10 -aa(lp2872 -g8 -aI450 -aI0 -aa(lp2873 -g10 -aa(lp2874 -g8 -aI450 -aI0 -aasVn -(lp2875 -(lp2876 -g8 -aI511 -aI-123 -aa(lp2877 -g15 -aI533 -aI-282 -aI511 -aI-161 -aI518 -aI-214 -aa(lp2878 -g20 -aI554 -aI-387 -aa(lp2879 -g15 -aI561 -aI-419 -aI556 -aI-396 -aI558 -aI-406 -aa(lp2880 -g15 -aI569 -aI-458 -aI563 -aI-432 -aI566 -aI-445 -aa(lp2881 -g15 -aI575 -aI-499 -aI571 -aI-472 -aI573 -aI-486 -aa(lp2882 -g15 -aI578 -aI-536 -aI577 -aI-513 -aI578 -aI-525 -aa(lp2883 -g15 -aI576 -aI-562 -aI578 -aI-544 -aI578 -aI-553 -aa(lp2884 -g15 -aI568 -aI-587 -aI574 -aI-571 -aI572 -aI-580 -aa(lp2885 -g15 -aI551 -aI-605 -aI563 -aI-594 -aI558 -aI-600 -aa(lp2886 -g15 -aI522 -aI-612 -aI543 -aI-610 -aI534 -aI-612 -aa(lp2887 -g15 -aI477 -aI-597 -aI507 -aI-612 -aI492 -aI-607 -aa(lp2888 -g15 -aI434 -aI-557 -aI462 -aI-587 -aI448 -aI-573 -aa(lp2889 -g15 -aI394 -aI-499 -aI420 -aI-540 -aI407 -aI-521 -aa(lp2890 -g15 -aI360 -aI-433 -aI381 -aI-478 -aI370 -aI-456 -aa(lp2891 -g15 -aI333 -aI-367 -aI350 -aI-411 -aI341 -aI-389 -aa(lp2892 -g15 -aI317 -aI-308 -aI326 -aI-345 -aI320 -aI-326 -aa(lp2893 -g20 -aI249 -aI0 -aa(lp2894 -g20 -aI49 -aI0 -aa(lp2895 -g20 -aI161 -aI-530 -aa(lp2896 -g15 -aI165 -aI-547 -aI162 -aI-535 -aI163 -aI-541 -aa(lp2897 -g15 -aI167 -aI-564 -aI166 -aI-553 -aI167 -aI-559 -aa(lp2898 -g15 -aI169 -aI-578 -aI168 -aI-570 -aI169 -aI-575 -aa(lp2899 -g15 -aI170 -aI-587 -aI170 -aI-582 -aI170 -aI-585 -aa(lp2900 -g15 -aI166 -aI-616 -aI170 -aI-599 -aI169 -aI-609 -aa(lp2901 -g15 -aI154 -aI-633 -aI164 -aI-624 -aI159 -aI-629 -aa(lp2902 -g15 -aI132 -aI-641 -aI148 -aI-637 -aI141 -aI-640 -aa(lp2903 -g15 -aI100 -aI-643 -aI123 -aI-642 -aI112 -aI-643 -aa(lp2904 -g20 -aI76 -aI-643 -aa(lp2905 -g20 -aI87 -aI-714 -aa(lp2906 -g20 -aI384 -aI-714 -aa(lp2907 -g20 -aI369 -aI-571 -aa(lp2908 -g20 -aI377 -aI-571 -aa(lp2909 -g15 -aI430 -aI-640 -aI394 -aI-598 -aI412 -aI-621 -aa(lp2910 -g15 -aI488 -aI-689 -aI448 -aI-660 -aI467 -aI-676 -aa(lp2911 -g15 -aI556 -aI-717 -aI509 -aI-702 -aI531 -aI-711 -aa(lp2912 -g15 -aI637 -aI-727 -aI580 -aI-724 -aI607 -aI-727 -aa(lp2913 -g15 -aI708 -aI-715 -aI665 -aI-727 -aI689 -aI-723 -aa(lp2914 -g15 -aI755 -aI-681 -aI727 -aI-706 -aI743 -aI-695 -aa(lp2915 -g15 -aI781 -aI-632 -aI767 -aI-667 -aI776 -aI-651 -aa(lp2916 -g15 -aI789 -aI-574 -aI786 -aI-614 -aI789 -aI-594 -aa(lp2917 -g15 -aI786 -aI-538 -aI789 -aI-563 -aI788 -aI-551 -aa(lp2918 -g15 -aI780 -aI-499 -aI785 -aI-525 -aI783 -aI-512 -aa(lp2919 -g15 -aI773 -aI-460 -aI778 -aI-486 -aI775 -aI-473 -aa(lp2920 -g15 -aI765 -aI-423 -aI770 -aI-447 -aI767 -aI-435 -aa(lp2921 -g20 -aI735 -aI-280 -aa(lp2922 -g15 -aI722 -aI-212 -aI730 -aI-256 -aI726 -aI-233 -aa(lp2923 -g15 -aI717 -aI-153 -aI719 -aI-191 -aI717 -aI-171 -aa(lp2924 -g15 -aI729 -aI-108 -aI717 -aI-133 -aI721 -aI-118 -aa(lp2925 -g15 -aI764 -aI-92 -aI737 -aI-97 -aI749 -aI-92 -aa(lp2926 -g15 -aI802 -aI-100 -aI778 -aI-92 -aI790 -aI-95 -aa(lp2927 -g15 -aI842 -aI-123 -aI813 -aI-105 -aI827 -aI-113 -aa(lp2928 -g20 -aI874 -aI-78 -aa(lp2929 -g15 -aI838 -aI-44 -aI863 -aI-67 -aI851 -aI-55 -aa(lp2930 -g15 -aI793 -aI-15 -aI825 -aI-33 -aI810 -aI-23 -aa(lp2931 -g15 -aI737 -aI5 -aI776 -aI-6 -aI758 -aI0 -aa(lp2932 -g15 -aI670 -aI13 -aI717 -aI10 -aI694 -aI13 -aa(lp2933 -g15 -aI552 -aI-22 -aI619 -aI13 -aI580 -aI1 -aa(lp2934 -g15 -aI511 -aI-123 -aI525 -aI-46 -aI511 -aI-80 -aa(lp2935 -g10 -aa(lp2936 -g8 -aI895 -aI0 -aa(lp2937 -g10 -aa(lp2938 -g8 -aI895 -aI0 -aasVr -(lp2939 -(lp2940 -g8 -aI170 -aI-597 -aa(lp2941 -g15 -aI154 -aI-632 -aI170 -aI-613 -aI165 -aI-625 -aa(lp2942 -g15 -aI100 -aI-643 -aI143 -aI-639 -aI125 -aI-643 -aa(lp2943 -g20 -aI76 -aI-643 -aa(lp2944 -g20 -aI87 -aI-714 -aa(lp2945 -g20 -aI382 -aI-714 -aa(lp2946 -g20 -aI354 -aI-531 -aa(lp2947 -g20 -aI361 -aI-531 -aa(lp2948 -g15 -aI407 -aI-616 -aI376 -aI-563 -aI391 -aI-591 -aa(lp2949 -g15 -aI458 -aI-677 -aI422 -aI-640 -aI439 -aI-660 -aa(lp2950 -g15 -aI520 -aI-714 -aI476 -aI-693 -aI497 -aI-706 -aa(lp2951 -g15 -aI602 -aI-727 -aI544 -aI-723 -aI571 -aI-727 -aa(lp2952 -g15 -aI708 -aI-700 -aI650 -aI-727 -aI685 -aI-718 -aa(lp2953 -g15 -aI742 -aI-623 -aI731 -aI-682 -aI742 -aI-657 -aa(lp2954 -g15 -aI702 -aI-520 -aI742 -aI-577 -aI729 -aI-542 -aa(lp2955 -g15 -aI585 -aI-486 -aI675 -aI-497 -aI636 -aI-486 -aa(lp2956 -g15 -aI582 -aI-540 -aI585 -aI-506 -aI584 -aI-524 -aa(lp2957 -g15 -aI571 -aI-582 -aI580 -aI-557 -aI576 -aI-571 -aa(lp2958 -g15 -aI551 -aI-608 -aI566 -aI-594 -aI560 -aI-602 -aa(lp2959 -g15 -aI520 -aI-618 -aI543 -aI-614 -aI532 -aI-618 -aa(lp2960 -g15 -aI480 -aI-602 -aI507 -aI-618 -aI494 -aI-612 -aa(lp2961 -g15 -aI438 -aI-560 -aI466 -aI-592 -aI452 -aI-578 -aa(lp2962 -g15 -aI398 -aI-497 -aI424 -aI-542 -aI411 -aI-521 -aa(lp2963 -g15 -aI360 -aI-417 -aI384 -aI-472 -aI372 -aI-446 -aa(lp2964 -g15 -aI326 -aI-326 -aI347 -aI-388 -aI336 -aI-358 -aa(lp2965 -g15 -aI301 -aI-230 -aI316 -aI-294 -aI308 -aI-262 -aa(lp2966 -g20 -aI250 -aI0 -aa(lp2967 -g20 -aI49 -aI0 -aa(lp2968 -g20 -aI162 -aI-535 -aa(lp2969 -g15 -aI167 -aI-564 -aI164 -aI-542 -aI165 -aI-552 -aa(lp2970 -g15 -aI170 -aI-597 -aI169 -aI-576 -aI170 -aI-587 -aa(lp2971 -g10 -aa(lp2972 -g8 -aI734 -aI0 -aa(lp2973 -g10 -aa(lp2974 -g8 -aI734 -aI0 -aasVv -(lp2975 -(lp2976 -g8 -aI126 -aI-573 -aa(lp2977 -g15 -aI115 -aI-607 -aI124 -aI-587 -aI120 -aI-598 -aa(lp2978 -g15 -aI96 -aI-629 -aI110 -aI-616 -aI104 -aI-623 -aa(lp2979 -g15 -aI69 -aI-640 -aI89 -aI-634 -aI80 -aI-638 -aa(lp2980 -g15 -aI34 -aI-643 -aI59 -aI-642 -aI47 -aI-643 -aa(lp2981 -g20 -aI21 -aI-643 -aa(lp2982 -g20 -aI37 -aI-714 -aa(lp2983 -g20 -aI298 -aI-714 -aa(lp2984 -g20 -aI360 -aI-319 -aa(lp2985 -g15 -aI374 -aI-199 -aI366 -aI-274 -aI371 -aI-234 -aa(lp2986 -g15 -aI381 -aI-112 -aI376 -aI-163 -aI379 -aI-134 -aa(lp2987 -g20 -aI385 -aI-112 -aa(lp2988 -g15 -aI472 -aI-213 -aI415 -aI-144 -aI444 -aI-177 -aa(lp2989 -g15 -aI546 -aI-322 -aI500 -aI-249 -aI524 -aI-285 -aa(lp2990 -g15 -aI597 -aI-427 -aI567 -aI-358 -aI584 -aI-393 -aa(lp2991 -g15 -aI615 -aI-519 -aI609 -aI-461 -aI615 -aI-492 -aa(lp2992 -g15 -aI590 -aI-585 -aI615 -aI-549 -aI607 -aI-571 -aa(lp2993 -g15 -aI527 -aI-606 -aI573 -aI-599 -aI552 -aI-606 -aa(lp2994 -g15 -aI557 -aI-693 -aI527 -aI-642 -aI537 -aI-671 -aa(lp2995 -g15 -aI638 -aI-726 -aI577 -aI-715 -aI604 -aI-726 -aa(lp2996 -g15 -aI677 -aI-719 -aI652 -aI-726 -aI665 -aI-723 -aa(lp2997 -g15 -aI709 -aI-697 -aI689 -aI-714 -aI700 -aI-707 -aa(lp2998 -g15 -aI731 -aI-659 -aI718 -aI-687 -aI725 -aI-674 -aa(lp2999 -g15 -aI738 -aI-602 -aI736 -aI-643 -aI738 -aI-624 -aa(lp3000 -g15 -aI722 -aI-493 -aI738 -aI-567 -aI733 -aI-531 -aa(lp3001 -g15 -aI677 -aI-380 -aI710 -aI-455 -aI695 -aI-418 -aa(lp3002 -g15 -aI613 -aI-268 -aI658 -aI-342 -aI637 -aI-304 -aa(lp3003 -g15 -aI540 -aI-163 -aI590 -aI-231 -aI565 -aI-196 -aa(lp3004 -g15 -aI464 -aI-72 -aI514 -aI-131 -aI489 -aI-100 -aa(lp3005 -g15 -aI397 -aI0 -aI440 -aI-44 -aI417 -aI-20 -aa(lp3006 -g20 -aI221 -aI12 -aa(lp3007 -g10 -aa(lp3008 -g8 -aI781 -aI0 -aa(lp3009 -g10 -aa(lp3010 -g8 -aI781 -aI0 -aasVz -(lp3011 -(lp3012 -g8 -aI465 -aI-90 -aa(lp3013 -g15 -aI505 -aI-100 -aI480 -aI-90 -aI494 -aI-93 -aa(lp3014 -g15 -aI536 -aI-128 -aI517 -aI-107 -aI527 -aI-117 -aa(lp3015 -g15 -aI560 -aI-167 -aI545 -aI-140 -aI553 -aI-153 -aa(lp3016 -g15 -aI580 -aI-210 -aI567 -aI-181 -aI574 -aI-196 -aa(lp3017 -g20 -aI593 -aI-241 -aa(lp3018 -g20 -aI670 -aI-241 -aa(lp3019 -g20 -aI613 -aI0 -aa(lp3020 -g20 -aI0 -aI0 -aa(lp3021 -g20 -aI14 -aI-67 -aa(lp3022 -g20 -aI460 -aI-623 -aa(lp3023 -g20 -aI290 -aI-623 -aa(lp3024 -g15 -aI245 -aI-614 -aI272 -aI-623 -aI257 -aI-620 -aa(lp3025 -g15 -aI213 -aI-590 -aI233 -aI-608 -aI222 -aI-600 -aa(lp3026 -g15 -aI187 -aI-552 -aI203 -aI-579 -aI195 -aI-567 -aa(lp3027 -g15 -aI164 -aI-503 -aI180 -aI-537 -aI172 -aI-521 -aa(lp3028 -g20 -aI161 -aI-498 -aa(lp3029 -g20 -aI80 -aI-498 -aa(lp3030 -g20 -aI138 -aI-714 -aa(lp3031 -g20 -aI710 -aI-714 -aa(lp3032 -g20 -aI695 -aI-644 -aa(lp3033 -g20 -aI249 -aI-90 -aa(lp3034 -g10 -aa(lp3035 -g8 -aI744 -aI0 -aa(lp3036 -g10 -aa(lp3037 -g8 -aI744 -aI0 -aasV~ -(lp3038 -(lp3039 -g8 -aI343 -aI-431 -aa(lp3040 -g15 -aI301 -aI-449 -aI327 -aI-438 -aI313 -aI-444 -aa(lp3041 -g15 -aI269 -aI-460 -aI289 -aI-453 -aI278 -aI-457 -aa(lp3042 -g15 -aI241 -aI-466 -aI259 -aI-462 -aI250 -aI-464 -aa(lp3043 -g15 -aI213 -aI-467 -aI232 -aI-467 -aI223 -aI-467 -aa(lp3044 -g15 -aI175 -aI-461 -aI200 -aI-467 -aI188 -aI-465 -aa(lp3045 -g15 -aI137 -aI-444 -aI162 -aI-457 -aI149 -aI-451 -aa(lp3046 -g15 -aI99 -aI-419 -aI124 -aI-437 -aI111 -aI-429 -aa(lp3047 -g15 -aI65 -aI-388 -aI87 -aI-410 -aI75 -aI-399 -aa(lp3048 -g20 -aI65 -aI-491 -aa(lp3049 -g15 -aI226 -aI-562 -aI108 -aI-538 -aI162 -aI-562 -aa(lp3050 -g15 -aI261 -aI-560 -aI239 -aI-562 -aI250 -aI-561 -aa(lp3051 -g15 -aI295 -aI-554 -aI272 -aI-559 -aI283 -aI-557 -aa(lp3052 -g15 -aI335 -aI-542 -aI307 -aI-551 -aI321 -aI-547 -aa(lp3053 -g15 -aI388 -aI-521 -aI350 -aI-536 -aI367 -aI-529 -aa(lp3054 -g15 -aI430 -aI-503 -aI404 -aI-514 -aI418 -aI-508 -aa(lp3055 -g15 -aI463 -aI-492 -aI441 -aI-498 -aI453 -aI-494 -aa(lp3056 -g15 -aI491 -aI-486 -aI473 -aI-489 -aI482 -aI-487 -aa(lp3057 -g15 -aI518 -aI-484 -aI500 -aI-485 -aI509 -aI-484 -aa(lp3058 -g15 -aI556 -aI-490 -aI531 -aI-484 -aI543 -aI-486 -aa(lp3059 -g15 -aI595 -aI-507 -aI569 -aI-494 -aI582 -aI-500 -aa(lp3060 -g15 -aI632 -aI-532 -aI607 -aI-514 -aI620 -aI-523 -aa(lp3061 -g15 -aI666 -aI-563 -aI644 -aI-542 -aI655 -aI-552 -aa(lp3062 -g20 -aI666 -aI-461 -aa(lp3063 -g15 -aI594 -aI-408 -aI644 -aI-437 -aI620 -aI-420 -aa(lp3064 -g15 -aI505 -aI-390 -aI567 -aI-396 -aI538 -aI-390 -aa(lp3065 -g15 -aI470 -aI-391 -aI492 -aI-390 -aI480 -aI-390 -aa(lp3066 -g15 -aI435 -aI-397 -aI459 -aI-392 -aI447 -aI-394 -aa(lp3067 -g15 -aI396 -aI-410 -aI423 -aI-401 -aI410 -aI-405 -aa(lp3068 -g15 -aI343 -aI-431 -aI381 -aI-416 -aI364 -aI-423 -aa(lp3069 -g10 -aa(lp3070 -g8 -aI748 -aI0 -aa(lp3071 -g10 -aa(lp3072 -g8 -aI748 -aI0 -aasV! -(lp3073 -(lp3074 -g8 -aI279 -aI-951 -aa(lp3075 -g20 -aI511 -aI-951 -aa(lp3076 -g20 -aI281 -aI-303 -aa(lp3077 -g20 -aI203 -aI-303 -aa(lp3078 -g10 -aa(lp3079 -g8 -aI326 -aI-108 -aa(lp3080 -g15 -aI316 -aI-52 -aI326 -aI-86 -aI323 -aI-68 -aa(lp3081 -g15 -aI290 -aI-15 -aI310 -aI-37 -aI301 -aI-24 -aa(lp3082 -g15 -aI252 -aI4 -aI278 -aI-6 -aI266 -aI0 -aa(lp3083 -g15 -aI210 -aI10 -aI238 -aI8 -aI224 -aI10 -aa(lp3084 -g15 -aI132 -aI-12 -aI178 -aI10 -aI152 -aI3 -aa(lp3085 -g15 -aI102 -aI-84 -aI112 -aI-28 -aI102 -aI-52 -aa(lp3086 -g15 -aI111 -aI-134 -aI102 -aI-103 -aI105 -aI-119 -aa(lp3087 -g15 -aI134 -aI-172 -aI116 -aI-149 -aI124 -aI-161 -aa(lp3088 -g15 -aI170 -aI-196 -aI144 -aI-182 -aI156 -aI-190 -aa(lp3089 -g15 -aI218 -aI-204 -aI184 -aI-201 -aI200 -aI-204 -aa(lp3090 -g15 -aI261 -aI-198 -aI233 -aI-204 -aI248 -aI-202 -aa(lp3091 -g15 -aI295 -aI-181 -aI274 -aI-194 -aI286 -aI-189 -aa(lp3092 -g15 -aI318 -aI-151 -aI305 -aI-173 -aI313 -aI-163 -aa(lp3093 -g15 -aI326 -aI-108 -aI324 -aI-139 -aI326 -aI-124 -aa(lp3094 -g10 -aa(lp3095 -g8 -aI526 -aI0 -aa(lp3096 -g10 -aa(lp3097 -g8 -aI526 -aI0 -aasV% -(lp3098 -(lp3099 -g8 -aI342 -aI0 -aa(lp3100 -g20 -aI238 -aI0 -aa(lp3101 -g20 -aI899 -aI-951 -aa(lp3102 -g20 -aI1000 -aI-951 -aa(lp3103 -g10 -aa(lp3104 -g8 -aI95 -aI-567 -aa(lp3105 -g15 -aI103 -aI-654 -aI95 -aI-595 -aI98 -aI-624 -aa(lp3106 -g15 -aI127 -aI-744 -aI108 -aI-684 -aI116 -aI-714 -aa(lp3107 -g15 -aI169 -aI-828 -aI138 -aI-773 -aI152 -aI-801 -aa(lp3108 -g15 -aI228 -aI-898 -aI185 -aI-855 -aI205 -aI-878 -aa(lp3109 -g15 -aI305 -aI-947 -aI250 -aI-919 -aI276 -aI-935 -aa(lp3110 -g15 -aI402 -aI-965 -aI334 -aI-959 -aI366 -aI-965 -aa(lp3111 -g15 -aI489 -aI-950 -aI436 -aI-965 -aI465 -aI-960 -aa(lp3112 -g15 -aI549 -aI-908 -aI513 -aI-940 -aI533 -aI-926 -aa(lp3113 -g15 -aI584 -aI-845 -aI565 -aI-890 -aI576 -aI-869 -aa(lp3114 -g15 -aI595 -aI-766 -aI591 -aI-820 -aI595 -aI-794 -aa(lp3115 -g15 -aI587 -aI-683 -aI595 -aI-740 -aI592 -aI-713 -aa(lp3116 -g15 -aI563 -aI-595 -aI582 -aI-654 -aI574 -aI-624 -aa(lp3117 -g15 -aI521 -aI-511 -aI552 -aI-566 -aI538 -aI-538 -aa(lp3118 -g15 -aI461 -aI-440 -aI504 -aI-485 -aI484 -aI-461 -aa(lp3119 -g15 -aI382 -aI-391 -aI438 -aI-420 -aI411 -aI-403 -aa(lp3120 -g15 -aI283 -aI-372 -aI352 -aI-378 -aI319 -aI-372 -aa(lp3121 -g15 -aI206 -aI-385 -aI255 -aI-372 -aI229 -aI-376 -aa(lp3122 -g15 -aI146 -aI-422 -aI182 -aI-393 -aI163 -aI-406 -aa(lp3123 -g15 -aI109 -aI-483 -aI130 -aI-439 -aI117 -aI-459 -aa(lp3124 -g15 -aI95 -aI-567 -aI100 -aI-507 -aI95 -aI-535 -aa(lp3125 -g10 -aa(lp3126 -g8 -aI398 -aI-895 -aa(lp3127 -g15 -aI350 -aI-877 -aI381 -aI-895 -aI365 -aI-889 -aa(lp3128 -g15 -aI311 -aI-830 -aI336 -aI-865 -aI322 -aI-850 -aa(lp3129 -g15 -aI280 -aI-765 -aI299 -aI-811 -aI289 -aI-790 -aa(lp3130 -g15 -aI258 -aI-691 -aI271 -aI-741 -aI263 -aI-716 -aa(lp3131 -g15 -aI244 -aI-618 -aI252 -aI-666 -aI247 -aI-642 -aa(lp3132 -g15 -aI240 -aI-556 -aI241 -aI-594 -aI240 -aI-574 -aa(lp3133 -g15 -aI253 -aI-472 -aI240 -aI-521 -aI244 -aI-493 -aa(lp3134 -g15 -aI298 -aI-440 -aI261 -aI-451 -aI277 -aI-440 -aa(lp3135 -g15 -aI346 -aI-458 -aI316 -aI-440 -aI332 -aI-446 -aa(lp3136 -g15 -aI386 -aI-505 -aI361 -aI-470 -aI374 -aI-486 -aa(lp3137 -g15 -aI416 -aI-570 -aI397 -aI-524 -aI408 -aI-546 -aa(lp3138 -g15 -aI439 -aI-645 -aI425 -aI-595 -aI433 -aI-620 -aa(lp3139 -g15 -aI452 -aI-718 -aI444 -aI-670 -aI449 -aI-694 -aa(lp3140 -g15 -aI457 -aI-780 -aI455 -aI-742 -aI457 -aI-763 -aa(lp3141 -g15 -aI444 -aI-864 -aI457 -aI-816 -aI452 -aI-844 -aa(lp3142 -g15 -aI398 -aI-895 -aI435 -aI-884 -aI420 -aI-894 -aa(lp3143 -g10 -aa(lp3144 -g8 -aI649 -aI-181 -aa(lp3145 -g15 -aI656 -aI-268 -aI649 -aI-208 -aI651 -aI-238 -aa(lp3146 -g15 -aI681 -aI-358 -aI662 -aI-298 -aI670 -aI-328 -aa(lp3147 -g15 -aI722 -aI-442 -aI692 -aI-387 -aI706 -aI-415 -aa(lp3148 -g15 -aI781 -aI-512 -aI739 -aI-468 -aI758 -aI-492 -aa(lp3149 -g15 -aI859 -aI-560 -aI804 -aI-532 -aI830 -aI-548 -aa(lp3150 -g15 -aI955 -aI-578 -aI887 -aI-572 -aI920 -aI-578 -aa(lp3151 -g15 -aI1042 -aI-563 -aI989 -aI-578 -aI1018 -aI-573 -aa(lp3152 -g15 -aI1102 -aI-521 -aI1067 -aI-553 -aI1087 -aI-539 -aa(lp3153 -g15 -aI1137 -aI-458 -aI1118 -aI-503 -aI1130 -aI-482 -aa(lp3154 -g15 -aI1149 -aI-379 -aI1145 -aI-434 -aI1149 -aI-407 -aa(lp3155 -g15 -aI1140 -aI-297 -aI1149 -aI-354 -aI1146 -aI-326 -aa(lp3156 -g15 -aI1116 -aI-209 -aI1135 -aI-268 -aI1127 -aI-238 -aa(lp3157 -g15 -aI1074 -aI-125 -aI1105 -aI-180 -aI1091 -aI-152 -aa(lp3158 -g15 -aI1014 -aI-54 -aI1057 -aI-98 -aI1037 -aI-75 -aa(lp3159 -g15 -aI935 -aI-5 -aI991 -aI-33 -aI965 -aI-17 -aa(lp3160 -g15 -aI837 -aI13 -aI906 -aI7 -aI873 -aI13 -aa(lp3161 -g15 -aI759 -aI0 -aI808 -aI13 -aI782 -aI9 -aa(lp3162 -g15 -aI700 -aI-36 -aI736 -aI-7 -aI716 -aI-20 -aa(lp3163 -g15 -aI662 -aI-97 -aI683 -aI-52 -aI671 -aI-72 -aa(lp3164 -g15 -aI649 -aI-181 -aI653 -aI-121 -aI649 -aI-149 -aa(lp3165 -g10 -aa(lp3166 -g8 -aI951 -aI-508 -aa(lp3167 -g15 -aI903 -aI-490 -aI934 -aI-508 -aI918 -aI-502 -aa(lp3168 -g15 -aI864 -aI-444 -aI889 -aI-478 -aI876 -aI-463 -aa(lp3169 -g15 -aI833 -aI-379 -aI852 -aI-425 -aI842 -aI-403 -aa(lp3170 -g15 -aI811 -aI-304 -aI824 -aI-354 -aI817 -aI-330 -aa(lp3171 -g15 -aI798 -aI-231 -aI805 -aI-279 -aI801 -aI-255 -aa(lp3172 -g15 -aI793 -aI-170 -aI795 -aI-207 -aI793 -aI-187 -aa(lp3173 -g15 -aI806 -aI-85 -aI793 -aI-134 -aI797 -aI-106 -aa(lp3174 -g15 -aI852 -aI-54 -aI815 -aI-64 -aI830 -aI-54 -aa(lp3175 -g15 -aI900 -aI-72 -aI869 -aI-54 -aI885 -aI-60 -aa(lp3176 -g15 -aI939 -aI-118 -aI914 -aI-84 -aI927 -aI-99 -aa(lp3177 -g15 -aI970 -aI-184 -aI951 -aI-137 -aI961 -aI-159 -aa(lp3178 -g15 -aI992 -aI-258 -aI979 -aI-208 -aI986 -aI-233 -aa(lp3179 -g15 -aI1005 -aI-331 -aI998 -aI-283 -aI1002 -aI-308 -aa(lp3180 -g15 -aI1010 -aI-394 -aI1008 -aI-355 -aI1010 -aI-376 -aa(lp3181 -g15 -aI997 -aI-477 -aI1010 -aI-429 -aI1006 -aI-457 -aa(lp3182 -g15 -aI951 -aI-508 -aI989 -aI-497 -aI973 -aI-507 -aa(lp3183 -g10 -aa(lp3184 -g8 -aI1194 -aI0 -aa(lp3185 -g10 -aa(lp3186 -g8 -aI1194 -aI0 -aasV) -(lp3187 -(lp3188 -g8 -aI294 -aI-659 -aa(lp3189 -g15 -aI289 -aI-741 -aI294 -aI-687 -aI292 -aI-714 -aa(lp3190 -g15 -aI269 -aI-819 -aI285 -aI-769 -aI278 -aI-795 -aa(lp3191 -g15 -aI233 -aI-889 -aI260 -aI-844 -aI248 -aI-867 -aa(lp3192 -g15 -aI178 -aI-944 -aI218 -aI-910 -aI200 -aI-929 -aa(lp3193 -g20 -aI195 -aI-1030 -aa(lp3194 -g15 -aI334 -aI-957 -aI249 -aI-1011 -aI295 -aI-987 -aa(lp3195 -g15 -aI428 -aI-857 -aI372 -aI-928 -aI404 -aI-894 -aa(lp3196 -g15 -aI482 -aI-734 -aI453 -aI-819 -aI471 -aI-778 -aa(lp3197 -g15 -aI500 -aI-597 -aI494 -aI-690 -aI500 -aI-644 -aa(lp3198 -g15 -aI484 -aI-430 -aI500 -aI-542 -aI494 -aI-486 -aa(lp3199 -g15 -aI438 -aI-267 -aI474 -aI-374 -aI459 -aI-320 -aa(lp3200 -g15 -aI361 -aI-115 -aI418 -aI-214 -aI392 -aI-163 -aa(lp3201 -g15 -aI253 -aI16 -aI331 -aI-67 -aI295 -aI-23 -aa(lp3202 -g15 -aI113 -aI118 -aI212 -aI55 -aI165 -aI89 -aa(lp3203 -g15 -aI-58 -aI186 -aI61 -aI148 -aI4 -aI170 -aa(lp3204 -g20 -aI-45 -aI100 -aa(lp3205 -g15 -aI43 -aI37 -aI-12 -aI82 -aI17 -aI61 -aa(lp3206 -g15 -aI113 -aI-38 -aI70 -aI13 -aI93 -aI-11 -aa(lp3207 -g15 -aI167 -aI-122 -aI134 -aI-65 -aI152 -aI-93 -aa(lp3208 -g15 -aI206 -aI-209 -aI182 -aI-151 -aI195 -aI-180 -aa(lp3209 -g15 -aI234 -aI-292 -aI217 -aI-237 -aI227 -aI-265 -aa(lp3210 -g15 -aI254 -aI-367 -aI242 -aI-319 -aI248 -aI-344 -aa(lp3211 -g15 -aI287 -aI-539 -aI271 -aI-434 -aI281 -aI-492 -aa(lp3212 -g15 -aI294 -aI-659 -aI292 -aI-587 -aI294 -aI-627 -aa(lp3213 -g10 -aa(lp3214 -g8 -aI533 -aI0 -aa(lp3215 -g10 -aa(lp3216 -g8 -aI533 -aI0 -aasV- -(lp3217 -(lp3218 -g8 -aI13 -aI-293 -aa(lp3219 -g20 -aI44 -aI-433 -aa(lp3220 -g20 -aI390 -aI-433 -aa(lp3221 -g20 -aI360 -aI-293 -aa(lp3222 -g10 -aa(lp3223 -g8 -aI413 -aI0 -aa(lp3224 -g10 -aa(lp3225 -g8 -aI413 -aI0 -aasV1 -(lp3226 -(lp3227 -g8 -aI630 -aI-956 -aa(lp3228 -g20 -aI461 -aI-161 -aa(lp3229 -g15 -aI456 -aI-137 -aI460 -aI-155 -aI458 -aI-147 -aa(lp3230 -g15 -aI453 -aI-114 -aI454 -aI-127 -aI453 -aI-119 -aa(lp3231 -g15 -aI460 -aI-91 -aI453 -aI-104 -aI455 -aI-96 -aa(lp3232 -g15 -aI481 -aI-77 -aI465 -aI-85 -aI472 -aI-80 -aa(lp3233 -g15 -aI513 -aI-71 -aI490 -aI-74 -aI501 -aI-72 -aa(lp3234 -g15 -aI553 -aI-70 -aI525 -aI-70 -aI539 -aI-70 -aa(lp3235 -g20 -aI618 -aI-70 -aa(lp3236 -g20 -aI604 -aI0 -aa(lp3237 -g20 -aI53 -aI0 -aa(lp3238 -g20 -aI67 -aI-70 -aa(lp3239 -g20 -aI146 -aI-70 -aa(lp3240 -g15 -aI223 -aI-89 -aI178 -aI-70 -aI203 -aI-76 -aa(lp3241 -g15 -aI262 -aI-157 -aI242 -aI-102 -aI255 -aI-124 -aa(lp3242 -g20 -aI365 -aI-642 -aa(lp3243 -g15 -aI381 -aI-715 -aI370 -aI-669 -aI376 -aI-693 -aa(lp3244 -g15 -aI395 -aI-773 -aI386 -aI-737 -aI391 -aI-757 -aa(lp3245 -g15 -aI409 -aI-825 -aI400 -aI-792 -aI405 -aI-809 -aa(lp3246 -g20 -aI404 -aI-825 -aa(lp3247 -g15 -aI346 -aI-766 -aI383 -aI-803 -aI364 -aI-783 -aa(lp3248 -g15 -aI297 -aI-723 -aI329 -aI-749 -aI312 -aI-735 -aa(lp3249 -g15 -aI253 -aI-695 -aI282 -aI-711 -aI267 -aI-702 -aa(lp3250 -g15 -aI210 -aI-686 -aI239 -aI-689 -aI225 -aI-686 -aa(lp3251 -g15 -aI164 -aI-712 -aI191 -aI-686 -aI176 -aI-694 -aa(lp3252 -g15 -aI146 -aI-784 -aI152 -aI-729 -aI146 -aI-753 -aa(lp3253 -g15 -aI193 -aI-798 -aI161 -aI-788 -aI177 -aI-793 -aa(lp3254 -g15 -aI244 -aI-817 -aI209 -aI-803 -aI226 -aI-810 -aa(lp3255 -g15 -aI303 -aI-846 -aI263 -aI-825 -aI282 -aI-835 -aa(lp3256 -g15 -aI373 -aI-887 -aI324 -aI-857 -aI347 -aI-871 -aa(lp3257 -g20 -aI481 -aI-956 -aa(lp3258 -g10 -aa(lp3259 -g8 -aI745 -aI0 -aa(lp3260 -g10 -aa(lp3261 -g8 -aI745 -aI0 -aasV5 -(lp3262 -(lp3263 -g8 -aI282 -aI-79 -aa(lp3264 -g15 -aI361 -aI-94 -aI311 -aI-79 -aI337 -aI-84 -aa(lp3265 -g15 -aI422 -aI-139 -aI385 -aI-104 -aI405 -aI-119 -aa(lp3266 -g15 -aI460 -aI-214 -aI438 -aI-159 -aI451 -aI-184 -aa(lp3267 -g15 -aI474 -aI-319 -aI470 -aI-244 -aI474 -aI-279 -aa(lp3268 -g15 -aI462 -aI-394 -aI474 -aI-348 -aI470 -aI-373 -aa(lp3269 -g15 -aI428 -aI-448 -aI453 -aI-415 -aI442 -aI-433 -aa(lp3270 -g15 -aI377 -aI-480 -aI414 -aI-462 -aI397 -aI-473 -aa(lp3271 -g15 -aI313 -aI-490 -aI357 -aI-486 -aI336 -aI-490 -aa(lp3272 -g15 -aI269 -aI-487 -aI297 -aI-490 -aI282 -aI-489 -aa(lp3273 -g15 -aI233 -aI-480 -aI256 -aI-486 -aI244 -aI-483 -aa(lp3274 -g15 -aI203 -aI-471 -aI222 -aI-478 -aI212 -aI-475 -aa(lp3275 -g15 -aI175 -aI-461 -aI193 -aI-468 -aI184 -aI-464 -aa(lp3276 -g20 -aI119 -aI-489 -aa(lp3277 -g20 -aI255 -aI-951 -aa(lp3278 -g20 -aI759 -aI-951 -aa(lp3279 -g20 -aI721 -aI-709 -aa(lp3280 -g20 -aI639 -aI-709 -aa(lp3281 -g15 -aI642 -aI-745 -aI640 -aI-720 -aI641 -aI-732 -aa(lp3282 -g15 -aI643 -aI-772 -aI643 -aI-758 -aI643 -aI-767 -aa(lp3283 -g15 -aI630 -aI-797 -aI643 -aI-782 -aI639 -aI-790 -aa(lp3284 -g15 -aI578 -aI-806 -aI621 -aI-803 -aI603 -aI-806 -aa(lp3285 -g20 -aI310 -aI-806 -aa(lp3286 -g20 -aI231 -aI-556 -aa(lp3287 -g15 -aI289 -aI-571 -aI248 -aI-561 -aI267 -aI-566 -aa(lp3288 -g15 -aI370 -aI-578 -aI310 -aI-575 -aI337 -aI-578 -aa(lp3289 -g15 -aI495 -aI-562 -aI416 -aI-578 -aI458 -aI-572 -aa(lp3290 -g15 -aI590 -aI-514 -aI532 -aI-551 -aI564 -aI-535 -aa(lp3291 -g15 -aI651 -aI-436 -aI617 -aI-493 -aI637 -aI-467 -aa(lp3292 -g15 -aI673 -aI-328 -aI666 -aI-405 -aI673 -aI-369 -aa(lp3293 -g15 -aI645 -aI-193 -aI673 -aI-280 -aI663 -aI-235 -aa(lp3294 -g15 -aI564 -aI-84 -aI626 -aI-151 -aI599 -aI-115 -aa(lp3295 -g15 -aI436 -aI-12 -aI529 -aI-53 -aI487 -aI-29 -aa(lp3296 -g15 -aI265 -aI13 -aI386 -aI4 -aI329 -aI13 -aa(lp3297 -g15 -aI147 -aI1 -aI219 -aI13 -aI179 -aI9 -aa(lp3298 -g15 -aI69 -aI-32 -aI115 -aI-7 -aI89 -aI-18 -aa(lp3299 -g15 -aI26 -aI-81 -aI49 -aI-46 -aI35 -aI-63 -aa(lp3300 -g15 -aI13 -aI-142 -aI17 -aI-100 -aI13 -aI-120 -aa(lp3301 -g15 -aI20 -aI-183 -aI13 -aI-156 -aI15 -aI-170 -aa(lp3302 -g15 -aI43 -aI-217 -aI25 -aI-196 -aI33 -aI-207 -aa(lp3303 -g15 -aI82 -aI-240 -aI53 -aI-227 -aI66 -aI-234 -aa(lp3304 -g15 -aI137 -aI-248 -aI97 -aI-246 -aI116 -aI-248 -aa(lp3305 -g15 -aI144 -aI-190 -aI137 -aI-229 -aI140 -aI-210 -aa(lp3306 -g15 -aI166 -aI-135 -aI148 -aI-170 -aI155 -aI-152 -aa(lp3307 -g15 -aI210 -aI-95 -aI176 -aI-119 -aI191 -aI-105 -aa(lp3308 -g15 -aI282 -aI-79 -aI228 -aI-84 -aI253 -aI-79 -aa(lp3309 -g10 -aa(lp3310 -g8 -aI745 -aI0 -aa(lp3311 -g10 -aa(lp3312 -g8 -aI745 -aI0 -aasV9 -(lp3313 -(lp3314 -g8 -aI254 -aI-70 -aa(lp3315 -g15 -aI342 -aI-95 -aI287 -aI-70 -aI316 -aI-78 -aa(lp3316 -g15 -aI415 -aI-170 -aI369 -aI-112 -aI393 -aI-137 -aa(lp3317 -g15 -aI475 -aI-290 -aI436 -aI-202 -aI457 -aI-242 -aa(lp3318 -g15 -aI527 -aI-456 -aI493 -aI-338 -aI511 -aI-394 -aa(lp3319 -g15 -aI490 -aI-422 -aI516 -aI-444 -aI504 -aI-433 -aa(lp3320 -g15 -aI444 -aI-393 -aI476 -aI-411 -aI461 -aI-402 -aa(lp3321 -g15 -aI390 -aI-373 -aI428 -aI-385 -aI410 -aI-378 -aa(lp3322 -g15 -aI326 -aI-366 -aI371 -aI-368 -aI349 -aI-366 -aa(lp3323 -g15 -aI231 -aI-382 -aI291 -aI-366 -aI259 -aI-371 -aa(lp3324 -g15 -aI161 -aI-428 -aI203 -aI-393 -aI180 -aI-409 -aa(lp3325 -g15 -aI118 -aI-498 -aI142 -aI-448 -aI128 -aI-471 -aa(lp3326 -g15 -aI104 -aI-587 -aI109 -aI-525 -aI104 -aI-555 -aa(lp3327 -g15 -aI134 -aI-740 -aI104 -aI-642 -aI114 -aI-693 -aa(lp3328 -g15 -aI216 -aI-859 -aI154 -aI-786 -aI181 -aI-826 -aa(lp3329 -g15 -aI335 -aI-937 -aI250 -aI-893 -aI290 -aI-918 -aa(lp3330 -g15 -aI479 -aI-965 -aI380 -aI-955 -aI429 -aI-965 -aa(lp3331 -g15 -aI588 -aI-947 -aI519 -aI-965 -aI555 -aI-959 -aa(lp3332 -g15 -aI670 -aI-896 -aI620 -aI-935 -aI648 -aI-918 -aa(lp3333 -g15 -aI723 -aI-814 -aI693 -aI-874 -aI711 -aI-846 -aa(lp3334 -g15 -aI741 -aI-702 -aI735 -aI-781 -aI741 -aI-744 -aa(lp3335 -g15 -aI740 -aI-662 -aI741 -aI-691 -aI741 -aI-678 -aa(lp3336 -g15 -aI736 -aI-612 -aI739 -aI-647 -aI737 -aI-630 -aa(lp3337 -g15 -aI728 -aI-554 -aI734 -aI-593 -aI731 -aI-574 -aa(lp3338 -g15 -aI716 -aI-494 -aI724 -aI-534 -aI720 -aI-514 -aa(lp3339 -g15 -aI680 -aI-367 -aI706 -aI-451 -aI694 -aI-409 -aa(lp3340 -g15 -aI627 -aI-248 -aI665 -aI-325 -aI648 -aI-286 -aa(lp3341 -g15 -aI558 -aI-144 -aI607 -aI-211 -aI584 -aI-176 -aa(lp3342 -g15 -aI472 -aI-61 -aI533 -aI-111 -aI504 -aI-84 -aa(lp3343 -g15 -aI366 -aI-6 -aI439 -aI-37 -aI404 -aI-19 -aa(lp3344 -g15 -aI240 -aI13 -aI327 -aI6 -aI285 -aI13 -aa(lp3345 -g15 -aI148 -aI2 -aI204 -aI13 -aI174 -aI9 -aa(lp3346 -g15 -aI85 -aI-27 -aI122 -aI-4 -aI101 -aI-14 -aa(lp3347 -g15 -aI48 -aI-70 -aI68 -aI-39 -aI56 -aI-54 -aa(lp3348 -g15 -aI37 -aI-123 -aI41 -aI-87 -aI37 -aI-104 -aa(lp3349 -g15 -aI64 -aI-191 -aI37 -aI-153 -aI46 -aI-176 -aa(lp3350 -g15 -aI141 -aI-215 -aI83 -aI-207 -aI108 -aI-215 -aa(lp3351 -g15 -aI148 -aI-164 -aI141 -aI-198 -aI144 -aI-181 -aa(lp3352 -g15 -aI168 -aI-117 -aI152 -aI-146 -aI159 -aI-131 -aa(lp3353 -g15 -aI203 -aI-83 -aI177 -aI-103 -aI189 -aI-92 -aa(lp3354 -g15 -aI254 -aI-70 -aI217 -aI-74 -aI234 -aI-70 -aa(lp3355 -g10 -aa(lp3356 -g8 -aI394 -aI-462 -aa(lp3357 -g15 -aI443 -aI-472 -aI411 -aI-462 -aI428 -aI-466 -aa(lp3358 -g15 -aI484 -aI-495 -aI458 -aI-478 -aI471 -aI-486 -aa(lp3359 -g15 -aI519 -aI-528 -aI497 -aI-505 -aI509 -aI-516 -aa(lp3360 -g15 -aI546 -aI-565 -aI529 -aI-540 -aI539 -aI-553 -aa(lp3361 -g15 -aI554 -aI-601 -aI549 -aI-576 -aI551 -aI-588 -aa(lp3362 -g15 -aI560 -aI-640 -aI556 -aI-614 -aI558 -aI-627 -aa(lp3363 -g15 -aI564 -aI-678 -aI562 -aI-653 -aI563 -aI-666 -aa(lp3364 -g15 -aI566 -aI-710 -aI565 -aI-690 -aI566 -aI-701 -aa(lp3365 -g15 -aI559 -aI-785 -aI566 -aI-739 -aI564 -aI-764 -aa(lp3366 -g15 -aI538 -aI-837 -aI554 -aI-806 -aI547 -aI-823 -aa(lp3367 -g15 -aI507 -aI-866 -aI529 -aI-850 -aI519 -aI-860 -aa(lp3368 -g15 -aI468 -aI-875 -aI495 -aI-872 -aI482 -aI-875 -aa(lp3369 -g15 -aI398 -aI-851 -aI442 -aI-875 -aI419 -aI-867 -aa(lp3370 -g15 -aI344 -aI-786 -aI377 -aI-834 -aI359 -aI-813 -aa(lp3371 -g15 -aI308 -aI-695 -aI329 -aI-759 -aI317 -aI-729 -aa(lp3372 -g15 -aI296 -aI-593 -aI300 -aI-662 -aI296 -aI-628 -aa(lp3373 -g15 -aI322 -aI-495 -aI296 -aI-550 -aI305 -aI-517 -aa(lp3374 -g15 -aI394 -aI-462 -aI340 -aI-473 -aI364 -aI-462 -aa(lp3375 -g10 -aa(lp3376 -g8 -aI745 -aI0 -aa(lp3377 -g10 -aa(lp3378 -g8 -aI745 -aI0 -aasV= -(lp3379 -(lp3380 -g8 -aI685 -aI-392 -aa(lp3381 -g20 -aI685 -aI-299 -aa(lp3382 -g20 -aI108 -aI-299 -aa(lp3383 -g20 -aI108 -aI-392 -aa(lp3384 -g10 -aa(lp3385 -g8 -aI685 -aI-651 -aa(lp3386 -g20 -aI685 -aI-558 -aa(lp3387 -g20 -aI108 -aI-558 -aa(lp3388 -g20 -aI108 -aI-651 -aa(lp3389 -g10 -aa(lp3390 -g8 -aI745 -aI0 -aa(lp3391 -g10 -aa(lp3392 -g8 -aI745 -aI0 -aasVA -(lp3393 -(lp3394 -g8 -aI285 -aI-312 -aa(lp3395 -g20 -aI220 -aI-192 -aa(lp3396 -g15 -aI200 -aI-150 -aI211 -aI-176 -aI204 -aI-162 -aa(lp3397 -g15 -aI194 -aI-118 -aI196 -aI-138 -aI194 -aI-127 -aa(lp3398 -g15 -aI212 -aI-81 -aI194 -aI-101 -aI200 -aI-89 -aa(lp3399 -g15 -aI269 -aI-70 -aI225 -aI-74 -aI243 -aI-70 -aa(lp3400 -g20 -aI296 -aI-70 -aa(lp3401 -g20 -aI281 -aI0 -aa(lp3402 -g20 -aI-65 -aI0 -aa(lp3403 -g20 -aI-50 -aI-70 -aa(lp3404 -g20 -aI-22 -aI-70 -aa(lp3405 -g15 -aI9 -aI-74 -aI-10 -aI-70 -aI0 -aI-71 -aa(lp3406 -g15 -aI36 -aI-90 -aI18 -aI-77 -aI27 -aI-82 -aa(lp3407 -g15 -aI63 -aI-122 -aI45 -aI-98 -aI54 -aI-109 -aa(lp3408 -g15 -aI95 -aI-174 -aI72 -aI-136 -aI83 -aI-153 -aa(lp3409 -g20 -aI548 -aI-951 -aa(lp3410 -g20 -aI730 -aI-951 -aa(lp3411 -g20 -aI842 -aI-166 -aa(lp3412 -g15 -aI851 -aI-127 -aI844 -aI-152 -aI847 -aI-139 -aa(lp3413 -g15 -aI865 -aI-97 -aI854 -aI-116 -aI859 -aI-105 -aa(lp3414 -g15 -aI888 -aI-77 -aI871 -aI-89 -aI879 -aI-82 -aa(lp3415 -g15 -aI923 -aI-70 -aI898 -aI-72 -aI909 -aI-70 -aa(lp3416 -g20 -aI947 -aI-70 -aa(lp3417 -g20 -aI933 -aI0 -aa(lp3418 -g20 -aI493 -aI0 -aa(lp3419 -g20 -aI507 -aI-70 -aa(lp3420 -g20 -aI538 -aI-70 -aa(lp3421 -g15 -aI606 -aI-83 -aI567 -aI-70 -aI589 -aI-74 -aa(lp3422 -g15 -aI632 -aI-126 -aI623 -aI-92 -aI632 -aI-106 -aa(lp3423 -g15 -aI631 -aI-148 -aI632 -aI-133 -aI631 -aI-141 -aa(lp3424 -g15 -aI629 -aI-168 -aI631 -aI-155 -aI630 -aI-162 -aa(lp3425 -g20 -aI609 -aI-312 -aa(lp3426 -g10 -aa(lp3427 -g8 -aI576 -aI-618 -aa(lp3428 -g15 -aI569 -aI-673 -aI574 -aI-637 -aI571 -aI-655 -aa(lp3429 -g15 -aI564 -aI-722 -aI568 -aI-690 -aI566 -aI-706 -aa(lp3430 -g15 -aI560 -aI-769 -aI563 -aI-738 -aI561 -aI-754 -aa(lp3431 -g15 -aI558 -aI-816 -aI559 -aI-784 -aI559 -aI-800 -aa(lp3432 -g15 -aI539 -aI-772 -aI552 -aI-800 -aI545 -aI-785 -aa(lp3433 -g15 -aI518 -aI-730 -aI532 -aI-758 -aI525 -aI-744 -aa(lp3434 -g15 -aI493 -aI-685 -aI510 -aI-716 -aI502 -aI-701 -aa(lp3435 -g15 -aI462 -aI-630 -aI484 -aI-669 -aI474 -aI-651 -aa(lp3436 -g20 -aI330 -aI-394 -aa(lp3437 -g20 -aI600 -aI-394 -aa(lp3438 -g10 -aa(lp3439 -g8 -aI1003 -aI0 -aa(lp3440 -g10 -aa(lp3441 -g8 -aI1003 -aI0 -aasVE -(lp3442 -(lp3443 -g8 -aI-16 -aI-70 -aa(lp3444 -g20 -aI1 -aI-70 -aa(lp3445 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp3446 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp3447 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp3448 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp3449 -g20 -aI262 -aI-804 -aa(lp3450 -g15 -aI266 -aI-821 -aI264 -aI-809 -aI265 -aI-815 -aa(lp3451 -g15 -aI268 -aI-835 -aI267 -aI-827 -aI268 -aI-832 -aa(lp3452 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp3453 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp3454 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp3455 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp3456 -g20 -aI154 -aI-881 -aa(lp3457 -g20 -aI169 -aI-951 -aa(lp3458 -g20 -aI893 -aI-951 -aa(lp3459 -g20 -aI846 -aI-703 -aa(lp3460 -g20 -aI751 -aI-703 -aa(lp3461 -g15 -aI753 -aI-719 -aI752 -aI-706 -aI752 -aI-711 -aa(lp3462 -g15 -aI755 -aI-744 -aI754 -aI-727 -aI754 -aI-735 -aa(lp3463 -g15 -aI757 -aI-767 -aI756 -aI-752 -aI756 -aI-760 -aa(lp3464 -g15 -aI758 -aI-780 -aI758 -aI-774 -aI758 -aI-779 -aa(lp3465 -g15 -aI753 -aI-815 -aI758 -aI-792 -aI756 -aI-804 -aa(lp3466 -g15 -aI736 -aI-843 -aI749 -aI-826 -aI744 -aI-835 -aa(lp3467 -g15 -aI708 -aI-863 -aI729 -aI-852 -aI719 -aI-858 -aa(lp3468 -g15 -aI664 -aI-869 -aI696 -aI-867 -aI681 -aI-869 -aa(lp3469 -g20 -aI486 -aI-869 -aa(lp3470 -g20 -aI416 -aI-536 -aa(lp3471 -g20 -aI718 -aI-536 -aa(lp3472 -g20 -aI701 -aI-456 -aa(lp3473 -g20 -aI398 -aI-456 -aa(lp3474 -g20 -aI318 -aI-80 -aa(lp3475 -g20 -aI529 -aI-80 -aa(lp3476 -g15 -aI585 -aI-89 -aI550 -aI-80 -aI568 -aI-83 -aa(lp3477 -g15 -aI628 -aI-113 -aI601 -aI-95 -aI616 -aI-103 -aa(lp3478 -g15 -aI659 -aI-148 -aI640 -aI-123 -aI650 -aI-135 -aa(lp3479 -g15 -aI679 -aI-190 -aI667 -aI-161 -aI674 -aI-175 -aa(lp3480 -g20 -aI701 -aI-247 -aa(lp3481 -g20 -aI796 -aI-247 -aa(lp3482 -g20 -aI734 -aI0 -aa(lp3483 -g20 -aI-30 -aI0 -aa(lp3484 -g10 -aa(lp3485 -g8 -aI843 -aI0 -aa(lp3486 -g10 -aa(lp3487 -g8 -aI843 -aI0 -aasVI -(lp3488 -(lp3489 -g8 -aI-30 -aI0 -aa(lp3490 -g20 -aI-16 -aI-70 -aa(lp3491 -g20 -aI1 -aI-70 -aa(lp3492 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp3493 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp3494 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp3495 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp3496 -g20 -aI262 -aI-804 -aa(lp3497 -g15 -aI266 -aI-821 -aI264 -aI-809 -aI265 -aI-815 -aa(lp3498 -g15 -aI268 -aI-835 -aI267 -aI-827 -aI268 -aI-832 -aa(lp3499 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp3500 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp3501 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp3502 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp3503 -g20 -aI154 -aI-881 -aa(lp3504 -g20 -aI169 -aI-951 -aa(lp3505 -g20 -aI629 -aI-951 -aa(lp3506 -g20 -aI614 -aI-881 -aa(lp3507 -g20 -aI597 -aI-881 -aa(lp3508 -g15 -aI555 -aI-878 -aI582 -aI-881 -aI568 -aI-880 -aa(lp3509 -g15 -aI517 -aI-866 -aI541 -aI-876 -aI528 -aI-872 -aa(lp3510 -g15 -aI488 -aI-841 -aI506 -aI-861 -aI496 -aI-852 -aa(lp3511 -g15 -aI470 -aI-799 -aI480 -aI-831 -aI474 -aI-817 -aa(lp3512 -g20 -aI333 -aI-146 -aa(lp3513 -g15 -aI330 -aI-129 -aI332 -aI-141 -aI331 -aI-135 -aa(lp3514 -g15 -aI328 -aI-115 -aI328 -aI-123 -aI328 -aI-118 -aa(lp3515 -g15 -aI335 -aI-92 -aI328 -aI-105 -aI330 -aI-98 -aa(lp3516 -g15 -aI355 -aI-78 -aI340 -aI-86 -aI346 -aI-81 -aa(lp3517 -g15 -aI386 -aI-72 -aI364 -aI-75 -aI374 -aI-73 -aa(lp3518 -g15 -aI425 -aI-70 -aI398 -aI-71 -aI411 -aI-70 -aa(lp3519 -g20 -aI442 -aI-70 -aa(lp3520 -g20 -aI427 -aI0 -aa(lp3521 -g10 -aa(lp3522 -g8 -aI534 -aI0 -aa(lp3523 -g10 -aa(lp3524 -g8 -aI534 -aI0 -aasVM -(lp3525 -(lp3526 -g8 -aI1365 -aI-951 -aa(lp3527 -g20 -aI1350 -aI-881 -aa(lp3528 -g20 -aI1333 -aI-881 -aa(lp3529 -g15 -aI1291 -aI-878 -aI1319 -aI-881 -aI1305 -aI-880 -aa(lp3530 -g15 -aI1254 -aI-866 -aI1278 -aI-876 -aI1265 -aI-872 -aa(lp3531 -g15 -aI1225 -aI-841 -aI1243 -aI-861 -aI1233 -aI-852 -aa(lp3532 -g15 -aI1207 -aI-799 -aI1217 -aI-831 -aI1211 -aI-817 -aa(lp3533 -g20 -aI1070 -aI-146 -aa(lp3534 -g15 -aI1066 -aI-129 -aI1069 -aI-141 -aI1067 -aI-135 -aa(lp3535 -g15 -aI1065 -aI-115 -aI1065 -aI-123 -aI1065 -aI-118 -aa(lp3536 -g15 -aI1072 -aI-92 -aI1065 -aI-105 -aI1067 -aI-98 -aa(lp3537 -g15 -aI1092 -aI-78 -aI1077 -aI-86 -aI1083 -aI-81 -aa(lp3538 -g15 -aI1122 -aI-72 -aI1100 -aI-75 -aI1110 -aI-73 -aa(lp3539 -g15 -aI1161 -aI-70 -aI1134 -aI-71 -aI1147 -aI-70 -aa(lp3540 -g20 -aI1178 -aI-70 -aa(lp3541 -g20 -aI1164 -aI0 -aa(lp3542 -g20 -aI709 -aI0 -aa(lp3543 -g20 -aI723 -aI-70 -aa(lp3544 -g20 -aI741 -aI-70 -aa(lp3545 -g15 -aI783 -aI-73 -aI755 -aI-70 -aI769 -aI-71 -aa(lp3546 -g15 -aI819 -aI-84 -aI796 -aI-74 -aI808 -aI-78 -aa(lp3547 -g15 -aI848 -aI-108 -aI831 -aI-90 -aI840 -aI-98 -aa(lp3548 -g15 -aI866 -aI-151 -aI857 -aI-119 -aI863 -aI-133 -aa(lp3549 -g20 -aI1007 -aI-819 -aa(lp3550 -g20 -aI566 -aI0 -aa(lp3551 -g20 -aI474 -aI0 -aa(lp3552 -g20 -aI366 -aI-819 -aa(lp3553 -g20 -aI225 -aI-157 -aa(lp3554 -g15 -aI220 -aI-131 -aI223 -aI-147 -aI221 -aI-138 -aa(lp3555 -g15 -aI218 -aI-115 -aI219 -aI-124 -aI218 -aI-118 -aa(lp3556 -g15 -aI225 -aI-92 -aI218 -aI-105 -aI221 -aI-98 -aa(lp3557 -g15 -aI246 -aI-78 -aI230 -aI-86 -aI237 -aI-81 -aa(lp3558 -g15 -aI277 -aI-72 -aI254 -aI-75 -aI265 -aI-73 -aa(lp3559 -g15 -aI315 -aI-70 -aI288 -aI-71 -aI301 -aI-70 -aa(lp3560 -g20 -aI320 -aI-70 -aa(lp3561 -g20 -aI305 -aI0 -aa(lp3562 -g20 -aI-30 -aI0 -aa(lp3563 -g20 -aI-16 -aI-70 -aa(lp3564 -g20 -aI1 -aI-70 -aa(lp3565 -g15 -aI41 -aI-73 -aI15 -aI-70 -aI28 -aI-71 -aa(lp3566 -g15 -aI78 -aI-84 -aI55 -aI-74 -aI67 -aI-78 -aa(lp3567 -g15 -aI106 -aI-108 -aI88 -aI-89 -aI98 -aI-97 -aa(lp3568 -g15 -aI123 -aI-149 -aI114 -aI-118 -aI120 -aI-132 -aa(lp3569 -g20 -aI259 -aI-789 -aa(lp3570 -g15 -aI268 -aI-835 -aI265 -aI-812 -aI268 -aI-828 -aa(lp3571 -g15 -aI261 -aI-858 -aI268 -aI-845 -aI265 -aI-852 -aa(lp3572 -g15 -aI241 -aI-872 -aI256 -aI-864 -aI249 -aI-869 -aa(lp3573 -g15 -aI210 -aI-879 -aI232 -aI-876 -aI222 -aI-878 -aa(lp3574 -g15 -aI171 -aI-881 -aI198 -aI-880 -aI185 -aI-881 -aa(lp3575 -g20 -aI154 -aI-881 -aa(lp3576 -g20 -aI169 -aI-951 -aa(lp3577 -g20 -aI541 -aI-951 -aa(lp3578 -g20 -aI630 -aI-303 -aa(lp3579 -g20 -aI979 -aI-951 -aa(lp3580 -g10 -aa(lp3581 -g8 -aI1269 -aI0 -aa(lp3582 -g10 -aa(lp3583 -g8 -aI1269 -aI0 -aasVQ -(lp3584 -(lp3585 -g8 -aI82 -aI-354 -aa(lp3586 -g15 -aI98 -aI-488 -aI82 -aI-396 -aI87 -aI-441 -aa(lp3587 -g15 -aI146 -aI-626 -aI109 -aI-535 -aI125 -aI-581 -aa(lp3588 -g15 -aI225 -aI-756 -aI167 -aI-672 -aI194 -aI-715 -aa(lp3589 -g15 -aI336 -aI-864 -aI257 -aI-797 -aI294 -aI-833 -aa(lp3590 -g15 -aI477 -aI-938 -aI378 -aI-895 -aI425 -aI-920 -aa(lp3591 -g15 -aI650 -aI-966 -aI530 -aI-957 -aI587 -aI-966 -aa(lp3592 -g15 -aI790 -aI-944 -aI699 -aI-966 -aI746 -aI-959 -aa(lp3593 -g15 -aI908 -aI-878 -aI835 -aI-930 -aI874 -aI-908 -aa(lp3594 -g15 -aI988 -aI-764 -aI942 -aI-848 -aI968 -aI-810 -aa(lp3595 -g15 -aI1018 -aI-599 -aI1008 -aI-718 -aI1018 -aI-663 -aa(lp3596 -g15 -aI1006 -aI-484 -aI1018 -aI-563 -aI1014 -aI-524 -aa(lp3597 -g15 -aI971 -aI-363 -aI998 -aI-444 -aI986 -aI-403 -aa(lp3598 -g15 -aI910 -aI-244 -aI955 -aI-322 -aI935 -aI-283 -aa(lp3599 -g15 -aI825 -aI-138 -aI886 -aI-206 -aI858 -aI-170 -aa(lp3600 -g15 -aI716 -aI-53 -aI793 -aI-106 -aI756 -aI-77 -aa(lp3601 -g15 -aI581 -aI0 -aI675 -aI-29 -aI630 -aI-11 -aa(lp3602 -g15 -aI595 -aI121 -aI582 -aI49 -aI587 -aI89 -aa(lp3603 -g15 -aI626 -aI195 -aI602 -aI152 -aI613 -aI177 -aa(lp3604 -g15 -aI674 -aI232 -aI640 -aI213 -aI656 -aI225 -aa(lp3605 -g15 -aI734 -aI243 -aI692 -aI239 -aI712 -aI243 -aa(lp3606 -g20 -aI755 -aI243 -aa(lp3607 -g20 -aI738 -aI320 -aa(lp3608 -g20 -aI642 -aI320 -aa(lp3609 -g15 -aI531 -aI302 -aI602 -aI320 -aI565 -aI314 -aa(lp3610 -g15 -aI441 -aI246 -aI496 -aI290 -aI467 -aI272 -aa(lp3611 -g15 -aI381 -aI148 -aI416 -aI221 -aI396 -aI188 -aa(lp3612 -g15 -aI357 -aI4 -aI366 -aI108 -aI358 -aI60 -aa(lp3613 -g15 -aI246 -aI-36 -aI317 -aI-3 -aI280 -aI-17 -aa(lp3614 -g15 -aI159 -aI-111 -aI212 -aI-56 -aI183 -aI-81 -aa(lp3615 -g15 -aI102 -aI-217 -aI135 -aI-141 -aI116 -aI-176 -aa(lp3616 -g15 -aI82 -aI-354 -aI89 -aI-257 -aI82 -aI-303 -aa(lp3617 -g10 -aa(lp3618 -g8 -aI300 -aI-322 -aa(lp3619 -g15 -aI314 -aI-209 -aI300 -aI-278 -aI304 -aI-240 -aa(lp3620 -g15 -aI352 -aI-132 -aI323 -aI-178 -aI336 -aI-152 -aa(lp3621 -g15 -aI410 -aI-87 -aI368 -aI-111 -aI388 -aI-96 -aa(lp3622 -g15 -aI481 -aI-73 -aI432 -aI-77 -aI455 -aI-73 -aa(lp3623 -g15 -aI581 -aI-99 -aI518 -aI-73 -aI551 -aI-82 -aa(lp3624 -g15 -aI662 -aI-171 -aI611 -aI-117 -aI638 -aI-141 -aa(lp3625 -g15 -aI724 -aI-273 -aI686 -aI-200 -aI707 -aI-234 -aa(lp3626 -g15 -aI768 -aI-392 -aI742 -aI-311 -aI757 -aI-351 -aa(lp3627 -g15 -aI794 -aI-516 -aI780 -aI-434 -aI788 -aI-475 -aa(lp3628 -g15 -aI802 -aI-630 -aI799 -aI-557 -aI802 -aI-595 -aa(lp3629 -g15 -aI789 -aI-742 -aI802 -aI-673 -aI798 -aI-711 -aa(lp3630 -g15 -aI751 -aI-819 -aI779 -aI-773 -aI767 -aI-799 -aa(lp3631 -g15 -aI694 -aI-865 -aI735 -aI-840 -aI716 -aI-855 -aa(lp3632 -g15 -aI622 -aI-879 -aI672 -aI-874 -aI648 -aI-879 -aa(lp3633 -g15 -aI521 -aI-853 -aI585 -aI-879 -aI551 -aI-870 -aa(lp3634 -g15 -aI440 -aI-781 -aI491 -aI-835 -aI464 -aI-811 -aa(lp3635 -g15 -aI378 -aI-679 -aI416 -aI-752 -aI396 -aI-717 -aa(lp3636 -g15 -aI334 -aI-559 -aI360 -aI-641 -aI345 -aI-601 -aa(lp3637 -g15 -aI308 -aI-436 -aI322 -aI-518 -aI314 -aI-477 -aa(lp3638 -g15 -aI300 -aI-322 -aI302 -aI-395 -aI300 -aI-357 -aa(lp3639 -g10 -aa(lp3640 -g8 -aI1049 -aI0 -aa(lp3641 -g10 -aa(lp3642 -g8 -aI1049 -aI0 -aasVU -(lp3643 -(lp3644 -g8 -aI502 -aI-80 -aa(lp3645 -g15 -aI604 -aI-98 -aI542 -aI-80 -aI577 -aI-86 -aa(lp3646 -g15 -aI674 -aI-147 -aI632 -aI-110 -aI655 -aI-126 -aa(lp3647 -g15 -aI719 -aI-220 -aI693 -aI-167 -aI708 -aI-192 -aa(lp3648 -g15 -aI746 -aI-314 -aI730 -aI-249 -aI739 -aI-280 -aa(lp3649 -g20 -aI849 -aI-795 -aa(lp3650 -g15 -aI853 -aI-818 -aI850 -aI-803 -aI852 -aI-810 -aa(lp3651 -g15 -aI854 -aI-835 -aI854 -aI-826 -aI854 -aI-832 -aa(lp3652 -g15 -aI847 -aI-858 -aI854 -aI-845 -aI852 -aI-852 -aa(lp3653 -g15 -aI827 -aI-872 -aI842 -aI-864 -aI836 -aI-869 -aa(lp3654 -g15 -aI797 -aI-879 -aI819 -aI-876 -aI809 -aI-878 -aa(lp3655 -g15 -aI758 -aI-881 -aI785 -aI-880 -aI772 -aI-881 -aa(lp3656 -g20 -aI741 -aI-881 -aa(lp3657 -g20 -aI755 -aI-951 -aa(lp3658 -g20 -aI1106 -aI-951 -aa(lp3659 -g20 -aI1091 -aI-881 -aa(lp3660 -g20 -aI1074 -aI-881 -aa(lp3661 -g15 -aI1033 -aI-878 -aI1060 -aI-881 -aI1046 -aI-880 -aa(lp3662 -g15 -aI996 -aI-866 -aI1019 -aI-876 -aI1007 -aI-872 -aa(lp3663 -g15 -aI967 -aI-841 -aI984 -aI-861 -aI975 -aI-852 -aa(lp3664 -g15 -aI949 -aI-799 -aI959 -aI-831 -aI953 -aI-817 -aa(lp3665 -g20 -aI842 -aI-293 -aa(lp3666 -g15 -aI795 -aI-161 -aI832 -aI-243 -aI816 -aI-199 -aa(lp3667 -g15 -aI717 -aI-64 -aI775 -aI-122 -aI749 -aI-90 -aa(lp3668 -g15 -aI604 -aI-6 -aI685 -aI-39 -aI647 -aI-19 -aa(lp3669 -g15 -aI454 -aI13 -aI560 -aI6 -aI510 -aI13 -aa(lp3670 -g15 -aI316 -aI-1 -aI402 -aI13 -aI356 -aI8 -aa(lp3671 -g15 -aI215 -aI-46 -aI276 -aI-12 -aI242 -aI-26 -aa(lp3672 -g15 -aI153 -aI-119 -aI188 -aI-66 -aI167 -aI-90 -aa(lp3673 -g15 -aI132 -aI-216 -aI139 -aI-147 -aI132 -aI-180 -aa(lp3674 -g15 -aI133 -aI-243 -aI132 -aI-223 -aI132 -aI-232 -aa(lp3675 -g15 -aI136 -aI-275 -aI134 -aI-253 -aI135 -aI-264 -aa(lp3676 -g15 -aI141 -aI-307 -aI138 -aI-286 -aI139 -aI-297 -aa(lp3677 -g15 -aI146 -aI-335 -aI143 -aI-318 -aI144 -aI-327 -aa(lp3678 -g20 -aI244 -aI-789 -aa(lp3679 -g15 -aI251 -aI-835 -aI249 -aI-813 -aI251 -aI-828 -aa(lp3680 -g15 -aI244 -aI-858 -aI251 -aI-845 -aI249 -aI-852 -aa(lp3681 -g15 -aI224 -aI-872 -aI240 -aI-864 -aI233 -aI-869 -aa(lp3682 -g15 -aI194 -aI-879 -aI216 -aI-876 -aI206 -aI-878 -aa(lp3683 -g15 -aI156 -aI-881 -aI182 -aI-880 -aI170 -aI-881 -aa(lp3684 -g20 -aI138 -aI-881 -aa(lp3685 -g20 -aI153 -aI-951 -aa(lp3686 -g20 -aI614 -aI-951 -aa(lp3687 -g20 -aI600 -aI-881 -aa(lp3688 -g20 -aI582 -aI-881 -aa(lp3689 -g15 -aI540 -aI-878 -aI567 -aI-881 -aI553 -aI-880 -aa(lp3690 -g15 -aI502 -aI-867 -aI526 -aI-876 -aI513 -aI-872 -aa(lp3691 -g15 -aI473 -aI-843 -aI491 -aI-861 -aI481 -aI-853 -aa(lp3692 -g15 -aI455 -aI-802 -aI465 -aI-832 -aI459 -aI-819 -aa(lp3693 -g20 -aI354 -aI-332 -aa(lp3694 -g15 -aI349 -aI-306 -aI353 -aI-325 -aI351 -aI-316 -aa(lp3695 -g15 -aI344 -aI-277 -aI347 -aI-297 -aI345 -aI-287 -aa(lp3696 -g15 -aI340 -aI-246 -aI342 -aI-267 -aI341 -aI-256 -aa(lp3697 -g15 -aI338 -aI-216 -aI339 -aI-235 -aI338 -aI-226 -aa(lp3698 -g15 -aI380 -aI-115 -aI338 -aI-172 -aI352 -aI-138 -aa(lp3699 -g15 -aI502 -aI-80 -aI407 -aI-92 -aI448 -aI-80 -aa(lp3700 -g10 -aa(lp3701 -g8 -aI996 -aI0 -aa(lp3702 -g10 -aa(lp3703 -g8 -aI996 -aI0 -aasVY -(lp3704 -(lp3705 -g8 -aI147 -aI0 -aa(lp3706 -g20 -aI162 -aI-70 -aa(lp3707 -g20 -aI198 -aI-70 -aa(lp3708 -g15 -aI238 -aI-73 -aI212 -aI-70 -aI225 -aI-71 -aa(lp3709 -g15 -aI274 -aI-85 -aI251 -aI-75 -aI263 -aI-79 -aa(lp3710 -g15 -aI302 -aI-109 -aI285 -aI-91 -aI294 -aI-99 -aa(lp3711 -g15 -aI320 -aI-151 -aI310 -aI-119 -aI316 -aI-133 -aa(lp3712 -g20 -aI358 -aI-336 -aa(lp3713 -g20 -aI214 -aI-810 -aa(lp3714 -g15 -aI202 -aI-843 -aI210 -aI-823 -aI206 -aI-834 -aa(lp3715 -g15 -aI188 -aI-865 -aI198 -aI-852 -aI193 -aI-859 -aa(lp3716 -g15 -aI166 -aI-877 -aI182 -aI-870 -aI175 -aI-874 -aa(lp3717 -g15 -aI134 -aI-881 -aI158 -aI-879 -aI147 -aI-881 -aa(lp3718 -g20 -aI117 -aI-881 -aa(lp3719 -g20 -aI132 -aI-951 -aa(lp3720 -g20 -aI565 -aI-951 -aa(lp3721 -g20 -aI550 -aI-881 -aa(lp3722 -g20 -aI490 -aI-881 -aa(lp3723 -g15 -aI447 -aI-870 -aI470 -aI-881 -aI456 -aI-877 -aa(lp3724 -g15 -aI434 -aI-841 -aI439 -aI-863 -aI434 -aI-854 -aa(lp3725 -g15 -aI438 -aI-808 -aI434 -aI-834 -aI436 -aI-822 -aa(lp3726 -g15 -aI450 -aI-755 -aI441 -aI-793 -aI445 -aI-775 -aa(lp3727 -g20 -aI498 -aI-567 -aa(lp3728 -g15 -aI508 -aI-525 -aI501 -aI-554 -aI504 -aI-540 -aa(lp3729 -g15 -aI517 -aI-481 -aI511 -aI-510 -aI515 -aI-496 -aa(lp3730 -g15 -aI525 -aI-438 -aI520 -aI-466 -aI523 -aI-452 -aa(lp3731 -g15 -aI529 -aI-400 -aI527 -aI-423 -aI528 -aI-411 -aa(lp3732 -g15 -aI567 -aI-468 -aI537 -aI-418 -aI550 -aI-440 -aa(lp3733 -g15 -aI626 -aI-558 -aI583 -aI-495 -aI603 -aI-525 -aa(lp3734 -g20 -aI758 -aI-746 -aa(lp3735 -g15 -aI786 -aI-795 -aI769 -aI-761 -aI778 -aI-777 -aa(lp3736 -g15 -aI798 -aI-844 -aI794 -aI-813 -aI798 -aI-829 -aa(lp3737 -g15 -aI780 -aI-871 -aI798 -aI-856 -aI792 -aI-865 -aa(lp3738 -g15 -aI717 -aI-881 -aI767 -aI-878 -aI746 -aI-881 -aa(lp3739 -g20 -aI689 -aI-881 -aa(lp3740 -g20 -aI705 -aI-951 -aa(lp3741 -g20 -aI1054 -aI-951 -aa(lp3742 -g20 -aI1039 -aI-881 -aa(lp3743 -g20 -aI1014 -aI-881 -aa(lp3744 -g15 -aI987 -aI-877 -aI1004 -aI-881 -aI995 -aI-879 -aa(lp3745 -g15 -aI961 -aI-863 -aI978 -aI-874 -aI970 -aI-869 -aa(lp3746 -g15 -aI933 -aI-836 -aI952 -aI-856 -aI943 -aI-847 -aa(lp3747 -g15 -aI901 -aI-794 -aI924 -aI-825 -aI913 -aI-811 -aa(lp3748 -g20 -aI570 -aI-335 -aa(lp3749 -g20 -aI530 -aI-146 -aa(lp3750 -g15 -aI527 -aI-129 -aI529 -aI-141 -aI528 -aI-135 -aa(lp3751 -g15 -aI525 -aI-115 -aI526 -aI-123 -aI525 -aI-118 -aa(lp3752 -g15 -aI532 -aI-92 -aI525 -aI-105 -aI527 -aI-98 -aa(lp3753 -g15 -aI552 -aI-78 -aI537 -aI-86 -aI544 -aI-81 -aa(lp3754 -g15 -aI583 -aI-72 -aI561 -aI-75 -aI571 -aI-73 -aa(lp3755 -g15 -aI622 -aI-70 -aI595 -aI-71 -aI608 -aI-70 -aa(lp3756 -g20 -aI654 -aI-70 -aa(lp3757 -g20 -aI639 -aI0 -aa(lp3758 -g10 -aa(lp3759 -g8 -aI923 -aI0 -aa(lp3760 -g10 -aa(lp3761 -g8 -aI923 -aI0 -aasV] -(lp3762 -(lp3763 -g8 -aI549 -aI-1012 -aa(lp3764 -g20 -aI297 -aI171 -aa(lp3765 -g20 -aI-70 -aI171 -aa(lp3766 -g20 -aI-55 -aI100 -aa(lp3767 -g20 -aI1 -aI100 -aa(lp3768 -g15 -aI43 -aI97 -aI16 -aI100 -aI30 -aI99 -aa(lp3769 -g15 -aI81 -aI84 -aI57 -aI95 -aI70 -aI90 -aa(lp3770 -g15 -aI111 -aI54 -aI92 -aI77 -aI102 -aI67 -aa(lp3771 -g15 -aI130 -aI4 -aI120 -aI42 -aI126 -aI25 -aa(lp3772 -g20 -aI310 -aI-845 -aa(lp3773 -g15 -aI314 -aI-879 -aI313 -aI-859 -aI314 -aI-870 -aa(lp3774 -g15 -aI307 -aI-912 -aI314 -aI-893 -aI312 -aI-904 -aa(lp3775 -g15 -aI287 -aI-931 -aI302 -aI-920 -aI296 -aI-926 -aa(lp3776 -g15 -aI258 -aI-940 -aI279 -aI-936 -aI269 -aI-939 -aa(lp3777 -g15 -aI222 -aI-942 -aI247 -aI-941 -aI235 -aI-942 -aa(lp3778 -g20 -aI165 -aI-942 -aa(lp3779 -g20 -aI179 -aI-1012 -aa(lp3780 -g10 -aa(lp3781 -g8 -aI552 -aI0 -aa(lp3782 -g10 -aa(lp3783 -g8 -aI552 -aI0 -aasVa -(lp3784 -(lp3785 -g8 -aI630 -aI13 -aa(lp3786 -g15 -aI535 -aI-13 -aI591 -aI13 -aI559 -aI4 -aa(lp3787 -g15 -aI500 -aI-92 -aI511 -aI-31 -aI500 -aI-57 -aa(lp3788 -g15 -aI501 -aI-133 -aI500 -aI-106 -aI500 -aI-120 -aa(lp3789 -g15 -aI509 -aI-179 -aI503 -aI-146 -aI505 -aI-161 -aa(lp3790 -g20 -aI500 -aI-179 -aa(lp3791 -g15 -aI450 -aI-96 -aI483 -aI-148 -aI467 -aI-120 -aa(lp3792 -g15 -aI396 -aI-36 -aI434 -aI-72 -aI416 -aI-52 -aa(lp3793 -g15 -aI329 -aI0 -aI376 -aI-20 -aI354 -aI-7 -aa(lp3794 -g15 -aI244 -aI13 -aI305 -aI9 -aI276 -aI13 -aa(lp3795 -g15 -aI160 -aI-5 -aI212 -aI13 -aI184 -aI7 -aa(lp3796 -g15 -aI101 -aI-56 -aI136 -aI-17 -aI117 -aI-34 -aa(lp3797 -g15 -aI65 -aI-133 -aI85 -aI-77 -aI73 -aI-103 -aa(lp3798 -g15 -aI53 -aI-230 -aI57 -aI-163 -aI53 -aI-195 -aa(lp3799 -g15 -aI65 -aI-339 -aI53 -aI-264 -aI57 -aI-301 -aa(lp3800 -g15 -aI101 -aI-451 -aI73 -aI-377 -aI85 -aI-414 -aa(lp3801 -g15 -aI161 -aI-556 -aI117 -aI-488 -aI137 -aI-523 -aa(lp3802 -g15 -aI243 -aI-644 -aI184 -aI-590 -aI212 -aI-619 -aa(lp3803 -g15 -aI347 -aI-704 -aI274 -aI-669 -aI308 -aI-689 -aa(lp3804 -g15 -aI472 -aI-727 -aI385 -aI-719 -aI426 -aI-727 -aa(lp3805 -g15 -aI525 -aI-723 -aI489 -aI-727 -aI507 -aI-726 -aa(lp3806 -g15 -aI576 -aI-712 -aI543 -aI-720 -aI560 -aI-716 -aa(lp3807 -g15 -aI623 -aI-697 -aI593 -aI-708 -aI608 -aI-703 -aa(lp3808 -g15 -aI660 -aI-681 -aI637 -aI-692 -aI650 -aI-686 -aa(lp3809 -g20 -aI730 -aI-713 -aa(lp3810 -g20 -aI801 -aI-713 -aa(lp3811 -g20 -aI713 -aI-297 -aa(lp3812 -g15 -aI707 -aI-267 -aI711 -aI-289 -aI709 -aI-279 -aa(lp3813 -g15 -aI699 -aI-229 -aI704 -aI-255 -aI701 -aI-242 -aa(lp3814 -g15 -aI693 -aI-189 -aI697 -aI-215 -aI695 -aI-202 -aa(lp3815 -g15 -aI690 -aI-157 -aI691 -aI-176 -aI690 -aI-165 -aa(lp3816 -g15 -aI703 -aI-107 -aI690 -aI-134 -aI695 -aI-118 -aa(lp3817 -g15 -aI737 -aI-91 -aI712 -aI-96 -aI723 -aI-91 -aa(lp3818 -g15 -aI773 -aI-99 -aI750 -aI-91 -aI762 -aI-94 -aa(lp3819 -g15 -aI811 -aI-119 -aI785 -aI-104 -aI797 -aI-111 -aa(lp3820 -g20 -aI841 -aI-65 -aa(lp3821 -g15 -aI802 -aI-38 -aI829 -aI-57 -aI817 -aI-48 -aa(lp3822 -g15 -aI754 -aI-13 -aI788 -aI-29 -aI772 -aI-21 -aa(lp3823 -g15 -aI697 -aI5 -aI737 -aI-5 -aI718 -aI0 -aa(lp3824 -g15 -aI630 -aI13 -aI676 -aI10 -aI654 -aI13 -aa(lp3825 -g10 -aa(lp3826 -g8 -aI255 -aI-228 -aa(lp3827 -g15 -aI261 -aI-164 -aI255 -aI-203 -aI257 -aI-181 -aa(lp3828 -g15 -aI276 -aI-122 -aI265 -aI-146 -aI270 -aI-132 -aa(lp3829 -g15 -aI299 -aI-99 -aI282 -aI-111 -aI290 -aI-104 -aa(lp3830 -g15 -aI328 -aI-92 -aI308 -aI-94 -aI317 -aI-92 -aa(lp3831 -g15 -aI388 -aI-118 -aI347 -aI-92 -aI367 -aI-101 -aa(lp3832 -g15 -aI447 -aI-184 -aI409 -aI-134 -aI429 -aI-157 -aa(lp3833 -g15 -aI496 -aI-278 -aI465 -aI-212 -aI481 -aI-243 -aa(lp3834 -g15 -aI529 -aI-383 -aI510 -aI-312 -aI521 -aI-348 -aa(lp3835 -g20 -aI576 -aI-605 -aa(lp3836 -g15 -aI540 -aI-633 -aI567 -aI-617 -aI555 -aI-626 -aa(lp3837 -g15 -aI490 -aI-642 -aI524 -aI-639 -aI508 -aI-642 -aa(lp3838 -g15 -aI419 -aI-621 -aI464 -aI-642 -aI441 -aI-635 -aa(lp3839 -g15 -aI361 -aI-567 -aI398 -aI-608 -aI378 -aI-590 -aa(lp3840 -g15 -aI315 -aI-491 -aI343 -aI-545 -aI328 -aI-519 -aa(lp3841 -g15 -aI282 -aI-401 -aI302 -aI-462 -aI291 -aI-432 -aa(lp3842 -g15 -aI262 -aI-310 -aI273 -aI-371 -aI266 -aI-340 -aa(lp3843 -g15 -aI255 -aI-228 -aI258 -aI-280 -aI255 -aI-253 -aa(lp3844 -g10 -aa(lp3845 -g8 -aI886 -aI0 -aa(lp3846 -g10 -aa(lp3847 -g8 -aI886 -aI0 -aasVe -(lp3848 -(lp3849 -g8 -aI402 -aI-87 -aa(lp3850 -g15 -aI464 -aI-96 -aI424 -aI-87 -aI444 -aI-90 -aa(lp3851 -g15 -aI518 -aI-121 -aI483 -aI-103 -aI501 -aI-111 -aa(lp3852 -g15 -aI563 -aI-156 -aI535 -aI-131 -aI550 -aI-143 -aa(lp3853 -g15 -aI597 -aI-195 -aI576 -aI-168 -aI588 -aI-182 -aa(lp3854 -g15 -aI610 -aI-170 -aI602 -aI-188 -aI606 -aI-180 -aa(lp3855 -g15 -aI614 -aI-138 -aI613 -aI-160 -aI614 -aI-149 -aa(lp3856 -g15 -aI598 -aI-87 -aI614 -aI-122 -aI609 -aI-105 -aa(lp3857 -g15 -aI551 -aI-38 -aI588 -aI-69 -aI572 -aI-53 -aa(lp3858 -g15 -aI469 -aI-1 -aI529 -aI-23 -aI502 -aI-10 -aa(lp3859 -g15 -aI350 -aI13 -aI435 -aI8 -aI396 -aI13 -aa(lp3860 -g15 -aI235 -aI-3 -aI310 -aI13 -aI271 -aI7 -aa(lp3861 -g15 -aI140 -aI-54 -aI199 -aI-14 -aI168 -aI-31 -aa(lp3862 -g15 -aI76 -aI-140 -aI113 -aI-77 -aI92 -aI-105 -aa(lp3863 -g15 -aI53 -aI-261 -aI61 -aI-175 -aI53 -aI-215 -aa(lp3864 -g15 -aI66 -aI-365 -aI53 -aI-294 -aI57 -aI-329 -aa(lp3865 -g15 -aI105 -aI-471 -aI75 -aI-401 -aI87 -aI-436 -aa(lp3866 -g15 -aI168 -aI-569 -aI122 -aI-505 -aI143 -aI-538 -aa(lp3867 -g15 -aI257 -aI-651 -aI194 -aI-600 -aI223 -aI-627 -aa(lp3868 -g15 -aI369 -aI-706 -aI290 -aI-674 -aI328 -aI-693 -aa(lp3869 -g15 -aI505 -aI-727 -aI410 -aI-720 -aI456 -aI-727 -aa(lp3870 -g15 -aI653 -aI-686 -aI569 -aI-727 -aI618 -aI-713 -aa(lp3871 -g15 -aI706 -aI-570 -aI688 -aI-658 -aI706 -aI-619 -aa(lp3872 -g15 -aI676 -aI-466 -aI706 -aI-534 -aI696 -aI-499 -aa(lp3873 -g15 -aI593 -aI-380 -aI656 -aI-434 -aI628 -aI-405 -aa(lp3874 -g15 -aI468 -aI-320 -aI558 -aI-355 -aI516 -aI-335 -aa(lp3875 -g15 -aI309 -aI-298 -aI419 -aI-305 -aI366 -aI-298 -aa(lp3876 -g15 -aI285 -aI-298 -aI301 -aI-298 -aI293 -aI-298 -aa(lp3877 -g15 -aI259 -aI-299 -aI276 -aI-298 -aI268 -aI-298 -aa(lp3878 -g15 -aI257 -aI-273 -aI258 -aI-290 -aI257 -aI-282 -aa(lp3879 -g15 -aI257 -aI-248 -aI257 -aI-264 -aI257 -aI-256 -aa(lp3880 -g15 -aI293 -aI-129 -aI257 -aI-197 -aI269 -aI-157 -aa(lp3881 -g15 -aI402 -aI-87 -aI317 -aI-101 -aI353 -aI-87 -aa(lp3882 -g10 -aa(lp3883 -g8 -aI449 -aI-647 -aa(lp3884 -g15 -aI387 -aI-622 -aI427 -aI-647 -aI406 -aI-639 -aa(lp3885 -g15 -aI334 -aI-559 -aI367 -aI-606 -aI350 -aI-585 -aa(lp3886 -g15 -aI294 -aI-471 -aI319 -aI-533 -aI305 -aI-504 -aa(lp3887 -g15 -aI269 -aI-375 -aI282 -aI-439 -aI274 -aI-407 -aa(lp3888 -g20 -aI281 -aI-375 -aa(lp3889 -g15 -aI373 -aI-388 -aI314 -aI-375 -aI344 -aI-380 -aa(lp3890 -g15 -aI447 -aI-426 -aI401 -aI-397 -aI426 -aI-410 -aa(lp3891 -g15 -aI497 -aI-484 -aI468 -aI-442 -aI485 -aI-462 -aa(lp3892 -g15 -aI514 -aI-560 -aI509 -aI-507 -aI514 -aI-532 -aa(lp3893 -g15 -aI497 -aI-624 -aI514 -aI-588 -aI509 -aI-609 -aa(lp3894 -g15 -aI449 -aI-647 -aI486 -aI-639 -aI470 -aI-647 -aa(lp3895 -g10 -aa(lp3896 -g8 -aI713 -aI0 -aa(lp3897 -g10 -aa(lp3898 -g8 -aI713 -aI0 -aasVi -(lp3899 -(lp3900 -g8 -aI404 -aI-714 -aa(lp3901 -g20 -aI311 -aI-280 -aa(lp3902 -g15 -aI298 -aI-212 -aI306 -aI-256 -aI302 -aI-233 -aa(lp3903 -g15 -aI293 -aI-153 -aI295 -aI-191 -aI293 -aI-171 -aa(lp3904 -g15 -aI305 -aI-108 -aI293 -aI-133 -aI297 -aI-118 -aa(lp3905 -g15 -aI339 -aI-92 -aI313 -aI-97 -aI325 -aI-92 -aa(lp3906 -g15 -aI378 -aI-100 -aI353 -aI-92 -aI366 -aI-95 -aa(lp3907 -g15 -aI418 -aI-123 -aI389 -aI-105 -aI403 -aI-113 -aa(lp3908 -g20 -aI450 -aI-78 -aa(lp3909 -g15 -aI414 -aI-44 -aI440 -aI-67 -aI428 -aI-55 -aa(lp3910 -g15 -aI369 -aI-15 -aI401 -aI-33 -aI386 -aI-23 -aa(lp3911 -g15 -aI313 -aI5 -aI352 -aI-6 -aI333 -aI0 -aa(lp3912 -g15 -aI246 -aI13 -aI293 -aI10 -aI271 -aI13 -aa(lp3913 -g15 -aI128 -aI-22 -aI195 -aI13 -aI156 -aI1 -aa(lp3914 -g15 -aI87 -aI-123 -aI101 -aI-46 -aI87 -aI-80 -aa(lp3915 -g15 -aI93 -aI-191 -aI87 -aI-142 -aI89 -aI-165 -aa(lp3916 -g15 -aI109 -aI-282 -aI96 -aI-218 -aI101 -aI-248 -aa(lp3917 -g20 -aI161 -aI-530 -aa(lp3918 -g15 -aI165 -aI-547 -aI162 -aI-535 -aI163 -aI-541 -aa(lp3919 -g15 -aI167 -aI-564 -aI166 -aI-553 -aI167 -aI-559 -aa(lp3920 -g15 -aI169 -aI-578 -aI168 -aI-570 -aI169 -aI-575 -aa(lp3921 -g15 -aI170 -aI-587 -aI170 -aI-582 -aI170 -aI-585 -aa(lp3922 -g15 -aI166 -aI-616 -aI170 -aI-599 -aI169 -aI-609 -aa(lp3923 -g15 -aI154 -aI-633 -aI164 -aI-624 -aI159 -aI-629 -aa(lp3924 -g15 -aI132 -aI-641 -aI148 -aI-637 -aI141 -aI-640 -aa(lp3925 -g15 -aI100 -aI-643 -aI123 -aI-642 -aI112 -aI-643 -aa(lp3926 -g20 -aI76 -aI-643 -aa(lp3927 -g20 -aI87 -aI-714 -aa(lp3928 -g10 -aa(lp3929 -g8 -aI311 -aI-834 -aa(lp3930 -g15 -aI270 -aI-839 -aI297 -aI-834 -aI283 -aI-835 -aa(lp3931 -g15 -aI237 -aI-854 -aI258 -aI-842 -aI247 -aI-847 -aa(lp3932 -g15 -aI215 -aI-880 -aI228 -aI-861 -aI221 -aI-869 -aa(lp3933 -g15 -aI207 -aI-916 -aI210 -aI-890 -aI207 -aI-902 -aa(lp3934 -g15 -aI217 -aI-966 -aI207 -aI-936 -aI211 -aI-952 -aa(lp3935 -g15 -aI244 -aI-1000 -aI224 -aI-980 -aI233 -aI-991 -aa(lp3936 -g15 -aI284 -aI-1020 -aI256 -aI-1009 -aI269 -aI-1015 -aa(lp3937 -g15 -aI332 -aI-1026 -aI299 -aI-1024 -aI315 -aI-1026 -aa(lp3938 -g15 -aI372 -aI-1021 -aI346 -aI-1026 -aI359 -aI-1024 -aa(lp3939 -g15 -aI406 -aI-1006 -aI385 -aI-1018 -aI396 -aI-1013 -aa(lp3940 -g15 -aI430 -aI-980 -aI416 -aI-999 -aI424 -aI-990 -aa(lp3941 -g15 -aI438 -aI-942 -aI435 -aI-969 -aI438 -aI-957 -aa(lp3942 -g15 -aI428 -aI-894 -aI438 -aI-924 -aI435 -aI-908 -aa(lp3943 -g15 -aI399 -aI-860 -aI420 -aI-880 -aI411 -aI-869 -aa(lp3944 -g15 -aI358 -aI-840 -aI387 -aI-851 -aI373 -aI-845 -aa(lp3945 -g15 -aI311 -aI-834 -aI343 -aI-836 -aI327 -aI-834 -aa(lp3946 -g10 -aa(lp3947 -g8 -aI472 -aI0 -aa(lp3948 -g10 -aa(lp3949 -g8 -aI472 -aI0 -aasVm -(lp3950 -(lp3951 -g8 -aI1066 -aI9 -aa(lp3952 -g15 -aI949 -aI-26 -aI1015 -aI9 -aI976 -aI-2 -aa(lp3953 -g15 -aI908 -aI-127 -aI921 -aI-51 -aI908 -aI-84 -aa(lp3954 -g15 -aI913 -aI-195 -aI908 -aI-146 -aI909 -aI-169 -aa(lp3955 -g15 -aI929 -aI-286 -aI916 -aI-221 -aI921 -aI-252 -aa(lp3956 -g20 -aI951 -aI-391 -aa(lp3957 -g15 -aI959 -aI-423 -aI953 -aI-400 -aI956 -aI-410 -aa(lp3958 -g15 -aI967 -aI-462 -aI962 -aI-435 -aI964 -aI-449 -aa(lp3959 -g15 -aI973 -aI-503 -aI969 -aI-476 -aI971 -aI-490 -aa(lp3960 -g15 -aI975 -aI-540 -aI975 -aI-517 -aI975 -aI-529 -aa(lp3961 -g15 -aI973 -aI-566 -aI975 -aI-548 -aI975 -aI-557 -aa(lp3962 -g15 -aI965 -aI-591 -aI972 -aI-575 -aI969 -aI-583 -aa(lp3963 -g15 -aI949 -aI-609 -aI961 -aI-598 -aI956 -aI-604 -aa(lp3964 -g15 -aI922 -aI-616 -aI942 -aI-614 -aI933 -aI-616 -aa(lp3965 -g15 -aI879 -aI-601 -aI908 -aI-616 -aI893 -aI-611 -aa(lp3966 -g15 -aI838 -aI-562 -aI865 -aI-591 -aI851 -aI-578 -aa(lp3967 -g15 -aI800 -aI-506 -aI825 -aI-546 -aI812 -aI-527 -aa(lp3968 -g15 -aI767 -aI-441 -aI788 -aI-485 -aI777 -aI-463 -aa(lp3969 -g15 -aI742 -aI-376 -aI758 -aI-419 -aI749 -aI-397 -aa(lp3970 -g15 -aI727 -aI-317 -aI735 -aI-354 -aI730 -aI-335 -aa(lp3971 -g20 -aI717 -aI-261 -aa(lp3972 -g15 -aI711 -aI-224 -aI715 -aI-252 -aI713 -aI-240 -aa(lp3973 -g15 -aI703 -aI-173 -aI708 -aI-208 -aI706 -aI-191 -aa(lp3974 -g15 -aI695 -aI-117 -aI701 -aI-155 -aI698 -aI-136 -aa(lp3975 -g15 -aI689 -aI-64 -aI693 -aI-98 -aI691 -aI-80 -aa(lp3976 -g15 -aI684 -aI-22 -aI687 -aI-48 -aI685 -aI-34 -aa(lp3977 -g15 -aI682 -aI0 -aI683 -aI-10 -aI682 -aI-3 -aa(lp3978 -g20 -aI475 -aI0 -aa(lp3979 -g15 -aI478 -aI-26 -aI475 -aI-4 -aI476 -aI-13 -aa(lp3980 -g15 -aI484 -aI-72 -aI479 -aI-39 -aI481 -aI-55 -aa(lp3981 -g15 -aI493 -aI-129 -aI486 -aI-90 -aI490 -aI-109 -aa(lp3982 -g15 -aI503 -aI-190 -aI496 -aI-150 -aI500 -aI-170 -aa(lp3983 -g15 -aI514 -aI-249 -aI507 -aI-211 -aI510 -aI-230 -aa(lp3984 -g15 -aI524 -aI-297 -aI517 -aI-267 -aI521 -aI-283 -aa(lp3985 -g20 -aI544 -aI-390 -aa(lp3986 -g15 -aI550 -aI-421 -aI546 -aI-398 -aI548 -aI-408 -aa(lp3987 -g15 -aI557 -aI-460 -aI552 -aI-434 -aI555 -aI-447 -aa(lp3988 -g15 -aI563 -aI-502 -aI560 -aI-474 -aI562 -aI-488 -aa(lp3989 -g15 -aI566 -aI-539 -aI565 -aI-516 -aI566 -aI-528 -aa(lp3990 -g15 -aI565 -aI-564 -aI566 -aI-547 -aI565 -aI-555 -aa(lp3991 -g15 -aI559 -aI-588 -aI564 -aI-573 -aI562 -aI-581 -aa(lp3992 -g15 -aI546 -aI-605 -aI556 -aI-595 -aI552 -aI-601 -aa(lp3993 -g15 -aI522 -aI-612 -aI540 -aI-610 -aI532 -aI-612 -aa(lp3994 -g15 -aI478 -aI-599 -aI508 -aI-612 -aI493 -aI-608 -aa(lp3995 -g15 -aI436 -aI-562 -aI464 -aI-590 -aI450 -aI-577 -aa(lp3996 -g15 -aI398 -aI-510 -aI423 -aI-547 -aI410 -aI-530 -aa(lp3997 -g15 -aI365 -aI-450 -aI386 -aI-491 -aI375 -aI-471 -aa(lp3998 -g15 -aI340 -aI-389 -aI355 -aI-429 -aI347 -aI-409 -aa(lp3999 -g15 -aI324 -aI-334 -aI333 -aI-369 -aI327 -aI-350 -aa(lp4000 -g20 -aI249 -aI0 -aa(lp4001 -g20 -aI49 -aI0 -aa(lp4002 -g20 -aI161 -aI-530 -aa(lp4003 -g15 -aI165 -aI-547 -aI162 -aI-535 -aI163 -aI-541 -aa(lp4004 -g15 -aI167 -aI-564 -aI166 -aI-553 -aI167 -aI-559 -aa(lp4005 -g15 -aI169 -aI-578 -aI168 -aI-570 -aI169 -aI-575 -aa(lp4006 -g15 -aI170 -aI-587 -aI170 -aI-582 -aI170 -aI-585 -aa(lp4007 -g15 -aI166 -aI-616 -aI170 -aI-599 -aI169 -aI-609 -aa(lp4008 -g15 -aI154 -aI-633 -aI164 -aI-624 -aI159 -aI-629 -aa(lp4009 -g15 -aI132 -aI-641 -aI148 -aI-637 -aI141 -aI-640 -aa(lp4010 -g15 -aI100 -aI-643 -aI123 -aI-642 -aI112 -aI-643 -aa(lp4011 -g20 -aI76 -aI-643 -aa(lp4012 -g20 -aI87 -aI-714 -aa(lp4013 -g20 -aI397 -aI-714 -aa(lp4014 -g20 -aI371 -aI-578 -aa(lp4015 -g20 -aI381 -aI-578 -aa(lp4016 -g15 -aI435 -aI-647 -aI398 -aI-605 -aI416 -aI-628 -aa(lp4017 -g15 -aI493 -aI-693 -aI453 -aI-665 -aI473 -aI-681 -aa(lp4018 -g15 -aI558 -aI-719 -aI513 -aI-705 -aI535 -aI-713 -aa(lp4019 -g15 -aI632 -aI-727 -aI581 -aI-724 -aI605 -aI-727 -aa(lp4020 -g15 -aI701 -aI-715 -aI659 -aI-727 -aI683 -aI-723 -aa(lp4021 -g15 -aI746 -aI-683 -aI720 -aI-707 -aI735 -aI-697 -aa(lp4022 -g15 -aI771 -aI-637 -aI758 -aI-670 -aI766 -aI-654 -aa(lp4023 -g15 -aI778 -aI-582 -aI776 -aI-620 -aI778 -aI-601 -aa(lp4024 -g20 -aI778 -aI-571 -aa(lp4025 -g20 -aI786 -aI-571 -aa(lp4026 -g15 -aI837 -aI-641 -aI802 -aI-598 -aI819 -aI-621 -aa(lp4027 -g15 -aI894 -aI-691 -aI855 -aI-661 -aI874 -aI-678 -aa(lp4028 -g15 -aI960 -aI-721 -aI914 -aI-704 -aI937 -aI-714 -aa(lp4029 -g15 -aI1039 -aI-731 -aI984 -aI-727 -aI1011 -aI-731 -aa(lp4030 -g15 -aI1108 -aI-718 -aI1067 -aI-731 -aI1090 -aI-727 -aa(lp4031 -g15 -aI1154 -aI-685 -aI1127 -aI-710 -aI1142 -aI-699 -aa(lp4032 -g15 -aI1179 -aI-636 -aI1166 -aI-671 -aI1174 -aI-655 -aa(lp4033 -g15 -aI1186 -aI-578 -aI1184 -aI-618 -aI1186 -aI-598 -aa(lp4034 -g15 -aI1184 -aI-542 -aI1186 -aI-567 -aI1185 -aI-554 -aa(lp4035 -g15 -aI1178 -aI-503 -aI1182 -aI-529 -aI1180 -aI-516 -aa(lp4036 -g15 -aI1170 -aI-464 -aI1175 -aI-490 -aI1173 -aI-477 -aa(lp4037 -g15 -aI1162 -aI-427 -aI1167 -aI-451 -aI1164 -aI-439 -aa(lp4038 -g20 -aI1132 -aI-284 -aa(lp4039 -g15 -aI1118 -aI-216 -aI1126 -aI-260 -aI1121 -aI-238 -aa(lp4040 -g15 -aI1113 -aI-157 -aI1115 -aI-195 -aI1113 -aI-175 -aa(lp4041 -g15 -aI1125 -aI-112 -aI1113 -aI-137 -aI1117 -aI-122 -aa(lp4042 -g15 -aI1160 -aI-97 -aI1133 -aI-102 -aI1145 -aI-97 -aa(lp4043 -g15 -aI1198 -aI-105 -aI1174 -aI-97 -aI1186 -aI-99 -aa(lp4044 -g15 -aI1238 -aI-127 -aI1209 -aI-110 -aI1223 -aI-117 -aa(lp4045 -g20 -aI1270 -aI-82 -aa(lp4046 -g15 -aI1234 -aI-48 -aI1259 -aI-70 -aI1247 -aI-59 -aa(lp4047 -g15 -aI1189 -aI-19 -aI1220 -aI-37 -aI1205 -aI-27 -aa(lp4048 -g15 -aI1133 -aI1 -aI1172 -aI-10 -aI1153 -aI-3 -aa(lp4049 -g15 -aI1066 -aI9 -aI1113 -aI6 -aI1090 -aI9 -aa(lp4050 -g10 -aa(lp4051 -g8 -aI1292 -aI0 -aa(lp4052 -g10 -aa(lp4053 -g8 -aI1292 -aI0 -aasVq -(lp4054 -(lp4055 -g8 -aI255 -aI-233 -aa(lp4056 -g15 -aI261 -aI-168 -aI255 -aI-208 -aI257 -aI-186 -aa(lp4057 -g15 -aI276 -aI-125 -aI265 -aI-151 -aI270 -aI-136 -aa(lp4058 -g15 -aI299 -aI-100 -aI282 -aI-113 -aI290 -aI-105 -aa(lp4059 -g15 -aI328 -aI-92 -aI308 -aI-95 -aI317 -aI-92 -aa(lp4060 -g15 -aI368 -aI-104 -aI341 -aI-92 -aI355 -aI-96 -aa(lp4061 -g15 -aI409 -aI-137 -aI382 -aI-112 -aI396 -aI-123 -aa(lp4062 -g15 -aI448 -aI-187 -aI422 -aI-151 -aI435 -aI-168 -aa(lp4063 -g15 -aI482 -aI-248 -aI460 -aI-206 -aI471 -aI-227 -aa(lp4064 -g15 -aI509 -aI-316 -aI492 -aI-270 -aI501 -aI-293 -aa(lp4065 -g15 -aI527 -aI-384 -aI517 -aI-339 -aI523 -aI-362 -aa(lp4066 -g20 -aI576 -aI-605 -aa(lp4067 -g15 -aI544 -aI-631 -aI570 -aI-614 -aI559 -aI-623 -aa(lp4068 -g15 -aI489 -aI-642 -aI529 -aI-638 -aI510 -aI-642 -aa(lp4069 -g15 -aI417 -aI-621 -aI463 -aI-642 -aI439 -aI-635 -aa(lp4070 -g15 -aI358 -aI-566 -aI395 -aI-607 -aI376 -aI-589 -aa(lp4071 -g15 -aI313 -aI-488 -aI341 -aI-543 -aI326 -aI-517 -aa(lp4072 -g15 -aI281 -aI-399 -aI300 -aI-459 -aI290 -aI-429 -aa(lp4073 -g15 -aI262 -aI-311 -aI273 -aI-369 -aI266 -aI-339 -aa(lp4074 -g15 -aI255 -aI-233 -aI258 -aI-282 -aI255 -aI-256 -aa(lp4075 -g10 -aa(lp4076 -g8 -aI458 -aI53 -aa(lp4077 -g15 -aI464 -aI28 -aI460 -aI46 -aI462 -aI38 -aa(lp4078 -g15 -aI471 -aI-5 -aI466 -aI17 -aI468 -aI6 -aa(lp4079 -g15 -aI479 -aI-43 -aI473 -aI-17 -aI476 -aI-30 -aa(lp4080 -g15 -aI487 -aI-82 -aI482 -aI-56 -aI485 -aI-69 -aa(lp4081 -g15 -aI509 -aI-179 -aI494 -aI-113 -aI501 -aI-145 -aa(lp4082 -g20 -aI501 -aI-179 -aa(lp4083 -g15 -aI454 -aI-100 -aI486 -aI-150 -aI470 -aI-123 -aa(lp4084 -g15 -aI400 -aI-39 -aI438 -aI-76 -aI420 -aI-56 -aa(lp4085 -g15 -aI332 -aI0 -aI380 -aI-22 -aI358 -aI-9 -aa(lp4086 -g15 -aI242 -aI13 -aI307 -aI8 -aI277 -aI13 -aa(lp4087 -g15 -aI165 -aI-2 -aI214 -aI13 -aI188 -aI8 -aa(lp4088 -g15 -aI106 -aI-48 -aI142 -aI-12 -aI122 -aI-27 -aa(lp4089 -g15 -aI67 -aI-124 -aI89 -aI-68 -aI76 -aI-94 -aa(lp4090 -g15 -aI53 -aI-230 -aI58 -aI-154 -aI53 -aI-190 -aa(lp4091 -g15 -aI66 -aI-339 -aI53 -aI-264 -aI57 -aI-301 -aa(lp4092 -g15 -aI102 -aI-451 -aI74 -aI-377 -aI86 -aI-414 -aa(lp4093 -g15 -aI162 -aI-556 -aI118 -aI-488 -aI138 -aI-523 -aa(lp4094 -g15 -aI243 -aI-644 -aI186 -aI-590 -aI213 -aI-619 -aa(lp4095 -g15 -aI344 -aI-704 -aI273 -aI-669 -aI307 -aI-689 -aa(lp4096 -g15 -aI462 -aI-727 -aI380 -aI-719 -aI420 -aI-727 -aa(lp4097 -g15 -aI520 -aI-723 -aI482 -aI-727 -aI501 -aI-726 -aa(lp4098 -g15 -aI573 -aI-713 -aI538 -aI-720 -aI556 -aI-717 -aa(lp4099 -g15 -aI620 -aI-699 -aI590 -aI-709 -aI606 -aI-704 -aa(lp4100 -g15 -aI658 -aI-683 -aI634 -aI-694 -aI647 -aI-689 -aa(lp4101 -g20 -aI737 -aI-727 -aa(lp4102 -g20 -aI804 -aI-727 -aa(lp4103 -g20 -aI621 -aI136 -aa(lp4104 -g15 -aI614 -aI172 -aI618 -aI147 -aI616 -aI159 -aa(lp4105 -g15 -aI611 -aI204 -aI612 -aI184 -aI611 -aI195 -aa(lp4106 -g15 -aI628 -aI239 -aI611 -aI220 -aI617 -aI231 -aa(lp4107 -g15 -aI682 -aI249 -aI639 -aI246 -aI657 -aI249 -aa(lp4108 -g20 -aI733 -aI249 -aa(lp4109 -g20 -aI721 -aI320 -aa(lp4110 -g20 -aI405 -aI320 -aa(lp4111 -g10 -aa(lp4112 -g8 -aI841 -aI0 -aa(lp4113 -g10 -aa(lp4114 -g8 -aI841 -aI0 -aasVu -(lp4115 -(lp4116 -g8 -aI516 -aI-114 -aa(lp4117 -g15 -aI516 -aI-127 -aI516 -aI-118 -aI516 -aI-122 -aa(lp4118 -g15 -aI518 -aI-144 -aI517 -aI-133 -aI517 -aI-138 -aa(lp4119 -g15 -aI520 -aI-160 -aI519 -aI-149 -aI519 -aI-155 -aa(lp4120 -g15 -aI522 -aI-172 -aI521 -aI-165 -aI521 -aI-169 -aa(lp4121 -g20 -aI511 -aI-172 -aa(lp4122 -g15 -aI454 -aI-97 -aI492 -aI-144 -aI472 -aI-119 -aa(lp4123 -g15 -aI393 -aI-38 -aI435 -aI-74 -aI415 -aI-55 -aa(lp4124 -g15 -aI324 -aI-1 -aI372 -aI-22 -aI349 -aI-10 -aa(lp4125 -g15 -aI240 -aI12 -aI300 -aI7 -aI271 -aI12 -aa(lp4126 -g15 -aI167 -aI0 -aI211 -aI12 -aI187 -aI8 -aa(lp4127 -g15 -aI121 -aI-32 -aI148 -aI-7 -aI132 -aI-18 -aa(lp4128 -g15 -aI95 -aI-79 -aI109 -aI-45 -aI100 -aI-61 -aa(lp4129 -g15 -aI87 -aI-135 -aI90 -aI-97 -aI87 -aI-116 -aa(lp4130 -g15 -aI95 -aI-208 -aI87 -aI-157 -aI90 -aI-182 -aa(lp4131 -g15 -aI110 -aI-282 -aI100 -aI-235 -aI105 -aI-259 -aa(lp4132 -g20 -aI158 -aI-517 -aa(lp4133 -g15 -aI167 -aI-566 -aI162 -aI-535 -aI165 -aI-551 -aa(lp4134 -g15 -aI170 -aI-599 -aI169 -aI-581 -aI170 -aI-592 -aa(lp4135 -g15 -aI154 -aI-634 -aI170 -aI-617 -aI165 -aI-629 -aa(lp4136 -g15 -aI100 -aI-643 -aI143 -aI-640 -aI125 -aI-643 -aa(lp4137 -g20 -aI76 -aI-643 -aa(lp4138 -g20 -aI87 -aI-714 -aa(lp4139 -g20 -aI408 -aI-714 -aa(lp4140 -g20 -aI320 -aI-315 -aa(lp4141 -g15 -aI312 -aI-280 -aI317 -aI-304 -aI315 -aI-293 -aa(lp4142 -g15 -aI305 -aI-241 -aI309 -aI-267 -aI307 -aI-254 -aa(lp4143 -g15 -aI299 -aI-203 -aI303 -aI-228 -aI301 -aI-215 -aa(lp4144 -g15 -aI297 -aI-174 -aI298 -aI-192 -aI297 -aI-182 -aa(lp4145 -g15 -aI309 -aI-127 -aI297 -aI-154 -aI301 -aI-138 -aa(lp4146 -g15 -aI354 -aI-110 -aI318 -aI-115 -aI333 -aI-110 -aa(lp4147 -g15 -aI415 -aI-136 -aI374 -aI-110 -aI394 -aI-119 -aa(lp4148 -g15 -aI474 -aI-204 -aI435 -aI-154 -aI455 -aI-176 -aa(lp4149 -g15 -aI524 -aI-298 -aI493 -aI-232 -aI509 -aI-264 -aa(lp4150 -g15 -aI558 -aI-400 -aI539 -aI-333 -aI550 -aI-367 -aa(lp4151 -g20 -aI629 -aI-714 -aa(lp4152 -g20 -aI828 -aI-714 -aa(lp4153 -g20 -aI737 -aI-280 -aa(lp4154 -g15 -aI723 -aI-212 -aI731 -aI-256 -aI727 -aI-233 -aa(lp4155 -g15 -aI718 -aI-153 -aI720 -aI-191 -aI718 -aI-171 -aa(lp4156 -g15 -aI730 -aI-108 -aI718 -aI-133 -aI722 -aI-118 -aa(lp4157 -g15 -aI765 -aI-92 -aI738 -aI-97 -aI750 -aI-92 -aa(lp4158 -g15 -aI803 -aI-100 -aI779 -aI-92 -aI792 -aI-95 -aa(lp4159 -g15 -aI843 -aI-123 -aI815 -aI-105 -aI828 -aI-113 -aa(lp4160 -g20 -aI876 -aI-78 -aa(lp4161 -g15 -aI839 -aI-44 -aI865 -aI-67 -aI853 -aI-55 -aa(lp4162 -g15 -aI794 -aI-15 -aI826 -aI-33 -aI811 -aI-23 -aa(lp4163 -g15 -aI738 -aI5 -aI777 -aI-6 -aI759 -aI0 -aa(lp4164 -g15 -aI671 -aI13 -aI718 -aI10 -aI696 -aI13 -aa(lp4165 -g15 -aI597 -aI3 -aI642 -aI13 -aI617 -aI10 -aa(lp4166 -g15 -aI550 -aI-23 -aI578 -aI-3 -aI562 -aI-12 -aa(lp4167 -g15 -aI524 -aI-64 -aI537 -aI-35 -aI529 -aI-48 -aa(lp4168 -g15 -aI516 -aI-114 -aI518 -aI-79 -aI516 -aI-96 -aa(lp4169 -g10 -aa(lp4170 -g8 -aI897 -aI0 -aa(lp4171 -g10 -aa(lp4172 -g8 -aI897 -aI0 -aasVy -(lp4173 -(lp4174 -g8 -aI104 -aI-573 -aa(lp4175 -g15 -aI71 -aI-628 -aI96 -aI-599 -aI86 -aI-617 -aa(lp4176 -g15 -aI11 -aI-643 -aI57 -aI-638 -aI37 -aI-643 -aa(lp4177 -g20 -aI-1 -aI-643 -aa(lp4178 -g20 -aI14 -aI-714 -aa(lp4179 -g20 -aI276 -aI-714 -aa(lp4180 -g20 -aI363 -aI-368 -aa(lp4181 -g15 -aI377 -aI-307 -aI368 -aI-351 -aI372 -aI-331 -aa(lp4182 -g15 -aI391 -aI-238 -aI382 -aI-284 -aI386 -aI-261 -aa(lp4183 -g15 -aI402 -aI-173 -aI395 -aI-214 -aI399 -aI-193 -aa(lp4184 -g15 -aI408 -aI-126 -aI405 -aI-152 -aI407 -aI-137 -aa(lp4185 -g20 -aI412 -aI-126 -aa(lp4186 -g15 -aI486 -aI-233 -aI438 -aI-162 -aI463 -aI-197 -aa(lp4187 -g15 -aI548 -aI-339 -aI510 -aI-269 -aI530 -aI-304 -aa(lp4188 -g15 -aI590 -aI-436 -aI566 -aI-373 -aI579 -aI-405 -aa(lp4189 -g15 -aI605 -aI-521 -aI600 -aI-467 -aI605 -aI-495 -aa(lp4190 -g15 -aI583 -aI-589 -aI605 -aI-550 -aI598 -aI-573 -aa(lp4191 -g15 -aI522 -aI-612 -aI569 -aI-605 -aI548 -aI-612 -aa(lp4192 -g15 -aI530 -aI-660 -aI522 -aI-630 -aI525 -aI-645 -aa(lp4193 -g15 -aI553 -aI-696 -aI536 -aI-674 -aI543 -aI-686 -aa(lp4194 -g15 -aI587 -aI-719 -aI562 -aI-706 -aI574 -aI-713 -aa(lp4195 -g15 -aI629 -aI-727 -aI600 -aI-724 -aI614 -aI-727 -aa(lp4196 -g15 -aI711 -aI-697 -aI665 -aI-727 -aI692 -aI-717 -aa(lp4197 -g15 -aI738 -aI-614 -aI729 -aI-677 -aI738 -aI-649 -aa(lp4198 -g15 -aI721 -aI-504 -aI738 -aI-579 -aI733 -aI-542 -aa(lp4199 -g15 -aI671 -aI-381 -aI709 -aI-465 -aI692 -aI-424 -aa(lp4200 -g15 -aI592 -aI-243 -aI649 -aI-337 -aI623 -aI-291 -aa(lp4201 -g15 -aI486 -aI-88 -aI561 -aI-194 -aI526 -aI-142 -aa(lp4202 -g15 -aI396 -aI35 -aI454 -aI-43 -aI424 -aI-2 -aa(lp4203 -g15 -aI313 -aI137 -aI368 -aI73 -aI340 -aI107 -aa(lp4204 -g15 -aI230 -aI217 -aI286 -aI168 -aI258 -aI194 -aa(lp4205 -g15 -aI141 -aI274 -aI202 -aI240 -aI173 -aI259 -aa(lp4206 -g15 -aI38 -aI309 -aI110 -aI290 -aI75 -aI301 -aa(lp4207 -g15 -aI-85 -aI320 -aI1 -aI316 -aI-39 -aI320 -aa(lp4208 -g15 -aI-159 -aI314 -aI-110 -aI320 -aI-135 -aI318 -aa(lp4209 -g15 -aI-223 -aI296 -aI-183 -aI309 -aI-205 -aI304 -aa(lp4210 -g20 -aI-203 -aI221 -aa(lp4211 -g15 -aI-159 -aI233 -aI-193 -aI225 -aI-178 -aI229 -aa(lp4212 -g15 -aI-90 -aI239 -aI-140 -aI237 -aI-117 -aI239 -aa(lp4213 -g15 -aI21 -aI223 -aI-49 -aI239 -aI-12 -aI233 -aa(lp4214 -g15 -aI115 -aI179 -aI55 -aI212 -aI86 -aI197 -aa(lp4215 -g15 -aI196 -aI114 -aI144 -aI160 -aI171 -aI139 -aa(lp4216 -g15 -aI270 -aI34 -aI222 -aI89 -aI246 -aI63 -aa(lp4217 -g10 -aa(lp4218 -g8 -aI781 -aI0 -aa(lp4219 -g10 -aa(lp4220 -g8 -aI781 -aI0 -aasV} -(lp4221 -(lp4222 -g8 -aI305 -aI-1014 -aa(lp4223 -g15 -aI448 -aI-976 -aI369 -aI-1014 -aI416 -aI-1001 -aa(lp4224 -g15 -aI496 -aI-868 -aI480 -aI-950 -aI496 -aI-914 -aa(lp4225 -g15 -aI495 -aI-855 -aI496 -aI-864 -aI495 -aI-860 -aa(lp4226 -g15 -aI493 -aI-838 -aI495 -aI-850 -aI494 -aI-845 -aa(lp4227 -g15 -aI489 -aI-812 -aI492 -aI-831 -aI491 -aI-822 -aa(lp4228 -g15 -aI482 -aI-775 -aI487 -aI-802 -aI485 -aI-790 -aa(lp4229 -g20 -aI442 -aI-588 -aa(lp4230 -g15 -aI438 -aI-552 -aI440 -aI-575 -aI438 -aI-563 -aa(lp4231 -g15 -aI448 -aI-509 -aI438 -aI-535 -aI442 -aI-520 -aa(lp4232 -g15 -aI476 -aI-482 -aI455 -aI-498 -aI464 -aI-489 -aa(lp4233 -g15 -aI518 -aI-468 -aI488 -aI-476 -aI502 -aI-471 -aa(lp4234 -g15 -aI570 -aI-463 -aI534 -aI-465 -aI552 -aI-464 -aa(lp4235 -g20 -aI553 -aI-382 -aa(lp4236 -g15 -aI490 -aI-375 -aI531 -aI-381 -aI510 -aI-379 -aa(lp4237 -g15 -aI437 -aI-356 -aI471 -aI-372 -aI453 -aI-366 -aa(lp4238 -g15 -aI396 -aI-319 -aI421 -aI-347 -aI408 -aI-335 -aa(lp4239 -g15 -aI371 -aI-258 -aI385 -aI-303 -aI376 -aI-283 -aa(lp4240 -g20 -aI324 -aI-28 -aa(lp4241 -g15 -aI294 -aI58 -aI317 -aI4 -aI307 -aI33 -aa(lp4242 -g15 -aI242 -aI118 -aI281 -aI82 -aI264 -aI102 -aa(lp4243 -g15 -aI164 -aI154 -aI221 -aI134 -aI195 -aI146 -aa(lp4244 -g15 -aI54 -aI165 -aI133 -aI161 -aI97 -aI165 -aa(lp4245 -g20 -aI-72 -aI165 -aa(lp4246 -g20 -aI-57 -aI94 -aa(lp4247 -g20 -aI-5 -aI94 -aa(lp4248 -g15 -aI43 -aI86 -aI13 -aI94 -aI30 -aI92 -aa(lp4249 -g15 -aI77 -aI61 -aI56 -aI80 -aI67 -aI72 -aa(lp4250 -g15 -aI99 -aI21 -aI86 -aI50 -aI94 -aI37 -aa(lp4251 -g15 -aI115 -aI-34 -aI105 -aI5 -aI111 -aI-13 -aa(lp4252 -g20 -aI165 -aI-260 -aa(lp4253 -g15 -aI220 -aI-359 -aI174 -aI-300 -aI192 -aI-334 -aa(lp4254 -g15 -aI343 -aI-416 -aI248 -aI-385 -aI289 -aI-404 -aa(lp4255 -g20 -aI346 -aI-427 -aa(lp4256 -g15 -aI257 -aI-473 -aI306 -aI-438 -aI276 -aI-453 -aa(lp4257 -g15 -aI229 -aI-547 -aI238 -aI-493 -aI229 -aI-518 -aa(lp4258 -g15 -aI233 -aI-584 -aI229 -aI-559 -aI230 -aI-571 -aa(lp4259 -g20 -aI282 -aI-812 -aa(lp4260 -g15 -aI287 -aI-844 -aI285 -aI-823 -aI286 -aI-834 -aa(lp4261 -g15 -aI289 -aI-872 -aI288 -aI-854 -aI289 -aI-863 -aa(lp4262 -g15 -aI272 -aI-925 -aI289 -aI-895 -aI283 -aI-913 -aa(lp4263 -g15 -aI214 -aI-943 -aI261 -aI-937 -aI242 -aI-943 -aa(lp4264 -g20 -aI162 -aI-943 -aa(lp4265 -g20 -aI178 -aI-1014 -aa(lp4266 -g10 -aa(lp4267 -g8 -aI589 -aI0 -aa(lp4268 -g10 -aa(lp4269 -g8 -aI589 -aI0 -aassS'bold' -p4270 -(dp4271 -V -(lp4272 -(lp4273 -g8 -aI346 -aI0 -aa(lp4274 -g10 -aa(lp4275 -g8 -aI346 -aI0 -aasV$ -(lp4276 -(lp4277 -g8 -aI416 -aI-1012 -aa(lp4278 -g20 -aI416 -aI-911 -aa(lp4279 -g15 -aI518 -aI-898 -aI455 -aI-910 -aI489 -aI-906 -aa(lp4280 -g15 -aI589 -aI-869 -aI546 -aI-891 -aI570 -aI-881 -aa(lp4281 -g15 -aI630 -aI-828 -aI607 -aI-857 -aI621 -aI-843 -aa(lp4282 -g15 -aI643 -aI-778 -aI639 -aI-812 -aI643 -aI-795 -aa(lp4283 -g15 -aI607 -aI-708 -aI643 -aI-749 -aI631 -aI-726 -aa(lp4284 -g15 -aI497 -aI-681 -aI583 -aI-690 -aI546 -aI-681 -aa(lp4285 -g15 -aI492 -aI-723 -aI497 -aI-694 -aI495 -aI-708 -aa(lp4286 -g15 -aI478 -aI-767 -aI489 -aI-738 -aI485 -aI-753 -aa(lp4287 -g15 -aI453 -aI-805 -aI472 -aI-781 -aI463 -aI-794 -aa(lp4288 -g15 -aI416 -aI-832 -aI443 -aI-817 -aI430 -aI-826 -aa(lp4289 -g20 -aI416 -aI-573 -aa(lp4290 -g15 -aI430 -aI-566 -aI418 -aI-571 -aI423 -aI-569 -aa(lp4291 -g15 -aI449 -aI-559 -aI438 -aI-564 -aI444 -aI-561 -aa(lp4292 -g15 -aI554 -aI-509 -aI490 -aI-543 -aI524 -aI-526 -aa(lp4293 -g15 -aI625 -aI-454 -aI583 -aI-493 -aI606 -aI-474 -aa(lp4294 -g15 -aI665 -aI-389 -aI643 -aI-434 -aI657 -aI-413 -aa(lp4295 -g15 -aI678 -aI-312 -aI674 -aI-366 -aI678 -aI-340 -aa(lp4296 -g15 -aI660 -aI-218 -aI678 -aI-278 -aI672 -aI-247 -aa(lp4297 -g15 -aI609 -aI-142 -aI648 -aI-189 -aI631 -aI-164 -aa(lp4298 -g15 -aI526 -aI-87 -aI586 -aI-119 -aI559 -aI-101 -aa(lp4299 -g15 -aI416 -aI-59 -aI494 -aI-73 -aI457 -aI-64 -aa(lp4300 -g20 -aI416 -aI105 -aa(lp4301 -g20 -aI341 -aI105 -aa(lp4302 -g20 -aI341 -aI-56 -aa(lp4303 -g15 -aI212 -aI-76 -aI290 -aI-58 -aI247 -aI-64 -aa(lp4304 -g15 -aI126 -aI-120 -aI177 -aI-88 -aI148 -aI-102 -aa(lp4305 -g15 -aI79 -aI-179 -aI104 -aI-138 -aI88 -aI-158 -aa(lp4306 -g15 -aI65 -aI-243 -aI69 -aI-201 -aI65 -aI-222 -aa(lp4307 -g15 -aI75 -aI-293 -aI65 -aI-263 -aI68 -aI-279 -aa(lp4308 -g15 -aI104 -aI-326 -aI83 -aI-306 -aI92 -aI-317 -aa(lp4309 -g15 -aI144 -aI-344 -aI115 -aI-334 -aI129 -aI-340 -aa(lp4310 -g15 -aI190 -aI-350 -aI159 -aI-348 -aI174 -aI-350 -aa(lp4311 -g15 -aI201 -aI-261 -aI190 -aI-317 -aI194 -aI-287 -aa(lp4312 -g15 -aI232 -aI-194 -aI208 -aI-235 -aI218 -aI-212 -aa(lp4313 -g15 -aI279 -aI-149 -aI245 -aI-176 -aI261 -aI-161 -aa(lp4314 -g15 -aI341 -aI-127 -aI298 -aI-138 -aI318 -aI-131 -aa(lp4315 -g20 -aI341 -aI-415 -aa(lp4316 -g20 -aI318 -aI-424 -aa(lp4317 -g15 -aI211 -aI-477 -aI275 -aI-442 -aI240 -aI-459 -aa(lp4318 -g15 -aI142 -aI-534 -aI183 -aI-495 -aI160 -aI-514 -aa(lp4319 -g15 -aI105 -aI-599 -aI125 -aI-554 -aI112 -aI-576 -aa(lp4320 -g15 -aI94 -aI-677 -aI98 -aI-623 -aI94 -aI-649 -aa(lp4321 -g15 -aI112 -aI-766 -aI94 -aI-710 -aI100 -aI-739 -aa(lp4322 -g15 -aI163 -aI-836 -aI124 -aI-792 -aI141 -aI-816 -aa(lp4323 -g15 -aI241 -aI-885 -aI185 -aI-856 -aI211 -aI-872 -aa(lp4324 -g15 -aI341 -aI-910 -aI271 -aI-898 -aI304 -aI-906 -aa(lp4325 -g20 -aI341 -aI-1012 -aa(lp4326 -g10 -aa(lp4327 -g8 -aI520 -aI-252 -aa(lp4328 -g15 -aI494 -aI-325 -aI520 -aI-281 -aI511 -aI-305 -aa(lp4329 -g15 -aI416 -aI-382 -aI476 -aI-345 -aI450 -aI-364 -aa(lp4330 -g20 -aI416 -aI-130 -aa(lp4331 -g15 -aI493 -aI-174 -aI449 -aI-137 -aI475 -aI-152 -aa(lp4332 -g15 -aI520 -aI-252 -aI511 -aI-196 -aI520 -aI-222 -aa(lp4333 -g10 -aa(lp4334 -g8 -aI250 -aI-733 -aa(lp4335 -g15 -aI254 -aI-700 -aI250 -aI-722 -aI251 -aI-710 -aa(lp4336 -g15 -aI268 -aI-668 -aI257 -aI-689 -aI261 -aI-678 -aa(lp4337 -g15 -aI296 -aI-638 -aI275 -aI-658 -aI285 -aI-648 -aa(lp4338 -g15 -aI341 -aI-608 -aI308 -aI-628 -aI323 -aI-618 -aa(lp4339 -g20 -aI341 -aI-839 -aa(lp4340 -g15 -aI276 -aI-805 -aI315 -aI-834 -aI293 -aI-823 -aa(lp4341 -g15 -aI250 -aI-733 -aI259 -aI-788 -aI250 -aI-764 -aa(lp4342 -g10 -aa(lp4343 -g8 -aI745 -aI0 -aa(lp4344 -g10 -aa(lp4345 -g8 -aI745 -aI0 -aasV( -(lp4346 -(lp4347 -g8 -aI290 -aI-423 -aa(lp4348 -g15 -aI298 -aI-267 -aI290 -aI-370 -aI293 -aI-318 -aa(lp4349 -g15 -aI328 -aI-122 -aI303 -aI-216 -aI314 -aI-168 -aa(lp4350 -g15 -aI389 -aI2 -aI343 -aI-77 -aI363 -aI-35 -aa(lp4351 -g15 -aI490 -aI100 -aI416 -aI40 -aI449 -aI73 -aa(lp4352 -g20 -aI490 -aI186 -aa(lp4353 -g15 -aI300 -aI80 -aI416 -aI156 -aI353 -aI121 -aa(lp4354 -g15 -aI172 -aI-55 -aI248 -aI40 -aI205 -aI-4 -aa(lp4355 -g15 -aI99 -aI-223 -aI138 -aI-106 -aI114 -aI-162 -aa(lp4356 -g15 -aI76 -aI-423 -aI83 -aI-284 -aI76 -aI-351 -aa(lp4357 -g15 -aI99 -aI-622 -aI76 -aI-494 -aI83 -aI-561 -aa(lp4358 -g15 -aI172 -aI-789 -aI114 -aI-683 -aI138 -aI-738 -aa(lp4359 -g15 -aI300 -aI-924 -aI205 -aI-839 -aI248 -aI-884 -aa(lp4360 -g15 -aI490 -aI-1028 -aI353 -aI-964 -aI416 -aI-999 -aa(lp4361 -g20 -aI490 -aI-944 -aa(lp4362 -g15 -aI389 -aI-846 -aI449 -aI-917 -aI416 -aI-884 -aa(lp4363 -g15 -aI328 -aI-722 -aI363 -aI-808 -aI343 -aI-767 -aa(lp4364 -g15 -aI298 -aI-578 -aI314 -aI-677 -aI303 -aI-629 -aa(lp4365 -g15 -aI290 -aI-423 -aI293 -aI-528 -aI290 -aI-476 -aa(lp4366 -g10 -aa(lp4367 -g8 -aI533 -aI0 -aa(lp4368 -g10 -aa(lp4369 -g8 -aI533 -aI0 -aasV, -(lp4370 -(lp4371 -g8 -aI298 -aI-55 -aa(lp4372 -g15 -aI285 -aI26 -aI298 -aI-27 -aI294 -aI0 -aa(lp4373 -g15 -aI244 -aI100 -aI277 -aI52 -aI263 -aI77 -aa(lp4374 -g15 -aI170 -aI160 -aI225 -aI122 -aI200 -aI142 -aa(lp4375 -g15 -aI59 -aI205 -aI140 -aI178 -aI103 -aI193 -aa(lp4376 -g20 -aI59 -aI136 -aa(lp4377 -g15 -aI111 -aI115 -aI79 -aI129 -aI96 -aI122 -aa(lp4378 -g15 -aI147 -aI93 -aI125 -aI108 -aI137 -aI101 -aa(lp4379 -g15 -aI169 -aI66 -aI157 -aI85 -aI164 -aI76 -aa(lp4380 -g15 -aI177 -aI32 -aI174 -aI56 -aI177 -aI45 -aa(lp4381 -g15 -aI169 -aI11 -aI177 -aI24 -aI174 -aI17 -aa(lp4382 -g15 -aI152 -aI-3 -aI165 -aI6 -aI159 -aI1 -aa(lp4383 -g15 -aI128 -aI-18 -aI144 -aI-8 -aI137 -aI-13 -aa(lp4384 -g15 -aI105 -aI-37 -aI120 -aI-23 -aI112 -aI-29 -aa(lp4385 -g15 -aI87 -aI-66 -aI97 -aI-45 -aI92 -aI-54 -aa(lp4386 -g15 -aI80 -aI-110 -aI82 -aI-77 -aI80 -aI-92 -aa(lp4387 -g15 -aI107 -aI-178 -aI80 -aI-140 -aI89 -aI-162 -aa(lp4388 -g15 -aI175 -aI-202 -aI125 -aI-194 -aI148 -aI-202 -aa(lp4389 -g15 -aI265 -aI-162 -aI213 -aI-202 -aI243 -aI-189 -aa(lp4390 -g15 -aI298 -aI-55 -aI287 -aI-136 -aI298 -aI-101 -aa(lp4391 -g10 -aa(lp4392 -g8 -aI391 -aI0 -aa(lp4393 -g10 -aa(lp4394 -g8 -aI391 -aI0 -aasV0 -(lp4395 -(lp4396 -g8 -aI699 -aI-476 -aa(lp4397 -g15 -aI681 -aI-276 -aI699 -aI-403 -aI693 -aI-336 -aa(lp4398 -g15 -aI623 -aI-121 -aI669 -aI-215 -aI650 -aI-164 -aa(lp4399 -g15 -aI522 -aI-21 -aI597 -aI-78 -aI563 -aI-45 -aa(lp4400 -g15 -aI373 -aI13 -aI480 -aI1 -aI431 -aI13 -aa(lp4401 -g15 -aI219 -aI-21 -aI312 -aI13 -aI261 -aI1 -aa(lp4402 -g15 -aI118 -aI-121 -aI177 -aI-45 -aI143 -aI-78 -aa(lp4403 -g15 -aI62 -aI-276 -aI92 -aI-164 -aI73 -aI-216 -aa(lp4404 -g15 -aI45 -aI-478 -aI51 -aI-337 -aI45 -aI-404 -aa(lp4405 -g15 -aI62 -aI-678 -aI45 -aI-551 -aI51 -aI-618 -aa(lp4406 -g15 -aI118 -aI-832 -aI73 -aI-738 -aI92 -aI-789 -aa(lp4407 -g15 -aI219 -aI-930 -aI143 -aI-874 -aI177 -aI-907 -aa(lp4408 -g15 -aI374 -aI-965 -aI261 -aI-953 -aI313 -aI-965 -aa(lp4409 -g15 -aI522 -aI-930 -aI432 -aI-965 -aI481 -aI-953 -aa(lp4410 -g15 -aI624 -aI-832 -aI564 -aI-907 -aI597 -aI-874 -aa(lp4411 -g15 -aI681 -aI-678 -aI650 -aI-789 -aI669 -aI-738 -aa(lp4412 -g15 -aI699 -aI-476 -aI693 -aI-618 -aI699 -aI-550 -aa(lp4413 -g10 -aa(lp4414 -g8 -aI251 -aI-476 -aa(lp4415 -g15 -aI257 -aI-306 -aI251 -aI-412 -aI253 -aI-356 -aa(lp4416 -g15 -aI275 -aI-179 -aI260 -aI-256 -aI266 -aI-214 -aa(lp4417 -g15 -aI312 -aI-100 -aI284 -aI-145 -aI296 -aI-118 -aa(lp4418 -g15 -aI373 -aI-73 -aI328 -aI-82 -aI348 -aI-73 -aa(lp4419 -g15 -aI433 -aI-100 -aI397 -aI-73 -aI417 -aI-82 -aa(lp4420 -g15 -aI470 -aI-179 -aI449 -aI-118 -aI461 -aI-145 -aa(lp4421 -g15 -aI488 -aI-306 -aI479 -aI-214 -aI485 -aI-256 -aa(lp4422 -g15 -aI493 -aI-476 -aI491 -aI-356 -aI493 -aI-412 -aa(lp4423 -g15 -aI488 -aI-647 -aI493 -aI-540 -aI491 -aI-597 -aa(lp4424 -g15 -aI470 -aI-772 -aI485 -aI-696 -aI479 -aI-738 -aa(lp4425 -g15 -aI434 -aI-851 -aI462 -aI-807 -aI449 -aI-833 -aa(lp4426 -g15 -aI374 -aI-878 -aI418 -aI-869 -aI398 -aI-878 -aa(lp4427 -g15 -aI313 -aI-851 -aI349 -aI-878 -aI329 -aI-869 -aa(lp4428 -g15 -aI276 -aI-772 -aI297 -aI-833 -aI285 -aI-807 -aa(lp4429 -g15 -aI257 -aI-647 -aI266 -aI-738 -aI260 -aI-696 -aa(lp4430 -g15 -aI251 -aI-476 -aI253 -aI-597 -aI251 -aI-540 -aa(lp4431 -g10 -aa(lp4432 -g8 -aI745 -aI0 -aa(lp4433 -g10 -aa(lp4434 -g8 -aI745 -aI0 -aasV4 -(lp4435 -(lp4436 -g8 -aI581 -aI-247 -aa(lp4437 -g20 -aI581 -aI-166 -aa(lp4438 -g15 -aI590 -aI-116 -aI581 -aI-145 -aI584 -aI-128 -aa(lp4439 -g15 -aI613 -aI-87 -aI596 -aI-103 -aI603 -aI-93 -aa(lp4440 -g15 -aI648 -aI-73 -aI623 -aI-80 -aI634 -aI-75 -aa(lp4441 -g15 -aI690 -aI-70 -aI661 -aI-71 -aI675 -aI-70 -aa(lp4442 -g20 -aI707 -aI-70 -aa(lp4443 -g20 -aI707 -aI0 -aa(lp4444 -g20 -aI240 -aI0 -aa(lp4445 -g20 -aI240 -aI-70 -aa(lp4446 -g20 -aI277 -aI-70 -aa(lp4447 -g15 -aI319 -aI-73 -aI292 -aI-70 -aI306 -aI-71 -aa(lp4448 -g15 -aI354 -aI-87 -aI333 -aI-75 -aI344 -aI-80 -aa(lp4449 -g15 -aI377 -aI-116 -aI364 -aI-93 -aI372 -aI-103 -aa(lp4450 -g15 -aI386 -aI-166 -aI383 -aI-128 -aI386 -aI-145 -aa(lp4451 -g20 -aI386 -aI-247 -aa(lp4452 -g20 -aI17 -aI-247 -aa(lp4453 -g20 -aI17 -aI-328 -aa(lp4454 -g20 -aI395 -aI-951 -aa(lp4455 -g20 -aI581 -aI-951 -aa(lp4456 -g20 -aI581 -aI-335 -aa(lp4457 -g20 -aI720 -aI-335 -aa(lp4458 -g20 -aI720 -aI-247 -aa(lp4459 -g10 -aa(lp4460 -g8 -aI386 -aI-568 -aa(lp4461 -g15 -aI388 -aI-694 -aI386 -aI-607 -aI387 -aI-649 -aa(lp4462 -g15 -aI395 -aI-825 -aI389 -aI-739 -aI392 -aI-783 -aa(lp4463 -g15 -aI375 -aI-782 -aI391 -aI-814 -aI384 -aI-800 -aa(lp4464 -g15 -aI344 -aI-725 -aI365 -aI-763 -aI355 -aI-745 -aa(lp4465 -g15 -aI313 -aI-671 -aI333 -aI-706 -aI323 -aI-688 -aa(lp4466 -g15 -aI290 -aI-633 -aI303 -aI-653 -aI295 -aI-641 -aa(lp4467 -g20 -aI110 -aI-335 -aa(lp4468 -g20 -aI386 -aI-335 -aa(lp4469 -g10 -aa(lp4470 -g8 -aI745 -aI0 -aa(lp4471 -g10 -aa(lp4472 -g8 -aI745 -aI0 -aasV8 -(lp4473 -(lp4474 -g8 -aI39 -aI-242 -aa(lp4475 -g15 -aI53 -aI-319 -aI39 -aI-271 -aI44 -aI-296 -aa(lp4476 -g15 -aI93 -aI-382 -aI63 -aI-342 -aI76 -aI-363 -aa(lp4477 -g15 -aI155 -aI-434 -aI111 -aI-401 -aI131 -aI-418 -aa(lp4478 -g15 -aI235 -aI-480 -aI180 -aI-450 -aI206 -aI-465 -aa(lp4479 -g15 -aI113 -aI-585 -aI182 -aI-511 -aI142 -aI-546 -aa(lp4480 -g15 -aI70 -aI-722 -aI85 -aI-624 -aI70 -aI-670 -aa(lp4481 -g15 -aI86 -aI-812 -aI70 -aI-753 -aI76 -aI-783 -aa(lp4482 -g15 -aI139 -aI-890 -aI97 -aI-841 -aI115 -aI-867 -aa(lp4483 -g15 -aI235 -aI-944 -aI163 -aI-912 -aI195 -aI-930 -aa(lp4484 -g15 -aI380 -aI-965 -aI274 -aI-958 -aI322 -aI-965 -aa(lp4485 -g15 -aI503 -aI-947 -aI427 -aI-965 -aI468 -aI-959 -aa(lp4486 -g15 -aI592 -aI-898 -aI538 -aI-935 -aI568 -aI-919 -aa(lp4487 -g15 -aI646 -aI-824 -aI616 -aI-877 -aI634 -aI-853 -aa(lp4488 -g15 -aI664 -aI-731 -aI658 -aI-796 -aI664 -aI-765 -aa(lp4489 -g15 -aI651 -aI-661 -aI664 -aI-704 -aI659 -aI-681 -aa(lp4490 -g15 -aI615 -aI-605 -aI642 -aI-640 -aI630 -aI-622 -aa(lp4491 -g15 -aI558 -aI-558 -aI599 -aI-588 -aI580 -aI-573 -aa(lp4492 -g15 -aI483 -aI-515 -aI536 -aI-544 -aI511 -aI-530 -aa(lp4493 -g15 -aI585 -aI-456 -aI523 -aI-496 -aI557 -aI-476 -aa(lp4494 -g15 -aI654 -aI-395 -aI614 -aI-437 -aI637 -aI-416 -aa(lp4495 -g15 -aI693 -aI-327 -aI672 -aI-373 -aI685 -aI-351 -aa(lp4496 -g15 -aI705 -aI-251 -aI701 -aI-303 -aI705 -aI-278 -aa(lp4497 -g15 -aI681 -aI-139 -aI705 -aI-209 -aI697 -aI-171 -aa(lp4498 -g15 -aI614 -aI-56 -aI666 -aI-106 -aI644 -aI-78 -aa(lp4499 -g15 -aI507 -aI-4 -aI585 -aI-33 -aI549 -aI-16 -aa(lp4500 -g15 -aI363 -aI13 -aI465 -aI7 -aI417 -aI13 -aa(lp4501 -g15 -aI219 -aI-6 -aI308 -aI13 -aI260 -aI6 -aa(lp4502 -g15 -aI118 -aI-61 -aI178 -aI-20 -aI144 -aI-38 -aa(lp4503 -g15 -aI58 -aI-142 -aI91 -aI-84 -aI71 -aI-111 -aa(lp4504 -g15 -aI39 -aI-242 -aI46 -aI-174 -aI39 -aI-207 -aa(lp4505 -g10 -aa(lp4506 -g8 -aI370 -aI-62 -aa(lp4507 -g15 -aI432 -aI-74 -aI393 -aI-62 -aI414 -aI-66 -aa(lp4508 -g15 -aI479 -aI-108 -aI451 -aI-82 -aI466 -aI-94 -aa(lp4509 -g15 -aI509 -aI-161 -aI492 -aI-123 -aI502 -aI-141 -aa(lp4510 -g15 -aI520 -aI-228 -aI516 -aI-182 -aI520 -aI-204 -aa(lp4511 -g15 -aI509 -aI-287 -aI520 -aI-250 -aI516 -aI-270 -aa(lp4512 -g15 -aI474 -aI-337 -aI501 -aI-305 -aI490 -aI-321 -aa(lp4513 -g15 -aI413 -aI-382 -aI458 -aI-352 -aI438 -aI-367 -aa(lp4514 -g15 -aI325 -aI-427 -aI389 -aI-396 -aI359 -aI-411 -aa(lp4515 -g15 -aI283 -aI-394 -aI310 -aI-417 -aI296 -aI-406 -aa(lp4516 -g15 -aI250 -aI-352 -aI270 -aI-382 -aI259 -aI-368 -aa(lp4517 -g15 -aI228 -aI-300 -aI240 -aI-337 -aI233 -aI-320 -aa(lp4518 -g15 -aI220 -aI-237 -aI222 -aI-281 -aI220 -aI-260 -aa(lp4519 -g15 -aI230 -aI-165 -aI220 -aI-211 -aI223 -aI-187 -aa(lp4520 -g15 -aI261 -aI-110 -aI237 -aI-144 -aI248 -aI-125 -aa(lp4521 -g15 -aI308 -aI-74 -aI274 -aI-95 -aI290 -aI-83 -aa(lp4522 -g15 -aI370 -aI-62 -aI327 -aI-66 -aI347 -aI-62 -aa(lp4523 -g10 -aa(lp4524 -g8 -aI496 -aI-733 -aa(lp4525 -g15 -aI487 -aI-790 -aI496 -aI-753 -aI493 -aI-771 -aa(lp4526 -g15 -aI464 -aI-839 -aI482 -aI-808 -aI474 -aI-825 -aa(lp4527 -g15 -aI425 -aI-874 -aI453 -aI-853 -aI440 -aI-865 -aa(lp4528 -g15 -aI371 -aI-887 -aI410 -aI-883 -aI392 -aI-887 -aa(lp4529 -g15 -aI323 -aI-876 -aI353 -aI-887 -aI337 -aI-883 -aa(lp4530 -g15 -aI287 -aI-844 -aI309 -aI-868 -aI297 -aI-858 -aa(lp4531 -g15 -aI265 -aI-797 -aI278 -aI-831 -aI270 -aI-815 -aa(lp4532 -g15 -aI258 -aI-738 -aI260 -aI-779 -aI258 -aI-759 -aa(lp4533 -g15 -aI267 -aI-677 -aI258 -aI-715 -aI261 -aI-695 -aa(lp4534 -g15 -aI295 -aI-631 -aI274 -aI-660 -aI283 -aI-644 -aa(lp4535 -g15 -aI340 -aI-593 -aI307 -aI-617 -aI322 -aI-604 -aa(lp4536 -g15 -aI402 -aI-560 -aI358 -aI-582 -aI378 -aI-571 -aa(lp4537 -g15 -aI444 -aI-591 -aI418 -aI-570 -aI432 -aI-580 -aa(lp4538 -g15 -aI473 -aI-628 -aI456 -aI-602 -aI466 -aI-614 -aa(lp4539 -g15 -aI490 -aI-675 -aI481 -aI-642 -aI486 -aI-657 -aa(lp4540 -g15 -aI496 -aI-733 -aI494 -aI-692 -aI496 -aI-711 -aa(lp4541 -g10 -aa(lp4542 -g8 -aI745 -aI0 -aa(lp4543 -g10 -aa(lp4544 -g8 -aI745 -aI0 -aasV< -(lp4545 -(lp4546 -g8 -aI86 -aI-448 -aa(lp4547 -g20 -aI86 -aI-503 -aa(lp4548 -g20 -aI658 -aI-815 -aa(lp4549 -g20 -aI658 -aI-710 -aa(lp4550 -g20 -aI229 -aI-475 -aa(lp4551 -g20 -aI658 -aI-243 -aa(lp4552 -g20 -aI658 -aI-138 -aa(lp4553 -g10 -aa(lp4554 -g8 -aI745 -aI0 -aa(lp4555 -g10 -aa(lp4556 -g8 -aI745 -aI0 -aasV@ -(lp4557 -(lp4558 -g8 -aI1175 -aI-522 -aa(lp4559 -g15 -aI1151 -aI-344 -aI1175 -aI-455 -aI1167 -aI-396 -aa(lp4560 -g15 -aI1088 -aI-212 -aI1135 -aI-292 -aI1114 -aI-248 -aa(lp4561 -g15 -aI1000 -aI-130 -aI1062 -aI-176 -aI1033 -aI-149 -aa(lp4562 -g15 -aI901 -aI-102 -aI967 -aI-111 -aI934 -aI-102 -aa(lp4563 -g15 -aI800 -aI-131 -aI861 -aI-102 -aI828 -aI-112 -aa(lp4564 -g15 -aI737 -aI-227 -aI773 -aI-150 -aI752 -aI-182 -aa(lp4565 -g20 -aI729 -aI-227 -aa(lp4566 -g15 -aI697 -aI-178 -aI720 -aI-210 -aI709 -aI-193 -aa(lp4567 -g15 -aI658 -aI-138 -aI686 -aI-163 -aI672 -aI-150 -aa(lp4568 -g15 -aI608 -aI-112 -aI643 -aI-127 -aI626 -aI-118 -aa(lp4569 -g15 -aI545 -aI-102 -aI589 -aI-105 -aI569 -aI-102 -aa(lp4570 -g15 -aI465 -aI-116 -aI517 -aI-102 -aI491 -aI-106 -aa(lp4571 -g15 -aI398 -aI-157 -aI440 -aI-125 -aI418 -aI-139 -aa(lp4572 -g15 -aI352 -aI-228 -aI379 -aI-176 -aI364 -aI-200 -aa(lp4573 -g15 -aI335 -aI-330 -aI341 -aI-257 -aI335 -aI-291 -aa(lp4574 -g15 -aI344 -aI-407 -aI335 -aI-354 -aI338 -aI-379 -aa(lp4575 -g15 -aI371 -aI-490 -aI350 -aI-435 -aI359 -aI-463 -aa(lp4576 -g15 -aI418 -aI-570 -aI383 -aI-518 -aI399 -aI-545 -aa(lp4577 -g15 -aI486 -aI-639 -aI437 -aI-596 -aI459 -aI-619 -aa(lp4578 -g15 -aI578 -aI-686 -aI513 -aI-658 -aI543 -aI-674 -aa(lp4579 -g15 -aI694 -aI-704 -aI612 -aI-698 -aI651 -aI-704 -aa(lp4580 -g15 -aI774 -aI-692 -aI725 -aI-704 -aI751 -aI-700 -aa(lp4581 -g15 -aI828 -aI-664 -aI796 -aI-685 -aI814 -aI-675 -aa(lp4582 -g20 -aI884 -aI-692 -aa(lp4583 -g20 -aI916 -aI-692 -aa(lp4584 -g20 -aI860 -aI-359 -aa(lp4585 -g15 -aI857 -aI-339 -aI859 -aI-354 -aI858 -aI-347 -aa(lp4586 -g15 -aI854 -aI-314 -aI856 -aI-331 -aI855 -aI-322 -aa(lp4587 -g15 -aI851 -aI-288 -aI853 -aI-305 -aI852 -aI-296 -aa(lp4588 -g15 -aI850 -aI-269 -aI851 -aI-280 -aI850 -aI-274 -aa(lp4589 -g15 -aI856 -aI-224 -aI850 -aI-250 -aI852 -aI-235 -aa(lp4590 -g15 -aI871 -aI-196 -aI860 -aI-212 -aI865 -aI-203 -aa(lp4591 -g15 -aI892 -aI-182 -aI877 -aI-189 -aI884 -aI-185 -aa(lp4592 -g15 -aI914 -aI-179 -aI899 -aI-180 -aI907 -aI-179 -aa(lp4593 -g15 -aI968 -aI-201 -aI932 -aI-179 -aI950 -aI-186 -aa(lp4594 -g15 -aI1017 -aI-266 -aI986 -aI-216 -aI1002 -aI-237 -aa(lp4595 -g15 -aI1053 -aI-371 -aI1032 -aI-294 -aI1044 -aI-329 -aa(lp4596 -g15 -aI1067 -aI-517 -aI1063 -aI-414 -aI1067 -aI-462 -aa(lp4597 -g15 -aI1040 -aI-676 -aI1067 -aI-577 -aI1058 -aI-631 -aa(lp4598 -g15 -aI963 -aI-791 -aI1021 -aI-722 -aI995 -aI-760 -aa(lp4599 -g15 -aI846 -aI-860 -aI930 -aI-822 -aI891 -aI-845 -aa(lp4600 -g15 -aI697 -aI-883 -aI800 -aI-875 -aI751 -aI-883 -aa(lp4601 -g15 -aI572 -aI-866 -aI655 -aI-883 -aI613 -aI-877 -aa(lp4602 -g15 -aI455 -aI-814 -aI531 -aI-854 -aI492 -aI-837 -aa(lp4603 -g15 -aI352 -aI-731 -aI418 -aI-792 -aI384 -aI-764 -aa(lp4604 -g15 -aI271 -aI-619 -aI321 -aI-698 -aI294 -aI-661 -aa(lp4605 -g15 -aI217 -aI-480 -aI248 -aI-577 -aI230 -aI-531 -aa(lp4606 -g15 -aI198 -aI-316 -aI204 -aI-429 -aI198 -aI-375 -aa(lp4607 -g15 -aI233 -aI-115 -aI198 -aI-238 -aI210 -aI-170 -aa(lp4608 -g15 -aI329 -aI20 -aI257 -aI-59 -aI288 -aI-14 -aa(lp4609 -g15 -aI469 -aI97 -aI369 -aI55 -aI416 -aI81 -aa(lp4610 -g15 -aI639 -aI121 -aI523 -aI113 -aI580 -aI121 -aa(lp4611 -g15 -aI745 -aI111 -aI675 -aI121 -aI711 -aI118 -aa(lp4612 -g15 -aI843 -aI86 -aI779 -aI105 -aI812 -aI96 -aa(lp4613 -g15 -aI929 -aI50 -aI873 -aI75 -aI902 -aI64 -aa(lp4614 -g15 -aI1000 -aI9 -aI955 -aI37 -aI979 -aI23 -aa(lp4615 -g20 -aI1031 -aI60 -aa(lp4616 -g15 -aI952 -aI110 -aI1008 -aI78 -aI981 -aI94 -aa(lp4617 -g15 -aI855 -aI151 -aI922 -aI126 -aI890 -aI139 -aa(lp4618 -g15 -aI743 -aI179 -aI820 -aI163 -aI783 -aI172 -aa(lp4619 -g15 -aI621 -aI189 -aI704 -aI186 -aI663 -aI189 -aa(lp4620 -g15 -aI474 -aI175 -aI570 -aI189 -aI521 -aI185 -aa(lp4621 -g15 -aI342 -aI133 -aI427 -aI166 -aI383 -aI152 -aa(lp4622 -g15 -aI230 -aI61 -aI301 -aI114 -aI264 -aI90 -aa(lp4623 -g15 -aI143 -aI-37 -aI196 -aI33 -aI167 -aI0 -aa(lp4624 -g15 -aI87 -aI-166 -aI119 -aI-76 -aI100 -aI-119 -aa(lp4625 -g15 -aI67 -aI-325 -aI74 -aI-214 -aI67 -aI-267 -aa(lp4626 -g15 -aI89 -aI-495 -aI67 -aI-384 -aI74 -aI-441 -aa(lp4627 -g15 -aI151 -aI-646 -aI104 -aI-549 -aI124 -aI-600 -aa(lp4628 -g15 -aI248 -aI-772 -aI178 -aI-692 -aI210 -aI-734 -aa(lp4629 -g15 -aI376 -aI-868 -aI286 -aI-809 -aI329 -aI-841 -aa(lp4630 -g15 -aI530 -aI-929 -aI424 -aI-895 -aI475 -aI-915 -aa(lp4631 -g15 -aI706 -aI-951 -aI586 -aI-944 -aI644 -aI-951 -aa(lp4632 -g15 -aI910 -aI-918 -aI783 -aI-951 -aI851 -aI-940 -aa(lp4633 -g15 -aI1056 -aI-827 -aI968 -aI-896 -aI1017 -aI-865 -aa(lp4634 -g15 -aI1145 -aI-691 -aI1096 -aI-788 -aI1125 -aI-743 -aa(lp4635 -g15 -aI1175 -aI-522 -aI1165 -aI-638 -aI1175 -aI-582 -aa(lp4636 -g10 -aa(lp4637 -g8 -aI500 -aI-316 -aa(lp4638 -g15 -aI523 -aI-214 -aI500 -aI-272 -aI507 -aI-238 -aa(lp4639 -g15 -aI585 -aI-179 -aI539 -aI-191 -aI559 -aI-179 -aa(lp4640 -g15 -aI634 -aI-192 -aI604 -aI-179 -aI620 -aI-183 -aa(lp4641 -g15 -aI668 -aI-229 -aI648 -aI-202 -aI659 -aI-214 -aa(lp4642 -g15 -aI692 -aI-279 -aI678 -aI-244 -aI685 -aI-260 -aa(lp4643 -g15 -aI706 -aI-336 -aI698 -aI-298 -aI702 -aI-317 -aa(lp4644 -g20 -aI759 -aI-608 -aa(lp4645 -g15 -aI748 -aI-624 -aI757 -aI-614 -aI753 -aI-620 -aa(lp4646 -g15 -aI731 -aI-636 -aI743 -aI-629 -aI737 -aI-633 -aa(lp4647 -g15 -aI710 -aI-643 -aI724 -aI-639 -aI717 -aI-642 -aa(lp4648 -g15 -aI689 -aI-646 -aI703 -aI-645 -aI696 -aI-646 -aa(lp4649 -g15 -aI628 -aI-629 -aI666 -aI-646 -aI646 -aI-640 -aa(lp4650 -g15 -aI580 -aI-584 -aI610 -aI-617 -aI594 -aI-602 -aa(lp4651 -g15 -aI544 -aI-521 -aI566 -aI-566 -aI554 -aI-545 -aa(lp4652 -g15 -aI519 -aI-449 -aI534 -aI-497 -aI525 -aI-473 -aa(lp4653 -g15 -aI504 -aI-378 -aI512 -aI-425 -aI507 -aI-401 -aa(lp4654 -g15 -aI500 -aI-316 -aI501 -aI-354 -aI500 -aI-334 -aa(lp4655 -g10 -aa(lp4656 -g8 -aI1227 -aI0 -aa(lp4657 -g10 -aa(lp4658 -g8 -aI1227 -aI0 -aasVD -(lp4659 -(lp4660 -g8 -aI949 -aI-493 -aa(lp4661 -g15 -aI919 -aI-292 -aI949 -aI-420 -aI939 -aI-353 -aa(lp4662 -g15 -aI829 -aI-136 -aI899 -aI-232 -aI869 -aI-180 -aa(lp4663 -g15 -aI681 -aI-35 -aI790 -aI-93 -aI740 -aI-59 -aa(lp4664 -g15 -aI477 -aI0 -aI623 -aI-11 -aI554 -aI0 -aa(lp4665 -g20 -aI37 -aI0 -aa(lp4666 -g20 -aI37 -aI-70 -aa(lp4667 -g20 -aI93 -aI-70 -aa(lp4668 -g15 -aI120 -aI-73 -aI103 -aI-70 -aI112 -aI-71 -aa(lp4669 -g15 -aI141 -aI-85 -aI128 -aI-75 -aI135 -aI-79 -aa(lp4670 -g15 -aI156 -aI-111 -aI148 -aI-91 -aI152 -aI-100 -aa(lp4671 -g15 -aI161 -aI-157 -aI159 -aI-122 -aI161 -aI-138 -aa(lp4672 -g20 -aI161 -aI-799 -aa(lp4673 -g15 -aI156 -aI-842 -aI161 -aI-817 -aI159 -aI-831 -aa(lp4674 -g15 -aI141 -aI-866 -aI152 -aI-852 -aI147 -aI-861 -aa(lp4675 -g15 -aI119 -aI-878 -aI135 -aI-872 -aI128 -aI-876 -aa(lp4676 -g15 -aI93 -aI-881 -aI111 -aI-880 -aI102 -aI-881 -aa(lp4677 -g20 -aI37 -aI-881 -aa(lp4678 -g20 -aI37 -aI-951 -aa(lp4679 -g20 -aI477 -aI-951 -aa(lp4680 -g15 -aI675 -aI-922 -aI550 -aI-951 -aI617 -aI-941 -aa(lp4681 -g15 -aI823 -aI-835 -aI733 -aI-903 -aI783 -aI-874 -aa(lp4682 -g15 -aI916 -aI-692 -aI864 -aI-797 -aI895 -aI-749 -aa(lp4683 -g15 -aI949 -aI-493 -aI938 -aI-634 -aI949 -aI-568 -aa(lp4684 -g10 -aa(lp4685 -g8 -aI723 -aI-493 -aa(lp4686 -g15 -aI653 -aI-776 -aI723 -aI-620 -aI700 -aI-714 -aa(lp4687 -g15 -aI447 -aI-869 -aI607 -aI-838 -aI538 -aI-869 -aa(lp4688 -g20 -aI371 -aI-869 -aa(lp4689 -g20 -aI371 -aI-82 -aa(lp4690 -g20 -aI446 -aI-82 -aa(lp4691 -g15 -aI567 -aI-110 -aI492 -aI-82 -aI532 -aI-91 -aa(lp4692 -g15 -aI653 -aI-192 -aI601 -aI-129 -aI630 -aI-156 -aa(lp4693 -g15 -aI706 -aI-321 -aI677 -aI-227 -aI694 -aI-270 -aa(lp4694 -g15 -aI723 -aI-493 -aI718 -aI-372 -aI723 -aI-429 -aa(lp4695 -g10 -aa(lp4696 -g8 -aI1022 -aI0 -aa(lp4697 -g10 -aa(lp4698 -g8 -aI1022 -aI0 -aasVH -(lp4699 -(lp4700 -g8 -aI594 -aI0 -aa(lp4701 -g20 -aI594 -aI-70 -aa(lp4702 -g20 -aI651 -aI-70 -aa(lp4703 -g15 -aI678 -aI-73 -aI661 -aI-70 -aI670 -aI-71 -aa(lp4704 -g15 -aI700 -aI-85 -aI686 -aI-75 -aI693 -aI-79 -aa(lp4705 -g15 -aI714 -aI-111 -aI706 -aI-91 -aI711 -aI-100 -aa(lp4706 -g15 -aI720 -aI-157 -aI718 -aI-122 -aI720 -aI-138 -aa(lp4707 -g20 -aI720 -aI-455 -aa(lp4708 -g20 -aI371 -aI-455 -aa(lp4709 -g20 -aI371 -aI-157 -aa(lp4710 -g15 -aI377 -aI-111 -aI371 -aI-138 -aI373 -aI-122 -aa(lp4711 -g15 -aI391 -aI-85 -aI380 -aI-100 -aI385 -aI-91 -aa(lp4712 -g15 -aI413 -aI-73 -aI398 -aI-79 -aI405 -aI-75 -aa(lp4713 -g15 -aI440 -aI-70 -aI421 -aI-71 -aI430 -aI-70 -aa(lp4714 -g20 -aI497 -aI-70 -aa(lp4715 -g20 -aI497 -aI0 -aa(lp4716 -g20 -aI37 -aI0 -aa(lp4717 -g20 -aI37 -aI-70 -aa(lp4718 -g20 -aI93 -aI-70 -aa(lp4719 -g15 -aI119 -aI-73 -aI102 -aI-70 -aI111 -aI-71 -aa(lp4720 -g15 -aI141 -aI-85 -aI128 -aI-75 -aI135 -aI-79 -aa(lp4721 -g15 -aI156 -aI-111 -aI147 -aI-91 -aI152 -aI-100 -aa(lp4722 -g15 -aI161 -aI-157 -aI159 -aI-122 -aI161 -aI-138 -aa(lp4723 -g20 -aI161 -aI-799 -aa(lp4724 -g15 -aI155 -aI-841 -aI161 -aI-816 -aI159 -aI-831 -aa(lp4725 -g15 -aI140 -aI-866 -aI152 -aI-852 -aI147 -aI-860 -aa(lp4726 -g15 -aI119 -aI-877 -aI134 -aI-871 -aI127 -aI-875 -aa(lp4727 -g15 -aI93 -aI-880 -aI110 -aI-879 -aI102 -aI-880 -aa(lp4728 -g20 -aI37 -aI-880 -aa(lp4729 -g20 -aI37 -aI-951 -aa(lp4730 -g20 -aI497 -aI-951 -aa(lp4731 -g20 -aI497 -aI-880 -aa(lp4732 -g20 -aI440 -aI-880 -aa(lp4733 -g15 -aI413 -aI-877 -aI430 -aI-880 -aI421 -aI-879 -aa(lp4734 -g15 -aI391 -aI-865 -aI405 -aI-875 -aI398 -aI-871 -aa(lp4735 -g15 -aI377 -aI-839 -aI385 -aI-859 -aI380 -aI-850 -aa(lp4736 -g15 -aI371 -aI-793 -aI373 -aI-828 -aI371 -aI-812 -aa(lp4737 -g20 -aI371 -aI-536 -aa(lp4738 -g20 -aI720 -aI-536 -aa(lp4739 -g20 -aI720 -aI-793 -aa(lp4740 -g15 -aI714 -aI-839 -aI720 -aI-812 -aI718 -aI-828 -aa(lp4741 -g15 -aI700 -aI-865 -aI711 -aI-850 -aI706 -aI-859 -aa(lp4742 -g15 -aI678 -aI-877 -aI693 -aI-871 -aI686 -aI-875 -aa(lp4743 -g15 -aI651 -aI-880 -aI670 -aI-879 -aI661 -aI-880 -aa(lp4744 -g20 -aI594 -aI-880 -aa(lp4745 -g20 -aI594 -aI-951 -aa(lp4746 -g20 -aI1054 -aI-951 -aa(lp4747 -g20 -aI1054 -aI-880 -aa(lp4748 -g20 -aI998 -aI-880 -aa(lp4749 -g15 -aI972 -aI-877 -aI989 -aI-880 -aI980 -aI-879 -aa(lp4750 -g15 -aI950 -aI-865 -aI964 -aI-875 -aI957 -aI-871 -aa(lp4751 -g15 -aI936 -aI-839 -aI944 -aI-859 -aI939 -aI-850 -aa(lp4752 -g15 -aI930 -aI-793 -aI932 -aI-828 -aI930 -aI-812 -aa(lp4753 -g20 -aI930 -aI-149 -aa(lp4754 -g15 -aI936 -aI-107 -aI930 -aI-132 -aI932 -aI-118 -aa(lp4755 -g15 -aI951 -aI-83 -aI940 -aI-97 -aI945 -aI-89 -aa(lp4756 -g15 -aI972 -aI-73 -aI957 -aI-78 -aI964 -aI-74 -aa(lp4757 -g15 -aI998 -aI-70 -aI981 -aI-71 -aI989 -aI-70 -aa(lp4758 -g20 -aI1054 -aI-70 -aa(lp4759 -g20 -aI1054 -aI0 -aa(lp4760 -g10 -aa(lp4761 -g8 -aI1091 -aI0 -aa(lp4762 -g10 -aa(lp4763 -g8 -aI1091 -aI0 -aasVL -(lp4764 -(lp4765 -g8 -aI37 -aI0 -aa(lp4766 -g20 -aI37 -aI-70 -aa(lp4767 -g20 -aI93 -aI-70 -aa(lp4768 -g15 -aI120 -aI-73 -aI103 -aI-70 -aI112 -aI-71 -aa(lp4769 -g15 -aI141 -aI-85 -aI128 -aI-75 -aI135 -aI-79 -aa(lp4770 -g15 -aI156 -aI-111 -aI148 -aI-91 -aI152 -aI-100 -aa(lp4771 -g15 -aI161 -aI-157 -aI159 -aI-122 -aI161 -aI-138 -aa(lp4772 -g20 -aI161 -aI-794 -aa(lp4773 -g15 -aI156 -aI-840 -aI161 -aI-813 -aI159 -aI-828 -aa(lp4774 -g15 -aI141 -aI-866 -aI152 -aI-851 -aI148 -aI-860 -aa(lp4775 -g15 -aI120 -aI-878 -aI135 -aI-872 -aI128 -aI-876 -aa(lp4776 -g15 -aI93 -aI-881 -aI112 -aI-880 -aI103 -aI-881 -aa(lp4777 -g20 -aI37 -aI-881 -aa(lp4778 -g20 -aI37 -aI-951 -aa(lp4779 -g20 -aI497 -aI-951 -aa(lp4780 -g20 -aI497 -aI-881 -aa(lp4781 -g20 -aI441 -aI-881 -aa(lp4782 -g15 -aI415 -aI-878 -aI432 -aI-881 -aI423 -aI-880 -aa(lp4783 -g15 -aI393 -aI-866 -aI406 -aI-876 -aI399 -aI-872 -aa(lp4784 -g15 -aI378 -aI-842 -aI387 -aI-861 -aI382 -aI-852 -aa(lp4785 -g15 -aI373 -aI-799 -aI374 -aI-831 -aI373 -aI-817 -aa(lp4786 -g20 -aI373 -aI-80 -aa(lp4787 -g20 -aI621 -aI-80 -aa(lp4788 -g15 -aI694 -aI-110 -aI652 -aI-80 -aI676 -aI-90 -aa(lp4789 -g15 -aI731 -aI-196 -aI711 -aI-130 -aI723 -aI-159 -aa(lp4790 -g20 -aI753 -aI-297 -aa(lp4791 -g20 -aI828 -aI-297 -aa(lp4792 -g20 -aI818 -aI0 -aa(lp4793 -g10 -aa(lp4794 -g8 -aI871 -aI0 -aa(lp4795 -g10 -aa(lp4796 -g8 -aI871 -aI0 -aasVP -(lp4797 -(lp4798 -g8 -aI810 -aI-668 -aa(lp4799 -g15 -aI789 -aI-553 -aI810 -aI-628 -aI803 -aI-590 -aa(lp4800 -g15 -aI722 -aI-455 -aI775 -aI-516 -aI753 -aI-484 -aa(lp4801 -g15 -aI600 -aI-388 -aI690 -aI-427 -aI650 -aI-405 -aa(lp4802 -g15 -aI417 -aI-363 -aI550 -aI-371 -aI489 -aI-363 -aa(lp4803 -g20 -aI371 -aI-363 -aa(lp4804 -g20 -aI371 -aI-149 -aa(lp4805 -g15 -aI377 -aI-107 -aI371 -aI-132 -aI373 -aI-118 -aa(lp4806 -g15 -aI393 -aI-83 -aI381 -aI-97 -aI386 -aI-89 -aa(lp4807 -g15 -aI416 -aI-73 -aI399 -aI-78 -aI407 -aI-74 -aa(lp4808 -g15 -aI442 -aI-70 -aI424 -aI-71 -aI433 -aI-70 -aa(lp4809 -g20 -aI524 -aI-70 -aa(lp4810 -g20 -aI524 -aI0 -aa(lp4811 -g20 -aI37 -aI0 -aa(lp4812 -g20 -aI37 -aI-70 -aa(lp4813 -g20 -aI93 -aI-70 -aa(lp4814 -g15 -aI120 -aI-73 -aI103 -aI-70 -aI112 -aI-71 -aa(lp4815 -g15 -aI141 -aI-85 -aI128 -aI-75 -aI135 -aI-79 -aa(lp4816 -g15 -aI156 -aI-111 -aI148 -aI-91 -aI152 -aI-100 -aa(lp4817 -g15 -aI161 -aI-157 -aI159 -aI-122 -aI161 -aI-138 -aa(lp4818 -g20 -aI161 -aI-799 -aa(lp4819 -g15 -aI156 -aI-842 -aI161 -aI-817 -aI159 -aI-831 -aa(lp4820 -g15 -aI141 -aI-866 -aI152 -aI-852 -aI147 -aI-861 -aa(lp4821 -g15 -aI119 -aI-878 -aI135 -aI-872 -aI128 -aI-876 -aa(lp4822 -g15 -aI93 -aI-881 -aI111 -aI-880 -aI102 -aI-881 -aa(lp4823 -g20 -aI37 -aI-881 -aa(lp4824 -g20 -aI37 -aI-951 -aa(lp4825 -g20 -aI446 -aI-951 -aa(lp4826 -g15 -aI607 -aI-931 -aI508 -aI-951 -aI561 -aI-944 -aa(lp4827 -g15 -aI721 -aI-875 -aI652 -aI-918 -aI690 -aI-900 -aa(lp4828 -g15 -aI788 -aI-786 -aI751 -aI-851 -aI773 -aI-821 -aa(lp4829 -g15 -aI810 -aI-668 -aI803 -aI-751 -aI810 -aI-712 -aa(lp4830 -g10 -aa(lp4831 -g8 -aI371 -aI-440 -aa(lp4832 -g20 -aI404 -aI-440 -aa(lp4833 -g15 -aI488 -aI-453 -aI437 -aI-440 -aI465 -aI-445 -aa(lp4834 -g15 -aI544 -aI-492 -aI511 -aI-461 -aI530 -aI-474 -aa(lp4835 -g15 -aI576 -aI-561 -aI559 -aI-510 -aI569 -aI-533 -aa(lp4836 -g15 -aI586 -aI-663 -aI583 -aI-589 -aI586 -aI-623 -aa(lp4837 -g15 -aI577 -aI-756 -aI586 -aI-699 -aI583 -aI-730 -aa(lp4838 -g15 -aI549 -aI-821 -aI571 -aI-782 -aI562 -aI-804 -aa(lp4839 -g15 -aI499 -aI-859 -aI537 -aI-838 -aI520 -aI-851 -aa(lp4840 -g15 -aI423 -aI-872 -aI479 -aI-868 -aI453 -aI-872 -aa(lp4841 -g20 -aI371 -aI-872 -aa(lp4842 -g10 -aa(lp4843 -g8 -aI850 -aI0 -aa(lp4844 -g10 -aa(lp4845 -g8 -aI850 -aI0 -aasVT -(lp4846 -(lp4847 -g8 -aI541 -aI-157 -aa(lp4848 -g15 -aI546 -aI-111 -aI541 -aI-138 -aI542 -aI-122 -aa(lp4849 -g15 -aI560 -aI-85 -aI549 -aI-100 -aI554 -aI-91 -aa(lp4850 -g15 -aI582 -aI-73 -aI567 -aI-79 -aI574 -aI-75 -aa(lp4851 -g15 -aI609 -aI-70 -aI590 -aI-71 -aI599 -aI-70 -aa(lp4852 -g20 -aI665 -aI-70 -aa(lp4853 -g20 -aI665 -aI0 -aa(lp4854 -g20 -aI205 -aI0 -aa(lp4855 -g20 -aI205 -aI-70 -aa(lp4856 -g20 -aI261 -aI-70 -aa(lp4857 -g15 -aI288 -aI-73 -aI271 -aI-70 -aI280 -aI-71 -aa(lp4858 -g15 -aI309 -aI-85 -aI296 -aI-75 -aI303 -aI-79 -aa(lp4859 -g15 -aI324 -aI-111 -aI315 -aI-91 -aI320 -aI-100 -aa(lp4860 -g15 -aI329 -aI-157 -aI327 -aI-122 -aI329 -aI-138 -aa(lp4861 -g20 -aI329 -aI-869 -aa(lp4862 -g20 -aI222 -aI-869 -aa(lp4863 -g15 -aI172 -aI-863 -aI202 -aI-869 -aI185 -aI-867 -aa(lp4864 -g15 -aI139 -aI-844 -aI159 -aI-859 -aI148 -aI-852 -aa(lp4865 -g15 -aI120 -aI-815 -aI131 -aI-836 -aI124 -aI-827 -aa(lp4866 -g15 -aI111 -aI-775 -aI116 -aI-803 -aI113 -aI-790 -aa(lp4867 -g20 -aI102 -aI-692 -aa(lp4868 -g20 -aI13 -aI-692 -aa(lp4869 -g20 -aI20 -aI-951 -aa(lp4870 -g20 -aI850 -aI-951 -aa(lp4871 -g20 -aI857 -aI-692 -aa(lp4872 -g20 -aI768 -aI-692 -aa(lp4873 -g20 -aI758 -aI-775 -aa(lp4874 -g15 -aI749 -aI-815 -aI756 -aI-790 -aI753 -aI-803 -aa(lp4875 -g15 -aI730 -aI-844 -aI745 -aI-827 -aI739 -aI-836 -aa(lp4876 -g15 -aI697 -aI-863 -aI722 -aI-852 -aI711 -aI-859 -aa(lp4877 -g15 -aI647 -aI-869 -aI684 -aI-867 -aI667 -aI-869 -aa(lp4878 -g20 -aI541 -aI-869 -aa(lp4879 -g10 -aa(lp4880 -g8 -aI870 -aI0 -aa(lp4881 -g10 -aa(lp4882 -g8 -aI870 -aI0 -aasVX -(lp4883 -(lp4884 -g8 -aI697 -aI-841 -aa(lp4885 -g15 -aI691 -aI-861 -aI697 -aI-849 -aI695 -aI-856 -aa(lp4886 -g15 -aI675 -aI-873 -aI687 -aI-866 -aI682 -aI-870 -aa(lp4887 -g15 -aI651 -aI-879 -aI668 -aI-876 -aI660 -aI-878 -aa(lp4888 -g15 -aI622 -aI-881 -aI642 -aI-880 -aI632 -aI-881 -aa(lp4889 -g20 -aI618 -aI-881 -aa(lp4890 -g20 -aI618 -aI-951 -aa(lp4891 -g20 -aI930 -aI-951 -aa(lp4892 -g20 -aI930 -aI-881 -aa(lp4893 -g20 -aI918 -aI-881 -aa(lp4894 -g15 -aI883 -aI-876 -aI905 -aI-881 -aI893 -aI-879 -aa(lp4895 -g15 -aI852 -aI-859 -aI873 -aI-872 -aI862 -aI-867 -aa(lp4896 -g15 -aI821 -aI-830 -aI842 -aI-852 -aI832 -aI-842 -aa(lp4897 -g15 -aI786 -aI-784 -aI811 -aI-818 -aI799 -aI-802 -aa(lp4898 -g20 -aI593 -aI-521 -aa(lp4899 -g20 -aI838 -aI-140 -aa(lp4900 -g15 -aI892 -aI-85 -aI855 -aI-113 -aI873 -aI-94 -aa(lp4901 -g15 -aI945 -aI-70 -aI911 -aI-75 -aI928 -aI-70 -aa(lp4902 -g20 -aI962 -aI-70 -aa(lp4903 -g20 -aI962 -aI0 -aa(lp4904 -g20 -aI522 -aI0 -aa(lp4905 -g20 -aI522 -aI-70 -aa(lp4906 -g20 -aI529 -aI-70 -aa(lp4907 -g15 -aI609 -aI-114 -aI582 -aI-70 -aI609 -aI-85 -aa(lp4908 -g15 -aI608 -aI-129 -aI609 -aI-119 -aI608 -aI-124 -aa(lp4909 -g15 -aI601 -aI-146 -aI607 -aI-133 -aI605 -aI-139 -aa(lp4910 -g15 -aI588 -aI-170 -aI598 -aI-152 -aI594 -aI-160 -aa(lp4911 -g15 -aI565 -aI-205 -aI582 -aI-179 -aI575 -aI-191 -aa(lp4912 -g20 -aI442 -aI-391 -aa(lp4913 -g20 -aI298 -aI-196 -aa(lp4914 -g15 -aI275 -aI-158 -aI290 -aI-185 -aI282 -aI-172 -aa(lp4915 -g15 -aI264 -aI-115 -aI268 -aI-143 -aI264 -aI-129 -aa(lp4916 -g15 -aI282 -aI-81 -aI264 -aI-100 -aI270 -aI-89 -aa(lp4917 -g15 -aI345 -aI-70 -aI294 -aI-74 -aI315 -aI-70 -aa(lp4918 -g20 -aI349 -aI-70 -aa(lp4919 -g20 -aI349 -aI0 -aa(lp4920 -g20 -aI13 -aI0 -aa(lp4921 -g20 -aI13 -aI-70 -aa(lp4922 -g20 -aI21 -aI-70 -aa(lp4923 -g15 -aI63 -aI-77 -aI37 -aI-70 -aI51 -aI-72 -aa(lp4924 -g15 -aI97 -aI-95 -aI75 -aI-81 -aI87 -aI-87 -aa(lp4925 -g15 -aI128 -aI-124 -aI108 -aI-103 -aI118 -aI-113 -aa(lp4926 -g15 -aI160 -aI-163 -aI138 -aI-136 -aI149 -aI-149 -aa(lp4927 -g20 -aI393 -aI-467 -aa(lp4928 -g20 -aI173 -aI-810 -aa(lp4929 -g15 -aI151 -aI-841 -aI165 -aI-821 -aI158 -aI-832 -aa(lp4930 -g15 -aI127 -aI-863 -aI144 -aI-849 -aI136 -aI-857 -aa(lp4931 -g15 -aI97 -aI-876 -aI118 -aI-869 -aI108 -aI-873 -aa(lp4932 -g15 -aI58 -aI-881 -aI86 -aI-879 -aI73 -aI-881 -aa(lp4933 -g20 -aI41 -aI-881 -aa(lp4934 -g20 -aI41 -aI-951 -aa(lp4935 -g20 -aI482 -aI-951 -aa(lp4936 -g20 -aI482 -aI-881 -aa(lp4937 -g20 -aI478 -aI-881 -aa(lp4938 -g15 -aI440 -aI-878 -aI463 -aI-881 -aI450 -aI-880 -aa(lp4939 -g15 -aI416 -aI-869 -aI430 -aI-876 -aI422 -aI-873 -aa(lp4940 -g15 -aI403 -aI-856 -aI409 -aI-865 -aI405 -aI-861 -aa(lp4941 -g15 -aI399 -aI-841 -aI400 -aI-852 -aI399 -aI-847 -aa(lp4942 -g15 -aI409 -aI-807 -aI399 -aI-832 -aI403 -aI-821 -aa(lp4943 -g15 -aI434 -aI-763 -aI416 -aI-793 -aI424 -aI-779 -aa(lp4944 -g20 -aI545 -aI-598 -aa(lp4945 -g20 -aI661 -aI-760 -aa(lp4946 -g15 -aI685 -aI-801 -aI669 -aI-772 -aI677 -aI-786 -aa(lp4947 -g15 -aI697 -aI-841 -aI693 -aI-816 -aI697 -aI-829 -aa(lp4948 -g10 -aa(lp4949 -g8 -aI975 -aI0 -aa(lp4950 -g10 -aa(lp4951 -g8 -aI975 -aI0 -aasV\u005C -(lp4952 -(lp4953 -g8 -aI0 -aI-1012 -aa(lp4954 -g20 -aI94 -aI-1012 -aa(lp4955 -g20 -aI384 -aI161 -aa(lp4956 -g20 -aI287 -aI161 -aa(lp4957 -g10 -aa(lp4958 -g8 -aI384 -aI0 -aa(lp4959 -g10 -aa(lp4960 -g8 -aI384 -aI0 -aasV` -(lp4961 -(lp4962 -g8 -aI464 -aI-807 -aa(lp4963 -g15 -aI394 -aI-852 -aI443 -aI-819 -aI420 -aI-834 -aa(lp4964 -g15 -aI321 -aI-908 -aI369 -aI-870 -aI344 -aI-889 -aa(lp4965 -g15 -aI257 -aI-963 -aI297 -aI-927 -aI276 -aI-945 -aa(lp4966 -g15 -aI216 -aI-1007 -aI238 -aI-980 -aI224 -aI-995 -aa(lp4967 -g20 -aI216 -aI-1021 -aa(lp4968 -g20 -aI425 -aI-1021 -aa(lp4969 -g15 -aI451 -aI-972 -aI432 -aI-1006 -aI440 -aI-990 -aa(lp4970 -g15 -aI486 -aI-919 -aI462 -aI-954 -aI474 -aI-937 -aa(lp4971 -g15 -aI522 -aI-868 -aI497 -aI-902 -aI509 -aI-885 -aa(lp4972 -g15 -aI554 -aI-825 -aI534 -aI-852 -aI545 -aI-837 -aa(lp4973 -g20 -aI554 -aI-807 -aa(lp4974 -g10 -aa(lp4975 -g8 -aI769 -aI0 -aa(lp4976 -g10 -aa(lp4977 -g8 -aI769 -aI0 -aasVd -(lp4978 -(lp4979 -g8 -aI730 -aI-163 -aa(lp4980 -g15 -aI739 -aI-114 -aI730 -aI-143 -aI733 -aI-126 -aa(lp4981 -g15 -aI763 -aI-86 -aI745 -aI-102 -aI753 -aI-93 -aa(lp4982 -g15 -aI799 -aI-73 -aI774 -aI-80 -aI785 -aI-75 -aa(lp4983 -g15 -aI841 -aI-70 -aI812 -aI-71 -aI826 -aI-70 -aa(lp4984 -g20 -aI846 -aI-70 -aa(lp4985 -g20 -aI846 -aI0 -aa(lp4986 -g20 -aI587 -aI0 -aa(lp4987 -g20 -aI550 -aI-103 -aa(lp4988 -g20 -aI538 -aI-103 -aa(lp4989 -g15 -aI504 -aI-54 -aI528 -aI-85 -aI517 -aI-69 -aa(lp4990 -g15 -aI459 -aI-18 -aI491 -aI-40 -aI476 -aI-28 -aa(lp4991 -g15 -aI403 -aI5 -aI443 -aI-7 -aI424 -aI0 -aa(lp4992 -g15 -aI333 -aI13 -aI382 -aI10 -aI359 -aI13 -aa(lp4993 -g15 -aI217 -aI-8 -aI289 -aI13 -aI251 -aI6 -aa(lp4994 -g15 -aI131 -aI-75 -aI183 -aI-22 -aI155 -aI-45 -aa(lp4995 -g15 -aI79 -aI-190 -aI108 -aI-105 -aI91 -aI-143 -aa(lp4996 -g15 -aI61 -aI-355 -aI67 -aI-236 -aI61 -aI-291 -aa(lp4997 -g15 -aI79 -aI-522 -aI61 -aI-419 -aI67 -aI-475 -aa(lp4998 -g15 -aI131 -aI-639 -aI91 -aI-569 -aI108 -aI-608 -aa(lp4999 -g15 -aI216 -aI-707 -aI154 -aI-669 -aI182 -aI-692 -aa(lp5000 -g15 -aI330 -aI-730 -aI249 -aI-722 -aI287 -aI-730 -aa(lp5001 -g15 -aI398 -aI-721 -aI355 -aI-730 -aI378 -aI-727 -aa(lp5002 -g15 -aI453 -aI-699 -aI418 -aI-716 -aI437 -aI-709 -aa(lp5003 -g15 -aI496 -aI-666 -aI469 -aI-690 -aI484 -aI-679 -aa(lp5004 -g15 -aI529 -aI-623 -aI509 -aI-653 -aI520 -aI-638 -aa(lp5005 -g20 -aI538 -aI-623 -aa(lp5006 -g15 -aI533 -aI-692 -aI536 -aI-647 -aI534 -aI-671 -aa(lp5007 -g15 -aI531 -aI-720 -aI532 -aI-702 -aI532 -aI-711 -aa(lp5008 -g15 -aI529 -aI-747 -aI530 -aI-730 -aI530 -aI-739 -aa(lp5009 -g15 -aI528 -aI-770 -aI528 -aI-756 -aI528 -aI-763 -aa(lp5010 -g15 -aI527 -aI-786 -aI528 -aI-776 -aI527 -aI-782 -aa(lp5011 -g20 -aI527 -aI-859 -aa(lp5012 -g15 -aI519 -aI-903 -aI527 -aI-877 -aI525 -aI-892 -aa(lp5013 -g15 -aI495 -aI-928 -aI513 -aI-914 -aI505 -aI-922 -aa(lp5014 -g15 -aI461 -aI-939 -aI486 -aI-934 -aI474 -aI-937 -aa(lp5015 -g15 -aI419 -aI-942 -aI448 -aI-941 -aI434 -aI-942 -aa(lp5016 -g20 -aI409 -aI-942 -aa(lp5017 -g20 -aI409 -aI-1012 -aa(lp5018 -g20 -aI730 -aI-1012 -aa(lp5019 -g10 -aa(lp5020 -g8 -aI390 -aI-86 -aa(lp5021 -g15 -aI456 -aI-102 -aI417 -aI-86 -aI439 -aI-91 -aa(lp5022 -g15 -aI499 -aI-153 -aI474 -aI-113 -aI488 -aI-130 -aa(lp5023 -g15 -aI521 -aI-238 -aI509 -aI-175 -aI517 -aI-204 -aa(lp5024 -g15 -aI527 -aI-358 -aI525 -aI-272 -aI527 -aI-312 -aa(lp5025 -g15 -aI521 -aI-475 -aI527 -aI-402 -aI525 -aI-441 -aa(lp5026 -g15 -aI499 -aI-561 -aI517 -aI-509 -aI509 -aI-537 -aa(lp5027 -g15 -aI456 -aI-613 -aI488 -aI-584 -aI474 -aI-601 -aa(lp5028 -g15 -aI390 -aI-631 -aI439 -aI-625 -aI417 -aI-631 -aa(lp5029 -g15 -aI333 -aI-613 -aI368 -aI-631 -aI349 -aI-625 -aa(lp5030 -g15 -aI295 -aI-560 -aI317 -aI-601 -aI305 -aI-584 -aa(lp5031 -g15 -aI273 -aI-474 -aI285 -aI-537 -aI278 -aI-508 -aa(lp5032 -g15 -aI266 -aI-356 -aI269 -aI-440 -aI266 -aI-401 -aa(lp5033 -g15 -aI295 -aI-153 -aI266 -aI-266 -aI276 -aI-198 -aa(lp5034 -g15 -aI390 -aI-86 -aI314 -aI-108 -aI345 -aI-86 -aa(lp5035 -g10 -aa(lp5036 -g8 -aI865 -aI0 -aa(lp5037 -g10 -aa(lp5038 -g8 -aI865 -aI0 -aasVh -(lp5039 -(lp5040 -g8 -aI558 -aI0 -aa(lp5041 -g20 -aI558 -aI-438 -aa(lp5042 -g15 -aI553 -aI-514 -aI558 -aI-466 -aI556 -aI-492 -aa(lp5043 -g15 -aI534 -aI-571 -aI549 -aI-537 -aI543 -aI-555 -aa(lp5044 -g15 -aI501 -aI-605 -aI526 -aI-586 -aI515 -aI-597 -aa(lp5045 -g15 -aI451 -aI-618 -aI487 -aI-614 -aI471 -aI-618 -aa(lp5046 -g15 -aI396 -aI-601 -aI429 -aI-618 -aI411 -aI-612 -aa(lp5047 -g15 -aI361 -aI-555 -aI381 -aI-589 -aI369 -aI-574 -aa(lp5048 -g15 -aI341 -aI-490 -aI352 -aI-536 -aI345 -aI-515 -aa(lp5049 -g15 -aI335 -aI-411 -aI337 -aI-465 -aI335 -aI-439 -aa(lp5050 -g20 -aI335 -aI-157 -aa(lp5051 -g15 -aI342 -aI-112 -aI335 -aI-138 -aI338 -aI-123 -aa(lp5052 -g15 -aI361 -aI-85 -aI347 -aI-100 -aI353 -aI-92 -aa(lp5053 -g15 -aI392 -aI-73 -aI370 -aI-79 -aI380 -aI-75 -aa(lp5054 -g15 -aI432 -aI-70 -aI404 -aI-71 -aI417 -aI-70 -aa(lp5055 -g20 -aI436 -aI-70 -aa(lp5056 -g20 -aI436 -aI0 -aa(lp5057 -g20 -aI26 -aI0 -aa(lp5058 -g20 -aI26 -aI-70 -aa(lp5059 -g20 -aI29 -aI-70 -aa(lp5060 -g15 -aI70 -aI-73 -aI44 -aI-70 -aI58 -aI-71 -aa(lp5061 -g15 -aI103 -aI-86 -aI83 -aI-75 -aI94 -aI-79 -aa(lp5062 -g15 -aI125 -aI-114 -aI113 -aI-92 -aI120 -aI-101 -aa(lp5063 -g15 -aI133 -aI-162 -aI130 -aI-126 -aI133 -aI-142 -aa(lp5064 -g20 -aI133 -aI-860 -aa(lp5065 -g15 -aI124 -aI-903 -aI133 -aI-878 -aI130 -aI-892 -aa(lp5066 -g15 -aI100 -aI-928 -aI117 -aI-914 -aI109 -aI-922 -aa(lp5067 -g15 -aI69 -aI-939 -aI90 -aI-934 -aI80 -aI-937 -aa(lp5068 -g15 -aI38 -aI-942 -aI58 -aI-941 -aI47 -aI-942 -aa(lp5069 -g20 -aI22 -aI-942 -aa(lp5070 -g20 -aI22 -aI-1012 -aa(lp5071 -g20 -aI335 -aI-1012 -aa(lp5072 -g20 -aI335 -aI-793 -aa(lp5073 -g15 -aI334 -aI-737 -aI335 -aI-775 -aI335 -aI-757 -aa(lp5074 -g15 -aI330 -aI-681 -aI333 -aI-717 -aI332 -aI-698 -aa(lp5075 -g15 -aI325 -aI-623 -aI328 -aI-661 -aI327 -aI-642 -aa(lp5076 -g20 -aI337 -aI-623 -aa(lp5077 -g15 -aI379 -aI-682 -aI350 -aI-648 -aI364 -aI-668 -aa(lp5078 -g15 -aI427 -aI-714 -aI394 -aI-696 -aI410 -aI-707 -aa(lp5079 -g15 -aI481 -aI-728 -aI444 -aI-721 -aI462 -aI-726 -aa(lp5080 -g15 -aI541 -aI-731 -aI500 -aI-730 -aI520 -aI-731 -aa(lp5081 -g15 -aI633 -aI-716 -aI575 -aI-731 -aI606 -aI-726 -aa(lp5082 -g15 -aI702 -aI-670 -aI660 -aI-706 -aI683 -aI-690 -aa(lp5083 -g15 -aI746 -aI-590 -aI721 -aI-649 -aI736 -aI-622 -aa(lp5084 -g15 -aI761 -aI-474 -aI756 -aI-558 -aI761 -aI-519 -aa(lp5085 -g20 -aI761 -aI-164 -aa(lp5086 -g15 -aI766 -aI-115 -aI761 -aI-144 -aI762 -aI-127 -aa(lp5087 -g15 -aI783 -aI-86 -aI770 -aI-102 -aI775 -aI-93 -aa(lp5088 -g15 -aI811 -aI-73 -aI790 -aI-80 -aI799 -aI-75 -aa(lp5089 -g15 -aI850 -aI-70 -aI822 -aI-71 -aI835 -aI-70 -aa(lp5090 -g20 -aI854 -aI-70 -aa(lp5091 -g20 -aI854 -aI0 -aa(lp5092 -g10 -aa(lp5093 -g8 -aI889 -aI0 -aa(lp5094 -g10 -aa(lp5095 -g8 -aI889 -aI0 -aasVl -(lp5096 -(lp5097 -g8 -aI38 -aI-70 -aa(lp5098 -g15 -aI69 -aI-73 -aI48 -aI-70 -aI58 -aI-71 -aa(lp5099 -g15 -aI100 -aI-85 -aI81 -aI-75 -aI91 -aI-79 -aa(lp5100 -g15 -aI124 -aI-111 -aI109 -aI-91 -aI117 -aI-100 -aa(lp5101 -g15 -aI133 -aI-157 -aI130 -aI-122 -aI133 -aI-138 -aa(lp5102 -g20 -aI133 -aI-860 -aa(lp5103 -g15 -aI124 -aI-903 -aI133 -aI-878 -aI130 -aI-892 -aa(lp5104 -g15 -aI100 -aI-928 -aI117 -aI-914 -aI109 -aI-922 -aa(lp5105 -g15 -aI69 -aI-939 -aI90 -aI-934 -aI80 -aI-937 -aa(lp5106 -g15 -aI38 -aI-942 -aI58 -aI-941 -aI47 -aI-942 -aa(lp5107 -g20 -aI22 -aI-942 -aa(lp5108 -g20 -aI22 -aI-1012 -aa(lp5109 -g20 -aI335 -aI-1012 -aa(lp5110 -g20 -aI335 -aI-157 -aa(lp5111 -g15 -aI345 -aI-111 -aI335 -aI-138 -aI339 -aI-122 -aa(lp5112 -g15 -aI368 -aI-85 -aI351 -aI-100 -aI359 -aI-91 -aa(lp5113 -g15 -aI399 -aI-73 -aI378 -aI-79 -aI388 -aI-75 -aa(lp5114 -g15 -aI430 -aI-70 -aI411 -aI-71 -aI421 -aI-70 -aa(lp5115 -g20 -aI446 -aI-70 -aa(lp5116 -g20 -aI446 -aI0 -aa(lp5117 -g20 -aI22 -aI0 -aa(lp5118 -g20 -aI22 -aI-70 -aa(lp5119 -g10 -aa(lp5120 -g8 -aI469 -aI0 -aa(lp5121 -g10 -aa(lp5122 -g8 -aI469 -aI0 -aasVp -(lp5123 -(lp5124 -g8 -aI33 -aI249 -aa(lp5125 -g15 -aI64 -aI246 -aI43 -aI249 -aI53 -aI248 -aa(lp5126 -g15 -aI95 -aI234 -aI75 -aI244 -aI86 -aI240 -aa(lp5127 -g15 -aI118 -aI208 -aI104 -aI228 -aI112 -aI220 -aa(lp5128 -g15 -aI128 -aI163 -aI125 -aI197 -aI128 -aI182 -aa(lp5129 -g20 -aI128 -aI-550 -aa(lp5130 -g15 -aI121 -aI-599 -aI128 -aI-570 -aI125 -aI-587 -aa(lp5131 -g15 -aI102 -aI-627 -aI116 -aI-611 -aI110 -aI-620 -aa(lp5132 -g15 -aI73 -aI-640 -aI94 -aI-633 -aI84 -aI-638 -aa(lp5133 -g15 -aI38 -aI-643 -aI62 -aI-642 -aI50 -aI-643 -aa(lp5134 -g20 -aI29 -aI-643 -aa(lp5135 -g20 -aI29 -aI-714 -aa(lp5136 -g20 -aI290 -aI-714 -aa(lp5137 -g20 -aI314 -aI-610 -aa(lp5138 -g20 -aI320 -aI-610 -aa(lp5139 -g15 -aI353 -aI-657 -aI329 -aI-627 -aI341 -aI-643 -aa(lp5140 -g15 -aI398 -aI-694 -aI366 -aI-672 -aI381 -aI-684 -aa(lp5141 -g15 -aI454 -aI-718 -aI414 -aI-705 -aI433 -aI-713 -aa(lp5142 -g15 -aI524 -aI-727 -aI475 -aI-724 -aI498 -aI-727 -aa(lp5143 -g15 -aI641 -aI-705 -aI568 -aI-727 -aI607 -aI-720 -aa(lp5144 -g15 -aI727 -aI-637 -aI675 -aI-691 -aI704 -aI-668 -aa(lp5145 -g15 -aI779 -aI-521 -aI750 -aI-607 -aI767 -aI-568 -aa(lp5146 -g15 -aI797 -aI-354 -aI791 -aI-474 -aI797 -aI-419 -aa(lp5147 -g15 -aI779 -aI-188 -aI797 -aI-290 -aI791 -aI-234 -aa(lp5148 -g15 -aI728 -aI-72 -aI768 -aI-141 -aI750 -aI-102 -aa(lp5149 -g15 -aI644 -aI-5 -aI705 -aI-42 -aI677 -aI-19 -aa(lp5150 -g15 -aI529 -aI16 -aI611 -aI9 -aI572 -aI16 -aa(lp5151 -g15 -aI405 -aI-12 -aI478 -aI16 -aI437 -aI7 -aa(lp5152 -g15 -aI329 -aI-90 -aI373 -aI-31 -aI348 -aI-57 -aa(lp5153 -g20 -aI320 -aI-90 -aa(lp5154 -g15 -aI325 -aI-30 -aI322 -aI-69 -aI323 -aI-49 -aa(lp5155 -g15 -aI329 -aI22 -aI326 -aI-13 -aI328 -aI3 -aa(lp5156 -g15 -aI330 -aI71 -aI330 -aI41 -aI330 -aI57 -aa(lp5157 -g20 -aI330 -aI163 -aa(lp5158 -g15 -aI340 -aI208 -aI330 -aI182 -aI333 -aI197 -aa(lp5159 -g15 -aI363 -aI234 -aI346 -aI220 -aI354 -aI228 -aa(lp5160 -g15 -aI394 -aI246 -aI372 -aI240 -aI383 -aI244 -aa(lp5161 -g15 -aI425 -aI249 -aI405 -aI248 -aI415 -aI249 -aa(lp5162 -g20 -aI454 -aI249 -aa(lp5163 -g20 -aI454 -aI320 -aa(lp5164 -g20 -aI17 -aI320 -aa(lp5165 -g20 -aI17 -aI249 -aa(lp5166 -g10 -aa(lp5167 -g8 -aI466 -aI-82 -aa(lp5168 -g15 -aI562 -aI-149 -aI511 -aI-82 -aI543 -aI-104 -aa(lp5169 -g15 -aI591 -aI-353 -aI582 -aI-194 -aI591 -aI-262 -aa(lp5170 -g15 -aI562 -aI-556 -aI591 -aI-441 -aI582 -aI-509 -aa(lp5171 -g15 -aI468 -aI-627 -aI543 -aI-604 -aI511 -aI-627 -aa(lp5172 -g15 -aI401 -aI-609 -aI441 -aI-627 -aI419 -aI-621 -aa(lp5173 -g15 -aI359 -aI-557 -aI383 -aI-597 -aI369 -aI-580 -aa(lp5174 -g15 -aI337 -aI-471 -aI348 -aI-533 -aI341 -aI-505 -aa(lp5175 -g15 -aI330 -aI-354 -aI332 -aI-437 -aI330 -aI-398 -aa(lp5176 -g15 -aI337 -aI-234 -aI330 -aI-308 -aI332 -aI-268 -aa(lp5177 -g15 -aI359 -aI-149 -aI341 -aI-200 -aI348 -aI-171 -aa(lp5178 -g15 -aI401 -aI-98 -aI369 -aI-126 -aI383 -aI-109 -aa(lp5179 -g15 -aI466 -aI-82 -aI418 -aI-87 -aI440 -aI-82 -aa(lp5180 -g10 -aa(lp5181 -g8 -aI860 -aI0 -aa(lp5182 -g10 -aa(lp5183 -g8 -aI860 -aI0 -aasVt -(lp5184 -(lp5185 -g8 -aI418 -aI-93 -aa(lp5186 -g15 -aI468 -aI-97 -aI435 -aI-93 -aI452 -aI-95 -aa(lp5187 -g15 -aI513 -aI-106 -aI484 -aI-99 -aI499 -aI-102 -aa(lp5188 -g20 -aI513 -aI-19 -aa(lp5189 -g15 -aI484 -aI-8 -aI506 -aI-16 -aI496 -aI-12 -aa(lp5190 -g15 -aI443 -aI2 -aI472 -aI-4 -aI458 -aI-1 -aa(lp5191 -g15 -aI389 -aI10 -aI427 -aI5 -aI409 -aI8 -aa(lp5192 -g15 -aI324 -aI13 -aI369 -aI12 -aI347 -aI13 -aa(lp5193 -g15 -aI242 -aI2 -aI294 -aI13 -aI267 -aI9 -aa(lp5194 -g15 -aI180 -aI-33 -aI218 -aI-4 -aI197 -aI-16 -aa(lp5195 -g15 -aI141 -aI-98 -aI164 -aI-49 -aI151 -aI-71 -aa(lp5196 -g15 -aI128 -aI-196 -aI132 -aI-124 -aI128 -aI-157 -aa(lp5197 -g20 -aI128 -aI-623 -aa(lp5198 -g20 -aI27 -aI-623 -aa(lp5199 -g20 -aI27 -aI-691 -aa(lp5200 -g15 -aI104 -aI-708 -aI56 -aI-691 -aI82 -aI-697 -aa(lp5201 -g15 -aI158 -aI-747 -aI127 -aI-719 -aI145 -aI-732 -aa(lp5202 -g15 -aI220 -aI-879 -aI186 -aI-776 -aI206 -aI-820 -aa(lp5203 -g20 -aI330 -aI-879 -aa(lp5204 -g20 -aI330 -aI-714 -aa(lp5205 -g20 -aI501 -aI-714 -aa(lp5206 -g20 -aI501 -aI-623 -aa(lp5207 -g20 -aI330 -aI-623 -aa(lp5208 -g20 -aI330 -aI-210 -aa(lp5209 -g15 -aI351 -aI-121 -aI330 -aI-170 -aI337 -aI-140 -aa(lp5210 -g15 -aI418 -aI-93 -aI364 -aI-103 -aI387 -aI-93 -aa(lp5211 -g10 -aa(lp5212 -g8 -aI539 -aI0 -aa(lp5213 -g10 -aa(lp5214 -g8 -aI539 -aI0 -aasVx -(lp5215 -(lp5216 -g8 -aI580 -aI-603 -aa(lp5217 -g15 -aI561 -aI-635 -aI580 -aI-619 -aI573 -aI-630 -aa(lp5218 -g15 -aI511 -aI-643 -aI549 -aI-640 -aI532 -aI-643 -aa(lp5219 -g20 -aI507 -aI-643 -aa(lp5220 -g20 -aI507 -aI-714 -aa(lp5221 -g20 -aI815 -aI-714 -aa(lp5222 -g20 -aI815 -aI-643 -aa(lp5223 -g20 -aI804 -aI-643 -aa(lp5224 -g15 -aI769 -aI-639 -aI791 -aI-643 -aI779 -aI-642 -aa(lp5225 -g15 -aI738 -aI-626 -aI759 -aI-637 -aI748 -aI-633 -aa(lp5226 -g15 -aI707 -aI-600 -aI728 -aI-620 -aI717 -aI-611 -aa(lp5227 -g15 -aI669 -aI-558 -aI696 -aI-589 -aI683 -aI-575 -aa(lp5228 -g20 -aI531 -aI-390 -aa(lp5229 -g20 -aI727 -aI-140 -aa(lp5230 -g15 -aI784 -aI-86 -aI748 -aI-115 -aI767 -aI-97 -aa(lp5231 -g15 -aI834 -aI-70 -aI801 -aI-75 -aI818 -aI-70 -aa(lp5232 -g20 -aI852 -aI-70 -aa(lp5233 -g20 -aI852 -aI0 -aa(lp5234 -g20 -aI427 -aI0 -aa(lp5235 -g20 -aI427 -aI-70 -aa(lp5236 -g20 -aI434 -aI-70 -aa(lp5237 -g15 -aI514 -aI-114 -aI488 -aI-70 -aI514 -aI-85 -aa(lp5238 -g15 -aI513 -aI-129 -aI514 -aI-119 -aI514 -aI-124 -aa(lp5239 -g15 -aI505 -aI-147 -aI511 -aI-134 -aI509 -aI-141 -aa(lp5240 -g15 -aI490 -aI-172 -aI502 -aI-154 -aI497 -aI-163 -aa(lp5241 -g15 -aI464 -aI-205 -aI483 -aI-181 -aI475 -aI-192 -aa(lp5242 -g20 -aI388 -aI-298 -aa(lp5243 -g20 -aI294 -aI-182 -aa(lp5244 -g15 -aI274 -aI-149 -aI286 -aI-171 -aI279 -aI-160 -aa(lp5245 -g15 -aI266 -aI-115 -aI269 -aI-138 -aI266 -aI-126 -aa(lp5246 -g15 -aI285 -aI-81 -aI266 -aI-100 -aI273 -aI-89 -aa(lp5247 -g15 -aI349 -aI-70 -aI298 -aI-74 -aI319 -aI-70 -aa(lp5248 -g20 -aI353 -aI-70 -aa(lp5249 -g20 -aI353 -aI0 -aa(lp5250 -g20 -aI14 -aI0 -aa(lp5251 -g20 -aI14 -aI-70 -aa(lp5252 -g20 -aI26 -aI-70 -aa(lp5253 -g15 -aI69 -aI-74 -aI42 -aI-70 -aI56 -aI-71 -aa(lp5254 -g15 -aI103 -aI-88 -aI81 -aI-77 -aI92 -aI-82 -aa(lp5255 -g15 -aI135 -aI-114 -aI113 -aI-95 -aI124 -aI-103 -aa(lp5256 -g15 -aI171 -aI-155 -aI146 -aI-125 -aI158 -aI-139 -aa(lp5257 -g20 -aI339 -aI-358 -aa(lp5258 -g20 -aI171 -aI-573 -aa(lp5259 -g15 -aI115 -aI-625 -aI153 -aI-596 -aI134 -aI-614 -aa(lp5260 -g15 -aI57 -aI-643 -aI97 -aI-637 -aI77 -aI-643 -aa(lp5261 -g20 -aI39 -aI-643 -aa(lp5262 -g20 -aI39 -aI-714 -aa(lp5263 -g20 -aI458 -aI-714 -aa(lp5264 -g20 -aI458 -aI-643 -aa(lp5265 -g20 -aI454 -aI-643 -aa(lp5266 -g15 -aI416 -aI-640 -aI439 -aI-643 -aI426 -aI-642 -aa(lp5267 -g15 -aI393 -aI-632 -aI407 -aI-638 -aI399 -aI-635 -aa(lp5268 -g15 -aI382 -aI-619 -aI388 -aI-628 -aI384 -aI-624 -aa(lp5269 -g15 -aI378 -aI-605 -aI379 -aI-615 -aI378 -aI-610 -aa(lp5270 -g15 -aI386 -aI-577 -aI378 -aI-595 -aI381 -aI-586 -aa(lp5271 -g15 -aI409 -aI-543 -aI390 -aI-568 -aI398 -aI-557 -aa(lp5272 -g20 -aI483 -aI-452 -aa(lp5273 -g20 -aI546 -aI-528 -aa(lp5274 -g15 -aI571 -aI-567 -aI557 -aI-542 -aI565 -aI-555 -aa(lp5275 -g15 -aI580 -aI-603 -aI577 -aI-579 -aI580 -aI-591 -aa(lp5276 -g10 -aa(lp5277 -g8 -aI861 -aI0 -aa(lp5278 -g10 -aa(lp5279 -g8 -aI861 -aI0 -aasV| -(lp5280 -(lp5281 -g8 -aI419 -aI320 -aa(lp5282 -g20 -aI324 -aI320 -aa(lp5283 -g20 -aI324 -aI-1012 -aa(lp5284 -g20 -aI419 -aI-1012 -aa(lp5285 -g10 -aa(lp5286 -g8 -aI745 -aI0 -aa(lp5287 -g10 -aa(lp5288 -g8 -aI745 -aI0 -aasV# -(lp5289 -(lp5290 -g8 -aI665 -aI-358 -aa(lp5291 -g20 -aI665 -aI-266 -aa(lp5292 -g20 -aI498 -aI-266 -aa(lp5293 -g20 -aI449 -aI0 -aa(lp5294 -g20 -aI354 -aI0 -aa(lp5295 -g20 -aI404 -aI-266 -aa(lp5296 -g20 -aI265 -aI-266 -aa(lp5297 -g20 -aI214 -aI0 -aa(lp5298 -g20 -aI119 -aI0 -aa(lp5299 -g20 -aI170 -aI-266 -aa(lp5300 -g20 -aI37 -aI-266 -aa(lp5301 -g20 -aI37 -aI-358 -aa(lp5302 -g20 -aI188 -aI-358 -aa(lp5303 -g20 -aI234 -aI-599 -aa(lp5304 -g20 -aI80 -aI-599 -aa(lp5305 -g20 -aI80 -aI-692 -aa(lp5306 -g20 -aI251 -aI-692 -aa(lp5307 -g20 -aI298 -aI-951 -aa(lp5308 -g20 -aI394 -aI-951 -aa(lp5309 -g20 -aI346 -aI-692 -aa(lp5310 -g20 -aI485 -aI-692 -aa(lp5311 -g20 -aI534 -aI-951 -aa(lp5312 -g20 -aI629 -aI-951 -aa(lp5313 -g20 -aI580 -aI-692 -aa(lp5314 -g20 -aI707 -aI-692 -aa(lp5315 -g20 -aI707 -aI-599 -aa(lp5316 -g20 -aI562 -aI-599 -aa(lp5317 -g20 -aI517 -aI-358 -aa(lp5318 -g10 -aa(lp5319 -g8 -aI282 -aI-358 -aa(lp5320 -g20 -aI422 -aI-358 -aa(lp5321 -g20 -aI469 -aI-599 -aa(lp5322 -g20 -aI329 -aI-599 -aa(lp5323 -g10 -aa(lp5324 -g8 -aI745 -aI0 -aa(lp5325 -g10 -aa(lp5326 -g8 -aI745 -aI0 -aasV' -(lp5327 -(lp5328 -g8 -aI89 -aI-951 -aa(lp5329 -g20 -aI297 -aI-951 -aa(lp5330 -g20 -aI237 -aI-584 -aa(lp5331 -g20 -aI149 -aI-584 -aa(lp5332 -g10 -aa(lp5333 -g8 -aI386 -aI0 -aa(lp5334 -g10 -aa(lp5335 -g8 -aI386 -aI0 -aasV+ -(lp5336 -(lp5337 -g8 -aI419 -aI-428 -aa(lp5338 -g20 -aI419 -aI-190 -aa(lp5339 -g20 -aI324 -aI-190 -aa(lp5340 -g20 -aI324 -aI-428 -aa(lp5341 -g20 -aI86 -aI-428 -aa(lp5342 -g20 -aI86 -aI-523 -aa(lp5343 -g20 -aI324 -aI-523 -aa(lp5344 -g20 -aI324 -aI-761 -aa(lp5345 -g20 -aI419 -aI-761 -aa(lp5346 -g20 -aI419 -aI-523 -aa(lp5347 -g20 -aI658 -aI-523 -aa(lp5348 -g20 -aI658 -aI-428 -aa(lp5349 -g10 -aa(lp5350 -g8 -aI745 -aI0 -aa(lp5351 -g10 -aa(lp5352 -g8 -aI745 -aI0 -aasV/ -(lp5353 -(lp5354 -g8 -aI95 -aI163 -aa(lp5355 -g20 -aI0 -aI161 -aa(lp5356 -g20 -aI290 -aI-1012 -aa(lp5357 -g20 -aI384 -aI-1012 -aa(lp5358 -g10 -aa(lp5359 -g8 -aI384 -aI0 -aa(lp5360 -g10 -aa(lp5361 -g8 -aI384 -aI0 -aasV3 -(lp5362 -(lp5363 -g8 -aI324 -aI13 -aa(lp5364 -g15 -aI194 -aI0 -aI273 -aI13 -aI230 -aI9 -aa(lp5365 -g15 -aI105 -aI-34 -aI158 -aI-8 -aI128 -aI-19 -aa(lp5366 -g15 -aI53 -aI-85 -aI81 -aI-49 -aI64 -aI-66 -aa(lp5367 -g15 -aI37 -aI-146 -aI42 -aI-105 -aI37 -aI-125 -aa(lp5368 -g15 -aI46 -aI-190 -aI37 -aI-162 -aI40 -aI-177 -aa(lp5369 -g15 -aI70 -aI-223 -aI52 -aI-203 -aI60 -aI-214 -aa(lp5370 -g15 -aI107 -aI-243 -aI81 -aI-232 -aI93 -aI-239 -aa(lp5371 -g15 -aI150 -aI-250 -aI120 -aI-248 -aI135 -aI-250 -aa(lp5372 -g15 -aI162 -aI-175 -aI150 -aI-221 -aI154 -aI-197 -aa(lp5373 -g15 -aI195 -aI-122 -aI170 -aI-154 -aI181 -aI-136 -aa(lp5374 -g15 -aI247 -aI-90 -aI210 -aI-108 -aI227 -aI-97 -aa(lp5375 -g15 -aI314 -aI-79 -aI267 -aI-83 -aI290 -aI-79 -aa(lp5376 -g15 -aI376 -aI-88 -aI336 -aI-79 -aI356 -aI-82 -aa(lp5377 -g15 -aI429 -aI-119 -aI396 -aI-94 -aI413 -aI-105 -aa(lp5378 -g15 -aI465 -aI-180 -aI444 -aI-134 -aI456 -aI-154 -aa(lp5379 -g15 -aI478 -aI-275 -aI474 -aI-205 -aI478 -aI-237 -aa(lp5380 -g15 -aI465 -aI-345 -aI478 -aI-301 -aI474 -aI-324 -aa(lp5381 -g15 -aI425 -aI-400 -aI456 -aI-367 -aI443 -aI-385 -aa(lp5382 -g15 -aI360 -aI-437 -aI407 -aI-416 -aI386 -aI-428 -aa(lp5383 -g15 -aI272 -aI-450 -aI335 -aI-445 -aI305 -aI-450 -aa(lp5384 -g20 -aI189 -aI-450 -aa(lp5385 -g20 -aI189 -aI-532 -aa(lp5386 -g20 -aI277 -aI-532 -aa(lp5387 -g15 -aI352 -aI-546 -aI305 -aI-532 -aI330 -aI-537 -aa(lp5388 -g15 -aI404 -aI-586 -aI373 -aI-556 -aI391 -aI-569 -aa(lp5389 -g15 -aI436 -aI-648 -aI418 -aI-604 -aI429 -aI-624 -aa(lp5390 -g15 -aI446 -aI-728 -aI443 -aI-673 -aI446 -aI-699 -aa(lp5391 -g15 -aI418 -aI-842 -aI446 -aI-777 -aI437 -aI-815 -aa(lp5392 -g15 -aI335 -aI-883 -aI399 -aI-869 -aI372 -aI-883 -aa(lp5393 -g15 -aI277 -aI-866 -aI312 -aI-883 -aI292 -aI-877 -aa(lp5394 -g15 -aI242 -aI-819 -aI262 -aI-854 -aI251 -aI-838 -aa(lp5395 -g15 -aI225 -aI-752 -aI234 -aI-799 -aI228 -aI-777 -aa(lp5396 -g15 -aI221 -aI-676 -aI222 -aI-728 -aI221 -aI-702 -aa(lp5397 -g15 -aI93 -aI-705 -aI165 -aI-676 -aI123 -aI-686 -aa(lp5398 -g15 -aI48 -aI-795 -aI63 -aI-724 -aI48 -aI-754 -aa(lp5399 -g15 -aI66 -aI-861 -aI48 -aI-819 -aI54 -aI-841 -aa(lp5400 -g15 -aI122 -aI-915 -aI79 -aI-882 -aI97 -aI-900 -aa(lp5401 -g15 -aI214 -aI-952 -aI147 -aI-931 -aI177 -aI-943 -aa(lp5402 -g15 -aI342 -aI-965 -aI251 -aI-960 -aI293 -aI-965 -aa(lp5403 -g15 -aI470 -aI-950 -aI389 -aI-965 -aI432 -aI-960 -aa(lp5404 -g15 -aI567 -aI-908 -aI508 -aI-941 -aI540 -aI-927 -aa(lp5405 -g15 -aI628 -aI-840 -aI594 -aI-889 -aI614 -aI-866 -aa(lp5406 -g15 -aI650 -aI-747 -aI643 -aI-813 -aI650 -aI-782 -aa(lp5407 -g15 -aI634 -aI-664 -aI650 -aI-717 -aI645 -aI-690 -aa(lp5408 -g15 -aI591 -aI-597 -aI624 -aI-639 -aI610 -aI-617 -aa(lp5409 -g15 -aI527 -aI-544 -aI573 -aI-577 -aI552 -aI-559 -aa(lp5410 -g15 -aI446 -aI-507 -aI502 -aI-529 -aI475 -aI-517 -aa(lp5411 -g15 -aI528 -aI-484 -aI473 -aI-502 -aI500 -aI-494 -aa(lp5412 -g15 -aI605 -aI-440 -aI556 -aI-473 -aI582 -aI-459 -aa(lp5413 -g15 -aI662 -aI-372 -aI628 -aI-422 -aI647 -aI-399 -aa(lp5414 -g15 -aI684 -aI-274 -aI676 -aI-345 -aI684 -aI-312 -aa(lp5415 -g15 -aI653 -aI-137 -aI684 -aI-220 -aI674 -aI-174 -aa(lp5416 -g15 -aI573 -aI-48 -aI633 -aI-100 -aI606 -aI-71 -aa(lp5417 -g15 -aI458 -aI0 -aI539 -aI-26 -aI501 -aI-10 -aa(lp5418 -g15 -aI324 -aI13 -aI414 -aI8 -aI370 -aI13 -aa(lp5419 -g10 -aa(lp5420 -g8 -aI745 -aI0 -aa(lp5421 -g10 -aa(lp5422 -g8 -aI745 -aI0 -aasV7 -(lp5423 -(lp5424 -g8 -aI220 -aI0 -aa(lp5425 -g20 -aI574 -aI-806 -aa(lp5426 -g20 -aI223 -aI-806 -aa(lp5427 -g15 -aI168 -aI-788 -aI199 -aI-806 -aI181 -aI-800 -aa(lp5428 -g15 -aI146 -aI-738 -aI156 -aI-777 -aI149 -aI-760 -aa(lp5429 -g20 -aI138 -aI-671 -aa(lp5430 -g20 -aI58 -aI-671 -aa(lp5431 -g20 -aI65 -aI-951 -aa(lp5432 -g20 -aI701 -aI-951 -aa(lp5433 -g20 -aI701 -aI-886 -aa(lp5434 -g20 -aI333 -aI0 -aa(lp5435 -g10 -aa(lp5436 -g8 -aI745 -aI0 -aa(lp5437 -g10 -aa(lp5438 -g8 -aI745 -aI0 -aasV; -(lp5439 -(lp5440 -g8 -aI298 -aI-55 -aa(lp5441 -g15 -aI285 -aI26 -aI298 -aI-27 -aI294 -aI0 -aa(lp5442 -g15 -aI244 -aI100 -aI277 -aI52 -aI263 -aI77 -aa(lp5443 -g15 -aI170 -aI160 -aI225 -aI122 -aI200 -aI142 -aa(lp5444 -g15 -aI59 -aI205 -aI140 -aI178 -aI103 -aI193 -aa(lp5445 -g20 -aI59 -aI136 -aa(lp5446 -g15 -aI111 -aI115 -aI79 -aI129 -aI96 -aI122 -aa(lp5447 -g15 -aI147 -aI93 -aI125 -aI108 -aI137 -aI101 -aa(lp5448 -g15 -aI169 -aI66 -aI157 -aI85 -aI164 -aI76 -aa(lp5449 -g15 -aI177 -aI32 -aI174 -aI56 -aI177 -aI45 -aa(lp5450 -g15 -aI169 -aI11 -aI177 -aI24 -aI174 -aI17 -aa(lp5451 -g15 -aI152 -aI-3 -aI165 -aI6 -aI159 -aI1 -aa(lp5452 -g15 -aI128 -aI-18 -aI144 -aI-8 -aI137 -aI-13 -aa(lp5453 -g15 -aI105 -aI-37 -aI120 -aI-23 -aI112 -aI-29 -aa(lp5454 -g15 -aI87 -aI-66 -aI97 -aI-45 -aI92 -aI-54 -aa(lp5455 -g15 -aI80 -aI-110 -aI82 -aI-77 -aI80 -aI-92 -aa(lp5456 -g15 -aI107 -aI-178 -aI80 -aI-140 -aI89 -aI-162 -aa(lp5457 -g15 -aI175 -aI-202 -aI125 -aI-194 -aI148 -aI-202 -aa(lp5458 -g15 -aI265 -aI-162 -aI213 -aI-202 -aI243 -aI-189 -aa(lp5459 -g15 -aI298 -aI-55 -aI287 -aI-136 -aI298 -aI-101 -aa(lp5460 -g10 -aa(lp5461 -g8 -aI93 -aI-619 -aa(lp5462 -g15 -aI101 -aI-670 -aI93 -aI-639 -aI95 -aI-656 -aa(lp5463 -g15 -aI124 -aI-703 -aI107 -aI-684 -aI114 -aI-695 -aa(lp5464 -g15 -aI159 -aI-720 -aI134 -aI-711 -aI146 -aI-717 -aa(lp5465 -g15 -aI202 -aI-726 -aI172 -aI-724 -aI187 -aI-726 -aa(lp5466 -g15 -aI244 -aI-720 -aI217 -aI-726 -aI231 -aI-724 -aa(lp5467 -g15 -aI279 -aI-703 -aI257 -aI-717 -aI269 -aI-711 -aa(lp5468 -g15 -aI303 -aI-670 -aI289 -aI-695 -aI297 -aI-684 -aa(lp5469 -g15 -aI311 -aI-619 -aI308 -aI-656 -aI311 -aI-639 -aa(lp5470 -g15 -aI303 -aI-568 -aI311 -aI-599 -aI308 -aI-582 -aa(lp5471 -g15 -aI279 -aI-536 -aI297 -aI-555 -aI289 -aI-544 -aa(lp5472 -g15 -aI244 -aI-518 -aI269 -aI-527 -aI257 -aI-521 -aa(lp5473 -g15 -aI202 -aI-512 -aI231 -aI-514 -aI217 -aI-512 -aa(lp5474 -g15 -aI159 -aI-518 -aI187 -aI-512 -aI172 -aI-514 -aa(lp5475 -g15 -aI124 -aI-536 -aI146 -aI-521 -aI134 -aI-527 -aa(lp5476 -g15 -aI101 -aI-568 -aI114 -aI-544 -aI107 -aI-555 -aa(lp5477 -g15 -aI93 -aI-619 -aI95 -aI-582 -aI93 -aI-599 -aa(lp5478 -g10 -aa(lp5479 -g8 -aI391 -aI0 -aa(lp5480 -g10 -aa(lp5481 -g8 -aI391 -aI0 -aasV? -(lp5482 -(lp5483 -g8 -aI660 -aI-719 -aa(lp5484 -g15 -aI643 -aI-623 -aI660 -aI-684 -aI654 -aI-652 -aa(lp5485 -g15 -aI593 -aI-546 -aI632 -aI-595 -aI615 -aI-569 -aa(lp5486 -g15 -aI510 -aI-481 -aI571 -aI-522 -aI543 -aI-501 -aa(lp5487 -g15 -aI394 -aI-424 -aI477 -aI-461 -aI438 -aI-442 -aa(lp5488 -g20 -aI367 -aI-303 -aa(lp5489 -g20 -aI286 -aI-303 -aa(lp5490 -g20 -aI259 -aI-467 -aa(lp5491 -g15 -aI353 -aI-521 -aI297 -aI-482 -aI329 -aI-500 -aa(lp5492 -g15 -aI411 -aI-587 -aI377 -aI-541 -aI397 -aI-564 -aa(lp5493 -g15 -aI440 -aI-662 -aI425 -aI-611 -aI434 -aI-636 -aa(lp5494 -g15 -aI447 -aI-741 -aI445 -aI-688 -aI447 -aI-714 -aa(lp5495 -g15 -aI442 -aI-799 -aI447 -aI-762 -aI445 -aI-781 -aa(lp5496 -g15 -aI423 -aI-844 -aI438 -aI-816 -aI431 -aI-832 -aa(lp5497 -g15 -aI390 -aI-874 -aI415 -aI-857 -aI404 -aI-867 -aa(lp5498 -g15 -aI343 -aI-884 -aI377 -aI-881 -aI361 -aI-884 -aa(lp5499 -g15 -aI293 -aI-871 -aI323 -aI-884 -aI307 -aI-880 -aa(lp5500 -g15 -aI261 -aI-834 -aI280 -aI-862 -aI269 -aI-850 -aa(lp5501 -g15 -aI243 -aI-781 -aI252 -aI-819 -aI246 -aI-801 -aa(lp5502 -g15 -aI237 -aI-716 -aI239 -aI-761 -aI237 -aI-739 -aa(lp5503 -g15 -aI162 -aI-722 -aI210 -aI-716 -aI185 -aI-718 -aa(lp5504 -g15 -aI102 -aI-740 -aI139 -aI-726 -aI119 -aI-732 -aa(lp5505 -g15 -aI63 -aI-769 -aI85 -aI-747 -aI72 -aI-757 -aa(lp5506 -g15 -aI49 -aI-810 -aI54 -aI-780 -aI49 -aI-794 -aa(lp5507 -g15 -aI66 -aI-870 -aI49 -aI-831 -aI55 -aI-852 -aa(lp5508 -g15 -aI118 -aI-920 -aI77 -aI-889 -aI94 -aI-906 -aa(lp5509 -g15 -aI206 -aI-952 -aI141 -aI-934 -aI170 -aI-944 -aa(lp5510 -g15 -aI333 -aI-965 -aI241 -aI-961 -aI284 -aI-965 -aa(lp5511 -g15 -aI463 -aI-948 -aI380 -aI-965 -aI423 -aI-959 -aa(lp5512 -g15 -aI567 -aI-900 -aI503 -aI-937 -aI537 -aI-921 -aa(lp5513 -g15 -aI635 -aI-823 -aI596 -aI-879 -aI618 -aI-853 -aa(lp5514 -g15 -aI660 -aI-719 -aI651 -aI-792 -aI660 -aI-758 -aa(lp5515 -g10 -aa(lp5516 -g8 -aI216 -aI-95 -aa(lp5517 -g15 -aI224 -aI-146 -aI216 -aI-115 -aI218 -aI-132 -aa(lp5518 -g15 -aI247 -aI-179 -aI230 -aI-160 -aI237 -aI-170 -aa(lp5519 -g15 -aI282 -aI-196 -aI257 -aI-187 -aI269 -aI-193 -aa(lp5520 -g15 -aI325 -aI-202 -aI296 -aI-200 -aI310 -aI-202 -aa(lp5521 -g15 -aI367 -aI-196 -aI340 -aI-202 -aI354 -aI-200 -aa(lp5522 -g15 -aI402 -aI-179 -aI380 -aI-193 -aI392 -aI-187 -aa(lp5523 -g15 -aI426 -aI-146 -aI412 -aI-170 -aI420 -aI-160 -aa(lp5524 -g15 -aI434 -aI-95 -aI431 -aI-132 -aI434 -aI-115 -aa(lp5525 -g15 -aI426 -aI-45 -aI434 -aI-75 -aI431 -aI-58 -aa(lp5526 -g15 -aI402 -aI-12 -aI420 -aI-31 -aI412 -aI-20 -aa(lp5527 -g15 -aI367 -aI5 -aI392 -aI-4 -aI380 -aI1 -aa(lp5528 -g15 -aI325 -aI10 -aI354 -aI9 -aI340 -aI10 -aa(lp5529 -g15 -aI282 -aI5 -aI310 -aI10 -aI296 -aI9 -aa(lp5530 -g15 -aI247 -aI-12 -aI269 -aI1 -aI257 -aI-4 -aa(lp5531 -g15 -aI224 -aI-45 -aI237 -aI-20 -aI230 -aI-31 -aa(lp5532 -g15 -aI216 -aI-95 -aI218 -aI-58 -aI216 -aI-75 -aa(lp5533 -g10 -aa(lp5534 -g8 -aI733 -aI0 -aa(lp5535 -g10 -aa(lp5536 -g8 -aI733 -aI0 -aasVC -(lp5537 -(lp5538 -g8 -aI566 -aI-92 -aa(lp5539 -g15 -aI653 -aI-104 -aI598 -aI-92 -aI627 -aI-96 -aa(lp5540 -g15 -aI721 -aI-133 -aI678 -aI-111 -aI701 -aI-121 -aa(lp5541 -g15 -aI773 -aI-174 -aI741 -aI-145 -aI758 -aI-159 -aa(lp5542 -g15 -aI813 -aI-219 -aI788 -aI-189 -aI801 -aI-204 -aa(lp5543 -g15 -aI829 -aI-195 -aI820 -aI-214 -aI825 -aI-206 -aa(lp5544 -g15 -aI835 -aI-162 -aI833 -aI-184 -aI835 -aI-173 -aa(lp5545 -g15 -aI820 -aI-103 -aI835 -aI-143 -aI830 -aI-124 -aa(lp5546 -g15 -aI770 -aI-46 -aI810 -aI-82 -aI794 -aI-63 -aa(lp5547 -g15 -aI677 -aI-3 -aI747 -aI-29 -aI716 -aI-14 -aa(lp5548 -g15 -aI534 -aI13 -aI639 -aI7 -aI591 -aI13 -aa(lp5549 -g15 -aI332 -aI-21 -aI457 -aI13 -aI389 -aI1 -aa(lp5550 -g15 -aI188 -aI-121 -aI274 -aI-45 -aI226 -aI-78 -aa(lp5551 -g15 -aI102 -aI-276 -aI149 -aI-164 -aI121 -aI-215 -aa(lp5552 -g15 -aI73 -aI-476 -aI83 -aI-336 -aI73 -aI-403 -aa(lp5553 -g15 -aI102 -aI-674 -aI73 -aI-548 -aI83 -aI-614 -aa(lp5554 -g15 -aI189 -aI-828 -aI122 -aI-734 -aI151 -aI-786 -aa(lp5555 -g15 -aI333 -aI-929 -aI228 -aI-871 -aI276 -aI-905 -aa(lp5556 -g15 -aI533 -aI-965 -aI391 -aI-953 -aI457 -aI-965 -aa(lp5557 -g15 -aI666 -aI-952 -aI584 -aI-965 -aI629 -aI-961 -aa(lp5558 -g15 -aI761 -aI-920 -aI704 -aI-944 -aI736 -aI-934 -aa(lp5559 -g15 -aI818 -aI-870 -aI786 -aI-906 -aI805 -aI-889 -aa(lp5560 -g15 -aI837 -aI-810 -aI830 -aI-852 -aI837 -aI-831 -aa(lp5561 -g15 -aI826 -aI-764 -aI837 -aI-793 -aI833 -aI-778 -aa(lp5562 -g15 -aI794 -aI-727 -aI819 -aI-750 -aI808 -aI-737 -aa(lp5563 -g15 -aI742 -aI-702 -aI780 -aI-716 -aI763 -aI-708 -aa(lp5564 -g15 -aI670 -aI-694 -aI721 -aI-697 -aI697 -aI-694 -aa(lp5565 -g15 -aI663 -aI-760 -aI670 -aI-716 -aI668 -aI-738 -aa(lp5566 -g15 -aI638 -aI-819 -aI658 -aI-782 -aI650 -aI-802 -aa(lp5567 -g15 -aI593 -aI-863 -aI627 -aI-837 -aI612 -aI-852 -aa(lp5568 -g15 -aI524 -aI-879 -aI575 -aI-874 -aI551 -aI-879 -aa(lp5569 -g15 -aI417 -aI-853 -aI481 -aI-879 -aI446 -aI-870 -aa(lp5570 -g15 -aI347 -aI-774 -aI388 -aI-835 -aI364 -aI-809 -aa(lp5571 -g15 -aI309 -aI-648 -aI329 -aI-740 -aI317 -aI-698 -aa(lp5572 -g15 -aI297 -aI-476 -aI301 -aI-598 -aI297 -aI-540 -aa(lp5573 -g15 -aI311 -aI-308 -aI297 -aI-412 -aI302 -aI-356 -aa(lp5574 -g15 -aI358 -aI-188 -aI321 -aI-259 -aI336 -aI-219 -aa(lp5575 -g15 -aI441 -aI-116 -aI379 -aI-156 -aI407 -aI-132 -aa(lp5576 -g15 -aI566 -aI-92 -aI475 -aI-100 -aI516 -aI-92 -aa(lp5577 -g10 -aa(lp5578 -g8 -aI890 -aI0 -aa(lp5579 -g10 -aa(lp5580 -g8 -aI890 -aI0 -aasVG -(lp5581 -(lp5582 -g8 -aI563 -aI13 -aa(lp5583 -g15 -aI347 -aI-21 -aI481 -aI13 -aI409 -aI1 -aa(lp5584 -g15 -aI194 -aI-121 -aI286 -aI-45 -aI235 -aI-78 -aa(lp5585 -g15 -aI103 -aI-276 -aI153 -aI-164 -aI123 -aI-215 -aa(lp5586 -g15 -aI73 -aI-476 -aI83 -aI-336 -aI73 -aI-403 -aa(lp5587 -g15 -aI105 -aI-674 -aI73 -aI-548 -aI84 -aI-614 -aa(lp5588 -g15 -aI199 -aI-828 -aI126 -aI-734 -aI158 -aI-786 -aa(lp5589 -g15 -aI355 -aI-929 -aI241 -aI-871 -aI293 -aI-905 -aa(lp5590 -g15 -aI570 -aI-965 -aI417 -aI-953 -aI489 -aI-965 -aa(lp5591 -g15 -aI716 -aI-952 -aI626 -aI-965 -aI675 -aI-961 -aa(lp5592 -g15 -aI820 -aI-920 -aI757 -aI-944 -aI792 -aI-934 -aa(lp5593 -g15 -aI883 -aI-870 -aI848 -aI-906 -aI869 -aI-889 -aa(lp5594 -g15 -aI904 -aI-810 -aI897 -aI-852 -aI904 -aI-831 -aa(lp5595 -g15 -aI893 -aI-766 -aI904 -aI-794 -aI900 -aI-779 -aa(lp5596 -g15 -aI860 -aI-730 -aI885 -aI-752 -aI874 -aI-740 -aa(lp5597 -g15 -aI805 -aI-705 -aI845 -aI-719 -aI827 -aI-711 -aa(lp5598 -g15 -aI731 -aI-696 -aI784 -aI-699 -aI759 -aI-696 -aa(lp5599 -g15 -aI722 -aI-771 -aI731 -aI-723 -aI728 -aI-748 -aa(lp5600 -g15 -aI691 -aI-828 -aI715 -aI-793 -aI705 -aI-812 -aa(lp5601 -g15 -aI639 -aI-866 -aI678 -aI-845 -aI660 -aI-857 -aa(lp5602 -g15 -aI566 -aI-879 -aI619 -aI-875 -aI594 -aI-879 -aa(lp5603 -g15 -aI442 -aI-853 -aI517 -aI-879 -aI476 -aI-870 -aa(lp5604 -g15 -aI359 -aI-774 -aI408 -aI-835 -aI380 -aI-809 -aa(lp5605 -g15 -aI312 -aI-648 -aI337 -aI-740 -aI321 -aI-698 -aa(lp5606 -g15 -aI297 -aI-476 -aI302 -aI-598 -aI297 -aI-540 -aa(lp5607 -g15 -aI312 -aI-305 -aI297 -aI-412 -aI302 -aI-355 -aa(lp5608 -g15 -aI362 -aI-180 -aI323 -aI-256 -aI339 -aI-214 -aa(lp5609 -g15 -aI450 -aI-103 -aI385 -aI-146 -aI414 -aI-120 -aa(lp5610 -g15 -aI583 -aI-77 -aI487 -aI-85 -aI531 -aI-77 -aa(lp5611 -g15 -aI633 -aI-78 -aI600 -aI-77 -aI616 -aI-77 -aa(lp5612 -g15 -aI681 -aI-86 -aI649 -aI-80 -aI666 -aI-82 -aa(lp5613 -g20 -aI681 -aI-282 -aa(lp5614 -g15 -aI657 -aI-356 -aI681 -aI-317 -aI673 -aI-342 -aa(lp5615 -g15 -aI586 -aI-377 -aI641 -aI-370 -aI617 -aI-377 -aa(lp5616 -g20 -aI569 -aI-377 -aa(lp5617 -g20 -aI569 -aI-447 -aa(lp5618 -g20 -aI988 -aI-447 -aa(lp5619 -g20 -aI988 -aI-377 -aa(lp5620 -g20 -aI970 -aI-377 -aa(lp5621 -g15 -aI935 -aI-372 -aI957 -aI-377 -aI945 -aI-375 -aa(lp5622 -g15 -aI910 -aI-355 -aI925 -aI-369 -aI917 -aI-363 -aa(lp5623 -g15 -aI896 -aI-324 -aI904 -aI-347 -aI899 -aI-337 -aa(lp5624 -g15 -aI891 -aI-276 -aI893 -aI-311 -aI891 -aI-295 -aa(lp5625 -g20 -aI891 -aI-58 -aa(lp5626 -g15 -aI734 -aI-4 -aI839 -aI-34 -aI787 -aI-16 -aa(lp5627 -g15 -aI563 -aI13 -aI681 -aI7 -aI624 -aI13 -aa(lp5628 -g10 -aa(lp5629 -g8 -aI1025 -aI0 -aa(lp5630 -g10 -aa(lp5631 -g8 -aI1025 -aI0 -aasVK -(lp5632 -(lp5633 -g8 -aI578 -aI-709 -aa(lp5634 -g15 -aI614 -aI-750 -aI593 -aI-724 -aI605 -aI-738 -aa(lp5635 -g15 -aI638 -aI-785 -aI624 -aI-762 -aI632 -aI-774 -aa(lp5636 -g15 -aI651 -aI-815 -aI644 -aI-795 -aI648 -aI-805 -aa(lp5637 -g15 -aI654 -aI-843 -aI653 -aI-824 -aI654 -aI-834 -aa(lp5638 -g15 -aI638 -aI-873 -aI654 -aI-858 -aI649 -aI-868 -aa(lp5639 -g15 -aI580 -aI-882 -aI626 -aI-879 -aI607 -aI-882 -aa(lp5640 -g20 -aI580 -aI-951 -aa(lp5641 -g20 -aI941 -aI-951 -aa(lp5642 -g20 -aI941 -aI-882 -aa(lp5643 -g15 -aI889 -aI-873 -aI923 -aI-882 -aI905 -aI-879 -aa(lp5644 -g15 -aI841 -aI-849 -aI873 -aI-868 -aI857 -aI-860 -aa(lp5645 -g15 -aI795 -aI-812 -aI826 -aI-839 -aI810 -aI-827 -aa(lp5646 -g15 -aI749 -aI-765 -aI780 -aI-798 -aI764 -aI-782 -aa(lp5647 -g20 -aI573 -aI-571 -aa(lp5648 -g20 -aI821 -aI-177 -aa(lp5649 -g15 -aI859 -aI-126 -aI834 -aI-157 -aI847 -aI-139 -aa(lp5650 -g15 -aI895 -aI-93 -aI870 -aI-112 -aI883 -aI-101 -aa(lp5651 -g15 -aI932 -aI-75 -aI907 -aI-85 -aI919 -aI-79 -aa(lp5652 -g15 -aI973 -aI-70 -aI944 -aI-72 -aI958 -aI-70 -aa(lp5653 -g20 -aI978 -aI-70 -aa(lp5654 -g20 -aI978 -aI0 -aa(lp5655 -g20 -aI906 -aI0 -aa(lp5656 -g15 -aI817 -aI-2 -aI873 -aI0 -aI843 -aI0 -aa(lp5657 -g15 -aI750 -aI-12 -aI792 -aI-4 -aI769 -aI-8 -aa(lp5658 -g15 -aI700 -aI-29 -aI731 -aI-16 -aI714 -aI-22 -aa(lp5659 -g15 -aI664 -aI-52 -aI686 -aI-35 -aI674 -aI-43 -aa(lp5660 -g15 -aI635 -aI-83 -aI653 -aI-62 -aI644 -aI-72 -aa(lp5661 -g15 -aI610 -aI-121 -aI627 -aI-95 -aI618 -aI-108 -aa(lp5662 -g20 -aI430 -aI-428 -aa(lp5663 -g20 -aI371 -aI-382 -aa(lp5664 -g20 -aI371 -aI-157 -aa(lp5665 -g15 -aI377 -aI-111 -aI371 -aI-138 -aI373 -aI-122 -aa(lp5666 -g15 -aI391 -aI-85 -aI380 -aI-100 -aI385 -aI-91 -aa(lp5667 -g15 -aI414 -aI-73 -aI398 -aI-79 -aI405 -aI-75 -aa(lp5668 -g15 -aI441 -aI-70 -aI422 -aI-71 -aI431 -aI-70 -aa(lp5669 -g20 -aI497 -aI-70 -aa(lp5670 -g20 -aI497 -aI0 -aa(lp5671 -g20 -aI37 -aI0 -aa(lp5672 -g20 -aI37 -aI-70 -aa(lp5673 -g20 -aI93 -aI-70 -aa(lp5674 -g15 -aI119 -aI-73 -aI102 -aI-70 -aI111 -aI-71 -aa(lp5675 -g15 -aI141 -aI-83 -aI128 -aI-74 -aI135 -aI-78 -aa(lp5676 -g15 -aI156 -aI-107 -aI147 -aI-89 -aI152 -aI-97 -aa(lp5677 -g15 -aI161 -aI-149 -aI159 -aI-118 -aI161 -aI-132 -aa(lp5678 -g20 -aI161 -aI-799 -aa(lp5679 -g15 -aI156 -aI-842 -aI161 -aI-817 -aI159 -aI-831 -aa(lp5680 -g15 -aI141 -aI-866 -aI152 -aI-852 -aI147 -aI-861 -aa(lp5681 -g15 -aI119 -aI-878 -aI135 -aI-872 -aI128 -aI-876 -aa(lp5682 -g15 -aI93 -aI-881 -aI111 -aI-880 -aI102 -aI-881 -aa(lp5683 -g20 -aI37 -aI-881 -aa(lp5684 -g20 -aI37 -aI-951 -aa(lp5685 -g20 -aI497 -aI-951 -aa(lp5686 -g20 -aI497 -aI-881 -aa(lp5687 -g20 -aI441 -aI-881 -aa(lp5688 -g15 -aI414 -aI-878 -aI431 -aI-881 -aI422 -aI-880 -aa(lp5689 -g15 -aI391 -aI-866 -aI405 -aI-876 -aI398 -aI-872 -aa(lp5690 -g15 -aI377 -aI-840 -aI385 -aI-860 -aI380 -aI-851 -aa(lp5691 -g15 -aI371 -aI-794 -aI373 -aI-828 -aI371 -aI-813 -aa(lp5692 -g20 -aI371 -aI-483 -aa(lp5693 -g10 -aa(lp5694 -g8 -aI978 -aI0 -aa(lp5695 -g10 -aa(lp5696 -g8 -aI978 -aI0 -aasVO -(lp5697 -(lp5698 -g8 -aI975 -aI-476 -aa(lp5699 -g15 -aI946 -aI-276 -aI975 -aI-403 -aI966 -aI-336 -aa(lp5700 -g15 -aI859 -aI-121 -aI926 -aI-215 -aI897 -aI-164 -aa(lp5701 -g15 -aI717 -aI-21 -aI820 -aI-78 -aI773 -aI-45 -aa(lp5702 -g15 -aI525 -aI13 -aI662 -aI1 -aI597 -aI13 -aa(lp5703 -g15 -aI326 -aI-21 -aI449 -aI13 -aI383 -aI1 -aa(lp5704 -g15 -aI185 -aI-121 -aI269 -aI-45 -aI222 -aI-78 -aa(lp5705 -g15 -aI101 -aI-276 -aI148 -aI-164 -aI120 -aI-216 -aa(lp5706 -g15 -aI73 -aI-478 -aI82 -aI-337 -aI73 -aI-404 -aa(lp5707 -g15 -aI101 -aI-678 -aI73 -aI-551 -aI82 -aI-618 -aa(lp5708 -g15 -aI185 -aI-832 -aI120 -aI-739 -aI148 -aI-790 -aa(lp5709 -g15 -aI327 -aI-931 -aI223 -aI-875 -aI270 -aI-908 -aa(lp5710 -g15 -aI526 -aI-966 -aI383 -aI-954 -aI450 -aI-966 -aa(lp5711 -g15 -aI718 -aI-931 -aI598 -aI-966 -aI662 -aI-954 -aa(lp5712 -g15 -aI859 -aI-832 -aI774 -aI-908 -aI821 -aI-875 -aa(lp5713 -g15 -aI946 -aI-678 -aI897 -aI-789 -aI926 -aI-738 -aa(lp5714 -g15 -aI975 -aI-476 -aI966 -aI-618 -aI975 -aI-550 -aa(lp5715 -g10 -aa(lp5716 -g8 -aI297 -aI-476 -aa(lp5717 -g15 -aI309 -aI-306 -aI297 -aI-412 -aI301 -aI-356 -aa(lp5718 -g15 -aI349 -aI-179 -aI318 -aI-256 -aI331 -aI-214 -aa(lp5719 -g15 -aI420 -aI-100 -aI367 -aI-145 -aI391 -aI-118 -aa(lp5720 -g15 -aI525 -aI-73 -aI449 -aI-82 -aI484 -aI-73 -aa(lp5721 -g15 -aI631 -aI-100 -aI567 -aI-73 -aI602 -aI-82 -aa(lp5722 -g15 -aI701 -aI-179 -aI660 -aI-118 -aI683 -aI-145 -aa(lp5723 -g15 -aI739 -aI-306 -aI718 -aI-214 -aI731 -aI-256 -aa(lp5724 -g15 -aI751 -aI-476 -aI747 -aI-356 -aI751 -aI-412 -aa(lp5725 -g15 -aI739 -aI-647 -aI751 -aI-540 -aI747 -aI-597 -aa(lp5726 -g15 -aI701 -aI-773 -aI731 -aI-697 -aI718 -aI-739 -aa(lp5727 -g15 -aI631 -aI-852 -aI683 -aI-808 -aI660 -aI-834 -aa(lp5728 -g15 -aI526 -aI-879 -aI602 -aI-870 -aI567 -aI-879 -aa(lp5729 -g15 -aI420 -aI-852 -aI485 -aI-879 -aI449 -aI-870 -aa(lp5730 -g15 -aI349 -aI-773 -aI391 -aI-834 -aI367 -aI-808 -aa(lp5731 -g15 -aI309 -aI-647 -aI331 -aI-739 -aI318 -aI-697 -aa(lp5732 -g15 -aI297 -aI-476 -aI301 -aI-597 -aI297 -aI-540 -aa(lp5733 -g10 -aa(lp5734 -g8 -aI1049 -aI0 -aa(lp5735 -g10 -aa(lp5736 -g8 -aI1049 -aI0 -aasVS -(lp5737 -(lp5738 -g8 -aI352 -aI13 -aa(lp5739 -g15 -aI202 -aI-3 -aI292 -aI13 -aI242 -aI7 -aa(lp5740 -g15 -aI106 -aI-47 -aI162 -aI-14 -aI130 -aI-29 -aa(lp5741 -g15 -aI55 -aI-106 -aI82 -aI-64 -aI65 -aI-84 -aa(lp5742 -g15 -aI39 -aI-172 -aI44 -aI-129 -aI39 -aI-151 -aa(lp5743 -g15 -aI52 -aI-230 -aI39 -aI-195 -aI43 -aI-215 -aa(lp5744 -g15 -aI86 -aI-269 -aI60 -aI-246 -aI72 -aI-259 -aa(lp5745 -g15 -aI134 -aI-290 -aI100 -aI-279 -aI116 -aI-286 -aa(lp5746 -g15 -aI190 -aI-297 -aI152 -aI-294 -aI171 -aI-297 -aa(lp5747 -g15 -aI204 -aI-196 -aI190 -aI-258 -aI195 -aI-225 -aa(lp5748 -g15 -aI242 -aI-124 -aI213 -aI-167 -aI226 -aI-143 -aa(lp5749 -g15 -aI299 -aI-80 -aI258 -aI-104 -aI277 -aI-90 -aa(lp5750 -g15 -aI373 -aI-65 -aI322 -aI-70 -aI346 -aI-65 -aa(lp5751 -g15 -aI442 -aI-77 -aI399 -aI-65 -aI422 -aI-69 -aa(lp5752 -g15 -aI494 -aI-107 -aI463 -aI-84 -aI480 -aI-94 -aa(lp5753 -g15 -aI527 -aI-153 -aI509 -aI-120 -aI519 -aI-135 -aa(lp5754 -g15 -aI538 -aI-210 -aI534 -aI-171 -aI538 -aI-190 -aa(lp5755 -g15 -aI524 -aI-270 -aI538 -aI-233 -aI533 -aI-253 -aa(lp5756 -g15 -aI483 -aI-319 -aI515 -aI-288 -aI501 -aI-304 -aa(lp5757 -g15 -aI413 -aI-362 -aI464 -aI-334 -aI441 -aI-348 -aa(lp5758 -g15 -aI315 -aI-406 -aI385 -aI-376 -aI353 -aI-390 -aa(lp5759 -g15 -aI198 -aI-465 -aI269 -aI-425 -aI230 -aI-445 -aa(lp5760 -g15 -aI121 -aI-530 -aI166 -aI-485 -aI140 -aI-507 -aa(lp5761 -g15 -aI79 -aI-606 -aI101 -aI-554 -aI87 -aI-579 -aa(lp5762 -g15 -aI66 -aI-696 -aI70 -aI-634 -aI66 -aI-664 -aa(lp5763 -g15 -aI91 -aI-807 -aI66 -aI-737 -aI74 -aI-774 -aa(lp5764 -g15 -aI159 -aI-892 -aI107 -aI-840 -aI130 -aI-868 -aa(lp5765 -g15 -aI263 -aI-946 -aI188 -aI-915 -aI223 -aI-933 -aa(lp5766 -g15 -aI393 -aI-965 -aI302 -aI-958 -aI346 -aI-965 -aa(lp5767 -g15 -aI520 -aI-952 -aI442 -aI-965 -aI484 -aI-961 -aa(lp5768 -g15 -aI608 -aI-920 -aI555 -aI-944 -aI585 -aI-934 -aa(lp5769 -g15 -aI660 -aI-870 -aI631 -aI-906 -aI648 -aI-889 -aa(lp5770 -g15 -aI677 -aI-810 -aI671 -aI-852 -aI677 -aI-831 -aa(lp5771 -g15 -aI666 -aI-766 -aI677 -aI-794 -aI673 -aI-779 -aa(lp5772 -g15 -aI636 -aI-731 -aI660 -aI-753 -aI650 -aI-741 -aa(lp5773 -g15 -aI584 -aI-707 -aI622 -aI-721 -aI605 -aI-713 -aa(lp5774 -g15 -aI513 -aI-699 -aI564 -aI-702 -aI540 -aI-699 -aa(lp5775 -g15 -aI505 -aI-759 -aI513 -aI-718 -aI510 -aI-738 -aa(lp5776 -g15 -aI481 -aI-819 -aI500 -aI-781 -aI492 -aI-801 -aa(lp5777 -g15 -aI437 -aI-865 -aI469 -aI-837 -aI455 -aI-853 -aa(lp5778 -g15 -aI371 -aI-883 -aI419 -aI-877 -aI397 -aI-883 -aa(lp5779 -g15 -aI320 -aI-875 -aI353 -aI-883 -aI337 -aI-881 -aa(lp5780 -g15 -aI278 -aI-852 -aI304 -aI-870 -aI290 -aI-862 -aa(lp5781 -g15 -aI250 -aI-813 -aI267 -aI-841 -aI257 -aI-829 -aa(lp5782 -g15 -aI240 -aI-760 -aI243 -aI-798 -aI240 -aI-780 -aa(lp5783 -g15 -aI249 -aI-707 -aI240 -aI-741 -aI243 -aI-724 -aa(lp5784 -g15 -aI282 -aI-659 -aI255 -aI-691 -aI266 -aI-675 -aa(lp5785 -g15 -aI349 -aI-611 -aI299 -aI-643 -aI321 -aI-627 -aa(lp5786 -g15 -aI460 -aI-560 -aI378 -aI-596 -aI415 -aI-578 -aa(lp5787 -g15 -aI576 -aI-503 -aI505 -aI-542 -aI544 -aI-522 -aa(lp5788 -g15 -aI655 -aI-440 -aI608 -aI-483 -aI635 -aI-462 -aa(lp5789 -g15 -aI700 -aI-367 -aI676 -aI-418 -aI691 -aI-393 -aa(lp5790 -g15 -aI714 -aI-278 -aI710 -aI-340 -aI714 -aI-310 -aa(lp5791 -g15 -aI689 -aI-160 -aI714 -aI-235 -aI706 -aI-195 -aa(lp5792 -g15 -aI616 -aI-67 -aI672 -aI-124 -aI648 -aI-93 -aa(lp5793 -g15 -aI502 -aI-8 -aI584 -aI-42 -aI546 -aI-22 -aa(lp5794 -g15 -aI352 -aI13 -aI457 -aI6 -aI407 -aI13 -aa(lp5795 -g10 -aa(lp5796 -g8 -aI781 -aI0 -aa(lp5797 -g10 -aa(lp5798 -g8 -aI781 -aI0 -aasVW -(lp5799 -(lp5800 -g8 -aI805 -aI-942 -aa(lp5801 -g20 -aI989 -aI-433 -aa(lp5802 -g15 -aI1011 -aI-369 -aI997 -aI-412 -aI1004 -aI-391 -aa(lp5803 -g15 -aI1029 -aI-308 -aI1018 -aI-348 -aI1024 -aI-327 -aa(lp5804 -g15 -aI1044 -aI-254 -aI1035 -aI-288 -aI1040 -aI-270 -aa(lp5805 -g15 -aI1054 -aI-211 -aI1049 -aI-237 -aI1052 -aI-223 -aa(lp5806 -g15 -aI1065 -aI-265 -aI1058 -aI-227 -aI1061 -aI-245 -aa(lp5807 -g15 -aI1078 -aI-326 -aI1069 -aI-284 -aI1073 -aI-305 -aa(lp5808 -g15 -aI1092 -aI-392 -aI1083 -aI-348 -aI1087 -aI-370 -aa(lp5809 -g15 -aI1108 -aI-458 -aI1097 -aI-415 -aI1102 -aI-437 -aa(lp5810 -g20 -aI1178 -aI-746 -aa(lp5811 -g15 -aI1182 -aI-764 -aI1179 -aI-751 -aI1181 -aI-757 -aa(lp5812 -g15 -aI1186 -aI-785 -aI1184 -aI-771 -aI1185 -aI-778 -aa(lp5813 -g15 -aI1189 -aI-803 -aI1188 -aI-791 -aI1189 -aI-798 -aa(lp5814 -g15 -aI1190 -aI-817 -aI1190 -aI-809 -aI1190 -aI-814 -aa(lp5815 -g15 -aI1170 -aI-866 -aI1190 -aI-840 -aI1183 -aI-857 -aa(lp5816 -g15 -aI1105 -aI-881 -aI1156 -aI-876 -aI1134 -aI-881 -aa(lp5817 -g20 -aI1074 -aI-881 -aa(lp5818 -g20 -aI1074 -aI-951 -aa(lp5819 -g20 -aI1422 -aI-951 -aa(lp5820 -g20 -aI1422 -aI-881 -aa(lp5821 -g20 -aI1397 -aI-881 -aa(lp5822 -g15 -aI1362 -aI-877 -aI1384 -aI-881 -aI1372 -aI-879 -aa(lp5823 -g15 -aI1335 -aI-861 -aI1352 -aI-874 -aI1343 -aI-869 -aa(lp5824 -g15 -aI1314 -aI-830 -aI1328 -aI-854 -aI1321 -aI-843 -aa(lp5825 -g15 -aI1296 -aI-776 -aI1308 -aI-816 -aI1302 -aI-799 -aa(lp5826 -g20 -aI1089 -aI0 -aa(lp5827 -g20 -aI937 -aI0 -aa(lp5828 -g20 -aI713 -aI-625 -aa(lp5829 -g20 -aI521 -aI0 -aa(lp5830 -g20 -aI356 -aI0 -aa(lp5831 -g20 -aI111 -aI-810 -aa(lp5832 -g15 -aI97 -aI-844 -aI108 -aI-823 -aI103 -aI-835 -aa(lp5833 -g15 -aI77 -aI-866 -aI92 -aI-853 -aI85 -aI-860 -aa(lp5834 -g15 -aI51 -aI-877 -aI70 -aI-871 -aI61 -aI-875 -aa(lp5835 -g15 -aI17 -aI-881 -aI41 -aI-879 -aI30 -aI-881 -aa(lp5836 -g20 -aI0 -aI-881 -aa(lp5837 -g20 -aI0 -aI-951 -aa(lp5838 -g20 -aI445 -aI-951 -aa(lp5839 -g20 -aI445 -aI-881 -aa(lp5840 -g20 -aI414 -aI-881 -aa(lp5841 -g15 -aI354 -aI-865 -aI387 -aI-881 -aI367 -aI-875 -aa(lp5842 -g15 -aI334 -aI-816 -aI341 -aI-855 -aI334 -aI-838 -aa(lp5843 -g15 -aI338 -aI-784 -aI334 -aI-809 -aI336 -aI-798 -aa(lp5844 -g15 -aI348 -aI-744 -aI341 -aI-770 -aI344 -aI-757 -aa(lp5845 -g20 -aI437 -aI-437 -aa(lp5846 -g15 -aI452 -aI-382 -aI442 -aI-420 -aI447 -aI-401 -aa(lp5847 -g15 -aI468 -aI-322 -aI458 -aI-362 -aI463 -aI-342 -aa(lp5848 -g15 -aI481 -aI-263 -aI472 -aI-301 -aI477 -aI-282 -aa(lp5849 -g15 -aI489 -aI-214 -aI485 -aI-245 -aI487 -aI-228 -aa(lp5850 -g15 -aI509 -aI-294 -aI495 -aI-243 -aI502 -aI-269 -aa(lp5851 -g15 -aI531 -aI-371 -aI516 -aI-319 -aI524 -aI-345 -aa(lp5852 -g20 -aI707 -aI-942 -aa(lp5853 -g10 -aa(lp5854 -g8 -aI1422 -aI0 -aa(lp5855 -g10 -aa(lp5856 -g8 -aI1422 -aI0 -aasV[ -(lp5857 -(lp5858 -g8 -aI133 -aI171 -aa(lp5859 -g20 -aI133 -aI-1012 -aa(lp5860 -g20 -aI502 -aI-1012 -aa(lp5861 -g20 -aI502 -aI-942 -aa(lp5862 -g20 -aI445 -aI-942 -aa(lp5863 -g15 -aI402 -aI-939 -aI430 -aI-942 -aI416 -aI-941 -aa(lp5864 -g15 -aI368 -aI-925 -aI389 -aI-936 -aI377 -aI-932 -aa(lp5865 -g15 -aI344 -aI-896 -aI358 -aI-918 -aI350 -aI-909 -aa(lp5866 -g15 -aI335 -aI-845 -aI338 -aI-884 -aI335 -aI-867 -aa(lp5867 -g20 -aI335 -aI4 -aa(lp5868 -g15 -aI344 -aI54 -aI335 -aI25 -aI338 -aI42 -aa(lp5869 -g15 -aI368 -aI84 -aI350 -aI67 -aI358 -aI77 -aa(lp5870 -g15 -aI402 -aI97 -aI377 -aI90 -aI389 -aI95 -aa(lp5871 -g15 -aI445 -aI100 -aI416 -aI99 -aI430 -aI100 -aa(lp5872 -g20 -aI502 -aI100 -aa(lp5873 -g20 -aI502 -aI171 -aa(lp5874 -g10 -aa(lp5875 -g8 -aI552 -aI0 -aa(lp5876 -g10 -aa(lp5877 -g8 -aI552 -aI0 -aasV_ -(lp5878 -(lp5879 -g8 -aI618 -aI189 -aa(lp5880 -g20 -aI-6 -aI189 -aa(lp5881 -g20 -aI-6 -aI111 -aa(lp5882 -g20 -aI618 -aI111 -aa(lp5883 -g10 -aa(lp5884 -g8 -aI611 -aI0 -aa(lp5885 -g10 -aa(lp5886 -g8 -aI611 -aI0 -aasVc -(lp5887 -(lp5888 -g8 -aI393 -aI13 -aa(lp5889 -g15 -aI258 -aI-5 -aI344 -aI13 -aI299 -aI7 -aa(lp5890 -g15 -aI154 -aI-67 -aI218 -aI-17 -aI183 -aI-38 -aa(lp5891 -g15 -aI86 -aI-181 -aI125 -aI-96 -aI102 -aI-134 -aa(lp5892 -g15 -aI62 -aI-354 -aI70 -aI-228 -aI62 -aI-286 -aa(lp5893 -g15 -aI87 -aI-534 -aI62 -aI-426 -aI70 -aI-486 -aa(lp5894 -g15 -aI156 -aI-650 -aI104 -aI-582 -aI127 -aI-621 -aa(lp5895 -g15 -aI260 -aI-712 -aI185 -aI-679 -aI220 -aI-700 -aa(lp5896 -g15 -aI389 -aI-731 -aI300 -aI-725 -aI343 -aI-731 -aa(lp5897 -g15 -aI503 -aI-720 -aI432 -aI-731 -aI470 -aI-727 -aa(lp5898 -g15 -aI585 -aI-690 -aI536 -aI-713 -aI563 -aI-703 -aa(lp5899 -g15 -aI636 -aI-646 -aI608 -aI-678 -aI624 -aI-663 -aa(lp5900 -g15 -aI653 -aI-591 -aI647 -aI-629 -aI653 -aI-610 -aa(lp5901 -g15 -aI646 -aI-549 -aI653 -aI-577 -aI651 -aI-563 -aa(lp5902 -g15 -aI619 -aI-513 -aI641 -aI-535 -aI632 -aI-523 -aa(lp5903 -g15 -aI566 -aI-487 -aI606 -aI-502 -aI589 -aI-494 -aa(lp5904 -g15 -aI481 -aI-478 -aI544 -aI-481 -aI515 -aI-478 -aa(lp5905 -g15 -aI476 -aI-543 -aI481 -aI-501 -aI479 -aI-522 -aa(lp5906 -g15 -aI462 -aI-598 -aI474 -aI-564 -aI469 -aI-582 -aa(lp5907 -g15 -aI436 -aI-635 -aI456 -aI-614 -aI447 -aI-626 -aa(lp5908 -g15 -aI394 -aI-649 -aI425 -aI-645 -aI411 -aI-649 -aa(lp5909 -g15 -aI342 -aI-635 -aI374 -aI-649 -aI357 -aI-645 -aa(lp5910 -g15 -aI302 -aI-588 -aI326 -aI-626 -aI313 -aI-610 -aa(lp5911 -g15 -aI277 -aI-497 -aI291 -aI-565 -aI282 -aI-535 -aa(lp5912 -g15 -aI268 -aI-355 -aI271 -aI-459 -aI268 -aI-412 -aa(lp5913 -g15 -aI305 -aI-153 -aI268 -aI-265 -aI280 -aI-197 -aa(lp5914 -g15 -aI426 -aI-86 -aI330 -aI-108 -aI370 -aI-86 -aa(lp5915 -g15 -aI491 -aI-94 -aI449 -aI-86 -aI471 -aI-88 -aa(lp5916 -g15 -aI546 -aI-117 -aI511 -aI-99 -aI529 -aI-107 -aa(lp5917 -g15 -aI589 -aI-151 -aI562 -aI-126 -aI577 -aI-138 -aa(lp5918 -g15 -aI619 -aI-194 -aI601 -aI-164 -aI611 -aI-179 -aa(lp5919 -g15 -aI643 -aI-167 -aI630 -aI-187 -aI638 -aI-178 -aa(lp5920 -g15 -aI651 -aI-133 -aI649 -aI-156 -aI651 -aI-145 -aa(lp5921 -g15 -aI636 -aI-81 -aI651 -aI-116 -aI646 -aI-98 -aa(lp5922 -g15 -aI590 -aI-34 -aI626 -aI-64 -aI611 -aI-48 -aa(lp5923 -g15 -aI509 -aI0 -aI569 -aI-20 -aI542 -aI-8 -aa(lp5924 -g15 -aI393 -aI13 -aI477 -aI9 -aI438 -aI13 -aa(lp5925 -g10 -aa(lp5926 -g8 -aI702 -aI0 -aa(lp5927 -g10 -aa(lp5928 -g8 -aI702 -aI0 -aasVg -(lp5929 -(lp5930 -g8 -aI740 -aI-689 -aa(lp5931 -g15 -aI735 -aI-660 -aI740 -aI-679 -aI738 -aI-669 -aa(lp5932 -g15 -aI720 -aI-635 -aI732 -aI-650 -aI727 -aI-642 -aa(lp5933 -g15 -aI691 -aI-619 -aI713 -aI-628 -aI703 -aI-623 -aa(lp5934 -g15 -aI645 -aI-612 -aI678 -aI-614 -aI663 -aI-612 -aa(lp5935 -g15 -aI640 -aI-636 -aI645 -aI-621 -aI643 -aI-629 -aa(lp5936 -g15 -aI629 -aI-654 -aI638 -aI-643 -aI634 -aI-649 -aa(lp5937 -g15 -aI613 -aI-665 -aI624 -aI-659 -aI619 -aI-662 -aa(lp5938 -g15 -aI594 -aI-668 -aI607 -aI-667 -aI600 -aI-668 -aa(lp5939 -g15 -aI570 -aI-664 -aI587 -aI-668 -aI579 -aI-667 -aa(lp5940 -g15 -aI550 -aI-654 -aI562 -aI-661 -aI555 -aI-657 -aa(lp5941 -g15 -aI576 -aI-620 -aI559 -aI-644 -aI568 -aI-633 -aa(lp5942 -g15 -aI596 -aI-578 -aI583 -aI-607 -aI590 -aI-593 -aa(lp5943 -g15 -aI610 -aI-533 -aI602 -aI-564 -aI607 -aI-548 -aa(lp5944 -g15 -aI615 -aI-484 -aI614 -aI-517 -aI615 -aI-501 -aa(lp5945 -g15 -aI599 -aI-391 -aI615 -aI-451 -aI610 -aI-420 -aa(lp5946 -g15 -aI550 -aI-317 -aI589 -aI-363 -aI572 -aI-338 -aa(lp5947 -g15 -aI466 -aI-269 -aI528 -aI-297 -aI500 -aI-280 -aa(lp5948 -g15 -aI346 -aI-251 -aI432 -aI-257 -aI392 -aI-251 -aa(lp5949 -g15 -aI328 -aI-251 -aI341 -aI-251 -aI335 -aI-251 -aa(lp5950 -g15 -aI305 -aI-252 -aI320 -aI-252 -aI313 -aI-252 -aa(lp5951 -g15 -aI284 -aI-253 -aI298 -aI-252 -aI291 -aI-253 -aa(lp5952 -g15 -aI269 -aI-255 -aI278 -aI-254 -aI273 -aI-254 -aa(lp5953 -g15 -aI252 -aI-244 -aI263 -aI-252 -aI258 -aI-248 -aa(lp5954 -g15 -aI236 -aI-228 -aI246 -aI-239 -aI241 -aI-234 -aa(lp5955 -g15 -aI225 -aI-209 -aI232 -aI-223 -aI228 -aI-216 -aa(lp5956 -g15 -aI221 -aI-187 -aI222 -aI-202 -aI221 -aI-195 -aa(lp5957 -g15 -aI238 -aI-155 -aI221 -aI-172 -aI227 -aI-162 -aa(lp5958 -g15 -aI283 -aI-144 -aI250 -aI-148 -aI265 -aI-144 -aa(lp5959 -g20 -aI445 -aI-144 -aa(lp5960 -g15 -aI559 -aI-130 -aI489 -aI-144 -aI527 -aI-140 -aa(lp5961 -g15 -aI639 -aI-90 -aI592 -aI-121 -aI618 -aI-108 -aa(lp5962 -g15 -aI686 -aI-26 -aI660 -aI-73 -aI676 -aI-51 -aa(lp5963 -g15 -aI701 -aI59 -aI696 -aI-1 -aI701 -aI27 -aa(lp5964 -g15 -aI677 -aI169 -aI701 -aI100 -aI693 -aI137 -aa(lp5965 -g15 -aI606 -aI251 -aI662 -aI201 -aI638 -aI229 -aa(lp5966 -g15 -aI486 -aI302 -aI574 -aI273 -aI534 -aI290 -aa(lp5967 -g15 -aI314 -aI320 -aI437 -aI314 -aI380 -aI320 -aa(lp5968 -g15 -aI79 -aI273 -aI209 -aI320 -aI131 -aI305 -aa(lp5969 -g15 -aI2 -aI135 -aI28 -aI242 -aI2 -aI195 -aa(lp5970 -g15 -aI48 -aI25 -aI2 -aI87 -aI18 -aI50 -aa(lp5971 -g15 -aI182 -aI-19 -aI79 -aI0 -aI124 -aI-14 -aa(lp5972 -g15 -aI147 -aI-37 -aI170 -aI-24 -aI158 -aI-30 -aa(lp5973 -g15 -aI115 -aI-62 -aI135 -aI-44 -aI125 -aI-52 -aa(lp5974 -g15 -aI93 -aI-95 -aI106 -aI-72 -aI99 -aI-83 -aa(lp5975 -g15 -aI85 -aI-138 -aI88 -aI-108 -aI85 -aI-122 -aa(lp5976 -g15 -aI94 -aI-179 -aI85 -aI-152 -aI88 -aI-166 -aa(lp5977 -g15 -aI118 -aI-215 -aI99 -aI-191 -aI108 -aI-203 -aa(lp5978 -g15 -aI155 -aI-247 -aI128 -aI-226 -aI141 -aI-237 -aa(lp5979 -g15 -aI203 -aI-278 -aI170 -aI-258 -aI186 -aI-268 -aa(lp5980 -g15 -aI149 -aI-307 -aI184 -aI-285 -aI166 -aI-294 -aa(lp5981 -g15 -aI106 -aI-351 -aI132 -aI-319 -aI118 -aI-334 -aa(lp5982 -g15 -aI78 -aI-411 -aI94 -aI-369 -aI85 -aI-388 -aa(lp5983 -g15 -aI67 -aI-484 -aI71 -aI-433 -aI67 -aI-457 -aa(lp5984 -g15 -aI135 -aI-666 -aI67 -aI-562 -aI90 -aI-623 -aa(lp5985 -g15 -aI346 -aI-731 -aI181 -aI-709 -aI251 -aI-731 -aa(lp5986 -g15 -aI434 -aI-719 -aI378 -aI-731 -aI407 -aI-727 -aa(lp5987 -g15 -aI505 -aI-690 -aI461 -aI-711 -aI485 -aI-701 -aa(lp5988 -g15 -aI529 -aI-715 -aI512 -aI-698 -aI520 -aI-706 -aa(lp5989 -g15 -aI559 -aI-739 -aI538 -aI-724 -aI548 -aI-732 -aa(lp5990 -g15 -aI597 -aI-758 -aI571 -aI-747 -aI583 -aI-753 -aa(lp5991 -g15 -aI643 -aI-765 -aI611 -aI-762 -aI626 -aI-765 -aa(lp5992 -g15 -aI685 -aI-758 -aI659 -aI-765 -aI673 -aI-763 -aa(lp5993 -g15 -aI715 -aI-742 -aI697 -aI-754 -aI707 -aI-749 -aa(lp5994 -g15 -aI734 -aI-718 -aI723 -aI-735 -aI729 -aI-727 -aa(lp5995 -g15 -aI740 -aI-689 -aI738 -aI-709 -aI740 -aI-699 -aa(lp5996 -g10 -aa(lp5997 -g8 -aI160 -aI132 -aa(lp5998 -g15 -aI200 -aI214 -aI160 -aI169 -aI173 -aI196 -aa(lp5999 -g15 -aI317 -aI240 -aI226 -aI231 -aI265 -aI240 -aa(lp6000 -g15 -aI487 -aI206 -aI395 -aI240 -aI452 -aI229 -aa(lp6001 -g15 -aI541 -aI107 -aI523 -aI184 -aI541 -aI151 -aa(lp6002 -g15 -aI514 -aI47 -aI541 -aI79 -aI532 -aI59 -aa(lp6003 -g15 -aI433 -aI31 -aI496 -aI36 -aI469 -aI31 -aa(lp6004 -g20 -aI278 -aI31 -aa(lp6005 -g15 -aI237 -aI34 -aI265 -aI31 -aI251 -aI32 -aa(lp6006 -g15 -aI199 -aI49 -aI223 -aI37 -aI211 -aI41 -aa(lp6007 -g15 -aI171 -aI80 -aI188 -aI56 -aI178 -aI66 -aa(lp6008 -g15 -aI160 -aI132 -aI163 -aI93 -aI160 -aI110 -aa(lp6009 -g10 -aa(lp6010 -g8 -aI249 -aI-484 -aa(lp6011 -g15 -aI254 -aI-421 -aI249 -aI-461 -aI250 -aI-439 -aa(lp6012 -g15 -aI270 -aI-372 -aI257 -aI-402 -aI262 -aI-386 -aa(lp6013 -g15 -aI298 -aI-341 -aI277 -aI-359 -aI287 -aI-348 -aa(lp6014 -g15 -aI342 -aI-330 -aI310 -aI-333 -aI325 -aI-330 -aa(lp6015 -g15 -aI386 -aI-341 -aI360 -aI-330 -aI374 -aI-333 -aa(lp6016 -g15 -aI414 -aI-372 -aI398 -aI-348 -aI407 -aI-358 -aa(lp6017 -g15 -aI429 -aI-421 -aI421 -aI-385 -aI426 -aI-402 -aa(lp6018 -g15 -aI433 -aI-486 -aI432 -aI-441 -aI433 -aI-462 -aa(lp6019 -g15 -aI429 -aI-553 -aI433 -aI-511 -aI432 -aI-533 -aa(lp6020 -g15 -aI413 -aI-605 -aI425 -aI-574 -aI420 -aI-591 -aa(lp6021 -g15 -aI385 -aI-639 -aI406 -aI-619 -aI397 -aI-631 -aa(lp6022 -g15 -aI341 -aI-651 -aI373 -aI-647 -aI358 -aI-651 -aa(lp6023 -g15 -aI297 -aI-638 -aI323 -aI-651 -aI309 -aI-647 -aa(lp6024 -g15 -aI269 -aI-604 -aI285 -aI-630 -aI276 -aI-619 -aa(lp6025 -g15 -aI253 -aI-551 -aI262 -aI-589 -aI256 -aI-572 -aa(lp6026 -g15 -aI249 -aI-484 -aI250 -aI-531 -aI249 -aI-508 -aa(lp6027 -g10 -aa(lp6028 -g8 -aI746 -aI0 -aa(lp6029 -g10 -aa(lp6030 -g8 -aI746 -aI0 -aasVk -(lp6031 -(lp6032 -g8 -aI848 -aI0 -aa(lp6033 -g20 -aI829 -aI0 -aa(lp6034 -g15 -aI707 -aI-2 -aI780 -aI0 -aI740 -aI0 -aa(lp6035 -g15 -aI621 -aI-17 -aI674 -aI-4 -aI645 -aI-9 -aa(lp6036 -g15 -aI559 -aI-53 -aI597 -aI-25 -aI577 -aI-37 -aa(lp6037 -g15 -aI507 -aI-118 -aI542 -aI-69 -aI525 -aI-90 -aa(lp6038 -g20 -aI389 -aI-304 -aa(lp6039 -g20 -aI335 -aI-265 -aa(lp6040 -g20 -aI335 -aI-157 -aa(lp6041 -g15 -aI345 -aI-111 -aI335 -aI-138 -aI339 -aI-122 -aa(lp6042 -g15 -aI368 -aI-85 -aI351 -aI-100 -aI359 -aI-91 -aa(lp6043 -g15 -aI399 -aI-73 -aI378 -aI-79 -aI388 -aI-75 -aa(lp6044 -g15 -aI430 -aI-70 -aI411 -aI-71 -aI421 -aI-70 -aa(lp6045 -g20 -aI446 -aI-70 -aa(lp6046 -g20 -aI446 -aI0 -aa(lp6047 -g20 -aI22 -aI0 -aa(lp6048 -g20 -aI22 -aI-70 -aa(lp6049 -g20 -aI38 -aI-70 -aa(lp6050 -g15 -aI69 -aI-73 -aI48 -aI-70 -aI58 -aI-71 -aa(lp6051 -g15 -aI100 -aI-85 -aI81 -aI-75 -aI91 -aI-79 -aa(lp6052 -g15 -aI124 -aI-111 -aI109 -aI-91 -aI117 -aI-100 -aa(lp6053 -g15 -aI133 -aI-157 -aI130 -aI-122 -aI133 -aI-138 -aa(lp6054 -g20 -aI133 -aI-860 -aa(lp6055 -g15 -aI124 -aI-903 -aI133 -aI-878 -aI130 -aI-892 -aa(lp6056 -g15 -aI100 -aI-928 -aI117 -aI-914 -aI109 -aI-922 -aa(lp6057 -g15 -aI69 -aI-939 -aI90 -aI-934 -aI80 -aI-937 -aa(lp6058 -g15 -aI38 -aI-942 -aI58 -aI-941 -aI47 -aI-942 -aa(lp6059 -g20 -aI22 -aI-942 -aa(lp6060 -g20 -aI22 -aI-1012 -aa(lp6061 -g20 -aI335 -aI-1012 -aa(lp6062 -g20 -aI335 -aI-498 -aa(lp6063 -g15 -aI334 -aI-456 -aI335 -aI-486 -aI335 -aI-472 -aa(lp6064 -g15 -aI332 -aI-411 -aI334 -aI-440 -aI333 -aI-425 -aa(lp6065 -g15 -aI329 -aI-359 -aI331 -aI-394 -aI330 -aI-376 -aa(lp6066 -g20 -aI497 -aI-547 -aa(lp6067 -g15 -aI526 -aI-587 -aI512 -aI-564 -aI521 -aI-577 -aa(lp6068 -g15 -aI533 -aI-611 -aI530 -aI-596 -aI533 -aI-605 -aa(lp6069 -g15 -aI515 -aI-637 -aI533 -aI-622 -aI527 -aI-631 -aa(lp6070 -g15 -aI464 -aI-647 -aI503 -aI-644 -aI486 -aI-647 -aa(lp6071 -g20 -aI464 -aI-714 -aa(lp6072 -g20 -aI800 -aI-714 -aa(lp6073 -g20 -aI800 -aI-647 -aa(lp6074 -g15 -aI709 -aI-620 -aI769 -aI-647 -aI739 -aI-638 -aa(lp6075 -g15 -aI611 -aI-534 -aI679 -aI-602 -aI647 -aI-573 -aa(lp6076 -g20 -aI527 -aI-438 -aa(lp6077 -g20 -aI705 -aI-174 -aa(lp6078 -g15 -aI776 -aI-95 -aI728 -aI-138 -aI752 -aI-112 -aa(lp6079 -g15 -aI843 -aI-70 -aI799 -aI-78 -aI822 -aI-70 -aa(lp6080 -g20 -aI848 -aI-70 -aa(lp6081 -g10 -aa(lp6082 -g8 -aI848 -aI0 -aa(lp6083 -g10 -aa(lp6084 -g8 -aI848 -aI0 -aasVo -(lp6085 -(lp6086 -g8 -aI754 -aI-359 -aa(lp6087 -g15 -aI666 -aI-78 -aI754 -aI-234 -aI725 -aI-140 -aa(lp6088 -g15 -aI406 -aI13 -aI607 -aI-17 -aI521 -aI13 -aa(lp6089 -g15 -aI263 -aI-9 -aI353 -aI13 -aI305 -aI5 -aa(lp6090 -g15 -aI154 -aI-78 -aI220 -aI-25 -aI184 -aI-48 -aa(lp6091 -g15 -aI86 -aI-195 -aI124 -aI-109 -aI102 -aI-148 -aa(lp6092 -g15 -aI62 -aI-359 -aI70 -aI-242 -aI62 -aI-297 -aa(lp6093 -g15 -aI150 -aI-639 -aI62 -aI-485 -aI91 -aI-578 -aa(lp6094 -g15 -aI410 -aI-731 -aI209 -aI-700 -aI296 -aI-731 -aa(lp6095 -g15 -aI554 -aI-708 -aI464 -aI-731 -aI512 -aI-723 -aa(lp6096 -g15 -aI662 -aI-639 -aI596 -aI-693 -aI632 -aI-670 -aa(lp6097 -g15 -aI730 -aI-523 -aI692 -aI-608 -aI714 -aI-569 -aa(lp6098 -g15 -aI754 -aI-359 -aI746 -aI-476 -aI754 -aI-422 -aa(lp6099 -g10 -aa(lp6100 -g8 -aI269 -aI-359 -aa(lp6101 -g15 -aI277 -aI-234 -aI269 -aI-312 -aI272 -aI-270 -aa(lp6102 -g15 -aI301 -aI-144 -aI282 -aI-198 -aI290 -aI-168 -aa(lp6103 -g15 -aI344 -aI-89 -aI312 -aI-119 -aI326 -aI-101 -aa(lp6104 -g15 -aI409 -aI-70 -aI362 -aI-76 -aI383 -aI-70 -aa(lp6105 -g15 -aI474 -aI-89 -aI435 -aI-70 -aI456 -aI-76 -aa(lp6106 -g15 -aI517 -aI-144 -aI491 -aI-101 -aI506 -aI-119 -aa(lp6107 -g15 -aI541 -aI-234 -aI528 -aI-168 -aI536 -aI-198 -aa(lp6108 -g15 -aI548 -aI-359 -aI545 -aI-270 -aI548 -aI-312 -aa(lp6109 -g15 -aI540 -aI-484 -aI548 -aI-407 -aI545 -aI-449 -aa(lp6110 -g15 -aI516 -aI-574 -aI535 -aI-520 -aI527 -aI-550 -aa(lp6111 -g15 -aI473 -aI-628 -aI505 -aI-598 -aI491 -aI-616 -aa(lp6112 -g15 -aI408 -aI-646 -aI455 -aI-640 -aI433 -aI-646 -aa(lp6113 -g15 -aI343 -aI-628 -aI382 -aI-646 -aI360 -aI-640 -aa(lp6114 -g15 -aI300 -aI-574 -aI325 -aI-616 -aI310 -aI-598 -aa(lp6115 -g15 -aI276 -aI-484 -aI289 -aI-550 -aI281 -aI-520 -aa(lp6116 -g15 -aI269 -aI-359 -aI271 -aI-449 -aI269 -aI-407 -aa(lp6117 -g10 -aa(lp6118 -g8 -aI817 -aI0 -aa(lp6119 -g10 -aa(lp6120 -g8 -aI817 -aI0 -aasVs -(lp6121 -(lp6122 -g8 -aI307 -aI13 -aa(lp6123 -g15 -aI184 -aI1 -aI259 -aI13 -aI218 -aI9 -aa(lp6124 -g15 -aI101 -aI-30 -aI150 -aI-6 -aI122 -aI-16 -aa(lp6125 -g15 -aI54 -aI-80 -aI79 -aI-44 -aI64 -aI-61 -aa(lp6126 -g15 -aI39 -aI-142 -aI44 -aI-99 -aI39 -aI-119 -aa(lp6127 -g15 -aI52 -aI-194 -aI39 -aI-163 -aI43 -aI-181 -aa(lp6128 -g15 -aI84 -aI-225 -aI60 -aI-207 -aI71 -aI-218 -aa(lp6129 -g15 -aI125 -aI-240 -aI97 -aI-232 -aI110 -aI-237 -aa(lp6130 -g15 -aI164 -aI-243 -aI139 -aI-242 -aI152 -aI-243 -aa(lp6131 -g15 -aI174 -aI-168 -aI164 -aI-215 -aI167 -aI-190 -aa(lp6132 -g15 -aI203 -aI-112 -aI181 -aI-146 -aI191 -aI-127 -aa(lp6133 -g15 -aI249 -aI-77 -aI216 -aI-97 -aI231 -aI-85 -aa(lp6134 -g15 -aI307 -aI-64 -aI266 -aI-68 -aI286 -aI-64 -aa(lp6135 -g15 -aI367 -aI-71 -aI330 -aI-64 -aI350 -aI-67 -aa(lp6136 -g15 -aI408 -aI-91 -aI384 -aI-76 -aI397 -aI-83 -aa(lp6137 -g15 -aI432 -aI-120 -aI419 -aI-100 -aI427 -aI-109 -aa(lp6138 -g15 -aI440 -aI-155 -aI437 -aI-132 -aI440 -aI-143 -aa(lp6139 -g15 -aI431 -aI-195 -aI440 -aI-170 -aI437 -aI-183 -aa(lp6140 -g15 -aI404 -aI-227 -aI426 -aI-206 -aI417 -aI-217 -aa(lp6141 -g15 -aI354 -aI-257 -aI392 -aI-237 -aI375 -aI-247 -aa(lp6142 -g15 -aI276 -aI-288 -aI333 -aI-267 -aI307 -aI-277 -aa(lp6143 -g15 -aI180 -aI-328 -aI240 -aI-301 -aI208 -aI-314 -aa(lp6144 -g15 -aI111 -aI-376 -aI153 -aI-342 -aI129 -aI-358 -aa(lp6145 -g15 -aI68 -aI-438 -aI92 -aI-394 -aI77 -aI-415 -aa(lp6146 -g15 -aI53 -aI-518 -aI58 -aI-461 -aI53 -aI-488 -aa(lp6147 -g15 -aI73 -aI-611 -aI53 -aI-554 -aI60 -aI-585 -aa(lp6148 -g15 -aI132 -aI-677 -aI87 -aI-638 -aI106 -aI-660 -aa(lp6149 -g15 -aI222 -aI-716 -aI157 -aI-695 -aI187 -aI-708 -aa(lp6150 -g15 -aI339 -aI-730 -aI257 -aI-725 -aI296 -aI-730 -aa(lp6151 -g15 -aI447 -aI-719 -aI381 -aI-730 -aI417 -aI-726 -aa(lp6152 -g15 -aI519 -aI-690 -aI476 -aI-712 -aI500 -aI-702 -aa(lp6153 -g15 -aI560 -aI-651 -aI538 -aI-679 -aI551 -aI-665 -aa(lp6154 -g15 -aI573 -aI-606 -aI569 -aI-636 -aI573 -aI-621 -aa(lp6155 -g15 -aI541 -aI-537 -aI573 -aI-576 -aI563 -aI-553 -aa(lp6156 -g15 -aI437 -aI-514 -aI520 -aI-522 -aI486 -aI-514 -aa(lp6157 -g15 -aI407 -aI-617 -aI437 -aI-558 -aI427 -aI-593 -aa(lp6158 -g15 -aI320 -aI-654 -aI388 -aI-642 -aI358 -aI-654 -aa(lp6159 -g15 -aI278 -aI-649 -aI305 -aI-654 -aI292 -aI-652 -aa(lp6160 -g15 -aI244 -aI-633 -aI265 -aI-645 -aI254 -aI-640 -aa(lp6161 -g15 -aI221 -aI-607 -aI234 -aI-626 -aI226 -aI-618 -aa(lp6162 -g15 -aI212 -aI-571 -aI215 -aI-597 -aI212 -aI-585 -aa(lp6163 -g15 -aI220 -aI-533 -aI212 -aI-557 -aI214 -aI-544 -aa(lp6164 -g15 -aI249 -aI-501 -aI225 -aI-522 -aI235 -aI-511 -aa(lp6165 -g15 -aI304 -aI-470 -aI262 -aI-490 -aI281 -aI-480 -aa(lp6166 -g15 -aI394 -aI-435 -aI328 -aI-459 -aI358 -aI-448 -aa(lp6167 -g15 -aI476 -aI-400 -aI424 -aI-425 -aI451 -aI-413 -aa(lp6168 -g15 -aI540 -aI-354 -aI501 -aI-387 -aI522 -aI-371 -aa(lp6169 -g15 -aI582 -aI-296 -aI558 -aI-337 -aI572 -aI-318 -aa(lp6170 -g15 -aI597 -aI-220 -aI592 -aI-274 -aI597 -aI-249 -aa(lp6171 -g15 -aI578 -aI-121 -aI597 -aI-184 -aI591 -aI-151 -aa(lp6172 -g15 -aI522 -aI-48 -aI565 -aI-92 -aI546 -aI-68 -aa(lp6173 -g15 -aI430 -aI-2 -aI497 -aI-28 -aI467 -aI-13 -aa(lp6174 -g15 -aI307 -aI13 -aI394 -aI8 -aI353 -aI13 -aa(lp6175 -g10 -aa(lp6176 -g8 -aI650 -aI0 -aa(lp6177 -g10 -aa(lp6178 -g8 -aI650 -aI0 -aasVw -(lp6179 -(lp6180 -g8 -aI658 -aI-707 -aa(lp6181 -g20 -aI789 -aI-314 -aa(lp6182 -g15 -aI812 -aI-232 -aI799 -aI-281 -aI807 -aI-254 -aa(lp6183 -g15 -aI824 -aI-174 -aI817 -aI-209 -aI821 -aI-190 -aa(lp6184 -g20 -aI828 -aI-174 -aa(lp6185 -g15 -aI834 -aI-205 -aI830 -aI-185 -aI832 -aI-195 -aa(lp6186 -g15 -aI841 -aI-237 -aI836 -aI-215 -aI838 -aI-226 -aa(lp6187 -g15 -aI850 -aI-272 -aI844 -aI-248 -aI847 -aI-259 -aa(lp6188 -g15 -aI863 -aI-316 -aI854 -aI-285 -aI858 -aI-300 -aa(lp6189 -g20 -aI922 -aI-511 -aa(lp6190 -g15 -aI931 -aI-547 -aI925 -aI-522 -aI928 -aI-534 -aa(lp6191 -g15 -aI934 -aI-578 -aI933 -aI-560 -aI934 -aI-570 -aa(lp6192 -g15 -aI913 -aI-627 -aI934 -aI-600 -aI927 -aI-617 -aa(lp6193 -g15 -aI846 -aI-643 -aI898 -aI-638 -aI876 -aI-643 -aa(lp6194 -g20 -aI837 -aI-643 -aa(lp6195 -g20 -aI837 -aI-714 -aa(lp6196 -g20 -aI1142 -aI-714 -aa(lp6197 -g20 -aI1142 -aI-643 -aa(lp6198 -g20 -aI1125 -aI-643 -aa(lp6199 -g15 -aI1091 -aI-639 -aI1112 -aI-643 -aI1101 -aI-642 -aa(lp6200 -g15 -aI1066 -aI-624 -aI1082 -aI-636 -aI1073 -aI-631 -aa(lp6201 -g15 -aI1045 -aI-592 -aI1059 -aI-616 -aI1052 -aI-605 -aa(lp6202 -g15 -aI1025 -aI-539 -aI1039 -aI-578 -aI1032 -aI-560 -aa(lp6203 -g20 -aI853 -aI0 -aa(lp6204 -g20 -aI709 -aI0 -aa(lp6205 -g20 -aI563 -aI-442 -aa(lp6206 -g20 -aI410 -aI0 -aa(lp6207 -g20 -aI265 -aI0 -aa(lp6208 -g20 -aI94 -aI-573 -aa(lp6209 -g15 -aI78 -aI-607 -aI89 -aI-587 -aI84 -aI-598 -aa(lp6210 -g15 -aI59 -aI-629 -aI73 -aI-616 -aI66 -aI-623 -aa(lp6211 -g15 -aI33 -aI-640 -aI51 -aI-634 -aI43 -aI-638 -aa(lp6212 -g15 -aI0 -aI-643 -aI24 -aI-642 -aI13 -aI-643 -aa(lp6213 -g20 -aI-3 -aI-643 -aa(lp6214 -g20 -aI-3 -aI-714 -aa(lp6215 -g20 -aI386 -aI-714 -aa(lp6216 -g20 -aI386 -aI-643 -aa(lp6217 -g20 -aI369 -aI-643 -aa(lp6218 -g15 -aI308 -aI-632 -aI342 -aI-643 -aI322 -aI-639 -aa(lp6219 -g15 -aI289 -aI-587 -aI295 -aI-624 -aI289 -aI-609 -aa(lp6220 -g15 -aI292 -aI-560 -aI289 -aI-580 -aI290 -aI-571 -aa(lp6221 -g15 -aI300 -aI-530 -aI295 -aI-550 -aI297 -aI-540 -aa(lp6222 -g20 -aI349 -aI-356 -aa(lp6223 -g15 -aI361 -aI-307 -aI353 -aI-340 -aI358 -aI-324 -aa(lp6224 -g15 -aI373 -aI-258 -aI365 -aI-290 -aI369 -aI-274 -aa(lp6225 -g15 -aI382 -aI-212 -aI376 -aI-241 -aI379 -aI-226 -aa(lp6226 -g15 -aI389 -aI-174 -aI385 -aI-198 -aI387 -aI-185 -aa(lp6227 -g20 -aI393 -aI-174 -aa(lp6228 -g15 -aI409 -aI-242 -aI397 -aI-196 -aI402 -aI-219 -aa(lp6229 -g15 -aI436 -aI-327 -aI415 -aI-266 -aI424 -aI-294 -aa(lp6230 -g20 -aI572 -aI-707 -aa(lp6231 -g10 -aa(lp6232 -g8 -aI1141 -aI0 -aa(lp6233 -g10 -aa(lp6234 -g8 -aI1141 -aI0 -aasV{ -(lp6235 -(lp6236 -g8 -aI422 -aI167 -aa(lp6237 -g15 -aI323 -aI153 -aI385 -aI167 -aI352 -aI162 -aa(lp6238 -g15 -aI252 -aI114 -aI295 -aI144 -aI271 -aI131 -aa(lp6239 -g15 -aI209 -aI51 -aI233 -aI96 -aI219 -aI76 -aa(lp6240 -g15 -aI194 -aI-30 -aI199 -aI27 -aI194 -aI0 -aa(lp6241 -g20 -aI194 -aI-258 -aa(lp6242 -g15 -aI182 -aI-320 -aI194 -aI-283 -aI190 -aI-304 -aa(lp6243 -g15 -aI149 -aI-357 -aI174 -aI-336 -aI163 -aI-348 -aa(lp6244 -g15 -aI100 -aI-376 -aI135 -aI-366 -aI119 -aI-373 -aa(lp6245 -g15 -aI39 -aI-383 -aI81 -aI-380 -aI61 -aI-382 -aa(lp6246 -g20 -aI39 -aI-465 -aa(lp6247 -g15 -aI100 -aI-471 -aI61 -aI-465 -aI81 -aI-468 -aa(lp6248 -g15 -aI149 -aI-490 -aI119 -aI-475 -aI135 -aI-481 -aa(lp6249 -g15 -aI182 -aI-527 -aI163 -aI-499 -aI174 -aI-512 -aa(lp6250 -g15 -aI194 -aI-588 -aI190 -aI-543 -aI194 -aI-563 -aa(lp6251 -g20 -aI194 -aI-817 -aa(lp6252 -g15 -aI252 -aI-962 -aI194 -aI-880 -aI213 -aI-928 -aa(lp6253 -g15 -aI422 -aI-1012 -aI290 -aI-995 -aI347 -aI-1012 -aa(lp6254 -g20 -aI549 -aI-1012 -aa(lp6255 -g20 -aI549 -aI-942 -aa(lp6256 -g20 -aI497 -aI-942 -aa(lp6257 -g15 -aI450 -aI-933 -aI478 -aI-942 -aI462 -aI-939 -aa(lp6258 -g15 -aI421 -aI-909 -aI438 -aI-928 -aI428 -aI-919 -aa(lp6259 -g15 -aI406 -aI-868 -aI414 -aI-898 -aI409 -aI-884 -aa(lp6260 -g15 -aI402 -aI-812 -aI403 -aI-852 -aI402 -aI-833 -aa(lp6261 -g20 -aI402 -aI-586 -aa(lp6262 -g15 -aI367 -aI-486 -aI402 -aI-545 -aI390 -aI-512 -aa(lp6263 -g15 -aI255 -aI-430 -aI344 -aI-461 -aI307 -aI-442 -aa(lp6264 -g20 -aI255 -aI-419 -aa(lp6265 -g15 -aI367 -aI-361 -aI307 -aI-406 -aI344 -aI-387 -aa(lp6266 -g15 -aI402 -aI-261 -aI390 -aI-335 -aI402 -aI-302 -aa(lp6267 -g20 -aI402 -aI-34 -aa(lp6268 -g15 -aI406 -aI21 -aI402 -aI-13 -aI403 -aI5 -aa(lp6269 -g15 -aI421 -aI62 -aI409 -aI37 -aI414 -aI51 -aa(lp6270 -g15 -aI450 -aI87 -aI428 -aI73 -aI438 -aI82 -aa(lp6271 -g15 -aI497 -aI96 -aI462 -aI93 -aI478 -aI96 -aa(lp6272 -g20 -aI549 -aI96 -aa(lp6273 -g20 -aI549 -aI167 -aa(lp6274 -g10 -aa(lp6275 -g8 -aI589 -aI0 -aa(lp6276 -g10 -aa(lp6277 -g8 -aI589 -aI0 -aasV" -(lp6278 -(lp6279 -g8 -aI380 -aI-951 -aa(lp6280 -g20 -aI587 -aI-951 -aa(lp6281 -g20 -aI541 -aI-584 -aa(lp6282 -g20 -aI453 -aI-584 -aa(lp6283 -g10 -aa(lp6284 -g8 -aI89 -aI-951 -aa(lp6285 -g20 -aI297 -aI-951 -aa(lp6286 -g20 -aI237 -aI-584 -aa(lp6287 -g20 -aI149 -aI-584 -aa(lp6288 -g10 -aa(lp6289 -g8 -aI677 -aI0 -aa(lp6290 -g10 -aa(lp6291 -g8 -aI677 -aI0 -aasV& -(lp6292 -(lp6293 -g8 -aI786 -aI0 -aa(lp6294 -g20 -aI694 -aI-97 -aa(lp6295 -g15 -aI639 -aI-52 -aI678 -aI-80 -aI659 -aI-65 -aa(lp6296 -g15 -aI572 -aI-17 -aI619 -aI-38 -aI597 -aI-27 -aa(lp6297 -g15 -aI493 -aI5 -aI548 -aI-7 -aI522 -aI0 -aa(lp6298 -g15 -aI401 -aI13 -aI465 -aI10 -aI434 -aI13 -aa(lp6299 -g15 -aI255 -aI-5 -aI346 -aI13 -aI297 -aI7 -aa(lp6300 -g15 -aI149 -aI-61 -aI213 -aI-18 -aI178 -aI-37 -aa(lp6301 -g15 -aI84 -aI-150 -aI121 -aI-85 -aI99 -aI-115 -aa(lp6302 -g15 -aI62 -aI-270 -aI69 -aI-185 -aI62 -aI-225 -aa(lp6303 -g15 -aI81 -aI-370 -aI62 -aI-309 -aI68 -aI-342 -aa(lp6304 -g15 -aI130 -aI-441 -aI93 -aI-397 -aI110 -aI-421 -aa(lp6305 -g15 -aI203 -aI-493 -aI151 -aI-462 -aI175 -aI-479 -aa(lp6306 -g15 -aI290 -aI-532 -aI231 -aI-507 -aI259 -aI-520 -aa(lp6307 -g15 -aI245 -aI-592 -aI273 -aI-553 -aI257 -aI-573 -aa(lp6308 -g15 -aI213 -aI-648 -aI232 -aI-611 -aI221 -aI-629 -aa(lp6309 -g15 -aI195 -aI-705 -aI205 -aI-667 -aI199 -aI-686 -aa(lp6310 -g15 -aI189 -aI-769 -aI191 -aI-725 -aI189 -aI-746 -aa(lp6311 -g15 -aI206 -aI-849 -aI189 -aI-798 -aI195 -aI-825 -aa(lp6312 -g15 -aI256 -aI-911 -aI217 -aI-873 -aI234 -aI-893 -aa(lp6313 -g15 -aI340 -aI-951 -aI279 -aI-928 -aI307 -aI-941 -aa(lp6314 -g15 -aI457 -aI-965 -aI373 -aI-960 -aI412 -aI-965 -aa(lp6315 -g15 -aI569 -aI-950 -aI500 -aI-965 -aI537 -aI-960 -aa(lp6316 -g15 -aI648 -aI-909 -aI601 -aI-940 -aI627 -aI-926 -aa(lp6317 -g15 -aI696 -aI-848 -aI669 -aI-891 -aI685 -aI-871 -aa(lp6318 -g15 -aI712 -aI-775 -aI706 -aI-825 -aI712 -aI-801 -aa(lp6319 -g15 -aI699 -aI-702 -aI712 -aI-748 -aI708 -aI-724 -aa(lp6320 -g15 -aI662 -aI-642 -aI691 -aI-680 -aI679 -aI-660 -aa(lp6321 -g15 -aI599 -aI-590 -aI645 -aI-624 -aI624 -aI-606 -aa(lp6322 -g15 -aI509 -aI-542 -aI573 -aI-574 -aI543 -aI-558 -aa(lp6323 -g15 -aI518 -aI-532 -aI511 -aI-539 -aI514 -aI-535 -aa(lp6324 -g20 -aI707 -aI-334 -aa(lp6325 -g15 -aI718 -aI-425 -aI713 -aI-364 -aI717 -aI-395 -aa(lp6326 -g15 -aI721 -aI-508 -aI720 -aI-455 -aI721 -aI-483 -aa(lp6327 -g20 -aI721 -aI-567 -aa(lp6328 -g20 -aI1013 -aI-567 -aa(lp6329 -g20 -aI1013 -aI-496 -aa(lp6330 -g20 -aI992 -aI-496 -aa(lp6331 -g15 -aI948 -aI-494 -aI977 -aI-496 -aI962 -aI-496 -aa(lp6332 -g15 -aI909 -aI-482 -aI934 -aI-492 -aI921 -aI-488 -aa(lp6333 -g15 -aI877 -aI-454 -aI897 -aI-476 -aI886 -aI-466 -aa(lp6334 -g15 -aI854 -aI-406 -aI867 -aI-443 -aI860 -aI-426 -aa(lp6335 -g15 -aI830 -aI-327 -aI847 -aI-381 -aI839 -aI-355 -aa(lp6336 -g15 -aI796 -aI-242 -aI821 -aI-299 -aI809 -aI-271 -aa(lp6337 -g20 -aI929 -aI-103 -aa(lp6338 -g15 -aI975 -aI-77 -aI941 -aI-90 -aI957 -aI-81 -aa(lp6339 -g15 -aI1038 -aI-70 -aI993 -aI-72 -aI1014 -aI-70 -aa(lp6340 -g20 -aI1050 -aI-70 -aa(lp6341 -g20 -aI1050 -aI0 -aa(lp6342 -g10 -aa(lp6343 -g8 -aI258 -aI-263 -aa(lp6344 -g15 -aI271 -aI-189 -aI258 -aI-237 -aI262 -aI-212 -aa(lp6345 -g15 -aI306 -aI-130 -aI279 -aI-167 -aI291 -aI-147 -aa(lp6346 -g15 -aI362 -aI-90 -aI321 -aI-113 -aI340 -aI-100 -aa(lp6347 -g15 -aI434 -aI-75 -aI384 -aI-80 -aI408 -aI-75 -aa(lp6348 -g15 -aI554 -aI-98 -aI482 -aI-75 -aI522 -aI-83 -aa(lp6349 -g15 -aI636 -aI-161 -aI587 -aI-114 -aI614 -aI-134 -aa(lp6350 -g20 -aI350 -aI-465 -aa(lp6351 -g15 -aI305 -aI-422 -aI332 -aI-451 -aI316 -aI-437 -aa(lp6352 -g15 -aI276 -aI-374 -aI293 -aI-407 -aI283 -aI-391 -aa(lp6353 -g15 -aI262 -aI-322 -aI269 -aI-358 -aI264 -aI-340 -aa(lp6354 -g15 -aI258 -aI-263 -aI259 -aI-303 -aI258 -aI-284 -aa(lp6355 -g10 -aa(lp6356 -g8 -aI550 -aI-774 -aa(lp6357 -g15 -aI546 -aI-817 -aI550 -aI-789 -aI549 -aI-804 -aa(lp6358 -g15 -aI531 -aI-853 -aI543 -aI-831 -aI538 -aI-843 -aa(lp6359 -g15 -aI503 -aI-876 -aI524 -aI-863 -aI515 -aI-870 -aa(lp6360 -g15 -aI457 -aI-884 -aI491 -aI-882 -aI475 -aI-884 -aa(lp6361 -g15 -aI418 -aI-876 -aI442 -aI-884 -aI429 -aI-882 -aa(lp6362 -g15 -aI391 -aI-853 -aI407 -aI-870 -aI398 -aI-863 -aa(lp6363 -g15 -aI375 -aI-817 -aI384 -aI-843 -aI379 -aI-831 -aa(lp6364 -g15 -aI370 -aI-772 -aI372 -aI-803 -aI370 -aI-789 -aa(lp6365 -g15 -aI375 -aI-729 -aI370 -aI-757 -aI372 -aI-743 -aa(lp6366 -g15 -aI390 -aI-688 -aI379 -aI-715 -aI384 -aI-701 -aa(lp6367 -g15 -aI416 -aI-646 -aI397 -aI-674 -aI406 -aI-660 -aa(lp6368 -g15 -aI453 -aI-602 -aI427 -aI-632 -aI439 -aI-618 -aa(lp6369 -g15 -aI500 -aI-635 -aI471 -aI-612 -aI487 -aI-623 -aa(lp6370 -g15 -aI529 -aI-673 -aI512 -aI-647 -aI522 -aI-660 -aa(lp6371 -g15 -aI545 -aI-718 -aI537 -aI-687 -aI542 -aI-702 -aa(lp6372 -g15 -aI550 -aI-774 -aI549 -aI-735 -aI550 -aI-753 -aa(lp6373 -g10 -aa(lp6374 -g8 -aI1067 -aI0 -aa(lp6375 -g10 -aa(lp6376 -g8 -aI1067 -aI0 -aasV* -(lp6377 -(lp6378 -g8 -aI46 -aI-804 -aa(lp6379 -g20 -aI106 -aI-939 -aa(lp6380 -g20 -aI305 -aI-795 -aa(lp6381 -g20 -aI261 -aI-1012 -aa(lp6382 -g20 -aI410 -aI-1012 -aa(lp6383 -g20 -aI362 -aI-798 -aa(lp6384 -g20 -aI562 -aI-937 -aa(lp6385 -g20 -aI622 -aI-803 -aa(lp6386 -g20 -aI414 -aI-751 -aa(lp6387 -g20 -aI622 -aI-698 -aa(lp6388 -g20 -aI562 -aI-565 -aa(lp6389 -g20 -aI362 -aI-704 -aa(lp6390 -g20 -aI409 -aI-489 -aa(lp6391 -g20 -aI261 -aI-489 -aa(lp6392 -g20 -aI304 -aI-705 -aa(lp6393 -g20 -aI106 -aI-564 -aa(lp6394 -g20 -aI46 -aI-696 -aa(lp6395 -g20 -aI254 -aI-751 -aa(lp6396 -g10 -aa(lp6397 -g8 -aI669 -aI0 -aa(lp6398 -g10 -aa(lp6399 -g8 -aI669 -aI0 -aasV. -(lp6400 -(lp6401 -g8 -aI93 -aI-95 -aa(lp6402 -g15 -aI101 -aI-146 -aI93 -aI-115 -aI95 -aI-132 -aa(lp6403 -g15 -aI124 -aI-179 -aI107 -aI-160 -aI114 -aI-170 -aa(lp6404 -g15 -aI159 -aI-196 -aI134 -aI-187 -aI146 -aI-193 -aa(lp6405 -g15 -aI202 -aI-202 -aI172 -aI-200 -aI187 -aI-202 -aa(lp6406 -g15 -aI244 -aI-196 -aI217 -aI-202 -aI231 -aI-200 -aa(lp6407 -g15 -aI279 -aI-179 -aI257 -aI-193 -aI269 -aI-187 -aa(lp6408 -g15 -aI303 -aI-146 -aI289 -aI-170 -aI297 -aI-160 -aa(lp6409 -g15 -aI311 -aI-95 -aI308 -aI-132 -aI311 -aI-115 -aa(lp6410 -g15 -aI303 -aI-45 -aI311 -aI-75 -aI308 -aI-58 -aa(lp6411 -g15 -aI279 -aI-12 -aI297 -aI-31 -aI289 -aI-20 -aa(lp6412 -g15 -aI244 -aI5 -aI269 -aI-4 -aI257 -aI1 -aa(lp6413 -g15 -aI202 -aI10 -aI231 -aI9 -aI217 -aI10 -aa(lp6414 -g15 -aI159 -aI5 -aI187 -aI10 -aI172 -aI9 -aa(lp6415 -g15 -aI124 -aI-12 -aI146 -aI1 -aI134 -aI-4 -aa(lp6416 -g15 -aI101 -aI-45 -aI114 -aI-20 -aI107 -aI-31 -aa(lp6417 -g15 -aI93 -aI-95 -aI95 -aI-58 -aI93 -aI-75 -aa(lp6418 -g10 -aa(lp6419 -g8 -aI405 -aI0 -aa(lp6420 -g10 -aa(lp6421 -g8 -aI405 -aI0 -aasV2 -(lp6422 -(lp6423 -g8 -aI650 -aI-743 -aa(lp6424 -g15 -aI643 -aI-683 -aI650 -aI-722 -aI648 -aI-702 -aa(lp6425 -g15 -aI620 -aI-622 -aI638 -aI-663 -aI631 -aI-643 -aa(lp6426 -g15 -aI578 -aI-556 -aI610 -aI-601 -aI596 -aI-579 -aa(lp6427 -g15 -aI514 -aI-479 -aI561 -aI-533 -aI539 -aI-507 -aa(lp6428 -g15 -aI424 -aI-386 -aI488 -aI-451 -aI458 -aI-420 -aa(lp6429 -g15 -aI306 -aI-272 -aI390 -aI-353 -aI351 -aI-315 -aa(lp6430 -g20 -aI173 -aI-146 -aa(lp6431 -g20 -aI483 -aI-146 -aa(lp6432 -g15 -aI553 -aI-169 -aI511 -aI-146 -aI534 -aI-153 -aa(lp6433 -g15 -aI594 -aI-238 -aI573 -aI-185 -aI586 -aI-208 -aa(lp6434 -g20 -aI605 -aI-279 -aa(lp6435 -g20 -aI684 -aI-279 -aa(lp6436 -g20 -aI677 -aI0 -aa(lp6437 -g20 -aI46 -aI0 -aa(lp6438 -g20 -aI46 -aI-136 -aa(lp6439 -g20 -aI244 -aI-338 -aa(lp6440 -g15 -aI345 -aI-452 -aI285 -aI-380 -aI319 -aI-418 -aa(lp6441 -g15 -aI408 -aI-549 -aI372 -aI-485 -aI393 -aI-518 -aa(lp6442 -g15 -aI440 -aI-640 -aI423 -aI-579 -aI434 -aI-610 -aa(lp6443 -g15 -aI449 -aI-737 -aI446 -aI-670 -aI449 -aI-702 -aa(lp6444 -g15 -aI421 -aI-848 -aI449 -aI-787 -aI439 -aI-825 -aa(lp6445 -g15 -aI345 -aI-883 -aI403 -aI-871 -aI377 -aI-883 -aa(lp6446 -g15 -aI250 -aI-825 -aI299 -aI-883 -aI268 -aI-864 -aa(lp6447 -g15 -aI222 -aI-653 -aI231 -aI-786 -aI222 -aI-729 -aa(lp6448 -g15 -aI153 -aI-660 -aI197 -aI-653 -aI174 -aI-655 -aa(lp6449 -g15 -aI99 -aI-683 -aI132 -aI-665 -aI114 -aI-672 -aa(lp6450 -g15 -aI64 -aI-723 -aI84 -aI-693 -aI72 -aI-707 -aa(lp6451 -g15 -aI52 -aI-784 -aI56 -aI-740 -aI52 -aI-760 -aa(lp6452 -g15 -aI70 -aI-853 -aI52 -aI-809 -aI58 -aI-832 -aa(lp6453 -g15 -aI125 -aI-911 -aI83 -aI-875 -aI101 -aI-894 -aa(lp6454 -g15 -aI217 -aI-950 -aI149 -aI-927 -aI180 -aI-940 -aa(lp6455 -g15 -aI345 -aI-965 -aI253 -aI-960 -aI296 -aI-965 -aa(lp6456 -g15 -aI476 -aI-949 -aI394 -aI-965 -aI438 -aI-959 -aa(lp6457 -g15 -aI572 -aI-905 -aI514 -aI-939 -aI546 -aI-924 -aa(lp6458 -g15 -aI630 -aI-836 -aI598 -aI-886 -aI617 -aI-863 -aa(lp6459 -g15 -aI650 -aI-743 -aI643 -aI-808 -aI650 -aI-777 -aa(lp6460 -g10 -aa(lp6461 -g8 -aI745 -aI0 -aa(lp6462 -g10 -aa(lp6463 -g8 -aI745 -aI0 -aasV6 -(lp6464 -(lp6465 -g8 -aI427 -aI-886 -aa(lp6466 -g15 -aI357 -aI-862 -aI401 -aI-886 -aI378 -aI-878 -aa(lp6467 -g15 -aI302 -aI-794 -aI336 -aI-847 -aI317 -aI-824 -aa(lp6468 -g15 -aI265 -aI-684 -aI287 -aI-764 -aI274 -aI-727 -aa(lp6469 -g15 -aI248 -aI-534 -aI256 -aI-640 -aI250 -aI-590 -aa(lp6470 -g15 -aI279 -aI-551 -aI257 -aI-540 -aI267 -aI-546 -aa(lp6471 -g15 -aI319 -aI-567 -aI291 -aI-557 -aI304 -aI-563 -aa(lp6472 -g15 -aI370 -aI-579 -aI334 -aI-572 -aI351 -aI-576 -aa(lp6473 -g15 -aI432 -aI-583 -aI388 -aI-582 -aI409 -aI-583 -aa(lp6474 -g15 -aI541 -aI-564 -aI472 -aI-583 -aI509 -aI-577 -aa(lp6475 -g15 -aI625 -aI-510 -aI574 -aI-552 -aI602 -aI-533 -aa(lp6476 -g15 -aI679 -aI-423 -aI649 -aI-486 -aI667 -aI-457 -aa(lp6477 -g15 -aI698 -aI-307 -aI692 -aI-389 -aI698 -aI-350 -aa(lp6478 -g15 -aI679 -aI-176 -aI698 -aI-259 -aI692 -aI-216 -aa(lp6479 -g15 -aI620 -aI-75 -aI666 -aI-137 -aI646 -aI-103 -aa(lp6480 -g15 -aI524 -aI-9 -aI594 -aI-47 -aI562 -aI-25 -aa(lp6481 -g15 -aI390 -aI13 -aI486 -aI5 -aI441 -aI13 -aa(lp6482 -g15 -aI255 -aI-13 -aI341 -aI13 -aI296 -aI4 -aa(lp6483 -g15 -aI151 -aI-96 -aI214 -aI-31 -aI180 -aI-59 -aa(lp6484 -g15 -aI83 -aI-237 -aI122 -aI-133 -aI100 -aI-180 -aa(lp6485 -g15 -aI59 -aI-439 -aI67 -aI-294 -aI59 -aI-361 -aa(lp6486 -g15 -aI83 -aI-645 -aI59 -aI-513 -aI67 -aI-581 -aa(lp6487 -g15 -aI153 -aI-812 -aI98 -aI-709 -aI121 -aI-764 -aa(lp6488 -g15 -aI272 -aI-924 -aI184 -aI-859 -aI224 -aI-896 -aa(lp6489 -g15 -aI440 -aI-965 -aI319 -aI-951 -aI375 -aI-965 -aa(lp6490 -g15 -aI549 -aI-952 -aI483 -aI-965 -aI519 -aI-960 -aa(lp6491 -g15 -aI622 -aI-919 -aI579 -aI-944 -aI603 -aI-933 -aa(lp6492 -g15 -aI663 -aI-872 -aI641 -aI-906 -aI654 -aI-890 -aa(lp6493 -g15 -aI675 -aI-817 -aI671 -aI-855 -aI675 -aI-837 -aa(lp6494 -g15 -aI667 -aI-778 -aI675 -aI-804 -aI672 -aI-791 -aa(lp6495 -g15 -aI639 -aI-745 -aI661 -aI-766 -aI652 -aI-755 -aa(lp6496 -g15 -aI590 -aI-722 -aI627 -aI-736 -aI611 -aI-728 -aa(lp6497 -g15 -aI516 -aI-714 -aI570 -aI-717 -aI545 -aI-714 -aa(lp6498 -g15 -aI512 -aI-774 -aI516 -aI-734 -aI514 -aI-754 -aa(lp6499 -g15 -aI498 -aI-830 -aI509 -aI-795 -aI505 -aI-813 -aa(lp6500 -g15 -aI471 -aI-870 -aI492 -aI-846 -aI483 -aI-860 -aa(lp6501 -g15 -aI427 -aI-886 -aI460 -aI-881 -aI445 -aI-886 -aa(lp6502 -g10 -aa(lp6503 -g8 -aI382 -aI-502 -aa(lp6504 -g15 -aI344 -aI-496 -aI370 -aI-502 -aI357 -aI-500 -aa(lp6505 -g15 -aI305 -aI-481 -aI330 -aI-492 -aI318 -aI-488 -aa(lp6506 -g15 -aI271 -aI-461 -aI293 -aI-475 -aI282 -aI-469 -aa(lp6507 -g15 -aI248 -aI-438 -aI261 -aI-453 -aI253 -aI-446 -aa(lp6508 -g15 -aI260 -aI-273 -aI248 -aI-374 -aI252 -aI-319 -aa(lp6509 -g15 -aI291 -aI-160 -aI267 -aI-227 -aI278 -aI-189 -aa(lp6510 -g15 -aI337 -aI-95 -aI304 -aI-130 -aI319 -aI-109 -aa(lp6511 -g15 -aI394 -aI-74 -aI355 -aI-81 -aI374 -aI-74 -aa(lp6512 -g15 -aI475 -aI-126 -aI428 -aI-74 -aI455 -aI-91 -aa(lp6513 -g15 -aI505 -aI-294 -aI495 -aI-161 -aI505 -aI-217 -aa(lp6514 -g15 -aI472 -aI-452 -aI505 -aI-366 -aI494 -aI-419 -aa(lp6515 -g15 -aI382 -aI-502 -aI450 -aI-485 -aI421 -aI-502 -aa(lp6516 -g10 -aa(lp6517 -g8 -aI745 -aI0 -aa(lp6518 -g10 -aa(lp6519 -g8 -aI745 -aI0 -aasV: -(lp6520 -(lp6521 -g8 -aI93 -aI-95 -aa(lp6522 -g15 -aI101 -aI-146 -aI93 -aI-115 -aI95 -aI-132 -aa(lp6523 -g15 -aI124 -aI-179 -aI107 -aI-160 -aI114 -aI-170 -aa(lp6524 -g15 -aI159 -aI-196 -aI134 -aI-187 -aI146 -aI-193 -aa(lp6525 -g15 -aI202 -aI-202 -aI172 -aI-200 -aI187 -aI-202 -aa(lp6526 -g15 -aI244 -aI-196 -aI217 -aI-202 -aI231 -aI-200 -aa(lp6527 -g15 -aI279 -aI-179 -aI257 -aI-193 -aI269 -aI-187 -aa(lp6528 -g15 -aI303 -aI-146 -aI289 -aI-170 -aI297 -aI-160 -aa(lp6529 -g15 -aI311 -aI-95 -aI308 -aI-132 -aI311 -aI-115 -aa(lp6530 -g15 -aI303 -aI-45 -aI311 -aI-75 -aI308 -aI-58 -aa(lp6531 -g15 -aI279 -aI-12 -aI297 -aI-31 -aI289 -aI-20 -aa(lp6532 -g15 -aI244 -aI5 -aI269 -aI-4 -aI257 -aI1 -aa(lp6533 -g15 -aI202 -aI10 -aI231 -aI9 -aI217 -aI10 -aa(lp6534 -g15 -aI159 -aI5 -aI187 -aI10 -aI172 -aI9 -aa(lp6535 -g15 -aI124 -aI-12 -aI146 -aI1 -aI134 -aI-4 -aa(lp6536 -g15 -aI101 -aI-45 -aI114 -aI-20 -aI107 -aI-31 -aa(lp6537 -g15 -aI93 -aI-95 -aI95 -aI-58 -aI93 -aI-75 -aa(lp6538 -g10 -aa(lp6539 -g8 -aI93 -aI-619 -aa(lp6540 -g15 -aI101 -aI-670 -aI93 -aI-639 -aI95 -aI-656 -aa(lp6541 -g15 -aI124 -aI-703 -aI107 -aI-684 -aI114 -aI-695 -aa(lp6542 -g15 -aI159 -aI-720 -aI134 -aI-711 -aI146 -aI-717 -aa(lp6543 -g15 -aI202 -aI-726 -aI172 -aI-724 -aI187 -aI-726 -aa(lp6544 -g15 -aI244 -aI-720 -aI217 -aI-726 -aI231 -aI-724 -aa(lp6545 -g15 -aI279 -aI-703 -aI257 -aI-717 -aI269 -aI-711 -aa(lp6546 -g15 -aI303 -aI-670 -aI289 -aI-695 -aI297 -aI-684 -aa(lp6547 -g15 -aI311 -aI-619 -aI308 -aI-656 -aI311 -aI-639 -aa(lp6548 -g15 -aI303 -aI-568 -aI311 -aI-599 -aI308 -aI-582 -aa(lp6549 -g15 -aI279 -aI-536 -aI297 -aI-555 -aI289 -aI-544 -aa(lp6550 -g15 -aI244 -aI-518 -aI269 -aI-527 -aI257 -aI-521 -aa(lp6551 -g15 -aI202 -aI-512 -aI231 -aI-514 -aI217 -aI-512 -aa(lp6552 -g15 -aI159 -aI-518 -aI187 -aI-512 -aI172 -aI-514 -aa(lp6553 -g15 -aI124 -aI-536 -aI146 -aI-521 -aI134 -aI-527 -aa(lp6554 -g15 -aI101 -aI-568 -aI114 -aI-544 -aI107 -aI-555 -aa(lp6555 -g15 -aI93 -aI-619 -aI95 -aI-582 -aI93 -aI-599 -aa(lp6556 -g10 -aa(lp6557 -g8 -aI405 -aI0 -aa(lp6558 -g10 -aa(lp6559 -g8 -aI405 -aI0 -aasV> -(lp6560 -(lp6561 -g8 -aI86 -aI-138 -aa(lp6562 -g20 -aI86 -aI-243 -aa(lp6563 -g20 -aI516 -aI-475 -aa(lp6564 -g20 -aI86 -aI-710 -aa(lp6565 -g20 -aI86 -aI-815 -aa(lp6566 -g20 -aI658 -aI-503 -aa(lp6567 -g20 -aI658 -aI-448 -aa(lp6568 -g10 -aa(lp6569 -g8 -aI745 -aI0 -aa(lp6570 -g10 -aa(lp6571 -g8 -aI745 -aI0 -aasVB -(lp6572 -(lp6573 -g8 -aI807 -aI-709 -aa(lp6574 -g15 -aI795 -aI-632 -aI807 -aI-679 -aI803 -aI-653 -aa(lp6575 -g15 -aI761 -aI-575 -aI787 -aI-610 -aI776 -aI-591 -aa(lp6576 -g15 -aI708 -aI-534 -aI746 -aI-559 -aI729 -aI-545 -aa(lp6577 -g15 -aI639 -aI-506 -aI688 -aI-523 -aI665 -aI-513 -aa(lp6578 -g20 -aI639 -aI-499 -aa(lp6579 -g15 -aI724 -aI-467 -aI670 -aI-491 -aI698 -aI-480 -aa(lp6580 -g15 -aI790 -aI-417 -aI749 -aI-453 -aI771 -aI-436 -aa(lp6581 -g15 -aI833 -aI-348 -aI808 -aI-397 -aI822 -aI-374 -aa(lp6582 -g15 -aI848 -aI-260 -aI843 -aI-322 -aI848 -aI-293 -aa(lp6583 -g15 -aI752 -aI-64 -aI848 -aI-172 -aI816 -aI-107 -aa(lp6584 -g15 -aI466 -aI0 -aI688 -aI-21 -aI593 -aI0 -aa(lp6585 -g20 -aI37 -aI0 -aa(lp6586 -g20 -aI37 -aI-70 -aa(lp6587 -g20 -aI91 -aI-70 -aa(lp6588 -g15 -aI119 -aI-73 -aI101 -aI-70 -aI111 -aI-71 -aa(lp6589 -g15 -aI141 -aI-85 -aI127 -aI-75 -aI135 -aI-79 -aa(lp6590 -g15 -aI155 -aI-111 -aI147 -aI-91 -aI152 -aI-100 -aa(lp6591 -g15 -aI161 -aI-157 -aI159 -aI-122 -aI161 -aI-138 -aa(lp6592 -g20 -aI161 -aI-795 -aa(lp6593 -g15 -aI155 -aI-839 -aI161 -aI-813 -aI159 -aI-827 -aa(lp6594 -g15 -aI140 -aI-864 -aI152 -aI-850 -aI147 -aI-858 -aa(lp6595 -g15 -aI118 -aI-877 -aI134 -aI-870 -aI127 -aI-875 -aa(lp6596 -g15 -aI91 -aI-881 -aI110 -aI-879 -aI101 -aI-881 -aa(lp6597 -g20 -aI37 -aI-881 -aa(lp6598 -g20 -aI37 -aI-951 -aa(lp6599 -g20 -aI426 -aI-951 -aa(lp6600 -g15 -aI712 -aI-892 -aI553 -aI-951 -aI648 -aI-931 -aa(lp6601 -g15 -aI807 -aI-709 -aI776 -aI-853 -aI807 -aI-792 -aa(lp6602 -g10 -aa(lp6603 -g8 -aI371 -aI-80 -aa(lp6604 -g20 -aI460 -aI-80 -aa(lp6605 -g15 -aI535 -aI-90 -aI489 -aI-80 -aI514 -aI-84 -aa(lp6606 -g15 -aI586 -aI-122 -aI556 -aI-97 -aI573 -aI-107 -aa(lp6607 -g15 -aI614 -aI-179 -aI599 -aI-136 -aI609 -aI-155 -aa(lp6608 -g15 -aI623 -aI-265 -aI620 -aI-202 -aI623 -aI-231 -aa(lp6609 -g15 -aI615 -aI-350 -aI623 -aI-297 -aI621 -aI-326 -aa(lp6610 -g15 -aI589 -aI-409 -aI610 -aI-374 -aI601 -aI-394 -aa(lp6611 -g15 -aI539 -aI-444 -aI576 -aI-425 -aI560 -aI-437 -aa(lp6612 -g15 -aI462 -aI-456 -aI519 -aI-452 -aI493 -aI-456 -aa(lp6613 -g20 -aI371 -aI-456 -aa(lp6614 -g10 -aa(lp6615 -g8 -aI371 -aI-537 -aa(lp6616 -g20 -aI422 -aI-537 -aa(lp6617 -g15 -aI500 -aI-547 -aI453 -aI-537 -aI479 -aI-541 -aa(lp6618 -g15 -aI549 -aI-577 -aI520 -aI-554 -aI537 -aI-564 -aa(lp6619 -g15 -aI576 -aI-631 -aI562 -aI-591 -aI570 -aI-609 -aa(lp6620 -g15 -aI583 -aI-709 -aI581 -aI-652 -aI583 -aI-678 -aa(lp6621 -g15 -aI575 -aI-785 -aI583 -aI-739 -aI581 -aI-764 -aa(lp6622 -g15 -aI546 -aI-834 -aI569 -aI-805 -aI559 -aI-822 -aa(lp6623 -g15 -aI496 -aI-861 -aI533 -aI-847 -aI516 -aI-856 -aa(lp6624 -g15 -aI419 -aI-869 -aI475 -aI-867 -aI449 -aI-869 -aa(lp6625 -g20 -aI371 -aI-869 -aa(lp6626 -g10 -aa(lp6627 -g8 -aI895 -aI0 -aa(lp6628 -g10 -aa(lp6629 -g8 -aI895 -aI0 -aasVF -(lp6630 -(lp6631 -g8 -aI689 -aI-705 -aa(lp6632 -g20 -aI682 -aI-770 -aa(lp6633 -g15 -aI650 -aI-846 -aI678 -aI-805 -aI667 -aI-830 -aa(lp6634 -g15 -aI583 -aI-869 -aI633 -aI-862 -aI611 -aI-869 -aa(lp6635 -g20 -aI371 -aI-869 -aa(lp6636 -g20 -aI371 -aI-506 -aa(lp6637 -g20 -aI688 -aI-506 -aa(lp6638 -g20 -aI688 -aI-427 -aa(lp6639 -g20 -aI371 -aI-427 -aa(lp6640 -g20 -aI371 -aI-157 -aa(lp6641 -g15 -aI377 -aI-111 -aI371 -aI-138 -aI373 -aI-122 -aa(lp6642 -g15 -aI391 -aI-85 -aI380 -aI-100 -aI385 -aI-91 -aa(lp6643 -g15 -aI414 -aI-73 -aI398 -aI-79 -aI405 -aI-75 -aa(lp6644 -g15 -aI441 -aI-70 -aI422 -aI-71 -aI431 -aI-70 -aa(lp6645 -g20 -aI524 -aI-70 -aa(lp6646 -g20 -aI524 -aI0 -aa(lp6647 -g20 -aI37 -aI0 -aa(lp6648 -g20 -aI37 -aI-70 -aa(lp6649 -g20 -aI93 -aI-70 -aa(lp6650 -g15 -aI119 -aI-73 -aI102 -aI-70 -aI111 -aI-71 -aa(lp6651 -g15 -aI141 -aI-83 -aI128 -aI-74 -aI135 -aI-78 -aa(lp6652 -g15 -aI156 -aI-107 -aI147 -aI-89 -aI152 -aI-97 -aa(lp6653 -g15 -aI161 -aI-149 -aI159 -aI-118 -aI161 -aI-132 -aa(lp6654 -g20 -aI161 -aI-799 -aa(lp6655 -g15 -aI156 -aI-842 -aI161 -aI-817 -aI159 -aI-831 -aa(lp6656 -g15 -aI141 -aI-866 -aI152 -aI-852 -aI147 -aI-861 -aa(lp6657 -g15 -aI119 -aI-878 -aI135 -aI-872 -aI128 -aI-876 -aa(lp6658 -g15 -aI93 -aI-881 -aI111 -aI-880 -aI102 -aI-881 -aa(lp6659 -g20 -aI37 -aI-881 -aa(lp6660 -g20 -aI37 -aI-951 -aa(lp6661 -g20 -aI776 -aI-951 -aa(lp6662 -g20 -aI782 -aI-705 -aa(lp6663 -g10 -aa(lp6664 -g8 -aI828 -aI0 -aa(lp6665 -g10 -aa(lp6666 -g8 -aI828 -aI0 -aasVJ -(lp6667 -(lp6668 -g8 -aI475 -aI-881 -aa(lp6669 -g20 -aI419 -aI-881 -aa(lp6670 -g15 -aI392 -aI-878 -aI410 -aI-881 -aI401 -aI-880 -aa(lp6671 -g15 -aI371 -aI-866 -aI384 -aI-876 -aI377 -aI-872 -aa(lp6672 -g15 -aI356 -aI-840 -aI365 -aI-860 -aI360 -aI-851 -aa(lp6673 -g15 -aI350 -aI-794 -aI352 -aI-828 -aI350 -aI-813 -aa(lp6674 -g20 -aI350 -aI3 -aa(lp6675 -g15 -aI337 -aI110 -aI350 -aI43 -aI346 -aI79 -aa(lp6676 -g15 -aI299 -aI192 -aI328 -aI141 -aI315 -aI169 -aa(lp6677 -g15 -aI241 -aI252 -aI283 -aI216 -aI264 -aI236 -aa(lp6678 -g15 -aI168 -aI292 -aI219 -aI269 -aI195 -aI282 -aa(lp6679 -g15 -aI85 -aI313 -aI142 -aI302 -aI114 -aI309 -aa(lp6680 -g15 -aI-3 -aI320 -aI56 -aI318 -aI26 -aI320 -aa(lp6681 -g20 -aI-52 -aI320 -aa(lp6682 -g20 -aI-52 -aI243 -aa(lp6683 -g20 -aI-27 -aI243 -aa(lp6684 -g15 -aI34 -aI231 -aI-6 -aI243 -aI13 -aI239 -aa(lp6685 -g15 -aI87 -aI191 -aI54 -aI223 -aI72 -aI209 -aa(lp6686 -g15 -aI125 -aI117 -aI103 -aI172 -aI116 -aI147 -aa(lp6687 -g15 -aI139 -aI4 -aI135 -aI86 -aI139 -aI49 -aa(lp6688 -g20 -aI139 -aI-799 -aa(lp6689 -g15 -aI134 -aI-842 -aI139 -aI-817 -aI138 -aI-831 -aa(lp6690 -g15 -aI120 -aI-866 -aI131 -aI-852 -aI126 -aI-861 -aa(lp6691 -g15 -aI98 -aI-878 -aI113 -aI-872 -aI106 -aI-876 -aa(lp6692 -g15 -aI72 -aI-881 -aI90 -aI-880 -aI81 -aI-881 -aa(lp6693 -g20 -aI16 -aI-881 -aa(lp6694 -g20 -aI16 -aI-951 -aa(lp6695 -g20 -aI475 -aI-951 -aa(lp6696 -g10 -aa(lp6697 -g8 -aI490 -aI0 -aa(lp6698 -g10 -aa(lp6699 -g8 -aI490 -aI0 -aasVN -(lp6700 -(lp6701 -g8 -aI781 -aI0 -aa(lp6702 -g20 -aI261 -aI-733 -aa(lp6703 -g20 -aI261 -aI-157 -aa(lp6704 -g15 -aI266 -aI-111 -aI261 -aI-138 -aI262 -aI-122 -aa(lp6705 -g15 -aI281 -aI-85 -aI270 -aI-100 -aI275 -aI-91 -aa(lp6706 -g15 -aI303 -aI-73 -aI287 -aI-79 -aI294 -aI-75 -aa(lp6707 -g15 -aI329 -aI-70 -aI311 -aI-71 -aI320 -aI-70 -aa(lp6708 -g20 -aI385 -aI-70 -aa(lp6709 -g20 -aI385 -aI0 -aa(lp6710 -g20 -aI37 -aI0 -aa(lp6711 -g20 -aI37 -aI-70 -aa(lp6712 -g20 -aI93 -aI-70 -aa(lp6713 -g15 -aI119 -aI-73 -aI102 -aI-70 -aI111 -aI-71 -aa(lp6714 -g15 -aI141 -aI-85 -aI128 -aI-75 -aI135 -aI-79 -aa(lp6715 -g15 -aI156 -aI-111 -aI147 -aI-91 -aI152 -aI-100 -aa(lp6716 -g15 -aI161 -aI-157 -aI159 -aI-122 -aI161 -aI-138 -aa(lp6717 -g20 -aI161 -aI-799 -aa(lp6718 -g15 -aI155 -aI-842 -aI161 -aI-817 -aI159 -aI-831 -aa(lp6719 -g15 -aI140 -aI-866 -aI152 -aI-852 -aI147 -aI-861 -aa(lp6720 -g15 -aI119 -aI-878 -aI134 -aI-872 -aI127 -aI-876 -aa(lp6721 -g15 -aI93 -aI-881 -aI110 -aI-880 -aI102 -aI-881 -aa(lp6722 -g20 -aI37 -aI-881 -aa(lp6723 -g20 -aI37 -aI-951 -aa(lp6724 -g20 -aI333 -aI-951 -aa(lp6725 -g20 -aI804 -aI-286 -aa(lp6726 -g20 -aI804 -aI-799 -aa(lp6727 -g15 -aI798 -aI-842 -aI804 -aI-817 -aI802 -aI-831 -aa(lp6728 -g15 -aI783 -aI-866 -aI794 -aI-852 -aI789 -aI-861 -aa(lp6729 -g15 -aI761 -aI-878 -aI777 -aI-872 -aI769 -aI-876 -aa(lp6730 -g15 -aI735 -aI-881 -aI753 -aI-880 -aI744 -aI-881 -aa(lp6731 -g20 -aI679 -aI-881 -aa(lp6732 -g20 -aI679 -aI-951 -aa(lp6733 -g20 -aI1027 -aI-951 -aa(lp6734 -g20 -aI1027 -aI-881 -aa(lp6735 -g20 -aI972 -aI-881 -aa(lp6736 -g15 -aI945 -aI-878 -aI962 -aI-881 -aI954 -aI-880 -aa(lp6737 -g15 -aI924 -aI-866 -aI937 -aI-876 -aI930 -aI-872 -aa(lp6738 -g15 -aI909 -aI-840 -aI917 -aI-860 -aI912 -aI-851 -aa(lp6739 -g15 -aI904 -aI-794 -aI906 -aI-828 -aI904 -aI-813 -aa(lp6740 -g20 -aI904 -aI0 -aa(lp6741 -g10 -aa(lp6742 -g8 -aI1050 -aI0 -aa(lp6743 -g10 -aa(lp6744 -g8 -aI1050 -aI0 -aasVR -(lp6745 -(lp6746 -g8 -aI37 -aI-70 -aa(lp6747 -g20 -aI93 -aI-70 -aa(lp6748 -g15 -aI119 -aI-73 -aI102 -aI-70 -aI110 -aI-71 -aa(lp6749 -g15 -aI140 -aI-83 -aI127 -aI-74 -aI134 -aI-78 -aa(lp6750 -g15 -aI155 -aI-107 -aI147 -aI-89 -aI152 -aI-97 -aa(lp6751 -g15 -aI161 -aI-149 -aI159 -aI-118 -aI161 -aI-132 -aa(lp6752 -g20 -aI161 -aI-799 -aa(lp6753 -g15 -aI155 -aI-842 -aI161 -aI-817 -aI159 -aI-831 -aa(lp6754 -g15 -aI140 -aI-866 -aI152 -aI-852 -aI147 -aI-861 -aa(lp6755 -g15 -aI119 -aI-878 -aI134 -aI-872 -aI127 -aI-876 -aa(lp6756 -g15 -aI93 -aI-881 -aI110 -aI-880 -aI102 -aI-881 -aa(lp6757 -g20 -aI37 -aI-881 -aa(lp6758 -g20 -aI37 -aI-951 -aa(lp6759 -g20 -aI466 -aI-951 -aa(lp6760 -g15 -aI743 -aI-888 -aI592 -aI-951 -aI685 -aI-930 -aa(lp6761 -g15 -aI832 -aI-704 -aI802 -aI-846 -aI832 -aI-784 -aa(lp6762 -g15 -aI816 -aI-610 -aI832 -aI-669 -aI826 -aI-638 -aa(lp6763 -g15 -aI775 -aI-539 -aI805 -aI-583 -aI792 -aI-559 -aa(lp6764 -g15 -aI716 -aI-487 -aI757 -aI-518 -aI738 -aI-501 -aa(lp6765 -g15 -aI650 -aI-452 -aI695 -aI-473 -aI672 -aI-461 -aa(lp6766 -g20 -aI809 -aI-179 -aa(lp6767 -g15 -aI842 -aI-130 -aI820 -aI-160 -aI831 -aI-143 -aa(lp6768 -g15 -aI874 -aI-96 -aI852 -aI-116 -aI863 -aI-105 -aa(lp6769 -g15 -aI906 -aI-76 -aI884 -aI-87 -aI895 -aI-80 -aa(lp6770 -g15 -aI942 -aI-70 -aI918 -aI-72 -aI930 -aI-70 -aa(lp6771 -g20 -aI947 -aI-70 -aa(lp6772 -g20 -aI947 -aI0 -aa(lp6773 -g20 -aI904 -aI0 -aa(lp6774 -g15 -aI799 -aI-4 -aI864 -aI0 -aI829 -aI-1 -aa(lp6775 -g15 -aI721 -aI-22 -aI770 -aI-7 -aI744 -aI-13 -aa(lp6776 -g15 -aI663 -aI-58 -aI699 -aI-30 -aI680 -aI-43 -aa(lp6777 -g15 -aI618 -aI-119 -aI647 -aI-74 -aI632 -aI-94 -aa(lp6778 -g20 -aI460 -aI-412 -aa(lp6779 -g20 -aI371 -aI-412 -aa(lp6780 -g20 -aI371 -aI-149 -aa(lp6781 -g15 -aI377 -aI-107 -aI371 -aI-132 -aI373 -aI-118 -aa(lp6782 -g15 -aI392 -aI-83 -aI380 -aI-97 -aI385 -aI-89 -aa(lp6783 -g15 -aI414 -aI-73 -aI398 -aI-78 -aI405 -aI-74 -aa(lp6784 -g15 -aI440 -aI-70 -aI422 -aI-71 -aI430 -aI-70 -aa(lp6785 -g20 -aI497 -aI-70 -aa(lp6786 -g20 -aI497 -aI0 -aa(lp6787 -g20 -aI37 -aI0 -aa(lp6788 -g10 -aa(lp6789 -g8 -aI371 -aI-490 -aa(lp6790 -g20 -aI446 -aI-490 -aa(lp6791 -g15 -aI523 -aI-502 -aI477 -aI-490 -aI503 -aI-494 -aa(lp6792 -g15 -aI573 -aI-539 -aI544 -aI-511 -aI560 -aI-523 -aa(lp6793 -g15 -aI599 -aI-600 -aI585 -aI-555 -aI594 -aI-576 -aa(lp6794 -g15 -aI608 -aI-686 -aI605 -aI-625 -aI608 -aI-653 -aa(lp6795 -g15 -aI598 -aI-772 -aI608 -aI-720 -aI605 -aI-748 -aa(lp6796 -g15 -aI570 -aI-829 -aI592 -aI-795 -aI583 -aI-814 -aa(lp6797 -g15 -aI519 -aI-862 -aI557 -aI-844 -aI540 -aI-855 -aa(lp6798 -g15 -aI444 -aI-872 -aI498 -aI-869 -aI473 -aI-872 -aa(lp6799 -g20 -aI371 -aI-872 -aa(lp6800 -g10 -aa(lp6801 -g8 -aI942 -aI0 -aa(lp6802 -g10 -aa(lp6803 -g8 -aI942 -aI0 -aasVV -(lp6804 -(lp6805 -g8 -aI930 -aI-881 -aa(lp6806 -g20 -aI866 -aI-881 -aa(lp6807 -g15 -aI850 -aI-877 -aI860 -aI-881 -aI855 -aI-879 -aa(lp6808 -g15 -aI835 -aI-862 -aI845 -aI-874 -aI840 -aI-869 -aa(lp6809 -g15 -aI820 -aI-832 -aI831 -aI-855 -aI826 -aI-845 -aa(lp6810 -g15 -aI802 -aI-783 -aI815 -aI-820 -aI809 -aI-803 -aa(lp6811 -g20 -aI530 -aI0 -aa(lp6812 -g20 -aI397 -aI0 -aa(lp6813 -g20 -aI113 -aI-816 -aa(lp6814 -g15 -aI96 -aI-848 -aI108 -aI-829 -aI103 -aI-839 -aa(lp6815 -g15 -aI75 -aI-868 -aI89 -aI-856 -aI82 -aI-863 -aa(lp6816 -g15 -aI52 -aI-878 -aI67 -aI-872 -aI59 -aI-876 -aa(lp6817 -g15 -aI30 -aI-881 -aI44 -aI-880 -aI37 -aI-881 -aa(lp6818 -g20 -aI0 -aI-881 -aa(lp6819 -g20 -aI0 -aI-951 -aa(lp6820 -g20 -aI440 -aI-951 -aa(lp6821 -g20 -aI440 -aI-881 -aa(lp6822 -g20 -aI378 -aI-881 -aa(lp6823 -g15 -aI360 -aI-878 -aI372 -aI-881 -aI366 -aI-880 -aa(lp6824 -g15 -aI343 -aI-871 -aI353 -aI-877 -aI348 -aI-874 -aa(lp6825 -g15 -aI331 -aI-857 -aI338 -aI-867 -aI334 -aI-863 -aa(lp6826 -g15 -aI326 -aI-836 -aI328 -aI-851 -aI326 -aI-845 -aa(lp6827 -g15 -aI330 -aI-807 -aI326 -aI-828 -aI328 -aI-818 -aa(lp6828 -g15 -aI338 -aI-779 -aI333 -aI-796 -aI335 -aI-786 -aa(lp6829 -g20 -aI474 -aI-368 -aa(lp6830 -g15 -aI485 -aI-333 -aI478 -aI-358 -aI481 -aI-346 -aa(lp6831 -g15 -aI496 -aI-291 -aI489 -aI-320 -aI492 -aI-305 -aa(lp6832 -g15 -aI505 -aI-247 -aI499 -aI-276 -aI502 -aI-261 -aa(lp6833 -g15 -aI511 -aI-207 -aI508 -aI-232 -aI510 -aI-219 -aa(lp6834 -g15 -aI518 -aI-237 -aI513 -aI-214 -aI515 -aI-224 -aa(lp6835 -g15 -aI529 -aI-279 -aI521 -aI-250 -aI525 -aI-264 -aa(lp6836 -g15 -aI543 -aI-324 -aI534 -aI-294 -aI538 -aI-309 -aa(lp6837 -g15 -aI555 -aI-364 -aI547 -aI-339 -aI552 -aI-352 -aa(lp6838 -g20 -aI693 -aI-770 -aa(lp6839 -g15 -aI698 -aI-786 -aI695 -aI-775 -aI696 -aI-780 -aa(lp6840 -g15 -aI704 -aI-804 -aI700 -aI-792 -aI702 -aI-798 -aa(lp6841 -g15 -aI708 -aI-821 -aI705 -aI-810 -aI706 -aI-816 -aa(lp6842 -g15 -aI709 -aI-835 -aI709 -aI-827 -aI709 -aI-832 -aa(lp6843 -g15 -aI694 -aI-869 -aI709 -aI-850 -aI704 -aI-861 -aa(lp6844 -g15 -aI656 -aI-881 -aI685 -aI-877 -aI672 -aI-881 -aa(lp6845 -g20 -aI586 -aI-881 -aa(lp6846 -g20 -aI586 -aI-951 -aa(lp6847 -g20 -aI930 -aI-951 -aa(lp6848 -g10 -aa(lp6849 -g8 -aI930 -aI0 -aa(lp6850 -g10 -aa(lp6851 -g8 -aI930 -aI0 -aasVZ -(lp6852 -(lp6853 -g8 -aI800 -aI-883 -aa(lp6854 -g20 -aI298 -aI-80 -aa(lp6855 -g20 -aI586 -aI-80 -aa(lp6856 -g15 -aI653 -aI-92 -aI613 -aI-80 -aI636 -aI-84 -aa(lp6857 -g15 -aI694 -aI-122 -aI671 -aI-99 -aI684 -aI-110 -aa(lp6858 -g15 -aI717 -aI-165 -aI705 -aI-135 -aI712 -aI-149 -aa(lp6859 -g15 -aI726 -aI-214 -aI721 -aI-181 -aI724 -aI-197 -aa(lp6860 -g20 -aI733 -aI-274 -aa(lp6861 -g20 -aI829 -aI-274 -aa(lp6862 -g20 -aI822 -aI0 -aa(lp6863 -g20 -aI55 -aI0 -aa(lp6864 -g20 -aI55 -aI-65 -aa(lp6865 -g20 -aI555 -aI-869 -aa(lp6866 -g20 -aI293 -aI-869 -aa(lp6867 -g15 -aI242 -aI-861 -aI272 -aI-869 -aI255 -aI-867 -aa(lp6868 -g15 -aI209 -aI-837 -aI228 -aI-855 -aI217 -aI-847 -aa(lp6869 -g15 -aI192 -aI-798 -aI201 -aI-826 -aI196 -aI-813 -aa(lp6870 -g15 -aI184 -aI-748 -aI188 -aI-783 -aI185 -aI-767 -aa(lp6871 -g20 -aI177 -aI-676 -aa(lp6872 -g20 -aI81 -aI-676 -aa(lp6873 -g20 -aI87 -aI-951 -aa(lp6874 -g20 -aI800 -aI-951 -aa(lp6875 -g10 -aa(lp6876 -g8 -aI888 -aI0 -aa(lp6877 -g10 -aa(lp6878 -g8 -aI888 -aI0 -aasV^ -(lp6879 -(lp6880 -g8 -aI342 -aI-951 -aa(lp6881 -g20 -aI399 -aI-951 -aa(lp6882 -g20 -aI682 -aI-349 -aa(lp6883 -g20 -aI578 -aI-349 -aa(lp6884 -g20 -aI370 -aI-806 -aa(lp6885 -g20 -aI165 -aI-349 -aa(lp6886 -g20 -aI61 -aI-349 -aa(lp6887 -g10 -aa(lp6888 -g8 -aI745 -aI0 -aa(lp6889 -g10 -aa(lp6890 -g8 -aI745 -aI0 -aasVb -(lp6891 -(lp6892 -g8 -aI802 -aI-359 -aa(lp6893 -g15 -aI784 -aI-192 -aI802 -aI-294 -aI796 -aI-239 -aa(lp6894 -g15 -aI732 -aI-76 -aI772 -aI-145 -aI755 -aI-106 -aa(lp6895 -g15 -aI646 -aI-8 -aI709 -aI-45 -aI680 -aI-22 -aa(lp6896 -g15 -aI529 -aI13 -aI612 -aI6 -aI573 -aI13 -aa(lp6897 -g15 -aI459 -aI5 -aI503 -aI13 -aI480 -aI10 -aa(lp6898 -g15 -aI403 -aI-19 -aI438 -aI0 -aI420 -aI-8 -aa(lp6899 -g15 -aI359 -aI-56 -aI386 -aI-29 -aI371 -aI-41 -aa(lp6900 -g15 -aI325 -aI-103 -aI346 -aI-70 -aI335 -aI-86 -aa(lp6901 -g20 -aI313 -aI-103 -aa(lp6902 -g20 -aI276 -aI0 -aa(lp6903 -g20 -aI22 -aI0 -aa(lp6904 -g20 -aI22 -aI-70 -aa(lp6905 -g20 -aI31 -aI-70 -aa(lp6906 -g15 -aI69 -aI-73 -aI44 -aI-70 -aI56 -aI-71 -aa(lp6907 -g15 -aI101 -aI-86 -aI81 -aI-75 -aI92 -aI-80 -aa(lp6908 -g15 -aI124 -aI-114 -aI111 -aI-93 -aI118 -aI-102 -aa(lp6909 -g15 -aI133 -aI-163 -aI130 -aI-126 -aI133 -aI-143 -aa(lp6910 -g20 -aI133 -aI-853 -aa(lp6911 -g15 -aI125 -aI-898 -aI133 -aI-872 -aI130 -aI-887 -aa(lp6912 -g15 -aI102 -aI-925 -aI119 -aI-910 -aI111 -aI-919 -aa(lp6913 -g15 -aI68 -aI-939 -aI92 -aI-932 -aI81 -aI-936 -aa(lp6914 -g15 -aI27 -aI-942 -aI55 -aI-941 -aI42 -aI-942 -aa(lp6915 -g20 -aI22 -aI-942 -aa(lp6916 -g20 -aI22 -aI-1012 -aa(lp6917 -g20 -aI335 -aI-1012 -aa(lp6918 -g20 -aI335 -aI-784 -aa(lp6919 -g15 -aI334 -aI-735 -aI335 -aI-770 -aI335 -aI-754 -aa(lp6920 -g15 -aI330 -aI-683 -aI333 -aI-717 -aI332 -aI-699 -aa(lp6921 -g15 -aI325 -aI-623 -aI328 -aI-663 -aI327 -aI-643 -aa(lp6922 -g20 -aI334 -aI-623 -aa(lp6923 -g15 -aI411 -aI-701 -aI353 -aI-656 -aI379 -aI-682 -aa(lp6924 -g15 -aI534 -aI-730 -aI443 -aI-720 -aI484 -aI-730 -aa(lp6925 -g15 -aI649 -aI-708 -aI577 -aI-730 -aI616 -aI-722 -aa(lp6926 -g15 -aI733 -aI-641 -aI682 -aI-693 -aI710 -aI-671 -aa(lp6927 -g15 -aI785 -aI-525 -aI756 -aI-610 -aI773 -aI-572 -aa(lp6928 -g15 -aI802 -aI-359 -aI796 -aI-479 -aI802 -aI-423 -aa(lp6929 -g10 -aa(lp6930 -g8 -aI472 -aI-631 -aa(lp6931 -g15 -aI406 -aI-615 -aI445 -aI-631 -aI423 -aI-626 -aa(lp6932 -g15 -aI364 -aI-564 -aI388 -aI-604 -aI375 -aI-587 -aa(lp6933 -g15 -aI342 -aI-479 -aI354 -aI-542 -aI346 -aI-513 -aa(lp6934 -g15 -aI335 -aI-359 -aI338 -aI-445 -aI335 -aI-405 -aa(lp6935 -g15 -aI342 -aI-242 -aI335 -aI-315 -aI338 -aI-276 -aa(lp6936 -g15 -aI364 -aI-156 -aI346 -aI-208 -aI354 -aI-179 -aa(lp6937 -g15 -aI406 -aI-104 -aI375 -aI-133 -aI389 -aI-115 -aa(lp6938 -g15 -aI473 -aI-86 -aI424 -aI-92 -aI446 -aI-86 -aa(lp6939 -g15 -aI568 -aI-157 -aI517 -aI-86 -aI548 -aI-109 -aa(lp6940 -g15 -aI597 -aI-360 -aI587 -aI-204 -aI597 -aI-272 -aa(lp6941 -g15 -aI568 -aI-564 -aI597 -aI-451 -aI587 -aI-519 -aa(lp6942 -g15 -aI472 -aI-631 -aI548 -aI-609 -aI516 -aI-631 -aa(lp6943 -g10 -aa(lp6944 -g8 -aI865 -aI0 -aa(lp6945 -g10 -aa(lp6946 -g8 -aI865 -aI0 -aasVf -(lp6947 -(lp6948 -g8 -aI25 -aI0 -aa(lp6949 -g20 -aI25 -aI-70 -aa(lp6950 -g20 -aI54 -aI-70 -aa(lp6951 -g15 -aI85 -aI-73 -aI64 -aI-70 -aI74 -aI-71 -aa(lp6952 -g15 -aI116 -aI-85 -aI96 -aI-75 -aI106 -aI-79 -aa(lp6953 -g15 -aI139 -aI-111 -aI125 -aI-91 -aI133 -aI-100 -aa(lp6954 -g15 -aI149 -aI-157 -aI145 -aI-122 -aI149 -aI-138 -aa(lp6955 -g20 -aI149 -aI-623 -aa(lp6956 -g20 -aI30 -aI-623 -aa(lp6957 -g20 -aI30 -aI-714 -aa(lp6958 -g20 -aI149 -aI-714 -aa(lp6959 -g20 -aI149 -aI-763 -aa(lp6960 -g15 -aI165 -aI-874 -aI149 -aI-805 -aI154 -aI-841 -aa(lp6961 -g15 -aI214 -aI-956 -aI175 -aI-906 -aI192 -aI-933 -aa(lp6962 -g15 -aI299 -aI-1007 -aI236 -aI-978 -aI265 -aI-995 -aa(lp6963 -g15 -aI421 -aI-1024 -aI333 -aI-1019 -aI374 -aI-1024 -aa(lp6964 -g15 -aI528 -aI-1017 -aI464 -aI-1024 -aI499 -aI-1022 -aa(lp6965 -g15 -aI597 -aI-996 -aI557 -aI-1012 -aI580 -aI-1005 -aa(lp6966 -g15 -aI633 -aI-965 -aI613 -aI-987 -aI625 -aI-977 -aa(lp6967 -g15 -aI643 -aI-927 -aI640 -aI-953 -aI643 -aI-941 -aa(lp6968 -g15 -aI603 -aI-861 -aI643 -aI-897 -aI630 -aI-875 -aa(lp6969 -g15 -aI479 -aI-840 -aI576 -aI-847 -aI534 -aI-840 -aa(lp6970 -g15 -aI476 -aI-875 -aI479 -aI-851 -aI478 -aI-863 -aa(lp6971 -g15 -aI465 -aI-911 -aI474 -aI-888 -aI470 -aI-900 -aa(lp6972 -g15 -aI444 -aI-938 -aI460 -aI-921 -aI453 -aI-930 -aa(lp6973 -g15 -aI413 -aI-948 -aI436 -aI-945 -aI425 -aI-948 -aa(lp6974 -g15 -aI385 -aI-939 -aI402 -aI-948 -aI393 -aI-945 -aa(lp6975 -g15 -aI366 -aI-911 -aI377 -aI-934 -aI371 -aI-924 -aa(lp6976 -g15 -aI355 -aI-862 -aI361 -aI-899 -aI357 -aI-882 -aa(lp6977 -g15 -aI352 -aI-787 -aI353 -aI-841 -aI352 -aI-816 -aa(lp6978 -g20 -aI352 -aI-714 -aa(lp6979 -g20 -aI535 -aI-714 -aa(lp6980 -g20 -aI535 -aI-623 -aa(lp6981 -g20 -aI352 -aI-623 -aa(lp6982 -g20 -aI352 -aI-157 -aa(lp6983 -g15 -aI361 -aI-111 -aI352 -aI-138 -aI355 -aI-122 -aa(lp6984 -g15 -aI385 -aI-85 -aI367 -aI-100 -aI375 -aI-91 -aa(lp6985 -g15 -aI415 -aI-73 -aI394 -aI-79 -aI404 -aI-75 -aa(lp6986 -g15 -aI446 -aI-70 -aI426 -aI-71 -aI437 -aI-70 -aa(lp6987 -g20 -aI509 -aI-70 -aa(lp6988 -g20 -aI509 -aI0 -aa(lp6989 -g10 -aa(lp6990 -g8 -aI542 -aI0 -aa(lp6991 -g10 -aa(lp6992 -g8 -aI542 -aI0 -aasVj -(lp6993 -(lp6994 -g8 -aI335 -aI-714 -aa(lp6995 -g20 -aI335 -aI10 -aa(lp6996 -g15 -aI310 -aI160 -aI335 -aI70 -aI327 -aI120 -aa(lp6997 -g15 -aI241 -aI255 -aI294 -aI199 -aI270 -aI231 -aa(lp6998 -g15 -aI135 -aI305 -aI211 -aI278 -aI176 -aI295 -aa(lp6999 -g15 -aI0 -aI320 -aI94 -aI315 -aI49 -aI320 -aa(lp7000 -g20 -aI-26 -aI320 -aa(lp7001 -g20 -aI-26 -aI238 -aa(lp7002 -g20 -aI-17 -aI238 -aa(lp7003 -g15 -aI47 -aI226 -aI6 -aI238 -aI28 -aI234 -aa(lp7004 -g15 -aI94 -aI187 -aI66 -aI218 -aI81 -aI205 -aa(lp7005 -g15 -aI123 -aI114 -aI107 -aI169 -aI117 -aI144 -aa(lp7006 -g15 -aI133 -aI0 -aI130 -aI84 -aI133 -aI46 -aa(lp7007 -g20 -aI133 -aI-555 -aa(lp7008 -g15 -aI125 -aI-601 -aI133 -aI-574 -aI130 -aI-589 -aa(lp7009 -g15 -aI101 -aI-628 -aI119 -aI-612 -aI111 -aI-621 -aa(lp7010 -g15 -aI67 -aI-640 -aI92 -aI-634 -aI80 -aI-638 -aa(lp7011 -g15 -aI26 -aI-643 -aI54 -aI-642 -aI41 -aI-643 -aa(lp7012 -g20 -aI22 -aI-643 -aa(lp7013 -g20 -aI22 -aI-714 -aa(lp7014 -g10 -aa(lp7015 -g8 -aI115 -aI-930 -aa(lp7016 -g15 -aI124 -aI-974 -aI115 -aI-947 -aI118 -aI-962 -aa(lp7017 -g15 -aI148 -aI-1003 -aI130 -aI-986 -aI138 -aI-996 -aa(lp7018 -g15 -aI184 -aI-1020 -aI158 -aI-1011 -aI170 -aI-1017 -aa(lp7019 -g15 -aI229 -aI-1026 -aI198 -aI-1024 -aI213 -aI-1026 -aa(lp7020 -g15 -aI272 -aI-1020 -aI244 -aI-1026 -aI258 -aI-1024 -aa(lp7021 -g15 -aI309 -aI-1003 -aI286 -aI-1017 -aI298 -aI-1011 -aa(lp7022 -g15 -aI334 -aI-974 -aI319 -aI-996 -aI328 -aI-986 -aa(lp7023 -g15 -aI343 -aI-930 -aI340 -aI-962 -aI343 -aI-947 -aa(lp7024 -g15 -aI334 -aI-887 -aI343 -aI-914 -aI340 -aI-899 -aa(lp7025 -g15 -aI309 -aI-857 -aI328 -aI-875 -aI319 -aI-865 -aa(lp7026 -g15 -aI272 -aI-840 -aI298 -aI-849 -aI286 -aI-843 -aa(lp7027 -g15 -aI229 -aI-834 -aI258 -aI-836 -aI244 -aI-834 -aa(lp7028 -g15 -aI184 -aI-840 -aI213 -aI-834 -aI198 -aI-836 -aa(lp7029 -g15 -aI148 -aI-857 -aI170 -aI-843 -aI158 -aI-849 -aa(lp7030 -g15 -aI124 -aI-887 -aI138 -aI-865 -aI130 -aI-875 -aa(lp7031 -g15 -aI115 -aI-930 -aI118 -aI-899 -aI115 -aI-914 -aa(lp7032 -g10 -aa(lp7033 -g8 -aI460 -aI0 -aa(lp7034 -g10 -aa(lp7035 -g8 -aI460 -aI0 -aasVn -(lp7036 -(lp7037 -g8 -aI558 -aI0 -aa(lp7038 -g20 -aI558 -aI-438 -aa(lp7039 -g15 -aI553 -aI-514 -aI558 -aI-466 -aI556 -aI-492 -aa(lp7040 -g15 -aI534 -aI-571 -aI549 -aI-537 -aI543 -aI-555 -aa(lp7041 -g15 -aI501 -aI-605 -aI526 -aI-586 -aI515 -aI-597 -aa(lp7042 -g15 -aI451 -aI-618 -aI487 -aI-614 -aI471 -aI-618 -aa(lp7043 -g15 -aI396 -aI-601 -aI429 -aI-618 -aI411 -aI-612 -aa(lp7044 -g15 -aI361 -aI-555 -aI381 -aI-589 -aI369 -aI-574 -aa(lp7045 -g15 -aI341 -aI-490 -aI352 -aI-536 -aI345 -aI-515 -aa(lp7046 -g15 -aI335 -aI-411 -aI337 -aI-465 -aI335 -aI-439 -aa(lp7047 -g20 -aI335 -aI-157 -aa(lp7048 -g15 -aI342 -aI-112 -aI335 -aI-138 -aI338 -aI-123 -aa(lp7049 -g15 -aI361 -aI-85 -aI347 -aI-100 -aI353 -aI-92 -aa(lp7050 -g15 -aI392 -aI-73 -aI370 -aI-79 -aI380 -aI-75 -aa(lp7051 -g15 -aI432 -aI-70 -aI404 -aI-71 -aI417 -aI-70 -aa(lp7052 -g20 -aI436 -aI-70 -aa(lp7053 -g20 -aI436 -aI0 -aa(lp7054 -g20 -aI26 -aI0 -aa(lp7055 -g20 -aI26 -aI-70 -aa(lp7056 -g20 -aI29 -aI-70 -aa(lp7057 -g15 -aI70 -aI-73 -aI44 -aI-70 -aI58 -aI-71 -aa(lp7058 -g15 -aI103 -aI-86 -aI83 -aI-75 -aI94 -aI-79 -aa(lp7059 -g15 -aI125 -aI-114 -aI113 -aI-92 -aI120 -aI-101 -aa(lp7060 -g15 -aI133 -aI-162 -aI130 -aI-126 -aI133 -aI-142 -aa(lp7061 -g20 -aI133 -aI-556 -aa(lp7062 -g15 -aI126 -aI-601 -aI133 -aI-575 -aI131 -aI-590 -aa(lp7063 -g15 -aI107 -aI-628 -aI122 -aI-613 -aI115 -aI-621 -aa(lp7064 -g15 -aI76 -aI-640 -aI98 -aI-634 -aI88 -aI-638 -aa(lp7065 -g15 -aI37 -aI-643 -aI65 -aI-642 -aI51 -aI-643 -aa(lp7066 -g20 -aI33 -aI-643 -aa(lp7067 -g20 -aI33 -aI-714 -aa(lp7068 -g20 -aI313 -aI-714 -aa(lp7069 -g20 -aI330 -aI-619 -aa(lp7070 -g20 -aI337 -aI-619 -aa(lp7071 -g15 -aI379 -aI-679 -aI350 -aI-644 -aI364 -aI-664 -aa(lp7072 -g15 -aI427 -aI-713 -aI394 -aI-693 -aI410 -aI-705 -aa(lp7073 -g15 -aI481 -aI-728 -aI444 -aI-720 -aI462 -aI-725 -aa(lp7074 -g15 -aI541 -aI-731 -aI500 -aI-730 -aI520 -aI-731 -aa(lp7075 -g15 -aI633 -aI-716 -aI575 -aI-731 -aI606 -aI-726 -aa(lp7076 -g15 -aI702 -aI-670 -aI660 -aI-706 -aI683 -aI-690 -aa(lp7077 -g15 -aI746 -aI-590 -aI721 -aI-649 -aI736 -aI-622 -aa(lp7078 -g15 -aI761 -aI-474 -aI756 -aI-558 -aI761 -aI-519 -aa(lp7079 -g20 -aI761 -aI-164 -aa(lp7080 -g15 -aI766 -aI-115 -aI761 -aI-144 -aI762 -aI-127 -aa(lp7081 -g15 -aI783 -aI-86 -aI770 -aI-102 -aI775 -aI-93 -aa(lp7082 -g15 -aI811 -aI-73 -aI790 -aI-80 -aI799 -aI-75 -aa(lp7083 -g15 -aI850 -aI-70 -aI822 -aI-71 -aI835 -aI-70 -aa(lp7084 -g20 -aI854 -aI-70 -aa(lp7085 -g20 -aI854 -aI0 -aa(lp7086 -g10 -aa(lp7087 -g8 -aI889 -aI0 -aa(lp7088 -g10 -aa(lp7089 -g8 -aI889 -aI0 -aasVr -(lp7090 -(lp7091 -g8 -aI472 -aI0 -aa(lp7092 -g20 -aI26 -aI0 -aa(lp7093 -g20 -aI26 -aI-70 -aa(lp7094 -g20 -aI30 -aI-70 -aa(lp7095 -g15 -aI72 -aI-73 -aI45 -aI-70 -aI59 -aI-71 -aa(lp7096 -g15 -aI104 -aI-87 -aI84 -aI-75 -aI95 -aI-80 -aa(lp7097 -g15 -aI125 -aI-116 -aI113 -aI-93 -aI120 -aI-103 -aa(lp7098 -g15 -aI133 -aI-166 -aI130 -aI-128 -aI133 -aI-145 -aa(lp7099 -g20 -aI133 -aI-552 -aa(lp7100 -g15 -aI126 -aI-600 -aI133 -aI-572 -aI131 -aI-588 -aa(lp7101 -g15 -aI107 -aI-627 -aI122 -aI-612 -aI115 -aI-621 -aa(lp7102 -g15 -aI76 -aI-640 -aI98 -aI-634 -aI88 -aI-638 -aa(lp7103 -g15 -aI37 -aI-643 -aI65 -aI-642 -aI51 -aI-643 -aa(lp7104 -g20 -aI33 -aI-643 -aa(lp7105 -g20 -aI33 -aI-714 -aa(lp7106 -g20 -aI302 -aI-714 -aa(lp7107 -g20 -aI329 -aI-610 -aa(lp7108 -g20 -aI335 -aI-610 -aa(lp7109 -g15 -aI364 -aI-662 -aI344 -aI-630 -aI354 -aI-647 -aa(lp7110 -g15 -aI402 -aI-700 -aI375 -aI-677 -aI387 -aI-690 -aa(lp7111 -g15 -aI453 -aI-722 -aI416 -aI-710 -aI433 -aI-717 -aa(lp7112 -g15 -aI524 -aI-730 -aI473 -aI-727 -aI496 -aI-730 -aa(lp7113 -g15 -aI639 -aI-702 -aI576 -aI-730 -aI615 -aI-720 -aa(lp7114 -g15 -aI677 -aI-621 -aI664 -aI-683 -aI677 -aI-657 -aa(lp7115 -g15 -aI632 -aI-526 -aI677 -aI-581 -aI662 -aI-549 -aa(lp7116 -g15 -aI507 -aI-493 -aI603 -aI-504 -aI561 -aI-493 -aa(lp7117 -g15 -aI504 -aI-541 -aI507 -aI-511 -aI506 -aI-527 -aa(lp7118 -g15 -aI494 -aI-575 -aI502 -aI-555 -aI499 -aI-566 -aa(lp7119 -g15 -aI474 -aI-596 -aI489 -aI-584 -aI482 -aI-591 -aa(lp7120 -g15 -aI442 -aI-603 -aI465 -aI-601 -aI455 -aI-603 -aa(lp7121 -g15 -aI402 -aI-591 -aI427 -aI-603 -aI413 -aI-599 -aa(lp7122 -g15 -aI373 -aI-561 -aI391 -aI-584 -aI381 -aI-574 -aa(lp7123 -g15 -aI354 -aI-519 -aI365 -aI-549 -aI359 -aI-535 -aa(lp7124 -g15 -aI342 -aI-472 -aI349 -aI-504 -aI345 -aI-488 -aa(lp7125 -g15 -aI337 -aI-427 -aI339 -aI-456 -aI338 -aI-441 -aa(lp7126 -g15 -aI335 -aI-390 -aI336 -aI-412 -aI335 -aI-400 -aa(lp7127 -g20 -aI335 -aI-159 -aa(lp7128 -g15 -aI343 -aI-112 -aI335 -aI-140 -aI338 -aI-124 -aa(lp7129 -g15 -aI362 -aI-85 -aI347 -aI-100 -aI354 -aI-91 -aa(lp7130 -g15 -aI392 -aI-73 -aI370 -aI-79 -aI380 -aI-75 -aa(lp7131 -g15 -aI429 -aI-70 -aI403 -aI-71 -aI416 -aI-70 -aa(lp7132 -g20 -aI472 -aI-70 -aa(lp7133 -g10 -aa(lp7134 -g8 -aI697 -aI0 -aa(lp7135 -g10 -aa(lp7136 -g8 -aI697 -aI0 -aasVv -(lp7137 -(lp7138 -g8 -aI807 -aI-643 -aa(lp7139 -g20 -aI781 -aI-643 -aa(lp7140 -g15 -aI756 -aI-640 -aI772 -aI-643 -aI763 -aI-642 -aa(lp7141 -g15 -aI736 -aI-626 -aI749 -aI-638 -aI742 -aI-633 -aa(lp7142 -g15 -aI716 -aI-597 -aI729 -aI-620 -aI722 -aI-610 -aa(lp7143 -g15 -aI694 -aI-546 -aI709 -aI-584 -aI702 -aI-567 -aa(lp7144 -g20 -aI501 -aI0 -aa(lp7145 -g20 -aI325 -aI0 -aa(lp7146 -g20 -aI106 -aI-579 -aa(lp7147 -g15 -aI90 -aI-610 -aI101 -aI-592 -aI96 -aI-602 -aa(lp7148 -g15 -aI68 -aI-630 -aI83 -aI-619 -aI76 -aI-625 -aa(lp7149 -g15 -aI38 -aI-640 -aI59 -aI-635 -aI49 -aI-638 -aa(lp7150 -g15 -aI0 -aI-643 -aI27 -aI-642 -aI14 -aI-643 -aa(lp7151 -g20 -aI0 -aI-714 -aa(lp7152 -g20 -aI413 -aI-714 -aa(lp7153 -g20 -aI413 -aI-643 -aa(lp7154 -g20 -aI357 -aI-643 -aa(lp7155 -g15 -aI325 -aI-632 -aI343 -aI-643 -aI333 -aI-639 -aa(lp7156 -g15 -aI313 -aI-601 -aI317 -aI-625 -aI313 -aI-614 -aa(lp7157 -g15 -aI317 -aI-569 -aI313 -aI-590 -aI314 -aI-579 -aa(lp7158 -g15 -aI325 -aI-542 -aI320 -aI-558 -aI322 -aI-549 -aa(lp7159 -g20 -aI414 -aI-289 -aa(lp7160 -g15 -aI443 -aI-204 -aI425 -aI-261 -aI435 -aI-233 -aa(lp7161 -g15 -aI461 -aI-127 -aI451 -aI-175 -aI457 -aI-150 -aa(lp7162 -g15 -aI470 -aI-164 -aI463 -aI-138 -aI466 -aI-150 -aa(lp7163 -g15 -aI482 -aI-204 -aI474 -aI-178 -aI478 -aI-191 -aa(lp7164 -g15 -aI493 -aI-241 -aI486 -aI-218 -aI489 -aI-230 -aa(lp7165 -g15 -aI500 -aI-263 -aI496 -aI-251 -aI498 -aI-259 -aa(lp7166 -g20 -aI590 -aI-531 -aa(lp7167 -g15 -aI601 -aI-568 -aI594 -aI-543 -aI598 -aI-555 -aa(lp7168 -g15 -aI605 -aI-605 -aI604 -aI-580 -aI605 -aI-592 -aa(lp7169 -g15 -aI590 -aI-635 -aI605 -aI-619 -aI600 -aI-629 -aa(lp7170 -g15 -aI553 -aI-643 -aI581 -aI-640 -aI568 -aI-643 -aa(lp7171 -g20 -aI514 -aI-643 -aa(lp7172 -g20 -aI514 -aI-714 -aa(lp7173 -g20 -aI807 -aI-714 -aa(lp7174 -g10 -aa(lp7175 -g8 -aI807 -aI0 -aa(lp7176 -g10 -aa(lp7177 -g8 -aI807 -aI0 -aasVz -(lp7178 -(lp7179 -g8 -aI490 -aI-90 -aa(lp7180 -g15 -aI525 -aI-95 -aI504 -aI-90 -aI515 -aI-91 -aa(lp7181 -g15 -aI549 -aI-114 -aI534 -aI-99 -aI542 -aI-106 -aa(lp7182 -g15 -aI566 -aI-148 -aI555 -aI-123 -aI561 -aI-134 -aa(lp7183 -g15 -aI578 -aI-198 -aI570 -aI-161 -aI574 -aI-178 -aa(lp7184 -g20 -aI586 -aI-241 -aa(lp7185 -g20 -aI665 -aI-241 -aa(lp7186 -g20 -aI658 -aI0 -aa(lp7187 -g20 -aI24 -aI0 -aa(lp7188 -g20 -aI24 -aI-54 -aa(lp7189 -g20 -aI417 -aI-623 -aa(lp7190 -g20 -aI222 -aI-623 -aa(lp7191 -g15 -aI196 -aI-619 -aI212 -aI-623 -aI203 -aI-621 -aa(lp7192 -g15 -aI176 -aI-604 -aI189 -aI-616 -aI182 -aI-611 -aa(lp7193 -g15 -aI160 -aI-575 -aI170 -aI-596 -aI165 -aI-587 -aa(lp7194 -g15 -aI146 -aI-530 -aI156 -aI-563 -aI151 -aI-548 -aa(lp7195 -g20 -aI138 -aI-498 -aa(lp7196 -g20 -aI58 -aI-498 -aa(lp7197 -g20 -aI74 -aI-714 -aa(lp7198 -g20 -aI650 -aI-714 -aa(lp7199 -g20 -aI650 -aI-657 -aa(lp7200 -g20 -aI255 -aI-90 -aa(lp7201 -g10 -aa(lp7202 -g8 -aI705 -aI0 -aa(lp7203 -g10 -aa(lp7204 -g8 -aI705 -aI0 -aasV~ -(lp7205 -(lp7206 -g8 -aI352 -aI-431 -aa(lp7207 -g15 -aI309 -aI-449 -aI336 -aI-438 -aI322 -aI-444 -aa(lp7208 -g15 -aI277 -aI-460 -aI297 -aI-453 -aI286 -aI-457 -aa(lp7209 -g15 -aI249 -aI-466 -aI267 -aI-462 -aI257 -aI-464 -aa(lp7210 -g15 -aI221 -aI-467 -aI240 -aI-467 -aI230 -aI-467 -aa(lp7211 -g15 -aI183 -aI-461 -aI209 -aI-467 -aI196 -aI-465 -aa(lp7212 -g15 -aI144 -aI-444 -aI170 -aI-457 -aI157 -aI-451 -aa(lp7213 -g15 -aI107 -aI-420 -aI132 -aI-437 -aI119 -aI-429 -aa(lp7214 -g15 -aI73 -aI-388 -aI95 -aI-410 -aI83 -aI-400 -aa(lp7215 -g20 -aI73 -aI-491 -aa(lp7216 -g15 -aI234 -aI-562 -aI116 -aI-538 -aI170 -aI-562 -aa(lp7217 -g15 -aI269 -aI-560 -aI246 -aI-562 -aI258 -aI-561 -aa(lp7218 -g15 -aI303 -aI-554 -aI280 -aI-559 -aI291 -aI-557 -aa(lp7219 -g15 -aI343 -aI-542 -aI315 -aI-551 -aI328 -aI-547 -aa(lp7220 -g15 -aI395 -aI-521 -aI357 -aI-536 -aI375 -aI-529 -aa(lp7221 -g15 -aI438 -aI-503 -aI411 -aI-514 -aI425 -aI-508 -aa(lp7222 -g15 -aI471 -aI-492 -aI450 -aI-498 -aI461 -aI-494 -aa(lp7223 -g15 -aI499 -aI-486 -aI481 -aI-489 -aI490 -aI-487 -aa(lp7224 -g15 -aI526 -aI-484 -aI508 -aI-485 -aI517 -aI-484 -aa(lp7225 -g15 -aI564 -aI-490 -aI539 -aI-484 -aI551 -aI-486 -aa(lp7226 -g15 -aI603 -aI-507 -aI577 -aI-494 -aI590 -aI-500 -aa(lp7227 -g15 -aI640 -aI-532 -aI615 -aI-514 -aI628 -aI-523 -aa(lp7228 -g15 -aI674 -aI-563 -aI652 -aI-542 -aI664 -aI-552 -aa(lp7229 -g20 -aI674 -aI-461 -aa(lp7230 -g15 -aI513 -aI-390 -aI631 -aI-413 -aI578 -aI-390 -aa(lp7231 -g15 -aI478 -aI-391 -aI500 -aI-390 -aI488 -aI-390 -aa(lp7232 -g15 -aI444 -aI-397 -aI467 -aI-392 -aI456 -aI-394 -aa(lp7233 -g15 -aI404 -aI-410 -aI432 -aI-401 -aI419 -aI-405 -aa(lp7234 -g15 -aI352 -aI-431 -aI390 -aI-416 -aI372 -aI-423 -aa(lp7235 -g10 -aa(lp7236 -g8 -aI748 -aI0 -aa(lp7237 -g10 -aa(lp7238 -g8 -aI748 -aI0 -aasV! -(lp7239 -(lp7240 -g8 -aI138 -aI-951 -aa(lp7241 -g20 -aI370 -aI-951 -aa(lp7242 -g20 -aI292 -aI-303 -aa(lp7243 -g20 -aI217 -aI-303 -aa(lp7244 -g10 -aa(lp7245 -g8 -aI146 -aI-95 -aa(lp7246 -g15 -aI154 -aI-146 -aI146 -aI-115 -aI149 -aI-132 -aa(lp7247 -g15 -aI178 -aI-179 -aI160 -aI-160 -aI168 -aI-170 -aa(lp7248 -g15 -aI212 -aI-196 -aI187 -aI-187 -aI199 -aI-193 -aa(lp7249 -g15 -aI255 -aI-202 -aI226 -aI-200 -aI240 -aI-202 -aa(lp7250 -g15 -aI297 -aI-196 -aI270 -aI-202 -aI284 -aI-200 -aa(lp7251 -g15 -aI332 -aI-179 -aI311 -aI-193 -aI322 -aI-187 -aa(lp7252 -g15 -aI356 -aI-146 -aI342 -aI-170 -aI350 -aI-160 -aa(lp7253 -g15 -aI365 -aI-95 -aI362 -aI-132 -aI365 -aI-115 -aa(lp7254 -g15 -aI356 -aI-45 -aI365 -aI-75 -aI362 -aI-58 -aa(lp7255 -g15 -aI332 -aI-12 -aI350 -aI-31 -aI342 -aI-20 -aa(lp7256 -g15 -aI297 -aI5 -aI322 -aI-4 -aI311 -aI1 -aa(lp7257 -g15 -aI255 -aI10 -aI284 -aI9 -aI270 -aI10 -aa(lp7258 -g15 -aI212 -aI5 -aI240 -aI10 -aI226 -aI9 -aa(lp7259 -g15 -aI178 -aI-12 -aI199 -aI1 -aI187 -aI-4 -aa(lp7260 -g15 -aI154 -aI-45 -aI168 -aI-20 -aI160 -aI-31 -aa(lp7261 -g15 -aI146 -aI-95 -aI149 -aI-58 -aI146 -aI-75 -aa(lp7262 -g10 -aa(lp7263 -g8 -aI509 -aI0 -aa(lp7264 -g10 -aa(lp7265 -g8 -aI509 -aI0 -aasV% -(lp7266 -(lp7267 -g8 -aI525 -aI-670 -aa(lp7268 -g15 -aI510 -aI-548 -aI525 -aI-625 -aI520 -aI-584 -aa(lp7269 -g15 -aI465 -aI-454 -aI500 -aI-511 -aI485 -aI-480 -aa(lp7270 -g15 -aI390 -aI-394 -aI446 -aI-428 -aI421 -aI-408 -aa(lp7271 -g15 -aI285 -aI-372 -aI360 -aI-379 -aI325 -aI-372 -aa(lp7272 -g15 -aI176 -aI-394 -aI243 -aI-372 -aI206 -aI-379 -aa(lp7273 -g15 -aI101 -aI-454 -aI146 -aI-408 -aI121 -aI-428 -aa(lp7274 -g15 -aI59 -aI-548 -aI82 -aI-480 -aI68 -aI-511 -aa(lp7275 -g15 -aI45 -aI-670 -aI50 -aI-584 -aI45 -aI-625 -aa(lp7276 -g15 -aI59 -aI-791 -aI45 -aI-714 -aI50 -aI-755 -aa(lp7277 -g15 -aI102 -aI-884 -aI68 -aI-827 -aI82 -aI-858 -aa(lp7278 -g15 -aI177 -aI-944 -aI121 -aI-910 -aI146 -aI-930 -aa(lp7279 -g15 -aI286 -aI-965 -aI207 -aI-958 -aI243 -aI-965 -aa(lp7280 -g15 -aI391 -aI-944 -aI326 -aI-965 -aI361 -aI-958 -aa(lp7281 -g15 -aI466 -aI-884 -aI421 -aI-930 -aI446 -aI-910 -aa(lp7282 -g15 -aI510 -aI-791 -aI486 -aI-858 -aI500 -aI-827 -aa(lp7283 -g15 -aI525 -aI-670 -aI520 -aI-755 -aI525 -aI-714 -aa(lp7284 -g10 -aa(lp7285 -g8 -aI195 -aI-670 -aa(lp7286 -g15 -aI200 -aI-572 -aI195 -aI-633 -aI197 -aI-601 -aa(lp7287 -g15 -aI216 -aI-500 -aI204 -aI-544 -aI209 -aI-520 -aa(lp7288 -g15 -aI243 -aI-455 -aI223 -aI-480 -aI232 -aI-465 -aa(lp7289 -g15 -aI285 -aI-439 -aI255 -aI-444 -aI269 -aI-439 -aa(lp7290 -g15 -aI327 -aI-455 -aI302 -aI-439 -aI316 -aI-444 -aa(lp7291 -g15 -aI354 -aI-500 -aI338 -aI-465 -aI347 -aI-480 -aa(lp7292 -g15 -aI368 -aI-572 -aI361 -aI-520 -aI365 -aI-544 -aa(lp7293 -g15 -aI373 -aI-670 -aI371 -aI-601 -aI373 -aI-633 -aa(lp7294 -g15 -aI368 -aI-765 -aI373 -aI-705 -aI371 -aI-737 -aa(lp7295 -g15 -aI354 -aI-836 -aI365 -aI-793 -aI361 -aI-817 -aa(lp7296 -g15 -aI327 -aI-881 -aI347 -aI-856 -aI338 -aI-871 -aa(lp7297 -g15 -aI286 -aI-896 -aI316 -aI-891 -aI302 -aI-896 -aa(lp7298 -g15 -aI244 -aI-881 -aI269 -aI-896 -aI255 -aI-891 -aa(lp7299 -g15 -aI216 -aI-836 -aI232 -aI-871 -aI223 -aI-856 -aa(lp7300 -g15 -aI200 -aI-765 -aI209 -aI-817 -aI204 -aI-793 -aa(lp7301 -g15 -aI195 -aI-670 -aI197 -aI-737 -aI195 -aI-705 -aa(lp7302 -g10 -aa(lp7303 -g8 -aI423 -aI0 -aa(lp7304 -g20 -aI320 -aI0 -aa(lp7305 -g20 -aI779 -aI-951 -aa(lp7306 -g20 -aI882 -aI-951 -aa(lp7307 -g10 -aa(lp7308 -g8 -aI1162 -aI-283 -aa(lp7309 -g15 -aI1147 -aI-161 -aI1162 -aI-238 -aI1157 -aI-198 -aa(lp7310 -g15 -aI1103 -aI-67 -aI1137 -aI-125 -aI1122 -aI-93 -aa(lp7311 -g15 -aI1028 -aI-7 -aI1083 -aI-41 -aI1058 -aI-21 -aa(lp7312 -g15 -aI922 -aI13 -aI998 -aI6 -aI962 -aI13 -aa(lp7313 -g15 -aI813 -aI-7 -aI880 -aI13 -aI844 -aI6 -aa(lp7314 -g15 -aI739 -aI-67 -aI783 -aI-21 -aI758 -aI-41 -aa(lp7315 -g15 -aI696 -aI-161 -aI719 -aI-93 -aI705 -aI-125 -aa(lp7316 -g15 -aI682 -aI-283 -aI687 -aI-198 -aI682 -aI-238 -aa(lp7317 -g15 -aI696 -aI-404 -aI682 -aI-328 -aI687 -aI-368 -aa(lp7318 -g15 -aI739 -aI-497 -aI705 -aI-441 -aI720 -aI-472 -aa(lp7319 -g15 -aI814 -aI-557 -aI759 -aI-523 -aI784 -aI-543 -aa(lp7320 -g15 -aI923 -aI-578 -aI844 -aI-571 -aI881 -aI-578 -aa(lp7321 -g15 -aI1028 -aI-557 -aI963 -aI-578 -aI998 -aI-571 -aa(lp7322 -g15 -aI1103 -aI-497 -aI1058 -aI-543 -aI1083 -aI-523 -aa(lp7323 -g15 -aI1148 -aI-404 -aI1123 -aI-472 -aI1138 -aI-441 -aa(lp7324 -g15 -aI1162 -aI-283 -aI1157 -aI-368 -aI1162 -aI-328 -aa(lp7325 -g10 -aa(lp7326 -g8 -aI833 -aI-283 -aa(lp7327 -g15 -aI838 -aI-186 -aI833 -aI-246 -aI834 -aI-214 -aa(lp7328 -g15 -aI853 -aI-113 -aI841 -aI-157 -aI846 -aI-133 -aa(lp7329 -g15 -aI881 -aI-68 -aI860 -aI-94 -aI869 -aI-78 -aa(lp7330 -g15 -aI922 -aI-52 -aI892 -aI-58 -aI906 -aI-52 -aa(lp7331 -g15 -aI964 -aI-68 -aI939 -aI-52 -aI953 -aI-58 -aa(lp7332 -g15 -aI991 -aI-113 -aI975 -aI-78 -aI984 -aI-94 -aa(lp7333 -g15 -aI1006 -aI-186 -aI998 -aI-133 -aI1003 -aI-157 -aa(lp7334 -g15 -aI1010 -aI-283 -aI1009 -aI-214 -aI1010 -aI-246 -aa(lp7335 -g15 -aI1006 -aI-378 -aI1010 -aI-318 -aI1009 -aI-350 -aa(lp7336 -g15 -aI991 -aI-450 -aI1003 -aI-406 -aI998 -aI-430 -aa(lp7337 -g15 -aI965 -aI-494 -aI985 -aI-469 -aI976 -aI-484 -aa(lp7338 -g15 -aI923 -aI-509 -aI954 -aI-504 -aI940 -aI-509 -aa(lp7339 -g15 -aI881 -aI-494 -aI907 -aI-509 -aI893 -aI-504 -aa(lp7340 -g15 -aI853 -aI-450 -aI870 -aI-484 -aI861 -aI-469 -aa(lp7341 -g15 -aI838 -aI-378 -aI846 -aI-430 -aI841 -aI-406 -aa(lp7342 -g15 -aI833 -aI-283 -aI834 -aI-350 -aI833 -aI-318 -aa(lp7343 -g10 -aa(lp7344 -g8 -aI1207 -aI0 -aa(lp7345 -g10 -aa(lp7346 -g8 -aI1207 -aI0 -aasV) -(lp7347 -(lp7348 -g8 -aI242 -aI-423 -aa(lp7349 -g15 -aI234 -aI-578 -aI242 -aI-476 -aI240 -aI-528 -aa(lp7350 -g15 -aI204 -aI-722 -aI229 -aI-629 -aI219 -aI-677 -aa(lp7351 -g15 -aI143 -aI-846 -aI190 -aI-767 -aI169 -aI-808 -aa(lp7352 -g15 -aI42 -aI-944 -aI117 -aI-884 -aI84 -aI-917 -aa(lp7353 -g20 -aI42 -aI-1028 -aa(lp7354 -g15 -aI233 -aI-924 -aI117 -aI-999 -aI180 -aI-964 -aa(lp7355 -g15 -aI361 -aI-789 -aI285 -aI-884 -aI328 -aI-839 -aa(lp7356 -g15 -aI434 -aI-622 -aI394 -aI-738 -aI419 -aI-683 -aa(lp7357 -g15 -aI457 -aI-423 -aI449 -aI-561 -aI457 -aI-494 -aa(lp7358 -g15 -aI434 -aI-223 -aI457 -aI-351 -aI449 -aI-284 -aa(lp7359 -g15 -aI361 -aI-55 -aI419 -aI-162 -aI394 -aI-106 -aa(lp7360 -g15 -aI233 -aI80 -aI328 -aI-4 -aI285 -aI40 -aa(lp7361 -g15 -aI42 -aI186 -aI180 -aI121 -aI117 -aI156 -aa(lp7362 -g20 -aI42 -aI100 -aa(lp7363 -g15 -aI143 -aI2 -aI84 -aI73 -aI117 -aI40 -aa(lp7364 -g15 -aI204 -aI-122 -aI169 -aI-35 -aI190 -aI-77 -aa(lp7365 -g15 -aI234 -aI-267 -aI219 -aI-168 -aI229 -aI-216 -aa(lp7366 -g15 -aI242 -aI-423 -aI240 -aI-318 -aI242 -aI-370 -aa(lp7367 -g10 -aa(lp7368 -g8 -aI533 -aI0 -aa(lp7369 -g10 -aa(lp7370 -g8 -aI533 -aI0 -aasV- -(lp7371 -(lp7372 -g8 -aI33 -aI-293 -aa(lp7373 -g20 -aI33 -aI-433 -aa(lp7374 -g20 -aI380 -aI-433 -aa(lp7375 -g20 -aI380 -aI-293 -aa(lp7376 -g10 -aa(lp7377 -g8 -aI413 -aI0 -aa(lp7378 -g10 -aa(lp7379 -g8 -aI413 -aI0 -aasV1 -(lp7380 -(lp7381 -g8 -aI129 -aI0 -aa(lp7382 -g20 -aI129 -aI-70 -aa(lp7383 -g20 -aI238 -aI-70 -aa(lp7384 -g15 -aI268 -aI-74 -aI250 -aI-70 -aI259 -aI-71 -aa(lp7385 -g15 -aI289 -aI-88 -aI276 -aI-77 -aI283 -aI-82 -aa(lp7386 -g15 -aI301 -aI-115 -aI294 -aI-95 -aI298 -aI-104 -aa(lp7387 -g15 -aI305 -aI-157 -aI304 -aI-126 -aI305 -aI-140 -aa(lp7388 -g20 -aI305 -aI-825 -aa(lp7389 -g15 -aI257 -aI-768 -aI288 -aI-804 -aI272 -aI-785 -aa(lp7390 -g15 -aI214 -aI-724 -aI242 -aI-751 -aI228 -aI-736 -aa(lp7391 -g15 -aI173 -aI-696 -aI200 -aI-712 -aI186 -aI-703 -aa(lp7392 -g15 -aI133 -aI-686 -aI160 -aI-689 -aI146 -aI-686 -aa(lp7393 -g15 -aI103 -aI-693 -aI122 -aI-686 -aI112 -aI-688 -aa(lp7394 -g15 -aI78 -aI-713 -aI93 -aI-697 -aI85 -aI-704 -aa(lp7395 -g15 -aI62 -aI-744 -aI71 -aI-721 -aI66 -aI-732 -aa(lp7396 -g15 -aI55 -aI-784 -aI58 -aI-756 -aI55 -aI-769 -aa(lp7397 -g15 -aI98 -aI-797 -aI69 -aI-788 -aI83 -aI-792 -aa(lp7398 -g15 -aI145 -aI-816 -aI113 -aI-802 -aI128 -aI-808 -aa(lp7399 -g15 -aI199 -aI-846 -aI162 -aI-824 -aI180 -aI-834 -aa(lp7400 -g15 -aI261 -aI-887 -aI218 -aI-857 -aI238 -aI-871 -aa(lp7401 -g20 -aI354 -aI-956 -aa(lp7402 -g20 -aI503 -aI-956 -aa(lp7403 -g20 -aI503 -aI-157 -aa(lp7404 -g15 -aI506 -aI-119 -aI503 -aI-143 -aI504 -aI-130 -aa(lp7405 -g15 -aI517 -aI-92 -aI508 -aI-109 -aI512 -aI-100 -aa(lp7406 -g15 -aI538 -aI-76 -aI522 -aI-85 -aI529 -aI-79 -aa(lp7407 -g15 -aI572 -aI-70 -aI546 -aI-72 -aI558 -aI-70 -aa(lp7408 -g20 -aI679 -aI-70 -aa(lp7409 -g20 -aI679 -aI0 -aa(lp7410 -g10 -aa(lp7411 -g8 -aI745 -aI0 -aa(lp7412 -g10 -aa(lp7413 -g8 -aI745 -aI0 -aasV5 -(lp7414 -(lp7415 -g8 -aI306 -aI-79 -aa(lp7416 -g15 -aI369 -aI-90 -aI328 -aI-79 -aI349 -aI-83 -aa(lp7417 -g15 -aI421 -aI-124 -aI389 -aI-96 -aI406 -aI-108 -aa(lp7418 -g15 -aI457 -aI-190 -aI436 -aI-141 -aI448 -aI-163 -aa(lp7419 -g15 -aI470 -aI-293 -aI466 -aI-218 -aI470 -aI-252 -aa(lp7420 -g15 -aI423 -aI-441 -aI470 -aI-359 -aI454 -aI-409 -aa(lp7421 -g15 -aI289 -aI-490 -aI391 -aI-474 -aI346 -aI-490 -aa(lp7422 -g15 -aI243 -aI-488 -aI272 -aI-490 -aI256 -aI-489 -aa(lp7423 -g15 -aI205 -aI-482 -aI229 -aI-487 -aI216 -aI-485 -aa(lp7424 -g15 -aI171 -aI-475 -aI193 -aI-480 -aI182 -aI-477 -aa(lp7425 -g15 -aI141 -aI-466 -aI161 -aI-472 -aI151 -aI-469 -aa(lp7426 -g20 -aI80 -aI-490 -aa(lp7427 -g20 -aI122 -aI-951 -aa(lp7428 -g20 -aI626 -aI-951 -aa(lp7429 -g20 -aI633 -aI-709 -aa(lp7430 -g20 -aI557 -aI-709 -aa(lp7431 -g20 -aI546 -aI-754 -aa(lp7432 -g15 -aI539 -aI-775 -aI544 -aI-761 -aI542 -aI-768 -aa(lp7433 -g15 -aI528 -aI-791 -aI537 -aI-781 -aI533 -aI-786 -aa(lp7434 -g15 -aI511 -aI-801 -aI524 -aI-795 -aI518 -aI-798 -aa(lp7435 -g15 -aI485 -aI-804 -aI504 -aI-803 -aI495 -aI-804 -aa(lp7436 -g20 -aI207 -aI-804 -aa(lp7437 -g15 -aI206 -aI-793 -aI207 -aI-804 -aI207 -aI-800 -aa(lp7438 -g15 -aI204 -aI-765 -aI206 -aI-786 -aI205 -aI-776 -aa(lp7439 -g15 -aI201 -aI-725 -aI203 -aI-753 -aI202 -aI-740 -aa(lp7440 -g15 -aI197 -aI-680 -aI199 -aI-710 -aI198 -aI-695 -aa(lp7441 -g20 -aI186 -aI-558 -aa(lp7442 -g15 -aI213 -aI-565 -aI193 -aI-560 -aI202 -aI-563 -aa(lp7443 -g15 -aI250 -aI-572 -aI224 -aI-568 -aI236 -aI-570 -aa(lp7444 -g15 -aI291 -aI-576 -aI263 -aI-574 -aI276 -aI-575 -aa(lp7445 -g15 -aI333 -aI-578 -aI305 -aI-577 -aI319 -aI-578 -aa(lp7446 -g15 -aI473 -aI-560 -aI384 -aI-578 -aI431 -aI-572 -aa(lp7447 -g15 -aI581 -aI-507 -aI515 -aI-548 -aI551 -aI-530 -aa(lp7448 -g15 -aI650 -aI-418 -aI610 -aI-483 -aI633 -aI-453 -aa(lp7449 -g15 -aI674 -aI-293 -aI666 -aI-382 -aI674 -aI-340 -aa(lp7450 -g15 -aI642 -aI-147 -aI674 -aI-235 -aI663 -aI-186 -aa(lp7451 -g15 -aI561 -aI-52 -aI621 -aI-108 -aI594 -aI-76 -aa(lp7452 -g15 -aI449 -aI-1 -aI527 -aI-29 -aI490 -aI-12 -aa(lp7453 -g15 -aI326 -aI13 -aI407 -aI8 -aI367 -aI13 -aa(lp7454 -g15 -aI199 -aI0 -aI276 -aI13 -aI234 -aI9 -aa(lp7455 -g15 -aI115 -aI-35 -aI165 -aI-8 -aI136 -aI-20 -aa(lp7456 -g15 -aI68 -aI-87 -aI93 -aI-50 -aI77 -aI-67 -aa(lp7457 -g15 -aI53 -aI-147 -aI58 -aI-106 -aI53 -aI-126 -aa(lp7458 -g15 -aI82 -aI-216 -aI53 -aI-178 -aI63 -aI-201 -aa(lp7459 -g15 -aI160 -aI-239 -aI101 -aI-232 -aI127 -aI-239 -aa(lp7460 -g15 -aI167 -aI-182 -aI160 -aI-220 -aI162 -aI-201 -aa(lp7461 -g15 -aI192 -aI-131 -aI172 -aI-163 -aI180 -aI-146 -aa(lp7462 -g15 -aI237 -aI-93 -aI203 -aI-115 -aI218 -aI-103 -aa(lp7463 -g15 -aI306 -aI-79 -aI256 -aI-84 -aI279 -aI-79 -aa(lp7464 -g10 -aa(lp7465 -g8 -aI745 -aI0 -aa(lp7466 -g10 -aa(lp7467 -g8 -aI745 -aI0 -aasV9 -(lp7468 -(lp7469 -g8 -aI302 -aI13 -aa(lp7470 -g15 -aI200 -aI0 -aI262 -aI13 -aI228 -aI9 -aa(lp7471 -g15 -aI132 -aI-33 -aI172 -aI-7 -aI150 -aI-18 -aa(lp7472 -g15 -aI95 -aI-81 -aI115 -aI-47 -aI102 -aI-63 -aa(lp7473 -g15 -aI83 -aI-136 -aI87 -aI-99 -aI83 -aI-117 -aa(lp7474 -g15 -aI99 -aI-186 -aI83 -aI-156 -aI89 -aI-172 -aa(lp7475 -g15 -aI149 -aI-213 -aI110 -aI-199 -aI126 -aI-208 -aa(lp7476 -g15 -aI172 -aI-157 -aI155 -aI-193 -aI163 -aI-174 -aa(lp7477 -g15 -aI205 -aI-111 -aI181 -aI-139 -aI192 -aI-124 -aa(lp7478 -g15 -aI250 -aI-81 -aI218 -aI-99 -aI233 -aI-88 -aa(lp7479 -g15 -aI309 -aI-70 -aI267 -aI-74 -aI287 -aI-70 -aa(lp7480 -g15 -aI447 -aI-167 -aI369 -aI-70 -aI415 -aI-102 -aa(lp7481 -g15 -aI502 -aI-456 -aI479 -aI-232 -aI498 -aI-328 -aa(lp7482 -g15 -aI467 -aI-420 -aI492 -aI-443 -aI480 -aI-431 -aa(lp7483 -g15 -aI424 -aI-392 -aI454 -aI-409 -aI440 -aI-400 -aa(lp7484 -g15 -aI371 -aI-372 -aI408 -aI-383 -aI390 -aI-377 -aa(lp7485 -g15 -aI307 -aI-366 -aI352 -aI-368 -aI330 -aI-366 -aa(lp7486 -g15 -aI202 -aI-383 -aI269 -aI-366 -aI234 -aI-372 -aa(lp7487 -g15 -aI120 -aI-436 -aI170 -aI-395 -aI143 -aI-413 -aa(lp7488 -g15 -aI66 -aI-523 -aI96 -aI-459 -aI78 -aI-488 -aa(lp7489 -g15 -aI46 -aI-642 -aI53 -aI-557 -aI46 -aI-597 -aa(lp7490 -g15 -aI67 -aI-773 -aI46 -aI-690 -aI53 -aI-734 -aa(lp7491 -g15 -aI127 -aI-875 -aI81 -aI-813 -aI101 -aI-847 -aa(lp7492 -g15 -aI223 -aI-941 -aI154 -aI-903 -aI186 -aI-925 -aa(lp7493 -g15 -aI352 -aI-965 -aI261 -aI-957 -aI304 -aI-965 -aa(lp7494 -g15 -aI485 -aI-939 -aI400 -aI-965 -aI444 -aI-956 -aa(lp7495 -g15 -aI591 -aI-858 -aI526 -aI-921 -aI561 -aI-894 -aa(lp7496 -g15 -aI660 -aI-718 -aI621 -aI-821 -aI644 -aI-775 -aa(lp7497 -g15 -aI685 -aI-517 -aI677 -aI-662 -aI685 -aI-595 -aa(lp7498 -g15 -aI664 -aI-310 -aI685 -aI-443 -aI678 -aI-374 -aa(lp7499 -g15 -aI596 -aI-141 -aI649 -aI-245 -aI627 -aI-189 -aa(lp7500 -g15 -aI478 -aI-28 -aI566 -aI-93 -aI526 -aI-55 -aa(lp7501 -g15 -aI302 -aI13 -aI429 -aI0 -aI371 -aI13 -aa(lp7502 -g10 -aa(lp7503 -g8 -aI365 -aI-462 -aa(lp7504 -g15 -aI447 -aI-486 -aI397 -aI-462 -aI424 -aI-470 -aa(lp7505 -g15 -aI502 -aI-551 -aI470 -aI-503 -aI489 -aI-524 -aa(lp7506 -g15 -aI491 -aI-698 -aI502 -aI-608 -aI498 -aI-657 -aa(lp7507 -g15 -aI461 -aI-798 -aI484 -aI-738 -aI474 -aI-772 -aa(lp7508 -g15 -aI417 -aI-856 -aI449 -aI-824 -aI434 -aI-844 -aa(lp7509 -g15 -aI360 -aI-875 -aI399 -aI-869 -aI380 -aI-875 -aa(lp7510 -g15 -aI271 -aI-819 -aI321 -aI-875 -aI292 -aI-857 -aa(lp7511 -g15 -aI240 -aI-649 -aI250 -aI-781 -aI240 -aI-725 -aa(lp7512 -g15 -aI271 -aI-509 -aI240 -aI-588 -aI250 -aI-541 -aa(lp7513 -g15 -aI365 -aI-462 -aI292 -aI-478 -aI323 -aI-462 -aa(lp7514 -g10 -aa(lp7515 -g8 -aI745 -aI0 -aa(lp7516 -g10 -aa(lp7517 -g8 -aI745 -aI0 -aasV= -(lp7518 -(lp7519 -g8 -aI661 -aI-392 -aa(lp7520 -g20 -aI661 -aI-299 -aa(lp7521 -g20 -aI83 -aI-299 -aa(lp7522 -g20 -aI83 -aI-392 -aa(lp7523 -g10 -aa(lp7524 -g8 -aI661 -aI-651 -aa(lp7525 -g20 -aI661 -aI-558 -aa(lp7526 -g20 -aI83 -aI-558 -aa(lp7527 -g20 -aI83 -aI-651 -aa(lp7528 -g10 -aa(lp7529 -g8 -aI745 -aI0 -aa(lp7530 -g10 -aa(lp7531 -g8 -aI745 -aI0 -aasVA -(lp7532 -(lp7533 -g8 -aI290 -aI-312 -aa(lp7534 -g20 -aI251 -aI-198 -aa(lp7535 -g15 -aI241 -aI-160 -aI248 -aI-187 -aI244 -aI-174 -aa(lp7536 -g15 -aI235 -aI-121 -aI237 -aI-145 -aI235 -aI-132 -aa(lp7537 -g15 -aI240 -aI-99 -aI235 -aI-113 -aI237 -aI-105 -aa(lp7538 -g15 -aI254 -aI-83 -aI244 -aI-92 -aI248 -aI-87 -aa(lp7539 -g15 -aI273 -aI-73 -aI260 -aI-79 -aI266 -aI-75 -aa(lp7540 -g15 -aI296 -aI-70 -aI280 -aI-71 -aI288 -aI-70 -aa(lp7541 -g20 -aI352 -aI-70 -aa(lp7542 -g20 -aI352 -aI0 -aa(lp7543 -g20 -aI5 -aI0 -aa(lp7544 -g20 -aI5 -aI-70 -aa(lp7545 -g20 -aI21 -aI-70 -aa(lp7546 -g15 -aI53 -aI-74 -aI33 -aI-70 -aI43 -aI-71 -aa(lp7547 -g15 -aI81 -aI-89 -aI63 -aI-77 -aI72 -aI-81 -aa(lp7548 -g15 -aI105 -aI-118 -aI89 -aI-96 -aI97 -aI-106 -aa(lp7549 -g15 -aI128 -aI-167 -aI112 -aI-131 -aI120 -aI-147 -aa(lp7550 -g20 -aI417 -aI-951 -aa(lp7551 -g20 -aI600 -aI-951 -aa(lp7552 -g20 -aI878 -aI-166 -aa(lp7553 -g15 -aI899 -aI-119 -aI885 -aI-147 -aI892 -aI-132 -aa(lp7554 -g15 -aI922 -aI-90 -aI906 -aI-107 -aI914 -aI-97 -aa(lp7555 -g15 -aI949 -aI-75 -aI931 -aI-83 -aI940 -aI-78 -aa(lp7556 -g15 -aI979 -aI-70 -aI959 -aI-72 -aI969 -aI-70 -aa(lp7557 -g20 -aI1003 -aI-70 -aa(lp7558 -g20 -aI1003 -aI0 -aa(lp7559 -g20 -aI563 -aI0 -aa(lp7560 -g20 -aI563 -aI-70 -aa(lp7561 -g20 -aI615 -aI-70 -aa(lp7562 -g15 -aI636 -aI-73 -aI622 -aI-70 -aI629 -aI-71 -aa(lp7563 -g15 -aI654 -aI-82 -aI643 -aI-75 -aI649 -aI-78 -aa(lp7564 -g15 -aI667 -aI-98 -aI660 -aI-86 -aI664 -aI-91 -aa(lp7565 -g15 -aI673 -aI-121 -aI671 -aI-105 -aI673 -aI-112 -aa(lp7566 -g15 -aI669 -aI-153 -aI673 -aI-132 -aI671 -aI-143 -aa(lp7567 -g15 -aI661 -aI-179 -aI666 -aI-163 -aI664 -aI-171 -aa(lp7568 -g20 -aI614 -aI-312 -aa(lp7569 -g10 -aa(lp7570 -g8 -aI517 -aI-612 -aa(lp7571 -g15 -aI502 -aI-660 -aI512 -aI-628 -aI507 -aI-643 -aa(lp7572 -g15 -aI487 -aI-711 -aI497 -aI-677 -aI492 -aI-694 -aa(lp7573 -g15 -aI473 -aI-763 -aI482 -aI-729 -aI478 -aI-746 -aa(lp7574 -g15 -aI461 -aI-812 -aI469 -aI-780 -aI465 -aI-797 -aa(lp7575 -g15 -aI447 -aI-768 -aI457 -aI-799 -aI453 -aI-784 -aa(lp7576 -g15 -aI431 -aI-718 -aI442 -aI-752 -aI437 -aI-735 -aa(lp7577 -g15 -aI413 -aI-668 -aI425 -aI-702 -aI419 -aI-685 -aa(lp7578 -g15 -aI397 -aI-619 -aI407 -aI-651 -aI402 -aI-634 -aa(lp7579 -g20 -aI318 -aI-394 -aa(lp7580 -g20 -aI587 -aI-394 -aa(lp7581 -g10 -aa(lp7582 -g8 -aI1003 -aI0 -aa(lp7583 -g10 -aa(lp7584 -g8 -aI1003 -aI0 -aasVE -(lp7585 -(lp7586 -g8 -aI373 -aI-80 -aa(lp7587 -g20 -aI639 -aI-80 -aa(lp7588 -g15 -aI674 -aI-88 -aI653 -aI-80 -aI664 -aI-83 -aa(lp7589 -g15 -aI699 -aI-109 -aI684 -aI-93 -aI692 -aI-100 -aa(lp7590 -g15 -aI715 -aI-141 -aI706 -aI-118 -aI711 -aI-129 -aa(lp7591 -g15 -aI725 -aI-182 -aI719 -aI-154 -aI723 -aI-167 -aa(lp7592 -g20 -aI735 -aI-244 -aa(lp7593 -g20 -aI828 -aI-244 -aa(lp7594 -g20 -aI818 -aI0 -aa(lp7595 -g20 -aI37 -aI0 -aa(lp7596 -g20 -aI37 -aI-70 -aa(lp7597 -g20 -aI93 -aI-70 -aa(lp7598 -g15 -aI119 -aI-73 -aI102 -aI-70 -aI111 -aI-71 -aa(lp7599 -g15 -aI141 -aI-83 -aI128 -aI-74 -aI135 -aI-78 -aa(lp7600 -g15 -aI156 -aI-107 -aI147 -aI-89 -aI152 -aI-97 -aa(lp7601 -g15 -aI161 -aI-149 -aI159 -aI-118 -aI161 -aI-132 -aa(lp7602 -g20 -aI161 -aI-794 -aa(lp7603 -g15 -aI156 -aI-840 -aI161 -aI-813 -aI159 -aI-828 -aa(lp7604 -g15 -aI141 -aI-866 -aI152 -aI-851 -aI148 -aI-860 -aa(lp7605 -g15 -aI120 -aI-878 -aI135 -aI-872 -aI128 -aI-876 -aa(lp7606 -g15 -aI93 -aI-881 -aI112 -aI-880 -aI103 -aI-881 -aa(lp7607 -g20 -aI37 -aI-881 -aa(lp7608 -g20 -aI37 -aI-951 -aa(lp7609 -g20 -aI777 -aI-951 -aa(lp7610 -g20 -aI782 -aI-705 -aa(lp7611 -g20 -aI689 -aI-705 -aa(lp7612 -g20 -aI682 -aI-769 -aa(lp7613 -g15 -aI658 -aI-843 -aI679 -aI-801 -aI671 -aI-826 -aa(lp7614 -g15 -aI597 -aI-869 -aI645 -aI-861 -aI625 -aI-869 -aa(lp7615 -g20 -aI373 -aI-869 -aa(lp7616 -g20 -aI373 -aI-536 -aa(lp7617 -g20 -aI689 -aI-536 -aa(lp7618 -g20 -aI689 -aI-456 -aa(lp7619 -g20 -aI373 -aI-456 -aa(lp7620 -g10 -aa(lp7621 -g8 -aI870 -aI0 -aa(lp7622 -g10 -aa(lp7623 -g8 -aI870 -aI0 -aasVI -(lp7624 -(lp7625 -g8 -aI37 -aI0 -aa(lp7626 -g20 -aI37 -aI-70 -aa(lp7627 -g20 -aI93 -aI-70 -aa(lp7628 -g15 -aI120 -aI-73 -aI103 -aI-70 -aI112 -aI-71 -aa(lp7629 -g15 -aI141 -aI-85 -aI128 -aI-75 -aI135 -aI-79 -aa(lp7630 -g15 -aI156 -aI-111 -aI148 -aI-91 -aI152 -aI-100 -aa(lp7631 -g15 -aI161 -aI-157 -aI159 -aI-122 -aI161 -aI-138 -aa(lp7632 -g20 -aI161 -aI-793 -aa(lp7633 -g15 -aI156 -aI-839 -aI161 -aI-812 -aI159 -aI-828 -aa(lp7634 -g15 -aI141 -aI-865 -aI152 -aI-850 -aI148 -aI-859 -aa(lp7635 -g15 -aI120 -aI-877 -aI135 -aI-871 -aI128 -aI-875 -aa(lp7636 -g15 -aI93 -aI-880 -aI112 -aI-879 -aI103 -aI-880 -aa(lp7637 -g20 -aI37 -aI-880 -aa(lp7638 -g20 -aI37 -aI-951 -aa(lp7639 -g20 -aI497 -aI-951 -aa(lp7640 -g20 -aI497 -aI-880 -aa(lp7641 -g20 -aI441 -aI-880 -aa(lp7642 -g15 -aI414 -aI-877 -aI431 -aI-880 -aI422 -aI-879 -aa(lp7643 -g15 -aI392 -aI-865 -aI405 -aI-875 -aI398 -aI-871 -aa(lp7644 -g15 -aI378 -aI-839 -aI386 -aI-859 -aI381 -aI-850 -aa(lp7645 -g15 -aI373 -aI-793 -aI374 -aI-828 -aI373 -aI-812 -aa(lp7646 -g20 -aI373 -aI-157 -aa(lp7647 -g15 -aI378 -aI-111 -aI373 -aI-138 -aI374 -aI-122 -aa(lp7648 -g15 -aI392 -aI-85 -aI381 -aI-100 -aI386 -aI-91 -aa(lp7649 -g15 -aI414 -aI-73 -aI398 -aI-79 -aI405 -aI-75 -aa(lp7650 -g15 -aI441 -aI-70 -aI422 -aI-71 -aI431 -aI-70 -aa(lp7651 -g20 -aI497 -aI-70 -aa(lp7652 -g20 -aI497 -aI0 -aa(lp7653 -g10 -aa(lp7654 -g8 -aI534 -aI0 -aa(lp7655 -g10 -aa(lp7656 -g8 -aI534 -aI0 -aasVM -(lp7657 -(lp7658 -g8 -aI805 -aI0 -aa(lp7659 -g20 -aI805 -aI-70 -aa(lp7660 -g20 -aI818 -aI-70 -aa(lp7661 -g15 -aI855 -aI-73 -aI832 -aI-70 -aI844 -aI-71 -aa(lp7662 -g15 -aI881 -aI-83 -aI865 -aI-74 -aI874 -aI-78 -aa(lp7663 -g15 -aI897 -aI-105 -aI888 -aI-88 -aI893 -aI-96 -aa(lp7664 -g15 -aI902 -aI-144 -aI900 -aI-115 -aI902 -aI-128 -aa(lp7665 -g20 -aI902 -aI-819 -aa(lp7666 -g20 -aI633 -aI0 -aa(lp7667 -g20 -aI542 -aI0 -aa(lp7668 -g20 -aI261 -aI-819 -aa(lp7669 -g20 -aI261 -aI-157 -aa(lp7670 -g15 -aI267 -aI-111 -aI261 -aI-138 -aI263 -aI-122 -aa(lp7671 -g15 -aI287 -aI-85 -aI272 -aI-100 -aI278 -aI-91 -aa(lp7672 -g15 -aI318 -aI-73 -aI295 -aI-79 -aI306 -aI-75 -aa(lp7673 -g15 -aI360 -aI-70 -aI330 -aI-71 -aI344 -aI-70 -aa(lp7674 -g20 -aI367 -aI-70 -aa(lp7675 -g20 -aI367 -aI0 -aa(lp7676 -g20 -aI37 -aI0 -aa(lp7677 -g20 -aI37 -aI-70 -aa(lp7678 -g20 -aI93 -aI-70 -aa(lp7679 -g15 -aI119 -aI-73 -aI102 -aI-70 -aI111 -aI-71 -aa(lp7680 -g15 -aI141 -aI-83 -aI128 -aI-74 -aI135 -aI-78 -aa(lp7681 -g15 -aI156 -aI-107 -aI147 -aI-89 -aI152 -aI-97 -aa(lp7682 -g15 -aI161 -aI-149 -aI159 -aI-118 -aI161 -aI-132 -aa(lp7683 -g20 -aI161 -aI-799 -aa(lp7684 -g15 -aI156 -aI-842 -aI161 -aI-817 -aI159 -aI-831 -aa(lp7685 -g15 -aI141 -aI-866 -aI152 -aI-852 -aI147 -aI-861 -aa(lp7686 -g15 -aI119 -aI-878 -aI135 -aI-872 -aI128 -aI-876 -aa(lp7687 -g15 -aI93 -aI-881 -aI111 -aI-880 -aI102 -aI-881 -aa(lp7688 -g20 -aI37 -aI-881 -aa(lp7689 -g20 -aI37 -aI-951 -aa(lp7690 -g20 -aI421 -aI-951 -aa(lp7691 -g20 -aI642 -aI-307 -aa(lp7692 -g20 -aI854 -aI-951 -aa(lp7693 -g20 -aI1231 -aI-951 -aa(lp7694 -g20 -aI1231 -aI-881 -aa(lp7695 -g20 -aI1175 -aI-881 -aa(lp7696 -g15 -aI1149 -aI-878 -aI1166 -aI-881 -aI1157 -aI-880 -aa(lp7697 -g15 -aI1127 -aI-866 -aI1140 -aI-876 -aI1133 -aI-872 -aa(lp7698 -g15 -aI1113 -aI-840 -aI1121 -aI-860 -aI1116 -aI-851 -aa(lp7699 -g15 -aI1108 -aI-794 -aI1109 -aI-828 -aI1108 -aI-813 -aa(lp7700 -g20 -aI1108 -aI-157 -aa(lp7701 -g15 -aI1113 -aI-111 -aI1108 -aI-138 -aI1109 -aI-122 -aa(lp7702 -g15 -aI1127 -aI-85 -aI1116 -aI-100 -aI1121 -aI-91 -aa(lp7703 -g15 -aI1149 -aI-73 -aI1133 -aI-79 -aI1140 -aI-75 -aa(lp7704 -g15 -aI1175 -aI-70 -aI1157 -aI-71 -aI1166 -aI-70 -aa(lp7705 -g20 -aI1231 -aI-70 -aa(lp7706 -g20 -aI1231 -aI0 -aa(lp7707 -g10 -aa(lp7708 -g8 -aI1269 -aI0 -aa(lp7709 -g10 -aa(lp7710 -g8 -aI1269 -aI0 -aasVQ -(lp7711 -(lp7712 -g8 -aI975 -aI-476 -aa(lp7713 -g15 -aI954 -aI-303 -aI975 -aI-414 -aI968 -aI-356 -aa(lp7714 -g15 -aI892 -aI-163 -aI940 -aI-251 -aI919 -aI-204 -aa(lp7715 -g15 -aI791 -aI-60 -aI865 -aI-122 -aI831 -aI-88 -aa(lp7716 -g15 -aI651 -aI0 -aI750 -aI-32 -aI704 -aI-12 -aa(lp7717 -g15 -aI675 -aI121 -aI655 -aI49 -aI663 -aI89 -aa(lp7718 -g15 -aI720 -aI195 -aI687 -aI152 -aI702 -aI177 -aa(lp7719 -g15 -aI778 -aI232 -aI737 -aI213 -aI757 -aI225 -aa(lp7720 -g15 -aI843 -aI243 -aI799 -aI239 -aI821 -aI243 -aa(lp7721 -g20 -aI865 -aI243 -aa(lp7722 -g20 -aI865 -aI320 -aa(lp7723 -g20 -aI769 -aI320 -aa(lp7724 -g15 -aI651 -aI303 -aI729 -aI320 -aI690 -aI314 -aa(lp7725 -g15 -aI545 -aI247 -aI612 -aI291 -aI577 -aI272 -aa(lp7726 -g15 -aI467 -aI149 -aI514 -aI222 -aI488 -aI189 -aa(lp7727 -g15 -aI429 -aI5 -aI446 -aI110 -aI433 -aI62 -aa(lp7728 -g15 -aI272 -aI-48 -aI369 -aI-3 -aI316 -aI-21 -aa(lp7729 -g15 -aI161 -aI-151 -aI227 -aI-75 -aI190 -aI-110 -aa(lp7730 -g15 -aI95 -aI-297 -aI131 -aI-193 -aI109 -aI-241 -aa(lp7731 -g15 -aI73 -aI-478 -aI80 -aI-352 -aI73 -aI-412 -aa(lp7732 -g15 -aI101 -aI-678 -aI73 -aI-551 -aI82 -aI-618 -aa(lp7733 -g15 -aI185 -aI-832 -aI120 -aI-739 -aI148 -aI-790 -aa(lp7734 -g15 -aI327 -aI-931 -aI223 -aI-875 -aI270 -aI-908 -aa(lp7735 -g15 -aI526 -aI-966 -aI383 -aI-954 -aI450 -aI-966 -aa(lp7736 -g15 -aI718 -aI-931 -aI598 -aI-966 -aI662 -aI-954 -aa(lp7737 -g15 -aI859 -aI-832 -aI774 -aI-908 -aI821 -aI-875 -aa(lp7738 -g15 -aI946 -aI-678 -aI897 -aI-789 -aI926 -aI-738 -aa(lp7739 -g15 -aI975 -aI-476 -aI966 -aI-618 -aI975 -aI-550 -aa(lp7740 -g10 -aa(lp7741 -g8 -aI297 -aI-476 -aa(lp7742 -g15 -aI309 -aI-306 -aI297 -aI-412 -aI301 -aI-356 -aa(lp7743 -g15 -aI349 -aI-179 -aI318 -aI-256 -aI331 -aI-214 -aa(lp7744 -g15 -aI420 -aI-100 -aI367 -aI-145 -aI391 -aI-118 -aa(lp7745 -g15 -aI525 -aI-73 -aI449 -aI-82 -aI484 -aI-73 -aa(lp7746 -g15 -aI631 -aI-100 -aI567 -aI-73 -aI602 -aI-82 -aa(lp7747 -g15 -aI701 -aI-179 -aI660 -aI-118 -aI683 -aI-145 -aa(lp7748 -g15 -aI739 -aI-306 -aI718 -aI-214 -aI731 -aI-256 -aa(lp7749 -g15 -aI751 -aI-476 -aI747 -aI-356 -aI751 -aI-412 -aa(lp7750 -g15 -aI739 -aI-647 -aI751 -aI-540 -aI747 -aI-597 -aa(lp7751 -g15 -aI701 -aI-773 -aI731 -aI-697 -aI718 -aI-739 -aa(lp7752 -g15 -aI631 -aI-852 -aI683 -aI-808 -aI660 -aI-834 -aa(lp7753 -g15 -aI526 -aI-879 -aI602 -aI-870 -aI567 -aI-879 -aa(lp7754 -g15 -aI420 -aI-852 -aI485 -aI-879 -aI449 -aI-870 -aa(lp7755 -g15 -aI349 -aI-773 -aI391 -aI-834 -aI367 -aI-808 -aa(lp7756 -g15 -aI309 -aI-647 -aI331 -aI-739 -aI318 -aI-697 -aa(lp7757 -g15 -aI297 -aI-476 -aI301 -aI-597 -aI297 -aI-540 -aa(lp7758 -g10 -aa(lp7759 -g8 -aI1049 -aI0 -aa(lp7760 -g10 -aa(lp7761 -g8 -aI1049 -aI0 -aasVU -(lp7762 -(lp7763 -g8 -aI974 -aI-881 -aa(lp7764 -g20 -aI917 -aI-881 -aa(lp7765 -g15 -aI891 -aI-878 -aI908 -aI-881 -aI899 -aI-880 -aa(lp7766 -g15 -aI869 -aI-866 -aI883 -aI-876 -aI875 -aI-872 -aa(lp7767 -g15 -aI854 -aI-840 -aI863 -aI-860 -aI858 -aI-851 -aa(lp7768 -g15 -aI849 -aI-794 -aI851 -aI-828 -aI849 -aI-813 -aa(lp7769 -g20 -aI849 -aI-274 -aa(lp7770 -g15 -aI830 -aI-153 -aI849 -aI-229 -aI843 -aI-189 -aa(lp7771 -g15 -aI770 -aI-63 -aI817 -aI-118 -aI797 -aI-88 -aa(lp7772 -g15 -aI666 -aI-6 -aI743 -aI-38 -aI708 -aI-19 -aa(lp7773 -g15 -aI516 -aI13 -aI624 -aI6 -aI574 -aI13 -aa(lp7774 -g15 -aI360 -aI-3 -aI458 -aI13 -aI406 -aI7 -aa(lp7775 -g15 -aI244 -aI-56 -aI314 -aI-14 -aI275 -aI-31 -aa(lp7776 -g15 -aI171 -aI-150 -aI212 -aI-80 -aI188 -aI-111 -aa(lp7777 -g15 -aI146 -aI-289 -aI154 -aI-188 -aI146 -aI-235 -aa(lp7778 -g20 -aI146 -aI-799 -aa(lp7779 -g15 -aI140 -aI-842 -aI146 -aI-817 -aI144 -aI-831 -aa(lp7780 -g15 -aI125 -aI-866 -aI137 -aI-852 -aI132 -aI-861 -aa(lp7781 -g15 -aI104 -aI-878 -aI119 -aI-872 -aI112 -aI-876 -aa(lp7782 -g15 -aI78 -aI-881 -aI96 -aI-880 -aI87 -aI-881 -aa(lp7783 -g20 -aI21 -aI-881 -aa(lp7784 -g20 -aI21 -aI-951 -aa(lp7785 -g20 -aI481 -aI-951 -aa(lp7786 -g20 -aI481 -aI-881 -aa(lp7787 -g20 -aI425 -aI-881 -aa(lp7788 -g15 -aI399 -aI-878 -aI416 -aI-881 -aI407 -aI-880 -aa(lp7789 -g15 -aI377 -aI-866 -aI390 -aI-876 -aI383 -aI-872 -aa(lp7790 -g15 -aI362 -aI-840 -aI370 -aI-860 -aI366 -aI-851 -aa(lp7791 -g15 -aI357 -aI-794 -aI359 -aI-828 -aI357 -aI-813 -aa(lp7792 -g20 -aI357 -aI-279 -aa(lp7793 -g15 -aI371 -aI-185 -aI357 -aI-242 -aI362 -aI-210 -aa(lp7794 -g15 -aI411 -aI-124 -aI380 -aI-160 -aI394 -aI-139 -aa(lp7795 -g15 -aI473 -aI-91 -aI428 -aI-108 -aI449 -aI-97 -aa(lp7796 -g15 -aI555 -aI-80 -aI498 -aI-84 -aI525 -aI-80 -aa(lp7797 -g15 -aI636 -aI-92 -aI585 -aI-80 -aI612 -aI-84 -aa(lp7798 -g15 -aI696 -aI-127 -aI659 -aI-99 -aI680 -aI-111 -aa(lp7799 -g15 -aI735 -aI-189 -aI713 -aI-143 -aI726 -aI-164 -aa(lp7800 -g15 -aI749 -aI-276 -aI744 -aI-213 -aI749 -aI-243 -aa(lp7801 -g20 -aI749 -aI-799 -aa(lp7802 -g15 -aI744 -aI-842 -aI749 -aI-817 -aI747 -aI-831 -aa(lp7803 -g15 -aI729 -aI-866 -aI740 -aI-852 -aI735 -aI-861 -aa(lp7804 -g15 -aI707 -aI-878 -aI723 -aI-872 -aI715 -aI-876 -aa(lp7805 -g15 -aI681 -aI-881 -aI699 -aI-880 -aI690 -aI-881 -aa(lp7806 -g20 -aI625 -aI-881 -aa(lp7807 -g20 -aI625 -aI-951 -aa(lp7808 -g20 -aI974 -aI-951 -aa(lp7809 -g10 -aa(lp7810 -g8 -aI996 -aI0 -aa(lp7811 -g10 -aa(lp7812 -g8 -aI996 -aI0 -aasVY -(lp7813 -(lp7814 -g8 -aI218 -aI0 -aa(lp7815 -g20 -aI218 -aI-70 -aa(lp7816 -g20 -aI281 -aI-70 -aa(lp7817 -g15 -aI311 -aI-72 -aI292 -aI-70 -aI302 -aI-71 -aa(lp7818 -g15 -aI335 -aI-82 -aI320 -aI-73 -aI328 -aI-77 -aa(lp7819 -g15 -aI352 -aI-106 -aI342 -aI-87 -aI348 -aI-96 -aa(lp7820 -g15 -aI358 -aI-151 -aI356 -aI-117 -aI358 -aI-132 -aa(lp7821 -g20 -aI358 -aI-336 -aa(lp7822 -g20 -aI111 -aI-810 -aa(lp7823 -g15 -aI93 -aI-843 -aI105 -aI-823 -aI99 -aI-834 -aa(lp7824 -g15 -aI74 -aI-865 -aI87 -aI-852 -aI81 -aI-859 -aa(lp7825 -g15 -aI50 -aI-877 -aI67 -aI-870 -aI59 -aI-874 -aa(lp7826 -g15 -aI17 -aI-881 -aI41 -aI-879 -aI30 -aI-881 -aa(lp7827 -g20 -aI0 -aI-881 -aa(lp7828 -g20 -aI0 -aI-951 -aa(lp7829 -g20 -aI446 -aI-951 -aa(lp7830 -g20 -aI446 -aI-881 -aa(lp7831 -g20 -aI423 -aI-881 -aa(lp7832 -g15 -aI363 -aI-864 -aI396 -aI-881 -aI376 -aI-875 -aa(lp7833 -g15 -aI343 -aI-821 -aI350 -aI-853 -aI343 -aI-839 -aa(lp7834 -g15 -aI349 -aI-784 -aI343 -aI-809 -aI345 -aI-797 -aa(lp7835 -g15 -aI363 -aI-747 -aI354 -aI-771 -aI358 -aI-758 -aa(lp7836 -g20 -aI462 -aI-551 -aa(lp7837 -g15 -aI497 -aI-476 -aI476 -aI-523 -aI488 -aI-498 -aa(lp7838 -g15 -aI521 -aI-412 -aI505 -aI-455 -aI514 -aI-433 -aa(lp7839 -g15 -aI553 -aI-489 -aI530 -aI-436 -aI541 -aI-461 -aa(lp7840 -g15 -aI593 -aI-575 -aI564 -aI-517 -aI578 -aI-545 -aa(lp7841 -g20 -aI670 -aI-735 -aa(lp7842 -g15 -aI689 -aI-784 -aI680 -aI-754 -aI686 -aI-771 -aa(lp7843 -g15 -aI693 -aI-815 -aI691 -aI-797 -aI693 -aI-807 -aa(lp7844 -g15 -aI671 -aI-865 -aI693 -aI-838 -aI686 -aI-855 -aa(lp7845 -g15 -aI605 -aI-881 -aI657 -aI-875 -aI634 -aI-881 -aa(lp7846 -g20 -aI574 -aI-881 -aa(lp7847 -g20 -aI574 -aI-951 -aa(lp7848 -g20 -aI923 -aI-951 -aa(lp7849 -g20 -aI923 -aI-881 -aa(lp7850 -g20 -aI898 -aI-881 -aa(lp7851 -g15 -aI869 -aI-876 -aI887 -aI-881 -aI877 -aI-879 -aa(lp7852 -g15 -aI846 -aI-860 -aI861 -aI-873 -aI853 -aI-868 -aa(lp7853 -g15 -aI824 -aI-828 -aI839 -aI-852 -aI832 -aI-841 -aa(lp7854 -g15 -aI797 -aI-776 -aI816 -aI-814 -aI807 -aI-797 -aa(lp7855 -g20 -aI570 -aI-335 -aa(lp7856 -g20 -aI570 -aI-153 -aa(lp7857 -g15 -aI576 -aI-107 -aI570 -aI-133 -aI572 -aI-118 -aa(lp7858 -g15 -aI592 -aI-82 -aI580 -aI-96 -aI586 -aI-88 -aa(lp7859 -g15 -aI616 -aI-72 -aI599 -aI-77 -aI607 -aI-73 -aa(lp7860 -g15 -aI645 -aI-70 -aI625 -aI-71 -aI634 -aI-70 -aa(lp7861 -g20 -aI710 -aI-70 -aa(lp7862 -g20 -aI710 -aI0 -aa(lp7863 -g10 -aa(lp7864 -g8 -aI923 -aI0 -aa(lp7865 -g10 -aa(lp7866 -g8 -aI923 -aI0 -aasV] -(lp7867 -(lp7868 -g8 -aI418 -aI-1012 -aa(lp7869 -g20 -aI418 -aI171 -aa(lp7870 -g20 -aI49 -aI171 -aa(lp7871 -g20 -aI49 -aI100 -aa(lp7872 -g20 -aI106 -aI100 -aa(lp7873 -g15 -aI149 -aI97 -aI121 -aI100 -aI136 -aI99 -aa(lp7874 -g15 -aI183 -aI84 -aI162 -aI95 -aI174 -aI90 -aa(lp7875 -g15 -aI207 -aI54 -aI193 -aI77 -aI201 -aI67 -aa(lp7876 -g15 -aI216 -aI4 -aI213 -aI42 -aI216 -aI25 -aa(lp7877 -g20 -aI216 -aI-845 -aa(lp7878 -g15 -aI207 -aI-896 -aI216 -aI-867 -aI213 -aI-884 -aa(lp7879 -g15 -aI183 -aI-925 -aI201 -aI-909 -aI193 -aI-918 -aa(lp7880 -g15 -aI149 -aI-939 -aI174 -aI-932 -aI162 -aI-936 -aa(lp7881 -g15 -aI106 -aI-942 -aI136 -aI-941 -aI121 -aI-942 -aa(lp7882 -g20 -aI49 -aI-942 -aa(lp7883 -g20 -aI49 -aI-1012 -aa(lp7884 -g10 -aa(lp7885 -g8 -aI552 -aI0 -aa(lp7886 -g10 -aa(lp7887 -g8 -aI552 -aI0 -aasVa -(lp7888 -(lp7889 -g8 -aI266 -aI-198 -aa(lp7890 -g15 -aI285 -aI-112 -aI266 -aI-159 -aI273 -aI-131 -aa(lp7891 -g15 -aI342 -aI-83 -aI297 -aI-93 -aI316 -aI-83 -aa(lp7892 -g15 -aI394 -aI-95 -aI361 -aI-83 -aI378 -aI-87 -aa(lp7893 -g15 -aI433 -aI-129 -aI409 -aI-103 -aI422 -aI-114 -aa(lp7894 -g15 -aI459 -aI-183 -aI444 -aI-144 -aI453 -aI-162 -aa(lp7895 -g15 -aI468 -aI-254 -aI465 -aI-204 -aI468 -aI-228 -aa(lp7896 -g20 -aI468 -aI-354 -aa(lp7897 -g20 -aI408 -aI-350 -aa(lp7898 -g15 -aI341 -aI-337 -aI381 -aI-349 -aI359 -aI-344 -aa(lp7899 -g15 -aI297 -aI-308 -aI322 -aI-330 -aI308 -aI-320 -aa(lp7900 -g15 -aI274 -aI-261 -aI286 -aI-295 -aI278 -aI-280 -aa(lp7901 -g15 -aI266 -aI-198 -aI269 -aI-243 -aI266 -aI-222 -aa(lp7902 -g10 -aa(lp7903 -g8 -aI385 -aI-649 -aa(lp7904 -g15 -aI342 -aI-639 -aI368 -aI-649 -aI354 -aI-646 -aa(lp7905 -g15 -aI315 -aI-609 -aI331 -aI-632 -aI322 -aI-622 -aa(lp7906 -g15 -aI300 -aI-563 -aI308 -aI-596 -aI303 -aI-581 -aa(lp7907 -g15 -aI296 -aI-506 -aI297 -aI-546 -aI296 -aI-526 -aa(lp7908 -g15 -aI161 -aI-526 -aI236 -aI-506 -aI191 -aI-512 -aa(lp7909 -g15 -aI115 -aI-595 -aI130 -aI-539 -aI115 -aI-562 -aa(lp7910 -g15 -aI137 -aI-657 -aI115 -aI-619 -aI123 -aI-640 -aa(lp7911 -g15 -aI196 -aI-700 -aI152 -aI-675 -aI171 -aI-689 -aa(lp7912 -g15 -aI284 -aI-723 -aI221 -aI-710 -aI250 -aI-718 -aa(lp7913 -g15 -aI390 -aI-731 -aI317 -aI-728 -aI352 -aI-731 -aa(lp7914 -g15 -aI513 -aI-719 -aI437 -aI-731 -aI478 -aI-727 -aa(lp7915 -g15 -aI600 -aI-680 -aI548 -aI-711 -aI577 -aI-698 -aa(lp7916 -g15 -aI652 -aI-610 -aI623 -aI-662 -aI641 -aI-639 -aa(lp7917 -g15 -aI670 -aI-504 -aI664 -aI-581 -aI670 -aI-546 -aa(lp7918 -g20 -aI670 -aI-164 -aa(lp7919 -g15 -aI674 -aI-119 -aI670 -aI-146 -aI671 -aI-131 -aa(lp7920 -g15 -aI688 -aI-90 -aI677 -aI-107 -aI682 -aI-97 -aa(lp7921 -g15 -aI712 -aI-75 -aI694 -aI-83 -aI702 -aI-78 -aa(lp7922 -g15 -aI750 -aI-70 -aI723 -aI-72 -aI735 -aI-70 -aa(lp7923 -g20 -aI755 -aI-70 -aa(lp7924 -g20 -aI755 -aI0 -aa(lp7925 -g20 -aI507 -aI0 -aa(lp7926 -g20 -aI479 -aI-91 -aa(lp7927 -g20 -aI468 -aI-91 -aa(lp7928 -g15 -aI426 -aI-44 -aI453 -aI-73 -aI439 -aI-58 -aa(lp7929 -g15 -aI384 -aI-11 -aI413 -aI-31 -aI399 -aI-20 -aa(lp7930 -g15 -aI334 -aI7 -aI370 -aI-3 -aI353 -aI3 -aa(lp7931 -g15 -aI269 -aI13 -aI316 -aI11 -aI294 -aI13 -aa(lp7932 -g15 -aI187 -aI0 -aI240 -aI13 -aI212 -aI9 -aa(lp7933 -g15 -aI120 -aI-39 -aI161 -aI-8 -aI139 -aI-21 -aa(lp7934 -g15 -aI76 -aI-107 -aI101 -aI-57 -aI87 -aI-80 -aa(lp7935 -g15 -aI59 -aI-203 -aI65 -aI-134 -aI59 -aI-166 -aa(lp7936 -g15 -aI134 -aI-364 -aI59 -aI-275 -aI84 -aI-329 -aa(lp7937 -g15 -aI358 -aI-420 -aI184 -aI-398 -aI258 -aI-417 -aa(lp7938 -g20 -aI468 -aI-424 -aa(lp7939 -g20 -aI468 -aI-498 -aa(lp7940 -g15 -aI465 -aI-559 -aI468 -aI-520 -aI467 -aI-540 -aa(lp7941 -g15 -aI454 -aI-607 -aI463 -aI-578 -aI460 -aI-594 -aa(lp7942 -g15 -aI429 -aI-638 -aI448 -aI-621 -aI440 -aI-631 -aa(lp7943 -g15 -aI385 -aI-649 -aI418 -aI-646 -aI403 -aI-649 -aa(lp7944 -g10 -aa(lp7945 -g8 -aI798 -aI0 -aa(lp7946 -g10 -aa(lp7947 -g8 -aI798 -aI0 -aasVe -(lp7948 -(lp7949 -g8 -aI395 -aI-644 -aa(lp7950 -g15 -aI306 -aI-589 -aI358 -aI-644 -aI328 -aI-626 -aa(lp7951 -g15 -aI270 -aI-427 -aI285 -aI-552 -aI273 -aI-498 -aa(lp7952 -g20 -aI501 -aI-427 -aa(lp7953 -g15 -aI495 -aI-518 -aI501 -aI-461 -aI499 -aI-491 -aa(lp7954 -g15 -aI476 -aI-586 -aI491 -aI-545 -aI485 -aI-568 -aa(lp7955 -g15 -aI444 -aI-629 -aI468 -aI-605 -aI457 -aI-619 -aa(lp7956 -g15 -aI395 -aI-644 -aI431 -aI-639 -aI414 -aI-644 -aa(lp7957 -g10 -aa(lp7958 -g8 -aI408 -aI13 -aa(lp7959 -g15 -aI258 -aI-11 -aI351 -aI13 -aI301 -aI5 -aa(lp7960 -g15 -aI150 -aI-82 -aI215 -aI-27 -aI179 -aI-51 -aa(lp7961 -g15 -aI84 -aI-197 -aI121 -aI-114 -aI99 -aI-152 -aa(lp7962 -g15 -aI62 -aI-353 -aI69 -aI-243 -aI62 -aI-294 -aa(lp7963 -g15 -aI84 -aI-517 -aI62 -aI-415 -aI69 -aI-470 -aa(lp7964 -g15 -aI149 -aI-636 -aI99 -aI-565 -aI120 -aI-604 -aa(lp7965 -g15 -aI252 -aI-707 -aI177 -aI-667 -aI211 -aI-691 -aa(lp7966 -g15 -aI393 -aI-731 -aI293 -aI-723 -aI340 -aI-731 -aa(lp7967 -g15 -aI523 -aI-710 -aI441 -aI-731 -aI484 -aI-724 -aa(lp7968 -g15 -aI621 -aI-649 -aI562 -aI-697 -aI594 -aI-676 -aa(lp7969 -g15 -aI683 -aI-549 -aI648 -aI-623 -aI669 -aI-589 -aa(lp7970 -g15 -aI705 -aI-410 -aI697 -aI-509 -aI705 -aI-463 -aa(lp7971 -g20 -aI705 -aI-341 -aa(lp7972 -g20 -aI268 -aI-341 -aa(lp7973 -g15 -aI282 -aI-226 -aI269 -aI-297 -aI274 -aI-258 -aa(lp7974 -g15 -aI318 -aI-147 -aI291 -aI-194 -aI303 -aI-168 -aa(lp7975 -g15 -aI372 -aI-101 -aI333 -aI-126 -aI351 -aI-111 -aa(lp7976 -g15 -aI446 -aI-86 -aI394 -aI-91 -aI418 -aI-86 -aa(lp7977 -g15 -aI510 -aI-94 -aI469 -aI-86 -aI490 -aI-88 -aa(lp7978 -g15 -aI563 -aI-117 -aI529 -aI-99 -aI547 -aI-107 -aa(lp7979 -g15 -aI605 -aI-151 -aI579 -aI-126 -aI593 -aI-138 -aa(lp7980 -g15 -aI634 -aI-194 -aI617 -aI-164 -aI626 -aI-179 -aa(lp7981 -g15 -aI670 -aI-129 -aI658 -aI-181 -aI670 -aI-159 -aa(lp7982 -g15 -aI654 -aI-74 -aI670 -aI-110 -aI665 -aI-91 -aa(lp7983 -g15 -aI606 -aI-29 -aI644 -aI-57 -aI628 -aI-42 -aa(lp7984 -g15 -aI525 -aI1 -aI585 -aI-16 -aI557 -aI-6 -aa(lp7985 -g15 -aI408 -aI13 -aI492 -aI9 -aI453 -aI13 -aa(lp7986 -g10 -aa(lp7987 -g8 -aI761 -aI0 -aa(lp7988 -g10 -aa(lp7989 -g8 -aI761 -aI0 -aasVi -(lp7990 -(lp7991 -g8 -aI114 -aI-930 -aa(lp7992 -g15 -aI123 -aI-974 -aI114 -aI-947 -aI117 -aI-962 -aa(lp7993 -g15 -aI147 -aI-1003 -aI129 -aI-986 -aI137 -aI-996 -aa(lp7994 -g15 -aI183 -aI-1020 -aI157 -aI-1011 -aI169 -aI-1017 -aa(lp7995 -g15 -aI227 -aI-1026 -aI196 -aI-1024 -aI211 -aI-1026 -aa(lp7996 -g15 -aI271 -aI-1020 -aI243 -aI-1026 -aI257 -aI-1024 -aa(lp7997 -g15 -aI307 -aI-1003 -aI285 -aI-1017 -aI297 -aI-1011 -aa(lp7998 -g15 -aI333 -aI-974 -aI318 -aI-996 -aI326 -aI-986 -aa(lp7999 -g15 -aI342 -aI-930 -aI339 -aI-962 -aI342 -aI-947 -aa(lp8000 -g15 -aI333 -aI-887 -aI342 -aI-914 -aI339 -aI-899 -aa(lp8001 -g15 -aI307 -aI-857 -aI326 -aI-875 -aI318 -aI-865 -aa(lp8002 -g15 -aI271 -aI-840 -aI297 -aI-849 -aI285 -aI-843 -aa(lp8003 -g15 -aI227 -aI-834 -aI257 -aI-836 -aI243 -aI-834 -aa(lp8004 -g15 -aI183 -aI-840 -aI211 -aI-834 -aI196 -aI-836 -aa(lp8005 -g15 -aI147 -aI-857 -aI169 -aI-843 -aI157 -aI-849 -aa(lp8006 -g15 -aI123 -aI-887 -aI137 -aI-865 -aI129 -aI-875 -aa(lp8007 -g15 -aI114 -aI-930 -aI117 -aI-899 -aI114 -aI-914 -aa(lp8008 -g10 -aa(lp8009 -g8 -aI38 -aI-70 -aa(lp8010 -g15 -aI69 -aI-73 -aI48 -aI-70 -aI58 -aI-71 -aa(lp8011 -g15 -aI100 -aI-85 -aI81 -aI-75 -aI91 -aI-79 -aa(lp8012 -g15 -aI124 -aI-111 -aI109 -aI-91 -aI117 -aI-100 -aa(lp8013 -g15 -aI133 -aI-157 -aI130 -aI-122 -aI133 -aI-138 -aa(lp8014 -g20 -aI133 -aI-562 -aa(lp8015 -g15 -aI124 -aI-604 -aI133 -aI-579 -aI130 -aI-594 -aa(lp8016 -g15 -aI100 -aI-629 -aI117 -aI-615 -aI109 -aI-623 -aa(lp8017 -g15 -aI69 -aI-640 -aI90 -aI-635 -aI80 -aI-639 -aa(lp8018 -g15 -aI38 -aI-643 -aI58 -aI-642 -aI47 -aI-643 -aa(lp8019 -g20 -aI22 -aI-643 -aa(lp8020 -g20 -aI22 -aI-714 -aa(lp8021 -g20 -aI335 -aI-714 -aa(lp8022 -g20 -aI335 -aI-157 -aa(lp8023 -g15 -aI345 -aI-111 -aI335 -aI-138 -aI339 -aI-122 -aa(lp8024 -g15 -aI368 -aI-85 -aI351 -aI-100 -aI359 -aI-91 -aa(lp8025 -g15 -aI399 -aI-73 -aI378 -aI-79 -aI388 -aI-75 -aa(lp8026 -g15 -aI430 -aI-70 -aI411 -aI-71 -aI421 -aI-70 -aa(lp8027 -g20 -aI446 -aI-70 -aa(lp8028 -g20 -aI446 -aI0 -aa(lp8029 -g20 -aI22 -aI0 -aa(lp8030 -g20 -aI22 -aI-70 -aa(lp8031 -g10 -aa(lp8032 -g8 -aI469 -aI0 -aa(lp8033 -g10 -aa(lp8034 -g8 -aI469 -aI0 -aasVm -(lp8035 -(lp8036 -g8 -aI558 -aI0 -aa(lp8037 -g20 -aI558 -aI-438 -aa(lp8038 -g15 -aI553 -aI-514 -aI558 -aI-466 -aI556 -aI-492 -aa(lp8039 -g15 -aI534 -aI-571 -aI549 -aI-537 -aI543 -aI-555 -aa(lp8040 -g15 -aI501 -aI-605 -aI526 -aI-586 -aI515 -aI-597 -aa(lp8041 -g15 -aI451 -aI-618 -aI487 -aI-614 -aI471 -aI-618 -aa(lp8042 -g15 -aI396 -aI-601 -aI429 -aI-618 -aI411 -aI-612 -aa(lp8043 -g15 -aI361 -aI-555 -aI381 -aI-589 -aI369 -aI-574 -aa(lp8044 -g15 -aI341 -aI-490 -aI352 -aI-536 -aI345 -aI-515 -aa(lp8045 -g15 -aI335 -aI-411 -aI337 -aI-465 -aI335 -aI-439 -aa(lp8046 -g20 -aI335 -aI-157 -aa(lp8047 -g15 -aI342 -aI-112 -aI335 -aI-138 -aI338 -aI-123 -aa(lp8048 -g15 -aI361 -aI-85 -aI347 -aI-100 -aI353 -aI-92 -aa(lp8049 -g15 -aI392 -aI-73 -aI370 -aI-79 -aI380 -aI-75 -aa(lp8050 -g15 -aI432 -aI-70 -aI404 -aI-71 -aI417 -aI-70 -aa(lp8051 -g20 -aI436 -aI-70 -aa(lp8052 -g20 -aI436 -aI0 -aa(lp8053 -g20 -aI26 -aI0 -aa(lp8054 -g20 -aI26 -aI-70 -aa(lp8055 -g20 -aI29 -aI-70 -aa(lp8056 -g15 -aI70 -aI-73 -aI44 -aI-70 -aI58 -aI-71 -aa(lp8057 -g15 -aI103 -aI-86 -aI83 -aI-75 -aI94 -aI-79 -aa(lp8058 -g15 -aI125 -aI-114 -aI113 -aI-92 -aI120 -aI-101 -aa(lp8059 -g15 -aI133 -aI-162 -aI130 -aI-126 -aI133 -aI-142 -aa(lp8060 -g20 -aI133 -aI-560 -aa(lp8061 -g15 -aI126 -aI-605 -aI133 -aI-579 -aI131 -aI-594 -aa(lp8062 -g15 -aI107 -aI-632 -aI122 -aI-616 -aI115 -aI-625 -aa(lp8063 -g15 -aI76 -aI-644 -aI98 -aI-638 -aI88 -aI-642 -aa(lp8064 -g15 -aI37 -aI-647 -aI65 -aI-646 -aI51 -aI-647 -aa(lp8065 -g20 -aI33 -aI-647 -aa(lp8066 -g20 -aI33 -aI-714 -aa(lp8067 -g20 -aI313 -aI-714 -aa(lp8068 -g20 -aI330 -aI-619 -aa(lp8069 -g20 -aI337 -aI-619 -aa(lp8070 -g15 -aI379 -aI-679 -aI350 -aI-644 -aI364 -aI-664 -aa(lp8071 -g15 -aI427 -aI-713 -aI394 -aI-693 -aI410 -aI-705 -aa(lp8072 -g15 -aI481 -aI-728 -aI444 -aI-720 -aI462 -aI-725 -aa(lp8073 -g15 -aI541 -aI-731 -aI500 -aI-730 -aI520 -aI-731 -aa(lp8074 -g15 -aI666 -aI-704 -aI590 -aI-731 -aI631 -aI-722 -aa(lp8075 -g15 -aI742 -aI-619 -aI701 -aI-687 -aI726 -aI-658 -aa(lp8076 -g20 -aI754 -aI-619 -aa(lp8077 -g15 -aI798 -aI-679 -aI768 -aI-644 -aI782 -aI-664 -aa(lp8078 -g15 -aI849 -aI-713 -aI814 -aI-693 -aI831 -aI-705 -aa(lp8079 -g15 -aI905 -aI-728 -aI867 -aI-720 -aI886 -aI-725 -aa(lp8080 -g15 -aI966 -aI-731 -aI925 -aI-730 -aI945 -aI-731 -aa(lp8081 -g15 -aI1059 -aI-716 -aI1001 -aI-731 -aI1031 -aI-726 -aa(lp8082 -g15 -aI1128 -aI-670 -aI1086 -aI-706 -aI1109 -aI-690 -aa(lp8083 -g15 -aI1171 -aI-590 -aI1147 -aI-649 -aI1161 -aI-622 -aa(lp8084 -g15 -aI1186 -aI-474 -aI1181 -aI-558 -aI1186 -aI-519 -aa(lp8085 -g20 -aI1186 -aI-164 -aa(lp8086 -g15 -aI1192 -aI-115 -aI1186 -aI-144 -aI1188 -aI-127 -aa(lp8087 -g15 -aI1208 -aI-86 -aI1196 -aI-102 -aI1201 -aI-93 -aa(lp8088 -g15 -aI1236 -aI-73 -aI1216 -aI-80 -aI1225 -aI-75 -aa(lp8089 -g15 -aI1276 -aI-70 -aI1248 -aI-71 -aI1261 -aI-70 -aa(lp8090 -g20 -aI1279 -aI-70 -aa(lp8091 -g20 -aI1279 -aI0 -aa(lp8092 -g20 -aI983 -aI0 -aa(lp8093 -g20 -aI983 -aI-438 -aa(lp8094 -g15 -aI959 -aI-571 -aI983 -aI-495 -aI975 -aI-539 -aa(lp8095 -g15 -aI877 -aI-618 -aI944 -aI-602 -aI916 -aI-618 -aa(lp8096 -g15 -aI824 -aI-602 -aI856 -aI-618 -aI838 -aI-612 -aa(lp8097 -g15 -aI788 -aI-561 -aI809 -aI-592 -aI797 -aI-578 -aa(lp8098 -g15 -aI767 -aI-500 -aI778 -aI-544 -aI771 -aI-523 -aa(lp8099 -g15 -aI761 -aI-427 -aI763 -aI-477 -aI761 -aI-452 -aa(lp8100 -g20 -aI761 -aI-164 -aa(lp8101 -g15 -aI766 -aI-115 -aI761 -aI-144 -aI762 -aI-127 -aa(lp8102 -g15 -aI783 -aI-86 -aI770 -aI-102 -aI775 -aI-93 -aa(lp8103 -g15 -aI811 -aI-73 -aI790 -aI-80 -aI799 -aI-75 -aa(lp8104 -g15 -aI850 -aI-70 -aI822 -aI-71 -aI835 -aI-70 -aa(lp8105 -g20 -aI854 -aI-70 -aa(lp8106 -g20 -aI854 -aI0 -aa(lp8107 -g10 -aa(lp8108 -g8 -aI1314 -aI0 -aa(lp8109 -g10 -aa(lp8110 -g8 -aI1314 -aI0 -aasVq -(lp8111 -(lp8112 -g8 -aI395 -aI320 -aa(lp8113 -g20 -aI395 -aI249 -aa(lp8114 -g20 -aI419 -aI249 -aa(lp8115 -g15 -aI461 -aI247 -aI434 -aI249 -aI448 -aI248 -aa(lp8116 -g15 -aI495 -aI236 -aI474 -aI245 -aI486 -aI241 -aa(lp8117 -g15 -aI519 -aI211 -aI505 -aI230 -aI513 -aI222 -aa(lp8118 -g15 -aI527 -aI167 -aI525 -aI199 -aI527 -aI185 -aa(lp8119 -g20 -aI527 -aI69 -aa(lp8120 -g15 -aI528 -aI53 -aI527 -aI65 -aI528 -aI60 -aa(lp8121 -g15 -aI529 -aI31 -aI528 -aI47 -aI528 -aI39 -aa(lp8122 -g15 -aI531 -aI4 -aI530 -aI22 -aI530 -aI14 -aa(lp8123 -g15 -aI533 -aI-22 -aI532 -aI-4 -aI532 -aI-13 -aa(lp8124 -g15 -aI538 -aI-92 -aI534 -aI-44 -aI536 -aI-67 -aa(lp8125 -g20 -aI529 -aI-92 -aa(lp8126 -g15 -aI496 -aI-50 -aI520 -aI-77 -aI509 -aI-63 -aa(lp8127 -g15 -aI453 -aI-16 -aI484 -aI-37 -aI469 -aI-26 -aa(lp8128 -g15 -aI398 -aI5 -aI437 -aI-7 -aI418 -aI0 -aa(lp8129 -g15 -aI330 -aI13 -aI378 -aI10 -aI355 -aI13 -aa(lp8130 -g15 -aI216 -aI-8 -aI287 -aI13 -aI249 -aI6 -aa(lp8131 -g15 -aI131 -aI-75 -aI182 -aI-22 -aI154 -aI-45 -aa(lp8132 -g15 -aI79 -aI-191 -aI108 -aI-106 -aI91 -aI-144 -aa(lp8133 -g15 -aI61 -aI-358 -aI67 -aI-238 -aI61 -aI-294 -aa(lp8134 -g15 -aI79 -aI-523 -aI61 -aI-422 -aI67 -aI-477 -aa(lp8135 -g15 -aI131 -aI-638 -aI91 -aI-570 -aI108 -aI-608 -aa(lp8136 -g15 -aI217 -aI-705 -aI155 -aI-668 -aI183 -aI-691 -aa(lp8137 -g15 -aI333 -aI-727 -aI251 -aI-720 -aI289 -aI-727 -aa(lp8138 -g15 -aI403 -aI-719 -aI359 -aI-727 -aI382 -aI-724 -aa(lp8139 -g15 -aI459 -aI-695 -aI424 -aI-713 -aI443 -aI-706 -aa(lp8140 -g15 -aI504 -aI-659 -aI476 -aI-685 -aI491 -aI-673 -aa(lp8141 -g15 -aI538 -aI-610 -aI517 -aI-644 -aI528 -aI-628 -aa(lp8142 -g20 -aI550 -aI-610 -aa(lp8143 -g20 -aI577 -aI-714 -aa(lp8144 -g20 -aI846 -aI-714 -aa(lp8145 -g20 -aI846 -aI-643 -aa(lp8146 -g20 -aI841 -aI-643 -aa(lp8147 -g15 -aI799 -aI-640 -aI826 -aI-643 -aI812 -aI-642 -aa(lp8148 -g15 -aI763 -aI-627 -aI785 -aI-638 -aI774 -aI-633 -aa(lp8149 -g15 -aI739 -aI-599 -aI753 -aI-620 -aI745 -aI-611 -aa(lp8150 -g15 -aI730 -aI-550 -aI733 -aI-587 -aI730 -aI-570 -aa(lp8151 -g20 -aI730 -aI167 -aa(lp8152 -g15 -aI739 -aI211 -aI730 -aI185 -aI733 -aI199 -aa(lp8153 -g15 -aI762 -aI236 -aI745 -aI222 -aI752 -aI230 -aa(lp8154 -g15 -aI796 -aI247 -aI772 -aI241 -aI783 -aI245 -aa(lp8155 -g15 -aI838 -aI249 -aI809 -aI248 -aI823 -aI249 -aa(lp8156 -g20 -aI862 -aI249 -aa(lp8157 -g20 -aI862 -aI320 -aa(lp8158 -g10 -aa(lp8159 -g8 -aI390 -aI-627 -aa(lp8160 -g15 -aI295 -aI-560 -aI345 -aI-627 -aI314 -aI-605 -aa(lp8161 -g15 -aI266 -aI-356 -aI276 -aI-515 -aI266 -aI-447 -aa(lp8162 -g15 -aI295 -aI-154 -aI266 -aI-267 -aI276 -aI-200 -aa(lp8163 -g15 -aI390 -aI-84 -aI314 -aI-107 -aI345 -aI-84 -aa(lp8164 -g15 -aI456 -aI-102 -aI417 -aI-84 -aI439 -aI-90 -aa(lp8165 -g15 -aI499 -aI-154 -aI474 -aI-114 -aI488 -aI-131 -aa(lp8166 -g15 -aI521 -aI-238 -aI509 -aI-176 -aI517 -aI-205 -aa(lp8167 -g15 -aI527 -aI-355 -aI525 -aI-272 -aI527 -aI-311 -aa(lp8168 -g15 -aI521 -aI-475 -aI527 -aI-401 -aI525 -aI-441 -aa(lp8169 -g15 -aI499 -aI-560 -aI517 -aI-509 -aI509 -aI-538 -aa(lp8170 -g15 -aI456 -aI-611 -aI488 -aI-583 -aI474 -aI-600 -aa(lp8171 -g15 -aI390 -aI-627 -aI439 -aI-622 -aI417 -aI-627 -aa(lp8172 -g10 -aa(lp8173 -g8 -aI863 -aI0 -aa(lp8174 -g10 -aa(lp8175 -g8 -aI863 -aI0 -aasVu -(lp8176 -(lp8177 -g8 -aI590 -aI0 -aa(lp8178 -g20 -aI561 -aI-93 -aa(lp8179 -g20 -aI554 -aI-93 -aa(lp8180 -g15 -aI511 -aI-38 -aI541 -aI-70 -aI526 -aI-52 -aa(lp8181 -g15 -aI460 -aI-5 -aI495 -aI-24 -aI478 -aI-13 -aa(lp8182 -g15 -aI404 -aI9 -aI443 -aI1 -aI424 -aI6 -aa(lp8183 -g15 -aI343 -aI13 -aI384 -aI12 -aI364 -aI13 -aa(lp8184 -g15 -aI183 -aI-50 -aI274 -aI13 -aI221 -aI-8 -aa(lp8185 -g15 -aI128 -aI-250 -aI146 -aI-93 -aI128 -aI-160 -aa(lp8186 -g20 -aI128 -aI-549 -aa(lp8187 -g15 -aI123 -aI-596 -aI128 -aI-568 -aI126 -aI-584 -aa(lp8188 -g15 -aI106 -aI-625 -aI119 -aI-608 -aI114 -aI-618 -aa(lp8189 -g15 -aI78 -aI-639 -aI99 -aI-632 -aI89 -aI-636 -aa(lp8190 -g15 -aI37 -aI-643 -aI66 -aI-642 -aI53 -aI-643 -aa(lp8191 -g20 -aI34 -aI-643 -aa(lp8192 -g20 -aI34 -aI-714 -aa(lp8193 -g20 -aI330 -aI-714 -aa(lp8194 -g20 -aI330 -aI-287 -aa(lp8195 -g15 -aI335 -aI-209 -aI330 -aI-258 -aI332 -aI-232 -aa(lp8196 -g15 -aI352 -aI-150 -aI338 -aI-186 -aI344 -aI-167 -aa(lp8197 -g15 -aI383 -aI-113 -aI360 -aI-134 -aI370 -aI-122 -aa(lp8198 -g15 -aI432 -aI-99 -aI396 -aI-104 -aI412 -aI-99 -aa(lp8199 -g15 -aI487 -aI-113 -aI453 -aI-99 -aI471 -aI-104 -aa(lp8200 -g15 -aI525 -aI-154 -aI502 -aI-123 -aI515 -aI-136 -aa(lp8201 -g15 -aI546 -aI-217 -aI534 -aI-171 -aI541 -aI-193 -aa(lp8202 -g15 -aI553 -aI-302 -aI551 -aI-242 -aI553 -aI-271 -aa(lp8203 -g20 -aI553 -aI-558 -aa(lp8204 -g15 -aI545 -aI-604 -aI553 -aI-577 -aI550 -aI-593 -aa(lp8205 -g15 -aI524 -aI-630 -aI540 -aI-615 -aI533 -aI-624 -aa(lp8206 -g15 -aI494 -aI-641 -aI516 -aI-635 -aI505 -aI-639 -aa(lp8207 -g15 -aI457 -aI-643 -aI482 -aI-642 -aI470 -aI-643 -aa(lp8208 -g20 -aI453 -aI-643 -aa(lp8209 -g20 -aI453 -aI-714 -aa(lp8210 -g20 -aI755 -aI-714 -aa(lp8211 -g20 -aI755 -aI-154 -aa(lp8212 -g15 -aI762 -aI-108 -aI755 -aI-134 -aI758 -aI-119 -aa(lp8213 -g15 -aI781 -aI-83 -aI767 -aI-97 -aI773 -aI-89 -aa(lp8214 -g15 -aI809 -aI-72 -aI789 -aI-77 -aI798 -aI-74 -aa(lp8215 -g15 -aI845 -aI-70 -aI820 -aI-71 -aI832 -aI-70 -aa(lp8216 -g20 -aI856 -aI-70 -aa(lp8217 -g20 -aI856 -aI0 -aa(lp8218 -g10 -aa(lp8219 -g8 -aI889 -aI0 -aa(lp8220 -g10 -aa(lp8221 -g8 -aI889 -aI0 -aasVy -(lp8222 -(lp8223 -g8 -aI772 -aI-714 -aa(lp8224 -g20 -aI772 -aI-643 -aa(lp8225 -g15 -aI736 -aI-638 -aI758 -aI-643 -aI746 -aI-641 -aa(lp8226 -g15 -aI708 -aI-622 -aI726 -aI-635 -aI717 -aI-630 -aa(lp8227 -g15 -aI686 -aI-592 -aI700 -aI-615 -aI693 -aI-605 -aa(lp8228 -g15 -aI665 -aI-546 -aI679 -aI-580 -aI672 -aI-565 -aa(lp8229 -g15 -aI616 -aI-411 -aI649 -aI-502 -aI633 -aI-457 -aa(lp8230 -g15 -aI565 -aI-272 -aI599 -aI-364 -aI582 -aI-318 -aa(lp8231 -g15 -aI513 -aI-134 -aI548 -aI-226 -aI531 -aI-180 -aa(lp8232 -g15 -aI464 -aI0 -aI496 -aI-88 -aI480 -aI-43 -aa(lp8233 -g15 -aI419 -aI113 -aI448 -aI43 -aI433 -aI81 -aa(lp8234 -g15 -aI375 -aI198 -aI406 -aI146 -aI391 -aI174 -aa(lp8235 -g15 -aI324 -aI257 -aI360 -aI222 -aI343 -aI241 -aa(lp8236 -g15 -aI259 -aI295 -aI306 -aI273 -aI284 -aI285 -aa(lp8237 -g15 -aI173 -aI314 -aI235 -aI304 -aI206 -aI311 -aa(lp8238 -g15 -aI58 -aI320 -aI140 -aI318 -aI102 -aI320 -aa(lp8239 -g20 -aI35 -aI320 -aa(lp8240 -g20 -aI35 -aI243 -aa(lp8241 -g15 -aI154 -aI226 -aI82 -aI243 -aI121 -aI237 -aa(lp8242 -g15 -aI236 -aI178 -aI186 -aI215 -aI214 -aI199 -aa(lp8243 -g15 -aI292 -aI103 -aI259 -aI157 -aI278 -aI132 -aa(lp8244 -g15 -aI330 -aI6 -aI307 -aI74 -aI319 -aI42 -aa(lp8245 -g20 -aI90 -aI-579 -aa(lp8246 -g15 -aI72 -aI-609 -aI85 -aI-592 -aI79 -aI-602 -aa(lp8247 -g15 -aI52 -aI-626 -aI66 -aI-616 -aI59 -aI-622 -aa(lp8248 -g15 -aI27 -aI-633 -aI44 -aI-630 -aI36 -aI-632 -aa(lp8249 -g15 -aI0 -aI-635 -aI19 -aI-635 -aI9 -aI-635 -aa(lp8250 -g20 -aI0 -aI-714 -aa(lp8251 -g20 -aI380 -aI-714 -aa(lp8252 -g20 -aI380 -aI-643 -aa(lp8253 -g15 -aI318 -aI-633 -aI354 -aI-643 -aI333 -aI-640 -aa(lp8254 -g15 -aI296 -aI-593 -aI303 -aI-626 -aI296 -aI-613 -aa(lp8255 -g15 -aI300 -aI-567 -aI296 -aI-586 -aI297 -aI-577 -aa(lp8256 -g15 -aI309 -aI-542 -aI303 -aI-557 -aI306 -aI-549 -aa(lp8257 -g15 -aI333 -aI-481 -aI317 -aI-523 -aI325 -aI-503 -aa(lp8258 -g15 -aI358 -aI-415 -aI342 -aI-459 -aI350 -aI-437 -aa(lp8259 -g15 -aI381 -aI-352 -aI366 -aI-393 -aI374 -aI-372 -aa(lp8260 -g15 -aI401 -aI-298 -aI388 -aI-332 -aI395 -aI-314 -aa(lp8261 -g15 -aI417 -aI-252 -aI407 -aI-281 -aI412 -aI-266 -aa(lp8262 -g15 -aI428 -aI-215 -aI421 -aI-238 -aI425 -aI-226 -aa(lp8263 -g15 -aI434 -aI-184 -aI430 -aI-204 -aI433 -aI-194 -aa(lp8264 -g15 -aI438 -aI-157 -aI436 -aI-175 -aI437 -aI-166 -aa(lp8265 -g15 -aI444 -aI-187 -aI439 -aI-166 -aI441 -aI-176 -aa(lp8266 -g15 -aI452 -aI-219 -aI446 -aI-198 -aI449 -aI-209 -aa(lp8267 -g15 -aI461 -aI-246 -aI455 -aI-229 -aI458 -aI-238 -aa(lp8268 -g15 -aI468 -aI-263 -aI464 -aI-254 -aI466 -aI-260 -aa(lp8269 -g20 -aI555 -aI-524 -aa(lp8270 -g15 -aI560 -aI-540 -aI557 -aI-529 -aI559 -aI-534 -aa(lp8271 -g15 -aI565 -aI-558 -aI562 -aI-546 -aI563 -aI-552 -aa(lp8272 -g15 -aI568 -aI-575 -aI566 -aI-564 -aI567 -aI-570 -aa(lp8273 -g15 -aI569 -aI-590 -aI568 -aI-581 -aI569 -aI-586 -aa(lp8274 -g15 -aI543 -aI-632 -aI569 -aI-610 -aI560 -aI-624 -aa(lp8275 -g15 -aI472 -aI-643 -aI526 -aI-639 -aI502 -aI-643 -aa(lp8276 -g20 -aI472 -aI-714 -aa(lp8277 -g10 -aa(lp8278 -g8 -aI772 -aI0 -aa(lp8279 -g10 -aa(lp8280 -g8 -aI772 -aI0 -aasV} -(lp8281 -(lp8282 -g8 -aI39 -aI167 -aa(lp8283 -g20 -aI39 -aI96 -aa(lp8284 -g20 -aI91 -aI96 -aa(lp8285 -g15 -aI138 -aI87 -aI110 -aI96 -aI126 -aI93 -aa(lp8286 -g15 -aI167 -aI62 -aI150 -aI82 -aI160 -aI73 -aa(lp8287 -g15 -aI182 -aI21 -aI174 -aI51 -aI179 -aI37 -aa(lp8288 -g15 -aI186 -aI-34 -aI185 -aI5 -aI186 -aI-13 -aa(lp8289 -g20 -aI186 -aI-261 -aa(lp8290 -g15 -aI221 -aI-361 -aI186 -aI-302 -aI198 -aI-335 -aa(lp8291 -g15 -aI333 -aI-419 -aI244 -aI-387 -aI282 -aI-406 -aa(lp8292 -g20 -aI333 -aI-430 -aa(lp8293 -g15 -aI221 -aI-486 -aI281 -aI-442 -aI244 -aI-461 -aa(lp8294 -g15 -aI186 -aI-586 -aI198 -aI-512 -aI186 -aI-545 -aa(lp8295 -g20 -aI186 -aI-812 -aa(lp8296 -g15 -aI182 -aI-868 -aI186 -aI-833 -aI185 -aI-852 -aa(lp8297 -g15 -aI167 -aI-909 -aI179 -aI-884 -aI174 -aI-898 -aa(lp8298 -g15 -aI138 -aI-933 -aI160 -aI-919 -aI150 -aI-928 -aa(lp8299 -g15 -aI91 -aI-942 -aI126 -aI-939 -aI110 -aI-942 -aa(lp8300 -g20 -aI39 -aI-942 -aa(lp8301 -g20 -aI39 -aI-1012 -aa(lp8302 -g20 -aI166 -aI-1012 -aa(lp8303 -g15 -aI336 -aI-962 -aI241 -aI-1012 -aI298 -aI-995 -aa(lp8304 -g15 -aI394 -aI-817 -aI375 -aI-928 -aI394 -aI-880 -aa(lp8305 -g20 -aI394 -aI-588 -aa(lp8306 -g15 -aI406 -aI-527 -aI394 -aI-563 -aI398 -aI-543 -aa(lp8307 -g15 -aI439 -aI-490 -aI414 -aI-512 -aI425 -aI-499 -aa(lp8308 -g15 -aI488 -aI-471 -aI453 -aI-481 -aI469 -aI-475 -aa(lp8309 -g15 -aI549 -aI-465 -aI507 -aI-468 -aI527 -aI-465 -aa(lp8310 -g20 -aI549 -aI-383 -aa(lp8311 -g15 -aI488 -aI-376 -aI527 -aI-382 -aI507 -aI-380 -aa(lp8312 -g15 -aI439 -aI-357 -aI469 -aI-373 -aI453 -aI-366 -aa(lp8313 -g15 -aI406 -aI-320 -aI425 -aI-348 -aI414 -aI-336 -aa(lp8314 -g15 -aI394 -aI-258 -aI398 -aI-304 -aI394 -aI-283 -aa(lp8315 -g20 -aI394 -aI-30 -aa(lp8316 -g15 -aI379 -aI51 -aI394 -aI0 -aI389 -aI27 -aa(lp8317 -g15 -aI336 -aI114 -aI370 -aI76 -aI355 -aI96 -aa(lp8318 -g15 -aI265 -aI153 -aI317 -aI131 -aI293 -aI144 -aa(lp8319 -g15 -aI166 -aI167 -aI236 -aI162 -aI203 -aI167 -aa(lp8320 -g10 -aa(lp8321 -g8 -aI589 -aI0 -aa(lp8322 -g10 -aa(lp8323 -g8 -aI589 -aI0 -aassS'italic' -p8324 -(dp8325 -V -(lp8326 -(lp8327 -g8 -aI346 -aI0 -aa(lp8328 -g10 -aa(lp8329 -g8 -aI346 -aI0 -aasV$ -(lp8330 -(lp8331 -g8 -aI268 -aI-49 -aa(lp8332 -g15 -aI94 -aI-106 -aI194 -aI-54 -aI136 -aI-73 -aa(lp8333 -g15 -aI31 -aI-228 -aI52 -aI-139 -aI31 -aI-180 -aa(lp8334 -g15 -aI64 -aI-308 -aI31 -aI-262 -aI42 -aI-288 -aa(lp8335 -g15 -aI134 -aI-338 -aI86 -aI-328 -aI110 -aI-338 -aa(lp8336 -g15 -aI174 -aI-189 -aI134 -aI-279 -aI147 -aI-230 -aa(lp8337 -g15 -aI281 -aI-115 -aI200 -aI-149 -aI236 -aI-124 -aa(lp8338 -g20 -aI350 -aI-442 -aa(lp8339 -g15 -aI174 -aI-670 -aI233 -aI-500 -aI174 -aI-576 -aa(lp8340 -g15 -aI247 -aI-841 -aI174 -aI-742 -aI198 -aI-799 -aa(lp8341 -g15 -aI451 -aI-911 -aI295 -aI-884 -aI363 -aI-907 -aa(lp8342 -g20 -aI473 -aI-1012 -aa(lp8343 -g20 -aI539 -aI-1012 -aa(lp8344 -g20 -aI518 -aI-911 -aa(lp8345 -g15 -aI710 -aI-778 -aI646 -aI-900 -aI710 -aI-855 -aa(lp8346 -g15 -aI602 -aI-686 -aI710 -aI-716 -aI674 -aI-686 -aa(lp8347 -g15 -aI505 -aI-851 -aI602 -aI-781 -aI570 -aI-837 -aa(lp8348 -g20 -aI437 -aI-531 -aa(lp8349 -g20 -aI451 -aI-523 -aa(lp8350 -g15 -aI604 -aI-410 -aI532 -aI-479 -aI583 -aI-442 -aa(lp8351 -g15 -aI637 -aI-304 -aI626 -aI-378 -aI637 -aI-343 -aa(lp8352 -g15 -aI556 -aI-125 -aI637 -aI-231 -aI610 -aI-172 -aa(lp8353 -g15 -aI333 -aI-47 -aI503 -aI-79 -aI428 -aI-53 -aa(lp8354 -g20 -aI301 -aI105 -aa(lp8355 -g20 -aI234 -aI105 -aa(lp8356 -g10 -aa(lp8357 -g8 -aI377 -aI-562 -aa(lp8358 -g20 -aI438 -aI-853 -aa(lp8359 -g15 -aI298 -aI-689 -aI345 -aI-837 -aI298 -aI-782 -aa(lp8360 -g15 -aI377 -aI-562 -aI298 -aI-637 -aI325 -aI-595 -aa(lp8361 -g10 -aa(lp8362 -g8 -aI412 -aI-412 -aa(lp8363 -g20 -aI348 -aI-112 -aa(lp8364 -g15 -aI467 -aI-164 -aI398 -aI-117 -aI438 -aI-134 -aa(lp8365 -g15 -aI510 -aI-275 -aI495 -aI-194 -aI510 -aI-231 -aa(lp8366 -g15 -aI412 -aI-412 -aI510 -aI-332 -aI477 -aI-378 -aa(lp8367 -g10 -aa(lp8368 -g8 -aI745 -aI0 -aa(lp8369 -g10 -aa(lp8370 -g8 -aI745 -aI0 -aasV( -(lp8371 -(lp8372 -g8 -aI305 -aI109 -aa(lp8373 -g20 -aI292 -aI171 -aa(lp8374 -g15 -aI55 -aI-247 -aI134 -aI102 -aI55 -aI-37 -aa(lp8375 -g15 -aI185 -aI-733 -aI55 -aI-426 -aI99 -aI-588 -aa(lp8376 -g15 -aI544 -aI-1012 -aI271 -aI-877 -aI391 -aI-970 -aa(lp8377 -g20 -aI530 -aI-952 -aa(lp8378 -g15 -aI263 -aI-615 -aI407 -aI-885 -aI318 -aI-773 -aa(lp8379 -g15 -aI181 -aI-185 -aI209 -aI-457 -aI181 -aI-314 -aa(lp8380 -g15 -aI305 -aI109 -aI181 -aI-45 -aI222 -aI52 -aa(lp8381 -g10 -aa(lp8382 -g8 -aI461 -aI0 -aa(lp8383 -g10 -aa(lp8384 -g8 -aI461 -aI0 -aasV, -(lp8385 -(lp8386 -g8 -aI-37 -aI195 -aa(lp8387 -g20 -aI-31 -aI139 -aa(lp8388 -g15 -aI104 -aI27 -aI58 -aI118 -aI104 -aI81 -aa(lp8389 -g15 -aI61 -aI-23 -aI104 -aI11 -aI89 -aI-5 -aa(lp8390 -g15 -aI17 -aI-91 -aI32 -aI-41 -aI17 -aI-64 -aa(lp8391 -g15 -aI40 -aI-148 -aI17 -aI-115 -aI25 -aI-134 -aa(lp8392 -g15 -aI100 -aI-170 -aI55 -aI-162 -aI75 -aI-170 -aa(lp8393 -g15 -aI174 -aI-140 -aI130 -aI-170 -aI154 -aI-160 -aa(lp8394 -g15 -aI203 -aI-60 -aI194 -aI-120 -aI203 -aI-94 -aa(lp8395 -g15 -aI141 -aI104 -aI203 -aI4 -aI183 -aI59 -aa(lp8396 -g15 -aI-37 -aI195 -aI100 -aI149 -aI41 -aI179 -aa(lp8397 -g10 -aa(lp8398 -g8 -aI333 -aI0 -aa(lp8399 -g10 -aa(lp8400 -g8 -aI333 -aI0 -aasV0 -(lp8401 -(lp8402 -g8 -aI453 -aI-966 -aa(lp8403 -g15 -aI638 -aI-886 -aI531 -aI-966 -aI592 -aI-939 -aa(lp8404 -g15 -aI706 -aI-661 -aI683 -aI-832 -aI706 -aI-757 -aa(lp8405 -g15 -aI597 -aI-194 -aI706 -aI-489 -aI670 -aI-334 -aa(lp8406 -g15 -aI310 -aI15 -aI525 -aI-54 -aI429 -aI15 -aa(lp8407 -g15 -aI122 -aI-69 -aI231 -aI15 -aI168 -aI-13 -aa(lp8408 -g15 -aI53 -aI-307 -aI76 -aI-126 -aI53 -aI-205 -aa(lp8409 -g15 -aI164 -aI-765 -aI53 -aI-478 -aI90 -aI-631 -aa(lp8410 -g15 -aI453 -aI-966 -aI237 -aI-899 -aI334 -aI-966 -aa(lp8411 -g10 -aa(lp8412 -g8 -aI321 -aI-58 -aa(lp8413 -g15 -aI507 -aI-250 -aI398 -aI-58 -aI460 -aI-122 -aa(lp8414 -g15 -aI577 -aI-686 -aI554 -aI-378 -aI577 -aI-524 -aa(lp8415 -g15 -aI440 -aI-894 -aI577 -aI-824 -aI531 -aI-894 -aa(lp8416 -g15 -aI253 -aI-700 -aI362 -aI-894 -aI300 -aI-829 -aa(lp8417 -g15 -aI182 -aI-269 -aI206 -aI-571 -aI182 -aI-427 -aa(lp8418 -g15 -aI321 -aI-58 -aI182 -aI-128 -aI229 -aI-58 -aa(lp8419 -g10 -aa(lp8420 -g8 -aI745 -aI0 -aa(lp8421 -g10 -aa(lp8422 -g8 -aI745 -aI0 -aasV4 -(lp8423 -(lp8424 -g8 -aI170 -aI0 -aa(lp8425 -g20 -aI181 -aI-55 -aa(lp8426 -g20 -aI240 -aI-55 -aa(lp8427 -g15 -aI332 -aI-79 -aI282 -aI-55 -aI312 -aI-63 -aa(lp8428 -g15 -aI370 -aI-151 -aI351 -aI-95 -aI363 -aI-119 -aa(lp8429 -g20 -aI391 -aI-260 -aa(lp8430 -g20 -aI-18 -aI-260 -aa(lp8431 -g20 -aI-6 -aI-315 -aa(lp8432 -g20 -aI539 -aI-951 -aa(lp8433 -g20 -aI667 -aI-951 -aa(lp8434 -g20 -aI535 -aI-335 -aa(lp8435 -g20 -aI701 -aI-335 -aa(lp8436 -g20 -aI685 -aI-260 -aa(lp8437 -g20 -aI520 -aI-260 -aa(lp8438 -g20 -aI497 -aI-146 -aa(lp8439 -g15 -aI492 -aI-108 -aI493 -aI-128 -aI492 -aI-116 -aa(lp8440 -g15 -aI587 -aI-55 -aI492 -aI-73 -aI524 -aI-55 -aa(lp8441 -g20 -aI618 -aI-55 -aa(lp8442 -g20 -aI606 -aI0 -aa(lp8443 -g10 -aa(lp8444 -g8 -aI460 -aI-584 -aa(lp8445 -g15 -aI525 -aI-843 -aI481 -aI-685 -aI503 -aI-771 -aa(lp8446 -g15 -aI408 -aI-690 -aI488 -aI-787 -aI449 -aI-736 -aa(lp8447 -g20 -aI105 -aI-335 -aa(lp8448 -g20 -aI408 -aI-335 -aa(lp8449 -g10 -aa(lp8450 -g8 -aI745 -aI0 -aa(lp8451 -g10 -aa(lp8452 -g8 -aI745 -aI0 -aasV8 -(lp8453 -(lp8454 -g8 -aI277 -aI-486 -aa(lp8455 -g15 -aI146 -aI-707 -aI190 -aI-549 -aI146 -aI-622 -aa(lp8456 -g15 -aI228 -aI-897 -aI146 -aI-788 -aI173 -aI-851 -aa(lp8457 -g15 -aI465 -aI-965 -aI283 -aI-942 -aI362 -aI-965 -aa(lp8458 -g15 -aI644 -aI-911 -aI541 -aI-965 -aI600 -aI-947 -aa(lp8459 -g15 -aI710 -aI-770 -aI688 -aI-875 -aI710 -aI-828 -aa(lp8460 -g15 -aI658 -aI-622 -aI710 -aI-713 -aI693 -aI-663 -aa(lp8461 -g15 -aI478 -aI-507 -aI623 -aI-580 -aI563 -aI-542 -aa(lp8462 -g15 -aI647 -aI-269 -aI591 -aI-441 -aI647 -aI-362 -aa(lp8463 -g15 -aI553 -aI-59 -aI647 -aI-178 -aI616 -aI-108 -aa(lp8464 -g15 -aI296 -aI13 -aI490 -aI-10 -aI404 -aI13 -aa(lp8465 -g15 -aI90 -aI-50 -aI210 -aI13 -aI141 -aI-7 -aa(lp8466 -g15 -aI13 -aI-215 -aI38 -aI-92 -aI13 -aI-147 -aa(lp8467 -g15 -aI71 -aI-370 -aI13 -aI-277 -aI32 -aI-328 -aa(lp8468 -g15 -aI277 -aI-486 -aI110 -aI-412 -aI179 -aI-450 -aa(lp8469 -g10 -aa(lp8470 -g8 -aI414 -aI-539 -aa(lp8471 -g15 -aI591 -aI-760 -aI532 -aI-589 -aI591 -aI-663 -aa(lp8472 -g15 -aI555 -aI-861 -aI591 -aI-804 -aI579 -aI-837 -aa(lp8473 -g15 -aI454 -aI-897 -aI531 -aI-885 -aI497 -aI-897 -aa(lp8474 -g15 -aI323 -aI-849 -aI400 -aI-897 -aI356 -aI-881 -aa(lp8475 -g15 -aI274 -aI-722 -aI291 -aI-817 -aI274 -aI-775 -aa(lp8476 -g15 -aI414 -aI-539 -aI274 -aI-650 -aI321 -aI-589 -aa(lp8477 -g10 -aa(lp8478 -g8 -aI338 -aI-451 -aa(lp8479 -g15 -aI141 -aI-213 -aI207 -aI-403 -aI141 -aI-323 -aa(lp8480 -g15 -aI187 -aI-94 -aI141 -aI-163 -aI156 -aI-123 -aa(lp8481 -g15 -aI313 -aI-51 -aI218 -aI-66 -aI260 -aI-51 -aa(lp8482 -g15 -aI464 -aI-101 -aI375 -aI-51 -aI425 -aI-68 -aa(lp8483 -g15 -aI521 -aI-237 -aI502 -aI-134 -aI521 -aI-179 -aa(lp8484 -g15 -aI477 -aI-355 -aI521 -aI-283 -aI506 -aI-322 -aa(lp8485 -g15 -aI338 -aI-451 -aI447 -aI-388 -aI401 -aI-420 -aa(lp8486 -g10 -aa(lp8487 -g8 -aI745 -aI0 -aa(lp8488 -g10 -aa(lp8489 -g8 -aI745 -aI0 -aasV< -(lp8490 -(lp8491 -g8 -aI97 -aI-452 -aa(lp8492 -g20 -aI97 -aI-499 -aa(lp8493 -g20 -aI669 -aI-807 -aa(lp8494 -g20 -aI669 -aI-718 -aa(lp8495 -g20 -aI221 -aI-475 -aa(lp8496 -g20 -aI669 -aI-235 -aa(lp8497 -g20 -aI669 -aI-146 -aa(lp8498 -g10 -aa(lp8499 -g8 -aI745 -aI0 -aa(lp8500 -g10 -aa(lp8501 -g8 -aI745 -aI0 -aasV@ -(lp8502 -(lp8503 -g8 -aI738 -aI-223 -aa(lp8504 -g20 -aI731 -aI-223 -aa(lp8505 -g15 -aI552 -aI-102 -aI689 -aI-142 -aI629 -aI-102 -aa(lp8506 -g15 -aI405 -aI-162 -aI491 -aI-102 -aI442 -aI-122 -aa(lp8507 -g15 -aI349 -aI-330 -aI368 -aI-203 -aI349 -aI-259 -aa(lp8508 -g15 -aI441 -aI-588 -aI349 -aI-424 -aI380 -aI-510 -aa(lp8509 -g15 -aI689 -aI-704 -aI502 -aI-665 -aI585 -aI-704 -aa(lp8510 -g15 -aI814 -aI-664 -aI738 -aI-704 -aI780 -aI-691 -aa(lp8511 -g20 -aI867 -aI-692 -aa(lp8512 -g20 -aI899 -aI-692 -aa(lp8513 -g20 -aI832 -aI-353 -aa(lp8514 -g15 -aI822 -aI-263 -aI825 -aI-322 -aI822 -aI-292 -aa(lp8515 -g15 -aI844 -aI-197 -aI822 -aI-236 -aI830 -aI-214 -aa(lp8516 -g15 -aI904 -aI-172 -aI859 -aI-181 -aI879 -aI-172 -aa(lp8517 -g15 -aI1023 -aI-272 -aI948 -aI-172 -aI987 -aI-205 -aa(lp8518 -g15 -aI1076 -aI-526 -aI1058 -aI-338 -aI1076 -aI-422 -aa(lp8519 -g15 -aI974 -aI-787 -aI1076 -aI-636 -aI1042 -aI-724 -aa(lp8520 -g15 -aI698 -aI-883 -aI906 -aI-851 -aI814 -aI-883 -aa(lp8521 -g15 -aI341 -aI-717 -aI560 -aI-883 -aI441 -aI-828 -aa(lp8522 -g15 -aI192 -aI-293 -aI241 -aI-606 -aI192 -aI-465 -aa(lp8523 -g15 -aI298 -aI12 -aI192 -aI-160 -aI227 -aI-58 -aa(lp8524 -g15 -aI589 -aI120 -aI368 -aI84 -aI465 -aI120 -aa(lp8525 -g15 -aI927 -aI9 -aI711 -aI120 -aI824 -aI83 -aa(lp8526 -g20 -aI958 -aI57 -aa(lp8527 -g15 -aI576 -aI189 -aI839 -aI145 -aI712 -aI189 -aa(lp8528 -g15 -aI216 -aI63 -aI423 -aI189 -aI303 -aI147 -aa(lp8529 -g15 -aI86 -aI-289 -aI129 -aI-21 -aI86 -aI-138 -aa(lp8530 -g15 -aI262 -aI-763 -aI86 -aI-480 -aI145 -aI-638 -aa(lp8531 -g15 -aI706 -aI-951 -aI379 -aI-888 -aI527 -aI-951 -aa(lp8532 -g15 -aI1036 -aI-834 -aI846 -aI-951 -aI956 -aI-912 -aa(lp8533 -g15 -aI1157 -aI-522 -aI1117 -aI-756 -aI1157 -aI-652 -aa(lp8534 -g15 -aI1076 -aI-221 -aI1157 -aI-401 -aI1130 -aI-301 -aa(lp8535 -g15 -aI895 -aI-102 -aI1022 -aI-142 -aI962 -aI-102 -aa(lp8536 -g15 -aI738 -aI-223 -aI818 -aI-102 -aI766 -aI-142 -aa(lp8537 -g10 -aa(lp8538 -g8 -aI769 -aI-610 -aa(lp8539 -g15 -aI694 -aI-649 -aI756 -aI-636 -aI731 -aI-649 -aa(lp8540 -g15 -aI533 -aI-540 -aI627 -aI-649 -aI574 -aI-613 -aa(lp8541 -g15 -aI473 -aI-311 -aI493 -aI-467 -aI473 -aI-391 -aa(lp8542 -g15 -aI501 -aI-206 -aI473 -aI-264 -aI482 -aI-229 -aa(lp8543 -g15 -aI574 -aI-172 -aI520 -aI-184 -aI544 -aI-172 -aa(lp8544 -g15 -aI718 -aI-339 -aI649 -aI-172 -aI697 -aI-228 -aa(lp8545 -g10 -aa(lp8546 -g8 -aI1227 -aI0 -aa(lp8547 -g10 -aa(lp8548 -g8 -aI1227 -aI0 -aasVD -(lp8549 -(lp8550 -g8 -aI-17 -aI-55 -aa(lp8551 -g20 -aI0 -aI-55 -aa(lp8552 -g15 -aI130 -aI-151 -aI73 -aI-55 -aI117 -aI-87 -aa(lp8553 -g20 -aI269 -aI-804 -aa(lp8554 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp8555 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp8556 -g20 -aI161 -aI-895 -aa(lp8557 -g20 -aI173 -aI-951 -aa(lp8558 -g20 -aI546 -aI-951 -aa(lp8559 -g15 -aI826 -aI-857 -aI667 -aI-951 -aI761 -aI-920 -aa(lp8560 -g15 -aI925 -aI-588 -aI892 -aI-794 -aI925 -aI-705 -aa(lp8561 -g15 -aI779 -aI-166 -aI925 -aI-418 -aI876 -aI-277 -aa(lp8562 -g15 -aI391 -aI0 -aI683 -aI-55 -aI553 -aI0 -aa(lp8563 -g20 -aI-27 -aI0 -aa(lp8564 -g10 -aa(lp8565 -g8 -aI362 -aI-67 -aa(lp8566 -g15 -aI667 -aI-215 -aI491 -aI-67 -aI592 -aI-116 -aa(lp8567 -g15 -aI779 -aI-603 -aI742 -aI-313 -aI779 -aI-443 -aa(lp8568 -g15 -aI526 -aI-884 -aI779 -aI-791 -aI695 -aI-884 -aa(lp8569 -g20 -aI421 -aI-884 -aa(lp8570 -g20 -aI246 -aI-67 -aa(lp8571 -g10 -aa(lp8572 -g8 -aI966 -aI0 -aa(lp8573 -g10 -aa(lp8574 -g8 -aI966 -aI0 -aasVH -(lp8575 -(lp8576 -g8 -aI539 -aI0 -aa(lp8577 -g20 -aI550 -aI-55 -aa(lp8578 -g20 -aI567 -aI-55 -aa(lp8579 -g15 -aI660 -aI-79 -aI610 -aI-55 -aI641 -aI-63 -aa(lp8580 -g15 -aI698 -aI-151 -aI679 -aI-95 -aI692 -aI-119 -aa(lp8581 -g20 -aI764 -aI-463 -aa(lp8582 -g20 -aI330 -aI-463 -aa(lp8583 -g20 -aI264 -aI-146 -aa(lp8584 -g15 -aI258 -aI-108 -aI260 -aI-127 -aI258 -aI-114 -aa(lp8585 -g15 -aI354 -aI-55 -aI258 -aI-73 -aI290 -aI-55 -aa(lp8586 -g20 -aI371 -aI-55 -aa(lp8587 -g20 -aI360 -aI0 -aa(lp8588 -g20 -aI-27 -aI0 -aa(lp8589 -g20 -aI-17 -aI-55 -aa(lp8590 -g20 -aI0 -aI-55 -aa(lp8591 -g15 -aI92 -aI-79 -aI42 -aI-55 -aI73 -aI-63 -aa(lp8592 -g15 -aI130 -aI-151 -aI111 -aI-96 -aI123 -aI-119 -aa(lp8593 -g20 -aI269 -aI-804 -aa(lp8594 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp8595 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp8596 -g20 -aI161 -aI-895 -aa(lp8597 -g20 -aI173 -aI-951 -aa(lp8598 -g20 -aI561 -aI-951 -aa(lp8599 -g20 -aI549 -aI-895 -aa(lp8600 -g20 -aI531 -aI-895 -aa(lp8601 -g15 -aI440 -aI-871 -aI489 -aI-895 -aI458 -aI-887 -aa(lp8602 -g15 -aI402 -aI-799 -aI421 -aI-855 -aI408 -aI-831 -aa(lp8603 -g20 -aI345 -aI-530 -aa(lp8604 -g20 -aI778 -aI-530 -aa(lp8605 -g20 -aI837 -aI-804 -aa(lp8606 -g15 -aI842 -aI-841 -aI840 -aI-821 -aI842 -aI-833 -aa(lp8607 -g15 -aI746 -aI-895 -aI842 -aI-877 -aI810 -aI-895 -aa(lp8608 -g20 -aI729 -aI-895 -aa(lp8609 -g20 -aI741 -aI-951 -aa(lp8610 -g20 -aI1129 -aI-951 -aa(lp8611 -g20 -aI1117 -aI-895 -aa(lp8612 -g20 -aI1100 -aI-895 -aa(lp8613 -g15 -aI1008 -aI-870 -aI1057 -aI-895 -aI1027 -aI-887 -aa(lp8614 -g15 -aI970 -aI-799 -aI989 -aI-854 -aI977 -aI-830 -aa(lp8615 -g20 -aI832 -aI-146 -aa(lp8616 -g15 -aI826 -aI-108 -aI828 -aI-129 -aI826 -aI-117 -aa(lp8617 -g15 -aI922 -aI-55 -aI826 -aI-73 -aI858 -aI-55 -aa(lp8618 -g20 -aI940 -aI-55 -aa(lp8619 -g20 -aI927 -aI0 -aa(lp8620 -g10 -aa(lp8621 -g8 -aI1057 -aI0 -aa(lp8622 -g10 -aa(lp8623 -g8 -aI1057 -aI0 -aasVL -(lp8624 -(lp8625 -g8 -aI-14 -aI-55 -aa(lp8626 -g20 -aI2 -aI-55 -aa(lp8627 -g15 -aI92 -aI-79 -aI44 -aI-55 -aI74 -aI-63 -aa(lp8628 -g15 -aI130 -aI-151 -aI110 -aI-96 -aI123 -aI-119 -aa(lp8629 -g20 -aI269 -aI-804 -aa(lp8630 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp8631 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp8632 -g20 -aI161 -aI-895 -aa(lp8633 -g20 -aI173 -aI-951 -aa(lp8634 -g20 -aI561 -aI-951 -aa(lp8635 -g20 -aI549 -aI-895 -aa(lp8636 -g20 -aI531 -aI-895 -aa(lp8637 -g15 -aI441 -aI-872 -aI489 -aI-895 -aI459 -aI-887 -aa(lp8638 -g15 -aI404 -aI-804 -aI423 -aI-857 -aI410 -aI-835 -aa(lp8639 -g20 -aI246 -aI-65 -aa(lp8640 -g20 -aI509 -aI-65 -aa(lp8641 -g15 -aI651 -aI-186 -aI577 -aI-65 -aI624 -aI-106 -aa(lp8642 -g20 -aI686 -aI-286 -aa(lp8643 -g20 -aI755 -aI-286 -aa(lp8644 -g20 -aI686 -aI0 -aa(lp8645 -g20 -aI-26 -aI0 -aa(lp8646 -g10 -aa(lp8647 -g8 -aI830 -aI0 -aa(lp8648 -g10 -aa(lp8649 -g8 -aI830 -aI0 -aasVP -(lp8650 -(lp8651 -g8 -aI-26 -aI0 -aa(lp8652 -g20 -aI-14 -aI-55 -aa(lp8653 -g20 -aI2 -aI-55 -aa(lp8654 -g15 -aI93 -aI-79 -aI44 -aI-55 -aI74 -aI-63 -aa(lp8655 -g15 -aI130 -aI-151 -aI111 -aI-95 -aI124 -aI-119 -aa(lp8656 -g20 -aI269 -aI-804 -aa(lp8657 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp8658 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp8659 -g20 -aI161 -aI-895 -aa(lp8660 -g20 -aI173 -aI-951 -aa(lp8661 -g20 -aI514 -aI-951 -aa(lp8662 -g15 -aI738 -aI-884 -aI611 -aI-951 -aI685 -aI-929 -aa(lp8663 -g15 -aI818 -aI-694 -aI791 -aI-839 -aI818 -aI-776 -aa(lp8664 -g15 -aI716 -aI-456 -aI818 -aI-593 -aI784 -aI-513 -aa(lp8665 -g15 -aI410 -aI-369 -aI648 -aI-398 -aI546 -aI-369 -aa(lp8666 -g20 -aI311 -aI-369 -aa(lp8667 -g20 -aI264 -aI-146 -aa(lp8668 -g15 -aI258 -aI-108 -aI260 -aI-127 -aI258 -aI-115 -aa(lp8669 -g15 -aI354 -aI-55 -aI258 -aI-73 -aI290 -aI-55 -aa(lp8670 -g20 -aI398 -aI-55 -aa(lp8671 -g20 -aI386 -aI0 -aa(lp8672 -g10 -aa(lp8673 -g8 -aI325 -aI-433 -aa(lp8674 -g20 -aI395 -aI-433 -aa(lp8675 -g15 -aI677 -aI-692 -aI583 -aI-433 -aI677 -aI-519 -aa(lp8676 -g15 -aI482 -aI-887 -aI677 -aI-822 -aI612 -aI-887 -aa(lp8677 -g20 -aI421 -aI-887 -aa(lp8678 -g10 -aa(lp8679 -g8 -aI826 -aI0 -aa(lp8680 -g10 -aa(lp8681 -g8 -aI826 -aI0 -aasVT -(lp8682 -(lp8683 -g8 -aI427 -aI-146 -aa(lp8684 -g15 -aI422 -aI-108 -aI424 -aI-129 -aI422 -aI-117 -aa(lp8685 -g15 -aI518 -aI-55 -aI422 -aI-73 -aI454 -aI-55 -aa(lp8686 -g20 -aI549 -aI-55 -aa(lp8687 -g20 -aI537 -aI0 -aa(lp8688 -g20 -aI122 -aI0 -aa(lp8689 -g20 -aI134 -aI-55 -aa(lp8690 -g20 -aI165 -aI-55 -aa(lp8691 -g15 -aI258 -aI-78 -aI210 -aI-55 -aI241 -aI-63 -aa(lp8692 -g15 -aI293 -aI-144 -aI275 -aI-94 -aI287 -aI-116 -aa(lp8693 -g20 -aI450 -aI-884 -aa(lp8694 -g20 -aI322 -aI-884 -aa(lp8695 -g15 -aI189 -aI-775 -aI259 -aI-884 -aI215 -aI-848 -aa(lp8696 -g20 -aI170 -aI-718 -aa(lp8697 -g20 -aI101 -aI-718 -aa(lp8698 -g20 -aI157 -aI-951 -aa(lp8699 -g20 -aI908 -aI-951 -aa(lp8700 -g20 -aI865 -aI-718 -aa(lp8701 -g20 -aI796 -aI-718 -aa(lp8702 -g15 -aI802 -aI-799 -aI800 -aI-753 -aI802 -aI-780 -aa(lp8703 -g15 -aI714 -aI-884 -aI802 -aI-856 -aI773 -aI-884 -aa(lp8704 -g20 -aI585 -aI-884 -aa(lp8705 -g10 -aa(lp8706 -g8 -aI817 -aI0 -aa(lp8707 -g10 -aa(lp8708 -g8 -aI817 -aI0 -aasVX -(lp8709 -(lp8710 -g8 -aI949 -aI-895 -aa(lp8711 -g20 -aI937 -aI-895 -aa(lp8712 -g15 -aI872 -aI-875 -aI913 -aI-895 -aI891 -aI-888 -aa(lp8713 -g15 -aI786 -aI-795 -aI852 -aI-862 -aI824 -aI-836 -aa(lp8714 -g20 -aI534 -aI-517 -aa(lp8715 -g20 -aI694 -aI-126 -aa(lp8716 -g15 -aI786 -aI-55 -aI714 -aI-79 -aI744 -aI-55 -aa(lp8717 -g20 -aI804 -aI-55 -aa(lp8718 -g20 -aI792 -aI0 -aa(lp8719 -g20 -aI432 -aI0 -aa(lp8720 -g20 -aI444 -aI-55 -aa(lp8721 -g20 -aI458 -aI-55 -aa(lp8722 -g15 -aI521 -aI-68 -aI485 -aI-55 -aI506 -aI-59 -aa(lp8723 -g15 -aI544 -aI-102 -aI536 -aI-77 -aI544 -aI-88 -aa(lp8724 -g15 -aI518 -aI-194 -aI544 -aI-120 -aI535 -aI-151 -aa(lp8725 -g20 -aI432 -aI-406 -aa(lp8726 -g20 -aI233 -aI-185 -aa(lp8727 -g15 -aI179 -aI-91 -aI197 -aI-145 -aI179 -aI-114 -aa(lp8728 -g15 -aI258 -aI-55 -aI179 -aI-67 -aI205 -aI-55 -aa(lp8729 -g20 -aI262 -aI-55 -aa(lp8730 -g20 -aI250 -aI0 -aa(lp8731 -g20 -aI-65 -aI0 -aa(lp8732 -g20 -aI-53 -aI-55 -aa(lp8733 -g20 -aI-48 -aI-55 -aa(lp8734 -g15 -aI29 -aI-78 -aI-19 -aI-55 -aI6 -aI-63 -aa(lp8735 -g15 -aI109 -aI-151 -aI52 -aI-93 -aI78 -aI-117 -aa(lp8736 -g20 -aI404 -aI-472 -aa(lp8737 -g20 -aI261 -aI-827 -aa(lp8738 -g15 -aI157 -aI-895 -aI242 -aI-872 -aI208 -aI-895 -aa(lp8739 -g20 -aI139 -aI-895 -aa(lp8740 -g20 -aI151 -aI-951 -aa(lp8741 -g20 -aI513 -aI-951 -aa(lp8742 -g20 -aI501 -aI-895 -aa(lp8743 -g20 -aI470 -aI-895 -aa(lp8744 -g15 -aI408 -aI-858 -aI429 -aI-895 -aI408 -aI-883 -aa(lp8745 -g15 -aI432 -aI-778 -aI408 -aI-845 -aI416 -aI-818 -aa(lp8746 -g20 -aI507 -aI-583 -aa(lp8747 -g20 -aI674 -aI-775 -aa(lp8748 -g15 -aI725 -aI-862 -aI708 -aI-814 -aI725 -aI-843 -aa(lp8749 -g15 -aI661 -aI-895 -aI725 -aI-884 -aI703 -aI-895 -aa(lp8750 -g20 -aI657 -aI-895 -aa(lp8751 -g20 -aI669 -aI-951 -aa(lp8752 -g20 -aI961 -aI-951 -aa(lp8753 -g10 -aa(lp8754 -g8 -aI880 -aI0 -aa(lp8755 -g10 -aa(lp8756 -g8 -aI880 -aI0 -aasV\u005C -(lp8757 -(lp8758 -g8 -aI150 -aI-1012 -aa(lp8759 -g20 -aI227 -aI-1012 -aa(lp8760 -g20 -aI285 -aI161 -aa(lp8761 -g20 -aI206 -aI161 -aa(lp8762 -g10 -aa(lp8763 -g8 -aI384 -aI0 -aa(lp8764 -g10 -aa(lp8765 -g8 -aI384 -aI0 -aasV` -(lp8766 -(lp8767 -g8 -aI539 -aI-807 -aa(lp8768 -g15 -aI367 -aI-1007 -aI472 -aI-872 -aI415 -aI-939 -aa(lp8769 -g20 -aI371 -aI-1021 -aa(lp8770 -g20 -aI505 -aI-1021 -aa(lp8771 -g15 -aI594 -aI-825 -aI531 -aI-953 -aI560 -aI-888 -aa(lp8772 -g20 -aI590 -aI-807 -aa(lp8773 -g10 -aa(lp8774 -g8 -aI769 -aI0 -aa(lp8775 -g10 -aa(lp8776 -g8 -aI769 -aI0 -aasVd -(lp8777 -(lp8778 -g8 -aI486 -aI-200 -aa(lp8779 -g20 -aI478 -aI-200 -aa(lp8780 -g15 -aI229 -aI13 -aI414 -aI-57 -aI331 -aI13 -aa(lp8781 -g15 -aI102 -aI-50 -aI174 -aI13 -aI132 -aI-7 -aa(lp8782 -g15 -aI57 -aI-230 -aI72 -aI-93 -aI57 -aI-153 -aa(lp8783 -g15 -aI171 -aI-570 -aI57 -aI-352 -aI95 -aI-465 -aa(lp8784 -g15 -aI454 -aI-727 -aI247 -aI-675 -aI342 -aI-727 -aa(lp8785 -g15 -aI585 -aI-695 -aI504 -aI-727 -aI547 -aI-716 -aa(lp8786 -g15 -aI600 -aI-770 -aI592 -aI-736 -aI597 -aI-761 -aa(lp8787 -g20 -aI613 -aI-834 -aa(lp8788 -g15 -aI622 -aI-894 -aI619 -aI-864 -aI622 -aI-884 -aa(lp8789 -g15 -aI529 -aI-956 -aI622 -aI-935 -aI591 -aI-956 -aa(lp8790 -g20 -aI518 -aI-956 -aa(lp8791 -g20 -aI530 -aI-1012 -aa(lp8792 -g20 -aI776 -aI-1012 -aa(lp8793 -g20 -aI621 -aI-286 -aa(lp8794 -g15 -aI601 -aI-138 -aI608 -aI-224 -aI601 -aI-175 -aa(lp8795 -g15 -aI645 -aI-70 -aI601 -aI-93 -aI616 -aI-70 -aa(lp8796 -g15 -aI741 -aI-105 -aI670 -aI-70 -aI702 -aI-82 -aa(lp8797 -g20 -aI765 -aI-65 -aa(lp8798 -g15 -aI577 -aI13 -aI701 -aI-13 -aI639 -aI13 -aa(lp8799 -g15 -aI473 -aI-97 -aI508 -aI13 -aI473 -aI-23 -aa(lp8800 -g15 -aI486 -aI-200 -aI473 -aI-125 -aI477 -aI-159 -aa(lp8801 -g10 -aa(lp8802 -g8 -aI562 -aI-619 -aa(lp8803 -g15 -aI461 -aI-667 -aI542 -aI-651 -aI508 -aI-667 -aa(lp8804 -g15 -aI270 -aI-522 -aI385 -aI-667 -aI321 -aI-619 -aa(lp8805 -g15 -aI193 -aI-224 -aI219 -aI-426 -aI193 -aI-326 -aa(lp8806 -g15 -aI277 -aI-70 -aI193 -aI-121 -aI221 -aI-70 -aa(lp8807 -g15 -aI416 -aI-168 -aI321 -aI-70 -aI368 -aI-103 -aa(lp8808 -g15 -aI513 -aI-383 -aI465 -aI-234 -aI497 -aI-305 -aa(lp8809 -g10 -aa(lp8810 -g8 -aI772 -aI0 -aa(lp8811 -g10 -aa(lp8812 -g8 -aI772 -aI0 -aasVh -(lp8813 -(lp8814 -g8 -aI306 -aI-546 -aa(lp8815 -g15 -aI553 -aI-726 -aI380 -aI-666 -aI462 -aI-726 -aa(lp8816 -g15 -aI695 -aI-578 -aI648 -aI-726 -aI695 -aI-676 -aa(lp8817 -g15 -aI671 -aI-431 -aI695 -aI-550 -aI687 -aI-501 -aa(lp8818 -g20 -aI637 -aI-274 -aa(lp8819 -g15 -aI619 -aI-134 -aI625 -aI-220 -aI619 -aI-174 -aa(lp8820 -g15 -aI666 -aI-70 -aI619 -aI-91 -aI635 -aI-70 -aa(lp8821 -g15 -aI751 -aI-101 -aI692 -aI-70 -aI720 -aI-80 -aa(lp8822 -g20 -aI776 -aI-62 -aa(lp8823 -g15 -aI613 -aI13 -aI717 -aI-11 -aI663 -aI13 -aa(lp8824 -g15 -aI525 -aI-22 -aI576 -aI13 -aI546 -aI1 -aa(lp8825 -g15 -aI492 -aI-119 -aI503 -aI-46 -aI492 -aI-78 -aa(lp8826 -g15 -aI517 -aI-299 -aI492 -aI-160 -aI500 -aI-220 -aa(lp8827 -g20 -aI548 -aI-437 -aa(lp8828 -g15 -aI567 -aI-562 -aI561 -aI-491 -aI567 -aI-532 -aa(lp8829 -g15 -aI506 -aI-640 -aI567 -aI-614 -aI547 -aI-640 -aa(lp8830 -g15 -aI353 -aI-539 -aI457 -aI-640 -aI406 -aI-607 -aa(lp8831 -g15 -aI254 -aI-340 -aI301 -aI-472 -aI268 -aI-405 -aa(lp8832 -g20 -aI182 -aI0 -aa(lp8833 -g20 -aI58 -aI0 -aa(lp8834 -g20 -aI231 -aI-823 -aa(lp8835 -g15 -aI244 -aI-894 -aI240 -aI-862 -aI244 -aI-886 -aa(lp8836 -g15 -aI150 -aI-956 -aI244 -aI-935 -aI212 -aI-956 -aa(lp8837 -g20 -aI139 -aI-956 -aa(lp8838 -g20 -aI151 -aI-1012 -aa(lp8839 -g20 -aI397 -aI-1012 -aa(lp8840 -g20 -aI345 -aI-767 -aa(lp8841 -g15 -aI292 -aI-546 -aI329 -aI-694 -aI311 -aI-621 -aa(lp8842 -g10 -aa(lp8843 -g8 -aI798 -aI0 -aa(lp8844 -g10 -aa(lp8845 -g8 -aI798 -aI0 -aasVl -(lp8846 -(lp8847 -g8 -aI134 -aI-956 -aa(lp8848 -g20 -aI146 -aI-1012 -aa(lp8849 -g20 -aI398 -aI-1012 -aa(lp8850 -g20 -aI244 -aI-286 -aa(lp8851 -g15 -aI223 -aI-138 -aI230 -aI-222 -aI223 -aI-173 -aa(lp8852 -g15 -aI268 -aI-70 -aI223 -aI-93 -aI238 -aI-70 -aa(lp8853 -g15 -aI363 -aI-105 -aI293 -aI-70 -aI325 -aI-82 -aa(lp8854 -g20 -aI388 -aI-65 -aa(lp8855 -g15 -aI207 -aI13 -aI326 -aI-13 -aI266 -aI13 -aa(lp8856 -g15 -aI128 -aI-21 -aI175 -aI13 -aI149 -aI1 -aa(lp8857 -g15 -aI97 -aI-112 -aI107 -aI-45 -aI97 -aI-75 -aa(lp8858 -g15 -aI126 -aI-322 -aI97 -aI-154 -aI107 -aI-224 -aa(lp8859 -g20 -aI235 -aI-834 -aa(lp8860 -g15 -aI244 -aI-894 -aI241 -aI-860 -aI244 -aI-880 -aa(lp8861 -g15 -aI150 -aI-956 -aI244 -aI-935 -aI212 -aI-956 -aa(lp8862 -g10 -aa(lp8863 -g8 -aI405 -aI0 -aa(lp8864 -g10 -aa(lp8865 -g8 -aI405 -aI0 -aasVp -(lp8866 -(lp8867 -g8 -aI253 -aI264 -aa(lp8868 -g20 -aI241 -aI320 -aa(lp8869 -g20 -aI-9 -aI320 -aa(lp8870 -g20 -aI167 -aI-524 -aa(lp8871 -g15 -aI179 -aI-595 -aI175 -aI-562 -aI179 -aI-585 -aa(lp8872 -g15 -aI86 -aI-658 -aI179 -aI-637 -aI148 -aI-658 -aa(lp8873 -g20 -aI76 -aI-658 -aa(lp8874 -g20 -aI87 -aI-714 -aa(lp8875 -g20 -aI324 -aI-714 -aa(lp8876 -g20 -aI292 -aI-536 -aa(lp8877 -g20 -aI298 -aI-536 -aa(lp8878 -g15 -aI542 -aI-727 -aI363 -aI-663 -aI444 -aI-727 -aa(lp8879 -g15 -aI668 -aI-665 -aI597 -aI-727 -aI638 -aI-706 -aa(lp8880 -g15 -aI712 -aI-486 -aI697 -aI-624 -aI712 -aI-564 -aa(lp8881 -g15 -aI600 -aI-147 -aI712 -aI-367 -aI675 -aI-253 -aa(lp8882 -g15 -aI314 -aI13 -aI526 -aI-40 -aI430 -aI13 -aa(lp8883 -g15 -aI184 -aI-17 -aI263 -aI13 -aI220 -aI3 -aa(lp8884 -g15 -aI173 -aI47 -aI180 -aI11 -aI176 -aI33 -aa(lp8885 -g20 -aI154 -aI128 -aa(lp8886 -g15 -aI142 -aI202 -aI146 -aI165 -aI142 -aI190 -aa(lp8887 -g15 -aI235 -aI264 -aI142 -aI244 -aI173 -aI264 -aa(lp8888 -g10 -aa(lp8889 -g8 -aI205 -aI-93 -aa(lp8890 -g15 -aI310 -aI-46 -aI233 -aI-62 -aI268 -aI-46 -aa(lp8891 -g15 -aI499 -aI-191 -aI384 -aI-46 -aI447 -aI-94 -aa(lp8892 -g15 -aI576 -aI-487 -aI550 -aI-288 -aI576 -aI-387 -aa(lp8893 -g15 -aI492 -aI-643 -aI576 -aI-591 -aI548 -aI-643 -aa(lp8894 -g15 -aI352 -aI-547 -aI446 -aI-643 -aI399 -aI-611 -aa(lp8895 -g15 -aI259 -aI-347 -aI305 -aI-483 -aI274 -aI-416 -aa(lp8896 -g10 -aa(lp8897 -g8 -aI769 -aI0 -aa(lp8898 -g10 -aa(lp8899 -g8 -aI769 -aI0 -aasVt -(lp8900 -(lp8901 -g8 -aI401 -aI-99 -aa(lp8902 -g20 -aI423 -aI-50 -aa(lp8903 -g15 -aI244 -aI13 -aI363 -aI-7 -aI304 -aI13 -aa(lp8904 -g15 -aI98 -aI-142 -aI147 -aI13 -aI98 -aI-38 -aa(lp8905 -g15 -aI111 -aI-254 -aI98 -aI-175 -aI103 -aI-212 -aa(lp8906 -g20 -aI193 -aI-638 -aa(lp8907 -g20 -aI91 -aI-638 -aa(lp8908 -g20 -aI104 -aI-691 -aa(lp8909 -g15 -aI307 -aI-878 -aI190 -aI-691 -aI258 -aI-753 -aa(lp8910 -g20 -aI369 -aI-878 -aa(lp8911 -g20 -aI334 -aI-714 -aa(lp8912 -g20 -aI496 -aI-714 -aa(lp8913 -g20 -aI479 -aI-638 -aa(lp8914 -g20 -aI318 -aI-638 -aa(lp8915 -g20 -aI237 -aI-258 -aa(lp8916 -g15 -aI221 -aI-143 -aI226 -aI-206 -aI221 -aI-168 -aa(lp8917 -g15 -aI292 -aI-70 -aI221 -aI-94 -aI245 -aI-70 -aa(lp8918 -g15 -aI401 -aI-99 -aI328 -aI-70 -aI364 -aI-80 -aa(lp8919 -g10 -aa(lp8920 -g8 -aI490 -aI0 -aa(lp8921 -g10 -aa(lp8922 -g8 -aI490 -aI0 -aasVx -(lp8923 -(lp8924 -g8 -aI-26 -aI0 -aa(lp8925 -g20 -aI-11 -aI-55 -aa(lp8926 -g20 -aI5 -aI-55 -aa(lp8927 -g15 -aI68 -aI-72 -aI29 -aI-55 -aI50 -aI-61 -aa(lp8928 -g15 -aI143 -aI-147 -aI86 -aI-83 -aI111 -aI-108 -aa(lp8929 -g20 -aI314 -aI-354 -aa(lp8930 -g20 -aI227 -aI-562 -aa(lp8931 -g15 -aI185 -aI-641 -aI210 -aI-603 -aI196 -aI-629 -aa(lp8932 -g15 -aI132 -aI-658 -aI174 -aI-652 -aI156 -aI-658 -aa(lp8933 -g20 -aI114 -aI-658 -aa(lp8934 -g20 -aI125 -aI-714 -aa(lp8935 -g20 -aI302 -aI-714 -aa(lp8936 -g20 -aI404 -aI-444 -aa(lp8937 -g20 -aI581 -aI-714 -aa(lp8938 -g20 -aI751 -aI-714 -aa(lp8939 -g20 -aI730 -aI-658 -aa(lp8940 -g20 -aI713 -aI-658 -aa(lp8941 -g15 -aI648 -aI-639 -aI687 -aI-658 -aI665 -aI-652 -aa(lp8942 -g15 -aI574 -aI-562 -aI630 -aI-626 -aI606 -aI-601 -aa(lp8943 -g20 -aI434 -aI-382 -aa(lp8944 -g20 -aI526 -aI-151 -aa(lp8945 -g15 -aI566 -aI-73 -aI542 -aI-111 -aI555 -aI-85 -aa(lp8946 -g15 -aI622 -aI-55 -aI577 -aI-61 -aI596 -aI-55 -aa(lp8947 -g20 -aI639 -aI-55 -aa(lp8948 -g20 -aI629 -aI0 -aa(lp8949 -g20 -aI450 -aI0 -aa(lp8950 -g20 -aI342 -aI-293 -aa(lp8951 -g20 -aI142 -aI0 -aa(lp8952 -g10 -aa(lp8953 -g8 -aI727 -aI0 -aa(lp8954 -g10 -aa(lp8955 -g8 -aI727 -aI0 -aasV| -(lp8956 -(lp8957 -g8 -aI422 -aI320 -aa(lp8958 -g20 -aI342 -aI320 -aa(lp8959 -g20 -aI342 -aI-1012 -aa(lp8960 -g20 -aI422 -aI-1012 -aa(lp8961 -g10 -aa(lp8962 -g8 -aI745 -aI0 -aa(lp8963 -g10 -aa(lp8964 -g8 -aI745 -aI0 -aasV# -(lp8965 -(lp8966 -g8 -aI675 -aI-349 -aa(lp8967 -g20 -aI666 -aI-270 -aa(lp8968 -g20 -aI498 -aI-270 -aa(lp8969 -g20 -aI419 -aI0 -aa(lp8970 -g20 -aI339 -aI0 -aa(lp8971 -g20 -aI418 -aI-270 -aa(lp8972 -g20 -aI233 -aI-270 -aa(lp8973 -g20 -aI154 -aI0 -aa(lp8974 -g20 -aI74 -aI0 -aa(lp8975 -g20 -aI153 -aI-270 -aa(lp8976 -g20 -aI44 -aI-270 -aa(lp8977 -g20 -aI53 -aI-349 -aa(lp8978 -g20 -aI177 -aI-349 -aa(lp8979 -g20 -aI254 -aI-610 -aa(lp8980 -g20 -aI95 -aI-610 -aa(lp8981 -g20 -aI104 -aI-689 -aa(lp8982 -g20 -aI277 -aI-689 -aa(lp8983 -g20 -aI353 -aI-951 -aa(lp8984 -g20 -aI434 -aI-951 -aa(lp8985 -g20 -aI357 -aI-689 -aa(lp8986 -g20 -aI542 -aI-689 -aa(lp8987 -g20 -aI619 -aI-951 -aa(lp8988 -g20 -aI699 -aI-951 -aa(lp8989 -g20 -aI622 -aI-689 -aa(lp8990 -g20 -aI726 -aI-689 -aa(lp8991 -g20 -aI718 -aI-610 -aa(lp8992 -g20 -aI600 -aI-610 -aa(lp8993 -g20 -aI524 -aI-349 -aa(lp8994 -g10 -aa(lp8995 -g8 -aI258 -aI-349 -aa(lp8996 -g20 -aI444 -aI-349 -aa(lp8997 -g20 -aI520 -aI-610 -aa(lp8998 -g20 -aI334 -aI-610 -aa(lp8999 -g10 -aa(lp9000 -g8 -aI745 -aI0 -aa(lp9001 -g10 -aa(lp9002 -g8 -aI745 -aI0 -aasV' -(lp9003 -(lp9004 -g8 -aI195 -aI-951 -aa(lp9005 -g20 -aI337 -aI-951 -aa(lp9006 -g20 -aI230 -aI-638 -aa(lp9007 -g20 -aI169 -aI-638 -aa(lp9008 -g10 -aa(lp9009 -g8 -aI293 -aI0 -aa(lp9010 -g10 -aa(lp9011 -g8 -aI293 -aI0 -aasV+ -(lp9012 -(lp9013 -g8 -aI422 -aI-437 -aa(lp9014 -g20 -aI422 -aI-190 -aa(lp9015 -g20 -aI342 -aI-190 -aa(lp9016 -g20 -aI342 -aI-437 -aa(lp9017 -g20 -aI97 -aI-437 -aa(lp9018 -g20 -aI97 -aI-515 -aa(lp9019 -g20 -aI342 -aI-515 -aa(lp9020 -g20 -aI342 -aI-761 -aa(lp9021 -g20 -aI422 -aI-761 -aa(lp9022 -g20 -aI422 -aI-515 -aa(lp9023 -g20 -aI669 -aI-515 -aa(lp9024 -g20 -aI669 -aI-437 -aa(lp9025 -g10 -aa(lp9026 -g8 -aI745 -aI0 -aa(lp9027 -g10 -aa(lp9028 -g8 -aI745 -aI0 -aasV/ -(lp9029 -(lp9030 -g8 -aI-39 -aI161 -aa(lp9031 -g20 -aI-123 -aI161 -aa(lp9032 -g20 -aI423 -aI-1012 -aa(lp9033 -g20 -aI507 -aI-1012 -aa(lp9034 -g10 -aa(lp9035 -g8 -aI384 -aI0 -aa(lp9036 -g10 -aa(lp9037 -g8 -aI384 -aI0 -aasV3 -(lp9038 -(lp9039 -g8 -aI235 -aI-458 -aa(lp9040 -g20 -aI249 -aI-526 -aa(lp9041 -g20 -aI292 -aI-526 -aa(lp9042 -g15 -aI478 -aI-595 -aI367 -aI-526 -aI430 -aI-549 -aa(lp9043 -g15 -aI552 -aI-776 -aI527 -aI-642 -aI552 -aI-702 -aa(lp9044 -g15 -aI438 -aI-897 -aI552 -aI-857 -aI514 -aI-897 -aa(lp9045 -g15 -aI249 -aI-699 -aI339 -aI-897 -aI276 -aI-831 -aa(lp9046 -g15 -aI150 -aI-784 -aI183 -aI-699 -aI150 -aI-727 -aa(lp9047 -g15 -aI233 -aI-913 -aI150 -aI-836 -aI178 -aI-879 -aa(lp9048 -g15 -aI444 -aI-965 -aI288 -aI-947 -aI358 -aI-965 -aa(lp9049 -g15 -aI623 -aI-913 -aI519 -aI-965 -aI579 -aI-947 -aa(lp9050 -g15 -aI689 -aI-774 -aI667 -aI-879 -aI689 -aI-832 -aa(lp9051 -g15 -aI617 -aI-597 -aI689 -aI-706 -aI665 -aI-647 -aa(lp9052 -g15 -aI421 -aI-500 -aI569 -aI-547 -aI504 -aI-515 -aa(lp9053 -g15 -aI569 -aI-436 -aI485 -aI-494 -aI534 -aI-472 -aa(lp9054 -g15 -aI621 -aI-299 -aI603 -aI-400 -aI621 -aI-354 -aa(lp9055 -g15 -aI517 -aI-67 -aI621 -aI-199 -aI586 -aI-122 -aa(lp9056 -g15 -aI254 -aI13 -aI448 -aI-13 -aI360 -aI13 -aa(lp9057 -g15 -aI61 -aI-24 -aI169 -aI13 -aI104 -aI0 -aa(lp9058 -g15 -aI-3 -aI-126 -aI17 -aI-50 -aI-3 -aI-83 -aa(lp9059 -g15 -aI24 -aI-197 -aI-3 -aI-156 -aI5 -aI-179 -aa(lp9060 -g15 -aI97 -aI-224 -aI42 -aI-215 -aI67 -aI-224 -aa(lp9061 -g15 -aI141 -aI-105 -aI97 -aI-176 -aI112 -aI-136 -aa(lp9062 -g15 -aI264 -aI-59 -aI170 -aI-74 -aI211 -aI-59 -aa(lp9063 -g15 -aI420 -aI-119 -aI327 -aI-59 -aI379 -aI-79 -aa(lp9064 -g15 -aI481 -aI-284 -aI460 -aI-160 -aI481 -aI-215 -aa(lp9065 -g15 -aI431 -aI-412 -aI481 -aI-339 -aI464 -aI-382 -aa(lp9066 -g15 -aI293 -aI-458 -aI399 -aI-443 -aI353 -aI-458 -aa(lp9067 -g10 -aa(lp9068 -g8 -aI745 -aI0 -aa(lp9069 -g10 -aa(lp9070 -g8 -aI745 -aI0 -aasV7 -(lp9071 -(lp9072 -g8 -aI143 -aI0 -aa(lp9073 -g20 -aI637 -aI-844 -aa(lp9074 -g20 -aI286 -aI-844 -aa(lp9075 -g15 -aI194 -aI-776 -aI237 -aI-844 -aI207 -aI-822 -aa(lp9076 -g20 -aI175 -aI-710 -aa(lp9077 -g20 -aI119 -aI-710 -aa(lp9078 -g20 -aI177 -aI-951 -aa(lp9079 -g20 -aI773 -aI-951 -aa(lp9080 -g20 -aI765 -aI-912 -aa(lp9081 -g20 -aI244 -aI0 -aa(lp9082 -g10 -aa(lp9083 -g8 -aI745 -aI0 -aa(lp9084 -g10 -aa(lp9085 -g8 -aI745 -aI0 -aasV; -(lp9086 -(lp9087 -g8 -aI248 -aI-536 -aa(lp9088 -g15 -aI165 -aI-618 -aI192 -aI-536 -aI165 -aI-563 -aa(lp9089 -g15 -aI189 -aI-692 -aI165 -aI-648 -aI173 -aI-673 -aa(lp9090 -g15 -aI253 -aI-720 -aI204 -aI-711 -aI226 -aI-720 -aa(lp9091 -g15 -aI335 -aI-639 -aI308 -aI-720 -aI335 -aI-693 -aa(lp9092 -g15 -aI312 -aI-564 -aI335 -aI-607 -aI328 -aI-582 -aa(lp9093 -g15 -aI248 -aI-536 -aI296 -aI-545 -aI274 -aI-536 -aa(lp9094 -g10 -aa(lp9095 -g8 -aI24 -aI195 -aa(lp9096 -g20 -aI29 -aI139 -aa(lp9097 -g15 -aI165 -aI27 -aI120 -aI118 -aI165 -aI81 -aa(lp9098 -g15 -aI122 -aI-23 -aI165 -aI11 -aI151 -aI-5 -aa(lp9099 -g15 -aI78 -aI-91 -aI93 -aI-41 -aI78 -aI-64 -aa(lp9100 -g15 -aI101 -aI-148 -aI78 -aI-115 -aI86 -aI-134 -aa(lp9101 -g15 -aI161 -aI-170 -aI116 -aI-162 -aI136 -aI-170 -aa(lp9102 -g15 -aI236 -aI-139 -aI191 -aI-170 -aI216 -aI-160 -aa(lp9103 -g15 -aI265 -aI-60 -aI255 -aI-119 -aI265 -aI-93 -aa(lp9104 -g15 -aI202 -aI104 -aI265 -aI4 -aI244 -aI59 -aa(lp9105 -g15 -aI24 -aI195 -aI160 -aI149 -aI101 -aI179 -aa(lp9106 -g10 -aa(lp9107 -g8 -aI381 -aI0 -aa(lp9108 -g10 -aa(lp9109 -g8 -aI381 -aI0 -aasV? -(lp9110 -(lp9111 -g8 -aI367 -aI-422 -aa(lp9112 -g20 -aI334 -aI-267 -aa(lp9113 -g20 -aI253 -aI-267 -aa(lp9114 -g20 -aI294 -aI-465 -aa(lp9115 -g15 -aI565 -aI-754 -aI475 -aI-531 -aI565 -aI-628 -aa(lp9116 -g15 -aI529 -aI-858 -aI565 -aI-797 -aI553 -aI-832 -aa(lp9117 -g15 -aI436 -aI-897 -aI506 -aI-884 -aI475 -aI-897 -aa(lp9118 -g15 -aI270 -aI-709 -aI344 -aI-897 -aI289 -aI-835 -aa(lp9119 -g15 -aI174 -aI-788 -aI206 -aI-709 -aI174 -aI-735 -aa(lp9120 -g15 -aI249 -aI-913 -aI174 -aI-838 -aI199 -aI-879 -aa(lp9121 -g15 -aI444 -aI-965 -aI298 -aI-948 -aI363 -aI-965 -aa(lp9122 -g15 -aI695 -aI-743 -aI611 -aI-965 -aI695 -aI-891 -aa(lp9123 -g15 -aI367 -aI-422 -aI695 -aI-608 -aI586 -aI-501 -aa(lp9124 -g10 -aa(lp9125 -g8 -aI264 -aI10 -aa(lp9126 -g15 -aI181 -aI-70 -aI209 -aI10 -aI181 -aI-16 -aa(lp9127 -g15 -aI205 -aI-144 -aI181 -aI-101 -aI189 -aI-126 -aa(lp9128 -g15 -aI269 -aI-172 -aI221 -aI-163 -aI242 -aI-172 -aa(lp9129 -g15 -aI330 -aI-150 -aI295 -aI-172 -aI315 -aI-165 -aa(lp9130 -g15 -aI352 -aI-91 -aI344 -aI-135 -aI352 -aI-116 -aa(lp9131 -g15 -aI328 -aI-16 -aI352 -aI-59 -aI344 -aI-34 -aa(lp9132 -g15 -aI264 -aI10 -aI312 -aI1 -aI291 -aI10 -aa(lp9133 -g10 -aa(lp9134 -g8 -aI666 -aI0 -aa(lp9135 -g10 -aa(lp9136 -g8 -aI666 -aI0 -aasVC -(lp9137 -(lp9138 -g8 -aI698 -aI-194 -aa(lp9139 -g15 -aI716 -aI-149 -aI710 -aI-185 -aI716 -aI-171 -aa(lp9140 -g15 -aI641 -aI-36 -aI716 -aI-107 -aI691 -aI-69 -aa(lp9141 -g15 -aI437 -aI13 -aI592 -aI-3 -aI524 -aI13 -aa(lp9142 -g15 -aI166 -aI-79 -aI321 -aI13 -aI231 -aI-17 -aa(lp9143 -g15 -aI69 -aI-343 -aI101 -aI-141 -aI69 -aI-229 -aa(lp9144 -g15 -aI226 -aI-780 -aI69 -aI-511 -aI121 -aI-657 -aa(lp9145 -g15 -aI618 -aI-965 -aI331 -aI-903 -aI462 -aI-965 -aa(lp9146 -g15 -aI800 -aI-925 -aI696 -aI-965 -aI756 -aI-951 -aa(lp9147 -g15 -aI865 -aI-816 -aI843 -aI-898 -aI865 -aI-862 -aa(lp9148 -g15 -aI829 -aI-741 -aI865 -aI-784 -aI853 -aI-759 -aa(lp9149 -g15 -aI734 -aI-713 -aI805 -aI-722 -aI773 -aI-713 -aa(lp9150 -g15 -aI601 -aI-894 -aI734 -aI-833 -aI690 -aI-894 -aa(lp9151 -g15 -aI325 -aI-714 -aI491 -aI-894 -aI399 -aI-834 -aa(lp9152 -g15 -aI214 -aI-322 -aI251 -aI-595 -aI214 -aI-464 -aa(lp9153 -g15 -aI451 -aI-73 -aI214 -aI-156 -aI293 -aI-73 -aa(lp9154 -g15 -aI698 -aI-194 -aI554 -aI-73 -aI636 -aI-113 -aa(lp9155 -g10 -aa(lp9156 -g8 -aI835 -aI0 -aa(lp9157 -g10 -aa(lp9158 -g8 -aI835 -aI0 -aasVG -(lp9159 -(lp9160 -g8 -aI930 -aI-439 -aa(lp9161 -g20 -aI918 -aI-383 -aa(lp9162 -g20 -aI913 -aI-383 -aa(lp9163 -g15 -aI835 -aI-359 -aI877 -aI-383 -aI851 -aI-375 -aa(lp9164 -g15 -aI800 -aI-287 -aI818 -aI-344 -aI807 -aI-319 -aa(lp9165 -g20 -aI749 -aI-47 -aa(lp9166 -g15 -aI447 -aI13 -aI655 -aI-6 -aI554 -aI13 -aa(lp9167 -g15 -aI167 -aI-79 -aI326 -aI13 -aI232 -aI-17 -aa(lp9168 -g15 -aI69 -aI-343 -aI101 -aI-142 -aI69 -aI-230 -aa(lp9169 -g15 -aI231 -aI-786 -aI69 -aI-519 -aI123 -aI-667 -aa(lp9170 -g15 -aI642 -aI-965 -aI340 -aI-905 -aI477 -aI-965 -aa(lp9171 -g15 -aI849 -aI-924 -aI731 -aI-965 -aI800 -aI-951 -aa(lp9172 -g15 -aI923 -aI-821 -aI899 -aI-897 -aI923 -aI-863 -aa(lp9173 -g15 -aI884 -aI-743 -aI923 -aI-788 -aI910 -aI-762 -aa(lp9174 -g15 -aI782 -aI-715 -aI857 -aI-725 -aI823 -aI-715 -aa(lp9175 -g15 -aI738 -aI-847 -aI782 -aI-772 -aI768 -aI-817 -aa(lp9176 -g15 -aI614 -aI-894 -aI709 -aI-878 -aI668 -aI-894 -aa(lp9177 -g15 -aI332 -aI-723 -aI504 -aI-894 -aI410 -aI-837 -aa(lp9178 -g15 -aI214 -aI-322 -aI254 -aI-610 -aI214 -aI-476 -aa(lp9179 -g15 -aI472 -aI-62 -aI214 -aI-148 -aI300 -aI-62 -aa(lp9180 -g15 -aI622 -aI-80 -aI521 -aI-62 -aI572 -aI-68 -aa(lp9181 -g20 -aI666 -aI-293 -aa(lp9182 -g15 -aI671 -aI-330 -aI670 -aI-309 -aI671 -aI-322 -aa(lp9183 -g15 -aI576 -aI-383 -aI671 -aI-365 -aI639 -aI-383 -aa(lp9184 -g20 -aI563 -aI-383 -aa(lp9185 -g20 -aI576 -aI-439 -aa(lp9186 -g10 -aa(lp9187 -g8 -aI951 -aI0 -aa(lp9188 -g10 -aa(lp9189 -g8 -aI951 -aI0 -aasVK -(lp9190 -(lp9191 -g8 -aI-17 -aI-55 -aa(lp9192 -g20 -aI0 -aI-55 -aa(lp9193 -g15 -aI92 -aI-79 -aI42 -aI-55 -aI73 -aI-63 -aa(lp9194 -g15 -aI130 -aI-151 -aI111 -aI-96 -aI123 -aI-119 -aa(lp9195 -g20 -aI269 -aI-804 -aa(lp9196 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp9197 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp9198 -g20 -aI161 -aI-895 -aa(lp9199 -g20 -aI173 -aI-951 -aa(lp9200 -g20 -aI561 -aI-951 -aa(lp9201 -g20 -aI549 -aI-895 -aa(lp9202 -g20 -aI531 -aI-895 -aa(lp9203 -g15 -aI440 -aI-871 -aI489 -aI-895 -aI458 -aI-887 -aa(lp9204 -g15 -aI402 -aI-799 -aI421 -aI-855 -aI408 -aI-831 -aa(lp9205 -g20 -aI345 -aI-530 -aa(lp9206 -g20 -aI321 -aI-431 -aa(lp9207 -g20 -aI665 -aI-747 -aa(lp9208 -g15 -aI765 -aI-867 -aI732 -aI-808 -aI765 -aI-848 -aa(lp9209 -g15 -aI706 -aI-896 -aI765 -aI-886 -aI745 -aI-896 -aa(lp9210 -g20 -aI717 -aI-951 -aa(lp9211 -g20 -aI1011 -aI-951 -aa(lp9212 -g20 -aI1001 -aI-896 -aa(lp9213 -g15 -aI924 -aI-873 -aI978 -aI-896 -aI952 -aI-888 -aa(lp9214 -g15 -aI796 -aI-771 -aI896 -aI-858 -aI853 -aI-824 -aa(lp9215 -g20 -aI553 -aI-551 -aa(lp9216 -g20 -aI714 -aI-162 -aa(lp9217 -g15 -aI841 -aI-55 -aI744 -aI-91 -aI786 -aI-55 -aa(lp9218 -g20 -aI845 -aI-55 -aa(lp9219 -g20 -aI833 -aI0 -aa(lp9220 -g20 -aI814 -aI0 -aa(lp9221 -g15 -aI657 -aI-21 -aI744 -aI0 -aI691 -aI-6 -aa(lp9222 -g15 -aI574 -aI-123 -aI623 -aI-35 -aI595 -aI-69 -aa(lp9223 -g20 -aI445 -aI-452 -aa(lp9224 -g20 -aI307 -aI-356 -aa(lp9225 -g20 -aI264 -aI-146 -aa(lp9226 -g15 -aI258 -aI-108 -aI260 -aI-126 -aI258 -aI-114 -aa(lp9227 -g15 -aI354 -aI-55 -aI258 -aI-73 -aI290 -aI-55 -aa(lp9228 -g20 -aI371 -aI-55 -aa(lp9229 -g20 -aI360 -aI0 -aa(lp9230 -g20 -aI-27 -aI0 -aa(lp9231 -g10 -aa(lp9232 -g8 -aI933 -aI0 -aa(lp9233 -g10 -aa(lp9234 -g8 -aI933 -aI0 -aasVO -(lp9235 -(lp9236 -g8 -aI602 -aI-966 -aa(lp9237 -g15 -aI852 -aI-869 -aI706 -aI-966 -aI789 -aI-934 -aa(lp9238 -g15 -aI947 -aI-599 -aI916 -aI-805 -aI947 -aI-715 -aa(lp9239 -g15 -aI799 -aI-177 -aI947 -aI-447 -aI898 -aI-306 -aa(lp9240 -g15 -aI418 -aI15 -aI700 -aI-49 -aI573 -aI15 -aa(lp9241 -g15 -aI164 -aI-84 -aI313 -aI15 -aI228 -aI-17 -aa(lp9242 -g15 -aI69 -aI-354 -aI100 -aI-151 -aI69 -aI-241 -aa(lp9243 -g15 -aI218 -aI-774 -aI69 -aI-507 -aI118 -aI-647 -aa(lp9244 -g15 -aI602 -aI-966 -aI318 -aI-902 -aI446 -aI-966 -aa(lp9245 -g10 -aa(lp9246 -g8 -aI426 -aI-58 -aa(lp9247 -g15 -aI696 -aI-242 -aI537 -aI-58 -aI627 -aI-119 -aa(lp9248 -g15 -aI801 -aI-635 -aI766 -aI-364 -aI801 -aI-495 -aa(lp9249 -g15 -aI746 -aI-827 -aI801 -aI-718 -aI783 -aI-782 -aa(lp9250 -g15 -aI591 -aI-894 -aI709 -aI-871 -aI658 -aI-894 -aa(lp9251 -g15 -aI319 -aI-709 -aI480 -aI-894 -aI390 -aI-832 -aa(lp9252 -g15 -aI214 -aI-316 -aI249 -aI-586 -aI214 -aI-455 -aa(lp9253 -g15 -aI271 -aI-124 -aI214 -aI-233 -aI233 -aI-169 -aa(lp9254 -g15 -aI426 -aI-58 -aI309 -aI-80 -aI360 -aI-58 -aa(lp9255 -g10 -aa(lp9256 -g8 -aI989 -aI0 -aa(lp9257 -g10 -aa(lp9258 -g8 -aI989 -aI0 -aasVS -(lp9259 -(lp9260 -g8 -aI111 -aI-278 -aa(lp9261 -g15 -aI166 -aI-113 -aI111 -aI-210 -aI129 -aI-155 -aa(lp9262 -g15 -aI314 -aI-51 -aI202 -aI-72 -aI251 -aI-51 -aa(lp9263 -g15 -aI462 -aI-97 -aI376 -aI-51 -aI425 -aI-67 -aa(lp9264 -g15 -aI517 -aI-223 -aI499 -aI-128 -aI517 -aI-170 -aa(lp9265 -g15 -aI486 -aI-330 -aI517 -aI-265 -aI507 -aI-301 -aa(lp9266 -g15 -aI349 -aI-433 -aI464 -aI-359 -aI419 -aI-393 -aa(lp9267 -g15 -aI201 -aI-560 -aI278 -aI-474 -aI229 -aI-516 -aa(lp9268 -g15 -aI160 -aI-707 -aI173 -aI-603 -aI160 -aI-652 -aa(lp9269 -g15 -aI247 -aI-893 -aI160 -aI-784 -aI189 -aI-846 -aa(lp9270 -g15 -aI483 -aI-965 -aI305 -aI-941 -aI384 -aI-965 -aa(lp9271 -g15 -aI668 -aI-924 -aI560 -aI-965 -aI622 -aI-951 -aa(lp9272 -g15 -aI737 -aI-821 -aI714 -aI-897 -aI737 -aI-863 -aa(lp9273 -g15 -aI619 -aI-728 -aI737 -aI-759 -aI698 -aI-728 -aa(lp9274 -g15 -aI582 -aI-852 -aI619 -aI-780 -aI607 -aI-822 -aa(lp9275 -g15 -aI473 -aI-897 -aI557 -aI-882 -aI521 -aI-897 -aa(lp9276 -g15 -aI343 -aI-852 -aI420 -aI-897 -aI376 -aI-882 -aa(lp9277 -g15 -aI292 -aI-730 -aI309 -aI-822 -aI292 -aI-781 -aa(lp9278 -g15 -aI319 -aI-632 -aI292 -aI-692 -aI301 -aI-659 -aa(lp9279 -g15 -aI457 -aI-526 -aI337 -aI-604 -aI383 -aI-569 -aa(lp9280 -g15 -aI608 -aI-404 -aI526 -aI-485 -aI577 -aI-444 -aa(lp9281 -g15 -aI654 -aI-266 -aI639 -aI-364 -aI654 -aI-318 -aa(lp9282 -g15 -aI562 -aI-60 -aI654 -aI-178 -aI624 -aI-109 -aa(lp9283 -g15 -aI305 -aI13 -aI500 -aI-11 -aI415 -aI13 -aa(lp9284 -g15 -aI89 -aI-40 -aI214 -aI13 -aI142 -aI-4 -aa(lp9285 -g15 -aI9 -aI-176 -aI35 -aI-76 -aI9 -aI-121 -aa(lp9286 -g15 -aI38 -aI-250 -aI9 -aI-207 -aI18 -aI-232 -aa(lp9287 -g15 -aI111 -aI-278 -aI57 -aI-268 -aI82 -aI-278 -aa(lp9288 -g10 -aa(lp9289 -g8 -aI725 -aI0 -aa(lp9290 -g10 -aa(lp9291 -g8 -aI725 -aI0 -aasVW -(lp9292 -(lp9293 -g8 -aI1246 -aI-772 -aa(lp9294 -g15 -aI1272 -aI-847 -aI1263 -aI-806 -aI1272 -aI-831 -aa(lp9295 -g15 -aI1197 -aI-895 -aI1272 -aI-879 -aI1247 -aI-895 -aa(lp9296 -g20 -aI1165 -aI-895 -aa(lp9297 -g20 -aI1175 -aI-951 -aa(lp9298 -g20 -aI1501 -aI-951 -aa(lp9299 -g20 -aI1489 -aI-895 -aa(lp9300 -g20 -aI1464 -aI-895 -aa(lp9301 -g15 -aI1396 -aI-874 -aI1435 -aI-895 -aI1413 -aI-888 -aa(lp9302 -g15 -aI1341 -aI-791 -aI1380 -aI-860 -aI1361 -aI-833 -aa(lp9303 -g20 -aI947 -aI0 -aa(lp9304 -g20 -aI825 -aI0 -aa(lp9305 -g20 -aI765 -aI-738 -aa(lp9306 -g20 -aI406 -aI0 -aa(lp9307 -g20 -aI285 -aI0 -aa(lp9308 -g20 -aI216 -aI-825 -aa(lp9309 -g15 -aI196 -aI-878 -aI213 -aI-848 -aI207 -aI-866 -aa(lp9310 -g15 -aI136 -aI-895 -aI185 -aI-889 -aI165 -aI-895 -aa(lp9311 -g20 -aI118 -aI-895 -aa(lp9312 -g20 -aI130 -aI-951 -aa(lp9313 -g20 -aI493 -aI-951 -aa(lp9314 -g20 -aI481 -aI-895 -aa(lp9315 -g20 -aI450 -aI-895 -aa(lp9316 -g15 -aI354 -aI-827 -aI386 -aI-895 -aI354 -aI-872 -aa(lp9317 -g15 -aI357 -aI-782 -aI354 -aI-809 -aI355 -aI-794 -aa(lp9318 -g20 -aI389 -aI-355 -aa(lp9319 -g15 -aI398 -aI-130 -aI395 -aI-274 -aI398 -aI-199 -aa(lp9320 -g15 -aI507 -aI-369 -aI435 -aI-218 -aI472 -aI-297 -aa(lp9321 -g20 -aI787 -aI-942 -aa(lp9322 -g20 -aI884 -aI-942 -aa(lp9323 -g20 -aI927 -aI-364 -aa(lp9324 -g15 -aI934 -aI-130 -aI934 -aI-277 -aI936 -aI-199 -aa(lp9325 -g15 -aI1034 -aI-349 -aI973 -aI-221 -aI1007 -aI-294 -aa(lp9326 -g10 -aa(lp9327 -g8 -aI1393 -aI0 -aa(lp9328 -g10 -aa(lp9329 -g8 -aI1393 -aI0 -aasV[ -(lp9330 -(lp9331 -g8 -aI6 -aI171 -aa(lp9332 -g20 -aI258 -aI-1012 -aa(lp9333 -g20 -aI555 -aI-1012 -aa(lp9334 -g20 -aI544 -aI-956 -aa(lp9335 -g20 -aI486 -aI-956 -aa(lp9336 -g15 -aI396 -aI-933 -aI445 -aI-956 -aI415 -aI-948 -aa(lp9337 -g15 -aI357 -aI-860 -aI377 -aI-917 -aI364 -aI-893 -aa(lp9338 -g20 -aI167 -aI24 -aa(lp9339 -g15 -aI162 -aI61 -aI164 -aI40 -aI162 -aI52 -aa(lp9340 -g15 -aI258 -aI115 -aI162 -aI97 -aI194 -aI115 -aa(lp9341 -g20 -aI315 -aI115 -aa(lp9342 -g20 -aI304 -aI171 -aa(lp9343 -g10 -aa(lp9344 -g8 -aI478 -aI0 -aa(lp9345 -g10 -aa(lp9346 -g8 -aI478 -aI0 -aasV_ -(lp9347 -(lp9348 -g8 -aI502 -aI189 -aa(lp9349 -g20 -aI-121 -aI189 -aa(lp9350 -g20 -aI-104 -aI111 -aa(lp9351 -g20 -aI520 -aI111 -aa(lp9352 -g10 -aa(lp9353 -g8 -aI611 -aI0 -aa(lp9354 -g10 -aa(lp9355 -g8 -aI611 -aI0 -aasVc -(lp9356 -(lp9357 -g8 -aI534 -aI-166 -aa(lp9358 -g15 -aI548 -aI-133 -aI543 -aI-160 -aI548 -aI-149 -aa(lp9359 -g15 -aI485 -aI-33 -aI548 -aI-97 -aI527 -aI-64 -aa(lp9360 -g15 -aI317 -aI13 -aI443 -aI-2 -aI387 -aI13 -aa(lp9361 -g15 -aI128 -aI-60 -aI239 -aI13 -aI176 -aI-11 -aa(lp9362 -g15 -aI57 -aI-261 -aI81 -aI-109 -aI57 -aI-176 -aa(lp9363 -g15 -aI169 -aI-581 -aI57 -aI-378 -aI94 -aI-484 -aa(lp9364 -g15 -aI454 -aI-727 -aI245 -aI-678 -aI339 -aI-727 -aa(lp9365 -g15 -aI597 -aI-690 -aI515 -aI-727 -aI563 -aI-715 -aa(lp9366 -g15 -aI649 -aI-599 -aI631 -aI-666 -aI649 -aI-636 -aa(lp9367 -g15 -aI616 -aI-532 -aI649 -aI-572 -aI638 -aI-550 -aa(lp9368 -g15 -aI530 -aI-506 -aI595 -aI-514 -aI566 -aI-506 -aa(lp9369 -g15 -aI503 -aI-620 -aI530 -aI-553 -aI521 -aI-591 -aa(lp9370 -g15 -aI427 -aI-663 -aI485 -aI-649 -aI459 -aI-663 -aa(lp9371 -g15 -aI265 -aI-524 -aI365 -aI-663 -aI311 -aI-617 -aa(lp9372 -g15 -aI195 -aI-251 -aI219 -aI-431 -aI195 -aI-340 -aa(lp9373 -g15 -aI342 -aI-70 -aI195 -aI-130 -aI244 -aI-70 -aa(lp9374 -g15 -aI534 -aI-166 -aI420 -aI-70 -aI484 -aI-102 -aa(lp9375 -g10 -aa(lp9376 -g8 -aI649 -aI0 -aa(lp9377 -g10 -aa(lp9378 -g8 -aI649 -aI0 -aasVg -(lp9379 -(lp9380 -g8 -aI586 -aI-685 -aa(lp9381 -g15 -aI730 -aI-779 -aI628 -aI-748 -aI676 -aI-779 -aa(lp9382 -g15 -aI797 -aI-718 -aI775 -aI-779 -aI797 -aI-759 -aa(lp9383 -g15 -aI718 -aI-635 -aI797 -aI-663 -aI771 -aI-635 -aa(lp9384 -g15 -aI681 -aI-683 -aI718 -aI-667 -aI706 -aI-683 -aa(lp9385 -g15 -aI615 -aI-653 -aI664 -aI-683 -aI642 -aI-673 -aa(lp9386 -g15 -aI645 -aI-550 -aI635 -aI-625 -aI645 -aI-591 -aa(lp9387 -g15 -aI561 -aI-344 -aI645 -aI-475 -aI617 -aI-407 -aa(lp9388 -g15 -aI339 -aI-251 -aI505 -aI-282 -aI431 -aI-251 -aa(lp9389 -g15 -aI297 -aI-254 -aI319 -aI-251 -aI305 -aI-252 -aa(lp9390 -g15 -aI202 -aI-170 -aI234 -aI-228 -aI202 -aI-200 -aa(lp9391 -g15 -aI270 -aI-130 -aI202 -aI-147 -aI225 -aI-134 -aa(lp9392 -g20 -aI398 -aI-116 -aa(lp9393 -g15 -aI605 -aI57 -aI536 -aI-101 -aI605 -aI-43 -aa(lp9394 -g15 -aI511 -aI251 -aI605 -aI140 -aI574 -aI205 -aa(lp9395 -g15 -aI244 -aI320 -aI449 -aI297 -aI360 -aI320 -aa(lp9396 -g15 -aI-46 -aI146 -aI50 -aI320 -aI-46 -aI262 -aa(lp9397 -g15 -aI11 -aI24 -aI-46 -aI99 -aI-27 -aI58 -aa(lp9398 -g15 -aI170 -aI-45 -aI50 -aI-8 -aI103 -aI-32 -aa(lp9399 -g15 -aI106 -aI-136 -aI128 -aI-65 -aI106 -aI-96 -aa(lp9400 -g15 -aI133 -aI-206 -aI106 -aI-164 -aI115 -aI-187 -aa(lp9401 -g15 -aI233 -aI-272 -aI150 -aI-225 -aI184 -aI-247 -aa(lp9402 -g15 -aI139 -aI-430 -aI171 -aI-302 -aI139 -aI-354 -aa(lp9403 -g15 -aI224 -aI-635 -aI139 -aI-505 -aI168 -aI-573 -aa(lp9404 -g15 -aI449 -aI-727 -aI281 -aI-696 -aI356 -aI-727 -aa(lp9405 -g15 -aI586 -aI-685 -aI506 -aI-727 -aI551 -aI-713 -aa(lp9406 -g10 -aa(lp9407 -g8 -aI354 -aI-315 -aa(lp9408 -g15 -aI477 -aI-391 -aI405 -aI-315 -aI446 -aI-340 -aa(lp9409 -g15 -aI524 -aI-556 -aI508 -aI-441 -aI524 -aI-496 -aa(lp9410 -g15 -aI432 -aI-666 -aI524 -aI-629 -aI493 -aI-666 -aa(lp9411 -g15 -aI308 -aI-589 -aI380 -aI-666 -aI338 -aI-640 -aa(lp9412 -g15 -aI262 -aI-424 -aI277 -aI-538 -aI262 -aI-483 -aa(lp9413 -g15 -aI354 -aI-315 -aI262 -aI-351 -aI293 -aI-315 -aa(lp9414 -g10 -aa(lp9415 -g8 -aI365 -aI-3 -aa(lp9416 -g20 -aI235 -aI-15 -aa(lp9417 -g15 -aI178 -aI-2 -aI229 -aI-16 -aI209 -aI-11 -aa(lp9418 -g15 -aI95 -aI47 -aI146 -aI6 -aI118 -aI23 -aa(lp9419 -g15 -aI61 -aI139 -aI72 -aI72 -aI61 -aI103 -aa(lp9420 -g15 -aI249 -aI255 -aI61 -aI216 -aI123 -aI255 -aa(lp9421 -g15 -aI428 -aI211 -aI327 -aI255 -aI387 -aI240 -aa(lp9422 -g15 -aI489 -aI94 -aI469 -aI182 -aI489 -aI143 -aa(lp9423 -g15 -aI365 -aI-3 -aI489 -aI36 -aI448 -aI3 -aa(lp9424 -g10 -aa(lp9425 -g8 -aI741 -aI0 -aa(lp9426 -g10 -aa(lp9427 -g8 -aI741 -aI0 -aasVk -(lp9428 -(lp9429 -g8 -aI451 -aI-511 -aa(lp9430 -g15 -aI550 -aI-636 -aI517 -aI-568 -aI550 -aI-610 -aa(lp9431 -g15 -aI490 -aI-657 -aI550 -aI-650 -aI530 -aI-657 -aa(lp9432 -g20 -aI502 -aI-713 -aa(lp9433 -g20 -aI797 -aI-713 -aa(lp9434 -g20 -aI785 -aI-657 -aa(lp9435 -g15 -aI570 -aI-532 -aI733 -aI-657 -aI662 -aI-615 -aa(lp9436 -g20 -aI450 -aI-422 -aa(lp9437 -g20 -aI572 -aI-158 -aa(lp9438 -g15 -aI707 -aI-46 -aI606 -aI-83 -aI651 -aI-46 -aa(lp9439 -g20 -aI695 -aI9 -aa(lp9440 -g15 -aI533 -aI-16 -aI622 -aI9 -aI567 -aI0 -aa(lp9441 -g15 -aI445 -aI-127 -aI498 -aI-33 -aI469 -aI-70 -aa(lp9442 -g20 -aI358 -aI-340 -aa(lp9443 -g20 -aI237 -aI-263 -aa(lp9444 -g20 -aI182 -aI0 -aa(lp9445 -g20 -aI58 -aI0 -aa(lp9446 -g20 -aI231 -aI-823 -aa(lp9447 -g15 -aI244 -aI-894 -aI240 -aI-862 -aI244 -aI-886 -aa(lp9448 -g15 -aI150 -aI-956 -aI244 -aI-935 -aI212 -aI-956 -aa(lp9449 -g20 -aI139 -aI-956 -aa(lp9450 -g20 -aI151 -aI-1012 -aa(lp9451 -g20 -aI397 -aI-1012 -aa(lp9452 -g20 -aI345 -aI-767 -aa(lp9453 -g15 -aI241 -aI-328 -aI297 -aI-543 -aI262 -aI-397 -aa(lp9454 -g10 -aa(lp9455 -g8 -aI758 -aI0 -aa(lp9456 -g10 -aa(lp9457 -g8 -aI758 -aI0 -aasVo -(lp9458 -(lp9459 -g8 -aI454 -aI-727 -aa(lp9460 -g15 -aI639 -aI-656 -aI532 -aI-727 -aI594 -aI-703 -aa(lp9461 -g15 -aI707 -aI-451 -aI685 -aI-609 -aI707 -aI-540 -aa(lp9462 -g15 -aI598 -aI-130 -aI707 -aI-332 -aI671 -aI-225 -aa(lp9463 -g15 -aI313 -aI13 -aI526 -aI-34 -aI431 -aI13 -aa(lp9464 -g15 -aI125 -aI-59 -aI232 -aI13 -aI170 -aI-10 -aa(lp9465 -g15 -aI57 -aI-261 -aI79 -aI-108 -aI57 -aI-175 -aa(lp9466 -g15 -aI166 -aI-584 -aI57 -aI-381 -aI93 -aI-489 -aa(lp9467 -g15 -aI454 -aI-727 -aI240 -aI-679 -aI335 -aI-727 -aa(lp9468 -g10 -aa(lp9469 -g8 -aI328 -aI-51 -aa(lp9470 -g15 -aI503 -aI-182 -aI401 -aI-51 -aI459 -aI-95 -aa(lp9471 -g15 -aI569 -aI-471 -aI547 -aI-269 -aI569 -aI-365 -aa(lp9472 -g15 -aI438 -aI-657 -aI569 -aI-595 -aI525 -aI-657 -aa(lp9473 -g15 -aI263 -aI-526 -aI366 -aI-657 -aI307 -aI-613 -aa(lp9474 -g15 -aI195 -aI-235 -aI218 -aI-438 -aI195 -aI-341 -aa(lp9475 -g15 -aI328 -aI-51 -aI195 -aI-112 -aI240 -aI-51 -aa(lp9476 -g10 -aa(lp9477 -g8 -aI765 -aI0 -aa(lp9478 -g10 -aa(lp9479 -g8 -aI765 -aI0 -aasVs -(lp9480 -(lp9481 -g8 -aI482 -aI-517 -aa(lp9482 -g15 -aI450 -aI-624 -aI482 -aI-561 -aI471 -aI-597 -aa(lp9483 -g15 -aI362 -aI-664 -aI429 -aI-651 -aI400 -aI-664 -aa(lp9484 -g15 -aI267 -aI-632 -aI322 -aI-664 -aI291 -aI-654 -aa(lp9485 -g15 -aI233 -aI-550 -aI244 -aI-611 -aI233 -aI-583 -aa(lp9486 -g15 -aI266 -aI-474 -aI233 -aI-520 -aI244 -aI-495 -aa(lp9487 -g15 -aI369 -aI-412 -aI288 -aI-453 -aI322 -aI-433 -aa(lp9488 -g15 -aI529 -aI-205 -aI475 -aI-365 -aI529 -aI-296 -aa(lp9489 -g15 -aI453 -aI-47 -aI529 -aI-140 -aI504 -aI-87 -aa(lp9490 -g15 -aI253 -aI13 -aI403 -aI-6 -aI336 -aI13 -aa(lp9491 -g15 -aI92 -aI-27 -aI185 -aI13 -aI132 -aI0 -aa(lp9492 -g15 -aI33 -aI-136 -aI53 -aI-54 -aI33 -aI-90 -aa(lp9493 -g15 -aI56 -aI-202 -aI33 -aI-165 -aI41 -aI-187 -aa(lp9494 -g15 -aI117 -aI-224 -aI72 -aI-217 -aI92 -aI-224 -aa(lp9495 -g15 -aI157 -aI-96 -aI117 -aI-169 -aI130 -aI-126 -aa(lp9496 -g15 -aI269 -aI-50 -aI183 -aI-65 -aI221 -aI-50 -aa(lp9497 -g15 -aI413 -aI-174 -aI365 -aI-50 -aI413 -aI-91 -aa(lp9498 -g15 -aI382 -aI-254 -aI413 -aI-205 -aI403 -aI-232 -aa(lp9499 -g15 -aI278 -aI-321 -aI362 -aI-276 -aI327 -aI-298 -aa(lp9500 -g15 -aI150 -aI-415 -aI214 -aI-351 -aI171 -aI-382 -aa(lp9501 -g15 -aI117 -aI-527 -aI128 -aI-447 -aI117 -aI-485 -aa(lp9502 -g15 -aI188 -aI-670 -aI117 -aI-585 -aI140 -aI-633 -aa(lp9503 -g15 -aI374 -aI-726 -aI236 -aI-707 -aI297 -aI-726 -aa(lp9504 -g15 -aI527 -aI-689 -aI439 -aI-726 -aI490 -aI-713 -aa(lp9505 -g15 -aI582 -aI-599 -aI564 -aI-665 -aI582 -aI-635 -aa(lp9506 -g15 -aI482 -aI-517 -aI582 -aI-544 -aI549 -aI-517 -aa(lp9507 -g10 -aa(lp9508 -g8 -aI618 -aI0 -aa(lp9509 -g10 -aa(lp9510 -g8 -aI618 -aI0 -aasVw -(lp9511 -(lp9512 -g8 -aI160 -aI12 -aa(lp9513 -g20 -aI150 -aI-562 -aa(lp9514 -g15 -aI131 -aI-633 -aI149 -aI-593 -aI143 -aI-617 -aa(lp9515 -g15 -aI62 -aI-658 -aI119 -aI-650 -aI96 -aI-658 -aa(lp9516 -g20 -aI49 -aI-658 -aa(lp9517 -g20 -aI67 -aI-714 -aa(lp9518 -g20 -aI268 -aI-714 -aa(lp9519 -g15 -aI272 -aI-106 -aI270 -aI-526 -aI272 -aI-324 -aa(lp9520 -g20 -aI277 -aI-106 -aa(lp9521 -g15 -aI574 -aI-702 -aI393 -aI-309 -aI492 -aI-508 -aa(lp9522 -g20 -aI685 -aI-707 -aa(lp9523 -g15 -aI713 -aI-97 -aI704 -aI-473 -aI713 -aI-269 -aa(lp9524 -g20 -aI722 -aI-97 -aa(lp9525 -g15 -aI902 -aI-361 -aI795 -aI-186 -aI855 -aI-274 -aa(lp9526 -g15 -aI973 -aI-568 -aI949 -aI-448 -aI973 -aI-517 -aa(lp9527 -g15 -aI916 -aI-648 -aI973 -aI-609 -aI954 -aI-636 -aa(lp9528 -g15 -aI994 -aI-727 -aI923 -aI-701 -aI950 -aI-727 -aa(lp9529 -g15 -aI1065 -aI-627 -aI1041 -aI-727 -aI1065 -aI-694 -aa(lp9530 -g15 -aI730 -aI0 -aI1065 -aI-499 -aI953 -aI-290 -aa(lp9531 -g20 -aI598 -aI13 -aa(lp9532 -g20 -aI578 -aI-563 -aa(lp9533 -g15 -aI297 -aI-3 -aI538 -aI-467 -aI444 -aI-280 -aa(lp9534 -g10 -aa(lp9535 -g8 -aI1091 -aI0 -aa(lp9536 -g10 -aa(lp9537 -g8 -aI1091 -aI0 -aasV{ -(lp9538 -(lp9539 -g8 -aI440 -aI171 -aa(lp9540 -g15 -aI298 -aI120 -aI379 -aI171 -aI332 -aI154 -aa(lp9541 -g15 -aI248 -aI-21 -aI264 -aI87 -aI248 -aI40 -aa(lp9542 -g20 -aI248 -aI-252 -aa(lp9543 -g15 -aI90 -aI-394 -aI248 -aI-343 -aI195 -aI-391 -aa(lp9544 -g20 -aI90 -aI-450 -aa(lp9545 -g15 -aI248 -aI-590 -aI195 -aI-452 -aI248 -aI-498 -aa(lp9546 -g20 -aI248 -aI-822 -aa(lp9547 -g15 -aI440 -aI-1012 -aI248 -aI-949 -aI312 -aI-1012 -aa(lp9548 -g20 -aI527 -aI-1012 -aa(lp9549 -g20 -aI527 -aI-955 -aa(lp9550 -g20 -aI488 -aI-955 -aa(lp9551 -g15 -aI378 -aI-815 -aI415 -aI-955 -aI378 -aI-908 -aa(lp9552 -g20 -aI378 -aI-587 -aa(lp9553 -g15 -aI230 -aI-423 -aI378 -aI-494 -aI329 -aI-439 -aa(lp9554 -g20 -aI230 -aI-422 -aa(lp9555 -g15 -aI378 -aI-256 -aI329 -aI-405 -aI378 -aI-350 -aa(lp9556 -g20 -aI378 -aI-26 -aa(lp9557 -g15 -aI488 -aI113 -aI378 -aI67 -aI415 -aI113 -aa(lp9558 -g20 -aI527 -aI113 -aa(lp9559 -g20 -aI527 -aI171 -aa(lp9560 -g10 -aa(lp9561 -g8 -aI570 -aI0 -aa(lp9562 -g10 -aa(lp9563 -g8 -aI570 -aI0 -aasV" -(lp9564 -(lp9565 -g8 -aI451 -aI-951 -aa(lp9566 -g20 -aI593 -aI-951 -aa(lp9567 -g20 -aI486 -aI-638 -aa(lp9568 -g20 -aI425 -aI-638 -aa(lp9569 -g10 -aa(lp9570 -g8 -aI201 -aI-951 -aa(lp9571 -g20 -aI342 -aI-951 -aa(lp9572 -g20 -aI235 -aI-638 -aa(lp9573 -g20 -aI174 -aI-638 -aa(lp9574 -g10 -aa(lp9575 -g8 -aI544 -aI0 -aa(lp9576 -g10 -aa(lp9577 -g8 -aI544 -aI0 -aasV& -(lp9578 -(lp9579 -g8 -aI713 -aI0 -aa(lp9580 -g20 -aI633 -aI-110 -aa(lp9581 -g15 -aI338 -aI13 -aI553 -aI-27 -aI454 -aI13 -aa(lp9582 -g15 -aI124 -aI-54 -aI246 -aI13 -aI175 -aI-9 -aa(lp9583 -g15 -aI46 -aI-235 -aI72 -aI-99 -aI46 -aI-160 -aa(lp9584 -g15 -aI109 -aI-410 -aI46 -aI-304 -aI67 -aI-362 -aa(lp9585 -g15 -aI326 -aI-539 -aI151 -aI-458 -aI223 -aI-501 -aa(lp9586 -g15 -aI262 -aI-735 -aI283 -aI-611 -aI262 -aI-677 -aa(lp9587 -g15 -aI334 -aI-905 -aI262 -aI-809 -aI286 -aI-865 -aa(lp9588 -g15 -aI546 -aI-965 -aI383 -aI-945 -aI453 -aI-965 -aa(lp9589 -g15 -aI713 -aI-918 -aI618 -aI-965 -aI674 -aI-949 -aa(lp9590 -g15 -aI772 -aI-791 -aI752 -aI-886 -aI772 -aI-844 -aa(lp9591 -g15 -aI723 -aI-651 -aI772 -aI-734 -aI755 -aI-687 -aa(lp9592 -g15 -aI481 -aI-528 -aI690 -aI-616 -aI610 -aI-575 -aa(lp9593 -g20 -aI667 -aI-272 -aa(lp9594 -g15 -aI751 -aI-508 -aI705 -aI-344 -aI733 -aI-422 -aa(lp9595 -g20 -aI762 -aI-560 -aa(lp9596 -g20 -aI1002 -aI-560 -aa(lp9597 -g20 -aI990 -aI-504 -aa(lp9598 -g20 -aI978 -aI-504 -aa(lp9599 -g15 -aI882 -aI-484 -aI934 -aI-504 -aI902 -aI-498 -aa(lp9600 -g15 -aI838 -aI-446 -aI862 -aI-471 -aI847 -aI-458 -aa(lp9601 -g15 -aI772 -aI-316 -aI829 -aI-434 -aI807 -aI-390 -aa(lp9602 -g15 -aI713 -aI-211 -aI755 -aI-281 -aI735 -aI-246 -aa(lp9603 -g20 -aI786 -aI-111 -aa(lp9604 -g15 -aI917 -aI-55 -aI813 -aI-74 -aI857 -aI-55 -aa(lp9605 -g20 -aI929 -aI-55 -aa(lp9606 -g20 -aI917 -aI0 -aa(lp9607 -g10 -aa(lp9608 -g8 -aI444 -aI-582 -aa(lp9609 -g15 -aI603 -aI-667 -aI519 -aI-610 -aI572 -aI-638 -aa(lp9610 -g15 -aI650 -aI-782 -aI634 -aI-695 -aI650 -aI-733 -aa(lp9611 -g15 -aI619 -aI-867 -aI650 -aI-817 -aI640 -aI-845 -aa(lp9612 -g15 -aI537 -aI-899 -aI598 -aI-888 -aI571 -aI-899 -aa(lp9613 -g15 -aI390 -aI-744 -aI439 -aI-899 -aI390 -aI-847 -aa(lp9614 -g15 -aI444 -aI-582 -aI390 -aI-695 -aI408 -aI-641 -aa(lp9615 -g10 -aa(lp9616 -g8 -aI591 -aI-167 -aa(lp9617 -g20 -aI365 -aI-481 -aa(lp9618 -g15 -aI219 -aI-380 -aI295 -aI-450 -aI247 -aI-416 -aa(lp9619 -g15 -aI178 -aI-238 -aI192 -aI-344 -aI178 -aI-297 -aa(lp9620 -g15 -aI224 -aI-110 -aI178 -aI-186 -aI193 -aI-144 -aa(lp9621 -g15 -aI352 -aI-60 -aI255 -aI-77 -aI298 -aI-60 -aa(lp9622 -g15 -aI591 -aI-167 -aI444 -aI-60 -aI524 -aI-96 -aa(lp9623 -g10 -aa(lp9624 -g8 -aI989 -aI0 -aa(lp9625 -g10 -aa(lp9626 -g8 -aI989 -aI0 -aasV* -(lp9627 -(lp9628 -g8 -aI182 -aI-881 -aa(lp9629 -g20 -aI250 -aI-974 -aa(lp9630 -g20 -aI423 -aI-804 -aa(lp9631 -g20 -aI434 -aI-1019 -aa(lp9632 -g20 -aI548 -aI-995 -aa(lp9633 -g20 -aI468 -aI-797 -aa(lp9634 -g20 -aI695 -aI-877 -aa(lp9635 -g20 -aI720 -aI-765 -aa(lp9636 -g20 -aI485 -aI-747 -aa(lp9637 -g20 -aI692 -aI-636 -aa(lp9638 -g20 -aI625 -aI-546 -aa(lp9639 -g20 -aI449 -aI-710 -aa(lp9640 -g20 -aI441 -aI-496 -aa(lp9641 -g20 -aI328 -aI-521 -aa(lp9642 -g20 -aI405 -aI-719 -aa(lp9643 -g20 -aI178 -aI-638 -aa(lp9644 -g20 -aI154 -aI-750 -aa(lp9645 -g20 -aI388 -aI-769 -aa(lp9646 -g10 -aa(lp9647 -g8 -aI666 -aI0 -aa(lp9648 -g10 -aa(lp9649 -g8 -aI666 -aI0 -aasV. -(lp9650 -(lp9651 -g8 -aI141 -aI10 -aa(lp9652 -g15 -aI58 -aI-70 -aI86 -aI10 -aI58 -aI-16 -aa(lp9653 -g15 -aI82 -aI-144 -aI58 -aI-101 -aI66 -aI-126 -aa(lp9654 -g15 -aI146 -aI-172 -aI98 -aI-163 -aI119 -aI-172 -aa(lp9655 -g15 -aI229 -aI-91 -aI201 -aI-172 -aI229 -aI-145 -aa(lp9656 -g15 -aI205 -aI-16 -aI229 -aI-60 -aI221 -aI-35 -aa(lp9657 -g15 -aI141 -aI10 -aI189 -aI1 -aI168 -aI10 -aa(lp9658 -g10 -aa(lp9659 -g8 -aI381 -aI0 -aa(lp9660 -g10 -aa(lp9661 -g8 -aI381 -aI0 -aasV2 -(lp9662 -(lp9663 -g8 -aI-22 -aI0 -aa(lp9664 -g20 -aI5 -aI-107 -aa(lp9665 -g20 -aI318 -aI-390 -aa(lp9666 -g15 -aI492 -aI-584 -aI401 -aI-464 -aI459 -aI-529 -aa(lp9667 -g15 -aI542 -aI-763 -aI526 -aI-638 -aI542 -aI-698 -aa(lp9668 -g15 -aI509 -aI-861 -aI542 -aI-805 -aI531 -aI-837 -aa(lp9669 -g15 -aI419 -aI-897 -aI487 -aI-885 -aI457 -aI-897 -aa(lp9670 -g15 -aI230 -aI-696 -aI317 -aI-897 -aI254 -aI-830 -aa(lp9671 -g15 -aI136 -aI-782 -aI167 -aI-696 -aI136 -aI-725 -aa(lp9672 -g15 -aI216 -aI-910 -aI136 -aI-831 -aI162 -aI-874 -aa(lp9673 -g15 -aI426 -aI-965 -aI270 -aI-946 -aI340 -aI-965 -aa(lp9674 -g15 -aI612 -aI-914 -aI506 -aI-965 -aI568 -aI-948 -aa(lp9675 -g15 -aI678 -aI-770 -aI656 -aI-880 -aI678 -aI-832 -aa(lp9676 -g15 -aI621 -aI-606 -aI678 -aI-717 -aI659 -aI-662 -aa(lp9677 -g15 -aI401 -aI-375 -aI583 -aI-550 -aI510 -aI-473 -aa(lp9678 -g20 -aI101 -aI-106 -aa(lp9679 -g20 -aI410 -aI-106 -aa(lp9680 -g15 -aI485 -aI-126 -aI439 -aI-106 -aI464 -aI-112 -aa(lp9681 -g15 -aI542 -aI-205 -aI505 -aI-139 -aI525 -aI-165 -aa(lp9682 -g20 -aI552 -aI-227 -aa(lp9683 -g20 -aI608 -aI-227 -aa(lp9684 -g20 -aI554 -aI0 -aa(lp9685 -g10 -aa(lp9686 -g8 -aI745 -aI0 -aa(lp9687 -g10 -aa(lp9688 -g8 -aI745 -aI0 -aasV6 -(lp9689 -(lp9690 -g8 -aI234 -aI-508 -aa(lp9691 -g15 -aI430 -aI-578 -aI300 -aI-555 -aI365 -aI-578 -aa(lp9692 -g15 -aI596 -aI-514 -aI501 -aI-578 -aI556 -aI-557 -aa(lp9693 -g15 -aI656 -aI-344 -aI636 -aI-472 -aI656 -aI-415 -aa(lp9694 -g15 -aI568 -aI-88 -aI656 -aI-241 -aI627 -aI-155 -aa(lp9695 -g15 -aI330 -aI13 -aI510 -aI-20 -aI430 -aI13 -aa(lp9696 -g15 -aI149 -aI-72 -aI255 -aI13 -aI195 -aI-15 -aa(lp9697 -g15 -aI80 -aI-308 -aI103 -aI-129 -aI80 -aI-208 -aa(lp9698 -g15 -aI209 -aI-771 -aI80 -aI-488 -aI123 -aI-642 -aa(lp9699 -g15 -aI535 -aI-965 -aI295 -aI-900 -aI404 -aI-965 -aa(lp9700 -g15 -aI685 -aI-930 -aI599 -aI-965 -aI649 -aI-953 -aa(lp9701 -g15 -aI740 -aI-844 -aI722 -aI-907 -aI740 -aI-878 -aa(lp9702 -g15 -aI623 -aI-744 -aI740 -aI-778 -aI701 -aI-744 -aa(lp9703 -g15 -aI600 -aI-868 -aI623 -aI-805 -aI616 -aI-846 -aa(lp9704 -g15 -aI533 -aI-900 -aI585 -aI-889 -aI563 -aI-900 -aa(lp9705 -g15 -aI234 -aI-508 -aI399 -aI-900 -aI299 -aI-769 -aa(lp9706 -g10 -aa(lp9707 -g8 -aI220 -aI-433 -aa(lp9708 -g15 -aI201 -aI-259 -aI207 -aI-361 -aI201 -aI-304 -aa(lp9709 -g15 -aI338 -aI-59 -aI201 -aI-126 -aI246 -aI-59 -aa(lp9710 -g15 -aI471 -aI-137 -aI392 -aI-59 -aI436 -aI-85 -aa(lp9711 -g15 -aI524 -aI-336 -aI506 -aI-189 -aI524 -aI-256 -aa(lp9712 -g15 -aI404 -aI-509 -aI524 -aI-452 -aI484 -aI-509 -aa(lp9713 -g15 -aI220 -aI-433 -aI344 -aI-509 -aI283 -aI-484 -aa(lp9714 -g10 -aa(lp9715 -g8 -aI745 -aI0 -aa(lp9716 -g10 -aa(lp9717 -g8 -aI745 -aI0 -aasV: -(lp9718 -(lp9719 -g8 -aI245 -aI-536 -aa(lp9720 -g15 -aI162 -aI-618 -aI190 -aI-536 -aI162 -aI-563 -aa(lp9721 -g15 -aI186 -aI-692 -aI162 -aI-648 -aI170 -aI-673 -aa(lp9722 -g15 -aI250 -aI-720 -aI202 -aI-711 -aI223 -aI-720 -aa(lp9723 -g15 -aI333 -aI-639 -aI305 -aI-720 -aI333 -aI-693 -aa(lp9724 -g15 -aI309 -aI-564 -aI333 -aI-607 -aI325 -aI-582 -aa(lp9725 -g15 -aI245 -aI-536 -aI293 -aI-545 -aI272 -aI-536 -aa(lp9726 -g10 -aa(lp9727 -g8 -aI125 -aI10 -aa(lp9728 -g15 -aI42 -aI-70 -aI70 -aI10 -aI42 -aI-16 -aa(lp9729 -g15 -aI66 -aI-144 -aI42 -aI-101 -aI50 -aI-126 -aa(lp9730 -g15 -aI130 -aI-172 -aI82 -aI-163 -aI103 -aI-172 -aa(lp9731 -g15 -aI191 -aI-150 -aI156 -aI-172 -aI177 -aI-165 -aa(lp9732 -g15 -aI213 -aI-91 -aI206 -aI-135 -aI213 -aI-116 -aa(lp9733 -g15 -aI189 -aI-16 -aI213 -aI-59 -aI205 -aI-34 -aa(lp9734 -g15 -aI125 -aI10 -aI173 -aI1 -aI152 -aI10 -aa(lp9735 -g10 -aa(lp9736 -g8 -aI382 -aI0 -aa(lp9737 -g10 -aa(lp9738 -g8 -aI382 -aI0 -aasV> -(lp9739 -(lp9740 -g8 -aI97 -aI-146 -aa(lp9741 -g20 -aI97 -aI-235 -aa(lp9742 -g20 -aI545 -aI-475 -aa(lp9743 -g20 -aI97 -aI-718 -aa(lp9744 -g20 -aI97 -aI-807 -aa(lp9745 -g20 -aI669 -aI-499 -aa(lp9746 -g20 -aI669 -aI-452 -aa(lp9747 -g10 -aa(lp9748 -g8 -aI745 -aI0 -aa(lp9749 -g10 -aa(lp9750 -g8 -aI745 -aI0 -aasVB -(lp9751 -(lp9752 -g8 -aI-17 -aI-55 -aa(lp9753 -g20 -aI0 -aI-55 -aa(lp9754 -g15 -aI130 -aI-151 -aI73 -aI-55 -aI117 -aI-87 -aa(lp9755 -g20 -aI269 -aI-804 -aa(lp9756 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp9757 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp9758 -g20 -aI161 -aI-895 -aa(lp9759 -g20 -aI173 -aI-951 -aa(lp9760 -g20 -aI518 -aI-951 -aa(lp9761 -g15 -aI830 -aI-751 -aI726 -aI-951 -aI830 -aI-884 -aa(lp9762 -g15 -aI613 -aI-503 -aI830 -aI-619 -aI758 -aI-537 -aa(lp9763 -g20 -aI611 -aI-498 -aa(lp9764 -g15 -aI774 -aI-303 -aI720 -aI-476 -aI774 -aI-411 -aa(lp9765 -g15 -aI676 -aI-78 -aI774 -aI-205 -aI741 -aI-130 -aa(lp9766 -g15 -aI390 -aI0 -aI610 -aI-25 -aI515 -aI0 -aa(lp9767 -g20 -aI-27 -aI0 -aa(lp9768 -g10 -aa(lp9769 -g8 -aI345 -aI-531 -aa(lp9770 -g20 -aI447 -aI-531 -aa(lp9771 -g15 -aI685 -aI-733 -aI606 -aI-531 -aI685 -aI-598 -aa(lp9772 -g15 -aI501 -aI-884 -aI685 -aI-834 -aI624 -aI-884 -aa(lp9773 -g20 -aI421 -aI-884 -aa(lp9774 -g10 -aa(lp9775 -g8 -aI246 -aI-65 -aa(lp9776 -g20 -aI376 -aI-65 -aa(lp9777 -g15 -aI630 -aI-312 -aI546 -aI-65 -aI630 -aI-148 -aa(lp9778 -g15 -aI444 -aI-465 -aI630 -aI-414 -aI568 -aI-465 -aa(lp9779 -g20 -aI332 -aI-465 -aa(lp9780 -g10 -aa(lp9781 -g8 -aI871 -aI0 -aa(lp9782 -g10 -aa(lp9783 -g8 -aI871 -aI0 -aasVF -(lp9784 -(lp9785 -g8 -aI-17 -aI-55 -aa(lp9786 -g20 -aI0 -aI-55 -aa(lp9787 -g15 -aI89 -aI-77 -aI41 -aI-55 -aI71 -aI-62 -aa(lp9788 -g15 -aI129 -aI-144 -aI108 -aI-91 -aI121 -aI-113 -aa(lp9789 -g20 -aI269 -aI-804 -aa(lp9790 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp9791 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp9792 -g20 -aI161 -aI-895 -aa(lp9793 -g20 -aI173 -aI-951 -aa(lp9794 -g20 -aI845 -aI-951 -aa(lp9795 -g20 -aI802 -aI-718 -aa(lp9796 -g20 -aI733 -aI-718 -aa(lp9797 -g20 -aI735 -aI-741 -aa(lp9798 -g15 -aI737 -aI-765 -aI736 -aI-749 -aI736 -aI-757 -aa(lp9799 -g15 -aI740 -aI-795 -aI739 -aI-779 -aI740 -aI-790 -aa(lp9800 -g15 -aI639 -aI-884 -aI740 -aI-855 -aI706 -aI-884 -aa(lp9801 -g20 -aI421 -aI-884 -aa(lp9802 -g20 -aI338 -aI-499 -aa(lp9803 -g20 -aI660 -aI-499 -aa(lp9804 -g20 -aI646 -aI-434 -aa(lp9805 -g20 -aI325 -aI-434 -aa(lp9806 -g20 -aI265 -aI-151 -aa(lp9807 -g15 -aI261 -aI-118 -aI262 -aI-136 -aI261 -aI-125 -aa(lp9808 -g15 -aI353 -aI-55 -aI261 -aI-76 -aI291 -aI-55 -aa(lp9809 -g20 -aI397 -aI-55 -aa(lp9810 -g20 -aI386 -aI0 -aa(lp9811 -g20 -aI-27 -aI0 -aa(lp9812 -g10 -aa(lp9813 -g8 -aI786 -aI0 -aa(lp9814 -g10 -aa(lp9815 -g8 -aI786 -aI0 -aasVJ -(lp9816 -(lp9817 -g8 -aI554 -aI-951 -aa(lp9818 -g20 -aI542 -aI-895 -aa(lp9819 -g20 -aI525 -aI-895 -aa(lp9820 -g15 -aI433 -aI-871 -aI482 -aI-895 -aI452 -aI-887 -aa(lp9821 -g15 -aI395 -aI-799 -aI414 -aI-855 -aI402 -aI-831 -aa(lp9822 -g20 -aI222 -aI10 -aa(lp9823 -g15 -aI111 -aI247 -aI199 -aI119 -aI162 -aI198 -aa(lp9824 -g15 -aI-97 -aI320 -aI60 -aI296 -aI-9 -aI320 -aa(lp9825 -g15 -aI-206 -aI305 -aI-137 -aI320 -aI-173 -aI315 -aa(lp9826 -g20 -aI-188 -aI245 -aa(lp9827 -g15 -aI-101 -aI257 -aI-166 -aI253 -aI-137 -aI257 -aa(lp9828 -g15 -aI18 -aI199 -aI-49 -aI257 -aI-9 -aI238 -aa(lp9829 -g15 -aI89 -aI12 -aI47 -aI161 -aI70 -aI98 -aa(lp9830 -g20 -aI262 -aI-804 -aa(lp9831 -g15 -aI268 -aI-841 -aI266 -aI-823 -aI268 -aI-835 -aa(lp9832 -g15 -aI171 -aI-895 -aI268 -aI-877 -aI236 -aI-895 -aa(lp9833 -g20 -aI154 -aI-895 -aa(lp9834 -g20 -aI166 -aI-951 -aa(lp9835 -g10 -aa(lp9836 -g8 -aI475 -aI0 -aa(lp9837 -g10 -aa(lp9838 -g8 -aI475 -aI0 -aasVN -(lp9839 -(lp9840 -g8 -aI863 -aI-804 -aa(lp9841 -g15 -aI869 -aI-841 -aI867 -aI-821 -aI869 -aI-833 -aa(lp9842 -g15 -aI773 -aI-895 -aI869 -aI-877 -aI837 -aI-895 -aa(lp9843 -g20 -aI755 -aI-895 -aa(lp9844 -g20 -aI768 -aI-951 -aa(lp9845 -g20 -aI1102 -aI-951 -aa(lp9846 -g20 -aI1090 -aI-895 -aa(lp9847 -g20 -aI1073 -aI-895 -aa(lp9848 -g15 -aI982 -aI-870 -aI1031 -aI-895 -aI1000 -aI-887 -aa(lp9849 -g15 -aI944 -aI-799 -aI963 -aI-854 -aI950 -aI-830 -aa(lp9850 -g20 -aI774 -aI0 -aa(lp9851 -g20 -aI688 -aI0 -aa(lp9852 -g20 -aI345 -aI-780 -aa(lp9853 -g20 -aI210 -aI-146 -aa(lp9854 -g15 -aI205 -aI-108 -aI207 -aI-127 -aI205 -aI-114 -aa(lp9855 -g15 -aI301 -aI-55 -aI205 -aI-73 -aI237 -aI-55 -aa(lp9856 -g20 -aI318 -aI-55 -aa(lp9857 -g20 -aI306 -aI0 -aa(lp9858 -g20 -aI-26 -aI0 -aa(lp9859 -g20 -aI-14 -aI-55 -aa(lp9860 -g20 -aI2 -aI-55 -aa(lp9861 -g15 -aI92 -aI-79 -aI44 -aI-55 -aI74 -aI-63 -aa(lp9862 -g15 -aI130 -aI-151 -aI110 -aI-96 -aI123 -aI-119 -aa(lp9863 -g20 -aI269 -aI-804 -aa(lp9864 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp9865 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp9866 -g20 -aI161 -aI-895 -aa(lp9867 -g20 -aI173 -aI-951 -aa(lp9868 -g20 -aI416 -aI-951 -aa(lp9869 -g20 -aI738 -aI-215 -aa(lp9870 -g10 -aa(lp9871 -g8 -aI1017 -aI0 -aa(lp9872 -g10 -aa(lp9873 -g8 -aI1017 -aI0 -aasVR -(lp9874 -(lp9875 -g8 -aI300 -aI-419 -aa(lp9876 -g20 -aI241 -aI-146 -aa(lp9877 -g15 -aI235 -aI-108 -aI237 -aI-127 -aI235 -aI-115 -aa(lp9878 -g15 -aI332 -aI-55 -aI235 -aI-73 -aI267 -aI-55 -aa(lp9879 -g20 -aI376 -aI-55 -aa(lp9880 -g20 -aI363 -aI0 -aa(lp9881 -g20 -aI-49 -aI0 -aa(lp9882 -g20 -aI-37 -aI-55 -aa(lp9883 -g20 -aI-20 -aI-55 -aa(lp9884 -g15 -aI71 -aI-78 -aI24 -aI-55 -aI54 -aI-63 -aa(lp9885 -g15 -aI106 -aI-144 -aI89 -aI-94 -aI100 -aI-116 -aa(lp9886 -g20 -aI246 -aI-804 -aa(lp9887 -g15 -aI251 -aI-841 -aI250 -aI-821 -aI251 -aI-833 -aa(lp9888 -g15 -aI156 -aI-895 -aI251 -aI-877 -aI220 -aI-895 -aa(lp9889 -g20 -aI138 -aI-895 -aa(lp9890 -g20 -aI150 -aI-951 -aa(lp9891 -g20 -aI500 -aI-951 -aa(lp9892 -g15 -aI805 -aI-724 -aI703 -aI-951 -aI805 -aI-875 -aa(lp9893 -g15 -aI558 -aI-446 -aI805 -aI-578 -aI723 -aI-485 -aa(lp9894 -g20 -aI654 -aI-161 -aa(lp9895 -g15 -aI702 -aI-74 -aI670 -aI-115 -aI686 -aI-86 -aa(lp9896 -g15 -aI764 -aI-55 -aI718 -aI-61 -aI739 -aI-55 -aa(lp9897 -g20 -aI774 -aI-55 -aa(lp9898 -g20 -aI764 -aI0 -aa(lp9899 -g20 -aI746 -aI0 -aa(lp9900 -g15 -aI584 -aI-29 -aI670 -aI0 -aI616 -aI-9 -aa(lp9901 -g15 -aI509 -aI-155 -aI552 -aI-50 -aI527 -aI-91 -aa(lp9902 -g20 -aI432 -aI-419 -aa(lp9903 -g10 -aa(lp9904 -g8 -aI313 -aI-481 -aa(lp9905 -g20 -aI416 -aI-481 -aa(lp9906 -g15 -aI599 -aI-542 -aI495 -aI-481 -aI556 -aI-502 -aa(lp9907 -g15 -aI664 -aI-716 -aI642 -aI-583 -aI664 -aI-641 -aa(lp9908 -g15 -aI624 -aI-846 -aI664 -aI-776 -aI650 -aI-819 -aa(lp9909 -g15 -aI489 -aI-887 -aI598 -aI-873 -aI553 -aI-887 -aa(lp9910 -g20 -aI398 -aI-887 -aa(lp9911 -g10 -aa(lp9912 -g8 -aI862 -aI0 -aa(lp9913 -g10 -aa(lp9914 -g8 -aI862 -aI0 -aasVV -(lp9915 -(lp9916 -g8 -aI416 -aI-130 -aa(lp9917 -g15 -aI524 -aI-349 -aI449 -aI-207 -aI485 -aI-280 -aa(lp9918 -g20 -aI761 -aI-772 -aa(lp9919 -g15 -aI786 -aI-847 -aI777 -aI-803 -aI786 -aI-828 -aa(lp9920 -g15 -aI712 -aI-895 -aI786 -aI-879 -aI761 -aI-895 -aa(lp9921 -g20 -aI681 -aI-895 -aa(lp9922 -g20 -aI692 -aI-951 -aa(lp9923 -g20 -aI1021 -aI-951 -aa(lp9924 -g20 -aI1009 -aI-895 -aa(lp9925 -g20 -aI983 -aI-895 -aa(lp9926 -g15 -aI916 -aI-872 -aI953 -aI-895 -aI931 -aI-887 -aa(lp9927 -g15 -aI861 -aI-791 -aI901 -aI-857 -aI883 -aI-830 -aa(lp9928 -g20 -aI417 -aI0 -aa(lp9929 -g20 -aI320 -aI0 -aa(lp9930 -g20 -aI206 -aI-825 -aa(lp9931 -g15 -aI184 -aI-880 -aI202 -aI-851 -aI195 -aI-869 -aa(lp9932 -g15 -aI126 -aI-895 -aI173 -aI-890 -aI154 -aI-895 -aa(lp9933 -g20 -aI109 -aI-895 -aa(lp9934 -g20 -aI121 -aI-951 -aa(lp9935 -g20 -aI483 -aI-951 -aa(lp9936 -g20 -aI473 -aI-895 -aa(lp9937 -g20 -aI442 -aI-895 -aa(lp9938 -g15 -aI373 -aI-877 -aI414 -aI-895 -aI390 -aI-889 -aa(lp9939 -g15 -aI346 -aI-827 -aI355 -aI-865 -aI346 -aI-848 -aa(lp9940 -g15 -aI349 -aI-782 -aI346 -aI-812 -aI347 -aI-797 -aa(lp9941 -g20 -aI402 -aI-349 -aa(lp9942 -g15 -aI416 -aI-130 -aI411 -aI-274 -aI416 -aI-201 -aa(lp9943 -g10 -aa(lp9944 -g8 -aI899 -aI0 -aa(lp9945 -g10 -aa(lp9946 -g8 -aI899 -aI0 -aasVZ -(lp9947 -(lp9948 -g8 -aI830 -aI-896 -aa(lp9949 -g20 -aI158 -aI-65 -aa(lp9950 -g20 -aI514 -aI-65 -aa(lp9951 -g15 -aI649 -aI-175 -aI580 -aI-65 -aI625 -aI-102 -aa(lp9952 -g20 -aI667 -aI-232 -aa(lp9953 -g20 -aI737 -aI-232 -aa(lp9954 -g20 -aI681 -aI0 -aa(lp9955 -g20 -aI-22 -aI0 -aa(lp9956 -g20 -aI-11 -aI-52 -aa(lp9957 -g20 -aI658 -aI-884 -aa(lp9958 -g20 -aI348 -aI-884 -aa(lp9959 -g15 -aI214 -aI-775 -aI282 -aI-884 -aI238 -aI-848 -aa(lp9960 -g20 -aI195 -aI-718 -aa(lp9961 -g20 -aI126 -aI-718 -aa(lp9962 -g20 -aI182 -aI-951 -aa(lp9963 -g20 -aI841 -aI-951 -aa(lp9964 -g10 -aa(lp9965 -g8 -aI806 -aI0 -aa(lp9966 -g10 -aa(lp9967 -g8 -aI806 -aI0 -aasV^ -(lp9968 -(lp9969 -g8 -aI359 -aI-951 -aa(lp9970 -g20 -aI406 -aI-951 -aa(lp9971 -g20 -aI686 -aI-354 -aa(lp9972 -g20 -aI597 -aI-354 -aa(lp9973 -g20 -aI382 -aI-828 -aa(lp9974 -g20 -aI167 -aI-354 -aa(lp9975 -g20 -aI78 -aI-354 -aa(lp9976 -g10 -aa(lp9977 -g8 -aI745 -aI0 -aa(lp9978 -g10 -aa(lp9979 -g8 -aI745 -aI0 -aasVb -(lp9980 -(lp9981 -g8 -aI138 -aI-34 -aa(lp9982 -g20 -aI78 -aI4 -aa(lp9983 -g20 -aI35 -aI4 -aa(lp9984 -g20 -aI212 -aI-823 -aa(lp9985 -g15 -aI223 -aI-894 -aI220 -aI-860 -aI223 -aI-883 -aa(lp9986 -g15 -aI130 -aI-956 -aI223 -aI-935 -aI192 -aI-956 -aa(lp9987 -g20 -aI119 -aI-956 -aa(lp9988 -g20 -aI132 -aI-1012 -aa(lp9989 -g20 -aI384 -aI-1012 -aa(lp9990 -g20 -aI320 -aI-713 -aa(lp9991 -g15 -aI272 -aI-536 -aI311 -aI-670 -aI295 -aI-611 -aa(lp9992 -g20 -aI278 -aI-536 -aa(lp9993 -g15 -aI522 -aI-727 -aI344 -aI-663 -aI425 -aI-727 -aa(lp9994 -g15 -aI647 -aI-666 -aI575 -aI-727 -aI617 -aI-707 -aa(lp9995 -g15 -aI692 -aI-486 -aI677 -aI-625 -aI692 -aI-565 -aa(lp9996 -g15 -aI577 -aI-143 -aI692 -aI-362 -aI653 -aI-248 -aa(lp9997 -g15 -aI294 -aI13 -aI501 -aI-38 -aI406 -aI13 -aa(lp9998 -g15 -aI138 -aI-34 -aI231 -aI13 -aI179 -aI-2 -aa(lp9999 -g10 -aa(lp10000 -g8 -aI185 -aI-93 -aa(lp10001 -g15 -aI289 -aI-46 -aI212 -aI-62 -aI246 -aI-46 -aa(lp10002 -g15 -aI480 -aI-194 -aI366 -aI-46 -aI430 -aI-95 -aa(lp10003 -g15 -aI555 -aI-487 -aI530 -aI-292 -aI555 -aI-390 -aa(lp10004 -g15 -aI472 -aI-643 -aI555 -aI-591 -aI527 -aI-643 -aa(lp10005 -g15 -aI329 -aI-542 -aI423 -aI-643 -aI375 -aI-609 -aa(lp10006 -g15 -aI242 -aI-358 -aI283 -aI-474 -aI254 -aI-413 -aa(lp10007 -g10 -aa(lp10008 -g8 -aI749 -aI0 -aa(lp10009 -g10 -aa(lp10010 -g8 -aI749 -aI0 -aasVf -(lp10011 -(lp10012 -g8 -aI468 -aI-638 -aa(lp10013 -g20 -aI318 -aI-638 -aa(lp10014 -g20 -aI179 -aI10 -aa(lp10015 -g15 -aI78 -aI246 -aI156 -aI118 -aI123 -aI196 -aa(lp10016 -g15 -aI-109 -aI320 -aI34 -aI295 -aI-28 -aI320 -aa(lp10017 -g15 -aI-186 -aI309 -aI-134 -aI320 -aI-160 -aI317 -aa(lp10018 -g20 -aI-174 -aI248 -aa(lp10019 -g15 -aI-113 -aI257 -aI-152 -aI254 -aI-131 -aI257 -aa(lp10020 -g15 -aI-11 -aI202 -aI-70 -aI257 -aI-36 -aI239 -aa(lp10021 -g15 -aI54 -aI12 -aI13 -aI165 -aI35 -aI102 -aa(lp10022 -g20 -aI194 -aI-638 -aa(lp10023 -g20 -aI73 -aI-638 -aa(lp10024 -g20 -aI81 -aI-686 -aa(lp10025 -g20 -aI209 -aI-714 -aa(lp10026 -g20 -aI223 -aI-787 -aa(lp10027 -g15 -aI477 -aI-1026 -aI255 -aI-946 -aI339 -aI-1026 -aa(lp10028 -g15 -aI605 -aI-999 -aI534 -aI-1026 -aI576 -aI-1017 -aa(lp10029 -g15 -aI649 -aI-927 -aI634 -aI-981 -aI649 -aI-957 -aa(lp10030 -g15 -aI538 -aI-840 -aI649 -aI-869 -aI612 -aI-840 -aa(lp10031 -g15 -aI470 -aI-965 -aI538 -aI-923 -aI515 -aI-965 -aa(lp10032 -g15 -aI394 -aI-924 -aI438 -aI-965 -aI412 -aI-951 -aa(lp10033 -g15 -aI352 -aI-799 -aI376 -aI-897 -aI362 -aI-856 -aa(lp10034 -g20 -aI334 -aI-714 -aa(lp10035 -g20 -aI482 -aI-714 -aa(lp10036 -g10 -aa(lp10037 -g8 -aI423 -aI0 -aa(lp10038 -g10 -aa(lp10039 -g8 -aI423 -aI0 -aasVj -(lp10040 -(lp10041 -g8 -aI300 -aI-847 -aa(lp10042 -g15 -aI225 -aI-920 -aI250 -aI-847 -aI225 -aI-872 -aa(lp10043 -g15 -aI247 -aI-988 -aI225 -aI-948 -aI232 -aI-971 -aa(lp10044 -g15 -aI305 -aI-1014 -aI261 -aI-1005 -aI281 -aI-1014 -aa(lp10045 -g15 -aI380 -aI-940 -aI355 -aI-1014 -aI380 -aI-989 -aa(lp10046 -g15 -aI357 -aI-871 -aI380 -aI-910 -aI372 -aI-887 -aa(lp10047 -g15 -aI300 -aI-847 -aI342 -aI-855 -aI323 -aI-847 -aa(lp10048 -g10 -aa(lp10049 -g8 -aI-186 -aI309 -aa(lp10050 -g20 -aI-174 -aI248 -aa(lp10051 -g15 -aI-113 -aI257 -aI-152 -aI254 -aI-131 -aI257 -aa(lp10052 -g15 -aI-8 -aI198 -aI-68 -aI257 -aI-33 -aI237 -aa(lp10053 -g15 -aI55 -aI10 -aI17 -aI158 -aI38 -aI95 -aa(lp10054 -g20 -aI178 -aI-567 -aa(lp10055 -g15 -aI182 -aI-602 -aI181 -aI-581 -aI182 -aI-593 -aa(lp10056 -g15 -aI101 -aI-658 -aI182 -aI-639 -aI155 -aI-658 -aa(lp10057 -g20 -aI83 -aI-658 -aa(lp10058 -g20 -aI95 -aI-714 -aa(lp10059 -g20 -aI334 -aI-714 -aa(lp10060 -g20 -aI181 -aI10 -aa(lp10061 -g15 -aI80 -aI245 -aI159 -aI116 -aI125 -aI194 -aa(lp10062 -g15 -aI-109 -aI320 -aI35 -aI295 -aI-27 -aI320 -aa(lp10063 -g15 -aI-186 -aI309 -aI-134 -aI320 -aI-160 -aI317 -aa(lp10064 -g10 -aa(lp10065 -g8 -aI388 -aI0 -aa(lp10066 -g10 -aa(lp10067 -g8 -aI388 -aI0 -aasVn -(lp10068 -(lp10069 -g8 -aI182 -aI0 -aa(lp10070 -g20 -aI58 -aI0 -aa(lp10071 -g20 -aI170 -aI-535 -aa(lp10072 -g15 -aI178 -aI-595 -aI175 -aI-560 -aI178 -aI-580 -aa(lp10073 -g15 -aI85 -aI-658 -aI178 -aI-637 -aI147 -aI-658 -aa(lp10074 -g20 -aI74 -aI-658 -aa(lp10075 -g20 -aI86 -aI-714 -aa(lp10076 -g20 -aI333 -aI-714 -aa(lp10077 -g20 -aI297 -aI-546 -aa(lp10078 -g20 -aI310 -aI-546 -aa(lp10079 -g15 -aI553 -aI-726 -aI382 -aI-666 -aI463 -aI-726 -aa(lp10080 -g15 -aI695 -aI-578 -aI648 -aI-726 -aI695 -aI-676 -aa(lp10081 -g15 -aI671 -aI-431 -aI695 -aI-550 -aI687 -aI-501 -aa(lp10082 -g20 -aI637 -aI-274 -aa(lp10083 -g15 -aI619 -aI-134 -aI625 -aI-220 -aI619 -aI-174 -aa(lp10084 -g15 -aI666 -aI-70 -aI619 -aI-91 -aI635 -aI-70 -aa(lp10085 -g15 -aI751 -aI-101 -aI692 -aI-70 -aI720 -aI-80 -aa(lp10086 -g20 -aI776 -aI-62 -aa(lp10087 -g15 -aI613 -aI13 -aI717 -aI-11 -aI663 -aI13 -aa(lp10088 -g15 -aI525 -aI-22 -aI576 -aI13 -aI546 -aI1 -aa(lp10089 -g15 -aI492 -aI-119 -aI503 -aI-46 -aI492 -aI-78 -aa(lp10090 -g15 -aI517 -aI-299 -aI492 -aI-160 -aI500 -aI-220 -aa(lp10091 -g20 -aI548 -aI-437 -aa(lp10092 -g15 -aI567 -aI-562 -aI561 -aI-491 -aI567 -aI-532 -aa(lp10093 -g15 -aI506 -aI-640 -aI567 -aI-614 -aI547 -aI-640 -aa(lp10094 -g15 -aI354 -aI-540 -aI457 -aI-640 -aI406 -aI-607 -aa(lp10095 -g15 -aI254 -aI-340 -aI302 -aI-473 -aI269 -aI-407 -aa(lp10096 -g10 -aa(lp10097 -g8 -aI798 -aI0 -aa(lp10098 -g10 -aa(lp10099 -g8 -aI798 -aI0 -aasVr -(lp10100 -(lp10101 -g8 -aI520 -aI-534 -aa(lp10102 -g15 -aI466 -aI-639 -aI520 -aI-604 -aI502 -aI-639 -aa(lp10103 -g15 -aI335 -aI-517 -aI425 -aI-639 -aI381 -aI-598 -aa(lp10104 -g15 -aI233 -aI-242 -aI289 -aI-436 -aI255 -aI-344 -aa(lp10105 -g20 -aI182 -aI0 -aa(lp10106 -g20 -aI58 -aI0 -aa(lp10107 -g20 -aI170 -aI-535 -aa(lp10108 -g15 -aI178 -aI-595 -aI175 -aI-560 -aI178 -aI-580 -aa(lp10109 -g15 -aI72 -aI-658 -aI178 -aI-637 -aI143 -aI-658 -aa(lp10110 -g20 -aI61 -aI-658 -aa(lp10111 -g20 -aI73 -aI-714 -aa(lp10112 -g20 -aI309 -aI-714 -aa(lp10113 -g20 -aI281 -aI-522 -aa(lp10114 -g20 -aI294 -aI-522 -aa(lp10115 -g15 -aI400 -aI-684 -aI330 -aI-601 -aI365 -aI-655 -aa(lp10116 -g15 -aI521 -aI-727 -aI435 -aI-713 -aI475 -aI-727 -aa(lp10117 -g15 -aI630 -aI-635 -aI594 -aI-727 -aI630 -aI-696 -aa(lp10118 -g15 -aI520 -aI-534 -aI630 -aI-567 -aI593 -aI-534 -aa(lp10119 -g10 -aa(lp10120 -g8 -aI623 -aI0 -aa(lp10121 -g10 -aa(lp10122 -g8 -aI623 -aI0 -aasVv -(lp10123 -(lp10124 -g8 -aI128 -aI-587 -aa(lp10125 -g15 -aI35 -aI-658 -aI120 -aI-634 -aI90 -aI-658 -aa(lp10126 -g20 -aI22 -aI-658 -aa(lp10127 -g20 -aI33 -aI-714 -aa(lp10128 -g20 -aI233 -aI-714 -aa(lp10129 -g20 -aI294 -aI-319 -aa(lp10130 -g15 -aI325 -aI-83 -aI310 -aI-219 -aI320 -aI-140 -aa(lp10131 -g20 -aI329 -aI-83 -aa(lp10132 -g15 -aI501 -aI-307 -aI395 -aI-147 -aI453 -aI-221 -aa(lp10133 -g15 -aI574 -aI-512 -aI550 -aI-392 -aI574 -aI-460 -aa(lp10134 -g15 -aI552 -aI-586 -aI574 -aI-543 -aI567 -aI-568 -aa(lp10135 -g15 -aI492 -aI-614 -aI536 -aI-605 -aI516 -aI-614 -aa(lp10136 -g15 -aI518 -aI-691 -aI492 -aI-646 -aI500 -aI-672 -aa(lp10137 -g15 -aI582 -aI-720 -aI535 -aI-711 -aI557 -aI-720 -aa(lp10138 -g15 -aI673 -aI-597 -aI643 -aI-720 -aI673 -aI-679 -aa(lp10139 -g15 -aI581 -aI-313 -aI673 -aI-516 -aI642 -aI-421 -aa(lp10140 -g15 -aI341 -aI0 -aI519 -aI-205 -aI439 -aI-101 -aa(lp10141 -g20 -aI221 -aI12 -aa(lp10142 -g10 -aa(lp10143 -g8 -aI717 -aI0 -aa(lp10144 -g10 -aa(lp10145 -g8 -aI717 -aI0 -aasVz -(lp10146 -(lp10147 -g8 -aI401 -aI-75 -aa(lp10148 -g15 -aI459 -aI-95 -aI422 -aI-75 -aI441 -aI-82 -aa(lp10149 -g15 -aI514 -aI-185 -aI476 -aI-109 -aI495 -aI-139 -aa(lp10150 -g20 -aI527 -aI-215 -aa(lp10151 -g20 -aI583 -aI-215 -aa(lp10152 -g20 -aI531 -aI0 -aa(lp10153 -g20 -aI-1 -aI0 -aa(lp10154 -g20 -aI9 -aI-52 -aa(lp10155 -g20 -aI462 -aI-638 -aa(lp10156 -g20 -aI293 -aI-638 -aa(lp10157 -g15 -aI222 -aI-616 -aI262 -aI-638 -aI239 -aI-630 -aa(lp10158 -g15 -aI167 -aI-530 -aI205 -aI-601 -aI187 -aI-572 -aa(lp10159 -g20 -aI165 -aI-524 -aa(lp10160 -g20 -aI109 -aI-524 -aa(lp10161 -g20 -aI162 -aI-714 -aa(lp10162 -g20 -aI629 -aI-714 -aa(lp10163 -g20 -aI618 -aI-659 -aa(lp10164 -g20 -aI164 -aI-75 -aa(lp10165 -g10 -aa(lp10166 -g8 -aI681 -aI0 -aa(lp10167 -g10 -aa(lp10168 -g8 -aI681 -aI0 -aasV~ -(lp10169 -(lp10170 -g8 -aI162 -aI-358 -aa(lp10171 -g20 -aI83 -aI-358 -aa(lp10172 -g15 -aI251 -aI-591 -aI96 -aI-513 -aI152 -aI-591 -aa(lp10173 -g15 -aI413 -aI-503 -aI292 -aI-591 -aI346 -aI-562 -aa(lp10174 -g15 -aI522 -aI-437 -aI459 -aI-459 -aI496 -aI-437 -aa(lp10175 -g15 -aI577 -aI-477 -aI547 -aI-437 -aI565 -aI-450 -aa(lp10176 -g15 -aI604 -aI-591 -aI589 -aI-504 -aI598 -aI-542 -aa(lp10177 -g20 -aI684 -aI-591 -aa(lp10178 -g15 -aI516 -aI-358 -aI667 -aI-435 -aI611 -aI-358 -aa(lp10179 -g15 -aI361 -aI-442 -aI474 -aI-358 -aI422 -aI-386 -aa(lp10180 -g15 -aI246 -aI-512 -aI310 -aI-489 -aI271 -aI-512 -aa(lp10181 -g15 -aI188 -aI-474 -aI220 -aI-512 -aI201 -aI-499 -aa(lp10182 -g15 -aI162 -aI-358 -aI176 -aI-449 -aI167 -aI-410 -aa(lp10183 -g10 -aa(lp10184 -g8 -aI748 -aI0 -aa(lp10185 -g10 -aa(lp10186 -g8 -aI748 -aI0 -aasV! -(lp10187 -(lp10188 -g8 -aI266 -aI-951 -aa(lp10189 -g20 -aI421 -aI-951 -aa(lp10190 -g20 -aI229 -aI-267 -aa(lp10191 -g20 -aI167 -aI-267 -aa(lp10192 -g10 -aa(lp10193 -g8 -aI162 -aI10 -aa(lp10194 -g15 -aI80 -aI-70 -aI107 -aI10 -aI80 -aI-16 -aa(lp10195 -g15 -aI103 -aI-144 -aI80 -aI-101 -aI87 -aI-126 -aa(lp10196 -g15 -aI167 -aI-172 -aI119 -aI-163 -aI141 -aI-172 -aa(lp10197 -g15 -aI250 -aI-91 -aI223 -aI-172 -aI250 -aI-145 -aa(lp10198 -g15 -aI226 -aI-16 -aI250 -aI-59 -aI242 -aI-34 -aa(lp10199 -g15 -aI162 -aI10 -aI211 -aI1 -aI189 -aI10 -aa(lp10200 -g10 -aa(lp10201 -g8 -aI444 -aI0 -aa(lp10202 -g10 -aa(lp10203 -g8 -aI444 -aI0 -aasV% -(lp10204 -(lp10205 -g8 -aI367 -aI-963 -aa(lp10206 -g15 -aI545 -aI-751 -aI486 -aI-963 -aI545 -aI-892 -aa(lp10207 -g15 -aI467 -aI-495 -aI545 -aI-661 -aI519 -aI-576 -aa(lp10208 -g15 -aI259 -aI-373 -aI414 -aI-414 -aI345 -aI-373 -aa(lp10209 -g15 -aI133 -aI-428 -aI205 -aI-373 -aI163 -aI-392 -aa(lp10210 -g15 -aI87 -aI-586 -aI102 -aI-464 -aI87 -aI-517 -aa(lp10211 -g15 -aI164 -aI-845 -aI87 -aI-679 -aI113 -aI-766 -aa(lp10212 -g15 -aI367 -aI-963 -aI215 -aI-924 -aI283 -aI-963 -aa(lp10213 -g10 -aa(lp10214 -g8 -aI193 -aI-565 -aa(lp10215 -g15 -aI265 -aI-428 -aI193 -aI-474 -aI217 -aI-428 -aa(lp10216 -g15 -aI386 -aI-544 -aI313 -aI-428 -aI354 -aI-467 -aa(lp10217 -g15 -aI434 -aI-772 -aI418 -aI-621 -aI434 -aI-697 -aa(lp10218 -g15 -aI362 -aI-910 -aI434 -aI-864 -aI410 -aI-910 -aa(lp10219 -g15 -aI241 -aI-795 -aI314 -aI-910 -aI274 -aI-871 -aa(lp10220 -g15 -aI193 -aI-565 -aI209 -aI-718 -aI193 -aI-641 -aa(lp10221 -g10 -aa(lp10222 -g8 -aI321 -aI0 -aa(lp10223 -g20 -aI222 -aI0 -aa(lp10224 -g20 -aI891 -aI-951 -aa(lp10225 -g20 -aI985 -aI-951 -aa(lp10226 -g10 -aa(lp10227 -g8 -aI957 -aI-578 -aa(lp10228 -g15 -aI1134 -aI-366 -aI1075 -aI-578 -aI1134 -aI-507 -aa(lp10229 -g15 -aI1056 -aI-110 -aI1134 -aI-276 -aI1108 -aI-190 -aa(lp10230 -g15 -aI849 -aI10 -aI1004 -aI-29 -aI935 -aI10 -aa(lp10231 -g15 -aI677 -aI-200 -aI734 -aI10 -aI677 -aI-59 -aa(lp10232 -g15 -aI753 -aI-459 -aI677 -aI-294 -aI702 -aI-380 -aa(lp10233 -g15 -aI957 -aI-578 -aI805 -aI-538 -aI872 -aI-578 -aa(lp10234 -g10 -aa(lp10235 -g8 -aI782 -aI-181 -aa(lp10236 -g15 -aI854 -aI-43 -aI782 -aI-89 -aI806 -aI-43 -aa(lp10237 -g15 -aI975 -aI-158 -aI902 -aI-43 -aI943 -aI-82 -aa(lp10238 -g15 -aI1024 -aI-387 -aI1007 -aI-235 -aI1024 -aI-311 -aa(lp10239 -g15 -aI951 -aI-524 -aI1024 -aI-479 -aI1000 -aI-524 -aa(lp10240 -g15 -aI831 -aI-410 -aI903 -aI-524 -aI863 -aI-486 -aa(lp10241 -g15 -aI782 -aI-181 -aI798 -aI-333 -aI782 -aI-257 -aa(lp10242 -g10 -aa(lp10243 -g8 -aI1194 -aI0 -aa(lp10244 -g10 -aa(lp10245 -g8 -aI1194 -aI0 -aasV) -(lp10246 -(lp10247 -g8 -aI173 -aI-940 -aa(lp10248 -g20 -aI186 -aI-1002 -aa(lp10249 -g15 -aI422 -aI-583 -aI343 -aI-933 -aI422 -aI-794 -aa(lp10250 -g15 -aI292 -aI-96 -aI422 -aI-403 -aI379 -aI-240 -aa(lp10251 -g15 -aI-65 -aI182 -aI205 -aI48 -aI86 -aI141 -aa(lp10252 -g20 -aI-52 -aI121 -aa(lp10253 -g15 -aI215 -aI-216 -aI71 -aI55 -aI160 -aI-57 -aa(lp10254 -g15 -aI297 -aI-646 -aI270 -aI-375 -aI297 -aI-518 -aa(lp10255 -g15 -aI173 -aI-940 -aI297 -aI-784 -aI256 -aI-883 -aa(lp10256 -g10 -aa(lp10257 -g8 -aI461 -aI0 -aa(lp10258 -g10 -aa(lp10259 -g8 -aI461 -aI0 -aasV- -(lp10260 -(lp10261 -g8 -aI18 -aI-312 -aa(lp10262 -g20 -aI39 -aI-412 -aa(lp10263 -g20 -aI386 -aI-412 -aa(lp10264 -g20 -aI365 -aI-312 -aa(lp10265 -g10 -aa(lp10266 -g8 -aI413 -aI0 -aa(lp10267 -g10 -aa(lp10268 -g8 -aI413 -aI0 -aasV1 -(lp10269 -(lp10270 -g8 -aI567 -aI-956 -aa(lp10271 -g20 -aI395 -aI-146 -aa(lp10272 -g15 -aI390 -aI-108 -aI392 -aI-129 -aI390 -aI-117 -aa(lp10273 -g15 -aI486 -aI-55 -aI390 -aI-73 -aI422 -aI-55 -aa(lp10274 -g20 -aI558 -aI-55 -aa(lp10275 -g20 -aI546 -aI0 -aa(lp10276 -g20 -aI50 -aI0 -aa(lp10277 -g20 -aI61 -aI-55 -aa(lp10278 -g20 -aI132 -aI-55 -aa(lp10279 -g15 -aI223 -aI-79 -aI174 -aI-55 -aI204 -aI-63 -aa(lp10280 -g15 -aI262 -aI-151 -aI243 -aI-95 -aI255 -aI-119 -aa(lp10281 -g20 -aI366 -aI-642 -aa(lp10282 -g15 -aI416 -aI-851 -aI381 -aI-713 -aI398 -aI-783 -aa(lp10283 -g20 -aI410 -aI-851 -aa(lp10284 -g15 -aI285 -aI-741 -aI354 -aI-796 -aI313 -aI-759 -aa(lp10285 -g15 -aI209 -aI-713 -aI258 -aI-722 -aI233 -aI-713 -aa(lp10286 -g15 -aI156 -aI-784 -aI174 -aI-713 -aI156 -aI-736 -aa(lp10287 -g15 -aI374 -aI-887 -aI217 -aI-799 -aI289 -aI-833 -aa(lp10288 -g20 -aI482 -aI-956 -aa(lp10289 -g10 -aa(lp10290 -g8 -aI745 -aI0 -aa(lp10291 -g10 -aa(lp10292 -g8 -aI745 -aI0 -aasV5 -(lp10293 -(lp10294 -g8 -aI167 -aI-466 -aa(lp10295 -g20 -aI122 -aI-475 -aa(lp10296 -g20 -aI265 -aI-951 -aa(lp10297 -g20 -aI710 -aI-951 -aa(lp10298 -g20 -aI674 -aI-750 -aa(lp10299 -g20 -aI618 -aI-750 -aa(lp10300 -g15 -aI622 -aI-812 -aI621 -aI-784 -aI622 -aI-804 -aa(lp10301 -g15 -aI561 -aI-844 -aI622 -aI-833 -aI601 -aI-844 -aa(lp10302 -g20 -aI302 -aI-844 -aa(lp10303 -g20 -aI214 -aI-547 -aa(lp10304 -g15 -aI342 -aI-568 -aI257 -aI-561 -aI300 -aI-568 -aa(lp10305 -g15 -aI548 -aI-503 -aI430 -aI-568 -aI498 -aI-546 -aa(lp10306 -g15 -aI622 -aI-323 -aI597 -aI-460 -aI622 -aI-400 -aa(lp10307 -g15 -aI518 -aI-80 -aI622 -aI-224 -aI587 -aI-143 -aa(lp10308 -g15 -aI244 -aI13 -aI449 -aI-17 -aI357 -aI13 -aa(lp10309 -g15 -aI10 -aI-119 -aI88 -aI13 -aI10 -aI-30 -aa(lp10310 -g15 -aI110 -aI-202 -aI10 -aI-174 -aI43 -aI-202 -aa(lp10311 -g15 -aI255 -aI-59 -aI113 -aI-106 -aI162 -aI-59 -aa(lp10312 -g15 -aI423 -aI-126 -aI327 -aI-59 -aI383 -aI-81 -aa(lp10313 -g15 -aI483 -aI-314 -aI463 -aI-171 -aI483 -aI-233 -aa(lp10314 -g15 -aI437 -aI-447 -aI483 -aI-371 -aI468 -aI-415 -aa(lp10315 -g15 -aI313 -aI-495 -aI406 -aI-479 -aI364 -aI-495 -aa(lp10316 -g15 -aI167 -aI-466 -aI265 -aI-495 -aI217 -aI-485 -aa(lp10317 -g10 -aa(lp10318 -g8 -aI745 -aI0 -aa(lp10319 -g10 -aa(lp10320 -g8 -aI745 -aI0 -aasV9 -(lp10321 -(lp10322 -g8 -aI526 -aI-456 -aa(lp10323 -g15 -aI322 -aI-366 -aI468 -aI-396 -aI400 -aI-366 -aa(lp10324 -g15 -aI158 -aI-426 -aI253 -aI-366 -aI199 -aI-386 -aa(lp10325 -g15 -aI97 -aI-587 -aI117 -aI-466 -aI97 -aI-520 -aa(lp10326 -g15 -aI200 -aI-857 -aI97 -aI-695 -aI131 -aI-786 -aa(lp10327 -g15 -aI449 -aI-965 -aI268 -aI-929 -aI351 -aI-965 -aa(lp10328 -g15 -aI627 -aI-896 -aI524 -aI-965 -aI583 -aI-942 -aa(lp10329 -g15 -aI693 -aI-702 -aI671 -aI-850 -aI693 -aI-785 -aa(lp10330 -g15 -aI570 -aI-216 -aI693 -aI-531 -aI652 -aI-369 -aa(lp10331 -g15 -aI233 -aI13 -aI489 -aI-63 -aI376 -aI13 -aa(lp10332 -g15 -aI46 -aI-106 -aI108 -aI13 -aI46 -aI-26 -aa(lp10333 -g15 -aI67 -aI-161 -aI46 -aI-128 -aI53 -aI-146 -aa(lp10334 -g15 -aI125 -aI-183 -aI81 -aI-176 -aI100 -aI-183 -aa(lp10335 -g15 -aI159 -aI-87 -aI127 -aI-143 -aI138 -aI-111 -aa(lp10336 -g15 -aI244 -aI-51 -aI180 -aI-63 -aI208 -aI-51 -aa(lp10337 -g15 -aI402 -aI-146 -aI305 -aI-51 -aI358 -aI-83 -aa(lp10338 -g15 -aI526 -aI-456 -aI446 -aI-209 -aI488 -aI-312 -aa(lp10339 -g10 -aa(lp10340 -g8 -aI548 -aI-552 -aa(lp10341 -g15 -aI569 -aI-710 -aI562 -aI-610 -aI569 -aI-663 -aa(lp10342 -g15 -aI445 -aI-891 -aI569 -aI-831 -aI527 -aI-891 -aa(lp10343 -g15 -aI293 -aI-797 -aI386 -aI-891 -aI336 -aI-860 -aa(lp10344 -g15 -aI230 -aI-583 -aI251 -aI-735 -aI230 -aI-663 -aa(lp10345 -g15 -aI264 -aI-476 -aI230 -aI-536 -aI241 -aI-500 -aa(lp10346 -g15 -aI356 -aI-439 -aI287 -aI-451 -aI317 -aI-439 -aa(lp10347 -g15 -aI548 -aI-552 -aI427 -aI-439 -aI491 -aI-477 -aa(lp10348 -g10 -aa(lp10349 -g8 -aI745 -aI0 -aa(lp10350 -g10 -aa(lp10351 -g8 -aI745 -aI0 -aasV= -(lp10352 -(lp10353 -g8 -aI669 -aI-646 -aa(lp10354 -g20 -aI669 -aI-567 -aa(lp10355 -g20 -aI97 -aI-567 -aa(lp10356 -g20 -aI97 -aI-646 -aa(lp10357 -g10 -aa(lp10358 -g8 -aI669 -aI-383 -aa(lp10359 -g20 -aI669 -aI-304 -aa(lp10360 -g20 -aI97 -aI-304 -aa(lp10361 -g20 -aI97 -aI-383 -aa(lp10362 -g10 -aa(lp10363 -g8 -aI745 -aI0 -aa(lp10364 -g10 -aa(lp10365 -g8 -aI745 -aI0 -aasVA -(lp10366 -(lp10367 -g8 -aI265 -aI-317 -aa(lp10368 -g20 -aI185 -aI-177 -aa(lp10369 -g15 -aI160 -aI-103 -aI168 -aI-148 -aI160 -aI-123 -aa(lp10370 -g15 -aI234 -aI-55 -aI160 -aI-71 -aI184 -aI-55 -aa(lp10371 -g20 -aI265 -aI-55 -aa(lp10372 -g20 -aI254 -aI0 -aa(lp10373 -g20 -aI-74 -aI0 -aa(lp10374 -g20 -aI-63 -aI-55 -aa(lp10375 -g20 -aI-38 -aI-55 -aa(lp10376 -g15 -aI21 -aI-74 -aI-14 -aI-55 -aI5 -aI-61 -aa(lp10377 -g15 -aI85 -aI-159 -aI37 -aI-86 -aI58 -aI-114 -aa(lp10378 -g20 -aI549 -aI-951 -aa(lp10379 -g20 -aI653 -aI-951 -aa(lp10380 -g20 -aI779 -aI-126 -aa(lp10381 -g15 -aI802 -aI-70 -aI784 -aI-98 -aI791 -aI-79 -aa(lp10382 -g15 -aI858 -aI-55 -aI813 -aI-60 -aI832 -aI-55 -aa(lp10383 -g20 -aI876 -aI-55 -aa(lp10384 -g20 -aI865 -aI0 -aa(lp10385 -g20 -aI502 -aI0 -aa(lp10386 -g20 -aI513 -aI-55 -aa(lp10387 -g20 -aI544 -aI-55 -aa(lp10388 -g15 -aI639 -aI-123 -aI608 -aI-55 -aI639 -aI-78 -aa(lp10389 -g15 -aI637 -aI-168 -aI639 -aI-141 -aI639 -aI-156 -aa(lp10390 -g20 -aI615 -aI-317 -aa(lp10391 -g10 -aa(lp10392 -g8 -aI573 -aI-618 -aa(lp10393 -g15 -aI552 -aI-828 -aI560 -aI-712 -aI552 -aI-782 -aa(lp10394 -g15 -aI447 -aI-630 -aI531 -aI-780 -aI496 -aI-714 -aa(lp10395 -g20 -aI305 -aI-384 -aa(lp10396 -g20 -aI606 -aI-384 -aa(lp10397 -g10 -aa(lp10398 -g8 -aI940 -aI0 -aa(lp10399 -g10 -aa(lp10400 -g8 -aI940 -aI0 -aasVE -(lp10401 -(lp10402 -g8 -aI246 -aI-65 -aa(lp10403 -g20 -aI503 -aI-65 -aa(lp10404 -g15 -aI654 -aI-175 -aI578 -aI-65 -aI629 -aI-102 -aa(lp10405 -g20 -aI675 -aI-232 -aa(lp10406 -g20 -aI745 -aI-232 -aa(lp10407 -g20 -aI686 -aI0 -aa(lp10408 -g20 -aI-27 -aI0 -aa(lp10409 -g20 -aI-17 -aI-55 -aa(lp10410 -g20 -aI0 -aI-55 -aa(lp10411 -g15 -aI94 -aI-79 -aI45 -aI-55 -aI76 -aI-63 -aa(lp10412 -g15 -aI129 -aI-144 -aI111 -aI-95 -aI123 -aI-116 -aa(lp10413 -g20 -aI268 -aI-799 -aa(lp10414 -g15 -aI272 -aI-831 -aI270 -aI-811 -aI272 -aI-822 -aa(lp10415 -g15 -aI253 -aI-879 -aI272 -aI-852 -aI266 -aI-868 -aa(lp10416 -g15 -aI178 -aI-895 -aI241 -aI-889 -aI216 -aI-895 -aa(lp10417 -g20 -aI161 -aI-895 -aa(lp10418 -g20 -aI173 -aI-951 -aa(lp10419 -g20 -aI845 -aI-951 -aa(lp10420 -g20 -aI802 -aI-718 -aa(lp10421 -g20 -aI733 -aI-718 -aa(lp10422 -g20 -aI736 -aI-759 -aa(lp10423 -g15 -aI740 -aI-795 -aI739 -aI-780 -aI740 -aI-792 -aa(lp10424 -g15 -aI645 -aI-884 -aI740 -aI-855 -aI708 -aI-884 -aa(lp10425 -g20 -aI421 -aI-884 -aa(lp10426 -g20 -aI345 -aI-530 -aa(lp10427 -g20 -aI666 -aI-530 -aa(lp10428 -g20 -aI653 -aI-465 -aa(lp10429 -g20 -aI332 -aI-465 -aa(lp10430 -g10 -aa(lp10431 -g8 -aI830 -aI0 -aa(lp10432 -g10 -aa(lp10433 -g8 -aI830 -aI0 -aasVI -(lp10434 -(lp10435 -g8 -aI561 -aI-951 -aa(lp10436 -g20 -aI549 -aI-895 -aa(lp10437 -g20 -aI531 -aI-895 -aa(lp10438 -g15 -aI440 -aI-871 -aI489 -aI-895 -aI458 -aI-887 -aa(lp10439 -g15 -aI402 -aI-799 -aI421 -aI-855 -aI408 -aI-831 -aa(lp10440 -g20 -aI264 -aI-146 -aa(lp10441 -g15 -aI258 -aI-108 -aI260 -aI-127 -aI258 -aI-114 -aa(lp10442 -g15 -aI354 -aI-55 -aI258 -aI-73 -aI290 -aI-55 -aa(lp10443 -g20 -aI371 -aI-55 -aa(lp10444 -g20 -aI360 -aI0 -aa(lp10445 -g20 -aI-27 -aI0 -aa(lp10446 -g20 -aI-17 -aI-55 -aa(lp10447 -g20 -aI0 -aI-55 -aa(lp10448 -g15 -aI130 -aI-151 -aI73 -aI-55 -aI117 -aI-87 -aa(lp10449 -g20 -aI269 -aI-804 -aa(lp10450 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp10451 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp10452 -g20 -aI161 -aI-895 -aa(lp10453 -g20 -aI173 -aI-951 -aa(lp10454 -g10 -aa(lp10455 -g8 -aI489 -aI0 -aa(lp10456 -g10 -aa(lp10457 -g8 -aI489 -aI0 -aasVM -(lp10458 -(lp10459 -g8 -aI766 -aI0 -aa(lp10460 -g20 -aI778 -aI-55 -aa(lp10461 -g20 -aI782 -aI-55 -aa(lp10462 -g15 -aI861 -aI-76 -aI820 -aI-55 -aI846 -aI-62 -aa(lp10463 -g15 -aI895 -aI-139 -aI877 -aI-90 -aI888 -aI-111 -aa(lp10464 -g20 -aI1048 -aI-851 -aa(lp10465 -g20 -aI561 -aI0 -aa(lp10466 -g20 -aI489 -aI0 -aa(lp10467 -g20 -aI360 -aI-851 -aa(lp10468 -g20 -aI210 -aI-146 -aa(lp10469 -g15 -aI205 -aI-108 -aI207 -aI-127 -aI205 -aI-114 -aa(lp10470 -g15 -aI301 -aI-55 -aI205 -aI-73 -aI237 -aI-55 -aa(lp10471 -g20 -aI318 -aI-55 -aa(lp10472 -g20 -aI306 -aI0 -aa(lp10473 -g20 -aI-26 -aI0 -aa(lp10474 -g20 -aI-14 -aI-55 -aa(lp10475 -g20 -aI2 -aI-55 -aa(lp10476 -g15 -aI94 -aI-78 -aI46 -aI-55 -aI77 -aI-63 -aa(lp10477 -g15 -aI129 -aI-144 -aI111 -aI-94 -aI123 -aI-116 -aa(lp10478 -g20 -aI269 -aI-804 -aa(lp10479 -g15 -aI274 -aI-841 -aI273 -aI-821 -aI274 -aI-833 -aa(lp10480 -g15 -aI178 -aI-895 -aI274 -aI-877 -aI242 -aI-895 -aa(lp10481 -g20 -aI161 -aI-895 -aa(lp10482 -g20 -aI173 -aI-951 -aa(lp10483 -g20 -aI475 -aI-951 -aa(lp10484 -g20 -aI589 -aI-191 -aa(lp10485 -g20 -aI1025 -aI-951 -aa(lp10486 -g20 -aI1322 -aI-951 -aa(lp10487 -g20 -aI1310 -aI-895 -aa(lp10488 -g20 -aI1293 -aI-895 -aa(lp10489 -g15 -aI1201 -aI-870 -aI1251 -aI-895 -aI1220 -aI-887 -aa(lp10490 -g15 -aI1164 -aI-799 -aI1183 -aI-854 -aI1170 -aI-830 -aa(lp10491 -g20 -aI1025 -aI-146 -aa(lp10492 -g15 -aI1020 -aI-108 -aI1021 -aI-129 -aI1020 -aI-117 -aa(lp10493 -g15 -aI1115 -aI-55 -aI1020 -aI-73 -aI1052 -aI-55 -aa(lp10494 -g20 -aI1133 -aI-55 -aa(lp10495 -g20 -aI1121 -aI0 -aa(lp10496 -g10 -aa(lp10497 -g8 -aI1250 -aI0 -aa(lp10498 -g10 -aa(lp10499 -g8 -aI1250 -aI0 -aasVQ -(lp10500 -(lp10501 -g8 -aI489 -aI9 -aa(lp10502 -g15 -aI529 -aI182 -aI493 -aI88 -aI506 -aI146 -aa(lp10503 -g15 -aI633 -aI236 -aI552 -aI218 -aI587 -aI236 -aa(lp10504 -g15 -aI723 -aI224 -aI665 -aI236 -aI695 -aI232 -aa(lp10505 -g20 -aI733 -aI280 -aa(lp10506 -g15 -aI601 -aI301 -aI688 -aI294 -aI644 -aI301 -aa(lp10507 -g15 -aI345 -aI8 -aI437 -aI301 -aI352 -aI204 -aa(lp10508 -g15 -aI142 -aI-110 -aI258 -aI-6 -aI191 -aI-46 -aa(lp10509 -g15 -aI69 -aI-354 -aI93 -aI-175 -aI69 -aI-256 -aa(lp10510 -g15 -aI218 -aI-774 -aI69 -aI-507 -aI118 -aI-647 -aa(lp10511 -g15 -aI602 -aI-966 -aI318 -aI-902 -aI446 -aI-966 -aa(lp10512 -g15 -aI852 -aI-869 -aI706 -aI-966 -aI789 -aI-934 -aa(lp10513 -g15 -aI947 -aI-599 -aI916 -aI-805 -aI947 -aI-715 -aa(lp10514 -g15 -aI823 -aI-210 -aI947 -aI-464 -aI906 -aI-334 -aa(lp10515 -g15 -aI489 -aI9 -aI740 -aI-85 -aI629 -aI-12 -aa(lp10516 -g10 -aa(lp10517 -g8 -aI426 -aI-58 -aa(lp10518 -g15 -aI696 -aI-242 -aI537 -aI-58 -aI627 -aI-119 -aa(lp10519 -g15 -aI801 -aI-635 -aI766 -aI-364 -aI801 -aI-495 -aa(lp10520 -g15 -aI746 -aI-827 -aI801 -aI-718 -aI783 -aI-782 -aa(lp10521 -g15 -aI591 -aI-894 -aI709 -aI-871 -aI658 -aI-894 -aa(lp10522 -g15 -aI319 -aI-709 -aI480 -aI-894 -aI390 -aI-832 -aa(lp10523 -g15 -aI214 -aI-316 -aI249 -aI-586 -aI214 -aI-455 -aa(lp10524 -g15 -aI271 -aI-124 -aI214 -aI-233 -aI233 -aI-169 -aa(lp10525 -g15 -aI426 -aI-58 -aI309 -aI-80 -aI360 -aI-58 -aa(lp10526 -g10 -aa(lp10527 -g8 -aI989 -aI0 -aa(lp10528 -g10 -aa(lp10529 -g8 -aI989 -aI0 -aasVU -(lp10530 -(lp10531 -g8 -aI133 -aI-895 -aa(lp10532 -g20 -aI145 -aI-951 -aa(lp10533 -g20 -aI533 -aI-951 -aa(lp10534 -g20 -aI522 -aI-895 -aa(lp10535 -g20 -aI505 -aI-895 -aa(lp10536 -g15 -aI414 -aI-871 -aI463 -aI-895 -aI433 -aI-887 -aa(lp10537 -g15 -aI374 -aI-799 -aI394 -aI-855 -aI381 -aI-831 -aa(lp10538 -g20 -aI274 -aI-328 -aa(lp10539 -g15 -aI258 -aI-204 -aI263 -aI-277 -aI258 -aI-236 -aa(lp10540 -g15 -aI450 -aI-65 -aI258 -aI-112 -aI322 -aI-65 -aa(lp10541 -g15 -aI621 -aI-114 -aI522 -aI-65 -aI579 -aI-82 -aa(lp10542 -g15 -aI709 -aI-274 -aI663 -aI-146 -aI693 -aI-199 -aa(lp10543 -g20 -aI822 -aI-804 -aa(lp10544 -g15 -aI828 -aI-841 -aI826 -aI-820 -aI828 -aI-833 -aa(lp10545 -g15 -aI731 -aI-895 -aI828 -aI-877 -aI796 -aI-895 -aa(lp10546 -g20 -aI714 -aI-895 -aa(lp10547 -g20 -aI726 -aI-951 -aa(lp10548 -g20 -aI1061 -aI-951 -aa(lp10549 -g20 -aI1050 -aI-895 -aa(lp10550 -g20 -aI1033 -aI-895 -aa(lp10551 -g15 -aI942 -aI-871 -aI991 -aI-895 -aI961 -aI-887 -aa(lp10552 -g15 -aI902 -aI-799 -aI922 -aI-855 -aI909 -aI-831 -aa(lp10553 -g20 -aI790 -aI-271 -aa(lp10554 -g15 -aI430 -aI13 -aI749 -aI-81 -aI630 -aI13 -aa(lp10555 -g15 -aI206 -aI-46 -aI332 -aI13 -aI257 -aI-6 -aa(lp10556 -g15 -aI128 -aI-216 -aI154 -aI-86 -aI128 -aI-143 -aa(lp10557 -g15 -aI142 -aI-335 -aI128 -aI-253 -aI133 -aI-292 -aa(lp10558 -g20 -aI241 -aI-804 -aa(lp10559 -g15 -aI246 -aI-841 -aI245 -aI-821 -aI246 -aI-833 -aa(lp10560 -g15 -aI150 -aI-895 -aI246 -aI-877 -aI214 -aI-895 -aa(lp10561 -g10 -aa(lp10562 -g8 -aI973 -aI0 -aa(lp10563 -g10 -aa(lp10564 -g8 -aI973 -aI0 -aasVY -(lp10565 -(lp10566 -g8 -aI474 -aI-951 -aa(lp10567 -g20 -aI462 -aI-895 -aa(lp10568 -g20 -aI395 -aI-895 -aa(lp10569 -g15 -aI341 -aI-859 -aI359 -aI-895 -aI341 -aI-883 -aa(lp10570 -g15 -aI358 -aI-782 -aI341 -aI-842 -aI347 -aI-816 -aa(lp10571 -g20 -aI418 -aI-603 -aa(lp10572 -g15 -aI454 -aI-443 -aI439 -aI-540 -aI451 -aI-486 -aa(lp10573 -g15 -aI554 -aI-583 -aI463 -aI-460 -aI496 -aI-506 -aa(lp10574 -g20 -aI681 -aI-752 -aa(lp10575 -g15 -aI730 -aI-860 -aI714 -aI-796 -aI730 -aI-832 -aa(lp10576 -g15 -aI666 -aI-895 -aI730 -aI-883 -aI709 -aI-895 -aa(lp10577 -g20 -aI617 -aI-895 -aa(lp10578 -g20 -aI629 -aI-951 -aa(lp10579 -g20 -aI958 -aI-951 -aa(lp10580 -g20 -aI946 -aI-895 -aa(lp10581 -g20 -aI921 -aI-895 -aa(lp10582 -g15 -aI870 -aI-874 -aI904 -aI-895 -aI887 -aI-888 -aa(lp10583 -g15 -aI800 -aI-794 -aI854 -aI-861 -aI830 -aI-834 -aa(lp10584 -g20 -aI489 -aI-387 -aa(lp10585 -g20 -aI437 -aI-146 -aa(lp10586 -g15 -aI432 -aI-108 -aI434 -aI-129 -aI432 -aI-117 -aa(lp10587 -g15 -aI527 -aI-55 -aI432 -aI-73 -aI464 -aI-55 -aa(lp10588 -g20 -aI558 -aI-55 -aa(lp10589 -g20 -aI546 -aI0 -aa(lp10590 -g20 -aI132 -aI0 -aa(lp10591 -g20 -aI143 -aI-55 -aa(lp10592 -g20 -aI174 -aI-55 -aa(lp10593 -g15 -aI267 -aI-78 -aI219 -aI-55 -aI250 -aI-63 -aa(lp10594 -g15 -aI302 -aI-144 -aI284 -aI-94 -aI296 -aI-116 -aa(lp10595 -g20 -aI354 -aI-390 -aa(lp10596 -g20 -aI199 -aI-825 -aa(lp10597 -g15 -aI170 -aI-881 -aI189 -aI-853 -aI180 -aI-872 -aa(lp10598 -g15 -aI119 -aI-895 -aI160 -aI-890 -aI143 -aI-895 -aa(lp10599 -g20 -aI102 -aI-895 -aa(lp10600 -g20 -aI114 -aI-951 -aa(lp10601 -g10 -aa(lp10602 -g8 -aI833 -aI0 -aa(lp10603 -g10 -aa(lp10604 -g8 -aI833 -aI0 -aasV] -(lp10605 -(lp10606 -g8 -aI-62 -aI171 -aa(lp10607 -g20 -aI-50 -aI115 -aa(lp10608 -g20 -aI6 -aI115 -aa(lp10609 -g15 -aI97 -aI90 -aI48 -aI115 -aI78 -aI107 -aa(lp10610 -g15 -aI134 -aI19 -aI115 -aI74 -aI128 -aI51 -aa(lp10611 -g20 -aI324 -aI-866 -aa(lp10612 -g15 -aI329 -aI-903 -aI327 -aI-882 -aI329 -aI-894 -aa(lp10613 -g15 -aI233 -aI-956 -aI329 -aI-939 -aI297 -aI-956 -aa(lp10614 -g20 -aI175 -aI-956 -aa(lp10615 -g20 -aI188 -aI-1012 -aa(lp10616 -g20 -aI485 -aI-1012 -aa(lp10617 -g20 -aI233 -aI171 -aa(lp10618 -g10 -aa(lp10619 -g8 -aI479 -aI0 -aa(lp10620 -g10 -aa(lp10621 -g8 -aI479 -aI0 -aasVa -(lp10622 -(lp10623 -g8 -aI486 -aI-200 -aa(lp10624 -g20 -aI478 -aI-200 -aa(lp10625 -g15 -aI229 -aI13 -aI414 -aI-57 -aI331 -aI13 -aa(lp10626 -g15 -aI102 -aI-50 -aI174 -aI13 -aI132 -aI-7 -aa(lp10627 -g15 -aI57 -aI-230 -aI72 -aI-93 -aI57 -aI-153 -aa(lp10628 -g15 -aI171 -aI-570 -aI57 -aI-352 -aI95 -aI-465 -aa(lp10629 -g15 -aI454 -aI-727 -aI247 -aI-675 -aI342 -aI-727 -aa(lp10630 -g15 -aI610 -aI-679 -aI514 -aI-727 -aI566 -aI-711 -aa(lp10631 -g20 -aI669 -aI-713 -aa(lp10632 -g20 -aI712 -aI-713 -aa(lp10633 -g20 -aI621 -aI-286 -aa(lp10634 -g15 -aI601 -aI-138 -aI608 -aI-224 -aI601 -aI-175 -aa(lp10635 -g15 -aI645 -aI-70 -aI601 -aI-93 -aI616 -aI-70 -aa(lp10636 -g15 -aI741 -aI-105 -aI670 -aI-70 -aI702 -aI-82 -aa(lp10637 -g20 -aI765 -aI-65 -aa(lp10638 -g15 -aI577 -aI13 -aI701 -aI-13 -aI639 -aI13 -aa(lp10639 -g15 -aI473 -aI-97 -aI508 -aI13 -aI473 -aI-23 -aa(lp10640 -g15 -aI486 -aI-200 -aI473 -aI-125 -aI477 -aI-159 -aa(lp10641 -g10 -aa(lp10642 -g8 -aI562 -aI-619 -aa(lp10643 -g15 -aI461 -aI-667 -aI542 -aI-651 -aI508 -aI-667 -aa(lp10644 -g15 -aI270 -aI-522 -aI385 -aI-667 -aI321 -aI-619 -aa(lp10645 -g15 -aI193 -aI-224 -aI219 -aI-426 -aI193 -aI-326 -aa(lp10646 -g15 -aI277 -aI-70 -aI193 -aI-121 -aI221 -aI-70 -aa(lp10647 -g15 -aI416 -aI-168 -aI321 -aI-70 -aI368 -aI-103 -aa(lp10648 -g15 -aI513 -aI-383 -aI465 -aI-234 -aI497 -aI-305 -aa(lp10649 -g10 -aa(lp10650 -g8 -aI772 -aI0 -aa(lp10651 -g10 -aa(lp10652 -g8 -aI772 -aI0 -aasVe -(lp10653 -(lp10654 -g8 -aI534 -aI-166 -aa(lp10655 -g15 -aI548 -aI-133 -aI543 -aI-160 -aI548 -aI-149 -aa(lp10656 -g15 -aI485 -aI-33 -aI548 -aI-97 -aI527 -aI-64 -aa(lp10657 -g15 -aI317 -aI13 -aI443 -aI-2 -aI387 -aI13 -aa(lp10658 -g15 -aI128 -aI-60 -aI239 -aI13 -aI176 -aI-11 -aa(lp10659 -g15 -aI57 -aI-261 -aI81 -aI-109 -aI57 -aI-176 -aa(lp10660 -g15 -aI169 -aI-581 -aI57 -aI-378 -aI94 -aI-484 -aa(lp10661 -g15 -aI454 -aI-727 -aI245 -aI-678 -aI339 -aI-727 -aa(lp10662 -g15 -aI585 -aI-687 -aI510 -aI-727 -aI554 -aI-713 -aa(lp10663 -g15 -aI632 -aI-574 -aI616 -aI-660 -aI632 -aI-622 -aa(lp10664 -g15 -aI519 -aI-386 -aI632 -aI-502 -aI594 -aI-439 -aa(lp10665 -g15 -aI245 -aI-306 -aI444 -aI-332 -aI353 -aI-306 -aa(lp10666 -g20 -aI222 -aI-306 -aa(lp10667 -g15 -aI198 -aI-307 -aI214 -aI-306 -aI206 -aI-306 -aa(lp10668 -g15 -aI195 -aI-251 -aI196 -aI-295 -aI195 -aI-276 -aa(lp10669 -g15 -aI342 -aI-70 -aI195 -aI-130 -aI244 -aI-70 -aa(lp10670 -g15 -aI534 -aI-166 -aI418 -aI-70 -aI482 -aI-102 -aa(lp10671 -g10 -aa(lp10672 -g8 -aI210 -aI-368 -aa(lp10673 -g20 -aI223 -aI-368 -aa(lp10674 -g15 -aI418 -aI-425 -aI302 -aI-368 -aI367 -aI-387 -aa(lp10675 -g15 -aI494 -aI-574 -aI469 -aI-464 -aI494 -aI-513 -aa(lp10676 -g15 -aI417 -aI-663 -aI494 -aI-633 -aI468 -aI-663 -aa(lp10677 -g15 -aI296 -aI-582 -aI374 -aI-663 -aI334 -aI-636 -aa(lp10678 -g15 -aI210 -aI-368 -aI259 -aI-528 -aI230 -aI-457 -aa(lp10679 -g10 -aa(lp10680 -g8 -aI657 -aI0 -aa(lp10681 -g10 -aa(lp10682 -g8 -aI657 -aI0 -aasVi -(lp10683 -(lp10684 -g8 -aI298 -aI-847 -aa(lp10685 -g15 -aI223 -aI-920 -aI248 -aI-847 -aI223 -aI-872 -aa(lp10686 -g15 -aI245 -aI-988 -aI223 -aI-948 -aI231 -aI-971 -aa(lp10687 -g15 -aI304 -aI-1014 -aI260 -aI-1005 -aI279 -aI-1014 -aa(lp10688 -g15 -aI378 -aI-940 -aI353 -aI-1014 -aI378 -aI-989 -aa(lp10689 -g15 -aI356 -aI-871 -aI378 -aI-910 -aI371 -aI-887 -aa(lp10690 -g15 -aI298 -aI-847 -aI341 -aI-855 -aI322 -aI-847 -aa(lp10691 -g10 -aa(lp10692 -g8 -aI82 -aI-658 -aa(lp10693 -g20 -aI94 -aI-714 -aa(lp10694 -g20 -aI333 -aI-714 -aa(lp10695 -g20 -aI242 -aI-286 -aa(lp10696 -g15 -aI222 -aI-138 -aI229 -aI-222 -aI222 -aI-172 -aa(lp10697 -g15 -aI266 -aI-70 -aI222 -aI-93 -aI237 -aI-70 -aa(lp10698 -g15 -aI362 -aI-105 -aI292 -aI-70 -aI324 -aI-82 -aa(lp10699 -g20 -aI386 -aI-65 -aa(lp10700 -g15 -aI206 -aI13 -aI325 -aI-13 -aI264 -aI13 -aa(lp10701 -g15 -aI126 -aI-22 -aI173 -aI13 -aI146 -aI1 -aa(lp10702 -g15 -aI95 -aI-112 -aI105 -aI-46 -aI95 -aI-76 -aa(lp10703 -g15 -aI125 -aI-322 -aI95 -aI-152 -aI105 -aI-222 -aa(lp10704 -g20 -aI177 -aI-567 -aa(lp10705 -g15 -aI181 -aI-602 -aI180 -aI-581 -aI181 -aI-593 -aa(lp10706 -g15 -aI100 -aI-658 -aI181 -aI-639 -aI154 -aI-658 -aa(lp10707 -g10 -aa(lp10708 -g8 -aI405 -aI0 -aa(lp10709 -g10 -aa(lp10710 -g8 -aI405 -aI0 -aasVm -(lp10711 -(lp10712 -g8 -aI598 -aI0 -aa(lp10713 -g20 -aI472 -aI0 -aa(lp10714 -g15 -aI488 -aI-137 -aI472 -aI-19 -aI477 -aI-65 -aa(lp10715 -g15 -aI517 -aI-299 -aI500 -aI-210 -aI509 -aI-264 -aa(lp10716 -g20 -aI548 -aI-437 -aa(lp10717 -g15 -aI567 -aI-562 -aI561 -aI-491 -aI567 -aI-532 -aa(lp10718 -g15 -aI506 -aI-640 -aI567 -aI-614 -aI547 -aI-640 -aa(lp10719 -g15 -aI353 -aI-539 -aI457 -aI-640 -aI406 -aI-607 -aa(lp10720 -g15 -aI254 -aI-340 -aI301 -aI-472 -aI268 -aI-405 -aa(lp10721 -g20 -aI182 -aI0 -aa(lp10722 -g20 -aI58 -aI0 -aa(lp10723 -g20 -aI170 -aI-535 -aa(lp10724 -g15 -aI178 -aI-595 -aI175 -aI-560 -aI178 -aI-580 -aa(lp10725 -g15 -aI85 -aI-658 -aI178 -aI-637 -aI147 -aI-658 -aa(lp10726 -g20 -aI74 -aI-658 -aa(lp10727 -g20 -aI86 -aI-714 -aa(lp10728 -g20 -aI333 -aI-714 -aa(lp10729 -g20 -aI297 -aI-546 -aa(lp10730 -g20 -aI310 -aI-546 -aa(lp10731 -g15 -aI553 -aI-726 -aI382 -aI-666 -aI463 -aI-726 -aa(lp10732 -g15 -aI695 -aI-578 -aI648 -aI-726 -aI695 -aI-676 -aa(lp10733 -g15 -aI693 -aI-546 -aI695 -aI-567 -aI695 -aI-556 -aa(lp10734 -g20 -aI706 -aI-546 -aa(lp10735 -g15 -aI949 -aI-726 -aI778 -aI-666 -aI859 -aI-726 -aa(lp10736 -g15 -aI1091 -aI-578 -aI1044 -aI-726 -aI1091 -aI-676 -aa(lp10737 -g15 -aI1067 -aI-431 -aI1091 -aI-550 -aI1083 -aI-501 -aa(lp10738 -g20 -aI1033 -aI-274 -aa(lp10739 -g15 -aI1016 -aI-134 -aI1021 -aI-222 -aI1016 -aI-175 -aa(lp10740 -g15 -aI1062 -aI-70 -aI1016 -aI-91 -aI1031 -aI-70 -aa(lp10741 -g15 -aI1147 -aI-101 -aI1088 -aI-70 -aI1116 -aI-80 -aa(lp10742 -g20 -aI1171 -aI-62 -aa(lp10743 -g15 -aI1009 -aI13 -aI1115 -aI-11 -aI1061 -aI13 -aa(lp10744 -g15 -aI921 -aI-22 -aI972 -aI13 -aI943 -aI1 -aa(lp10745 -g15 -aI888 -aI-119 -aI899 -aI-46 -aI888 -aI-78 -aa(lp10746 -g15 -aI913 -aI-299 -aI888 -aI-160 -aI896 -aI-220 -aa(lp10747 -g20 -aI936 -aI-403 -aa(lp10748 -g15 -aI964 -aI-562 -aI954 -aI-489 -aI964 -aI-542 -aa(lp10749 -g15 -aI902 -aI-640 -aI964 -aI-614 -aI943 -aI-640 -aa(lp10750 -g15 -aI761 -aI-553 -aI856 -aI-640 -aI809 -aI-611 -aa(lp10751 -g15 -aI658 -aI-369 -aI712 -aI-494 -aI678 -aI-433 -aa(lp10752 -g20 -aI637 -aI-274 -aa(lp10753 -g15 -aI613 -aI-131 -aI631 -aI-249 -aI623 -aI-202 -aa(lp10754 -g15 -aI598 -aI0 -aI603 -aI-60 -aI598 -aI-16 -aa(lp10755 -g10 -aa(lp10756 -g8 -aI1194 -aI0 -aa(lp10757 -g10 -aa(lp10758 -g8 -aI1194 -aI0 -aasVq -(lp10759 -(lp10760 -g8 -aI478 -aI-200 -aa(lp10761 -g15 -aI229 -aI13 -aI413 -aI-57 -aI330 -aI13 -aa(lp10762 -g15 -aI102 -aI-50 -aI175 -aI13 -aI133 -aI-7 -aa(lp10763 -g15 -aI57 -aI-230 -aI72 -aI-93 -aI57 -aI-153 -aa(lp10764 -g15 -aI171 -aI-570 -aI57 -aI-352 -aI95 -aI-465 -aa(lp10765 -g15 -aI454 -aI-727 -aI247 -aI-675 -aI342 -aI-727 -aa(lp10766 -g15 -aI602 -aI-691 -aI509 -aI-727 -aI559 -aI-715 -aa(lp10767 -g20 -aI635 -aI-709 -aa(lp10768 -g15 -aI669 -aI-727 -aI656 -aI-721 -aI667 -aI-727 -aa(lp10769 -g20 -aI716 -aI-727 -aa(lp10770 -g20 -aI531 -aI141 -aa(lp10771 -g15 -aI524 -aI201 -aI526 -aI166 -aI524 -aI186 -aa(lp10772 -g15 -aI615 -aI264 -aI524 -aI243 -aI554 -aI264 -aa(lp10773 -g20 -aI626 -aI264 -aa(lp10774 -g20 -aI614 -aI320 -aa(lp10775 -g20 -aI371 -aI320 -aa(lp10776 -g20 -aI427 -aI53 -aa(lp10777 -g15 -aI486 -aI-200 -aI431 -aI36 -aI450 -aI-47 -aa(lp10778 -g10 -aa(lp10779 -g8 -aI562 -aI-619 -aa(lp10780 -g15 -aI461 -aI-667 -aI542 -aI-651 -aI509 -aI-667 -aa(lp10781 -g15 -aI269 -aI-520 -aI384 -aI-667 -aI320 -aI-618 -aa(lp10782 -g15 -aI193 -aI-223 -aI218 -aI-422 -aI193 -aI-323 -aa(lp10783 -g15 -aI277 -aI-70 -aI193 -aI-121 -aI221 -aI-70 -aa(lp10784 -g15 -aI415 -aI-167 -aI321 -aI-70 -aI367 -aI-102 -aa(lp10785 -g15 -aI513 -aI-383 -aI463 -aI-231 -aI496 -aI-303 -aa(lp10786 -g10 -aa(lp10787 -g8 -aI746 -aI0 -aa(lp10788 -g10 -aa(lp10789 -g8 -aI746 -aI0 -aasVu -(lp10790 -(lp10791 -g8 -aI87 -aI-714 -aa(lp10792 -g20 -aI335 -aI-714 -aa(lp10793 -g20 -aI248 -aI-315 -aa(lp10794 -g15 -aI221 -aI-154 -aI230 -aI-234 -aI221 -aI-180 -aa(lp10795 -g15 -aI286 -aI-73 -aI221 -aI-100 -aI243 -aI-73 -aa(lp10796 -g15 -aI433 -aI-171 -aI332 -aI-73 -aI381 -aI-105 -aa(lp10797 -g15 -aI537 -aI-382 -aI486 -aI-237 -aI521 -aI-307 -aa(lp10798 -g20 -aI606 -aI-714 -aa(lp10799 -g20 -aI735 -aI-714 -aa(lp10800 -g20 -aI643 -aI-286 -aa(lp10801 -g15 -aI623 -aI-138 -aI630 -aI-223 -aI623 -aI-173 -aa(lp10802 -g15 -aI667 -aI-70 -aI623 -aI-93 -aI638 -aI-70 -aa(lp10803 -g15 -aI753 -aI-99 -aI693 -aI-70 -aI721 -aI-80 -aa(lp10804 -g20 -aI777 -aI-60 -aa(lp10805 -g15 -aI608 -aI13 -aI720 -aI-11 -aI664 -aI13 -aa(lp10806 -g15 -aI527 -aI-22 -aI574 -aI13 -aI547 -aI1 -aa(lp10807 -g15 -aI496 -aI-112 -aI506 -aI-46 -aI496 -aI-76 -aa(lp10808 -g15 -aI502 -aI-191 -aI496 -aI-135 -aI498 -aI-162 -aa(lp10809 -g20 -aI492 -aI-191 -aa(lp10810 -g15 -aI362 -aI-30 -aI444 -aI-112 -aI400 -aI-58 -aa(lp10811 -g15 -aI234 -aI12 -aI324 -aI-1 -aI282 -aI12 -aa(lp10812 -g15 -aI91 -aI-135 -aI139 -aI12 -aI91 -aI-37 -aa(lp10813 -g15 -aI115 -aI-282 -aI91 -aI-163 -aI99 -aI-212 -aa(lp10814 -g20 -aI167 -aI-515 -aa(lp10815 -g15 -aI179 -aI-595 -aI175 -aI-550 -aI179 -aI-577 -aa(lp10816 -g15 -aI86 -aI-658 -aI179 -aI-637 -aI148 -aI-658 -aa(lp10817 -g20 -aI76 -aI-658 -aa(lp10818 -g10 -aa(lp10819 -g8 -aI798 -aI0 -aa(lp10820 -g10 -aa(lp10821 -g8 -aI798 -aI0 -aasVy -(lp10822 -(lp10823 -g8 -aI106 -aI-587 -aa(lp10824 -g15 -aI74 -aI-642 -aI98 -aI-613 -aI88 -aI-631 -aa(lp10825 -g15 -aI14 -aI-658 -aI61 -aI-653 -aI41 -aI-658 -aa(lp10826 -g20 -aI1 -aI-658 -aa(lp10827 -g20 -aI11 -aI-714 -aa(lp10828 -g20 -aI206 -aI-714 -aa(lp10829 -g20 -aI310 -aI-354 -aa(lp10830 -g15 -aI366 -aI-112 -aI342 -aI-242 -aI361 -aI-162 -aa(lp10831 -g20 -aI370 -aI-112 -aa(lp10832 -g15 -aI550 -aI-555 -aI490 -aI-295 -aI550 -aI-443 -aa(lp10833 -g15 -aI485 -aI-627 -aI550 -aI-603 -aI528 -aI-627 -aa(lp10834 -g15 -aI511 -aI-699 -aI485 -aI-657 -aI493 -aI-681 -aa(lp10835 -g15 -aI572 -aI-726 -aI528 -aI-717 -aI548 -aI-726 -aa(lp10836 -g15 -aI662 -aI-614 -aI632 -aI-726 -aI662 -aI-688 -aa(lp10837 -g15 -aI483 -aI-161 -aI662 -aI-506 -aI602 -aI-356 -aa(lp10838 -g15 -aI194 -aI225 -aI363 -aI32 -aI267 -aI161 -aa(lp10839 -g15 -aI-90 -aI320 -aI122 -aI288 -aI27 -aI320 -aa(lp10840 -g15 -aI-216 -aI296 -aI-137 -aI320 -aI-179 -aI312 -aa(lp10841 -g20 -aI-195 -aI229 -aa(lp10842 -g15 -aI-91 -aI244 -aI-164 -aI239 -aI-129 -aI244 -aa(lp10843 -g15 -aI282 -aI1 -aI35 -aI244 -aI160 -aI163 -aa(lp10844 -g10 -aa(lp10845 -g8 -aI703 -aI0 -aa(lp10846 -g10 -aa(lp10847 -g8 -aI703 -aI0 -aasV} -(lp10848 -(lp10849 -g8 -aI83 -aI113 -aa(lp10850 -g20 -aI123 -aI113 -aa(lp10851 -g15 -aI233 -aI-26 -aI196 -aI113 -aI233 -aI67 -aa(lp10852 -g20 -aI233 -aI-256 -aa(lp10853 -g15 -aI381 -aI-422 -aI233 -aI-350 -aI282 -aI-405 -aa(lp10854 -g20 -aI381 -aI-423 -aa(lp10855 -g15 -aI233 -aI-587 -aI282 -aI-439 -aI233 -aI-494 -aa(lp10856 -g20 -aI233 -aI-815 -aa(lp10857 -g15 -aI123 -aI-955 -aI233 -aI-908 -aI196 -aI-955 -aa(lp10858 -g20 -aI83 -aI-955 -aa(lp10859 -g20 -aI83 -aI-1012 -aa(lp10860 -g20 -aI171 -aI-1012 -aa(lp10861 -g15 -aI363 -aI-822 -aI299 -aI-1012 -aI363 -aI-949 -aa(lp10862 -g20 -aI363 -aI-590 -aa(lp10863 -g15 -aI521 -aI-450 -aI363 -aI-498 -aI416 -aI-452 -aa(lp10864 -g20 -aI521 -aI-394 -aa(lp10865 -g15 -aI363 -aI-252 -aI416 -aI-391 -aI363 -aI-343 -aa(lp10866 -g20 -aI363 -aI-21 -aa(lp10867 -g15 -aI313 -aI120 -aI363 -aI40 -aI347 -aI87 -aa(lp10868 -g15 -aI171 -aI171 -aI279 -aI154 -aI232 -aI171 -aa(lp10869 -g20 -aI83 -aI171 -aa(lp10870 -g10 -aa(lp10871 -g8 -aI570 -aI0 -aa(lp10872 -g10 -aa(lp10873 -g8 -aI570 -aI0 -aassS'normal' -p10874 -(dp10875 -V -(lp10876 -(lp10877 -g8 -aI346 -aI0 -aa(lp10878 -g10 -aa(lp10879 -g8 -aI346 -aI0 -aasV$ -(lp10880 -(lp10881 -g8 -aI404 -aI-911 -aa(lp10882 -g15 -aI506 -aI-898 -aI444 -aI-910 -aI478 -aI-906 -aa(lp10883 -g15 -aI574 -aI-866 -aI534 -aI-890 -aI557 -aI-879 -aa(lp10884 -g15 -aI613 -aI-819 -aI592 -aI-853 -aI605 -aI-837 -aa(lp10885 -g15 -aI625 -aI-761 -aI621 -aI-802 -aI625 -aI-782 -aa(lp10886 -g15 -aI597 -aI-697 -aI625 -aI-733 -aI616 -aI-711 -aa(lp10887 -g15 -aI520 -aI-675 -aI577 -aI-682 -aI552 -aI-675 -aa(lp10888 -g15 -aI515 -aI-734 -aI520 -aI-694 -aI518 -aI-714 -aa(lp10889 -g15 -aI497 -aI-788 -aI512 -aI-753 -aI506 -aI-772 -aa(lp10890 -g15 -aI462 -aI-829 -aI489 -aI-804 -aI477 -aI-818 -aa(lp10891 -g15 -aI404 -aI-850 -aI447 -aI-840 -aI427 -aI-847 -aa(lp10892 -g20 -aI404 -aI-539 -aa(lp10893 -g15 -aI510 -aI-487 -aI444 -aI-521 -aI479 -aI-504 -aa(lp10894 -g15 -aI587 -aI-430 -aI541 -aI-469 -aI567 -aI-451 -aa(lp10895 -g15 -aI635 -aI-363 -aI608 -aI-410 -aI624 -aI-388 -aa(lp10896 -g15 -aI651 -aI-279 -aI646 -aI-339 -aI651 -aI-311 -aa(lp10897 -g15 -aI587 -aI-123 -aI651 -aI-212 -aI630 -aI-160 -aa(lp10898 -g15 -aI404 -aI-55 -aI544 -aI-86 -aI483 -aI-63 -aa(lp10899 -g20 -aI404 -aI105 -aa(lp10900 -g20 -aI337 -aI105 -aa(lp10901 -g20 -aI337 -aI-52 -aa(lp10902 -g15 -aI270 -aI-55 -aI315 -aI-52 -aI292 -aI-53 -aa(lp10903 -g15 -aI204 -aI-65 -aI247 -aI-57 -aI225 -aI-61 -aa(lp10904 -g15 -aI142 -aI-82 -aI182 -aI-70 -aI162 -aI-75 -aa(lp10905 -g15 -aI87 -aI-107 -aI122 -aI-89 -aI104 -aI-98 -aa(lp10906 -g20 -aI87 -aI-312 -aa(lp10907 -g20 -aI143 -aI-312 -aa(lp10908 -g15 -aI157 -aI-240 -aI143 -aI-287 -aI148 -aI-263 -aa(lp10909 -g15 -aI197 -aI-178 -aI167 -aI-217 -aI180 -aI-196 -aa(lp10910 -g15 -aI258 -aI-132 -aI214 -aI-159 -aI235 -aI-144 -aa(lp10911 -g15 -aI337 -aI-111 -aI282 -aI-120 -aI308 -aI-113 -aa(lp10912 -g20 -aI337 -aI-440 -aa(lp10913 -g15 -aI231 -aI-496 -aI295 -aI-459 -aI260 -aI-478 -aa(lp10914 -g15 -aI161 -aI-553 -aI202 -aI-514 -aI179 -aI-533 -aa(lp10915 -g15 -aI122 -aI-619 -aI143 -aI-574 -aI130 -aI-595 -aa(lp10916 -g15 -aI110 -aI-698 -aI114 -aI-642 -aI110 -aI-669 -aa(lp10917 -g15 -aI126 -aI-779 -aI110 -aI-728 -aI115 -aI-755 -aa(lp10918 -g15 -aI171 -aI-842 -aI137 -aI-803 -aI152 -aI-824 -aa(lp10919 -g15 -aI243 -aI-886 -aI191 -aI-860 -aI215 -aI-875 -aa(lp10920 -g15 -aI337 -aI-909 -aI271 -aI-897 -aI302 -aI-905 -aa(lp10921 -g20 -aI337 -aI-1012 -aa(lp10922 -g20 -aI404 -aI-1012 -aa(lp10923 -g10 -aa(lp10924 -g8 -aI529 -aI-259 -aa(lp10925 -g15 -aI522 -aI-307 -aI529 -aI-277 -aI527 -aI-293 -aa(lp10926 -g15 -aI501 -aI-346 -aI518 -aI-321 -aI511 -aI-334 -aa(lp10927 -g15 -aI462 -aI-380 -aI491 -aI-358 -aI478 -aI-369 -aa(lp10928 -g15 -aI404 -aI-411 -aI446 -aI-390 -aI427 -aI-401 -aa(lp10929 -g20 -aI404 -aI-115 -aa(lp10930 -g15 -aI496 -aI-163 -aI444 -aI-122 -aI475 -aI-138 -aa(lp10931 -g15 -aI529 -aI-259 -aI518 -aI-189 -aI529 -aI-221 -aa(lp10932 -g10 -aa(lp10933 -g8 -aI230 -aI-709 -aa(lp10934 -g15 -aI237 -aI-660 -aI230 -aI-690 -aI232 -aI-674 -aa(lp10935 -g15 -aI257 -aI-622 -aI241 -aI-645 -aI248 -aI-633 -aa(lp10936 -g15 -aI291 -aI-593 -aI266 -aI-611 -aI278 -aI-601 -aa(lp10937 -g15 -aI337 -aI-568 -aI304 -aI-584 -aI319 -aI-576 -aa(lp10938 -g20 -aI337 -aI-847 -aa(lp10939 -g15 -aI291 -aI-829 -aI319 -aI-843 -aI304 -aI-837 -aa(lp10940 -g15 -aI257 -aI-798 -aI277 -aI-820 -aI266 -aI-810 -aa(lp10941 -g15 -aI237 -aI-758 -aI248 -aI-786 -aI241 -aI-773 -aa(lp10942 -g15 -aI230 -aI-709 -aI232 -aI-742 -aI230 -aI-726 -aa(lp10943 -g10 -aa(lp10944 -g8 -aI745 -aI0 -aa(lp10945 -g10 -aa(lp10946 -g8 -aI745 -aI0 -aasV( -(lp10947 -(lp10948 -g8 -aI214 -aI-422 -aa(lp10949 -g15 -aI221 -aI-265 -aI214 -aI-369 -aI216 -aI-316 -aa(lp10950 -g15 -aI248 -aI-118 -aI225 -aI-213 -aI234 -aI-164 -aa(lp10951 -g15 -aI309 -aI9 -aI261 -aI-72 -aI282 -aI-29 -aa(lp10952 -g15 -aI418 -aI109 -aI336 -aI48 -aI373 -aI82 -aa(lp10953 -g20 -aI418 -aI171 -aa(lp10954 -g15 -aI261 -aI82 -aI357 -aI146 -aI305 -aI117 -aa(lp10955 -g15 -aI155 -aI-41 -aI218 -aI47 -aI182 -aI6 -aa(lp10956 -g15 -aI95 -aI-207 -aI127 -aI-89 -aI107 -aI-144 -aa(lp10957 -g15 -aI76 -aI-422 -aI82 -aI-270 -aI76 -aI-341 -aa(lp10958 -g15 -aI95 -aI-635 -aI76 -aI-502 -aI82 -aI-573 -aa(lp10959 -g15 -aI155 -aI-800 -aI107 -aI-698 -aI127 -aI-753 -aa(lp10960 -g15 -aI261 -aI-924 -aI182 -aI-848 -aI218 -aI-889 -aa(lp10961 -g15 -aI418 -aI-1012 -aI305 -aI-958 -aI357 -aI-988 -aa(lp10962 -g20 -aI418 -aI-952 -aa(lp10963 -g15 -aI309 -aI-852 -aI373 -aI-924 -aI336 -aI-891 -aa(lp10964 -g15 -aI248 -aI-725 -aI282 -aI-813 -aI261 -aI-771 -aa(lp10965 -g15 -aI221 -aI-578 -aI234 -aI-679 -aI225 -aI-630 -aa(lp10966 -g15 -aI214 -aI-422 -aI216 -aI-527 -aI214 -aI-475 -aa(lp10967 -g10 -aa(lp10968 -g8 -aI461 -aI0 -aa(lp10969 -g10 -aa(lp10970 -g8 -aI461 -aI0 -aasV, -(lp10971 -(lp10972 -g8 -aI258 -aI-55 -aa(lp10973 -g15 -aI246 -aI26 -aI258 -aI-27 -aI254 -aI0 -aa(lp10974 -g15 -aI208 -aI100 -aI238 -aI52 -aI226 -aI77 -aa(lp10975 -g15 -aI140 -aI160 -aI191 -aI122 -aI168 -aI142 -aa(lp10976 -g15 -aI39 -aI205 -aI113 -aI178 -aI79 -aI193 -aa(lp10977 -g20 -aI39 -aI149 -aa(lp10978 -g15 -aI136 -aI98 -aI83 -aI135 -aI115 -aI118 -aa(lp10979 -g15 -aI166 -aI29 -aI156 -aI78 -aI166 -aI55 -aa(lp10980 -g15 -aI159 -aI7 -aI166 -aI21 -aI164 -aI13 -aa(lp10981 -g15 -aI141 -aI-7 -aI154 -aI2 -aI148 -aI-3 -aa(lp10982 -g15 -aI117 -aI-21 -aI133 -aI-12 -aI126 -aI-16 -aa(lp10983 -g15 -aI94 -aI-36 -aI109 -aI-25 -aI101 -aI-30 -aa(lp10984 -g15 -aI76 -aI-59 -aI87 -aI-42 -aI80 -aI-50 -aa(lp10985 -g15 -aI69 -aI-92 -aI71 -aI-68 -aI69 -aI-79 -aa(lp10986 -g15 -aI94 -aI-151 -aI69 -aI-118 -aI77 -aI-137 -aa(lp10987 -g15 -aI156 -aI-171 -aI110 -aI-164 -aI131 -aI-171 -aa(lp10988 -g15 -aI195 -aI-163 -aI170 -aI-171 -aI183 -aI-168 -aa(lp10989 -g15 -aI227 -aI-141 -aI207 -aI-158 -aI218 -aI-151 -aa(lp10990 -g15 -aI250 -aI-105 -aI237 -aI-132 -aI244 -aI-119 -aa(lp10991 -g15 -aI258 -aI-55 -aI255 -aI-90 -aI258 -aI-74 -aa(lp10992 -g10 -aa(lp10993 -g8 -aI333 -aI0 -aa(lp10994 -g10 -aa(lp10995 -g8 -aI333 -aI0 -aasV0 -(lp10996 -(lp10997 -g8 -aI685 -aI-476 -aa(lp10998 -g15 -aI666 -aI-276 -aI685 -aI-403 -aI679 -aI-336 -aa(lp10999 -g15 -aI608 -aI-121 -aI653 -aI-215 -aI634 -aI-164 -aa(lp11000 -g15 -aI510 -aI-21 -aI582 -aI-78 -aI549 -aI-45 -aa(lp11001 -g15 -aI373 -aI13 -aI471 -aI1 -aI425 -aI13 -aa(lp11002 -g15 -aI231 -aI-21 -aI318 -aI13 -aI271 -aI1 -aa(lp11003 -g15 -aI134 -aI-121 -aI192 -aI-45 -aI159 -aI-78 -aa(lp11004 -g15 -aI78 -aI-276 -aI109 -aI-164 -aI90 -aI-216 -aa(lp11005 -g15 -aI59 -aI-478 -aI65 -aI-337 -aI59 -aI-404 -aa(lp11006 -g15 -aI78 -aI-678 -aI59 -aI-551 -aI65 -aI-618 -aa(lp11007 -g15 -aI134 -aI-832 -aI90 -aI-738 -aI109 -aI-789 -aa(lp11008 -g15 -aI232 -aI-930 -aI159 -aI-874 -aI192 -aI-907 -aa(lp11009 -g15 -aI374 -aI-965 -aI271 -aI-953 -aI319 -aI-965 -aa(lp11010 -g15 -aI510 -aI-930 -aI426 -aI-965 -aI471 -aI-953 -aa(lp11011 -g15 -aI608 -aI-832 -aI549 -aI-907 -aI582 -aI-874 -aa(lp11012 -g15 -aI666 -aI-678 -aI634 -aI-789 -aI653 -aI-738 -aa(lp11013 -g15 -aI685 -aI-476 -aI679 -aI-618 -aI685 -aI-550 -aa(lp11014 -g10 -aa(lp11015 -g8 -aI198 -aI-476 -aa(lp11016 -g15 -aI207 -aI-300 -aI198 -aI-410 -aI201 -aI-351 -aa(lp11017 -g15 -aI237 -aI-168 -aI213 -aI-248 -aI223 -aI-204 -aa(lp11018 -g15 -aI291 -aI-86 -aI250 -aI-132 -aI268 -aI-105 -aa(lp11019 -g15 -aI373 -aI-58 -aI313 -aI-67 -aI340 -aI-58 -aa(lp11020 -g15 -aI455 -aI-86 -aI405 -aI-58 -aI432 -aI-67 -aa(lp11021 -g15 -aI508 -aI-168 -aI477 -aI-105 -aI495 -aI-132 -aa(lp11022 -g15 -aI538 -aI-300 -aI522 -aI-204 -aI532 -aI-248 -aa(lp11023 -g15 -aI546 -aI-476 -aI543 -aI-351 -aI546 -aI-410 -aa(lp11024 -g15 -aI538 -aI-653 -aI546 -aI-542 -aI543 -aI-601 -aa(lp11025 -g15 -aI508 -aI-784 -aI532 -aI-704 -aI522 -aI-748 -aa(lp11026 -g15 -aI455 -aI-865 -aI495 -aI-819 -aI477 -aI-846 -aa(lp11027 -g15 -aI374 -aI-892 -aI433 -aI-883 -aI406 -aI-892 -aa(lp11028 -g15 -aI291 -aI-865 -aI341 -aI-892 -aI314 -aI-883 -aa(lp11029 -g15 -aI237 -aI-784 -aI269 -aI-846 -aI251 -aI-819 -aa(lp11030 -g15 -aI207 -aI-653 -aI223 -aI-748 -aI213 -aI-704 -aa(lp11031 -g15 -aI198 -aI-476 -aI201 -aI-601 -aI198 -aI-542 -aa(lp11032 -g10 -aa(lp11033 -g8 -aI745 -aI0 -aa(lp11034 -g10 -aa(lp11035 -g8 -aI745 -aI0 -aasV4 -(lp11036 -(lp11037 -g8 -aI561 -aI-260 -aa(lp11038 -g20 -aI561 -aI-151 -aa(lp11039 -g15 -aI569 -aI-101 -aI561 -aI-130 -aI564 -aI-113 -aa(lp11040 -g15 -aI593 -aI-72 -aI575 -aI-88 -aI583 -aI-78 -aa(lp11041 -g15 -aI628 -aI-58 -aI603 -aI-65 -aI614 -aI-60 -aa(lp11042 -g15 -aI670 -aI-55 -aI641 -aI-56 -aI655 -aI-55 -aa(lp11043 -g20 -aI688 -aI-55 -aa(lp11044 -g20 -aI688 -aI0 -aa(lp11045 -g20 -aI286 -aI0 -aa(lp11046 -g20 -aI286 -aI-55 -aa(lp11047 -g20 -aI324 -aI-55 -aa(lp11048 -g15 -aI366 -aI-58 -aI339 -aI-55 -aI353 -aI-56 -aa(lp11049 -g15 -aI401 -aI-72 -aI380 -aI-60 -aI391 -aI-65 -aa(lp11050 -g15 -aI424 -aI-101 -aI411 -aI-78 -aI418 -aI-88 -aa(lp11051 -g15 -aI433 -aI-151 -aI430 -aI-113 -aI433 -aI-130 -aa(lp11052 -g20 -aI433 -aI-260 -aa(lp11053 -g20 -aI22 -aI-260 -aa(lp11054 -g20 -aI22 -aI-315 -aa(lp11055 -g20 -aI434 -aI-951 -aa(lp11056 -g20 -aI561 -aI-951 -aa(lp11057 -g20 -aI561 -aI-335 -aa(lp11058 -g20 -aI726 -aI-335 -aa(lp11059 -g20 -aI726 -aI-260 -aa(lp11060 -g10 -aa(lp11061 -g8 -aI433 -aI-582 -aa(lp11062 -g15 -aI434 -aI-646 -aI433 -aI-601 -aI433 -aI-623 -aa(lp11063 -g15 -aI435 -aI-718 -aI434 -aI-670 -aI435 -aI-693 -aa(lp11064 -g15 -aI438 -aI-790 -aI436 -aI-742 -aI437 -aI-766 -aa(lp11065 -g15 -aI442 -aI-858 -aI439 -aI-814 -aI440 -aI-837 -aa(lp11066 -g15 -aI429 -aI-833 -aI439 -aI-852 -aI435 -aI-844 -aa(lp11067 -g15 -aI410 -aI-799 -aI424 -aI-823 -aI417 -aI-812 -aa(lp11068 -g15 -aI387 -aI-759 -aI403 -aI-787 -aI395 -aI-773 -aa(lp11069 -g15 -aI363 -aI-719 -aI379 -aI-746 -aI371 -aI-732 -aa(lp11070 -g15 -aI341 -aI-682 -aI355 -aI-706 -aI348 -aI-693 -aa(lp11071 -g15 -aI322 -aI-653 -aI334 -aI-670 -aI328 -aI-661 -aa(lp11072 -g20 -aI118 -aI-335 -aa(lp11073 -g20 -aI433 -aI-335 -aa(lp11074 -g10 -aa(lp11075 -g8 -aI745 -aI0 -aa(lp11076 -g10 -aa(lp11077 -g8 -aI745 -aI0 -aasV8 -(lp11078 -(lp11079 -g8 -aI61 -aI-238 -aa(lp11080 -g15 -aI76 -aI-322 -aI61 -aI-270 -aI66 -aI-298 -aa(lp11081 -g15 -aI119 -aI-387 -aI86 -aI-346 -aI100 -aI-368 -aa(lp11082 -g15 -aI183 -aI-438 -aI137 -aI-406 -aI158 -aI-423 -aa(lp11083 -g15 -aI264 -aI-481 -aI208 -aI-453 -aI235 -aI-468 -aa(lp11084 -g15 -aI194 -aI-528 -aI239 -aI-496 -aI215 -aI-511 -aa(lp11085 -g15 -aI139 -aI-583 -aI173 -aI-545 -aI155 -aI-563 -aa(lp11086 -g15 -aI104 -aI-648 -aI124 -aI-603 -aI112 -aI-625 -aa(lp11087 -g15 -aI91 -aI-726 -aI96 -aI-672 -aI91 -aI-698 -aa(lp11088 -g15 -aI108 -aI-815 -aI91 -aI-756 -aI97 -aI-786 -aa(lp11089 -g15 -aI158 -aI-891 -aI118 -aI-843 -aI135 -aI-869 -aa(lp11090 -g15 -aI248 -aI-944 -aI181 -aI-913 -aI211 -aI-931 -aa(lp11091 -g15 -aI380 -aI-965 -aI285 -aI-958 -aI328 -aI-965 -aa(lp11092 -g15 -aI491 -aI-947 -aI421 -aI-965 -aI458 -aI-959 -aa(lp11093 -g15 -aI573 -aI-899 -aI524 -aI-936 -aI551 -aI-920 -aa(lp11094 -g15 -aI625 -aI-827 -aI596 -aI-879 -aI613 -aI-855 -aa(lp11095 -g15 -aI642 -aI-735 -aI636 -aI-799 -aI642 -aI-768 -aa(lp11096 -g15 -aI629 -aI-658 -aI642 -aI-706 -aI638 -aI-680 -aa(lp11097 -g15 -aI593 -aI-598 -aI620 -aI-636 -aI608 -aI-616 -aa(lp11098 -g15 -aI536 -aI-551 -aI577 -aI-581 -aI558 -aI-565 -aa(lp11099 -g15 -aI462 -aI-509 -aI514 -aI-537 -aI489 -aI-523 -aa(lp11100 -g15 -aI553 -aI-459 -aI495 -aI-494 -aI525 -aI-477 -aa(lp11101 -g15 -aI623 -aI-401 -aI580 -aI-442 -aI603 -aI-422 -aa(lp11102 -g15 -aI668 -aI-334 -aI642 -aI-381 -aI657 -aI-358 -aa(lp11103 -g15 -aI684 -aI-254 -aI678 -aI-309 -aI684 -aI-283 -aa(lp11104 -g15 -aI661 -aI-141 -aI684 -aI-212 -aI676 -aI-174 -aa(lp11105 -g15 -aI597 -aI-56 -aI646 -aI-107 -aI624 -aI-79 -aa(lp11106 -g15 -aI496 -aI-4 -aI569 -aI-33 -aI535 -aI-16 -aa(lp11107 -g15 -aI363 -aI13 -aI456 -aI7 -aI412 -aI13 -aa(lp11108 -g15 -aI232 -aI-6 -aI314 -aI13 -aI270 -aI6 -aa(lp11109 -g15 -aI137 -aI-59 -aI194 -aI-19 -aI163 -aI-36 -aa(lp11110 -g15 -aI80 -aI-139 -aI112 -aI-82 -aI93 -aI-109 -aa(lp11111 -g15 -aI61 -aI-238 -aI67 -aI-170 -aI61 -aI-203 -aa(lp11112 -g10 -aa(lp11113 -g8 -aI370 -aI-47 -aa(lp11114 -g15 -aI449 -aI-61 -aI399 -aI-47 -aI425 -aI-52 -aa(lp11115 -g15 -aI510 -aI-97 -aI473 -aI-69 -aI493 -aI-82 -aa(lp11116 -g15 -aI548 -aI-153 -aI526 -aI-113 -aI539 -aI-132 -aa(lp11117 -g15 -aI562 -aI-224 -aI557 -aI-175 -aI562 -aI-199 -aa(lp11118 -g15 -aI550 -aI-287 -aI562 -aI-247 -aI558 -aI-268 -aa(lp11119 -g15 -aI509 -aI-343 -aI541 -aI-306 -aI528 -aI-325 -aa(lp11120 -g15 -aI437 -aI-396 -aI491 -aI-361 -aI466 -aI-379 -aa(lp11121 -g15 -aI328 -aI-450 -aI407 -aI-413 -aI371 -aI-431 -aa(lp11122 -g15 -aI227 -aI-362 -aI286 -aI-427 -aI252 -aI-398 -aa(lp11123 -g15 -aI190 -aI-232 -aI203 -aI-326 -aI190 -aI-282 -aa(lp11124 -g15 -aI202 -aI-157 -aI190 -aI-204 -aI194 -aI-179 -aa(lp11125 -g15 -aI236 -aI-98 -aI209 -aI-134 -aI221 -aI-115 -aa(lp11126 -g15 -aI292 -aI-61 -aI250 -aI-82 -aI269 -aI-69 -aa(lp11127 -g15 -aI370 -aI-47 -aI314 -aI-52 -aI340 -aI-47 -aa(lp11128 -g10 -aa(lp11129 -g8 -aI524 -aI-738 -aa(lp11130 -g15 -aI515 -aI-798 -aI524 -aI-758 -aI521 -aI-778 -aa(lp11131 -g15 -aI489 -aI-850 -aI510 -aI-817 -aI501 -aI-835 -aa(lp11132 -g15 -aI443 -aI-887 -aI477 -aI-866 -aI462 -aI-878 -aa(lp11133 -g15 -aI371 -aI-901 -aI423 -aI-897 -aI399 -aI-901 -aa(lp11134 -g15 -aI305 -aI-889 -aI347 -aI-901 -aI324 -aI-897 -aa(lp11135 -g15 -aI257 -aI-856 -aI286 -aI-881 -aI270 -aI-870 -aa(lp11136 -g15 -aI227 -aI-806 -aI244 -aI-842 -aI234 -aI-825 -aa(lp11137 -g15 -aI217 -aI-742 -aI220 -aI-786 -aI217 -aI-765 -aa(lp11138 -g15 -aI228 -aI-677 -aI217 -aI-718 -aI221 -aI-697 -aa(lp11139 -g15 -aI262 -aI-625 -aI236 -aI-658 -aI247 -aI-641 -aa(lp11140 -g15 -aI319 -aI-581 -aI277 -aI-610 -aI296 -aI-595 -aa(lp11141 -g15 -aI397 -aI-540 -aI341 -aI-568 -aI367 -aI-554 -aa(lp11142 -g15 -aI459 -aI-579 -aI422 -aI-553 -aI443 -aI-566 -aa(lp11143 -g15 -aI498 -aI-622 -aI475 -aI-592 -aI488 -aI-607 -aa(lp11144 -g15 -aI518 -aI-675 -aI507 -aI-638 -aI514 -aI-656 -aa(lp11145 -g15 -aI524 -aI-738 -aI522 -aI-693 -aI524 -aI-715 -aa(lp11146 -g10 -aa(lp11147 -g8 -aI745 -aI0 -aa(lp11148 -g10 -aa(lp11149 -g8 -aI745 -aI0 -aasV< -(lp11150 -(lp11151 -g8 -aI86 -aI-452 -aa(lp11152 -g20 -aI86 -aI-499 -aa(lp11153 -g20 -aI658 -aI-807 -aa(lp11154 -g20 -aI658 -aI-718 -aa(lp11155 -g20 -aI210 -aI-475 -aa(lp11156 -g20 -aI658 -aI-235 -aa(lp11157 -g20 -aI658 -aI-146 -aa(lp11158 -g10 -aa(lp11159 -g8 -aI745 -aI0 -aa(lp11160 -g10 -aa(lp11161 -g8 -aI745 -aI0 -aasV@ -(lp11162 -(lp11163 -g8 -aI1157 -aI-522 -aa(lp11164 -g15 -aI1134 -aI-348 -aI1157 -aI-458 -aI1149 -aI-400 -aa(lp11165 -g15 -aI1072 -aI-215 -aI1118 -aI-296 -aI1098 -aI-252 -aa(lp11166 -g15 -aI988 -aI-131 -aI1047 -aI-179 -aI1019 -aI-151 -aa(lp11167 -g15 -aI895 -aI-102 -aI957 -aI-112 -aI926 -aI-102 -aa(lp11168 -g15 -aI797 -aI-134 -aI856 -aI-102 -aI823 -aI-113 -aa(lp11169 -g15 -aI738 -aI-223 -aI770 -aI-155 -aI751 -aI-185 -aa(lp11170 -g20 -aI731 -aI-223 -aa(lp11171 -g15 -aI700 -aI-175 -aI722 -aI-206 -aI712 -aI-190 -aa(lp11172 -g15 -aI661 -aI-136 -aI689 -aI-160 -aI676 -aI-147 -aa(lp11173 -g15 -aI612 -aI-111 -aI647 -aI-126 -aI630 -aI-117 -aa(lp11174 -g15 -aI552 -aI-102 -aI594 -aI-105 -aI574 -aI-102 -aa(lp11175 -g15 -aI474 -aI-116 -aI525 -aI-102 -aI499 -aI-106 -aa(lp11176 -g15 -aI410 -aI-157 -aI450 -aI-125 -aI428 -aI-139 -aa(lp11177 -g15 -aI366 -aI-228 -aI392 -aI-176 -aI377 -aI-200 -aa(lp11178 -g15 -aI349 -aI-330 -aI355 -aI-257 -aI349 -aI-291 -aa(lp11179 -g15 -aI357 -aI-407 -aI349 -aI-354 -aI352 -aI-379 -aa(lp11180 -g15 -aI383 -aI-490 -aI363 -aI-435 -aI371 -aI-463 -aa(lp11181 -g15 -aI427 -aI-570 -aI394 -aI-518 -aI409 -aI-545 -aa(lp11182 -g15 -aI492 -aI-639 -aI445 -aI-596 -aI467 -aI-619 -aa(lp11183 -g15 -aI579 -aI-686 -aI517 -aI-658 -aI546 -aI-674 -aa(lp11184 -g15 -aI689 -aI-704 -aI611 -aI-698 -aI648 -aI-704 -aa(lp11185 -g15 -aI763 -aI-692 -aI718 -aI-704 -aI742 -aI-700 -aa(lp11186 -g15 -aI814 -aI-664 -aI783 -aI-685 -aI800 -aI-675 -aa(lp11187 -g20 -aI867 -aI-692 -aa(lp11188 -g20 -aI899 -aI-692 -aa(lp11189 -g20 -aI832 -aI-353 -aa(lp11190 -g15 -aI827 -aI-321 -aI830 -aI-342 -aI829 -aI-332 -aa(lp11191 -g15 -aI824 -aI-293 -aI826 -aI-313 -aI825 -aI-303 -aa(lp11192 -g15 -aI822 -aI-263 -aI823 -aI-282 -aI822 -aI-272 -aa(lp11193 -g15 -aI829 -aI-223 -aI822 -aI-248 -aI825 -aI-234 -aa(lp11194 -g15 -aI847 -aI-194 -aI834 -aI-211 -aI840 -aI-202 -aa(lp11195 -g15 -aI873 -aI-177 -aI855 -aI-186 -aI863 -aI-181 -aa(lp11196 -g15 -aI904 -aI-172 -aI883 -aI-174 -aI893 -aI-172 -aa(lp11197 -g15 -aI964 -aI-196 -aI923 -aI-172 -aI943 -aI-180 -aa(lp11198 -g15 -aI1019 -aI-264 -aI984 -aI-211 -aI1003 -aI-234 -aa(lp11199 -g15 -aI1060 -aI-375 -aI1036 -aI-295 -aI1049 -aI-332 -aa(lp11200 -g15 -aI1076 -aI-526 -aI1070 -aI-419 -aI1076 -aI-469 -aa(lp11201 -g15 -aI1048 -aI-680 -aI1076 -aI-584 -aI1066 -aI-635 -aa(lp11202 -g15 -aI970 -aI-792 -aI1029 -aI-724 -aI1003 -aI-762 -aa(lp11203 -g15 -aI851 -aI-860 -aI937 -aI-822 -aI897 -aI-845 -aa(lp11204 -g15 -aI698 -aI-883 -aI805 -aI-875 -aI754 -aI-883 -aa(lp11205 -g15 -aI570 -aI-865 -aI655 -aI-883 -aI612 -aI-877 -aa(lp11206 -g15 -aI451 -aI-811 -aI528 -aI-853 -aI489 -aI-835 -aa(lp11207 -g15 -aI347 -aI-725 -aI414 -aI-788 -aI379 -aI-759 -aa(lp11208 -g15 -aI265 -aI-608 -aI316 -aI-691 -aI288 -aI-652 -aa(lp11209 -g15 -aI211 -aI-463 -aI242 -aI-564 -aI224 -aI-516 -aa(lp11210 -g15 -aI192 -aI-293 -aI198 -aI-410 -aI192 -aI-353 -aa(lp11211 -g15 -aI223 -aI-103 -aI192 -aI-218 -aI202 -aI-155 -aa(lp11212 -g15 -aI310 -aI24 -aI245 -aI-51 -aI273 -aI-8 -aa(lp11213 -g15 -aI436 -aI97 -aI346 -aI58 -aI388 -aI82 -aa(lp11214 -g15 -aI589 -aI120 -aI484 -aI112 -aI535 -aI120 -aa(lp11215 -g15 -aI692 -aI110 -aI625 -aI120 -aI660 -aI117 -aa(lp11216 -g15 -aI784 -aI85 -aI725 -aI104 -aI755 -aI96 -aa(lp11217 -g15 -aI862 -aI50 -aI812 -aI75 -aI838 -aI63 -aa(lp11218 -g15 -aI927 -aI9 -aI887 -aI37 -aI908 -aI23 -aa(lp11219 -g20 -aI958 -aI57 -aa(lp11220 -g15 -aI884 -aI106 -aI936 -aI74 -aI912 -aI90 -aa(lp11221 -g15 -aI795 -aI148 -aI857 -aI122 -aI827 -aI136 -aa(lp11222 -g15 -aI693 -aI178 -aI763 -aI160 -aI729 -aI170 -aa(lp11223 -g15 -aI576 -aI189 -aI656 -aI186 -aI617 -aI189 -aa(lp11224 -g15 -aI378 -aI160 -aI504 -aI189 -aI438 -aI180 -aa(lp11225 -g15 -aI224 -aI70 -aI319 -aI140 -aI267 -aI110 -aa(lp11226 -g15 -aI123 -aI-78 -aI181 -aI30 -aI147 -aI-19 -aa(lp11227 -g15 -aI86 -aI-289 -aI98 -aI-138 -aI86 -aI-209 -aa(lp11228 -g15 -aI107 -aI-469 -aI86 -aI-352 -aI93 -aI-412 -aa(lp11229 -g15 -aI166 -aI-629 -aI120 -aI-526 -aI140 -aI-580 -aa(lp11230 -g15 -aI260 -aI-762 -aI192 -aI-678 -aI223 -aI-722 -aa(lp11231 -g15 -aI384 -aI-863 -aI296 -aI-801 -aI338 -aI-835 -aa(lp11232 -g15 -aI534 -aI-928 -aI430 -aI-891 -aI480 -aI-913 -aa(lp11233 -g15 -aI706 -aI-951 -aI588 -aI-943 -aI645 -aI-951 -aa(lp11234 -g15 -aI902 -aI-918 -aI781 -aI-951 -aI846 -aI-940 -aa(lp11235 -g15 -aI1044 -aI-827 -aI959 -aI-896 -aI1006 -aI-865 -aa(lp11236 -g15 -aI1129 -aI-691 -aI1082 -aI-788 -aI1110 -aI-743 -aa(lp11237 -g15 -aI1157 -aI-522 -aI1148 -aI-638 -aI1157 -aI-582 -aa(lp11238 -g10 -aa(lp11239 -g8 -aI473 -aI-311 -aa(lp11240 -g15 -aI501 -aI-206 -aI473 -aI-264 -aI482 -aI-229 -aa(lp11241 -g15 -aI574 -aI-172 -aI520 -aI-184 -aI544 -aI-172 -aa(lp11242 -g15 -aI633 -aI-187 -aI597 -aI-172 -aI616 -aI-177 -aa(lp11243 -g15 -aI675 -aI-225 -aI649 -aI-197 -aI663 -aI-209 -aa(lp11244 -g15 -aI702 -aI-278 -aI686 -aI-241 -aI695 -aI-258 -aa(lp11245 -g15 -aI718 -aI-339 -aI709 -aI-298 -aI714 -aI-318 -aa(lp11246 -g20 -aI769 -aI-610 -aa(lp11247 -g15 -aI739 -aI-639 -aI763 -aI-622 -aI754 -aI-632 -aa(lp11248 -g15 -aI694 -aI-649 -aI725 -aI-646 -aI710 -aI-649 -aa(lp11249 -g15 -aI622 -aI-632 -aI668 -aI-649 -aI644 -aI-644 -aa(lp11250 -g15 -aI566 -aI-587 -aI601 -aI-621 -aI582 -aI-606 -aa(lp11251 -g15 -aI524 -aI-523 -aI549 -aI-568 -aI535 -aI-547 -aa(lp11252 -g15 -aI495 -aI-449 -aI512 -aI-499 -aI502 -aI-474 -aa(lp11253 -g15 -aI478 -aI-375 -aI487 -aI-424 -aI481 -aI-399 -aa(lp11254 -g15 -aI473 -aI-311 -aI475 -aI-351 -aI473 -aI-330 -aa(lp11255 -g10 -aa(lp11256 -g8 -aI1227 -aI0 -aa(lp11257 -g10 -aa(lp11258 -g8 -aI1227 -aI0 -aasVD -(lp11259 -(lp11260 -g8 -aI893 -aI-476 -aa(lp11261 -g15 -aI865 -aI-279 -aI893 -aI-403 -aI884 -aI-337 -aa(lp11262 -g15 -aI784 -aI-128 -aI847 -aI-220 -aI820 -aI-170 -aa(lp11263 -g15 -aI649 -aI-33 -aI748 -aI-87 -aI703 -aI-55 -aa(lp11264 -g15 -aI458 -aI0 -aI594 -aI-10 -aI531 -aI0 -aa(lp11265 -g20 -aI50 -aI0 -aa(lp11266 -g20 -aI50 -aI-55 -aa(lp11267 -g20 -aI67 -aI-55 -aa(lp11268 -g15 -aI110 -aI-58 -aI82 -aI-55 -aI97 -aI-56 -aa(lp11269 -g15 -aI145 -aI-72 -aI123 -aI-60 -aI135 -aI-65 -aa(lp11270 -g15 -aI168 -aI-101 -aI155 -aI-78 -aI162 -aI-88 -aa(lp11271 -g15 -aI177 -aI-151 -aI174 -aI-113 -aI177 -aI-130 -aa(lp11272 -g20 -aI177 -aI-804 -aa(lp11273 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp11274 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp11275 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp11276 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp11277 -g20 -aI50 -aI-895 -aa(lp11278 -g20 -aI50 -aI-951 -aa(lp11279 -g20 -aI458 -aI-951 -aa(lp11280 -g15 -aI642 -aI-919 -aI527 -aI-951 -aI588 -aI-940 -aa(lp11281 -g15 -aI778 -aI-827 -aI696 -aI-898 -aI741 -aI-868 -aa(lp11282 -g15 -aI863 -aI-678 -aI816 -aI-787 -aI844 -aI-737 -aa(lp11283 -g15 -aI893 -aI-476 -aI883 -aI-619 -aI893 -aI-552 -aa(lp11284 -g10 -aa(lp11285 -g8 -aI427 -aI-67 -aa(lp11286 -g15 -aI566 -aI-94 -aI480 -aI-67 -aI527 -aI-76 -aa(lp11287 -g15 -aI666 -aI-173 -aI606 -aI-112 -aI639 -aI-138 -aa(lp11288 -g15 -aI725 -aI-301 -aI692 -aI-208 -aI712 -aI-250 -aa(lp11289 -g15 -aI745 -aI-476 -aI738 -aI-352 -aI745 -aI-410 -aa(lp11290 -g15 -aI666 -aI-780 -aI745 -aI-609 -aI719 -aI-710 -aa(lp11291 -g15 -aI429 -aI-884 -aI613 -aI-850 -aI534 -aI-884 -aa(lp11292 -g20 -aI311 -aI-884 -aa(lp11293 -g20 -aI311 -aI-67 -aa(lp11294 -g10 -aa(lp11295 -g8 -aI969 -aI0 -aa(lp11296 -g10 -aa(lp11297 -g8 -aI969 -aI0 -aasVH -(lp11298 -(lp11299 -g8 -aI618 -aI0 -aa(lp11300 -g20 -aI618 -aI-55 -aa(lp11301 -g20 -aI636 -aI-55 -aa(lp11302 -g15 -aI678 -aI-58 -aI651 -aI-55 -aI665 -aI-56 -aa(lp11303 -g15 -aI713 -aI-72 -aI691 -aI-60 -aI703 -aI-65 -aa(lp11304 -g15 -aI736 -aI-101 -aI722 -aI-78 -aI730 -aI-88 -aa(lp11305 -g15 -aI745 -aI-151 -aI742 -aI-113 -aI745 -aI-130 -aa(lp11306 -g20 -aI745 -aI-463 -aa(lp11307 -g20 -aI311 -aI-463 -aa(lp11308 -g20 -aI311 -aI-151 -aa(lp11309 -g15 -aI320 -aI-101 -aI311 -aI-130 -aI314 -aI-113 -aa(lp11310 -g15 -aI344 -aI-72 -aI326 -aI-88 -aI334 -aI-78 -aa(lp11311 -g15 -aI378 -aI-58 -aI353 -aI-65 -aI365 -aI-60 -aa(lp11312 -g15 -aI421 -aI-55 -aI392 -aI-56 -aI406 -aI-55 -aa(lp11313 -g20 -aI438 -aI-55 -aa(lp11314 -g20 -aI438 -aI0 -aa(lp11315 -g20 -aI50 -aI0 -aa(lp11316 -g20 -aI50 -aI-55 -aa(lp11317 -g20 -aI67 -aI-55 -aa(lp11318 -g15 -aI110 -aI-58 -aI82 -aI-55 -aI97 -aI-56 -aa(lp11319 -g15 -aI145 -aI-72 -aI123 -aI-60 -aI135 -aI-65 -aa(lp11320 -g15 -aI168 -aI-101 -aI155 -aI-78 -aI162 -aI-88 -aa(lp11321 -g15 -aI177 -aI-151 -aI174 -aI-113 -aI177 -aI-130 -aa(lp11322 -g20 -aI177 -aI-804 -aa(lp11323 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp11324 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp11325 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp11326 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp11327 -g20 -aI50 -aI-895 -aa(lp11328 -g20 -aI50 -aI-951 -aa(lp11329 -g20 -aI438 -aI-951 -aa(lp11330 -g20 -aI438 -aI-895 -aa(lp11331 -g20 -aI421 -aI-895 -aa(lp11332 -g15 -aI378 -aI-892 -aI406 -aI-895 -aI392 -aI-894 -aa(lp11333 -g15 -aI344 -aI-878 -aI365 -aI-889 -aI353 -aI-885 -aa(lp11334 -g15 -aI320 -aI-849 -aI334 -aI-872 -aI326 -aI-862 -aa(lp11335 -g15 -aI311 -aI-799 -aI314 -aI-837 -aI311 -aI-820 -aa(lp11336 -g20 -aI311 -aI-530 -aa(lp11337 -g20 -aI745 -aI-530 -aa(lp11338 -g20 -aI745 -aI-799 -aa(lp11339 -g15 -aI736 -aI-849 -aI745 -aI-820 -aI742 -aI-837 -aa(lp11340 -g15 -aI713 -aI-878 -aI730 -aI-862 -aI722 -aI-872 -aa(lp11341 -g15 -aI678 -aI-892 -aI703 -aI-885 -aI691 -aI-889 -aa(lp11342 -g15 -aI636 -aI-895 -aI665 -aI-894 -aI651 -aI-895 -aa(lp11343 -g20 -aI618 -aI-895 -aa(lp11344 -g20 -aI618 -aI-951 -aa(lp11345 -g20 -aI1006 -aI-951 -aa(lp11346 -g20 -aI1006 -aI-895 -aa(lp11347 -g20 -aI989 -aI-895 -aa(lp11348 -g15 -aI946 -aI-892 -aI974 -aI-895 -aI960 -aI-894 -aa(lp11349 -g15 -aI912 -aI-878 -aI933 -aI-889 -aI922 -aI-885 -aa(lp11350 -g15 -aI888 -aI-849 -aI902 -aI-872 -aI894 -aI-862 -aa(lp11351 -g15 -aI880 -aI-799 -aI883 -aI-837 -aI880 -aI-820 -aa(lp11352 -g20 -aI880 -aI-144 -aa(lp11353 -g15 -aI888 -aI-97 -aI880 -aI-125 -aI883 -aI-109 -aa(lp11354 -g15 -aI912 -aI-70 -aI894 -aI-85 -aI902 -aI-76 -aa(lp11355 -g15 -aI947 -aI-58 -aI922 -aI-64 -aI934 -aI-60 -aa(lp11356 -g15 -aI989 -aI-55 -aI960 -aI-56 -aI974 -aI-55 -aa(lp11357 -g20 -aI1006 -aI-55 -aa(lp11358 -g20 -aI1006 -aI0 -aa(lp11359 -g10 -aa(lp11360 -g8 -aI1057 -aI0 -aa(lp11361 -g10 -aa(lp11362 -g8 -aI1057 -aI0 -aasVL -(lp11363 -(lp11364 -g8 -aI50 -aI0 -aa(lp11365 -g20 -aI50 -aI-55 -aa(lp11366 -g20 -aI67 -aI-55 -aa(lp11367 -g15 -aI110 -aI-58 -aI82 -aI-55 -aI97 -aI-56 -aa(lp11368 -g15 -aI145 -aI-72 -aI123 -aI-60 -aI135 -aI-65 -aa(lp11369 -g15 -aI168 -aI-101 -aI155 -aI-78 -aI162 -aI-88 -aa(lp11370 -g15 -aI177 -aI-151 -aI174 -aI-113 -aI177 -aI-130 -aa(lp11371 -g20 -aI177 -aI-799 -aa(lp11372 -g15 -aI168 -aI-849 -aI177 -aI-820 -aI174 -aI-837 -aa(lp11373 -g15 -aI145 -aI-878 -aI162 -aI-862 -aI155 -aI-872 -aa(lp11374 -g15 -aI110 -aI-892 -aI135 -aI-885 -aI123 -aI-889 -aa(lp11375 -g15 -aI67 -aI-895 -aI97 -aI-894 -aI82 -aI-895 -aa(lp11376 -g20 -aI50 -aI-895 -aa(lp11377 -g20 -aI50 -aI-951 -aa(lp11378 -g20 -aI438 -aI-951 -aa(lp11379 -g20 -aI438 -aI-895 -aa(lp11380 -g20 -aI421 -aI-895 -aa(lp11381 -g15 -aI379 -aI-892 -aI406 -aI-895 -aI392 -aI-894 -aa(lp11382 -g15 -aI344 -aI-879 -aI365 -aI-890 -aI354 -aI-886 -aa(lp11383 -g15 -aI320 -aI-852 -aI334 -aI-873 -aI326 -aI-864 -aa(lp11384 -g15 -aI311 -aI-804 -aI314 -aI-840 -aI311 -aI-824 -aa(lp11385 -g20 -aI311 -aI-65 -aa(lp11386 -g20 -aI574 -aI-65 -aa(lp11387 -g15 -aI625 -aI-76 -aI594 -aI-65 -aI611 -aI-69 -aa(lp11388 -g15 -aI660 -aI-104 -aI640 -aI-83 -aI651 -aI-93 -aa(lp11389 -g15 -aI681 -aI-143 -aI669 -aI-116 -aI676 -aI-129 -aa(lp11390 -g15 -aI692 -aI-186 -aI686 -aI-157 -aI690 -aI-172 -aa(lp11391 -g20 -aI705 -aI-286 -aa(lp11392 -g20 -aI774 -aI-286 -aa(lp11393 -g20 -aI765 -aI0 -aa(lp11394 -g10 -aa(lp11395 -g8 -aI830 -aI0 -aa(lp11396 -g10 -aa(lp11397 -g8 -aI830 -aI0 -aasVP -(lp11398 -(lp11399 -g8 -aI50 -aI0 -aa(lp11400 -g20 -aI50 -aI-55 -aa(lp11401 -g20 -aI67 -aI-55 -aa(lp11402 -g15 -aI110 -aI-58 -aI82 -aI-55 -aI97 -aI-56 -aa(lp11403 -g15 -aI145 -aI-72 -aI123 -aI-60 -aI135 -aI-65 -aa(lp11404 -g15 -aI168 -aI-101 -aI155 -aI-78 -aI162 -aI-88 -aa(lp11405 -g15 -aI177 -aI-151 -aI174 -aI-113 -aI177 -aI-130 -aa(lp11406 -g20 -aI177 -aI-804 -aa(lp11407 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp11408 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp11409 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp11410 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp11411 -g20 -aI50 -aI-895 -aa(lp11412 -g20 -aI50 -aI-951 -aa(lp11413 -g20 -aI425 -aI-951 -aa(lp11414 -g15 -aI570 -aI-932 -aI481 -aI-951 -aI529 -aI-944 -aa(lp11415 -g15 -aI673 -aI-876 -aI612 -aI-919 -aI646 -aI-900 -aa(lp11416 -g15 -aI733 -aI-789 -aI700 -aI-852 -aI720 -aI-823 -aa(lp11417 -g15 -aI753 -aI-672 -aI746 -aI-754 -aI753 -aI-716 -aa(lp11418 -g15 -aI734 -aI-558 -aI753 -aI-633 -aI747 -aI-595 -aa(lp11419 -g15 -aI673 -aI-462 -aI722 -aI-522 -aI702 -aI-490 -aa(lp11420 -g15 -aI563 -aI-395 -aI645 -aI-434 -aI608 -aI-411 -aa(lp11421 -g15 -aI395 -aI-369 -aI517 -aI-378 -aI461 -aI-369 -aa(lp11422 -g20 -aI311 -aI-369 -aa(lp11423 -g20 -aI311 -aI-144 -aa(lp11424 -g15 -aI320 -aI-97 -aI311 -aI-125 -aI314 -aI-109 -aa(lp11425 -g15 -aI344 -aI-70 -aI326 -aI-85 -aI334 -aI-76 -aa(lp11426 -g15 -aI379 -aI-58 -aI354 -aI-64 -aI365 -aI-60 -aa(lp11427 -g15 -aI421 -aI-55 -aI392 -aI-56 -aI406 -aI-55 -aa(lp11428 -g20 -aI465 -aI-55 -aa(lp11429 -g20 -aI465 -aI0 -aa(lp11430 -g10 -aa(lp11431 -g8 -aI311 -aI-433 -aa(lp11432 -g20 -aI382 -aI-433 -aa(lp11433 -g15 -aI486 -aI-445 -aI423 -aI-433 -aI457 -aI-437 -aa(lp11434 -g15 -aI556 -aI-486 -aI514 -aI-454 -aI538 -aI-467 -aa(lp11435 -g15 -aI596 -aI-559 -aI574 -aI-505 -aI588 -aI-530 -aa(lp11436 -g15 -aI609 -aI-667 -aI605 -aI-589 -aI609 -aI-625 -aa(lp11437 -g15 -aI598 -aI-764 -aI609 -aI-704 -aI605 -aI-737 -aa(lp11438 -g15 -aI562 -aI-833 -aI590 -aI-792 -aI578 -aI-815 -aa(lp11439 -g15 -aI498 -aI-874 -aI546 -aI-851 -aI524 -aI-865 -aa(lp11440 -g15 -aI402 -aI-887 -aI472 -aI-883 -aI440 -aI-887 -aa(lp11441 -g20 -aI311 -aI-887 -aa(lp11442 -g10 -aa(lp11443 -g8 -aI805 -aI0 -aa(lp11444 -g10 -aa(lp11445 -g8 -aI805 -aI0 -aasVT -(lp11446 -(lp11447 -g8 -aI474 -aI-151 -aa(lp11448 -g15 -aI483 -aI-101 -aI474 -aI-130 -aI477 -aI-113 -aa(lp11449 -g15 -aI506 -aI-72 -aI489 -aI-88 -aI497 -aI-78 -aa(lp11450 -g15 -aI541 -aI-58 -aI516 -aI-65 -aI528 -aI-60 -aa(lp11451 -g15 -aI583 -aI-55 -aI555 -aI-56 -aI569 -aI-55 -aa(lp11452 -g20 -aI614 -aI-55 -aa(lp11453 -g20 -aI614 -aI0 -aa(lp11454 -g20 -aI199 -aI0 -aa(lp11455 -g20 -aI199 -aI-55 -aa(lp11456 -g20 -aI230 -aI-55 -aa(lp11457 -g15 -aI272 -aI-58 -aI245 -aI-55 -aI259 -aI-56 -aa(lp11458 -g15 -aI307 -aI-70 -aI285 -aI-60 -aI297 -aI-64 -aa(lp11459 -g15 -aI331 -aI-97 -aI317 -aI-76 -aI325 -aI-85 -aa(lp11460 -g15 -aI339 -aI-144 -aI336 -aI-109 -aI339 -aI-125 -aa(lp11461 -g20 -aI339 -aI-884 -aa(lp11462 -g20 -aI212 -aI-884 -aa(lp11463 -g15 -aI163 -aI-876 -aI192 -aI-884 -aI176 -aI-882 -aa(lp11464 -g15 -aI130 -aI-852 -aI149 -aI-870 -aI138 -aI-862 -aa(lp11465 -g15 -aI111 -aI-817 -aI122 -aI-842 -aI115 -aI-830 -aa(lp11466 -g15 -aI102 -aI-775 -aI107 -aI-804 -aI104 -aI-790 -aa(lp11467 -g20 -aI95 -aI-718 -aa(lp11468 -g20 -aI26 -aI-718 -aa(lp11469 -g20 -aI33 -aI-951 -aa(lp11470 -g20 -aI783 -aI-951 -aa(lp11471 -g20 -aI790 -aI-718 -aa(lp11472 -g20 -aI721 -aI-718 -aa(lp11473 -g20 -aI714 -aI-775 -aa(lp11474 -g15 -aI705 -aI-817 -aI713 -aI-790 -aI710 -aI-804 -aa(lp11475 -g15 -aI686 -aI-852 -aI701 -aI-830 -aI695 -aI-842 -aa(lp11476 -g15 -aI654 -aI-876 -aI678 -aI-862 -aI667 -aI-870 -aa(lp11477 -g15 -aI604 -aI-884 -aI640 -aI-882 -aI624 -aI-884 -aa(lp11478 -g20 -aI474 -aI-884 -aa(lp11479 -g10 -aa(lp11480 -g8 -aI817 -aI0 -aa(lp11481 -g10 -aa(lp11482 -g8 -aI817 -aI0 -aasVX -(lp11483 -(lp11484 -g8 -aI621 -aI-856 -aa(lp11485 -g15 -aI615 -aI-876 -aI621 -aI-864 -aI619 -aI-871 -aa(lp11486 -g15 -aI600 -aI-887 -aI611 -aI-881 -aI606 -aI-885 -aa(lp11487 -g15 -aI578 -aI-893 -aI594 -aI-890 -aI586 -aI-892 -aa(lp11488 -g15 -aI549 -aI-895 -aI569 -aI-894 -aI559 -aI-895 -aa(lp11489 -g20 -aI545 -aI-895 -aa(lp11490 -g20 -aI545 -aI-951 -aa(lp11491 -g20 -aI837 -aI-951 -aa(lp11492 -g20 -aI837 -aI-895 -aa(lp11493 -g20 -aI825 -aI-895 -aa(lp11494 -g15 -aI790 -aI-890 -aI812 -aI-895 -aI800 -aI-893 -aa(lp11495 -g15 -aI759 -aI-874 -aI779 -aI-887 -aI769 -aI-882 -aa(lp11496 -g15 -aI728 -aI-845 -aI749 -aI-867 -aI738 -aI-857 -aa(lp11497 -g15 -aI693 -aI-799 -aI717 -aI-833 -aI705 -aI-817 -aa(lp11498 -g20 -aI500 -aI-521 -aa(lp11499 -g20 -aI745 -aI-126 -aa(lp11500 -g15 -aI800 -aI-71 -aI764 -aI-100 -aI783 -aI-82 -aa(lp11501 -g15 -aI852 -aI-55 -aI818 -aI-60 -aI835 -aI-55 -aa(lp11502 -g20 -aI869 -aI-55 -aa(lp11503 -g20 -aI869 -aI0 -aa(lp11504 -g20 -aI509 -aI0 -aa(lp11505 -g20 -aI509 -aI-55 -aa(lp11506 -g20 -aI516 -aI-55 -aa(lp11507 -g15 -aI595 -aI-99 -aI569 -aI-55 -aI595 -aI-70 -aa(lp11508 -g15 -aI594 -aI-114 -aI595 -aI-104 -aI595 -aI-109 -aa(lp11509 -g15 -aI587 -aI-131 -aI592 -aI-118 -aI590 -aI-124 -aa(lp11510 -g15 -aI574 -aI-155 -aI584 -aI-137 -aI580 -aI-145 -aa(lp11511 -g15 -aI552 -aI-191 -aI568 -aI-164 -aI561 -aI-176 -aa(lp11512 -g20 -aI419 -aI-403 -aa(lp11513 -g20 -aI272 -aI-185 -aa(lp11514 -g15 -aI260 -aI-165 -aI268 -aI-179 -aI264 -aI-173 -aa(lp11515 -g15 -aI249 -aI-143 -aI256 -aI-158 -aI252 -aI-151 -aa(lp11516 -g15 -aI240 -aI-119 -aI245 -aI-135 -aI243 -aI-127 -aa(lp11517 -g15 -aI237 -aI-97 -aI238 -aI-111 -aI237 -aI-104 -aa(lp11518 -g15 -aI258 -aI-64 -aI237 -aI-82 -aI244 -aI-71 -aa(lp11519 -g15 -aI324 -aI-55 -aI272 -aI-58 -aI294 -aI-55 -aa(lp11520 -g20 -aI328 -aI-55 -aa(lp11521 -g20 -aI328 -aI0 -aa(lp11522 -g20 -aI10 -aI0 -aa(lp11523 -g20 -aI10 -aI-55 -aa(lp11524 -g20 -aI18 -aI-55 -aa(lp11525 -g15 -aI60 -aI-60 -aI34 -aI-55 -aI48 -aI-57 -aa(lp11526 -g15 -aI94 -aI-76 -aI72 -aI-63 -aI83 -aI-68 -aa(lp11527 -g15 -aI124 -aI-105 -aI104 -aI-83 -aI114 -aI-93 -aa(lp11528 -g15 -aI157 -aI-148 -aI134 -aI-116 -aI145 -aI-131 -aa(lp11529 -g20 -aI380 -aI-467 -aa(lp11530 -g20 -aI160 -aI-825 -aa(lp11531 -g15 -aI105 -aI-879 -aI144 -aI-850 -aI125 -aI-868 -aa(lp11532 -g15 -aI45 -aI-895 -aI85 -aI-890 -aI65 -aI-895 -aa(lp11533 -g20 -aI27 -aI-895 -aa(lp11534 -g20 -aI27 -aI-951 -aa(lp11535 -g20 -aI389 -aI-951 -aa(lp11536 -g20 -aI389 -aI-895 -aa(lp11537 -g20 -aI385 -aI-895 -aa(lp11538 -g15 -aI347 -aI-892 -aI370 -aI-895 -aI357 -aI-894 -aa(lp11539 -g15 -aI324 -aI-884 -aI337 -aI-890 -aI329 -aI-887 -aa(lp11540 -g15 -aI312 -aI-871 -aI318 -aI-880 -aI314 -aI-876 -aa(lp11541 -g15 -aI309 -aI-856 -aI310 -aI-867 -aI309 -aI-862 -aa(lp11542 -g15 -aI310 -aI-843 -aI309 -aI-852 -aI309 -aI-847 -aa(lp11543 -g15 -aI314 -aI-827 -aI310 -aI-838 -aI312 -aI-833 -aa(lp11544 -g15 -aI323 -aI-807 -aI316 -aI-822 -aI319 -aI-815 -aa(lp11545 -g15 -aI341 -aI-778 -aI328 -aI-799 -aI333 -aI-789 -aa(lp11546 -g20 -aI461 -aI-583 -aa(lp11547 -g20 -aI587 -aI-775 -aa(lp11548 -g15 -aI611 -aI-818 -aI597 -aI-790 -aI605 -aI-805 -aa(lp11549 -g15 -aI621 -aI-856 -aI618 -aI-832 -aI621 -aI-844 -aa(lp11550 -g10 -aa(lp11551 -g8 -aI880 -aI0 -aa(lp11552 -g10 -aa(lp11553 -g8 -aI880 -aI0 -aasV\u005C -(lp11554 -(lp11555 -g8 -aI0 -aI-1012 -aa(lp11556 -g20 -aI77 -aI-1012 -aa(lp11557 -g20 -aI384 -aI161 -aa(lp11558 -g20 -aI305 -aI161 -aa(lp11559 -g10 -aa(lp11560 -g8 -aI384 -aI0 -aa(lp11561 -g10 -aa(lp11562 -g8 -aI384 -aI0 -aasV` -(lp11563 -(lp11564 -g8 -aI514 -aI-807 -aa(lp11565 -g20 -aI464 -aI-807 -aa(lp11566 -g15 -aI406 -aI-852 -aI446 -aI-819 -aI427 -aI-834 -aa(lp11567 -g15 -aI345 -aI-908 -aI385 -aI-870 -aI365 -aI-889 -aa(lp11568 -g15 -aI292 -aI-963 -aI326 -aI-927 -aI308 -aI-945 -aa(lp11569 -g15 -aI255 -aI-1007 -aI276 -aI-980 -aI264 -aI-995 -aa(lp11570 -g20 -aI255 -aI-1021 -aa(lp11571 -g20 -aI398 -aI-1021 -aa(lp11572 -g15 -aI422 -aI-972 -aI405 -aI-1006 -aI413 -aI-990 -aa(lp11573 -g15 -aI452 -aI-919 -aI432 -aI-954 -aI442 -aI-937 -aa(lp11574 -g15 -aI484 -aI-868 -aI462 -aI-902 -aI473 -aI-885 -aa(lp11575 -g15 -aI514 -aI-825 -aI495 -aI-852 -aI505 -aI-837 -aa(lp11576 -g10 -aa(lp11577 -g8 -aI769 -aI0 -aa(lp11578 -g10 -aa(lp11579 -g8 -aI769 -aI0 -aasVd -(lp11580 -(lp11581 -g8 -aI674 -aI-146 -aa(lp11582 -g15 -aI683 -aI-98 -aI674 -aI-126 -aI677 -aI-110 -aa(lp11583 -g15 -aI707 -aI-71 -aI689 -aI-86 -aI697 -aI-77 -aa(lp11584 -g15 -aI741 -aI-58 -aI717 -aI-64 -aI728 -aI-60 -aa(lp11585 -g15 -aI783 -aI-55 -aI755 -aI-56 -aI769 -aI-55 -aa(lp11586 -g20 -aI794 -aI-55 -aa(lp11587 -g20 -aI794 -aI0 -aa(lp11588 -g20 -aI569 -aI0 -aa(lp11589 -g20 -aI554 -aI-119 -aa(lp11590 -g20 -aI549 -aI-119 -aa(lp11591 -g15 -aI515 -aI-64 -aI539 -aI-98 -aI528 -aI-80 -aa(lp11592 -g15 -aI471 -aI-22 -aI502 -aI-48 -aI487 -aI-34 -aa(lp11593 -g15 -aI415 -aI4 -aI454 -aI-11 -aI436 -aI-2 -aa(lp11594 -g15 -aI345 -aI13 -aI394 -aI10 -aI371 -aI13 -aa(lp11595 -g15 -aI228 -aI-8 -aI301 -aI13 -aI262 -aI6 -aa(lp11596 -g15 -aI143 -aI-75 -aI194 -aI-22 -aI166 -aI-45 -aa(lp11597 -g15 -aI91 -aI-190 -aI120 -aI-105 -aI102 -aI-143 -aa(lp11598 -g15 -aI73 -aI-355 -aI79 -aI-236 -aI73 -aI-291 -aa(lp11599 -g15 -aI91 -aI-522 -aI73 -aI-419 -aI79 -aI-475 -aa(lp11600 -g15 -aI143 -aI-638 -aI102 -aI-569 -aI120 -aI-607 -aa(lp11601 -g15 -aI228 -aI-705 -aI166 -aI-668 -aI194 -aI-691 -aa(lp11602 -g15 -aI345 -aI-727 -aI262 -aI-720 -aI301 -aI-727 -aa(lp11603 -g15 -aI414 -aI-718 -aI370 -aI-727 -aI393 -aI-724 -aa(lp11604 -g15 -aI471 -aI-694 -aI435 -aI-713 -aI454 -aI-705 -aa(lp11605 -g15 -aI515 -aI-657 -aI487 -aI-684 -aI502 -aI-672 -aa(lp11606 -g15 -aI549 -aI-610 -aI528 -aI-643 -aI539 -aI-627 -aa(lp11607 -g20 -aI557 -aI-610 -aa(lp11608 -g15 -aI553 -aI-671 -aI555 -aI-631 -aI554 -aI-652 -aa(lp11609 -g15 -aI550 -aI-720 -aI552 -aI-687 -aI551 -aI-704 -aa(lp11610 -g15 -aI549 -aI-756 -aI549 -aI-736 -aI549 -aI-748 -aa(lp11611 -g20 -aI549 -aI-866 -aa(lp11612 -g15 -aI540 -aI-913 -aI549 -aI-885 -aI546 -aI-901 -aa(lp11613 -g15 -aI516 -aI-940 -aI534 -aI-925 -aI526 -aI-934 -aa(lp11614 -g15 -aI482 -aI-953 -aI506 -aI-947 -aI495 -aI-951 -aa(lp11615 -g15 -aI440 -aI-956 -aI468 -aI-955 -aI454 -aI-956 -aa(lp11616 -g20 -aI429 -aI-956 -aa(lp11617 -g20 -aI429 -aI-1012 -aa(lp11618 -g20 -aI674 -aI-1012 -aa(lp11619 -g10 -aa(lp11620 -g8 -aI367 -aI-71 -aa(lp11621 -g15 -aI454 -aI-89 -aI402 -aI-71 -aI431 -aI-77 -aa(lp11622 -g15 -aI510 -aI-141 -aI477 -aI-100 -aI496 -aI-118 -aa(lp11623 -g15 -aI540 -aI-230 -aI524 -aI-164 -aI534 -aI-194 -aa(lp11624 -g15 -aI549 -aI-355 -aI546 -aI-265 -aI549 -aI-307 -aa(lp11625 -g15 -aI540 -aI-478 -aI549 -aI-402 -aI546 -aI-443 -aa(lp11626 -g15 -aI510 -aI-568 -aI534 -aI-514 -aI524 -aI-544 -aa(lp11627 -g15 -aI454 -aI-623 -aI496 -aI-592 -aI477 -aI-610 -aa(lp11628 -g15 -aI366 -aI-642 -aI430 -aI-635 -aI401 -aI-642 -aa(lp11629 -g15 -aI291 -aI-623 -aI337 -aI-642 -aI312 -aI-635 -aa(lp11630 -g15 -aI240 -aI-567 -aI270 -aI-610 -aI253 -aI-592 -aa(lp11631 -g15 -aI211 -aI-477 -aI227 -aI-543 -aI217 -aI-513 -aa(lp11632 -g15 -aI202 -aI-354 -aI205 -aI-441 -aI202 -aI-400 -aa(lp11633 -g15 -aI240 -aI-142 -aI202 -aI-259 -aI215 -aI-189 -aa(lp11634 -g15 -aI367 -aI-71 -aI266 -aI-95 -aI308 -aI-71 -aa(lp11635 -g10 -aa(lp11636 -g8 -aI818 -aI0 -aa(lp11637 -g10 -aa(lp11638 -g8 -aI818 -aI0 -aasVh -(lp11639 -(lp11640 -g8 -aI382 -aI-55 -aa(lp11641 -g20 -aI382 -aI0 -aa(lp11642 -g20 -aI24 -aI0 -aa(lp11643 -g20 -aI24 -aI-55 -aa(lp11644 -g20 -aI34 -aI-55 -aa(lp11645 -g15 -aI77 -aI-58 -aI49 -aI-55 -aI63 -aI-56 -aa(lp11646 -g15 -aI111 -aI-72 -aI90 -aI-60 -aI101 -aI-65 -aa(lp11647 -g15 -aI135 -aI-101 -aI121 -aI-78 -aI129 -aI-88 -aa(lp11648 -g15 -aI143 -aI-151 -aI140 -aI-113 -aI143 -aI-130 -aa(lp11649 -g20 -aI143 -aI-866 -aa(lp11650 -g15 -aI135 -aI-913 -aI143 -aI-885 -aI140 -aI-901 -aa(lp11651 -g15 -aI111 -aI-940 -aI129 -aI-925 -aI121 -aI-934 -aa(lp11652 -g15 -aI76 -aI-953 -aI101 -aI-947 -aI89 -aI-951 -aa(lp11653 -g15 -aI34 -aI-956 -aI63 -aI-955 -aI49 -aI-956 -aa(lp11654 -g20 -aI24 -aI-956 -aa(lp11655 -g20 -aI24 -aI-1012 -aa(lp11656 -g20 -aI269 -aI-1012 -aa(lp11657 -g20 -aI269 -aI-719 -aa(lp11658 -g15 -aI268 -aI-681 -aI269 -aI-707 -aI269 -aI-694 -aa(lp11659 -g15 -aI266 -aI-644 -aI268 -aI-668 -aI267 -aI-656 -aa(lp11660 -g15 -aI264 -aI-606 -aI266 -aI-631 -aI265 -aI-618 -aa(lp11661 -g20 -aI270 -aI-606 -aa(lp11662 -g15 -aI466 -aI-727 -aI310 -aI-687 -aI376 -aI-727 -aa(lp11663 -g15 -aI567 -aI-712 -aI504 -aI-727 -aI538 -aI-722 -aa(lp11664 -g15 -aI641 -aI-665 -aI596 -aI-701 -aI621 -aI-686 -aa(lp11665 -g15 -aI686 -aI-584 -aI661 -aI-644 -aI676 -aI-617 -aa(lp11666 -g15 -aI702 -aI-466 -aI697 -aI-551 -aI702 -aI-511 -aa(lp11667 -g20 -aI702 -aI-151 -aa(lp11668 -g15 -aI710 -aI-101 -aI702 -aI-130 -aI705 -aI-113 -aa(lp11669 -g15 -aI731 -aI-72 -aI715 -aI-88 -aI722 -aI-78 -aa(lp11670 -g15 -aI764 -aI-58 -aI740 -aI-65 -aI751 -aI-60 -aa(lp11671 -g15 -aI805 -aI-55 -aI776 -aI-56 -aI790 -aI-55 -aa(lp11672 -g20 -aI809 -aI-55 -aa(lp11673 -g20 -aI809 -aI0 -aa(lp11674 -g20 -aI577 -aI0 -aa(lp11675 -g20 -aI577 -aI-459 -aa(lp11676 -g15 -aI569 -aI-537 -aI577 -aI-488 -aI574 -aI-514 -aa(lp11677 -g15 -aI544 -aI-594 -aI564 -aI-559 -aI556 -aI-578 -aa(lp11678 -g15 -aI499 -aI-630 -aI533 -aI-610 -aI518 -aI-622 -aa(lp11679 -g15 -aI430 -aI-642 -aI480 -aI-638 -aI457 -aI-642 -aa(lp11680 -g15 -aI359 -aI-626 -aI403 -aI-642 -aI379 -aI-637 -aa(lp11681 -g15 -aI308 -aI-583 -aI338 -aI-616 -aI322 -aI-602 -aa(lp11682 -g15 -aI279 -aI-514 -aI295 -aI-564 -aI285 -aI-541 -aa(lp11683 -g15 -aI269 -aI-425 -aI272 -aI-488 -aI269 -aI-458 -aa(lp11684 -g20 -aI269 -aI-144 -aa(lp11685 -g15 -aI278 -aI-97 -aI269 -aI-125 -aI272 -aI-109 -aa(lp11686 -g15 -aI302 -aI-70 -aI284 -aI-85 -aI292 -aI-76 -aa(lp11687 -g15 -aI336 -aI-58 -aI312 -aI-64 -aI323 -aI-60 -aa(lp11688 -g15 -aI378 -aI-55 -aI350 -aI-56 -aI364 -aI-55 -aa(lp11689 -g10 -aa(lp11690 -g8 -aI846 -aI0 -aa(lp11691 -g10 -aa(lp11692 -g8 -aI846 -aI0 -aasVl -(lp11693 -(lp11694 -g8 -aI34 -aI-55 -aa(lp11695 -g15 -aI77 -aI-58 -aI49 -aI-55 -aI63 -aI-56 -aa(lp11696 -g15 -aI111 -aI-72 -aI90 -aI-60 -aI101 -aI-65 -aa(lp11697 -g15 -aI135 -aI-101 -aI121 -aI-78 -aI129 -aI-88 -aa(lp11698 -g15 -aI143 -aI-151 -aI140 -aI-113 -aI143 -aI-130 -aa(lp11699 -g20 -aI143 -aI-866 -aa(lp11700 -g15 -aI135 -aI-913 -aI143 -aI-885 -aI140 -aI-901 -aa(lp11701 -g15 -aI111 -aI-940 -aI129 -aI-925 -aI121 -aI-934 -aa(lp11702 -g15 -aI76 -aI-953 -aI101 -aI-947 -aI89 -aI-951 -aa(lp11703 -g15 -aI34 -aI-956 -aI63 -aI-955 -aI49 -aI-956 -aa(lp11704 -g20 -aI17 -aI-956 -aa(lp11705 -g20 -aI17 -aI-1012 -aa(lp11706 -g20 -aI269 -aI-1012 -aa(lp11707 -g20 -aI269 -aI-151 -aa(lp11708 -g15 -aI277 -aI-101 -aI269 -aI-130 -aI272 -aI-113 -aa(lp11709 -g15 -aI301 -aI-72 -aI283 -aI-88 -aI291 -aI-78 -aa(lp11710 -g15 -aI336 -aI-58 -aI311 -aI-65 -aI323 -aI-60 -aa(lp11711 -g15 -aI378 -aI-55 -aI349 -aI-56 -aI363 -aI-55 -aa(lp11712 -g20 -aI395 -aI-55 -aa(lp11713 -g20 -aI395 -aI0 -aa(lp11714 -g20 -aI17 -aI0 -aa(lp11715 -g20 -aI17 -aI-55 -aa(lp11716 -g10 -aa(lp11717 -g8 -aI413 -aI0 -aa(lp11718 -g10 -aa(lp11719 -g8 -aI413 -aI0 -aasVp -(lp11720 -(lp11721 -g8 -aI450 -aI-642 -aa(lp11722 -g15 -aI363 -aI-624 -aI415 -aI-642 -aI386 -aI-636 -aa(lp11723 -g15 -aI307 -aI-572 -aI340 -aI-613 -aI321 -aI-595 -aa(lp11724 -g15 -aI278 -aI-483 -aI294 -aI-549 -aI284 -aI-519 -aa(lp11725 -g15 -aI269 -aI-358 -aI272 -aI-448 -aI269 -aI-406 -aa(lp11726 -g15 -aI278 -aI-235 -aI269 -aI-311 -aI272 -aI-270 -aa(lp11727 -g15 -aI308 -aI-145 -aI284 -aI-199 -aI294 -aI-169 -aa(lp11728 -g15 -aI364 -aI-90 -aI322 -aI-121 -aI341 -aI-102 -aa(lp11729 -g15 -aI451 -aI-71 -aI387 -aI-77 -aI416 -aI-71 -aa(lp11730 -g15 -aI527 -aI-90 -aI481 -aI-71 -aI506 -aI-77 -aa(lp11731 -g15 -aI577 -aI-145 -aI547 -aI-102 -aI564 -aI-121 -aa(lp11732 -g15 -aI606 -aI-235 -aI591 -aI-169 -aI600 -aI-199 -aa(lp11733 -g15 -aI615 -aI-359 -aI612 -aI-271 -aI615 -aI-312 -aa(lp11734 -g15 -aI606 -aI-483 -aI615 -aI-406 -aI612 -aI-448 -aa(lp11735 -g15 -aI577 -aI-571 -aI600 -aI-518 -aI591 -aI-548 -aa(lp11736 -g15 -aI526 -aI-624 -aI564 -aI-595 -aI547 -aI-612 -aa(lp11737 -g15 -aI450 -aI-642 -aI505 -aI-636 -aI480 -aI-642 -aa(lp11738 -g10 -aa(lp11739 -g8 -aI745 -aI-358 -aa(lp11740 -g15 -aI727 -aI-191 -aI745 -aI-294 -aI739 -aI-238 -aa(lp11741 -g15 -aI675 -aI-75 -aI715 -aI-144 -aI698 -aI-106 -aa(lp11742 -g15 -aI589 -aI-8 -aI652 -aI-45 -aI623 -aI-22 -aa(lp11743 -g15 -aI473 -aI13 -aI555 -aI6 -aI517 -aI13 -aa(lp11744 -g15 -aI403 -aI5 -aI447 -aI13 -aI424 -aI10 -aa(lp11745 -g15 -aI347 -aI-19 -aI382 -aI0 -aI364 -aI-8 -aa(lp11746 -g15 -aI303 -aI-56 -aI330 -aI-29 -aI315 -aI-41 -aa(lp11747 -g15 -aI269 -aI-103 -aI290 -aI-70 -aI279 -aI-86 -aa(lp11748 -g20 -aI264 -aI-103 -aa(lp11749 -g15 -aI266 -aI-39 -aI265 -aI-80 -aI266 -aI-59 -aa(lp11750 -g15 -aI267 -aI-13 -aI267 -aI-31 -aI267 -aI-22 -aa(lp11751 -g15 -aI268 -aI11 -aI268 -aI-4 -aI268 -aI3 -aa(lp11752 -g15 -aI269 -aI32 -aI268 -aI19 -aI268 -aI26 -aa(lp11753 -g15 -aI269 -aI47 -aI269 -aI38 -aI269 -aI43 -aa(lp11754 -g20 -aI269 -aI174 -aa(lp11755 -g15 -aI278 -aI222 -aI269 -aI194 -aI272 -aI210 -aa(lp11756 -g15 -aI302 -aI249 -aI284 -aI234 -aI292 -aI243 -aa(lp11757 -g15 -aI336 -aI261 -aI312 -aI255 -aI323 -aI259 -aa(lp11758 -g15 -aI378 -aI264 -aI350 -aI263 -aI364 -aI264 -aa(lp11759 -g20 -aI382 -aI264 -aa(lp11760 -g20 -aI382 -aI320 -aa(lp11761 -g20 -aI24 -aI320 -aa(lp11762 -g20 -aI24 -aI264 -aa(lp11763 -g20 -aI34 -aI264 -aa(lp11764 -g15 -aI77 -aI261 -aI49 -aI264 -aI63 -aI263 -aa(lp11765 -g15 -aI111 -aI248 -aI90 -aI259 -aI101 -aI254 -aa(lp11766 -g15 -aI135 -aI218 -aI121 -aI241 -aI129 -aI231 -aa(lp11767 -g15 -aI143 -aI168 -aI140 -aI206 -aI143 -aI189 -aa(lp11768 -g20 -aI143 -aI-567 -aa(lp11769 -g15 -aI135 -aI-614 -aI143 -aI-586 -aI140 -aI-602 -aa(lp11770 -g15 -aI111 -aI-642 -aI129 -aI-626 -aI121 -aI-635 -aa(lp11771 -g15 -aI76 -aI-655 -aI101 -aI-648 -aI89 -aI-652 -aa(lp11772 -g15 -aI34 -aI-658 -aI63 -aI-657 -aI49 -aI-658 -aa(lp11773 -g20 -aI17 -aI-658 -aa(lp11774 -g20 -aI17 -aI-714 -aa(lp11775 -g20 -aI250 -aI-714 -aa(lp11776 -g20 -aI264 -aI-593 -aa(lp11777 -g20 -aI269 -aI-593 -aa(lp11778 -g15 -aI303 -aI-649 -aI279 -aI-614 -aI290 -aI-632 -aa(lp11779 -g15 -aI347 -aI-691 -aI315 -aI-665 -aI330 -aI-679 -aa(lp11780 -g15 -aI402 -aI-717 -aI363 -aI-702 -aI382 -aI-711 -aa(lp11781 -g15 -aI473 -aI-727 -aI423 -aI-724 -aI447 -aI-727 -aa(lp11782 -g15 -aI589 -aI-705 -aI517 -aI-727 -aI555 -aI-720 -aa(lp11783 -g15 -aI675 -aI-638 -aI623 -aI-691 -aI652 -aI-668 -aa(lp11784 -g15 -aI727 -aI-523 -aI698 -aI-608 -aI715 -aI-570 -aa(lp11785 -g15 -aI745 -aI-358 -aI739 -aI-477 -aI745 -aI-422 -aa(lp11786 -g10 -aa(lp11787 -g8 -aI818 -aI0 -aa(lp11788 -g10 -aa(lp11789 -g8 -aI818 -aI0 -aasVt -(lp11790 -(lp11791 -g8 -aI353 -aI-56 -aa(lp11792 -g15 -aI397 -aI-59 -aI369 -aI-56 -aI384 -aI-57 -aa(lp11793 -g15 -aI438 -aI-65 -aI411 -aI-61 -aI424 -aI-63 -aa(lp11794 -g20 -aI438 -aI-7 -aa(lp11795 -g15 -aI416 -aI0 -aI433 -aI-4 -aI425 -aI-2 -aa(lp11796 -g15 -aI387 -aI7 -aI407 -aI3 -aI397 -aI5 -aa(lp11797 -g15 -aI353 -aI11 -aI376 -aI9 -aI365 -aI10 -aa(lp11798 -g15 -aI320 -aI13 -aI341 -aI12 -aI330 -aI13 -aa(lp11799 -g15 -aI233 -aI2 -aI286 -aI13 -aI257 -aI9 -aa(lp11800 -g15 -aI173 -aI-32 -aI208 -aI-4 -aI188 -aI-16 -aa(lp11801 -g15 -aI138 -aI-95 -aI157 -aI-48 -aI145 -aI-69 -aa(lp11802 -g15 -aI126 -aI-192 -aI130 -aI-122 -aI126 -aI-154 -aa(lp11803 -g20 -aI126 -aI-638 -aa(lp11804 -g20 -aI25 -aI-638 -aa(lp11805 -g20 -aI25 -aI-691 -aa(lp11806 -g15 -aI78 -aI-701 -aI41 -aI-691 -aI59 -aI-694 -aa(lp11807 -g15 -aI129 -aI-733 -aI97 -aI-707 -aI114 -aI-718 -aa(lp11808 -g15 -aI166 -aI-792 -aI144 -aI-750 -aI157 -aI-770 -aa(lp11809 -g15 -aI190 -aI-878 -aI175 -aI-815 -aI183 -aI-844 -aa(lp11810 -g20 -aI251 -aI-878 -aa(lp11811 -g20 -aI251 -aI-714 -aa(lp11812 -g20 -aI426 -aI-714 -aa(lp11813 -g20 -aI426 -aI-638 -aa(lp11814 -g20 -aI251 -aI-638 -aa(lp11815 -g20 -aI251 -aI-189 -aa(lp11816 -g15 -aI279 -aI-88 -aI251 -aI-143 -aI261 -aI-110 -aa(lp11817 -g15 -aI353 -aI-56 -aI298 -aI-67 -aI322 -aI-56 -aa(lp11818 -g10 -aa(lp11819 -g8 -aI469 -aI0 -aa(lp11820 -g10 -aa(lp11821 -g8 -aI469 -aI0 -aasVx -(lp11822 -(lp11823 -g8 -aI511 -aI-619 -aa(lp11824 -g15 -aI491 -aI-650 -aI511 -aI-635 -aI504 -aI-645 -aa(lp11825 -g15 -aI440 -aI-658 -aI477 -aI-655 -aI460 -aI-658 -aa(lp11826 -g20 -aI436 -aI-658 -aa(lp11827 -g20 -aI436 -aI-714 -aa(lp11828 -g20 -aI727 -aI-714 -aa(lp11829 -g20 -aI727 -aI-658 -aa(lp11830 -g20 -aI716 -aI-658 -aa(lp11831 -g15 -aI680 -aI-655 -aI703 -aI-658 -aI691 -aI-657 -aa(lp11832 -g15 -aI649 -aI-642 -aI670 -aI-652 -aI659 -aI-648 -aa(lp11833 -g15 -aI617 -aI-616 -aI639 -aI-636 -aI628 -aI-628 -aa(lp11834 -g15 -aI581 -aI-573 -aI606 -aI-605 -aI594 -aI-590 -aa(lp11835 -g20 -aI444 -aI-390 -aa(lp11836 -g20 -aI639 -aI-126 -aa(lp11837 -g15 -aI695 -aI-71 -aI659 -aI-100 -aI678 -aI-82 -aa(lp11838 -g15 -aI746 -aI-55 -aI713 -aI-60 -aI730 -aI-55 -aa(lp11839 -g20 -aI764 -aI-55 -aa(lp11840 -g20 -aI764 -aI0 -aa(lp11841 -g20 -aI419 -aI0 -aa(lp11842 -g20 -aI419 -aI-55 -aa(lp11843 -g20 -aI426 -aI-55 -aa(lp11844 -g15 -aI506 -aI-99 -aI479 -aI-55 -aI506 -aI-70 -aa(lp11845 -g15 -aI504 -aI-114 -aI506 -aI-104 -aI505 -aI-109 -aa(lp11846 -g15 -aI496 -aI-132 -aI503 -aI-119 -aI500 -aI-125 -aa(lp11847 -g15 -aI481 -aI-156 -aI492 -aI-138 -aI487 -aI-146 -aa(lp11848 -g15 -aI455 -aI-191 -aI474 -aI-165 -aI466 -aI-177 -aa(lp11849 -g20 -aI366 -aI-311 -aa(lp11850 -g20 -aI273 -aI-181 -aa(lp11851 -g15 -aI261 -aI-162 -aI269 -aI-175 -aI265 -aI-169 -aa(lp11852 -g15 -aI249 -aI-141 -aI256 -aI-156 -aI252 -aI-148 -aa(lp11853 -g15 -aI240 -aI-119 -aI245 -aI-134 -aI243 -aI-126 -aa(lp11854 -g15 -aI237 -aI-97 -aI238 -aI-111 -aI237 -aI-104 -aa(lp11855 -g15 -aI256 -aI-64 -aI237 -aI-82 -aI243 -aI-71 -aa(lp11856 -g15 -aI320 -aI-55 -aI269 -aI-58 -aI290 -aI-55 -aa(lp11857 -g20 -aI324 -aI-55 -aa(lp11858 -g20 -aI324 -aI0 -aa(lp11859 -g20 -aI6 -aI0 -aa(lp11860 -g20 -aI6 -aI-55 -aa(lp11861 -g20 -aI18 -aI-55 -aa(lp11862 -g15 -aI61 -aI-59 -aI34 -aI-55 -aI49 -aI-56 -aa(lp11863 -g15 -aI95 -aI-73 -aI73 -aI-62 -aI84 -aI-66 -aa(lp11864 -g15 -aI128 -aI-99 -aI106 -aI-79 -aI117 -aI-88 -aa(lp11865 -g15 -aI164 -aI-140 -aI139 -aI-110 -aI151 -aI-124 -aa(lp11866 -g20 -aI332 -aI-358 -aa(lp11867 -g20 -aI164 -aI-587 -aa(lp11868 -g15 -aI107 -aI-640 -aI144 -aI-610 -aI125 -aI-628 -aa(lp11869 -g15 -aI49 -aI-658 -aI88 -aI-652 -aI69 -aI-658 -aa(lp11870 -g20 -aI31 -aI-658 -aa(lp11871 -g20 -aI31 -aI-714 -aa(lp11872 -g20 -aI370 -aI-714 -aa(lp11873 -g20 -aI370 -aI-658 -aa(lp11874 -g20 -aI366 -aI-658 -aa(lp11875 -g15 -aI328 -aI-655 -aI351 -aI-658 -aI338 -aI-657 -aa(lp11876 -g15 -aI305 -aI-647 -aI318 -aI-653 -aI310 -aI-650 -aa(lp11877 -g15 -aI293 -aI-634 -aI299 -aI-643 -aI295 -aI-639 -aa(lp11878 -g15 -aI290 -aI-619 -aI291 -aI-629 -aI290 -aI-624 -aa(lp11879 -g15 -aI298 -aI-592 -aI290 -aI-610 -aI293 -aI-601 -aa(lp11880 -g15 -aI321 -aI-558 -aI303 -aI-583 -aI311 -aI-572 -aa(lp11881 -g20 -aI409 -aI-438 -aa(lp11882 -g20 -aI478 -aI-537 -aa(lp11883 -g15 -aI502 -aI-580 -aI488 -aI-553 -aI496 -aI-567 -aa(lp11884 -g15 -aI511 -aI-619 -aI508 -aI-594 -aI511 -aI-607 -aa(lp11885 -g10 -aa(lp11886 -g8 -aI770 -aI0 -aa(lp11887 -g10 -aa(lp11888 -g8 -aI770 -aI0 -aasV| -(lp11889 -(lp11890 -g8 -aI412 -aI320 -aa(lp11891 -g20 -aI332 -aI320 -aa(lp11892 -g20 -aI332 -aI-1012 -aa(lp11893 -g20 -aI412 -aI-1012 -aa(lp11894 -g10 -aa(lp11895 -g8 -aI745 -aI0 -aa(lp11896 -g10 -aa(lp11897 -g8 -aI745 -aI0 -aasV# -(lp11898 -(lp11899 -g8 -aI258 -aI-349 -aa(lp11900 -g20 -aI444 -aI-349 -aa(lp11901 -g20 -aI493 -aI-610 -aa(lp11902 -g20 -aI307 -aI-610 -aa(lp11903 -g10 -aa(lp11904 -g8 -aI675 -aI-349 -aa(lp11905 -g20 -aI675 -aI-270 -aa(lp11906 -g20 -aI507 -aI-270 -aa(lp11907 -g20 -aI457 -aI0 -aa(lp11908 -g20 -aI377 -aI0 -aa(lp11909 -g20 -aI427 -aI-270 -aa(lp11910 -g20 -aI242 -aI-270 -aa(lp11911 -g20 -aI192 -aI0 -aa(lp11912 -g20 -aI111 -aI0 -aa(lp11913 -g20 -aI162 -aI-270 -aa(lp11914 -g20 -aI53 -aI-270 -aa(lp11915 -g20 -aI53 -aI-349 -aa(lp11916 -g20 -aI177 -aI-349 -aa(lp11917 -g20 -aI227 -aI-610 -aa(lp11918 -g20 -aI69 -aI-610 -aa(lp11919 -g20 -aI69 -aI-689 -aa(lp11920 -g20 -aI242 -aI-689 -aa(lp11921 -g20 -aI290 -aI-951 -aa(lp11922 -g20 -aI371 -aI-951 -aa(lp11923 -g20 -aI322 -aI-689 -aa(lp11924 -g20 -aI507 -aI-689 -aa(lp11925 -g20 -aI557 -aI-951 -aa(lp11926 -g20 -aI637 -aI-951 -aa(lp11927 -g20 -aI587 -aI-689 -aa(lp11928 -g20 -aI692 -aI-689 -aa(lp11929 -g20 -aI692 -aI-610 -aa(lp11930 -g20 -aI573 -aI-610 -aa(lp11931 -g20 -aI524 -aI-349 -aa(lp11932 -g10 -aa(lp11933 -g8 -aI745 -aI0 -aa(lp11934 -g10 -aa(lp11935 -g8 -aI745 -aI0 -aasV' -(lp11936 -(lp11937 -g8 -aI76 -aI-951 -aa(lp11938 -g20 -aI217 -aI-951 -aa(lp11939 -g20 -aI177 -aI-638 -aa(lp11940 -g20 -aI115 -aI-638 -aa(lp11941 -g10 -aa(lp11942 -g8 -aI293 -aI0 -aa(lp11943 -g10 -aa(lp11944 -g8 -aI293 -aI0 -aasV+ -(lp11945 -(lp11946 -g8 -aI412 -aI-437 -aa(lp11947 -g20 -aI412 -aI-190 -aa(lp11948 -g20 -aI332 -aI-190 -aa(lp11949 -g20 -aI332 -aI-437 -aa(lp11950 -g20 -aI86 -aI-437 -aa(lp11951 -g20 -aI86 -aI-515 -aa(lp11952 -g20 -aI332 -aI-515 -aa(lp11953 -g20 -aI332 -aI-761 -aa(lp11954 -g20 -aI412 -aI-761 -aa(lp11955 -g20 -aI412 -aI-515 -aa(lp11956 -g20 -aI658 -aI-515 -aa(lp11957 -g20 -aI658 -aI-437 -aa(lp11958 -g10 -aa(lp11959 -g8 -aI745 -aI0 -aa(lp11960 -g10 -aa(lp11961 -g8 -aI745 -aI0 -aasV/ -(lp11962 -(lp11963 -g8 -aI78 -aI161 -aa(lp11964 -g20 -aI0 -aI161 -aa(lp11965 -g20 -aI306 -aI-1012 -aa(lp11966 -g20 -aI384 -aI-1012 -aa(lp11967 -g10 -aa(lp11968 -g8 -aI384 -aI0 -aa(lp11969 -g10 -aa(lp11970 -g8 -aI384 -aI0 -aasV3 -(lp11971 -(lp11972 -g8 -aI330 -aI-58 -aa(lp11973 -g15 -aI406 -aI-69 -aI357 -aI-58 -aI382 -aI-61 -aa(lp11974 -g15 -aI469 -aI-105 -aI430 -aI-76 -aI451 -aI-88 -aa(lp11975 -g15 -aI513 -aI-172 -aI487 -aI-122 -aI502 -aI-144 -aa(lp11976 -g15 -aI529 -aI-272 -aI523 -aI-199 -aI529 -aI-233 -aa(lp11977 -g15 -aI512 -aI-349 -aI529 -aI-301 -aI523 -aI-326 -aa(lp11978 -g15 -aI464 -aI-407 -aI501 -aI-372 -aI485 -aI-391 -aa(lp11979 -g15 -aI388 -aI-445 -aI444 -aI-423 -aI418 -aI-436 -aa(lp11980 -g15 -aI287 -aI-458 -aI358 -aI-454 -aI325 -aI-458 -aa(lp11981 -g20 -aI245 -aI-458 -aa(lp11982 -g20 -aI245 -aI-526 -aa(lp11983 -g20 -aI287 -aI-526 -aa(lp11984 -g15 -aI370 -aI-540 -aI317 -aI-526 -aI344 -aI-531 -aa(lp11985 -g15 -aI436 -aI-582 -aI395 -aI-550 -aI417 -aI-564 -aa(lp11986 -g15 -aI481 -aI-647 -aI455 -aI-600 -aI470 -aI-621 -aa(lp11987 -g15 -aI497 -aI-732 -aI491 -aI-672 -aI497 -aI-700 -aa(lp11988 -g15 -aI489 -aI-802 -aI497 -aI-758 -aI494 -aI-781 -aa(lp11989 -g15 -aI464 -aI-854 -aI484 -aI-822 -aI476 -aI-840 -aa(lp11990 -g15 -aI420 -aI-886 -aI453 -aI-868 -aI438 -aI-879 -aa(lp11991 -g15 -aI354 -aI-897 -aI402 -aI-894 -aI380 -aI-897 -aa(lp11992 -g15 -aI280 -aI-881 -aI324 -aI-897 -aI299 -aI-892 -aa(lp11993 -g15 -aI235 -aI-838 -aI261 -aI-870 -aI246 -aI-856 -aa(lp11994 -g15 -aI213 -aI-774 -aI224 -aI-819 -aI217 -aI-798 -aa(lp11995 -g15 -aI207 -aI-699 -aI209 -aI-751 -aI207 -aI-725 -aa(lp11996 -g15 -aI162 -aI-703 -aI191 -aI-699 -aI176 -aI-700 -aa(lp11997 -g15 -aI126 -aI-717 -aI148 -aI-705 -aI136 -aI-710 -aa(lp11998 -g15 -aI101 -aI-744 -aI115 -aI-724 -aI107 -aI-732 -aa(lp11999 -g15 -aI93 -aI-786 -aI96 -aI-755 -aI93 -aI-769 -aa(lp12000 -g15 -aI109 -aI-857 -aI93 -aI-811 -aI98 -aI-835 -aa(lp12001 -g15 -aI159 -aI-914 -aI120 -aI-879 -aI137 -aI-898 -aa(lp12002 -g15 -aI241 -aI-951 -aI181 -aI-930 -aI208 -aI-942 -aa(lp12003 -g15 -aI354 -aI-965 -aI274 -aI-960 -aI311 -aI-965 -aa(lp12004 -g15 -aI469 -aI-950 -aI396 -aI-965 -aI435 -aI-960 -aa(lp12005 -g15 -aI557 -aI-909 -aI503 -aI-941 -aI533 -aI-927 -aa(lp12006 -g15 -aI614 -aI-842 -aI582 -aI-891 -aI601 -aI-869 -aa(lp12007 -g15 -aI634 -aI-752 -aI628 -aI-816 -aI634 -aI-786 -aa(lp12008 -g15 -aI618 -aI-668 -aI634 -aI-722 -aI629 -aI-694 -aa(lp12009 -g15 -aI574 -aI-596 -aI608 -aI-641 -aI593 -aI-617 -aa(lp12010 -g15 -aI506 -aI-541 -aI555 -aI-574 -aI532 -aI-556 -aa(lp12011 -g15 -aI421 -aI-507 -aI480 -aI-526 -aI452 -aI-514 -aa(lp12012 -g15 -aI473 -aI-498 -aI437 -aI-505 -aI455 -aI-502 -aa(lp12013 -g15 -aI529 -aI-480 -aI492 -aI-494 -aI511 -aI-488 -aa(lp12014 -g15 -aI581 -aI-451 -aI547 -aI-472 -aI564 -aI-463 -aa(lp12015 -g15 -aI625 -aI-408 -aI598 -aI-439 -aI613 -aI-425 -aa(lp12016 -g15 -aI656 -aI-349 -aI638 -aI-391 -aI648 -aI-371 -aa(lp12017 -g15 -aI667 -aI-271 -aI664 -aI-327 -aI667 -aI-301 -aa(lp12018 -g15 -aI653 -aI-175 -aI667 -aI-236 -aI663 -aI-204 -aa(lp12019 -g15 -aI614 -aI-102 -aI644 -aI-147 -aI630 -aI-123 -aa(lp12020 -g15 -aI555 -aI-48 -aI597 -aI-81 -aI578 -aI-63 -aa(lp12021 -g15 -aI485 -aI-12 -aI533 -aI-33 -aI510 -aI-21 -aa(lp12022 -g15 -aI407 -aI7 -aI459 -aI-3 -aI434 -aI3 -aa(lp12023 -g15 -aI329 -aI13 -aI381 -aI11 -aI355 -aI13 -aa(lp12024 -g15 -aI216 -aI1 -aI285 -aI13 -aI247 -aI9 -aa(lp12025 -g15 -aI137 -aI-30 -aI184 -aI-6 -aI158 -aI-17 -aa(lp12026 -g15 -aI92 -aI-77 -aI117 -aI-44 -aI101 -aI-59 -aa(lp12027 -g15 -aI77 -aI-134 -aI82 -aI-96 -aI77 -aI-114 -aa(lp12028 -g15 -aI100 -aI-197 -aI77 -aI-161 -aI85 -aI-182 -aa(lp12029 -g15 -aI161 -aI-219 -aI115 -aI-212 -aI135 -aI-219 -aa(lp12030 -g15 -aI172 -aI-154 -aI161 -aI-196 -aI165 -aI-174 -aa(lp12031 -g15 -aI205 -aI-103 -aI180 -aI-135 -aI191 -aI-118 -aa(lp12032 -g15 -aI258 -aI-70 -aI220 -aI-89 -aI237 -aI-78 -aa(lp12033 -g15 -aI330 -aI-58 -aI279 -aI-62 -aI303 -aI-58 -aa(lp12034 -g10 -aa(lp12035 -g8 -aI745 -aI0 -aa(lp12036 -g10 -aa(lp12037 -g8 -aI745 -aI0 -aasV7 -(lp12038 -(lp12039 -g8 -aI253 -aI0 -aa(lp12040 -g20 -aI567 -aI-843 -aa(lp12041 -g20 -aI217 -aI-843 -aa(lp12042 -g15 -aI139 -aI-775 -aI169 -aI-843 -aI143 -aI-820 -aa(lp12043 -g20 -aI134 -aI-709 -aa(lp12044 -g20 -aI78 -aI-709 -aa(lp12045 -g20 -aI85 -aI-950 -aa(lp12046 -g20 -aI681 -aI-950 -aa(lp12047 -g20 -aI681 -aI-911 -aa(lp12048 -g20 -aI353 -aI0 -aa(lp12049 -g10 -aa(lp12050 -g8 -aI745 -aI0 -aa(lp12051 -g10 -aa(lp12052 -g8 -aI745 -aI0 -aasV; -(lp12053 -(lp12054 -g8 -aI258 -aI-55 -aa(lp12055 -g15 -aI246 -aI26 -aI258 -aI-27 -aI254 -aI0 -aa(lp12056 -g15 -aI208 -aI100 -aI238 -aI52 -aI226 -aI77 -aa(lp12057 -g15 -aI140 -aI160 -aI191 -aI122 -aI168 -aI142 -aa(lp12058 -g15 -aI39 -aI205 -aI113 -aI178 -aI79 -aI193 -aa(lp12059 -g20 -aI39 -aI149 -aa(lp12060 -g15 -aI136 -aI98 -aI83 -aI135 -aI115 -aI118 -aa(lp12061 -g15 -aI166 -aI29 -aI156 -aI78 -aI166 -aI55 -aa(lp12062 -g15 -aI159 -aI7 -aI166 -aI21 -aI164 -aI13 -aa(lp12063 -g15 -aI141 -aI-7 -aI154 -aI2 -aI148 -aI-3 -aa(lp12064 -g15 -aI117 -aI-21 -aI133 -aI-12 -aI126 -aI-16 -aa(lp12065 -g15 -aI94 -aI-36 -aI109 -aI-25 -aI101 -aI-30 -aa(lp12066 -g15 -aI76 -aI-59 -aI87 -aI-42 -aI80 -aI-50 -aa(lp12067 -g15 -aI69 -aI-92 -aI71 -aI-68 -aI69 -aI-79 -aa(lp12068 -g15 -aI94 -aI-151 -aI69 -aI-118 -aI77 -aI-137 -aa(lp12069 -g15 -aI156 -aI-171 -aI110 -aI-164 -aI131 -aI-171 -aa(lp12070 -g15 -aI195 -aI-163 -aI170 -aI-171 -aI183 -aI-168 -aa(lp12071 -g15 -aI227 -aI-141 -aI207 -aI-158 -aI218 -aI-151 -aa(lp12072 -g15 -aI250 -aI-105 -aI237 -aI-132 -aI244 -aI-119 -aa(lp12073 -g15 -aI258 -aI-55 -aI255 -aI-90 -aI258 -aI-74 -aa(lp12074 -g10 -aa(lp12075 -g8 -aI83 -aI-630 -aa(lp12076 -g15 -aI90 -aI-673 -aI83 -aI-647 -aI86 -aI-662 -aa(lp12077 -g15 -aI108 -aI-701 -aI94 -aI-685 -aI100 -aI-694 -aa(lp12078 -g15 -aI135 -aI-716 -aI115 -aI-708 -aI124 -aI-713 -aa(lp12079 -g15 -aI167 -aI-720 -aI145 -aI-719 -aI156 -aI-720 -aa(lp12080 -g15 -aI200 -aI-716 -aI179 -aI-720 -aI189 -aI-719 -aa(lp12081 -g15 -aI226 -aI-701 -aI210 -aI-713 -aI219 -aI-708 -aa(lp12082 -g15 -aI245 -aI-673 -aI234 -aI-694 -aI240 -aI-685 -aa(lp12083 -g15 -aI251 -aI-630 -aI249 -aI-662 -aI251 -aI-647 -aa(lp12084 -g15 -aI245 -aI-587 -aI251 -aI-613 -aI249 -aI-599 -aa(lp12085 -g15 -aI226 -aI-559 -aI240 -aI-575 -aI234 -aI-566 -aa(lp12086 -g15 -aI200 -aI-543 -aI219 -aI-551 -aI210 -aI-546 -aa(lp12087 -g15 -aI167 -aI-539 -aI189 -aI-540 -aI179 -aI-539 -aa(lp12088 -g15 -aI135 -aI-543 -aI156 -aI-539 -aI145 -aI-540 -aa(lp12089 -g15 -aI108 -aI-559 -aI124 -aI-546 -aI115 -aI-551 -aa(lp12090 -g15 -aI90 -aI-587 -aI100 -aI-566 -aI94 -aI-575 -aa(lp12091 -g15 -aI83 -aI-630 -aI86 -aI-599 -aI83 -aI-613 -aa(lp12092 -g10 -aa(lp12093 -g8 -aI333 -aI0 -aa(lp12094 -g10 -aa(lp12095 -g8 -aI333 -aI0 -aasV? -(lp12096 -(lp12097 -g8 -aI339 -aI-267 -aa(lp12098 -g20 -aI258 -aI-267 -aa(lp12099 -g20 -aI258 -aI-470 -aa(lp12100 -g15 -aI355 -aI-524 -aI297 -aI-485 -aI329 -aI-503 -aa(lp12101 -g15 -aI418 -aI-591 -aI382 -aI-545 -aI403 -aI-567 -aa(lp12102 -g15 -aI452 -aI-667 -aI434 -aI-615 -aI446 -aI-640 -aa(lp12103 -g15 -aI462 -aI-746 -aI459 -aI-693 -aI462 -aI-719 -aa(lp12104 -g15 -aI454 -aI-809 -aI462 -aI-769 -aI460 -aI-790 -aa(lp12105 -g15 -aI428 -aI-857 -aI448 -aI-827 -aI440 -aI-844 -aa(lp12106 -g15 -aI383 -aI-888 -aI416 -aI-870 -aI401 -aI-880 -aa(lp12107 -g15 -aI317 -aI-899 -aI364 -aI-895 -aI342 -aI-899 -aa(lp12108 -g15 -aI247 -aI-885 -aI289 -aI-899 -aI265 -aI-894 -aa(lp12109 -g15 -aI201 -aI-848 -aI228 -aI-876 -aI212 -aI-864 -aa(lp12110 -g15 -aI175 -aI-794 -aI189 -aI-832 -aI180 -aI-814 -aa(lp12111 -g15 -aI167 -aI-728 -aI170 -aI-773 -aI167 -aI-751 -aa(lp12112 -g15 -aI123 -aI-734 -aI151 -aI-728 -aI137 -aI-730 -aa(lp12113 -g15 -aI88 -aI-750 -aI110 -aI-737 -aI98 -aI-743 -aa(lp12114 -g15 -aI65 -aI-777 -aI79 -aI-757 -aI71 -aI-766 -aa(lp12115 -g15 -aI57 -aI-815 -aI60 -aI-788 -aI57 -aI-800 -aa(lp12116 -g15 -aI71 -aI-874 -aI57 -aI-836 -aI62 -aI-856 -aa(lp12117 -g15 -aI117 -aI-922 -aI81 -aI-892 -aI96 -aI-908 -aa(lp12118 -g15 -aI195 -aI-953 -aI138 -aI-935 -aI164 -aI-946 -aa(lp12119 -g15 -aI306 -aI-965 -aI226 -aI-961 -aI263 -aI-965 -aa(lp12120 -g15 -aI423 -aI-948 -aI348 -aI-965 -aI387 -aI-959 -aa(lp12121 -g15 -aI515 -aI-901 -aI458 -aI-937 -aI489 -aI-922 -aa(lp12122 -g15 -aI576 -aI-825 -aI541 -aI-880 -aI562 -aI-855 -aa(lp12123 -g15 -aI598 -aI-723 -aI591 -aI-795 -aI598 -aI-761 -aa(lp12124 -g15 -aI581 -aI-623 -aI598 -aI-687 -aI593 -aI-653 -aa(lp12125 -g15 -aI531 -aI-541 -aI570 -aI-593 -aI553 -aI-566 -aa(lp12126 -g15 -aI449 -aI-474 -aI509 -aI-517 -aI481 -aI-494 -aa(lp12127 -g15 -aI339 -aI-418 -aI417 -aI-453 -aI381 -aI-435 -aa(lp12128 -g10 -aa(lp12129 -g8 -aI213 -aI-80 -aa(lp12130 -g15 -aI220 -aI-124 -aI213 -aI-98 -aI215 -aI-112 -aa(lp12131 -g15 -aI237 -aI-151 -aI224 -aI-135 -aI230 -aI-144 -aa(lp12132 -g15 -aI264 -aI-166 -aI245 -aI-158 -aI254 -aI-163 -aa(lp12133 -g15 -aI297 -aI-171 -aI274 -aI-169 -aI285 -aI-171 -aa(lp12134 -g15 -aI329 -aI-166 -aI308 -aI-171 -aI319 -aI-169 -aa(lp12135 -g15 -aI356 -aI-151 -aI339 -aI-163 -aI348 -aI-158 -aa(lp12136 -g15 -aI374 -aI-124 -aI364 -aI-144 -aI370 -aI-135 -aa(lp12137 -g15 -aI381 -aI-80 -aI379 -aI-112 -aI381 -aI-98 -aa(lp12138 -g15 -aI374 -aI-37 -aI381 -aI-64 -aI379 -aI-49 -aa(lp12139 -g15 -aI356 -aI-9 -aI370 -aI-26 -aI364 -aI-16 -aa(lp12140 -g15 -aI329 -aI5 -aI348 -aI-3 -aI339 -aI1 -aa(lp12141 -g15 -aI297 -aI9 -aI319 -aI8 -aI308 -aI9 -aa(lp12142 -g15 -aI264 -aI5 -aI285 -aI9 -aI274 -aI8 -aa(lp12143 -g15 -aI237 -aI-9 -aI254 -aI1 -aI245 -aI-3 -aa(lp12144 -g15 -aI220 -aI-37 -aI230 -aI-16 -aI224 -aI-26 -aa(lp12145 -g15 -aI213 -aI-80 -aI215 -aI-49 -aI213 -aI-64 -aa(lp12146 -g10 -aa(lp12147 -g8 -aI666 -aI0 -aa(lp12148 -g10 -aa(lp12149 -g8 -aI666 -aI0 -aasVC -(lp12150 -(lp12151 -g8 -aI503 -aI-965 -aa(lp12152 -g15 -aI622 -aI-953 -aI549 -aI-965 -aI589 -aI-961 -aa(lp12153 -g15 -aI706 -aI-922 -aI656 -aI-946 -aI684 -aI-935 -aa(lp12154 -g15 -aI756 -aI-874 -aI729 -aI-908 -aI745 -aI-892 -aa(lp12155 -g15 -aI773 -aI-815 -aI767 -aI-856 -aI773 -aI-836 -aa(lp12156 -g15 -aI764 -aI-776 -aI773 -aI-800 -aI770 -aI-788 -aa(lp12157 -g15 -aI740 -aI-747 -aI758 -aI-765 -aI750 -aI-755 -aa(lp12158 -g15 -aI703 -aI-728 -aI729 -aI-739 -aI717 -aI-733 -aa(lp12159 -g15 -aI657 -aI-722 -aI689 -aI-724 -aI674 -aI-722 -aa(lp12160 -g15 -aI649 -aI-784 -aI657 -aI-743 -aI654 -aI-763 -aa(lp12161 -g15 -aI622 -aI-839 -aI643 -aI-804 -aI635 -aI-822 -aa(lp12162 -g15 -aI574 -aI-878 -aI610 -aI-855 -aI594 -aI-868 -aa(lp12163 -g15 -aI501 -aI-894 -aI554 -aI-888 -aI530 -aI-894 -aa(lp12164 -g15 -aI373 -aI-866 -aI450 -aI-894 -aI408 -aI-884 -aa(lp12165 -g15 -aI287 -aI-785 -aI337 -aI-847 -aI309 -aI-821 -aa(lp12166 -g15 -aI238 -aI-654 -aI264 -aI-750 -aI248 -aI-706 -aa(lp12167 -g15 -aI223 -aI-476 -aI228 -aI-602 -aI223 -aI-543 -aa(lp12168 -g15 -aI239 -aI-313 -aI223 -aI-417 -aI229 -aI-362 -aa(lp12169 -g15 -aI289 -aI-186 -aI250 -aI-263 -aI266 -aI-221 -aa(lp12170 -g15 -aI375 -aI-103 -aI311 -aI-150 -aI340 -aI-123 -aa(lp12171 -g15 -aI501 -aI-74 -aI410 -aI-84 -aI452 -aI-74 -aa(lp12172 -g15 -aI587 -aI-83 -aI533 -aI-74 -aI562 -aI-77 -aa(lp12173 -g15 -aI653 -aI-108 -aI612 -aI-90 -aI634 -aI-98 -aa(lp12174 -g15 -aI704 -aI-145 -aI672 -aI-119 -aI689 -aI-131 -aa(lp12175 -g15 -aI742 -aI-187 -aI718 -aI-158 -aI731 -aI-172 -aa(lp12176 -g15 -aI761 -aI-168 -aI750 -aI-182 -aI756 -aI-176 -aa(lp12177 -g15 -aI768 -aI-135 -aI765 -aI-159 -aI768 -aI-149 -aa(lp12178 -g15 -aI750 -aI-83 -aI768 -aI-118 -aI762 -aI-101 -aa(lp12179 -g15 -aI698 -aI-36 -aI739 -aI-66 -aI722 -aI-50 -aa(lp12180 -g15 -aI609 -aI0 -aI675 -aI-21 -aI645 -aI-9 -aa(lp12181 -g15 -aI481 -aI13 -aI573 -aI8 -aI530 -aI13 -aa(lp12182 -g15 -aI305 -aI-21 -aI414 -aI13 -aI356 -aI1 -aa(lp12183 -g15 -aI179 -aI-121 -aI255 -aI-45 -aI213 -aI-78 -aa(lp12184 -g15 -aI102 -aI-276 -aI145 -aI-164 -aI119 -aI-215 -aa(lp12185 -g15 -aI76 -aI-476 -aI84 -aI-336 -aI76 -aI-403 -aa(lp12186 -g15 -aI103 -aI-674 -aI76 -aI-548 -aI85 -aI-614 -aa(lp12187 -g15 -aI184 -aI-828 -aI121 -aI-734 -aI148 -aI-786 -aa(lp12188 -g15 -aI318 -aI-929 -aI220 -aI-871 -aI264 -aI-905 -aa(lp12189 -g15 -aI503 -aI-965 -aI371 -aI-953 -aI433 -aI-965 -aa(lp12190 -g10 -aa(lp12191 -g8 -aI818 -aI0 -aa(lp12192 -g10 -aa(lp12193 -g8 -aI818 -aI0 -aasVG -(lp12194 -(lp12195 -g8 -aI534 -aI13 -aa(lp12196 -g15 -aI332 -aI-21 -aI457 -aI13 -aI389 -aI1 -aa(lp12197 -g15 -aI189 -aI-121 -aI274 -aI-45 -aI227 -aI-78 -aa(lp12198 -g15 -aI104 -aI-276 -aI151 -aI-164 -aI122 -aI-215 -aa(lp12199 -g15 -aI76 -aI-476 -aI85 -aI-336 -aI76 -aI-403 -aa(lp12200 -g15 -aI105 -aI-674 -aI76 -aI-548 -aI86 -aI-614 -aa(lp12201 -g15 -aI194 -aI-828 -aI125 -aI-734 -aI155 -aI-786 -aa(lp12202 -g15 -aI340 -aI-929 -aI233 -aI-871 -aI282 -aI-905 -aa(lp12203 -g15 -aI542 -aI-965 -aI398 -aI-953 -aI466 -aI-965 -aa(lp12204 -g15 -aI672 -aI-953 -aI592 -aI-965 -aI635 -aI-961 -aa(lp12205 -g15 -aI763 -aI-922 -aI708 -aI-946 -aI739 -aI-935 -aa(lp12206 -g15 -aI819 -aI-874 -aI788 -aI-908 -aI806 -aI-892 -aa(lp12207 -g15 -aI837 -aI-815 -aI831 -aI-856 -aI837 -aI-836 -aa(lp12208 -g15 -aI827 -aI-776 -aI837 -aI-800 -aI833 -aI-788 -aa(lp12209 -g15 -aI801 -aI-747 -aI820 -aI-765 -aI812 -aI-755 -aa(lp12210 -g15 -aI762 -aI-728 -aI790 -aI-739 -aI777 -aI-733 -aa(lp12211 -g15 -aI713 -aI-722 -aI747 -aI-724 -aI730 -aI-722 -aa(lp12212 -g15 -aI704 -aI-784 -aI713 -aI-743 -aI710 -aI-763 -aa(lp12213 -g15 -aI674 -aI-839 -aI698 -aI-804 -aI688 -aI-822 -aa(lp12214 -g15 -aI619 -aI-878 -aI660 -aI-855 -aI642 -aI-868 -aa(lp12215 -g15 -aI537 -aI-894 -aI597 -aI-888 -aI569 -aI-894 -aa(lp12216 -g15 -aI392 -aI-866 -aI480 -aI-894 -aI432 -aI-884 -aa(lp12217 -g15 -aI295 -aI-785 -aI353 -aI-847 -aI320 -aI-821 -aa(lp12218 -g15 -aI240 -aI-654 -aI270 -aI-750 -aI252 -aI-706 -aa(lp12219 -g15 -aI223 -aI-476 -aI229 -aI-602 -aI223 -aI-543 -aa(lp12220 -g15 -aI241 -aI-299 -aI223 -aI-410 -aI229 -aI-351 -aa(lp12221 -g15 -aI298 -aI-169 -aI253 -aI-248 -aI272 -aI-204 -aa(lp12222 -g15 -aI401 -aI-89 -aI325 -aI-134 -aI359 -aI-107 -aa(lp12223 -g15 -aI555 -aI-62 -aI443 -aI-71 -aI495 -aI-62 -aa(lp12224 -g15 -aI630 -aI-65 -aI581 -aI-62 -aI606 -aI-63 -aa(lp12225 -g15 -aI694 -aI-78 -aI654 -aI-68 -aI675 -aI-72 -aa(lp12226 -g20 -aI694 -aI-293 -aa(lp12227 -g15 -aI685 -aI-340 -aI694 -aI-312 -aI691 -aI-328 -aa(lp12228 -g15 -aI662 -aI-367 -aI680 -aI-352 -aI672 -aI-361 -aa(lp12229 -g15 -aI627 -aI-380 -aI652 -aI-374 -aI640 -aI-378 -aa(lp12230 -g15 -aI585 -aI-383 -aI614 -aI-382 -aI600 -aI-383 -aa(lp12231 -g20 -aI580 -aI-383 -aa(lp12232 -g20 -aI580 -aI-439 -aa(lp12233 -g20 -aI926 -aI-439 -aa(lp12234 -g20 -aI926 -aI-383 -aa(lp12235 -g20 -aI921 -aI-383 -aa(lp12236 -g15 -aI885 -aI-380 -aI908 -aI-383 -aI896 -aI-382 -aa(lp12237 -g15 -aI856 -aI-367 -aI874 -aI-378 -aI864 -aI-373 -aa(lp12238 -g15 -aI836 -aI-337 -aI847 -aI-360 -aI841 -aI-350 -aa(lp12239 -g15 -aI829 -aI-287 -aI831 -aI-324 -aI829 -aI-308 -aa(lp12240 -g20 -aI829 -aI-47 -aa(lp12241 -g15 -aI691 -aI-1 -aI784 -aI-26 -aI738 -aI-11 -aa(lp12242 -g15 -aI534 -aI13 -aI644 -aI8 -aI591 -aI13 -aa(lp12243 -g10 -aa(lp12244 -g8 -aI951 -aI0 -aa(lp12245 -g10 -aa(lp12246 -g8 -aI951 -aI0 -aasVK -(lp12247 -(lp12248 -g8 -aI587 -aI-739 -aa(lp12249 -g15 -aI623 -aI-783 -aI602 -aI-756 -aI614 -aI-770 -aa(lp12250 -g15 -aI646 -aI-818 -aI633 -aI-796 -aI640 -aI-808 -aa(lp12251 -g15 -aI657 -aI-845 -aI651 -aI-828 -aI655 -aI-838 -aa(lp12252 -g15 -aI661 -aI-867 -aI660 -aI-853 -aI661 -aI-860 -aa(lp12253 -g15 -aI645 -aI-890 -aI661 -aI-878 -aI656 -aI-886 -aa(lp12254 -g15 -aI595 -aI-896 -aI634 -aI-894 -aI617 -aI-896 -aa(lp12255 -g20 -aI595 -aI-951 -aa(lp12256 -g20 -aI890 -aI-951 -aa(lp12257 -g20 -aI890 -aI-896 -aa(lp12258 -g15 -aI846 -aI-887 -aI875 -aI-896 -aI860 -aI-893 -aa(lp12259 -g15 -aI804 -aI-863 -aI832 -aI-882 -aI818 -aI-873 -aa(lp12260 -g15 -aI760 -aI-824 -aI790 -aI-852 -aI775 -aI-839 -aa(lp12261 -g15 -aI712 -aI-771 -aI745 -aI-808 -aI729 -aI-791 -aa(lp12262 -g20 -aI518 -aI-554 -aa(lp12263 -g20 -aI800 -aI-162 -aa(lp12264 -g15 -aI874 -aI-82 -aI825 -aI-127 -aI850 -aI-100 -aa(lp12265 -g15 -aI946 -aI-55 -aI897 -aI-64 -aI921 -aI-55 -aa(lp12266 -g20 -aI949 -aI-55 -aa(lp12267 -g20 -aI949 -aI0 -aa(lp12268 -g20 -aI934 -aI0 -aa(lp12269 -g15 -aI824 -aI-4 -aI890 -aI0 -aI853 -aI-1 -aa(lp12270 -g15 -aI752 -aI-23 -aI796 -aI-8 -aI772 -aI-14 -aa(lp12271 -g15 -aI701 -aI-60 -aI733 -aI-32 -aI716 -aI-45 -aa(lp12272 -g15 -aI654 -aI-119 -aI686 -aI-75 -aI671 -aI-95 -aa(lp12273 -g20 -aI425 -aI-448 -aa(lp12274 -g20 -aI311 -aI-356 -aa(lp12275 -g20 -aI311 -aI-151 -aa(lp12276 -g15 -aI320 -aI-101 -aI311 -aI-130 -aI314 -aI-113 -aa(lp12277 -g15 -aI344 -aI-72 -aI326 -aI-88 -aI334 -aI-78 -aa(lp12278 -g15 -aI378 -aI-58 -aI353 -aI-65 -aI365 -aI-60 -aa(lp12279 -g15 -aI421 -aI-55 -aI392 -aI-56 -aI406 -aI-55 -aa(lp12280 -g20 -aI438 -aI-55 -aa(lp12281 -g20 -aI438 -aI0 -aa(lp12282 -g20 -aI50 -aI0 -aa(lp12283 -g20 -aI50 -aI-55 -aa(lp12284 -g20 -aI67 -aI-55 -aa(lp12285 -g15 -aI109 -aI-58 -aI82 -aI-55 -aI96 -aI-56 -aa(lp12286 -g15 -aI144 -aI-70 -aI122 -aI-60 -aI134 -aI-64 -aa(lp12287 -g15 -aI168 -aI-97 -aI154 -aI-76 -aI162 -aI-85 -aa(lp12288 -g15 -aI177 -aI-144 -aI174 -aI-109 -aI177 -aI-125 -aa(lp12289 -g20 -aI177 -aI-804 -aa(lp12290 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp12291 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp12292 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp12293 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp12294 -g20 -aI50 -aI-895 -aa(lp12295 -g20 -aI50 -aI-951 -aa(lp12296 -g20 -aI438 -aI-951 -aa(lp12297 -g20 -aI438 -aI-895 -aa(lp12298 -g20 -aI421 -aI-895 -aa(lp12299 -g15 -aI378 -aI-892 -aI406 -aI-895 -aI392 -aI-894 -aa(lp12300 -g15 -aI344 -aI-878 -aI365 -aI-889 -aI353 -aI-885 -aa(lp12301 -g15 -aI320 -aI-849 -aI334 -aI-872 -aI326 -aI-862 -aa(lp12302 -g15 -aI311 -aI-799 -aI314 -aI-837 -aI311 -aI-820 -aa(lp12303 -g20 -aI311 -aI-423 -aa(lp12304 -g10 -aa(lp12305 -g8 -aI933 -aI0 -aa(lp12306 -g10 -aa(lp12307 -g8 -aI933 -aI0 -aasVO -(lp12308 -(lp12309 -g8 -aI913 -aI-476 -aa(lp12310 -g15 -aI886 -aI-276 -aI913 -aI-403 -aI904 -aI-336 -aa(lp12311 -g15 -aI805 -aI-121 -aI867 -aI-215 -aI840 -aI-164 -aa(lp12312 -g15 -aI673 -aI-21 -aI769 -aI-78 -aI725 -aI-45 -aa(lp12313 -g15 -aI494 -aI13 -aI621 -aI1 -aI562 -aI13 -aa(lp12314 -g15 -aI309 -aI-21 -aI424 -aI13 -aI362 -aI1 -aa(lp12315 -g15 -aI179 -aI-121 -aI257 -aI-45 -aI213 -aI-78 -aa(lp12316 -g15 -aI100 -aI-276 -aI144 -aI-164 -aI118 -aI-216 -aa(lp12317 -g15 -aI74 -aI-478 -aI83 -aI-337 -aI74 -aI-404 -aa(lp12318 -g15 -aI100 -aI-678 -aI74 -aI-551 -aI83 -aI-618 -aa(lp12319 -g15 -aI179 -aI-832 -aI118 -aI-739 -aI144 -aI-790 -aa(lp12320 -g15 -aI310 -aI-931 -aI213 -aI-875 -aI257 -aI-908 -aa(lp12321 -g15 -aI496 -aI-966 -aI363 -aI-954 -aI425 -aI-966 -aa(lp12322 -g15 -aI674 -aI-931 -aI563 -aI-966 -aI622 -aI-954 -aa(lp12323 -g15 -aI805 -aI-832 -aI726 -aI-908 -aI769 -aI-875 -aa(lp12324 -g15 -aI886 -aI-678 -aI840 -aI-789 -aI867 -aI-738 -aa(lp12325 -g15 -aI913 -aI-476 -aI904 -aI-618 -aI913 -aI-550 -aa(lp12326 -g10 -aa(lp12327 -g8 -aI222 -aI-476 -aa(lp12328 -g15 -aI237 -aI-300 -aI222 -aI-410 -aI227 -aI-351 -aa(lp12329 -g15 -aI284 -aI-168 -aI247 -aI-248 -aI262 -aI-204 -aa(lp12330 -g15 -aI368 -aI-86 -aI306 -aI-132 -aI334 -aI-105 -aa(lp12331 -g15 -aI494 -aI-58 -aI403 -aI-67 -aI445 -aI-58 -aa(lp12332 -g15 -aI620 -aI-86 -aI544 -aI-58 -aI586 -aI-67 -aa(lp12333 -g15 -aI704 -aI-168 -aI655 -aI-105 -aI683 -aI-132 -aa(lp12334 -g15 -aI751 -aI-300 -aI726 -aI-204 -aI741 -aI-248 -aa(lp12335 -g15 -aI765 -aI-476 -aI760 -aI-351 -aI765 -aI-410 -aa(lp12336 -g15 -aI751 -aI-653 -aI765 -aI-542 -aI760 -aI-601 -aa(lp12337 -g15 -aI704 -aI-784 -aI741 -aI-705 -aI726 -aI-749 -aa(lp12338 -g15 -aI621 -aI-866 -aI683 -aI-820 -aI655 -aI-847 -aa(lp12339 -g15 -aI496 -aI-894 -aI587 -aI-884 -aI545 -aI-894 -aa(lp12340 -g15 -aI369 -aI-866 -aI446 -aI-894 -aI404 -aI-884 -aa(lp12341 -g15 -aI284 -aI-784 -aI335 -aI-847 -aI306 -aI-820 -aa(lp12342 -g15 -aI237 -aI-653 -aI262 -aI-749 -aI247 -aI-705 -aa(lp12343 -g15 -aI222 -aI-476 -aI227 -aI-601 -aI222 -aI-542 -aa(lp12344 -g10 -aa(lp12345 -g8 -aI989 -aI0 -aa(lp12346 -g10 -aa(lp12347 -g8 -aI989 -aI0 -aasVS -(lp12348 -(lp12349 -g8 -aI329 -aI13 -aa(lp12350 -g15 -aI214 -aI0 -aI286 -aI13 -aI247 -aI8 -aa(lp12351 -g15 -aI131 -aI-38 -aI181 -aI-9 -aI153 -aI-22 -aa(lp12352 -g15 -aI80 -aI-97 -aI108 -aI-54 -aI92 -aI-74 -aa(lp12353 -g15 -aI63 -aI-174 -aI69 -aI-120 -aI63 -aI-146 -aa(lp12354 -g15 -aI88 -aI-239 -aI63 -aI-200 -aI72 -aI-222 -aa(lp12355 -g15 -aI160 -aI-263 -aI105 -aI-255 -aI129 -aI-263 -aa(lp12356 -g15 -aI172 -aI-183 -aI161 -aI-236 -aI165 -aI-209 -aa(lp12357 -g15 -aI205 -aI-116 -aI180 -aI-158 -aI190 -aI-135 -aa(lp12358 -g15 -aI259 -aI-69 -aI219 -aI-96 -aI237 -aI-80 -aa(lp12359 -g15 -aI339 -aI-51 -aI281 -aI-57 -aI308 -aI-51 -aa(lp12360 -g15 -aI480 -aI-94 -aI399 -aI-51 -aI446 -aI-66 -aa(lp12361 -g15 -aI530 -aI-219 -aI513 -aI-123 -aI530 -aI-165 -aa(lp12362 -g15 -aI520 -aI-284 -aI530 -aI-243 -aI527 -aI-265 -aa(lp12363 -g15 -aI485 -aI-335 -aI513 -aI-302 -aI501 -aI-319 -aa(lp12364 -g15 -aI422 -aI-381 -aI469 -aI-351 -aI448 -aI-366 -aa(lp12365 -g15 -aI324 -aI-427 -aI395 -aI-395 -aI363 -aI-411 -aa(lp12366 -g15 -aI216 -aI-481 -aI282 -aI-444 -aI246 -aI-462 -aa(lp12367 -g15 -aI139 -aI-546 -aI185 -aI-500 -aI159 -aI-522 -aa(lp12368 -g15 -aI93 -aI-625 -aI118 -aI-569 -aI103 -aI-596 -aa(lp12369 -g15 -aI78 -aI-723 -aI83 -aI-654 -aI78 -aI-687 -aa(lp12370 -g15 -aI100 -aI-825 -aI78 -aI-761 -aI86 -aI-795 -aa(lp12371 -g15 -aI161 -aI-901 -aI115 -aI-855 -aI135 -aI-880 -aa(lp12372 -g15 -aI253 -aI-948 -aI187 -aI-922 -aI218 -aI-937 -aa(lp12373 -g15 -aI370 -aI-965 -aI289 -aI-959 -aI328 -aI-965 -aa(lp12374 -g15 -aI476 -aI-952 -aI410 -aI-965 -aI445 -aI-960 -aa(lp12375 -g15 -aI554 -aI-919 -aI507 -aI-944 -aI533 -aI-933 -aa(lp12376 -g15 -aI603 -aI-871 -aI575 -aI-905 -aI592 -aI-889 -aa(lp12377 -g15 -aI619 -aI-815 -aI614 -aI-853 -aI619 -aI-834 -aa(lp12378 -g15 -aI591 -aI-750 -aI619 -aI-786 -aI610 -aI-765 -aa(lp12379 -g15 -aI514 -aI-728 -aI572 -aI-735 -aI547 -aI-728 -aa(lp12380 -g15 -aI507 -aI-790 -aI514 -aI-749 -aI512 -aI-770 -aa(lp12381 -g15 -aI482 -aI-844 -aI502 -aI-810 -aI494 -aI-828 -aa(lp12382 -g15 -aI436 -aI-883 -aI470 -aI-860 -aI455 -aI-873 -aa(lp12383 -g15 -aI365 -aI-897 -aI417 -aI-892 -aI393 -aI-897 -aa(lp12384 -g15 -aI296 -aI-887 -aI339 -aI-897 -aI316 -aI-894 -aa(lp12385 -g15 -aI245 -aI-856 -aI276 -aI-880 -aI259 -aI-869 -aa(lp12386 -g15 -aI213 -aI-808 -aI231 -aI-843 -aI220 -aI-827 -aa(lp12387 -g15 -aI202 -aI-746 -aI206 -aI-790 -aI202 -aI-769 -aa(lp12388 -g15 -aI212 -aI-676 -aI202 -aI-719 -aI205 -aI-696 -aa(lp12389 -g15 -aI247 -aI-621 -aI219 -aI-656 -aI231 -aI-637 -aa(lp12390 -g15 -aI311 -aI-575 -aI263 -aI-605 -aI285 -aI-589 -aa(lp12391 -g15 -aI409 -aI-530 -aI338 -aI-560 -aI370 -aI-545 -aa(lp12392 -g15 -aI513 -aI-479 -aI448 -aI-514 -aI483 -aI-497 -aa(lp12393 -g15 -aI591 -aI-419 -aI544 -aI-461 -aI570 -aI-441 -aa(lp12394 -g15 -aI640 -aI-346 -aI613 -aI-397 -aI629 -aI-373 -aa(lp12395 -g15 -aI657 -aI-254 -aI651 -aI-319 -aI657 -aI-288 -aa(lp12396 -g15 -aI634 -aI-141 -aI657 -aI-212 -aI649 -aI-174 -aa(lp12397 -g15 -aI568 -aI-56 -aI619 -aI-107 -aI597 -aI-79 -aa(lp12398 -g15 -aI464 -aI-4 -aI539 -aI-33 -aI505 -aI-16 -aa(lp12399 -g15 -aI329 -aI13 -aI424 -aI7 -aI379 -aI13 -aa(lp12400 -g10 -aa(lp12401 -g8 -aI725 -aI0 -aa(lp12402 -g10 -aa(lp12403 -g8 -aI725 -aI0 -aasVW -(lp12404 -(lp12405 -g8 -aI768 -aI-942 -aa(lp12406 -g20 -aI934 -aI-364 -aa(lp12407 -g15 -aI968 -aI-237 -aI947 -aI-320 -aI958 -aI-278 -aa(lp12408 -g15 -aI992 -aI-130 -aI978 -aI-196 -aI986 -aI-161 -aa(lp12409 -g15 -aI1014 -aI-231 -aI998 -aI-162 -aI1006 -aI-196 -aa(lp12410 -g15 -aI1045 -aI-349 -aI1023 -aI-267 -aI1033 -aI-306 -aa(lp12411 -g20 -aI1162 -aI-760 -aa(lp12412 -g15 -aI1167 -aI-778 -aI1164 -aI-765 -aI1165 -aI-771 -aa(lp12413 -g15 -aI1171 -aI-797 -aI1169 -aI-784 -aI1170 -aI-791 -aa(lp12414 -g15 -aI1175 -aI-815 -aI1173 -aI-804 -aI1174 -aI-810 -aa(lp12415 -g15 -aI1177 -aI-830 -aI1176 -aI-821 -aI1177 -aI-826 -aa(lp12416 -g15 -aI1155 -aI-880 -aI1177 -aI-853 -aI1169 -aI-869 -aa(lp12417 -g15 -aI1089 -aI-895 -aI1140 -aI-890 -aI1118 -aI-895 -aa(lp12418 -g20 -aI1058 -aI-895 -aa(lp12419 -g20 -aI1058 -aI-951 -aa(lp12420 -g20 -aI1384 -aI-951 -aa(lp12421 -g20 -aI1384 -aI-895 -aa(lp12422 -g20 -aI1358 -aI-895 -aa(lp12423 -g15 -aI1324 -aI-891 -aI1345 -aI-895 -aI1334 -aI-894 -aa(lp12424 -g15 -aI1298 -aI-876 -aI1314 -aI-888 -aI1305 -aI-883 -aa(lp12425 -g15 -aI1276 -aI-845 -aI1290 -aI-869 -aI1283 -aI-858 -aa(lp12426 -g15 -aI1257 -aI-791 -aI1270 -aI-831 -aI1263 -aI-814 -aa(lp12427 -g20 -aI1031 -aI0 -aa(lp12428 -g20 -aI912 -aI0 -aa(lp12429 -g20 -aI694 -aI-746 -aa(lp12430 -g20 -aI490 -aI0 -aa(lp12431 -g20 -aI367 -aI0 -aa(lp12432 -g20 -aI123 -aI-825 -aa(lp12433 -g15 -aI109 -aI-859 -aI119 -aI-838 -aI114 -aI-850 -aa(lp12434 -g15 -aI89 -aI-881 -aI103 -aI-868 -aI97 -aI-875 -aa(lp12435 -g15 -aI63 -aI-892 -aI82 -aI-886 -aI73 -aI-889 -aa(lp12436 -g15 -aI29 -aI-895 -aI53 -aI-894 -aI42 -aI-895 -aa(lp12437 -g20 -aI11 -aI-895 -aa(lp12438 -g20 -aI11 -aI-951 -aa(lp12439 -g20 -aI378 -aI-951 -aa(lp12440 -g20 -aI378 -aI-895 -aa(lp12441 -g20 -aI348 -aI-895 -aa(lp12442 -g15 -aI288 -aI-880 -aI321 -aI-895 -aI301 -aI-890 -aa(lp12443 -g15 -aI268 -aI-831 -aI274 -aI-869 -aI268 -aI-853 -aa(lp12444 -g15 -aI271 -aI-808 -aI268 -aI-824 -aI269 -aI-816 -aa(lp12445 -g15 -aI278 -aI-782 -aI273 -aI-800 -aI276 -aI-792 -aa(lp12446 -g20 -aI401 -aI-355 -aa(lp12447 -g15 -aI432 -aI-236 -aI412 -aI-315 -aI422 -aI-275 -aa(lp12448 -g15 -aI458 -aI-130 -aI442 -aI-198 -aI451 -aI-162 -aa(lp12449 -g15 -aI482 -aI-244 -aI465 -aI-165 -aI473 -aI-202 -aa(lp12450 -g15 -aI513 -aI-369 -aI490 -aI-285 -aI501 -aI-327 -aa(lp12451 -g20 -aI671 -aI-942 -aa(lp12452 -g10 -aa(lp12453 -g8 -aI1395 -aI0 -aa(lp12454 -g10 -aa(lp12455 -g8 -aI1395 -aI0 -aasV[ -(lp12456 -(lp12457 -g8 -aI133 -aI171 -aa(lp12458 -g20 -aI133 -aI-1012 -aa(lp12459 -g20 -aI430 -aI-1012 -aa(lp12460 -g20 -aI430 -aI-956 -aa(lp12461 -g20 -aI373 -aI-956 -aa(lp12462 -g15 -aI331 -aI-953 -aI358 -aI-956 -aI344 -aI-955 -aa(lp12463 -g15 -aI296 -aI-939 -aI317 -aI-951 -aI306 -aI-946 -aa(lp12464 -g15 -aI272 -aI-911 -aI286 -aI-933 -aI278 -aI-923 -aa(lp12465 -g15 -aI264 -aI-860 -aI267 -aI-898 -aI264 -aI-881 -aa(lp12466 -g20 -aI264 -aI19 -aa(lp12467 -g15 -aI272 -aI69 -aI264 -aI40 -aI267 -aI56 -aa(lp12468 -g15 -aI296 -aI98 -aI278 -aI82 -aI286 -aI91 -aa(lp12469 -g15 -aI331 -aI111 -aI306 -aI105 -aI317 -aI109 -aa(lp12470 -g15 -aI373 -aI115 -aI344 -aI113 -aI358 -aI115 -aa(lp12471 -g20 -aI430 -aI115 -aa(lp12472 -g20 -aI430 -aI171 -aa(lp12473 -g10 -aa(lp12474 -g8 -aI478 -aI0 -aa(lp12475 -g10 -aa(lp12476 -g8 -aI478 -aI0 -aasV_ -(lp12477 -(lp12478 -g8 -aI618 -aI189 -aa(lp12479 -g20 -aI-6 -aI189 -aa(lp12480 -g20 -aI-6 -aI111 -aa(lp12481 -g20 -aI618 -aI111 -aa(lp12482 -g10 -aa(lp12483 -g8 -aI611 -aI0 -aa(lp12484 -g10 -aa(lp12485 -g8 -aI611 -aI0 -aasVc -(lp12486 -(lp12487 -g8 -aI377 -aI13 -aa(lp12488 -g15 -aI255 -aI-7 -aI333 -aI13 -aI292 -aI6 -aa(lp12489 -g15 -aI158 -aI-71 -aI217 -aI-20 -aI185 -aI-42 -aa(lp12490 -g15 -aI96 -aI-185 -aI131 -aI-101 -aI111 -aI-139 -aa(lp12491 -g15 -aI73 -aI-353 -aI81 -aI-231 -aI73 -aI-287 -aa(lp12492 -g15 -aI96 -aI-531 -aI73 -aI-424 -aI81 -aI-483 -aa(lp12493 -g15 -aI158 -aI-647 -aI111 -aI-579 -aI131 -aI-618 -aa(lp12494 -g15 -aI252 -aI-709 -aI185 -aI-676 -aI216 -aI-697 -aa(lp12495 -g15 -aI370 -aI-727 -aI289 -aI-721 -aI328 -aI-727 -aa(lp12496 -g15 -aI453 -aI-719 -aI398 -aI-727 -aI425 -aI-724 -aa(lp12497 -g15 -aI527 -aI-694 -aI481 -aI-713 -aI505 -aI-705 -aa(lp12498 -g15 -aI582 -aI-651 -aI550 -aI-682 -aI568 -aI-668 -aa(lp12499 -g15 -aI602 -aI-591 -aI595 -aI-634 -aI602 -aI-614 -aa(lp12500 -g15 -aI572 -aI-526 -aI602 -aI-560 -aI592 -aI-538 -aa(lp12501 -g15 -aI483 -aI-507 -aI552 -aI-513 -aI523 -aI-507 -aa(lp12502 -g15 -aI478 -aI-566 -aI483 -aI-528 -aI481 -aI-547 -aa(lp12503 -g15 -aI460 -aI-615 -aI475 -aI-585 -aI469 -aI-601 -aa(lp12504 -g15 -aI426 -aI-648 -aI452 -aI-629 -aI440 -aI-640 -aa(lp12505 -g15 -aI370 -aI-661 -aI411 -aI-656 -aI393 -aI-661 -aa(lp12506 -g15 -aI301 -aI-646 -aI344 -aI-661 -aI321 -aI-656 -aa(lp12507 -g15 -aI248 -aI-597 -aI280 -aI-637 -aI262 -aI-620 -aa(lp12508 -g15 -aI214 -aI-502 -aI233 -aI-573 -aI222 -aI-542 -aa(lp12509 -g15 -aI202 -aI-354 -aI206 -aI-463 -aI202 -aI-413 -aa(lp12510 -g15 -aI249 -aI-142 -aI202 -aI-259 -aI218 -aI-189 -aa(lp12511 -g15 -aI404 -aI-73 -aI281 -aI-96 -aI332 -aI-73 -aa(lp12512 -g15 -aI512 -aI-99 -aI445 -aI-73 -aI481 -aI-81 -aa(lp12513 -g15 -aI581 -aI-166 -aI543 -aI-116 -aI566 -aI-138 -aa(lp12514 -g15 -aI597 -aI-145 -aI587 -aI-161 -aI593 -aI-154 -aa(lp12515 -g15 -aI604 -aI-114 -aI601 -aI-136 -aI604 -aI-126 -aa(lp12516 -g15 -aI589 -aI-68 -aI604 -aI-98 -aI599 -aI-83 -aa(lp12517 -g15 -aI547 -aI-27 -aI580 -aI-53 -aI566 -aI-39 -aa(lp12518 -g15 -aI476 -aI2 -aI528 -aI-15 -aI504 -aI-5 -aa(lp12519 -g15 -aI377 -aI13 -aI448 -aI9 -aI415 -aI13 -aa(lp12520 -g10 -aa(lp12521 -g8 -aI656 -aI0 -aa(lp12522 -g10 -aa(lp12523 -g8 -aI656 -aI0 -aasVg -(lp12524 -(lp12525 -g8 -aI701 -aI-686 -aa(lp12526 -g15 -aI696 -aI-659 -aI701 -aI-676 -aI699 -aI-667 -aa(lp12527 -g15 -aI684 -aI-637 -aI694 -aI-650 -aI689 -aI-643 -aa(lp12528 -g15 -aI662 -aI-622 -aI678 -aI-630 -aI671 -aI-625 -aa(lp12529 -g15 -aI630 -aI-616 -aI653 -aI-618 -aI643 -aI-616 -aa(lp12530 -g15 -aI628 -aI-632 -aI630 -aI-621 -aI630 -aI-627 -aa(lp12531 -g15 -aI622 -aI-647 -aI627 -aI-637 -aI625 -aI-642 -aa(lp12532 -g15 -aI608 -aI-658 -aI618 -aI-651 -aI614 -aI-655 -aa(lp12533 -g15 -aI586 -aI-662 -aI603 -aI-660 -aI595 -aI-662 -aa(lp12534 -g15 -aI555 -aI-658 -aI575 -aI-662 -aI565 -aI-661 -aa(lp12535 -g15 -aI529 -aI-646 -aI546 -aI-655 -aI537 -aI-651 -aa(lp12536 -g15 -aI566 -aI-579 -aI544 -aI-627 -aI556 -aI-605 -aa(lp12537 -g15 -aI581 -aI-484 -aI576 -aI-554 -aI581 -aI-522 -aa(lp12538 -g15 -aI566 -aI-393 -aI581 -aI-451 -aI576 -aI-421 -aa(lp12539 -g15 -aI521 -aI-320 -aI556 -aI-365 -aI541 -aI-340 -aa(lp12540 -g15 -aI446 -aI-272 -aI502 -aI-300 -aI477 -aI-284 -aa(lp12541 -g15 -aI341 -aI-255 -aI416 -aI-261 -aI381 -aI-255 -aa(lp12542 -g15 -aI323 -aI-255 -aI335 -aI-255 -aI330 -aI-255 -aa(lp12543 -g15 -aI304 -aI-256 -aI317 -aI-255 -aI310 -aI-256 -aa(lp12544 -g15 -aI285 -aI-257 -aI297 -aI-256 -aI291 -aI-257 -aa(lp12545 -g15 -aI272 -aI-259 -aI280 -aI-258 -aI275 -aI-258 -aa(lp12546 -g15 -aI247 -aI-244 -aI263 -aI-254 -aI255 -aI-250 -aa(lp12547 -g15 -aI226 -aI-227 -aI239 -aI-239 -aI232 -aI-233 -aa(lp12548 -g15 -aI212 -aI-205 -aI221 -aI-220 -aI216 -aI-213 -aa(lp12549 -g15 -aI207 -aI-177 -aI209 -aI-197 -aI207 -aI-187 -aa(lp12550 -g15 -aI213 -aI-151 -aI207 -aI-167 -aI209 -aI-158 -aa(lp12551 -g15 -aI231 -aI-136 -aI217 -aI-145 -aI223 -aI-140 -aa(lp12552 -g15 -aI257 -aI-129 -aI238 -aI-132 -aI247 -aI-130 -aa(lp12553 -g15 -aI290 -aI-127 -aI267 -aI-128 -aI278 -aI-127 -aa(lp12554 -g20 -aI441 -aI-127 -aa(lp12555 -g15 -aI542 -aI-112 -aI481 -aI-127 -aI515 -aI-122 -aa(lp12556 -g15 -aI611 -aI-71 -aI570 -aI-102 -aI593 -aI-89 -aa(lp12557 -g15 -aI649 -aI-8 -aI628 -aI-53 -aI641 -aI-32 -aa(lp12558 -g15 -aI661 -aI71 -aI657 -aI16 -aI661 -aI42 -aa(lp12559 -g15 -aI640 -aI174 -aI661 -aI109 -aI654 -aI144 -aa(lp12560 -g15 -aI575 -aI253 -aI626 -aI205 -aI604 -aI231 -aa(lp12561 -g15 -aI465 -aI303 -aI546 -aI274 -aI509 -aI291 -aa(lp12562 -g15 -aI307 -aI320 -aI420 -aI314 -aI368 -aI320 -aa(lp12563 -g15 -aI99 -aI269 -aI215 -aI320 -aI145 -aI303 -aa(lp12564 -g15 -aI30 -aI126 -aI53 -aI235 -aI30 -aI187 -aa(lp12565 -g15 -aI44 -aI57 -aI30 -aI100 -aI35 -aI77 -aa(lp12566 -g15 -aI81 -aI7 -aI53 -aI38 -aI65 -aI21 -aa(lp12567 -g15 -aI134 -aI-26 -aI96 -aI-6 -aI114 -aI-17 -aa(lp12568 -g15 -aI197 -aI-45 -aI154 -aI-34 -aI175 -aI-41 -aa(lp12569 -g15 -aI170 -aI-60 -aI188 -aI-49 -aI179 -aI-54 -aa(lp12570 -g15 -aI147 -aI-84 -aI161 -aI-67 -aI154 -aI-75 -aa(lp12571 -g15 -aI130 -aI-115 -aI140 -aI-93 -aI134 -aI-103 -aa(lp12572 -g15 -aI123 -aI-154 -aI125 -aI-127 -aI123 -aI-140 -aa(lp12573 -g15 -aI144 -aI-223 -aI123 -aI-180 -aI130 -aI-203 -aa(lp12574 -g15 -aI210 -aI-279 -aI158 -aI-242 -aI180 -aI-261 -aa(lp12575 -g15 -aI159 -aI-311 -aI191 -aI-287 -aI174 -aI-298 -aa(lp12576 -g15 -aI122 -aI-358 -aI144 -aI-325 -aI132 -aI-341 -aa(lp12577 -g15 -aI98 -aI-416 -aI111 -aI-376 -aI104 -aI-395 -aa(lp12578 -g15 -aI90 -aI-480 -aI93 -aI-437 -aI90 -aI-458 -aa(lp12579 -g15 -aI106 -aI-584 -aI90 -aI-519 -aI95 -aI-553 -aa(lp12580 -g15 -aI152 -aI-661 -aI116 -aI-614 -aI132 -aI-640 -aa(lp12581 -g15 -aI231 -aI-710 -aI173 -aI-682 -aI199 -aI-699 -aa(lp12582 -g15 -aI341 -aI-727 -aI262 -aI-721 -aI299 -aI-727 -aa(lp12583 -g15 -aI388 -aI-723 -aI357 -aI-727 -aI373 -aI-726 -aa(lp12584 -g15 -aI431 -aI-714 -aI404 -aI-721 -aI418 -aI-718 -aa(lp12585 -g15 -aI467 -aI-700 -aI445 -aI-709 -aI457 -aI-705 -aa(lp12586 -g15 -aI493 -aI-683 -aI478 -aI-694 -aI486 -aI-689 -aa(lp12587 -g15 -aI516 -aI-706 -aI500 -aI-690 -aI507 -aI-698 -aa(lp12588 -g15 -aI545 -aI-730 -aI524 -aI-715 -aI534 -aI-723 -aa(lp12589 -g15 -aI581 -aI-748 -aI556 -aI-737 -aI568 -aI-743 -aa(lp12590 -g15 -aI622 -aI-755 -aI593 -aI-753 -aI607 -aI-755 -aa(lp12591 -g15 -aI657 -aI-749 -aI635 -aI-755 -aI647 -aI-753 -aa(lp12592 -g15 -aI681 -aI-734 -aI666 -aI-746 -aI675 -aI-741 -aa(lp12593 -g15 -aI696 -aI-712 -aI688 -aI-728 -aI693 -aI-721 -aa(lp12594 -g15 -aI701 -aI-686 -aI699 -aI-704 -aI701 -aI-695 -aa(lp12595 -g10 -aa(lp12596 -g8 -aI138 -aI117 -aa(lp12597 -g15 -aI146 -aI172 -aI138 -aI137 -aI141 -aI155 -aa(lp12598 -g15 -aI173 -aI215 -aI151 -aI189 -aI160 -aI203 -aa(lp12599 -g15 -aI226 -aI244 -aI186 -aI228 -aI204 -aI237 -aa(lp12600 -g15 -aI310 -aI255 -aI248 -aI251 -aI276 -aI255 -aa(lp12601 -g15 -aI428 -aI242 -aI358 -aI255 -aI397 -aI250 -aa(lp12602 -g15 -aI502 -aI209 -aI459 -aI234 -aI484 -aI223 -aa(lp12603 -g15 -aI541 -aI158 -aI520 -aI195 -aI533 -aI178 -aa(lp12604 -g15 -aI552 -aI93 -aI548 -aI138 -aI552 -aI116 -aa(lp12605 -g15 -aI543 -aI43 -aI552 -aI73 -aI549 -aI56 -aa(lp12606 -g15 -aI517 -aI11 -aI537 -aI29 -aI528 -aI19 -aa(lp12607 -g15 -aI474 -aI-4 -aI505 -aI4 -aI491 -aI-1 -aa(lp12608 -g15 -aI416 -aI-8 -aI457 -aI-7 -aI438 -aI-8 -aa(lp12609 -g20 -aI285 -aI-8 -aa(lp12610 -g15 -aI230 -aI-3 -aI266 -aI-8 -aI248 -aI-7 -aa(lp12611 -g15 -aI183 -aI14 -aI213 -aI0 -aI197 -aI5 -aa(lp12612 -g15 -aI151 -aI53 -aI170 -aI23 -aI159 -aI36 -aa(lp12613 -g15 -aI138 -aI117 -aI142 -aI69 -aI138 -aI91 -aa(lp12614 -g10 -aa(lp12615 -g8 -aI216 -aI-484 -aa(lp12616 -g15 -aI244 -aI-359 -aI216 -aI-427 -aI225 -aI-386 -aa(lp12617 -g15 -aI337 -aI-319 -aI263 -aI-333 -aI294 -aI-319 -aa(lp12618 -g15 -aI392 -aI-329 -aI358 -aI-319 -aI377 -aI-323 -aa(lp12619 -g15 -aI429 -aI-359 -aI407 -aI-336 -aI419 -aI-346 -aa(lp12620 -g15 -aI449 -aI-411 -aI438 -aI-373 -aI445 -aI-390 -aa(lp12621 -g15 -aI455 -aI-486 -aI453 -aI-432 -aI455 -aI-457 -aa(lp12622 -g15 -aI428 -aI-619 -aI455 -aI-546 -aI446 -aI-590 -aa(lp12623 -g15 -aI335 -aI-662 -aI410 -aI-647 -aI379 -aI-662 -aa(lp12624 -g15 -aI243 -aI-618 -aI292 -aI-662 -aI262 -aI-647 -aa(lp12625 -g15 -aI216 -aI-484 -aI225 -aI-589 -aI216 -aI-544 -aa(lp12626 -g10 -aa(lp12627 -g8 -aI717 -aI0 -aa(lp12628 -g10 -aa(lp12629 -g8 -aI717 -aI0 -aasVk -(lp12630 -(lp12631 -g8 -aI451 -aI-428 -aa(lp12632 -g20 -aI629 -aI-164 -aa(lp12633 -g15 -aI698 -aI-83 -aI652 -aI-129 -aI675 -aI-102 -aa(lp12634 -g15 -aI777 -aI-55 -aI721 -aI-64 -aI747 -aI-55 -aa(lp12635 -g20 -aI781 -aI-55 -aa(lp12636 -g20 -aI781 -aI0 -aa(lp12637 -g20 -aI762 -aI0 -aa(lp12638 -g15 -aI666 -aI-3 -aI723 -aI0 -aI691 -aI0 -aa(lp12639 -g15 -aI602 -aI-20 -aI642 -aI-5 -aI620 -aI-11 -aa(lp12640 -g15 -aI552 -aI-59 -aI583 -aI-28 -aI567 -aI-41 -aa(lp12641 -g15 -aI501 -aI-129 -aI536 -aI-76 -aI519 -aI-99 -aa(lp12642 -g20 -aI367 -aI-338 -aa(lp12643 -g20 -aI269 -aI-265 -aa(lp12644 -g20 -aI269 -aI-144 -aa(lp12645 -g15 -aI278 -aI-97 -aI269 -aI-125 -aI272 -aI-109 -aa(lp12646 -g15 -aI302 -aI-70 -aI284 -aI-85 -aI292 -aI-76 -aa(lp12647 -g15 -aI336 -aI-58 -aI312 -aI-64 -aI323 -aI-60 -aa(lp12648 -g15 -aI378 -aI-55 -aI350 -aI-56 -aI364 -aI-55 -aa(lp12649 -g20 -aI382 -aI-55 -aa(lp12650 -g20 -aI382 -aI0 -aa(lp12651 -g20 -aI24 -aI0 -aa(lp12652 -g20 -aI24 -aI-55 -aa(lp12653 -g20 -aI34 -aI-55 -aa(lp12654 -g15 -aI77 -aI-58 -aI49 -aI-55 -aI63 -aI-56 -aa(lp12655 -g15 -aI111 -aI-72 -aI90 -aI-60 -aI101 -aI-65 -aa(lp12656 -g15 -aI135 -aI-101 -aI121 -aI-78 -aI129 -aI-88 -aa(lp12657 -g15 -aI143 -aI-151 -aI140 -aI-113 -aI143 -aI-130 -aa(lp12658 -g20 -aI143 -aI-866 -aa(lp12659 -g15 -aI135 -aI-913 -aI143 -aI-885 -aI140 -aI-901 -aa(lp12660 -g15 -aI111 -aI-940 -aI129 -aI-925 -aI121 -aI-934 -aa(lp12661 -g15 -aI76 -aI-953 -aI101 -aI-947 -aI89 -aI-951 -aa(lp12662 -g15 -aI34 -aI-956 -aI63 -aI-955 -aI49 -aI-956 -aa(lp12663 -g20 -aI24 -aI-956 -aa(lp12664 -g20 -aI24 -aI-1012 -aa(lp12665 -g20 -aI269 -aI-1012 -aa(lp12666 -g20 -aI269 -aI-498 -aa(lp12667 -g15 -aI268 -aI-451 -aI269 -aI-486 -aI269 -aI-470 -aa(lp12668 -g15 -aI266 -aI-396 -aI268 -aI-432 -aI267 -aI-414 -aa(lp12669 -g15 -aI264 -aI-330 -aI266 -aI-375 -aI265 -aI-353 -aa(lp12670 -g20 -aI430 -aI-512 -aa(lp12671 -g15 -aI466 -aI-554 -aI445 -aI-528 -aI457 -aI-542 -aa(lp12672 -g15 -aI488 -aI-586 -aI475 -aI-567 -aI483 -aI-577 -aa(lp12673 -g15 -aI500 -aI-611 -aI494 -aI-595 -aI498 -aI-604 -aa(lp12674 -g15 -aI503 -aI-631 -aI502 -aI-618 -aI503 -aI-625 -aa(lp12675 -g15 -aI487 -aI-653 -aI503 -aI-642 -aI498 -aI-650 -aa(lp12676 -g15 -aI438 -aI-658 -aI477 -aI-656 -aI460 -aI-658 -aa(lp12677 -g20 -aI438 -aI-714 -aa(lp12678 -g20 -aI733 -aI-714 -aa(lp12679 -g20 -aI733 -aI-658 -aa(lp12680 -g15 -aI642 -aI-625 -aI702 -aI-658 -aI671 -aI-647 -aa(lp12681 -g15 -aI545 -aI-534 -aI612 -aI-604 -aI580 -aI-573 -aa(lp12682 -g10 -aa(lp12683 -g8 -aI779 -aI0 -aa(lp12684 -g10 -aa(lp12685 -g8 -aI779 -aI0 -aasVo -(lp12686 -(lp12687 -g8 -aI695 -aI-358 -aa(lp12688 -g15 -aI616 -aI-78 -aI695 -aI-232 -aI669 -aI-139 -aa(lp12689 -g15 -aI382 -aI13 -aI563 -aI-17 -aI485 -aI13 -aa(lp12690 -g15 -aI253 -aI-9 -aI334 -aI13 -aI291 -aI5 -aa(lp12691 -g15 -aI155 -aI-78 -aI215 -aI-24 -aI182 -aI-47 -aa(lp12692 -g15 -aI94 -aI-194 -aI129 -aI-109 -aI108 -aI-147 -aa(lp12693 -g15 -aI73 -aI-358 -aI80 -aI-241 -aI73 -aI-295 -aa(lp12694 -g15 -aI152 -aI-636 -aI73 -aI-482 -aI99 -aI-575 -aa(lp12695 -g15 -aI386 -aI-727 -aI205 -aI-697 -aI283 -aI-727 -aa(lp12696 -g15 -aI516 -aI-704 -aI434 -aI-727 -aI478 -aI-719 -aa(lp12697 -g15 -aI613 -aI-636 -aI554 -aI-689 -aI586 -aI-667 -aa(lp12698 -g15 -aI674 -aI-521 -aI640 -aI-605 -aI660 -aI-567 -aa(lp12699 -g15 -aI695 -aI-358 -aI688 -aI-475 -aI695 -aI-420 -aa(lp12700 -g10 -aa(lp12701 -g8 -aI202 -aI-358 -aa(lp12702 -g15 -aI212 -aI-227 -aI202 -aI-308 -aI205 -aI-265 -aa(lp12703 -g15 -aI243 -aI-132 -aI218 -aI-189 -aI229 -aI-158 -aa(lp12704 -g15 -aI300 -aI-75 -aI258 -aI-107 -aI277 -aI-88 -aa(lp12705 -g15 -aI385 -aI-55 -aI323 -aI-62 -aI351 -aI-55 -aa(lp12706 -g15 -aI470 -aI-75 -aI418 -aI-55 -aI447 -aI-62 -aa(lp12707 -g15 -aI526 -aI-132 -aI493 -aI-88 -aI511 -aI-107 -aa(lp12708 -g15 -aI556 -aI-227 -aI540 -aI-158 -aI550 -aI-189 -aa(lp12709 -g15 -aI566 -aI-358 -aI563 -aI-265 -aI566 -aI-308 -aa(lp12710 -g15 -aI556 -aI-488 -aI566 -aI-407 -aI563 -aI-451 -aa(lp12711 -g15 -aI525 -aI-581 -aI550 -aI-525 -aI539 -aI-556 -aa(lp12712 -g15 -aI469 -aI-638 -aI511 -aI-606 -aI492 -aI-625 -aa(lp12713 -g15 -aI384 -aI-657 -aI445 -aI-650 -aI417 -aI-657 -aa(lp12714 -g15 -aI299 -aI-638 -aI350 -aI-657 -aI322 -aI-650 -aa(lp12715 -g15 -aI243 -aI-581 -aI276 -aI-625 -aI257 -aI-606 -aa(lp12716 -g15 -aI212 -aI-488 -aI229 -aI-556 -aI218 -aI-525 -aa(lp12717 -g15 -aI202 -aI-358 -aI205 -aI-451 -aI202 -aI-407 -aa(lp12718 -g10 -aa(lp12719 -g8 -aI769 -aI0 -aa(lp12720 -g10 -aa(lp12721 -g8 -aI769 -aI0 -aasVs -(lp12722 -(lp12723 -g8 -aI279 -aI13 -aa(lp12724 -g15 -aI189 -aI4 -aI246 -aI13 -aI216 -aI10 -aa(lp12725 -g15 -aI119 -aI-22 -aI162 -aI-1 -aI138 -aI-10 -aa(lp12726 -g15 -aI75 -aI-66 -aI100 -aI-33 -aI85 -aI-48 -aa(lp12727 -g15 -aI59 -aI-127 -aI65 -aI-83 -aI59 -aI-104 -aa(lp12728 -g15 -aI68 -aI-172 -aI59 -aI-145 -aI62 -aI-160 -aa(lp12729 -g15 -aI90 -aI-200 -aI74 -aI-184 -aI81 -aI-193 -aa(lp12730 -g15 -aI117 -aI-215 -aI98 -aI-207 -aI107 -aI-212 -aa(lp12731 -g15 -aI143 -aI-219 -aI127 -aI-218 -aI136 -aI-219 -aa(lp12732 -g15 -aI151 -aI-153 -aI143 -aI-196 -aI146 -aI-174 -aa(lp12733 -g15 -aI175 -aI-100 -aI155 -aI-133 -aI163 -aI-115 -aa(lp12734 -g15 -aI219 -aI-63 -aI186 -aI-84 -aI201 -aI-72 -aa(lp12735 -g15 -aI287 -aI-50 -aI238 -aI-54 -aI260 -aI-50 -aa(lp12736 -g15 -aI350 -aI-59 -aI311 -aI-50 -aI332 -aI-53 -aa(lp12737 -g15 -aI396 -aI-83 -aI369 -aI-64 -aI384 -aI-73 -aa(lp12738 -g15 -aI425 -aI-122 -aI409 -aI-94 -aI418 -aI-107 -aa(lp12739 -g15 -aI434 -aI-171 -aI431 -aI-137 -aI434 -aI-153 -aa(lp12740 -g15 -aI427 -aI-214 -aI434 -aI-187 -aI432 -aI-202 -aa(lp12741 -g15 -aI401 -aI-247 -aI422 -aI-226 -aI413 -aI-237 -aa(lp12742 -g15 -aI350 -aI-279 -aI388 -aI-258 -aI372 -aI-268 -aa(lp12743 -g15 -aI270 -aI-316 -aI329 -aI-290 -aI302 -aI-302 -aa(lp12744 -g15 -aI181 -aI-360 -aI236 -aI-331 -aI206 -aI-346 -aa(lp12745 -g15 -aI118 -aI-406 -aI155 -aI-374 -aI134 -aI-389 -aa(lp12746 -g15 -aI81 -aI-462 -aI101 -aI-422 -aI89 -aI-441 -aa(lp12747 -g15 -aI69 -aI-537 -aI73 -aI-483 -aI69 -aI-508 -aa(lp12748 -g15 -aI86 -aI-618 -aI69 -aI-568 -aI74 -aI-595 -aa(lp12749 -g15 -aI138 -aI-677 -aI98 -aI-642 -aI115 -aI-661 -aa(lp12750 -g15 -aI217 -aI-713 -aI160 -aI-693 -aI186 -aI-705 -aa(lp12751 -g15 -aI320 -aI-726 -aI248 -aI-721 -aI282 -aI-726 -aa(lp12752 -g15 -aI404 -aI-716 -aI351 -aI-726 -aI379 -aI-722 -aa(lp12753 -g15 -aI465 -aI-689 -aI428 -aI-709 -aI449 -aI-701 -aa(lp12754 -g15 -aI502 -aI-650 -aI481 -aI-678 -aI494 -aI-665 -aa(lp12755 -g15 -aI514 -aI-603 -aI510 -aI-635 -aI514 -aI-620 -aa(lp12756 -g15 -aI489 -aI-545 -aI514 -aI-579 -aI506 -aI-559 -aa(lp12757 -g15 -aI418 -aI-523 -aI473 -aI-530 -aI449 -aI-523 -aa(lp12758 -g15 -aI390 -aI-627 -aI418 -aI-568 -aI409 -aI-603 -aa(lp12759 -g15 -aI304 -aI-664 -aI372 -aI-652 -aI343 -aI-664 -aa(lp12760 -g15 -aI246 -aI-657 -aI281 -aI-664 -aI262 -aI-662 -aa(lp12761 -g15 -aI206 -aI-634 -aI230 -aI-651 -aI216 -aI-644 -aa(lp12762 -g15 -aI184 -aI-601 -aI196 -aI-625 -aI189 -aI-614 -aa(lp12763 -g15 -aI177 -aI-558 -aI179 -aI-588 -aI177 -aI-573 -aa(lp12764 -g15 -aI186 -aI-514 -aI177 -aI-541 -aI180 -aI-526 -aa(lp12765 -g15 -aI215 -aI-480 -aI192 -aI-501 -aI201 -aI-490 -aa(lp12766 -g15 -aI266 -aI-449 -aI228 -aI-469 -aI245 -aI-459 -aa(lp12767 -g15 -aI342 -aI-416 -aI287 -aI-439 -aI312 -aI-429 -aa(lp12768 -g15 -aI432 -aI-373 -aI377 -aI-402 -aI407 -aI-387 -aa(lp12769 -g15 -aI495 -aI-326 -aI458 -aI-358 -aI478 -aI-343 -aa(lp12770 -g15 -aI531 -aI-269 -aI511 -aI-309 -aI523 -aI-290 -aa(lp12771 -g15 -aI542 -aI-195 -aI539 -aI-247 -aI542 -aI-223 -aa(lp12772 -g15 -aI524 -aI-104 -aI542 -aI-160 -aI536 -aI-130 -aa(lp12773 -g15 -aI470 -aI-38 -aI511 -aI-78 -aI493 -aI-56 -aa(lp12774 -g15 -aI387 -aI0 -aI447 -aI-21 -aI420 -aI-8 -aa(lp12775 -g15 -aI279 -aI13 -aI355 -aI9 -aI319 -aI13 -aa(lp12776 -g10 -aa(lp12777 -g8 -aI601 -aI0 -aa(lp12778 -g10 -aa(lp12779 -g8 -aI601 -aI0 -aasVw -(lp12780 -(lp12781 -g8 -aI634 -aI-710 -aa(lp12782 -g20 -aI768 -aI-315 -aa(lp12783 -g15 -aI784 -aI-263 -aI773 -aI-299 -aI778 -aI-281 -aa(lp12784 -g15 -aI801 -aI-208 -aI790 -aI-245 -aI796 -aI-226 -aa(lp12785 -g15 -aI815 -aI-157 -aI806 -aI-190 -aI811 -aI-173 -aa(lp12786 -g15 -aI825 -aI-116 -aI820 -aI-141 -aI823 -aI-128 -aa(lp12787 -g20 -aI829 -aI-116 -aa(lp12788 -g15 -aI848 -aI-198 -aI833 -aI-138 -aI839 -aI-166 -aa(lp12789 -g15 -aI881 -aI-311 -aI856 -aI-230 -aI868 -aI-268 -aa(lp12790 -g20 -aI947 -aI-526 -aa(lp12791 -g15 -aI956 -aI-562 -aI951 -aI-537 -aI954 -aI-549 -aa(lp12792 -g15 -aI960 -aI-592 -aI959 -aI-575 -aI960 -aI-585 -aa(lp12793 -g15 -aI938 -aI-642 -aI960 -aI-615 -aI953 -aI-632 -aa(lp12794 -g15 -aI871 -aI-658 -aI923 -aI-653 -aI901 -aI-658 -aa(lp12795 -g20 -aI862 -aI-658 -aa(lp12796 -g20 -aI862 -aI-714 -aa(lp12797 -g20 -aI1147 -aI-714 -aa(lp12798 -g20 -aI1147 -aI-658 -aa(lp12799 -g20 -aI1130 -aI-658 -aa(lp12800 -g15 -aI1097 -aI-654 -aI1117 -aI-658 -aI1106 -aI-657 -aa(lp12801 -g15 -aI1071 -aI-639 -aI1087 -aI-651 -aI1078 -aI-646 -aa(lp12802 -g15 -aI1050 -aI-607 -aI1063 -aI-631 -aI1056 -aI-621 -aa(lp12803 -g15 -aI1030 -aI-554 -aI1043 -aI-594 -aI1037 -aI-576 -aa(lp12804 -g20 -aI858 -aI0 -aa(lp12805 -g20 -aI751 -aI0 -aa(lp12806 -g20 -aI593 -aI-468 -aa(lp12807 -g20 -aI569 -aI-556 -aa(lp12808 -g20 -aI380 -aI0 -aa(lp12809 -g20 -aI274 -aI0 -aa(lp12810 -g20 -aI100 -aI-587 -aa(lp12811 -g15 -aI83 -aI-621 -aI95 -aI-601 -aI89 -aI-612 -aa(lp12812 -g15 -aI64 -aI-643 -aI78 -aI-631 -aI71 -aI-638 -aa(lp12813 -g15 -aI39 -aI-655 -aI57 -aI-649 -aI48 -aI-652 -aa(lp12814 -g15 -aI5 -aI-658 -aI29 -aI-657 -aI18 -aI-658 -aa(lp12815 -g20 -aI1 -aI-658 -aa(lp12816 -g20 -aI1 -aI-714 -aa(lp12817 -g20 -aI330 -aI-714 -aa(lp12818 -g20 -aI330 -aI-658 -aa(lp12819 -g20 -aI313 -aI-658 -aa(lp12820 -g15 -aI253 -aI-646 -aI286 -aI-658 -aI266 -aI-654 -aa(lp12821 -g15 -aI233 -aI-602 -aI239 -aI-638 -aI233 -aI-624 -aa(lp12822 -g15 -aI236 -aI-575 -aI233 -aI-595 -aI234 -aI-586 -aa(lp12823 -g15 -aI244 -aI-545 -aI239 -aI-565 -aI241 -aI-555 -aa(lp12824 -g20 -aI306 -aI-321 -aa(lp12825 -g15 -aI320 -aI-268 -aI310 -aI-305 -aI315 -aI-287 -aa(lp12826 -g15 -aI333 -aI-211 -aI325 -aI-249 -aI329 -aI-230 -aa(lp12827 -g15 -aI345 -aI-158 -aI337 -aI-192 -aI341 -aI-174 -aa(lp12828 -g15 -aI353 -aI-116 -aI348 -aI-141 -aI351 -aI-128 -aa(lp12829 -g20 -aI357 -aI-116 -aa(lp12830 -g15 -aI366 -aI-156 -aI359 -aI-128 -aI362 -aI-141 -aa(lp12831 -g15 -aI379 -aI-204 -aI369 -aI-171 -aI374 -aI-187 -aa(lp12832 -g15 -aI395 -aI-256 -aI384 -aI-221 -aI389 -aI-238 -aa(lp12833 -g15 -aI412 -aI-307 -aI400 -aI-274 -aI406 -aI-291 -aa(lp12834 -g20 -aI550 -aI-710 -aa(lp12835 -g10 -aa(lp12836 -g8 -aI1149 -aI0 -aa(lp12837 -g10 -aa(lp12838 -g8 -aI1149 -aI0 -aasV{ -(lp12839 -(lp12840 -g8 -aI416 -aI171 -aa(lp12841 -g15 -aI333 -aI157 -aI384 -aI171 -aI357 -aI166 -aa(lp12842 -g15 -aI272 -aI118 -aI308 -aI148 -aI288 -aI135 -aa(lp12843 -g15 -aI236 -aI58 -aI256 -aI102 -aI244 -aI82 -aa(lp12844 -g15 -aI223 -aI-21 -aI228 -aI35 -aI223 -aI8 -aa(lp12845 -g20 -aI223 -aI-252 -aa(lp12846 -g15 -aI211 -aI-320 -aI223 -aI-280 -aI219 -aI-302 -aa(lp12847 -g15 -aI178 -aI-363 -aI203 -aI-338 -aI192 -aI-352 -aa(lp12848 -g15 -aI128 -aI-385 -aI164 -aI-373 -aI147 -aI-381 -aa(lp12849 -g15 -aI66 -aI-394 -aI109 -aI-390 -aI88 -aI-393 -aa(lp12850 -g20 -aI66 -aI-450 -aa(lp12851 -g15 -aI128 -aI-457 -aI88 -aI-450 -aI109 -aI-453 -aa(lp12852 -g15 -aI178 -aI-480 -aI147 -aI-462 -aI164 -aI-469 -aa(lp12853 -g15 -aI211 -aI-522 -aI192 -aI-490 -aI203 -aI-505 -aa(lp12854 -g15 -aI223 -aI-590 -aI219 -aI-540 -aI223 -aI-563 -aa(lp12855 -g20 -aI223 -aI-822 -aa(lp12856 -g15 -aI272 -aI-963 -aI223 -aI-883 -aI240 -aI-930 -aa(lp12857 -g15 -aI416 -aI-1012 -aI304 -aI-996 -aI352 -aI-1012 -aa(lp12858 -g20 -aI503 -aI-1012 -aa(lp12859 -g20 -aI503 -aI-955 -aa(lp12860 -g20 -aI464 -aI-955 -aa(lp12861 -g15 -aI379 -aI-920 -aI424 -aI-955 -aI396 -aI-943 -aa(lp12862 -g15 -aI354 -aI-815 -aI363 -aI-896 -aI354 -aI-861 -aa(lp12863 -g20 -aI354 -aI-587 -aa(lp12864 -g15 -aI318 -aI-479 -aI354 -aI-544 -aI342 -aI-507 -aa(lp12865 -g15 -aI206 -aI-423 -aI293 -aI-450 -aI256 -aI-431 -aa(lp12866 -g20 -aI206 -aI-422 -aa(lp12867 -g15 -aI319 -aI-366 -aI257 -aI-413 -aI295 -aI-394 -aa(lp12868 -g15 -aI354 -aI-256 -aI342 -aI-337 -aI354 -aI-300 -aa(lp12869 -g20 -aI354 -aI-26 -aa(lp12870 -g15 -aI379 -aI77 -aI354 -aI19 -aI363 -aI54 -aa(lp12871 -g15 -aI464 -aI113 -aI396 -aI101 -aI424 -aI113 -aa(lp12872 -g20 -aI503 -aI113 -aa(lp12873 -g20 -aI503 -aI171 -aa(lp12874 -g10 -aa(lp12875 -g8 -aI570 -aI0 -aa(lp12876 -g10 -aa(lp12877 -g8 -aI570 -aI0 -aasV" -(lp12878 -(lp12879 -g8 -aI326 -aI-951 -aa(lp12880 -g20 -aI468 -aI-951 -aa(lp12881 -g20 -aI427 -aI-638 -aa(lp12882 -g20 -aI366 -aI-638 -aa(lp12883 -g10 -aa(lp12884 -g8 -aI76 -aI-951 -aa(lp12885 -g20 -aI217 -aI-951 -aa(lp12886 -g20 -aI177 -aI-638 -aa(lp12887 -g20 -aI115 -aI-638 -aa(lp12888 -g10 -aa(lp12889 -g8 -aI544 -aI0 -aa(lp12890 -g10 -aa(lp12891 -g8 -aI544 -aI0 -aasV& -(lp12892 -(lp12893 -g8 -aI764 -aI0 -aa(lp12894 -g20 -aI653 -aI-116 -aa(lp12895 -g15 -aI600 -aI-65 -aI637 -aI-98 -aI619 -aI-81 -aa(lp12896 -g15 -aI536 -aI-24 -aI581 -aI-49 -aI559 -aI-36 -aa(lp12897 -g15 -aI458 -aI3 -aI513 -aI-12 -aI487 -aI-3 -aa(lp12898 -g15 -aI365 -aI13 -aI430 -aI10 -aI399 -aI13 -aa(lp12899 -g15 -aI225 -aI-6 -aI311 -aI13 -aI265 -aI6 -aa(lp12900 -g15 -aI126 -aI-63 -aI185 -aI-20 -aI152 -aI-39 -aa(lp12901 -g15 -aI67 -aI-151 -aI100 -aI-88 -aI80 -aI-117 -aa(lp12902 -g15 -aI48 -aI-266 -aI54 -aI-186 -aI48 -aI-224 -aa(lp12903 -g15 -aI63 -aI-365 -aI48 -aI-304 -aI53 -aI-337 -aa(lp12904 -g15 -aI106 -aI-439 -aI73 -aI-393 -aI87 -aI-417 -aa(lp12905 -g15 -aI173 -aI-494 -aI124 -aI-460 -aI147 -aI-478 -aa(lp12906 -g15 -aI261 -aI-539 -aI199 -aI-511 -aI228 -aI-525 -aa(lp12907 -g15 -aI216 -aI-596 -aI244 -aI-559 -aI229 -aI-578 -aa(lp12908 -g15 -aI184 -aI-651 -aI203 -aI-615 -aI193 -aI-633 -aa(lp12909 -g15 -aI165 -aI-707 -aI176 -aI-670 -aI169 -aI-688 -aa(lp12910 -g15 -aI158 -aI-769 -aI161 -aI-726 -aI158 -aI-747 -aa(lp12911 -g15 -aI173 -aI-849 -aI158 -aI-798 -aI163 -aI-825 -aa(lp12912 -g15 -aI218 -aI-911 -aI182 -aI-873 -aI197 -aI-893 -aa(lp12913 -g15 -aI296 -aI-951 -aI238 -aI-928 -aI264 -aI-941 -aa(lp12914 -g15 -aI410 -aI-965 -aI328 -aI-960 -aI366 -aI-965 -aa(lp12915 -g15 -aI519 -aI-950 -aI453 -aI-965 -aI489 -aI-960 -aa(lp12916 -g15 -aI592 -aI-909 -aI549 -aI-940 -aI573 -aI-926 -aa(lp12917 -g15 -aI633 -aI-848 -aI611 -aI-891 -aI625 -aI-871 -aa(lp12918 -g15 -aI646 -aI-775 -aI642 -aI-825 -aI646 -aI-801 -aa(lp12919 -g15 -aI634 -aI-699 -aI646 -aI-746 -aI642 -aI-721 -aa(lp12920 -g15 -aI594 -aI-638 -aI625 -aI-677 -aI612 -aI-656 -aa(lp12921 -g15 -aI525 -aI-585 -aI576 -aI-619 -aI553 -aI-601 -aa(lp12922 -g15 -aI421 -aI-534 -aI496 -aI-568 -aI462 -aI-551 -aa(lp12923 -g20 -aI664 -aI-276 -aa(lp12924 -g15 -aI679 -aI-337 -aI670 -aI-296 -aI675 -aI-317 -aa(lp12925 -g15 -aI688 -aI-398 -aI682 -aI-358 -aI686 -aI-378 -aa(lp12926 -g15 -aI693 -aI-456 -aI690 -aI-418 -aI692 -aI-437 -aa(lp12927 -g15 -aI694 -aI-508 -aI694 -aI-475 -aI694 -aI-492 -aa(lp12928 -g20 -aI694 -aI-560 -aa(lp12929 -g20 -aI934 -aI-560 -aa(lp12930 -g20 -aI934 -aI-504 -aa(lp12931 -g20 -aI922 -aI-504 -aa(lp12932 -g15 -aI878 -aI-502 -aI907 -aI-504 -aI893 -aI-503 -aa(lp12933 -g15 -aI838 -aI-490 -aI864 -aI-500 -aI851 -aI-496 -aa(lp12934 -g15 -aI805 -aI-462 -aI826 -aI-483 -aI815 -aI-474 -aa(lp12935 -g15 -aI782 -aI-414 -aI795 -aI-450 -aI788 -aI-434 -aa(lp12936 -g15 -aI755 -aI-321 -aI774 -aI-385 -aI765 -aI-354 -aa(lp12937 -g15 -aI717 -aI-220 -aI745 -aI-287 -aI732 -aI-254 -aa(lp12938 -g20 -aI841 -aI-88 -aa(lp12939 -g15 -aI861 -aI-72 -aI847 -aI-82 -aI854 -aI-76 -aa(lp12940 -g15 -aI885 -aI-62 -aI868 -aI-68 -aI876 -aI-64 -aa(lp12941 -g15 -aI918 -aI-56 -aI895 -aI-59 -aI906 -aI-57 -aa(lp12942 -g15 -aI965 -aI-55 -aI931 -aI-55 -aI947 -aI-55 -aa(lp12943 -g20 -aI977 -aI-55 -aa(lp12944 -g20 -aI977 -aI0 -aa(lp12945 -g10 -aa(lp12946 -g8 -aI377 -aI-60 -aa(lp12947 -g15 -aI450 -aI-68 -aI403 -aI-60 -aI427 -aI-63 -aa(lp12948 -g15 -aI511 -aI-91 -aI472 -aI-74 -aI493 -aI-81 -aa(lp12949 -g15 -aI563 -aI-125 -aI530 -aI-100 -aI547 -aI-112 -aa(lp12950 -g15 -aI605 -aI-168 -aI578 -aI-138 -aI592 -aI-153 -aa(lp12951 -g20 -aI310 -aI-484 -aa(lp12952 -g15 -aI255 -aI-447 -aI290 -aI-473 -aI271 -aI-460 -aa(lp12953 -g15 -aI213 -aI-399 -aI239 -aI-433 -aI225 -aI-417 -aa(lp12954 -g15 -aI187 -aI-338 -aI202 -aI-381 -aI193 -aI-361 -aa(lp12955 -g15 -aI178 -aI-261 -aI181 -aI-316 -aI178 -aI-290 -aa(lp12956 -g15 -aI192 -aI-175 -aI178 -aI-229 -aI183 -aI-200 -aa(lp12957 -g15 -aI233 -aI-112 -aI202 -aI-150 -aI215 -aI-129 -aa(lp12958 -g15 -aI296 -aI-73 -aI250 -aI-95 -aI271 -aI-82 -aa(lp12959 -g15 -aI377 -aI-60 -aI320 -aI-65 -aI347 -aI-60 -aa(lp12960 -g10 -aa(lp12961 -g8 -aI529 -aI-774 -aa(lp12962 -g15 -aI522 -aI-823 -aI529 -aI-792 -aI527 -aI-808 -aa(lp12963 -g15 -aI501 -aI-863 -aI518 -aI-838 -aI511 -aI-852 -aa(lp12964 -g15 -aI463 -aI-889 -aI491 -aI-874 -aI479 -aI-883 -aa(lp12965 -g15 -aI405 -aI-899 -aI447 -aI-896 -aI428 -aI-899 -aa(lp12966 -g15 -aI314 -aI-864 -aI366 -aI-899 -aI335 -aI-887 -aa(lp12967 -g15 -aI282 -aI-772 -aI293 -aI-841 -aI282 -aI-811 -aa(lp12968 -g15 -aI287 -aI-725 -aI282 -aI-756 -aI284 -aI-740 -aa(lp12969 -g15 -aI304 -aI-681 -aI291 -aI-710 -aI296 -aI-696 -aa(lp12970 -g15 -aI333 -aI-636 -aI311 -aI-666 -aI321 -aI-651 -aa(lp12971 -g15 -aI376 -aI-584 -aI345 -aI-620 -aI359 -aI-603 -aa(lp12972 -g15 -aI444 -aI-620 -aI402 -aI-596 -aI425 -aI-608 -aa(lp12973 -g15 -aI492 -aI-661 -aI463 -aI-633 -aI479 -aI-647 -aa(lp12974 -g15 -aI520 -aI-711 -aI504 -aI-676 -aI514 -aI-693 -aa(lp12975 -g15 -aI529 -aI-774 -aI526 -aI-730 -aI529 -aI-750 -aa(lp12976 -g10 -aa(lp12977 -g8 -aI989 -aI0 -aa(lp12978 -g10 -aa(lp12979 -g8 -aI989 -aI0 -aasV* -(lp12980 -(lp12981 -g8 -aI54 -aI-825 -aa(lp12982 -g20 -aI101 -aI-930 -aa(lp12983 -g20 -aI306 -aI-800 -aa(lp12984 -g20 -aI272 -aI-1012 -aa(lp12985 -g20 -aI388 -aI-1012 -aa(lp12986 -g20 -aI350 -aI-802 -aa(lp12987 -g20 -aI557 -aI-927 -aa(lp12988 -g20 -aI604 -aI-823 -aa(lp12989 -g20 -aI378 -aI-758 -aa(lp12990 -g20 -aI604 -aI-692 -aa(lp12991 -g20 -aI557 -aI-590 -aa(lp12992 -g20 -aI350 -aI-714 -aa(lp12993 -g20 -aI388 -aI-503 -aa(lp12994 -g20 -aI272 -aI-503 -aa(lp12995 -g20 -aI305 -aI-714 -aa(lp12996 -g20 -aI101 -aI-587 -aa(lp12997 -g20 -aI54 -aI-691 -aa(lp12998 -g20 -aI278 -aI-758 -aa(lp12999 -g10 -aa(lp13000 -g8 -aI666 -aI0 -aa(lp13001 -g10 -aa(lp13002 -g8 -aI666 -aI0 -aasV. -(lp13003 -(lp13004 -g8 -aI106 -aI-80 -aa(lp13005 -g15 -aI113 -aI-124 -aI106 -aI-98 -aI108 -aI-112 -aa(lp13006 -g15 -aI131 -aI-151 -aI117 -aI-135 -aI123 -aI-144 -aa(lp13007 -g15 -aI157 -aI-166 -aI138 -aI-158 -aI147 -aI-163 -aa(lp13008 -g15 -aI190 -aI-171 -aI168 -aI-169 -aI179 -aI-171 -aa(lp13009 -g15 -aI222 -aI-166 -aI202 -aI-171 -aI212 -aI-169 -aa(lp13010 -g15 -aI249 -aI-151 -aI233 -aI-163 -aI242 -aI-158 -aa(lp13011 -g15 -aI267 -aI-124 -aI257 -aI-144 -aI263 -aI-135 -aa(lp13012 -g15 -aI274 -aI-80 -aI272 -aI-112 -aI274 -aI-98 -aa(lp13013 -g15 -aI267 -aI-37 -aI274 -aI-64 -aI272 -aI-49 -aa(lp13014 -g15 -aI249 -aI-9 -aI263 -aI-26 -aI257 -aI-16 -aa(lp13015 -g15 -aI222 -aI5 -aI242 -aI-3 -aI233 -aI1 -aa(lp13016 -g15 -aI190 -aI9 -aI212 -aI8 -aI202 -aI9 -aa(lp13017 -g15 -aI157 -aI5 -aI179 -aI9 -aI168 -aI8 -aa(lp13018 -g15 -aI131 -aI-9 -aI147 -aI1 -aI138 -aI-3 -aa(lp13019 -g15 -aI113 -aI-37 -aI123 -aI-16 -aI117 -aI-26 -aa(lp13020 -g15 -aI106 -aI-80 -aI108 -aI-49 -aI106 -aI-64 -aa(lp13021 -g10 -aa(lp13022 -g8 -aI381 -aI0 -aa(lp13023 -g10 -aa(lp13024 -g8 -aI381 -aI0 -aasV2 -(lp13025 -(lp13026 -g8 -aI614 -aI-742 -aa(lp13027 -g15 -aI599 -aI-651 -aI614 -aI-711 -aI609 -aI-680 -aa(lp13028 -g15 -aI555 -aI-560 -aI589 -aI-621 -aI575 -aI-591 -aa(lp13029 -g15 -aI486 -aI-463 -aI536 -aI-529 -aI513 -aI-497 -aa(lp13030 -g15 -aI391 -aI-355 -aI458 -aI-430 -aI427 -aI-394 -aa(lp13031 -g20 -aI166 -aI-106 -aa(lp13032 -g20 -aI474 -aI-106 -aa(lp13033 -g15 -aI524 -aI-114 -aI494 -aI-106 -aI511 -aI-109 -aa(lp13034 -g15 -aI555 -aI-136 -aI537 -aI-120 -aI547 -aI-127 -aa(lp13035 -g15 -aI575 -aI-168 -aI564 -aI-146 -aI570 -aI-156 -aa(lp13036 -g15 -aI586 -aI-205 -aI579 -aI-180 -aI583 -aI-192 -aa(lp13037 -g20 -aI591 -aI-230 -aa(lp13038 -g20 -aI647 -aI-230 -aa(lp13039 -g20 -aI641 -aI0 -aa(lp13040 -g20 -aI67 -aI0 -aa(lp13041 -g20 -aI67 -aI-97 -aa(lp13042 -g20 -aI290 -aI-354 -aa(lp13043 -g15 -aI379 -aI-465 -aI325 -aI-395 -aI355 -aI-432 -aa(lp13044 -g15 -aI438 -aI-557 -aI403 -aI-497 -aI423 -aI-528 -aa(lp13045 -g15 -aI470 -aI-641 -aI452 -aI-586 -aI463 -aI-614 -aa(lp13046 -g15 -aI479 -aI-728 -aI476 -aI-669 -aI479 -aI-698 -aa(lp13047 -g15 -aI471 -aI-798 -aI479 -aI-754 -aI477 -aI-777 -aa(lp13048 -g15 -aI446 -aI-851 -aI466 -aI-818 -aI458 -aI-836 -aa(lp13049 -g15 -aI404 -aI-885 -aI435 -aI-866 -aI421 -aI-877 -aa(lp13050 -g15 -aI343 -aI-897 -aI387 -aI-893 -aI367 -aI-897 -aa(lp13051 -g15 -aI269 -aI-881 -aI313 -aI-897 -aI288 -aI-892 -aa(lp13052 -g15 -aI225 -aI-838 -aI250 -aI-870 -aI236 -aI-856 -aa(lp13053 -g15 -aI203 -aI-774 -aI214 -aI-819 -aI207 -aI-798 -aa(lp13054 -g15 -aI197 -aI-699 -aI199 -aI-751 -aI197 -aI-725 -aa(lp13055 -g15 -aI152 -aI-703 -aI181 -aI-699 -aI166 -aI-700 -aa(lp13056 -g15 -aI115 -aI-717 -aI138 -aI-705 -aI126 -aI-710 -aa(lp13057 -g15 -aI91 -aI-744 -aI105 -aI-724 -aI97 -aI-732 -aa(lp13058 -g15 -aI82 -aI-786 -aI85 -aI-755 -aI82 -aI-769 -aa(lp13059 -g15 -aI99 -aI-857 -aI82 -aI-811 -aI88 -aI-835 -aa(lp13060 -g15 -aI148 -aI-914 -aI110 -aI-879 -aI126 -aI-898 -aa(lp13061 -g15 -aI230 -aI-951 -aI170 -aI-930 -aI197 -aI-942 -aa(lp13062 -g15 -aI343 -aI-965 -aI263 -aI-960 -aI300 -aI-965 -aa(lp13063 -g15 -aI457 -aI-949 -aI385 -aI-965 -aI423 -aI-959 -aa(lp13064 -g15 -aI542 -aI-904 -aI490 -aI-938 -aI518 -aI-923 -aa(lp13065 -g15 -aI596 -aI-834 -aI565 -aI-884 -aI583 -aI-861 -aa(lp13066 -g15 -aI614 -aI-742 -aI608 -aI-806 -aI614 -aI-776 -aa(lp13067 -g10 -aa(lp13068 -g8 -aI745 -aI0 -aa(lp13069 -g10 -aa(lp13070 -g8 -aI745 -aI0 -aasV6 -(lp13071 -(lp13072 -g8 -aI429 -aI-900 -aa(lp13073 -g15 -aI277 -aI-801 -aI362 -aI-900 -aI311 -aI-867 -aa(lp13074 -g15 -aI218 -aI-508 -aI243 -aI-736 -aI223 -aI-638 -aa(lp13075 -g15 -aI254 -aI-535 -aI229 -aI-517 -aI241 -aI-526 -aa(lp13076 -g15 -aI298 -aI-557 -aI268 -aI-543 -aI282 -aI-550 -aa(lp13077 -g15 -aI349 -aI-572 -aI313 -aI-563 -aI330 -aI-568 -aa(lp13078 -g15 -aI409 -aI-578 -aI367 -aI-576 -aI387 -aI-578 -aa(lp13079 -g15 -aI520 -aI-559 -aI450 -aI-578 -aI487 -aI-572 -aa(lp13080 -g15 -aI604 -aI-505 -aI553 -aI-546 -aI581 -aI-528 -aa(lp13081 -g15 -aI658 -aI-419 -aI627 -aI-481 -aI645 -aI-453 -aa(lp13082 -g15 -aI677 -aI-304 -aI670 -aI-385 -aI677 -aI-347 -aa(lp13083 -g15 -aI657 -aI-175 -aI677 -aI-258 -aI670 -aI-215 -aa(lp13084 -g15 -aI601 -aI-75 -aI645 -aI-136 -aI626 -aI-103 -aa(lp13085 -g15 -aI512 -aI-9 -aI577 -aI-47 -aI547 -aI-25 -aa(lp13086 -g15 -aI390 -aI13 -aI476 -aI5 -aI436 -aI13 -aa(lp13087 -g15 -aI267 -aI-14 -aI346 -aI13 -aI305 -aI4 -aa(lp13088 -g15 -aI169 -aI-101 -aI229 -aI-32 -aI197 -aI-61 -aa(lp13089 -g15 -aI104 -aI-254 -aI142 -aI-141 -aI120 -aI-192 -aa(lp13090 -g15 -aI81 -aI-479 -aI89 -aI-316 -aI81 -aI-391 -aa(lp13091 -g15 -aI90 -aI-603 -aI81 -aI-521 -aI84 -aI-562 -aa(lp13092 -g15 -aI119 -aI-717 -aI97 -aI-643 -aI106 -aI-681 -aa(lp13093 -g15 -aI166 -aI-817 -aI131 -aI-753 -aI147 -aI-786 -aa(lp13094 -g15 -aI234 -aI-895 -aI185 -aI-847 -aI208 -aI-873 -aa(lp13095 -g15 -aI321 -aI-946 -aI259 -aI-917 -aI289 -aI-934 -aa(lp13096 -g15 -aI429 -aI-965 -aI354 -aI-958 -aI389 -aI-965 -aa(lp13097 -g15 -aI526 -aI-953 -aI466 -aI-965 -aI498 -aI-961 -aa(lp13098 -g15 -aI595 -aI-922 -aI553 -aI-945 -aI576 -aI-935 -aa(lp13099 -g15 -aI635 -aI-877 -aI613 -aI-909 -aI626 -aI-894 -aa(lp13100 -g15 -aI649 -aI-825 -aI644 -aI-860 -aI649 -aI-842 -aa(lp13101 -g15 -aI623 -aI-765 -aI649 -aI-799 -aI640 -aI-779 -aa(lp13102 -g15 -aI546 -aI-744 -aI605 -aI-751 -aI580 -aI-744 -aa(lp13103 -g15 -aI540 -aI-805 -aI546 -aI-766 -aI544 -aI-786 -aa(lp13104 -g15 -aI520 -aI-855 -aI536 -aI-824 -aI529 -aI-841 -aa(lp13105 -g15 -aI483 -aI-888 -aI510 -aI-869 -aI498 -aI-880 -aa(lp13106 -g15 -aI429 -aI-900 -aI468 -aI-896 -aI450 -aI-900 -aa(lp13107 -g10 -aa(lp13108 -g8 -aI382 -aI-509 -aa(lp13109 -g15 -aI332 -aI-503 -aI365 -aI-509 -aI348 -aI-507 -aa(lp13110 -g15 -aI287 -aI-485 -aI316 -aI-498 -aI301 -aI-492 -aa(lp13111 -g15 -aI248 -aI-460 -aI273 -aI-478 -aI260 -aI-470 -aa(lp13112 -g15 -aI217 -aI-433 -aI236 -aI-451 -aI226 -aI-442 -aa(lp13113 -g15 -aI231 -aI-261 -aI218 -aI-366 -aI222 -aI-309 -aa(lp13114 -g15 -aI266 -aI-146 -aI239 -aI-214 -aI251 -aI-175 -aa(lp13115 -g15 -aI322 -aI-80 -aI282 -aI-116 -aI300 -aI-94 -aa(lp13116 -g15 -aI394 -aI-59 -aI343 -aI-66 -aI368 -aI-59 -aa(lp13117 -g15 -aI503 -aI-115 -aI442 -aI-59 -aI478 -aI-77 -aa(lp13118 -g15 -aI541 -aI-291 -aI528 -aI-152 -aI541 -aI-211 -aa(lp13119 -g15 -aI500 -aI-457 -aI541 -aI-367 -aI527 -aI-423 -aa(lp13120 -g15 -aI382 -aI-509 -aI473 -aI-492 -aI434 -aI-509 -aa(lp13121 -g10 -aa(lp13122 -g8 -aI745 -aI0 -aa(lp13123 -g10 -aa(lp13124 -g8 -aI745 -aI0 -aasV: -(lp13125 -(lp13126 -g8 -aI108 -aI-80 -aa(lp13127 -g15 -aI114 -aI-124 -aI108 -aI-98 -aI110 -aI-112 -aa(lp13128 -g15 -aI132 -aI-151 -aI118 -aI-135 -aI124 -aI-144 -aa(lp13129 -g15 -aI159 -aI-166 -aI140 -aI-158 -aI148 -aI-163 -aa(lp13130 -g15 -aI192 -aI-171 -aI169 -aI-169 -aI180 -aI-171 -aa(lp13131 -g15 -aI224 -aI-166 -aI203 -aI-171 -aI214 -aI-169 -aa(lp13132 -g15 -aI250 -aI-151 -aI234 -aI-163 -aI243 -aI-158 -aa(lp13133 -g15 -aI269 -aI-124 -aI258 -aI-144 -aI264 -aI-135 -aa(lp13134 -g15 -aI276 -aI-80 -aI273 -aI-112 -aI276 -aI-98 -aa(lp13135 -g15 -aI269 -aI-37 -aI276 -aI-64 -aI273 -aI-49 -aa(lp13136 -g15 -aI250 -aI-9 -aI264 -aI-26 -aI258 -aI-16 -aa(lp13137 -g15 -aI224 -aI5 -aI243 -aI-3 -aI234 -aI1 -aa(lp13138 -g15 -aI192 -aI9 -aI214 -aI8 -aI203 -aI9 -aa(lp13139 -g15 -aI159 -aI5 -aI180 -aI9 -aI169 -aI8 -aa(lp13140 -g15 -aI132 -aI-9 -aI148 -aI1 -aI140 -aI-3 -aa(lp13141 -g15 -aI114 -aI-37 -aI124 -aI-16 -aI118 -aI-26 -aa(lp13142 -g15 -aI108 -aI-80 -aI110 -aI-49 -aI108 -aI-64 -aa(lp13143 -g10 -aa(lp13144 -g8 -aI108 -aI-630 -aa(lp13145 -g15 -aI114 -aI-673 -aI108 -aI-647 -aI110 -aI-662 -aa(lp13146 -g15 -aI132 -aI-701 -aI118 -aI-685 -aI124 -aI-694 -aa(lp13147 -g15 -aI159 -aI-716 -aI140 -aI-708 -aI148 -aI-713 -aa(lp13148 -g15 -aI192 -aI-720 -aI169 -aI-719 -aI180 -aI-720 -aa(lp13149 -g15 -aI224 -aI-716 -aI203 -aI-720 -aI214 -aI-719 -aa(lp13150 -g15 -aI250 -aI-701 -aI234 -aI-713 -aI243 -aI-708 -aa(lp13151 -g15 -aI269 -aI-673 -aI258 -aI-694 -aI264 -aI-685 -aa(lp13152 -g15 -aI276 -aI-630 -aI273 -aI-662 -aI276 -aI-647 -aa(lp13153 -g15 -aI269 -aI-587 -aI276 -aI-613 -aI273 -aI-599 -aa(lp13154 -g15 -aI250 -aI-559 -aI264 -aI-575 -aI258 -aI-566 -aa(lp13155 -g15 -aI224 -aI-543 -aI243 -aI-551 -aI234 -aI-546 -aa(lp13156 -g15 -aI192 -aI-539 -aI214 -aI-540 -aI203 -aI-539 -aa(lp13157 -g15 -aI159 -aI-543 -aI180 -aI-539 -aI169 -aI-540 -aa(lp13158 -g15 -aI132 -aI-559 -aI148 -aI-546 -aI140 -aI-551 -aa(lp13159 -g15 -aI114 -aI-587 -aI124 -aI-566 -aI118 -aI-575 -aa(lp13160 -g15 -aI108 -aI-630 -aI110 -aI-599 -aI108 -aI-613 -aa(lp13161 -g10 -aa(lp13162 -g8 -aI382 -aI0 -aa(lp13163 -g10 -aa(lp13164 -g8 -aI382 -aI0 -aasV> -(lp13165 -(lp13166 -g8 -aI86 -aI-146 -aa(lp13167 -g20 -aI86 -aI-235 -aa(lp13168 -g20 -aI534 -aI-475 -aa(lp13169 -g20 -aI86 -aI-718 -aa(lp13170 -g20 -aI86 -aI-807 -aa(lp13171 -g20 -aI658 -aI-499 -aa(lp13172 -g20 -aI658 -aI-452 -aa(lp13173 -g10 -aa(lp13174 -g8 -aI745 -aI0 -aa(lp13175 -g10 -aa(lp13176 -g8 -aI745 -aI0 -aasVB -(lp13177 -(lp13178 -g8 -aI750 -aI-713 -aa(lp13179 -g15 -aI737 -aI-634 -aI750 -aI-683 -aI746 -aI-656 -aa(lp13180 -g15 -aI703 -aI-575 -aI729 -aI-611 -aI717 -aI-591 -aa(lp13181 -g15 -aI650 -aI-532 -aI688 -aI-558 -aI670 -aI-543 -aa(lp13182 -g15 -aI585 -aI-503 -aI630 -aI-520 -aI608 -aI-511 -aa(lp13183 -g20 -aI585 -aI-498 -aa(lp13184 -g15 -aI668 -aI-471 -aI615 -aI-493 -aI643 -aI-484 -aa(lp13185 -g15 -aI733 -aI-422 -aI693 -aI-458 -aI715 -aI-442 -aa(lp13186 -g15 -aI775 -aI-350 -aI751 -aI-402 -aI765 -aI-378 -aa(lp13187 -g15 -aI790 -aI-256 -aI785 -aI-323 -aI790 -aI-291 -aa(lp13188 -g15 -aI705 -aI-63 -aI790 -aI-170 -aI762 -aI-106 -aa(lp13189 -g15 -aI447 -aI0 -aI649 -aI-20 -aI563 -aI0 -aa(lp13190 -g20 -aI50 -aI0 -aa(lp13191 -g20 -aI50 -aI-55 -aa(lp13192 -g20 -aI67 -aI-55 -aa(lp13193 -g15 -aI110 -aI-58 -aI82 -aI-55 -aI97 -aI-56 -aa(lp13194 -g15 -aI145 -aI-72 -aI123 -aI-60 -aI135 -aI-65 -aa(lp13195 -g15 -aI168 -aI-101 -aI155 -aI-78 -aI162 -aI-88 -aa(lp13196 -g15 -aI177 -aI-151 -aI174 -aI-113 -aI177 -aI-130 -aa(lp13197 -g20 -aI177 -aI-804 -aa(lp13198 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp13199 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp13200 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp13201 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp13202 -g20 -aI50 -aI-895 -aa(lp13203 -g20 -aI50 -aI-951 -aa(lp13204 -g20 -aI408 -aI-951 -aa(lp13205 -g15 -aI666 -aI-893 -aI523 -aI-951 -aI609 -aI-932 -aa(lp13206 -g15 -aI750 -aI-713 -aI722 -aI-855 -aI750 -aI-795 -aa(lp13207 -g10 -aa(lp13208 -g8 -aI311 -aI-65 -aa(lp13209 -g20 -aI441 -aI-65 -aa(lp13210 -g15 -aI537 -aI-76 -aI479 -aI-65 -aI511 -aI-69 -aa(lp13211 -g15 -aI600 -aI-109 -aI563 -aI-83 -aI584 -aI-94 -aa(lp13212 -g15 -aI636 -aI-170 -aI617 -aI-125 -aI629 -aI-145 -aa(lp13213 -g15 -aI647 -aI-260 -aI644 -aI-194 -aI647 -aI-225 -aa(lp13214 -g15 -aI638 -aI-351 -aI647 -aI-295 -aI644 -aI-325 -aa(lp13215 -g15 -aI604 -aI-414 -aI631 -aI-376 -aI620 -aI-397 -aa(lp13216 -g15 -aI541 -aI-452 -aI588 -aI-431 -aI567 -aI-444 -aa(lp13217 -g15 -aI444 -aI-465 -aI515 -aI-460 -aI483 -aI-465 -aa(lp13218 -g20 -aI311 -aI-465 -aa(lp13219 -g10 -aa(lp13220 -g8 -aI311 -aI-531 -aa(lp13221 -g20 -aI404 -aI-531 -aa(lp13222 -g15 -aI501 -aI-541 -aI443 -aI-531 -aI475 -aI-534 -aa(lp13223 -g15 -aI564 -aI-574 -aI527 -aI-548 -aI548 -aI-559 -aa(lp13224 -g15 -aI597 -aI-630 -aI580 -aI-588 -aI591 -aI-607 -aa(lp13225 -g15 -aI608 -aI-713 -aI604 -aI-653 -aI608 -aI-680 -aa(lp13226 -g15 -aI597 -aI-794 -aI608 -aI-745 -aI604 -aI-772 -aa(lp13227 -g15 -aI561 -aI-847 -aI589 -aI-816 -aI577 -aI-834 -aa(lp13228 -g15 -aI497 -aI-876 -aI544 -aI-861 -aI523 -aI-870 -aa(lp13229 -g15 -aI401 -aI-884 -aI470 -aI-882 -aI438 -aI-884 -aa(lp13230 -g20 -aI311 -aI-884 -aa(lp13231 -g10 -aa(lp13232 -g8 -aI871 -aI0 -aa(lp13233 -g10 -aa(lp13234 -g8 -aI871 -aI0 -aasVF -(lp13235 -(lp13236 -g8 -aI311 -aI-884 -aa(lp13237 -g20 -aI311 -aI-499 -aa(lp13238 -g20 -aI633 -aI-499 -aa(lp13239 -g20 -aI633 -aI-434 -aa(lp13240 -g20 -aI311 -aI-434 -aa(lp13241 -g20 -aI311 -aI-151 -aa(lp13242 -g15 -aI320 -aI-101 -aI311 -aI-130 -aI314 -aI-113 -aa(lp13243 -g15 -aI344 -aI-72 -aI326 -aI-88 -aI334 -aI-78 -aa(lp13244 -g15 -aI378 -aI-58 -aI353 -aI-65 -aI365 -aI-60 -aa(lp13245 -g15 -aI421 -aI-55 -aI392 -aI-56 -aI406 -aI-55 -aa(lp13246 -g20 -aI465 -aI-55 -aa(lp13247 -g20 -aI465 -aI0 -aa(lp13248 -g20 -aI50 -aI0 -aa(lp13249 -g20 -aI50 -aI-55 -aa(lp13250 -g20 -aI67 -aI-55 -aa(lp13251 -g15 -aI109 -aI-58 -aI82 -aI-55 -aI96 -aI-56 -aa(lp13252 -g15 -aI144 -aI-70 -aI122 -aI-60 -aI134 -aI-64 -aa(lp13253 -g15 -aI168 -aI-97 -aI154 -aI-76 -aI162 -aI-85 -aa(lp13254 -g15 -aI177 -aI-144 -aI174 -aI-109 -aI177 -aI-125 -aa(lp13255 -g20 -aI177 -aI-804 -aa(lp13256 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp13257 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp13258 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp13259 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp13260 -g20 -aI50 -aI-895 -aa(lp13261 -g20 -aI50 -aI-951 -aa(lp13262 -g20 -aI722 -aI-951 -aa(lp13263 -g20 -aI729 -aI-718 -aa(lp13264 -g20 -aI660 -aI-718 -aa(lp13265 -g20 -aI653 -aI-775 -aa(lp13266 -g15 -aI643 -aI-818 -aI651 -aI-790 -aI648 -aI-804 -aa(lp13267 -g15 -aI620 -aI-852 -aI638 -aI-831 -aI630 -aI-842 -aa(lp13268 -g15 -aI583 -aI-876 -aI611 -aI-862 -aI598 -aI-870 -aa(lp13269 -g15 -aI530 -aI-884 -aI569 -aI-882 -aI551 -aI-884 -aa(lp13270 -g10 -aa(lp13271 -g8 -aI786 -aI0 -aa(lp13272 -g10 -aa(lp13273 -g8 -aI786 -aI0 -aasVJ -(lp13274 -(lp13275 -g8 -aI-14 -aI257 -aa(lp13276 -g20 -aI-2 -aI257 -aa(lp13277 -g15 -aI73 -aI245 -aI26 -aI257 -aI51 -aI253 -aa(lp13278 -g15 -aI130 -aI205 -aI96 -aI237 -aI115 -aI224 -aa(lp13279 -g15 -aI165 -aI129 -aI145 -aI186 -aI157 -aI161 -aa(lp13280 -g15 -aI177 -aI12 -aI173 -aI98 -aI177 -aI59 -aa(lp13281 -g20 -aI177 -aI-804 -aa(lp13282 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp13283 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp13284 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp13285 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp13286 -g20 -aI50 -aI-895 -aa(lp13287 -g20 -aI50 -aI-951 -aa(lp13288 -g20 -aI438 -aI-951 -aa(lp13289 -g20 -aI438 -aI-895 -aa(lp13290 -g20 -aI421 -aI-895 -aa(lp13291 -g15 -aI378 -aI-892 -aI406 -aI-895 -aI392 -aI-894 -aa(lp13292 -g15 -aI344 -aI-878 -aI365 -aI-889 -aI353 -aI-885 -aa(lp13293 -g15 -aI320 -aI-849 -aI334 -aI-872 -aI326 -aI-862 -aa(lp13294 -g15 -aI311 -aI-799 -aI314 -aI-837 -aI311 -aI-820 -aa(lp13295 -g20 -aI311 -aI10 -aa(lp13296 -g15 -aI288 -aI160 -aI311 -aI70 -aI304 -aI120 -aa(lp13297 -g15 -aI223 -aI255 -aI272 -aI199 -aI251 -aI231 -aa(lp13298 -g15 -aI127 -aI305 -aI196 -aI278 -aI164 -aI295 -aa(lp13299 -g15 -aI7 -aI320 -aI90 -aI315 -aI50 -aI320 -aa(lp13300 -g20 -aI-14 -aI320 -aa(lp13301 -g10 -aa(lp13302 -g8 -aI475 -aI0 -aa(lp13303 -g10 -aa(lp13304 -g8 -aI475 -aI0 -aasVN -(lp13305 -(lp13306 -g8 -aI758 -aI0 -aa(lp13307 -g20 -aI258 -aI-767 -aa(lp13308 -g20 -aI258 -aI-151 -aa(lp13309 -g15 -aI267 -aI-101 -aI258 -aI-130 -aI261 -aI-113 -aa(lp13310 -g15 -aI290 -aI-72 -aI273 -aI-88 -aI280 -aI-78 -aa(lp13311 -g15 -aI325 -aI-58 -aI300 -aI-65 -aI312 -aI-60 -aa(lp13312 -g15 -aI367 -aI-55 -aI338 -aI-56 -aI353 -aI-55 -aa(lp13313 -g20 -aI385 -aI-55 -aa(lp13314 -g20 -aI385 -aI0 -aa(lp13315 -g20 -aI50 -aI0 -aa(lp13316 -g20 -aI50 -aI-55 -aa(lp13317 -g20 -aI67 -aI-55 -aa(lp13318 -g15 -aI110 -aI-58 -aI82 -aI-55 -aI97 -aI-56 -aa(lp13319 -g15 -aI145 -aI-72 -aI123 -aI-60 -aI135 -aI-65 -aa(lp13320 -g15 -aI168 -aI-101 -aI155 -aI-78 -aI162 -aI-88 -aa(lp13321 -g15 -aI177 -aI-151 -aI174 -aI-113 -aI177 -aI-130 -aa(lp13322 -g20 -aI177 -aI-804 -aa(lp13323 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp13324 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp13325 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp13326 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp13327 -g20 -aI50 -aI-895 -aa(lp13328 -g20 -aI50 -aI-951 -aa(lp13329 -g20 -aI294 -aI-951 -aa(lp13330 -g20 -aI772 -aI-214 -aa(lp13331 -g20 -aI772 -aI-804 -aa(lp13332 -g15 -aI763 -aI-852 -aI772 -aI-824 -aI769 -aI-840 -aa(lp13333 -g15 -aI739 -aI-879 -aI757 -aI-864 -aI749 -aI-873 -aa(lp13334 -g15 -aI704 -aI-892 -aI729 -aI-886 -aI717 -aI-890 -aa(lp13335 -g15 -aI662 -aI-895 -aI691 -aI-894 -aI677 -aI-895 -aa(lp13336 -g20 -aI645 -aI-895 -aa(lp13337 -g20 -aI645 -aI-951 -aa(lp13338 -g20 -aI979 -aI-951 -aa(lp13339 -g20 -aI979 -aI-895 -aa(lp13340 -g20 -aI962 -aI-895 -aa(lp13341 -g15 -aI920 -aI-892 -aI947 -aI-895 -aI933 -aI-894 -aa(lp13342 -g15 -aI885 -aI-878 -aI907 -aI-889 -aI895 -aI-885 -aa(lp13343 -g15 -aI861 -aI-849 -aI875 -aI-872 -aI867 -aI-862 -aa(lp13344 -g15 -aI853 -aI-799 -aI856 -aI-837 -aI853 -aI-820 -aa(lp13345 -g20 -aI853 -aI0 -aa(lp13346 -g10 -aa(lp13347 -g8 -aI1017 -aI0 -aa(lp13348 -g10 -aa(lp13349 -g8 -aI1017 -aI0 -aasVR -(lp13350 -(lp13351 -g8 -aI738 -aI-162 -aa(lp13352 -g15 -aI804 -aI-82 -aI761 -aI-126 -aI783 -aI-100 -aa(lp13353 -g15 -aI878 -aI-55 -aI825 -aI-64 -aI850 -aI-55 -aa(lp13354 -g20 -aI882 -aI-55 -aa(lp13355 -g20 -aI882 -aI0 -aa(lp13356 -g20 -aI863 -aI0 -aa(lp13357 -g15 -aI761 -aI-4 -aI822 -aI0 -aI788 -aI-1 -aa(lp13358 -g15 -aI693 -aI-21 -aI734 -aI-7 -aI712 -aI-13 -aa(lp13359 -g15 -aI645 -aI-58 -aI674 -aI-30 -aI658 -aI-42 -aa(lp13360 -g15 -aI602 -aI-119 -aI632 -aI-73 -aI618 -aI-94 -aa(lp13361 -g20 -aI422 -aI-419 -aa(lp13362 -g20 -aI311 -aI-419 -aa(lp13363 -g20 -aI311 -aI-144 -aa(lp13364 -g15 -aI320 -aI-97 -aI311 -aI-125 -aI314 -aI-109 -aa(lp13365 -g15 -aI344 -aI-70 -aI326 -aI-85 -aI334 -aI-76 -aa(lp13366 -g15 -aI379 -aI-58 -aI354 -aI-64 -aI365 -aI-60 -aa(lp13367 -g15 -aI421 -aI-55 -aI392 -aI-56 -aI406 -aI-55 -aa(lp13368 -g20 -aI438 -aI-55 -aa(lp13369 -g20 -aI438 -aI0 -aa(lp13370 -g20 -aI50 -aI0 -aa(lp13371 -g20 -aI50 -aI-55 -aa(lp13372 -g20 -aI67 -aI-55 -aa(lp13373 -g15 -aI109 -aI-58 -aI82 -aI-55 -aI96 -aI-56 -aa(lp13374 -g15 -aI144 -aI-70 -aI122 -aI-60 -aI134 -aI-64 -aa(lp13375 -g15 -aI168 -aI-97 -aI154 -aI-76 -aI162 -aI-85 -aa(lp13376 -g15 -aI177 -aI-144 -aI174 -aI-109 -aI177 -aI-125 -aa(lp13377 -g20 -aI177 -aI-804 -aa(lp13378 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp13379 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp13380 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp13381 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp13382 -g20 -aI50 -aI-895 -aa(lp13383 -g20 -aI50 -aI-951 -aa(lp13384 -g20 -aI409 -aI-951 -aa(lp13385 -g15 -aI667 -aI-887 -aI524 -aI-951 -aI610 -aI-929 -aa(lp13386 -g15 -aI751 -aI-694 -aI723 -aI-844 -aI751 -aI-780 -aa(lp13387 -g15 -aI734 -aI-600 -aI751 -aI-658 -aI746 -aI-627 -aa(lp13388 -g15 -aI689 -aI-531 -aI723 -aI-574 -aI708 -aI-550 -aa(lp13389 -g15 -aI626 -aI-482 -aI670 -aI-511 -aI649 -aI-495 -aa(lp13390 -g15 -aI555 -aI-451 -aI602 -aI-469 -aI579 -aI-459 -aa(lp13391 -g10 -aa(lp13392 -g8 -aI311 -aI-481 -aa(lp13393 -g20 -aI405 -aI-481 -aa(lp13394 -g15 -aI503 -aI-494 -aI444 -aI-481 -aI477 -aI-486 -aa(lp13395 -g15 -aI565 -aI-534 -aI529 -aI-503 -aI550 -aI-516 -aa(lp13396 -g15 -aI599 -aI-599 -aI581 -aI-551 -aI592 -aI-573 -aa(lp13397 -g15 -aI609 -aI-690 -aI606 -aI-625 -aI609 -aI-655 -aa(lp13398 -g15 -aI598 -aI-781 -aI609 -aI-725 -aI605 -aI-756 -aa(lp13399 -g15 -aI562 -aI-842 -aI590 -aI-806 -aI578 -aI-826 -aa(lp13400 -g15 -aI498 -aI-876 -aI546 -aI-858 -aI524 -aI-869 -aa(lp13401 -g15 -aI402 -aI-887 -aI472 -aI-883 -aI440 -aI-887 -aa(lp13402 -g20 -aI311 -aI-887 -aa(lp13403 -g10 -aa(lp13404 -g8 -aI874 -aI0 -aa(lp13405 -g10 -aa(lp13406 -g8 -aI874 -aI0 -aasVV -(lp13407 -(lp13408 -g8 -aI399 -aI0 -aa(lp13409 -g20 -aI111 -aI-825 -aa(lp13410 -g15 -aI96 -aI-859 -aI107 -aI-838 -aI101 -aI-850 -aa(lp13411 -g15 -aI76 -aI-881 -aI90 -aI-868 -aI84 -aI-875 -aa(lp13412 -g15 -aI51 -aI-892 -aI69 -aI-886 -aI60 -aI-889 -aa(lp13413 -g15 -aI17 -aI-895 -aI41 -aI-894 -aI30 -aI-895 -aa(lp13414 -g20 -aI0 -aI-895 -aa(lp13415 -g20 -aI0 -aI-951 -aa(lp13416 -g20 -aI366 -aI-951 -aa(lp13417 -g20 -aI366 -aI-895 -aa(lp13418 -g20 -aI335 -aI-895 -aa(lp13419 -g15 -aI275 -aI-880 -aI309 -aI-895 -aI288 -aI-890 -aa(lp13420 -g15 -aI255 -aI-831 -aI262 -aI-869 -aI255 -aI-853 -aa(lp13421 -g15 -aI258 -aI-808 -aI255 -aI-824 -aI256 -aI-816 -aa(lp13422 -g15 -aI266 -aI-782 -aI260 -aI-800 -aI263 -aI-792 -aa(lp13423 -g20 -aI413 -aI-349 -aa(lp13424 -g15 -aI447 -aI-234 -aI426 -aI-309 -aI438 -aI-271 -aa(lp13425 -g15 -aI473 -aI-130 -aI457 -aI-197 -aI465 -aI-162 -aa(lp13426 -g15 -aI498 -aI-232 -aI480 -aI-162 -aI488 -aI-196 -aa(lp13427 -g15 -aI534 -aI-349 -aI507 -aI-268 -aI519 -aI-307 -aa(lp13428 -g20 -aI681 -aI-772 -aa(lp13429 -g15 -aI690 -aI-804 -aI685 -aI-783 -aI687 -aI-794 -aa(lp13430 -g15 -aI693 -aI-830 -aI692 -aI-814 -aI693 -aI-822 -aa(lp13431 -g15 -aI671 -aI-880 -aI693 -aI-853 -aI686 -aI-869 -aa(lp13432 -g15 -aI605 -aI-895 -aI657 -aI-890 -aI634 -aI-895 -aa(lp13433 -g20 -aI574 -aI-895 -aa(lp13434 -g20 -aI574 -aI-951 -aa(lp13435 -g20 -aI899 -aI-951 -aa(lp13436 -g20 -aI899 -aI-895 -aa(lp13437 -g20 -aI874 -aI-895 -aa(lp13438 -g15 -aI840 -aI-891 -aI861 -aI-895 -aI850 -aI-894 -aa(lp13439 -g15 -aI815 -aI-876 -aI831 -aI-888 -aI823 -aI-883 -aa(lp13440 -g15 -aI794 -aI-844 -aI807 -aI-868 -aI800 -aI-858 -aa(lp13441 -g15 -aI773 -aI-791 -aI787 -aI-831 -aI780 -aI-813 -aa(lp13442 -g20 -aI497 -aI0 -aa(lp13443 -g10 -aa(lp13444 -g8 -aI899 -aI0 -aa(lp13445 -g10 -aa(lp13446 -g8 -aI899 -aI0 -aasVZ -(lp13447 -(lp13448 -g8 -aI712 -aI-896 -aa(lp13449 -g20 -aI210 -aI-65 -aa(lp13450 -g20 -aI546 -aI-65 -aa(lp13451 -g15 -aI597 -aI-74 -aI566 -aI-65 -aI583 -aI-68 -aa(lp13452 -g15 -aI629 -aI-98 -aI610 -aI-80 -aI621 -aI-88 -aa(lp13453 -g15 -aI648 -aI-133 -aI637 -aI-108 -aI644 -aI-120 -aa(lp13454 -g15 -aI657 -aI-175 -aI652 -aI-146 -aI655 -aI-160 -aa(lp13455 -g20 -aI664 -aI-232 -aa(lp13456 -g20 -aI733 -aI-232 -aa(lp13457 -g20 -aI726 -aI0 -aa(lp13458 -g20 -aI48 -aI0 -aa(lp13459 -g20 -aI48 -aI-52 -aa(lp13460 -g20 -aI548 -aI-884 -aa(lp13461 -g20 -aI258 -aI-884 -aa(lp13462 -g15 -aI209 -aI-876 -aI238 -aI-884 -aI222 -aI-882 -aa(lp13463 -g15 -aI177 -aI-852 -aI196 -aI-870 -aI185 -aI-862 -aa(lp13464 -g15 -aI158 -aI-817 -aI168 -aI-842 -aI162 -aI-830 -aa(lp13465 -g15 -aI149 -aI-775 -aI153 -aI-804 -aI150 -aI-790 -aa(lp13466 -g20 -aI142 -aI-718 -aa(lp13467 -g20 -aI73 -aI-718 -aa(lp13468 -g20 -aI80 -aI-951 -aa(lp13469 -g20 -aI712 -aI-951 -aa(lp13470 -g10 -aa(lp13471 -g8 -aI789 -aI0 -aa(lp13472 -g10 -aa(lp13473 -g8 -aI789 -aI0 -aasV^ -(lp13474 -(lp13475 -g8 -aI348 -aI-951 -aa(lp13476 -g20 -aI394 -aI-951 -aa(lp13477 -g20 -aI675 -aI-354 -aa(lp13478 -g20 -aI586 -aI-354 -aa(lp13479 -g20 -aI370 -aI-828 -aa(lp13480 -g20 -aI157 -aI-354 -aa(lp13481 -g20 -aI67 -aI-354 -aa(lp13482 -g10 -aa(lp13483 -g8 -aI745 -aI0 -aa(lp13484 -g10 -aa(lp13485 -g8 -aI745 -aI0 -aasVb -(lp13486 -(lp13487 -g8 -aI745 -aI-358 -aa(lp13488 -g15 -aI727 -aI-191 -aI745 -aI-294 -aI739 -aI-238 -aa(lp13489 -g15 -aI675 -aI-75 -aI715 -aI-144 -aI698 -aI-106 -aa(lp13490 -g15 -aI589 -aI-8 -aI652 -aI-45 -aI623 -aI-22 -aa(lp13491 -g15 -aI473 -aI13 -aI555 -aI6 -aI517 -aI13 -aa(lp13492 -g15 -aI403 -aI5 -aI447 -aI13 -aI424 -aI10 -aa(lp13493 -g15 -aI347 -aI-19 -aI382 -aI0 -aI364 -aI-8 -aa(lp13494 -g15 -aI303 -aI-56 -aI330 -aI-29 -aI315 -aI-41 -aa(lp13495 -g15 -aI269 -aI-103 -aI290 -aI-70 -aI279 -aI-86 -aa(lp13496 -g20 -aI261 -aI-103 -aa(lp13497 -g20 -aI237 -aI0 -aa(lp13498 -g20 -aI24 -aI0 -aa(lp13499 -g20 -aI24 -aI-55 -aa(lp13500 -g20 -aI34 -aI-55 -aa(lp13501 -g15 -aI77 -aI-58 -aI49 -aI-55 -aI63 -aI-56 -aa(lp13502 -g15 -aI111 -aI-72 -aI90 -aI-60 -aI101 -aI-65 -aa(lp13503 -g15 -aI135 -aI-101 -aI121 -aI-78 -aI129 -aI-88 -aa(lp13504 -g15 -aI143 -aI-151 -aI140 -aI-113 -aI143 -aI-130 -aa(lp13505 -g20 -aI143 -aI-866 -aa(lp13506 -g15 -aI135 -aI-913 -aI143 -aI-885 -aI140 -aI-901 -aa(lp13507 -g15 -aI111 -aI-940 -aI129 -aI-925 -aI121 -aI-934 -aa(lp13508 -g15 -aI76 -aI-953 -aI101 -aI-947 -aI89 -aI-951 -aa(lp13509 -g15 -aI34 -aI-956 -aI63 -aI-955 -aI49 -aI-956 -aa(lp13510 -g20 -aI24 -aI-956 -aa(lp13511 -g20 -aI24 -aI-1012 -aa(lp13512 -g20 -aI269 -aI-1012 -aa(lp13513 -g20 -aI269 -aI-767 -aa(lp13514 -g15 -aI268 -aI-715 -aI269 -aI-752 -aI269 -aI-735 -aa(lp13515 -g15 -aI266 -aI-658 -aI268 -aI-695 -aI267 -aI-676 -aa(lp13516 -g15 -aI264 -aI-593 -aI266 -aI-637 -aI265 -aI-616 -aa(lp13517 -g20 -aI269 -aI-593 -aa(lp13518 -g15 -aI303 -aI-649 -aI279 -aI-614 -aI290 -aI-632 -aa(lp13519 -g15 -aI347 -aI-691 -aI315 -aI-665 -aI330 -aI-679 -aa(lp13520 -g15 -aI402 -aI-717 -aI363 -aI-702 -aI382 -aI-711 -aa(lp13521 -g15 -aI473 -aI-727 -aI423 -aI-724 -aI447 -aI-727 -aa(lp13522 -g15 -aI589 -aI-705 -aI517 -aI-727 -aI555 -aI-720 -aa(lp13523 -g15 -aI675 -aI-638 -aI623 -aI-691 -aI652 -aI-668 -aa(lp13524 -g15 -aI727 -aI-523 -aI698 -aI-608 -aI715 -aI-570 -aa(lp13525 -g15 -aI745 -aI-358 -aI739 -aI-477 -aI745 -aI-422 -aa(lp13526 -g10 -aa(lp13527 -g8 -aI450 -aI-642 -aa(lp13528 -g15 -aI363 -aI-624 -aI415 -aI-642 -aI386 -aI-636 -aa(lp13529 -g15 -aI307 -aI-572 -aI340 -aI-613 -aI321 -aI-595 -aa(lp13530 -g15 -aI278 -aI-483 -aI294 -aI-549 -aI284 -aI-519 -aa(lp13531 -g15 -aI269 -aI-358 -aI272 -aI-448 -aI269 -aI-406 -aa(lp13532 -g15 -aI278 -aI-235 -aI269 -aI-311 -aI272 -aI-270 -aa(lp13533 -g15 -aI308 -aI-145 -aI284 -aI-199 -aI294 -aI-169 -aa(lp13534 -g15 -aI364 -aI-90 -aI322 -aI-121 -aI341 -aI-102 -aa(lp13535 -g15 -aI451 -aI-71 -aI387 -aI-77 -aI416 -aI-71 -aa(lp13536 -g15 -aI527 -aI-90 -aI481 -aI-71 -aI506 -aI-77 -aa(lp13537 -g15 -aI577 -aI-145 -aI547 -aI-102 -aI564 -aI-121 -aa(lp13538 -g15 -aI606 -aI-235 -aI591 -aI-169 -aI600 -aI-199 -aa(lp13539 -g15 -aI615 -aI-359 -aI612 -aI-271 -aI615 -aI-312 -aa(lp13540 -g15 -aI606 -aI-483 -aI615 -aI-406 -aI612 -aI-448 -aa(lp13541 -g15 -aI577 -aI-571 -aI600 -aI-518 -aI591 -aI-548 -aa(lp13542 -g15 -aI526 -aI-624 -aI564 -aI-595 -aI547 -aI-612 -aa(lp13543 -g15 -aI450 -aI-642 -aI505 -aI-636 -aI480 -aI-642 -aa(lp13544 -g10 -aa(lp13545 -g8 -aI818 -aI0 -aa(lp13546 -g10 -aa(lp13547 -g8 -aI818 -aI0 -aasVf -(lp13548 -(lp13549 -g8 -aI447 -aI-55 -aa(lp13550 -g20 -aI447 -aI0 -aa(lp13551 -g20 -aI35 -aI0 -aa(lp13552 -g20 -aI35 -aI-55 -aa(lp13553 -g20 -aI53 -aI-55 -aa(lp13554 -g15 -aI96 -aI-58 -aI68 -aI-55 -aI82 -aI-56 -aa(lp13555 -g15 -aI130 -aI-72 -aI109 -aI-60 -aI120 -aI-65 -aa(lp13556 -g15 -aI153 -aI-101 -aI140 -aI-78 -aI148 -aI-88 -aa(lp13557 -g15 -aI162 -aI-151 -aI159 -aI-113 -aI162 -aI-130 -aa(lp13558 -g20 -aI162 -aI-651 -aa(lp13559 -g20 -aI41 -aI-651 -aa(lp13560 -g20 -aI41 -aI-714 -aa(lp13561 -g20 -aI162 -aI-714 -aa(lp13562 -g20 -aI162 -aI-780 -aa(lp13563 -g15 -aI179 -aI-886 -aI162 -aI-820 -aI168 -aI-855 -aa(lp13564 -g15 -aI225 -aI-963 -aI189 -aI-916 -aI205 -aI-942 -aa(lp13565 -g15 -aI300 -aI-1010 -aI246 -aI-983 -aI271 -aI-999 -aa(lp13566 -g15 -aI398 -aI-1026 -aI329 -aI-1020 -aI361 -aI-1026 -aa(lp13567 -g15 -aI486 -aI-1019 -aI433 -aI-1026 -aI462 -aI-1023 -aa(lp13568 -g15 -aI543 -aI-1000 -aI510 -aI-1014 -aI529 -aI-1008 -aa(lp13569 -g15 -aI575 -aI-970 -aI558 -aI-991 -aI569 -aI-982 -aa(lp13570 -g15 -aI585 -aI-933 -aI582 -aI-959 -aI585 -aI-947 -aa(lp13571 -g15 -aI577 -aI-900 -aI585 -aI-920 -aI582 -aI-910 -aa(lp13572 -g15 -aI554 -aI-877 -aI571 -aI-891 -aI564 -aI-883 -aa(lp13573 -g15 -aI519 -aI-863 -aI544 -aI-871 -aI533 -aI-866 -aa(lp13574 -g15 -aI475 -aI-858 -aI506 -aI-859 -aI491 -aI-858 -aa(lp13575 -g15 -aI471 -aI-897 -aI475 -aI-871 -aI474 -aI-884 -aa(lp13576 -g15 -aI457 -aI-931 -aI468 -aI-910 -aI464 -aI-921 -aa(lp13577 -g15 -aI430 -aI-955 -aI450 -aI-941 -aI441 -aI-949 -aa(lp13578 -g15 -aI388 -aI-965 -aI419 -aI-962 -aI404 -aI-965 -aa(lp13579 -g15 -aI340 -aI-953 -aI368 -aI-965 -aI352 -aI-961 -aa(lp13580 -g15 -aI309 -aI-921 -aI327 -aI-946 -aI317 -aI-935 -aa(lp13581 -g15 -aI292 -aI-867 -aI301 -aI-906 -aI295 -aI-888 -aa(lp13582 -g15 -aI287 -aI-793 -aI289 -aI-846 -aI287 -aI-821 -aa(lp13583 -g20 -aI287 -aI-714 -aa(lp13584 -g20 -aI475 -aI-714 -aa(lp13585 -g20 -aI475 -aI-651 -aa(lp13586 -g20 -aI287 -aI-651 -aa(lp13587 -g20 -aI287 -aI-151 -aa(lp13588 -g15 -aI296 -aI-101 -aI287 -aI-130 -aI290 -aI-113 -aa(lp13589 -g15 -aI319 -aI-72 -aI302 -aI-88 -aI310 -aI-78 -aa(lp13590 -g15 -aI354 -aI-58 -aI329 -aI-65 -aI341 -aI-60 -aa(lp13591 -g15 -aI397 -aI-55 -aI368 -aI-56 -aI382 -aI-55 -aa(lp13592 -g10 -aa(lp13593 -g8 -aI492 -aI0 -aa(lp13594 -g10 -aa(lp13595 -g8 -aI492 -aI0 -aasVj -(lp13596 -(lp13597 -g8 -aI269 -aI-714 -aa(lp13598 -g20 -aI269 -aI10 -aa(lp13599 -g15 -aI250 -aI160 -aI269 -aI70 -aI263 -aI120 -aa(lp13600 -g15 -aI195 -aI255 -aI236 -aI199 -aI218 -aI231 -aa(lp13601 -g15 -aI111 -aI305 -aI171 -aI278 -aI143 -aI295 -aa(lp13602 -g15 -aI5 -aI320 -aI79 -aI315 -aI43 -aI320 -aa(lp13603 -g20 -aI-16 -aI320 -aa(lp13604 -g20 -aI-16 -aI257 -aa(lp13605 -g20 -aI-6 -aI257 -aa(lp13606 -g15 -aI57 -aI245 -aI17 -aI257 -aI38 -aI253 -aa(lp13607 -g15 -aI104 -aI205 -aI75 -aI237 -aI91 -aI224 -aa(lp13608 -g15 -aI133 -aI129 -aI117 -aI186 -aI127 -aI161 -aa(lp13609 -g15 -aI143 -aI12 -aI140 -aI98 -aI143 -aI59 -aa(lp13610 -g20 -aI143 -aI-567 -aa(lp13611 -g15 -aI135 -aI-614 -aI143 -aI-586 -aI140 -aI-602 -aa(lp13612 -g15 -aI111 -aI-642 -aI129 -aI-626 -aI121 -aI-635 -aa(lp13613 -g15 -aI76 -aI-655 -aI101 -aI-648 -aI89 -aI-652 -aa(lp13614 -g15 -aI34 -aI-658 -aI63 -aI-657 -aI49 -aI-658 -aa(lp13615 -g20 -aI30 -aI-658 -aa(lp13616 -g20 -aI30 -aI-714 -aa(lp13617 -g10 -aa(lp13618 -g8 -aI125 -aI-930 -aa(lp13619 -g15 -aI131 -aI-969 -aI125 -aI-946 -aI127 -aI-959 -aa(lp13620 -g15 -aI147 -aI-994 -aI135 -aI-980 -aI140 -aI-988 -aa(lp13621 -g15 -aI171 -aI-1008 -aI154 -aI-1001 -aI162 -aI-1006 -aa(lp13622 -g15 -aI201 -aI-1012 -aI180 -aI-1011 -aI190 -aI-1012 -aa(lp13623 -g15 -aI230 -aI-1008 -aI211 -aI-1012 -aI221 -aI-1011 -aa(lp13624 -g15 -aI254 -aI-994 -aI240 -aI-1006 -aI248 -aI-1001 -aa(lp13625 -g15 -aI271 -aI-969 -aI261 -aI-988 -aI267 -aI-980 -aa(lp13626 -g15 -aI277 -aI-930 -aI275 -aI-959 -aI277 -aI-946 -aa(lp13627 -g15 -aI271 -aI-891 -aI277 -aI-914 -aI275 -aI-901 -aa(lp13628 -g15 -aI254 -aI-866 -aI267 -aI-881 -aI261 -aI-872 -aa(lp13629 -g15 -aI230 -aI-852 -aI248 -aI-859 -aI240 -aI-854 -aa(lp13630 -g15 -aI201 -aI-847 -aI221 -aI-849 -aI211 -aI-847 -aa(lp13631 -g15 -aI171 -aI-852 -aI190 -aI-847 -aI180 -aI-849 -aa(lp13632 -g15 -aI147 -aI-866 -aI162 -aI-854 -aI154 -aI-859 -aa(lp13633 -g15 -aI131 -aI-891 -aI140 -aI-872 -aI135 -aI-881 -aa(lp13634 -g15 -aI125 -aI-930 -aI127 -aI-901 -aI125 -aI-914 -aa(lp13635 -g10 -aa(lp13636 -g8 -aI399 -aI0 -aa(lp13637 -g10 -aa(lp13638 -g8 -aI399 -aI0 -aasVn -(lp13639 -(lp13640 -g8 -aI395 -aI-55 -aa(lp13641 -g20 -aI395 -aI0 -aa(lp13642 -g20 -aI37 -aI0 -aa(lp13643 -g20 -aI37 -aI-55 -aa(lp13644 -g20 -aI48 -aI-55 -aa(lp13645 -g15 -aI90 -aI-58 -aI63 -aI-55 -aI77 -aI-56 -aa(lp13646 -g15 -aI125 -aI-72 -aI104 -aI-60 -aI115 -aI-65 -aa(lp13647 -g15 -aI148 -aI-101 -aI135 -aI-78 -aI142 -aI-88 -aa(lp13648 -g15 -aI157 -aI-151 -aI154 -aI-113 -aI157 -aI-130 -aa(lp13649 -g20 -aI157 -aI-567 -aa(lp13650 -g15 -aI148 -aI-614 -aI157 -aI-586 -aI154 -aI-602 -aa(lp13651 -g15 -aI125 -aI-642 -aI142 -aI-626 -aI134 -aI-635 -aa(lp13652 -g15 -aI90 -aI-655 -aI115 -aI-648 -aI103 -aI-652 -aa(lp13653 -g15 -aI48 -aI-658 -aI76 -aI-657 -aI62 -aI-658 -aa(lp13654 -g20 -aI44 -aI-658 -aa(lp13655 -g20 -aI44 -aI-714 -aa(lp13656 -g20 -aI259 -aI-714 -aa(lp13657 -g20 -aI277 -aI-606 -aa(lp13658 -g20 -aI283 -aI-606 -aa(lp13659 -g15 -aI327 -aI-667 -aI297 -aI-631 -aI312 -aI-651 -aa(lp13660 -g15 -aI376 -aI-704 -aI343 -aI-683 -aI359 -aI-695 -aa(lp13661 -g15 -aI431 -aI-722 -aI393 -aI-713 -aI412 -aI-719 -aa(lp13662 -g15 -aI492 -aI-727 -aI450 -aI-725 -aI470 -aI-727 -aa(lp13663 -g15 -aI586 -aI-712 -aI527 -aI-727 -aI558 -aI-722 -aa(lp13664 -g15 -aI656 -aI-665 -aI613 -aI-701 -aI637 -aI-686 -aa(lp13665 -g15 -aI700 -aI-584 -aI675 -aI-644 -aI690 -aI-617 -aa(lp13666 -g15 -aI716 -aI-466 -aI711 -aI-551 -aI716 -aI-511 -aa(lp13667 -g20 -aI716 -aI-151 -aa(lp13668 -g15 -aI723 -aI-101 -aI716 -aI-130 -aI718 -aI-113 -aa(lp13669 -g15 -aI744 -aI-72 -aI728 -aI-88 -aI735 -aI-78 -aa(lp13670 -g15 -aI777 -aI-58 -aI753 -aI-65 -aI764 -aI-60 -aa(lp13671 -g15 -aI818 -aI-55 -aI789 -aI-56 -aI803 -aI-55 -aa(lp13672 -g20 -aI822 -aI-55 -aa(lp13673 -g20 -aI822 -aI0 -aa(lp13674 -g20 -aI590 -aI0 -aa(lp13675 -g20 -aI590 -aI-459 -aa(lp13676 -g15 -aI582 -aI-537 -aI590 -aI-488 -aI587 -aI-514 -aa(lp13677 -g15 -aI557 -aI-594 -aI577 -aI-559 -aI569 -aI-578 -aa(lp13678 -g15 -aI512 -aI-630 -aI546 -aI-610 -aI531 -aI-622 -aa(lp13679 -g15 -aI444 -aI-642 -aI493 -aI-638 -aI470 -aI-642 -aa(lp13680 -g15 -aI367 -aI-624 -aI413 -aI-642 -aI388 -aI-636 -aa(lp13681 -g15 -aI317 -aI-577 -aI346 -aI-612 -aI330 -aI-596 -aa(lp13682 -g15 -aI290 -aI-508 -aI305 -aI-557 -aI296 -aI-534 -aa(lp13683 -g15 -aI282 -aI-425 -aI285 -aI-481 -aI282 -aI-454 -aa(lp13684 -g20 -aI282 -aI-144 -aa(lp13685 -g15 -aI291 -aI-97 -aI282 -aI-125 -aI285 -aI-109 -aa(lp13686 -g15 -aI315 -aI-70 -aI297 -aI-85 -aI305 -aI-76 -aa(lp13687 -g15 -aI349 -aI-58 -aI325 -aI-64 -aI336 -aI-60 -aa(lp13688 -g15 -aI391 -aI-55 -aI363 -aI-56 -aI377 -aI-55 -aa(lp13689 -g10 -aa(lp13690 -g8 -aI860 -aI0 -aa(lp13691 -g10 -aa(lp13692 -g8 -aI860 -aI0 -aasVr -(lp13693 -(lp13694 -g8 -aI429 -aI0 -aa(lp13695 -g20 -aI44 -aI0 -aa(lp13696 -g20 -aI44 -aI-55 -aa(lp13697 -g20 -aI48 -aI-55 -aa(lp13698 -g15 -aI90 -aI-58 -aI63 -aI-55 -aI77 -aI-56 -aa(lp13699 -g15 -aI125 -aI-72 -aI104 -aI-60 -aI115 -aI-65 -aa(lp13700 -g15 -aI148 -aI-101 -aI135 -aI-78 -aI142 -aI-88 -aa(lp13701 -g15 -aI157 -aI-151 -aI154 -aI-113 -aI157 -aI-130 -aa(lp13702 -g20 -aI157 -aI-567 -aa(lp13703 -g15 -aI148 -aI-614 -aI157 -aI-586 -aI154 -aI-602 -aa(lp13704 -g15 -aI125 -aI-642 -aI142 -aI-626 -aI134 -aI-635 -aa(lp13705 -g15 -aI90 -aI-655 -aI115 -aI-648 -aI103 -aI-652 -aa(lp13706 -g15 -aI48 -aI-658 -aI76 -aI-657 -aI62 -aI-658 -aa(lp13707 -g20 -aI44 -aI-658 -aa(lp13708 -g20 -aI44 -aI-714 -aa(lp13709 -g20 -aI249 -aI-714 -aa(lp13710 -g20 -aI274 -aI-582 -aa(lp13711 -g20 -aI281 -aI-582 -aa(lp13712 -g15 -aI307 -aI-638 -aI289 -aI-602 -aI298 -aI-620 -aa(lp13713 -g15 -aI341 -aI-684 -aI317 -aI-656 -aI328 -aI-671 -aa(lp13714 -g15 -aI390 -aI-716 -aI354 -aI-698 -aI371 -aI-708 -aa(lp13715 -g15 -aI464 -aI-727 -aI410 -aI-723 -aI434 -aI-727 -aa(lp13716 -g15 -aI572 -aI-702 -aI512 -aI-727 -aI548 -aI-718 -aa(lp13717 -g15 -aI608 -aI-630 -aI596 -aI-685 -aI608 -aI-661 -aa(lp13718 -g15 -aI601 -aI-591 -aI608 -aI-616 -aI605 -aI-603 -aa(lp13719 -g15 -aI579 -aI-561 -aI596 -aI-580 -aI589 -aI-570 -aa(lp13720 -g15 -aI541 -aI-542 -aI569 -aI-553 -aI556 -aI-546 -aa(lp13721 -g15 -aI483 -aI-535 -aI525 -aI-537 -aI506 -aI-535 -aa(lp13722 -g15 -aI468 -aI-615 -aI483 -aI-572 -aI478 -aI-598 -aa(lp13723 -g15 -aI413 -aI-639 -aI457 -aI-631 -aI439 -aI-639 -aa(lp13724 -g15 -aI369 -aI-625 -aI396 -aI-639 -aI382 -aI-634 -aa(lp13725 -g15 -aI334 -aI-588 -aI356 -aI-616 -aI344 -aI-603 -aa(lp13726 -g15 -aI310 -aI-535 -aI325 -aI-573 -aI316 -aI-555 -aa(lp13727 -g15 -aI293 -aI-473 -aI303 -aI-515 -aI298 -aI-494 -aa(lp13728 -g15 -aI285 -aI-411 -aI289 -aI-452 -aI286 -aI-431 -aa(lp13729 -g15 -aI282 -aI-354 -aI283 -aI-390 -aI282 -aI-371 -aa(lp13730 -g20 -aI282 -aI-144 -aa(lp13731 -g15 -aI291 -aI-97 -aI282 -aI-125 -aI285 -aI-109 -aa(lp13732 -g15 -aI315 -aI-70 -aI297 -aI-85 -aI305 -aI-76 -aa(lp13733 -g15 -aI349 -aI-58 -aI325 -aI-64 -aI336 -aI-60 -aa(lp13734 -g15 -aI391 -aI-55 -aI363 -aI-56 -aI377 -aI-55 -aa(lp13735 -g20 -aI429 -aI-55 -aa(lp13736 -g10 -aa(lp13737 -g8 -aI628 -aI0 -aa(lp13738 -g10 -aa(lp13739 -g8 -aI628 -aI0 -aasVv -(lp13740 -(lp13741 -g8 -aI5 -aI-658 -aa(lp13742 -g20 -aI5 -aI-714 -aa(lp13743 -g20 -aI338 -aI-714 -aa(lp13744 -g20 -aI338 -aI-658 -aa(lp13745 -g20 -aI321 -aI-658 -aa(lp13746 -g15 -aI261 -aI-642 -aI294 -aI-658 -aI274 -aI-653 -aa(lp13747 -g15 -aI241 -aI-593 -aI248 -aI-632 -aI241 -aI-616 -aa(lp13748 -g15 -aI244 -aI-571 -aI241 -aI-586 -aI242 -aI-579 -aa(lp13749 -g15 -aI251 -aI-545 -aI245 -aI-563 -aI248 -aI-555 -aa(lp13750 -g20 -aI342 -aI-293 -aa(lp13751 -g15 -aI360 -aI-241 -aI348 -aI-277 -aI353 -aI-260 -aa(lp13752 -g15 -aI377 -aI-185 -aI366 -aI-222 -aI371 -aI-203 -aa(lp13753 -g15 -aI391 -aI-133 -aI382 -aI-167 -aI387 -aI-150 -aa(lp13754 -g15 -aI401 -aI-92 -aI396 -aI-117 -aI399 -aI-103 -aa(lp13755 -g20 -aI405 -aI-92 -aa(lp13756 -g15 -aI416 -aI-128 -aI407 -aI-102 -aI411 -aI-114 -aa(lp13757 -g15 -aI433 -aI-174 -aI421 -aI-142 -aI426 -aI-157 -aa(lp13758 -g15 -aI452 -aI-225 -aI439 -aI-191 -aI446 -aI-208 -aa(lp13759 -g15 -aI472 -aI-275 -aI459 -aI-242 -aI465 -aI-259 -aa(lp13760 -g20 -aI567 -aI-535 -aa(lp13761 -g15 -aI577 -aI-566 -aI572 -aI-546 -aI575 -aI-556 -aa(lp13762 -g15 -aI580 -aI-592 -aI579 -aI-576 -aI580 -aI-585 -aa(lp13763 -g15 -aI558 -aI-642 -aI580 -aI-615 -aI572 -aI-632 -aa(lp13764 -g15 -aI492 -aI-658 -aI543 -aI-653 -aI521 -aI-658 -aa(lp13765 -g20 -aI482 -aI-658 -aa(lp13766 -g20 -aI482 -aI-714 -aa(lp13767 -g20 -aI768 -aI-714 -aa(lp13768 -g20 -aI768 -aI-658 -aa(lp13769 -g20 -aI751 -aI-658 -aa(lp13770 -g15 -aI718 -aI-654 -aI738 -aI-658 -aI727 -aI-656 -aa(lp13771 -g15 -aI694 -aI-638 -aI709 -aI-651 -aI701 -aI-646 -aa(lp13772 -g15 -aI672 -aI-606 -aI686 -aI-630 -aI679 -aI-619 -aa(lp13773 -g15 -aI650 -aI-554 -aI666 -aI-592 -aI658 -aI-575 -aa(lp13774 -g20 -aI440 -aI0 -aa(lp13775 -g20 -aI318 -aI0 -aa(lp13776 -g20 -aI104 -aI-587 -aa(lp13777 -g15 -aI87 -aI-621 -aI98 -aI-601 -aI93 -aI-612 -aa(lp13778 -g15 -aI68 -aI-643 -aI82 -aI-631 -aI75 -aI-638 -aa(lp13779 -g15 -aI42 -aI-655 -aI60 -aI-649 -aI52 -aI-652 -aa(lp13780 -g15 -aI9 -aI-658 -aI33 -aI-657 -aI22 -aI-658 -aa(lp13781 -g10 -aa(lp13782 -g8 -aI772 -aI0 -aa(lp13783 -g10 -aa(lp13784 -g8 -aI772 -aI0 -aasVz -(lp13785 -(lp13786 -g8 -aI453 -aI-75 -aa(lp13787 -g15 -aI491 -aI-84 -aI468 -aI-75 -aI481 -aI-78 -aa(lp13788 -g15 -aI517 -aI-108 -aI502 -aI-90 -aI510 -aI-98 -aa(lp13789 -g15 -aI533 -aI-143 -aI523 -aI-118 -aI529 -aI-130 -aa(lp13790 -g15 -aI544 -aI-185 -aI537 -aI-156 -aI541 -aI-170 -aa(lp13791 -g20 -aI550 -aI-215 -aa(lp13792 -g20 -aI606 -aI-215 -aa(lp13793 -g20 -aI600 -aI0 -aa(lp13794 -g20 -aI55 -aI0 -aa(lp13795 -g20 -aI55 -aI-52 -aa(lp13796 -g20 -aI442 -aI-638 -aa(lp13797 -g20 -aI234 -aI-638 -aa(lp13798 -g15 -aI191 -aI-631 -aI217 -aI-638 -aI202 -aI-635 -aa(lp13799 -g15 -aI163 -aI-610 -aI180 -aI-626 -aI170 -aI-619 -aa(lp13800 -g15 -aI146 -aI-577 -aI156 -aI-601 -aI150 -aI-590 -aa(lp13801 -g15 -aI132 -aI-530 -aI141 -aI-563 -aI136 -aI-547 -aa(lp13802 -g20 -aI130 -aI-524 -aa(lp13803 -g20 -aI74 -aI-524 -aa(lp13804 -g20 -aI87 -aI-714 -aa(lp13805 -g20 -aI598 -aI-714 -aa(lp13806 -g20 -aI598 -aI-659 -aa(lp13807 -g20 -aI210 -aI-75 -aa(lp13808 -g10 -aa(lp13809 -g8 -aI681 -aI0 -aa(lp13810 -g10 -aa(lp13811 -g8 -aI681 -aI0 -aasV~ -(lp13812 -(lp13813 -g8 -aI505 -aI-358 -aa(lp13814 -g15 -aI464 -aI-366 -aI492 -aI-358 -aI478 -aI-360 -aa(lp13815 -g15 -aI423 -aI-386 -aI450 -aI-371 -aI437 -aI-378 -aa(lp13816 -g15 -aI384 -aI-413 -aI409 -aI-395 -aI396 -aI-404 -aa(lp13817 -g15 -aI350 -aI-442 -aI372 -aI-423 -aI360 -aI-433 -aa(lp13818 -g15 -aI321 -aI-468 -aI340 -aI-451 -aI331 -aI-460 -aa(lp13819 -g15 -aI293 -aI-491 -aI312 -aI-477 -aI302 -aI-484 -aa(lp13820 -g15 -aI264 -aI-506 -aI283 -aI-497 -aI274 -aI-502 -aa(lp13821 -g15 -aI235 -aI-512 -aI255 -aI-510 -aI245 -aI-512 -aa(lp13822 -g15 -aI177 -aI-474 -aI209 -aI-512 -aI190 -aI-499 -aa(lp13823 -g15 -aI151 -aI-358 -aI165 -aI-449 -aI156 -aI-410 -aa(lp13824 -g20 -aI73 -aI-358 -aa(lp13825 -g15 -aI85 -aI-441 -aI76 -aI-386 -aI80 -aI-413 -aa(lp13826 -g15 -aI111 -aI-516 -aI91 -aI-469 -aI99 -aI-494 -aa(lp13827 -g15 -aI161 -aI-570 -aI124 -aI-538 -aI140 -aI-556 -aa(lp13828 -g15 -aI241 -aI-591 -aI181 -aI-584 -aI208 -aI-591 -aa(lp13829 -g15 -aI285 -aI-582 -aI256 -aI-591 -aI271 -aI-588 -aa(lp13830 -g15 -aI328 -aI-561 -aI300 -aI-577 -aI314 -aI-570 -aa(lp13831 -g15 -aI368 -aI-532 -aI342 -aI-552 -aI355 -aI-543 -aa(lp13832 -g15 -aI402 -aI-503 -aI380 -aI-522 -aI391 -aI-512 -aa(lp13833 -g15 -aI430 -aI-478 -aI411 -aI-494 -aI421 -aI-486 -aa(lp13834 -g15 -aI457 -aI-457 -aI439 -aI-470 -aI448 -aI-463 -aa(lp13835 -g15 -aI484 -aI-442 -aI466 -aI-451 -aI475 -aI-446 -aa(lp13836 -g15 -aI511 -aI-437 -aI493 -aI-438 -aI502 -aI-437 -aa(lp13837 -g15 -aI566 -aI-477 -aI536 -aI-437 -aI554 -aI-450 -aa(lp13838 -g15 -aI593 -aI-591 -aI578 -aI-503 -aI587 -aI-541 -aa(lp13839 -g20 -aI673 -aI-591 -aa(lp13840 -g15 -aI659 -aI-508 -aI670 -aI-563 -aI665 -aI-535 -aa(lp13841 -g15 -aI631 -aI-433 -aI653 -aI-480 -aI644 -aI-455 -aa(lp13842 -g15 -aI583 -aI-379 -aI619 -aI-411 -aI603 -aI-392 -aa(lp13843 -g15 -aI505 -aI-358 -aI562 -aI-365 -aI536 -aI-358 -aa(lp13844 -g10 -aa(lp13845 -g8 -aI748 -aI0 -aa(lp13846 -g10 -aa(lp13847 -g8 -aI748 -aI0 -aasV! -(lp13848 -(lp13849 -g8 -aI143 -aI-951 -aa(lp13850 -g20 -aI298 -aI-951 -aa(lp13851 -g20 -aI251 -aI-267 -aa(lp13852 -g20 -aI190 -aI-267 -aa(lp13853 -g10 -aa(lp13854 -g8 -aI137 -aI-80 -aa(lp13855 -g15 -aI143 -aI-124 -aI137 -aI-98 -aI139 -aI-112 -aa(lp13856 -g15 -aI161 -aI-151 -aI148 -aI-135 -aI154 -aI-144 -aa(lp13857 -g15 -aI188 -aI-166 -aI169 -aI-158 -aI178 -aI-163 -aa(lp13858 -g15 -aI221 -aI-171 -aI198 -aI-169 -aI209 -aI-171 -aa(lp13859 -g15 -aI253 -aI-166 -aI232 -aI-171 -aI243 -aI-169 -aa(lp13860 -g15 -aI280 -aI-151 -aI263 -aI-163 -aI272 -aI-158 -aa(lp13861 -g15 -aI298 -aI-124 -aI287 -aI-144 -aI293 -aI-135 -aa(lp13862 -g15 -aI305 -aI-80 -aI303 -aI-112 -aI305 -aI-98 -aa(lp13863 -g15 -aI298 -aI-37 -aI305 -aI-64 -aI303 -aI-49 -aa(lp13864 -g15 -aI280 -aI-9 -aI293 -aI-26 -aI287 -aI-16 -aa(lp13865 -g15 -aI253 -aI5 -aI272 -aI-3 -aI263 -aI1 -aa(lp13866 -g15 -aI221 -aI9 -aI243 -aI8 -aI232 -aI9 -aa(lp13867 -g15 -aI188 -aI5 -aI209 -aI9 -aI198 -aI8 -aa(lp13868 -g15 -aI161 -aI-9 -aI178 -aI1 -aI169 -aI-3 -aa(lp13869 -g15 -aI143 -aI-37 -aI154 -aI-16 -aI148 -aI-26 -aa(lp13870 -g15 -aI137 -aI-80 -aI139 -aI-49 -aI137 -aI-64 -aa(lp13871 -g10 -aa(lp13872 -g8 -aI444 -aI0 -aa(lp13873 -g10 -aa(lp13874 -g8 -aI444 -aI0 -aasV% -(lp13875 -(lp13876 -g8 -aI497 -aI-670 -aa(lp13877 -g15 -aI483 -aI-548 -aI497 -aI-625 -aI492 -aI-584 -aa(lp13878 -g15 -aI442 -aI-454 -aI474 -aI-511 -aI460 -aI-480 -aa(lp13879 -g15 -aI374 -aI-394 -aI424 -aI-428 -aI401 -aI-408 -aa(lp13880 -g15 -aI278 -aI-372 -aI347 -aI-379 -aI315 -aI-372 -aa(lp13881 -g15 -aI180 -aI-394 -aI240 -aI-372 -aI207 -aI-379 -aa(lp13882 -g15 -aI111 -aI-454 -aI152 -aI-408 -aI129 -aI-428 -aa(lp13883 -g15 -aI72 -aI-548 -aI94 -aI-480 -aI81 -aI-511 -aa(lp13884 -g15 -aI59 -aI-670 -aI64 -aI-584 -aI59 -aI-625 -aa(lp13885 -g15 -aI72 -aI-791 -aI59 -aI-714 -aI64 -aI-755 -aa(lp13886 -g15 -aI111 -aI-884 -aI81 -aI-827 -aI94 -aI-858 -aa(lp13887 -g15 -aI180 -aI-944 -aI129 -aI-910 -aI152 -aI-930 -aa(lp13888 -g15 -aI279 -aI-965 -aI208 -aI-958 -aI241 -aI-965 -aa(lp13889 -g15 -aI375 -aI-944 -aI316 -aI-965 -aI348 -aI-958 -aa(lp13890 -g15 -aI443 -aI-884 -aI402 -aI-930 -aI425 -aI-910 -aa(lp13891 -g15 -aI483 -aI-791 -aI461 -aI-858 -aI474 -aI-827 -aa(lp13892 -g15 -aI497 -aI-670 -aI492 -aI-755 -aI497 -aI-714 -aa(lp13893 -g10 -aa(lp13894 -g8 -aI179 -aI-670 -aa(lp13895 -g15 -aI184 -aI-567 -aI179 -aI-631 -aI181 -aI-597 -aa(lp13896 -g15 -aI201 -aI-491 -aI188 -aI-537 -aI194 -aI-511 -aa(lp13897 -g15 -aI232 -aI-443 -aI209 -aI-470 -aI219 -aI-454 -aa(lp13898 -g15 -aI278 -aI-427 -aI245 -aI-432 -aI260 -aI-427 -aa(lp13899 -g15 -aI324 -aI-443 -aI296 -aI-427 -aI312 -aI-432 -aa(lp13900 -g15 -aI355 -aI-491 -aI337 -aI-454 -aI347 -aI-470 -aa(lp13901 -g15 -aI371 -aI-567 -aI362 -aI-511 -aI368 -aI-537 -aa(lp13902 -g15 -aI376 -aI-670 -aI374 -aI-597 -aI376 -aI-631 -aa(lp13903 -g15 -aI371 -aI-771 -aI376 -aI-707 -aI374 -aI-741 -aa(lp13904 -g15 -aI355 -aI-846 -aI368 -aI-800 -aI362 -aI-825 -aa(lp13905 -g15 -aI325 -aI-893 -aI347 -aI-866 -aI337 -aI-882 -aa(lp13906 -g15 -aI279 -aI-909 -aI313 -aI-903 -aI298 -aI-909 -aa(lp13907 -g15 -aI233 -aI-893 -aI261 -aI-909 -aI246 -aI-903 -aa(lp13908 -g15 -aI202 -aI-846 -aI220 -aI-882 -aI210 -aI-866 -aa(lp13909 -g15 -aI184 -aI-771 -aI194 -aI-825 -aI188 -aI-800 -aa(lp13910 -g15 -aI179 -aI-670 -aI181 -aI-741 -aI179 -aI-707 -aa(lp13911 -g10 -aa(lp13912 -g8 -aI1134 -aI-283 -aa(lp13913 -g15 -aI1121 -aI-161 -aI1134 -aI-238 -aI1130 -aI-198 -aa(lp13914 -g15 -aI1080 -aI-67 -aI1111 -aI-125 -aI1098 -aI-93 -aa(lp13915 -g15 -aI1011 -aI-7 -aI1061 -aI-41 -aI1039 -aI-21 -aa(lp13916 -g15 -aI916 -aI13 -aI984 -aI6 -aI952 -aI13 -aa(lp13917 -g15 -aI817 -aI-7 -aI877 -aI13 -aI844 -aI6 -aa(lp13918 -g15 -aI749 -aI-67 -aI789 -aI-21 -aI766 -aI-41 -aa(lp13919 -g15 -aI709 -aI-161 -aI731 -aI-93 -aI718 -aI-125 -aa(lp13920 -g15 -aI697 -aI-283 -aI701 -aI-198 -aI697 -aI-238 -aa(lp13921 -g15 -aI709 -aI-404 -aI697 -aI-328 -aI701 -aI-368 -aa(lp13922 -g15 -aI749 -aI-497 -aI718 -aI-441 -aI731 -aI-472 -aa(lp13923 -g15 -aI817 -aI-557 -aI767 -aI-523 -aI789 -aI-543 -aa(lp13924 -g15 -aI917 -aI-578 -aI845 -aI-571 -aI878 -aI-578 -aa(lp13925 -g15 -aI1012 -aI-557 -aI953 -aI-578 -aI985 -aI-571 -aa(lp13926 -g15 -aI1080 -aI-497 -aI1039 -aI-543 -aI1062 -aI-523 -aa(lp13927 -g15 -aI1121 -aI-404 -aI1098 -aI-472 -aI1111 -aI-441 -aa(lp13928 -g15 -aI1134 -aI-283 -aI1130 -aI-368 -aI1134 -aI-328 -aa(lp13929 -g10 -aa(lp13930 -g8 -aI817 -aI-283 -aa(lp13931 -g15 -aI822 -aI-180 -aI817 -aI-245 -aI818 -aI-211 -aa(lp13932 -g15 -aI839 -aI-104 -aI825 -aI-150 -aI831 -aI-125 -aa(lp13933 -g15 -aI869 -aI-56 -aI847 -aI-83 -aI857 -aI-67 -aa(lp13934 -g15 -aI916 -aI-40 -aI882 -aI-45 -aI897 -aI-40 -aa(lp13935 -g15 -aI962 -aI-56 -aI934 -aI-40 -aI949 -aI-45 -aa(lp13936 -g15 -aI992 -aI-104 -aI974 -aI-67 -aI984 -aI-83 -aa(lp13937 -g15 -aI1008 -aI-180 -aI999 -aI-125 -aI1004 -aI-150 -aa(lp13938 -g15 -aI1013 -aI-283 -aI1011 -aI-211 -aI1013 -aI-245 -aa(lp13939 -g15 -aI1008 -aI-384 -aI1013 -aI-321 -aI1011 -aI-354 -aa(lp13940 -g15 -aI992 -aI-459 -aI1004 -aI-413 -aI999 -aI-438 -aa(lp13941 -g15 -aI962 -aI-506 -aI984 -aI-480 -aI975 -aI-495 -aa(lp13942 -g15 -aI917 -aI-522 -aI950 -aI-517 -aI935 -aI-522 -aa(lp13943 -g15 -aI870 -aI-506 -aI899 -aI-522 -aI883 -aI-517 -aa(lp13944 -g15 -aI839 -aI-459 -aI857 -aI-495 -aI847 -aI-480 -aa(lp13945 -g15 -aI822 -aI-384 -aI831 -aI-438 -aI825 -aI-413 -aa(lp13946 -g15 -aI817 -aI-283 -aI818 -aI-354 -aI817 -aI-321 -aa(lp13947 -g10 -aa(lp13948 -g8 -aI401 -aI0 -aa(lp13949 -g20 -aI313 -aI0 -aa(lp13950 -g20 -aI789 -aI-951 -aa(lp13951 -g20 -aI876 -aI-951 -aa(lp13952 -g10 -aa(lp13953 -g8 -aI1194 -aI0 -aa(lp13954 -g10 -aa(lp13955 -g8 -aI1194 -aI0 -aasV) -(lp13956 -(lp13957 -g8 -aI246 -aI-422 -aa(lp13958 -g15 -aI240 -aI-578 -aI246 -aI-475 -aI244 -aI-527 -aa(lp13959 -g15 -aI213 -aI-725 -aI236 -aI-630 -aI227 -aI-679 -aa(lp13960 -g15 -aI151 -aI-852 -aI199 -aI-771 -aI178 -aI-813 -aa(lp13961 -g15 -aI42 -aI-952 -aI124 -aI-891 -aI88 -aI-924 -aa(lp13962 -g20 -aI42 -aI-1012 -aa(lp13963 -g15 -aI199 -aI-924 -aI104 -aI-988 -aI156 -aI-958 -aa(lp13964 -g15 -aI305 -aI-800 -aI243 -aI-889 -aI278 -aI-848 -aa(lp13965 -g15 -aI366 -aI-635 -aI333 -aI-753 -aI353 -aI-698 -aa(lp13966 -g15 -aI385 -aI-422 -aI379 -aI-573 -aI385 -aI-502 -aa(lp13967 -g15 -aI366 -aI-207 -aI385 -aI-341 -aI379 -aI-270 -aa(lp13968 -g15 -aI305 -aI-41 -aI353 -aI-144 -aI333 -aI-89 -aa(lp13969 -g15 -aI199 -aI82 -aI278 -aI6 -aI243 -aI47 -aa(lp13970 -g15 -aI42 -aI171 -aI156 -aI117 -aI104 -aI146 -aa(lp13971 -g20 -aI42 -aI109 -aa(lp13972 -g15 -aI151 -aI9 -aI88 -aI82 -aI124 -aI48 -aa(lp13973 -g15 -aI213 -aI-118 -aI178 -aI-29 -aI199 -aI-72 -aa(lp13974 -g15 -aI240 -aI-265 -aI227 -aI-164 -aI236 -aI-213 -aa(lp13975 -g15 -aI246 -aI-422 -aI244 -aI-316 -aI246 -aI-369 -aa(lp13976 -g10 -aa(lp13977 -g8 -aI461 -aI0 -aa(lp13978 -g10 -aa(lp13979 -g8 -aI461 -aI0 -aasV- -(lp13980 -(lp13981 -g8 -aI33 -aI-312 -aa(lp13982 -g20 -aI33 -aI-412 -aa(lp13983 -g20 -aI380 -aI-412 -aa(lp13984 -g20 -aI380 -aI-312 -aa(lp13985 -g10 -aa(lp13986 -g8 -aI413 -aI0 -aa(lp13987 -g10 -aa(lp13988 -g8 -aI413 -aI0 -aasV1 -(lp13989 -(lp13990 -g8 -aI128 -aI0 -aa(lp13991 -g20 -aI128 -aI-55 -aa(lp13992 -g20 -aI217 -aI-55 -aa(lp13993 -g15 -aI260 -aI-58 -aI232 -aI-55 -aI246 -aI-56 -aa(lp13994 -g15 -aI294 -aI-72 -aI273 -aI-60 -aI284 -aI-65 -aa(lp13995 -g15 -aI318 -aI-101 -aI304 -aI-78 -aI312 -aI-88 -aa(lp13996 -g15 -aI326 -aI-151 -aI323 -aI-113 -aI326 -aI-130 -aa(lp13997 -g20 -aI326 -aI-851 -aa(lp13998 -g15 -aI278 -aI-795 -aI309 -aI-830 -aI293 -aI-812 -aa(lp13999 -g15 -aI235 -aI-751 -aI263 -aI-778 -aI248 -aI-763 -aa(lp14000 -g15 -aI194 -aI-723 -aI221 -aI-739 -aI207 -aI-729 -aa(lp14001 -g15 -aI154 -aI-713 -aI181 -aI-716 -aI167 -aI-713 -aa(lp14002 -g15 -aI106 -aI-732 -aI135 -aI-713 -aI119 -aI-719 -aa(lp14003 -g15 -aI87 -aI-784 -aI94 -aI-746 -aI87 -aI-763 -aa(lp14004 -g15 -aI128 -aI-797 -aI101 -aI-788 -aI114 -aI-792 -aa(lp14005 -g15 -aI172 -aI-816 -aI142 -aI-802 -aI156 -aI-808 -aa(lp14006 -g15 -aI222 -aI-846 -aI187 -aI-824 -aI204 -aI-834 -aa(lp14007 -g15 -aI282 -aI-887 -aI240 -aI-857 -aI260 -aI-871 -aa(lp14008 -g20 -aI376 -aI-956 -aa(lp14009 -g20 -aI461 -aI-956 -aa(lp14010 -g20 -aI461 -aI-151 -aa(lp14011 -g15 -aI470 -aI-101 -aI461 -aI-130 -aI464 -aI-113 -aa(lp14012 -g15 -aI493 -aI-72 -aI475 -aI-88 -aI483 -aI-78 -aa(lp14013 -g15 -aI528 -aI-58 -aI503 -aI-65 -aI515 -aI-60 -aa(lp14014 -g15 -aI570 -aI-55 -aI541 -aI-56 -aI555 -aI-55 -aa(lp14015 -g20 -aI636 -aI-55 -aa(lp14016 -g20 -aI636 -aI0 -aa(lp14017 -g10 -aa(lp14018 -g8 -aI745 -aI0 -aa(lp14019 -g10 -aa(lp14020 -g8 -aI745 -aI0 -aasV5 -(lp14021 -(lp14022 -g8 -aI318 -aI-64 -aa(lp14023 -g15 -aI394 -aI-76 -aI345 -aI-64 -aI370 -aI-68 -aa(lp14024 -g15 -aI454 -aI-113 -aI417 -aI-83 -aI437 -aI-96 -aa(lp14025 -g15 -aI494 -aI-183 -aI471 -aI-131 -aI485 -aI-154 -aa(lp14026 -g15 -aI509 -aI-289 -aI504 -aI-212 -aI509 -aI-247 -aa(lp14027 -g15 -aI494 -aI-381 -aI509 -aI-325 -aI504 -aI-355 -aa(lp14028 -g15 -aI453 -aI-446 -aI485 -aI-407 -aI471 -aI-429 -aa(lp14029 -g15 -aI389 -aI-485 -aI435 -aI-464 -aI414 -aI-477 -aa(lp14030 -g15 -aI306 -aI-498 -aI365 -aI-494 -aI337 -aI-498 -aa(lp14031 -g15 -aI247 -aI-495 -aI283 -aI-498 -aI263 -aI-497 -aa(lp14032 -g15 -aI202 -aI-488 -aI230 -aI-493 -aI215 -aI-491 -aa(lp14033 -g15 -aI169 -aI-479 -aI189 -aI-485 -aI178 -aI-482 -aa(lp14034 -g15 -aI142 -aI-468 -aI159 -aI-475 -aI150 -aI-472 -aa(lp14035 -g20 -aI110 -aI-478 -aa(lp14036 -g20 -aI153 -aI-950 -aa(lp14037 -g20 -aI598 -aI-950 -aa(lp14038 -g20 -aI605 -aI-748 -aa(lp14039 -g20 -aI549 -aI-748 -aa(lp14040 -g20 -aI544 -aI-788 -aa(lp14041 -g15 -aI538 -aI-813 -aI542 -aI-798 -aI541 -aI-806 -aa(lp14042 -g15 -aI527 -aI-829 -aI536 -aI-819 -aI532 -aI-825 -aa(lp14043 -g15 -aI506 -aI-840 -aI522 -aI-834 -aI515 -aI-837 -aa(lp14044 -g15 -aI472 -aI-843 -aI497 -aI-842 -aI485 -aI-843 -aa(lp14045 -g20 -aI213 -aI-843 -aa(lp14046 -g20 -aI188 -aI-550 -aa(lp14047 -g15 -aI246 -aI-564 -aI201 -aI-555 -aI221 -aI-559 -aa(lp14048 -g15 -aI343 -aI-571 -aI271 -aI-569 -aI304 -aI-571 -aa(lp14049 -g15 -aI463 -aI-554 -aI386 -aI-571 -aI426 -aI-565 -aa(lp14050 -g15 -aI560 -aI-501 -aI500 -aI-542 -aI533 -aI-524 -aa(lp14051 -g15 -aI624 -aI-413 -aI587 -aI-478 -aI609 -aI-448 -aa(lp14052 -g15 -aI647 -aI-289 -aI640 -aI-377 -aI647 -aI-336 -aa(lp14053 -g15 -aI625 -aI-166 -aI647 -aI-244 -aI640 -aI-203 -aa(lp14054 -g15 -aI562 -aI-70 -aI611 -aI-128 -aI590 -aI-96 -aa(lp14055 -g15 -aI461 -aI-8 -aI535 -aI-43 -aI501 -aI-22 -aa(lp14056 -g15 -aI325 -aI13 -aI421 -aI6 -aI376 -aI13 -aa(lp14057 -g15 -aI202 -aI0 -aI276 -aI13 -aI235 -aI9 -aa(lp14058 -g15 -aI125 -aI-31 -aI170 -aI-7 -aI144 -aI-18 -aa(lp14059 -g15 -aI85 -aI-74 -aI106 -aI-44 -aI93 -aI-58 -aa(lp14060 -g15 -aI73 -aI-120 -aI77 -aI-90 -aI73 -aI-105 -aa(lp14061 -g15 -aI94 -aI-178 -aI73 -aI-145 -aI80 -aI-164 -aa(lp14062 -g15 -aI157 -aI-199 -aI107 -aI-192 -aI128 -aI-199 -aa(lp14063 -g15 -aI167 -aI-146 -aI157 -aI-180 -aI160 -aI-162 -aa(lp14064 -g15 -aI197 -aI-103 -aI174 -aI-129 -aI184 -aI-115 -aa(lp14065 -g15 -aI247 -aI-75 -aI210 -aI-91 -aI227 -aI-82 -aa(lp14066 -g15 -aI318 -aI-64 -aI267 -aI-68 -aI291 -aI-64 -aa(lp14067 -g10 -aa(lp14068 -g8 -aI745 -aI0 -aa(lp14069 -g10 -aa(lp14070 -g8 -aI745 -aI0 -aasV9 -(lp14071 -(lp14072 -g8 -aI304 -aI-58 -aa(lp14073 -g15 -aI467 -aI-157 -aI377 -aI-58 -aI432 -aI-91 -aa(lp14074 -g15 -aI526 -aI-456 -aI502 -aI-223 -aI522 -aI-322 -aa(lp14075 -g15 -aI493 -aI-422 -aI517 -aI-444 -aI505 -aI-433 -aa(lp14076 -g15 -aI449 -aI-393 -aI480 -aI-411 -aI465 -aI-402 -aa(lp14077 -g15 -aI395 -aI-373 -aI433 -aI-385 -aI415 -aI-378 -aa(lp14078 -g15 -aI330 -aI-366 -aI375 -aI-368 -aI354 -aI-366 -aa(lp14079 -g15 -aI224 -aI-383 -aI292 -aI-366 -aI256 -aI-371 -aa(lp14080 -g15 -aI140 -aI-433 -aI191 -aI-394 -aI164 -aI-411 -aa(lp14081 -g15 -aI86 -aI-518 -aI117 -aI-456 -aI99 -aI-484 -aa(lp14082 -g15 -aI67 -aI-636 -aI74 -aI-552 -aI67 -aI-591 -aa(lp14083 -g15 -aI87 -aI-769 -aI67 -aI-685 -aI74 -aI-729 -aa(lp14084 -g15 -aI143 -aI-872 -aI100 -aI-809 -aI119 -aI-844 -aa(lp14085 -g15 -aI233 -aI-940 -aI168 -aI-901 -aI198 -aI-924 -aa(lp14086 -g15 -aI353 -aI-965 -aI268 -aI-956 -aI308 -aI-965 -aa(lp14087 -g15 -aI477 -aI-939 -aI398 -aI-965 -aI440 -aI-956 -aa(lp14088 -g15 -aI576 -aI-858 -aI515 -aI-921 -aI548 -aI-894 -aa(lp14089 -g15 -aI640 -aI-718 -aI603 -aI-821 -aI625 -aI-775 -aa(lp14090 -g15 -aI664 -aI-517 -aI656 -aI-662 -aI664 -aI-595 -aa(lp14091 -g15 -aI655 -aI-380 -aI664 -aI-470 -aI661 -aI-425 -aa(lp14092 -g15 -aI627 -aI-254 -aI649 -aI-336 -aI640 -aI-294 -aa(lp14093 -g15 -aI580 -aI-146 -aI615 -aI-215 -aI599 -aI-179 -aa(lp14094 -g15 -aI511 -aI-60 -aI561 -aI-113 -aI538 -aI-84 -aa(lp14095 -g15 -aI419 -aI-4 -aI484 -aI-36 -aI453 -aI-17 -aa(lp14096 -g15 -aI302 -aI15 -aI384 -aI8 -aI345 -aI15 -aa(lp14097 -g15 -aI208 -aI5 -aI264 -aI15 -aI233 -aI12 -aa(lp14098 -g15 -aI149 -aI-21 -aI183 -aI-1 -aI163 -aI-10 -aa(lp14099 -g15 -aI118 -aI-58 -aI134 -aI-31 -aI124 -aI-44 -aa(lp14100 -g15 -aI109 -aI-99 -aI112 -aI-72 -aI109 -aI-85 -aa(lp14101 -g15 -aI121 -aI-141 -aI109 -aI-116 -aI113 -aI-130 -aa(lp14102 -g15 -aI149 -aI-163 -aI129 -aI-152 -aI139 -aI-160 -aa(lp14103 -g15 -aI171 -aI-123 -aI155 -aI-149 -aI162 -aI-136 -aa(lp14104 -g15 -aI204 -aI-89 -aI180 -aI-110 -aI191 -aI-99 -aa(lp14105 -g15 -aI248 -aI-66 -aI216 -aI-79 -aI231 -aI-72 -aa(lp14106 -g15 -aI304 -aI-58 -aI264 -aI-60 -aI283 -aI-58 -aa(lp14107 -g10 -aa(lp14108 -g8 -aI360 -aI-444 -aa(lp14109 -g15 -aI419 -aI-454 -aI381 -aI-445 -aI401 -aI-448 -aa(lp14110 -g15 -aI467 -aI-477 -aI437 -aI-460 -aI453 -aI-467 -aa(lp14111 -g15 -aI503 -aI-511 -aI481 -aI-487 -aI493 -aI-498 -aa(lp14112 -g15 -aI527 -aI-552 -aI513 -aI-524 -aI521 -aI-538 -aa(lp14113 -g20 -aI527 -aI-555 -aa(lp14114 -g15 -aI513 -aI-706 -aI527 -aI-614 -aI522 -aI-664 -aa(lp14115 -g15 -aI477 -aI-811 -aI504 -aI-749 -aI493 -aI-784 -aa(lp14116 -g15 -aI423 -aI-871 -aI462 -aI-838 -aI444 -aI-858 -aa(lp14117 -g15 -aI353 -aI-891 -aI402 -aI-884 -aI379 -aI-891 -aa(lp14118 -g15 -aI243 -aI-829 -aI306 -aI-891 -aI269 -aI-870 -aa(lp14119 -g15 -aI205 -aI-649 -aI217 -aI-788 -aI205 -aI-728 -aa(lp14120 -g15 -aI214 -aI-556 -aI205 -aI-613 -aI208 -aI-582 -aa(lp14121 -g15 -aI244 -aI-492 -aI221 -aI-530 -aI231 -aI-508 -aa(lp14122 -g15 -aI292 -aI-456 -aI257 -aI-475 -aI273 -aI-463 -aa(lp14123 -g15 -aI360 -aI-444 -aI311 -aI-448 -aI334 -aI-444 -aa(lp14124 -g10 -aa(lp14125 -g8 -aI745 -aI0 -aa(lp14126 -g10 -aa(lp14127 -g8 -aI745 -aI0 -aasV= -(lp14128 -(lp14129 -g8 -aI658 -aI-383 -aa(lp14130 -g20 -aI658 -aI-304 -aa(lp14131 -g20 -aI86 -aI-304 -aa(lp14132 -g20 -aI86 -aI-383 -aa(lp14133 -g10 -aa(lp14134 -g8 -aI658 -aI-646 -aa(lp14135 -g20 -aI658 -aI-567 -aa(lp14136 -g20 -aI86 -aI-567 -aa(lp14137 -g20 -aI86 -aI-646 -aa(lp14138 -g10 -aa(lp14139 -g8 -aI745 -aI0 -aa(lp14140 -g10 -aa(lp14141 -g8 -aI745 -aI0 -aasVA -(lp14142 -(lp14143 -g8 -aI269 -aI-317 -aa(lp14144 -g20 -aI218 -aI-177 -aa(lp14145 -g15 -aI209 -aI-147 -aI214 -aI-167 -aI211 -aI-157 -aa(lp14146 -g15 -aI206 -aI-120 -aI207 -aI-136 -aI206 -aI-128 -aa(lp14147 -g15 -aI228 -aI-71 -aI206 -aI-98 -aI213 -aI-81 -aa(lp14148 -g15 -aI294 -aI-55 -aI242 -aI-60 -aI264 -aI-55 -aa(lp14149 -g20 -aI325 -aI-55 -aa(lp14150 -g20 -aI325 -aI0 -aa(lp14151 -g20 -aI0 -aI0 -aa(lp14152 -g20 -aI0 -aI-55 -aa(lp14153 -g20 -aI25 -aI-55 -aa(lp14154 -g15 -aI58 -aI-59 -aI38 -aI-55 -aI49 -aI-56 -aa(lp14155 -g15 -aI83 -aI-75 -aI67 -aI-62 -aI75 -aI-67 -aa(lp14156 -g15 -aI104 -aI-107 -aI90 -aI-83 -aI97 -aI-94 -aa(lp14157 -g15 -aI126 -aI-159 -aI111 -aI-121 -aI118 -aI-138 -aa(lp14158 -g20 -aI422 -aI-951 -aa(lp14159 -g20 -aI526 -aI-951 -aa(lp14160 -g20 -aI828 -aI-126 -aa(lp14161 -g15 -aI844 -aI-91 -aI833 -aI-112 -aI838 -aI-101 -aa(lp14162 -g15 -aI863 -aI-70 -aI849 -aI-82 -aI855 -aI-75 -aa(lp14163 -g15 -aI888 -aI-58 -aI870 -aI-64 -aI879 -aI-60 -aa(lp14164 -g15 -aI922 -aI-55 -aI898 -aI-56 -aI909 -aI-55 -aa(lp14165 -g20 -aI940 -aI-55 -aa(lp14166 -g20 -aI940 -aI0 -aa(lp14167 -g20 -aI573 -aI0 -aa(lp14168 -g20 -aI573 -aI-55 -aa(lp14169 -g20 -aI604 -aI-55 -aa(lp14170 -g15 -aI684 -aI-119 -aI657 -aI-55 -aI684 -aI-76 -aa(lp14171 -g15 -aI681 -aI-142 -aI684 -aI-126 -aI683 -aI-134 -aa(lp14172 -g15 -aI673 -aI-168 -aI679 -aI-149 -aI676 -aI-158 -aa(lp14173 -g20 -aI619 -aI-317 -aa(lp14174 -g10 -aa(lp14175 -g8 -aI513 -aI-618 -aa(lp14176 -g15 -aI474 -aI-729 -aI499 -aI-657 -aI486 -aI-694 -aa(lp14177 -g15 -aI446 -aI-828 -aI463 -aI-763 -aI453 -aI-796 -aa(lp14178 -g15 -aI435 -aI-782 -aI443 -aI-812 -aI439 -aI-797 -aa(lp14179 -g15 -aI422 -aI-736 -aI431 -aI-767 -aI427 -aI-752 -aa(lp14180 -g15 -aI406 -aI-687 -aI417 -aI-720 -aI412 -aI-704 -aa(lp14181 -g15 -aI385 -aI-630 -aI400 -aI-670 -aI393 -aI-651 -aa(lp14182 -g20 -aI294 -aI-384 -aa(lp14183 -g20 -aI595 -aI-384 -aa(lp14184 -g10 -aa(lp14185 -g8 -aI940 -aI0 -aa(lp14186 -g10 -aa(lp14187 -g8 -aI940 -aI0 -aasVE -(lp14188 -(lp14189 -g8 -aI311 -aI-65 -aa(lp14190 -g20 -aI569 -aI-65 -aa(lp14191 -g15 -aI623 -aI-74 -aI590 -aI-65 -aI608 -aI-68 -aa(lp14192 -g15 -aI660 -aI-98 -aI638 -aI-80 -aI650 -aI-88 -aa(lp14193 -g15 -aI684 -aI-133 -aI670 -aI-108 -aI678 -aI-120 -aa(lp14194 -g15 -aI695 -aI-175 -aI689 -aI-146 -aI693 -aI-160 -aa(lp14195 -g20 -aI705 -aI-232 -aa(lp14196 -g20 -aI774 -aI-232 -aa(lp14197 -g20 -aI765 -aI0 -aa(lp14198 -g20 -aI50 -aI0 -aa(lp14199 -g20 -aI50 -aI-55 -aa(lp14200 -g20 -aI67 -aI-55 -aa(lp14201 -g15 -aI109 -aI-58 -aI82 -aI-55 -aI96 -aI-56 -aa(lp14202 -g15 -aI144 -aI-70 -aI122 -aI-60 -aI134 -aI-64 -aa(lp14203 -g15 -aI168 -aI-97 -aI154 -aI-76 -aI162 -aI-85 -aa(lp14204 -g15 -aI177 -aI-144 -aI174 -aI-109 -aI177 -aI-125 -aa(lp14205 -g20 -aI177 -aI-799 -aa(lp14206 -g15 -aI168 -aI-849 -aI177 -aI-820 -aI174 -aI-837 -aa(lp14207 -g15 -aI145 -aI-878 -aI162 -aI-862 -aI155 -aI-872 -aa(lp14208 -g15 -aI110 -aI-892 -aI135 -aI-885 -aI123 -aI-889 -aa(lp14209 -g15 -aI67 -aI-895 -aI97 -aI-894 -aI82 -aI-895 -aa(lp14210 -g20 -aI50 -aI-895 -aa(lp14211 -g20 -aI50 -aI-951 -aa(lp14212 -g20 -aI722 -aI-951 -aa(lp14213 -g20 -aI729 -aI-718 -aa(lp14214 -g20 -aI660 -aI-718 -aa(lp14215 -g20 -aI653 -aI-775 -aa(lp14216 -g15 -aI643 -aI-817 -aI651 -aI-790 -aI648 -aI-804 -aa(lp14217 -g15 -aI622 -aI-852 -aI638 -aI-830 -aI631 -aI-842 -aa(lp14218 -g15 -aI586 -aI-876 -aI612 -aI-862 -aI601 -aI-870 -aa(lp14219 -g15 -aI535 -aI-884 -aI572 -aI-882 -aI555 -aI-884 -aa(lp14220 -g20 -aI311 -aI-884 -aa(lp14221 -g20 -aI311 -aI-530 -aa(lp14222 -g20 -aI633 -aI-530 -aa(lp14223 -g20 -aI633 -aI-465 -aa(lp14224 -g20 -aI311 -aI-465 -aa(lp14225 -g10 -aa(lp14226 -g8 -aI830 -aI0 -aa(lp14227 -g10 -aa(lp14228 -g8 -aI830 -aI0 -aasVI -(lp14229 -(lp14230 -g8 -aI50 -aI0 -aa(lp14231 -g20 -aI50 -aI-55 -aa(lp14232 -g20 -aI67 -aI-55 -aa(lp14233 -g15 -aI110 -aI-58 -aI82 -aI-55 -aI97 -aI-56 -aa(lp14234 -g15 -aI145 -aI-72 -aI123 -aI-60 -aI135 -aI-65 -aa(lp14235 -g15 -aI168 -aI-101 -aI155 -aI-78 -aI162 -aI-88 -aa(lp14236 -g15 -aI177 -aI-151 -aI174 -aI-113 -aI177 -aI-130 -aa(lp14237 -g20 -aI177 -aI-799 -aa(lp14238 -g15 -aI168 -aI-849 -aI177 -aI-820 -aI174 -aI-837 -aa(lp14239 -g15 -aI145 -aI-878 -aI162 -aI-862 -aI155 -aI-872 -aa(lp14240 -g15 -aI110 -aI-892 -aI135 -aI-885 -aI123 -aI-889 -aa(lp14241 -g15 -aI67 -aI-895 -aI97 -aI-894 -aI82 -aI-895 -aa(lp14242 -g20 -aI50 -aI-895 -aa(lp14243 -g20 -aI50 -aI-951 -aa(lp14244 -g20 -aI438 -aI-951 -aa(lp14245 -g20 -aI438 -aI-895 -aa(lp14246 -g20 -aI421 -aI-895 -aa(lp14247 -g15 -aI378 -aI-892 -aI406 -aI-895 -aI392 -aI-894 -aa(lp14248 -g15 -aI344 -aI-878 -aI365 -aI-889 -aI353 -aI-885 -aa(lp14249 -g15 -aI320 -aI-849 -aI334 -aI-872 -aI326 -aI-862 -aa(lp14250 -g15 -aI311 -aI-799 -aI314 -aI-837 -aI311 -aI-820 -aa(lp14251 -g20 -aI311 -aI-151 -aa(lp14252 -g15 -aI320 -aI-101 -aI311 -aI-130 -aI314 -aI-113 -aa(lp14253 -g15 -aI344 -aI-72 -aI326 -aI-88 -aI334 -aI-78 -aa(lp14254 -g15 -aI378 -aI-58 -aI353 -aI-65 -aI365 -aI-60 -aa(lp14255 -g15 -aI421 -aI-55 -aI392 -aI-56 -aI406 -aI-55 -aa(lp14256 -g20 -aI438 -aI-55 -aa(lp14257 -g20 -aI438 -aI0 -aa(lp14258 -g10 -aa(lp14259 -g8 -aI489 -aI0 -aa(lp14260 -g10 -aa(lp14261 -g8 -aI489 -aI0 -aasVM -(lp14262 -(lp14263 -g8 -aI845 -aI0 -aa(lp14264 -g20 -aI845 -aI-55 -aa(lp14265 -g20 -aI849 -aI-55 -aa(lp14266 -g15 -aI888 -aI-58 -aI863 -aI-55 -aI876 -aI-56 -aa(lp14267 -g15 -aI917 -aI-70 -aI899 -aI-60 -aI909 -aI-64 -aa(lp14268 -g15 -aI936 -aI-95 -aI925 -aI-76 -aI932 -aI-84 -aa(lp14269 -g15 -aI945 -aI-139 -aI941 -aI-106 -aI944 -aI-121 -aa(lp14270 -g20 -aI945 -aI-851 -aa(lp14271 -g20 -aI639 -aI0 -aa(lp14272 -g20 -aI567 -aI0 -aa(lp14273 -g20 -aI258 -aI-849 -aa(lp14274 -g20 -aI258 -aI-151 -aa(lp14275 -g15 -aI264 -aI-101 -aI258 -aI-130 -aI260 -aI-113 -aa(lp14276 -g15 -aI284 -aI-72 -aI269 -aI-88 -aI275 -aI-78 -aa(lp14277 -g15 -aI314 -aI-58 -aI292 -aI-65 -aI302 -aI-60 -aa(lp14278 -g15 -aI354 -aI-55 -aI326 -aI-56 -aI340 -aI-55 -aa(lp14279 -g20 -aI358 -aI-55 -aa(lp14280 -g20 -aI358 -aI0 -aa(lp14281 -g20 -aI50 -aI0 -aa(lp14282 -g20 -aI50 -aI-55 -aa(lp14283 -g20 -aI67 -aI-55 -aa(lp14284 -g15 -aI109 -aI-58 -aI82 -aI-55 -aI96 -aI-56 -aa(lp14285 -g15 -aI144 -aI-70 -aI122 -aI-60 -aI134 -aI-64 -aa(lp14286 -g15 -aI168 -aI-97 -aI154 -aI-76 -aI162 -aI-85 -aa(lp14287 -g15 -aI177 -aI-144 -aI174 -aI-109 -aI177 -aI-125 -aa(lp14288 -g20 -aI177 -aI-804 -aa(lp14289 -g15 -aI168 -aI-852 -aI177 -aI-824 -aI174 -aI-840 -aa(lp14290 -g15 -aI144 -aI-879 -aI162 -aI-864 -aI154 -aI-873 -aa(lp14291 -g15 -aI109 -aI-892 -aI134 -aI-886 -aI122 -aI-890 -aa(lp14292 -g15 -aI67 -aI-895 -aI96 -aI-894 -aI82 -aI-895 -aa(lp14293 -g20 -aI50 -aI-895 -aa(lp14294 -g20 -aI50 -aI-951 -aa(lp14295 -g20 -aI354 -aI-951 -aa(lp14296 -g20 -aI630 -aI-189 -aa(lp14297 -g20 -aI904 -aI-951 -aa(lp14298 -g20 -aI1199 -aI-951 -aa(lp14299 -g20 -aI1199 -aI-895 -aa(lp14300 -g20 -aI1182 -aI-895 -aa(lp14301 -g15 -aI1140 -aI-892 -aI1167 -aI-895 -aI1153 -aI-894 -aa(lp14302 -g15 -aI1105 -aI-878 -aI1127 -aI-889 -aI1115 -aI-885 -aa(lp14303 -g15 -aI1082 -aI-849 -aI1095 -aI-872 -aI1087 -aI-862 -aa(lp14304 -g15 -aI1073 -aI-799 -aI1076 -aI-837 -aI1073 -aI-820 -aa(lp14305 -g20 -aI1073 -aI-151 -aa(lp14306 -g15 -aI1082 -aI-101 -aI1073 -aI-130 -aI1076 -aI-113 -aa(lp14307 -g15 -aI1105 -aI-72 -aI1087 -aI-88 -aI1095 -aI-78 -aa(lp14308 -g15 -aI1140 -aI-58 -aI1115 -aI-65 -aI1127 -aI-60 -aa(lp14309 -g15 -aI1182 -aI-55 -aI1153 -aI-56 -aI1167 -aI-55 -aa(lp14310 -g20 -aI1199 -aI-55 -aa(lp14311 -g20 -aI1199 -aI0 -aa(lp14312 -g10 -aa(lp14313 -g8 -aI1250 -aI0 -aa(lp14314 -g10 -aa(lp14315 -g8 -aI1250 -aI0 -aasVQ -(lp14316 -(lp14317 -g8 -aI913 -aI-476 -aa(lp14318 -g15 -aI891 -aI-297 -aI913 -aI-411 -aI906 -aI-351 -aa(lp14319 -g15 -aI828 -aI-152 -aI877 -aI-242 -aI856 -aI-194 -aa(lp14320 -g15 -aI724 -aI-49 -aI800 -aI-110 -aI765 -aI-76 -aa(lp14321 -g15 -aI583 -aI5 -aI683 -aI-22 -aI636 -aI-3 -aa(lp14322 -g15 -aI606 -aI119 -aI587 -aI51 -aI595 -aI89 -aa(lp14323 -g15 -aI647 -aI193 -aI616 -aI150 -aI630 -aI175 -aa(lp14324 -g15 -aI707 -aI232 -aI664 -aI211 -aI684 -aI225 -aa(lp14325 -g15 -aI781 -aI244 -aI729 -aI240 -aI754 -aI244 -aa(lp14326 -g20 -aI802 -aI244 -aa(lp14327 -g20 -aI802 -aI307 -aa(lp14328 -g20 -aI745 -aI307 -aa(lp14329 -g15 -aI640 -aI293 -aI710 -aI307 -aI675 -aI302 -aa(lp14330 -g15 -aI544 -aI244 -aI605 -aI283 -aI573 -aI267 -aa(lp14331 -g15 -aI472 -aI153 -aI516 -aI222 -aI492 -aI191 -aa(lp14332 -g15 -aI437 -aI10 -aI453 -aI115 -aI441 -aI68 -aa(lp14333 -g15 -aI277 -aI-37 -aI376 -aI4 -aI323 -aI-11 -aa(lp14334 -g15 -aI164 -aI-139 -aI232 -aI-63 -aI194 -aI-97 -aa(lp14335 -g15 -aI97 -aI-288 -aI134 -aI-182 -aI112 -aI-231 -aa(lp14336 -g15 -aI74 -aI-478 -aI82 -aI-346 -aI74 -aI-409 -aa(lp14337 -g15 -aI100 -aI-678 -aI74 -aI-551 -aI83 -aI-618 -aa(lp14338 -g15 -aI179 -aI-832 -aI118 -aI-739 -aI144 -aI-790 -aa(lp14339 -g15 -aI310 -aI-931 -aI213 -aI-875 -aI257 -aI-908 -aa(lp14340 -g15 -aI496 -aI-966 -aI363 -aI-954 -aI425 -aI-966 -aa(lp14341 -g15 -aI674 -aI-931 -aI563 -aI-966 -aI622 -aI-954 -aa(lp14342 -g15 -aI805 -aI-832 -aI726 -aI-908 -aI769 -aI-875 -aa(lp14343 -g15 -aI886 -aI-678 -aI840 -aI-789 -aI867 -aI-738 -aa(lp14344 -g15 -aI913 -aI-476 -aI904 -aI-618 -aI913 -aI-550 -aa(lp14345 -g10 -aa(lp14346 -g8 -aI222 -aI-476 -aa(lp14347 -g15 -aI237 -aI-300 -aI222 -aI-410 -aI227 -aI-351 -aa(lp14348 -g15 -aI284 -aI-168 -aI247 -aI-248 -aI262 -aI-204 -aa(lp14349 -g15 -aI368 -aI-86 -aI306 -aI-132 -aI334 -aI-105 -aa(lp14350 -g15 -aI494 -aI-58 -aI403 -aI-67 -aI445 -aI-58 -aa(lp14351 -g15 -aI620 -aI-86 -aI544 -aI-58 -aI586 -aI-67 -aa(lp14352 -g15 -aI704 -aI-168 -aI655 -aI-105 -aI683 -aI-132 -aa(lp14353 -g15 -aI751 -aI-300 -aI726 -aI-204 -aI741 -aI-248 -aa(lp14354 -g15 -aI765 -aI-476 -aI760 -aI-351 -aI765 -aI-410 -aa(lp14355 -g15 -aI751 -aI-653 -aI765 -aI-542 -aI760 -aI-601 -aa(lp14356 -g15 -aI704 -aI-784 -aI741 -aI-705 -aI726 -aI-749 -aa(lp14357 -g15 -aI621 -aI-866 -aI683 -aI-820 -aI655 -aI-847 -aa(lp14358 -g15 -aI496 -aI-894 -aI587 -aI-884 -aI545 -aI-894 -aa(lp14359 -g15 -aI369 -aI-866 -aI446 -aI-894 -aI404 -aI-884 -aa(lp14360 -g15 -aI284 -aI-784 -aI335 -aI-847 -aI306 -aI-820 -aa(lp14361 -g15 -aI237 -aI-653 -aI262 -aI-749 -aI247 -aI-705 -aa(lp14362 -g15 -aI222 -aI-476 -aI227 -aI-601 -aI222 -aI-542 -aa(lp14363 -g10 -aa(lp14364 -g8 -aI989 -aI0 -aa(lp14365 -g10 -aa(lp14366 -g8 -aI989 -aI0 -aasVU -(lp14367 -(lp14368 -g8 -aI482 -aI13 -aa(lp14369 -g15 -aI341 -aI-3 -aI429 -aI13 -aI382 -aI7 -aa(lp14370 -g15 -aI235 -aI-55 -aI299 -aI-14 -aI264 -aI-31 -aa(lp14371 -g15 -aI169 -aI-148 -aI206 -aI-79 -aI184 -aI-110 -aa(lp14372 -g15 -aI146 -aI-287 -aI154 -aI-186 -aI146 -aI-233 -aa(lp14373 -g20 -aI146 -aI-804 -aa(lp14374 -g15 -aI137 -aI-852 -aI146 -aI-824 -aI143 -aI-840 -aa(lp14375 -g15 -aI113 -aI-879 -aI131 -aI-864 -aI123 -aI-873 -aa(lp14376 -g15 -aI79 -aI-892 -aI103 -aI-886 -aI92 -aI-890 -aa(lp14377 -g15 -aI37 -aI-895 -aI65 -aI-894 -aI51 -aI-895 -aa(lp14378 -g20 -aI20 -aI-895 -aa(lp14379 -g20 -aI20 -aI-951 -aa(lp14380 -g20 -aI408 -aI-951 -aa(lp14381 -g20 -aI408 -aI-895 -aa(lp14382 -g20 -aI390 -aI-895 -aa(lp14383 -g15 -aI348 -aI-892 -aI375 -aI-895 -aI361 -aI-894 -aa(lp14384 -g15 -aI313 -aI-878 -aI334 -aI-889 -aI323 -aI-885 -aa(lp14385 -g15 -aI290 -aI-849 -aI303 -aI-872 -aI295 -aI-862 -aa(lp14386 -g15 -aI281 -aI-799 -aI284 -aI-837 -aI281 -aI-820 -aa(lp14387 -g20 -aI281 -aI-279 -aa(lp14388 -g15 -aI297 -aI-180 -aI281 -aI-240 -aI286 -aI-207 -aa(lp14389 -g15 -aI344 -aI-114 -aI308 -aI-153 -aI324 -aI-131 -aa(lp14390 -g15 -aI414 -aI-77 -aI363 -aI-97 -aI387 -aI-85 -aa(lp14391 -g15 -aI503 -aI-65 -aI441 -aI-69 -aI471 -aI-65 -aa(lp14392 -g15 -aI603 -aI-81 -aI542 -aI-65 -aI575 -aI-71 -aa(lp14393 -g15 -aI673 -aI-124 -aI631 -aI-91 -aI655 -aI-106 -aa(lp14394 -g15 -aI714 -aI-190 -aI691 -aI-143 -aI705 -aI-165 -aa(lp14395 -g15 -aI727 -aI-274 -aI723 -aI-216 -aI727 -aI-243 -aa(lp14396 -g20 -aI727 -aI-804 -aa(lp14397 -g15 -aI719 -aI-852 -aI727 -aI-824 -aI724 -aI-840 -aa(lp14398 -g15 -aI695 -aI-879 -aI713 -aI-864 -aI705 -aI-873 -aa(lp14399 -g15 -aI660 -aI-892 -aI685 -aI-886 -aI673 -aI-890 -aa(lp14400 -g15 -aI618 -aI-895 -aI647 -aI-894 -aI633 -aI-895 -aa(lp14401 -g20 -aI601 -aI-895 -aa(lp14402 -g20 -aI601 -aI-951 -aa(lp14403 -g20 -aI936 -aI-951 -aa(lp14404 -g20 -aI936 -aI-895 -aa(lp14405 -g20 -aI918 -aI-895 -aa(lp14406 -g15 -aI876 -aI-892 -aI903 -aI-895 -aI889 -aI-894 -aa(lp14407 -g15 -aI841 -aI-878 -aI862 -aI-889 -aI851 -aI-885 -aa(lp14408 -g15 -aI818 -aI-849 -aI831 -aI-872 -aI823 -aI-862 -aa(lp14409 -g15 -aI809 -aI-799 -aI812 -aI-837 -aI809 -aI-820 -aa(lp14410 -g20 -aI809 -aI-271 -aa(lp14411 -g15 -aI788 -aI-152 -aI809 -aI-227 -aI802 -aI-187 -aa(lp14412 -g15 -aI725 -aI-62 -aI773 -aI-116 -aI753 -aI-86 -aa(lp14413 -g15 -aI623 -aI-6 -aI698 -aI-37 -aI663 -aI-19 -aa(lp14414 -g15 -aI482 -aI13 -aI582 -aI6 -aI535 -aI13 -aa(lp14415 -g10 -aa(lp14416 -g8 -aI955 -aI0 -aa(lp14417 -g10 -aa(lp14418 -g8 -aI955 -aI0 -aasVY -(lp14419 -(lp14420 -g8 -aI212 -aI0 -aa(lp14421 -g20 -aI212 -aI-55 -aa(lp14422 -g20 -aI242 -aI-55 -aa(lp14423 -g15 -aI284 -aI-58 -aI257 -aI-55 -aI271 -aI-56 -aa(lp14424 -g15 -aI319 -aI-70 -aI298 -aI-60 -aI309 -aI-64 -aa(lp14425 -g15 -aI343 -aI-97 -aI329 -aI-76 -aI337 -aI-85 -aa(lp14426 -g15 -aI352 -aI-144 -aI349 -aI-109 -aI352 -aI-125 -aa(lp14427 -g20 -aI352 -aI-396 -aa(lp14428 -g20 -aI105 -aI-825 -aa(lp14429 -g15 -aI84 -aI-857 -aI98 -aI-837 -aI91 -aI-848 -aa(lp14430 -g15 -aI64 -aI-879 -aI78 -aI-866 -aI71 -aI-873 -aa(lp14431 -g15 -aI40 -aI-891 -aI56 -aI-884 -aI49 -aI-888 -aa(lp14432 -g15 -aI10 -aI-895 -aI31 -aI-894 -aI21 -aI-895 -aa(lp14433 -g20 -aI-6 -aI-895 -aa(lp14434 -g20 -aI-6 -aI-951 -aa(lp14435 -g20 -aI360 -aI-951 -aa(lp14436 -g20 -aI360 -aI-895 -aa(lp14437 -g20 -aI310 -aI-895 -aa(lp14438 -g15 -aI280 -aI-892 -aI298 -aI-895 -aI288 -aI-894 -aa(lp14439 -g15 -aI263 -aI-883 -aI273 -aI-889 -aI267 -aI-886 -aa(lp14440 -g15 -aI254 -aI-869 -aI258 -aI-879 -aI255 -aI-874 -aa(lp14441 -g15 -aI251 -aI-853 -aI252 -aI-864 -aI251 -aI-858 -aa(lp14442 -g15 -aI260 -aI-815 -aI251 -aI-840 -aI254 -aI-827 -aa(lp14443 -g15 -aI276 -aI-782 -aI265 -aI-802 -aI270 -aI-791 -aa(lp14444 -g20 -aI374 -aI-603 -aa(lp14445 -g15 -aI414 -aI-522 -aI389 -aI-576 -aI403 -aI-549 -aa(lp14446 -g15 -aI441 -aI-451 -aI424 -aI-495 -aI434 -aI-472 -aa(lp14447 -g15 -aI456 -aI-483 -aI445 -aI-460 -aI450 -aI-471 -aa(lp14448 -g15 -aI475 -aI-520 -aI461 -aI-494 -aI468 -aI-507 -aa(lp14449 -g15 -aI498 -aI-561 -aI482 -aI-533 -aI490 -aI-547 -aa(lp14450 -g15 -aI521 -aI-603 -aI505 -aI-575 -aI513 -aI-589 -aa(lp14451 -g20 -aI606 -aI-756 -aa(lp14452 -g15 -aI625 -aI-800 -aI615 -aI-771 -aI621 -aI-786 -aa(lp14453 -g15 -aI630 -aI-836 -aI629 -aI-813 -aI630 -aI-825 -aa(lp14454 -g15 -aI610 -aI-880 -aI630 -aI-856 -aI623 -aI-870 -aa(lp14455 -g15 -aI550 -aI-895 -aI596 -aI-890 -aI576 -aI-895 -aa(lp14456 -g20 -aI511 -aI-895 -aa(lp14457 -g20 -aI511 -aI-951 -aa(lp14458 -g20 -aI837 -aI-951 -aa(lp14459 -g20 -aI837 -aI-895 -aa(lp14460 -g20 -aI821 -aI-895 -aa(lp14461 -g15 -aI794 -aI-890 -aI812 -aI-895 -aI803 -aI-893 -aa(lp14462 -g15 -aI768 -aI-873 -aI786 -aI-887 -aI777 -aI-881 -aa(lp14463 -g15 -aI741 -aI-841 -aI760 -aI-865 -aI751 -aI-854 -aa(lp14464 -g15 -aI710 -aI-791 -aI732 -aI-828 -aI722 -aI-811 -aa(lp14465 -g20 -aI486 -aI-396 -aa(lp14466 -g20 -aI486 -aI-151 -aa(lp14467 -g15 -aI495 -aI-101 -aI486 -aI-130 -aI489 -aI-113 -aa(lp14468 -g15 -aI518 -aI-72 -aI501 -aI-88 -aI508 -aI-78 -aa(lp14469 -g15 -aI553 -aI-58 -aI528 -aI-65 -aI540 -aI-60 -aa(lp14470 -g15 -aI595 -aI-55 -aI566 -aI-56 -aI580 -aI-55 -aa(lp14471 -g20 -aI626 -aI-55 -aa(lp14472 -g20 -aI626 -aI0 -aa(lp14473 -g10 -aa(lp14474 -g8 -aI833 -aI0 -aa(lp14475 -g10 -aa(lp14476 -g8 -aI833 -aI0 -aasV] -(lp14477 -(lp14478 -g8 -aI49 -aI171 -aa(lp14479 -g20 -aI49 -aI115 -aa(lp14480 -g20 -aI106 -aI115 -aa(lp14481 -g15 -aI149 -aI111 -aI121 -aI115 -aI136 -aI113 -aa(lp14482 -g15 -aI183 -aI98 -aI162 -aI109 -aI174 -aI105 -aa(lp14483 -g15 -aI207 -aI69 -aI193 -aI91 -aI201 -aI82 -aa(lp14484 -g15 -aI216 -aI19 -aI213 -aI56 -aI216 -aI40 -aa(lp14485 -g20 -aI216 -aI-860 -aa(lp14486 -g15 -aI207 -aI-911 -aI216 -aI-881 -aI213 -aI-898 -aa(lp14487 -g15 -aI183 -aI-939 -aI201 -aI-923 -aI193 -aI-933 -aa(lp14488 -g15 -aI149 -aI-953 -aI174 -aI-946 -aI162 -aI-951 -aa(lp14489 -g15 -aI106 -aI-956 -aI136 -aI-955 -aI121 -aI-956 -aa(lp14490 -g20 -aI49 -aI-956 -aa(lp14491 -g20 -aI49 -aI-1012 -aa(lp14492 -g20 -aI346 -aI-1012 -aa(lp14493 -g20 -aI346 -aI171 -aa(lp14494 -g10 -aa(lp14495 -g8 -aI479 -aI0 -aa(lp14496 -g10 -aa(lp14497 -g8 -aI479 -aI0 -aasVa -(lp14498 -(lp14499 -g8 -aI195 -aI-192 -aa(lp14500 -g15 -aI222 -aI-99 -aI195 -aI-151 -aI204 -aI-120 -aa(lp14501 -g15 -aI304 -aI-68 -aI239 -aI-78 -aI267 -aI-68 -aa(lp14502 -g15 -aI377 -aI-81 -aI330 -aI-68 -aI355 -aI-72 -aa(lp14503 -g15 -aI433 -aI-118 -aI399 -aI-90 -aI417 -aI-102 -aa(lp14504 -g15 -aI468 -aI-177 -aI448 -aI-134 -aI460 -aI-154 -aa(lp14505 -g15 -aI481 -aI-254 -aI476 -aI-200 -aI481 -aI-225 -aa(lp14506 -g20 -aI481 -aI-362 -aa(lp14507 -g20 -aI395 -aI-358 -aa(lp14508 -g15 -aI301 -aI-344 -aI358 -aI-356 -aI326 -aI-351 -aa(lp14509 -g15 -aI239 -aI-312 -aI275 -aI-336 -aI255 -aI-326 -aa(lp14510 -g15 -aI206 -aI-261 -aI223 -aI-298 -aI212 -aI-281 -aa(lp14511 -g15 -aI195 -aI-192 -aI199 -aI-241 -aI195 -aI-218 -aa(lp14512 -g10 -aa(lp14513 -g8 -aI357 -aI-661 -aa(lp14514 -g15 -aI295 -aI-650 -aI331 -aI-661 -aI311 -aI-657 -aa(lp14515 -g15 -aI258 -aI-619 -aI279 -aI-643 -aI267 -aI-633 -aa(lp14516 -g15 -aI240 -aI-573 -aI249 -aI-606 -aI243 -aI-591 -aa(lp14517 -g15 -aI235 -aI-515 -aI237 -aI-555 -aI235 -aI-536 -aa(lp14518 -g15 -aI151 -aI-534 -aI198 -aI-515 -aI170 -aI-522 -aa(lp14519 -g15 -aI122 -aI-599 -aI132 -aI-547 -aI122 -aI-568 -aa(lp14520 -g15 -aI141 -aI-658 -aI122 -aI-622 -aI128 -aI-642 -aa(lp14521 -g15 -aI193 -aI-697 -aI153 -aI-674 -aI171 -aI-687 -aa(lp14522 -g15 -aI269 -aI-720 -aI214 -aI-707 -aI240 -aI-715 -aa(lp14523 -g15 -aI362 -aI-727 -aI298 -aI-725 -aI329 -aI-727 -aa(lp14524 -g15 -aI469 -aI-715 -aI403 -aI-727 -aI439 -aI-723 -aa(lp14525 -g15 -aI545 -aI-675 -aI499 -aI-707 -aI525 -aI-694 -aa(lp14526 -g15 -aI591 -aI-604 -aI565 -aI-657 -aI581 -aI-633 -aa(lp14527 -g15 -aI606 -aI-496 -aI601 -aI-575 -aI606 -aI-539 -aa(lp14528 -g20 -aI606 -aI-151 -aa(lp14529 -g15 -aI611 -aI-105 -aI606 -aI-132 -aI608 -aI-117 -aa(lp14530 -g15 -aI625 -aI-75 -aI614 -aI-92 -aI619 -aI-83 -aa(lp14531 -g15 -aI651 -aI-60 -aI632 -aI-68 -aI640 -aI-63 -aa(lp14532 -g15 -aI689 -aI-55 -aI662 -aI-57 -aI674 -aI-55 -aa(lp14533 -g20 -aI693 -aI-55 -aa(lp14534 -g20 -aI693 -aI0 -aa(lp14535 -g20 -aI513 -aI0 -aa(lp14536 -g20 -aI492 -aI-114 -aa(lp14537 -g20 -aI481 -aI-114 -aa(lp14538 -g15 -aI440 -aI-62 -aI467 -aI-95 -aI453 -aI-78 -aa(lp14539 -g15 -aI397 -aI-22 -aI427 -aI-47 -aI413 -aI-33 -aa(lp14540 -g15 -aI344 -aI4 -aI382 -aI-11 -aI364 -aI-2 -aa(lp14541 -g15 -aI273 -aI13 -aI324 -aI10 -aI301 -aI13 -aa(lp14542 -g15 -aI191 -aI0 -aI243 -aI13 -aI216 -aI9 -aa(lp14543 -g15 -aI125 -aI-38 -aI165 -aI-7 -aI143 -aI-20 -aa(lp14544 -g15 -aI82 -aI-104 -aI106 -aI-55 -aI92 -aI-77 -aa(lp14545 -g15 -aI66 -aI-199 -aI71 -aI-131 -aI66 -aI-162 -aa(lp14546 -g15 -aI141 -aI-356 -aI66 -aI-270 -aI91 -aI-322 -aa(lp14547 -g15 -aI370 -aI-412 -aI192 -aI-391 -aI268 -aI-409 -aa(lp14548 -g20 -aI481 -aI-416 -aa(lp14549 -g20 -aI481 -aI-496 -aa(lp14550 -g15 -aI477 -aI-563 -aI481 -aI-520 -aI479 -aI-542 -aa(lp14551 -g15 -aI460 -aI-615 -aI474 -aI-583 -aI468 -aI-600 -aa(lp14552 -g15 -aI422 -aI-648 -aI451 -aI-629 -aI439 -aI-640 -aa(lp14553 -g15 -aI357 -aI-661 -aI406 -aI-656 -aI384 -aI-661 -aa(lp14554 -g10 -aa(lp14555 -g8 -aI750 -aI0 -aa(lp14556 -g10 -aa(lp14557 -g8 -aI750 -aI0 -aasVe -(lp14558 -(lp14559 -g8 -aI366 -aI-655 -aa(lp14560 -g15 -aI252 -aI-595 -aI317 -aI-655 -aI278 -aI-635 -aa(lp14561 -g15 -aI205 -aI-419 -aI225 -aI-555 -aI209 -aI-496 -aa(lp14562 -g20 -aI511 -aI-419 -aa(lp14563 -g15 -aI503 -aI-515 -aI511 -aI-454 -aI509 -aI-486 -aa(lp14564 -g15 -aI479 -aI-590 -aI498 -aI-544 -aI490 -aI-569 -aa(lp14565 -g15 -aI434 -aI-638 -aI467 -aI-611 -aI453 -aI-627 -aa(lp14566 -g15 -aI366 -aI-655 -aI416 -aI-650 -aI393 -aI-655 -aa(lp14567 -g10 -aa(lp14568 -g8 -aI382 -aI13 -aa(lp14569 -g15 -aI252 -aI-10 -aI334 -aI13 -aI291 -aI5 -aa(lp14570 -g15 -aI155 -aI-82 -aI214 -aI-27 -aI182 -aI-50 -aa(lp14571 -g15 -aI94 -aI-197 -aI129 -aI-113 -aI108 -aI-151 -aa(lp14572 -g15 -aI73 -aI-351 -aI80 -aI-242 -aI73 -aI-294 -aa(lp14573 -g15 -aI150 -aI-633 -aI73 -aI-476 -aI99 -aI-570 -aa(lp14574 -g15 -aI369 -aI-727 -aI201 -aI-695 -aI274 -aI-727 -aa(lp14575 -g15 -aI485 -aI-707 -aI412 -aI-727 -aI450 -aI-720 -aa(lp14576 -g15 -aI572 -aI-647 -aI519 -aI-693 -aI548 -aI-673 -aa(lp14577 -g15 -aI627 -aI-547 -aI596 -aI-620 -aI614 -aI-587 -aa(lp14578 -g15 -aI646 -aI-409 -aI640 -aI-507 -aI646 -aI-461 -aa(lp14579 -g20 -aI646 -aI-347 -aa(lp14580 -g20 -aI202 -aI-347 -aa(lp14581 -g15 -aI217 -aI-222 -aI203 -aI-299 -aI208 -aI-257 -aa(lp14582 -g15 -aI255 -aI-136 -aI226 -aI-187 -aI238 -aI-158 -aa(lp14583 -g15 -aI317 -aI-86 -aI272 -aI-113 -aI292 -aI-97 -aa(lp14584 -g15 -aI401 -aI-70 -aI341 -aI-75 -aI369 -aI-70 -aa(lp14585 -g15 -aI465 -aI-78 -aI424 -aI-70 -aI445 -aI-73 -aa(lp14586 -g15 -aI518 -aI-99 -aI484 -aI-83 -aI502 -aI-90 -aa(lp14587 -g15 -aI561 -aI-128 -aI534 -aI-107 -aI549 -aI-117 -aa(lp14588 -g15 -aI591 -aI-163 -aI573 -aI-139 -aI583 -aI-151 -aa(lp14589 -g15 -aI609 -aI-147 -aI597 -aI-161 -aI603 -aI-155 -aa(lp14590 -g15 -aI617 -aI-118 -aI614 -aI-139 -aI617 -aI-129 -aa(lp14591 -g15 -aI602 -aI-74 -aI617 -aI-104 -aI612 -aI-90 -aa(lp14592 -g15 -aI559 -aI-32 -aI593 -aI-59 -aI578 -aI-45 -aa(lp14593 -g15 -aI486 -aI0 -aI539 -aI-19 -aI515 -aI-8 -aa(lp14594 -g15 -aI382 -aI13 -aI456 -aI9 -aI422 -aI13 -aa(lp14595 -g10 -aa(lp14596 -g8 -aI713 -aI0 -aa(lp14597 -g10 -aa(lp14598 -g8 -aI713 -aI0 -aasVi -(lp14599 -(lp14600 -g8 -aI48 -aI-55 -aa(lp14601 -g15 -aI90 -aI-58 -aI62 -aI-55 -aI76 -aI-56 -aa(lp14602 -g15 -aI125 -aI-70 -aI103 -aI-60 -aI115 -aI-64 -aa(lp14603 -g15 -aI148 -aI-97 -aI134 -aI-76 -aI142 -aI-85 -aa(lp14604 -g15 -aI157 -aI-144 -aI154 -aI-109 -aI157 -aI-125 -aa(lp14605 -g20 -aI157 -aI-567 -aa(lp14606 -g15 -aI148 -aI-614 -aI157 -aI-586 -aI154 -aI-602 -aa(lp14607 -g15 -aI125 -aI-642 -aI142 -aI-626 -aI134 -aI-635 -aa(lp14608 -g15 -aI90 -aI-655 -aI115 -aI-648 -aI103 -aI-652 -aa(lp14609 -g15 -aI48 -aI-658 -aI76 -aI-657 -aI62 -aI-658 -aa(lp14610 -g20 -aI44 -aI-658 -aa(lp14611 -g20 -aI44 -aI-714 -aa(lp14612 -g20 -aI282 -aI-714 -aa(lp14613 -g20 -aI282 -aI-151 -aa(lp14614 -g15 -aI291 -aI-101 -aI282 -aI-130 -aI285 -aI-113 -aa(lp14615 -g15 -aI314 -aI-72 -aI297 -aI-88 -aI305 -aI-78 -aa(lp14616 -g15 -aI349 -aI-58 -aI324 -aI-65 -aI336 -aI-60 -aa(lp14617 -g15 -aI391 -aI-55 -aI363 -aI-56 -aI377 -aI-55 -aa(lp14618 -g20 -aI409 -aI-55 -aa(lp14619 -g20 -aI409 -aI0 -aa(lp14620 -g20 -aI30 -aI0 -aa(lp14621 -g20 -aI30 -aI-55 -aa(lp14622 -g10 -aa(lp14623 -g8 -aI138 -aI-930 -aa(lp14624 -g15 -aI144 -aI-969 -aI138 -aI-946 -aI140 -aI-959 -aa(lp14625 -g15 -aI160 -aI-994 -aI148 -aI-980 -aI153 -aI-988 -aa(lp14626 -g15 -aI184 -aI-1008 -aI167 -aI-1001 -aI175 -aI-1006 -aa(lp14627 -g15 -aI214 -aI-1012 -aI194 -aI-1011 -aI203 -aI-1012 -aa(lp14628 -g15 -aI244 -aI-1008 -aI225 -aI-1012 -aI235 -aI-1011 -aa(lp14629 -g15 -aI267 -aI-994 -aI253 -aI-1006 -aI261 -aI-1001 -aa(lp14630 -g15 -aI284 -aI-969 -aI274 -aI-988 -aI280 -aI-980 -aa(lp14631 -g15 -aI290 -aI-930 -aI288 -aI-959 -aI290 -aI-946 -aa(lp14632 -g15 -aI284 -aI-891 -aI290 -aI-914 -aI288 -aI-901 -aa(lp14633 -g15 -aI267 -aI-866 -aI280 -aI-881 -aI274 -aI-872 -aa(lp14634 -g15 -aI244 -aI-852 -aI261 -aI-859 -aI253 -aI-854 -aa(lp14635 -g15 -aI214 -aI-847 -aI235 -aI-849 -aI225 -aI-847 -aa(lp14636 -g15 -aI184 -aI-852 -aI203 -aI-847 -aI194 -aI-849 -aa(lp14637 -g15 -aI160 -aI-866 -aI175 -aI-854 -aI167 -aI-859 -aa(lp14638 -g15 -aI144 -aI-891 -aI153 -aI-872 -aI148 -aI-881 -aa(lp14639 -g15 -aI138 -aI-930 -aI140 -aI-901 -aI138 -aI-914 -aa(lp14640 -g10 -aa(lp14641 -g8 -aI426 -aI0 -aa(lp14642 -g10 -aa(lp14643 -g8 -aI426 -aI0 -aasVm -(lp14644 -(lp14645 -g8 -aI395 -aI-55 -aa(lp14646 -g20 -aI395 -aI0 -aa(lp14647 -g20 -aI37 -aI0 -aa(lp14648 -g20 -aI37 -aI-55 -aa(lp14649 -g20 -aI54 -aI-55 -aa(lp14650 -g15 -aI96 -aI-58 -aI69 -aI-55 -aI83 -aI-56 -aa(lp14651 -g15 -aI128 -aI-72 -aI108 -aI-60 -aI119 -aI-65 -aa(lp14652 -g15 -aI150 -aI-101 -aI138 -aI-78 -aI145 -aI-88 -aa(lp14653 -g15 -aI157 -aI-151 -aI155 -aI-113 -aI157 -aI-130 -aa(lp14654 -g20 -aI157 -aI-567 -aa(lp14655 -g15 -aI149 -aI-614 -aI157 -aI-586 -aI154 -aI-602 -aa(lp14656 -g15 -aI128 -aI-642 -aI144 -aI-626 -aI137 -aI-635 -aa(lp14657 -g15 -aI95 -aI-655 -aI119 -aI-648 -aI108 -aI-652 -aa(lp14658 -g15 -aI54 -aI-658 -aI83 -aI-657 -aI69 -aI-658 -aa(lp14659 -g20 -aI50 -aI-658 -aa(lp14660 -g20 -aI50 -aI-714 -aa(lp14661 -g20 -aI259 -aI-714 -aa(lp14662 -g20 -aI277 -aI-606 -aa(lp14663 -g20 -aI283 -aI-606 -aa(lp14664 -g15 -aI326 -aI-667 -aI297 -aI-631 -aI311 -aI-651 -aa(lp14665 -g15 -aI373 -aI-704 -aI340 -aI-683 -aI356 -aI-695 -aa(lp14666 -g15 -aI426 -aI-722 -aI390 -aI-713 -aI407 -aI-719 -aa(lp14667 -g15 -aI485 -aI-727 -aI444 -aI-725 -aI464 -aI-727 -aa(lp14668 -g15 -aI546 -aI-720 -aI506 -aI-727 -aI527 -aI-725 -aa(lp14669 -g15 -aI601 -aI-700 -aI566 -aI-716 -aI584 -aI-709 -aa(lp14670 -g15 -aI646 -aI-662 -aI617 -aI-690 -aI632 -aI-678 -aa(lp14671 -g15 -aI678 -aI-606 -aI659 -aI-647 -aI670 -aI-628 -aa(lp14672 -g20 -aI689 -aI-606 -aa(lp14673 -g15 -aI733 -aI-667 -aI702 -aI-631 -aI717 -aI-651 -aa(lp14674 -g15 -aI782 -aI-704 -aI748 -aI-683 -aI765 -aI-695 -aa(lp14675 -g15 -aI838 -aI-722 -aI800 -aI-713 -aI818 -aI-719 -aa(lp14676 -g15 -aI898 -aI-727 -aI857 -aI-725 -aI877 -aI-727 -aa(lp14677 -g15 -aI989 -aI-712 -aI932 -aI-727 -aI962 -aI-722 -aa(lp14678 -g15 -aI1057 -aI-665 -aI1016 -aI-701 -aI1039 -aI-686 -aa(lp14679 -g15 -aI1100 -aI-584 -aI1076 -aI-644 -aI1090 -aI-617 -aa(lp14680 -g15 -aI1115 -aI-466 -aI1110 -aI-551 -aI1115 -aI-511 -aa(lp14681 -g20 -aI1115 -aI-151 -aa(lp14682 -g15 -aI1123 -aI-101 -aI1115 -aI-130 -aI1118 -aI-113 -aa(lp14683 -g15 -aI1145 -aI-72 -aI1128 -aI-88 -aI1136 -aI-78 -aa(lp14684 -g15 -aI1177 -aI-58 -aI1154 -aI-65 -aI1165 -aI-60 -aa(lp14685 -g15 -aI1218 -aI-55 -aI1190 -aI-56 -aI1203 -aI-55 -aa(lp14686 -g20 -aI1222 -aI-55 -aa(lp14687 -g20 -aI1222 -aI0 -aa(lp14688 -g20 -aI990 -aI0 -aa(lp14689 -g20 -aI990 -aI-459 -aa(lp14690 -g15 -aI983 -aI-537 -aI990 -aI-488 -aI988 -aI-514 -aa(lp14691 -g15 -aI959 -aI-594 -aI978 -aI-559 -aI970 -aI-578 -aa(lp14692 -g15 -aI916 -aI-630 -aI948 -aI-610 -aI933 -aI-622 -aa(lp14693 -g15 -aI850 -aI-642 -aI898 -aI-638 -aI876 -aI-642 -aa(lp14694 -g15 -aI780 -aI-626 -aI823 -aI-642 -aI799 -aI-636 -aa(lp14695 -g15 -aI735 -aI-582 -aI762 -aI-615 -aI746 -aI-601 -aa(lp14696 -g15 -aI709 -aI-519 -aI723 -aI-564 -aI714 -aI-543 -aa(lp14697 -g15 -aI702 -aI-443 -aI704 -aI-495 -aI702 -aI-470 -aa(lp14698 -g20 -aI702 -aI-151 -aa(lp14699 -g15 -aI710 -aI-101 -aI702 -aI-130 -aI705 -aI-113 -aa(lp14700 -g15 -aI731 -aI-72 -aI715 -aI-88 -aI722 -aI-78 -aa(lp14701 -g15 -aI764 -aI-58 -aI740 -aI-65 -aI751 -aI-60 -aa(lp14702 -g15 -aI805 -aI-55 -aI776 -aI-56 -aI790 -aI-55 -aa(lp14703 -g20 -aI809 -aI-55 -aa(lp14704 -g20 -aI809 -aI0 -aa(lp14705 -g20 -aI577 -aI0 -aa(lp14706 -g20 -aI577 -aI-459 -aa(lp14707 -g15 -aI569 -aI-537 -aI577 -aI-488 -aI574 -aI-514 -aa(lp14708 -g15 -aI545 -aI-594 -aI564 -aI-559 -aI556 -aI-578 -aa(lp14709 -g15 -aI502 -aI-630 -aI534 -aI-610 -aI520 -aI-622 -aa(lp14710 -g15 -aI437 -aI-642 -aI484 -aI-638 -aI463 -aI-642 -aa(lp14711 -g15 -aI364 -aI-624 -aI408 -aI-642 -aI384 -aI-636 -aa(lp14712 -g15 -aI316 -aI-577 -aI344 -aI-612 -aI328 -aI-596 -aa(lp14713 -g15 -aI290 -aI-508 -aI304 -aI-557 -aI295 -aI-534 -aa(lp14714 -g15 -aI282 -aI-425 -aI285 -aI-481 -aI282 -aI-454 -aa(lp14715 -g20 -aI282 -aI-144 -aa(lp14716 -g15 -aI291 -aI-97 -aI282 -aI-125 -aI285 -aI-109 -aa(lp14717 -g15 -aI315 -aI-70 -aI297 -aI-85 -aI305 -aI-76 -aa(lp14718 -g15 -aI349 -aI-58 -aI325 -aI-64 -aI336 -aI-60 -aa(lp14719 -g15 -aI391 -aI-55 -aI363 -aI-56 -aI377 -aI-55 -aa(lp14720 -g10 -aa(lp14721 -g8 -aI1259 -aI0 -aa(lp14722 -g10 -aa(lp14723 -g8 -aI1259 -aI0 -aasVq -(lp14724 -(lp14725 -g8 -aI794 -aI320 -aa(lp14726 -g20 -aI395 -aI320 -aa(lp14727 -g20 -aI395 -aI264 -aa(lp14728 -g20 -aI440 -aI264 -aa(lp14729 -g15 -aI482 -aI261 -aI455 -aI264 -aI469 -aI263 -aa(lp14730 -g15 -aI517 -aI248 -aI495 -aI259 -aI507 -aI254 -aa(lp14731 -g15 -aI540 -aI218 -aI527 -aI241 -aI534 -aI231 -aa(lp14732 -g15 -aI549 -aI168 -aI546 -aI206 -aI549 -aI189 -aa(lp14733 -g20 -aI549 -aI53 -aa(lp14734 -g15 -aI550 -aI1 -aI549 -aI38 -aI549 -aI21 -aa(lp14735 -g15 -aI552 -aI-55 -aI550 -aI-18 -aI551 -aI-37 -aa(lp14736 -g15 -aI554 -aI-119 -aI552 -aI-76 -aI553 -aI-97 -aa(lp14737 -g20 -aI549 -aI-119 -aa(lp14738 -g15 -aI515 -aI-64 -aI539 -aI-98 -aI528 -aI-80 -aa(lp14739 -g15 -aI471 -aI-22 -aI502 -aI-48 -aI487 -aI-34 -aa(lp14740 -g15 -aI415 -aI4 -aI454 -aI-11 -aI436 -aI-2 -aa(lp14741 -g15 -aI345 -aI13 -aI394 -aI10 -aI371 -aI13 -aa(lp14742 -g15 -aI228 -aI-8 -aI301 -aI13 -aI262 -aI6 -aa(lp14743 -g15 -aI143 -aI-75 -aI194 -aI-22 -aI166 -aI-45 -aa(lp14744 -g15 -aI91 -aI-190 -aI120 -aI-105 -aI102 -aI-143 -aa(lp14745 -g15 -aI73 -aI-355 -aI79 -aI-236 -aI73 -aI-291 -aa(lp14746 -g15 -aI91 -aI-522 -aI73 -aI-419 -aI79 -aI-475 -aa(lp14747 -g15 -aI143 -aI-638 -aI102 -aI-569 -aI120 -aI-607 -aa(lp14748 -g15 -aI228 -aI-705 -aI166 -aI-668 -aI194 -aI-691 -aa(lp14749 -g15 -aI345 -aI-727 -aI262 -aI-720 -aI301 -aI-727 -aa(lp14750 -g15 -aI414 -aI-718 -aI370 -aI-727 -aI393 -aI-724 -aa(lp14751 -g15 -aI471 -aI-694 -aI435 -aI-713 -aI454 -aI-705 -aa(lp14752 -g15 -aI515 -aI-657 -aI487 -aI-684 -aI502 -aI-672 -aa(lp14753 -g15 -aI549 -aI-610 -aI528 -aI-643 -aI539 -aI-627 -aa(lp14754 -g20 -aI557 -aI-610 -aa(lp14755 -g20 -aI581 -aI-714 -aa(lp14756 -g20 -aI794 -aI-714 -aa(lp14757 -g20 -aI794 -aI-658 -aa(lp14758 -g20 -aI783 -aI-658 -aa(lp14759 -g15 -aI741 -aI-655 -aI769 -aI-658 -aI754 -aI-657 -aa(lp14760 -g15 -aI706 -aI-641 -aI728 -aI-652 -aI716 -aI-648 -aa(lp14761 -g15 -aI683 -aI-612 -aI696 -aI-635 -aI689 -aI-625 -aa(lp14762 -g15 -aI674 -aI-562 -aI677 -aI-599 -aI674 -aI-582 -aa(lp14763 -g20 -aI674 -aI173 -aa(lp14764 -g15 -aI683 -aI220 -aI674 -aI193 -aI677 -aI208 -aa(lp14765 -g15 -aI707 -aI248 -aI689 -aI232 -aI697 -aI241 -aa(lp14766 -g15 -aI741 -aI261 -aI717 -aI255 -aI728 -aI259 -aa(lp14767 -g15 -aI783 -aI264 -aI755 -aI263 -aI769 -aI264 -aa(lp14768 -g20 -aI794 -aI264 -aa(lp14769 -g10 -aa(lp14770 -g8 -aI367 -aI-71 -aa(lp14771 -g15 -aI454 -aI-89 -aI402 -aI-71 -aI431 -aI-77 -aa(lp14772 -g15 -aI510 -aI-141 -aI477 -aI-100 -aI496 -aI-118 -aa(lp14773 -g15 -aI540 -aI-230 -aI524 -aI-164 -aI534 -aI-194 -aa(lp14774 -g15 -aI549 -aI-355 -aI546 -aI-265 -aI549 -aI-307 -aa(lp14775 -g15 -aI540 -aI-478 -aI549 -aI-402 -aI546 -aI-443 -aa(lp14776 -g15 -aI510 -aI-568 -aI534 -aI-514 -aI524 -aI-544 -aa(lp14777 -g15 -aI454 -aI-623 -aI496 -aI-592 -aI477 -aI-610 -aa(lp14778 -g15 -aI366 -aI-642 -aI430 -aI-635 -aI401 -aI-642 -aa(lp14779 -g15 -aI291 -aI-623 -aI337 -aI-642 -aI312 -aI-635 -aa(lp14780 -g15 -aI240 -aI-567 -aI270 -aI-610 -aI253 -aI-592 -aa(lp14781 -g15 -aI211 -aI-477 -aI227 -aI-543 -aI217 -aI-513 -aa(lp14782 -g15 -aI202 -aI-354 -aI205 -aI-441 -aI202 -aI-400 -aa(lp14783 -g15 -aI240 -aI-142 -aI202 -aI-259 -aI215 -aI-189 -aa(lp14784 -g15 -aI367 -aI-71 -aI266 -aI-95 -aI308 -aI-71 -aa(lp14785 -g10 -aa(lp14786 -g8 -aI818 -aI0 -aa(lp14787 -g10 -aa(lp14788 -g8 -aI818 -aI0 -aasVu -(lp14789 -(lp14790 -g8 -aI702 -aI-144 -aa(lp14791 -g15 -aI711 -aI-97 -aI702 -aI-125 -aI705 -aI-109 -aa(lp14792 -g15 -aI735 -aI-70 -aI717 -aI-85 -aI725 -aI-76 -aa(lp14793 -g15 -aI769 -aI-58 -aI745 -aI-64 -aI756 -aI-60 -aa(lp14794 -g15 -aI811 -aI-55 -aI783 -aI-56 -aI797 -aI-55 -aa(lp14795 -g20 -aI815 -aI-55 -aa(lp14796 -g20 -aI815 -aI0 -aa(lp14797 -g20 -aI604 -aI0 -aa(lp14798 -g20 -aI586 -aI-107 -aa(lp14799 -g20 -aI580 -aI-107 -aa(lp14800 -g15 -aI535 -aI-46 -aI566 -aI-82 -aI551 -aI-62 -aa(lp14801 -g15 -aI483 -aI-9 -aI519 -aI-30 -aI501 -aI-18 -aa(lp14802 -g15 -aI426 -aI8 -aI465 -aI0 -aI446 -aI5 -aa(lp14803 -g15 -aI363 -aI13 -aI406 -aI11 -aI385 -aI13 -aa(lp14804 -g15 -aI270 -aI-1 -aI328 -aI13 -aI297 -aI8 -aa(lp14805 -g15 -aI201 -aI-48 -aI242 -aI-11 -aI219 -aI-27 -aa(lp14806 -g15 -aI158 -aI-129 -aI182 -aI-69 -aI168 -aI-96 -aa(lp14807 -g15 -aI143 -aI-247 -aI148 -aI-162 -aI143 -aI-202 -aa(lp14808 -g20 -aI143 -aI-567 -aa(lp14809 -g15 -aI135 -aI-614 -aI143 -aI-586 -aI140 -aI-602 -aa(lp14810 -g15 -aI111 -aI-642 -aI129 -aI-626 -aI121 -aI-635 -aa(lp14811 -g15 -aI76 -aI-655 -aI101 -aI-648 -aI89 -aI-652 -aa(lp14812 -g15 -aI34 -aI-658 -aI63 -aI-657 -aI49 -aI-658 -aa(lp14813 -g20 -aI30 -aI-658 -aa(lp14814 -g20 -aI30 -aI-714 -aa(lp14815 -g20 -aI269 -aI-714 -aa(lp14816 -g20 -aI269 -aI-254 -aa(lp14817 -g15 -aI276 -aI-176 -aI269 -aI-225 -aI271 -aI-199 -aa(lp14818 -g15 -aI299 -aI-119 -aI280 -aI-154 -aI288 -aI-134 -aa(lp14819 -g15 -aI342 -aI-83 -aI309 -aI-103 -aI324 -aI-91 -aa(lp14820 -g15 -aI409 -aI-71 -aI360 -aI-75 -aI382 -aI-71 -aa(lp14821 -g15 -aI485 -aI-87 -aI439 -aI-71 -aI464 -aI-77 -aa(lp14822 -g15 -aI537 -aI-131 -aI506 -aI-97 -aI523 -aI-112 -aa(lp14823 -g15 -aI567 -aI-199 -aI551 -aI-150 -aI561 -aI-172 -aa(lp14824 -g15 -aI577 -aI-287 -aI574 -aI-225 -aI577 -aI-255 -aa(lp14825 -g20 -aI577 -aI-562 -aa(lp14826 -g15 -aI568 -aI-612 -aI577 -aI-582 -aI574 -aI-599 -aa(lp14827 -g15 -aI545 -aI-641 -aI562 -aI-625 -aI555 -aI-635 -aa(lp14828 -g15 -aI510 -aI-655 -aI535 -aI-648 -aI523 -aI-652 -aa(lp14829 -g15 -aI468 -aI-658 -aI497 -aI-657 -aI483 -aI-658 -aa(lp14830 -g20 -aI464 -aI-658 -aa(lp14831 -g20 -aI464 -aI-714 -aa(lp14832 -g20 -aI702 -aI-714 -aa(lp14833 -g10 -aa(lp14834 -g8 -aI846 -aI0 -aa(lp14835 -g10 -aa(lp14836 -g8 -aI846 -aI0 -aasVy -(lp14837 -(lp14838 -g8 -aI753 -aI-714 -aa(lp14839 -g20 -aI753 -aI-658 -aa(lp14840 -g20 -aI749 -aI-658 -aa(lp14841 -g15 -aI715 -aI-654 -aI736 -aI-658 -aI725 -aI-656 -aa(lp14842 -g15 -aI690 -aI-638 -aI706 -aI-651 -aI698 -aI-646 -aa(lp14843 -g15 -aI669 -aI-606 -aI682 -aI-630 -aI675 -aI-619 -aa(lp14844 -g15 -aI647 -aI-554 -aI662 -aI-592 -aI655 -aI-575 -aa(lp14845 -g20 -aI445 -aI5 -aa(lp14846 -g15 -aI401 -aI118 -aI429 -aI48 -aI414 -aI86 -aa(lp14847 -g15 -aI357 -aI202 -aI387 -aI151 -aI372 -aI179 -aa(lp14848 -g15 -aI307 -aI260 -aI342 -aI225 -aI325 -aI245 -aa(lp14849 -g15 -aI246 -aI296 -aI289 -aI275 -aI269 -aI287 -aa(lp14850 -g15 -aI166 -aI315 -aI223 -aI305 -aI196 -aI312 -aa(lp14851 -g15 -aI62 -aI320 -aI136 -aI319 -aI101 -aI320 -aa(lp14852 -g20 -aI50 -aI320 -aa(lp14853 -g20 -aI50 -aI257 -aa(lp14854 -g15 -aI167 -aI237 -aI95 -aI257 -aI134 -aI250 -aa(lp14855 -g15 -aI251 -aI182 -aI199 -aI223 -aI227 -aI205 -aa(lp14856 -g15 -aI310 -aI99 -aI275 -aI158 -aI295 -aI130 -aa(lp14857 -g15 -aI350 -aI-4 -aI326 -aI67 -aI340 -aI32 -aa(lp14858 -g20 -aI104 -aI-587 -aa(lp14859 -g15 -aI86 -aI-621 -aI98 -aI-601 -aI92 -aI-612 -aa(lp14860 -g15 -aI67 -aI-643 -aI80 -aI-630 -aI74 -aI-637 -aa(lp14861 -g15 -aI42 -aI-655 -aI60 -aI-649 -aI51 -aI-652 -aa(lp14862 -g15 -aI9 -aI-658 -aI33 -aI-657 -aI22 -aI-658 -aa(lp14863 -g20 -aI5 -aI-658 -aa(lp14864 -g20 -aI5 -aI-714 -aa(lp14865 -g20 -aI325 -aI-714 -aa(lp14866 -g20 -aI325 -aI-658 -aa(lp14867 -g20 -aI321 -aI-658 -aa(lp14868 -g15 -aI261 -aI-642 -aI294 -aI-658 -aI274 -aI-653 -aa(lp14869 -g15 -aI241 -aI-593 -aI248 -aI-632 -aI241 -aI-616 -aa(lp14870 -g15 -aI243 -aI-571 -aI241 -aI-586 -aI242 -aI-579 -aa(lp14871 -g15 -aI251 -aI-545 -aI245 -aI-563 -aI248 -aI-555 -aa(lp14872 -g20 -aI349 -aI-307 -aa(lp14873 -g15 -aI368 -aI-257 -aI355 -aI-292 -aI362 -aI-275 -aa(lp14874 -g15 -aI387 -aI-204 -aI375 -aI-239 -aI381 -aI-221 -aa(lp14875 -g15 -aI403 -aI-154 -aI393 -aI-186 -aI398 -aI-170 -aa(lp14876 -g15 -aI413 -aI-114 -aI408 -aI-138 -aI411 -aI-125 -aa(lp14877 -g20 -aI417 -aI-114 -aa(lp14878 -g15 -aI437 -aI-185 -aI422 -aI-133 -aI428 -aI-157 -aa(lp14879 -g15 -aI466 -aI-275 -aI445 -aI-213 -aI455 -aI-243 -aa(lp14880 -g20 -aI555 -aI-535 -aa(lp14881 -g15 -aI564 -aI-566 -aI559 -aI-546 -aI562 -aI-556 -aa(lp14882 -g15 -aI567 -aI-592 -aI566 -aI-576 -aI567 -aI-585 -aa(lp14883 -g15 -aI545 -aI-642 -aI567 -aI-615 -aI560 -aI-632 -aa(lp14884 -g15 -aI479 -aI-658 -aI531 -aI-653 -aI509 -aI-658 -aa(lp14885 -g20 -aI475 -aI-658 -aa(lp14886 -g20 -aI475 -aI-714 -aa(lp14887 -g10 -aa(lp14888 -g8 -aI753 -aI0 -aa(lp14889 -g10 -aa(lp14890 -g8 -aI753 -aI0 -aasV} -(lp14891 -(lp14892 -g8 -aI66 -aI113 -aa(lp14893 -g20 -aI106 -aI113 -aa(lp14894 -g15 -aI191 -aI77 -aI146 -aI113 -aI174 -aI101 -aa(lp14895 -g15 -aI216 -aI-26 -aI207 -aI54 -aI216 -aI19 -aa(lp14896 -g20 -aI216 -aI-256 -aa(lp14897 -g15 -aI251 -aI-366 -aI216 -aI-300 -aI227 -aI-337 -aa(lp14898 -g15 -aI363 -aI-422 -aI275 -aI-394 -aI312 -aI-413 -aa(lp14899 -g20 -aI363 -aI-423 -aa(lp14900 -g15 -aI252 -aI-479 -aI314 -aI-431 -aI277 -aI-450 -aa(lp14901 -g15 -aI216 -aI-587 -aI228 -aI-507 -aI216 -aI-544 -aa(lp14902 -g20 -aI216 -aI-815 -aa(lp14903 -g15 -aI191 -aI-920 -aI216 -aI-861 -aI207 -aI-896 -aa(lp14904 -g15 -aI106 -aI-955 -aI174 -aI-943 -aI146 -aI-955 -aa(lp14905 -g20 -aI66 -aI-955 -aa(lp14906 -g20 -aI66 -aI-1012 -aa(lp14907 -g20 -aI154 -aI-1012 -aa(lp14908 -g15 -aI297 -aI-963 -aI217 -aI-1012 -aI265 -aI-996 -aa(lp14909 -g15 -aI346 -aI-822 -aI330 -aI-930 -aI346 -aI-883 -aa(lp14910 -g20 -aI346 -aI-590 -aa(lp14911 -g15 -aI358 -aI-522 -aI346 -aI-563 -aI350 -aI-540 -aa(lp14912 -g15 -aI392 -aI-480 -aI366 -aI-505 -aI378 -aI-490 -aa(lp14913 -g15 -aI442 -aI-457 -aI406 -aI-469 -aI422 -aI-462 -aa(lp14914 -g15 -aI503 -aI-450 -aI461 -aI-453 -aI481 -aI-450 -aa(lp14915 -g20 -aI503 -aI-394 -aa(lp14916 -g15 -aI442 -aI-385 -aI481 -aI-393 -aI461 -aI-390 -aa(lp14917 -g15 -aI392 -aI-363 -aI422 -aI-381 -aI406 -aI-373 -aa(lp14918 -g15 -aI358 -aI-320 -aI378 -aI-352 -aI366 -aI-338 -aa(lp14919 -g15 -aI346 -aI-252 -aI350 -aI-302 -aI346 -aI-280 -aa(lp14920 -g20 -aI346 -aI-21 -aa(lp14921 -g15 -aI333 -aI58 -aI346 -aI8 -aI342 -aI35 -aa(lp14922 -g15 -aI297 -aI118 -aI325 -aI82 -aI313 -aI102 -aa(lp14923 -g15 -aI237 -aI157 -aI281 -aI135 -aI261 -aI148 -aa(lp14924 -g15 -aI154 -aI171 -aI213 -aI166 -aI186 -aI171 -aa(lp14925 -g20 -aI66 -aI171 -aa(lp14926 -g10 -aa(lp14927 -g8 -aI570 -aI0 -aa(lp14928 -g10 -aa(lp14929 -g8 -aI570 -aI0 -aasssS'Arial' -p14930 -(dp14931 -g4270 -(dp14932 -V -(lp14933 -(lp14934 -g8 -aI370 -aI-44 -aa(lp14935 -g10 -aa(lp14936 -g8 -aI370 -aI-44 -aasV$ -(lp14937 -(lp14938 -g8 -aI318 -aI-185 -aa(lp14939 -g20 -aI318 -aI-458 -aa(lp14940 -g15 -aI131 -aI-568 -aI233 -aI-482 -aI170 -aI-519 -aa(lp14941 -g15 -aI71 -aI-748 -aI91 -aI-618 -aI71 -aI-677 -aa(lp14942 -g15 -aI138 -aI-927 -aI71 -aI-819 -aI94 -aI-879 -aa(lp14943 -g15 -aI318 -aI-1011 -aI183 -aI-975 -aI243 -aI-1003 -aa(lp14944 -g20 -aI318 -aI-1075 -aa(lp14945 -g20 -aI412 -aI-1075 -aa(lp14946 -g20 -aI412 -aI-1011 -aa(lp14947 -g15 -aI577 -aI-940 -aI481 -aI-1002 -aI536 -aI-979 -aa(lp14948 -g15 -aI655 -aI-784 -aI618 -aI-901 -aI644 -aI-849 -aa(lp14949 -g20 -aI490 -aI-763 -aa(lp14950 -g15 -aI412 -aI-867 -aI480 -aI-814 -aI454 -aI-849 -aa(lp14951 -g20 -aI412 -aI-612 -aa(lp14952 -g15 -aI625 -aI-503 -aI516 -aI-584 -aI587 -aI-548 -aa(lp14953 -g15 -aI682 -aI-330 -aI663 -aI-458 -aI682 -aI-400 -aa(lp14954 -g15 -aI611 -aI-131 -aI682 -aI-251 -aI658 -aI-185 -aa(lp14955 -g15 -aI412 -aI-32 -aI563 -aI-77 -aI497 -aI-44 -aa(lp14956 -g20 -aI412 -aI89 -aa(lp14957 -g20 -aI318 -aI89 -aa(lp14958 -g20 -aI318 -aI-29 -aa(lp14959 -g15 -aI135 -aI-113 -aI243 -aI-38 -aI182 -aI-66 -aa(lp14960 -g15 -aI45 -aI-312 -aI88 -aI-160 -aI58 -aI-226 -aa(lp14961 -g20 -aI215 -aI-330 -aa(lp14962 -g15 -aI254 -aI-240 -aI222 -aI-295 -aI235 -aI-265 -aa(lp14963 -g15 -aI318 -aI-185 -aI273 -aI-215 -aI294 -aI-197 -aa(lp14964 -g10 -aa(lp14965 -g8 -aI318 -aI-869 -aa(lp14966 -g15 -aI257 -aI-825 -aI292 -aI-860 -aI272 -aI-845 -aa(lp14967 -g15 -aI234 -aI-756 -aI241 -aI-804 -aI234 -aI-781 -aa(lp14968 -g15 -aI255 -aI-691 -aI234 -aI-733 -aI241 -aI-711 -aa(lp14969 -g15 -aI318 -aI-644 -aI269 -aI-672 -aI290 -aI-656 -aa(lp14970 -g10 -aa(lp14971 -g8 -aI412 -aI-176 -aa(lp14972 -g15 -aI492 -aI-221 -aI445 -aI-182 -aI471 -aI-197 -aa(lp14973 -g15 -aI522 -aI-306 -aI512 -aI-245 -aI522 -aI-274 -aa(lp14974 -g15 -aI497 -aI-382 -aI522 -aI-335 -aI514 -aI-360 -aa(lp14975 -g15 -aI412 -aI-430 -aI479 -aI-403 -aI451 -aI-419 -aa(lp14976 -g10 -aa(lp14977 -g8 -aI741 -aI-44 -aa(lp14978 -g10 -aa(lp14979 -g8 -aI741 -aI-44 -aasV( -(lp14980 -(lp14981 -g8 -aI399 -aI236 -aa(lp14982 -g20 -aI273 -aI236 -aa(lp14983 -g15 -aI121 -aI-76 -aI207 -aI135 -aI156 -aI31 -aa(lp14984 -g15 -aI69 -aI-390 -aI87 -aI-184 -aI69 -aI-289 -aa(lp14985 -g15 -aI134 -aI-746 -aI69 -aI-515 -aI91 -aI-634 -aa(lp14986 -g15 -aI276 -aI-1015 -aI171 -aI-843 -aI218 -aI-933 -aa(lp14987 -g20 -aI401 -aI-1015 -aa(lp14988 -g15 -aI278 -aI-679 -aI341 -aI-883 -aI300 -aI-771 -aa(lp14989 -g15 -aI244 -aI-386 -aI255 -aI-587 -aI244 -aI-489 -aa(lp14990 -g15 -aI264 -aI-167 -aI244 -aI-315 -aI251 -aI-242 -aa(lp14991 -g15 -aI319 -aI45 -aI277 -aI-92 -aI296 -aI-21 -aa(lp14992 -g15 -aI399 -aI236 -aI334 -aI89 -aI360 -aI153 -aa(lp14993 -g10 -aa(lp14994 -g8 -aI444 -aI-44 -aa(lp14995 -g10 -aa(lp14996 -g8 -aI444 -aI-44 -aasV, -(lp14997 -(lp14998 -g8 -aI91 -aI-227 -aa(lp14999 -g20 -aI274 -aI-227 -aa(lp15000 -g20 -aI274 -aI-96 -aa(lp15001 -g15 -aI260 -aI28 -aI274 -aI-43 -aI269 -aI-1 -aa(lp15002 -g15 -aI208 -aI111 -aI251 -aI59 -aI234 -aI86 -aa(lp15003 -g15 -aI111 -aI168 -aI183 -aI135 -aI151 -aI154 -aa(lp15004 -g20 -aI76 -aI92 -aa(lp15005 -g15 -aI154 -aI42 -aI113 -aI80 -aI139 -aI64 -aa(lp15006 -g15 -aI179 -aI-44 -aI170 -aI21 -aI178 -aI-7 -aa(lp15007 -g20 -aI91 -aI-44 -aa(lp15008 -g10 -aa(lp15009 -g8 -aI370 -aI-44 -aa(lp15010 -g10 -aa(lp15011 -g8 -aI370 -aI-44 -aasV0 -(lp15012 -(lp15013 -g8 -aI365 -aI-1002 -aa(lp15014 -g15 -aI582 -aI-903 -aI458 -aI-1002 -aI530 -aI-969 -aa(lp15015 -g15 -aI675 -aI-515 -aI644 -aI-825 -aI675 -aI-696 -aa(lp15016 -g15 -aI582 -aI-125 -aI675 -aI-334 -aI644 -aI-204 -aa(lp15017 -g15 -aI365 -aI-28 -aI530 -aI-60 -aI458 -aI-28 -aa(lp15018 -g15 -aI141 -aI-135 -aI273 -aI-28 -aI198 -aI-63 -aa(lp15019 -g15 -aI55 -aI-517 -aI84 -aI-206 -aI55 -aI-333 -aa(lp15020 -g15 -aI149 -aI-905 -aI55 -aI-696 -aI87 -aI-826 -aa(lp15021 -g15 -aI365 -aI-1002 -aI201 -aI-970 -aI273 -aI-1002 -aa(lp15022 -g10 -aa(lp15023 -g8 -aI365 -aI-851 -aa(lp15024 -g15 -aI306 -aI-829 -aI343 -aI-851 -aI324 -aI-844 -aa(lp15025 -g15 -aI266 -aI-754 -aI289 -aI-815 -aI275 -aI-790 -aa(lp15026 -g15 -aI247 -aI-515 -aI253 -aI-706 -aI247 -aI-627 -aa(lp15027 -g15 -aI264 -aI-284 -aI247 -aI-403 -aI253 -aI-326 -aa(lp15028 -g15 -aI306 -aI-200 -aI275 -aI-242 -aI289 -aI-214 -aa(lp15029 -g15 -aI365 -aI-179 -aI324 -aI-186 -aI343 -aI-179 -aa(lp15030 -g15 -aI425 -aI-201 -aI388 -aI-179 -aI407 -aI-186 -aa(lp15031 -g15 -aI465 -aI-276 -aI442 -aI-215 -aI455 -aI-240 -aa(lp15032 -g15 -aI484 -aI-515 -aI478 -aI-323 -aI484 -aI-403 -aa(lp15033 -g15 -aI467 -aI-745 -aI484 -aI-627 -aI478 -aI-704 -aa(lp15034 -g15 -aI424 -aI-829 -aI456 -aI-787 -aI441 -aI-815 -aa(lp15035 -g15 -aI365 -aI-851 -aI407 -aI-844 -aI388 -aI-851 -aa(lp15036 -g10 -aa(lp15037 -g8 -aI741 -aI-44 -aa(lp15038 -g10 -aa(lp15039 -g8 -aI741 -aI-44 -aasV4 -(lp15040 -(lp15041 -g8 -aI415 -aI-44 -aa(lp15042 -g20 -aI415 -aI-236 -aa(lp15043 -g20 -aI24 -aI-236 -aa(lp15044 -g20 -aI24 -aI-396 -aa(lp15045 -g20 -aI438 -aI-1002 -aa(lp15046 -g20 -aI592 -aI-1002 -aa(lp15047 -g20 -aI592 -aI-397 -aa(lp15048 -g20 -aI710 -aI-397 -aa(lp15049 -g20 -aI710 -aI-236 -aa(lp15050 -g20 -aI592 -aI-236 -aa(lp15051 -g20 -aI592 -aI-44 -aa(lp15052 -g10 -aa(lp15053 -g8 -aI415 -aI-397 -aa(lp15054 -g20 -aI415 -aI-723 -aa(lp15055 -g20 -aI195 -aI-397 -aa(lp15056 -g10 -aa(lp15057 -g8 -aI741 -aI-44 -aa(lp15058 -g10 -aa(lp15059 -g8 -aI741 -aI-44 -aasV8 -(lp15060 -(lp15061 -g8 -aI213 -aI-559 -aa(lp15062 -g15 -aI110 -aI-641 -aI166 -aI-579 -aI131 -aI-606 -aa(lp15063 -g15 -aI78 -aI-756 -aI88 -aI-676 -aI78 -aI-715 -aa(lp15064 -g15 -aI152 -aI-933 -aI78 -aI-827 -aI102 -aI-886 -aa(lp15065 -g15 -aI364 -aI-1002 -aI202 -aI-979 -aI273 -aI-1002 -aa(lp15066 -g15 -aI575 -aI-933 -aI455 -aI-1002 -aI525 -aI-979 -aa(lp15067 -g15 -aI651 -aI-756 -aI625 -aI-886 -aI651 -aI-827 -aa(lp15068 -g15 -aI616 -aI-638 -aI651 -aI-712 -aI639 -aI-673 -aa(lp15069 -g15 -aI519 -aI-559 -aI593 -aI-604 -aI561 -aI-577 -aa(lp15070 -g15 -aI640 -aI-466 -aI572 -aI-538 -aI612 -aI-507 -aa(lp15071 -g15 -aI681 -aI-325 -aI667 -aI-425 -aI681 -aI-378 -aa(lp15072 -g15 -aI597 -aI-110 -aI681 -aI-236 -aI653 -aI-165 -aa(lp15073 -g15 -aI373 -aI-27 -aI541 -aI-55 -aI466 -aI-27 -aa(lp15074 -g15 -aI156 -aI-95 -aI286 -aI-27 -aI213 -aI-50 -aa(lp15075 -g15 -aI54 -aI-317 -aI88 -aI-149 -aI54 -aI-223 -aa(lp15076 -g15 -aI92 -aI-459 -aI54 -aI-368 -aI66 -aI-416 -aa(lp15077 -g15 -aI213 -aI-559 -aI118 -aI-502 -aI158 -aI-535 -aa(lp15078 -g10 -aa(lp15079 -g8 -aI251 -aI-743 -aa(lp15080 -g15 -aI282 -aI-658 -aI251 -aI-707 -aI261 -aI-678 -aa(lp15081 -g15 -aI364 -aI-627 -aI302 -aI-637 -aI330 -aI-627 -aa(lp15082 -g15 -aI447 -aI-658 -aI399 -aI-627 -aI427 -aI-638 -aa(lp15083 -g15 -aI479 -aI-744 -aI468 -aI-679 -aI479 -aI-707 -aa(lp15084 -g15 -aI448 -aI-826 -aI479 -aI-778 -aI468 -aI-806 -aa(lp15085 -g15 -aI366 -aI-857 -aI427 -aI-847 -aI400 -aI-857 -aa(lp15086 -g15 -aI282 -aI-826 -aI331 -aI-857 -aI303 -aI-847 -aa(lp15087 -g15 -aI251 -aI-743 -aI261 -aI-805 -aI251 -aI-777 -aa(lp15088 -g10 -aa(lp15089 -g8 -aI234 -aI-334 -aa(lp15090 -g15 -aI273 -aI-216 -aI234 -aI-284 -aI247 -aI-245 -aa(lp15091 -g15 -aI369 -aI-174 -aI298 -aI-188 -aI331 -aI-174 -aa(lp15092 -g15 -aI463 -aI-215 -aI407 -aI-174 -aI438 -aI-188 -aa(lp15093 -g15 -aI500 -aI-332 -aI488 -aI-242 -aI500 -aI-281 -aa(lp15094 -g15 -aI462 -aI-440 -aI500 -aI-377 -aI488 -aI-413 -aa(lp15095 -g15 -aI367 -aI-481 -aI437 -aI-467 -aI405 -aI-481 -aa(lp15096 -g15 -aI267 -aI-435 -aI322 -aI-481 -aI289 -aI-465 -aa(lp15097 -g15 -aI234 -aI-334 -aI245 -aI-404 -aI234 -aI-370 -aa(lp15098 -g10 -aa(lp15099 -g8 -aI741 -aI-44 -aa(lp15100 -g10 -aa(lp15101 -g8 -aI741 -aI-44 -aasV< -(lp15102 -(lp15103 -g8 -aI716 -aI-153 -aa(lp15104 -g20 -aI61 -aI-437 -aa(lp15105 -g20 -aI61 -aI-595 -aa(lp15106 -g20 -aI716 -aI-878 -aa(lp15107 -g20 -aI716 -aI-692 -aa(lp15108 -g20 -aI259 -aI-518 -aa(lp15109 -g20 -aI716 -aI-337 -aa(lp15110 -g10 -aa(lp15111 -g8 -aI778 -aI-44 -aa(lp15112 -g10 -aa(lp15113 -g8 -aI778 -aI-44 -aasV@ -(lp15114 -(lp15115 -g8 -aI1156 -aI-56 -aa(lp15116 -g20 -aI1295 -aI-56 -aa(lp15117 -g15 -aI1095 -aI150 -aI1252 -aI31 -aI1185 -aI100 -aa(lp15118 -g15 -aI719 -aI236 -aI992 -aI207 -aI867 -aI236 -aa(lp15119 -g15 -aI348 -aI163 -aI576 -aI236 -aI452 -aI211 -aa(lp15120 -g15 -aI115 -aI-50 -aI244 -aI115 -aI166 -aI43 -aa(lp15121 -g15 -aI39 -aI-358 -aI65 -aI-145 -aI39 -aI-247 -aa(lp15122 -g15 -aI126 -aI-699 -aI39 -aI-480 -aI68 -aI-594 -aa(lp15123 -g15 -aI363 -aI-936 -aI184 -aI-804 -aI263 -aI-883 -aa(lp15124 -g15 -aI707 -aI-1015 -aI463 -aI-989 -aI578 -aI-1015 -aa(lp15125 -g15 -aI998 -aI-952 -aI816 -aI-1015 -aI913 -aI-994 -aa(lp15126 -g15 -aI1193 -aI-770 -aI1083 -aI-909 -aI1148 -aI-849 -aa(lp15127 -g15 -aI1261 -aI-513 -aI1238 -aI-692 -aI1261 -aI-606 -aa(lp15128 -g15 -aI1158 -aI-213 -aI1261 -aI-403 -aI1226 -aI-303 -aa(lp15129 -g15 -aI830 -aI-44 -aI1073 -aI-100 -aI963 -aI-44 -aa(lp15130 -g15 -aI748 -aI-63 -aI794 -aI-44 -aI766 -aI-50 -aa(lp15131 -g15 -aI712 -aI-118 -aI730 -aI-75 -aI718 -aI-94 -aa(lp15132 -g15 -aI535 -aI-44 -aI661 -aI-69 -aI601 -aI-44 -aa(lp15133 -g15 -aI355 -aI-118 -aI463 -aI-44 -aI403 -aI-69 -aa(lp15134 -g15 -aI284 -aI-317 -aI308 -aI-168 -aI284 -aI-234 -aa(lp15135 -g15 -aI370 -aI-596 -aI284 -aI-419 -aI313 -aI-512 -aa(lp15136 -g15 -aI637 -aI-750 -aI439 -aI-698 -aI528 -aI-750 -aa(lp15137 -g15 -aI808 -aI-661 -aI714 -aI-750 -aI771 -aI-720 -aa(lp15138 -g20 -aI824 -aI-733 -aa(lp15139 -g20 -aI996 -aI-733 -aa(lp15140 -g20 -aI898 -aI-267 -aa(lp15141 -g15 -aI889 -aI-209 -aI892 -aI-237 -aI889 -aI-218 -aa(lp15142 -g15 -aI896 -aI-185 -aI889 -aI-198 -aI891 -aI-190 -aa(lp15143 -g15 -aI914 -aI-177 -aI901 -aI-179 -aI907 -aI-177 -aa(lp15144 -g15 -aI995 -aI-215 -aI935 -aI-177 -aI962 -aI-189 -aa(lp15145 -g15 -aI1102 -aI-347 -aI1039 -aI-248 -aI1075 -aI-292 -aa(lp15146 -g15 -aI1143 -aI-520 -aI1130 -aI-403 -aI1143 -aI-460 -aa(lp15147 -g15 -aI1027 -aI-788 -aI1143 -aI-627 -aI1105 -aI-716 -aa(lp15148 -g15 -aI704 -aI-896 -aI950 -aI-860 -aI842 -aI-896 -aa(lp15149 -g15 -aI405 -aI-824 -aI586 -aI-896 -aI487 -aI-872 -aa(lp15150 -g15 -aI220 -aI-621 -aI323 -aI-776 -aI261 -aI-708 -aa(lp15151 -g15 -aI158 -aI-349 -aI178 -aI-534 -aI158 -aI-443 -aa(lp15152 -g15 -aI227 -aI-99 -aI158 -aI-258 -aI181 -aI-174 -aa(lp15153 -g15 -aI422 -aI64 -aI273 -aI-24 -aI338 -aI30 -aa(lp15154 -g15 -aI708 -aI116 -aI505 -aI99 -aI601 -aI116 -aa(lp15155 -g15 -aI976 -aI73 -aI812 -aI116 -aI901 -aI101 -aa(lp15156 -g15 -aI1156 -aI-56 -aI1051 -aI44 -aI1111 -aI0 -aa(lp15157 -g10 -aa(lp15158 -g8 -aI453 -aI-324 -aa(lp15159 -g15 -aI486 -aI-202 -aI453 -aI-269 -aI464 -aI-228 -aa(lp15160 -g15 -aI569 -aI-163 -aI509 -aI-176 -aI536 -aI-163 -aa(lp15161 -g15 -aI639 -aI-181 -aI594 -aI-163 -aI617 -aI-169 -aa(lp15162 -g15 -aI688 -aI-222 -aI655 -aI-190 -aI672 -aI-204 -aa(lp15163 -g15 -aI747 -aI-338 -aI711 -aI-249 -aI731 -aI-287 -aa(lp15164 -g15 -aI772 -aI-480 -aI764 -aI-389 -aI772 -aI-436 -aa(lp15165 -g15 -aI738 -aI-593 -aI772 -aI-529 -aI761 -aI-567 -aa(lp15166 -g15 -aI652 -aI-632 -aI715 -aI-619 -aI687 -aI-632 -aa(lp15167 -g15 -aI548 -aI-589 -aI615 -aI-632 -aI580 -aI-618 -aa(lp15168 -g15 -aI477 -aI-466 -aI517 -aI-560 -aI493 -aI-519 -aa(lp15169 -g15 -aI453 -aI-324 -aI461 -aI-412 -aI453 -aI-365 -aa(lp15170 -g10 -aa(lp15171 -g8 -aI1300 -aI-44 -aa(lp15172 -g10 -aa(lp15173 -g8 -aI1300 -aI-44 -aasVD -(lp15174 -(lp15175 -g8 -aI96 -aI-998 -aa(lp15176 -g20 -aI448 -aI-998 -aa(lp15177 -g15 -aI630 -aI-980 -aI527 -aI-998 -aI588 -aI-992 -aa(lp15178 -g15 -aI774 -aI-892 -aI686 -aI-964 -aI734 -aI-934 -aa(lp15179 -g15 -aI865 -aI-738 -aI814 -aI-850 -aI844 -aI-799 -aa(lp15180 -g15 -aI896 -aI-512 -aI886 -aI-677 -aI896 -aI-601 -aa(lp15181 -g15 -aI867 -aI-309 -aI896 -aI-433 -aI886 -aI-366 -aa(lp15182 -g15 -aI764 -aI-140 -aI843 -aI-239 -aI809 -aI-183 -aa(lp15183 -g15 -aI629 -aI-64 -aI731 -aI-108 -aI686 -aI-82 -aa(lp15184 -g15 -aI458 -aI-44 -aI587 -aI-51 -aI530 -aI-44 -aa(lp15185 -g20 -aI96 -aI-44 -aa(lp15186 -g10 -aa(lp15187 -g8 -aI289 -aI-837 -aa(lp15188 -g20 -aI289 -aI-205 -aa(lp15189 -g20 -aI432 -aI-205 -aa(lp15190 -g15 -aI549 -aI-214 -aI486 -aI-205 -aI525 -aI-208 -aa(lp15191 -g15 -aI627 -aI-254 -aI580 -aI-222 -aI606 -aI-235 -aa(lp15192 -g15 -aI677 -aI-346 -aI647 -aI-272 -aI664 -aI-303 -aa(lp15193 -g15 -aI697 -aI-521 -aI690 -aI-388 -aI697 -aI-447 -aa(lp15194 -g15 -aI677 -aI-690 -aI697 -aI-594 -aI690 -aI-651 -aa(lp15195 -g15 -aI623 -aI-783 -aI664 -aI-730 -aI646 -aI-761 -aa(lp15196 -g15 -aI533 -aI-828 -aI599 -aI-805 -aI569 -aI-820 -aa(lp15197 -g15 -aI375 -aI-837 -aI506 -aI-834 -aI454 -aI-837 -aa(lp15198 -g10 -aa(lp15199 -g8 -aI962 -aI-44 -aa(lp15200 -g10 -aa(lp15201 -g8 -aI962 -aI-44 -aasVH -(lp15202 -(lp15203 -g8 -aI97 -aI-44 -aa(lp15204 -g20 -aI97 -aI-998 -aa(lp15205 -g20 -aI290 -aI-998 -aa(lp15206 -g20 -aI290 -aI-623 -aa(lp15207 -g20 -aI667 -aI-623 -aa(lp15208 -g20 -aI667 -aI-998 -aa(lp15209 -g20 -aI860 -aI-998 -aa(lp15210 -g20 -aI860 -aI-44 -aa(lp15211 -g20 -aI667 -aI-44 -aa(lp15212 -g20 -aI667 -aI-461 -aa(lp15213 -g20 -aI290 -aI-461 -aa(lp15214 -g20 -aI290 -aI-44 -aa(lp15215 -g10 -aa(lp15216 -g8 -aI962 -aI-44 -aa(lp15217 -g10 -aa(lp15218 -g8 -aI962 -aI-44 -aasVL -(lp15219 -(lp15220 -g8 -aI102 -aI-44 -aa(lp15221 -g20 -aI102 -aI-991 -aa(lp15222 -g20 -aI294 -aI-991 -aa(lp15223 -g20 -aI294 -aI-205 -aa(lp15224 -g20 -aI774 -aI-205 -aa(lp15225 -g20 -aI774 -aI-44 -aa(lp15226 -g10 -aa(lp15227 -g8 -aI814 -aI-44 -aa(lp15228 -g10 -aa(lp15229 -g8 -aI814 -aI-44 -aasVP -(lp15230 -(lp15231 -g8 -aI97 -aI-44 -aa(lp15232 -g20 -aI97 -aI-998 -aa(lp15233 -g20 -aI406 -aI-998 -aa(lp15234 -g15 -aI635 -aI-984 -aI523 -aI-998 -aI599 -aI-994 -aa(lp15235 -g15 -aI772 -aI-891 -aI690 -aI-970 -aI735 -aI-939 -aa(lp15236 -g15 -aI828 -aI-705 -aI809 -aI-843 -aI828 -aI-781 -aa(lp15237 -g15 -aI796 -aI-557 -aI828 -aI-646 -aI817 -aI-597 -aa(lp15238 -g15 -aI715 -aI-463 -aI774 -aI-517 -aI747 -aI-486 -aa(lp15239 -g15 -aI615 -aI-418 -aI682 -aI-440 -aI649 -aI-425 -aa(lp15240 -g15 -aI415 -aI-404 -aI569 -aI-409 -aI502 -aI-404 -aa(lp15241 -g20 -aI289 -aI-404 -aa(lp15242 -g20 -aI289 -aI-44 -aa(lp15243 -g10 -aa(lp15244 -g8 -aI289 -aI-837 -aa(lp15245 -g20 -aI289 -aI-566 -aa(lp15246 -g20 -aI395 -aI-566 -aa(lp15247 -g15 -aI547 -aI-581 -aI471 -aI-566 -aI521 -aI-571 -aa(lp15248 -g15 -aI607 -aI-628 -aI573 -aI-591 -aI593 -aI-607 -aa(lp15249 -g15 -aI629 -aI-702 -aI622 -aI-649 -aI629 -aI-674 -aa(lp15250 -g15 -aI598 -aI-788 -aI629 -aI-737 -aI619 -aI-766 -aa(lp15251 -g15 -aI521 -aI-830 -aI578 -aI-811 -aI552 -aI-825 -aa(lp15252 -g15 -aI382 -aI-837 -aI498 -aI-835 -aI452 -aI-837 -aa(lp15253 -g10 -aa(lp15254 -g8 -aI889 -aI-44 -aa(lp15255 -g10 -aa(lp15256 -g8 -aI889 -aI-44 -aasVT -(lp15257 -(lp15258 -g8 -aI311 -aI-44 -aa(lp15259 -g20 -aI311 -aI-837 -aa(lp15260 -g20 -aI28 -aI-837 -aa(lp15261 -g20 -aI28 -aI-998 -aa(lp15262 -g20 -aI787 -aI-998 -aa(lp15263 -g20 -aI787 -aI-837 -aa(lp15264 -g20 -aI504 -aI-837 -aa(lp15265 -g20 -aI504 -aI-44 -aa(lp15266 -g10 -aa(lp15267 -g8 -aI814 -aI-44 -aa(lp15268 -g10 -aa(lp15269 -g8 -aI814 -aI-44 -aasVX -(lp15270 -(lp15271 -g8 -aI0 -aI-44 -aa(lp15272 -g20 -aI326 -aI-542 -aa(lp15273 -g20 -aI30 -aI-998 -aa(lp15274 -g20 -aI255 -aI-998 -aa(lp15275 -g20 -aI447 -aI-692 -aa(lp15276 -g20 -aI634 -aI-998 -aa(lp15277 -g20 -aI858 -aI-998 -aa(lp15278 -g20 -aI561 -aI-535 -aa(lp15279 -g20 -aI887 -aI-44 -aa(lp15280 -g20 -aI654 -aI-44 -aa(lp15281 -g20 -aI443 -aI-374 -aa(lp15282 -g20 -aI231 -aI-44 -aa(lp15283 -g10 -aa(lp15284 -g8 -aI889 -aI-44 -aa(lp15285 -g10 -aa(lp15286 -g8 -aI889 -aI-44 -aasV\u005C -(lp15287 -(lp15288 -g8 -aI-1 -aI-1015 -aa(lp15289 -g20 -aI132 -aI-1015 -aa(lp15290 -g20 -aI371 -aI-28 -aa(lp15291 -g20 -aI234 -aI-28 -aa(lp15292 -g10 -aa(lp15293 -g8 -aI370 -aI-44 -aa(lp15294 -g10 -aa(lp15295 -g8 -aI370 -aI-44 -aasV` -(lp15296 -(lp15297 -g8 -aI322 -aI-820 -aa(lp15298 -g20 -aI207 -aI-820 -aa(lp15299 -g20 -aI27 -aI-1015 -aa(lp15300 -g20 -aI232 -aI-1015 -aa(lp15301 -g10 -aa(lp15302 -g8 -aI444 -aI-44 -aa(lp15303 -g10 -aa(lp15304 -g8 -aI444 -aI-44 -aasVd -(lp15305 -(lp15306 -g8 -aI729 -aI-44 -aa(lp15307 -g20 -aI559 -aI-44 -aa(lp15308 -g20 -aI559 -aI-146 -aa(lp15309 -g15 -aI459 -aI-57 -aI531 -aI-106 -aI498 -aI-77 -aa(lp15310 -g15 -aI343 -aI-28 -aI421 -aI-38 -aI382 -aI-28 -aa(lp15311 -g15 -aI139 -aI-124 -aI264 -aI-28 -aI196 -aI-60 -aa(lp15312 -g15 -aI54 -aI-392 -aI83 -aI-188 -aI54 -aI-278 -aa(lp15313 -g15 -aI137 -aI-660 -aI54 -aI-509 -aI82 -aI-599 -aa(lp15314 -g15 -aI346 -aI-751 -aI192 -aI-720 -aI262 -aI-751 -aa(lp15315 -g15 -aI546 -aI-655 -aI423 -aI-751 -aI490 -aI-719 -aa(lp15316 -g20 -aI546 -aI-998 -aa(lp15317 -g20 -aI729 -aI-998 -aa(lp15318 -g10 -aa(lp15319 -g8 -aI241 -aI-405 -aa(lp15320 -g15 -aI272 -aI-244 -aI241 -aI-331 -aI251 -aI-277 -aa(lp15321 -g15 -aI395 -aI-173 -aI301 -aI-197 -aI342 -aI-173 -aa(lp15322 -g15 -aI503 -aI-227 -aI437 -aI-173 -aI473 -aI-191 -aa(lp15323 -g15 -aI547 -aI-387 -aI532 -aI-262 -aI547 -aI-316 -aa(lp15324 -g15 -aI504 -aI-559 -aI547 -aI-466 -aI533 -aI-524 -aa(lp15325 -g15 -aI394 -aI-611 -aI475 -aI-594 -aI439 -aI-611 -aa(lp15326 -g15 -aI285 -aI-559 -aI351 -aI-611 -aI314 -aI-594 -aa(lp15327 -g15 -aI241 -aI-405 -aI256 -aI-525 -aI241 -aI-473 -aa(lp15328 -g10 -aa(lp15329 -g8 -aI814 -aI-44 -aa(lp15330 -g10 -aa(lp15331 -g8 -aI814 -aI-44 -aasVh -(lp15332 -(lp15333 -g8 -aI277 -aI-998 -aa(lp15334 -g20 -aI277 -aI-647 -aa(lp15335 -g15 -aI489 -aI-751 -aI337 -aI-716 -aI407 -aI-751 -aa(lp15336 -g15 -aI603 -aI-728 -aI531 -aI-751 -aI569 -aI-743 -aa(lp15337 -g15 -aI680 -aI-668 -aI637 -aI-712 -aI662 -aI-692 -aa(lp15338 -g15 -aI715 -aI-587 -aI697 -aI-643 -aI708 -aI-616 -aa(lp15339 -g15 -aI724 -aI-450 -aI721 -aI-557 -aI724 -aI-512 -aa(lp15340 -g20 -aI724 -aI-44 -aa(lp15341 -g20 -aI541 -aI-44 -aa(lp15342 -g20 -aI541 -aI-409 -aa(lp15343 -g15 -aI531 -aI-547 -aI541 -aI-482 -aI538 -aI-528 -aa(lp15344 -g15 -aI494 -aI-594 -aI524 -aI-567 -aI512 -aI-582 -aa(lp15345 -g15 -aI428 -aI-611 -aI476 -aI-605 -aI454 -aI-611 -aa(lp15346 -g15 -aI347 -aI-589 -aI398 -aI-611 -aI370 -aI-604 -aa(lp15347 -g15 -aI294 -aI-522 -aI323 -aI-574 -aI305 -aI-552 -aa(lp15348 -g15 -aI277 -aI-390 -aI283 -aI-492 -aI277 -aI-448 -aa(lp15349 -g20 -aI277 -aI-44 -aa(lp15350 -g20 -aI95 -aI-44 -aa(lp15351 -g20 -aI95 -aI-998 -aa(lp15352 -g10 -aa(lp15353 -g8 -aI814 -aI-44 -aa(lp15354 -g10 -aa(lp15355 -g8 -aI814 -aI-44 -aasVl -(lp15356 -(lp15357 -g8 -aI95 -aI-44 -aa(lp15358 -g20 -aI95 -aI-998 -aa(lp15359 -g20 -aI278 -aI-998 -aa(lp15360 -g20 -aI278 -aI-44 -aa(lp15361 -g10 -aa(lp15362 -g8 -aI370 -aI-44 -aa(lp15363 -g10 -aa(lp15364 -g8 -aI370 -aI-44 -aasVp -(lp15365 -(lp15366 -g8 -aI90 -aI-735 -aa(lp15367 -g20 -aI261 -aI-735 -aa(lp15368 -g20 -aI261 -aI-634 -aa(lp15369 -g15 -aI350 -aI-718 -aI283 -aI-669 -aI313 -aI-697 -aa(lp15370 -g15 -aI476 -aI-751 -aI388 -aI-740 -aI430 -aI-751 -aa(lp15371 -g15 -aI680 -aI-657 -aI556 -aI-751 -aI624 -aI-720 -aa(lp15372 -g15 -aI764 -aI-394 -aI736 -aI-594 -aI764 -aI-506 -aa(lp15373 -g15 -aI680 -aI-124 -aI764 -aI-278 -aI736 -aI-188 -aa(lp15374 -g15 -aI475 -aI-28 -aI623 -aI-60 -aI555 -aI-28 -aa(lp15375 -g15 -aI371 -aI-51 -aI437 -aI-28 -aI402 -aI-36 -aa(lp15376 -g15 -aI273 -aI-129 -aI340 -aI-66 -aI307 -aI-92 -aa(lp15377 -g20 -aI273 -aI218 -aa(lp15378 -g20 -aI90 -aI218 -aa(lp15379 -g10 -aa(lp15380 -g8 -aI271 -aI-401 -aa(lp15381 -g15 -aI317 -aI-229 -aI271 -aI-324 -aI286 -aI-266 -aa(lp15382 -g15 -aI430 -aI-174 -aI348 -aI-192 -aI386 -aI-174 -aa(lp15383 -g15 -aI536 -aI-225 -aI472 -aI-174 -aI508 -aI-191 -aa(lp15384 -g15 -aI578 -aI-392 -aI564 -aI-259 -aI578 -aI-315 -aa(lp15385 -g15 -aI535 -aI-554 -aI578 -aI-465 -aI564 -aI-519 -aa(lp15386 -g15 -aI427 -aI-606 -aI506 -aI-589 -aI470 -aI-606 -aa(lp15387 -g15 -aI315 -aI-555 -aI382 -aI-606 -aI345 -aI-589 -aa(lp15388 -g15 -aI271 -aI-401 -aI286 -aI-520 -aI271 -aI-469 -aa(lp15389 -g10 -aa(lp15390 -g8 -aI814 -aI-44 -aa(lp15391 -g10 -aa(lp15392 -g8 -aI814 -aI-44 -aasVt -(lp15393 -(lp15394 -g8 -aI412 -aI-735 -aa(lp15395 -g20 -aI412 -aI-590 -aa(lp15396 -g20 -aI287 -aI-590 -aa(lp15397 -g20 -aI287 -aI-311 -aa(lp15398 -g15 -aI291 -aI-212 -aI287 -aI-254 -aI288 -aI-222 -aa(lp15399 -g15 -aI307 -aI-189 -aI293 -aI-203 -aI299 -aI-195 -aa(lp15400 -g15 -aI338 -aI-180 -aI316 -aI-183 -aI326 -aI-180 -aa(lp15401 -g15 -aI412 -aI-198 -aI355 -aI-180 -aI379 -aI-186 -aa(lp15402 -g20 -aI427 -aI-56 -aa(lp15403 -g15 -aI283 -aI-28 -aI385 -aI-37 -aI337 -aI-28 -aa(lp15404 -g15 -aI194 -aI-45 -aI250 -aI-28 -aI220 -aI-34 -aa(lp15405 -g15 -aI135 -aI-88 -aI167 -aI-56 -aI148 -aI-70 -aa(lp15406 -g15 -aI110 -aI-159 -aI123 -aI-105 -aI114 -aI-129 -aa(lp15407 -g15 -aI104 -aI-288 -aI106 -aI-180 -aI104 -aI-223 -aa(lp15408 -g20 -aI104 -aI-590 -aa(lp15409 -g20 -aI20 -aI-590 -aa(lp15410 -g20 -aI20 -aI-735 -aa(lp15411 -g20 -aI104 -aI-735 -aa(lp15412 -g20 -aI104 -aI-873 -aa(lp15413 -g20 -aI287 -aI-979 -aa(lp15414 -g20 -aI287 -aI-735 -aa(lp15415 -g10 -aa(lp15416 -g8 -aI444 -aI-44 -aa(lp15417 -g10 -aa(lp15418 -g8 -aI444 -aI-44 -aasVx -(lp15419 -(lp15420 -g8 -aI7 -aI-44 -aa(lp15421 -g20 -aI257 -aI-400 -aa(lp15422 -g20 -aI18 -aI-735 -aa(lp15423 -g20 -aI241 -aI-735 -aa(lp15424 -g20 -aI363 -aI-545 -aa(lp15425 -g20 -aI492 -aI-735 -aa(lp15426 -g20 -aI707 -aI-735 -aa(lp15427 -g20 -aI473 -aI-408 -aa(lp15428 -g20 -aI729 -aI-44 -aa(lp15429 -g20 -aI504 -aI-44 -aa(lp15430 -g20 -aI363 -aI-258 -aa(lp15431 -g20 -aI222 -aI-44 -aa(lp15432 -g10 -aa(lp15433 -g8 -aI741 -aI-44 -aa(lp15434 -g10 -aa(lp15435 -g8 -aI741 -aI-44 -aasV| -(lp15436 -(lp15437 -g8 -aI114 -aI236 -aa(lp15438 -g20 -aI114 -aI-1015 -aa(lp15439 -g20 -aI259 -aI-1015 -aa(lp15440 -g20 -aI259 -aI236 -aa(lp15441 -g10 -aa(lp15442 -g8 -aI373 -aI-44 -aa(lp15443 -g10 -aa(lp15444 -g8 -aI373 -aI-44 -aasV# -(lp15445 -(lp15446 -g8 -aI100 -aI-282 -aa(lp15447 -g20 -aI11 -aI-282 -aa(lp15448 -g20 -aI11 -aI-425 -aa(lp15449 -g20 -aI128 -aI-425 -aa(lp15450 -g20 -aI167 -aI-617 -aa(lp15451 -g20 -aI11 -aI-617 -aa(lp15452 -g20 -aI11 -aI-761 -aa(lp15453 -g20 -aI197 -aI-761 -aa(lp15454 -g20 -aI248 -aI-1015 -aa(lp15455 -g20 -aI394 -aI-1015 -aa(lp15456 -g20 -aI343 -aI-761 -aa(lp15457 -g20 -aI486 -aI-761 -aa(lp15458 -g20 -aI537 -aI-1015 -aa(lp15459 -g20 -aI688 -aI-1015 -aa(lp15460 -g20 -aI636 -aI-761 -aa(lp15461 -g20 -aI725 -aI-761 -aa(lp15462 -g20 -aI725 -aI-617 -aa(lp15463 -g20 -aI606 -aI-617 -aa(lp15464 -g20 -aI567 -aI-425 -aa(lp15465 -g20 -aI725 -aI-425 -aa(lp15466 -g20 -aI725 -aI-282 -aa(lp15467 -g20 -aI538 -aI-282 -aa(lp15468 -g20 -aI486 -aI-28 -aa(lp15469 -g20 -aI341 -aI-28 -aa(lp15470 -g20 -aI391 -aI-282 -aa(lp15471 -g20 -aI247 -aI-282 -aa(lp15472 -g20 -aI195 -aI-28 -aa(lp15473 -g20 -aI48 -aI-28 -aa(lp15474 -g10 -aa(lp15475 -g8 -aI314 -aI-617 -aa(lp15476 -g20 -aI276 -aI-425 -aa(lp15477 -g20 -aI420 -aI-425 -aa(lp15478 -g20 -aI458 -aI-617 -aa(lp15479 -g10 -aa(lp15480 -g8 -aI741 -aI-44 -aa(lp15481 -g10 -aa(lp15482 -g8 -aI741 -aI-44 -aasV' -(lp15483 -(lp15484 -g8 -aI94 -aI-659 -aa(lp15485 -g20 -aI59 -aI-837 -aa(lp15486 -g20 -aI59 -aI-998 -aa(lp15487 -g20 -aI259 -aI-998 -aa(lp15488 -g20 -aI259 -aI-837 -aa(lp15489 -g20 -aI229 -aI-659 -aa(lp15490 -g10 -aa(lp15491 -g8 -aI317 -aI-44 -aa(lp15492 -g10 -aa(lp15493 -g8 -aI317 -aI-44 -aasV+ -(lp15494 -(lp15495 -g8 -aI305 -aI-181 -aa(lp15496 -g20 -aI305 -aI-429 -aa(lp15497 -g20 -aI55 -aI-429 -aa(lp15498 -g20 -aI55 -aI-601 -aa(lp15499 -g20 -aI305 -aI-601 -aa(lp15500 -g20 -aI305 -aI-849 -aa(lp15501 -g20 -aI472 -aI-849 -aa(lp15502 -g20 -aI472 -aI-601 -aa(lp15503 -g20 -aI722 -aI-601 -aa(lp15504 -g20 -aI722 -aI-429 -aa(lp15505 -g20 -aI472 -aI-429 -aa(lp15506 -g20 -aI472 -aI-181 -aa(lp15507 -g10 -aa(lp15508 -g8 -aI778 -aI-44 -aa(lp15509 -g10 -aa(lp15510 -g8 -aI778 -aI-44 -aasV/ -(lp15511 -(lp15512 -g8 -aI-1 -aI-28 -aa(lp15513 -g20 -aI234 -aI-1015 -aa(lp15514 -g20 -aI371 -aI-1015 -aa(lp15515 -g20 -aI132 -aI-28 -aa(lp15516 -g10 -aa(lp15517 -g8 -aI370 -aI-44 -aa(lp15518 -g10 -aa(lp15519 -g8 -aI370 -aI-44 -aasV3 -(lp15520 -(lp15521 -g8 -aI50 -aI-297 -aa(lp15522 -g20 -aI227 -aI-319 -aa(lp15523 -g15 -aI272 -aI-215 -aI232 -aI-274 -aI248 -aI-239 -aa(lp15524 -g15 -aI362 -aI-179 -aI297 -aI-191 -aI327 -aI-179 -aa(lp15525 -g15 -aI458 -aI-222 -aI400 -aI-179 -aI432 -aI-194 -aa(lp15526 -g15 -aI496 -aI-338 -aI483 -aI-251 -aI496 -aI-290 -aa(lp15527 -g15 -aI459 -aI-448 -aI496 -aI-384 -aI484 -aI-421 -aa(lp15528 -g15 -aI369 -aI-488 -aI434 -aI-475 -aI404 -aI-488 -aa(lp15529 -g15 -aI285 -aI-474 -aI345 -aI-488 -aI317 -aI-483 -aa(lp15530 -g20 -aI305 -aI-623 -aa(lp15531 -g15 -aI418 -aI-656 -aI354 -aI-622 -aI392 -aI-633 -aa(lp15532 -g15 -aI457 -aI-746 -aI444 -aI-678 -aI457 -aI-709 -aa(lp15533 -g15 -aI429 -aI-823 -aI457 -aI-779 -aI448 -aI-804 -aa(lp15534 -g15 -aI352 -aI-852 -aI409 -aI-842 -aI384 -aI-852 -aa(lp15535 -g15 -aI272 -aI-819 -aI321 -aI-852 -aI294 -aI-841 -aa(lp15536 -g15 -aI232 -aI-724 -aI250 -aI-798 -aI237 -aI-766 -aa(lp15537 -g20 -aI63 -aI-753 -aa(lp15538 -g15 -aI116 -aI-891 -aI75 -aI-811 -aI93 -aI-857 -aa(lp15539 -g15 -aI215 -aI-973 -aI140 -aI-926 -aI173 -aI-953 -aa(lp15540 -g15 -aI358 -aI-1002 -aI258 -aI-992 -aI305 -aI-1002 -aa(lp15541 -g15 -aI574 -aI-916 -aI447 -aI-1002 -aI519 -aI-974 -aa(lp15542 -g15 -aI641 -aI-757 -aI618 -aI-869 -aI641 -aI-817 -aa(lp15543 -g15 -aI503 -aI-557 -aI641 -aI-674 -aI595 -aI-607 -aa(lp15544 -g15 -aI635 -aI-478 -aI558 -aI-545 -aI602 -aI-519 -aa(lp15545 -g15 -aI684 -aI-330 -aI667 -aI-437 -aI684 -aI-388 -aa(lp15546 -g15 -aI592 -aI-116 -aI684 -aI-247 -aI653 -aI-175 -aa(lp15547 -g15 -aI363 -aI-28 -aI531 -aI-57 -aI455 -aI-28 -aa(lp15548 -g15 -aI149 -aI-102 -aI277 -aI-28 -aI205 -aI-53 -aa(lp15549 -g15 -aI50 -aI-297 -aI92 -aI-152 -aI59 -aI-217 -aa(lp15550 -g10 -aa(lp15551 -g8 -aI741 -aI-44 -aa(lp15552 -g10 -aa(lp15553 -g8 -aI741 -aI-44 -aasV7 -(lp15554 -(lp15555 -g8 -aI56 -aI-815 -aa(lp15556 -g20 -aI56 -aI-985 -aa(lp15557 -g20 -aI682 -aI-985 -aa(lp15558 -g20 -aI682 -aI-853 -aa(lp15559 -g15 -aI524 -aI-634 -aI630 -aI-802 -aI578 -aI-729 -aa(lp15560 -g15 -aI402 -aI-331 -aI471 -aI-539 -aI430 -aI-438 -aa(lp15561 -g15 -aI361 -aI-44 -aI374 -aI-224 -aI360 -aI-128 -aa(lp15562 -g20 -aI184 -aI-44 -aa(lp15563 -g15 -aI266 -aI-448 -aI187 -aI-176 -aI215 -aI-310 -aa(lp15564 -g15 -aI472 -aI-815 -aI318 -aI-585 -aI386 -aI-707 -aa(lp15565 -g10 -aa(lp15566 -g8 -aI741 -aI-44 -aa(lp15567 -g10 -aa(lp15568 -g8 -aI741 -aI-44 -aasV; -(lp15569 -(lp15570 -g8 -aI125 -aI-552 -aa(lp15571 -g20 -aI125 -aI-735 -aa(lp15572 -g20 -aI308 -aI-735 -aa(lp15573 -g20 -aI308 -aI-552 -aa(lp15574 -g10 -aa(lp15575 -g8 -aI125 -aI-227 -aa(lp15576 -g20 -aI308 -aI-227 -aa(lp15577 -g20 -aI308 -aI-96 -aa(lp15578 -g15 -aI294 -aI28 -aI308 -aI-43 -aI304 -aI-1 -aa(lp15579 -g15 -aI243 -aI111 -aI285 -aI59 -aI268 -aI86 -aa(lp15580 -g15 -aI146 -aI168 -aI217 -aI135 -aI185 -aI154 -aa(lp15581 -g20 -aI110 -aI92 -aa(lp15582 -g15 -aI189 -aI42 -aI147 -aI80 -aI173 -aI63 -aa(lp15583 -g15 -aI214 -aI-44 -aI205 -aI20 -aI213 -aI-8 -aa(lp15584 -g20 -aI125 -aI-44 -aa(lp15585 -g10 -aa(lp15586 -g8 -aI444 -aI-44 -aa(lp15587 -g10 -aa(lp15588 -g8 -aI444 -aI-44 -aasV? -(lp15589 -(lp15590 -g8 -aI488 -aI-290 -aa(lp15591 -g20 -aI322 -aI-290 -aa(lp15592 -g15 -aI322 -aI-334 -aI322 -aI-314 -aI322 -aI-328 -aa(lp15593 -g15 -aI348 -aI-466 -aI322 -aI-387 -aI331 -aI-432 -aa(lp15594 -g15 -aI455 -aI-584 -aI366 -aI-501 -aI402 -aI-540 -aa(lp15595 -g15 -aI551 -aI-669 -aI509 -aI-627 -aI541 -aI-655 -aa(lp15596 -g15 -aI575 -aI-739 -aI567 -aI-690 -aI575 -aI-714 -aa(lp15597 -g15 -aI532 -aI-831 -aI575 -aI-775 -aI561 -aI-805 -aa(lp15598 -g15 -aI417 -aI-869 -aI504 -aI-856 -aI466 -aI-869 -aa(lp15599 -g15 -aI301 -aI-829 -aI371 -aI-869 -aI332 -aI-856 -aa(lp15600 -g15 -aI236 -aI-708 -aI270 -aI-803 -aI248 -aI-762 -aa(lp15601 -g20 -aI69 -aI-729 -aa(lp15602 -g15 -aI168 -aI-927 -aI73 -aI-807 -aI106 -aI-873 -aa(lp15603 -g15 -aI410 -aI-1008 -aI229 -aI-981 -aI310 -aI-1008 -aa(lp15604 -g15 -aI660 -aI-926 -aI515 -aI-1008 -aI598 -aI-981 -aa(lp15605 -g15 -aI753 -aI-734 -aI722 -aI-871 -aI753 -aI-807 -aa(lp15606 -g15 -aI719 -aI-619 -aI753 -aI-694 -aI742 -aI-655 -aa(lp15607 -g15 -aI573 -aI-472 -aI696 -aI-583 -aI648 -aI-534 -aa(lp15608 -g15 -aI501 -aI-395 -aI534 -aI-440 -aI510 -aI-414 -aa(lp15609 -g15 -aI488 -aI-290 -aI492 -aI-375 -aI488 -aI-340 -aa(lp15610 -g10 -aa(lp15611 -g8 -aI322 -aI-44 -aa(lp15612 -g20 -aI322 -aI-227 -aa(lp15613 -g20 -aI505 -aI-227 -aa(lp15614 -g20 -aI505 -aI-44 -aa(lp15615 -g10 -aa(lp15616 -g8 -aI814 -aI-44 -aa(lp15617 -g10 -aa(lp15618 -g8 -aI814 -aI-44 -aasVC -(lp15619 -(lp15620 -g8 -aI707 -aI-395 -aa(lp15621 -g20 -aI894 -aI-336 -aa(lp15622 -g15 -aI751 -aI-104 -aI865 -aI-231 -aI818 -aI-154 -aa(lp15623 -g15 -aI498 -aI-28 -aI685 -aI-53 -aI600 -aI-28 -aa(lp15624 -g15 -aI185 -aI-158 -aI371 -aI-28 -aI267 -aI-71 -aa(lp15625 -g15 -aI63 -aI-513 -aI103 -aI-244 -aI63 -aI-363 -aa(lp15626 -g15 -aI186 -aI-883 -aI63 -aI-672 -aI104 -aI-795 -aa(lp15627 -g15 -aI509 -aI-1015 -aI268 -aI-971 -aI376 -aI-1015 -aa(lp15628 -g15 -aI794 -aI-911 -aI626 -aI-1015 -aI721 -aI-980 -aa(lp15629 -g15 -aI891 -aI-735 -aI837 -aI-870 -aI870 -aI-812 -aa(lp15630 -g20 -aI701 -aI-690 -aa(lp15631 -g15 -aI630 -aI-807 -aI689 -aI-739 -aI666 -aI-778 -aa(lp15632 -g15 -aI500 -aI-850 -aI594 -aI-836 -aI551 -aI-850 -aa(lp15633 -g15 -aI327 -aI-774 -aI429 -aI-850 -aI371 -aI-825 -aa(lp15634 -g15 -aI261 -aI-527 -aI283 -aI-723 -aI261 -aI-641 -aa(lp15635 -g15 -aI326 -aI-269 -aI261 -aI-406 -aI283 -aI-320 -aa(lp15636 -g15 -aI496 -aI-192 -aI370 -aI-218 -aI426 -aI-192 -aa(lp15637 -g15 -aI628 -aI-241 -aI547 -aI-192 -aI591 -aI-209 -aa(lp15638 -g15 -aI707 -aI-395 -aI665 -aI-274 -aI691 -aI-325 -aa(lp15639 -g10 -aa(lp15640 -g8 -aI962 -aI-44 -aa(lp15641 -g10 -aa(lp15642 -g8 -aI962 -aI-44 -aasVG -(lp15643 -(lp15644 -g8 -aI541 -aI-395 -aa(lp15645 -g20 -aI541 -aI-556 -aa(lp15646 -g20 -aI956 -aI-556 -aa(lp15647 -g20 -aI956 -aI-175 -aa(lp15648 -g15 -aI780 -aI-72 -aI916 -aI-136 -aI857 -aI-102 -aa(lp15649 -g15 -aI548 -aI-28 -aI704 -aI-43 -aI626 -aI-28 -aa(lp15650 -g15 -aI287 -aI-90 -aI448 -aI-28 -aI361 -aI-49 -aa(lp15651 -g15 -aI119 -aI-270 -aI212 -aI-132 -aI157 -aI-192 -aa(lp15652 -g15 -aI63 -aI-524 -aI82 -aI-348 -aI63 -aI-433 -aa(lp15653 -g15 -aI126 -aI-789 -aI63 -aI-624 -aI84 -aI-712 -aa(lp15654 -g15 -aI309 -aI-967 -aI167 -aI-867 -aI228 -aI-926 -aa(lp15655 -g15 -aI537 -aI-1015 -aI370 -aI-999 -aI446 -aI-1015 -aa(lp15656 -g15 -aI815 -aI-940 -aI656 -aI-1015 -aI748 -aI-990 -aa(lp15657 -g15 -aI944 -aI-734 -aI882 -aI-890 -aI924 -aI-822 -aa(lp15658 -g20 -aI752 -aI-698 -aa(lp15659 -g15 -aI676 -aI-809 -aI739 -aI-745 -aI713 -aI-782 -aa(lp15660 -g15 -aI537 -aI-850 -aI639 -aI-836 -aI593 -aI-850 -aa(lp15661 -g15 -aI336 -aI-770 -aI453 -aI-850 -aI386 -aI-823 -aa(lp15662 -g15 -aI262 -aI-532 -aI287 -aI-716 -aI262 -aI-637 -aa(lp15663 -g15 -aI337 -aI-277 -aI262 -aI-419 -aI287 -aI-334 -aa(lp15664 -g15 -aI535 -aI-192 -aI388 -aI-221 -aI454 -aI-192 -aa(lp15665 -g15 -aI657 -aI-216 -aI576 -aI-192 -aI616 -aI-200 -aa(lp15666 -g15 -aI761 -aI-274 -aI697 -aI-232 -aI732 -aI-251 -aa(lp15667 -g20 -aI761 -aI-395 -aa(lp15668 -g10 -aa(lp15669 -g8 -aI1037 -aI-44 -aa(lp15670 -g10 -aa(lp15671 -g8 -aI1037 -aI-44 -aasVK -(lp15672 -(lp15673 -g8 -aI99 -aI-44 -aa(lp15674 -g20 -aI99 -aI-998 -aa(lp15675 -g20 -aI292 -aI-998 -aa(lp15676 -g20 -aI292 -aI-575 -aa(lp15677 -g20 -aI681 -aI-998 -aa(lp15678 -g20 -aI940 -aI-998 -aa(lp15679 -g20 -aI581 -aI-627 -aa(lp15680 -g20 -aI960 -aI-44 -aa(lp15681 -g20 -aI710 -aI-44 -aa(lp15682 -g20 -aI448 -aI-492 -aa(lp15683 -g20 -aI292 -aI-332 -aa(lp15684 -g20 -aI292 -aI-44 -aa(lp15685 -g10 -aa(lp15686 -g8 -aI962 -aI-44 -aa(lp15687 -g10 -aa(lp15688 -g8 -aI962 -aI-44 -aasVO -(lp15689 -(lp15690 -g8 -aI57 -aI-515 -aa(lp15691 -g15 -aI101 -aI-760 -aI57 -aI-613 -aI72 -aI-694 -aa(lp15692 -g15 -aI190 -aI-891 -aI123 -aI-809 -aI152 -aI-852 -aa(lp15693 -g15 -aI313 -aI-977 -aI227 -aI-930 -aI269 -aI-958 -aa(lp15694 -g15 -aI519 -aI-1015 -aI373 -aI-1002 -aI441 -aI-1015 -aa(lp15695 -g15 -aI857 -aI-884 -aI660 -aI-1015 -aI772 -aI-971 -aa(lp15696 -g15 -aI983 -aI-520 -aI941 -aI-797 -aI983 -aI-675 -aa(lp15697 -g15 -aI858 -aI-158 -aI983 -aI-366 -aI941 -aI-245 -aa(lp15698 -g15 -aI522 -aI-28 -aI774 -aI-71 -aI662 -aI-28 -aa(lp15699 -g15 -aI183 -aI-158 -aI380 -aI-28 -aI267 -aI-71 -aa(lp15700 -g15 -aI57 -aI-515 -aI99 -aI-244 -aI57 -aI-363 -aa(lp15701 -g10 -aa(lp15702 -g8 -aI256 -aI-522 -aa(lp15703 -g15 -aI331 -aI-276 -aI256 -aI-414 -aI281 -aI-332 -aa(lp15704 -g15 -aI521 -aI-192 -aI381 -aI-220 -aI444 -aI-192 -aa(lp15705 -g15 -aI710 -aI-275 -aI598 -aI-192 -aI661 -aI-220 -aa(lp15706 -g15 -aI784 -aI-524 -aI759 -aI-331 -aI784 -aI-414 -aa(lp15707 -g15 -aI712 -aI-769 -aI784 -aI-634 -aI760 -aI-715 -aa(lp15708 -g15 -aI521 -aI-850 -aI664 -aI-823 -aI600 -aI-850 -aa(lp15709 -g15 -aI329 -aI-768 -aI442 -aI-850 -aI378 -aI-823 -aa(lp15710 -g15 -aI256 -aI-522 -aI280 -aI-714 -aI256 -aI-632 -aa(lp15711 -g10 -aa(lp15712 -g8 -aI1037 -aI-44 -aa(lp15713 -g10 -aa(lp15714 -g8 -aI1037 -aI-44 -aasVS -(lp15715 -(lp15716 -g8 -aI48 -aI-354 -aa(lp15717 -g20 -aI235 -aI-373 -aa(lp15718 -g15 -aI304 -aI-234 -aI246 -aI-310 -aI269 -aI-264 -aa(lp15719 -g15 -aI444 -aI-190 -aI338 -aI-205 -aI385 -aI-190 -aa(lp15720 -g15 -aI584 -aI-229 -aI506 -aI-190 -aI552 -aI-203 -aa(lp15721 -g15 -aI631 -aI-321 -aI615 -aI-255 -aI631 -aI-286 -aa(lp15722 -g15 -aI611 -aI-379 -aI631 -aI-344 -aI624 -aI-363 -aa(lp15723 -g15 -aI542 -aI-420 -aI598 -aI-395 -aI575 -aI-409 -aa(lp15724 -g15 -aI388 -aI-462 -aI519 -aI-428 -aI468 -aI-442 -aa(lp15725 -g15 -aI170 -aI-556 -aI284 -aI-488 -aI212 -aI-519 -aa(lp15726 -g15 -aI82 -aI-748 -aI111 -aI-609 -aI82 -aI-673 -aa(lp15727 -g15 -aI124 -aI-885 -aI82 -aI-797 -aI96 -aI-842 -aa(lp15728 -g15 -aI243 -aI-981 -aI151 -aI-927 -aI191 -aI-959 -aa(lp15729 -g15 -aI430 -aI-1015 -aI295 -aI-1004 -aI357 -aI-1015 -aa(lp15730 -g15 -aI701 -aI-936 -aI550 -aI-1015 -aI640 -aI-988 -aa(lp15731 -g15 -aI796 -aI-726 -aI762 -aI-883 -aI793 -aI-813 -aa(lp15732 -g20 -aI604 -aI-717 -aa(lp15733 -g15 -aI551 -aI-823 -aI595 -aI-766 -aI578 -aI-801 -aa(lp15734 -g15 -aI429 -aI-855 -aI523 -aI-844 -aI483 -aI-855 -aa(lp15735 -g15 -aI297 -aI-821 -aI373 -aI-855 -aI329 -aI-844 -aa(lp15736 -g15 -aI266 -aI-761 -aI277 -aI-806 -aI266 -aI-786 -aa(lp15737 -g15 -aI295 -aI-703 -aI266 -aI-739 -aI276 -aI-720 -aa(lp15738 -g15 -aI472 -aI-640 -aI319 -aI-683 -aI378 -aI-662 -aa(lp15739 -g15 -aI680 -aI-571 -aI566 -aI-618 -aI635 -aI-595 -aa(lp15740 -g15 -aI786 -aI-474 -aI725 -aI-547 -aI760 -aI-515 -aa(lp15741 -g15 -aI824 -aI-322 -aI811 -aI-433 -aI824 -aI-382 -aa(lp15742 -g15 -aI778 -aI-168 -aI824 -aI-267 -aI809 -aI-216 -aa(lp15743 -g15 -aI649 -aI-62 -aI748 -aI-121 -aI705 -aI-85 -aa(lp15744 -g15 -aI442 -aI-27 -aI594 -aI-39 -aI524 -aI-27 -aa(lp15745 -g15 -aI164 -aI-111 -aI321 -aI-27 -aI228 -aI-55 -aa(lp15746 -g15 -aI48 -aI-354 -aI99 -aI-166 -aI60 -aI-248 -aa(lp15747 -g10 -aa(lp15748 -g8 -aI889 -aI-44 -aa(lp15749 -g10 -aa(lp15750 -g8 -aI889 -aI-44 -aasVW -(lp15751 -(lp15752 -g8 -aI232 -aI-44 -aa(lp15753 -g20 -aI4 -aI-998 -aa(lp15754 -g20 -aI201 -aI-998 -aa(lp15755 -g20 -aI345 -aI-343 -aa(lp15756 -g20 -aI520 -aI-998 -aa(lp15757 -g20 -aI749 -aI-998 -aa(lp15758 -g20 -aI916 -aI-332 -aa(lp15759 -g20 -aI1063 -aI-998 -aa(lp15760 -g20 -aI1257 -aI-998 -aa(lp15761 -g20 -aI1025 -aI-44 -aa(lp15762 -g20 -aI820 -aI-44 -aa(lp15763 -g20 -aI630 -aI-757 -aa(lp15764 -g20 -aI441 -aI-44 -aa(lp15765 -g10 -aa(lp15766 -g8 -aI1258 -aI-44 -aa(lp15767 -g10 -aa(lp15768 -g8 -aI1258 -aI-44 -aasV[ -(lp15769 -(lp15770 -g8 -aI95 -aI224 -aa(lp15771 -g20 -aI95 -aI-998 -aa(lp15772 -g20 -aI419 -aI-998 -aa(lp15773 -g20 -aI419 -aI-854 -aa(lp15774 -g20 -aI268 -aI-854 -aa(lp15775 -g20 -aI268 -aI80 -aa(lp15776 -g20 -aI419 -aI80 -aa(lp15777 -g20 -aI419 -aI224 -aa(lp15778 -g10 -aa(lp15779 -g8 -aI444 -aI-44 -aa(lp15780 -g10 -aa(lp15781 -g8 -aI444 -aI-44 -aasV_ -(lp15782 -(lp15783 -g8 -aI-12 -aI219 -aa(lp15784 -g20 -aI-12 -aI100 -aa(lp15785 -g20 -aI748 -aI100 -aa(lp15786 -g20 -aI748 -aI219 -aa(lp15787 -g10 -aa(lp15788 -g8 -aI741 -aI-44 -aa(lp15789 -g10 -aa(lp15790 -g8 -aI741 -aI-44 -aasVc -(lp15791 -(lp15792 -g8 -aI698 -aI-531 -aa(lp15793 -g20 -aI518 -aI-498 -aa(lp15794 -g15 -aI476 -aI-580 -aI512 -aI-534 -aI498 -aI-562 -aa(lp15795 -g15 -aI393 -aI-607 -aI455 -aI-598 -aI427 -aI-607 -aa(lp15796 -g15 -aI284 -aI-560 -aI347 -aI-607 -aI311 -aI-591 -aa(lp15797 -g15 -aI243 -aI-402 -aI257 -aI-528 -aI243 -aI-476 -aa(lp15798 -g15 -aI284 -aI-228 -aI243 -aI-320 -aI257 -aI-262 -aa(lp15799 -g15 -aI395 -aI-177 -aI312 -aI-194 -aI349 -aI-177 -aa(lp15800 -g15 -aI481 -aI-207 -aI430 -aI-177 -aI458 -aI-187 -aa(lp15801 -g15 -aI527 -aI-309 -aI503 -aI-227 -aI518 -aI-261 -aa(lp15802 -g20 -aI707 -aI-278 -aa(lp15803 -g15 -aI600 -aI-91 -aI689 -aI-196 -aI653 -aI-134 -aa(lp15804 -g15 -aI387 -aI-28 -aI547 -aI-49 -aI476 -aI-28 -aa(lp15805 -g15 -aI145 -aI-124 -aI286 -aI-28 -aI205 -aI-60 -aa(lp15806 -g15 -aI55 -aI-389 -aI85 -aI-188 -aI55 -aI-276 -aa(lp15807 -g15 -aI145 -aI-656 -aI55 -aI-503 -aI85 -aI-592 -aa(lp15808 -g15 -aI390 -aI-751 -aI206 -aI-719 -aI287 -aI-751 -aa(lp15809 -g15 -aI591 -aI-697 -aI474 -aI-751 -aI541 -aI-733 -aa(lp15810 -g15 -aI698 -aI-531 -aI641 -aI-660 -aI676 -aI-605 -aa(lp15811 -g10 -aa(lp15812 -g8 -aI741 -aI-44 -aa(lp15813 -g10 -aa(lp15814 -g8 -aI741 -aI-44 -aasVg -(lp15815 -(lp15816 -g8 -aI78 -aI1 -aa(lp15817 -g20 -aI287 -aI26 -aa(lp15818 -g15 -aI311 -aI76 -aI291 -aI50 -aI299 -aI67 -aa(lp15819 -g15 -aI393 -aI96 -aI329 -aI89 -aI356 -aI96 -aa(lp15820 -g15 -aI501 -aI74 -aI441 -aI96 -aI477 -aI89 -aa(lp15821 -g15 -aI537 -aI28 -aI517 -aI65 -aI529 -aI49 -aa(lp15822 -g15 -aI546 -aI-55 -aI543 -aI13 -aI546 -aI-14 -aa(lp15823 -g20 -aI546 -aI-156 -aa(lp15824 -g15 -aI339 -aI-44 -aI491 -aI-81 -aI422 -aI-44 -aa(lp15825 -g15 -aI118 -aI-162 -aI246 -aI-44 -aI172 -aI-83 -aa(lp15826 -g15 -aI54 -aI-394 -aI75 -aI-224 -aI54 -aI-301 -aa(lp15827 -g15 -aI138 -aI-659 -aI54 -aI-509 -aI82 -aI-598 -aa(lp15828 -g15 -aI346 -aI-751 -aI194 -aI-720 -aI263 -aI-751 -aa(lp15829 -g15 -aI557 -aI-638 -aI431 -aI-751 -aI502 -aI-713 -aa(lp15830 -g20 -aI557 -aI-735 -aa(lp15831 -g20 -aI729 -aI-735 -aa(lp15832 -g20 -aI729 -aI-115 -aa(lp15833 -g15 -aI708 -aI67 -aI729 -aI-33 -aI722 -aI27 -aa(lp15834 -g15 -aI652 -aI162 -aI695 -aI107 -aI676 -aI139 -aa(lp15835 -g15 -aI555 -aI216 -aI628 -aI185 -aI595 -aI203 -aa(lp15836 -g15 -aI401 -aI236 -aI514 -aI229 -aI463 -aI236 -aa(lp15837 -g15 -aI151 -aI175 -aI283 -aI236 -aI200 -aI216 -aa(lp15838 -g15 -aI78 -aI23 -aI102 -aI135 -aI78 -aI84 -aa(lp15839 -g15 -aI78 -aI1 -aI78 -aI17 -aI78 -aI9 -aa(lp15840 -g10 -aa(lp15841 -g8 -aI242 -aI-404 -aa(lp15842 -g15 -aI284 -aI-243 -aI242 -aI-331 -aI256 -aI-277 -aa(lp15843 -g15 -aI389 -aI-192 -aI313 -aI-209 -aI348 -aI-192 -aa(lp15844 -g15 -aI503 -aI-244 -aI434 -aI-192 -aI472 -aI-209 -aa(lp15845 -g15 -aI549 -aI-399 -aI534 -aI-279 -aI549 -aI-331 -aa(lp15846 -g15 -aI505 -aI-559 -aI549 -aI-471 -aI534 -aI-524 -aa(lp15847 -g15 -aI393 -aI-611 -aI475 -aI-594 -aI438 -aI-611 -aa(lp15848 -g15 -aI284 -aI-560 -aI349 -aI-611 -aI313 -aI-594 -aa(lp15849 -g15 -aI242 -aI-404 -aI256 -aI-526 -aI242 -aI-474 -aa(lp15850 -g10 -aa(lp15851 -g8 -aI814 -aI-44 -aa(lp15852 -g10 -aa(lp15853 -g8 -aI814 -aI-44 -aasVk -(lp15854 -(lp15855 -g8 -aI89 -aI-44 -aa(lp15856 -g20 -aI89 -aI-998 -aa(lp15857 -g20 -aI272 -aI-998 -aa(lp15858 -g20 -aI272 -aI-492 -aa(lp15859 -g20 -aI486 -aI-735 -aa(lp15860 -g20 -aI711 -aI-735 -aa(lp15861 -g20 -aI475 -aI-483 -aa(lp15862 -g20 -aI728 -aI-44 -aa(lp15863 -g20 -aI531 -aI-44 -aa(lp15864 -g20 -aI357 -aI-354 -aa(lp15865 -g20 -aI272 -aI-265 -aa(lp15866 -g20 -aI272 -aI-44 -aa(lp15867 -g10 -aa(lp15868 -g8 -aI741 -aI-44 -aa(lp15869 -g10 -aa(lp15870 -g8 -aI741 -aI-44 -aasVo -(lp15871 -(lp15872 -g8 -aI53 -aI-399 -aa(lp15873 -g15 -aI98 -aI-576 -aI53 -aI-460 -aI68 -aI-519 -aa(lp15874 -g15 -aI225 -aI-706 -aI128 -aI-633 -aI170 -aI-676 -aa(lp15875 -g15 -aI409 -aI-751 -aI280 -aI-736 -aI341 -aI-751 -aa(lp15876 -g15 -aI666 -aI-649 -aI514 -aI-751 -aI599 -aI-717 -aa(lp15877 -g15 -aI766 -aI-392 -aI733 -aI-581 -aI766 -aI-495 -aa(lp15878 -g15 -aI665 -aI-132 -aI766 -aI-287 -aI733 -aI-200 -aa(lp15879 -g15 -aI410 -aI-28 -aI598 -aI-63 -aI513 -aI-28 -aa(lp15880 -g15 -aI229 -aI-71 -aI347 -aI-28 -aI287 -aI-43 -aa(lp15881 -g15 -aI98 -aI-197 -aI171 -aI-100 -aI128 -aI-142 -aa(lp15882 -g15 -aI53 -aI-399 -aI68 -aI-253 -aI53 -aI-320 -aa(lp15883 -g10 -aa(lp15884 -g8 -aI240 -aI-390 -aa(lp15885 -g15 -aI289 -aI-232 -aI240 -aI-321 -aI257 -aI-269 -aa(lp15886 -g15 -aI410 -aI-177 -aI322 -aI-196 -aI362 -aI-177 -aa(lp15887 -g15 -aI530 -aI-232 -aI457 -aI-177 -aI497 -aI-196 -aa(lp15888 -g15 -aI578 -aI-391 -aI562 -aI-269 -aI578 -aI-322 -aa(lp15889 -g15 -aI530 -aI-547 -aI578 -aI-459 -aI562 -aI-511 -aa(lp15890 -g15 -aI410 -aI-602 -aI497 -aI-584 -aI457 -aI-602 -aa(lp15891 -g15 -aI289 -aI-547 -aI362 -aI-602 -aI322 -aI-584 -aa(lp15892 -g15 -aI240 -aI-390 -aI257 -aI-511 -aI240 -aI-458 -aa(lp15893 -g10 -aa(lp15894 -g8 -aI814 -aI-44 -aa(lp15895 -g10 -aa(lp15896 -g8 -aI814 -aI-44 -aasVs -(lp15897 -(lp15898 -g8 -aI31 -aI-241 -aa(lp15899 -g20 -aI214 -aI-269 -aa(lp15900 -g15 -aI262 -aI-188 -aI222 -aI-234 -aI238 -aI-207 -aa(lp15901 -g15 -aI362 -aI-160 -aI286 -aI-170 -aI319 -aI-160 -aa(lp15902 -g15 -aI469 -aI-187 -aI409 -aI-160 -aI445 -aI-169 -aa(lp15903 -g15 -aI493 -aI-235 -aI485 -aI-199 -aI493 -aI-215 -aa(lp15904 -g15 -aI480 -aI-270 -aI493 -aI-249 -aI489 -aI-261 -aa(lp15905 -g15 -aI419 -aI-294 -aI471 -aI-279 -aI450 -aI-287 -aa(lp15906 -g15 -aI138 -aI-383 -aI271 -aI-327 -aI178 -aI-356 -aa(lp15907 -g15 -aI56 -aI-539 -aI83 -aI-420 -aI56 -aI-472 -aa(lp15908 -g15 -aI127 -aI-690 -aI56 -aI-599 -aI80 -aI-649 -aa(lp15909 -g15 -aI347 -aI-751 -aI174 -aI-731 -aI248 -aI-751 -aa(lp15910 -g15 -aI558 -aI-705 -aI442 -aI-751 -aI512 -aI-736 -aa(lp15911 -g15 -aI653 -aI-568 -aI604 -aI-674 -aI636 -aI-628 -aa(lp15912 -g20 -aI481 -aI-536 -aa(lp15913 -g15 -aI439 -aI-598 -aI473 -aI-563 -aI459 -aI-584 -aa(lp15914 -g15 -aI350 -aI-619 -aI418 -aI-612 -aI389 -aI-619 -aa(lp15915 -g15 -aI247 -aI-599 -aI302 -aI-619 -aI268 -aI-613 -aa(lp15916 -g15 -aI226 -aI-562 -aI233 -aI-590 -aI226 -aI-577 -aa(lp15917 -g15 -aI244 -aI-529 -aI226 -aI-549 -aI232 -aI-538 -aa(lp15918 -g15 -aI415 -aI-478 -aI261 -aI-517 -aI318 -aI-500 -aa(lp15919 -g15 -aI619 -aI-396 -aI513 -aI-455 -aI581 -aI-428 -aa(lp15920 -g15 -aI677 -aI-260 -aI657 -aI-364 -aI677 -aI-318 -aa(lp15921 -g15 -aI597 -aI-97 -aI677 -aI-197 -aI650 -aI-142 -aa(lp15922 -g15 -aI362 -aI-28 -aI544 -aI-51 -aI466 -aI-28 -aa(lp15923 -g15 -aI138 -aI-86 -aI268 -aI-28 -aI193 -aI-47 -aa(lp15924 -g15 -aI31 -aI-241 -aI84 -aI-124 -aI48 -aI-176 -aa(lp15925 -g10 -aa(lp15926 -g8 -aI741 -aI-44 -aa(lp15927 -g10 -aa(lp15928 -g8 -aI741 -aI-44 -aasVw -(lp15929 -(lp15930 -g8 -aI224 -aI-44 -aa(lp15931 -g20 -aI5 -aI-735 -aa(lp15932 -g20 -aI183 -aI-735 -aa(lp15933 -g20 -aI313 -aI-282 -aa(lp15934 -g20 -aI432 -aI-735 -aa(lp15935 -g20 -aI608 -aI-735 -aa(lp15936 -g20 -aI723 -aI-282 -aa(lp15937 -g20 -aI856 -aI-735 -aa(lp15938 -g20 -aI1036 -aI-735 -aa(lp15939 -g20 -aI814 -aI-44 -aa(lp15940 -g20 -aI638 -aI-44 -aa(lp15941 -g20 -aI519 -aI-489 -aa(lp15942 -g20 -aI402 -aI-44 -aa(lp15943 -g10 -aa(lp15944 -g8 -aI1037 -aI-44 -aa(lp15945 -g10 -aa(lp15946 -g8 -aI1037 -aI-44 -aasV{ -(lp15947 -(lp15948 -g8 -aI39 -aI-311 -aa(lp15949 -g20 -aI39 -aI-467 -aa(lp15950 -g15 -aI110 -aI-481 -aI70 -aI-469 -aI94 -aI-474 -aa(lp15951 -g15 -aI152 -aI-521 -aI126 -aI-489 -aI140 -aI-502 -aa(lp15952 -g15 -aI176 -aI-590 -aI164 -aI-539 -aI172 -aI-562 -aa(lp15953 -g15 -aI181 -aI-699 -aI179 -aI-611 -aI181 -aI-647 -aa(lp15954 -g15 -aI193 -aI-875 -aI181 -aI-783 -aI185 -aI-842 -aa(lp15955 -g15 -aI235 -aI-955 -aI201 -aI-908 -aI215 -aI-935 -aa(lp15956 -g15 -aI324 -aI-1003 -aI256 -aI-975 -aI285 -aI-991 -aa(lp15957 -g15 -aI449 -aI-1015 -aI351 -aI-1011 -aI393 -aI-1015 -aa(lp15958 -g20 -aI484 -aI-1015 -aa(lp15959 -g20 -aI484 -aI-859 -aa(lp15960 -g15 -aI391 -aI-851 -aI436 -aI-859 -aI405 -aI-856 -aa(lp15961 -g15 -aI361 -aI-826 -aI377 -aI-845 -aI367 -aI-837 -aa(lp15962 -g15 -aI351 -aI-769 -aI354 -aI-815 -aI351 -aI-796 -aa(lp15963 -g15 -aI345 -aI-614 -aI351 -aI-742 -aI349 -aI-690 -aa(lp15964 -g15 -aI328 -aI-509 -aI343 -aI-571 -aI337 -aI-536 -aa(lp15965 -g15 -aI293 -aI-443 -aI319 -aI-482 -aI308 -aI-460 -aa(lp15966 -g15 -aI229 -aI-389 -aI279 -aI-426 -aI258 -aI-408 -aa(lp15967 -g15 -aI291 -aI-337 -aI254 -aI-374 -aI275 -aI-357 -aa(lp15968 -g15 -aI329 -aI-265 -aI308 -aI-317 -aI320 -aI-294 -aa(lp15969 -g15 -aI346 -aI-152 -aI338 -aI-237 -aI343 -aI-199 -aa(lp15970 -g15 -aI350 -aI-14 -aI349 -aI-80 -aI350 -aI-34 -aa(lp15971 -g15 -aI361 -aI45 -aI350 -aI14 -aI354 -aI34 -aa(lp15972 -g15 -aI392 -aI71 -aI368 -aI56 -aI378 -aI65 -aa(lp15973 -g15 -aI484 -aI79 -aI407 -aI76 -aI437 -aI79 -aa(lp15974 -g20 -aI484 -aI236 -aa(lp15975 -g20 -aI449 -aI236 -aa(lp15976 -g15 -aI315 -aI222 -aI391 -aI236 -aI346 -aI231 -aa(lp15977 -g15 -aI236 -aI175 -aI283 -aI212 -aI257 -aI197 -aa(lp15978 -g15 -aI192 -aI95 -aI214 -aI153 -aI200 -aI127 -aa(lp15979 -g15 -aI181 -aI-55 -aI185 -aI63 -aI181 -aI13 -aa(lp15980 -g15 -aI171 -aI-211 -aI181 -aI-135 -aI178 -aI-187 -aa(lp15981 -g15 -aI127 -aI-285 -aI161 -aI-245 -aI147 -aI-270 -aa(lp15982 -g15 -aI39 -aI-311 -aI108 -aI-300 -aI78 -aI-309 -aa(lp15983 -g10 -aa(lp15984 -g8 -aI518 -aI-44 -aa(lp15985 -g10 -aa(lp15986 -g8 -aI518 -aI-44 -aasV" -(lp15987 -(lp15988 -g8 -aI107 -aI-659 -aa(lp15989 -g20 -aI72 -aI-837 -aa(lp15990 -g20 -aI72 -aI-998 -aa(lp15991 -g20 -aI272 -aI-998 -aa(lp15992 -g20 -aI272 -aI-837 -aa(lp15993 -g20 -aI242 -aI-659 -aa(lp15994 -g10 -aa(lp15995 -g8 -aI401 -aI-659 -aa(lp15996 -g20 -aI366 -aI-837 -aa(lp15997 -g20 -aI366 -aI-998 -aa(lp15998 -g20 -aI565 -aI-998 -aa(lp15999 -g20 -aI565 -aI-837 -aa(lp16000 -g20 -aI535 -aI-659 -aa(lp16001 -g10 -aa(lp16002 -g8 -aI632 -aI-44 -aa(lp16003 -g10 -aa(lp16004 -g8 -aI632 -aI-44 -aasV& -(lp16005 -(lp16006 -g8 -aI941 -aI-160 -aa(lp16007 -g20 -aI830 -aI-19 -aa(lp16008 -g15 -aI674 -aI-129 -aI776 -aI-46 -aI724 -aI-82 -aa(lp16009 -g15 -aI551 -aI-52 -aI635 -aI-94 -aI594 -aI-68 -aa(lp16010 -g15 -aI396 -aI-27 -aI508 -aI-35 -aI456 -aI-27 -aa(lp16011 -g15 -aI128 -aI-127 -aI277 -aI-27 -aI188 -aI-60 -aa(lp16012 -g15 -aI58 -aI-306 -aI81 -aI-179 -aI58 -aI-238 -aa(lp16013 -g15 -aI113 -aI-471 -aI58 -aI-367 -aI76 -aI-422 -aa(lp16014 -g15 -aI276 -aI-598 -aI149 -aI-520 -aI204 -aI-562 -aa(lp16015 -g15 -aI203 -aI-708 -aI244 -aI-637 -aI219 -aI-673 -aa(lp16016 -g15 -aI178 -aI-808 -aI186 -aI-743 -aI178 -aI-776 -aa(lp16017 -g15 -aI247 -aI-954 -aI178 -aI-865 -aI201 -aI-914 -aa(lp16018 -g15 -aI445 -aI-1015 -aI293 -aI-995 -aI359 -aI-1015 -aa(lp16019 -g15 -aI638 -aI-952 -aI527 -aI-1015 -aI592 -aI-994 -aa(lp16020 -g15 -aI708 -aI-797 -aI685 -aI-909 -aI708 -aI-858 -aa(lp16021 -g15 -aI673 -aI-687 -aI708 -aI-759 -aI696 -aI-722 -aa(lp16022 -g15 -aI534 -aI-569 -aI650 -aI-652 -aI604 -aI-613 -aa(lp16023 -g20 -aI667 -aI-394 -aa(lp16024 -g15 -aI707 -aI-503 -aI682 -aI-422 -aI696 -aI-458 -aa(lp16025 -g20 -aI873 -aI-465 -aa(lp16026 -g15 -aI830 -aI-337 -aI856 -aI-407 -aI842 -aI-364 -aa(lp16027 -g15 -aI791 -aI-269 -aI817 -aI-309 -aI804 -aI-287 -aa(lp16028 -g15 -aI870 -aI-206 -aI811 -aI-249 -aI837 -aI-229 -aa(lp16029 -g15 -aI941 -aI-160 -aI902 -aI-183 -aI926 -aI-168 -aa(lp16030 -g10 -aa(lp16031 -g8 -aI443 -aI-679 -aa(lp16032 -g20 -aI492 -aI-717 -aa(lp16033 -g15 -aI547 -aI-801 -aI529 -aI-745 -aI547 -aI-773 -aa(lp16034 -g15 -aI521 -aI-861 -aI547 -aI-825 -aI538 -aI-845 -aa(lp16035 -g15 -aI449 -aI-886 -aI503 -aI-877 -aI479 -aI-886 -aa(lp16036 -g15 -aI381 -aI-864 -aI420 -aI-886 -aI398 -aI-878 -aa(lp16037 -g15 -aI356 -aI-813 -aI365 -aI-849 -aI356 -aI-833 -aa(lp16038 -g15 -aI398 -aI-731 -aI356 -aI-791 -aI370 -aI-764 -aa(lp16039 -g10 -aa(lp16040 -g8 -aI371 -aI-481 -aa(lp16041 -g15 -aI277 -aI-404 -aI329 -aI-460 -aI298 -aI-434 -aa(lp16042 -g15 -aI246 -aI-312 -aI256 -aI-374 -aI246 -aI-343 -aa(lp16043 -g15 -aI284 -aI-215 -aI246 -aI-273 -aI259 -aI-240 -aa(lp16044 -g15 -aI388 -aI-178 -aI310 -aI-191 -aI345 -aI-178 -aa(lp16045 -g15 -aI471 -aI-195 -aI417 -aI-178 -aI444 -aI-184 -aa(lp16046 -g15 -aI557 -aI-251 -aI497 -aI-206 -aI526 -aI-225 -aa(lp16047 -g10 -aa(lp16048 -g8 -aI962 -aI-44 -aa(lp16049 -g10 -aa(lp16050 -g8 -aI962 -aI-44 -aasV* -(lp16051 -(lp16052 -g8 -aI159 -aI-560 -aa(lp16053 -g20 -aI61 -aI-636 -aa(lp16054 -g15 -aI158 -aI-737 -aI92 -aI-671 -aI124 -aI-705 -aa(lp16055 -g15 -aI184 -aI-761 -aI172 -aI-750 -aI180 -aI-758 -aa(lp16056 -g15 -aI91 -aI-783 -aI173 -aI-763 -aI142 -aI-770 -aa(lp16057 -g15 -aI18 -aI-803 -aI54 -aI-792 -aI29 -aI-799 -aa(lp16058 -g20 -aI56 -aI-918 -aa(lp16059 -g15 -aI208 -aI-841 -aI113 -aI-895 -aI164 -aI-869 -aa(lp16060 -g15 -aI193 -aI-1015 -aI198 -aI-912 -aI193 -aI-970 -aa(lp16061 -g20 -aI309 -aI-1015 -aa(lp16062 -g15 -aI291 -aI-840 -aI309 -aI-983 -aI303 -aI-925 -aa(lp16063 -g15 -aI347 -aI-866 -aI300 -aI-844 -aI319 -aI-852 -aa(lp16064 -g15 -aI455 -aI-911 -aI386 -aI-883 -aI422 -aI-899 -aa(lp16065 -g20 -aI490 -aI-793 -aa(lp16066 -g15 -aI322 -aI-761 -aI442 -aI-782 -aI386 -aI-772 -aa(lp16067 -g20 -aI401 -aI-674 -aa(lp16068 -g15 -aI438 -aI-630 -aI416 -aI-656 -aI429 -aI-641 -aa(lp16069 -g20 -aI338 -aI-564 -aa(lp16070 -g20 -aI250 -aI-709 -aa(lp16071 -g15 -aI159 -aI-560 -aI224 -aI-662 -aI193 -aI-613 -aa(lp16072 -g10 -aa(lp16073 -g8 -aI518 -aI-44 -aa(lp16074 -g10 -aa(lp16075 -g8 -aI518 -aI-44 -aasV. -(lp16076 -(lp16077 -g8 -aI95 -aI-44 -aa(lp16078 -g20 -aI95 -aI-227 -aa(lp16079 -g20 -aI278 -aI-227 -aa(lp16080 -g20 -aI278 -aI-44 -aa(lp16081 -g10 -aa(lp16082 -g8 -aI370 -aI-44 -aa(lp16083 -g10 -aa(lp16084 -g8 -aI370 -aI-44 -aasV2 -(lp16085 -(lp16086 -g8 -aI674 -aI-214 -aa(lp16087 -g20 -aI674 -aI-44 -aa(lp16088 -g20 -aI33 -aI-44 -aa(lp16089 -g15 -aI95 -aI-227 -aI40 -aI-108 -aI60 -aI-169 -aa(lp16090 -g15 -aI301 -aI-455 -aI130 -aI-284 -aI199 -aI-360 -aa(lp16091 -g15 -aI453 -aI-612 -aI383 -aI-532 -aI434 -aI-584 -aa(lp16092 -g15 -aI490 -aI-724 -aI478 -aI-649 -aI490 -aI-687 -aa(lp16093 -g15 -aI458 -aI-818 -aI490 -aI-764 -aI479 -aI-796 -aa(lp16094 -g15 -aI367 -aI-851 -aI436 -aI-840 -aI405 -aI-851 -aa(lp16095 -g15 -aI276 -aI-816 -aI328 -aI-851 -aI298 -aI-839 -aa(lp16096 -g15 -aI236 -aI-702 -aI253 -aI-793 -aI240 -aI-755 -aa(lp16097 -g20 -aI54 -aI-720 -aa(lp16098 -g15 -aI156 -aI-937 -aI65 -aI-820 -aI99 -aI-893 -aa(lp16099 -g15 -aI371 -aI-1002 -aI214 -aI-980 -aI285 -aI-1002 -aa(lp16100 -g15 -aI593 -aI-926 -aI465 -aI-1002 -aI539 -aI-977 -aa(lp16101 -g15 -aI674 -aI-737 -aI647 -aI-875 -aI674 -aI-812 -aa(lp16102 -g15 -aI651 -aI-614 -aI674 -aI-694 -aI666 -aI-653 -aa(lp16103 -g15 -aI578 -aI-492 -aI635 -aI-575 -aI611 -aI-534 -aa(lp16104 -g15 -aI458 -aI-370 -aI555 -aI-464 -aI516 -aI-423 -aa(lp16105 -g15 -aI348 -aI-265 -aI400 -aI-317 -aI364 -aI-282 -aa(lp16106 -g15 -aI311 -aI-214 -aI333 -aI-247 -aI320 -aI-230 -aa(lp16107 -g10 -aa(lp16108 -g8 -aI741 -aI-44 -aa(lp16109 -g10 -aa(lp16110 -g8 -aI741 -aI-44 -aasV6 -(lp16111 -(lp16112 -g8 -aI676 -aI-765 -aa(lp16113 -g20 -aI499 -aI-745 -aa(lp16114 -g15 -aI465 -aI-826 -aI495 -aI-782 -aI483 -aI-808 -aa(lp16115 -g15 -aI394 -aI-852 -aI447 -aI-843 -aI423 -aI-852 -aa(lp16116 -g15 -aI296 -aI-800 -aI355 -aI-852 -aI323 -aI-835 -aa(lp16117 -g15 -aI246 -aI-583 -aI269 -aI-765 -aI253 -aI-693 -aa(lp16118 -g15 -aI416 -aI-664 -aI291 -aI-637 -aI348 -aI-664 -aa(lp16119 -g15 -aI612 -aI-577 -aI492 -aI-664 -aI557 -aI-635 -aa(lp16120 -g15 -aI694 -aI-351 -aI666 -aI-518 -aI694 -aI-443 -aa(lp16121 -g15 -aI608 -aI-116 -aI694 -aI-254 -aI665 -aI-175 -aa(lp16122 -g15 -aI387 -aI-28 -aI550 -aI-57 -aI477 -aI-28 -aa(lp16123 -g15 -aI149 -aI-140 -aI291 -aI-28 -aI211 -aI-65 -aa(lp16124 -g15 -aI56 -aI-508 -aI87 -aI-215 -aI56 -aI-338 -aa(lp16125 -g15 -aI153 -aI-886 -aI56 -aI-683 -aI88 -aI-809 -aa(lp16126 -g15 -aI405 -aI-1002 -aI218 -aI-964 -aI302 -aI-1002 -aa(lp16127 -g15 -aI585 -aI-941 -aI478 -aI-1002 -aI538 -aI-982 -aa(lp16128 -g15 -aI676 -aI-765 -aI633 -aI-901 -aI663 -aI-842 -aa(lp16129 -g10 -aa(lp16130 -g8 -aI261 -aI-366 -aa(lp16131 -g15 -aI302 -aI-228 -aI261 -aI-306 -aI275 -aI-260 -aa(lp16132 -g15 -aI396 -aI-179 -aI330 -aI-196 -aI361 -aI-179 -aa(lp16133 -g15 -aI481 -aI-219 -aI430 -aI-179 -aI458 -aI-193 -aa(lp16134 -g15 -aI514 -aI-349 -aI503 -aI-246 -aI514 -aI-289 -aa(lp16135 -g15 -aI478 -aI-486 -aI514 -aI-411 -aI502 -aI-457 -aa(lp16136 -g15 -aI387 -aI-529 -aI454 -aI-515 -aI423 -aI-529 -aa(lp16137 -g15 -aI298 -aI-488 -aI352 -aI-529 -aI322 -aI-515 -aa(lp16138 -g15 -aI261 -aI-366 -aI273 -aI-460 -aI261 -aI-419 -aa(lp16139 -g10 -aa(lp16140 -g8 -aI741 -aI-44 -aa(lp16141 -g10 -aa(lp16142 -g8 -aI741 -aI-44 -aasV: -(lp16143 -(lp16144 -g8 -aI130 -aI-552 -aa(lp16145 -g20 -aI130 -aI-735 -aa(lp16146 -g20 -aI313 -aI-735 -aa(lp16147 -g20 -aI313 -aI-552 -aa(lp16148 -g10 -aa(lp16149 -g8 -aI130 -aI-44 -aa(lp16150 -g20 -aI130 -aI-227 -aa(lp16151 -g20 -aI313 -aI-227 -aa(lp16152 -g20 -aI313 -aI-44 -aa(lp16153 -g10 -aa(lp16154 -g8 -aI444 -aI-44 -aa(lp16155 -g10 -aa(lp16156 -g8 -aI444 -aI-44 -aasV> -(lp16157 -(lp16158 -g8 -aI61 -aI-152 -aa(lp16159 -g20 -aI61 -aI-336 -aa(lp16160 -g20 -aI518 -aI-516 -aa(lp16161 -g20 -aI61 -aI-694 -aa(lp16162 -g20 -aI61 -aI-877 -aa(lp16163 -g20 -aI716 -aI-593 -aa(lp16164 -g20 -aI716 -aI-437 -aa(lp16165 -g10 -aa(lp16166 -g8 -aI778 -aI-44 -aa(lp16167 -g10 -aa(lp16168 -g8 -aI778 -aI-44 -aasVB -(lp16169 -(lp16170 -g8 -aI97 -aI-998 -aa(lp16171 -g20 -aI479 -aI-998 -aa(lp16172 -g15 -aI648 -aI-989 -aI554 -aI-998 -aI611 -aI-995 -aa(lp16173 -g15 -aI747 -aI-950 -aI685 -aI-983 -aI718 -aI-970 -aa(lp16174 -g15 -aI820 -aI-870 -aI777 -aI-930 -aI801 -aI-903 -aa(lp16175 -g15 -aI850 -aI-758 -aI840 -aI-837 -aI850 -aI-799 -aa(lp16176 -g15 -aI814 -aI-635 -aI850 -aI-713 -aI838 -aI-672 -aa(lp16177 -g15 -aI716 -aI-551 -aI790 -aI-598 -aI757 -aI-570 -aa(lp16178 -g15 -aI850 -aI-465 -aI774 -aI-534 -aI819 -aI-505 -aa(lp16179 -g15 -aI897 -aI-321 -aI881 -aI-424 -aI897 -aI-376 -aa(lp16180 -g15 -aI866 -aI-194 -aI897 -aI-277 -aI887 -aI-235 -aa(lp16181 -g15 -aI784 -aI-96 -aI846 -aI-153 -aI819 -aI-120 -aa(lp16182 -g15 -aI654 -aI-50 -aI749 -aI-71 -aI706 -aI-56 -aa(lp16183 -g15 -aI422 -aI-44 -aI622 -aI-47 -aI545 -aI-45 -aa(lp16184 -g20 -aI97 -aI-44 -aa(lp16185 -g10 -aa(lp16186 -g8 -aI290 -aI-840 -aa(lp16187 -g20 -aI290 -aI-619 -aa(lp16188 -g20 -aI416 -aI-619 -aa(lp16189 -g15 -aI556 -aI-622 -aI491 -aI-619 -aI538 -aI-620 -aa(lp16190 -g15 -aI634 -aI-656 -aI589 -aI-626 -aI615 -aI-637 -aa(lp16191 -g15 -aI662 -aI-731 -aI653 -aI-675 -aI662 -aI-700 -aa(lp16192 -g15 -aI638 -aI-803 -aI662 -aI-760 -aI654 -aI-784 -aa(lp16193 -g15 -aI565 -aI-836 -aI622 -aI-821 -aI597 -aI-832 -aa(lp16194 -g15 -aI401 -aI-840 -aI546 -aI-838 -aI491 -aI-840 -aa(lp16195 -g10 -aa(lp16196 -g8 -aI290 -aI-460 -aa(lp16197 -g20 -aI290 -aI-205 -aa(lp16198 -g20 -aI468 -aI-205 -aa(lp16199 -g15 -aI600 -aI-211 -aI538 -aI-205 -aI582 -aI-207 -aa(lp16200 -g15 -aI670 -aI-249 -aI629 -aI-216 -aI652 -aI-229 -aa(lp16201 -g15 -aI697 -aI-330 -aI688 -aI-269 -aI697 -aI-296 -aa(lp16202 -g15 -aI677 -aI-403 -aI697 -aI-358 -aI690 -aI-383 -aa(lp16203 -g15 -aI616 -aI-446 -aI663 -aI-423 -aI643 -aI-437 -aa(lp16204 -g15 -aI445 -aI-460 -aI590 -aI-455 -aI533 -aI-460 -aa(lp16205 -g10 -aa(lp16206 -g8 -aI962 -aI-44 -aa(lp16207 -g10 -aa(lp16208 -g8 -aI962 -aI-44 -aasVF -(lp16209 -(lp16210 -g8 -aI98 -aI-44 -aa(lp16211 -g20 -aI98 -aI-998 -aa(lp16212 -g20 -aI752 -aI-998 -aa(lp16213 -g20 -aI752 -aI-837 -aa(lp16214 -g20 -aI291 -aI-837 -aa(lp16215 -g20 -aI291 -aI-611 -aa(lp16216 -g20 -aI689 -aI-611 -aa(lp16217 -g20 -aI689 -aI-450 -aa(lp16218 -g20 -aI291 -aI-450 -aa(lp16219 -g20 -aI291 -aI-44 -aa(lp16220 -g10 -aa(lp16221 -g8 -aI814 -aI-44 -aa(lp16222 -g10 -aa(lp16223 -g8 -aI814 -aI-44 -aasVJ -(lp16224 -(lp16225 -g8 -aI441 -aI-998 -aa(lp16226 -g20 -aI633 -aI-998 -aa(lp16227 -g20 -aI633 -aI-394 -aa(lp16228 -g15 -aI612 -aI-212 -aI633 -aI-315 -aI626 -aI-254 -aa(lp16229 -g15 -aI511 -aI-78 -aI593 -aI-156 -aI560 -aI-112 -aa(lp16230 -g15 -aI317 -aI-28 -aI462 -aI-44 -aI397 -aI-28 -aa(lp16231 -g15 -aI99 -aI-107 -aI222 -aI-28 -aI150 -aI-54 -aa(lp16232 -g15 -aI22 -aI-339 -aI48 -aI-160 -aI23 -aI-237 -aa(lp16233 -g20 -aI204 -aI-360 -aa(lp16234 -g15 -aI228 -aI-244 -aI206 -aI-305 -aI214 -aI-266 -aa(lp16235 -g15 -aI323 -aI-192 -aI249 -aI-210 -aI281 -aI-192 -aa(lp16236 -g15 -aI414 -aI-229 -aI366 -aI-192 -aI396 -aI-205 -aa(lp16237 -g15 -aI441 -aI-382 -aI432 -aI-254 -aI441 -aI-305 -aa(lp16238 -g10 -aa(lp16239 -g8 -aI741 -aI-44 -aa(lp16240 -g10 -aa(lp16241 -g8 -aI741 -aI-44 -aasVN -(lp16242 -(lp16243 -g8 -aI98 -aI-44 -aa(lp16244 -g20 -aI98 -aI-998 -aa(lp16245 -g20 -aI286 -aI-998 -aa(lp16246 -g20 -aI677 -aI-361 -aa(lp16247 -g20 -aI677 -aI-998 -aa(lp16248 -g20 -aI856 -aI-998 -aa(lp16249 -g20 -aI856 -aI-44 -aa(lp16250 -g20 -aI662 -aI-44 -aa(lp16251 -g20 -aI277 -aI-666 -aa(lp16252 -g20 -aI277 -aI-44 -aa(lp16253 -g10 -aa(lp16254 -g8 -aI962 -aI-44 -aa(lp16255 -g10 -aa(lp16256 -g8 -aI962 -aI-44 -aasVR -(lp16257 -(lp16258 -g8 -aI97 -aI-44 -aa(lp16259 -g20 -aI97 -aI-998 -aa(lp16260 -g20 -aI503 -aI-998 -aa(lp16261 -g15 -aI725 -aI-973 -aI605 -aI-998 -aI679 -aI-990 -aa(lp16262 -g15 -aI836 -aI-881 -aI771 -aI-956 -aI808 -aI-925 -aa(lp16263 -g15 -aI878 -aI-731 -aI864 -aI-837 -aI878 -aI-787 -aa(lp16264 -g15 -aI815 -aI-553 -aI878 -aI-659 -aI857 -aI-600 -aa(lp16265 -g15 -aI626 -aI-465 -aI773 -aI-507 -aI710 -aI-477 -aa(lp16266 -g15 -aI729 -aI-385 -aI667 -aI-441 -aI702 -aI-414 -aa(lp16267 -g15 -aI839 -aI-230 -aI756 -aI-356 -aI793 -aI-304 -aa(lp16268 -g20 -aI955 -aI-44 -aa(lp16269 -g20 -aI725 -aI-44 -aa(lp16270 -g20 -aI585 -aI-252 -aa(lp16271 -g15 -aI484 -aI-392 -aI536 -aI-326 -aI502 -aI-373 -aa(lp16272 -g15 -aI426 -aI-432 -aI466 -aI-411 -aI446 -aI-424 -aa(lp16273 -g15 -aI329 -aI-442 -aI406 -aI-439 -aI373 -aI-442 -aa(lp16274 -g20 -aI290 -aI-442 -aa(lp16275 -g20 -aI290 -aI-44 -aa(lp16276 -g10 -aa(lp16277 -g8 -aI290 -aI-595 -aa(lp16278 -g20 -aI432 -aI-595 -aa(lp16279 -g15 -aI606 -aI-606 -aI525 -aI-595 -aI583 -aI-599 -aa(lp16280 -g15 -aI660 -aI-647 -aI629 -aI-614 -aI647 -aI-628 -aa(lp16281 -g15 -aI679 -aI-718 -aI673 -aI-666 -aI679 -aI-690 -aa(lp16282 -g15 -aI653 -aI-796 -aI679 -aI-751 -aI671 -aI-776 -aa(lp16283 -g15 -aI581 -aI-834 -aI636 -aI-816 -aI612 -aI-828 -aa(lp16284 -g15 -aI440 -aI-837 -aI565 -aI-836 -aI518 -aI-837 -aa(lp16285 -g20 -aI290 -aI-837 -aa(lp16286 -g10 -aa(lp16287 -g8 -aI962 -aI-44 -aa(lp16288 -g10 -aa(lp16289 -g8 -aI962 -aI-44 -aasVV -(lp16290 -(lp16291 -g8 -aI340 -aI-44 -aa(lp16292 -g20 -aI0 -aI-998 -aa(lp16293 -g20 -aI208 -aI-998 -aa(lp16294 -g20 -aI449 -aI-292 -aa(lp16295 -g20 -aI683 -aI-998 -aa(lp16296 -g20 -aI888 -aI-998 -aa(lp16297 -g20 -aI546 -aI-44 -aa(lp16298 -g10 -aa(lp16299 -g8 -aI889 -aI-44 -aa(lp16300 -g10 -aa(lp16301 -g8 -aI889 -aI-44 -aasVZ -(lp16302 -(lp16303 -g8 -aI14 -aI-44 -aa(lp16304 -g20 -aI14 -aI-218 -aa(lp16305 -g20 -aI515 -aI-837 -aa(lp16306 -g20 -aI70 -aI-837 -aa(lp16307 -g20 -aI70 -aI-998 -aa(lp16308 -g20 -aI769 -aI-998 -aa(lp16309 -g20 -aI769 -aI-849 -aa(lp16310 -g20 -aI246 -aI-205 -aa(lp16311 -g20 -aI789 -aI-205 -aa(lp16312 -g20 -aI789 -aI-44 -aa(lp16313 -g10 -aa(lp16314 -g8 -aI814 -aI-44 -aa(lp16315 -g10 -aa(lp16316 -g8 -aI814 -aI-44 -aasV^ -(lp16317 -(lp16318 -g8 -aI74 -aI-494 -aa(lp16319 -g20 -aI319 -aI-1015 -aa(lp16320 -g20 -aI464 -aI-1015 -aa(lp16321 -g20 -aI703 -aI-494 -aa(lp16322 -g20 -aI518 -aI-494 -aa(lp16323 -g20 -aI389 -aI-813 -aa(lp16324 -g20 -aI261 -aI-494 -aa(lp16325 -g10 -aa(lp16326 -g8 -aI778 -aI-44 -aa(lp16327 -g10 -aa(lp16328 -g8 -aI778 -aI-44 -aasVb -(lp16329 -(lp16330 -g8 -aI87 -aI-44 -aa(lp16331 -g20 -aI87 -aI-998 -aa(lp16332 -g20 -aI270 -aI-998 -aa(lp16333 -g20 -aI270 -aI-655 -aa(lp16334 -g15 -aI471 -aI-751 -aI327 -aI-719 -aI394 -aI-751 -aa(lp16335 -g15 -aI680 -aI-660 -aI555 -aI-751 -aI625 -aI-720 -aa(lp16336 -g15 -aI763 -aI-397 -aI735 -aI-599 -aI763 -aI-511 -aa(lp16337 -g15 -aI678 -aI-124 -aI763 -aI-279 -aI734 -aI-188 -aa(lp16338 -g15 -aI473 -aI-28 -aI622 -aI-60 -aI554 -aI-28 -aa(lp16339 -g15 -aI357 -aI-58 -aI434 -aI-28 -aI395 -aI-38 -aa(lp16340 -g15 -aI257 -aI-146 -aI318 -aI-78 -aI285 -aI-107 -aa(lp16341 -g20 -aI257 -aI-44 -aa(lp16342 -g10 -aa(lp16343 -g8 -aI269 -aI-405 -aa(lp16344 -g15 -aI303 -aI-246 -aI269 -aI-333 -aI280 -aI-280 -aa(lp16345 -g15 -aI429 -aI-173 -aI335 -aI-197 -aI377 -aI-173 -aa(lp16346 -g15 -aI532 -aI-225 -aI470 -aI-173 -aI504 -aI-190 -aa(lp16347 -g15 -aI575 -aI-388 -aI561 -aI-259 -aI575 -aI-313 -aa(lp16348 -g15 -aI532 -aI-559 -aI575 -aI-467 -aI561 -aI-524 -aa(lp16349 -g15 -aI422 -aI-611 -aI503 -aI-594 -aI467 -aI-611 -aa(lp16350 -g15 -aI313 -aI-560 -aI378 -aI-611 -aI342 -aI-594 -aa(lp16351 -g15 -aI269 -aI-405 -aI284 -aI-526 -aI269 -aI-474 -aa(lp16352 -g10 -aa(lp16353 -g8 -aI814 -aI-44 -aa(lp16354 -g10 -aa(lp16355 -g8 -aI814 -aI-44 -aasVf -(lp16356 -(lp16357 -g8 -aI15 -aI-735 -aa(lp16358 -g20 -aI117 -aI-735 -aa(lp16359 -g20 -aI117 -aI-787 -aa(lp16360 -g15 -aI135 -aI-918 -aI117 -aI-846 -aI123 -aI-889 -aa(lp16361 -g15 -aI204 -aI-988 -aI148 -aI-946 -aI170 -aI-970 -aa(lp16362 -g15 -aI330 -aI-1015 -aI237 -aI-1006 -aI279 -aI-1015 -aa(lp16363 -g15 -aI483 -aI-991 -aI382 -aI-1015 -aI433 -aI-1007 -aa(lp16364 -g20 -aI458 -aI-864 -aa(lp16365 -g15 -aI374 -aI-874 -aI429 -aI-871 -aI401 -aI-874 -aa(lp16366 -g15 -aI317 -aI-855 -aI347 -aI-874 -aI328 -aI-868 -aa(lp16367 -g15 -aI300 -aI-784 -aI305 -aI-843 -aI300 -aI-819 -aa(lp16368 -g20 -aI300 -aI-735 -aa(lp16369 -g20 -aI436 -aI-735 -aa(lp16370 -g20 -aI436 -aI-591 -aa(lp16371 -g20 -aI300 -aI-591 -aa(lp16372 -g20 -aI300 -aI-44 -aa(lp16373 -g20 -aI117 -aI-44 -aa(lp16374 -g20 -aI117 -aI-591 -aa(lp16375 -g20 -aI15 -aI-591 -aa(lp16376 -g10 -aa(lp16377 -g8 -aI444 -aI-44 -aa(lp16378 -g10 -aa(lp16379 -g8 -aI444 -aI-44 -aasVj -(lp16380 -(lp16381 -g8 -aI91 -aI-829 -aa(lp16382 -g20 -aI91 -aI-998 -aa(lp16383 -g20 -aI274 -aI-998 -aa(lp16384 -g20 -aI274 -aI-829 -aa(lp16385 -g10 -aa(lp16386 -g8 -aI274 -aI-735 -aa(lp16387 -g20 -aI274 -aI-65 -aa(lp16388 -g15 -aI257 -aI120 -aI274 -aI22 -aI268 -aI84 -aa(lp16389 -g15 -aI191 -aI205 -aI245 -aI156 -aI223 -aI185 -aa(lp16390 -g15 -aI65 -aI236 -aI158 -aI225 -aI116 -aI236 -aa(lp16391 -g15 -aI6 -aI231 -aI47 -aI236 -aI27 -aI234 -aa(lp16392 -g15 -aI-61 -aI216 -aI-14 -aI228 -aI-36 -aI223 -aa(lp16393 -g20 -aI-29 -aI60 -aa(lp16394 -g15 -aI-4 -aI64 -aI-20 -aI62 -aI-12 -aI63 -aa(lp16395 -g15 -aI16 -aI66 -aI2 -aI65 -aI9 -aI66 -aa(lp16396 -g15 -aI62 -aI54 -aI34 -aI66 -aI50 -aI62 -aa(lp16397 -g15 -aI85 -aI25 -aI74 -aI46 -aI82 -aI36 -aa(lp16398 -g15 -aI91 -aI-76 -aI89 -aI13 -aI91 -aI-19 -aa(lp16399 -g20 -aI91 -aI-735 -aa(lp16400 -g10 -aa(lp16401 -g8 -aI370 -aI-44 -aa(lp16402 -g10 -aa(lp16403 -g8 -aI370 -aI-44 -aasVn -(lp16404 -(lp16405 -g8 -aI724 -aI-44 -aa(lp16406 -g20 -aI541 -aI-44 -aa(lp16407 -g20 -aI541 -aI-397 -aa(lp16408 -g15 -aI529 -aI-542 -aI541 -aI-471 -aI537 -aI-520 -aa(lp16409 -g15 -aI491 -aI-593 -aI522 -aI-564 -aI509 -aI-581 -aa(lp16410 -g15 -aI428 -aI-611 -aI474 -aI-605 -aI453 -aI-611 -aa(lp16411 -g15 -aI343 -aI-585 -aI396 -aI-611 -aI368 -aI-602 -aa(lp16412 -g15 -aI291 -aI-516 -aI317 -aI-568 -aI300 -aI-545 -aa(lp16413 -g15 -aI277 -aI-357 -aI282 -aI-487 -aI277 -aI-434 -aa(lp16414 -g20 -aI277 -aI-44 -aa(lp16415 -g20 -aI94 -aI-44 -aa(lp16416 -g20 -aI94 -aI-735 -aa(lp16417 -g20 -aI264 -aI-735 -aa(lp16418 -g20 -aI264 -aI-634 -aa(lp16419 -g15 -aI492 -aI-751 -aI324 -aI-712 -aI400 -aI-751 -aa(lp16420 -g15 -aI602 -aI-729 -aI532 -aI-751 -aI569 -aI-744 -aa(lp16421 -g15 -aI678 -aI-674 -aI636 -aI-715 -aI661 -aI-696 -aa(lp16422 -g15 -aI714 -aI-597 -aI695 -aI-651 -aI707 -aI-625 -aa(lp16423 -g15 -aI724 -aI-474 -aI721 -aI-568 -aI724 -aI-527 -aa(lp16424 -g10 -aa(lp16425 -g8 -aI814 -aI-44 -aa(lp16426 -g10 -aa(lp16427 -g8 -aI814 -aI-44 -aasVr -(lp16428 -(lp16429 -g8 -aI270 -aI-44 -aa(lp16430 -g20 -aI87 -aI-44 -aa(lp16431 -g20 -aI87 -aI-735 -aa(lp16432 -g20 -aI257 -aI-735 -aa(lp16433 -g20 -aI257 -aI-637 -aa(lp16434 -g15 -aI336 -aI-729 -aI286 -aI-683 -aI313 -aI-714 -aa(lp16435 -g15 -aI415 -aI-751 -aI359 -aI-744 -aI385 -aI-751 -aa(lp16436 -g15 -aI535 -aI-716 -aI457 -aI-751 -aI497 -aI-739 -aa(lp16437 -g20 -aI479 -aI-557 -aa(lp16438 -g15 -aI393 -aI-587 -aI448 -aI-577 -aI419 -aI-587 -aa(lp16439 -g15 -aI328 -aI-566 -aI367 -aI-587 -aI345 -aI-580 -aa(lp16440 -g15 -aI286 -aI-489 -aI310 -aI-552 -aI296 -aI-526 -aa(lp16441 -g15 -aI270 -aI-257 -aI275 -aI-452 -aI270 -aI-375 -aa(lp16442 -g10 -aa(lp16443 -g8 -aI518 -aI-44 -aa(lp16444 -g10 -aa(lp16445 -g8 -aI518 -aI-44 -aasVv -(lp16446 -(lp16447 -g8 -aI285 -aI-44 -aa(lp16448 -g20 -aI7 -aI-735 -aa(lp16449 -g20 -aI199 -aI-735 -aa(lp16450 -g20 -aI329 -aI-382 -aa(lp16451 -g20 -aI367 -aI-265 -aa(lp16452 -g15 -aI386 -aI-324 -aI377 -aI-295 -aI383 -aI-314 -aa(lp16453 -g15 -aI405 -aI-382 -aI392 -aI-343 -aI398 -aI-363 -aa(lp16454 -g20 -aI537 -aI-735 -aa(lp16455 -g20 -aI725 -aI-735 -aa(lp16456 -g20 -aI450 -aI-44 -aa(lp16457 -g10 -aa(lp16458 -g8 -aI741 -aI-44 -aa(lp16459 -g10 -aa(lp16460 -g8 -aI741 -aI-44 -aasVz -(lp16461 -(lp16462 -g8 -aI22 -aI-44 -aa(lp16463 -g20 -aI22 -aI-187 -aa(lp16464 -g20 -aI281 -aI-484 -aa(lp16465 -g15 -aI375 -aI-588 -aI323 -aI-533 -aI355 -aI-567 -aa(lp16466 -g15 -aI291 -aI-585 -aI354 -aI-586 -aI326 -aI-585 -aa(lp16467 -g20 -aI47 -aI-584 -aa(lp16468 -g20 -aI47 -aI-735 -aa(lp16469 -g20 -aI619 -aI-735 -aa(lp16470 -g20 -aI619 -aI-606 -aa(lp16471 -g20 -aI354 -aI-301 -aa(lp16472 -g20 -aI261 -aI-200 -aa(lp16473 -g15 -aI356 -aI-205 -aI312 -aI-203 -aI343 -aI-205 -aa(lp16474 -g20 -aI639 -aI-205 -aa(lp16475 -g20 -aI639 -aI-44 -aa(lp16476 -g10 -aa(lp16477 -g8 -aI666 -aI-44 -aa(lp16478 -g10 -aa(lp16479 -g8 -aI666 -aI-44 -aasV~ -(lp16480 -(lp16481 -g8 -aI43 -aI-382 -aa(lp16482 -g20 -aI43 -aI-550 -aa(lp16483 -g15 -aI236 -aI-640 -aI98 -aI-610 -aI162 -aI-640 -aa(lp16484 -g15 -aI311 -aI-632 -aI263 -aI-640 -aI288 -aI-638 -aa(lp16485 -g15 -aI435 -aI-588 -aI334 -aI-627 -aI376 -aI-612 -aa(lp16486 -g15 -aI557 -aI-552 -aI495 -aI-564 -aI536 -aI-552 -aa(lp16487 -g15 -aI641 -aI-574 -aI581 -aI-552 -aI609 -aI-559 -aa(lp16488 -g15 -aI735 -aI-646 -aI673 -aI-589 -aI704 -aI-613 -aa(lp16489 -g20 -aI735 -aI-470 -aa(lp16490 -g15 -aI651 -aI-411 -aI715 -aI-449 -aI687 -aI-429 -aa(lp16491 -g15 -aI540 -aI-384 -aI615 -aI-393 -aI578 -aI-384 -aa(lp16492 -g15 -aI476 -aI-392 -aI518 -aI-384 -aI497 -aI-386 -aa(lp16493 -g15 -aI378 -aI-429 -aI456 -aI-397 -aI423 -aI-409 -aa(lp16494 -g15 -aI221 -aI-472 -aI312 -aI-458 -aI259 -aI-472 -aa(lp16495 -g15 -aI43 -aI-382 -aI160 -aI-472 -aI101 -aI-442 -aa(lp16496 -g10 -aa(lp16497 -g8 -aI778 -aI-44 -aa(lp16498 -g10 -aa(lp16499 -g8 -aI778 -aI-44 -aasV! -(lp16500 -(lp16501 -g8 -aI167 -aI-290 -aa(lp16502 -g20 -aI119 -aI-774 -aa(lp16503 -g20 -aI119 -aI-998 -aa(lp16504 -g20 -aI317 -aI-998 -aa(lp16505 -g20 -aI317 -aI-774 -aa(lp16506 -g20 -aI270 -aI-290 -aa(lp16507 -g10 -aa(lp16508 -g8 -aI127 -aI-44 -aa(lp16509 -g20 -aI127 -aI-227 -aa(lp16510 -g20 -aI310 -aI-227 -aa(lp16511 -g20 -aI310 -aI-44 -aa(lp16512 -g10 -aa(lp16513 -g8 -aI444 -aI-44 -aa(lp16514 -g10 -aa(lp16515 -g8 -aI444 -aI-44 -aasV% -(lp16516 -(lp16517 -g8 -aI57 -aI-763 -aa(lp16518 -g15 -aI114 -aI-953 -aI57 -aI-848 -aI76 -aI-912 -aa(lp16519 -g15 -aI266 -aI-1015 -aI151 -aI-994 -aI202 -aI-1015 -aa(lp16520 -g15 -aI422 -aI-953 -aI333 -aI-1015 -aI385 -aI-994 -aa(lp16521 -g15 -aI479 -aI-763 -aI460 -aI-912 -aI479 -aI-849 -aa(lp16522 -g15 -aI422 -aI-573 -aI479 -aI-677 -aI460 -aI-614 -aa(lp16523 -g15 -aI270 -aI-511 -aI385 -aI-531 -aI334 -aI-511 -aa(lp16524 -g15 -aI114 -aI-572 -aI203 -aI-511 -aI151 -aI-531 -aa(lp16525 -g15 -aI57 -aI-763 -aI76 -aI-613 -aI57 -aI-677 -aa(lp16526 -g10 -aa(lp16527 -g8 -aI200 -aI-764 -aa(lp16528 -g15 -aI222 -aI-639 -aI200 -aI-702 -aI207 -aI-660 -aa(lp16529 -g15 -aI266 -aI-616 -aI232 -aI-623 -aI247 -aI-616 -aa(lp16530 -g15 -aI312 -aI-639 -aI286 -aI-616 -aI301 -aI-623 -aa(lp16531 -g15 -aI333 -aI-764 -aI326 -aI-660 -aI333 -aI-702 -aa(lp16532 -g15 -aI312 -aI-888 -aI333 -aI-826 -aI326 -aI-868 -aa(lp16533 -g15 -aI266 -aI-912 -aI301 -aI-904 -aI286 -aI-912 -aa(lp16534 -g15 -aI222 -aI-889 -aI247 -aI-912 -aI232 -aI-905 -aa(lp16535 -g15 -aI200 -aI-764 -aI207 -aI-868 -aI200 -aI-826 -aa(lp16536 -g10 -aa(lp16537 -g8 -aI406 -aI-7 -aa(lp16538 -g20 -aI270 -aI-7 -aa(lp16539 -g20 -aI779 -aI-1015 -aa(lp16540 -g20 -aI910 -aI-1015 -aa(lp16541 -g10 -aa(lp16542 -g8 -aI701 -aI-258 -aa(lp16543 -g15 -aI758 -aI-448 -aI701 -aI-344 -aI720 -aI-407 -aa(lp16544 -g15 -aI912 -aI-510 -aI795 -aI-489 -aI847 -aI-510 -aa(lp16545 -g15 -aI1066 -aI-448 -aI977 -aI-510 -aI1029 -aI-489 -aa(lp16546 -g15 -aI1123 -aI-258 -aI1104 -aI-407 -aI1123 -aI-344 -aa(lp16547 -g15 -aI1066 -aI-67 -aI1123 -aI-172 -aI1104 -aI-109 -aa(lp16548 -g15 -aI914 -aI-6 -aI1029 -aI-26 -aI978 -aI-6 -aa(lp16549 -g15 -aI758 -aI-67 -aI847 -aI-6 -aI795 -aI-26 -aa(lp16550 -g15 -aI701 -aI-258 -aI720 -aI-109 -aI701 -aI-172 -aa(lp16551 -g10 -aa(lp16552 -g8 -aI844 -aI-259 -aa(lp16553 -g15 -aI865 -aI-134 -aI844 -aI-197 -aI851 -aI-155 -aa(lp16554 -g15 -aI910 -aI-110 -aI876 -aI-118 -aI891 -aI-110 -aa(lp16555 -g15 -aI955 -aI-134 -aI930 -aI-110 -aI945 -aI-118 -aa(lp16556 -g15 -aI977 -aI-259 -aI970 -aI-155 -aI977 -aI-197 -aa(lp16557 -g15 -aI956 -aI-384 -aI977 -aI-321 -aI970 -aI-363 -aa(lp16558 -g15 -aI910 -aI-407 -aI945 -aI-399 -aI930 -aI-407 -aa(lp16559 -g15 -aI865 -aI-384 -aI891 -aI-407 -aI876 -aI-399 -aa(lp16560 -g15 -aI844 -aI-259 -aI851 -aI-363 -aI844 -aI-321 -aa(lp16561 -g10 -aa(lp16562 -g8 -aI1185 -aI-44 -aa(lp16563 -g10 -aa(lp16564 -g8 -aI1185 -aI-44 -aasV) -(lp16565 -(lp16566 -g8 -aI44 -aI236 -aa(lp16567 -g15 -aI121 -aI58 -aI80 -aI158 -aI106 -aI99 -aa(lp16568 -g15 -aI162 -aI-84 -aI135 -aI17 -aI149 -aI-30 -aa(lp16569 -g15 -aI190 -aI-237 -aI174 -aI-137 -aI184 -aI-189 -aa(lp16570 -g15 -aI199 -aI-386 -aI196 -aI-285 -aI199 -aI-335 -aa(lp16571 -g15 -aI166 -aI-679 -aI199 -aI-489 -aI188 -aI-587 -aa(lp16572 -g15 -aI43 -aI-1015 -aI143 -aI-771 -aI103 -aI-883 -aa(lp16573 -g20 -aI167 -aI-1015 -aa(lp16574 -g15 -aI320 -aI-718 -aI233 -aI-921 -aI284 -aI-822 -aa(lp16575 -g15 -aI375 -aI-399 -aI356 -aI-613 -aI375 -aI-507 -aa(lp16576 -g15 -aI332 -aI-108 -aI375 -aI-309 -aI360 -aI-211 -aa(lp16577 -g15 -aI171 -aI236 -aI299 -aI8 -aI245 -aI122 -aa(lp16578 -g10 -aa(lp16579 -g8 -aI444 -aI-44 -aa(lp16580 -g10 -aa(lp16581 -g8 -aI444 -aI-44 -aasV- -(lp16582 -(lp16583 -g8 -aI42 -aI-299 -aa(lp16584 -g20 -aI42 -aI-481 -aa(lp16585 -g20 -aI401 -aI-481 -aa(lp16586 -g20 -aI401 -aI-299 -aa(lp16587 -g10 -aa(lp16588 -g8 -aI444 -aI-44 -aa(lp16589 -g10 -aa(lp16590 -g8 -aI444 -aI-44 -aasV1 -(lp16591 -(lp16592 -g8 -aI524 -aI-44 -aa(lp16593 -g20 -aI341 -aI-44 -aa(lp16594 -g20 -aI341 -aI-733 -aa(lp16595 -g15 -aI105 -aI-595 -aI274 -aI-671 -aI196 -aI-625 -aa(lp16596 -g20 -aI105 -aI-761 -aa(lp16597 -g15 -aI261 -aI-850 -aI153 -aI-776 -aI205 -aI-806 -aa(lp16598 -g15 -aI376 -aI-1002 -aI317 -aI-893 -aI355 -aI-944 -aa(lp16599 -g20 -aI524 -aI-1002 -aa(lp16600 -g10 -aa(lp16601 -g8 -aI741 -aI-44 -aa(lp16602 -g10 -aa(lp16603 -g8 -aI741 -aI-44 -aasV5 -(lp16604 -(lp16605 -g8 -aI59 -aI-289 -aa(lp16606 -g20 -aI241 -aI-308 -aa(lp16607 -g15 -aI287 -aI-210 -aI246 -aI-267 -aI262 -aI-234 -aa(lp16608 -g15 -aI376 -aI-174 -aI313 -aI-186 -aI342 -aI-174 -aa(lp16609 -g15 -aI473 -aI-221 -aI414 -aI-174 -aI446 -aI-190 -aa(lp16610 -g15 -aI513 -aI-361 -aI499 -aI-252 -aI513 -aI-299 -aa(lp16611 -g15 -aI473 -aI-493 -aI513 -aI-420 -aI499 -aI-464 -aa(lp16612 -g15 -aI371 -aI-537 -aI447 -aI-522 -aI413 -aI-537 -aa(lp16613 -g15 -aI229 -aI-467 -aI318 -aI-537 -aI271 -aI-514 -aa(lp16614 -g20 -aI81 -aI-489 -aa(lp16615 -g20 -aI175 -aI-985 -aa(lp16616 -g20 -aI658 -aI-985 -aa(lp16617 -g20 -aI658 -aI-814 -aa(lp16618 -g20 -aI313 -aI-814 -aa(lp16619 -g20 -aI285 -aI-652 -aa(lp16620 -g15 -aI410 -aI-683 -aI325 -aI-672 -aI367 -aI-683 -aa(lp16621 -g15 -aI616 -aI-594 -aI491 -aI-683 -aI560 -aI-653 -aa(lp16622 -g15 -aI701 -aI-364 -aI672 -aI-535 -aI701 -aI-458 -aa(lp16623 -g15 -aI632 -aI-154 -aI701 -aI-286 -aI678 -aI-216 -aa(lp16624 -g15 -aI374 -aI-28 -aI570 -aI-70 -aI484 -aI-28 -aa(lp16625 -g15 -aI158 -aI-99 -aI286 -aI-28 -aI214 -aI-51 -aa(lp16626 -g15 -aI59 -aI-289 -aI103 -aI-146 -aI70 -aI-210 -aa(lp16627 -g10 -aa(lp16628 -g8 -aI741 -aI-44 -aa(lp16629 -g10 -aa(lp16630 -g8 -aI741 -aI-44 -aasV9 -(lp16631 -(lp16632 -g8 -aI60 -aI-265 -aa(lp16633 -g20 -aI237 -aI-284 -aa(lp16634 -g15 -aI271 -aI-204 -aI241 -aI-248 -aI253 -aI-221 -aa(lp16635 -g15 -aI343 -aI-178 -aI289 -aI-187 -aI313 -aI-178 -aa(lp16636 -g15 -aI440 -aI-230 -aI381 -aI-178 -aI413 -aI-195 -aa(lp16637 -g15 -aI490 -aI-446 -aI466 -aI-265 -aI483 -aI-337 -aa(lp16638 -g15 -aI318 -aI-366 -aI444 -aI-393 -aI387 -aI-366 -aa(lp16639 -g15 -aI124 -aI-453 -aI243 -aI-366 -aI178 -aI-395 -aa(lp16640 -g15 -aI42 -aI-679 -aI69 -aI-511 -aI42 -aI-586 -aa(lp16641 -g15 -aI128 -aI-913 -aI42 -aI-776 -aI71 -aI-854 -aa(lp16642 -g15 -aI348 -aI-1002 -aI186 -aI-973 -aI259 -aI-1002 -aa(lp16643 -g15 -aI586 -aI-890 -aI445 -aI-1002 -aI524 -aI-965 -aa(lp16644 -g15 -aI679 -aI-521 -aI648 -aI-815 -aI679 -aI-692 -aa(lp16645 -g15 -aI582 -aI-143 -aI679 -aI-346 -aI647 -aI-220 -aa(lp16646 -g15 -aI330 -aI-27 -aI518 -aI-66 -aI433 -aI-27 -aa(lp16647 -g15 -aI149 -aI-87 -aI255 -aI-27 -aI195 -aI-47 -aa(lp16648 -g15 -aI60 -aI-265 -aI103 -aI-126 -aI73 -aI-186 -aa(lp16649 -g10 -aa(lp16650 -g8 -aI474 -aI-664 -aa(lp16651 -g15 -aI433 -aI-802 -aI474 -aI-723 -aI461 -aI-769 -aa(lp16652 -g15 -aI339 -aI-851 -aI406 -aI-834 -aI375 -aI-851 -aa(lp16653 -g15 -aI255 -aI-811 -aI305 -aI-851 -aI277 -aI-837 -aa(lp16654 -g15 -aI222 -aI-679 -aI233 -aI-784 -aI222 -aI-740 -aa(lp16655 -g15 -aI258 -aI-544 -aI222 -aI-618 -aI234 -aI-572 -aa(lp16656 -g15 -aI349 -aI-500 -aI282 -aI-515 -aI313 -aI-500 -aa(lp16657 -g15 -aI438 -aI-542 -aI384 -aI-500 -aI414 -aI-514 -aa(lp16658 -g15 -aI474 -aI-664 -aI462 -aI-570 -aI474 -aI-611 -aa(lp16659 -g10 -aa(lp16660 -g8 -aI741 -aI-44 -aa(lp16661 -g10 -aa(lp16662 -g8 -aI741 -aI-44 -aasV= -(lp16663 -(lp16664 -g8 -aI55 -aI-575 -aa(lp16665 -g20 -aI55 -aI-743 -aa(lp16666 -g20 -aI722 -aI-743 -aa(lp16667 -g20 -aI722 -aI-575 -aa(lp16668 -g10 -aa(lp16669 -g8 -aI55 -aI-286 -aa(lp16670 -g20 -aI55 -aI-455 -aa(lp16671 -g20 -aI722 -aI-455 -aa(lp16672 -g20 -aI722 -aI-286 -aa(lp16673 -g10 -aa(lp16674 -g8 -aI778 -aI-44 -aa(lp16675 -g10 -aa(lp16676 -g8 -aI778 -aI-44 -aasVA -(lp16677 -(lp16678 -g8 -aI957 -aI-44 -aa(lp16679 -g20 -aI748 -aI-44 -aa(lp16680 -g20 -aI664 -aI-261 -aa(lp16681 -g20 -aI283 -aI-261 -aa(lp16682 -g20 -aI204 -aI-44 -aa(lp16683 -g20 -aI0 -aI-44 -aa(lp16684 -g20 -aI371 -aI-998 -aa(lp16685 -g20 -aI575 -aI-998 -aa(lp16686 -g10 -aa(lp16687 -g8 -aI602 -aI-422 -aa(lp16688 -g20 -aI471 -aI-776 -aa(lp16689 -g20 -aI342 -aI-422 -aa(lp16690 -g10 -aa(lp16691 -g8 -aI962 -aI-44 -aa(lp16692 -g10 -aa(lp16693 -g8 -aI962 -aI-44 -aasVE -(lp16694 -(lp16695 -g8 -aI97 -aI-44 -aa(lp16696 -g20 -aI97 -aI-998 -aa(lp16697 -g20 -aI804 -aI-998 -aa(lp16698 -g20 -aI804 -aI-837 -aa(lp16699 -g20 -aI289 -aI-837 -aa(lp16700 -g20 -aI289 -aI-625 -aa(lp16701 -g20 -aI768 -aI-625 -aa(lp16702 -g20 -aI768 -aI-465 -aa(lp16703 -g20 -aI289 -aI-465 -aa(lp16704 -g20 -aI289 -aI-205 -aa(lp16705 -g20 -aI822 -aI-205 -aa(lp16706 -g20 -aI822 -aI-44 -aa(lp16707 -g10 -aa(lp16708 -g8 -aI889 -aI-44 -aa(lp16709 -g10 -aa(lp16710 -g8 -aI889 -aI-44 -aasVI -(lp16711 -(lp16712 -g8 -aI91 -aI-44 -aa(lp16713 -g20 -aI91 -aI-998 -aa(lp16714 -g20 -aI283 -aI-998 -aa(lp16715 -g20 -aI283 -aI-44 -aa(lp16716 -g10 -aa(lp16717 -g8 -aI370 -aI-44 -aa(lp16718 -g10 -aa(lp16719 -g8 -aI370 -aI-44 -aasVM -(lp16720 -(lp16721 -g8 -aI94 -aI-44 -aa(lp16722 -g20 -aI94 -aI-998 -aa(lp16723 -g20 -aI382 -aI-998 -aa(lp16724 -g20 -aI555 -aI-347 -aa(lp16725 -g20 -aI727 -aI-998 -aa(lp16726 -g20 -aI1016 -aI-998 -aa(lp16727 -g20 -aI1016 -aI-44 -aa(lp16728 -g20 -aI837 -aI-44 -aa(lp16729 -g20 -aI837 -aI-795 -aa(lp16730 -g20 -aI647 -aI-44 -aa(lp16731 -g20 -aI462 -aI-44 -aa(lp16732 -g20 -aI273 -aI-795 -aa(lp16733 -g20 -aI273 -aI-44 -aa(lp16734 -g10 -aa(lp16735 -g8 -aI1110 -aI-44 -aa(lp16736 -g10 -aa(lp16737 -g8 -aI1110 -aI-44 -aasVQ -(lp16738 -(lp16739 -g8 -aI865 -aI-165 -aa(lp16740 -g15 -aI1019 -aI-84 -aI912 -aI-131 -aI963 -aI-104 -aa(lp16741 -g20 -aI948 -aI51 -aa(lp16742 -g15 -aI863 -aI15 -aI919 -aI42 -aI891 -aI30 -aa(lp16743 -g15 -aI735 -aI-69 -aI857 -aI12 -aI814 -aI-15 -aa(lp16744 -g15 -aI527 -aI-28 -aI672 -aI-41 -aI603 -aI-28 -aa(lp16745 -g15 -aI182 -aI-157 -aI380 -aI-28 -aI265 -aI-71 -aa(lp16746 -g15 -aI57 -aI-521 -aI99 -aI-244 -aI57 -aI-365 -aa(lp16747 -g15 -aI182 -aI-885 -aI57 -aI-677 -aI99 -aI-798 -aa(lp16748 -g15 -aI522 -aI-1015 -aI266 -aI-971 -aI379 -aI-1015 -aa(lp16749 -g15 -aI858 -aI-885 -aI663 -aI-1015 -aI775 -aI-971 -aa(lp16750 -g15 -aI983 -aI-521 -aI941 -aI-798 -aI983 -aI-677 -aa(lp16751 -g15 -aI948 -aI-304 -aI983 -aI-439 -aI971 -aI-366 -aa(lp16752 -g15 -aI865 -aI-165 -aI931 -aI-256 -aI903 -aI-210 -aa(lp16753 -g10 -aa(lp16754 -g8 -aI710 -aI-274 -aa(lp16755 -g15 -aI765 -aI-379 -aI735 -aI-303 -aI753 -aI-338 -aa(lp16756 -g15 -aI784 -aI-521 -aI778 -aI-420 -aI784 -aI-468 -aa(lp16757 -g15 -aI711 -aI-768 -aI784 -aI-631 -aI760 -aI-714 -aa(lp16758 -g15 -aI520 -aI-850 -aI662 -aI-823 -aI599 -aI-850 -aa(lp16759 -g15 -aI329 -aI-768 -aI442 -aI-850 -aI378 -aI-823 -aa(lp16760 -g15 -aI256 -aI-521 -aI280 -aI-713 -aI256 -aI-631 -aa(lp16761 -g15 -aI329 -aI-271 -aI256 -aI-410 -aI280 -aI-326 -aa(lp16762 -g15 -aI514 -aI-188 -aI378 -aI-215 -aI440 -aI-188 -aa(lp16763 -g15 -aI593 -aI-202 -aI542 -aI-188 -aI569 -aI-192 -aa(lp16764 -g15 -aI474 -aI-261 -aI554 -aI-227 -aI514 -aI-247 -aa(lp16765 -g20 -aI528 -aI-371 -aa(lp16766 -g15 -aI710 -aI-274 -aI592 -aI-350 -aI652 -aI-317 -aa(lp16767 -g10 -aa(lp16768 -g8 -aI1037 -aI-44 -aa(lp16769 -g10 -aa(lp16770 -g8 -aI1037 -aI-44 -aasVU -(lp16771 -(lp16772 -g8 -aI95 -aI-998 -aa(lp16773 -g20 -aI288 -aI-998 -aa(lp16774 -g20 -aI288 -aI-481 -aa(lp16775 -g15 -aI295 -aI-322 -aI288 -aI-399 -aI290 -aI-346 -aa(lp16776 -g15 -aI354 -aI-228 -aI303 -aI-283 -aI323 -aI-252 -aa(lp16777 -g15 -aI481 -aI-192 -aI385 -aI-204 -aI427 -aI-192 -aa(lp16778 -g15 -aI605 -aI-226 -aI536 -aI-192 -aI577 -aI-204 -aa(lp16779 -g15 -aI655 -aI-308 -aI633 -aI-248 -aI649 -aI-276 -aa(lp16780 -g15 -aI664 -aI-470 -aI661 -aI-341 -aI664 -aI-395 -aa(lp16781 -g20 -aI664 -aI-998 -aa(lp16782 -g20 -aI856 -aI-998 -aa(lp16783 -g20 -aI856 -aI-497 -aa(lp16784 -g15 -aI841 -aI-254 -aI856 -aI-382 -aI851 -aI-302 -aa(lp16785 -g15 -aI783 -aI-134 -aI830 -aI-207 -aI811 -aI-167 -aa(lp16786 -g15 -aI671 -aI-57 -aI755 -aI-102 -aI718 -aI-76 -aa(lp16787 -g15 -aI487 -aI-28 -aI624 -aI-37 -aI563 -aI-28 -aa(lp16788 -g15 -aI280 -aI-59 -aI396 -aI-28 -aI327 -aI-38 -aa(lp16789 -g15 -aI168 -aI-141 -aI233 -aI-80 -aI195 -aI-108 -aa(lp16790 -g15 -aI114 -aI-247 -aI141 -aI-175 -aI123 -aI-210 -aa(lp16791 -g15 -aI95 -aI-489 -aI101 -aI-302 -aI95 -aI-382 -aa(lp16792 -g10 -aa(lp16793 -g8 -aI962 -aI-44 -aa(lp16794 -g10 -aa(lp16795 -g8 -aI962 -aI-44 -aasVY -(lp16796 -(lp16797 -g8 -aI347 -aI-44 -aa(lp16798 -g20 -aI347 -aI-446 -aa(lp16799 -g20 -aI-1 -aI-998 -aa(lp16800 -g20 -aI223 -aI-998 -aa(lp16801 -g20 -aI448 -aI-621 -aa(lp16802 -g20 -aI668 -aI-998 -aa(lp16803 -g20 -aI890 -aI-998 -aa(lp16804 -g20 -aI539 -aI-444 -aa(lp16805 -g20 -aI539 -aI-44 -aa(lp16806 -g10 -aa(lp16807 -g8 -aI889 -aI-44 -aa(lp16808 -g10 -aa(lp16809 -g8 -aI889 -aI-44 -aasV] -(lp16810 -(lp16811 -g8 -aI348 -aI-998 -aa(lp16812 -g20 -aI348 -aI224 -aa(lp16813 -g20 -aI24 -aI224 -aa(lp16814 -g20 -aI24 -aI80 -aa(lp16815 -g20 -aI175 -aI80 -aa(lp16816 -g20 -aI175 -aI-856 -aa(lp16817 -g20 -aI24 -aI-856 -aa(lp16818 -g20 -aI24 -aI-998 -aa(lp16819 -g10 -aa(lp16820 -g8 -aI444 -aI-44 -aa(lp16821 -g10 -aa(lp16822 -g8 -aI444 -aI-44 -aasVa -(lp16823 -(lp16824 -g8 -aI232 -aI-524 -aa(lp16825 -g20 -aI66 -aI-554 -aa(lp16826 -g15 -aI162 -aI-703 -aI85 -aI-621 -aI117 -aI-671 -aa(lp16827 -g15 -aI365 -aI-751 -aI208 -aI-735 -aI276 -aI-751 -aa(lp16828 -g15 -aI548 -aI-722 -aI447 -aI-751 -aI508 -aI-741 -aa(lp16829 -g15 -aI632 -aI-648 -aI588 -aI-703 -aI616 -aI-678 -aa(lp16830 -g15 -aI656 -aI-485 -aI648 -aI-619 -aI656 -aI-564 -aa(lp16831 -g20 -aI654 -aI-271 -aa(lp16832 -g15 -aI663 -aI-137 -aI654 -aI-210 -aI657 -aI-166 -aa(lp16833 -g15 -aI696 -aI-44 -aI669 -aI-108 -aI680 -aI-77 -aa(lp16834 -g20 -aI515 -aI-44 -aa(lp16835 -g15 -aI498 -aI-98 -aI510 -aI-56 -aI504 -aI-74 -aa(lp16836 -g15 -aI491 -aI-119 -aI495 -aI-109 -aI492 -aI-116 -aa(lp16837 -g15 -aI391 -aI-51 -aI460 -aI-89 -aI426 -aI-66 -aa(lp16838 -g15 -aI277 -aI-28 -aI355 -aI-36 -aI317 -aI-28 -aa(lp16839 -g15 -aI109 -aI-86 -aI206 -aI-28 -aI150 -aI-48 -aa(lp16840 -g15 -aI47 -aI-233 -aI68 -aI-125 -aI47 -aI-174 -aa(lp16841 -g15 -aI75 -aI-337 -aI47 -aI-272 -aI56 -aI-307 -aa(lp16842 -g15 -aI153 -aI-408 -aI94 -aI-368 -aI120 -aI-391 -aa(lp16843 -g15 -aI299 -aI-450 -aI187 -aI-424 -aI236 -aI-438 -aa(lp16844 -g15 -aI477 -aI-495 -aI384 -aI-466 -aI444 -aI-481 -aa(lp16845 -g20 -aI477 -aI-513 -aa(lp16846 -g15 -aI451 -aI-589 -aI477 -aI-549 -aI468 -aI-574 -aa(lp16847 -g15 -aI352 -aI-611 -aI433 -aI-604 -aI401 -aI-611 -aa(lp16848 -g15 -aI276 -aI-592 -aI320 -aI-611 -aI294 -aI-605 -aa(lp16849 -g15 -aI232 -aI-524 -aI258 -aI-579 -aI243 -aI-557 -aa(lp16850 -g10 -aa(lp16851 -g8 -aI477 -aI-376 -aa(lp16852 -g15 -aI365 -aI-348 -aI453 -aI-368 -aI416 -aI-359 -aa(lp16853 -g15 -aI266 -aI-316 -aI315 -aI-337 -aI281 -aI-327 -aa(lp16854 -g15 -aI230 -aI-252 -aI242 -aI-299 -aI230 -aI-278 -aa(lp16855 -g15 -aI259 -aI-185 -aI230 -aI-226 -aI240 -aI-204 -aa(lp16856 -g15 -aI332 -aI-157 -aI278 -aI-167 -aI302 -aI-157 -aa(lp16857 -g15 -aI426 -aI-190 -aI365 -aI-157 -aI396 -aI-168 -aa(lp16858 -g15 -aI470 -aI-250 -aI448 -aI-206 -aI463 -aI-226 -aa(lp16859 -g15 -aI477 -aI-340 -aI474 -aI-266 -aI477 -aI-296 -aa(lp16860 -g10 -aa(lp16861 -g8 -aI741 -aI-44 -aa(lp16862 -g10 -aa(lp16863 -g8 -aI741 -aI-44 -aasVe -(lp16864 -(lp16865 -g8 -aI496 -aI-264 -aa(lp16866 -g20 -aI678 -aI-233 -aa(lp16867 -g15 -aI567 -aI-81 -aI654 -aI-167 -aI617 -aI-116 -aa(lp16868 -g15 -aI377 -aI-28 -aI516 -aI-46 -aI453 -aI-28 -aa(lp16869 -g15 -aI110 -aI-146 -aI257 -aI-28 -aI168 -aI-68 -aa(lp16870 -g15 -aI42 -aI-384 -aI65 -aI-209 -aI42 -aI-289 -aa(lp16871 -g15 -aI132 -aI-654 -aI42 -aI-499 -aI72 -aI-589 -aa(lp16872 -g15 -aI359 -aI-751 -aI192 -aI-719 -aI267 -aI-751 -aa(lp16873 -g15 -aI602 -aI-649 -aI462 -aI-751 -aI543 -aI-717 -aa(lp16874 -g15 -aI688 -aI-337 -aI662 -aI-581 -aI690 -aI-477 -aa(lp16875 -g20 -aI229 -aI-337 -aa(lp16876 -g15 -aI274 -aI-210 -aI231 -aI-283 -aI245 -aI-240 -aa(lp16877 -g15 -aI379 -aI-165 -aI302 -aI-180 -aI337 -aI-165 -aa(lp16878 -g15 -aI451 -aI-188 -aI408 -aI-165 -aI432 -aI-173 -aa(lp16879 -g15 -aI496 -aI-264 -aI471 -aI-204 -aI486 -aI-229 -aa(lp16880 -g10 -aa(lp16881 -g8 -aI506 -aI-449 -aa(lp16882 -g15 -aI465 -aI-570 -aI505 -aI-502 -aI491 -aI-542 -aa(lp16883 -g15 -aI370 -aI-611 -aI439 -aI-597 -aI407 -aI-611 -aa(lp16884 -g15 -aI271 -aI-567 -aI330 -aI-611 -aI297 -aI-596 -aa(lp16885 -g15 -aI233 -aI-449 -aI245 -aI-538 -aI232 -aI-499 -aa(lp16886 -g10 -aa(lp16887 -g8 -aI741 -aI-44 -aa(lp16888 -g10 -aa(lp16889 -g8 -aI741 -aI-44 -aasVi -(lp16890 -(lp16891 -g8 -aI95 -aI-829 -aa(lp16892 -g20 -aI95 -aI-998 -aa(lp16893 -g20 -aI278 -aI-998 -aa(lp16894 -g20 -aI278 -aI-829 -aa(lp16895 -g10 -aa(lp16896 -g8 -aI95 -aI-44 -aa(lp16897 -g20 -aI95 -aI-735 -aa(lp16898 -g20 -aI278 -aI-735 -aa(lp16899 -g20 -aI278 -aI-44 -aa(lp16900 -g10 -aa(lp16901 -g8 -aI370 -aI-44 -aa(lp16902 -g10 -aa(lp16903 -g8 -aI370 -aI-44 -aasVm -(lp16904 -(lp16905 -g8 -aI82 -aI-735 -aa(lp16906 -g20 -aI250 -aI-735 -aa(lp16907 -g20 -aI250 -aI-641 -aa(lp16908 -g15 -aI466 -aI-751 -aI310 -aI-714 -aI382 -aI-751 -aa(lp16909 -g15 -aI581 -aI-724 -aI510 -aI-751 -aI548 -aI-742 -aa(lp16910 -g15 -aI661 -aI-641 -aI613 -aI-705 -aI640 -aI-678 -aa(lp16911 -g15 -aI759 -aI-724 -aI691 -aI-678 -aI724 -aI-705 -aa(lp16912 -g15 -aI872 -aI-751 -aI794 -aI-742 -aI832 -aI-751 -aa(lp16913 -g15 -aI1001 -aI-720 -aI923 -aI-751 -aI966 -aI-741 -aa(lp16914 -g15 -aI1080 -aI-629 -aI1036 -aI-699 -aI1062 -aI-669 -aa(lp16915 -g15 -aI1098 -aI-486 -aI1092 -aI-600 -aI1098 -aI-552 -aa(lp16916 -g20 -aI1098 -aI-44 -aa(lp16917 -g20 -aI916 -aI-44 -aa(lp16918 -g20 -aI916 -aI-439 -aa(lp16919 -g15 -aI897 -aI-572 -aI916 -aI-508 -aI909 -aI-552 -aa(lp16920 -g15 -aI819 -aI-611 -aI880 -aI-598 -aI854 -aI-611 -aa(lp16921 -g15 -aI746 -aI-588 -aI793 -aI-611 -aI769 -aI-603 -aa(lp16922 -g15 -aI697 -aI-519 -aI724 -aI-572 -aI707 -aI-549 -aa(lp16923 -g15 -aI682 -aI-376 -aI687 -aI-489 -aI682 -aI-441 -aa(lp16924 -g20 -aI682 -aI-44 -aa(lp16925 -g20 -aI500 -aI-44 -aa(lp16926 -g20 -aI500 -aI-423 -aa(lp16927 -g15 -aI490 -aI-553 -aI500 -aI-490 -aI496 -aI-534 -aa(lp16928 -g15 -aI459 -aI-597 -aI483 -aI-573 -aI473 -aI-587 -aa(lp16929 -g15 -aI404 -aI-611 -aI446 -aI-606 -aI427 -aI-611 -aa(lp16930 -g15 -aI328 -aI-588 -aI376 -aI-611 -aI350 -aI-603 -aa(lp16931 -g15 -aI279 -aI-522 -aI305 -aI-573 -aI289 -aI-551 -aa(lp16932 -g15 -aI264 -aI-380 -aI269 -aI-494 -aI264 -aI-446 -aa(lp16933 -g20 -aI264 -aI-44 -aa(lp16934 -g20 -aI82 -aI-44 -aa(lp16935 -g10 -aa(lp16936 -g8 -aI1185 -aI-44 -aa(lp16937 -g10 -aa(lp16938 -g8 -aI1185 -aI-44 -aasVq -(lp16939 -(lp16940 -g8 -aI547 -aI218 -aa(lp16941 -g20 -aI547 -aI-129 -aa(lp16942 -g15 -aI458 -aI-55 -aI523 -aI-98 -aI493 -aI-73 -aa(lp16943 -g15 -aI343 -aI-28 -aI422 -aI-37 -aI384 -aI-28 -aa(lp16944 -g15 -aI149 -aI-117 -aI264 -aI-28 -aI199 -aI-58 -aa(lp16945 -g15 -aI59 -aI-397 -aI89 -aI-186 -aI59 -aI-279 -aa(lp16946 -g15 -aI143 -aI-658 -aI59 -aI-509 -aI87 -aI-595 -aa(lp16947 -g15 -aI352 -aI-751 -aI199 -aI-720 -aI269 -aI-751 -aa(lp16948 -g15 -aI472 -aI-722 -aI398 -aI-751 -aI438 -aI-741 -aa(lp16949 -g15 -aI561 -aI-633 -aI505 -aI-702 -aI535 -aI-673 -aa(lp16950 -g20 -aI561 -aI-735 -aa(lp16951 -g20 -aI730 -aI-735 -aa(lp16952 -g20 -aI730 -aI218 -aa(lp16953 -g10 -aa(lp16954 -g8 -aI553 -aI-398 -aa(lp16955 -g15 -aI510 -aI-556 -aI553 -aI-469 -aI538 -aI-521 -aa(lp16956 -g15 -aI401 -aI-608 -aI481 -aI-590 -aI445 -aI-608 -aa(lp16957 -g15 -aI290 -aI-555 -aI357 -aI-608 -aI320 -aI-590 -aa(lp16958 -g15 -aI246 -aI-388 -aI260 -aI-520 -aI246 -aI-464 -aa(lp16959 -g15 -aI289 -aI-223 -aI246 -aI-312 -aI260 -aI-257 -aa(lp16960 -g15 -aI395 -aI-173 -aI317 -aI-190 -aI353 -aI-173 -aa(lp16961 -g15 -aI505 -aI-229 -aI437 -aI-173 -aI474 -aI-192 -aa(lp16962 -g15 -aI553 -aI-398 -aI537 -aI-267 -aI553 -aI-323 -aa(lp16963 -g10 -aa(lp16964 -g8 -aI814 -aI-44 -aa(lp16965 -g10 -aa(lp16966 -g8 -aI814 -aI-44 -aasVu -(lp16967 -(lp16968 -g8 -aI550 -aI-44 -aa(lp16969 -g20 -aI550 -aI-147 -aa(lp16970 -g15 -aI451 -aI-60 -aI525 -aI-111 -aI492 -aI-81 -aa(lp16971 -g15 -aI321 -aI-28 -aI410 -aI-39 -aI367 -aI-28 -aa(lp16972 -g15 -aI196 -aI-59 -aI275 -aI-28 -aI233 -aI-39 -aa(lp16973 -g15 -aI116 -aI-145 -aI159 -aI-79 -aI133 -aI-108 -aa(lp16974 -g15 -aI91 -aI-298 -aI100 -aI-182 -aI91 -aI-233 -aa(lp16975 -g20 -aI91 -aI-735 -aa(lp16976 -g20 -aI274 -aI-735 -aa(lp16977 -g20 -aI274 -aI-418 -aa(lp16978 -g15 -aI284 -aI-239 -aI274 -aI-320 -aI278 -aI-261 -aa(lp16979 -g15 -aI321 -aI-187 -aI291 -aI-217 -aI303 -aI-200 -aa(lp16980 -g15 -aI389 -aI-168 -aI339 -aI-174 -aI361 -aI-168 -aa(lp16981 -g15 -aI473 -aI-193 -aI420 -aI-168 -aI448 -aI-176 -aa(lp16982 -g15 -aI524 -aI-257 -aI498 -aI-211 -aI514 -aI-232 -aa(lp16983 -g15 -aI537 -aI-444 -aI533 -aI-283 -aI537 -aI-345 -aa(lp16984 -g20 -aI537 -aI-735 -aa(lp16985 -g20 -aI720 -aI-735 -aa(lp16986 -g20 -aI720 -aI-44 -aa(lp16987 -g10 -aa(lp16988 -g8 -aI814 -aI-44 -aa(lp16989 -g10 -aa(lp16990 -g8 -aI814 -aI-44 -aasVy -(lp16991 -(lp16992 -g8 -aI9 -aI-735 -aa(lp16993 -g20 -aI203 -aI-735 -aa(lp16994 -g20 -aI369 -aI-244 -aa(lp16995 -g20 -aI530 -aI-735 -aa(lp16996 -g20 -aI720 -aI-735 -aa(lp16997 -g20 -aI475 -aI-70 -aa(lp16998 -g20 -aI432 -aI49 -aa(lp16999 -g15 -aI386 -aI142 -aI416 -aI90 -aI400 -aI121 -aa(lp17000 -g15 -aI336 -aI194 -aI371 -aI163 -aI355 -aI180 -aa(lp17001 -g15 -aI266 -aI225 -aI317 -aI207 -aI294 -aI217 -aa(lp17002 -g15 -aI173 -aI236 -aI239 -aI232 -aI207 -aI236 -aa(lp17003 -g15 -aI69 -aI225 -aI138 -aI236 -aI103 -aI232 -aa(lp17004 -g20 -aI53 -aI81 -aa(lp17005 -g15 -aI130 -aI90 -aI82 -aI87 -aI107 -aI90 -aa(lp17006 -g15 -aI225 -aI52 -aI173 -aI90 -aI204 -aI77 -aa(lp17007 -g15 -aI272 -aI-42 -aI245 -aI27 -aI261 -aI-3 -aa(lp17008 -g10 -aa(lp17009 -g8 -aI741 -aI-44 -aa(lp17010 -g10 -aa(lp17011 -g8 -aI741 -aI-44 -aasV} -(lp17012 -(lp17013 -g8 -aI474 -aI-311 -aa(lp17014 -g15 -aI402 -aI-297 -aI442 -aI-309 -aI419 -aI-304 -aa(lp17015 -g15 -aI361 -aI-257 -aI386 -aI-289 -aI373 -aI-276 -aa(lp17016 -g15 -aI337 -aI-188 -aI350 -aI-239 -aI342 -aI-216 -aa(lp17017 -g15 -aI332 -aI-80 -aI333 -aI-167 -aI332 -aI-131 -aa(lp17018 -g15 -aI320 -aI96 -aI332 -aI3 -aI328 -aI62 -aa(lp17019 -g15 -aI278 -aI176 -aI313 -aI129 -aI299 -aI156 -aa(lp17020 -g15 -aI188 -aI224 -aI258 -aI196 -aI228 -aI212 -aa(lp17021 -g15 -aI63 -aI236 -aI162 -aI232 -aI120 -aI236 -aa(lp17022 -g20 -aI29 -aI236 -aa(lp17023 -g20 -aI29 -aI79 -aa(lp17024 -g15 -aI120 -aI71 -aI75 -aI79 -aI106 -aI76 -aa(lp17025 -g15 -aI152 -aI45 -aI134 -aI65 -aI145 -aI56 -aa(lp17026 -g15 -aI162 -aI-10 -aI158 -aI34 -aI162 -aI15 -aa(lp17027 -g15 -aI167 -aI-162 -aI162 -aI-37 -aI164 -aI-87 -aa(lp17028 -g15 -aI185 -aI-270 -aI170 -aI-207 -aI175 -aI-243 -aa(lp17029 -g15 -aI223 -aI-339 -aI195 -aI-297 -aI207 -aI-320 -aa(lp17030 -g15 -aI284 -aI-389 -aI239 -aI-358 -aI259 -aI-375 -aa(lp17031 -g15 -aI214 -aI-450 -aI252 -aI-410 -aI228 -aI-430 -aa(lp17032 -g15 -aI172 -aI-560 -aI193 -aI-479 -aI179 -aI-515 -aa(lp17033 -g15 -aI162 -aI-760 -aI167 -aI-590 -aI164 -aI-657 -aa(lp17034 -g15 -aI153 -aI-825 -aI161 -aI-793 -aI158 -aI-814 -aa(lp17035 -g15 -aI124 -aI-850 -aI147 -aI-836 -aI138 -aI-844 -aa(lp17036 -g15 -aI29 -aI-859 -aI109 -aI-856 -aI78 -aI-859 -aa(lp17037 -g20 -aI29 -aI-1015 -aa(lp17038 -g20 -aI63 -aI-1015 -aa(lp17039 -g15 -aI198 -aI-1001 -aI122 -aI-1015 -aI167 -aI-1010 -aa(lp17040 -g15 -aI277 -aI-954 -aI229 -aI-992 -aI256 -aI-976 -aa(lp17041 -g15 -aI320 -aI-874 -aI298 -aI-933 -aI313 -aI-906 -aa(lp17042 -g15 -aI332 -aI-723 -aI328 -aI-842 -aI332 -aI-792 -aa(lp17043 -g15 -aI341 -aI-567 -aI332 -aI-644 -aI335 -aI-592 -aa(lp17044 -g15 -aI385 -aI-493 -aI351 -aI-533 -aI365 -aI-508 -aa(lp17045 -g15 -aI474 -aI-467 -aI404 -aI-478 -aI434 -aI-469 -aa(lp17046 -g10 -aa(lp17047 -g8 -aI518 -aI-44 -aa(lp17048 -g10 -aa(lp17049 -g8 -aI518 -aI-44 -aassg10874 -(dp17050 -V -(lp17051 -(lp17052 -g8 -aI370 -aI-44 -aa(lp17053 -g10 -aa(lp17054 -g8 -aI370 -aI-44 -aasV$ -(lp17055 -(lp17056 -g8 -aI332 -aI92 -aa(lp17057 -g20 -aI332 -aI-24 -aa(lp17058 -g15 -aI189 -aI-63 -aI273 -aI-31 -aI225 -aI-44 -aa(lp17059 -g15 -aI94 -aI-155 -aI152 -aI-82 -aI120 -aI-113 -aa(lp17060 -g15 -aI47 -aI-309 -aI67 -aI-197 -aI51 -aI-248 -aa(lp17061 -g20 -aI165 -aI-331 -aa(lp17062 -g15 -aI213 -aI-192 -aI174 -aI-268 -aI190 -aI-222 -aa(lp17063 -g15 -aI332 -aI-123 -aI246 -aI-151 -aI286 -aI-127 -aa(lp17064 -g20 -aI332 -aI-496 -aa(lp17065 -g15 -aI184 -aI-552 -aI283 -aI-505 -aI234 -aI-524 -aa(lp17066 -g15 -aI97 -aI-638 -aI146 -aI-573 -aI118 -aI-601 -aa(lp17067 -g15 -aI67 -aI-764 -aI77 -aI-675 -aI67 -aI-717 -aa(lp17068 -g15 -aI156 -aI-966 -aI67 -aI-847 -aI97 -aI-915 -aa(lp17069 -g15 -aI332 -aI-1030 -aI195 -aI-1001 -aI254 -aI-1022 -aa(lp17070 -g20 -aI332 -aI-1086 -aa(lp17071 -g20 -aI401 -aI-1086 -aa(lp17072 -g20 -aI401 -aI-1030 -aa(lp17073 -g15 -aI563 -aI-970 -aI469 -aI-1024 -aI523 -aI-1004 -aa(lp17074 -g15 -aI655 -aI-795 -aI614 -aI-928 -aI645 -aI-869 -aa(lp17075 -g20 -aI534 -aI-777 -aa(lp17076 -g15 -aI491 -aI-883 -aI527 -aI-823 -aI513 -aI-858 -aa(lp17077 -g15 -aI401 -aI-931 -aI469 -aI-907 -aI439 -aI-924 -aa(lp17078 -g20 -aI401 -aI-593 -aa(lp17079 -g15 -aI518 -aI-559 -aI460 -aI-579 -aI499 -aI-567 -aa(lp17080 -g15 -aI607 -aI-500 -aI554 -aI-543 -aI584 -aI-523 -aa(lp17081 -g15 -aI660 -aI-418 -aI630 -aI-477 -aI648 -aI-450 -aa(lp17082 -g15 -aI679 -aI-315 -aI672 -aI-387 -aI679 -aI-352 -aa(lp17083 -g15 -aI601 -aI-112 -aI679 -aI-234 -aI653 -aI-167 -aa(lp17084 -g15 -aI401 -aI-25 -aI549 -aI-58 -aI483 -aI-29 -aa(lp17085 -g20 -aI401 -aI92 -aa(lp17086 -g10 -aa(lp17087 -g8 -aI332 -aI-933 -aa(lp17088 -g15 -aI224 -aI-878 -aI286 -aI-926 -aI250 -aI-907 -aa(lp17089 -g15 -aI184 -aI-773 -aI198 -aI-848 -aI184 -aI-813 -aa(lp17090 -g15 -aI218 -aI-673 -aI184 -aI-733 -aI196 -aI-700 -aa(lp17091 -g15 -aI332 -aI-608 -aI240 -aI-646 -aI278 -aI-624 -aa(lp17092 -g10 -aa(lp17093 -g8 -aI401 -aI-123 -aa(lp17094 -g15 -aI513 -aI-182 -aI446 -aI-128 -aI484 -aI-148 -aa(lp17095 -g15 -aI558 -aI-308 -aI543 -aI-216 -aI558 -aI-258 -aa(lp17096 -g15 -aI527 -aI-410 -aI558 -aI-350 -aI548 -aI-384 -aa(lp17097 -g15 -aI401 -aI-479 -aI505 -aI-436 -aI463 -aI-459 -aa(lp17098 -g10 -aa(lp17099 -g8 -aI741 -aI-44 -aa(lp17100 -g10 -aa(lp17101 -g8 -aI741 -aI-44 -aasV( -(lp17102 -(lp17103 -g8 -aI311 -aI236 -aa(lp17104 -g15 -aI147 -aI-50 -aI247 -aI154 -aI192 -aI59 -aa(lp17105 -g15 -aI80 -aI-390 -aI103 -aI-159 -aI80 -aI-272 -aa(lp17106 -g15 -aI130 -aI-687 -aI80 -aI-493 -aI97 -aI-592 -aa(lp17107 -g15 -aI311 -aI-1015 -aI169 -aI-796 -aI230 -aI-906 -aa(lp17108 -g20 -aI395 -aI-1015 -aa(lp17109 -g15 -aI291 -aI-821 -aI343 -aI-924 -aI308 -aI-860 -aa(lp17110 -g15 -aI229 -aI-634 -aI265 -aI-761 -aI244 -aI-699 -aa(lp17111 -g15 -aI201 -aI-389 -aI210 -aI-553 -aI201 -aI-471 -aa(lp17112 -g15 -aI395 -aI236 -aI201 -aI-180 -aI266 -aI27 -aa(lp17113 -g10 -aa(lp17114 -g8 -aI444 -aI-44 -aa(lp17115 -g10 -aa(lp17116 -g8 -aI444 -aI-44 -aasV, -(lp17117 -(lp17118 -g8 -aI118 -aI-44 -aa(lp17119 -g20 -aI118 -aI-177 -aa(lp17120 -g20 -aI251 -aI-177 -aa(lp17121 -g20 -aI251 -aI-44 -aa(lp17122 -g15 -aI225 -aI74 -aI251 -aI4 -aI243 -aI44 -aa(lp17123 -g15 -aI143 -aI144 -aI208 -aI104 -aI180 -aI127 -aa(lp17124 -g20 -aI110 -aI94 -aa(lp17125 -g15 -aI165 -aI46 -aI135 -aI83 -aI153 -aI67 -aa(lp17126 -g15 -aI184 -aI-44 -aI177 -aI25 -aI183 -aI-4 -aa(lp17127 -g10 -aa(lp17128 -g8 -aI370 -aI-44 -aa(lp17129 -g10 -aa(lp17130 -g8 -aI370 -aI-44 -aasV0 -(lp17131 -(lp17132 -g8 -aI55 -aI-515 -aa(lp17133 -g15 -aI90 -aI-787 -aI55 -aI-627 -aI66 -aI-718 -aa(lp17134 -g15 -aI193 -aI-946 -aI113 -aI-856 -aI147 -aI-909 -aa(lp17135 -g15 -aI366 -aI-1002 -aI239 -aI-984 -aI297 -aI-1002 -aa(lp17136 -g15 -aI501 -aI-971 -aI417 -aI-1002 -aI462 -aI-992 -aa(lp17137 -g15 -aI597 -aI-882 -aI539 -aI-951 -aI571 -aI-921 -aa(lp17138 -g15 -aI656 -aI-740 -aI622 -aI-843 -aI641 -aI-796 -aa(lp17139 -g15 -aI677 -aI-515 -aI670 -aI-684 -aI677 -aI-609 -aa(lp17140 -g15 -aI643 -aI-243 -aI677 -aI-403 -aI666 -aI-312 -aa(lp17141 -g15 -aI540 -aI-84 -aI620 -aI-175 -aI585 -aI-122 -aa(lp17142 -g15 -aI366 -aI-28 -aI494 -aI-46 -aI436 -aI-28 -aa(lp17143 -g15 -aI149 -aI-127 -aI274 -aI-28 -aI202 -aI-61 -aa(lp17144 -g15 -aI55 -aI-515 -aI86 -aI-206 -aI55 -aI-335 -aa(lp17145 -g10 -aa(lp17146 -g8 -aI175 -aI-515 -aa(lp17147 -g15 -aI230 -aI-202 -aI175 -aI-358 -aI194 -aI-254 -aa(lp17148 -g15 -aI366 -aI-124 -aI267 -aI-150 -aI312 -aI-124 -aa(lp17149 -g15 -aI502 -aI-202 -aI420 -aI-124 -aI465 -aI-150 -aa(lp17150 -g15 -aI557 -aI-515 -aI538 -aI-254 -aI557 -aI-358 -aa(lp17151 -g15 -aI502 -aI-828 -aI557 -aI-672 -aI538 -aI-776 -aa(lp17152 -g15 -aI365 -aI-905 -aI465 -aI-879 -aI419 -aI-905 -aa(lp17153 -g15 -aI236 -aI-837 -aI311 -aI-905 -aI268 -aI-882 -aa(lp17154 -g15 -aI175 -aI-515 -aI195 -aI-779 -aI175 -aI-671 -aa(lp17155 -g10 -aa(lp17156 -g8 -aI741 -aI-44 -aa(lp17157 -g10 -aa(lp17158 -g8 -aI741 -aI-44 -aasV4 -(lp17159 -(lp17160 -g8 -aI430 -aI-44 -aa(lp17161 -g20 -aI430 -aI-272 -aa(lp17162 -g20 -aI16 -aI-272 -aa(lp17163 -g20 -aI16 -aI-380 -aa(lp17164 -g20 -aI452 -aI-998 -aa(lp17165 -g20 -aI548 -aI-998 -aa(lp17166 -g20 -aI548 -aI-380 -aa(lp17167 -g20 -aI677 -aI-380 -aa(lp17168 -g20 -aI677 -aI-272 -aa(lp17169 -g20 -aI548 -aI-272 -aa(lp17170 -g20 -aI548 -aI-44 -aa(lp17171 -g10 -aa(lp17172 -g8 -aI430 -aI-380 -aa(lp17173 -g20 -aI430 -aI-810 -aa(lp17174 -g20 -aI132 -aI-380 -aa(lp17175 -g10 -aa(lp17176 -g8 -aI741 -aI-44 -aa(lp17177 -g10 -aa(lp17178 -g8 -aI741 -aI-44 -aasV8 -(lp17179 -(lp17180 -g8 -aI235 -aI-562 -aa(lp17181 -g15 -aI127 -aI-638 -aI187 -aI-579 -aI151 -aI-605 -aa(lp17182 -g15 -aI92 -aI-756 -aI104 -aI-671 -aI92 -aI-710 -aa(lp17183 -g15 -aI167 -aI-931 -aI92 -aI-826 -aI117 -aI-884 -aa(lp17184 -g15 -aI366 -aI-1002 -aI217 -aI-979 -aI283 -aI-1002 -aa(lp17185 -g15 -aI567 -aI-930 -aI449 -aI-1002 -aI516 -aI-978 -aa(lp17186 -g15 -aI643 -aI-753 -aI618 -aI-881 -aI643 -aI-822 -aa(lp17187 -g15 -aI609 -aI-637 -aI643 -aI-709 -aI632 -aI-670 -aa(lp17188 -g15 -aI503 -aI-562 -aI585 -aI-605 -aI550 -aI-579 -aa(lp17189 -g15 -aI637 -aI-469 -aI561 -aI-542 -aI606 -aI-512 -aa(lp17190 -g15 -aI682 -aI-317 -aI667 -aI-427 -aI682 -aI-376 -aa(lp17191 -g15 -aI596 -aI-111 -aI682 -aI-235 -aI654 -aI-167 -aa(lp17192 -g15 -aI368 -aI-28 -aI538 -aI-55 -aI462 -aI-28 -aa(lp17193 -g15 -aI140 -aI-111 -aI274 -aI-28 -aI198 -aI-56 -aa(lp17194 -g15 -aI54 -aI-320 -aI82 -aI-167 -aI54 -aI-237 -aa(lp17195 -g15 -aI101 -aI-476 -aI54 -aI-382 -aI69 -aI-434 -aa(lp17196 -g15 -aI235 -aI-562 -aI132 -aI-518 -aI177 -aI-546 -aa(lp17197 -g10 -aa(lp17198 -g8 -aI212 -aI-760 -aa(lp17199 -g15 -aI255 -aI-649 -aI212 -aI-715 -aI226 -aI-678 -aa(lp17200 -g15 -aI369 -aI-606 -aI284 -aI-621 -aI322 -aI-606 -aa(lp17201 -g15 -aI480 -aI-649 -aI414 -aI-606 -aI451 -aI-621 -aa(lp17202 -g15 -aI523 -aI-754 -aI509 -aI-678 -aI523 -aI-712 -aa(lp17203 -g15 -aI478 -aI-862 -aI523 -aI-797 -aI508 -aI-833 -aa(lp17204 -g15 -aI367 -aI-906 -aI449 -aI-891 -aI412 -aI-906 -aa(lp17205 -g15 -aI256 -aI-863 -aI323 -aI-906 -aI286 -aI-892 -aa(lp17206 -g15 -aI212 -aI-760 -aI226 -aI-834 -aI212 -aI-800 -aa(lp17207 -g10 -aa(lp17208 -g8 -aI174 -aI-319 -aa(lp17209 -g15 -aI198 -aI-222 -aI174 -aI-286 -aI182 -aI-254 -aa(lp17210 -g15 -aI268 -aI-150 -aI214 -aI-191 -aI237 -aI-167 -aa(lp17211 -g15 -aI369 -aI-124 -aI300 -aI-133 -aI333 -aI-124 -aa(lp17212 -g15 -aI508 -aI-178 -aI425 -aI-124 -aI472 -aI-142 -aa(lp17213 -g15 -aI563 -aI-315 -aI544 -aI-214 -aI563 -aI-260 -aa(lp17214 -g15 -aI506 -aI-455 -aI563 -aI-372 -aI544 -aI-419 -aa(lp17215 -g15 -aI365 -aI-511 -aI469 -aI-492 -aI422 -aI-511 -aa(lp17216 -g15 -aI228 -aI-456 -aI310 -aI-511 -aI265 -aI-493 -aa(lp17217 -g15 -aI174 -aI-319 -aI192 -aI-420 -aI174 -aI-374 -aa(lp17218 -g10 -aa(lp17219 -g8 -aI741 -aI-44 -aa(lp17220 -g10 -aa(lp17221 -g8 -aI741 -aI-44 -aasV< -(lp17222 -(lp17223 -g8 -aI72 -aI-461 -aa(lp17224 -g20 -aI72 -aI-571 -aa(lp17225 -g20 -aI705 -aI-838 -aa(lp17226 -g20 -aI705 -aI-721 -aa(lp17227 -g20 -aI203 -aI-515 -aa(lp17228 -g20 -aI705 -aI-308 -aa(lp17229 -g20 -aI705 -aI-191 -aa(lp17230 -g10 -aa(lp17231 -g8 -aI778 -aI-44 -aa(lp17232 -g10 -aa(lp17233 -g8 -aI778 -aI-44 -aasV@ -(lp17234 -(lp17235 -g8 -aI755 -aI-150 -aa(lp17236 -g15 -aI661 -aI-72 -aI727 -aI-118 -aI696 -aI-91 -aa(lp17237 -g15 -aI555 -aI-42 -aI626 -aI-52 -aI591 -aI-42 -aa(lp17238 -g15 -aI443 -aI-76 -aI517 -aI-42 -aI479 -aI-53 -aa(lp17239 -g15 -aI354 -aI-180 -aI406 -aI-98 -aI377 -aI-133 -aa(lp17240 -g15 -aI320 -aI-334 -aI331 -aI-227 -aI320 -aI-278 -aa(lp17241 -g15 -aI373 -aI-542 -aI320 -aI-403 -aI337 -aI-472 -aa(lp17242 -g15 -aI505 -aI-698 -aI408 -aI-611 -aI452 -aI-663 -aa(lp17243 -g15 -aI658 -aI-750 -aI557 -aI-732 -aI608 -aI-750 -aa(lp17244 -g15 -aI766 -aI-720 -aI695 -aI-750 -aI731 -aI-740 -aa(lp17245 -g15 -aI854 -aI-630 -aI800 -aI-700 -aI830 -aI-670 -aa(lp17246 -g20 -aI876 -aI-731 -aa(lp17247 -g20 -aI993 -aI-731 -aa(lp17248 -g20 -aI899 -aI-294 -aa(lp17249 -g15 -aI880 -aI-193 -aI886 -aI-233 -aI880 -aI-200 -aa(lp17250 -g15 -aI893 -aI-163 -aI880 -aI-181 -aI884 -aI-171 -aa(lp17251 -g15 -aI925 -aI-150 -aI902 -aI-154 -aI913 -aI-150 -aa(lp17252 -g15 -aI1016 -aI-190 -aI948 -aI-150 -aI978 -aI-163 -aa(lp17253 -g15 -aI1133 -aI-329 -aI1065 -aI-225 -aI1104 -aI-271 -aa(lp17254 -g15 -aI1177 -aI-510 -aI1162 -aI-388 -aI1177 -aI-448 -aa(lp17255 -g15 -aI1121 -aI-713 -aI1177 -aI-583 -aI1158 -aI-650 -aa(lp17256 -g15 -aI955 -aI-864 -aI1084 -aI-776 -aI1028 -aI-826 -aa(lp17257 -g15 -aI711 -aI-921 -aI881 -aI-902 -aI800 -aI-921 -aa(lp17258 -g15 -aI433 -aI-850 -aI610 -aI-921 -aI517 -aI-897 -aa(lp17259 -g15 -aI237 -aI-645 -aI349 -aI-802 -aI284 -aI-734 -aa(lp17260 -g15 -aI168 -aI-360 -aI191 -aI-556 -aI168 -aI-461 -aa(lp17261 -g15 -aI237 -aI-85 -aI168 -aI-253 -aI191 -aI-162 -aa(lp17262 -g15 -aI438 -aI84 -aI284 -aI-8 -aI351 -aI48 -aa(lp17263 -g15 -aI729 -aI139 -aI525 -aI121 -aI622 -aI139 -aa(lp17264 -g15 -aI1014 -aI82 -aI842 -aI139 -aI938 -aI120 -aa(lp17265 -g15 -aI1187 -aI-56 -aI1091 -aI44 -aI1149 -aI-2 -aa(lp17266 -g20 -aI1305 -aI-56 -aa(lp17267 -g15 -aI1191 -aI82 -aI1283 -aI-11 -aI1245 -aI35 -aa(lp17268 -g15 -aI999 -aI194 -aI1137 -aI129 -aI1073 -aI167 -aa(lp17269 -g15 -aI731 -aI236 -aI925 -aI222 -aI835 -aI236 -aa(lp17270 -g15 -aI464 -aI199 -aI634 -aI236 -aI545 -aI223 -aa(lp17271 -g15 -aI256 -aI87 -aI383 -aI174 -aI313 -aI137 -aa(lp17272 -g15 -aI126 -aI-84 -aI199 -aI37 -aI156 -aI-19 -aa(lp17273 -g15 -aI72 -aI-349 -aI90 -aI-166 -aI72 -aI-254 -aa(lp17274 -g15 -aI137 -aI-652 -aI72 -aI-455 -aI93 -aI-556 -aa(lp17275 -g15 -aI362 -aI-922 -aI190 -aI-770 -aI265 -aI-860 -aa(lp17276 -g15 -aI717 -aI-1016 -aI460 -aI-985 -aI578 -aI-1016 -aa(lp17277 -g15 -aI1007 -aI-950 -aI825 -aI-1016 -aI921 -aI-994 -aa(lp17278 -g15 -aI1210 -aI-753 -aI1093 -aI-906 -aI1160 -aI-840 -aa(lp17279 -g15 -aI1273 -aI-508 -aI1252 -aI-678 -aI1273 -aI-596 -aa(lp17280 -g15 -aI1140 -aI-173 -aI1273 -aI-382 -aI1229 -aI-271 -aa(lp17281 -g15 -aI881 -aI-41 -aI1061 -aI-85 -aI975 -aI-41 -aa(lp17282 -g15 -aI808 -aI-55 -aI851 -aI-41 -aI827 -aI-46 -aa(lp17283 -g15 -aI768 -aI-94 -aI790 -aI-64 -aI776 -aI-77 -aa(lp17284 -g15 -aI755 -aI-150 -aI762 -aI-105 -aI758 -aI-124 -aa(lp17285 -g10 -aa(lp17286 -g8 -aI440 -aI-326 -aa(lp17287 -g15 -aI483 -aI-188 -aI440 -aI-267 -aI454 -aI-221 -aa(lp17288 -g15 -aI580 -aI-138 -aI511 -aI-155 -aI543 -aI-138 -aa(lp17289 -g15 -aI656 -aI-160 -aI604 -aI-138 -aI629 -aI-146 -aa(lp17290 -g15 -aI734 -aI-225 -aI683 -aI-175 -aI709 -aI-196 -aa(lp17291 -g15 -aI794 -aI-334 -aI758 -aI-254 -aI778 -aI-290 -aa(lp17292 -g15 -aI817 -aI-466 -aI809 -aI-378 -aI817 -aI-422 -aa(lp17293 -g15 -aI773 -aI-604 -aI817 -aI-526 -aI803 -aI-571 -aa(lp17294 -g15 -aI666 -aI-653 -aI744 -aI-636 -aI708 -aI-653 -aa(lp17295 -g15 -aI588 -aI-632 -aI638 -aI-653 -aI612 -aI-646 -aa(lp17296 -g15 -aI516 -aI-563 -aI563 -aI-617 -aI539 -aI-595 -aa(lp17297 -g15 -aI461 -aI-450 -aI493 -aI-532 -aI475 -aI-494 -aa(lp17298 -g15 -aI440 -aI-326 -aI447 -aI-405 -aI440 -aI-364 -aa(lp17299 -g10 -aa(lp17300 -g8 -aI1353 -aI-44 -aa(lp17301 -g10 -aa(lp17302 -g8 -aI1353 -aI-44 -aasVD -(lp17303 -(lp17304 -g8 -aI102 -aI-44 -aa(lp17305 -g20 -aI102 -aI-998 -aa(lp17306 -g20 -aI431 -aI-998 -aa(lp17307 -g15 -aI601 -aI-985 -aI505 -aI-998 -aI562 -aI-994 -aa(lp17308 -g15 -aI741 -aI-916 -aI656 -aI-972 -aI702 -aI-949 -aa(lp17309 -g15 -aI854 -aI-753 -aI791 -aI-874 -aI829 -aI-819 -aa(lp17310 -g15 -aI891 -aI-526 -aI879 -aI-687 -aI891 -aI-611 -aa(lp17311 -g15 -aI866 -aI-334 -aI891 -aI-454 -aI883 -aI-390 -aa(lp17312 -g15 -aI801 -aI-195 -aI849 -aI-278 -aI827 -aI-231 -aa(lp17313 -g15 -aI714 -aI-108 -aI774 -aI-158 -aI745 -aI-129 -aa(lp17314 -g15 -aI600 -aI-60 -aI683 -aI-87 -aI645 -aI-71 -aa(lp17315 -g15 -aI447 -aI-44 -aI556 -aI-49 -aI504 -aI-44 -aa(lp17316 -g10 -aa(lp17317 -g8 -aI229 -aI-157 -aa(lp17318 -g20 -aI432 -aI-157 -aa(lp17319 -g15 -aI581 -aI-174 -aI495 -aI-157 -aI545 -aI-162 -aa(lp17320 -g15 -aI666 -aI-224 -aI616 -aI-186 -aI645 -aI-202 -aa(lp17321 -g15 -aI736 -aI-344 -aI696 -aI-254 -aI719 -aI-294 -aa(lp17322 -g15 -aI761 -aI-528 -aI753 -aI-395 -aI761 -aI-456 -aa(lp17323 -g15 -aI712 -aI-758 -aI761 -aI-628 -aI745 -aI-705 -aa(lp17324 -g15 -aI593 -aI-866 -aI679 -aI-812 -aI639 -aI-848 -aa(lp17325 -g15 -aI429 -aI-886 -aI559 -aI-879 -aI504 -aI-886 -aa(lp17326 -g20 -aI229 -aI-886 -aa(lp17327 -g10 -aa(lp17328 -g8 -aI962 -aI-44 -aa(lp17329 -g10 -aa(lp17330 -g8 -aI962 -aI-44 -aasVH -(lp17331 -(lp17332 -g8 -aI106 -aI-44 -aa(lp17333 -g20 -aI106 -aI-998 -aa(lp17334 -g20 -aI233 -aI-998 -aa(lp17335 -g20 -aI233 -aI-606 -aa(lp17336 -g20 -aI729 -aI-606 -aa(lp17337 -g20 -aI729 -aI-998 -aa(lp17338 -g20 -aI855 -aI-998 -aa(lp17339 -g20 -aI855 -aI-44 -aa(lp17340 -g20 -aI729 -aI-44 -aa(lp17341 -g20 -aI729 -aI-494 -aa(lp17342 -g20 -aI233 -aI-494 -aa(lp17343 -g20 -aI233 -aI-44 -aa(lp17344 -g10 -aa(lp17345 -g8 -aI962 -aI-44 -aa(lp17346 -g10 -aa(lp17347 -g8 -aI962 -aI-44 -aasVL -(lp17348 -(lp17349 -g8 -aI97 -aI-44 -aa(lp17350 -g20 -aI97 -aI-998 -aa(lp17351 -g20 -aI223 -aI-998 -aa(lp17352 -g20 -aI223 -aI-157 -aa(lp17353 -g20 -aI694 -aI-157 -aa(lp17354 -g20 -aI694 -aI-44 -aa(lp17355 -g10 -aa(lp17356 -g8 -aI741 -aI-44 -aa(lp17357 -g10 -aa(lp17358 -g8 -aI741 -aI-44 -aasVP -(lp17359 -(lp17360 -g8 -aI102 -aI-44 -aa(lp17361 -g20 -aI102 -aI-998 -aa(lp17362 -g20 -aI462 -aI-998 -aa(lp17363 -g15 -aI608 -aI-989 -aI526 -aI-998 -aI574 -aI-995 -aa(lp17364 -g15 -aI725 -aI-945 -aI654 -aI-981 -aI694 -aI-967 -aa(lp17365 -g15 -aI802 -aI-853 -aI757 -aI-923 -aI783 -aI-892 -aa(lp17366 -g15 -aI831 -aI-722 -aI821 -aI-813 -aI831 -aI-770 -aa(lp17367 -g15 -aI753 -aI-516 -aI831 -aI-641 -aI805 -aI-572 -aa(lp17368 -g15 -aI473 -aI-432 -aI702 -aI-460 -aI608 -aI-432 -aa(lp17369 -g20 -aI229 -aI-432 -aa(lp17370 -g20 -aI229 -aI-44 -aa(lp17371 -g10 -aa(lp17372 -g8 -aI229 -aI-545 -aa(lp17373 -g20 -aI475 -aI-545 -aa(lp17374 -g15 -aI649 -aI-590 -aI557 -aI-545 -aI615 -aI-560 -aa(lp17375 -g15 -aI701 -aI-718 -aI684 -aI-621 -aI701 -aI-663 -aa(lp17376 -g15 -aI670 -aI-821 -aI701 -aI-758 -aI691 -aI-793 -aa(lp17377 -g15 -aI591 -aI-877 -aI650 -aI-849 -aI624 -aI-868 -aa(lp17378 -g15 -aI473 -aI-886 -aI569 -aI-883 -aI530 -aI-886 -aa(lp17379 -g20 -aI229 -aI-886 -aa(lp17380 -g10 -aa(lp17381 -g8 -aI889 -aI-44 -aa(lp17382 -g10 -aa(lp17383 -g8 -aI889 -aI-44 -aasVT -(lp17384 -(lp17385 -g8 -aI345 -aI-44 -aa(lp17386 -g20 -aI345 -aI-886 -aa(lp17387 -g20 -aI31 -aI-886 -aa(lp17388 -g20 -aI31 -aI-998 -aa(lp17389 -g20 -aI787 -aI-998 -aa(lp17390 -g20 -aI787 -aI-886 -aa(lp17391 -g20 -aI472 -aI-886 -aa(lp17392 -g20 -aI472 -aI-44 -aa(lp17393 -g10 -aa(lp17394 -g8 -aI814 -aI-44 -aa(lp17395 -g10 -aa(lp17396 -g8 -aI814 -aI-44 -aasVX -(lp17397 -(lp17398 -g8 -aI5 -aI-44 -aa(lp17399 -g20 -aI375 -aI-541 -aa(lp17400 -g20 -aI49 -aI-998 -aa(lp17401 -g20 -aI199 -aI-998 -aa(lp17402 -g20 -aI373 -aI-754 -aa(lp17403 -g15 -aI449 -aI-636 -aI409 -aI-703 -aI434 -aI-664 -aa(lp17404 -g15 -aI525 -aI-745 -aI471 -aI-671 -aI496 -aI-707 -aa(lp17405 -g20 -aI717 -aI-998 -aa(lp17406 -g20 -aI854 -aI-998 -aa(lp17407 -g20 -aI519 -aI-549 -aa(lp17408 -g20 -aI880 -aI-44 -aa(lp17409 -g20 -aI724 -aI-44 -aa(lp17410 -g20 -aI484 -aI-384 -aa(lp17411 -g15 -aI442 -aI-448 -aI470 -aI-404 -aI457 -aI-425 -aa(lp17412 -g15 -aI397 -aI-377 -aI421 -aI-414 -aI406 -aI-390 -aa(lp17413 -g20 -aI157 -aI-44 -aa(lp17414 -g10 -aa(lp17415 -g8 -aI889 -aI-44 -aa(lp17416 -g10 -aa(lp17417 -g8 -aI889 -aI-44 -aasV\u005C -(lp17418 -(lp17419 -g8 -aI276 -aI-28 -aa(lp17420 -g20 -aI0 -aI-1015 -aa(lp17421 -g20 -aI94 -aI-1015 -aa(lp17422 -g20 -aI370 -aI-28 -aa(lp17423 -g10 -aa(lp17424 -g8 -aI370 -aI-44 -aa(lp17425 -g10 -aa(lp17426 -g8 -aI370 -aI-44 -aasV` -(lp17427 -(lp17428 -g8 -aI302 -aI-821 -aa(lp17429 -g20 -aI208 -aI-821 -aa(lp17430 -g20 -aI57 -aI-1004 -aa(lp17431 -g20 -aI214 -aI-1004 -aa(lp17432 -g10 -aa(lp17433 -g8 -aI444 -aI-44 -aa(lp17434 -g10 -aa(lp17435 -g8 -aI444 -aI-44 -aasVd -(lp17436 -(lp17437 -g8 -aI536 -aI-44 -aa(lp17438 -g20 -aI536 -aI-131 -aa(lp17439 -g15 -aI343 -aI-28 -aI492 -aI-63 -aI428 -aI-28 -aa(lp17440 -g15 -aI191 -aI-74 -aI287 -aI-28 -aI237 -aI-44 -aa(lp17441 -g15 -aI83 -aI-201 -aI144 -aI-104 -aI109 -aI-147 -aa(lp17442 -g15 -aI45 -aI-389 -aI58 -aI-256 -aI45 -aI-318 -aa(lp17443 -g15 -aI80 -aI-577 -aI45 -aI-458 -aI57 -aI-521 -aa(lp17444 -g15 -aI183 -aI-706 -aI103 -aI-633 -aI137 -aI-676 -aa(lp17445 -g15 -aI337 -aI-751 -aI229 -aI-736 -aI281 -aI-751 -aa(lp17446 -g15 -aI449 -aI-725 -aI379 -aI-751 -aI416 -aI-742 -aa(lp17447 -g15 -aI528 -aI-656 -aI481 -aI-707 -aI508 -aI-684 -aa(lp17448 -g20 -aI528 -aI-998 -aa(lp17449 -g20 -aI645 -aI-998 -aa(lp17450 -g20 -aI645 -aI-44 -aa(lp17451 -g10 -aa(lp17452 -g8 -aI166 -aI-389 -aa(lp17453 -g15 -aI222 -aI-190 -aI166 -aI-300 -aI184 -aI-234 -aa(lp17454 -g15 -aI354 -aI-125 -aI259 -aI-147 -aI303 -aI-125 -aa(lp17455 -g15 -aI484 -aI-188 -aI405 -aI-125 -aI448 -aI-146 -aa(lp17456 -g15 -aI538 -aI-379 -aI520 -aI-229 -aI538 -aI-293 -aa(lp17457 -g15 -aI483 -aI-588 -aI538 -aI-474 -aI520 -aI-543 -aa(lp17458 -g15 -aI348 -aI-654 -aI447 -aI-632 -aI402 -aI-654 -aa(lp17459 -g15 -aI218 -aI-590 -aI296 -aI-654 -aI253 -aI-633 -aa(lp17460 -g15 -aI166 -aI-389 -aI183 -aI-548 -aI166 -aI-481 -aa(lp17461 -g10 -aa(lp17462 -g8 -aI741 -aI-44 -aa(lp17463 -g10 -aa(lp17464 -g8 -aI741 -aI-44 -aasVh -(lp17465 -(lp17466 -g8 -aI87 -aI-44 -aa(lp17467 -g20 -aI87 -aI-998 -aa(lp17468 -g20 -aI205 -aI-998 -aa(lp17469 -g20 -aI205 -aI-656 -aa(lp17470 -g15 -aI412 -aI-751 -aI259 -aI-719 -aI328 -aI-751 -aa(lp17471 -g15 -aI545 -aI-721 -aI463 -aI-751 -aI507 -aI-741 -aa(lp17472 -g15 -aI626 -aI-637 -aI583 -aI-701 -aI610 -aI-673 -aa(lp17473 -g15 -aI651 -aI-482 -aI642 -aI-601 -aI651 -aI-550 -aa(lp17474 -g20 -aI651 -aI-44 -aa(lp17475 -g20 -aI533 -aI-44 -aa(lp17476 -g20 -aI533 -aI-482 -aa(lp17477 -g15 -aI495 -aI-610 -aI533 -aI-541 -aI521 -aI-583 -aa(lp17478 -g15 -aI388 -aI-650 -aI470 -aI-637 -aI434 -aI-650 -aa(lp17479 -g15 -aI290 -aI-623 -aI353 -aI-650 -aI320 -aI-641 -aa(lp17480 -g15 -aI224 -aI-550 -aI259 -aI-605 -aI237 -aI-581 -aa(lp17481 -g15 -aI205 -aI-422 -aI211 -aI-519 -aI205 -aI-476 -aa(lp17482 -g20 -aI205 -aI-44 -aa(lp17483 -g10 -aa(lp17484 -g8 -aI741 -aI-44 -aa(lp17485 -g10 -aa(lp17486 -g8 -aI741 -aI-44 -aasVl -(lp17487 -(lp17488 -g8 -aI85 -aI-44 -aa(lp17489 -g20 -aI85 -aI-998 -aa(lp17490 -g20 -aI202 -aI-998 -aa(lp17491 -g20 -aI202 -aI-44 -aa(lp17492 -g10 -aa(lp17493 -g8 -aI296 -aI-44 -aa(lp17494 -g10 -aa(lp17495 -g8 -aI296 -aI-44 -aasVp -(lp17496 -(lp17497 -g8 -aI87 -aI220 -aa(lp17498 -g20 -aI87 -aI-735 -aa(lp17499 -g20 -aI194 -aI-735 -aa(lp17500 -g20 -aI194 -aI-646 -aa(lp17501 -g15 -aI279 -aI-725 -aI219 -aI-681 -aI248 -aI-707 -aa(lp17502 -g15 -aI395 -aI-751 -aI311 -aI-742 -aI350 -aI-751 -aa(lp17503 -g15 -aI551 -aI-705 -aI454 -aI-751 -aI506 -aI-736 -aa(lp17504 -g15 -aI653 -aI-577 -aI596 -aI-675 -aI630 -aI-632 -aa(lp17505 -g15 -aI688 -aI-395 -aI676 -aI-521 -aI688 -aI-461 -aa(lp17506 -g15 -aI650 -aI-204 -aI688 -aI-324 -aI675 -aI-260 -aa(lp17507 -g15 -aI539 -aI-74 -aI624 -aI-147 -aI587 -aI-104 -aa(lp17508 -g15 -aI386 -aI-28 -aI490 -aI-43 -aI440 -aI-28 -aa(lp17509 -g15 -aI281 -aI-53 -aI347 -aI-28 -aI312 -aI-37 -aa(lp17510 -g15 -aI205 -aI-116 -aI250 -aI-70 -aI225 -aI-90 -aa(lp17511 -g20 -aI205 -aI220 -aa(lp17512 -g10 -aa(lp17513 -g8 -aI194 -aI-386 -aa(lp17514 -g15 -aI248 -aI-188 -aI194 -aI-297 -aI212 -aI-231 -aa(lp17515 -g15 -aI378 -aI-125 -aI284 -aI-146 -aI327 -aI-125 -aa(lp17516 -g15 -aI512 -aI-191 -aI430 -aI-125 -aI475 -aI-147 -aa(lp17517 -g15 -aI568 -aI-396 -aI549 -aI-235 -aI568 -aI-303 -aa(lp17518 -g15 -aI513 -aI-593 -aI568 -aI-484 -aI550 -aI-550 -aa(lp17519 -g15 -aI384 -aI-659 -aI477 -aI-637 -aI434 -aI-659 -aa(lp17520 -g15 -aI251 -aI-589 -aI334 -aI-659 -aI290 -aI-636 -aa(lp17521 -g15 -aI194 -aI-386 -aI213 -aI-543 -aI194 -aI-475 -aa(lp17522 -g10 -aa(lp17523 -g8 -aI741 -aI-44 -aa(lp17524 -g10 -aa(lp17525 -g8 -aI741 -aI-44 -aasVt -(lp17526 -(lp17527 -g8 -aI343 -aI-149 -aa(lp17528 -g20 -aI360 -aI-45 -aa(lp17529 -g15 -aI272 -aI-35 -aI327 -aI-38 -aI298 -aI-35 -aa(lp17530 -g15 -aI173 -aI-55 -aI229 -aI-35 -aI196 -aI-42 -aa(lp17531 -g15 -aI123 -aI-108 -aI149 -aI-68 -aI133 -aI-86 -aa(lp17532 -g15 -aI109 -aI-246 -aI114 -aI-130 -aI109 -aI-176 -aa(lp17533 -g20 -aI109 -aI-644 -aa(lp17534 -g20 -aI23 -aI-644 -aa(lp17535 -g20 -aI23 -aI-735 -aa(lp17536 -g20 -aI109 -aI-735 -aa(lp17537 -g20 -aI109 -aI-907 -aa(lp17538 -g20 -aI225 -aI-977 -aa(lp17539 -g20 -aI225 -aI-735 -aa(lp17540 -g20 -aI343 -aI-735 -aa(lp17541 -g20 -aI343 -aI-644 -aa(lp17542 -g20 -aI225 -aI-644 -aa(lp17543 -g20 -aI225 -aI-240 -aa(lp17544 -g15 -aI232 -aI-175 -aI225 -aI-206 -aI227 -aI-185 -aa(lp17545 -g15 -aI252 -aI-153 -aI236 -aI-166 -aI242 -aI-158 -aa(lp17546 -g15 -aI292 -aI-144 -aI261 -aI-147 -aI274 -aI-144 -aa(lp17547 -g15 -aI343 -aI-149 -aI305 -aI-144 -aI322 -aI-146 -aa(lp17548 -g10 -aa(lp17549 -g8 -aI370 -aI-44 -aa(lp17550 -g10 -aa(lp17551 -g8 -aI370 -aI-44 -aasVx -(lp17552 -(lp17553 -g8 -aI9 -aI-44 -aa(lp17554 -g20 -aI262 -aI-403 -aa(lp17555 -g20 -aI28 -aI-735 -aa(lp17556 -g20 -aI175 -aI-735 -aa(lp17557 -g20 -aI281 -aI-573 -aa(lp17558 -g15 -aI329 -aI-496 -aI301 -aI-542 -aI317 -aI-517 -aa(lp17559 -g15 -aI382 -aI-572 -aI348 -aI-524 -aI366 -aI-550 -aa(lp17560 -g20 -aI498 -aI-735 -aa(lp17561 -g20 -aI638 -aI-735 -aa(lp17562 -g20 -aI399 -aI-410 -aa(lp17563 -g20 -aI656 -aI-44 -aa(lp17564 -g20 -aI513 -aI-44 -aa(lp17565 -g20 -aI371 -aI-259 -aa(lp17566 -g20 -aI333 -aI-317 -aa(lp17567 -g20 -aI151 -aI-44 -aa(lp17568 -g10 -aa(lp17569 -g8 -aI666 -aI-44 -aa(lp17570 -g10 -aa(lp17571 -g8 -aI666 -aI-44 -aasV| -(lp17572 -(lp17573 -g8 -aI122 -aI236 -aa(lp17574 -g20 -aI122 -aI-1015 -aa(lp17575 -g20 -aI224 -aI-1015 -aa(lp17576 -g20 -aI224 -aI236 -aa(lp17577 -g10 -aa(lp17578 -g8 -aI346 -aI-44 -aa(lp17579 -g10 -aa(lp17580 -g8 -aI346 -aI-44 -aasV# -(lp17581 -(lp17582 -g8 -aI67 -aI-28 -aa(lp17583 -g20 -aI123 -aI-305 -aa(lp17584 -g20 -aI13 -aI-305 -aa(lp17585 -g20 -aI13 -aI-402 -aa(lp17586 -g20 -aI143 -aI-402 -aa(lp17587 -g20 -aI191 -aI-638 -aa(lp17588 -g20 -aI13 -aI-638 -aa(lp17589 -g20 -aI13 -aI-735 -aa(lp17590 -g20 -aI210 -aI-735 -aa(lp17591 -g20 -aI267 -aI-1015 -aa(lp17592 -g20 -aI365 -aI-1015 -aa(lp17593 -g20 -aI308 -aI-735 -aa(lp17594 -g20 -aI513 -aI-735 -aa(lp17595 -g20 -aI570 -aI-1015 -aa(lp17596 -g20 -aI668 -aI-1015 -aa(lp17597 -g20 -aI611 -aI-735 -aa(lp17598 -g20 -aI724 -aI-735 -aa(lp17599 -g20 -aI724 -aI-638 -aa(lp17600 -g20 -aI592 -aI-638 -aa(lp17601 -g20 -aI543 -aI-402 -aa(lp17602 -g20 -aI724 -aI-402 -aa(lp17603 -g20 -aI724 -aI-305 -aa(lp17604 -g20 -aI524 -aI-305 -aa(lp17605 -g20 -aI467 -aI-28 -aa(lp17606 -g20 -aI369 -aI-28 -aa(lp17607 -g20 -aI425 -aI-305 -aa(lp17608 -g20 -aI221 -aI-305 -aa(lp17609 -g20 -aI164 -aI-28 -aa(lp17610 -g10 -aa(lp17611 -g8 -aI240 -aI-402 -aa(lp17612 -g20 -aI445 -aI-402 -aa(lp17613 -g20 -aI494 -aI-638 -aa(lp17614 -g20 -aI289 -aI-638 -aa(lp17615 -g10 -aa(lp17616 -g8 -aI741 -aI-44 -aa(lp17617 -g10 -aa(lp17618 -g8 -aI741 -aI-44 -aasV' -(lp17619 -(lp17620 -g8 -aI88 -aI-660 -aa(lp17621 -g20 -aI58 -aI-839 -aa(lp17622 -g20 -aI58 -aI-998 -aa(lp17623 -g20 -aI192 -aI-998 -aa(lp17624 -g20 -aI192 -aI-839 -aa(lp17625 -g20 -aI160 -aI-660 -aa(lp17626 -g10 -aa(lp17627 -g8 -aI254 -aI-44 -aa(lp17628 -g10 -aa(lp17629 -g8 -aI254 -aI-44 -aasV+ -(lp17630 -(lp17631 -g8 -aI333 -aI-198 -aa(lp17632 -g20 -aI333 -aI-460 -aa(lp17633 -g20 -aI74 -aI-460 -aa(lp17634 -g20 -aI74 -aI-569 -aa(lp17635 -g20 -aI333 -aI-569 -aa(lp17636 -g20 -aI333 -aI-829 -aa(lp17637 -g20 -aI444 -aI-829 -aa(lp17638 -g20 -aI444 -aI-569 -aa(lp17639 -g20 -aI704 -aI-569 -aa(lp17640 -g20 -aI704 -aI-460 -aa(lp17641 -g20 -aI444 -aI-460 -aa(lp17642 -g20 -aI444 -aI-198 -aa(lp17643 -g10 -aa(lp17644 -g8 -aI778 -aI-44 -aa(lp17645 -g10 -aa(lp17646 -g8 -aI778 -aI-44 -aasV/ -(lp17647 -(lp17648 -g8 -aI0 -aI-28 -aa(lp17649 -g20 -aI276 -aI-1015 -aa(lp17650 -g20 -aI370 -aI-1015 -aa(lp17651 -g20 -aI94 -aI-28 -aa(lp17652 -g10 -aa(lp17653 -g8 -aI370 -aI-44 -aa(lp17654 -g10 -aa(lp17655 -g8 -aI370 -aI-44 -aasV3 -(lp17656 -(lp17657 -g8 -aI55 -aI-296 -aa(lp17658 -g20 -aI173 -aI-312 -aa(lp17659 -g15 -aI241 -aI-168 -aI186 -aI-245 -aI209 -aI-197 -aa(lp17660 -g15 -aI360 -aI-124 -aI274 -aI-139 -aI313 -aI-124 -aa(lp17661 -g15 -aI499 -aI-181 -aI415 -aI-124 -aI461 -aI-143 -aa(lp17662 -g15 -aI556 -aI-323 -aI537 -aI-220 -aI556 -aI-267 -aa(lp17663 -g15 -aI503 -aI-456 -aI556 -aI-377 -aI539 -aI-421 -aa(lp17664 -g15 -aI369 -aI-509 -aI468 -aI-491 -aI424 -aI-509 -aa(lp17665 -g15 -aI287 -aI-496 -aI347 -aI-509 -aI320 -aI-504 -aa(lp17666 -g20 -aI300 -aI-599 -aa(lp17667 -g15 -aI319 -aI-597 -aI307 -aI-598 -aI314 -aI-597 -aa(lp17668 -g15 -aI453 -aI-636 -aI368 -aI-597 -aI413 -aI-610 -aa(lp17669 -g15 -aI513 -aI-757 -aI493 -aI-662 -aI513 -aI-703 -aa(lp17670 -g15 -aI470 -aI-864 -aI513 -aI-800 -aI499 -aI-835 -aa(lp17671 -g15 -aI357 -aI-906 -aI440 -aI-892 -aI403 -aI-906 -aa(lp17672 -g15 -aI243 -aI-863 -aI311 -aI-906 -aI273 -aI-892 -aa(lp17673 -g15 -aI184 -aI-734 -aI213 -aI-834 -aI193 -aI-791 -aa(lp17674 -g20 -aI67 -aI-755 -aa(lp17675 -g15 -aI165 -aI-938 -aI82 -aI-833 -aI114 -aI-894 -aa(lp17676 -g15 -aI354 -aI-1002 -aI216 -aI-981 -aI279 -aI-1002 -aa(lp17677 -g15 -aI498 -aI-969 -aI406 -aI-1002 -aI454 -aI-991 -aa(lp17678 -g15 -aI599 -aI-877 -aI542 -aI-946 -aI576 -aI-916 -aa(lp17679 -g15 -aI634 -aI-754 -aI622 -aI-839 -aI634 -aI-798 -aa(lp17680 -g15 -aI600 -aI-642 -aI634 -aI-713 -aI623 -aI-675 -aa(lp17681 -g15 -aI502 -aI-561 -aI578 -aI-608 -aI546 -aI-581 -aa(lp17682 -g15 -aI634 -aI-480 -aI559 -aI-548 -aI602 -aI-521 -aa(lp17683 -g15 -aI680 -aI-326 -aI665 -aI-439 -aI680 -aI-387 -aa(lp17684 -g15 -aI589 -aI-114 -aI680 -aI-243 -aI650 -aI-172 -aa(lp17685 -g15 -aI359 -aI-27 -aI529 -aI-56 -aI452 -aI-27 -aa(lp17686 -g15 -aI150 -aI-102 -aI275 -aI-27 -aI206 -aI-52 -aa(lp17687 -g15 -aI55 -aI-296 -aI95 -aI-152 -aI63 -aI-216 -aa(lp17688 -g10 -aa(lp17689 -g8 -aI741 -aI-44 -aa(lp17690 -g10 -aa(lp17691 -g8 -aI741 -aI-44 -aasV7 -(lp17692 -(lp17693 -g8 -aI63 -aI-873 -aa(lp17694 -g20 -aI63 -aI-986 -aa(lp17695 -g20 -aI680 -aI-986 -aa(lp17696 -g20 -aI680 -aI-895 -aa(lp17697 -g15 -aI500 -aI-637 -aI620 -aI-830 -aI560 -aI-744 -aa(lp17698 -g15 -aI361 -aI-306 -aI440 -aI-530 -aI394 -aI-420 -aa(lp17699 -g15 -aI317 -aI-44 -aI338 -aI-226 -aI323 -aI-139 -aa(lp17700 -g20 -aI196 -aI-44 -aa(lp17701 -g15 -aI240 -aI-316 -aI197 -aI-119 -aI212 -aI-210 -aa(lp17702 -g15 -aI362 -aI-624 -aI269 -aI-422 -aI309 -aI-525 -aa(lp17703 -g15 -aI530 -aI-873 -aI415 -aI-722 -aI471 -aI-806 -aa(lp17704 -g10 -aa(lp17705 -g8 -aI741 -aI-44 -aa(lp17706 -g10 -aa(lp17707 -g8 -aI741 -aI-44 -aasV; -(lp17708 -(lp17709 -g8 -aI118 -aI-602 -aa(lp17710 -g20 -aI118 -aI-735 -aa(lp17711 -g20 -aI251 -aI-735 -aa(lp17712 -g20 -aI251 -aI-602 -aa(lp17713 -g10 -aa(lp17714 -g8 -aI118 -aI-44 -aa(lp17715 -g20 -aI118 -aI-177 -aa(lp17716 -g20 -aI251 -aI-177 -aa(lp17717 -g20 -aI251 -aI-44 -aa(lp17718 -g15 -aI225 -aI74 -aI251 -aI4 -aI243 -aI44 -aa(lp17719 -g15 -aI143 -aI144 -aI208 -aI104 -aI180 -aI127 -aa(lp17720 -g20 -aI110 -aI94 -aa(lp17721 -g15 -aI165 -aI46 -aI135 -aI83 -aI153 -aI67 -aa(lp17722 -g15 -aI184 -aI-44 -aI177 -aI25 -aI183 -aI-4 -aa(lp17723 -g10 -aa(lp17724 -g8 -aI370 -aI-44 -aa(lp17725 -g10 -aa(lp17726 -g8 -aI370 -aI-44 -aasV? -(lp17727 -(lp17728 -g8 -aI307 -aI-279 -aa(lp17729 -g15 -aI306 -aI-314 -aI306 -aI-295 -aI306 -aI-306 -aa(lp17730 -g15 -aI326 -aI-433 -aI306 -aI-360 -aI313 -aI-400 -aa(lp17731 -g15 -aI372 -aI-509 -aI335 -aI-458 -aI351 -aI-484 -aa(lp17732 -g15 -aI456 -aI-591 -aI388 -aI-528 -aI416 -aI-555 -aa(lp17733 -g15 -aI535 -aI-677 -aI497 -aI-627 -aI523 -aI-655 -aa(lp17734 -g15 -aI554 -aI-746 -aI547 -aI-698 -aI554 -aI-721 -aa(lp17735 -g15 -aI500 -aI-867 -aI554 -aI-792 -aI536 -aI-832 -aa(lp17736 -g15 -aI369 -aI-918 -aI465 -aI-901 -aI421 -aI-918 -aa(lp17737 -g15 -aI244 -aI-871 -aI319 -aI-918 -aI278 -aI-903 -aa(lp17738 -g15 -aI179 -aI-725 -aI211 -aI-840 -aI189 -aI-791 -aa(lp17739 -g20 -aI58 -aI-739 -aa(lp17740 -g15 -aI155 -aI-944 -aI69 -aI-828 -aI101 -aI-896 -aa(lp17741 -g15 -aI367 -aI-1015 -aI208 -aI-991 -aI279 -aI-1015 -aa(lp17742 -g15 -aI591 -aI-938 -aI461 -aI-1015 -aI535 -aI-989 -aa(lp17743 -g15 -aI674 -aI-754 -aI646 -aI-888 -aI674 -aI-826 -aa(lp17744 -g15 -aI645 -aI-639 -aI674 -aI-713 -aI664 -aI-674 -aa(lp17745 -g15 -aI530 -aI-511 -aI625 -aI-604 -aI587 -aI-561 -aa(lp17746 -g15 -aI455 -aI-436 -aI492 -aI-477 -aI467 -aI-452 -aa(lp17747 -g15 -aI429 -aI-381 -aI444 -aI-420 -aI435 -aI-401 -aa(lp17748 -g15 -aI419 -aI-279 -aI424 -aI-360 -aI420 -aI-326 -aa(lp17749 -g10 -aa(lp17750 -g8 -aI300 -aI-44 -aa(lp17751 -g20 -aI300 -aI-177 -aa(lp17752 -g20 -aI433 -aI-177 -aa(lp17753 -g20 -aI433 -aI-44 -aa(lp17754 -g10 -aa(lp17755 -g8 -aI741 -aI-44 -aa(lp17756 -g10 -aa(lp17757 -g8 -aI741 -aI-44 -aasVC -(lp17758 -(lp17759 -g8 -aI783 -aI-379 -aa(lp17760 -g20 -aI910 -aI-347 -aa(lp17761 -g15 -aI767 -aI-109 -aI883 -aI-243 -aI836 -aI-164 -aa(lp17762 -g15 -aI514 -aI-28 -aI698 -aI-55 -aI614 -aI-28 -aa(lp17763 -g15 -aI263 -aI-90 -aI412 -aI-28 -aI328 -aI-49 -aa(lp17764 -g15 -aI116 -aI-272 -aI199 -aI-132 -aI150 -aI-193 -aa(lp17765 -g15 -aI66 -aI-528 -aI83 -aI-352 -aI66 -aI-437 -aa(lp17766 -g15 -aI123 -aI-788 -aI66 -aI-628 -aI85 -aI-714 -aa(lp17767 -g15 -aI285 -aI-957 -aI161 -aI-862 -aI215 -aI-919 -aa(lp17768 -g15 -aI516 -aI-1015 -aI355 -aI-995 -aI432 -aI-1015 -aa(lp17769 -g15 -aI757 -aI-942 -aI612 -aI-1015 -aI692 -aI-990 -aa(lp17770 -g15 -aI893 -aI-737 -aI822 -aI-893 -aI868 -aI-825 -aa(lp17771 -g20 -aI769 -aI-707 -aa(lp17772 -g15 -aI673 -aI-859 -aI747 -aI-777 -aI715 -aI-827 -aa(lp17773 -g15 -aI514 -aI-907 -aI631 -aI-891 -aI578 -aI-907 -aa(lp17774 -g15 -aI330 -aI-854 -aI440 -aI-907 -aI379 -aI-889 -aa(lp17775 -g15 -aI226 -aI-712 -aI281 -aI-819 -aI246 -aI-771 -aa(lp17776 -g15 -aI196 -aI-529 -aI206 -aI-653 -aI196 -aI-592 -aa(lp17777 -g15 -aI232 -aI-316 -aI196 -aI-448 -aI208 -aI-377 -aa(lp17778 -g15 -aI342 -aI-181 -aI255 -aI-256 -aI292 -aI-211 -aa(lp17779 -g15 -aI504 -aI-136 -aI392 -aI-151 -aI446 -aI-136 -aa(lp17780 -g15 -aI684 -aI-197 -aI575 -aI-136 -aI635 -aI-156 -aa(lp17781 -g15 -aI783 -aI-379 -aI733 -aI-238 -aI766 -aI-298 -aa(lp17782 -g10 -aa(lp17783 -g8 -aI962 -aI-44 -aa(lp17784 -g10 -aa(lp17785 -g8 -aI962 -aI-44 -aasVG -(lp17786 -(lp17787 -g8 -aI549 -aI-418 -aa(lp17788 -g20 -aI549 -aI-530 -aa(lp17789 -g20 -aI953 -aI-531 -aa(lp17790 -g20 -aI953 -aI-177 -aa(lp17791 -g15 -aI761 -aI-65 -aI891 -aI-127 -aI827 -aI-90 -aa(lp17792 -g15 -aI558 -aI-28 -aI695 -aI-40 -aI628 -aI-28 -aa(lp17793 -g15 -aI303 -aI-88 -aI464 -aI-28 -aI379 -aI-48 -aa(lp17794 -g15 -aI129 -aI-262 -aI226 -aI-128 -aI168 -aI-186 -aa(lp17795 -g15 -aI70 -aI-517 -aI90 -aI-338 -aI70 -aI-423 -aa(lp17796 -g15 -aI129 -aI-777 -aI70 -aI-609 -aI90 -aI-696 -aa(lp17797 -g15 -aI296 -aI-956 -aI168 -aI-857 -aI223 -aI-917 -aa(lp17798 -g15 -aI548 -aI-1015 -aI369 -aI-995 -aI453 -aI-1015 -aa(lp17799 -g15 -aI736 -aI-981 -aI617 -aI-1015 -aI680 -aI-1003 -aa(lp17800 -g15 -aI867 -aI-888 -aI791 -aI-959 -aI835 -aI-928 -aa(lp17801 -g15 -aI939 -aI-731 -aI898 -aI-848 -aI922 -aI-796 -aa(lp17802 -g20 -aI825 -aI-700 -aa(lp17803 -g15 -aI772 -aI-815 -aI811 -aI-749 -aI793 -aI-787 -aa(lp17804 -g15 -aI680 -aI-882 -aI750 -aI-843 -aI720 -aI-865 -aa(lp17805 -g15 -aI549 -aI-907 -aI641 -aI-898 -aI597 -aI-907 -aa(lp17806 -g15 -aI399 -aI-880 -aI491 -aI-907 -aI441 -aI-898 -aa(lp17807 -g15 -aI297 -aI-811 -aI357 -aI-863 -aI323 -aI-840 -aa(lp17808 -g15 -aI237 -aI-716 -aI272 -aI-782 -aI251 -aI-751 -aa(lp17809 -g15 -aI201 -aI-524 -aI213 -aI-657 -aI201 -aI-593 -aa(lp17810 -g15 -aI245 -aI-311 -aI201 -aI-439 -aI215 -aI-368 -aa(lp17811 -g15 -aI373 -aI-183 -aI274 -aI-254 -aI317 -aI-211 -aa(lp17812 -g15 -aI551 -aI-142 -aI429 -aI-155 -aI488 -aI-142 -aa(lp17813 -g15 -aI711 -aI-173 -aI606 -aI-142 -aI659 -aI-152 -aa(lp17814 -g15 -aI830 -aI-241 -aI763 -aI-194 -aI803 -aI-217 -aa(lp17815 -g20 -aI830 -aI-418 -aa(lp17816 -g10 -aa(lp17817 -g8 -aI1037 -aI-44 -aa(lp17818 -g10 -aa(lp17819 -g8 -aI1037 -aI-44 -aasVK -(lp17820 -(lp17821 -g8 -aI97 -aI-44 -aa(lp17822 -g20 -aI97 -aI-998 -aa(lp17823 -g20 -aI223 -aI-998 -aa(lp17824 -g20 -aI223 -aI-525 -aa(lp17825 -g20 -aI697 -aI-998 -aa(lp17826 -g20 -aI869 -aI-998 -aa(lp17827 -g20 -aI468 -aI-612 -aa(lp17828 -g20 -aI886 -aI-44 -aa(lp17829 -g20 -aI720 -aI-44 -aa(lp17830 -g20 -aI380 -aI-527 -aa(lp17831 -g20 -aI223 -aI-375 -aa(lp17832 -g20 -aI223 -aI-44 -aa(lp17833 -g10 -aa(lp17834 -g8 -aI889 -aI-44 -aa(lp17835 -g10 -aa(lp17836 -g8 -aI889 -aI-44 -aasVO -(lp17837 -(lp17838 -g8 -aI64 -aI-509 -aa(lp17839 -g15 -aI192 -aI-881 -aI64 -aI-667 -aI106 -aI-791 -aa(lp17840 -g15 -aI521 -aI-1015 -aI277 -aI-970 -aI386 -aI-1015 -aa(lp17841 -g15 -aI759 -aI-952 -aI609 -aI-1015 -aI689 -aI-994 -aa(lp17842 -g15 -aI921 -aI-776 -aI830 -aI-910 -aI884 -aI-851 -aa(lp17843 -g15 -aI977 -aI-520 -aI958 -aI-701 -aI977 -aI-615 -aa(lp17844 -g15 -aI918 -aI-260 -aI977 -aI-423 -aI957 -aI-336 -aa(lp17845 -g15 -aI752 -aI-87 -aI879 -aI-184 -aI824 -aI-126 -aa(lp17846 -g15 -aI520 -aI-28 -aI680 -aI-47 -aI603 -aI-28 -aa(lp17847 -g15 -aI279 -aI-93 -aI430 -aI-28 -aI350 -aI-49 -aa(lp17848 -g15 -aI119 -aI-271 -aI209 -aI-136 -aI155 -aI-195 -aa(lp17849 -g15 -aI64 -aI-509 -aI82 -aI-346 -aI64 -aI-425 -aa(lp17850 -g10 -aa(lp17851 -g8 -aI194 -aI-507 -aa(lp17852 -g15 -aI287 -aI-235 -aI194 -aI-392 -aI225 -aI-301 -aa(lp17853 -g15 -aI520 -aI-136 -aI349 -aI-169 -aI426 -aI-136 -aa(lp17854 -g15 -aI754 -aI-236 -aI615 -aI-136 -aI693 -aI-169 -aa(lp17855 -g15 -aI847 -aI-521 -aI816 -aI-303 -aI847 -aI-398 -aa(lp17856 -g15 -aI807 -aI-724 -aI847 -aI-598 -aI833 -aI-666 -aa(lp17857 -g15 -aI692 -aI-859 -aI781 -aI-782 -aI742 -aI-827 -aa(lp17858 -g15 -aI522 -aI-907 -aI641 -aI-891 -aI585 -aI-907 -aa(lp17859 -g15 -aI291 -aI-814 -aI432 -aI-907 -aI355 -aI-876 -aa(lp17860 -g15 -aI194 -aI-507 -aI226 -aI-753 -aI194 -aI-651 -aa(lp17861 -g10 -aa(lp17862 -g8 -aI1037 -aI-44 -aa(lp17863 -g10 -aa(lp17864 -g8 -aI1037 -aI-44 -aasVS -(lp17865 -(lp17866 -g8 -aI59 -aI-351 -aa(lp17867 -g20 -aI179 -aI-361 -aa(lp17868 -g15 -aI218 -aI-243 -aI184 -aI-313 -aI197 -aI-274 -aa(lp17869 -g15 -aI314 -aI-169 -aI239 -aI-213 -aI271 -aI-188 -aa(lp17870 -g15 -aI460 -aI-141 -aI357 -aI-150 -aI406 -aI-141 -aa(lp17871 -g15 -aI588 -aI-162 -aI509 -aI-141 -aI551 -aI-148 -aa(lp17872 -g15 -aI670 -aI-221 -aI625 -aI-177 -aI652 -aI-196 -aa(lp17873 -g15 -aI697 -aI-303 -aI688 -aI-246 -aI697 -aI-274 -aa(lp17874 -g15 -aI671 -aI-382 -aI697 -aI-333 -aI689 -aI-359 -aa(lp17875 -g15 -aI585 -aI-438 -aI654 -aI-404 -aI625 -aI-423 -aa(lp17876 -g15 -aI416 -aI-484 -aI560 -aI-448 -aI503 -aI-463 -aa(lp17877 -g15 -aI231 -aI-544 -aI328 -aI-505 -aI266 -aI-525 -aa(lp17878 -g15 -aI129 -aI-633 -aI186 -aI-568 -aI152 -aI-597 -aa(lp17879 -g15 -aI96 -aI-752 -aI107 -aI-668 -aI96 -aI-708 -aa(lp17880 -g15 -aI137 -aI-887 -aI96 -aI-800 -aI110 -aI-845 -aa(lp17881 -g15 -aI257 -aI-982 -aI164 -aI-929 -aI204 -aI-960 -aa(lp17882 -g15 -aI432 -aI-1015 -aI309 -aI-1004 -aI368 -aI-1015 -aa(lp17883 -g15 -aI619 -aI-980 -aI503 -aI-1015 -aI565 -aI-1003 -aa(lp17884 -g15 -aI744 -aI-880 -aI673 -aI-958 -aI715 -aI-924 -aa(lp17885 -g15 -aI791 -aI-729 -aI773 -aI-836 -aI788 -aI-785 -aa(lp17886 -g20 -aI669 -aI-720 -aa(lp17887 -g15 -aI603 -aI-857 -aI663 -aI-781 -aI641 -aI-826 -aa(lp17888 -g15 -aI437 -aI-903 -aI566 -aI-888 -aI510 -aI-903 -aa(lp17889 -g15 -aI270 -aI-861 -aI361 -aI-903 -aI305 -aI-889 -aa(lp17890 -g15 -aI218 -aI-760 -aI235 -aI-833 -aI218 -aI-800 -aa(lp17891 -g15 -aI255 -aI-675 -aI218 -aI-726 -aI230 -aI-698 -aa(lp17892 -g15 -aI445 -aI-607 -aI279 -aI-653 -aI342 -aI-631 -aa(lp17893 -g15 -aI656 -aI-547 -aI548 -aI-584 -aI618 -aI-564 -aa(lp17894 -g15 -aI779 -aI-449 -aI712 -aI-521 -aI753 -aI-489 -aa(lp17895 -g15 -aI819 -aI-313 -aI806 -aI-410 -aI819 -aI-365 -aa(lp17896 -g15 -aI776 -aI-170 -aI819 -aI-263 -aI805 -aI-215 -aa(lp17897 -g15 -aI650 -aI-65 -aI746 -aI-125 -aI705 -aI-90 -aa(lp17898 -g15 -aI466 -aI-28 -aI596 -aI-40 -aI534 -aI-28 -aa(lp17899 -g15 -aI249 -aI-65 -aI380 -aI-28 -aI308 -aI-40 -aa(lp17900 -g15 -aI112 -aI-179 -aI191 -aI-91 -aI145 -aI-128 -aa(lp17901 -g15 -aI59 -aI-351 -aI79 -aI-230 -aI61 -aI-287 -aa(lp17902 -g10 -aa(lp17903 -g8 -aI889 -aI-44 -aa(lp17904 -g10 -aa(lp17905 -g8 -aI889 -aI-44 -aasVW -(lp17906 -(lp17907 -g8 -aI269 -aI-44 -aa(lp17908 -g20 -aI16 -aI-998 -aa(lp17909 -g20 -aI145 -aI-998 -aa(lp17910 -g20 -aI291 -aI-373 -aa(lp17911 -g15 -aI331 -aI-177 -aI306 -aI-307 -aI320 -aI-242 -aa(lp17912 -g15 -aI374 -aI-354 -aI355 -aI-279 -aI370 -aI-338 -aa(lp17913 -g20 -aI555 -aI-998 -aa(lp17914 -g20 -aI708 -aI-998 -aa(lp17915 -g20 -aI845 -aI-515 -aa(lp17916 -g15 -aI919 -aI-177 -aI879 -aI-396 -aI904 -aI-283 -aa(lp17917 -g15 -aI966 -aI-385 -aI931 -aI-238 -aI947 -aI-307 -aa(lp17918 -g20 -aI1116 -aI-998 -aa(lp17919 -g20 -aI1243 -aI-998 -aa(lp17920 -g20 -aI981 -aI-44 -aa(lp17921 -g20 -aI860 -aI-44 -aa(lp17922 -g20 -aI658 -aI-771 -aa(lp17923 -g15 -aI628 -aI-883 -aI641 -aI-832 -aI631 -aI-869 -aa(lp17924 -g15 -aI600 -aI-771 -aI618 -aI-839 -aI609 -aI-802 -aa(lp17925 -g20 -aI398 -aI-44 -aa(lp17926 -g10 -aa(lp17927 -g8 -aI1258 -aI-44 -aa(lp17928 -g10 -aa(lp17929 -g8 -aI1258 -aI-44 -aasV[ -(lp17930 -(lp17931 -g8 -aI90 -aI220 -aa(lp17932 -g20 -aI90 -aI-998 -aa(lp17933 -g20 -aI348 -aI-998 -aa(lp17934 -g20 -aI348 -aI-901 -aa(lp17935 -g20 -aI207 -aI-901 -aa(lp17936 -g20 -aI207 -aI123 -aa(lp17937 -g20 -aI348 -aI123 -aa(lp17938 -g20 -aI348 -aI220 -aa(lp17939 -g10 -aa(lp17940 -g8 -aI370 -aI-44 -aa(lp17941 -g10 -aa(lp17942 -g8 -aI370 -aI-44 -aasV_ -(lp17943 -(lp17944 -g8 -aI-20 -aI220 -aa(lp17945 -g20 -aI-20 -aI135 -aa(lp17946 -g20 -aI756 -aI135 -aa(lp17947 -g20 -aI756 -aI220 -aa(lp17948 -g10 -aa(lp17949 -g8 -aI741 -aI-44 -aa(lp17950 -g10 -aa(lp17951 -g8 -aI741 -aI-44 -aasVc -(lp17952 -(lp17953 -g8 -aI539 -aI-297 -aa(lp17954 -g20 -aI654 -aI-282 -aa(lp17955 -g15 -aI557 -aI-96 -aI641 -aI-203 -aI609 -aI-141 -aa(lp17956 -g15 -aI366 -aI-28 -aI505 -aI-51 -aI442 -aI-28 -aa(lp17957 -g15 -aI138 -aI-121 -aI271 -aI-28 -aI195 -aI-59 -aa(lp17958 -g15 -aI52 -aI-387 -aI80 -aI-183 -aI52 -aI-272 -aa(lp17959 -g15 -aI89 -aI-583 -aI52 -aI-462 -aI64 -aI-527 -aa(lp17960 -g15 -aI202 -aI-709 -aI113 -aI-639 -aI151 -aI-681 -aa(lp17961 -g15 -aI367 -aI-751 -aI252 -aI-737 -aI307 -aI-751 -aa(lp17962 -g15 -aI551 -aI-694 -aI442 -aI-751 -aI503 -aI-732 -aa(lp17963 -g15 -aI643 -aI-532 -aI599 -aI-656 -aI629 -aI-602 -aa(lp17964 -g20 -aI529 -aI-515 -aa(lp17965 -g15 -aI471 -aI-619 -aI518 -aI-561 -aI499 -aI-596 -aa(lp17966 -g15 -aI371 -aI-655 -aI444 -aI-643 -aI410 -aI-655 -aa(lp17967 -g15 -aI227 -aI-591 -aI312 -aI-655 -aI264 -aI-633 -aa(lp17968 -g15 -aI172 -aI-390 -aI190 -aI-549 -aI172 -aI-482 -aa(lp17969 -g15 -aI225 -aI-188 -aI172 -aI-297 -aI190 -aI-230 -aa(lp17970 -g15 -aI365 -aI-125 -aI261 -aI-146 -aI307 -aI-125 -aa(lp17971 -g15 -aI480 -aI-167 -aI411 -aI-125 -aI449 -aI-139 -aa(lp17972 -g15 -aI539 -aI-297 -aI511 -aI-195 -aI530 -aI-239 -aa(lp17973 -g10 -aa(lp17974 -g8 -aI666 -aI-44 -aa(lp17975 -g10 -aa(lp17976 -g8 -aI666 -aI-44 -aasVg -(lp17977 -(lp17978 -g8 -aI66 -aI12 -aa(lp17979 -g20 -aI180 -aI29 -aa(lp17980 -g15 -aI220 -aI106 -aI185 -aI64 -aI198 -aI90 -aa(lp17981 -g15 -aI339 -aI139 -aI249 -aI128 -aI288 -aI139 -aa(lp17982 -g15 -aI464 -aI106 -aI393 -aI139 -aI435 -aI128 -aa(lp17983 -g15 -aI524 -aI15 -aI494 -aI84 -aI514 -aI54 -aa(lp17984 -g15 -aI533 -aI-134 -aI530 -aI-8 -aI533 -aI-58 -aa(lp17985 -g15 -aI341 -aI-44 -aI481 -aI-74 -aI418 -aI-44 -aa(lp17986 -g15 -aI121 -aI-147 -aI246 -aI-44 -aI173 -aI-78 -aa(lp17987 -g15 -aI42 -aI-394 -aI69 -aI-215 -aI42 -aI-298 -aa(lp17988 -g15 -aI78 -aI-576 -aI42 -aI-460 -aI54 -aI-520 -aa(lp17989 -g15 -aI182 -aI-705 -aI102 -aI-632 -aI137 -aI-675 -aa(lp17990 -g15 -aI342 -aI-751 -aI227 -aI-736 -aI281 -aI-751 -aa(lp17991 -g15 -aI544 -aI-652 -aI424 -aI-751 -aI491 -aI-718 -aa(lp17992 -g20 -aI544 -aI-735 -aa(lp17993 -g20 -aI652 -aI-735 -aa(lp17994 -g20 -aI652 -aI-138 -aa(lp17995 -g15 -aI619 -aI90 -aI652 -aI-30 -aI641 -aI45 -aa(lp17996 -g15 -aI515 -aI197 -aI597 -aI135 -aI562 -aI171 -aa(lp17997 -g15 -aI339 -aI236 -aI467 -aI223 -aI409 -aI236 -aa(lp17998 -g15 -aI139 -aI180 -aI257 -aI236 -aI190 -aI217 -aa(lp17999 -g15 -aI66 -aI12 -aI89 -aI143 -aI64 -aI87 -aa(lp18000 -g10 -aa(lp18001 -g8 -aI163 -aI-402 -aa(lp18002 -g15 -aI217 -aI-203 -aI163 -aI-311 -aI181 -aI-245 -aa(lp18003 -g15 -aI352 -aI-141 -aI253 -aI-162 -aI298 -aI-141 -aa(lp18004 -g15 -aI488 -aI-203 -aI406 -aI-141 -aI451 -aI-162 -aa(lp18005 -g15 -aI542 -aI-398 -aI524 -aI-245 -aI542 -aI-310 -aa(lp18006 -g15 -aI486 -aI-590 -aI542 -aI-483 -aI524 -aI-547 -aa(lp18007 -g15 -aI350 -aI-654 -aI449 -aI-632 -aI403 -aI-654 -aa(lp18008 -g15 -aI218 -aI-590 -aI298 -aI-654 -aI254 -aI-633 -aa(lp18009 -g15 -aI163 -aI-402 -aI181 -aI-548 -aI163 -aI-485 -aa(lp18010 -g10 -aa(lp18011 -g8 -aI741 -aI-44 -aa(lp18012 -g10 -aa(lp18013 -g8 -aI741 -aI-44 -aasVk -(lp18014 -(lp18015 -g8 -aI88 -aI-44 -aa(lp18016 -g20 -aI88 -aI-998 -aa(lp18017 -g20 -aI205 -aI-998 -aa(lp18018 -g20 -aI205 -aI-454 -aa(lp18019 -g20 -aI483 -aI-735 -aa(lp18020 -g20 -aI634 -aI-735 -aa(lp18021 -g20 -aI370 -aI-479 -aa(lp18022 -g20 -aI661 -aI-44 -aa(lp18023 -g20 -aI516 -aI-44 -aa(lp18024 -g20 -aI288 -aI-397 -aa(lp18025 -g20 -aI205 -aI-318 -aa(lp18026 -g20 -aI205 -aI-44 -aa(lp18027 -g10 -aa(lp18028 -g8 -aI666 -aI-44 -aa(lp18029 -g10 -aa(lp18030 -g8 -aI666 -aI-44 -aasVo -(lp18031 -(lp18032 -g8 -aI44 -aI-390 -aa(lp18033 -g15 -aI151 -aI-674 -aI44 -aI-518 -aI79 -aI-613 -aa(lp18034 -g15 -aI368 -aI-751 -aI210 -aI-725 -aI282 -aI-751 -aa(lp18035 -g15 -aI601 -aI-658 -aI463 -aI-751 -aI541 -aI-720 -aa(lp18036 -g15 -aI692 -aI-399 -aI661 -aI-595 -aI692 -aI-509 -aa(lp18037 -g15 -aI652 -aI-189 -aI692 -aI-310 -aI678 -aI-240 -aa(lp18038 -g15 -aI535 -aI-71 -aI625 -aI-138 -aI586 -aI-99 -aa(lp18039 -g15 -aI368 -aI-28 -aI484 -aI-42 -aI428 -aI-28 -aa(lp18040 -g15 -aI133 -aI-121 -aI271 -aI-28 -aI193 -aI-59 -aa(lp18041 -g15 -aI44 -aI-390 -aI74 -aI-183 -aI44 -aI-273 -aa(lp18042 -g10 -aa(lp18043 -g8 -aI164 -aI-390 -aa(lp18044 -g15 -aI222 -aI-191 -aI164 -aI-301 -aI184 -aI-235 -aa(lp18045 -g15 -aI368 -aI-125 -aI261 -aI-147 -aI309 -aI-125 -aa(lp18046 -g15 -aI513 -aI-191 -aI426 -aI-125 -aI475 -aI-147 -aa(lp18047 -g15 -aI571 -aI-394 -aI552 -aI-235 -aI571 -aI-303 -aa(lp18048 -g15 -aI513 -aI-588 -aI571 -aI-479 -aI552 -aI-544 -aa(lp18049 -g15 -aI368 -aI-654 -aI474 -aI-632 -aI426 -aI-654 -aa(lp18050 -g15 -aI222 -aI-588 -aI309 -aI-654 -aI261 -aI-632 -aa(lp18051 -g15 -aI164 -aI-390 -aI184 -aI-544 -aI164 -aI-478 -aa(lp18052 -g10 -aa(lp18053 -g8 -aI741 -aI-44 -aa(lp18054 -g10 -aa(lp18055 -g8 -aI741 -aI-44 -aasVs -(lp18056 -(lp18057 -g8 -aI41 -aI-250 -aa(lp18058 -g20 -aI156 -aI-269 -aa(lp18059 -g15 -aI211 -aI-162 -aI163 -aI-222 -aI181 -aI-187 -aa(lp18060 -g15 -aI335 -aI-125 -aI240 -aI-137 -aI282 -aI-125 -aa(lp18061 -g15 -aI455 -aI-158 -aI389 -aI-125 -aI429 -aI-136 -aa(lp18062 -g15 -aI494 -aI-235 -aI481 -aI-179 -aI494 -aI-205 -aa(lp18063 -g15 -aI460 -aI-297 -aI494 -aI-261 -aI483 -aI-282 -aa(lp18064 -g15 -aI340 -aI-337 -aI444 -aI-308 -aI404 -aI-321 -aa(lp18065 -g15 -aI161 -aI-393 -aI254 -aI-359 -aI194 -aI-377 -aa(lp18066 -g15 -aI86 -aI-459 -aI128 -aI-409 -aI103 -aI-431 -aa(lp18067 -g15 -aI60 -aI-552 -aI69 -aI-487 -aI60 -aI-518 -aa(lp18068 -g15 -aI81 -aI-637 -aI60 -aI-583 -aI67 -aI-611 -aa(lp18069 -g15 -aI139 -aI-703 -aI95 -aI-664 -aI115 -aI-685 -aa(lp18070 -g15 -aI213 -aI-737 -aI157 -aI-716 -aI182 -aI-728 -aa(lp18071 -g15 -aI315 -aI-751 -aI245 -aI-746 -aI279 -aI-751 -aa(lp18072 -g15 -aI458 -aI-728 -aI369 -aI-751 -aI416 -aI-743 -aa(lp18073 -g15 -aI548 -aI-664 -aI499 -aI-712 -aI529 -aI-691 -aa(lp18074 -g15 -aI589 -aI-557 -aI568 -aI-637 -aI581 -aI-602 -aa(lp18075 -g20 -aI474 -aI-541 -aa(lp18076 -g15 -aI429 -aI-625 -aI469 -aI-577 -aI454 -aI-605 -aa(lp18077 -g15 -aI323 -aI-655 -aI404 -aI-645 -aI369 -aI-655 -aa(lp18078 -g15 -aI208 -aI-628 -aI269 -aI-655 -aI231 -aI-646 -aa(lp18079 -g15 -aI173 -aI-565 -aI185 -aI-610 -aI173 -aI-589 -aa(lp18080 -g15 -aI188 -aI-524 -aI173 -aI-550 -aI178 -aI-537 -aa(lp18081 -g15 -aI233 -aI-493 -aI197 -aI-512 -aI212 -aI-501 -aa(lp18082 -g15 -aI336 -aI-463 -aI244 -aI-489 -aI279 -aI-479 -aa(lp18083 -g15 -aI510 -aI-409 -aI419 -aI-441 -aI477 -aI-423 -aa(lp18084 -g15 -aI587 -aI-347 -aI542 -aI-395 -aI568 -aI-374 -aa(lp18085 -g15 -aI615 -aI-247 -aI605 -aI-320 -aI615 -aI-287 -aa(lp18086 -g15 -aI581 -aI-137 -aI615 -aI-208 -aI603 -aI-171 -aa(lp18087 -g15 -aI482 -aI-57 -aI558 -aI-102 -aI525 -aI-76 -aa(lp18088 -g15 -aI336 -aI-28 -aI439 -aI-38 -aI390 -aI-28 -aa(lp18089 -g15 -aI131 -aI-84 -aI246 -aI-28 -aI178 -aI-47 -aa(lp18090 -g15 -aI41 -aI-250 -aI84 -aI-122 -aI54 -aI-177 -aa(lp18091 -g10 -aa(lp18092 -g8 -aI666 -aI-44 -aa(lp18093 -g10 -aa(lp18094 -g8 -aI666 -aI-44 -aasVw -(lp18095 -(lp18096 -g8 -aI215 -aI-44 -aa(lp18097 -g20 -aI3 -aI-735 -aa(lp18098 -g20 -aI125 -aI-735 -aa(lp18099 -g20 -aI235 -aI-336 -aa(lp18100 -g20 -aI276 -aI-188 -aa(lp18101 -g15 -aI311 -aI-330 -aI277 -aI-195 -aI289 -aI-243 -aa(lp18102 -g20 -aI421 -aI-735 -aa(lp18103 -g20 -aI542 -aI-735 -aa(lp18104 -g20 -aI645 -aI-334 -aa(lp18105 -g20 -aI680 -aI-202 -aa(lp18106 -g20 -aI720 -aI-336 -aa(lp18107 -g20 -aI838 -aI-735 -aa(lp18108 -g20 -aI952 -aI-735 -aa(lp18109 -g20 -aI736 -aI-44 -aa(lp18110 -g20 -aI614 -aI-44 -aa(lp18111 -g20 -aI504 -aI-458 -aa(lp18112 -g20 -aI477 -aI-576 -aa(lp18113 -g20 -aI337 -aI-44 -aa(lp18114 -g10 -aa(lp18115 -g8 -aI962 -aI-44 -aa(lp18116 -g10 -aa(lp18117 -g8 -aI962 -aI-44 -aasV{ -(lp18118 -(lp18119 -g8 -aI37 -aI-442 -aa(lp18120 -g15 -aI118 -aI-469 -aI70 -aI-443 -aI97 -aI-452 -aa(lp18121 -g15 -aI160 -aI-540 -aI139 -aI-487 -aI153 -aI-510 -aa(lp18122 -g15 -aI171 -aI-694 -aI167 -aI-570 -aI171 -aI-621 -aa(lp18123 -g15 -aI175 -aI-837 -aI172 -aI-766 -aI173 -aI-814 -aa(lp18124 -g15 -aI197 -aI-925 -aI179 -aI-873 -aI186 -aI-903 -aa(lp18125 -g15 -aI236 -aI-978 -aI208 -aI-947 -aI221 -aI-965 -aa(lp18126 -g15 -aI296 -aI-1008 -aI252 -aI-991 -aI272 -aI-1001 -aa(lp18127 -g15 -aI377 -aI-1015 -aI313 -aI-1012 -aI340 -aI-1015 -aa(lp18128 -g20 -aI414 -aI-1015 -aa(lp18129 -g20 -aI414 -aI-912 -aa(lp18130 -g20 -aI393 -aI-912 -aa(lp18131 -g15 -aI304 -aI-888 -aI348 -aI-912 -aI318 -aI-904 -aa(lp18132 -g15 -aI281 -aI-779 -aI289 -aI-872 -aI281 -aI-835 -aa(lp18133 -g15 -aI274 -aI-563 -aI281 -aI-665 -aI279 -aI-593 -aa(lp18134 -g15 -aI234 -aI-456 -aI266 -aI-517 -aI253 -aI-481 -aa(lp18135 -g15 -aI145 -aI-389 -aI215 -aI-431 -aI186 -aI-409 -aa(lp18136 -g15 -aI249 -aI-298 -aI193 -aI-369 -aI228 -aI-339 -aa(lp18137 -g15 -aI281 -aI-96 -aI271 -aI-257 -aI281 -aI-189 -aa(lp18138 -g15 -aI284 -aI54 -aI281 -aI-11 -aI282 -aI38 -aa(lp18139 -g15 -aI310 -aI116 -aI287 -aI84 -aI296 -aI104 -aa(lp18140 -g15 -aI393 -aI133 -aI324 -aI128 -aI352 -aI133 -aa(lp18141 -g20 -aI414 -aI133 -aa(lp18142 -g20 -aI414 -aI236 -aa(lp18143 -g20 -aI377 -aI236 -aa(lp18144 -g15 -aI285 -aI225 -aI335 -aI236 -aI304 -aI232 -aa(lp18145 -g15 -aI216 -aI177 -aI257 -aI215 -aI234 -aI199 -aa(lp18146 -g15 -aI180 -aI92 -aI197 -aI154 -aI186 -aI126 -aa(lp18147 -g15 -aI171 -aI-76 -aI175 -aI57 -aI172 -aI1 -aa(lp18148 -g15 -aI160 -aI-238 -aI171 -aI-154 -aI167 -aI-208 -aa(lp18149 -g15 -aI118 -aI-309 -aI153 -aI-268 -aI139 -aI-292 -aa(lp18150 -g15 -aI37 -aI-336 -aI97 -aI-326 -aI70 -aI-335 -aa(lp18151 -g10 -aa(lp18152 -g8 -aI445 -aI-44 -aa(lp18153 -g10 -aa(lp18154 -g8 -aI445 -aI-44 -aasV" -(lp18155 -(lp18156 -g8 -aI93 -aI-660 -aa(lp18157 -g20 -aI61 -aI-842 -aa(lp18158 -g20 -aI61 -aI-998 -aa(lp18159 -g20 -aI194 -aI-998 -aa(lp18160 -g20 -aI194 -aI-842 -aa(lp18161 -g20 -aI165 -aI-660 -aa(lp18162 -g10 -aa(lp18163 -g8 -aI309 -aI-660 -aa(lp18164 -g20 -aI277 -aI-842 -aa(lp18165 -g20 -aI277 -aI-998 -aa(lp18166 -g20 -aI410 -aI-998 -aa(lp18167 -g20 -aI410 -aI-842 -aa(lp18168 -g20 -aI379 -aI-660 -aa(lp18169 -g10 -aa(lp18170 -g8 -aI473 -aI-44 -aa(lp18171 -g10 -aa(lp18172 -g8 -aI473 -aI-44 -aasV& -(lp18173 -(lp18174 -g8 -aI633 -aI-157 -aa(lp18175 -g15 -aI507 -aI-60 -aI594 -aI-114 -aI552 -aI-81 -aa(lp18176 -g15 -aI359 -aI-28 -aI461 -aI-38 -aI412 -aI-28 -aa(lp18177 -g15 -aI126 -aI-127 -aI261 -aI-28 -aI184 -aI-61 -aa(lp18178 -g15 -aI57 -aI-307 -aI80 -aI-180 -aI57 -aI-241 -aa(lp18179 -g15 -aI114 -aI-467 -aI57 -aI-366 -aI76 -aI-419 -aa(lp18180 -g15 -aI284 -aI-592 -aI152 -aI-514 -aI208 -aI-556 -aa(lp18181 -g15 -aI198 -aI-713 -aI241 -aI-642 -aI212 -aI-682 -aa(lp18182 -g15 -aI177 -aI-802 -aI184 -aI-743 -aI177 -aI-773 -aa(lp18183 -g15 -aI244 -aI-951 -aI177 -aI-859 -aI199 -aI-909 -aa(lp18184 -g15 -aI414 -aI-1015 -aI289 -aI-993 -aI345 -aI-1015 -aa(lp18185 -g15 -aI573 -aI-955 -aI479 -aI-1015 -aI532 -aI-995 -aa(lp18186 -g15 -aI636 -aI-811 -aI615 -aI-915 -aI636 -aI-867 -aa(lp18187 -g15 -aI455 -aI-578 -aI636 -aI-720 -aI575 -aI-643 -aa(lp18188 -g20 -aI626 -aI-360 -aa(lp18189 -g15 -aI672 -aI-493 -aI646 -aI-399 -aI661 -aI-443 -aa(lp18190 -g20 -aI794 -aI-467 -aa(lp18191 -g15 -aI709 -aI-261 -aI773 -aI-384 -aI745 -aI-315 -aa(lp18192 -g15 -aI858 -aI-115 -aI753 -aI-203 -aI803 -aI-154 -aa(lp18193 -g20 -aI779 -aI-22 -aa(lp18194 -g15 -aI633 -aI-157 -aI732 -aI-52 -aI683 -aI-97 -aa(lp18195 -g10 -aa(lp18196 -g8 -aI395 -aI-654 -aa(lp18197 -g15 -aI493 -aI-733 -aI445 -aI-684 -aI478 -aI-710 -aa(lp18198 -g15 -aI516 -aI-808 -aI508 -aI-755 -aI516 -aI-780 -aa(lp18199 -g15 -aI485 -aI-887 -aI516 -aI-840 -aI505 -aI-867 -aa(lp18200 -g15 -aI408 -aI-918 -aI464 -aI-908 -aI439 -aI-918 -aa(lp18201 -g15 -aI329 -aI-888 -aI376 -aI-918 -aI350 -aI-908 -aa(lp18202 -g15 -aI297 -aI-813 -aI308 -aI-867 -aI297 -aI-842 -aa(lp18203 -g15 -aI308 -aI-766 -aI297 -aI-798 -aI301 -aI-783 -aa(lp18204 -g15 -aI343 -aI-715 -aI316 -aI-750 -aI327 -aI-733 -aa(lp18205 -g10 -aa(lp18206 -g8 -aI559 -aI-249 -aa(lp18207 -g20 -aI345 -aI-515 -aa(lp18208 -g15 -aI216 -aI-410 -aI281 -aI-478 -aI238 -aI-442 -aa(lp18209 -g15 -aI183 -aI-314 -aI194 -aI-378 -aI183 -aI-346 -aa(lp18210 -g15 -aI229 -aI-194 -aI183 -aI-276 -aI199 -aI-235 -aa(lp18211 -g15 -aI360 -aI-131 -aI260 -aI-152 -aI304 -aI-131 -aa(lp18212 -g15 -aI469 -aI-164 -aI395 -aI-131 -aI432 -aI-142 -aa(lp18213 -g15 -aI559 -aI-249 -aI507 -aI-186 -aI537 -aI-214 -aa(lp18214 -g10 -aa(lp18215 -g8 -aI889 -aI-44 -aa(lp18216 -g10 -aa(lp18217 -g8 -aI889 -aI-44 -aasV* -(lp18218 -(lp18219 -g8 -aI41 -aI-823 -aa(lp18220 -g20 -aI71 -aI-916 -aa(lp18221 -g15 -aI222 -aI-853 -aI140 -aI-891 -aI190 -aI-870 -aa(lp18222 -g15 -aI208 -aI-1015 -aI213 -aI-931 -aI209 -aI-985 -aa(lp18223 -g20 -aI303 -aI-1015 -aa(lp18224 -g15 -aI288 -aI-853 -aI302 -aI-972 -aI297 -aI-918 -aa(lp18225 -g15 -aI442 -aI-916 -aI333 -aI-876 -aI384 -aI-897 -aa(lp18226 -g20 -aI472 -aI-823 -aa(lp18227 -g15 -aI309 -aI-787 -aI416 -aI-805 -aI362 -aI-793 -aa(lp18228 -g15 -aI421 -aI-664 -aI336 -aI-764 -aI373 -aI-723 -aa(lp18229 -g20 -aI343 -aI-608 -aa(lp18230 -g15 -aI254 -aI-748 -aI318 -aI-643 -aI288 -aI-689 -aa(lp18231 -g15 -aI169 -aI-608 -aI222 -aI-687 -aI194 -aI-641 -aa(lp18232 -g20 -aI93 -aI-664 -aa(lp18233 -g15 -aI201 -aI-787 -aI143 -aI-726 -aI179 -aI-767 -aa(lp18234 -g15 -aI41 -aI-823 -aI145 -aI-798 -aI92 -aI-810 -aa(lp18235 -g10 -aa(lp18236 -g8 -aI518 -aI-44 -aa(lp18237 -g10 -aa(lp18238 -g8 -aI518 -aI-44 -aasV. -(lp18239 -(lp18240 -g8 -aI121 -aI-44 -aa(lp18241 -g20 -aI121 -aI-177 -aa(lp18242 -g20 -aI254 -aI-177 -aa(lp18243 -g20 -aI254 -aI-44 -aa(lp18244 -g10 -aa(lp18245 -g8 -aI370 -aI-44 -aa(lp18246 -g10 -aa(lp18247 -g8 -aI370 -aI-44 -aasV2 -(lp18248 -(lp18249 -g8 -aI671 -aI-157 -aa(lp18250 -g20 -aI671 -aI-44 -aa(lp18251 -g20 -aI40 -aI-44 -aa(lp18252 -g15 -aI54 -aI-125 -aI39 -aI-72 -aI44 -aI-99 -aa(lp18253 -g15 -aI131 -aI-252 -aI70 -aI-168 -aI95 -aI-211 -aa(lp18254 -g15 -aI284 -aI-397 -aI166 -aI-294 -aI217 -aI-342 -aa(lp18255 -g15 -aI494 -aI-599 -aI388 -aI-482 -aI458 -aI-549 -aa(lp18256 -g15 -aI549 -aI-740 -aI531 -aI-649 -aI549 -aI-696 -aa(lp18257 -g15 -aI499 -aI-857 -aI549 -aI-786 -aI532 -aI-826 -aa(lp18258 -g15 -aI369 -aI-905 -aI466 -aI-889 -aI423 -aI-905 -aa(lp18259 -g15 -aI234 -aI-854 -aI313 -aI-905 -aI268 -aI-888 -aa(lp18260 -g15 -aI182 -aI-714 -aI200 -aI-821 -aI183 -aI-774 -aa(lp18261 -g20 -aI62 -aI-726 -aa(lp18262 -g15 -aI155 -aI-932 -aI70 -aI-816 -aI101 -aI-885 -aa(lp18263 -g15 -aI372 -aI-1002 -aI209 -aI-979 -aI281 -aI-1002 -aa(lp18264 -g15 -aI589 -aI-926 -aI463 -aI-1002 -aI536 -aI-977 -aa(lp18265 -g15 -aI669 -aI-737 -aI643 -aI-875 -aI669 -aI-812 -aa(lp18266 -g15 -aI646 -aI-625 -aI669 -aI-699 -aI662 -aI-662 -aa(lp18267 -g15 -aI568 -aI-508 -aI630 -aI-588 -aI604 -aI-549 -aa(lp18268 -g15 -aI388 -aI-340 -aI532 -aI-467 -aI472 -aI-411 -aa(lp18269 -g15 -aI252 -aI-220 -aI317 -aI-281 -aI272 -aI-241 -aa(lp18270 -g15 -aI203 -aI-157 -aI232 -aI-199 -aI216 -aI-178 -aa(lp18271 -g10 -aa(lp18272 -g8 -aI741 -aI-44 -aa(lp18273 -g10 -aa(lp18274 -g8 -aI741 -aI-44 -aasV6 -(lp18275 -(lp18276 -g8 -aI663 -aI-765 -aa(lp18277 -g20 -aI546 -aI-756 -aa(lp18278 -g15 -aI502 -aI-856 -aI536 -aI-802 -aI521 -aI-835 -aa(lp18279 -g15 -aI385 -aI-906 -aI470 -aI-889 -aI431 -aI-906 -aa(lp18280 -g15 -aI287 -aI-875 -aI348 -aI-906 -aI315 -aI-896 -aa(lp18281 -g15 -aI199 -aI-757 -aI250 -aI-848 -aI221 -aI-808 -aa(lp18282 -g15 -aI166 -aI-536 -aI178 -aI-705 -aI167 -aI-632 -aa(lp18283 -g15 -aI270 -aI-632 -aI194 -aI-579 -aI229 -aI-611 -aa(lp18284 -g15 -aI398 -aI-663 -aI310 -aI-653 -aI353 -aI-663 -aa(lp18285 -g15 -aI597 -aI-577 -aI476 -aI-663 -aI543 -aI-634 -aa(lp18286 -g15 -aI680 -aI-354 -aI652 -aI-519 -aI680 -aI-445 -aa(lp18287 -g15 -aI641 -aI-187 -aI680 -aI-294 -aI667 -aI-238 -aa(lp18288 -g15 -aI535 -aI-69 -aI615 -aI-135 -aI580 -aI-96 -aa(lp18289 -g15 -aI381 -aI-28 -aI490 -aI-41 -aI438 -aI-28 -aa(lp18290 -g15 -aI142 -aI-135 -aI283 -aI-28 -aI204 -aI-64 -aa(lp18291 -g15 -aI50 -aI-491 -aI80 -aI-207 -aI50 -aI-326 -aa(lp18292 -g15 -aI152 -aI-893 -aI50 -aI-675 -aI84 -aI-809 -aa(lp18293 -g15 -aI392 -aI-1002 -aI211 -aI-966 -aI291 -aI-1002 -aa(lp18294 -g15 -aI577 -aI-939 -aI467 -aI-1002 -aI529 -aI-981 -aa(lp18295 -g15 -aI663 -aI-765 -aI625 -aI-897 -aI653 -aI-839 -aa(lp18296 -g10 -aa(lp18297 -g8 -aI184 -aI-353 -aa(lp18298 -g15 -aI210 -aI-237 -aI184 -aI-313 -aI193 -aI-274 -aa(lp18299 -g15 -aI282 -aI-153 -aI227 -aI-200 -aI251 -aI-172 -aa(lp18300 -g15 -aI379 -aI-124 -aI313 -aI-134 -aI345 -aI-124 -aa(lp18301 -g15 -aI507 -aI-184 -aI429 -aI-124 -aI471 -aI-144 -aa(lp18302 -g15 -aI560 -aI-347 -aI542 -aI-224 -aI560 -aI-278 -aa(lp18303 -g15 -aI507 -aI-503 -aI560 -aI-413 -aI542 -aI-465 -aa(lp18304 -g15 -aI375 -aI-560 -aI472 -aI-541 -aI428 -aI-560 -aa(lp18305 -g15 -aI240 -aI-503 -aI322 -aI-560 -aI277 -aI-541 -aa(lp18306 -g15 -aI184 -aI-353 -aI203 -aI-465 -aI184 -aI-415 -aa(lp18307 -g10 -aa(lp18308 -g8 -aI741 -aI-44 -aa(lp18309 -g10 -aa(lp18310 -g8 -aI741 -aI-44 -aasV: -(lp18311 -(lp18312 -g8 -aI120 -aI-602 -aa(lp18313 -g20 -aI120 -aI-735 -aa(lp18314 -g20 -aI253 -aI-735 -aa(lp18315 -g20 -aI253 -aI-602 -aa(lp18316 -g10 -aa(lp18317 -g8 -aI120 -aI-44 -aa(lp18318 -g20 -aI120 -aI-177 -aa(lp18319 -g20 -aI253 -aI-177 -aa(lp18320 -g20 -aI253 -aI-44 -aa(lp18321 -g10 -aa(lp18322 -g8 -aI370 -aI-44 -aa(lp18323 -g10 -aa(lp18324 -g8 -aI370 -aI-44 -aasV> -(lp18325 -(lp18326 -g8 -aI705 -aI-461 -aa(lp18327 -g20 -aI72 -aI-191 -aa(lp18328 -g20 -aI72 -aI-308 -aa(lp18329 -g20 -aI573 -aI-515 -aa(lp18330 -g20 -aI72 -aI-721 -aa(lp18331 -g20 -aI72 -aI-838 -aa(lp18332 -g20 -aI705 -aI-571 -aa(lp18333 -g10 -aa(lp18334 -g8 -aI778 -aI-44 -aa(lp18335 -g10 -aa(lp18336 -g8 -aI778 -aI-44 -aasVB -(lp18337 -(lp18338 -g8 -aI97 -aI-44 -aa(lp18339 -g20 -aI97 -aI-998 -aa(lp18340 -g20 -aI455 -aI-998 -aa(lp18341 -g15 -aI631 -aI-969 -aI528 -aI-998 -aI587 -aI-989 -aa(lp18342 -g15 -aI734 -aI-880 -aI675 -aI-950 -aI709 -aI-920 -aa(lp18343 -g15 -aI772 -aI-754 -aI759 -aI-840 -aI772 -aI-798 -aa(lp18344 -g15 -aI738 -aI-639 -aI772 -aI-713 -aI761 -aI-675 -aa(lp18345 -g15 -aI638 -aI-552 -aI716 -aI-603 -aI683 -aI-574 -aa(lp18346 -g15 -aI771 -aI-465 -aI696 -aI-535 -aI740 -aI-506 -aa(lp18347 -g15 -aI818 -aI-321 -aI802 -aI-424 -aI818 -aI-376 -aa(lp18348 -g15 -aI790 -aI-196 -aI818 -aI-276 -aI808 -aI-234 -aa(lp18349 -g15 -aI720 -aI-107 -aI771 -aI-158 -aI747 -aI-128 -aa(lp18350 -g15 -aI615 -aI-60 -aI692 -aI-86 -aI657 -aI-71 -aa(lp18351 -g15 -aI461 -aI-44 -aI573 -aI-49 -aI522 -aI-44 -aa(lp18352 -g10 -aa(lp18353 -g8 -aI223 -aI-597 -aa(lp18354 -g20 -aI430 -aI-597 -aa(lp18355 -g15 -aI550 -aI-608 -aI486 -aI-597 -aI526 -aI-601 -aa(lp18356 -g15 -aI623 -aI-656 -aI582 -aI-618 -aI607 -aI-634 -aa(lp18357 -g15 -aI647 -aI-739 -aI639 -aI-678 -aI647 -aI-706 -aa(lp18358 -g15 -aI625 -aI-823 -aI647 -aI-771 -aI640 -aI-799 -aa(lp18359 -g15 -aI559 -aI-872 -aI609 -aI-847 -aI588 -aI-864 -aa(lp18360 -g15 -aI414 -aI-886 -aI531 -aI-881 -aI483 -aI-886 -aa(lp18361 -g20 -aI223 -aI-886 -aa(lp18362 -g10 -aa(lp18363 -g8 -aI223 -aI-157 -aa(lp18364 -g20 -aI461 -aI-157 -aa(lp18365 -g15 -aI547 -aI-161 -aI502 -aI-157 -aI531 -aI-158 -aa(lp18366 -g15 -aI620 -aI-187 -aI576 -aI-166 -aI600 -aI-175 -aa(lp18367 -g15 -aI668 -aI-240 -aI639 -aI-199 -aI656 -aI-217 -aa(lp18368 -g15 -aI687 -aI-321 -aI681 -aI-263 -aI687 -aI-290 -aa(lp18369 -g15 -aI660 -aI-413 -aI687 -aI-356 -aI678 -aI-387 -aa(lp18370 -g15 -aI584 -aI-469 -aI641 -aI-440 -aI616 -aI-458 -aa(lp18371 -g15 -aI444 -aI-485 -aI551 -aI-479 -aI505 -aI-485 -aa(lp18372 -g20 -aI223 -aI-485 -aa(lp18373 -g10 -aa(lp18374 -g8 -aI889 -aI-44 -aa(lp18375 -g10 -aa(lp18376 -g8 -aI889 -aI-44 -aasVF -(lp18377 -(lp18378 -g8 -aI109 -aI-44 -aa(lp18379 -g20 -aI109 -aI-998 -aa(lp18380 -g20 -aI753 -aI-998 -aa(lp18381 -g20 -aI753 -aI-886 -aa(lp18382 -g20 -aI235 -aI-886 -aa(lp18383 -g20 -aI235 -aI-590 -aa(lp18384 -g20 -aI683 -aI-590 -aa(lp18385 -g20 -aI683 -aI-478 -aa(lp18386 -g20 -aI235 -aI-478 -aa(lp18387 -g20 -aI235 -aI-44 -aa(lp18388 -g10 -aa(lp18389 -g8 -aI814 -aI-44 -aa(lp18390 -g10 -aa(lp18391 -g8 -aI814 -aI-44 -aasVJ -(lp18392 -(lp18393 -g8 -aI38 -aI-315 -aa(lp18394 -g20 -aI152 -aI-330 -aa(lp18395 -g15 -aI193 -aI-181 -aI155 -aI-257 -aI169 -aI-208 -aa(lp18396 -g15 -aI294 -aI-140 -aI217 -aI-154 -aI251 -aI-140 -aa(lp18397 -g15 -aI376 -aI-162 -aI325 -aI-140 -aI353 -aI-148 -aa(lp18398 -g15 -aI423 -aI-221 -aI399 -aI-177 -aI415 -aI-196 -aa(lp18399 -g15 -aI436 -aI-341 -aI432 -aI-246 -aI436 -aI-286 -aa(lp18400 -g20 -aI436 -aI-998 -aa(lp18401 -g20 -aI563 -aI-998 -aa(lp18402 -g20 -aI563 -aI-348 -aa(lp18403 -g15 -aI534 -aI-162 -aI563 -aI-268 -aI553 -aI-206 -aa(lp18404 -g15 -aI442 -aI-62 -aI514 -aI-119 -aI484 -aI-85 -aa(lp18405 -g15 -aI294 -aI-28 -aI400 -aI-39 -aI351 -aI-28 -aa(lp18406 -g15 -aI102 -aI-100 -aI211 -aI-28 -aI147 -aI-52 -aa(lp18407 -g15 -aI38 -aI-315 -aI58 -aI-148 -aI36 -aI-220 -aa(lp18408 -g10 -aa(lp18409 -g8 -aI666 -aI-44 -aa(lp18410 -g10 -aa(lp18411 -g8 -aI666 -aI-44 -aasVN -(lp18412 -(lp18413 -g8 -aI101 -aI-44 -aa(lp18414 -g20 -aI101 -aI-998 -aa(lp18415 -g20 -aI231 -aI-998 -aa(lp18416 -g20 -aI732 -aI-249 -aa(lp18417 -g20 -aI732 -aI-998 -aa(lp18418 -g20 -aI853 -aI-998 -aa(lp18419 -g20 -aI853 -aI-44 -aa(lp18420 -g20 -aI723 -aI-44 -aa(lp18421 -g20 -aI222 -aI-794 -aa(lp18422 -g20 -aI222 -aI-44 -aa(lp18423 -g10 -aa(lp18424 -g8 -aI962 -aI-44 -aa(lp18425 -g10 -aa(lp18426 -g8 -aI962 -aI-44 -aasVR -(lp18427 -(lp18428 -g8 -aI104 -aI-44 -aa(lp18429 -g20 -aI104 -aI-998 -aa(lp18430 -g20 -aI527 -aI-998 -aa(lp18431 -g15 -aI722 -aI-973 -aI613 -aI-998 -aI677 -aI-990 -aa(lp18432 -g15 -aI828 -aI-882 -aI766 -aI-956 -aI801 -aI-925 -aa(lp18433 -g15 -aI867 -aI-738 -aI854 -aI-838 -aI867 -aI-790 -aa(lp18434 -g15 -aI802 -aI-567 -aI867 -aI-670 -aI845 -aI-613 -aa(lp18435 -g15 -aI598 -aI-478 -aI758 -aI-520 -aI690 -aI-491 -aa(lp18436 -g15 -aI675 -aI-431 -aI632 -aI-462 -aI657 -aI-446 -aa(lp18437 -g15 -aI779 -aI-304 -aI712 -aI-397 -aI746 -aI-354 -aa(lp18438 -g20 -aI945 -aI-44 -aa(lp18439 -g20 -aI787 -aI-44 -aa(lp18440 -g20 -aI660 -aI-243 -aa(lp18441 -g15 -aI569 -aI-374 -aI623 -aI-300 -aI593 -aI-344 -aa(lp18442 -g15 -aI505 -aI-438 -aI545 -aI-404 -aI524 -aI-426 -aa(lp18443 -g15 -aI447 -aI-463 -aI486 -aI-450 -aI467 -aI-458 -aa(lp18444 -g15 -aI377 -aI-468 -aI433 -aI-466 -aI410 -aI-468 -aa(lp18445 -g20 -aI231 -aI-468 -aa(lp18446 -g20 -aI231 -aI-44 -aa(lp18447 -g10 -aa(lp18448 -g8 -aI231 -aI-577 -aa(lp18449 -g20 -aI502 -aI-577 -aa(lp18450 -g15 -aI638 -aI-595 -aI560 -aI-577 -aI605 -aI-583 -aa(lp18451 -g15 -aI712 -aI-652 -aI670 -aI-607 -aI695 -aI-626 -aa(lp18452 -g15 -aI737 -aI-738 -aI729 -aI-679 -aI737 -aI-707 -aa(lp18453 -g15 -aI688 -aI-849 -aI737 -aI-783 -aI721 -aI-820 -aa(lp18454 -g15 -aI533 -aI-893 -aI655 -aI-878 -aI603 -aI-893 -aa(lp18455 -g20 -aI231 -aI-893 -aa(lp18456 -g10 -aa(lp18457 -g8 -aI962 -aI-44 -aa(lp18458 -g10 -aa(lp18459 -g8 -aI962 -aI-44 -aasVV -(lp18460 -(lp18461 -g8 -aI375 -aI-44 -aa(lp18462 -g20 -aI5 -aI-998 -aa(lp18463 -g20 -aI142 -aI-998 -aa(lp18464 -g20 -aI390 -aI-305 -aa(lp18465 -g15 -aI440 -aI-149 -aI410 -aI-249 -aI427 -aI-197 -aa(lp18466 -g15 -aI492 -aI-305 -aI455 -aI-201 -aI472 -aI-253 -aa(lp18467 -g20 -aI750 -aI-998 -aa(lp18468 -g20 -aI878 -aI-998 -aa(lp18469 -g20 -aI505 -aI-44 -aa(lp18470 -g10 -aa(lp18471 -g8 -aI889 -aI-44 -aa(lp18472 -g10 -aa(lp18473 -g8 -aI889 -aI-44 -aasVZ -(lp18474 -(lp18475 -g8 -aI26 -aI-44 -aa(lp18476 -g20 -aI26 -aI-161 -aa(lp18477 -g20 -aI515 -aI-772 -aa(lp18478 -g15 -aI614 -aI-886 -aI550 -aI-816 -aI583 -aI-854 -aa(lp18479 -g20 -aI82 -aI-886 -aa(lp18480 -g20 -aI82 -aI-998 -aa(lp18481 -g20 -aI765 -aI-998 -aa(lp18482 -g20 -aI765 -aI-886 -aa(lp18483 -g20 -aI229 -aI-224 -aa(lp18484 -g20 -aI171 -aI-157 -aa(lp18485 -g20 -aI781 -aI-157 -aa(lp18486 -g20 -aI781 -aI-44 -aa(lp18487 -g10 -aa(lp18488 -g8 -aI814 -aI-44 -aa(lp18489 -g10 -aa(lp18490 -g8 -aI814 -aI-44 -aasV^ -(lp18491 -(lp18492 -g8 -aI155 -aI-493 -aa(lp18493 -g20 -aI35 -aI-493 -aa(lp18494 -g20 -aI264 -aI-1015 -aa(lp18495 -g20 -aI359 -aI-1015 -aa(lp18496 -g20 -aI590 -aI-493 -aa(lp18497 -g20 -aI472 -aI-493 -aa(lp18498 -g20 -aI311 -aI-882 -aa(lp18499 -g10 -aa(lp18500 -g8 -aI625 -aI-44 -aa(lp18501 -g10 -aa(lp18502 -g8 -aI625 -aI-44 -aasVb -(lp18503 -(lp18504 -g8 -aI195 -aI-44 -aa(lp18505 -g20 -aI87 -aI-44 -aa(lp18506 -g20 -aI87 -aI-998 -aa(lp18507 -g20 -aI204 -aI-998 -aa(lp18508 -g20 -aI204 -aI-658 -aa(lp18509 -g15 -aI393 -aI-751 -aI253 -aI-720 -aI317 -aI-751 -aa(lp18510 -g15 -aI514 -aI-725 -aI436 -aI-751 -aI476 -aI-742 -aa(lp18511 -g15 -aI608 -aI-653 -aI552 -aI-708 -aI583 -aI-684 -aa(lp18512 -g15 -aI666 -aI-541 -aI632 -aI-622 -aI652 -aI-585 -aa(lp18513 -g15 -aI686 -aI-400 -aI679 -aI-497 -aI686 -aI-450 -aa(lp18514 -g15 -aI598 -aI-125 -aI686 -aI-282 -aI657 -aI-190 -aa(lp18515 -g15 -aI388 -aI-28 -aI540 -aI-61 -aI470 -aI-28 -aa(lp18516 -g15 -aI195 -aI-131 -aI306 -aI-28 -aI242 -aI-62 -aa(lp18517 -g10 -aa(lp18518 -g8 -aI194 -aI-395 -aa(lp18519 -g15 -aI228 -aI-215 -aI194 -aI-312 -aI205 -aI-252 -aa(lp18520 -g15 -aI378 -aI-125 -aI265 -aI-155 -aI315 -aI-125 -aa(lp18521 -g15 -aI511 -aI-191 -aI429 -aI-125 -aI473 -aI-147 -aa(lp18522 -g15 -aI567 -aI-390 -aI548 -aI-236 -aI567 -aI-302 -aa(lp18523 -g15 -aI513 -aI-590 -aI567 -aI-481 -aI549 -aI-547 -aa(lp18524 -g15 -aI383 -aI-655 -aI477 -aI-633 -aI434 -aI-655 -aa(lp18525 -g15 -aI250 -aI-588 -aI332 -aI-655 -aI287 -aI-632 -aa(lp18526 -g15 -aI194 -aI-395 -aI213 -aI-543 -aI194 -aI-479 -aa(lp18527 -g10 -aa(lp18528 -g8 -aI741 -aI-44 -aa(lp18529 -g10 -aa(lp18530 -g8 -aI741 -aI-44 -aasVf -(lp18531 -(lp18532 -g8 -aI115 -aI-44 -aa(lp18533 -g20 -aI115 -aI-644 -aa(lp18534 -g20 -aI12 -aI-644 -aa(lp18535 -g20 -aI12 -aI-735 -aa(lp18536 -g20 -aI115 -aI-735 -aa(lp18537 -g20 -aI115 -aI-809 -aa(lp18538 -g15 -aI128 -aI-912 -aI115 -aI-855 -aI120 -aI-890 -aa(lp18539 -g15 -aI187 -aI-986 -aI139 -aI-943 -aI159 -aI-967 -aa(lp18540 -g15 -aI307 -aI-1015 -aI216 -aI-1005 -aI256 -aI-1015 -aa(lp18541 -g15 -aI416 -aI-1003 -aI340 -aI-1015 -aI376 -aI-1011 -aa(lp18542 -g20 -aI399 -aI-901 -aa(lp18543 -g15 -aI330 -aI-907 -aI374 -aI-905 -aI351 -aI-907 -aa(lp18544 -g15 -aI254 -aI-884 -aI294 -aI-907 -aI269 -aI-900 -aa(lp18545 -g15 -aI232 -aI-799 -aI239 -aI-869 -aI232 -aI-841 -aa(lp18546 -g20 -aI232 -aI-735 -aa(lp18547 -g20 -aI367 -aI-735 -aa(lp18548 -g20 -aI367 -aI-644 -aa(lp18549 -g20 -aI232 -aI-644 -aa(lp18550 -g20 -aI232 -aI-44 -aa(lp18551 -g10 -aa(lp18552 -g8 -aI370 -aI-44 -aa(lp18553 -g10 -aa(lp18554 -g8 -aI370 -aI-44 -aasVj -(lp18555 -(lp18556 -g8 -aI87 -aI-862 -aa(lp18557 -g20 -aI87 -aI-998 -aa(lp18558 -g20 -aI204 -aI-998 -aa(lp18559 -g20 -aI204 -aI-862 -aa(lp18560 -g10 -aa(lp18561 -g8 -aI-61 -aI223 -aa(lp18562 -g20 -aI-39 -aI124 -aa(lp18563 -g15 -aI16 -aI133 -aI-15 -aI130 -aI2 -aI133 -aa(lp18564 -g15 -aI69 -aI109 -aI40 -aI133 -aI57 -aI125 -aa(lp18565 -g15 -aI87 -aI-9 -aI81 -aI93 -aI87 -aI54 -aa(lp18566 -g20 -aI87 -aI-735 -aa(lp18567 -g20 -aI204 -aI-735 -aa(lp18568 -g20 -aI204 -aI-6 -aa(lp18569 -g15 -aI171 -aI171 -aI204 -aI78 -aI193 -aI137 -aa(lp18570 -g15 -aI30 -aI236 -aI143 -aI214 -aI96 -aI236 -aa(lp18571 -g15 -aI-61 -aI223 -aI-1 -aI236 -aI-31 -aI232 -aa(lp18572 -g10 -aa(lp18573 -g8 -aI296 -aI-44 -aa(lp18574 -g10 -aa(lp18575 -g8 -aI296 -aI-44 -aasVn -(lp18576 -(lp18577 -g8 -aI87 -aI-44 -aa(lp18578 -g20 -aI87 -aI-735 -aa(lp18579 -g20 -aI193 -aI-735 -aa(lp18580 -g20 -aI193 -aI-637 -aa(lp18581 -g15 -aI413 -aI-751 -aI244 -aI-713 -aI317 -aI-751 -aa(lp18582 -g15 -aI528 -aI-729 -aI455 -aI-751 -aI493 -aI-743 -aa(lp18583 -g15 -aI606 -aI-670 -aI563 -aI-714 -aI589 -aI-694 -aa(lp18584 -g15 -aI643 -aI-583 -aI624 -aI-645 -aI636 -aI-616 -aa(lp18585 -g15 -aI649 -aI-469 -aI647 -aI-561 -aI649 -aI-523 -aa(lp18586 -g20 -aI649 -aI-44 -aa(lp18587 -g20 -aI532 -aI-44 -aa(lp18588 -g20 -aI532 -aI-465 -aa(lp18589 -g15 -aI518 -aI-572 -aI532 -aI-512 -aI527 -aI-548 -aa(lp18590 -g15 -aI470 -aI-628 -aI509 -aI-595 -aI493 -aI-614 -aa(lp18591 -g15 -aI388 -aI-649 -aI447 -aI-642 -aI419 -aI-649 -aa(lp18592 -g15 -aI259 -aI-602 -aI338 -aI-649 -aI295 -aI-634 -aa(lp18593 -g15 -aI205 -aI-422 -aI223 -aI-570 -aI205 -aI-510 -aa(lp18594 -g20 -aI205 -aI-44 -aa(lp18595 -g10 -aa(lp18596 -g8 -aI741 -aI-44 -aa(lp18597 -g10 -aa(lp18598 -g8 -aI741 -aI-44 -aasVr -(lp18599 -(lp18600 -g8 -aI86 -aI-44 -aa(lp18601 -g20 -aI86 -aI-735 -aa(lp18602 -g20 -aI192 -aI-735 -aa(lp18603 -g20 -aI192 -aI-631 -aa(lp18604 -g15 -aI266 -aI-728 -aI218 -aI-680 -aI243 -aI-712 -aa(lp18605 -g15 -aI341 -aI-751 -aI289 -aI-743 -aI314 -aI-751 -aa(lp18606 -g15 -aI462 -aI-713 -aI381 -aI-751 -aI421 -aI-738 -aa(lp18607 -g20 -aI421 -aI-604 -aa(lp18608 -g15 -aI335 -aI-630 -aI393 -aI-621 -aI364 -aI-630 -aa(lp18609 -g15 -aI266 -aI-607 -aI310 -aI-630 -aI287 -aI-622 -aa(lp18610 -g15 -aI223 -aI-543 -aI246 -aI-591 -aI231 -aI-570 -aa(lp18611 -g15 -aI203 -aI-406 -aI210 -aI-501 -aI203 -aI-455 -aa(lp18612 -g20 -aI203 -aI-44 -aa(lp18613 -g10 -aa(lp18614 -g8 -aI444 -aI-44 -aa(lp18615 -g10 -aa(lp18616 -g8 -aI444 -aI-44 -aasVv -(lp18617 -(lp18618 -g8 -aI279 -aI-44 -aa(lp18619 -g20 -aI16 -aI-735 -aa(lp18620 -g20 -aI140 -aI-735 -aa(lp18621 -g20 -aI289 -aI-321 -aa(lp18622 -g15 -aI333 -aI-182 -aI305 -aI-277 -aI319 -aI-230 -aa(lp18623 -g15 -aI376 -aI-313 -aI343 -aI-218 -aI358 -aI-262 -aa(lp18624 -g20 -aI530 -aI-735 -aa(lp18625 -g20 -aI651 -aI-735 -aa(lp18626 -g20 -aI389 -aI-44 -aa(lp18627 -g10 -aa(lp18628 -g8 -aI666 -aI-44 -aa(lp18629 -g10 -aa(lp18630 -g8 -aI666 -aI-44 -aasVz -(lp18631 -(lp18632 -g8 -aI26 -aI-44 -aa(lp18633 -g20 -aI26 -aI-139 -aa(lp18634 -g20 -aI466 -aI-644 -aa(lp18635 -g15 -aI333 -aI-640 -aI416 -aI-642 -aI372 -aI-640 -aa(lp18636 -g20 -aI52 -aI-640 -aa(lp18637 -g20 -aI52 -aI-735 -aa(lp18638 -g20 -aI617 -aI-735 -aa(lp18639 -g20 -aI617 -aI-658 -aa(lp18640 -g20 -aI242 -aI-219 -aa(lp18641 -g20 -aI170 -aI-139 -aa(lp18642 -g15 -aI318 -aI-145 -aI223 -aI-143 -aI272 -aI-145 -aa(lp18643 -g20 -aI638 -aI-145 -aa(lp18644 -g20 -aI638 -aI-44 -aa(lp18645 -g10 -aa(lp18646 -g8 -aI666 -aI-44 -aa(lp18647 -g10 -aa(lp18648 -g8 -aI666 -aI-44 -aasV~ -(lp18649 -(lp18650 -g8 -aI56 -aI-407 -aa(lp18651 -g20 -aI56 -aI-540 -aa(lp18652 -g15 -aI237 -aI-618 -aI102 -aI-592 -aI162 -aI-618 -aa(lp18653 -g15 -aI319 -aI-607 -aI263 -aI-618 -aI291 -aI-614 -aa(lp18654 -g15 -aI442 -aI-562 -aI348 -aI-599 -aI389 -aI-584 -aa(lp18655 -g15 -aI509 -aI-537 -aI472 -aI-549 -aI494 -aI-541 -aa(lp18656 -g15 -aI554 -aI-531 -aI524 -aI-533 -aI539 -aI-531 -aa(lp18657 -g15 -aI642 -aI-556 -aI582 -aI-531 -aI612 -aI-539 -aa(lp18658 -g15 -aI722 -aI-620 -aI672 -aI-573 -aI699 -aI-595 -aa(lp18659 -g20 -aI722 -aI-482 -aa(lp18660 -g15 -aI638 -aI-425 -aI694 -aI-456 -aI666 -aI-437 -aa(lp18661 -g15 -aI542 -aI-408 -aI609 -aI-414 -aI577 -aI-408 -aa(lp18662 -g15 -aI467 -aI-417 -aI516 -aI-408 -aI491 -aI-411 -aa(lp18663 -g15 -aI355 -aI-461 -aI444 -aI-423 -aI406 -aI-438 -aa(lp18664 -g15 -aI226 -aI-495 -aI303 -aI-484 -aI260 -aI-495 -aa(lp18665 -g15 -aI148 -aI-477 -aI198 -aI-495 -aI172 -aI-489 -aa(lp18666 -g15 -aI56 -aI-407 -aI123 -aI-465 -aI93 -aI-442 -aa(lp18667 -g10 -aa(lp18668 -g8 -aI778 -aI-44 -aa(lp18669 -g10 -aa(lp18670 -g8 -aI778 -aI-44 -aasV! -(lp18671 -(lp18672 -g8 -aI150 -aI-281 -aa(lp18673 -g20 -aI114 -aI-787 -aa(lp18674 -g20 -aI114 -aI-998 -aa(lp18675 -g20 -aI259 -aI-998 -aa(lp18676 -g20 -aI259 -aI-787 -aa(lp18677 -g20 -aI225 -aI-281 -aa(lp18678 -g10 -aa(lp18679 -g8 -aI119 -aI-44 -aa(lp18680 -g20 -aI119 -aI-177 -aa(lp18681 -g20 -aI254 -aI-177 -aa(lp18682 -g20 -aI254 -aI-44 -aa(lp18683 -g10 -aa(lp18684 -g8 -aI370 -aI-44 -aa(lp18685 -g10 -aa(lp18686 -g8 -aI370 -aI-44 -aasV% -(lp18687 -(lp18688 -g8 -aI77 -aI-769 -aa(lp18689 -g15 -aI128 -aI-943 -aI77 -aI-837 -aI94 -aI-895 -aa(lp18690 -g15 -aI277 -aI-1015 -aI163 -aI-991 -aI212 -aI-1015 -aa(lp18691 -g15 -aI426 -aI-951 -aI337 -aI-1015 -aI387 -aI-993 -aa(lp18692 -g15 -aI485 -aI-762 -aI466 -aI-908 -aI485 -aI-845 -aa(lp18693 -g15 -aI426 -aI-576 -aI485 -aI-681 -aI465 -aI-619 -aa(lp18694 -g15 -aI279 -aI-510 -aI386 -aI-532 -aI337 -aI-510 -aa(lp18695 -g15 -aI135 -aI-575 -aI221 -aI-510 -aI173 -aI-532 -aa(lp18696 -g15 -aI77 -aI-769 -aI96 -aI-618 -aI77 -aI-682 -aa(lp18697 -g10 -aa(lp18698 -g8 -aI281 -aI-934 -aa(lp18699 -g15 -aI208 -aI-896 -aI252 -aI-934 -aI227 -aI-921 -aa(lp18700 -g15 -aI179 -aI-757 -aI189 -aI-871 -aI179 -aI-825 -aa(lp18701 -g15 -aI208 -aI-628 -aI179 -aI-696 -aI189 -aI-653 -aa(lp18702 -g15 -aI281 -aI-591 -aI228 -aI-603 -aI252 -aI-591 -aa(lp18703 -g15 -aI354 -aI-629 -aI310 -aI-591 -aI335 -aI-603 -aa(lp18704 -g15 -aI383 -aI-767 -aI373 -aI-654 -aI383 -aI-700 -aa(lp18705 -g15 -aI354 -aI-896 -aI383 -aI-828 -aI373 -aI-872 -aa(lp18706 -g15 -aI281 -aI-934 -aI334 -aI-921 -aI310 -aI-934 -aa(lp18707 -g10 -aa(lp18708 -g8 -aI281 -aI-9 -aa(lp18709 -g20 -aI804 -aI-1015 -aa(lp18710 -g20 -aI899 -aI-1015 -aa(lp18711 -g20 -aI378 -aI-9 -aa(lp18712 -g10 -aa(lp18713 -g8 -aI694 -aI-268 -aa(lp18714 -g15 -aI746 -aI-442 -aI694 -aI-336 -aI711 -aI-395 -aa(lp18715 -g15 -aI895 -aI-513 -aI780 -aI-490 -aI830 -aI-513 -aa(lp18716 -g15 -aI1044 -aI-449 -aI955 -aI-513 -aI1005 -aI-492 -aa(lp18717 -g15 -aI1103 -aI-261 -aI1083 -aI-406 -aI1103 -aI-344 -aa(lp18718 -g15 -aI1043 -aI-74 -aI1103 -aI-180 -aI1083 -aI-118 -aa(lp18719 -g15 -aI896 -aI-9 -aI1004 -aI-31 -aI955 -aI-9 -aa(lp18720 -g15 -aI752 -aI-74 -aI838 -aI-9 -aI790 -aI-30 -aa(lp18721 -g15 -aI694 -aI-268 -aI713 -aI-117 -aI694 -aI-182 -aa(lp18722 -g10 -aa(lp18723 -g8 -aI899 -aI-433 -aa(lp18724 -g15 -aI825 -aI-395 -aI869 -aI-433 -aI845 -aI-420 -aa(lp18725 -g15 -aI796 -aI-256 -aI806 -aI-370 -aI796 -aI-323 -aa(lp18726 -g15 -aI826 -aI-127 -aI796 -aI-195 -aI806 -aI-152 -aa(lp18727 -g15 -aI898 -aI-90 -aI845 -aI-102 -aI869 -aI-90 -aa(lp18728 -g15 -aI972 -aI-127 -aI928 -aI-90 -aI953 -aI-102 -aa(lp18729 -g15 -aI1001 -aI-265 -aI991 -aI-152 -aI1001 -aI-198 -aa(lp18730 -g15 -aI972 -aI-395 -aI1001 -aI-327 -aI991 -aI-370 -aa(lp18731 -g15 -aI899 -aI-433 -aI952 -aI-420 -aI928 -aI-433 -aa(lp18732 -g10 -aa(lp18733 -g8 -aI1185 -aI-44 -aa(lp18734 -g10 -aa(lp18735 -g8 -aI1185 -aI-44 -aasV) -(lp18736 -(lp18737 -g8 -aI164 -aI236 -aa(lp18738 -g20 -aI80 -aI236 -aa(lp18739 -g15 -aI275 -aI-389 -aI210 -aI27 -aI275 -aI-180 -aa(lp18740 -g15 -aI247 -aI-632 -aI275 -aI-471 -aI266 -aI-552 -aa(lp18741 -g15 -aI185 -aI-819 -aI232 -aI-697 -aI212 -aI-759 -aa(lp18742 -g15 -aI80 -aI-1015 -aI168 -aI-858 -aI133 -aI-924 -aa(lp18743 -g20 -aI164 -aI-1015 -aa(lp18744 -g15 -aI345 -aI-687 -aI246 -aI-906 -aI306 -aI-796 -aa(lp18745 -g15 -aI395 -aI-390 -aI379 -aI-592 -aI395 -aI-493 -aa(lp18746 -g15 -aI328 -aI-50 -aI395 -aI-272 -aI373 -aI-159 -aa(lp18747 -g15 -aI164 -aI236 -aI283 -aI59 -aI228 -aI154 -aa(lp18748 -g10 -aa(lp18749 -g8 -aI444 -aI-44 -aa(lp18750 -g10 -aa(lp18751 -g8 -aI444 -aI-44 -aasV- -(lp18752 -(lp18753 -g8 -aI42 -aI-330 -aa(lp18754 -g20 -aI42 -aI-448 -aa(lp18755 -g20 -aI402 -aI-448 -aa(lp18756 -g20 -aI402 -aI-330 -aa(lp18757 -g10 -aa(lp18758 -g8 -aI444 -aI-44 -aa(lp18759 -g10 -aa(lp18760 -g8 -aI444 -aI-44 -aasV1 -(lp18761 -(lp18762 -g8 -aI496 -aI-44 -aa(lp18763 -g20 -aI379 -aI-44 -aa(lp18764 -g20 -aI379 -aI-791 -aa(lp18765 -g15 -aI268 -aI-710 -aI351 -aI-764 -aI314 -aI-737 -aa(lp18766 -g15 -aI145 -aI-649 -aI222 -aI-683 -aI181 -aI-663 -aa(lp18767 -g20 -aI145 -aI-763 -aa(lp18768 -g15 -aI317 -aI-875 -aI210 -aI-794 -aI268 -aI-831 -aa(lp18769 -g15 -aI421 -aI-1002 -aI366 -aI-919 -aI400 -aI-961 -aa(lp18770 -g20 -aI496 -aI-1002 -aa(lp18771 -g10 -aa(lp18772 -g8 -aI741 -aI-44 -aa(lp18773 -g10 -aa(lp18774 -g8 -aI741 -aI-44 -aasV5 -(lp18775 -(lp18776 -g8 -aI55 -aI-294 -aa(lp18777 -g20 -aI178 -aI-304 -aa(lp18778 -g15 -aI241 -aI-169 -aI187 -aI-244 -aI208 -aI-199 -aa(lp18779 -g15 -aI361 -aI-124 -aI275 -aI-139 -aI315 -aI-124 -aa(lp18780 -g15 -aI505 -aI-188 -aI418 -aI-124 -aI466 -aI-145 -aa(lp18781 -g15 -aI563 -aI-357 -aI544 -aI-230 -aI563 -aI-287 -aa(lp18782 -g15 -aI507 -aI-515 -aI563 -aI-424 -aI545 -aI-477 -aa(lp18783 -g15 -aI360 -aI-573 -aI469 -aI-554 -aI420 -aI-573 -aa(lp18784 -g15 -aI257 -aI-548 -aI322 -aI-573 -aI288 -aI-565 -aa(lp18785 -g15 -aI186 -aI-481 -aI227 -aI-530 -aI203 -aI-508 -aa(lp18786 -g20 -aI76 -aI-495 -aa(lp18787 -g20 -aI168 -aI-985 -aa(lp18788 -g20 -aI643 -aI-985 -aa(lp18789 -g20 -aI643 -aI-873 -aa(lp18790 -g20 -aI262 -aI-873 -aa(lp18791 -g20 -aI210 -aI-617 -aa(lp18792 -g15 -aI391 -aI-677 -aI268 -aI-657 -aI328 -aI-677 -aa(lp18793 -g15 -aI602 -aI-590 -aI474 -aI-677 -aI544 -aI-648 -aa(lp18794 -g15 -aI688 -aI-368 -aI659 -aI-532 -aI688 -aI-458 -aa(lp18795 -g15 -aI612 -aI-144 -aI688 -aI-281 -aI662 -aI-206 -aa(lp18796 -g15 -aI361 -aI-28 -aI551 -aI-66 -aI467 -aI-28 -aa(lp18797 -g15 -aI149 -aI-101 -aI275 -aI-28 -aI204 -aI-52 -aa(lp18798 -g15 -aI55 -aI-294 -aI94 -aI-149 -aI63 -aI-214 -aa(lp18799 -g10 -aa(lp18800 -g8 -aI741 -aI-44 -aa(lp18801 -g10 -aa(lp18802 -g8 -aI741 -aI-44 -aasV9 -(lp18803 -(lp18804 -g8 -aI72 -aI-265 -aa(lp18805 -g20 -aI185 -aI-275 -aa(lp18806 -g15 -aI240 -aI-160 -aI195 -aI-222 -aI213 -aI-184 -aa(lp18807 -g15 -aI343 -aI-124 -aI267 -aI-136 -aI301 -aI-124 -aa(lp18808 -g15 -aI438 -aI-149 -aI379 -aI-124 -aI411 -aI-132 -aa(lp18809 -g15 -aI505 -aI-215 -aI465 -aI-165 -aI487 -aI-187 -aa(lp18810 -g15 -aI548 -aI-326 -aI522 -aI-242 -aI537 -aI-280 -aa(lp18811 -g15 -aI566 -aI-470 -aI560 -aI-373 -aI566 -aI-421 -aa(lp18812 -g15 -aI565 -aI-493 -aI566 -aI-475 -aI566 -aI-483 -aa(lp18813 -g15 -aI469 -aI-402 -aI542 -aI-456 -aI510 -aI-426 -aa(lp18814 -g15 -aI337 -aI-368 -aI429 -aI-379 -aI385 -aI-368 -aa(lp18815 -g15 -aI137 -aI-453 -aI258 -aI-368 -aI192 -aI-396 -aa(lp18816 -g15 -aI55 -aI-680 -aI82 -aI-511 -aI55 -aI-586 -aa(lp18817 -g15 -aI140 -aI-914 -aI55 -aI-777 -aI83 -aI-855 -aa(lp18818 -g15 -aI355 -aI-1002 -aI198 -aI-973 -aI269 -aI-1002 -aa(lp18819 -g15 -aI525 -aI-952 -aI417 -aI-1002 -aI474 -aI-986 -aa(lp18820 -g15 -aI642 -aI-809 -aI577 -aI-919 -aI616 -aI-871 -aa(lp18821 -g15 -aI682 -aI-541 -aI669 -aI-747 -aI682 -aI-658 -aa(lp18822 -g15 -aI643 -aI-249 -aI682 -aI-419 -aI669 -aI-322 -aa(lp18823 -g15 -aI525 -aI-84 -aI616 -aI-177 -aI577 -aI-122 -aa(lp18824 -g15 -aI341 -aI-28 -aI472 -aI-47 -aI411 -aI-28 -aa(lp18825 -g15 -aI158 -aI-90 -aI266 -aI-28 -aI205 -aI-48 -aa(lp18826 -g15 -aI72 -aI-265 -aI110 -aI-131 -aI82 -aI-190 -aa(lp18827 -g10 -aa(lp18828 -g8 -aI552 -aI-686 -aa(lp18829 -g15 -aI499 -aI-846 -aI552 -aI-753 -aI534 -aI-807 -aa(lp18830 -g15 -aI369 -aI-905 -aI463 -aI-886 -aI420 -aI-905 -aa(lp18831 -g15 -aI233 -aI-841 -aI317 -aI-905 -aI272 -aI-884 -aa(lp18832 -g15 -aI175 -aI-676 -aI195 -aI-799 -aI175 -aI-744 -aa(lp18833 -g15 -aI230 -aI-528 -aI175 -aI-615 -aI194 -aI-566 -aa(lp18834 -g15 -aI366 -aI-471 -aI267 -aI-490 -aI312 -aI-471 -aa(lp18835 -g15 -aI500 -aI-528 -aI420 -aI-471 -aI465 -aI-490 -aa(lp18836 -g15 -aI552 -aI-686 -aI535 -aI-566 -aI552 -aI-619 -aa(lp18837 -g10 -aa(lp18838 -g8 -aI741 -aI-44 -aa(lp18839 -g10 -aa(lp18840 -g8 -aI741 -aI-44 -aasV= -(lp18841 -(lp18842 -g8 -aI704 -aI-605 -aa(lp18843 -g20 -aI74 -aI-605 -aa(lp18844 -g20 -aI74 -aI-715 -aa(lp18845 -g20 -aI704 -aI-715 -aa(lp18846 -g10 -aa(lp18847 -g8 -aI704 -aI-315 -aa(lp18848 -g20 -aI74 -aI-315 -aa(lp18849 -g20 -aI74 -aI-425 -aa(lp18850 -g20 -aI704 -aI-425 -aa(lp18851 -g10 -aa(lp18852 -g8 -aI778 -aI-44 -aa(lp18853 -g10 -aa(lp18854 -g8 -aI778 -aI-44 -aasVA -(lp18855 -(lp18856 -g8 -aI-1 -aI-44 -aa(lp18857 -g20 -aI364 -aI-998 -aa(lp18858 -g20 -aI500 -aI-998 -aa(lp18859 -g20 -aI891 -aI-44 -aa(lp18860 -g20 -aI747 -aI-44 -aa(lp18861 -g20 -aI636 -aI-333 -aa(lp18862 -g20 -aI236 -aI-333 -aa(lp18863 -g20 -aI132 -aI-44 -aa(lp18864 -g10 -aa(lp18865 -g8 -aI273 -aI-436 -aa(lp18866 -g20 -aI597 -aI-436 -aa(lp18867 -g20 -aI497 -aI-700 -aa(lp18868 -g15 -aI429 -aI-898 -aI467 -aI-780 -aI444 -aI-846 -aa(lp18869 -g15 -aI378 -aI-716 -aI417 -aI-837 -aI400 -aI-776 -aa(lp18870 -g10 -aa(lp18871 -g8 -aI889 -aI-44 -aa(lp18872 -g10 -aa(lp18873 -g8 -aI889 -aI-44 -aasVE -(lp18874 -(lp18875 -g8 -aI105 -aI-44 -aa(lp18876 -g20 -aI105 -aI-998 -aa(lp18877 -g20 -aI795 -aI-998 -aa(lp18878 -g20 -aI795 -aI-886 -aa(lp18879 -g20 -aI231 -aI-886 -aa(lp18880 -g20 -aI231 -aI-593 -aa(lp18881 -g20 -aI759 -aI-593 -aa(lp18882 -g20 -aI759 -aI-481 -aa(lp18883 -g20 -aI231 -aI-481 -aa(lp18884 -g20 -aI231 -aI-157 -aa(lp18885 -g20 -aI817 -aI-157 -aa(lp18886 -g20 -aI817 -aI-44 -aa(lp18887 -g10 -aa(lp18888 -g8 -aI889 -aI-44 -aa(lp18889 -g10 -aa(lp18890 -g8 -aI889 -aI-44 -aasVI -(lp18891 -(lp18892 -g8 -aI124 -aI-44 -aa(lp18893 -g20 -aI124 -aI-998 -aa(lp18894 -g20 -aI250 -aI-998 -aa(lp18895 -g20 -aI250 -aI-44 -aa(lp18896 -g10 -aa(lp18897 -g8 -aI370 -aI-44 -aa(lp18898 -g10 -aa(lp18899 -g8 -aI370 -aI-44 -aasVM -(lp18900 -(lp18901 -g8 -aI98 -aI-44 -aa(lp18902 -g20 -aI98 -aI-998 -aa(lp18903 -g20 -aI289 -aI-998 -aa(lp18904 -g20 -aI514 -aI-323 -aa(lp18905 -g15 -aI560 -aI-181 -aI535 -aI-260 -aI550 -aI-213 -aa(lp18906 -g15 -aI611 -aI-334 -aI571 -aI-216 -aI588 -aI-267 -aa(lp18907 -g20 -aI839 -aI-998 -aa(lp18908 -g20 -aI1009 -aI-998 -aa(lp18909 -g20 -aI1009 -aI-44 -aa(lp18910 -g20 -aI888 -aI-44 -aa(lp18911 -g20 -aI888 -aI-843 -aa(lp18912 -g20 -aI610 -aI-44 -aa(lp18913 -g20 -aI496 -aI-44 -aa(lp18914 -g20 -aI220 -aI-856 -aa(lp18915 -g20 -aI220 -aI-44 -aa(lp18916 -g10 -aa(lp18917 -g8 -aI1110 -aI-44 -aa(lp18918 -g10 -aa(lp18919 -g8 -aI1110 -aI-44 -aasVQ -(lp18920 -(lp18921 -g8 -aI826 -aI-146 -aa(lp18922 -g15 -aI988 -aI-58 -aI884 -aI-106 -aI938 -aI-76 -aa(lp18923 -g20 -aI951 -aI29 -aa(lp18924 -g15 -aI746 -aI-87 -aI882 -aI5 -aI814 -aI-34 -aa(lp18925 -g15 -aI511 -aI-28 -aI675 -aI-47 -aI597 -aI-28 -aa(lp18926 -g15 -aI276 -aI-90 -aI425 -aI-28 -aI347 -aI-49 -aa(lp18927 -g15 -aI114 -aI-266 -aI206 -aI-132 -aI152 -aI-190 -aa(lp18928 -g15 -aI57 -aI-521 -aI76 -aI-341 -aI57 -aI-427 -aa(lp18929 -g15 -aI114 -aI-778 -aI57 -aI-615 -aI76 -aI-701 -aa(lp18930 -g15 -aI277 -aI-955 -aI152 -aI-856 -aI207 -aI-914 -aa(lp18931 -g15 -aI514 -aI-1015 -aI348 -aI-995 -aI427 -aI-1015 -aa(lp18932 -g15 -aI752 -aI-952 -aI602 -aI-1015 -aI681 -aI-994 -aa(lp18933 -g15 -aI914 -aI-777 -aI823 -aI-911 -aI877 -aI-852 -aa(lp18934 -g15 -aI970 -aI-522 -aI951 -aI-701 -aI970 -aI-616 -aa(lp18935 -g15 -aI934 -aI-310 -aI970 -aI-443 -aI958 -aI-373 -aa(lp18936 -g15 -aI826 -aI-146 -aI910 -aI-247 -aI874 -aI-193 -aa(lp18937 -g10 -aa(lp18938 -g8 -aI548 -aI-308 -aa(lp18939 -g15 -aI728 -aI-216 -aI621 -aI-287 -aI681 -aI-257 -aa(lp18940 -g15 -aI839 -aI-522 -aI802 -aI-284 -aI839 -aI-386 -aa(lp18941 -g15 -aI800 -aI-724 -aI839 -aI-599 -aI826 -aI-667 -aa(lp18942 -g15 -aI685 -aI-859 -aI774 -aI-782 -aI735 -aI-827 -aa(lp18943 -g15 -aI514 -aI-907 -aI634 -aI-891 -aI577 -aI-907 -aa(lp18944 -g15 -aI280 -aI-810 -aI420 -aI-907 -aI342 -aI-874 -aa(lp18945 -g15 -aI187 -aI-521 -aI218 -aI-745 -aI187 -aI-649 -aa(lp18946 -g15 -aI279 -aI-235 -aI187 -aI-397 -aI218 -aI-302 -aa(lp18947 -g15 -aI514 -aI-136 -aI341 -aI-169 -aI419 -aI-136 -aa(lp18948 -g15 -aI642 -aI-161 -aI560 -aI-136 -aI602 -aI-144 -aa(lp18949 -g15 -aI517 -aI-216 -aI603 -aI-187 -aI561 -aI-205 -aa(lp18950 -g10 -aa(lp18951 -g8 -aI1037 -aI-44 -aa(lp18952 -g10 -aa(lp18953 -g8 -aI1037 -aI-44 -aasVU -(lp18954 -(lp18955 -g8 -aI729 -aI-998 -aa(lp18956 -g20 -aI855 -aI-998 -aa(lp18957 -g20 -aI855 -aI-447 -aa(lp18958 -g15 -aI822 -aI-218 -aI855 -aI-351 -aI844 -aI-275 -aa(lp18959 -g15 -aI705 -aI-81 -aI801 -aI-162 -aI762 -aI-116 -aa(lp18960 -g15 -aI482 -aI-28 -aI648 -aI-45 -aI574 -aI-28 -aa(lp18961 -g15 -aI263 -aI-74 -aI393 -aI-28 -aI319 -aI-43 -aa(lp18962 -g15 -aI141 -aI-208 -aI206 -aI-105 -aI165 -aI-149 -aa(lp18963 -g15 -aI104 -aI-447 -aI116 -aI-266 -aI104 -aI-346 -aa(lp18964 -g20 -aI104 -aI-998 -aa(lp18965 -g20 -aI231 -aI-998 -aa(lp18966 -g20 -aI231 -aI-448 -aa(lp18967 -g15 -aI254 -aI-264 -aI231 -aI-365 -aI238 -aI-304 -aa(lp18968 -g15 -aI333 -aI-174 -aI269 -aI-225 -aI296 -aI-195 -aa(lp18969 -g15 -aI471 -aI-142 -aI371 -aI-152 -aI417 -aI-142 -aa(lp18970 -g15 -aI669 -aI-205 -aI564 -aI-142 -aI630 -aI-163 -aa(lp18971 -g15 -aI729 -aI-448 -aI709 -aI-247 -aI729 -aI-328 -aa(lp18972 -g10 -aa(lp18973 -g8 -aI962 -aI-44 -aa(lp18974 -g10 -aa(lp18975 -g8 -aI962 -aI-44 -aasVY -(lp18976 -(lp18977 -g8 -aI371 -aI-44 -aa(lp18978 -g20 -aI371 -aI-448 -aa(lp18979 -g20 -aI3 -aI-998 -aa(lp18980 -g20 -aI157 -aI-998 -aa(lp18981 -g20 -aI345 -aI-711 -aa(lp18982 -g15 -aI442 -aI-549 -aI380 -aI-657 -aI412 -aI-603 -aa(lp18983 -g15 -aI546 -aI-718 -aI471 -aI-599 -aI506 -aI-655 -aa(lp18984 -g20 -aI731 -aI-998 -aa(lp18985 -g20 -aI878 -aI-998 -aa(lp18986 -g20 -aI498 -aI-448 -aa(lp18987 -g20 -aI498 -aI-44 -aa(lp18988 -g10 -aa(lp18989 -g8 -aI889 -aI-44 -aa(lp18990 -g10 -aa(lp18991 -g8 -aI889 -aI-44 -aasV] -(lp18992 -(lp18993 -g8 -aI283 -aI220 -aa(lp18994 -g20 -aI25 -aI220 -aa(lp18995 -g20 -aI25 -aI123 -aa(lp18996 -g20 -aI166 -aI123 -aa(lp18997 -g20 -aI166 -aI-901 -aa(lp18998 -g20 -aI25 -aI-901 -aa(lp18999 -g20 -aI25 -aI-998 -aa(lp19000 -g20 -aI283 -aI-998 -aa(lp19001 -g10 -aa(lp19002 -g8 -aI370 -aI-44 -aa(lp19003 -g10 -aa(lp19004 -g8 -aI370 -aI-44 -aasVa -(lp19005 -(lp19006 -g8 -aI539 -aI-129 -aa(lp19007 -g15 -aI413 -aI-51 -aI495 -aI-92 -aI453 -aI-66 -aa(lp19008 -g15 -aI284 -aI-28 -aI373 -aI-36 -aI330 -aI-28 -aa(lp19009 -g15 -aI109 -aI-84 -aI208 -aI-28 -aI150 -aI-47 -aa(lp19010 -g15 -aI48 -aI-226 -aI68 -aI-121 -aI48 -aI-169 -aa(lp19011 -g15 -aI71 -aI-319 -aI48 -aI-260 -aI55 -aI-291 -aa(lp19012 -g15 -aI131 -aI-386 -aI86 -aI-347 -aI106 -aI-369 -aa(lp19013 -g15 -aI216 -aI-425 -aI156 -aI-403 -aI184 -aI-416 -aa(lp19014 -g15 -aI320 -aI-442 -aI239 -aI-431 -aI273 -aI-437 -aa(lp19015 -g15 -aI529 -aI-483 -aI414 -aI-454 -aI484 -aI-467 -aa(lp19016 -g15 -aI529 -aI-513 -aI529 -aI-499 -aI529 -aI-509 -aa(lp19017 -g15 -aI496 -aI-614 -aI529 -aI-561 -aI518 -aI-595 -aa(lp19018 -g15 -aI363 -aI-654 -aI466 -aI-641 -aI422 -aI-654 -aa(lp19019 -g15 -aI241 -aI-625 -aI308 -aI-654 -aI267 -aI-644 -aa(lp19020 -g15 -aI182 -aI-522 -aI214 -aI-606 -aI195 -aI-572 -aa(lp19021 -g20 -aI68 -aI-538 -aa(lp19022 -g15 -aI119 -aI-657 -aI78 -aI-587 -aI95 -aI-627 -aa(lp19023 -g15 -aI223 -aI-727 -aI143 -aI-687 -aI178 -aI-710 -aa(lp19024 -g15 -aI380 -aI-751 -aI268 -aI-743 -aI320 -aI-751 -aa(lp19025 -g15 -aI524 -aI-730 -aI439 -aI-751 -aI487 -aI-744 -aa(lp19026 -g15 -aI605 -aI-678 -aI560 -aI-716 -aI588 -aI-699 -aa(lp19027 -g15 -aI641 -aI-598 -aI622 -aI-657 -aI634 -aI-630 -aa(lp19028 -g15 -aI647 -aI-490 -aI645 -aI-578 -aI647 -aI-542 -aa(lp19029 -g20 -aI647 -aI-334 -aa(lp19030 -g15 -aI655 -aI-127 -aI647 -aI-225 -aI650 -aI-156 -aa(lp19031 -g15 -aI684 -aI-44 -aI660 -aI-98 -aI670 -aI-70 -aa(lp19032 -g20 -aI562 -aI-44 -aa(lp19033 -g15 -aI539 -aI-129 -aI550 -aI-68 -aI542 -aI-97 -aa(lp19034 -g10 -aa(lp19035 -g8 -aI529 -aI-391 -aa(lp19036 -g15 -aI337 -aI-347 -aI486 -aI-374 -aI422 -aI-359 -aa(lp19037 -g15 -aI235 -aI-323 -aI289 -aI-340 -aI255 -aI-332 -aa(lp19038 -g15 -aI189 -aI-285 -aI215 -aI-315 -aI200 -aI-302 -aa(lp19039 -g15 -aI173 -aI-229 -aI178 -aI-268 -aI173 -aI-250 -aa(lp19040 -g15 -aI208 -aI-151 -aI173 -aI-198 -aI185 -aI-172 -aa(lp19041 -g15 -aI312 -aI-120 -aI232 -aI-131 -aI266 -aI-120 -aa(lp19042 -g15 -aI432 -aI-150 -aI357 -aI-120 -aI397 -aI-130 -aa(lp19043 -g15 -aI510 -aI-231 -aI468 -aI-169 -aI493 -aI-197 -aa(lp19044 -g15 -aI529 -aI-348 -aI523 -aI-257 -aI529 -aI-296 -aa(lp19045 -g10 -aa(lp19046 -g8 -aI741 -aI-44 -aa(lp19047 -g10 -aa(lp19048 -g8 -aI741 -aI-44 -aasVe -(lp19049 -(lp19050 -g8 -aI561 -aI-267 -aa(lp19051 -g20 -aI682 -aI-252 -aa(lp19052 -g15 -aI576 -aI-87 -aI663 -aI-181 -aI627 -aI-126 -aa(lp19053 -g15 -aI378 -aI-28 -aI524 -aI-48 -aI458 -aI-28 -aa(lp19054 -g15 -aI137 -aI-122 -aI277 -aI-28 -aI196 -aI-59 -aa(lp19055 -g15 -aI48 -aI-384 -aI78 -aI-184 -aI48 -aI-271 -aa(lp19056 -g15 -aI138 -aI-655 -aI48 -aI-500 -aI78 -aI-590 -aa(lp19057 -g15 -aI371 -aI-751 -aI198 -aI-719 -aI276 -aI-751 -aa(lp19058 -g15 -aI598 -aI-657 -aI464 -aI-751 -aI539 -aI-720 -aa(lp19059 -g15 -aI686 -aI-391 -aI656 -aI-594 -aI686 -aI-505 -aa(lp19060 -g15 -aI685 -aI-360 -aI686 -aI-384 -aI685 -aI-374 -aa(lp19061 -g20 -aI169 -aI-360 -aa(lp19062 -g15 -aI234 -aI-185 -aI174 -aI-284 -aI195 -aI-226 -aa(lp19063 -g15 -aI378 -aI-125 -aI273 -aI-145 -aI321 -aI-125 -aa(lp19064 -g15 -aI488 -aI-159 -aI421 -aI-125 -aI458 -aI-136 -aa(lp19065 -g15 -aI561 -aI-267 -aI519 -aI-181 -aI543 -aI-217 -aa(lp19066 -g10 -aa(lp19067 -g8 -aI176 -aI-456 -aa(lp19068 -g20 -aI562 -aI-456 -aa(lp19069 -g15 -aI518 -aI-587 -aI557 -aI-514 -aI542 -aI-558 -aa(lp19070 -g15 -aI373 -aI-655 -aI480 -aI-632 -aI432 -aI-655 -aa(lp19071 -g15 -aI237 -aI-601 -aI319 -aI-655 -aI273 -aI-637 -aa(lp19072 -g15 -aI176 -aI-456 -aI200 -aI-565 -aI180 -aI-516 -aa(lp19073 -g10 -aa(lp19074 -g8 -aI741 -aI-44 -aa(lp19075 -g10 -aa(lp19076 -g8 -aI741 -aI-44 -aasVi -(lp19077 -(lp19078 -g8 -aI88 -aI-864 -aa(lp19079 -g20 -aI88 -aI-998 -aa(lp19080 -g20 -aI205 -aI-998 -aa(lp19081 -g20 -aI205 -aI-864 -aa(lp19082 -g10 -aa(lp19083 -g8 -aI88 -aI-44 -aa(lp19084 -g20 -aI88 -aI-735 -aa(lp19085 -g20 -aI205 -aI-735 -aa(lp19086 -g20 -aI205 -aI-44 -aa(lp19087 -g10 -aa(lp19088 -g8 -aI296 -aI-44 -aa(lp19089 -g10 -aa(lp19090 -g8 -aI296 -aI-44 -aasVm -(lp19091 -(lp19092 -g8 -aI87 -aI-44 -aa(lp19093 -g20 -aI87 -aI-735 -aa(lp19094 -g20 -aI192 -aI-735 -aa(lp19095 -g20 -aI192 -aI-638 -aa(lp19096 -g15 -aI279 -aI-720 -aI214 -aI-672 -aI243 -aI-699 -aa(lp19097 -g15 -aI402 -aI-751 -aI315 -aI-741 -aI356 -aI-751 -aa(lp19098 -g15 -aI528 -aI-719 -aI453 -aI-751 -aI495 -aI-740 -aa(lp19099 -g15 -aI597 -aI-630 -aI561 -aI-698 -aI584 -aI-668 -aa(lp19100 -g15 -aI811 -aI-751 -aI652 -aI-711 -aI723 -aI-751 -aa(lp19101 -g15 -aI969 -aI-694 -aI879 -aI-751 -aI932 -aI-732 -aa(lp19102 -g15 -aI1024 -aI-519 -aI1006 -aI-656 -aI1024 -aI-598 -aa(lp19103 -g20 -aI1024 -aI-44 -aa(lp19104 -g20 -aI908 -aI-44 -aa(lp19105 -g20 -aI908 -aI-479 -aa(lp19106 -g15 -aI896 -aI-581 -aI908 -aI-526 -aI904 -aI-560 -aa(lp19107 -g15 -aI855 -aI-631 -aI889 -aI-601 -aI875 -aI-618 -aa(lp19108 -g15 -aI785 -aI-649 -aI835 -aI-643 -aI812 -aI-649 -aa(lp19109 -g15 -aI664 -aI-601 -aI736 -aI-649 -aI696 -aI-633 -aa(lp19110 -g15 -aI615 -aI-446 -aI631 -aI-569 -aI615 -aI-517 -aa(lp19111 -g20 -aI615 -aI-44 -aa(lp19112 -g20 -aI498 -aI-44 -aa(lp19113 -g20 -aI498 -aI-493 -aa(lp19114 -g15 -aI470 -aI-610 -aI498 -aI-545 -aI489 -aI-584 -aa(lp19115 -g15 -aI376 -aI-649 -aI450 -aI-636 -aI419 -aI-649 -aa(lp19116 -g15 -aI284 -aI-623 -aI343 -aI-649 -aI312 -aI-641 -aa(lp19117 -g15 -aI223 -aI-547 -aI256 -aI-606 -aI236 -aI-581 -aa(lp19118 -g15 -aI205 -aI-403 -aI211 -aI-514 -aI205 -aI-466 -aa(lp19119 -g20 -aI205 -aI-44 -aa(lp19120 -g10 -aa(lp19121 -g8 -aI1110 -aI-44 -aa(lp19122 -g10 -aa(lp19123 -g8 -aI1110 -aI-44 -aasVq -(lp19124 -(lp19125 -g8 -aI528 -aI220 -aa(lp19126 -g20 -aI528 -aI-118 -aa(lp19127 -g15 -aI452 -aI-54 -aI510 -aI-92 -aI484 -aI-71 -aa(lp19128 -g15 -aI347 -aI-28 -aI419 -aI-37 -aI384 -aI-28 -aa(lp19129 -g15 -aI135 -aI-127 -aI265 -aI-28 -aI194 -aI-61 -aa(lp19130 -g15 -aI46 -aI-396 -aI76 -aI-192 -aI46 -aI-282 -aa(lp19131 -g15 -aI83 -aI-583 -aI46 -aI-466 -aI58 -aI-528 -aa(lp19132 -g15 -aI187 -aI-708 -aI107 -aI-638 -aI142 -aI-680 -aa(lp19133 -g15 -aI338 -aI-751 -aI233 -aI-737 -aI283 -aI-751 -aa(lp19134 -g15 -aI540 -aI-643 -aI424 -aI-751 -aI491 -aI-715 -aa(lp19135 -g20 -aI540 -aI-735 -aa(lp19136 -g20 -aI645 -aI-735 -aa(lp19137 -g20 -aI645 -aI220 -aa(lp19138 -g10 -aa(lp19139 -g8 -aI167 -aI-392 -aa(lp19140 -g15 -aI223 -aI-191 -aI167 -aI-303 -aI185 -aI-236 -aa(lp19141 -g15 -aI357 -aI-125 -aI260 -aI-147 -aI305 -aI-125 -aa(lp19142 -g15 -aI486 -aI-188 -aI407 -aI-125 -aI450 -aI-146 -aa(lp19143 -g15 -aI540 -aI-381 -aI522 -aI-230 -aI540 -aI-295 -aa(lp19144 -g15 -aI483 -aI-589 -aI540 -aI-473 -aI521 -aI-542 -aa(lp19145 -g15 -aI349 -aI-659 -aI445 -aI-635 -aI400 -aI-659 -aa(lp19146 -g15 -aI220 -aI-594 -aI298 -aI-659 -aI255 -aI-637 -aa(lp19147 -g15 -aI167 -aI-392 -aI185 -aI-551 -aI167 -aI-483 -aa(lp19148 -g10 -aa(lp19149 -g8 -aI741 -aI-44 -aa(lp19150 -g10 -aa(lp19151 -g8 -aI741 -aI-44 -aasVu -(lp19152 -(lp19153 -g8 -aI541 -aI-44 -aa(lp19154 -g20 -aI541 -aI-146 -aa(lp19155 -g15 -aI321 -aI-28 -aI487 -aI-67 -aI414 -aI-28 -aa(lp19156 -g15 -aI207 -aI-52 -aI280 -aI-28 -aI242 -aI-36 -aa(lp19157 -g15 -aI128 -aI-111 -aI171 -aI-67 -aI145 -aI-87 -aa(lp19158 -g15 -aI92 -aI-198 -aI111 -aI-134 -aI99 -aI-163 -aa(lp19159 -g15 -aI85 -aI-307 -aI87 -aI-221 -aI85 -aI-257 -aa(lp19160 -g20 -aI85 -aI-735 -aa(lp19161 -g20 -aI202 -aI-735 -aa(lp19162 -g20 -aI202 -aI-352 -aa(lp19163 -g15 -aI209 -aI-228 -aI202 -aI-291 -aI204 -aI-249 -aa(lp19164 -g15 -aI256 -aI-156 -aI217 -aI-197 -aI232 -aI-173 -aa(lp19165 -g15 -aI345 -aI-129 -aI280 -aI-138 -aI309 -aI-129 -aa(lp19166 -g15 -aI444 -aI-156 -aI380 -aI-129 -aI413 -aI-138 -aa(lp19167 -g15 -aI509 -aI-230 -aI474 -aI-174 -aI496 -aI-199 -aa(lp19168 -g15 -aI528 -aI-365 -aI522 -aI-261 -aI528 -aI-306 -aa(lp19169 -g20 -aI528 -aI-735 -aa(lp19170 -g20 -aI645 -aI-735 -aa(lp19171 -g20 -aI645 -aI-44 -aa(lp19172 -g10 -aa(lp19173 -g8 -aI741 -aI-44 -aa(lp19174 -g10 -aa(lp19175 -g8 -aI741 -aI-44 -aasVy -(lp19176 -(lp19177 -g8 -aI82 -aI221 -aa(lp19178 -g20 -aI69 -aI111 -aa(lp19179 -g15 -aI136 -aI122 -aI95 -aI118 -aI117 -aI122 -aa(lp19180 -g15 -aI199 -aI109 -aI162 -aI122 -aI183 -aI117 -aa(lp19181 -g15 -aI237 -aI72 -aI214 -aI100 -aI227 -aI88 -aa(lp19182 -g15 -aI273 -aI-14 -aI245 -aI61 -aI256 -aI31 -aa(lp19183 -g15 -aI283 -aI-43 -aI275 -aI-21 -aI279 -aI-30 -aa(lp19184 -g20 -aI21 -aI-735 -aa(lp19185 -g20 -aI147 -aI-735 -aa(lp19186 -g20 -aI291 -aI-335 -aa(lp19187 -g15 -aI341 -aI-175 -aI310 -aI-284 -aI327 -aI-231 -aa(lp19188 -g15 -aI389 -aI-332 -aI355 -aI-229 -aI371 -aI-281 -aa(lp19189 -g20 -aI537 -aI-735 -aa(lp19190 -g20 -aI654 -aI-735 -aa(lp19191 -g20 -aI391 -aI-32 -aa(lp19192 -g15 -aI326 -aI124 -aI363 -aI43 -aI341 -aI95 -aa(lp19193 -g15 -aI254 -aI209 -aI305 -aI162 -aI281 -aI191 -aa(lp19194 -g15 -aI158 -aI236 -aI227 -aI227 -aI195 -aI236 -aa(lp19195 -g15 -aI82 -aI221 -aI135 -aI236 -aI110 -aI231 -aa(lp19196 -g10 -aa(lp19197 -g8 -aI666 -aI-44 -aa(lp19198 -g10 -aa(lp19199 -g8 -aI666 -aI-44 -aasV} -(lp19200 -(lp19201 -g8 -aI407 -aI-442 -aa(lp19202 -g20 -aI407 -aI-336 -aa(lp19203 -g15 -aI325 -aI-309 -aI374 -aI-335 -aI346 -aI-326 -aa(lp19204 -g15 -aI283 -aI-238 -aI304 -aI-292 -aI290 -aI-268 -aa(lp19205 -g15 -aI272 -aI-85 -aI276 -aI-209 -aI273 -aI-157 -aa(lp19206 -g15 -aI268 -aI57 -aI272 -aI-12 -aI271 -aI34 -aa(lp19207 -g15 -aI247 -aI145 -aI264 -aI94 -aI257 -aI124 -aa(lp19208 -g15 -aI207 -aI198 -aI236 -aI167 -aI223 -aI185 -aa(lp19209 -g15 -aI147 -aI228 -aI192 -aI211 -aI172 -aI222 -aa(lp19210 -g15 -aI67 -aI236 -aI131 -aI233 -aI104 -aI236 -aa(lp19211 -g20 -aI30 -aI236 -aa(lp19212 -g20 -aI30 -aI133 -aa(lp19213 -g20 -aI50 -aI133 -aa(lp19214 -g15 -aI140 -aI109 -aI95 -aI133 -aI125 -aI125 -aa(lp19215 -g15 -aI162 -aI0 -aI155 -aI93 -aI162 -aI56 -aa(lp19216 -g15 -aI168 -aI-206 -aI162 -aI-108 -aI164 -aI-177 -aa(lp19217 -g15 -aI210 -aI-322 -aI175 -aI-254 -aI189 -aI-293 -aa(lp19218 -g15 -aI298 -aI-389 -aI231 -aI-350 -aI260 -aI-373 -aa(lp19219 -g15 -aI193 -aI-484 -aI248 -aI-413 -aI213 -aI-444 -aa(lp19220 -g15 -aI162 -aI-683 -aI172 -aI-523 -aI162 -aI-589 -aa(lp19221 -g15 -aI159 -aI-834 -aI162 -aI-767 -aI161 -aI-818 -aa(lp19222 -g15 -aI133 -aI-895 -aI156 -aI-863 -aI147 -aI-884 -aa(lp19223 -g15 -aI50 -aI-912 -aI119 -aI-907 -aI92 -aI-912 -aa(lp19224 -g20 -aI30 -aI-912 -aa(lp19225 -g20 -aI30 -aI-1015 -aa(lp19226 -g20 -aI67 -aI-1015 -aa(lp19227 -g15 -aI159 -aI-1004 -aI109 -aI-1015 -aI140 -aI-1011 -aa(lp19228 -g15 -aI228 -aI-956 -aI187 -aI-995 -aI210 -aI-979 -aa(lp19229 -g15 -aI263 -aI-871 -aI246 -aI-933 -aI258 -aI-905 -aa(lp19230 -g15 -aI272 -aI-702 -aI269 -aI-836 -aI272 -aI-780 -aa(lp19231 -g15 -aI283 -aI-540 -aI273 -aI-624 -aI276 -aI-570 -aa(lp19232 -g15 -aI325 -aI-470 -aI290 -aI-511 -aI304 -aI-487 -aa(lp19233 -g15 -aI407 -aI-442 -aI346 -aI-452 -aI374 -aI-443 -aa(lp19234 -g10 -aa(lp19235 -g8 -aI445 -aI-44 -aa(lp19236 -g10 -aa(lp19237 -g8 -aI445 -aI-44 -aasssS'Droid Sans' -p19238 -(dp19239 -g4270 -(dp19240 -V -(lp19241 -(lp19242 -g8 -aI346 -aI0 -aa(lp19243 -g10 -aa(lp19244 -g8 -aI346 -aI0 -aasV$ -(lp19245 -(lp19246 -g8 -aI690 -aI-297 -aa(lp19247 -g15 -aI673 -aI-206 -aI690 -aI-264 -aI685 -aI-234 -aa(lp19248 -g15 -aI622 -aI-133 -aI662 -aI-178 -aI644 -aI-154 -aa(lp19249 -g15 -aI537 -aI-82 -aI599 -aI-112 -aI570 -aI-95 -aa(lp19250 -g15 -aI419 -aI-55 -aI503 -aI-68 -aI464 -aI-59 -aa(lp19251 -g20 -aI419 -aI77 -aa(lp19252 -g20 -aI330 -aI77 -aa(lp19253 -g20 -aI330 -aI-52 -aa(lp19254 -g15 -aI251 -aI-58 -aI302 -aI-53 -aI275 -aI-55 -aa(lp19255 -g15 -aI182 -aI-69 -aI226 -aI-60 -aI204 -aI-64 -aa(lp19256 -g15 -aI122 -aI-86 -aI161 -aI-73 -aI141 -aI-79 -aa(lp19257 -g15 -aI65 -aI-108 -aI102 -aI-93 -aI83 -aI-100 -aa(lp19258 -g20 -aI65 -aI-280 -aa(lp19259 -g15 -aI124 -aI-254 -aI83 -aI-271 -aI103 -aI-263 -aa(lp19260 -g15 -aI191 -aI-232 -aI146 -aI-246 -aI168 -aI-239 -aa(lp19261 -g15 -aI261 -aI-215 -aI214 -aI-225 -aI237 -aI-219 -aa(lp19262 -g15 -aI330 -aI-205 -aI285 -aI-210 -aI308 -aI-207 -aa(lp19263 -g20 -aI330 -aI-412 -aa(lp19264 -g15 -aI319 -aI-417 -aI327 -aI-414 -aI323 -aI-415 -aa(lp19265 -g15 -aI309 -aI-421 -aI316 -aI-418 -aI312 -aI-420 -aa(lp19266 -g15 -aI300 -aI-424 -aI305 -aI-422 -aI302 -aI-423 -aa(lp19267 -g15 -aI196 -aI-472 -aI260 -aI-439 -aI226 -aI-455 -aa(lp19268 -g15 -aI122 -aI-527 -aI167 -aI-488 -aI142 -aI-507 -aa(lp19269 -g15 -aI78 -aI-595 -aI102 -aI-547 -aI88 -aI-570 -aa(lp19270 -g15 -aI63 -aI-679 -aI68 -aI-619 -aI63 -aI-647 -aa(lp19271 -g15 -aI82 -aI-768 -aI63 -aI-711 -aI69 -aI-741 -aa(lp19272 -g15 -aI135 -aI-837 -aI94 -aI-794 -aI112 -aI-818 -aa(lp19273 -g15 -aI219 -aI-885 -aI158 -aI-857 -aI186 -aI-873 -aa(lp19274 -g15 -aI330 -aI-910 -aI252 -aI-898 -aI289 -aI-906 -aa(lp19275 -g20 -aI330 -aI-1012 -aa(lp19276 -g20 -aI419 -aI-1012 -aa(lp19277 -g20 -aI419 -aI-914 -aa(lp19278 -g15 -aI535 -aI-897 -aI457 -aI-912 -aI496 -aI-906 -aa(lp19279 -g15 -aI660 -aI-856 -aI575 -aI-889 -aI616 -aI-875 -aa(lp19280 -g20 -aI594 -aI-704 -aa(lp19281 -g15 -aI506 -aI-734 -aI566 -aI-715 -aI536 -aI-726 -aa(lp19282 -g15 -aI419 -aI-751 -aI475 -aI-743 -aI446 -aI-749 -aa(lp19283 -g20 -aI419 -aI-560 -aa(lp19284 -g20 -aI445 -aI-551 -aa(lp19285 -g15 -aI553 -aI-504 -aI486 -aI-536 -aI522 -aI-520 -aa(lp19286 -g15 -aI630 -aI-450 -aI584 -aI-488 -aI609 -aI-470 -aa(lp19287 -g15 -aI675 -aI-383 -aI650 -aI-430 -aI665 -aI-408 -aa(lp19288 -g15 -aI690 -aI-297 -aI685 -aI-358 -aI690 -aI-330 -aa(lp19289 -g10 -aa(lp19290 -g8 -aI494 -aI-293 -aa(lp19291 -g15 -aI490 -aI-320 -aI494 -aI-303 -aI493 -aI-312 -aa(lp19292 -g15 -aI477 -aI-341 -aI487 -aI-328 -aI483 -aI-335 -aa(lp19293 -g15 -aI454 -aI-359 -aI471 -aI-348 -aI463 -aI-354 -aa(lp19294 -g15 -aI419 -aI-377 -aI444 -aI-365 -aI433 -aI-371 -aa(lp19295 -g20 -aI419 -aI-213 -aa(lp19296 -g15 -aI476 -aI-238 -aI445 -aI-216 -aI464 -aI-225 -aa(lp19297 -g15 -aI494 -aI-293 -aI488 -aI-251 -aI494 -aI-269 -aa(lp19298 -g10 -aa(lp19299 -g8 -aI259 -aI-683 -aa(lp19300 -g15 -aI276 -aI-632 -aI259 -aI-663 -aI265 -aI-646 -aa(lp19301 -g15 -aI330 -aI-598 -aI287 -aI-619 -aI305 -aI-607 -aa(lp19302 -g20 -aI330 -aI-750 -aa(lp19303 -g15 -aI277 -aI-730 -aI307 -aI-747 -aI289 -aI-741 -aa(lp19304 -g15 -aI259 -aI-683 -aI265 -aI-720 -aI259 -aI-704 -aa(lp19305 -g10 -aa(lp19306 -g8 -aI734 -aI0 -aa(lp19307 -g10 -aa(lp19308 -g8 -aI734 -aI0 -aasV( -(lp19309 -(lp19310 -g8 -aI53 -aI-364 -aa(lp19311 -g15 -aI65 -aI-525 -aI53 -aI-419 -aI57 -aI-472 -aa(lp19312 -g15 -aI100 -aI-678 -aI72 -aI-577 -aI84 -aI-629 -aa(lp19313 -g15 -aI161 -aI-822 -aI116 -aI-728 -aI137 -aI-776 -aa(lp19314 -g15 -aI249 -aI-951 -aI186 -aI-867 -aI215 -aI-911 -aa(lp19315 -g20 -aI412 -aI-951 -aa(lp19316 -g15 -aI273 -aI-675 -aI350 -aI-867 -aI304 -aI-775 -aa(lp19317 -g15 -aI226 -aI-366 -aI242 -aI-575 -aI226 -aI-471 -aa(lp19318 -g15 -aI238 -aI-211 -aI226 -aI-314 -aI230 -aI-263 -aa(lp19319 -g15 -aI273 -aI-61 -aI246 -aI-160 -aI257 -aI-110 -aa(lp19320 -g15 -aI331 -aI81 -aI289 -aI-12 -aI308 -aI35 -aa(lp19321 -g15 -aI410 -aI211 -aI354 -aI127 -aI380 -aI170 -aa(lp19322 -g20 -aI249 -aI211 -aa(lp19323 -g15 -aI161 -aI85 -aI215 -aI172 -aI186 -aI130 -aa(lp19324 -g15 -aI100 -aI-54 -aI137 -aI41 -aI116 -aI-5 -aa(lp19325 -g15 -aI65 -aI-205 -aI84 -aI-103 -aI72 -aI-153 -aa(lp19326 -g15 -aI53 -aI-364 -aI57 -aI-258 -aI53 -aI-310 -aa(lp19327 -g10 -aa(lp19328 -g8 -aI451 -aI0 -aa(lp19329 -g10 -aa(lp19330 -g8 -aI451 -aI0 -aasV, -(lp19331 -(lp19332 -g8 -aI298 -aI-139 -aa(lp19333 -g15 -aI277 -aI-64 -aI292 -aI-116 -aI285 -aI-91 -aa(lp19334 -g15 -aI249 -aI15 -aI268 -aI-38 -aI259 -aI-11 -aa(lp19335 -g15 -aI217 -aI95 -aI238 -aI42 -aI228 -aI69 -aa(lp19336 -g15 -aI184 -aI172 -aI206 -aI122 -aI195 -aI148 -aa(lp19337 -g20 -aI41 -aI172 -aa(lp19338 -g15 -aI60 -aI89 -aI47 -aI145 -aI53 -aI118 -aa(lp19339 -g15 -aI78 -aI4 -aI66 -aI60 -aI72 -aI32 -aa(lp19340 -g15 -aI94 -aI-79 -aI84 -aI-24 -aI89 -aI-52 -aa(lp19341 -g15 -aI106 -aI-154 -aI99 -aI-106 -aI103 -aI-131 -aa(lp19342 -g20 -aI289 -aI-154 -aa(lp19343 -g10 -aa(lp19344 -g8 -aI386 -aI0 -aa(lp19345 -g10 -aa(lp19346 -g8 -aI386 -aI0 -aasV0 -(lp19347 -(lp19348 -g8 -aI693 -aI-475 -aa(lp19349 -g15 -aI675 -aI-269 -aI693 -aI-398 -aI687 -aI-330 -aa(lp19350 -g15 -aI618 -aI-116 -aI663 -aI-209 -aI644 -aI-158 -aa(lp19351 -g15 -aI516 -aI-19 -aI591 -aI-73 -aI558 -aI-41 -aa(lp19352 -g15 -aI366 -aI13 -aI475 -aI2 -aI425 -aI13 -aa(lp19353 -g15 -aI222 -aI-19 -aI311 -aI13 -aI263 -aI2 -aa(lp19354 -g15 -aI121 -aI-116 -aI181 -aI-41 -aI148 -aI-73 -aa(lp19355 -g15 -aI60 -aI-269 -aI94 -aI-158 -aI74 -aI-209 -aa(lp19356 -g15 -aI41 -aI-475 -aI47 -aI-330 -aI41 -aI-398 -aa(lp19357 -g15 -aI58 -aI-681 -aI41 -aI-552 -aI46 -aI-621 -aa(lp19358 -g15 -aI115 -aI-836 -aI70 -aI-742 -aI89 -aI-794 -aa(lp19359 -g15 -aI216 -aI-932 -aI141 -aI-878 -aI175 -aI-910 -aa(lp19360 -g15 -aI366 -aI-966 -aI258 -aI-955 -aI307 -aI-966 -aa(lp19361 -g15 -aI509 -aI-933 -aI421 -aI-966 -aI468 -aI-955 -aa(lp19362 -g15 -aI611 -aI-836 -aI550 -aI-911 -aI584 -aI-878 -aa(lp19363 -g15 -aI673 -aI-682 -aI639 -aI-794 -aI659 -aI-743 -aa(lp19364 -g15 -aI693 -aI-475 -aI686 -aI-621 -aI693 -aI-552 -aa(lp19365 -g10 -aa(lp19366 -g8 -aI241 -aI-475 -aa(lp19367 -g15 -aI269 -aI-230 -aI241 -aI-366 -aI250 -aI-285 -aa(lp19368 -g15 -aI366 -aI-148 -aI288 -aI-175 -aI320 -aI-148 -aa(lp19369 -g15 -aI463 -aI-230 -aI411 -aI-148 -aI444 -aI-175 -aa(lp19370 -g15 -aI493 -aI-475 -aI483 -aI-284 -aI493 -aI-366 -aa(lp19371 -g15 -aI463 -aI-721 -aI493 -aI-584 -aI483 -aI-666 -aa(lp19372 -g15 -aI366 -aI-803 -aI444 -aI-776 -aI411 -aI-803 -aa(lp19373 -g15 -aI308 -aI-782 -aI343 -aI-803 -aI324 -aI-796 -aa(lp19374 -g15 -aI269 -aI-720 -aI292 -aI-768 -aI279 -aI-748 -aa(lp19375 -g15 -aI248 -aI-618 -aI259 -aI-693 -aI252 -aI-659 -aa(lp19376 -g15 -aI241 -aI-475 -aI243 -aI-577 -aI241 -aI-529 -aa(lp19377 -g10 -aa(lp19378 -g8 -aI734 -aI0 -aa(lp19379 -g10 -aa(lp19380 -g8 -aI734 -aI0 -aasV4 -(lp19381 -(lp19382 -g8 -aI706 -aI-196 -aa(lp19383 -g20 -aI591 -aI-196 -aa(lp19384 -g20 -aI591 -aI0 -aa(lp19385 -g20 -aI395 -aI0 -aa(lp19386 -g20 -aI395 -aI-196 -aa(lp19387 -g20 -aI2 -aI-196 -aa(lp19388 -g20 -aI2 -aI-336 -aa(lp19389 -g20 -aI406 -aI-951 -aa(lp19390 -g20 -aI591 -aI-951 -aa(lp19391 -g20 -aI591 -aI-353 -aa(lp19392 -g20 -aI706 -aI-353 -aa(lp19393 -g10 -aa(lp19394 -g8 -aI395 -aI-353 -aa(lp19395 -g20 -aI395 -aI-514 -aa(lp19396 -g15 -aI396 -aI-538 -aI395 -aI-520 -aI395 -aI-528 -aa(lp19397 -g15 -aI397 -aI-575 -aI396 -aI-549 -aI396 -aI-561 -aa(lp19398 -g15 -aI398 -aI-616 -aI397 -aI-588 -aI398 -aI-602 -aa(lp19399 -g15 -aI400 -aI-657 -aI399 -aI-631 -aI400 -aI-644 -aa(lp19400 -g15 -aI402 -aI-691 -aI401 -aI-670 -aI402 -aI-682 -aa(lp19401 -g15 -aI404 -aI-713 -aI403 -aI-701 -aI403 -aI-708 -aa(lp19402 -g20 -aI398 -aI-713 -aa(lp19403 -g15 -aI372 -aI-655 -aI390 -aI-694 -aI381 -aI-675 -aa(lp19404 -g15 -aI338 -aI-593 -aI362 -aI-634 -aI351 -aI-614 -aa(lp19405 -g20 -aI179 -aI-353 -aa(lp19406 -g10 -aa(lp19407 -g8 -aI734 -aI0 -aa(lp19408 -g10 -aa(lp19409 -g8 -aI734 -aI0 -aasV8 -(lp19410 -(lp19411 -g8 -aI367 -aI-963 -aa(lp19412 -g15 -aI479 -aI-949 -aI407 -aI-963 -aI444 -aI-958 -aa(lp19413 -g15 -aI572 -aI-906 -aI514 -aI-939 -aI545 -aI-925 -aa(lp19414 -g15 -aI635 -aI-834 -aI598 -aI-887 -aI619 -aI-863 -aa(lp19415 -g15 -aI658 -aI-733 -aI651 -aI-806 -aI658 -aI-772 -aa(lp19416 -g15 -aI645 -aI-656 -aI658 -aI-705 -aI654 -aI-679 -aa(lp19417 -g15 -aI610 -aI-592 -aI637 -aI-632 -aI625 -aI-611 -aa(lp19418 -g15 -aI555 -aI-542 -aI594 -aI-574 -aI576 -aI-557 -aa(lp19419 -g15 -aI488 -aI-502 -aI535 -aI-527 -aI512 -aI-514 -aa(lp19420 -g15 -aI562 -aI-457 -aI513 -aI-488 -aI538 -aI-473 -aa(lp19421 -g15 -aI626 -aI-401 -aI586 -aI-440 -aI607 -aI-422 -aa(lp19422 -g15 -aI671 -aI-332 -aI644 -aI-380 -aI659 -aI-357 -aa(lp19423 -g15 -aI688 -aI-246 -aI682 -aI-306 -aI688 -aI-277 -aa(lp19424 -g15 -aI664 -aI-138 -aI688 -aI-206 -aI680 -aI-170 -aa(lp19425 -g15 -aI598 -aI-56 -aI649 -aI-106 -aI627 -aI-79 -aa(lp19426 -g15 -aI497 -aI-4 -aI570 -aI-34 -aI537 -aI-16 -aa(lp19427 -g15 -aI367 -aI13 -aI458 -aI7 -aI415 -aI13 -aa(lp19428 -g15 -aI231 -aI-4 -aI316 -aI13 -aI271 -aI7 -aa(lp19429 -g15 -aI130 -aI-54 -aI191 -aI-15 -aI157 -aI-32 -aa(lp19430 -g15 -aI68 -aI-134 -aI102 -aI-75 -aI82 -aI-102 -aa(lp19431 -g15 -aI46 -aI-241 -aI53 -aI-165 -aI46 -aI-201 -aa(lp19432 -g15 -aI61 -aI-328 -aI46 -aI-273 -aI51 -aI-302 -aa(lp19433 -g15 -aI100 -aI-399 -aI70 -aI-355 -aI83 -aI-378 -aa(lp19434 -g15 -aI158 -aI-454 -aI116 -aI-420 -aI136 -aI-438 -aa(lp19435 -g15 -aI229 -aI-496 -aI180 -aI-470 -aI203 -aI-484 -aa(lp19436 -g15 -aI169 -aI-540 -aI207 -aI-510 -aI187 -aI-525 -aa(lp19437 -g15 -aI120 -aI-593 -aI150 -aI-556 -aI134 -aI-574 -aa(lp19438 -g15 -aI88 -aI-657 -aI107 -aI-612 -aI96 -aI-634 -aa(lp19439 -g15 -aI76 -aI-735 -aI80 -aI-681 -aI76 -aI-707 -aa(lp19440 -g15 -aI99 -aI-834 -aI76 -aI-772 -aI84 -aI-806 -aa(lp19441 -g15 -aI164 -aI-906 -aI115 -aI-862 -aI137 -aI-886 -aa(lp19442 -g15 -aI257 -aI-949 -aI190 -aI-925 -aI222 -aI-939 -aa(lp19443 -g15 -aI367 -aI-963 -aI292 -aI-958 -aI329 -aI-963 -aa(lp19444 -g10 -aa(lp19445 -g8 -aI233 -aI-252 -aa(lp19446 -g15 -aI241 -aI-204 -aI233 -aI-235 -aI235 -aI-219 -aa(lp19447 -g15 -aI266 -aI-167 -aI247 -aI-190 -aI255 -aI-177 -aa(lp19448 -g15 -aI307 -aI-143 -aI277 -aI-157 -aI291 -aI-148 -aa(lp19449 -g15 -aI365 -aI-134 -aI324 -aI-137 -aI343 -aI-134 -aa(lp19450 -g15 -aI467 -aI-166 -aI410 -aI-134 -aI444 -aI-145 -aa(lp19451 -g15 -aI501 -aI-251 -aI490 -aI-188 -aI501 -aI-216 -aa(lp19452 -g15 -aI489 -aI-300 -aI501 -aI-269 -aI497 -aI-286 -aa(lp19453 -g15 -aI460 -aI-341 -aI482 -aI-315 -aI472 -aI-328 -aa(lp19454 -g15 -aI419 -aI-375 -aI448 -aI-353 -aI435 -aI-364 -aa(lp19455 -g15 -aI374 -aI-405 -aI404 -aI-385 -aI389 -aI-395 -aa(lp19456 -g20 -aI360 -aI-414 -aa(lp19457 -g15 -aI307 -aI-383 -aI340 -aI-404 -aI323 -aI-394 -aa(lp19458 -g15 -aI267 -aI-346 -aI292 -aI-372 -aI278 -aI-360 -aa(lp19459 -g15 -aI242 -aI-303 -aI256 -aI-333 -aI248 -aI-319 -aa(lp19460 -g15 -aI233 -aI-252 -aI236 -aI-287 -aI233 -aI-271 -aa(lp19461 -g10 -aa(lp19462 -g8 -aI366 -aI-816 -aa(lp19463 -g15 -aI326 -aI-810 -aI352 -aI-816 -aI338 -aI-814 -aa(lp19464 -g15 -aI294 -aI-791 -aI314 -aI-805 -aI303 -aI-799 -aa(lp19465 -g15 -aI273 -aI-760 -aI285 -aI-782 -aI278 -aI-772 -aa(lp19466 -g15 -aI265 -aI-719 -aI268 -aI-748 -aI265 -aI-734 -aa(lp19467 -g15 -aI273 -aI-672 -aI265 -aI-701 -aI268 -aI-685 -aa(lp19468 -g15 -aI295 -aI-637 -aI279 -aI-659 -aI286 -aI-647 -aa(lp19469 -g15 -aI328 -aI-609 -aI305 -aI-627 -aI316 -aI-617 -aa(lp19470 -g15 -aI367 -aI-586 -aI340 -aI-601 -aI353 -aI-593 -aa(lp19471 -g15 -aI406 -aI-608 -aI381 -aI-593 -aI394 -aI-600 -aa(lp19472 -g15 -aI438 -aI-637 -aI418 -aI-617 -aI429 -aI-626 -aa(lp19473 -g15 -aI460 -aI-673 -aI447 -aI-647 -aI455 -aI-659 -aa(lp19474 -g15 -aI469 -aI-719 -aI466 -aI-686 -aI469 -aI-702 -aa(lp19475 -g15 -aI461 -aI-760 -aI469 -aI-734 -aI466 -aI-748 -aa(lp19476 -g15 -aI440 -aI-791 -aI456 -aI-772 -aI449 -aI-782 -aa(lp19477 -g15 -aI407 -aI-810 -aI430 -aI-799 -aI420 -aI-805 -aa(lp19478 -g15 -aI366 -aI-816 -aI394 -aI-814 -aI381 -aI-816 -aa(lp19479 -g10 -aa(lp19480 -g8 -aI734 -aI0 -aa(lp19481 -g10 -aa(lp19482 -g8 -aI734 -aI0 -aasV< -(lp19483 -(lp19484 -g8 -aI677 -aI-131 -aa(lp19485 -g20 -aI57 -aI-416 -aa(lp19486 -g20 -aI57 -aI-509 -aa(lp19487 -g20 -aI677 -aI-832 -aa(lp19488 -g20 -aI677 -aI-676 -aa(lp19489 -g20 -aI258 -aI-470 -aa(lp19490 -g20 -aI677 -aI-287 -aa(lp19491 -g10 -aa(lp19492 -g8 -aI734 -aI0 -aa(lp19493 -g10 -aa(lp19494 -g8 -aI734 -aI0 -aasV@ -(lp19495 -(lp19496 -g8 -aI1089 -aI-489 -aa(lp19497 -g15 -aI1074 -aI-366 -aI1089 -aI-447 -aI1084 -aI-407 -aa(lp19498 -g15 -aI1029 -aI-258 -aI1064 -aI-326 -aI1049 -aI-290 -aa(lp19499 -g15 -aI954 -aI-180 -aI1009 -aI-226 -aI984 -aI-200 -aa(lp19500 -g15 -aI848 -aI-151 -aI924 -aI-161 -aI889 -aI-151 -aa(lp19501 -g15 -aI801 -aI-157 -aI831 -aI-151 -aI816 -aI-153 -aa(lp19502 -g15 -aI761 -aI-175 -aI787 -aI-161 -aI773 -aI-167 -aa(lp19503 -g15 -aI730 -aI-201 -aI749 -aI-182 -aI739 -aI-191 -aa(lp19504 -g15 -aI709 -aI-235 -aI721 -aI-211 -aI714 -aI-223 -aa(lp19505 -g20 -aI699 -aI-235 -aa(lp19506 -g15 -aI671 -aI-203 -aI691 -aI-224 -aI682 -aI-213 -aa(lp19507 -g15 -aI634 -aI-176 -aI660 -aI-193 -aI648 -aI-184 -aa(lp19508 -g15 -aI590 -aI-158 -aI621 -aI-168 -aI606 -aI-162 -aa(lp19509 -g15 -aI537 -aI-151 -aI573 -aI-153 -aI556 -aI-151 -aa(lp19510 -g15 -aI441 -aI-169 -aI501 -aI-151 -aI469 -aI-157 -aa(lp19511 -g15 -aI370 -aI-222 -aI413 -aI-182 -aI389 -aI-199 -aa(lp19512 -g15 -aI326 -aI-304 -aI351 -aI-245 -aI336 -aI-272 -aa(lp19513 -g15 -aI311 -aI-410 -aI316 -aI-336 -aI311 -aI-371 -aa(lp19514 -g15 -aI332 -aI-533 -aI311 -aI-455 -aI318 -aI-496 -aa(lp19515 -g15 -aI389 -aI-630 -aI345 -aI-570 -aI364 -aI-602 -aa(lp19516 -g15 -aI481 -aI-693 -aI415 -aI-657 -aI445 -aI-678 -aa(lp19517 -g15 -aI602 -aI-715 -aI517 -aI-708 -aI558 -aI-715 -aa(lp19518 -g15 -aI663 -aI-712 -aI622 -aI-715 -aI642 -aI-714 -aa(lp19519 -g15 -aI723 -aI-703 -aI684 -aI-710 -aI704 -aI-707 -aa(lp19520 -g15 -aI777 -aI-692 -aI742 -aI-700 -aI761 -aI-696 -aa(lp19521 -g15 -aI821 -aI-679 -aI794 -aI-687 -aI809 -aI-683 -aa(lp19522 -g20 -aI807 -aI-406 -aa(lp19523 -g15 -aI806 -aI-378 -aI807 -aI-396 -aI806 -aI-387 -aa(lp19524 -g15 -aI806 -aI-360 -aI806 -aI-369 -aI806 -aI-363 -aa(lp19525 -g15 -aI810 -aI-315 -aI806 -aI-342 -aI808 -aI-327 -aa(lp19526 -g15 -aI821 -aI-288 -aI813 -aI-304 -aI817 -aI-295 -aa(lp19527 -g15 -aI837 -aI-274 -aI826 -aI-281 -aI831 -aI-276 -aa(lp19528 -g15 -aI856 -aI-270 -aI843 -aI-271 -aI849 -aI-270 -aa(lp19529 -g15 -aI895 -aI-287 -aI871 -aI-270 -aI884 -aI-276 -aa(lp19530 -g15 -aI923 -aI-335 -aI907 -aI-299 -aI916 -aI-315 -aa(lp19531 -g15 -aI940 -aI-405 -aI931 -aI-355 -aI936 -aI-378 -aa(lp19532 -g15 -aI946 -aI-490 -aI944 -aI-432 -aI946 -aI-460 -aa(lp19533 -g15 -aI921 -aI-638 -aI946 -aI-545 -aI938 -aI-595 -aa(lp19534 -g15 -aI853 -aI-748 -aI905 -aI-682 -aI882 -aI-718 -aa(lp19535 -g15 -aI748 -aI-817 -aI823 -aI-778 -aI789 -aI-801 -aa(lp19536 -g15 -aI617 -aI-840 -aI708 -aI-832 -aI664 -aI-840 -aa(lp19537 -g15 -aI441 -aI-807 -aI550 -aI-840 -aI492 -aI-829 -aa(lp19538 -g15 -aI314 -aI-714 -aI391 -aI-785 -aI348 -aI-754 -aa(lp19539 -g15 -aI237 -aI-573 -aI280 -aI-675 -aI254 -aI-628 -aa(lp19540 -g15 -aI210 -aI-395 -aI219 -aI-519 -aI210 -aI-460 -aa(lp19541 -g15 -aI233 -aI-236 -aI210 -aI-335 -aI218 -aI-282 -aa(lp19542 -g15 -aI301 -aI-119 -aI248 -aI-189 -aI271 -aI-151 -aa(lp19543 -g15 -aI412 -aI-48 -aI331 -aI-88 -aI368 -aI-64 -aa(lp19544 -g15 -aI563 -aI-23 -aI455 -aI-31 -aI506 -aI-23 -aa(lp19545 -g15 -aI638 -aI-28 -aI588 -aI-23 -aI613 -aI-25 -aa(lp19546 -g15 -aI715 -aI-40 -aI664 -aI-31 -aI689 -aI-35 -aa(lp19547 -g15 -aI790 -aI-59 -aI740 -aI-45 -aI765 -aI-52 -aa(lp19548 -g15 -aI860 -aI-83 -aI814 -aI-66 -aI837 -aI-74 -aa(lp19549 -g20 -aI860 -aI41 -aa(lp19550 -g15 -aI724 -aI84 -aI819 -aI59 -aI773 -aI74 -aa(lp19551 -g15 -aI565 -aI100 -aI674 -aI95 -aI621 -aI100 -aa(lp19552 -g15 -aI354 -aI67 -aI486 -aI100 -aI416 -aI89 -aa(lp19553 -g15 -aI197 -aI-29 -aI292 -aI44 -aI240 -aI12 -aa(lp19554 -g15 -aI100 -aI-184 -aI155 -aI-71 -aI122 -aI-123 -aa(lp19555 -g15 -aI66 -aI-391 -aI77 -aI-245 -aI66 -aI-314 -aa(lp19556 -g15 -aI83 -aI-546 -aI66 -aI-445 -aI72 -aI-496 -aa(lp19557 -g15 -aI134 -aI-683 -aI95 -aI-595 -aI112 -aI-641 -aa(lp19558 -g15 -aI215 -aI-798 -aI156 -aI-725 -aI183 -aI-764 -aa(lp19559 -g15 -aI324 -aI-887 -aI247 -aI-833 -aI284 -aI-862 -aa(lp19560 -g15 -aI459 -aI-943 -aI365 -aI-911 -aI410 -aI-930 -aa(lp19561 -g15 -aI617 -aI-963 -aI508 -aI-957 -aI561 -aI-963 -aa(lp19562 -g15 -aI806 -aI-930 -aI685 -aI-963 -aI748 -aI-952 -aa(lp19563 -g15 -aI956 -aI-836 -aI864 -aI-908 -aI914 -aI-877 -aa(lp19564 -g15 -aI1054 -aI-687 -aI997 -aI-795 -aI1030 -aI-745 -aa(lp19565 -g15 -aI1089 -aI-489 -aI1077 -aI-628 -aI1089 -aI-562 -aa(lp19566 -g10 -aa(lp19567 -g8 -aI462 -aI-407 -aa(lp19568 -g15 -aI487 -aI-302 -aI462 -aI-359 -aI471 -aI-324 -aa(lp19569 -g15 -aI553 -aI-270 -aI504 -aI-281 -aI526 -aI-270 -aa(lp19570 -g15 -aI600 -aI-283 -aI571 -aI-270 -aI587 -aI-274 -aa(lp19571 -g15 -aI633 -aI-318 -aI613 -aI-291 -aI624 -aI-303 -aa(lp19572 -g15 -aI652 -aI-374 -aI641 -aI-334 -aI648 -aI-352 -aa(lp19573 -g15 -aI661 -aI-446 -aI657 -aI-395 -aI660 -aI-419 -aa(lp19574 -g20 -aI669 -aI-590 -aa(lp19575 -g15 -aI638 -aI-595 -aI660 -aI-592 -aI650 -aI-593 -aa(lp19576 -g15 -aI602 -aI-597 -aI626 -aI-596 -aI615 -aI-597 -aa(lp19577 -g15 -aI537 -aI-580 -aI577 -aI-597 -aI555 -aI-591 -aa(lp19578 -g15 -aI494 -aI-537 -aI519 -aI-570 -aI505 -aI-555 -aa(lp19579 -g15 -aI470 -aI-477 -aI483 -aI-520 -aI475 -aI-499 -aa(lp19580 -g15 -aI462 -aI-407 -aI465 -aI-454 -aI462 -aI-431 -aa(lp19581 -g10 -aa(lp19582 -g8 -aI1154 -aI0 -aa(lp19583 -g10 -aa(lp19584 -g8 -aI1154 -aI0 -aasVD -(lp19585 -(lp19586 -g8 -aI856 -aI-484 -aa(lp19587 -g15 -aI823 -aI-273 -aI856 -aI-404 -aI845 -aI-333 -aa(lp19588 -g15 -aI728 -aI-121 -aI801 -aI-212 -aI769 -aI-162 -aa(lp19589 -g15 -aI575 -aI-30 -aI686 -aI-81 -aI635 -aI-50 -aa(lp19590 -g15 -aI370 -aI0 -aI515 -aI-9 -aI447 -aI0 -aa(lp19591 -g20 -aI119 -aI0 -aa(lp19592 -g20 -aI119 -aI-951 -aa(lp19593 -g20 -aI398 -aI-951 -aa(lp19594 -g15 -aI587 -aI-921 -aI468 -aI-951 -aI531 -aI-941 -aa(lp19595 -g15 -aI731 -aI-832 -aI643 -aI-901 -aI691 -aI-871 -aa(lp19596 -g15 -aI823 -aI-686 -aI771 -aI-793 -aI802 -aI-744 -aa(lp19597 -g15 -aI856 -aI-484 -aI845 -aI-628 -aI856 -aI-560 -aa(lp19598 -g10 -aa(lp19599 -g8 -aI651 -aI-479 -aa(lp19600 -g15 -aI635 -aI-616 -aI651 -aI-532 -aI646 -aI-577 -aa(lp19601 -g15 -aI589 -aI-711 -aI625 -aI-654 -aI609 -aI-686 -aa(lp19602 -g15 -aI515 -aI-767 -aI569 -aI-736 -aI544 -aI-755 -aa(lp19603 -g15 -aI414 -aI-786 -aI486 -aI-779 -aI452 -aI-786 -aa(lp19604 -g20 -aI321 -aI-786 -aa(lp19605 -g20 -aI321 -aI-166 -aa(lp19606 -g20 -aI395 -aI-166 -aa(lp19607 -g15 -aI587 -aI-244 -aI480 -aI-166 -aI544 -aI-192 -aa(lp19608 -g15 -aI651 -aI-479 -aI630 -aI-296 -aI651 -aI-374 -aa(lp19609 -g10 -aa(lp19610 -g8 -aI933 -aI0 -aa(lp19611 -g10 -aa(lp19612 -g8 -aI933 -aI0 -aasVH -(lp19613 -(lp19614 -g8 -aI846 -aI0 -aa(lp19615 -g20 -aI645 -aI0 -aa(lp19616 -g20 -aI645 -aI-410 -aa(lp19617 -g20 -aI321 -aI-410 -aa(lp19618 -g20 -aI321 -aI0 -aa(lp19619 -g20 -aI119 -aI0 -aa(lp19620 -g20 -aI119 -aI-951 -aa(lp19621 -g20 -aI321 -aI-951 -aa(lp19622 -g20 -aI321 -aI-578 -aa(lp19623 -g20 -aI645 -aI-578 -aa(lp19624 -g20 -aI645 -aI-951 -aa(lp19625 -g20 -aI846 -aI-951 -aa(lp19626 -g10 -aa(lp19627 -g8 -aI966 -aI0 -aa(lp19628 -g10 -aa(lp19629 -g8 -aI966 -aI0 -aasVL -(lp19630 -(lp19631 -g8 -aI119 -aI0 -aa(lp19632 -g20 -aI119 -aI-951 -aa(lp19633 -g20 -aI321 -aI-951 -aa(lp19634 -g20 -aI321 -aI-166 -aa(lp19635 -g20 -aI667 -aI-166 -aa(lp19636 -g20 -aI667 -aI0 -aa(lp19637 -g10 -aa(lp19638 -g8 -aI713 -aI0 -aa(lp19639 -g10 -aa(lp19640 -g8 -aI713 -aI0 -aasVP -(lp19641 -(lp19642 -g8 -aI321 -aI-503 -aa(lp19643 -g20 -aI361 -aI-503 -aa(lp19644 -g15 -aI489 -aI-537 -aI418 -aI-503 -aI461 -aI-514 -aa(lp19645 -g15 -aI533 -aI-647 -aI518 -aI-559 -aI533 -aI-596 -aa(lp19646 -g15 -aI494 -aI-752 -aI533 -aI-694 -aI520 -aI-729 -aa(lp19647 -g15 -aI373 -aI-786 -aI468 -aI-774 -aI428 -aI-786 -aa(lp19648 -g20 -aI321 -aI-786 -aa(lp19649 -g10 -aa(lp19650 -g8 -aI737 -aI-654 -aa(lp19651 -g15 -aI718 -aI-534 -aI737 -aI-612 -aI731 -aI-572 -aa(lp19652 -g15 -aI656 -aI-433 -aI706 -aI-496 -aI685 -aI-462 -aa(lp19653 -g15 -aI542 -aI-364 -aI627 -aI-404 -aI589 -aI-381 -aa(lp19654 -g15 -aI367 -aI-338 -aI495 -aI-346 -aI437 -aI-338 -aa(lp19655 -g20 -aI321 -aI-338 -aa(lp19656 -g20 -aI321 -aI0 -aa(lp19657 -g20 -aI119 -aI0 -aa(lp19658 -g20 -aI119 -aI-951 -aa(lp19659 -g20 -aI384 -aI-951 -aa(lp19660 -g15 -aI542 -aI-930 -aI445 -aI-951 -aI498 -aI-944 -aa(lp19661 -g15 -aI652 -aI-872 -aI587 -aI-917 -aI623 -aI-897 -aa(lp19662 -g15 -aI716 -aI-779 -aI681 -aI-846 -aI702 -aI-815 -aa(lp19663 -g15 -aI737 -aI-654 -aI730 -aI-742 -aI737 -aI-700 -aa(lp19664 -g10 -aa(lp19665 -g8 -aI797 -aI0 -aa(lp19666 -g10 -aa(lp19667 -g8 -aI797 -aI0 -aasVT -(lp19668 -(lp19669 -g8 -aI466 -aI0 -aa(lp19670 -g20 -aI265 -aI0 -aa(lp19671 -g20 -aI265 -aI-783 -aa(lp19672 -g20 -aI26 -aI-783 -aa(lp19673 -g20 -aI26 -aI-951 -aa(lp19674 -g20 -aI705 -aI-951 -aa(lp19675 -g20 -aI705 -aI-783 -aa(lp19676 -g20 -aI466 -aI-783 -aa(lp19677 -g10 -aa(lp19678 -g8 -aI731 -aI0 -aa(lp19679 -g10 -aa(lp19680 -g8 -aI731 -aI0 -aasVX -(lp19681 -(lp19682 -g8 -aI835 -aI0 -aa(lp19683 -g20 -aI605 -aI0 -aa(lp19684 -g20 -aI410 -aI-359 -aa(lp19685 -g20 -aI216 -aI0 -aa(lp19686 -g20 -aI0 -aI0 -aa(lp19687 -g20 -aI289 -aI-490 -aa(lp19688 -g20 -aI20 -aI-951 -aa(lp19689 -g20 -aI242 -aI-951 -aa(lp19690 -g20 -aI421 -aI-608 -aa(lp19691 -g20 -aI595 -aI-951 -aa(lp19692 -g20 -aI813 -aI-951 -aa(lp19693 -g20 -aI541 -aI-479 -aa(lp19694 -g10 -aa(lp19695 -g8 -aI835 -aI0 -aa(lp19696 -g10 -aa(lp19697 -g8 -aI835 -aI0 -aasV\u005C -(lp19698 -(lp19699 -g8 -aI188 -aI-951 -aa(lp19700 -g20 -aI542 -aI0 -aa(lp19701 -g20 -aI362 -aI0 -aa(lp19702 -g20 -aI7 -aI-951 -aa(lp19703 -g10 -aa(lp19704 -g8 -aI550 -aI0 -aa(lp19705 -g10 -aa(lp19706 -g8 -aI550 -aI0 -aasV` -(lp19707 -(lp19708 -g8 -aI419 -aI-807 -aa(lp19709 -g15 -aI366 -aI-852 -aI405 -aI-819 -aI387 -aI-834 -aa(lp19710 -g15 -aI305 -aI-908 -aI346 -aI-870 -aI325 -aI-889 -aa(lp19711 -g15 -aI251 -aI-963 -aI286 -aI-927 -aI267 -aI-945 -aa(lp19712 -g15 -aI216 -aI-1007 -aI234 -aI-980 -aI223 -aI-995 -aa(lp19713 -g20 -aI216 -aI-1021 -aa(lp19714 -g20 -aI438 -aI-1021 -aa(lp19715 -g15 -aI463 -aI-972 -aI445 -aI-1006 -aI453 -aI-990 -aa(lp19716 -g15 -aI492 -aI-919 -aI472 -aI-954 -aI482 -aI-937 -aa(lp19717 -g15 -aI522 -aI-868 -aI502 -aI-902 -aI512 -aI-885 -aa(lp19718 -g15 -aI552 -aI-825 -aI533 -aI-852 -aI542 -aI-837 -aa(lp19719 -g20 -aI552 -aI-807 -aa(lp19720 -g10 -aa(lp19721 -g8 -aI769 -aI0 -aa(lp19722 -g10 -aa(lp19723 -g8 -aI769 -aI0 -aasVd -(lp19724 -(lp19725 -g8 -aI318 -aI13 -aa(lp19726 -g15 -aI216 -aI-10 -aI281 -aI13 -aI246 -aI5 -aa(lp19727 -g15 -aI136 -aI-81 -aI185 -aI-26 -aI158 -aI-50 -aa(lp19728 -g15 -aI84 -aI-199 -aI114 -aI-113 -aI97 -aI-152 -aa(lp19729 -g15 -aI66 -aI-362 -aI72 -aI-246 -aI66 -aI-300 -aa(lp19730 -g15 -aI84 -aI-526 -aI66 -aI-424 -aI72 -aI-479 -aa(lp19731 -g15 -aI137 -aI-645 -aI97 -aI-573 -aI114 -aI-613 -aa(lp19732 -g15 -aI219 -aI-716 -aI160 -aI-676 -aI187 -aI-700 -aa(lp19733 -g15 -aI324 -aI-741 -aI251 -aI-733 -aI286 -aI-741 -aa(lp19734 -g15 -aI388 -aI-732 -aI347 -aI-741 -aI369 -aI-738 -aa(lp19735 -g15 -aI441 -aI-710 -aI408 -aI-727 -aI425 -aI-719 -aa(lp19736 -g15 -aI483 -aI-676 -aI457 -aI-700 -aI471 -aI-689 -aa(lp19737 -g15 -aI516 -aI-634 -aI495 -aI-663 -aI506 -aI-649 -aa(lp19738 -g20 -aI522 -aI-634 -aa(lp19739 -g15 -aI515 -aI-685 -aI520 -aI-651 -aI517 -aI-668 -aa(lp19740 -g15 -aI510 -aI-732 -aI513 -aI-700 -aI511 -aI-716 -aa(lp19741 -g15 -aI507 -aI-779 -aI508 -aI-749 -aI507 -aI-765 -aa(lp19742 -g20 -aI507 -aI-1012 -aa(lp19743 -g20 -aI706 -aI-1012 -aa(lp19744 -g20 -aI706 -aI0 -aa(lp19745 -g20 -aI554 -aI0 -aa(lp19746 -g20 -aI516 -aI-93 -aa(lp19747 -g20 -aI507 -aI-93 -aa(lp19748 -g15 -aI476 -aI-51 -aI498 -aI-79 -aI488 -aI-65 -aa(lp19749 -g15 -aI435 -aI-17 -aI464 -aI-38 -aI451 -aI-27 -aa(lp19750 -g15 -aI383 -aI5 -aI420 -aI-8 -aI403 -aI0 -aa(lp19751 -g15 -aI318 -aI13 -aI364 -aI10 -aI342 -aI13 -aa(lp19752 -g10 -aa(lp19753 -g8 -aI390 -aI-144 -aa(lp19754 -g15 -aI450 -aI-156 -aI414 -aI-144 -aI434 -aI-148 -aa(lp19755 -g15 -aI490 -aI-193 -aI467 -aI-164 -aI480 -aI-176 -aa(lp19756 -g15 -aI513 -aI-254 -aI500 -aI-209 -aI508 -aI-229 -aa(lp19757 -g15 -aI521 -aI-339 -aI518 -aI-278 -aI521 -aI-306 -aa(lp19758 -g20 -aI521 -aI-360 -aa(lp19759 -g15 -aI514 -aI-454 -aI521 -aI-396 -aI519 -aI-427 -aa(lp19760 -g15 -aI493 -aI-523 -aI510 -aI-481 -aI503 -aI-504 -aa(lp19761 -g15 -aI453 -aI-565 -aI483 -aI-541 -aI470 -aI-555 -aa(lp19762 -g15 -aI389 -aI-579 -aI436 -aI-574 -aI414 -aI-579 -aa(lp19763 -g15 -aI297 -aI-523 -aI347 -aI-579 -aI317 -aI-560 -aa(lp19764 -g15 -aI268 -aI-359 -aI277 -aI-485 -aI268 -aI-431 -aa(lp19765 -g15 -aI297 -aI-198 -aI268 -aI-287 -aI278 -aI-234 -aa(lp19766 -g15 -aI390 -aI-144 -aI317 -aI-162 -aI348 -aI-144 -aa(lp19767 -g10 -aa(lp19768 -g8 -aI810 -aI0 -aa(lp19769 -g10 -aa(lp19770 -g8 -aI810 -aI0 -aasVh -(lp19771 -(lp19772 -g8 -aI735 -aI0 -aa(lp19773 -g20 -aI537 -aI0 -aa(lp19774 -g20 -aI537 -aI-424 -aa(lp19775 -g15 -aI512 -aI-542 -aI537 -aI-477 -aI528 -aI-516 -aa(lp19776 -g15 -aI437 -aI-582 -aI496 -aI-569 -aI471 -aI-582 -aa(lp19777 -g15 -aI373 -aI-566 -aI411 -aI-582 -aI390 -aI-577 -aa(lp19778 -g15 -aI331 -aI-520 -aI355 -aI-556 -aI341 -aI-540 -aa(lp19779 -g15 -aI309 -aI-444 -aI320 -aI-499 -aI313 -aI-474 -aa(lp19780 -g15 -aI302 -aI-341 -aI304 -aI-414 -aI302 -aI-380 -aa(lp19781 -g20 -aI302 -aI0 -aa(lp19782 -g20 -aI104 -aI0 -aa(lp19783 -g20 -aI104 -aI-1012 -aa(lp19784 -g20 -aI302 -aI-1012 -aa(lp19785 -g20 -aI302 -aI-806 -aa(lp19786 -g15 -aI301 -aI-748 -aI302 -aI-787 -aI302 -aI-768 -aa(lp19787 -g15 -aI298 -aI-692 -aI300 -aI-728 -aI299 -aI-709 -aa(lp19788 -g15 -aI293 -aI-634 -aI296 -aI-672 -aI294 -aI-653 -aa(lp19789 -g20 -aI304 -aI-634 -aa(lp19790 -g15 -aI385 -aI-716 -aI325 -aI-672 -aI352 -aI-699 -aa(lp19791 -g15 -aI497 -aI-741 -aI418 -aI-732 -aI455 -aI-741 -aa(lp19792 -g15 -aI595 -aI-725 -aI533 -aI-741 -aI566 -aI-735 -aa(lp19793 -g15 -aI670 -aI-677 -aI624 -aI-715 -aI649 -aI-699 -aa(lp19794 -g15 -aI718 -aI-594 -aI691 -aI-656 -aI707 -aI-628 -aa(lp19795 -g15 -aI735 -aI-474 -aI730 -aI-561 -aI735 -aI-521 -aa(lp19796 -g10 -aa(lp19797 -g8 -aI835 -aI0 -aa(lp19798 -g10 -aa(lp19799 -g8 -aI835 -aI0 -aasVl -(lp19800 -(lp19801 -g8 -aI302 -aI0 -aa(lp19802 -g20 -aI104 -aI0 -aa(lp19803 -g20 -aI104 -aI-1012 -aa(lp19804 -g20 -aI302 -aI-1012 -aa(lp19805 -g10 -aa(lp19806 -g8 -aI406 -aI0 -aa(lp19807 -g10 -aa(lp19808 -g8 -aI406 -aI0 -aasVp -(lp19809 -(lp19810 -g8 -aI486 -aI13 -aa(lp19811 -g15 -aI422 -aI5 -aI463 -aI13 -aI441 -aI10 -aa(lp19812 -g15 -aI372 -aI-15 -aI403 -aI0 -aI387 -aI-6 -aa(lp19813 -g15 -aI333 -aI-44 -aI357 -aI-23 -aI344 -aI-33 -aa(lp19814 -g15 -aI302 -aI-79 -aI322 -aI-55 -aI311 -aI-67 -aa(lp19815 -g20 -aI292 -aI-79 -aa(lp19816 -g15 -aI297 -aI-36 -aI294 -aI-64 -aI295 -aI-50 -aa(lp19817 -g15 -aI301 -aI-1 -aI298 -aI-25 -aI300 -aI-13 -aa(lp19818 -g15 -aI302 -aI25 -aI302 -aI10 -aI302 -aI19 -aa(lp19819 -g20 -aI302 -aI320 -aa(lp19820 -g20 -aI104 -aI320 -aa(lp19821 -g20 -aI104 -aI-727 -aa(lp19822 -g20 -aI265 -aI-727 -aa(lp19823 -g20 -aI293 -aI-633 -aa(lp19824 -g20 -aI302 -aI-633 -aa(lp19825 -g15 -aI333 -aI-674 -aI311 -aI-647 -aI322 -aI-661 -aa(lp19826 -g15 -aI374 -aI-708 -aI345 -aI-687 -aI359 -aI-699 -aa(lp19827 -g15 -aI427 -aI-732 -aI390 -aI-718 -aI407 -aI-726 -aa(lp19828 -g15 -aI492 -aI-741 -aI446 -aI-738 -aI468 -aI-741 -aa(lp19829 -g15 -aI595 -aI-716 -aI529 -aI-741 -aI564 -aI-733 -aa(lp19830 -g15 -aI674 -aI-645 -aI625 -aI-700 -aI652 -aI-677 -aa(lp19831 -g15 -aI725 -aI-527 -aI696 -aI-613 -aI713 -aI-574 -aa(lp19832 -g15 -aI744 -aI-364 -aI738 -aI-480 -aI744 -aI-426 -aa(lp19833 -g15 -aI725 -aI-201 -aI744 -aI-302 -aI737 -aI-248 -aa(lp19834 -g15 -aI672 -aI-82 -aI712 -aI-153 -aI694 -aI-114 -aa(lp19835 -g15 -aI590 -aI-10 -aI649 -aI-50 -aI622 -aI-26 -aa(lp19836 -g15 -aI486 -aI13 -aI559 -aI5 -aI524 -aI13 -aa(lp19837 -g10 -aa(lp19838 -g8 -aI425 -aI-582 -aa(lp19839 -g15 -aI368 -aI-570 -aI402 -aI-582 -aI384 -aI-578 -aa(lp19840 -g15 -aI331 -aI-534 -aI353 -aI-562 -aI340 -aI-550 -aa(lp19841 -g15 -aI310 -aI-473 -aI321 -aI-517 -aI314 -aI-497 -aa(lp19842 -g15 -aI302 -aI-387 -aI306 -aI-448 -aI303 -aI-420 -aa(lp19843 -g20 -aI302 -aI-366 -aa(lp19844 -g15 -aI308 -aI-272 -aI302 -aI-330 -aI304 -aI-299 -aa(lp19845 -g15 -aI329 -aI-203 -aI313 -aI-244 -aI319 -aI-222 -aa(lp19846 -g15 -aI367 -aI-161 -aI338 -aI-185 -aI351 -aI-171 -aa(lp19847 -g15 -aI426 -aI-147 -aI383 -aI-152 -aI402 -aI-147 -aa(lp19848 -g15 -aI513 -aI-203 -aI465 -aI-147 -aI494 -aI-166 -aa(lp19849 -g15 -aI541 -aI-367 -aI531 -aI-241 -aI541 -aI-295 -aa(lp19850 -g15 -aI513 -aI-528 -aI541 -aI-439 -aI531 -aI-492 -aa(lp19851 -g15 -aI425 -aI-582 -aI494 -aI-564 -aI465 -aI-582 -aa(lp19852 -g10 -aa(lp19853 -g8 -aI810 -aI0 -aa(lp19854 -g10 -aa(lp19855 -g8 -aI810 -aI0 -aasVt -(lp19856 -(lp19857 -g8 -aI399 -aI-144 -aa(lp19858 -g15 -aI455 -aI-151 -aI419 -aI-144 -aI437 -aI-146 -aa(lp19859 -g15 -aI509 -aI-167 -aI472 -aI-155 -aI490 -aI-161 -aa(lp19860 -g20 -aI509 -aI-19 -aa(lp19861 -g15 -aI439 -aI4 -aI490 -aI-10 -aI467 -aI-2 -aa(lp19862 -g15 -aI349 -aI13 -aI412 -aI10 -aI382 -aI13 -aa(lp19863 -g15 -aI261 -aI2 -aI317 -aI13 -aI288 -aI9 -aa(lp19864 -g15 -aI190 -aI-36 -aI233 -aI-4 -aI210 -aI-17 -aa(lp19865 -g15 -aI142 -aI-110 -aI170 -aI-54 -aI154 -aI-79 -aa(lp19866 -g15 -aI125 -aI-227 -aI131 -aI-141 -aI125 -aI-180 -aa(lp19867 -g20 -aI125 -aI-578 -aa(lp19868 -g20 -aI30 -aI-578 -aa(lp19869 -g20 -aI30 -aI-662 -aa(lp19870 -g20 -aI139 -aI-728 -aa(lp19871 -g20 -aI197 -aI-882 -aa(lp19872 -g20 -aI324 -aI-882 -aa(lp19873 -g20 -aI324 -aI-727 -aa(lp19874 -g20 -aI501 -aI-727 -aa(lp19875 -g20 -aI501 -aI-578 -aa(lp19876 -g20 -aI324 -aI-578 -aa(lp19877 -g20 -aI324 -aI-227 -aa(lp19878 -g15 -aI345 -aI-164 -aI324 -aI-199 -aI331 -aI-178 -aa(lp19879 -g15 -aI399 -aI-144 -aI358 -aI-151 -aI377 -aI-144 -aa(lp19880 -g10 -aa(lp19881 -g8 -aI552 -aI0 -aa(lp19882 -g10 -aa(lp19883 -g8 -aI552 -aI0 -aasVx -(lp19884 -(lp19885 -g8 -aI253 -aI-371 -aa(lp19886 -g20 -aI18 -aI-727 -aa(lp19887 -g20 -aI244 -aI-727 -aa(lp19888 -g20 -aI365 -aI-508 -aa(lp19889 -g20 -aI488 -aI-727 -aa(lp19890 -g20 -aI713 -aI-727 -aa(lp19891 -g20 -aI475 -aI-371 -aa(lp19892 -g20 -aI723 -aI0 -aa(lp19893 -g20 -aI498 -aI0 -aa(lp19894 -g20 -aI365 -aI-235 -aa(lp19895 -g20 -aI231 -aI0 -aa(lp19896 -g20 -aI6 -aI0 -aa(lp19897 -g10 -aa(lp19898 -g8 -aI730 -aI0 -aa(lp19899 -g10 -aa(lp19900 -g8 -aI730 -aI0 -aasV| -(lp19901 -(lp19902 -g8 -aI296 -aI-1008 -aa(lp19903 -g20 -aI438 -aI-1008 -aa(lp19904 -g20 -aI438 -aI303 -aa(lp19905 -g20 -aI296 -aI303 -aa(lp19906 -g10 -aa(lp19907 -g8 -aI734 -aI0 -aa(lp19908 -g10 -aa(lp19909 -g8 -aI734 -aI0 -aasV# -(lp19910 -(lp19911 -g8 -aI650 -aI-549 -aa(lp19912 -g20 -aI619 -aI-397 -aa(lp19913 -g20 -aI787 -aI-397 -aa(lp19914 -g20 -aI787 -aI-263 -aa(lp19915 -g20 -aI594 -aI-263 -aa(lp19916 -g20 -aI544 -aI0 -aa(lp19917 -g20 -aI401 -aI0 -aa(lp19918 -g20 -aI451 -aI-263 -aa(lp19919 -g20 -aI325 -aI-263 -aa(lp19920 -g20 -aI276 -aI0 -aa(lp19921 -g20 -aI136 -aI0 -aa(lp19922 -g20 -aI184 -aI-263 -aa(lp19923 -g20 -aI29 -aI-263 -aa(lp19924 -g20 -aI29 -aI-397 -aa(lp19925 -g20 -aI209 -aI-397 -aa(lp19926 -g20 -aI240 -aI-549 -aa(lp19927 -g20 -aI76 -aI-549 -aa(lp19928 -g20 -aI76 -aI-685 -aa(lp19929 -g20 -aI264 -aI-685 -aa(lp19930 -g20 -aI314 -aI-950 -aa(lp19931 -g20 -aI457 -aI-950 -aa(lp19932 -g20 -aI406 -aI-685 -aa(lp19933 -g20 -aI535 -aI-685 -aa(lp19934 -g20 -aI586 -aI-950 -aa(lp19935 -g20 -aI726 -aI-950 -aa(lp19936 -g20 -aI675 -aI-685 -aa(lp19937 -g20 -aI832 -aI-685 -aa(lp19938 -g20 -aI832 -aI-549 -aa(lp19939 -g10 -aa(lp19940 -g8 -aI350 -aI-397 -aa(lp19941 -g20 -aI478 -aI-397 -aa(lp19942 -g20 -aI509 -aI-549 -aa(lp19943 -g20 -aI381 -aI-549 -aa(lp19944 -g10 -aa(lp19945 -g8 -aI861 -aI0 -aa(lp19946 -g10 -aa(lp19947 -g8 -aI861 -aI0 -aasV' -(lp19948 -(lp19949 -g8 -aI268 -aI-951 -aa(lp19950 -g20 -aI241 -aI-607 -aa(lp19951 -g20 -aI113 -aI-607 -aa(lp19952 -g20 -aI86 -aI-951 -aa(lp19953 -g10 -aa(lp19954 -g8 -aI354 -aI0 -aa(lp19955 -g10 -aa(lp19956 -g8 -aI354 -aI0 -aasV+ -(lp19957 -(lp19958 -g8 -aI296 -aI-397 -aa(lp19959 -g20 -aI57 -aI-397 -aa(lp19960 -g20 -aI57 -aI-540 -aa(lp19961 -g20 -aI296 -aI-540 -aa(lp19962 -g20 -aI296 -aI-780 -aa(lp19963 -g20 -aI438 -aI-780 -aa(lp19964 -g20 -aI438 -aI-540 -aa(lp19965 -g20 -aI677 -aI-540 -aa(lp19966 -g20 -aI677 -aI-397 -aa(lp19967 -g20 -aI438 -aI-397 -aa(lp19968 -g20 -aI438 -aI-161 -aa(lp19969 -g20 -aI296 -aI-161 -aa(lp19970 -g10 -aa(lp19971 -g8 -aI734 -aI0 -aa(lp19972 -g10 -aa(lp19973 -g8 -aI734 -aI0 -aasV/ -(lp19974 -(lp19975 -g8 -aI544 -aI-951 -aa(lp19976 -g20 -aI189 -aI0 -aa(lp19977 -g20 -aI9 -aI0 -aa(lp19978 -g20 -aI363 -aI-951 -aa(lp19979 -g10 -aa(lp19980 -g8 -aI550 -aI0 -aa(lp19981 -g10 -aa(lp19982 -g8 -aI550 -aI0 -aasV3 -(lp19983 -(lp19984 -g8 -aI654 -aI-738 -aa(lp19985 -g15 -aI638 -aI-649 -aI654 -aI-705 -aI649 -aI-675 -aa(lp19986 -g15 -aI595 -aI-580 -aI628 -aI-623 -aI613 -aI-600 -aa(lp19987 -g15 -aI530 -aI-531 -aI576 -aI-560 -aI555 -aI-544 -aa(lp19988 -g15 -aI449 -aI-500 -aI505 -aI-517 -aI478 -aI-507 -aa(lp19989 -g20 -aI449 -aI-496 -aa(lp19990 -g15 -aI623 -aI-426 -aI526 -aI-487 -aI584 -aI-464 -aa(lp19991 -g15 -aI682 -aI-276 -aI663 -aI-389 -aI682 -aI-339 -aa(lp19992 -g15 -aI660 -aI-161 -aI682 -aI-235 -aI675 -aI-196 -aa(lp19993 -g15 -aI591 -aI-69 -aI645 -aI-125 -aI622 -aI-95 -aa(lp19994 -g15 -aI474 -aI-8 -aI560 -aI-43 -aI521 -aI-22 -aa(lp19995 -g15 -aI307 -aI13 -aI427 -aI6 -aI371 -aI13 -aa(lp19996 -g15 -aI163 -aI0 -aI256 -aI13 -aI208 -aI9 -aa(lp19997 -g15 -aI37 -aI-37 -aI118 -aI-7 -aI76 -aI-20 -aa(lp19998 -g20 -aI37 -aI-209 -aa(lp19999 -g15 -aI98 -aI-181 -aI56 -aI-198 -aI77 -aI-189 -aa(lp20000 -g15 -aI164 -aI-161 -aI120 -aI-174 -aI142 -aI-167 -aa(lp20001 -g15 -aI228 -aI-149 -aI185 -aI-156 -aI207 -aI-152 -aa(lp20002 -g15 -aI287 -aI-146 -aI249 -aI-147 -aI269 -aI-146 -aa(lp20003 -g15 -aI380 -aI-156 -aI325 -aI-146 -aI356 -aI-149 -aa(lp20004 -g15 -aI440 -aI-185 -aI405 -aI-163 -aI425 -aI-173 -aa(lp20005 -g15 -aI471 -aI-230 -aI454 -aI-198 -aI465 -aI-213 -aa(lp20006 -g15 -aI481 -aI-288 -aI477 -aI-248 -aI481 -aI-267 -aa(lp20007 -g15 -aI469 -aI-341 -aI481 -aI-308 -aI477 -aI-325 -aa(lp20008 -g15 -aI430 -aI-382 -aI461 -aI-357 -aI448 -aI-370 -aa(lp20009 -g15 -aI359 -aI-407 -aI412 -aI-393 -aI388 -aI-401 -aa(lp20010 -g15 -aI251 -aI-416 -aI330 -aI-413 -aI294 -aI-416 -aa(lp20011 -g20 -aI184 -aI-416 -aa(lp20012 -g20 -aI184 -aI-558 -aa(lp20013 -g20 -aI250 -aI-558 -aa(lp20014 -g15 -aI350 -aI-568 -aI290 -aI-558 -aI323 -aI-561 -aa(lp20015 -g15 -aI413 -aI-598 -aI376 -aI-576 -aI397 -aI-585 -aa(lp20016 -g15 -aI447 -aI-641 -aI429 -aI-610 -aI440 -aI-624 -aa(lp20017 -g15 -aI457 -aI-694 -aI453 -aI-657 -aI457 -aI-675 -aa(lp20018 -g15 -aI425 -aI-773 -aI457 -aI-728 -aI446 -aI-754 -aa(lp20019 -g15 -aI325 -aI-802 -aI404 -aI-792 -aI371 -aI-802 -aa(lp20020 -g15 -aI267 -aI-796 -aI304 -aI-802 -aI285 -aI-800 -aa(lp20021 -g15 -aI217 -aI-780 -aI249 -aI-791 -aI232 -aI-786 -aa(lp20022 -g15 -aI174 -aI-759 -aI201 -aI-774 -aI187 -aI-767 -aa(lp20023 -g15 -aI139 -aI-737 -aI162 -aI-752 -aI150 -aI-744 -aa(lp20024 -g20 -aI38 -aI-871 -aa(lp20025 -g15 -aI97 -aI-908 -aI56 -aI-884 -aI76 -aI-897 -aa(lp20026 -g15 -aI167 -aI-938 -aI119 -aI-919 -aI142 -aI-929 -aa(lp20027 -g15 -aI249 -aI-957 -aI193 -aI-946 -aI220 -aI-953 -aa(lp20028 -g15 -aI342 -aI-965 -aI278 -aI-962 -aI309 -aI-965 -aa(lp20029 -g15 -aI470 -aI-949 -aI389 -aI-965 -aI431 -aI-959 -aa(lp20030 -g15 -aI569 -aI-905 -aI508 -aI-939 -aI541 -aI-924 -aa(lp20031 -g15 -aI632 -aI-834 -aI596 -aI-886 -aI617 -aI-862 -aa(lp20032 -g15 -aI654 -aI-738 -aI647 -aI-806 -aI654 -aI-774 -aa(lp20033 -g10 -aa(lp20034 -g8 -aI734 -aI0 -aa(lp20035 -g10 -aa(lp20036 -g8 -aI734 -aI0 -aasV7 -(lp20037 -(lp20038 -g8 -aI134 -aI0 -aa(lp20039 -g20 -aI473 -aI-780 -aa(lp20040 -g20 -aI35 -aI-780 -aa(lp20041 -g20 -aI35 -aI-950 -aa(lp20042 -g20 -aI692 -aI-950 -aa(lp20043 -g20 -aI692 -aI-823 -aa(lp20044 -g20 -aI345 -aI0 -aa(lp20045 -g10 -aa(lp20046 -g8 -aI734 -aI0 -aa(lp20047 -g10 -aa(lp20048 -g8 -aI734 -aI0 -aasV; -(lp20049 -(lp20050 -g8 -aI289 -aI-154 -aa(lp20051 -g20 -aI298 -aI-139 -aa(lp20052 -g15 -aI277 -aI-64 -aI292 -aI-116 -aI285 -aI-91 -aa(lp20053 -g15 -aI249 -aI15 -aI268 -aI-38 -aI259 -aI-11 -aa(lp20054 -g15 -aI217 -aI95 -aI238 -aI42 -aI228 -aI69 -aa(lp20055 -g15 -aI184 -aI172 -aI206 -aI122 -aI195 -aI148 -aa(lp20056 -g20 -aI41 -aI172 -aa(lp20057 -g15 -aI60 -aI89 -aI47 -aI145 -aI53 -aI118 -aa(lp20058 -g15 -aI78 -aI4 -aI66 -aI60 -aI72 -aI32 -aa(lp20059 -g15 -aI94 -aI-79 -aI84 -aI-24 -aI89 -aI-52 -aa(lp20060 -g15 -aI106 -aI-154 -aI99 -aI-106 -aI103 -aI-131 -aa(lp20061 -g10 -aa(lp20062 -g8 -aI76 -aI-630 -aa(lp20063 -g15 -aI84 -aI-682 -aI76 -aI-650 -aI79 -aI-668 -aa(lp20064 -g15 -aI109 -aI-716 -aI90 -aI-696 -aI98 -aI-707 -aa(lp20065 -g15 -aI145 -aI-735 -aI119 -aI-725 -aI131 -aI-731 -aa(lp20066 -g15 -aI190 -aI-741 -aI159 -aI-739 -aI174 -aI-741 -aa(lp20067 -g15 -aI234 -aI-735 -aI205 -aI-741 -aI220 -aI-739 -aa(lp20068 -g15 -aI270 -aI-716 -aI247 -aI-731 -aI259 -aI-725 -aa(lp20069 -g15 -aI294 -aI-682 -aI280 -aI-707 -aI288 -aI-696 -aa(lp20070 -g15 -aI304 -aI-630 -aI300 -aI-668 -aI304 -aI-650 -aa(lp20071 -g15 -aI294 -aI-579 -aI304 -aI-610 -aI300 -aI-594 -aa(lp20072 -g15 -aI270 -aI-545 -aI288 -aI-565 -aI280 -aI-554 -aa(lp20073 -g15 -aI234 -aI-525 -aI259 -aI-536 -aI247 -aI-530 -aa(lp20074 -g15 -aI190 -aI-519 -aI220 -aI-521 -aI205 -aI-519 -aa(lp20075 -g15 -aI145 -aI-525 -aI174 -aI-519 -aI159 -aI-521 -aa(lp20076 -g15 -aI109 -aI-545 -aI131 -aI-530 -aI119 -aI-536 -aa(lp20077 -g15 -aI84 -aI-579 -aI98 -aI-554 -aI90 -aI-565 -aa(lp20078 -g15 -aI76 -aI-630 -aI79 -aI-594 -aI76 -aI-610 -aa(lp20079 -g10 -aa(lp20080 -g8 -aI386 -aI0 -aa(lp20081 -g10 -aa(lp20082 -g8 -aI386 -aI0 -aasV? -(lp20083 -(lp20084 -g8 -aI171 -aI-315 -aa(lp20085 -g20 -aI171 -aI-363 -aa(lp20086 -g15 -aI178 -aI-423 -aI171 -aI-385 -aI174 -aI-405 -aa(lp20087 -g15 -aI199 -aI-475 -aI183 -aI-441 -aI190 -aI-458 -aa(lp20088 -g15 -aI235 -aI-522 -aI208 -aI-491 -aI220 -aI-507 -aa(lp20089 -g15 -aI289 -aI-570 -aI250 -aI-538 -aI268 -aI-554 -aa(lp20090 -g15 -aI335 -aI-608 -aI307 -aI-584 -aI322 -aI-597 -aa(lp20091 -g15 -aI365 -aI-642 -aI347 -aI-620 -aI358 -aI-631 -aa(lp20092 -g15 -aI382 -aI-677 -aI373 -aI-653 -aI379 -aI-665 -aa(lp20093 -g15 -aI388 -aI-719 -aI386 -aI-689 -aI388 -aI-703 -aa(lp20094 -g15 -aI362 -aI-780 -aI388 -aI-744 -aI379 -aI-764 -aa(lp20095 -g15 -aI286 -aI-804 -aI346 -aI-796 -aI320 -aI-804 -aa(lp20096 -g15 -aI189 -aI-786 -aI256 -aI-804 -aI224 -aI-798 -aa(lp20097 -g15 -aI82 -aI-739 -aI155 -aI-773 -aI119 -aI-758 -aa(lp20098 -g20 -aI16 -aI-883 -aa(lp20099 -g15 -aI77 -aI-914 -aI34 -aI-894 -aI55 -aI-904 -aa(lp20100 -g15 -aI145 -aI-940 -aI99 -aI-924 -aI121 -aI-933 -aa(lp20101 -g15 -aI217 -aI-958 -aI169 -aI-948 -aI193 -aI-954 -aa(lp20102 -g15 -aI289 -aI-965 -aI241 -aI-962 -aI265 -aI-965 -aa(lp20103 -g15 -aI408 -aI-949 -aI333 -aI-965 -aI373 -aI-959 -aa(lp20104 -g15 -aI499 -aI-902 -aI444 -aI-938 -aI474 -aI-922 -aa(lp20105 -g15 -aI556 -aI-828 -aI524 -aI-882 -aI543 -aI-857 -aa(lp20106 -g15 -aI576 -aI-728 -aI569 -aI-799 -aI576 -aI-766 -aa(lp20107 -g15 -aI567 -aI-655 -aI576 -aI-701 -aI573 -aI-676 -aa(lp20108 -g15 -aI540 -aI-595 -aI560 -aI-633 -aI551 -aI-614 -aa(lp20109 -g15 -aI495 -aI-542 -aI528 -aI-577 -aI513 -aI-559 -aa(lp20110 -g15 -aI432 -aI-487 -aI477 -aI-525 -aI456 -aI-506 -aa(lp20111 -g15 -aI387 -aI-450 -aI414 -aI-473 -aI399 -aI-461 -aa(lp20112 -g15 -aI360 -aI-420 -aI376 -aI-439 -aI367 -aI-429 -aa(lp20113 -g15 -aI347 -aI-390 -aI354 -aI-410 -aI349 -aI-400 -aa(lp20114 -g15 -aI343 -aI-354 -aI344 -aI-380 -aI343 -aI-368 -aa(lp20115 -g20 -aI343 -aI-315 -aa(lp20116 -g10 -aa(lp20117 -g8 -aI150 -aI-92 -aa(lp20118 -g15 -aI159 -aI-144 -aI150 -aI-113 -aI153 -aI-130 -aa(lp20119 -g15 -aI183 -aI-178 -aI165 -aI-158 -aI173 -aI-169 -aa(lp20120 -g15 -aI220 -aI-197 -aI194 -aI-187 -aI206 -aI-193 -aa(lp20121 -g15 -aI265 -aI-203 -aI234 -aI-201 -aI249 -aI-203 -aa(lp20122 -g15 -aI308 -aI-197 -aI280 -aI-203 -aI295 -aI-201 -aa(lp20123 -g15 -aI345 -aI-178 -aI322 -aI-193 -aI334 -aI-187 -aa(lp20124 -g15 -aI369 -aI-144 -aI355 -aI-169 -aI363 -aI-158 -aa(lp20125 -g15 -aI378 -aI-92 -aI375 -aI-130 -aI378 -aI-113 -aa(lp20126 -g15 -aI369 -aI-42 -aI378 -aI-73 -aI375 -aI-56 -aa(lp20127 -g15 -aI345 -aI-8 -aI363 -aI-28 -aI355 -aI-17 -aa(lp20128 -g15 -aI308 -aI11 -aI334 -aI1 -aI322 -aI7 -aa(lp20129 -g15 -aI265 -aI18 -aI295 -aI15 -aI280 -aI18 -aa(lp20130 -g15 -aI220 -aI11 -aI249 -aI18 -aI234 -aI15 -aa(lp20131 -g15 -aI183 -aI-8 -aI206 -aI7 -aI194 -aI1 -aa(lp20132 -g15 -aI159 -aI-42 -aI173 -aI-17 -aI165 -aI-28 -aa(lp20133 -g15 -aI150 -aI-92 -aI153 -aI-56 -aI150 -aI-73 -aa(lp20134 -g10 -aa(lp20135 -g8 -aI611 -aI0 -aa(lp20136 -g10 -aa(lp20137 -g8 -aI611 -aI0 -aasVC -(lp20138 -(lp20139 -g8 -aI524 -aI-797 -aa(lp20140 -g15 -aI421 -aI-774 -aI485 -aI-797 -aI451 -aI-789 -aa(lp20141 -g15 -aI346 -aI-710 -aI391 -aI-759 -aI366 -aI-738 -aa(lp20142 -g15 -aI300 -aI-607 -aI326 -aI-682 -aI311 -aI-648 -aa(lp20143 -g15 -aI285 -aI-472 -aI290 -aI-567 -aI285 -aI-522 -aa(lp20144 -g15 -aI299 -aI-337 -aI285 -aI-422 -aI289 -aI-376 -aa(lp20145 -g15 -aI342 -aI-237 -aI308 -aI-297 -aI322 -aI-264 -aa(lp20146 -g15 -aI416 -aI-175 -aI361 -aI-210 -aI386 -aI-189 -aa(lp20147 -g15 -aI524 -aI-154 -aI446 -aI-161 -aI482 -aI-154 -aa(lp20148 -g15 -aI640 -aI-167 -aI562 -aI-154 -aI601 -aI-158 -aa(lp20149 -g15 -aI766 -aI-204 -aI679 -aI-176 -aI721 -aI-188 -aa(lp20150 -g20 -aI766 -aI-35 -aa(lp20151 -g15 -aI705 -aI-13 -aI746 -aI-26 -aI725 -aI-19 -aa(lp20152 -g15 -aI642 -aI1 -aI684 -aI-7 -aI663 -aI-2 -aa(lp20153 -g15 -aI577 -aI10 -aI621 -aI5 -aI599 -aI8 -aa(lp20154 -g15 -aI505 -aI13 -aI554 -aI12 -aI530 -aI13 -aa(lp20155 -g15 -aI314 -aI-21 -aI431 -aI13 -aI368 -aI1 -aa(lp20156 -g15 -aI180 -aI-120 -aI260 -aI-45 -aI216 -aI-78 -aa(lp20157 -g15 -aI102 -aI-274 -aI145 -aI-163 -aI119 -aI-214 -aa(lp20158 -g15 -aI77 -aI-474 -aI85 -aI-334 -aI77 -aI-400 -aa(lp20159 -g15 -aI106 -aI-672 -aI77 -aI-546 -aI87 -aI-612 -aa(lp20160 -g15 -aI192 -aI-827 -aI126 -aI-732 -aI154 -aI-784 -aa(lp20161 -g15 -aI332 -aI-928 -aI230 -aI-871 -aI277 -aI-904 -aa(lp20162 -g15 -aI524 -aI-965 -aI388 -aI-952 -aI452 -aI-965 -aa(lp20163 -g15 -aI666 -aI-947 -aI571 -aI-965 -aI618 -aI-959 -aa(lp20164 -g15 -aI802 -aI-897 -aI713 -aI-935 -aI759 -aI-918 -aa(lp20165 -g20 -aI737 -aI-733 -aa(lp20166 -g15 -aI630 -aI-778 -aI702 -aI-750 -aI666 -aI-765 -aa(lp20167 -g15 -aI524 -aI-797 -aI594 -aI-790 -aI558 -aI-797 -aa(lp20168 -g10 -aa(lp20169 -g8 -aI849 -aI0 -aa(lp20170 -g10 -aa(lp20171 -g8 -aI849 -aI0 -aasVG -(lp20172 -(lp20173 -g8 -aI481 -aI-534 -aa(lp20174 -g20 -aI858 -aI-534 -aa(lp20175 -g20 -aI858 -aI-40 -aa(lp20176 -g15 -aI782 -aI-18 -aI833 -aI-32 -aI808 -aI-24 -aa(lp20177 -g15 -aI702 -aI-1 -aI756 -aI-11 -aI730 -aI-5 -aa(lp20178 -g15 -aI616 -aI9 -aI675 -aI3 -aI646 -aI6 -aa(lp20179 -g15 -aI520 -aI13 -aI586 -aI12 -aI554 -aI13 -aa(lp20180 -g15 -aI331 -aI-18 -aI449 -aI13 -aI385 -aI2 -aa(lp20181 -g15 -aI192 -aI-111 -aI276 -aI-39 -aI229 -aI-70 -aa(lp20182 -g15 -aI106 -aI-265 -aI154 -aI-153 -aI126 -aI-204 -aa(lp20183 -g15 -aI77 -aI-476 -aI87 -aI-326 -aI77 -aI-396 -aa(lp20184 -g15 -aI110 -aI-679 -aI77 -aI-551 -aI88 -aI-618 -aa(lp20185 -g15 -aI206 -aI-833 -aI131 -aI-739 -aI163 -aI-790 -aa(lp20186 -g15 -aI362 -aI-930 -aI248 -aI-875 -aI300 -aI-908 -aa(lp20187 -g15 -aI574 -aI-965 -aI424 -aI-953 -aI495 -aI-965 -aa(lp20188 -g15 -aI723 -aI-948 -aI625 -aI-965 -aI675 -aI-959 -aa(lp20189 -g15 -aI857 -aI-906 -aI772 -aI-937 -aI817 -aI-923 -aa(lp20190 -g20 -aI790 -aI-744 -aa(lp20191 -g15 -aI690 -aI-782 -aI760 -aI-759 -aI727 -aI-772 -aa(lp20192 -g15 -aI573 -aI-797 -aI653 -aI-792 -aI614 -aI-797 -aa(lp20193 -g15 -aI454 -aI-773 -aI529 -aI-797 -aI489 -aI-789 -aa(lp20194 -g15 -aI363 -aI-708 -aI418 -aI-758 -aI388 -aI-736 -aa(lp20195 -g15 -aI305 -aI-606 -aI338 -aI-680 -aI318 -aI-646 -aa(lp20196 -g15 -aI285 -aI-472 -aI291 -aI-566 -aI285 -aI-521 -aa(lp20197 -g15 -aI299 -aI-344 -aI285 -aI-425 -aI289 -aI-383 -aa(lp20198 -g15 -aI343 -aI-243 -aI308 -aI-305 -aI323 -aI-271 -aa(lp20199 -g15 -aI420 -aI-177 -aI363 -aI-215 -aI388 -aI-193 -aa(lp20200 -g15 -aI533 -aI-154 -aI451 -aI-162 -aI489 -aI-154 -aa(lp20201 -g15 -aI605 -aI-158 -aI561 -aI-154 -aI586 -aI-155 -aa(lp20202 -g15 -aI661 -aI-167 -aI625 -aI-161 -aI644 -aI-164 -aa(lp20203 -g20 -aI661 -aI-366 -aa(lp20204 -g20 -aI481 -aI-366 -aa(lp20205 -g10 -aa(lp20206 -g8 -aI965 -aI0 -aa(lp20207 -g10 -aa(lp20208 -g8 -aI965 -aI0 -aasVK -(lp20209 -(lp20210 -g8 -aI845 -aI0 -aa(lp20211 -g20 -aI615 -aI0 -aa(lp20212 -g20 -aI397 -aI-395 -aa(lp20213 -g20 -aI321 -aI-339 -aa(lp20214 -g20 -aI321 -aI0 -aa(lp20215 -g20 -aI119 -aI0 -aa(lp20216 -g20 -aI119 -aI-951 -aa(lp20217 -g20 -aI321 -aI-951 -aa(lp20218 -g20 -aI321 -aI-493 -aa(lp20219 -g20 -aI401 -aI-627 -aa(lp20220 -g20 -aI618 -aI-951 -aa(lp20221 -g20 -aI842 -aI-951 -aa(lp20222 -g20 -aI538 -aI-522 -aa(lp20223 -g10 -aa(lp20224 -g8 -aI845 -aI0 -aa(lp20225 -g10 -aa(lp20226 -g8 -aI845 -aI0 -aasVO -(lp20227 -(lp20228 -g8 -aI930 -aI-476 -aa(lp20229 -g15 -aI905 -aI-276 -aI930 -aI-403 -aI922 -aI-336 -aa(lp20230 -g15 -aI826 -aI-121 -aI888 -aI-215 -aI861 -aI-164 -aa(lp20231 -g15 -aI693 -aI-21 -aI791 -aI-78 -aI747 -aI-45 -aa(lp20232 -g15 -aI503 -aI13 -aI640 -aI1 -aI576 -aI13 -aa(lp20233 -g15 -aI314 -aI-21 -aI430 -aI13 -aI367 -aI1 -aa(lp20234 -g15 -aI181 -aI-121 -aI260 -aI-45 -aI216 -aI-78 -aa(lp20235 -g15 -aI103 -aI-276 -aI146 -aI-164 -aI120 -aI-216 -aa(lp20236 -g15 -aI77 -aI-478 -aI86 -aI-337 -aI77 -aI-404 -aa(lp20237 -g15 -aI103 -aI-678 -aI77 -aI-551 -aI86 -aI-618 -aa(lp20238 -g15 -aI181 -aI-832 -aI120 -aI-739 -aI146 -aI-790 -aa(lp20239 -g15 -aI314 -aI-931 -aI216 -aI-875 -aI261 -aI-908 -aa(lp20240 -g15 -aI505 -aI-966 -aI368 -aI-954 -aI431 -aI-966 -aa(lp20241 -g15 -aI694 -aI-931 -aI578 -aI-966 -aI641 -aI-954 -aa(lp20242 -g15 -aI827 -aI-832 -aI748 -aI-908 -aI792 -aI-875 -aa(lp20243 -g15 -aI905 -aI-678 -aI862 -aI-789 -aI888 -aI-738 -aa(lp20244 -g15 -aI930 -aI-476 -aI922 -aI-618 -aI930 -aI-550 -aa(lp20245 -g10 -aa(lp20246 -g8 -aI285 -aI-476 -aa(lp20247 -g15 -aI298 -aI-342 -aI285 -aI-426 -aI289 -aI-382 -aa(lp20248 -g15 -aI338 -aI-241 -aI306 -aI-302 -aI320 -aI-268 -aa(lp20249 -g15 -aI406 -aI-177 -aI356 -aI-213 -aI378 -aI-192 -aa(lp20250 -g15 -aI503 -aI-155 -aI433 -aI-163 -aI466 -aI-155 -aa(lp20251 -g15 -aI603 -aI-177 -aI542 -aI-155 -aI575 -aI-163 -aa(lp20252 -g15 -aI670 -aI-241 -aI630 -aI-192 -aI653 -aI-213 -aa(lp20253 -g15 -aI709 -aI-342 -aI688 -aI-268 -aI701 -aI-302 -aa(lp20254 -g15 -aI722 -aI-476 -aI718 -aI-382 -aI722 -aI-426 -aa(lp20255 -g15 -aI709 -aI-611 -aI722 -aI-526 -aI718 -aI-571 -aa(lp20256 -g15 -aI670 -aI-712 -aI701 -aI-650 -aI688 -aI-684 -aa(lp20257 -g15 -aI603 -aI-776 -aI653 -aI-740 -aI630 -aI-761 -aa(lp20258 -g15 -aI505 -aI-798 -aI576 -aI-790 -aI543 -aI-798 -aa(lp20259 -g15 -aI406 -aI-776 -aI467 -aI-798 -aI434 -aI-790 -aa(lp20260 -g15 -aI338 -aI-712 -aI379 -aI-761 -aI356 -aI-740 -aa(lp20261 -g15 -aI298 -aI-611 -aI320 -aI-684 -aI306 -aI-650 -aa(lp20262 -g15 -aI285 -aI-476 -aI289 -aI-571 -aI285 -aI-526 -aa(lp20263 -g10 -aa(lp20264 -g8 -aI1007 -aI0 -aa(lp20265 -g10 -aa(lp20266 -g8 -aI1007 -aI0 -aasVS -(lp20267 -(lp20268 -g8 -aI641 -aI-263 -aa(lp20269 -g15 -aI619 -aI-148 -aI641 -aI-221 -aI634 -aI-183 -aa(lp20270 -g15 -aI555 -aI-61 -aI604 -aI-114 -aI583 -aI-85 -aa(lp20271 -g15 -aI452 -aI-6 -aI527 -aI-37 -aI493 -aI-19 -aa(lp20272 -g15 -aI313 -aI13 -aI412 -aI6 -aI365 -aI13 -aa(lp20273 -g15 -aI180 -aI0 -aI267 -aI13 -aI222 -aI8 -aa(lp20274 -g15 -aI61 -aI-43 -aI137 -aI-10 -aI97 -aI-24 -aa(lp20275 -g20 -aI61 -aI-231 -aa(lp20276 -g15 -aI124 -aI-202 -aI82 -aI-221 -aI103 -aI-211 -aa(lp20277 -g15 -aI189 -aI-177 -aI145 -aI-193 -aI167 -aI-184 -aa(lp20278 -g15 -aI254 -aI-159 -aI211 -aI-169 -aI232 -aI-164 -aa(lp20279 -g15 -aI320 -aI-153 -aI276 -aI-155 -aI298 -aI-153 -aa(lp20280 -g15 -aI377 -aI-160 -aI342 -aI-153 -aI361 -aI-155 -aa(lp20281 -g15 -aI415 -aI-181 -aI393 -aI-165 -aI405 -aI-172 -aa(lp20282 -g15 -aI437 -aI-213 -aI425 -aI-190 -aI432 -aI-201 -aa(lp20283 -g15 -aI444 -aI-254 -aI441 -aI-225 -aI444 -aI-239 -aa(lp20284 -g15 -aI432 -aI-301 -aI444 -aI-271 -aI440 -aI-287 -aa(lp20285 -g15 -aI400 -aI-339 -aI425 -aI-314 -aI414 -aI-327 -aa(lp20286 -g15 -aI351 -aI-374 -aI387 -aI-351 -aI370 -aI-363 -aa(lp20287 -g15 -aI286 -aI-410 -aI331 -aI-385 -aI310 -aI-397 -aa(lp20288 -g15 -aI219 -aI-448 -aI266 -aI-420 -aI244 -aI-433 -aa(lp20289 -g15 -aI149 -aI-503 -aI194 -aI-462 -aI171 -aI-481 -aa(lp20290 -g15 -aI94 -aI-582 -aI127 -aI-525 -aI109 -aI-551 -aa(lp20291 -g15 -aI72 -aI-694 -aI79 -aI-613 -aI72 -aI-650 -aa(lp20292 -g15 -aI93 -aI-808 -aI72 -aI-736 -aI79 -aI-774 -aa(lp20293 -g15 -aI153 -aI-893 -aI107 -aI-842 -aI127 -aI-870 -aa(lp20294 -g15 -aI248 -aI-946 -aI179 -aI-916 -aI211 -aI-934 -aa(lp20295 -g15 -aI373 -aI-965 -aI285 -aI-958 -aI327 -aI-965 -aa(lp20296 -g15 -aI440 -aI-960 -aI396 -aI-965 -aI418 -aI-963 -aa(lp20297 -g15 -aI505 -aI-947 -aI462 -aI-957 -aI484 -aI-953 -aa(lp20298 -g15 -aI570 -aI-926 -aI527 -aI-941 -aI548 -aI-934 -aa(lp20299 -g15 -aI637 -aI-897 -aI592 -aI-918 -aI614 -aI-908 -aa(lp20300 -g20 -aI572 -aI-741 -aa(lp20301 -g15 -aI517 -aI-765 -aI552 -aI-750 -aI534 -aI-758 -aa(lp20302 -g15 -aI468 -aI-782 -aI500 -aI-772 -aI484 -aI-777 -aa(lp20303 -g15 -aI420 -aI-793 -aI452 -aI-787 -aI436 -aI-791 -aa(lp20304 -g15 -aI374 -aI-797 -aI405 -aI-795 -aI389 -aI-797 -aa(lp20305 -g15 -aI296 -aI-770 -aI340 -aI-797 -aI314 -aI-788 -aa(lp20306 -g15 -aI269 -aI-698 -aI278 -aI-752 -aI269 -aI-728 -aa(lp20307 -g15 -aI277 -aI-655 -aI269 -aI-682 -aI272 -aI-667 -aa(lp20308 -g15 -aI303 -aI-620 -aI283 -aI-643 -aI291 -aI-631 -aa(lp20309 -g15 -aI349 -aI-587 -aI315 -aI-609 -aI331 -aI-598 -aa(lp20310 -g15 -aI418 -aI-549 -aI368 -aI-576 -aI391 -aI-563 -aa(lp20311 -g15 -aI508 -aI-495 -aI451 -aI-531 -aI481 -aI-513 -aa(lp20312 -g15 -aI579 -aI-436 -aI535 -aI-477 -aI559 -aI-457 -aa(lp20313 -g15 -aI625 -aI-361 -aI598 -aI-414 -aI614 -aI-389 -aa(lp20314 -g15 -aI641 -aI-263 -aI635 -aI-333 -aI641 -aI-301 -aa(lp20315 -g10 -aa(lp20316 -g8 -aI698 -aI0 -aa(lp20317 -g10 -aa(lp20318 -g8 -aI698 -aI0 -aasVW -(lp20319 -(lp20320 -g8 -aI1006 -aI0 -aa(lp20321 -g20 -aI777 -aI0 -aa(lp20322 -g20 -aI660 -aI-468 -aa(lp20323 -g15 -aI653 -aI-496 -aI658 -aI-475 -aI656 -aI-484 -aa(lp20324 -g15 -aI645 -aI-536 -aI651 -aI-508 -aI648 -aI-521 -aa(lp20325 -g15 -aI636 -aI-582 -aI642 -aI-550 -aI639 -aI-566 -aa(lp20326 -g15 -aI628 -aI-629 -aI633 -aI-598 -aI630 -aI-613 -aa(lp20327 -g15 -aI621 -aI-671 -aI625 -aI-644 -aI623 -aI-658 -aa(lp20328 -g15 -aI617 -aI-702 -aI619 -aI-683 -aI618 -aI-694 -aa(lp20329 -g15 -aI612 -aI-671 -aI616 -aI-694 -aI614 -aI-683 -aa(lp20330 -g15 -aI606 -aI-629 -aI611 -aI-658 -aI608 -aI-644 -aa(lp20331 -g15 -aI597 -aI-582 -aI603 -aI-614 -aI600 -aI-598 -aa(lp20332 -g15 -aI589 -aI-536 -aI595 -aI-566 -aI592 -aI-551 -aa(lp20333 -g15 -aI581 -aI-496 -aI586 -aI-521 -aI583 -aI-508 -aa(lp20334 -g15 -aI574 -aI-467 -aI578 -aI-484 -aI576 -aI-474 -aa(lp20335 -g20 -aI458 -aI0 -aa(lp20336 -g20 -aI229 -aI0 -aa(lp20337 -g20 -aI0 -aI-951 -aa(lp20338 -g20 -aI198 -aI-951 -aa(lp20339 -g20 -aI306 -aI-431 -aa(lp20340 -g15 -aI312 -aI-401 -aI307 -aI-424 -aI309 -aI-414 -aa(lp20341 -g15 -aI320 -aI-356 -aI314 -aI-388 -aI317 -aI-373 -aa(lp20342 -g15 -aI329 -aI-304 -aI323 -aI-340 -aI326 -aI-323 -aa(lp20343 -g15 -aI339 -aI-251 -aI333 -aI-286 -aI336 -aI-268 -aa(lp20344 -g15 -aI347 -aI-202 -aI342 -aI-234 -aI345 -aI-217 -aa(lp20345 -g15 -aI353 -aI-166 -aI350 -aI-188 -aI352 -aI-175 -aa(lp20346 -g15 -aI359 -aI-202 -aI354 -aI-175 -aI356 -aI-187 -aa(lp20347 -g15 -aI366 -aI-249 -aI361 -aI-217 -aI363 -aI-233 -aa(lp20348 -g15 -aI375 -aI-301 -aI369 -aI-266 -aI372 -aI-283 -aa(lp20349 -g15 -aI384 -aI-351 -aI378 -aI-319 -aI381 -aI-336 -aa(lp20350 -g15 -aI391 -aI-392 -aI386 -aI-366 -aI389 -aI-380 -aa(lp20351 -g15 -aI397 -aI-418 -aI393 -aI-404 -aI395 -aI-412 -aa(lp20352 -g20 -aI529 -aI-951 -aa(lp20353 -g20 -aI706 -aI-951 -aa(lp20354 -g20 -aI838 -aI-418 -aa(lp20355 -g15 -aI844 -aI-392 -aI839 -aI-412 -aI841 -aI-404 -aa(lp20356 -g15 -aI851 -aI-351 -aI846 -aI-380 -aI849 -aI-366 -aa(lp20357 -g15 -aI860 -aI-301 -aI854 -aI-336 -aI857 -aI-319 -aa(lp20358 -g15 -aI869 -aI-249 -aI863 -aI-283 -aI866 -aI-266 -aa(lp20359 -g15 -aI877 -aI-202 -aI872 -aI-233 -aI874 -aI-217 -aa(lp20360 -g15 -aI882 -aI-166 -aI879 -aI-187 -aI881 -aI-175 -aa(lp20361 -g15 -aI888 -aI-202 -aI884 -aI-175 -aI885 -aI-188 -aa(lp20362 -g15 -aI896 -aI-251 -aI890 -aI-217 -aI893 -aI-234 -aa(lp20363 -g15 -aI905 -aI-304 -aI899 -aI-268 -aI902 -aI-286 -aa(lp20364 -g15 -aI915 -aI-356 -aI909 -aI-323 -aI912 -aI-340 -aa(lp20365 -g15 -aI923 -aI-401 -aI918 -aI-373 -aI921 -aI-388 -aa(lp20366 -g15 -aI929 -aI-431 -aI925 -aI-414 -aI927 -aI-424 -aa(lp20367 -g20 -aI1037 -aI-951 -aa(lp20368 -g20 -aI1235 -aI-951 -aa(lp20369 -g10 -aa(lp20370 -g8 -aI1235 -aI0 -aa(lp20371 -g10 -aa(lp20372 -g8 -aI1235 -aI0 -aasV[ -(lp20373 -(lp20374 -g8 -aI408 -aI211 -aa(lp20375 -g20 -aI93 -aI211 -aa(lp20376 -g20 -aI93 -aI-951 -aa(lp20377 -g20 -aI408 -aI-951 -aa(lp20378 -g20 -aI408 -aI-814 -aa(lp20379 -g20 -aI262 -aI-814 -aa(lp20380 -g20 -aI262 -aI74 -aa(lp20381 -g20 -aI408 -aI74 -aa(lp20382 -g10 -aa(lp20383 -g8 -aI441 -aI0 -aa(lp20384 -g10 -aa(lp20385 -g8 -aI441 -aI0 -aasV_ -(lp20386 -(lp20387 -g8 -aI550 -aI211 -aa(lp20388 -g20 -aI-2 -aI211 -aa(lp20389 -g20 -aI-2 -aI120 -aa(lp20390 -g20 -aI550 -aI120 -aa(lp20391 -g10 -aa(lp20392 -g8 -aI548 -aI0 -aa(lp20393 -g10 -aa(lp20394 -g8 -aI548 -aI0 -aasVc -(lp20395 -(lp20396 -g8 -aI406 -aI13 -aa(lp20397 -g15 -aI265 -aI-8 -aI354 -aI13 -aI307 -aI6 -aa(lp20398 -g15 -aI158 -aI-74 -aI224 -aI-22 -aI188 -aI-44 -aa(lp20399 -g15 -aI90 -aI-190 -aI128 -aI-104 -aI106 -aI-143 -aa(lp20400 -g15 -aI66 -aI-359 -aI74 -aI-237 -aI66 -aI-294 -aa(lp20401 -g15 -aI90 -aI-541 -aI66 -aI-432 -aI74 -aI-492 -aa(lp20402 -g15 -aI159 -aI-659 -aI107 -aI-590 -aI130 -aI-629 -aa(lp20403 -g15 -aI267 -aI-722 -aI189 -aI-688 -aI225 -aI-709 -aa(lp20404 -g15 -aI406 -aI-741 -aI309 -aI-734 -aI355 -aI-741 -aa(lp20405 -g15 -aI518 -aI-727 -aI444 -aI-741 -aI481 -aI-736 -aa(lp20406 -g15 -aI622 -aI-689 -aI555 -aI-718 -aI589 -aI-705 -aa(lp20407 -g20 -aI565 -aI-537 -aa(lp20408 -g15 -aI482 -aI-568 -aI536 -aI-550 -aI508 -aI-560 -aa(lp20409 -g15 -aI406 -aI-580 -aI455 -aI-576 -aI430 -aI-580 -aa(lp20410 -g15 -aI302 -aI-525 -aI358 -aI-580 -aI323 -aI-562 -aa(lp20411 -g15 -aI269 -aI-360 -aI280 -aI-489 -aI269 -aI-434 -aa(lp20412 -g15 -aI302 -aI-199 -aI269 -aI-287 -aI280 -aI-234 -aa(lp20413 -g15 -aI404 -aI-147 -aI323 -aI-164 -aI357 -aI-147 -aa(lp20414 -g15 -aI507 -aI-161 -aI442 -aI-147 -aI476 -aI-152 -aa(lp20415 -g15 -aI601 -aI-199 -aI537 -aI-171 -aI569 -aI-184 -aa(lp20416 -g20 -aI601 -aI-34 -aa(lp20417 -g15 -aI554 -aI-13 -aI585 -aI-26 -aI569 -aI-19 -aa(lp20418 -g15 -aI508 -aI1 -aI539 -aI-7 -aI524 -aI-2 -aa(lp20419 -g15 -aI460 -aI10 -aI493 -aI5 -aI477 -aI8 -aa(lp20420 -g15 -aI406 -aI13 -aI443 -aI12 -aI425 -aI13 -aa(lp20421 -g10 -aa(lp20422 -g8 -aI665 -aI0 -aa(lp20423 -g10 -aa(lp20424 -g8 -aI665 -aI0 -aasVg -(lp20425 -(lp20426 -g8 -aI706 -aI-726 -aa(lp20427 -g20 -aI706 -aI-618 -aa(lp20428 -g20 -aI600 -aI-584 -aa(lp20429 -g15 -aI618 -aI-538 -aI608 -aI-570 -aI615 -aI-554 -aa(lp20430 -g15 -aI623 -aI-487 -aI621 -aI-523 -aI623 -aI-506 -aa(lp20431 -g15 -aI606 -aI-386 -aI623 -aI-450 -aI617 -aI-417 -aa(lp20432 -g15 -aI554 -aI-308 -aI594 -aI-355 -aI577 -aI-329 -aa(lp20433 -g15 -aI467 -aI-257 -aI531 -aI-286 -aI502 -aI-269 -aa(lp20434 -g15 -aI346 -aI-239 -aI432 -aI-245 -aI392 -aI-239 -aa(lp20435 -g15 -aI313 -aI-241 -aI336 -aI-239 -aI325 -aI-240 -aa(lp20436 -g15 -aI287 -aI-244 -aI302 -aI-242 -aI293 -aI-243 -aa(lp20437 -g15 -aI267 -aI-221 -aI279 -aI-237 -aI272 -aI-229 -aa(lp20438 -g15 -aI259 -aI-192 -aI262 -aI-213 -aI259 -aI-204 -aa(lp20439 -g15 -aI268 -aI-171 -aI259 -aI-183 -aI262 -aI-176 -aa(lp20440 -g15 -aI290 -aI-158 -aI273 -aI-165 -aI281 -aI-161 -aa(lp20441 -g15 -aI322 -aI-151 -aI299 -aI-154 -aI310 -aI-152 -aa(lp20442 -g15 -aI360 -aI-149 -aI334 -aI-150 -aI347 -aI-149 -aa(lp20443 -g20 -aI473 -aI-149 -aa(lp20444 -g15 -aI567 -aI-137 -aI508 -aI-149 -aI539 -aI-145 -aa(lp20445 -g15 -aI638 -aI-101 -aI595 -aI-129 -aI619 -aI-117 -aa(lp20446 -g15 -aI682 -aI-38 -aI657 -aI-84 -aI672 -aI-63 -aa(lp20447 -g15 -aI698 -aI52 -aI693 -aI-12 -aI698 -aI17 -aa(lp20448 -g15 -aI673 -aI164 -aI698 -aI93 -aI690 -aI130 -aa(lp20449 -g15 -aI599 -aI248 -aI657 -aI197 -aI632 -aI225 -aa(lp20450 -g15 -aI477 -aI302 -aI567 -aI272 -aI526 -aI289 -aa(lp20451 -g15 -aI309 -aI320 -aI429 -aI314 -aI373 -aI320 -aa(lp20452 -g15 -aI179 -aI306 -aI259 -aI320 -aI216 -aI316 -aa(lp20453 -g15 -aI87 -aI266 -aI142 -aI297 -aI111 -aI283 -aa(lp20454 -g15 -aI31 -aI202 -aI62 -aI248 -aI43 -aI227 -aa(lp20455 -g15 -aI13 -aI118 -aI19 -aI178 -aI13 -aI150 -aa(lp20456 -g15 -aI26 -aI49 -aI13 -aI92 -aI17 -aI69 -aa(lp20457 -g15 -aI63 -aI0 -aI35 -aI30 -aI47 -aI13 -aa(lp20458 -g15 -aI114 -aI-34 -aI78 -aI-14 -aI95 -aI-25 -aa(lp20459 -g15 -aI174 -aI-54 -aI134 -aI-42 -aI154 -aI-49 -aa(lp20460 -g15 -aI147 -aI-70 -aI165 -aI-58 -aI156 -aI-63 -aa(lp20461 -g15 -aI123 -aI-94 -aI138 -aI-77 -aI130 -aI-85 -aa(lp20462 -g15 -aI105 -aI-124 -aI116 -aI-103 -aI110 -aI-113 -aa(lp20463 -g15 -aI98 -aI-159 -aI101 -aI-135 -aI98 -aI-147 -aa(lp20464 -g15 -aI105 -aI-197 -aI98 -aI-173 -aI101 -aI-186 -aa(lp20465 -g15 -aI123 -aI-229 -aI109 -aI-208 -aI115 -aI-219 -aa(lp20466 -g15 -aI152 -aI-256 -aI130 -aI-238 -aI140 -aI-248 -aa(lp20467 -g15 -aI192 -aI-283 -aI164 -aI-265 -aI177 -aI-274 -aa(lp20468 -g15 -aI101 -aI-362 -aI153 -aI-299 -aI123 -aI-326 -aa(lp20469 -g15 -aI67 -aI-491 -aI78 -aI-399 -aI67 -aI-442 -aa(lp20470 -g15 -aI85 -aI-596 -aI67 -aI-530 -aI73 -aI-565 -aa(lp20471 -g15 -aI139 -aI-675 -aI98 -aI-627 -aI115 -aI-653 -aa(lp20472 -g15 -aI226 -aI-724 -aI162 -aI-696 -aI191 -aI-712 -aa(lp20473 -g15 -aI346 -aI-741 -aI261 -aI-735 -aI301 -aI-741 -aa(lp20474 -g15 -aI375 -aI-739 -aI355 -aI-741 -aI364 -aI-740 -aa(lp20475 -g15 -aI407 -aI-735 -aI386 -aI-738 -aI397 -aI-737 -aa(lp20476 -g15 -aI437 -aI-730 -aI418 -aI-734 -aI428 -aI-732 -aa(lp20477 -g15 -aI458 -aI-726 -aI446 -aI-728 -aI453 -aI-727 -aa(lp20478 -g10 -aa(lp20479 -g8 -aI185 -aI103 -aa(lp20480 -g15 -aI192 -aI134 -aI185 -aI114 -aI187 -aI124 -aa(lp20481 -g15 -aI214 -aI161 -aI196 -aI145 -aI204 -aI154 -aa(lp20482 -g15 -aI255 -aI180 -aI225 -aI169 -aI238 -aI175 -aa(lp20483 -g15 -aI318 -aI187 -aI272 -aI185 -aI293 -aI187 -aa(lp20484 -g15 -aI471 -aI158 -aI386 -aI187 -aI437 -aI177 -aa(lp20485 -g15 -aI522 -aI81 -aI505 -aI139 -aI522 -aI113 -aa(lp20486 -g15 -aI490 -aI27 -aI522 -aI54 -aI512 -aI36 -aa(lp20487 -g15 -aI391 -aI13 -aI469 -aI18 -aI436 -aI13 -aa(lp20488 -g20 -aI300 -aI13 -aa(lp20489 -g15 -aI262 -aI17 -aI288 -aI13 -aI275 -aI14 -aa(lp20490 -g15 -aI225 -aI32 -aI248 -aI20 -aI236 -aI25 -aa(lp20491 -g15 -aI196 -aI60 -aI213 -aI39 -aI204 -aI48 -aa(lp20492 -g15 -aI185 -aI103 -aI189 -aI71 -aI185 -aI85 -aa(lp20493 -g10 -aa(lp20494 -g8 -aI257 -aI-489 -aa(lp20495 -g15 -aI279 -aI-397 -aI257 -aI-449 -aI264 -aI-419 -aa(lp20496 -g15 -aI346 -aI-364 -aI294 -aI-375 -aI316 -aI-364 -aa(lp20497 -g15 -aI414 -aI-397 -aI377 -aI-364 -aI400 -aI-375 -aa(lp20498 -g15 -aI434 -aI-489 -aI427 -aI-419 -aI434 -aI-449 -aa(lp20499 -g15 -aI414 -aI-582 -aI434 -aI-528 -aI428 -aI-559 -aa(lp20500 -g15 -aI346 -aI-616 -aI400 -aI-605 -aI378 -aI-616 -aa(lp20501 -g15 -aI257 -aI-489 -aI286 -aI-616 -aI257 -aI-574 -aa(lp20502 -g10 -aa(lp20503 -g8 -aI735 -aI0 -aa(lp20504 -g10 -aa(lp20505 -g8 -aI735 -aI0 -aasVk -(lp20506 -(lp20507 -g8 -aI294 -aI-395 -aa(lp20508 -g20 -aI367 -aI-506 -aa(lp20509 -g20 -aI545 -aI-727 -aa(lp20510 -g20 -aI769 -aI-727 -aa(lp20511 -g20 -aI506 -aI-411 -aa(lp20512 -g20 -aI786 -aI0 -aa(lp20513 -g20 -aI557 -aI0 -aa(lp20514 -g20 -aI380 -aI-279 -aa(lp20515 -g20 -aI302 -aI-226 -aa(lp20516 -g20 -aI302 -aI0 -aa(lp20517 -g20 -aI104 -aI0 -aa(lp20518 -g20 -aI104 -aI-1012 -aa(lp20519 -g20 -aI302 -aI-1012 -aa(lp20520 -g20 -aI302 -aI-560 -aa(lp20521 -g20 -aI292 -aI-395 -aa(lp20522 -g10 -aa(lp20523 -g8 -aI786 -aI0 -aa(lp20524 -g10 -aa(lp20525 -g8 -aI786 -aI0 -aasVo -(lp20526 -(lp20527 -g8 -aI269 -aI-364 -aa(lp20528 -g15 -aI300 -aI-201 -aI269 -aI-292 -aI279 -aI-237 -aa(lp20529 -g15 -aI399 -aI-146 -aI320 -aI-164 -aI353 -aI-146 -aa(lp20530 -g15 -aI498 -aI-201 -aI445 -aI-146 -aI478 -aI-164 -aa(lp20531 -g15 -aI529 -aI-364 -aI519 -aI-238 -aI529 -aI-292 -aa(lp20532 -g15 -aI498 -aI-527 -aI529 -aI-437 -aI519 -aI-491 -aa(lp20533 -g15 -aI398 -aI-580 -aI478 -aI-563 -aI444 -aI-580 -aa(lp20534 -g15 -aI299 -aI-527 -aI352 -aI-580 -aI319 -aI-563 -aa(lp20535 -g15 -aI269 -aI-364 -aI279 -aI-491 -aI269 -aI-437 -aa(lp20536 -g10 -aa(lp20537 -g8 -aI731 -aI-364 -aa(lp20538 -g15 -aI708 -aI-203 -aI731 -aI-304 -aI724 -aI-250 -aa(lp20539 -g15 -aI642 -aI-84 -aI693 -aI-156 -aI671 -aI-116 -aa(lp20540 -g15 -aI536 -aI-11 -aI613 -aI-52 -aI578 -aI-28 -aa(lp20541 -g15 -aI397 -aI13 -aI495 -aI5 -aI448 -aI13 -aa(lp20542 -g15 -aI264 -aI-11 -aI348 -aI13 -aI304 -aI5 -aa(lp20543 -g15 -aI159 -aI-84 -aI223 -aI-28 -aI189 -aI-52 -aa(lp20544 -g15 -aI91 -aI-203 -aI130 -aI-116 -aI107 -aI-156 -aa(lp20545 -g15 -aI66 -aI-364 -aI74 -aI-250 -aI66 -aI-304 -aa(lp20546 -g15 -aI89 -aI-525 -aI66 -aI-425 -aI74 -aI-478 -aa(lp20547 -g15 -aI155 -aI-643 -aI104 -aI-572 -aI127 -aI-611 -aa(lp20548 -g15 -aI261 -aI-716 -aI184 -aI-675 -aI219 -aI-699 -aa(lp20549 -g15 -aI401 -aI-741 -aI302 -aI-732 -aI348 -aI-741 -aa(lp20550 -g15 -aI533 -aI-716 -aI449 -aI-741 -aI493 -aI-732 -aa(lp20551 -g15 -aI638 -aI-643 -aI574 -aI-699 -aI609 -aI-675 -aa(lp20552 -g15 -aI707 -aI-525 -aI667 -aI-611 -aI690 -aI-572 -aa(lp20553 -g15 -aI731 -aI-364 -aI723 -aI-478 -aI731 -aI-425 -aa(lp20554 -g10 -aa(lp20555 -g8 -aI798 -aI0 -aa(lp20556 -g10 -aa(lp20557 -g8 -aI798 -aI0 -aasVs -(lp20558 -(lp20559 -g8 -aI589 -aI-215 -aa(lp20560 -g15 -aI568 -aI-115 -aI589 -aI-177 -aI582 -aI-144 -aa(lp20561 -g15 -aI509 -aI-43 -aI554 -aI-86 -aI534 -aI-62 -aa(lp20562 -g15 -aI416 -aI0 -aI483 -aI-24 -aI452 -aI-10 -aa(lp20563 -g15 -aI293 -aI13 -aI379 -aI8 -aI338 -aI13 -aa(lp20564 -g15 -aI227 -aI11 -aI269 -aI13 -aI247 -aI12 -aa(lp20565 -g15 -aI169 -aI3 -aI206 -aI9 -aI187 -aI7 -aa(lp20566 -g15 -aI116 -aI-9 -aI151 -aI0 -aI133 -aI-4 -aa(lp20567 -g15 -aI65 -aI-28 -aI99 -aI-14 -aI82 -aI-21 -aa(lp20568 -g20 -aI65 -aI-192 -aa(lp20569 -g15 -aI122 -aI-168 -aI83 -aI-183 -aI102 -aI-175 -aa(lp20570 -g15 -aI182 -aI-148 -aI142 -aI-160 -aI162 -aI-154 -aa(lp20571 -g15 -aI241 -aI-136 -aI202 -aI-143 -aI222 -aI-139 -aa(lp20572 -g15 -aI293 -aI-131 -aI260 -aI-133 -aI277 -aI-131 -aa(lp20573 -g15 -aI339 -aI-136 -aI311 -aI-131 -aI326 -aI-133 -aa(lp20574 -g15 -aI370 -aI-150 -aI351 -aI-139 -aI362 -aI-144 -aa(lp20575 -g15 -aI387 -aI-171 -aI378 -aI-156 -aI384 -aI-163 -aa(lp20576 -g15 -aI393 -aI-196 -aI391 -aI-179 -aI393 -aI-187 -aa(lp20577 -g15 -aI388 -aI-221 -aI393 -aI-205 -aI391 -aI-214 -aa(lp20578 -g15 -aI369 -aI-244 -aI386 -aI-228 -aI379 -aI-235 -aa(lp20579 -g15 -aI325 -aI-271 -aI359 -aI-252 -aI345 -aI-261 -aa(lp20580 -g15 -aI248 -aI-308 -aI306 -aI-281 -aI280 -aI-294 -aa(lp20581 -g15 -aI165 -aI-351 -aI216 -aI-323 -aI188 -aI-337 -aa(lp20582 -g15 -aI108 -aI-398 -aI142 -aI-365 -aI123 -aI-381 -aa(lp20583 -g15 -aI74 -aI-458 -aI93 -aI-415 -aI82 -aI-435 -aa(lp20584 -g15 -aI63 -aI-537 -aI67 -aI-480 -aI63 -aI-507 -aa(lp20585 -g15 -aI83 -aI-626 -aI63 -aI-571 -aI70 -aI-601 -aa(lp20586 -g15 -aI138 -aI-690 -aI96 -aI-652 -aI114 -aI-673 -aa(lp20587 -g15 -aI224 -aI-728 -aI162 -aI-707 -aI191 -aI-719 -aa(lp20588 -g15 -aI337 -aI-741 -aI258 -aI-736 -aI296 -aI-741 -aa(lp20589 -g15 -aI460 -aI-726 -aI380 -aI-741 -aI421 -aI-736 -aa(lp20590 -g15 -aI581 -aI-681 -aI500 -aI-716 -aI540 -aI-701 -aa(lp20591 -g20 -aI521 -aI-540 -aa(lp20592 -g15 -aI427 -aI-578 -aI488 -aI-556 -aI457 -aI-568 -aa(lp20593 -g15 -aI337 -aI-593 -aI397 -aI-588 -aI367 -aI-593 -aa(lp20594 -g15 -aI278 -aI-579 -aI310 -aI-593 -aI290 -aI-589 -aa(lp20595 -g15 -aI261 -aI-540 -aI267 -aI-570 -aI261 -aI-557 -aa(lp20596 -g15 -aI265 -aI-517 -aI261 -aI-531 -aI262 -aI-524 -aa(lp20597 -g15 -aI283 -aI-496 -aI268 -aI-510 -aI274 -aI-503 -aa(lp20598 -g15 -aI322 -aI-473 -aI292 -aI-489 -aI305 -aI-481 -aa(lp20599 -g15 -aI386 -aI-442 -aI338 -aI-464 -aI360 -aI-454 -aa(lp20600 -g15 -aI470 -aI-402 -aI417 -aI-428 -aI445 -aI-415 -aa(lp20601 -g15 -aI533 -aI-356 -aI494 -aI-388 -aI516 -aI-373 -aa(lp20602 -g15 -aI574 -aI-297 -aI551 -aI-340 -aI565 -aI-320 -aa(lp20603 -g15 -aI589 -aI-215 -aI584 -aI-275 -aI589 -aI-247 -aa(lp20604 -g10 -aa(lp20605 -g8 -aI641 -aI0 -aa(lp20606 -g10 -aa(lp20607 -g8 -aI641 -aI0 -aasVw -(lp20608 -(lp20609 -g8 -aI660 -aI0 -aa(lp20610 -g20 -aI604 -aI-254 -aa(lp20611 -g15 -aI597 -aI-285 -aI602 -aI-261 -aI600 -aI-272 -aa(lp20612 -g15 -aI587 -aI-331 -aI594 -aI-299 -aI591 -aI-314 -aa(lp20613 -g15 -aI577 -aI-386 -aI584 -aI-349 -aI580 -aI-367 -aa(lp20614 -g15 -aI565 -aI-444 -aI573 -aI-405 -aI569 -aI-425 -aa(lp20615 -g15 -aI537 -aI-588 -aI557 -aI-488 -aI547 -aI-537 -aa(lp20616 -g20 -aI533 -aI-588 -aa(lp20617 -g15 -aI505 -aI-443 -aI523 -aI-537 -aI514 -aI-488 -aa(lp20618 -g15 -aI495 -aI-385 -aI502 -aI-424 -aI498 -aI-405 -aa(lp20619 -g15 -aI484 -aI-330 -aI491 -aI-366 -aI487 -aI-347 -aa(lp20620 -g15 -aI474 -aI-284 -aI480 -aI-313 -aI477 -aI-297 -aa(lp20621 -g15 -aI468 -aI-251 -aI472 -aI-270 -aI469 -aI-259 -aa(lp20622 -g20 -aI409 -aI0 -aa(lp20623 -g20 -aI195 -aI0 -aa(lp20624 -g20 -aI0 -aI-727 -aa(lp20625 -g20 -aI197 -aI-727 -aa(lp20626 -g20 -aI270 -aI-405 -aa(lp20627 -g15 -aI282 -aI-344 -aI274 -aI-388 -aI278 -aI-367 -aa(lp20628 -g15 -aI294 -aI-272 -aI287 -aI-320 -aI290 -aI-296 -aa(lp20629 -g15 -aI304 -aI-204 -aI298 -aI-248 -aI301 -aI-225 -aa(lp20630 -g15 -aI311 -aI-153 -aI307 -aI-182 -aI310 -aI-165 -aa(lp20631 -g20 -aI315 -aI-153 -aa(lp20632 -g15 -aI318 -aI-185 -aI316 -aI-161 -aI317 -aI-172 -aa(lp20633 -g15 -aI324 -aI-228 -aI320 -aI-198 -aI322 -aI-212 -aa(lp20634 -g15 -aI331 -aI-274 -aI326 -aI-243 -aI328 -aI-258 -aa(lp20635 -g15 -aI338 -aI-319 -aI333 -aI-290 -aI335 -aI-305 -aa(lp20636 -g15 -aI344 -aI-355 -aI340 -aI-333 -aI342 -aI-345 -aa(lp20637 -g15 -aI349 -aI-378 -aI346 -aI-366 -aI348 -aI-374 -aa(lp20638 -g20 -aI429 -aI-727 -aa(lp20639 -g20 -aI647 -aI-727 -aa(lp20640 -g20 -aI723 -aI-378 -aa(lp20641 -g15 -aI732 -aI-334 -aI726 -aI-368 -aI728 -aI-354 -aa(lp20642 -g15 -aI743 -aI-270 -aI735 -aI-314 -aI739 -aI-292 -aa(lp20643 -g15 -aI752 -aI-203 -aI746 -aI-247 -aI750 -aI-225 -aa(lp20644 -g15 -aI757 -aI-153 -aI755 -aI-182 -aI756 -aI-165 -aa(lp20645 -g20 -aI761 -aI-153 -aa(lp20646 -g15 -aI767 -aI-201 -aI762 -aI-164 -aI764 -aI-180 -aa(lp20647 -g15 -aI778 -aI-270 -aI771 -aI-222 -aI774 -aI-245 -aa(lp20648 -g15 -aI791 -aI-343 -aI782 -aI-294 -aI786 -aI-318 -aa(lp20649 -g15 -aI804 -aI-405 -aI795 -aI-367 -aI800 -aI-388 -aa(lp20650 -g20 -aI880 -aI-727 -aa(lp20651 -g20 -aI1074 -aI-727 -aa(lp20652 -g20 -aI876 -aI0 -aa(lp20653 -g10 -aa(lp20654 -g8 -aI1074 -aI0 -aa(lp20655 -g10 -aa(lp20656 -g8 -aI1074 -aI0 -aasV{ -(lp20657 -(lp20658 -g8 -aI186 -aI-175 -aa(lp20659 -g15 -aI144 -aI-265 -aI186 -aI-217 -aI172 -aI-247 -aa(lp20660 -g15 -aI20 -aI-291 -aI115 -aI-282 -aI74 -aI-291 -aa(lp20661 -g20 -aI20 -aI-447 -aa(lp20662 -g15 -aI92 -aI-453 -aI47 -aI-447 -aI71 -aI-449 -aa(lp20663 -g15 -aI145 -aI-473 -aI113 -aI-457 -aI130 -aI-464 -aa(lp20664 -g15 -aI177 -aI-509 -aI159 -aI-483 -aI170 -aI-495 -aa(lp20665 -g15 -aI186 -aI-563 -aI184 -aI-524 -aI187 -aI-542 -aa(lp20666 -g20 -aI186 -aI-770 -aa(lp20667 -g15 -aI199 -aI-852 -aI186 -aI-802 -aI190 -aI-829 -aa(lp20668 -g15 -aI243 -aI-908 -aI207 -aI-875 -aI222 -aI-894 -aa(lp20669 -g15 -aI331 -aI-940 -aI265 -aI-923 -aI294 -aI-934 -aa(lp20670 -g15 -aI472 -aI-951 -aI368 -aI-947 -aI415 -aI-951 -aa(lp20671 -g20 -aI472 -aI-804 -aa(lp20672 -g15 -aI424 -aI-800 -aI454 -aI-804 -aI438 -aI-802 -aa(lp20673 -g15 -aI388 -aI-786 -aI410 -aI-797 -aI398 -aI-793 -aa(lp20674 -g15 -aI366 -aI-758 -aI379 -aI-779 -aI371 -aI-770 -aa(lp20675 -g15 -aI358 -aI-713 -aI361 -aI-746 -aI358 -aI-731 -aa(lp20676 -g20 -aI358 -aI-518 -aa(lp20677 -g15 -aI206 -aI-373 -aI356 -aI-437 -aI305 -aI-389 -aa(lp20678 -g20 -aI206 -aI-366 -aa(lp20679 -g15 -aI320 -aI-319 -aI256 -aI-358 -aI294 -aI-343 -aa(lp20680 -g15 -aI358 -aI-222 -aI347 -aI-295 -aI360 -aI-263 -aa(lp20681 -g20 -aI358 -aI-27 -aa(lp20682 -g15 -aI366 -aI18 -aI358 -aI-8 -aI361 -aI6 -aa(lp20683 -g15 -aI388 -aI45 -aI371 -aI29 -aI379 -aI38 -aa(lp20684 -g15 -aI424 -aI59 -aI398 -aI52 -aI410 -aI57 -aa(lp20685 -g15 -aI472 -aI64 -aI438 -aI62 -aI454 -aI63 -aa(lp20686 -g20 -aI472 -aI211 -aa(lp20687 -g15 -aI331 -aI200 -aI415 -aI211 -aI368 -aI207 -aa(lp20688 -g15 -aI243 -aI168 -aI294 -aI194 -aI265 -aI183 -aa(lp20689 -g15 -aI199 -aI112 -aI222 -aI154 -aI207 -aI135 -aa(lp20690 -g15 -aI186 -aI29 -aI190 -aI89 -aI186 -aI61 -aa(lp20691 -g20 -aI186 -aI-175 -aa(lp20692 -g10 -aa(lp20693 -g8 -aI485 -aI0 -aa(lp20694 -g10 -aa(lp20695 -g8 -aI485 -aI0 -aasV" -(lp20696 -(lp20697 -g8 -aI268 -aI-951 -aa(lp20698 -g20 -aI241 -aI-607 -aa(lp20699 -g20 -aI113 -aI-607 -aa(lp20700 -g20 -aI86 -aI-951 -aa(lp20701 -g10 -aa(lp20702 -g8 -aI542 -aI-951 -aa(lp20703 -g20 -aI516 -aI-607 -aa(lp20704 -g20 -aI388 -aI-607 -aa(lp20705 -g20 -aI361 -aI-951 -aa(lp20706 -g10 -aa(lp20707 -g8 -aI629 -aI0 -aa(lp20708 -g10 -aa(lp20709 -g8 -aI629 -aI0 -aasV& -(lp20710 -(lp20711 -g8 -aI960 -aI0 -aa(lp20712 -g20 -aI714 -aI0 -aa(lp20713 -g20 -aI651 -aI-64 -aa(lp20714 -g15 -aI536 -aI-7 -aI616 -aI-40 -aI578 -aI-21 -aa(lp20715 -g15 -aI398 -aI13 -aI494 -aI6 -aI448 -aI13 -aa(lp20716 -g15 -aI256 -aI-6 -aI346 -aI13 -aI299 -aI6 -aa(lp20717 -g15 -aI148 -aI-61 -aI214 -aI-19 -aI178 -aI-37 -aa(lp20718 -g15 -aI78 -aI-146 -aI117 -aI-84 -aI94 -aI-113 -aa(lp20719 -g15 -aI53 -aI-256 -aI61 -aI-179 -aI53 -aI-216 -aa(lp20720 -g15 -aI65 -aI-346 -aI53 -aI-290 -aI57 -aI-319 -aa(lp20721 -g15 -aI99 -aI-417 -aI73 -aI-372 -aI84 -aI-396 -aa(lp20722 -g15 -aI153 -aI-475 -aI114 -aI-438 -aI132 -aI-458 -aa(lp20723 -g15 -aI223 -aI-524 -aI174 -aI-492 -aI197 -aI-509 -aa(lp20724 -g15 -aI181 -aI-582 -aI207 -aI-544 -aI193 -aI-564 -aa(lp20725 -g15 -aI154 -aI-637 -aI170 -aI-601 -aI161 -aI-619 -aa(lp20726 -g15 -aI139 -aI-691 -aI147 -aI-655 -aI142 -aI-673 -aa(lp20727 -g15 -aI134 -aI-747 -aI136 -aI-709 -aI134 -aI-728 -aa(lp20728 -g15 -aI154 -aI-838 -aI134 -aI-781 -aI141 -aI-811 -aa(lp20729 -g15 -aI209 -aI-906 -aI167 -aI-865 -aI186 -aI-887 -aa(lp20730 -g15 -aI294 -aI-950 -aI233 -aI-925 -aI261 -aI-940 -aa(lp20731 -g15 -aI402 -aI-965 -aI327 -aI-960 -aI363 -aI-965 -aa(lp20732 -g15 -aI505 -aI-951 -aI439 -aI-965 -aI474 -aI-960 -aa(lp20733 -g15 -aI586 -aI-911 -aI537 -aI-942 -aI564 -aI-928 -aa(lp20734 -g15 -aI640 -aI-846 -aI609 -aI-893 -aI627 -aI-872 -aa(lp20735 -g15 -aI660 -aI-758 -aI653 -aI-820 -aI660 -aI-790 -aa(lp20736 -g15 -aI645 -aI-675 -aI660 -aI-728 -aI655 -aI-700 -aa(lp20737 -g15 -aI606 -aI-606 -aI635 -aI-650 -aI622 -aI-627 -aa(lp20738 -g15 -aI547 -aI-547 -aI589 -aI-585 -aI570 -aI-565 -aa(lp20739 -g15 -aI475 -aI-498 -aI525 -aI-529 -aI501 -aI-513 -aa(lp20740 -g20 -aI645 -aI-323 -aa(lp20741 -g15 -aI685 -aI-414 -aI660 -aI-352 -aI673 -aI-382 -aa(lp20742 -g15 -aI714 -aI-509 -aI696 -aI-445 -aI706 -aI-477 -aa(lp20743 -g20 -aI921 -aI-509 -aa(lp20744 -g15 -aI898 -aI-431 -aI914 -aI-485 -aI907 -aI-459 -aa(lp20745 -g15 -aI867 -aI-349 -aI889 -aI-404 -aI878 -aI-377 -aa(lp20746 -g15 -aI826 -aI-267 -aI855 -aI-321 -aI842 -aI-294 -aa(lp20747 -g15 -aI776 -aI-189 -aI811 -aI-239 -aI794 -aI-213 -aa(lp20748 -g10 -aa(lp20749 -g8 -aI262 -aI-275 -aa(lp20750 -g15 -aI272 -aI-224 -aI262 -aI-256 -aI265 -aI-239 -aa(lp20751 -g15 -aI301 -aI-185 -aI279 -aI-208 -aI289 -aI-196 -aa(lp20752 -g15 -aI345 -aI-161 -aI314 -aI-175 -aI328 -aI-167 -aa(lp20753 -g15 -aI399 -aI-153 -aI362 -aI-156 -aI380 -aI-153 -aa(lp20754 -g15 -aI472 -aI-163 -aI425 -aI-153 -aI449 -aI-156 -aa(lp20755 -g15 -aI533 -aI-191 -aI494 -aI-170 -aI514 -aI-179 -aa(lp20756 -g20 -aI332 -aI-406 -aa(lp20757 -g15 -aI280 -aI-347 -aI309 -aI-388 -aI292 -aI-368 -aa(lp20758 -g15 -aI262 -aI-275 -aI268 -aI-327 -aI262 -aI-302 -aa(lp20759 -g10 -aa(lp20760 -g8 -aI475 -aI-731 -aa(lp20761 -g15 -aI469 -aI-765 -aI475 -aI-744 -aI473 -aI-756 -aa(lp20762 -g15 -aI452 -aI-788 -aI465 -aI-774 -aI459 -aI-782 -aa(lp20763 -g15 -aI428 -aI-801 -aI444 -aI-794 -aI436 -aI-799 -aa(lp20764 -g15 -aI401 -aI-806 -aI419 -aI-804 -aI410 -aI-806 -aa(lp20765 -g15 -aI372 -aI-802 -aI391 -aI-806 -aI381 -aI-804 -aa(lp20766 -g15 -aI345 -aI-789 -aI362 -aI-799 -aI353 -aI-795 -aa(lp20767 -g15 -aI325 -aI-766 -aI337 -aI-783 -aI330 -aI-775 -aa(lp20768 -g15 -aI318 -aI-730 -aI320 -aI-756 -aI318 -aI-744 -aa(lp20769 -g15 -aI333 -aI-666 -aI318 -aI-707 -aI323 -aI-686 -aa(lp20770 -g15 -aI374 -aI-606 -aI343 -aI-646 -aI356 -aI-626 -aa(lp20771 -g15 -aI450 -aI-663 -aI407 -aI-625 -aI433 -aI-644 -aa(lp20772 -g15 -aI475 -aI-731 -aI467 -aI-682 -aI475 -aI-705 -aa(lp20773 -g10 -aa(lp20774 -g8 -aI962 -aI0 -aa(lp20775 -g10 -aa(lp20776 -g8 -aI962 -aI0 -aasV* -(lp20777 -(lp20778 -g8 -aI447 -aI-1012 -aa(lp20779 -g20 -aI421 -aI-772 -aa(lp20780 -g20 -aI664 -aI-840 -aa(lp20781 -g20 -aI685 -aI-676 -aa(lp20782 -g20 -aI464 -aI-661 -aa(lp20783 -g20 -aI609 -aI-467 -aa(lp20784 -g20 -aI461 -aI-388 -aa(lp20785 -g20 -aI360 -aI-592 -aa(lp20786 -g20 -aI270 -aI-390 -aa(lp20787 -g20 -aI117 -aI-467 -aa(lp20788 -g20 -aI261 -aI-661 -aa(lp20789 -g20 -aI41 -aI-677 -aa(lp20790 -g20 -aI66 -aI-840 -aa(lp20791 -g20 -aI304 -aI-772 -aa(lp20792 -g20 -aI277 -aI-1012 -aa(lp20793 -g10 -aa(lp20794 -g8 -aI726 -aI0 -aa(lp20795 -g10 -aa(lp20796 -g8 -aI726 -aI0 -aasV. -(lp20797 -(lp20798 -g8 -aI76 -aI-92 -aa(lp20799 -g15 -aI84 -aI-144 -aI76 -aI-113 -aI79 -aI-130 -aa(lp20800 -g15 -aI109 -aI-178 -aI90 -aI-158 -aI98 -aI-169 -aa(lp20801 -g15 -aI145 -aI-197 -aI119 -aI-187 -aI131 -aI-193 -aa(lp20802 -g15 -aI190 -aI-203 -aI159 -aI-201 -aI174 -aI-203 -aa(lp20803 -g15 -aI234 -aI-197 -aI205 -aI-203 -aI220 -aI-201 -aa(lp20804 -g15 -aI270 -aI-178 -aI247 -aI-193 -aI259 -aI-187 -aa(lp20805 -g15 -aI294 -aI-144 -aI280 -aI-169 -aI288 -aI-158 -aa(lp20806 -g15 -aI304 -aI-92 -aI300 -aI-130 -aI304 -aI-113 -aa(lp20807 -g15 -aI294 -aI-42 -aI304 -aI-73 -aI300 -aI-56 -aa(lp20808 -g15 -aI270 -aI-8 -aI288 -aI-28 -aI280 -aI-17 -aa(lp20809 -g15 -aI234 -aI11 -aI259 -aI1 -aI247 -aI7 -aa(lp20810 -g15 -aI190 -aI18 -aI220 -aI15 -aI205 -aI18 -aa(lp20811 -g15 -aI145 -aI11 -aI174 -aI18 -aI159 -aI15 -aa(lp20812 -g15 -aI109 -aI-8 -aI131 -aI7 -aI119 -aI1 -aa(lp20813 -g15 -aI84 -aI-42 -aI98 -aI-17 -aI90 -aI-28 -aa(lp20814 -g15 -aI76 -aI-92 -aI79 -aI-56 -aI76 -aI-73 -aa(lp20815 -g10 -aa(lp20816 -g8 -aI380 -aI0 -aa(lp20817 -g10 -aa(lp20818 -g8 -aI380 -aI0 -aasV2 -(lp20819 -(lp20820 -g8 -aI692 -aI0 -aa(lp20821 -g20 -aI53 -aI0 -aa(lp20822 -g20 -aI53 -aI-139 -aa(lp20823 -g20 -aI277 -aI-381 -aa(lp20824 -g15 -aI354 -aI-465 -aI305 -aI-411 -aI331 -aI-439 -aa(lp20825 -g15 -aI413 -aI-539 -aI377 -aI-490 -aI396 -aI-515 -aa(lp20826 -g15 -aI451 -aI-614 -aI429 -aI-564 -aI442 -aI-588 -aa(lp20827 -g15 -aI465 -aI-695 -aI460 -aI-639 -aI465 -aI-666 -aa(lp20828 -g15 -aI436 -aI-770 -aI465 -aI-727 -aI455 -aI-752 -aa(lp20829 -g15 -aI358 -aI-797 -aI417 -aI-788 -aI391 -aI-797 -aa(lp20830 -g15 -aI259 -aI-771 -aI324 -aI-797 -aI291 -aI-788 -aa(lp20831 -g15 -aI160 -aI-699 -aI228 -aI-754 -aI194 -aI-730 -aa(lp20832 -g20 -aI50 -aI-828 -aa(lp20833 -g15 -aI111 -aI-880 -aI70 -aI-846 -aI90 -aI-863 -aa(lp20834 -g15 -aI182 -aI-923 -aI133 -aI-896 -aI156 -aI-910 -aa(lp20835 -g15 -aI266 -aI-953 -aI207 -aI-935 -aI236 -aI-946 -aa(lp20836 -g15 -aI370 -aI-965 -aI297 -aI-961 -aI332 -aI-965 -aa(lp20837 -g15 -aI493 -aI-946 -aI416 -aI-965 -aI456 -aI-958 -aa(lp20838 -g15 -aI585 -aI-892 -aI529 -aI-933 -aI560 -aI-915 -aa(lp20839 -g15 -aI644 -aI-808 -aI611 -aI-869 -aI631 -aI-841 -aa(lp20840 -g15 -aI665 -aI-696 -aI658 -aI-775 -aI665 -aI-738 -aa(lp20841 -g15 -aI645 -aI-589 -aI665 -aI-659 -aI658 -aI-623 -aa(lp20842 -g15 -aI592 -aI-489 -aI632 -aI-555 -aI615 -aI-522 -aa(lp20843 -g15 -aI513 -aI-391 -aI569 -aI-456 -aI543 -aI-424 -aa(lp20844 -g15 -aI418 -aI-293 -aI484 -aI-359 -aI452 -aI-326 -aa(lp20845 -g20 -aI304 -aI-177 -aa(lp20846 -g20 -aI304 -aI-168 -aa(lp20847 -g20 -aI692 -aI-168 -aa(lp20848 -g10 -aa(lp20849 -g8 -aI734 -aI0 -aa(lp20850 -g10 -aa(lp20851 -g8 -aI734 -aI0 -aasV6 -(lp20852 -(lp20853 -g8 -aI49 -aI-403 -aa(lp20854 -g15 -aI56 -aI-539 -aI49 -aI-449 -aI51 -aI-494 -aa(lp20855 -g15 -aI83 -aI-669 -aI61 -aI-585 -aI70 -aI-628 -aa(lp20856 -g15 -aI135 -aI-785 -aI96 -aI-711 -aI113 -aI-749 -aa(lp20857 -g15 -aI219 -aI-878 -aI157 -aI-820 -aI185 -aI-851 -aa(lp20858 -g15 -aI340 -aI-939 -aI252 -aI-904 -aI293 -aI-925 -aa(lp20859 -g15 -aI505 -aI-962 -aI387 -aI-954 -aI442 -aI-962 -aa(lp20860 -g15 -aI535 -aI-961 -aI514 -aI-962 -aI524 -aI-962 -aa(lp20861 -g15 -aI568 -aI-960 -aI546 -aI-961 -aI556 -aI-960 -aa(lp20862 -g15 -aI600 -aI-957 -aI579 -aI-959 -aI589 -aI-958 -aa(lp20863 -g15 -aI628 -aI-952 -aI610 -aI-955 -aI620 -aI-954 -aa(lp20864 -g20 -aI628 -aI-791 -aa(lp20865 -g15 -aI575 -aI-801 -aI611 -aI-795 -aI594 -aI-798 -aa(lp20866 -g15 -aI520 -aI-804 -aI557 -aI-803 -aI538 -aI-804 -aa(lp20867 -g15 -aI375 -aI-783 -aI461 -aI-804 -aI413 -aI-797 -aa(lp20868 -g15 -aI285 -aI-722 -aI337 -aI-768 -aI307 -aI-748 -aa(lp20869 -g15 -aI238 -aI-628 -aI263 -aI-696 -aI247 -aI-664 -aa(lp20870 -g15 -aI221 -aI-507 -aI229 -aI-591 -aI223 -aI-551 -aa(lp20871 -g20 -aI229 -aI-507 -aa(lp20872 -g15 -aI260 -aI-551 -aI237 -aI-522 -aI248 -aI-537 -aa(lp20873 -g15 -aI304 -aI-586 -aI273 -aI-564 -aI287 -aI-576 -aa(lp20874 -g15 -aI359 -aI-609 -aI320 -aI-596 -aI339 -aI-603 -aa(lp20875 -g15 -aI429 -aI-618 -aI380 -aI-615 -aI403 -aI-618 -aa(lp20876 -g15 -aI540 -aI-597 -aI470 -aI-618 -aI507 -aI-611 -aa(lp20877 -g15 -aI624 -aI-539 -aI573 -aI-584 -aI601 -aI-564 -aa(lp20878 -g15 -aI676 -aI-444 -aI646 -aI-513 -aI664 -aI-482 -aa(lp20879 -g15 -aI694 -aI-316 -aI688 -aI-407 -aI694 -aI-364 -aa(lp20880 -g15 -aI672 -aI-177 -aI694 -aI-264 -aI687 -aI-218 -aa(lp20881 -g15 -aI610 -aI-74 -aI658 -aI-137 -aI637 -aI-102 -aa(lp20882 -g15 -aI513 -aI-8 -aI583 -aI-45 -aI551 -aI-23 -aa(lp20883 -g15 -aI384 -aI13 -aI474 -aI5 -aI431 -aI13 -aa(lp20884 -g15 -aI252 -aI-11 -aI337 -aI13 -aI293 -aI5 -aa(lp20885 -g15 -aI146 -aI-88 -aI211 -aI-28 -aI176 -aI-53 -aa(lp20886 -g15 -aI75 -aI-217 -aI115 -aI-122 -aI92 -aI-165 -aa(lp20887 -g15 -aI49 -aI-403 -aI58 -aI-270 -aI49 -aI-332 -aa(lp20888 -g10 -aa(lp20889 -g8 -aI380 -aI-147 -aa(lp20890 -g15 -aI428 -aI-157 -aI398 -aI-147 -aI414 -aI-150 -aa(lp20891 -g15 -aI466 -aI-188 -aI443 -aI-164 -aI455 -aI-174 -aa(lp20892 -g15 -aI491 -aI-239 -aI477 -aI-201 -aI485 -aI-218 -aa(lp20893 -g15 -aI500 -aI-314 -aI497 -aI-260 -aI500 -aI-285 -aa(lp20894 -g15 -aI471 -aI-423 -aI500 -aI-360 -aI490 -aI-397 -aa(lp20895 -g15 -aI382 -aI-463 -aI451 -aI-450 -aI422 -aI-463 -aa(lp20896 -g15 -aI328 -aI-452 -aI362 -aI-463 -aI344 -aI-459 -aa(lp20897 -g15 -aI285 -aI-421 -aI311 -aI-444 -aI297 -aI-434 -aa(lp20898 -g15 -aI258 -aI-379 -aI274 -aI-408 -aI265 -aI-394 -aa(lp20899 -g15 -aI249 -aI-331 -aI252 -aI-363 -aI249 -aI-347 -aa(lp20900 -g15 -aI257 -aI-265 -aI249 -aI-309 -aI252 -aI-287 -aa(lp20901 -g15 -aI282 -aI-206 -aI262 -aI-243 -aI271 -aI-223 -aa(lp20902 -g15 -aI323 -aI-163 -aI293 -aI-188 -aI306 -aI-174 -aa(lp20903 -g15 -aI380 -aI-147 -aI339 -aI-152 -aI358 -aI-147 -aa(lp20904 -g10 -aa(lp20905 -g8 -aI734 -aI0 -aa(lp20906 -g10 -aa(lp20907 -g8 -aI734 -aI0 -aasV: -(lp20908 -(lp20909 -g8 -aI76 -aI-92 -aa(lp20910 -g15 -aI84 -aI-144 -aI76 -aI-113 -aI79 -aI-130 -aa(lp20911 -g15 -aI109 -aI-178 -aI90 -aI-158 -aI98 -aI-169 -aa(lp20912 -g15 -aI145 -aI-197 -aI119 -aI-187 -aI131 -aI-193 -aa(lp20913 -g15 -aI190 -aI-203 -aI159 -aI-201 -aI174 -aI-203 -aa(lp20914 -g15 -aI234 -aI-197 -aI205 -aI-203 -aI220 -aI-201 -aa(lp20915 -g15 -aI270 -aI-178 -aI247 -aI-193 -aI259 -aI-187 -aa(lp20916 -g15 -aI294 -aI-144 -aI280 -aI-169 -aI288 -aI-158 -aa(lp20917 -g15 -aI304 -aI-92 -aI300 -aI-130 -aI304 -aI-113 -aa(lp20918 -g15 -aI294 -aI-42 -aI304 -aI-73 -aI300 -aI-56 -aa(lp20919 -g15 -aI270 -aI-8 -aI288 -aI-28 -aI280 -aI-17 -aa(lp20920 -g15 -aI234 -aI11 -aI259 -aI1 -aI247 -aI7 -aa(lp20921 -g15 -aI190 -aI18 -aI220 -aI15 -aI205 -aI18 -aa(lp20922 -g15 -aI145 -aI11 -aI174 -aI18 -aI159 -aI15 -aa(lp20923 -g15 -aI109 -aI-8 -aI131 -aI7 -aI119 -aI1 -aa(lp20924 -g15 -aI84 -aI-42 -aI98 -aI-17 -aI90 -aI-28 -aa(lp20925 -g15 -aI76 -aI-92 -aI79 -aI-56 -aI76 -aI-73 -aa(lp20926 -g10 -aa(lp20927 -g8 -aI76 -aI-630 -aa(lp20928 -g15 -aI84 -aI-682 -aI76 -aI-650 -aI79 -aI-668 -aa(lp20929 -g15 -aI109 -aI-716 -aI90 -aI-696 -aI98 -aI-707 -aa(lp20930 -g15 -aI145 -aI-735 -aI119 -aI-725 -aI131 -aI-731 -aa(lp20931 -g15 -aI190 -aI-741 -aI159 -aI-739 -aI174 -aI-741 -aa(lp20932 -g15 -aI234 -aI-735 -aI205 -aI-741 -aI220 -aI-739 -aa(lp20933 -g15 -aI270 -aI-716 -aI247 -aI-731 -aI259 -aI-725 -aa(lp20934 -g15 -aI294 -aI-682 -aI280 -aI-707 -aI288 -aI-696 -aa(lp20935 -g15 -aI304 -aI-630 -aI300 -aI-668 -aI304 -aI-650 -aa(lp20936 -g15 -aI294 -aI-579 -aI304 -aI-610 -aI300 -aI-594 -aa(lp20937 -g15 -aI270 -aI-545 -aI288 -aI-565 -aI280 -aI-554 -aa(lp20938 -g15 -aI234 -aI-525 -aI259 -aI-536 -aI247 -aI-530 -aa(lp20939 -g15 -aI190 -aI-519 -aI220 -aI-521 -aI205 -aI-519 -aa(lp20940 -g15 -aI145 -aI-525 -aI174 -aI-519 -aI159 -aI-521 -aa(lp20941 -g15 -aI109 -aI-545 -aI131 -aI-530 -aI119 -aI-536 -aa(lp20942 -g15 -aI84 -aI-579 -aI98 -aI-554 -aI90 -aI-565 -aa(lp20943 -g15 -aI76 -aI-630 -aI79 -aI-594 -aI76 -aI-610 -aa(lp20944 -g10 -aa(lp20945 -g8 -aI380 -aI0 -aa(lp20946 -g10 -aa(lp20947 -g8 -aI380 -aI0 -aasV> -(lp20948 -(lp20949 -g8 -aI57 -aI-287 -aa(lp20950 -g20 -aI475 -aI-470 -aa(lp20951 -g20 -aI57 -aI-676 -aa(lp20952 -g20 -aI57 -aI-832 -aa(lp20953 -g20 -aI677 -aI-509 -aa(lp20954 -g20 -aI677 -aI-416 -aa(lp20955 -g20 -aI57 -aI-131 -aa(lp20956 -g10 -aa(lp20957 -g8 -aI734 -aI0 -aa(lp20958 -g10 -aa(lp20959 -g8 -aI734 -aI0 -aasVB -(lp20960 -(lp20961 -g8 -aI119 -aI-951 -aa(lp20962 -g20 -aI398 -aI-951 -aa(lp20963 -g15 -aI555 -aI-938 -aI458 -aI-951 -aI510 -aI-947 -aa(lp20964 -g15 -aI669 -aI-897 -aI601 -aI-930 -aI638 -aI-916 -aa(lp20965 -g15 -aI737 -aI-823 -aI699 -aI-878 -aI722 -aI-854 -aa(lp20966 -g15 -aI761 -aI-710 -aI753 -aI-792 -aI761 -aI-755 -aa(lp20967 -g15 -aI751 -aI-634 -aI761 -aI-683 -aI757 -aI-658 -aa(lp20968 -g15 -aI722 -aI-573 -aI744 -aI-611 -aI735 -aI-590 -aa(lp20969 -g15 -aI676 -aI-528 -aI710 -aI-555 -aI694 -aI-540 -aa(lp20970 -g15 -aI614 -aI-504 -aI658 -aI-516 -aI638 -aI-508 -aa(lp20971 -g20 -aI614 -aI-498 -aa(lp20972 -g15 -aI681 -aI-475 -aI638 -aI-493 -aI660 -aI-485 -aa(lp20973 -g15 -aI735 -aI-435 -aI701 -aI-466 -aI719 -aI-452 -aa(lp20974 -g15 -aI771 -aI-370 -aI750 -aI-418 -aI762 -aI-396 -aa(lp20975 -g15 -aI785 -aI-275 -aI780 -aI-344 -aI785 -aI-312 -aa(lp20976 -g15 -aI762 -aI-159 -aI785 -aI-232 -aI777 -aI-193 -aa(lp20977 -g15 -aI696 -aI-72 -aI747 -aI-125 -aI725 -aI-96 -aa(lp20978 -g15 -aI593 -aI-18 -aI668 -aI-49 -aI634 -aI-31 -aa(lp20979 -g15 -aI455 -aI0 -aI552 -aI-5 -aI506 -aI0 -aa(lp20980 -g20 -aI119 -aI0 -aa(lp20981 -g10 -aa(lp20982 -g8 -aI321 -aI-574 -aa(lp20983 -g20 -aI426 -aI-574 -aa(lp20984 -g15 -aI489 -aI-581 -aI451 -aI-574 -aI472 -aI-576 -aa(lp20985 -g15 -aI530 -aI-601 -aI506 -aI-585 -aI520 -aI-592 -aa(lp20986 -g15 -aI553 -aI-635 -aI541 -aI-610 -aI548 -aI-622 -aa(lp20987 -g15 -aI559 -aI-683 -aI557 -aI-649 -aI559 -aI-665 -aa(lp20988 -g15 -aI525 -aI-762 -aI559 -aI-720 -aI548 -aI-746 -aa(lp20989 -g15 -aI417 -aI-786 -aI502 -aI-778 -aI466 -aI-786 -aa(lp20990 -g20 -aI321 -aI-786 -aa(lp20991 -g10 -aa(lp20992 -g8 -aI321 -aI-414 -aa(lp20993 -g20 -aI321 -aI-166 -aa(lp20994 -g20 -aI440 -aI-166 -aa(lp20995 -g15 -aI506 -aI-175 -aI466 -aI-166 -aI488 -aI-169 -aa(lp20996 -g15 -aI550 -aI-201 -aI524 -aI-181 -aI539 -aI-190 -aa(lp20997 -g15 -aI574 -aI-242 -aI561 -aI-212 -aI569 -aI-226 -aa(lp20998 -g15 -aI581 -aI-295 -aI578 -aI-258 -aI581 -aI-276 -aa(lp20999 -g15 -aI574 -aI-344 -aI581 -aI-313 -aI578 -aI-329 -aa(lp21000 -g15 -aI549 -aI-381 -aI569 -aI-358 -aI561 -aI-371 -aa(lp21001 -g15 -aI504 -aI-405 -aI538 -aI-392 -aI523 -aI-400 -aa(lp21002 -g15 -aI434 -aI-414 -aI485 -aI-411 -aI462 -aI-414 -aa(lp21003 -g10 -aa(lp21004 -g8 -aI856 -aI0 -aa(lp21005 -g10 -aa(lp21006 -g8 -aI856 -aI0 -aasVF -(lp21007 -(lp21008 -g8 -aI318 -aI0 -aa(lp21009 -g20 -aI119 -aI0 -aa(lp21010 -g20 -aI119 -aI-951 -aa(lp21011 -g20 -aI665 -aI-951 -aa(lp21012 -g20 -aI665 -aI-786 -aa(lp21013 -g20 -aI318 -aI-786 -aa(lp21014 -g20 -aI318 -aI-540 -aa(lp21015 -g20 -aI641 -aI-540 -aa(lp21016 -g20 -aI641 -aI-375 -aa(lp21017 -g20 -aI318 -aI-375 -aa(lp21018 -g10 -aa(lp21019 -g8 -aI731 -aI0 -aa(lp21020 -g10 -aa(lp21021 -g8 -aI731 -aI0 -aasVJ -(lp21022 -(lp21023 -g8 -aI-1 -aI280 -aa(lp21024 -g15 -aI-75 -aI276 -aI-29 -aI280 -aI-54 -aI278 -aa(lp21025 -g15 -aI-129 -aI266 -aI-96 -aI273 -aI-114 -aI269 -aa(lp21026 -g20 -aI-129 -aI98 -aa(lp21027 -g15 -aI-79 -aI107 -aI-113 -aI101 -aI-96 -aI104 -aa(lp21028 -g15 -aI-21 -aI111 -aI-61 -aI109 -aI-42 -aI111 -aa(lp21029 -g15 -aI34 -aI104 -aI-1 -aI111 -aI17 -aI108 -aa(lp21030 -g15 -aI79 -aI82 -aI51 -aI100 -aI66 -aI92 -aa(lp21031 -g15 -aI109 -aI39 -aI91 -aI71 -aI101 -aI57 -aa(lp21032 -g15 -aI119 -aI-27 -aI116 -aI21 -aI119 -aI0 -aa(lp21033 -g20 -aI119 -aI-951 -aa(lp21034 -g20 -aI321 -aI-951 -aa(lp21035 -g20 -aI321 -aI-34 -aa(lp21036 -g15 -aI297 -aI107 -aI321 -aI20 -aI313 -aI67 -aa(lp21037 -g15 -aI231 -aI205 -aI282 -aI146 -aI259 -aI179 -aa(lp21038 -g15 -aI129 -aI262 -aI203 -aI231 -aI169 -aI250 -aa(lp21039 -g15 -aI-1 -aI280 -aI90 -aI274 -aI46 -aI280 -aa(lp21040 -g10 -aa(lp21041 -g8 -aI441 -aI0 -aa(lp21042 -g10 -aa(lp21043 -g8 -aI441 -aI0 -aasVN -(lp21044 -(lp21045 -g8 -aI923 -aI0 -aa(lp21046 -g20 -aI667 -aI0 -aa(lp21047 -g20 -aI293 -aI-719 -aa(lp21048 -g20 -aI287 -aI-719 -aa(lp21049 -g15 -aI294 -aI-619 -aI290 -aI-686 -aI292 -aI-652 -aa(lp21050 -g15 -aI298 -aI-531 -aI296 -aI-591 -aI297 -aI-562 -aa(lp21051 -g15 -aI300 -aI-447 -aI299 -aI-500 -aI300 -aI-472 -aa(lp21052 -g20 -aI300 -aI0 -aa(lp21053 -g20 -aI119 -aI0 -aa(lp21054 -g20 -aI119 -aI-951 -aa(lp21055 -g20 -aI374 -aI-951 -aa(lp21056 -g20 -aI748 -aI-238 -aa(lp21057 -g20 -aI751 -aI-238 -aa(lp21058 -g15 -aI747 -aI-336 -aI750 -aI-271 -aI749 -aI-304 -aa(lp21059 -g15 -aI745 -aI-378 -aI746 -aI-350 -aI746 -aI-364 -aa(lp21060 -g15 -aI744 -aI-422 -aI745 -aI-393 -aI744 -aI-407 -aa(lp21061 -g15 -aI743 -aI-464 -aI743 -aI-436 -aI743 -aI-450 -aa(lp21062 -g15 -aI742 -aI-500 -aI742 -aI-477 -aI742 -aI-489 -aa(lp21063 -g20 -aI742 -aI-951 -aa(lp21064 -g20 -aI923 -aI-951 -aa(lp21065 -g10 -aa(lp21066 -g8 -aI1044 -aI0 -aa(lp21067 -g10 -aa(lp21068 -g8 -aI1044 -aI0 -aasVR -(lp21069 -(lp21070 -g8 -aI321 -aI-528 -aa(lp21071 -g20 -aI376 -aI-528 -aa(lp21072 -g15 -aI496 -aI-562 -aI432 -aI-528 -aI472 -aI-540 -aa(lp21073 -g15 -aI533 -aI-661 -aI521 -aI-584 -aI533 -aI-617 -aa(lp21074 -g15 -aI494 -aI-757 -aI533 -aI-706 -aI520 -aI-738 -aa(lp21075 -g15 -aI373 -aI-786 -aI468 -aI-776 -aI427 -aI-786 -aa(lp21076 -g20 -aI321 -aI-786 -aa(lp21077 -g10 -aa(lp21078 -g8 -aI321 -aI-364 -aa(lp21079 -g20 -aI321 -aI0 -aa(lp21080 -g20 -aI119 -aI0 -aa(lp21081 -g20 -aI119 -aI-951 -aa(lp21082 -g20 -aI380 -aI-951 -aa(lp21083 -g15 -aI650 -aI-880 -aI502 -aI-951 -aI592 -aI-927 -aa(lp21084 -g15 -aI737 -aI-666 -aI708 -aI-833 -aI737 -aI-762 -aa(lp21085 -g15 -aI724 -aI-577 -aI737 -aI-633 -aI733 -aI-604 -aa(lp21086 -g15 -aI689 -aI-507 -aI715 -aI-551 -aI704 -aI-527 -aa(lp21087 -g15 -aI639 -aI-452 -aI675 -aI-486 -aI658 -aI-468 -aa(lp21088 -g15 -aI580 -aI-414 -aI620 -aI-437 -aI600 -aI-424 -aa(lp21089 -g15 -aI709 -aI-207 -aI628 -aI-337 -aI671 -aI-267 -aa(lp21090 -g15 -aI757 -aI-131 -aI726 -aI-181 -aI742 -aI-155 -aa(lp21091 -g15 -aI798 -aI-64 -aI772 -aI-106 -aI786 -aI-84 -aa(lp21092 -g15 -aI828 -aI-17 -aI810 -aI-45 -aI820 -aI-29 -aa(lp21093 -g20 -aI839 -aI0 -aa(lp21094 -g20 -aI615 -aI0 -aa(lp21095 -g20 -aI409 -aI-364 -aa(lp21096 -g10 -aa(lp21097 -g8 -aI839 -aI0 -aa(lp21098 -g10 -aa(lp21099 -g8 -aI839 -aI0 -aasVV -(lp21100 -(lp21101 -g8 -aI609 -aI-951 -aa(lp21102 -g20 -aI813 -aI-951 -aa(lp21103 -g20 -aI516 -aI0 -aa(lp21104 -g20 -aI296 -aI0 -aa(lp21105 -g20 -aI0 -aI-951 -aa(lp21106 -g20 -aI203 -aI-951 -aa(lp21107 -g20 -aI365 -aI-378 -aa(lp21108 -g15 -aI374 -aI-341 -aI367 -aI-371 -aI370 -aI-358 -aa(lp21109 -g15 -aI385 -aI-284 -aI377 -aI-323 -aI381 -aI-304 -aa(lp21110 -g15 -aI397 -aI-221 -aI389 -aI-263 -aI393 -aI-242 -aa(lp21111 -g15 -aI406 -aI-168 -aI401 -aI-200 -aI404 -aI-183 -aa(lp21112 -g15 -aI416 -aI-221 -aI409 -aI-183 -aI412 -aI-200 -aa(lp21113 -g15 -aI428 -aI-283 -aI419 -aI-242 -aI424 -aI-263 -aa(lp21114 -g15 -aI441 -aI-340 -aI432 -aI-304 -aI436 -aI-323 -aa(lp21115 -g15 -aI450 -aI-378 -aI445 -aI-358 -aI448 -aI-370 -aa(lp21116 -g10 -aa(lp21117 -g8 -aI813 -aI0 -aa(lp21118 -g10 -aa(lp21119 -g8 -aI813 -aI0 -aasVZ -(lp21120 -(lp21121 -g8 -aI686 -aI0 -aa(lp21122 -g20 -aI31 -aI0 -aa(lp21123 -g20 -aI31 -aI-130 -aa(lp21124 -g20 -aI434 -aI-784 -aa(lp21125 -g20 -aI44 -aI-784 -aa(lp21126 -g20 -aI44 -aI-951 -aa(lp21127 -g20 -aI674 -aI-951 -aa(lp21128 -g20 -aI674 -aI-821 -aa(lp21129 -g20 -aI272 -aI-166 -aa(lp21130 -g20 -aI686 -aI-166 -aa(lp21131 -g10 -aa(lp21132 -g8 -aI718 -aI0 -aa(lp21133 -g10 -aa(lp21134 -g8 -aI718 -aI0 -aasV^ -(lp21135 -(lp21136 -g8 -aI5 -aI-338 -aa(lp21137 -g20 -aI290 -aI-956 -aa(lp21138 -g20 -aI384 -aI-956 -aa(lp21139 -g20 -aI706 -aI-338 -aa(lp21140 -g20 -aI550 -aI-338 -aa(lp21141 -g20 -aI341 -aI-756 -aa(lp21142 -g15 -aI249 -aI-545 -aI311 -aI-686 -aI280 -aI-616 -aa(lp21143 -g15 -aI158 -aI-338 -aI218 -aI-475 -aI188 -aI-405 -aa(lp21144 -g10 -aa(lp21145 -g8 -aI709 -aI0 -aa(lp21146 -g10 -aa(lp21147 -g8 -aI709 -aI0 -aasVb -(lp21148 -(lp21149 -g8 -aI492 -aI-741 -aa(lp21150 -g15 -aI594 -aI-716 -aI529 -aI-741 -aI563 -aI-733 -aa(lp21151 -g15 -aI673 -aI-645 -aI625 -aI-700 -aI651 -aI-677 -aa(lp21152 -g15 -aI725 -aI-527 -aI695 -aI-613 -aI713 -aI-574 -aa(lp21153 -g15 -aI744 -aI-364 -aI737 -aI-480 -aI744 -aI-426 -aa(lp21154 -g15 -aI725 -aI-200 -aI744 -aI-302 -aI737 -aI-247 -aa(lp21155 -g15 -aI673 -aI-82 -aI713 -aI-153 -aI695 -aI-113 -aa(lp21156 -g15 -aI591 -aI-10 -aI650 -aI-50 -aI623 -aI-26 -aa(lp21157 -g15 -aI486 -aI13 -aI560 -aI5 -aI525 -aI13 -aa(lp21158 -g15 -aI422 -aI5 -aI462 -aI13 -aI441 -aI10 -aa(lp21159 -g15 -aI371 -aI-15 -aI403 -aI0 -aI386 -aI-6 -aa(lp21160 -g15 -aI333 -aI-44 -aI356 -aI-23 -aI344 -aI-33 -aa(lp21161 -g15 -aI302 -aI-79 -aI321 -aI-55 -aI311 -aI-67 -aa(lp21162 -g20 -aI289 -aI-79 -aa(lp21163 -g20 -aI255 -aI0 -aa(lp21164 -g20 -aI104 -aI0 -aa(lp21165 -g20 -aI104 -aI-1012 -aa(lp21166 -g20 -aI302 -aI-1012 -aa(lp21167 -g20 -aI302 -aI-776 -aa(lp21168 -g15 -aI301 -aI-730 -aI302 -aI-762 -aI302 -aI-747 -aa(lp21169 -g15 -aI298 -aI-683 -aI300 -aI-713 -aI299 -aI-698 -aa(lp21170 -g15 -aI294 -aI-633 -aI297 -aI-666 -aI296 -aI-649 -aa(lp21171 -g20 -aI302 -aI-633 -aa(lp21172 -g15 -aI333 -aI-675 -aI311 -aI-648 -aI322 -aI-662 -aa(lp21173 -g15 -aI374 -aI-709 -aI345 -aI-688 -aI359 -aI-699 -aa(lp21174 -g15 -aI427 -aI-732 -aI390 -aI-719 -aI407 -aI-726 -aa(lp21175 -g15 -aI492 -aI-741 -aI446 -aI-738 -aI468 -aI-741 -aa(lp21176 -g10 -aa(lp21177 -g8 -aI425 -aI-582 -aa(lp21178 -g15 -aI368 -aI-570 -aI402 -aI-582 -aI384 -aI-578 -aa(lp21179 -g15 -aI331 -aI-534 -aI353 -aI-562 -aI340 -aI-550 -aa(lp21180 -g15 -aI310 -aI-473 -aI321 -aI-517 -aI314 -aI-497 -aa(lp21181 -g15 -aI302 -aI-387 -aI306 -aI-448 -aI303 -aI-420 -aa(lp21182 -g20 -aI302 -aI-366 -aa(lp21183 -g15 -aI308 -aI-272 -aI302 -aI-330 -aI304 -aI-299 -aa(lp21184 -g15 -aI329 -aI-203 -aI313 -aI-244 -aI319 -aI-222 -aa(lp21185 -g15 -aI367 -aI-161 -aI338 -aI-185 -aI351 -aI-171 -aa(lp21186 -g15 -aI426 -aI-147 -aI383 -aI-152 -aI402 -aI-147 -aa(lp21187 -g15 -aI513 -aI-203 -aI465 -aI-147 -aI494 -aI-166 -aa(lp21188 -g15 -aI541 -aI-367 -aI531 -aI-241 -aI541 -aI-295 -aa(lp21189 -g15 -aI513 -aI-528 -aI541 -aI-439 -aI531 -aI-492 -aa(lp21190 -g15 -aI425 -aI-582 -aI494 -aI-564 -aI465 -aI-582 -aa(lp21191 -g10 -aa(lp21192 -g8 -aI810 -aI0 -aa(lp21193 -g10 -aa(lp21194 -g8 -aI810 -aI0 -aasVf -(lp21195 -(lp21196 -g8 -aI482 -aI-578 -aa(lp21197 -g20 -aI334 -aI-578 -aa(lp21198 -g20 -aI334 -aI0 -aa(lp21199 -g20 -aI136 -aI0 -aa(lp21200 -g20 -aI136 -aI-578 -aa(lp21201 -g20 -aI26 -aI-578 -aa(lp21202 -g20 -aI26 -aI-674 -aa(lp21203 -g20 -aI136 -aI-727 -aa(lp21204 -g20 -aI136 -aI-780 -aa(lp21205 -g15 -aI152 -aI-896 -aI136 -aI-827 -aI141 -aI-865 -aa(lp21206 -g15 -aI201 -aI-969 -aI164 -aI-926 -aI180 -aI-951 -aa(lp21207 -g15 -aI276 -aI-1008 -aI222 -aI-987 -aI247 -aI-1000 -aa(lp21208 -g15 -aI376 -aI-1019 -aI306 -aI-1015 -aI339 -aI-1019 -aa(lp21209 -g15 -aI477 -aI-1010 -aI416 -aI-1019 -aI449 -aI-1016 -aa(lp21210 -g15 -aI546 -aI-989 -aI504 -aI-1003 -aI527 -aI-996 -aa(lp21211 -g20 -aI500 -aI-843 -aa(lp21212 -g15 -aI457 -aI-856 -aI486 -aI-848 -aI472 -aI-852 -aa(lp21213 -g15 -aI405 -aI-862 -aI442 -aI-860 -aI425 -aI-862 -aa(lp21214 -g15 -aI350 -aI-837 -aI379 -aI-862 -aI361 -aI-853 -aa(lp21215 -g15 -aI334 -aI-772 -aI339 -aI-820 -aI334 -aI-799 -aa(lp21216 -g20 -aI334 -aI-727 -aa(lp21217 -g20 -aI482 -aI-727 -aa(lp21218 -g10 -aa(lp21219 -g8 -aI516 -aI0 -aa(lp21220 -g10 -aa(lp21221 -g8 -aI516 -aI0 -aasVj -(lp21222 -(lp21223 -g8 -aI66 -aI320 -aa(lp21224 -g15 -aI1 -aI316 -aI45 -aI320 -aI24 -aI319 -aa(lp21225 -g15 -aI-53 -aI304 -aI-20 -aI313 -aI-38 -aI309 -aa(lp21226 -g20 -aI-53 -aI148 -aa(lp21227 -g15 -aI-15 -aI157 -aI-39 -aI152 -aI-27 -aI155 -aa(lp21228 -g15 -aI24 -aI160 -aI-3 -aI159 -aI9 -aI160 -aa(lp21229 -g15 -aI55 -aI155 -aI34 -aI160 -aI45 -aI158 -aa(lp21230 -g15 -aI80 -aI138 -aI64 -aI152 -aI73 -aI146 -aa(lp21231 -g15 -aI97 -aI104 -aI87 -aI129 -aI93 -aI118 -aa(lp21232 -g15 -aI104 -aI49 -aI101 -aI90 -aI104 -aI72 -aa(lp21233 -g20 -aI104 -aI-727 -aa(lp21234 -g20 -aI302 -aI-727 -aa(lp21235 -g20 -aI302 -aI79 -aa(lp21236 -g15 -aI290 -aI173 -aI302 -aI112 -aI298 -aI144 -aa(lp21237 -g15 -aI249 -aI250 -aI281 -aI202 -aI267 -aI228 -aa(lp21238 -g15 -aI175 -aI301 -aI230 -aI272 -aI205 -aI289 -aa(lp21239 -g15 -aI66 -aI320 -aI145 -aI314 -aI109 -aI320 -aa(lp21240 -g10 -aa(lp21241 -g8 -aI95 -aI-915 -aa(lp21242 -g15 -aI104 -aI-962 -aI95 -aI-934 -aI98 -aI-949 -aa(lp21243 -g15 -aI127 -aI-992 -aI109 -aI-974 -aI117 -aI-984 -aa(lp21244 -g15 -aI161 -aI-1008 -aI137 -aI-999 -aI148 -aI-1004 -aa(lp21245 -g15 -aI203 -aI-1012 -aI175 -aI-1011 -aI189 -aI-1012 -aa(lp21246 -g15 -aI245 -aI-1008 -aI218 -aI-1012 -aI232 -aI-1011 -aa(lp21247 -g15 -aI279 -aI-992 -aI258 -aI-1004 -aI269 -aI-999 -aa(lp21248 -g15 -aI303 -aI-962 -aI289 -aI-984 -aI297 -aI-974 -aa(lp21249 -g15 -aI311 -aI-915 -aI308 -aI-949 -aI311 -aI-934 -aa(lp21250 -g15 -aI303 -aI-869 -aI311 -aI-897 -aI308 -aI-881 -aa(lp21251 -g15 -aI279 -aI-839 -aI297 -aI-856 -aI289 -aI-846 -aa(lp21252 -g15 -aI245 -aI-822 -aI269 -aI-831 -aI258 -aI-826 -aa(lp21253 -g15 -aI203 -aI-817 -aI232 -aI-819 -aI218 -aI-817 -aa(lp21254 -g15 -aI161 -aI-822 -aI189 -aI-817 -aI175 -aI-819 -aa(lp21255 -g15 -aI127 -aI-839 -aI148 -aI-826 -aI137 -aI-831 -aa(lp21256 -g15 -aI104 -aI-869 -aI117 -aI-846 -aI109 -aI-856 -aa(lp21257 -g15 -aI95 -aI-915 -aI98 -aI-881 -aI95 -aI-897 -aa(lp21258 -g10 -aa(lp21259 -g8 -aI406 -aI0 -aa(lp21260 -g10 -aa(lp21261 -g8 -aI406 -aI0 -aasVn -(lp21262 -(lp21263 -g8 -aI735 -aI0 -aa(lp21264 -g20 -aI537 -aI0 -aa(lp21265 -g20 -aI537 -aI-424 -aa(lp21266 -g15 -aI513 -aI-542 -aI537 -aI-477 -aI529 -aI-516 -aa(lp21267 -g15 -aI437 -aI-582 -aI497 -aI-569 -aI472 -aI-582 -aa(lp21268 -g15 -aI372 -aI-566 -aI411 -aI-582 -aI389 -aI-577 -aa(lp21269 -g15 -aI331 -aI-520 -aI355 -aI-556 -aI341 -aI-540 -aa(lp21270 -g15 -aI309 -aI-444 -aI320 -aI-499 -aI313 -aI-474 -aa(lp21271 -g15 -aI302 -aI-341 -aI304 -aI-414 -aI302 -aI-380 -aa(lp21272 -g20 -aI302 -aI0 -aa(lp21273 -g20 -aI104 -aI0 -aa(lp21274 -g20 -aI104 -aI-727 -aa(lp21275 -g20 -aI255 -aI-727 -aa(lp21276 -g20 -aI282 -aI-634 -aa(lp21277 -g20 -aI293 -aI-634 -aa(lp21278 -g15 -aI331 -aI-682 -aI304 -aI-652 -aI316 -aI-669 -aa(lp21279 -g15 -aI380 -aI-715 -aI346 -aI-695 -aI363 -aI-707 -aa(lp21280 -g15 -aI437 -aI-734 -aI398 -aI-724 -aI417 -aI-730 -aa(lp21281 -g15 -aI498 -aI-741 -aI457 -aI-739 -aI477 -aI-741 -aa(lp21282 -g15 -aI595 -aI-725 -aI534 -aI-741 -aI566 -aI-735 -aa(lp21283 -g15 -aI670 -aI-677 -aI624 -aI-715 -aI649 -aI-699 -aa(lp21284 -g15 -aI718 -aI-594 -aI691 -aI-656 -aI707 -aI-628 -aa(lp21285 -g15 -aI735 -aI-474 -aI730 -aI-561 -aI735 -aI-521 -aa(lp21286 -g10 -aa(lp21287 -g8 -aI835 -aI0 -aa(lp21288 -g10 -aa(lp21289 -g8 -aI835 -aI0 -aasVr -(lp21290 -(lp21291 -g8 -aI483 -aI-741 -aa(lp21292 -g15 -aI500 -aI-740 -aI488 -aI-741 -aI494 -aI-740 -aa(lp21293 -g15 -aI519 -aI-739 -aI507 -aI-740 -aI513 -aI-740 -aa(lp21294 -g15 -aI535 -aI-737 -aI525 -aI-738 -aI530 -aI-738 -aa(lp21295 -g15 -aI546 -aI-735 -aI540 -aI-736 -aI544 -aI-736 -aa(lp21296 -g20 -aI546 -aI-549 -aa(lp21297 -g15 -aI532 -aI-551 -aI543 -aI-549 -aI538 -aI-550 -aa(lp21298 -g15 -aI513 -aI-553 -aI526 -aI-552 -aI520 -aI-553 -aa(lp21299 -g15 -aI493 -aI-555 -aI506 -aI-554 -aI500 -aI-554 -aa(lp21300 -g15 -aI477 -aI-555 -aI486 -aI-555 -aI481 -aI-555 -aa(lp21301 -g15 -aI406 -aI-545 -aI451 -aI-555 -aI428 -aI-552 -aa(lp21302 -g15 -aI351 -aI-514 -aI385 -aI-539 -aI366 -aI-528 -aa(lp21303 -g15 -aI315 -aI-456 -aI335 -aI-499 -aI323 -aI-480 -aa(lp21304 -g15 -aI302 -aI-369 -aI306 -aI-433 -aI302 -aI-404 -aa(lp21305 -g20 -aI302 -aI0 -aa(lp21306 -g20 -aI104 -aI0 -aa(lp21307 -g20 -aI104 -aI-727 -aa(lp21308 -g20 -aI254 -aI-727 -aa(lp21309 -g20 -aI283 -aI-618 -aa(lp21310 -g20 -aI293 -aI-618 -aa(lp21311 -g15 -aI327 -aI-668 -aI304 -aI-636 -aI315 -aI-653 -aa(lp21312 -g15 -aI368 -aI-707 -aI339 -aI-684 -aI353 -aI-696 -aa(lp21313 -g15 -aI418 -aI-732 -aI383 -aI-718 -aI400 -aI-726 -aa(lp21314 -g15 -aI483 -aI-741 -aI437 -aI-738 -aI459 -aI-741 -aa(lp21315 -g10 -aa(lp21316 -g8 -aI578 -aI0 -aa(lp21317 -g10 -aa(lp21318 -g8 -aI578 -aI0 -aasVv -(lp21319 -(lp21320 -g8 -aI257 -aI0 -aa(lp21321 -g20 -aI0 -aI-727 -aa(lp21322 -g20 -aI207 -aI-727 -aa(lp21323 -g20 -aI328 -aI-312 -aa(lp21324 -g15 -aI347 -aI-235 -aI335 -aI-287 -aI341 -aI-262 -aa(lp21325 -g15 -aI357 -aI-163 -aI352 -aI-208 -aI356 -aI-184 -aa(lp21326 -g20 -aI361 -aI-163 -aa(lp21327 -g15 -aI371 -aI-236 -aI362 -aI-186 -aI365 -aI-211 -aa(lp21328 -g15 -aI390 -aI-312 -aI376 -aI-262 -aI383 -aI-287 -aa(lp21329 -g20 -aI510 -aI-727 -aa(lp21330 -g20 -aI718 -aI-727 -aa(lp21331 -g20 -aI461 -aI0 -aa(lp21332 -g10 -aa(lp21333 -g8 -aI718 -aI0 -aa(lp21334 -g10 -aa(lp21335 -g8 -aI718 -aI0 -aasVz -(lp21336 -(lp21337 -g8 -aI570 -aI0 -aa(lp21338 -g20 -aI35 -aI0 -aa(lp21339 -g20 -aI35 -aI-116 -aa(lp21340 -g20 -aI333 -aI-575 -aa(lp21341 -g20 -aI55 -aI-575 -aa(lp21342 -g20 -aI55 -aI-727 -aa(lp21343 -g20 -aI558 -aI-727 -aa(lp21344 -g20 -aI558 -aI-598 -aa(lp21345 -g20 -aI270 -aI-151 -aa(lp21346 -g20 -aI570 -aI-151 -aa(lp21347 -g10 -aa(lp21348 -g8 -aI609 -aI0 -aa(lp21349 -g10 -aa(lp21350 -g8 -aI609 -aI0 -aasV~ -(lp21351 -(lp21352 -g8 -aI343 -aI-400 -aa(lp21353 -g15 -aI301 -aI-418 -aI327 -aI-407 -aI313 -aI-413 -aa(lp21354 -g15 -aI267 -aI-429 -aI288 -aI-422 -aI277 -aI-426 -aa(lp21355 -g15 -aI238 -aI-435 -aI257 -aI-432 -aI247 -aI-434 -aa(lp21356 -g15 -aI209 -aI-437 -aI229 -aI-436 -aI219 -aI-437 -aa(lp21357 -g15 -aI170 -aI-430 -aI197 -aI-437 -aI184 -aI-434 -aa(lp21358 -g15 -aI130 -aI-413 -aI157 -aI-426 -aI143 -aI-421 -aa(lp21359 -g15 -aI92 -aI-388 -aI117 -aI-406 -aI105 -aI-398 -aa(lp21360 -g15 -aI57 -aI-358 -aI80 -aI-379 -aI68 -aI-369 -aa(lp21361 -g20 -aI57 -aI-508 -aa(lp21362 -g15 -aI131 -aI-561 -aI79 -aI-532 -aI104 -aI-549 -aa(lp21363 -g15 -aI223 -aI-579 -aI159 -aI-573 -aI190 -aI-579 -aa(lp21364 -g15 -aI260 -aI-577 -aI236 -aI-579 -aI249 -aI-579 -aa(lp21365 -g15 -aI295 -aI-571 -aI271 -aI-576 -aI282 -aI-574 -aa(lp21366 -g15 -aI336 -aI-559 -aI307 -aI-568 -aI321 -aI-564 -aa(lp21367 -g15 -aI390 -aI-537 -aI351 -aI-553 -aI369 -aI-546 -aa(lp21368 -g15 -aI433 -aI-520 -aI407 -aI-531 -aI421 -aI-525 -aa(lp21369 -g15 -aI468 -aI-509 -aI446 -aI-516 -aI457 -aI-512 -aa(lp21370 -g15 -aI497 -aI-503 -aI478 -aI-506 -aI488 -aI-504 -aa(lp21371 -g15 -aI525 -aI-502 -aI506 -aI-502 -aI515 -aI-502 -aa(lp21372 -g15 -aI564 -aI-508 -aI537 -aI-502 -aI550 -aI-504 -aa(lp21373 -g15 -aI604 -aI-524 -aI577 -aI-512 -aI591 -aI-517 -aa(lp21374 -g15 -aI642 -aI-550 -aI617 -aI-531 -aI629 -aI-540 -aa(lp21375 -g15 -aI677 -aI-580 -aI654 -aI-559 -aI666 -aI-570 -aa(lp21376 -g20 -aI677 -aI-430 -aa(lp21377 -g15 -aI510 -aI-359 -aI633 -aI-383 -aI577 -aI-359 -aa(lp21378 -g15 -aI474 -aI-361 -aI497 -aI-359 -aI485 -aI-360 -aa(lp21379 -g15 -aI439 -aI-367 -aI463 -aI-362 -aI451 -aI-364 -aa(lp21380 -g15 -aI397 -aI-379 -aI426 -aI-369 -aI412 -aI-374 -aa(lp21381 -g15 -aI343 -aI-400 -aI382 -aI-384 -aI364 -aI-391 -aa(lp21382 -g10 -aa(lp21383 -g8 -aI734 -aI0 -aa(lp21384 -g10 -aa(lp21385 -g8 -aI734 -aI0 -aasV! -(lp21386 -(lp21387 -g8 -aI270 -aI-315 -aa(lp21388 -g20 -aI111 -aI-315 -aa(lp21389 -g20 -aI78 -aI-951 -aa(lp21390 -g20 -aI304 -aI-951 -aa(lp21391 -g10 -aa(lp21392 -g8 -aI76 -aI-92 -aa(lp21393 -g15 -aI84 -aI-144 -aI76 -aI-113 -aI79 -aI-130 -aa(lp21394 -g15 -aI109 -aI-178 -aI90 -aI-158 -aI98 -aI-169 -aa(lp21395 -g15 -aI145 -aI-197 -aI119 -aI-187 -aI131 -aI-193 -aa(lp21396 -g15 -aI190 -aI-203 -aI159 -aI-201 -aI174 -aI-203 -aa(lp21397 -g15 -aI234 -aI-197 -aI205 -aI-203 -aI220 -aI-201 -aa(lp21398 -g15 -aI270 -aI-178 -aI247 -aI-193 -aI259 -aI-187 -aa(lp21399 -g15 -aI294 -aI-144 -aI280 -aI-169 -aI288 -aI-158 -aa(lp21400 -g15 -aI304 -aI-92 -aI300 -aI-130 -aI304 -aI-113 -aa(lp21401 -g15 -aI294 -aI-42 -aI304 -aI-73 -aI300 -aI-56 -aa(lp21402 -g15 -aI270 -aI-8 -aI288 -aI-28 -aI280 -aI-17 -aa(lp21403 -g15 -aI234 -aI11 -aI259 -aI1 -aI247 -aI7 -aa(lp21404 -g15 -aI190 -aI18 -aI220 -aI15 -aI205 -aI18 -aa(lp21405 -g15 -aI145 -aI11 -aI174 -aI18 -aI159 -aI15 -aa(lp21406 -g15 -aI109 -aI-8 -aI131 -aI7 -aI119 -aI1 -aa(lp21407 -g15 -aI84 -aI-42 -aI98 -aI-17 -aI90 -aI-28 -aa(lp21408 -g15 -aI76 -aI-92 -aI79 -aI-56 -aI76 -aI-73 -aa(lp21409 -g10 -aa(lp21410 -g8 -aI381 -aI0 -aa(lp21411 -g10 -aa(lp21412 -g8 -aI381 -aI0 -aasV% -(lp21413 -(lp21414 -g8 -aI205 -aI-666 -aa(lp21415 -g15 -aI219 -aI-542 -aI205 -aI-611 -aI209 -aI-569 -aa(lp21416 -g15 -aI266 -aI-502 -aI229 -aI-515 -aI245 -aI-502 -aa(lp21417 -g15 -aI314 -aI-542 -aI288 -aI-502 -aI303 -aI-515 -aa(lp21418 -g15 -aI329 -aI-666 -aI324 -aI-569 -aI329 -aI-610 -aa(lp21419 -g15 -aI266 -aI-828 -aI329 -aI-774 -aI308 -aI-828 -aa(lp21420 -g15 -aI219 -aI-788 -aI245 -aI-828 -aI229 -aI-815 -aa(lp21421 -g15 -aI205 -aI-666 -aI209 -aI-762 -aI205 -aI-721 -aa(lp21422 -g10 -aa(lp21423 -g8 -aI493 -aI-667 -aa(lp21424 -g15 -aI480 -aI-541 -aI493 -aI-620 -aI489 -aI-578 -aa(lp21425 -g15 -aI438 -aI-446 -aI471 -aI-503 -aI457 -aI-472 -aa(lp21426 -g15 -aI367 -aI-387 -aI420 -aI-421 -aI396 -aI-401 -aa(lp21427 -g15 -aI265 -aI-367 -aI339 -aI-374 -aI305 -aI-367 -aa(lp21428 -g15 -aI168 -aI-387 -aI228 -aI-367 -aI196 -aI-374 -aa(lp21429 -g15 -aI97 -aI-446 -aI140 -aI-401 -aI116 -aI-421 -aa(lp21430 -g15 -aI55 -aI-541 -aI79 -aI-472 -aI64 -aI-503 -aa(lp21431 -g15 -aI41 -aI-667 -aI45 -aI-578 -aI41 -aI-620 -aa(lp21432 -g15 -aI54 -aI-793 -aI41 -aI-714 -aI45 -aI-756 -aa(lp21433 -g15 -aI94 -aI-886 -aI62 -aI-830 -aI76 -aI-861 -aa(lp21434 -g15 -aI164 -aI-944 -aI113 -aI-911 -aI136 -aI-931 -aa(lp21435 -g15 -aI265 -aI-965 -aI192 -aI-958 -aI226 -aI-965 -aa(lp21436 -g15 -aI364 -aI-944 -aI302 -aI-965 -aI335 -aI-958 -aa(lp21437 -g15 -aI435 -aI-886 -aI392 -aI-931 -aI416 -aI-911 -aa(lp21438 -g15 -aI478 -aI-793 -aI454 -aI-861 -aI469 -aI-830 -aa(lp21439 -g15 -aI493 -aI-667 -aI488 -aI-756 -aI493 -aI-714 -aa(lp21440 -g10 -aa(lp21441 -g8 -aI927 -aI-951 -aa(lp21442 -g20 -aI399 -aI0 -aa(lp21443 -g20 -aI244 -aI0 -aa(lp21444 -g20 -aI772 -aI-951 -aa(lp21445 -g10 -aa(lp21446 -g8 -aI845 -aI-286 -aa(lp21447 -g15 -aI859 -aI-162 -aI845 -aI-230 -aI849 -aI-189 -aa(lp21448 -g15 -aI906 -aI-121 -aI869 -aI-135 -aI885 -aI-121 -aa(lp21449 -g15 -aI954 -aI-162 -aI928 -aI-121 -aI943 -aI-135 -aa(lp21450 -g15 -aI969 -aI-286 -aI964 -aI-189 -aI969 -aI-230 -aa(lp21451 -g15 -aI906 -aI-448 -aI969 -aI-394 -aI948 -aI-448 -aa(lp21452 -g15 -aI859 -aI-408 -aI885 -aI-448 -aI869 -aI-435 -aa(lp21453 -g15 -aI845 -aI-286 -aI849 -aI-382 -aI845 -aI-341 -aa(lp21454 -g10 -aa(lp21455 -g8 -aI1133 -aI-287 -aa(lp21456 -g15 -aI1120 -aI-161 -aI1133 -aI-240 -aI1129 -aI-198 -aa(lp21457 -g15 -aI1078 -aI-67 -aI1111 -aI-124 -aI1097 -aI-92 -aa(lp21458 -g15 -aI1007 -aI-8 -aI1060 -aI-41 -aI1036 -aI-22 -aa(lp21459 -g15 -aI905 -aI12 -aI979 -aI5 -aI945 -aI12 -aa(lp21460 -g15 -aI808 -aI-8 -aI868 -aI12 -aI836 -aI5 -aa(lp21461 -g15 -aI738 -aI-67 -aI780 -aI-22 -aI757 -aI-41 -aa(lp21462 -g15 -aI695 -aI-161 -aI719 -aI-92 -aI705 -aI-124 -aa(lp21463 -g15 -aI681 -aI-287 -aI686 -aI-198 -aI681 -aI-240 -aa(lp21464 -g15 -aI694 -aI-412 -aI681 -aI-334 -aI685 -aI-376 -aa(lp21465 -g15 -aI735 -aI-506 -aI703 -aI-449 -aI716 -aI-480 -aa(lp21466 -g15 -aI804 -aI-564 -aI753 -aI-531 -aI776 -aI-551 -aa(lp21467 -g15 -aI905 -aI-584 -aI832 -aI-578 -aI866 -aI-584 -aa(lp21468 -g15 -aI1004 -aI-564 -aI942 -aI-584 -aI975 -aI-578 -aa(lp21469 -g15 -aI1075 -aI-506 -aI1032 -aI-551 -aI1056 -aI-531 -aa(lp21470 -g15 -aI1118 -aI-412 -aI1094 -aI-480 -aI1109 -aI-449 -aa(lp21471 -g15 -aI1133 -aI-287 -aI1128 -aI-376 -aI1133 -aI-334 -aa(lp21472 -g10 -aa(lp21473 -g8 -aI1174 -aI0 -aa(lp21474 -g10 -aa(lp21475 -g8 -aI1174 -aI0 -aasV) -(lp21476 -(lp21477 -g8 -aI398 -aI-364 -aa(lp21478 -g15 -aI386 -aI-205 -aI398 -aI-310 -aI394 -aI-258 -aa(lp21479 -g15 -aI350 -aI-54 -aI378 -aI-153 -aI366 -aI-103 -aa(lp21480 -g15 -aI290 -aI85 -aI334 -aI-5 -aI314 -aI41 -aa(lp21481 -g15 -aI202 -aI211 -aI265 -aI130 -aI236 -aI172 -aa(lp21482 -g20 -aI41 -aI211 -aa(lp21483 -g15 -aI120 -aI81 -aI70 -aI170 -aI97 -aI127 -aa(lp21484 -g15 -aI178 -aI-61 -aI143 -aI35 -aI162 -aI-12 -aa(lp21485 -g15 -aI213 -aI-211 -aI194 -aI-110 -aI205 -aI-160 -aa(lp21486 -g15 -aI225 -aI-366 -aI221 -aI-263 -aI225 -aI-314 -aa(lp21487 -g15 -aI178 -aI-675 -aI225 -aI-471 -aI209 -aI-575 -aa(lp21488 -g15 -aI39 -aI-951 -aI147 -aI-775 -aI100 -aI-867 -aa(lp21489 -g20 -aI202 -aI-951 -aa(lp21490 -g15 -aI290 -aI-822 -aI236 -aI-911 -aI265 -aI-867 -aa(lp21491 -g15 -aI350 -aI-678 -aI314 -aI-776 -aI334 -aI-728 -aa(lp21492 -g15 -aI386 -aI-525 -aI366 -aI-629 -aI378 -aI-577 -aa(lp21493 -g15 -aI398 -aI-364 -aI394 -aI-472 -aI398 -aI-419 -aa(lp21494 -g10 -aa(lp21495 -g8 -aI451 -aI0 -aa(lp21496 -g10 -aa(lp21497 -g8 -aI451 -aI0 -aasV- -(lp21498 -(lp21499 -g8 -aI39 -aI-275 -aa(lp21500 -g20 -aI39 -aI-438 -aa(lp21501 -g20 -aI389 -aI-438 -aa(lp21502 -g20 -aI389 -aI-275 -aa(lp21503 -g10 -aa(lp21504 -g8 -aI429 -aI0 -aa(lp21505 -g10 -aa(lp21506 -g8 -aI429 -aI0 -aasV1 -(lp21507 -(lp21508 -g8 -aI531 -aI0 -aa(lp21509 -g20 -aI330 -aI0 -aa(lp21510 -g20 -aI330 -aI-550 -aa(lp21511 -g15 -aI331 -aI-591 -aI330 -aI-561 -aI330 -aI-575 -aa(lp21512 -g15 -aI332 -aI-640 -aI331 -aI-606 -aI331 -aI-623 -aa(lp21513 -g15 -aI334 -aI-692 -aI333 -aI-657 -aI333 -aI-674 -aa(lp21514 -g15 -aI335 -aI-739 -aI334 -aI-709 -aI335 -aI-725 -aa(lp21515 -g15 -aI324 -aI-728 -aI333 -aI-737 -aI330 -aI-733 -aa(lp21516 -g15 -aI307 -aI-710 -aI319 -aI-722 -aI313 -aI-717 -aa(lp21517 -g15 -aI287 -aI-691 -aI300 -aI-704 -aI294 -aI-698 -aa(lp21518 -g15 -aI266 -aI-674 -aI280 -aI-685 -aI273 -aI-679 -aa(lp21519 -g20 -aI157 -aI-586 -aa(lp21520 -g20 -aI59 -aI-707 -aa(lp21521 -g20 -aI366 -aI-951 -aa(lp21522 -g20 -aI531 -aI-951 -aa(lp21523 -g10 -aa(lp21524 -g8 -aI734 -aI0 -aa(lp21525 -g10 -aa(lp21526 -g8 -aI734 -aI0 -aasV5 -(lp21527 -(lp21528 -g8 -aI389 -aI-607 -aa(lp21529 -g15 -aI503 -aI-588 -aI430 -aI-607 -aI468 -aI-601 -aa(lp21530 -g15 -aI595 -aI-533 -aI538 -aI-576 -aI569 -aI-557 -aa(lp21531 -g15 -aI656 -aI-442 -aI621 -aI-509 -aI641 -aI-478 -aa(lp21532 -g15 -aI678 -aI-317 -aI671 -aI-406 -aI678 -aI-364 -aa(lp21533 -g15 -aI654 -aI-178 -aI678 -aI-266 -aI670 -aI-219 -aa(lp21534 -g15 -aI583 -aI-74 -aI638 -aI-137 -aI614 -aI-103 -aa(lp21535 -g15 -aI467 -aI-9 -aI552 -aI-46 -aI513 -aI-24 -aa(lp21536 -g15 -aI307 -aI13 -aI420 -aI5 -aI367 -aI13 -aa(lp21537 -g15 -aI236 -aI10 -aI284 -aI13 -aI260 -aI12 -aa(lp21538 -g15 -aI169 -aI0 -aI213 -aI8 -aI191 -aI4 -aa(lp21539 -g15 -aI108 -aI-15 -aI148 -aI-3 -aI127 -aI-8 -aa(lp21540 -g15 -aI55 -aI-37 -aI89 -aI-21 -aI71 -aI-29 -aa(lp21541 -g20 -aI55 -aI-211 -aa(lp21542 -g15 -aI108 -aI-187 -aI71 -aI-203 -aI88 -aI-194 -aa(lp21543 -g15 -aI170 -aI-167 -aI128 -aI-179 -aI149 -aI-173 -aa(lp21544 -g15 -aI235 -aI-154 -aI192 -aI-162 -aI213 -aI-158 -aa(lp21545 -g15 -aI297 -aI-149 -aI257 -aI-151 -aI277 -aI-149 -aa(lp21546 -g15 -aI430 -aI-186 -aI355 -aI-149 -aI399 -aI-161 -aa(lp21547 -g15 -aI475 -aI-300 -aI460 -aI-210 -aI475 -aI-248 -aa(lp21548 -g15 -aI431 -aI-408 -aI475 -aI-347 -aI461 -aI-383 -aa(lp21549 -g15 -aI293 -aI-444 -aI401 -aI-432 -aI355 -aI-444 -aa(lp21550 -g15 -aI257 -aI-442 -aI282 -aI-444 -aI270 -aI-444 -aa(lp21551 -g15 -aI219 -aI-437 -aI244 -aI-441 -aI232 -aI-439 -aa(lp21552 -g15 -aI184 -aI-430 -aI207 -aI-435 -aI195 -aI-433 -aa(lp21553 -g15 -aI154 -aI-423 -aI172 -aI-428 -aI163 -aI-425 -aa(lp21554 -g20 -aI74 -aI-466 -aa(lp21555 -g20 -aI110 -aI-951 -aa(lp21556 -g20 -aI613 -aI-951 -aa(lp21557 -g20 -aI613 -aI-780 -aa(lp21558 -g20 -aI285 -aI-780 -aa(lp21559 -g20 -aI269 -aI-593 -aa(lp21560 -g15 -aI318 -aI-603 -aI283 -aI-596 -aI299 -aI-600 -aa(lp21561 -g15 -aI389 -aI-607 -aI336 -aI-606 -aI360 -aI-607 -aa(lp21562 -g10 -aa(lp21563 -g8 -aI734 -aI0 -aa(lp21564 -g10 -aa(lp21565 -g8 -aI734 -aI0 -aasV9 -(lp21566 -(lp21567 -g8 -aI686 -aI-545 -aa(lp21568 -g15 -aI679 -aI-408 -aI686 -aI-499 -aI684 -aI-454 -aa(lp21569 -g15 -aI652 -aI-278 -aI674 -aI-363 -aI665 -aI-320 -aa(lp21570 -g15 -aI600 -aI-163 -aI639 -aI-237 -aI622 -aI-199 -aa(lp21571 -g15 -aI517 -aI-70 -aI578 -aI-127 -aI550 -aI-96 -aa(lp21572 -g15 -aI396 -aI-8 -aI483 -aI-44 -aI443 -aI-23 -aa(lp21573 -g15 -aI230 -aI13 -aI349 -aI5 -aI293 -aI13 -aa(lp21574 -g15 -aI200 -aI12 -aI221 -aI13 -aI211 -aI13 -aa(lp21575 -g15 -aI167 -aI11 -aI189 -aI12 -aI178 -aI11 -aa(lp21576 -g15 -aI135 -aI8 -aI156 -aI10 -aI145 -aI9 -aa(lp21577 -g15 -aI108 -aI4 -aI124 -aI7 -aI115 -aI6 -aa(lp21578 -g20 -aI108 -aI-157 -aa(lp21579 -g15 -aI159 -aI-147 -aI124 -aI-152 -aI141 -aI-149 -aa(lp21580 -g15 -aI216 -aI-143 -aI178 -aI-144 -aI197 -aI-143 -aa(lp21581 -g15 -aI360 -aI-165 -aI274 -aI-143 -aI322 -aI-150 -aa(lp21582 -g15 -aI450 -aI-226 -aI398 -aI-179 -aI428 -aI-200 -aa(lp21583 -g15 -aI497 -aI-320 -aI472 -aI-252 -aI488 -aI-284 -aa(lp21584 -g15 -aI514 -aI-440 -aI507 -aI-356 -aI512 -aI-397 -aa(lp21585 -g20 -aI506 -aI-440 -aa(lp21586 -g15 -aI475 -aI-397 -aI497 -aI-425 -aI487 -aI-410 -aa(lp21587 -g15 -aI432 -aI-362 -aI463 -aI-383 -aI448 -aI-372 -aa(lp21588 -g15 -aI376 -aI-338 -aI415 -aI-352 -aI397 -aI-344 -aa(lp21589 -g15 -aI306 -aI-330 -aI355 -aI-333 -aI332 -aI-330 -aa(lp21590 -g15 -aI195 -aI-350 -aI265 -aI-330 -aI228 -aI-337 -aa(lp21591 -g15 -aI111 -aI-409 -aI162 -aI-363 -aI134 -aI-383 -aa(lp21592 -g15 -aI59 -aI-503 -aI88 -aI-434 -aI71 -aI-466 -aa(lp21593 -g15 -aI41 -aI-631 -aI47 -aI-540 -aI41 -aI-583 -aa(lp21594 -g15 -aI62 -aI-770 -aI41 -aI-683 -aI48 -aI-729 -aa(lp21595 -g15 -aI125 -aI-874 -aI77 -aI-811 -aI98 -aI-845 -aa(lp21596 -g15 -aI222 -aI-939 -aI151 -aI-902 -aI184 -aI-924 -aa(lp21597 -g15 -aI352 -aI-962 -aI261 -aI-954 -aI304 -aI-962 -aa(lp21598 -g15 -aI483 -aI-937 -aI399 -aI-962 -aI442 -aI-954 -aa(lp21599 -g15 -aI589 -aI-860 -aI524 -aI-920 -aI559 -aI-895 -aa(lp21600 -g15 -aI660 -aI-730 -aI619 -aI-826 -aI643 -aI-783 -aa(lp21601 -g15 -aI686 -aI-545 -aI678 -aI-678 -aI686 -aI-616 -aa(lp21602 -g10 -aa(lp21603 -g8 -aI356 -aI-800 -aa(lp21604 -g15 -aI307 -aI-791 -aI338 -aI-800 -aI322 -aI-797 -aa(lp21605 -g15 -aI269 -aI-760 -aI292 -aI-784 -aI279 -aI-774 -aa(lp21606 -g15 -aI244 -aI-708 -aI258 -aI-747 -aI250 -aI-729 -aa(lp21607 -g15 -aI235 -aI-634 -aI238 -aI-687 -aI235 -aI-662 -aa(lp21608 -g15 -aI264 -aI-524 -aI235 -aI-588 -aI245 -aI-551 -aa(lp21609 -g15 -aI353 -aI-484 -aI284 -aI-498 -aI314 -aI-484 -aa(lp21610 -g15 -aI408 -aI-496 -aI373 -aI-484 -aI391 -aI-488 -aa(lp21611 -g15 -aI450 -aI-526 -aI424 -aI-504 -aI438 -aI-514 -aa(lp21612 -g15 -aI477 -aI-569 -aI462 -aI-539 -aI471 -aI-553 -aa(lp21613 -g15 -aI486 -aI-616 -aI483 -aI-584 -aI486 -aI-600 -aa(lp21614 -g15 -aI478 -aI-682 -aI486 -aI-638 -aI484 -aI-660 -aa(lp21615 -g15 -aI454 -aI-742 -aI473 -aI-704 -aI465 -aI-724 -aa(lp21616 -g15 -aI413 -aI-784 -aI443 -aI-759 -aI429 -aI-773 -aa(lp21617 -g15 -aI356 -aI-800 -aI396 -aI-795 -aI377 -aI-800 -aa(lp21618 -g10 -aa(lp21619 -g8 -aI734 -aI0 -aa(lp21620 -g10 -aa(lp21621 -g8 -aI734 -aI0 -aasV= -(lp21622 -(lp21623 -g8 -aI57 -aI-524 -aa(lp21624 -g20 -aI57 -aI-666 -aa(lp21625 -g20 -aI677 -aI-666 -aa(lp21626 -g20 -aI677 -aI-524 -aa(lp21627 -g10 -aa(lp21628 -g8 -aI57 -aI-271 -aa(lp21629 -g20 -aI57 -aI-414 -aa(lp21630 -g20 -aI677 -aI-414 -aa(lp21631 -g20 -aI677 -aI-271 -aa(lp21632 -g10 -aa(lp21633 -g8 -aI734 -aI0 -aa(lp21634 -g10 -aa(lp21635 -g8 -aI734 -aI0 -aasVA -(lp21636 -(lp21637 -g8 -aI662 -aI0 -aa(lp21638 -g20 -aI597 -aI-226 -aa(lp21639 -g20 -aI269 -aI-226 -aa(lp21640 -g20 -aI203 -aI0 -aa(lp21641 -g20 -aI0 -aI0 -aa(lp21642 -g20 -aI309 -aI-955 -aa(lp21643 -g20 -aI555 -aI-955 -aa(lp21644 -g20 -aI866 -aI0 -aa(lp21645 -g10 -aa(lp21646 -g8 -aI550 -aI-395 -aa(lp21647 -g20 -aI489 -aI-603 -aa(lp21648 -g15 -aI477 -aI-642 -aI486 -aI-611 -aI483 -aI-624 -aa(lp21649 -g15 -aI461 -aI-701 -aI472 -aI-659 -aI467 -aI-679 -aa(lp21650 -g15 -aI444 -aI-765 -aI455 -aI-722 -aI449 -aI-744 -aa(lp21651 -g15 -aI433 -aI-821 -aI439 -aI-787 -aI435 -aI-805 -aa(lp21652 -g15 -aI426 -aI-787 -aI431 -aI-811 -aI429 -aI-800 -aa(lp21653 -g15 -aI416 -aI-745 -aI423 -aI-774 -aI420 -aI-760 -aa(lp21654 -g15 -aI405 -aI-702 -aI413 -aI-731 -aI409 -aI-716 -aa(lp21655 -g15 -aI394 -aI-660 -aI401 -aI-687 -aI398 -aI-673 -aa(lp21656 -g15 -aI385 -aI-625 -aI391 -aI-647 -aI387 -aI-635 -aa(lp21657 -g15 -aI378 -aI-603 -aI382 -aI-615 -aI380 -aI-608 -aa(lp21658 -g20 -aI318 -aI-395 -aa(lp21659 -g10 -aa(lp21660 -g8 -aI866 -aI0 -aa(lp21661 -g10 -aa(lp21662 -g8 -aI866 -aI0 -aasVE -(lp21663 -(lp21664 -g8 -aI667 -aI0 -aa(lp21665 -g20 -aI119 -aI0 -aa(lp21666 -g20 -aI119 -aI-951 -aa(lp21667 -g20 -aI667 -aI-951 -aa(lp21668 -g20 -aI667 -aI-786 -aa(lp21669 -g20 -aI321 -aI-786 -aa(lp21670 -g20 -aI321 -aI-577 -aa(lp21671 -g20 -aI643 -aI-577 -aa(lp21672 -g20 -aI643 -aI-411 -aa(lp21673 -g20 -aI321 -aI-411 -aa(lp21674 -g20 -aI321 -aI-166 -aa(lp21675 -g20 -aI667 -aI-166 -aa(lp21676 -g10 -aa(lp21677 -g8 -aI746 -aI0 -aa(lp21678 -g10 -aa(lp21679 -g8 -aI746 -aI0 -aasVI -(lp21680 -(lp21681 -g8 -aI475 -aI0 -aa(lp21682 -g20 -aI42 -aI0 -aa(lp21683 -g20 -aI42 -aI-114 -aa(lp21684 -g20 -aI158 -aI-167 -aa(lp21685 -g20 -aI158 -aI-783 -aa(lp21686 -g20 -aI42 -aI-836 -aa(lp21687 -g20 -aI42 -aI-951 -aa(lp21688 -g20 -aI475 -aI-951 -aa(lp21689 -g20 -aI475 -aI-836 -aa(lp21690 -g20 -aI360 -aI-783 -aa(lp21691 -g20 -aI360 -aI-167 -aa(lp21692 -g20 -aI475 -aI-114 -aa(lp21693 -g10 -aa(lp21694 -g8 -aI518 -aI0 -aa(lp21695 -g10 -aa(lp21696 -g8 -aI518 -aI0 -aasVM -(lp21697 -(lp21698 -g8 -aI502 -aI0 -aa(lp21699 -g20 -aI293 -aI-746 -aa(lp21700 -g20 -aI287 -aI-746 -aa(lp21701 -g15 -aI294 -aI-630 -aI290 -aI-706 -aI292 -aI-667 -aa(lp21702 -g15 -aI296 -aI-580 -aI295 -aI-614 -aI295 -aI-597 -aa(lp21703 -g15 -aI298 -aI-530 -aI297 -aI-563 -aI297 -aI-547 -aa(lp21704 -g15 -aI299 -aI-483 -aI299 -aI-514 -aI299 -aI-498 -aa(lp21705 -g15 -aI300 -aI-442 -aI300 -aI-468 -aI300 -aI-454 -aa(lp21706 -g20 -aI300 -aI0 -aa(lp21707 -g20 -aI119 -aI0 -aa(lp21708 -g20 -aI119 -aI-951 -aa(lp21709 -g20 -aI394 -aI-951 -aa(lp21710 -g20 -aI600 -aI-223 -aa(lp21711 -g20 -aI604 -aI-223 -aa(lp21712 -g20 -aI822 -aI-951 -aa(lp21713 -g20 -aI1097 -aI-951 -aa(lp21714 -g20 -aI1097 -aI0 -aa(lp21715 -g20 -aI909 -aI0 -aa(lp21716 -g20 -aI909 -aI-450 -aa(lp21717 -g15 -aI909 -aI-488 -aI909 -aI-461 -aI909 -aI-474 -aa(lp21718 -g15 -aI910 -aI-534 -aI910 -aI-502 -aI910 -aI-517 -aa(lp21719 -g15 -aI912 -aI-582 -aI911 -aI-550 -aI911 -aI-566 -aa(lp21720 -g15 -aI914 -aI-631 -aI913 -aI-599 -aI913 -aI-615 -aa(lp21721 -g15 -aI918 -aI-744 -aI915 -aI-667 -aI917 -aI-705 -aa(lp21722 -g20 -aI913 -aI-744 -aa(lp21723 -g20 -aI688 -aI0 -aa(lp21724 -g10 -aa(lp21725 -g8 -aI1217 -aI0 -aa(lp21726 -g10 -aa(lp21727 -g8 -aI1217 -aI0 -aasVQ -(lp21728 -(lp21729 -g8 -aI930 -aI-476 -aa(lp21730 -g15 -aI918 -aI-331 -aI930 -aI-425 -aI926 -aI-376 -aa(lp21731 -g15 -aI879 -aI-207 -aI909 -aI-285 -aI897 -aI-244 -aa(lp21732 -g15 -aI815 -aI-107 -aI862 -aI-169 -aI841 -aI-136 -aa(lp21733 -g15 -aI723 -aI-35 -aI789 -aI-78 -aI759 -aI-54 -aa(lp21734 -g20 -aI958 -aI227 -aa(lp21735 -g20 -aI699 -aI227 -aa(lp21736 -g20 -aI525 -aI12 -aa(lp21737 -g15 -aI516 -aI12 -aI522 -aI12 -aI519 -aI12 -aa(lp21738 -g15 -aI510 -aI13 -aI514 -aI13 -aI512 -aI13 -aa(lp21739 -g15 -aI503 -aI13 -aI507 -aI13 -aI505 -aI13 -aa(lp21740 -g15 -aI314 -aI-21 -aI430 -aI13 -aI367 -aI1 -aa(lp21741 -g15 -aI181 -aI-121 -aI260 -aI-45 -aI216 -aI-78 -aa(lp21742 -g15 -aI103 -aI-276 -aI146 -aI-164 -aI120 -aI-216 -aa(lp21743 -g15 -aI77 -aI-478 -aI86 -aI-337 -aI77 -aI-404 -aa(lp21744 -g15 -aI103 -aI-678 -aI77 -aI-551 -aI86 -aI-618 -aa(lp21745 -g15 -aI181 -aI-832 -aI120 -aI-739 -aI146 -aI-790 -aa(lp21746 -g15 -aI314 -aI-931 -aI216 -aI-875 -aI261 -aI-908 -aa(lp21747 -g15 -aI505 -aI-966 -aI368 -aI-954 -aI431 -aI-966 -aa(lp21748 -g15 -aI694 -aI-931 -aI578 -aI-966 -aI641 -aI-954 -aa(lp21749 -g15 -aI827 -aI-832 -aI748 -aI-908 -aI792 -aI-875 -aa(lp21750 -g15 -aI905 -aI-678 -aI862 -aI-789 -aI888 -aI-738 -aa(lp21751 -g15 -aI930 -aI-476 -aI922 -aI-618 -aI930 -aI-550 -aa(lp21752 -g10 -aa(lp21753 -g8 -aI285 -aI-476 -aa(lp21754 -g15 -aI298 -aI-342 -aI285 -aI-426 -aI289 -aI-382 -aa(lp21755 -g15 -aI338 -aI-241 -aI306 -aI-302 -aI320 -aI-268 -aa(lp21756 -g15 -aI406 -aI-177 -aI356 -aI-213 -aI378 -aI-192 -aa(lp21757 -g15 -aI503 -aI-155 -aI433 -aI-163 -aI466 -aI-155 -aa(lp21758 -g15 -aI603 -aI-177 -aI542 -aI-155 -aI575 -aI-163 -aa(lp21759 -g15 -aI670 -aI-241 -aI630 -aI-192 -aI653 -aI-213 -aa(lp21760 -g15 -aI709 -aI-342 -aI688 -aI-268 -aI701 -aI-302 -aa(lp21761 -g15 -aI722 -aI-476 -aI718 -aI-382 -aI722 -aI-426 -aa(lp21762 -g15 -aI709 -aI-611 -aI722 -aI-526 -aI718 -aI-571 -aa(lp21763 -g15 -aI670 -aI-712 -aI701 -aI-650 -aI688 -aI-684 -aa(lp21764 -g15 -aI603 -aI-776 -aI653 -aI-740 -aI630 -aI-761 -aa(lp21765 -g15 -aI505 -aI-798 -aI576 -aI-790 -aI543 -aI-798 -aa(lp21766 -g15 -aI406 -aI-776 -aI467 -aI-798 -aI434 -aI-790 -aa(lp21767 -g15 -aI338 -aI-712 -aI379 -aI-761 -aI356 -aI-740 -aa(lp21768 -g15 -aI298 -aI-611 -aI320 -aI-684 -aI306 -aI-650 -aa(lp21769 -g15 -aI285 -aI-476 -aI289 -aI-571 -aI285 -aI-526 -aa(lp21770 -g10 -aa(lp21771 -g8 -aI1007 -aI0 -aa(lp21772 -g10 -aa(lp21773 -g8 -aI1007 -aI0 -aasVU -(lp21774 -(lp21775 -g8 -aI841 -aI-951 -aa(lp21776 -g20 -aI841 -aI-335 -aa(lp21777 -g15 -aI818 -aI-197 -aI841 -aI-286 -aI833 -aI-239 -aa(lp21778 -g15 -aI750 -aI-86 -aI803 -aI-154 -aI780 -aI-118 -aa(lp21779 -g15 -aI635 -aI-13 -aI719 -aI-55 -aI681 -aI-31 -aa(lp21780 -g15 -aI473 -aI13 -aI589 -aI4 -aI535 -aI13 -aa(lp21781 -g15 -aI318 -aI-11 -aI414 -aI13 -aI362 -aI5 -aa(lp21782 -g15 -aI205 -aI-82 -aI273 -aI-28 -aI235 -aI-52 -aa(lp21783 -g15 -aI136 -aI-193 -aI175 -aI-113 -aI152 -aI-150 -aa(lp21784 -g15 -aI113 -aI-338 -aI121 -aI-237 -aI113 -aI-285 -aa(lp21785 -g20 -aI113 -aI-951 -aa(lp21786 -g20 -aI314 -aI-951 -aa(lp21787 -g20 -aI314 -aI-353 -aa(lp21788 -g15 -aI324 -aI-262 -aI314 -aI-317 -aI317 -aI-287 -aa(lp21789 -g15 -aI355 -aI-201 -aI331 -aI-237 -aI342 -aI-217 -aa(lp21790 -g15 -aI406 -aI-166 -aI369 -aI-185 -aI386 -aI-174 -aa(lp21791 -g15 -aI478 -aI-155 -aI427 -aI-159 -aI451 -aI-155 -aa(lp21792 -g15 -aI601 -aI-205 -aI535 -aI-155 -aI576 -aI-172 -aa(lp21793 -g15 -aI639 -aI-354 -aI627 -aI-238 -aI639 -aI-287 -aa(lp21794 -g20 -aI639 -aI-951 -aa(lp21795 -g10 -aa(lp21796 -g8 -aI954 -aI0 -aa(lp21797 -g10 -aa(lp21798 -g8 -aI954 -aI0 -aasVY -(lp21799 -(lp21800 -g8 -aI389 -aI-559 -aa(lp21801 -g20 -aI561 -aI-951 -aa(lp21802 -g20 -aI778 -aI-951 -aa(lp21803 -g20 -aI489 -aI-369 -aa(lp21804 -g20 -aI489 -aI0 -aa(lp21805 -g20 -aI289 -aI0 -aa(lp21806 -g20 -aI289 -aI-363 -aa(lp21807 -g20 -aI0 -aI-951 -aa(lp21808 -g20 -aI218 -aI-951 -aa(lp21809 -g10 -aa(lp21810 -g8 -aI778 -aI0 -aa(lp21811 -g10 -aa(lp21812 -g8 -aI778 -aI0 -aasV] -(lp21813 -(lp21814 -g8 -aI33 -aI74 -aa(lp21815 -g20 -aI178 -aI74 -aa(lp21816 -g20 -aI178 -aI-814 -aa(lp21817 -g20 -aI33 -aI-814 -aa(lp21818 -g20 -aI33 -aI-951 -aa(lp21819 -g20 -aI348 -aI-951 -aa(lp21820 -g20 -aI348 -aI211 -aa(lp21821 -g20 -aI33 -aI211 -aa(lp21822 -g10 -aa(lp21823 -g8 -aI441 -aI0 -aa(lp21824 -g10 -aa(lp21825 -g8 -aI441 -aI0 -aasVa -(lp21826 -(lp21827 -g8 -aI526 -aI0 -aa(lp21828 -g20 -aI488 -aI-98 -aa(lp21829 -g20 -aI482 -aI-98 -aa(lp21830 -g15 -aI439 -aI-48 -aI468 -aI-78 -aI453 -aI-62 -aa(lp21831 -g15 -aI392 -aI-13 -aI425 -aI-33 -aI409 -aI-22 -aa(lp21832 -g15 -aI335 -aI6 -aI375 -aI-4 -aI356 -aI2 -aa(lp21833 -g15 -aI262 -aI13 -aI314 -aI11 -aI290 -aI13 -aa(lp21834 -g15 -aI180 -aI0 -aI232 -aI13 -aI205 -aI8 -aa(lp21835 -g15 -aI114 -aI-42 -aI155 -aI-9 -aI133 -aI-23 -aa(lp21836 -g15 -aI71 -aI-114 -aI96 -aI-61 -aI82 -aI-85 -aa(lp21837 -g15 -aI55 -aI-216 -aI61 -aI-143 -aI55 -aI-177 -aa(lp21838 -g15 -aI130 -aI-387 -aI55 -aI-294 -aI80 -aI-351 -aa(lp21839 -g15 -aI352 -aI-448 -aI179 -aI-424 -aI253 -aI-444 -aa(lp21840 -g20 -aI468 -aI-452 -aa(lp21841 -g20 -aI468 -aI-507 -aa(lp21842 -g15 -aI442 -aI-573 -aI468 -aI-537 -aI459 -aI-559 -aa(lp21843 -g15 -aI369 -aI-595 -aI424 -aI-588 -aI400 -aI-595 -aa(lp21844 -g15 -aI277 -aI-581 -aI337 -aI-595 -aI307 -aI-590 -aa(lp21845 -g15 -aI188 -aI-545 -aI247 -aI-572 -aI218 -aI-560 -aa(lp21846 -g20 -aI123 -aI-676 -aa(lp21847 -g15 -aI244 -aI-724 -aI160 -aI-697 -aI200 -aI-713 -aa(lp21848 -g15 -aI384 -aI-742 -aI289 -aI-736 -aI335 -aI-742 -aa(lp21849 -g15 -aI592 -aI-678 -aI474 -aI-742 -aI544 -aI-721 -aa(lp21850 -g15 -aI665 -aI-484 -aI641 -aI-636 -aI665 -aI-571 -aa(lp21851 -g20 -aI665 -aI0 -aa(lp21852 -g10 -aa(lp21853 -g8 -aI468 -aI-336 -aa(lp21854 -g20 -aI402 -aI-334 -aa(lp21855 -g15 -aI335 -aI-323 -aI375 -aI-333 -aI353 -aI-329 -aa(lp21856 -g15 -aI291 -aI-299 -aI317 -aI-317 -aI302 -aI-309 -aa(lp21857 -g15 -aI267 -aI-262 -aI280 -aI-289 -aI272 -aI-276 -aa(lp21858 -g15 -aI259 -aI-215 -aI262 -aI-248 -aI259 -aI-233 -aa(lp21859 -g15 -aI281 -aI-150 -aI259 -aI-185 -aI267 -aI-163 -aa(lp21860 -g15 -aI339 -aI-131 -aI296 -aI-138 -aI315 -aI-131 -aa(lp21861 -g15 -aI390 -aI-141 -aI358 -aI-131 -aI374 -aI-134 -aa(lp21862 -g15 -aI431 -aI-169 -aI406 -aI-147 -aI419 -aI-156 -aa(lp21863 -g15 -aI458 -aI-214 -aI442 -aI-181 -aI451 -aI-196 -aa(lp21864 -g15 -aI468 -aI-276 -aI464 -aI-232 -aI468 -aI-253 -aa(lp21865 -g10 -aa(lp21866 -g8 -aI765 -aI0 -aa(lp21867 -g10 -aa(lp21868 -g8 -aI765 -aI0 -aasVe -(lp21869 -(lp21870 -g8 -aI398 -aI-599 -aa(lp21871 -g15 -aI310 -aI-562 -aI363 -aI-599 -aI334 -aI-587 -aa(lp21872 -g15 -aI270 -aI-446 -aI287 -aI-537 -aI274 -aI-499 -aa(lp21873 -g20 -aI524 -aI-446 -aa(lp21874 -g15 -aI515 -aI-507 -aI523 -aI-468 -aI520 -aI-488 -aa(lp21875 -g15 -aI492 -aI-555 -aI510 -aI-526 -aI502 -aI-542 -aa(lp21876 -g15 -aI453 -aI-588 -aI481 -aI-569 -aI468 -aI-580 -aa(lp21877 -g15 -aI398 -aI-599 -aI437 -aI-595 -aI419 -aI-599 -aa(lp21878 -g10 -aa(lp21879 -g8 -aI423 -aI13 -aa(lp21880 -g15 -aI279 -aI-9 -aI371 -aI13 -aI323 -aI5 -aa(lp21881 -g15 -aI166 -aI-77 -aI236 -aI-24 -aI198 -aI-47 -aa(lp21882 -g15 -aI92 -aI-193 -aI134 -aI-108 -aI110 -aI-147 -aa(lp21883 -g15 -aI66 -aI-358 -aI75 -aI-240 -aI66 -aI-295 -aa(lp21884 -g15 -aI90 -aI-525 -aI66 -aI-422 -aI74 -aI-477 -aa(lp21885 -g15 -aI157 -aI-645 -aI106 -aI-573 -aI129 -aI-613 -aa(lp21886 -g15 -aI262 -aI-716 -aI186 -aI-676 -aI221 -aI-700 -aa(lp21887 -g15 -aI397 -aI-741 -aI302 -aI-733 -aI347 -aI-741 -aa(lp21888 -g15 -aI527 -aI-719 -aI445 -aI-741 -aI488 -aI-733 -aa(lp21889 -g15 -aI626 -aI-655 -aI566 -aI-704 -aI599 -aI-683 -aa(lp21890 -g15 -aI689 -aI-551 -aI653 -aI-626 -aI674 -aI-592 -aa(lp21891 -g15 -aI710 -aI-410 -aI703 -aI-510 -aI710 -aI-463 -aa(lp21892 -g20 -aI710 -aI-314 -aa(lp21893 -g20 -aI266 -aI-314 -aa(lp21894 -g15 -aI280 -aI-238 -aI267 -aI-286 -aI272 -aI-261 -aa(lp21895 -g15 -aI314 -aI-182 -aI288 -aI-216 -aI299 -aI-197 -aa(lp21896 -g15 -aI366 -aI-146 -aI328 -aI-166 -aI346 -aI-154 -aa(lp21897 -g15 -aI437 -aI-134 -aI387 -aI-138 -aI411 -aI-134 -aa(lp21898 -g15 -aI500 -aI-137 -aI459 -aI-134 -aI480 -aI-135 -aa(lp21899 -g15 -aI557 -aI-148 -aI520 -aI-140 -aI539 -aI-143 -aa(lp21900 -g15 -aI613 -aI-166 -aI576 -aI-153 -aI595 -aI-159 -aa(lp21901 -g15 -aI669 -aI-191 -aI631 -aI-173 -aI650 -aI-182 -aa(lp21902 -g20 -aI669 -aI-37 -aa(lp21903 -g15 -aI616 -aI-14 -aI651 -aI-28 -aI634 -aI-21 -aa(lp21904 -g15 -aI561 -aI1 -aI599 -aI-8 -aI580 -aI-3 -aa(lp21905 -g15 -aI498 -aI10 -aI541 -aI5 -aI520 -aI8 -aa(lp21906 -g15 -aI423 -aI13 -aI475 -aI12 -aI450 -aI13 -aa(lp21907 -g10 -aa(lp21908 -g8 -aI774 -aI0 -aa(lp21909 -g10 -aa(lp21910 -g8 -aI774 -aI0 -aasVi -(lp21911 -(lp21912 -g8 -aI95 -aI-915 -aa(lp21913 -g15 -aI104 -aI-962 -aI95 -aI-934 -aI98 -aI-949 -aa(lp21914 -g15 -aI127 -aI-992 -aI109 -aI-974 -aI117 -aI-984 -aa(lp21915 -g15 -aI161 -aI-1008 -aI137 -aI-999 -aI148 -aI-1004 -aa(lp21916 -g15 -aI203 -aI-1012 -aI175 -aI-1011 -aI189 -aI-1012 -aa(lp21917 -g15 -aI245 -aI-1008 -aI218 -aI-1012 -aI232 -aI-1011 -aa(lp21918 -g15 -aI279 -aI-992 -aI258 -aI-1004 -aI269 -aI-999 -aa(lp21919 -g15 -aI303 -aI-962 -aI289 -aI-984 -aI297 -aI-974 -aa(lp21920 -g15 -aI311 -aI-915 -aI308 -aI-949 -aI311 -aI-934 -aa(lp21921 -g15 -aI303 -aI-869 -aI311 -aI-897 -aI308 -aI-881 -aa(lp21922 -g15 -aI279 -aI-839 -aI297 -aI-856 -aI289 -aI-846 -aa(lp21923 -g15 -aI245 -aI-822 -aI269 -aI-831 -aI258 -aI-826 -aa(lp21924 -g15 -aI203 -aI-817 -aI232 -aI-819 -aI218 -aI-817 -aa(lp21925 -g15 -aI161 -aI-822 -aI189 -aI-817 -aI175 -aI-819 -aa(lp21926 -g15 -aI127 -aI-839 -aI148 -aI-826 -aI137 -aI-831 -aa(lp21927 -g15 -aI104 -aI-869 -aI117 -aI-846 -aI109 -aI-856 -aa(lp21928 -g15 -aI95 -aI-915 -aI98 -aI-881 -aI95 -aI-897 -aa(lp21929 -g10 -aa(lp21930 -g8 -aI302 -aI0 -aa(lp21931 -g20 -aI104 -aI0 -aa(lp21932 -g20 -aI104 -aI-727 -aa(lp21933 -g20 -aI302 -aI-727 -aa(lp21934 -g10 -aa(lp21935 -g8 -aI406 -aI0 -aa(lp21936 -g10 -aa(lp21937 -g8 -aI406 -aI0 -aasVm -(lp21938 -(lp21939 -g8 -aI729 -aI0 -aa(lp21940 -g20 -aI530 -aI0 -aa(lp21941 -g20 -aI530 -aI-424 -aa(lp21942 -g15 -aI507 -aI-542 -aI530 -aI-477 -aI522 -aI-516 -aa(lp21943 -g15 -aI433 -aI-582 -aI491 -aI-569 -aI467 -aI-582 -aa(lp21944 -g15 -aI370 -aI-566 -aI408 -aI-582 -aI387 -aI-577 -aa(lp21945 -g15 -aI330 -aI-520 -aI354 -aI-556 -aI340 -aI-540 -aa(lp21946 -g15 -aI309 -aI-444 -aI320 -aI-499 -aI313 -aI-474 -aa(lp21947 -g15 -aI302 -aI-341 -aI304 -aI-414 -aI302 -aI-380 -aa(lp21948 -g20 -aI302 -aI0 -aa(lp21949 -g20 -aI104 -aI0 -aa(lp21950 -g20 -aI104 -aI-727 -aa(lp21951 -g20 -aI255 -aI-727 -aa(lp21952 -g20 -aI282 -aI-634 -aa(lp21953 -g20 -aI293 -aI-634 -aa(lp21954 -g15 -aI331 -aI-682 -aI304 -aI-652 -aI316 -aI-669 -aa(lp21955 -g15 -aI378 -aI-715 -aI345 -aI-695 -aI361 -aI-707 -aa(lp21956 -g15 -aI434 -aI-734 -aI396 -aI-724 -aI414 -aI-730 -aa(lp21957 -g15 -aI493 -aI-741 -aI453 -aI-739 -aI473 -aI-741 -aa(lp21958 -g15 -aI620 -aI-715 -aI543 -aI-741 -aI585 -aI-732 -aa(lp21959 -g15 -aI701 -aI-634 -aI655 -aI-698 -aI682 -aI-671 -aa(lp21960 -g20 -aI717 -aI-634 -aa(lp21961 -g15 -aI755 -aI-682 -aI727 -aI-652 -aI740 -aI-669 -aa(lp21962 -g15 -aI804 -aI-715 -aI769 -aI-695 -aI786 -aI-707 -aa(lp21963 -g15 -aI860 -aI-734 -aI821 -aI-724 -aI840 -aI-730 -aa(lp21964 -g15 -aI919 -aI-741 -aI880 -aI-739 -aI899 -aI-741 -aa(lp21965 -g15 -aI1096 -aI-677 -aI998 -aI-741 -aI1056 -aI-719 -aa(lp21966 -g15 -aI1156 -aI-474 -aI1136 -aI-635 -aI1156 -aI-567 -aa(lp21967 -g20 -aI1156 -aI0 -aa(lp21968 -g20 -aI957 -aI0 -aa(lp21969 -g20 -aI957 -aI-424 -aa(lp21970 -g15 -aI933 -aI-542 -aI957 -aI-477 -aI949 -aI-516 -aa(lp21971 -g15 -aI860 -aI-582 -aI917 -aI-569 -aI893 -aI-582 -aa(lp21972 -g15 -aI759 -aI-525 -aI812 -aI-582 -aI779 -aI-563 -aa(lp21973 -g15 -aI729 -aI-364 -aI739 -aI-488 -aI729 -aI-434 -aa(lp21974 -g10 -aa(lp21975 -g8 -aI1255 -aI0 -aa(lp21976 -g10 -aa(lp21977 -g8 -aI1255 -aI0 -aasVq -(lp21978 -(lp21979 -g8 -aI391 -aI-142 -aa(lp21980 -g15 -aI452 -aI-154 -aI415 -aI-142 -aI435 -aI-146 -aa(lp21981 -g15 -aI491 -aI-190 -aI468 -aI-162 -aI481 -aI-174 -aa(lp21982 -g15 -aI513 -aI-251 -aI501 -aI-206 -aI508 -aI-226 -aa(lp21983 -g15 -aI521 -aI-336 -aI518 -aI-275 -aI521 -aI-304 -aa(lp21984 -g20 -aI521 -aI-360 -aa(lp21985 -g15 -aI515 -aI-454 -aI521 -aI-396 -aI519 -aI-427 -aa(lp21986 -g15 -aI493 -aI-523 -aI511 -aI-481 -aI504 -aI-504 -aa(lp21987 -g15 -aI453 -aI-565 -aI483 -aI-541 -aI470 -aI-555 -aa(lp21988 -g15 -aI390 -aI-579 -aI436 -aI-574 -aI415 -aI-579 -aa(lp21989 -g15 -aI298 -aI-523 -aI348 -aI-579 -aI318 -aI-560 -aa(lp21990 -g15 -aI269 -aI-359 -aI279 -aI-485 -aI269 -aI-431 -aa(lp21991 -g15 -aI299 -aI-196 -aI269 -aI-286 -aI279 -aI-232 -aa(lp21992 -g15 -aI391 -aI-142 -aI318 -aI-160 -aI349 -aI-142 -aa(lp21993 -g10 -aa(lp21994 -g8 -aI318 -aI13 -aa(lp21995 -g15 -aI215 -aI-10 -aI280 -aI13 -aI246 -aI5 -aa(lp21996 -g15 -aI136 -aI-81 -aI184 -aI-26 -aI158 -aI-50 -aa(lp21997 -g15 -aI84 -aI-199 -aI113 -aI-113 -aI96 -aI-152 -aa(lp21998 -g15 -aI66 -aI-362 -aI72 -aI-246 -aI66 -aI-300 -aa(lp21999 -g15 -aI84 -aI-525 -aI66 -aI-424 -aI72 -aI-478 -aa(lp22000 -g15 -aI137 -aI-644 -aI97 -aI-573 -aI114 -aI-612 -aa(lp22001 -g15 -aI219 -aI-716 -aI160 -aI-676 -aI187 -aI-700 -aa(lp22002 -g15 -aI324 -aI-741 -aI251 -aI-732 -aI286 -aI-741 -aa(lp22003 -g15 -aI389 -aI-732 -aI348 -aI-741 -aI370 -aI-738 -aa(lp22004 -g15 -aI443 -aI-710 -aI409 -aI-727 -aI427 -aI-719 -aa(lp22005 -g15 -aI485 -aI-676 -aI458 -aI-700 -aI472 -aI-689 -aa(lp22006 -g15 -aI517 -aI-634 -aI497 -aI-663 -aI508 -aI-649 -aa(lp22007 -g20 -aI522 -aI-634 -aa(lp22008 -g20 -aI538 -aI-727 -aa(lp22009 -g20 -aI706 -aI-727 -aa(lp22010 -g20 -aI706 -aI320 -aa(lp22011 -g20 -aI507 -aI320 -aa(lp22012 -g20 -aI507 -aI15 -aa(lp22013 -g15 -aI509 -aI-15 -aI507 -aI7 -aI508 -aI-3 -aa(lp22014 -g15 -aI512 -aI-51 -aI510 -aI-27 -aI511 -aI-39 -aa(lp22015 -g15 -aI516 -aI-93 -aI513 -aI-65 -aI514 -aI-79 -aa(lp22016 -g20 -aI507 -aI-93 -aa(lp22017 -g15 -aI477 -aI-51 -aI499 -aI-79 -aI488 -aI-65 -aa(lp22018 -g15 -aI436 -aI-17 -aI465 -aI-38 -aI451 -aI-27 -aa(lp22019 -g15 -aI384 -aI5 -aI421 -aI-8 -aI403 -aI0 -aa(lp22020 -g15 -aI318 -aI13 -aI364 -aI10 -aI342 -aI13 -aa(lp22021 -g10 -aa(lp22022 -g8 -aI810 -aI0 -aa(lp22023 -g10 -aa(lp22024 -g8 -aI810 -aI0 -aasVu -(lp22025 -(lp22026 -g8 -aI580 -aI0 -aa(lp22027 -g20 -aI553 -aI-92 -aa(lp22028 -g20 -aI542 -aI-92 -aa(lp22029 -g15 -aI504 -aI-44 -aI532 -aI-73 -aI519 -aI-58 -aa(lp22030 -g15 -aI455 -aI-11 -aI489 -aI-31 -aI472 -aI-20 -aa(lp22031 -g15 -aI398 -aI7 -aI437 -aI-3 -aI418 -aI3 -aa(lp22032 -g15 -aI337 -aI13 -aI378 -aI11 -aI358 -aI13 -aa(lp22033 -g15 -aI240 -aI-1 -aI301 -aI13 -aI269 -aI8 -aa(lp22034 -g15 -aI165 -aI-49 -aI211 -aI-12 -aI186 -aI-27 -aa(lp22035 -g15 -aI117 -aI-132 -aI144 -aI-71 -aI128 -aI-98 -aa(lp22036 -g15 -aI100 -aI-252 -aI105 -aI-165 -aI100 -aI-205 -aa(lp22037 -g20 -aI100 -aI-727 -aa(lp22038 -g20 -aI298 -aI-727 -aa(lp22039 -g20 -aI298 -aI-302 -aa(lp22040 -g15 -aI322 -aI-184 -aI298 -aI-249 -aI306 -aI-210 -aa(lp22041 -g15 -aI398 -aI-144 -aI338 -aI-157 -aI363 -aI-144 -aa(lp22042 -g15 -aI463 -aI-160 -aI424 -aI-144 -aI446 -aI-149 -aa(lp22043 -g15 -aI504 -aI-206 -aI480 -aI-170 -aI494 -aI-186 -aa(lp22044 -g15 -aI526 -aI-282 -aI515 -aI-226 -aI522 -aI-252 -aa(lp22045 -g15 -aI533 -aI-384 -aI531 -aI-312 -aI533 -aI-346 -aa(lp22046 -g20 -aI533 -aI-727 -aa(lp22047 -g20 -aI731 -aI-727 -aa(lp22048 -g20 -aI731 -aI0 -aa(lp22049 -g10 -aa(lp22050 -g8 -aI835 -aI0 -aa(lp22051 -g10 -aa(lp22052 -g8 -aI835 -aI0 -aasVy -(lp22053 -(lp22054 -g8 -aI0 -aI-727 -aa(lp22055 -g20 -aI217 -aI-727 -aa(lp22056 -g20 -aI334 -aI-317 -aa(lp22057 -g15 -aI349 -aI-245 -aI341 -aI-295 -aI346 -aI-271 -aa(lp22058 -g15 -aI356 -aI-176 -aI353 -aI-220 -aI355 -aI-197 -aa(lp22059 -g20 -aI360 -aI-176 -aa(lp22060 -g15 -aI363 -aI-209 -aI360 -aI-186 -aI362 -aI-197 -aa(lp22061 -g15 -aI369 -aI-246 -aI365 -aI-221 -aI366 -aI-234 -aa(lp22062 -g15 -aI376 -aI-284 -aI371 -aI-259 -aI373 -aI-272 -aa(lp22063 -g15 -aI385 -aI-317 -aI379 -aI-296 -aI382 -aI-307 -aa(lp22064 -g20 -aI500 -aI-727 -aa(lp22065 -g20 -aI718 -aI-727 -aa(lp22066 -g20 -aI430 -aI93 -aa(lp22067 -g15 -aI320 -aI264 -aI404 -aI170 -aI367 -aI227 -aa(lp22068 -g15 -aI146 -aI320 -aI274 -aI302 -aI216 -aI320 -aa(lp22069 -g15 -aI87 -aI317 -aI123 -aI320 -aI104 -aI319 -aa(lp22070 -g15 -aI45 -aI309 -aI71 -aI314 -aI57 -aI312 -aa(lp22071 -g20 -aI45 -aI152 -aa(lp22072 -g15 -aI80 -aI158 -aI54 -aI154 -aI66 -aI156 -aa(lp22073 -g15 -aI123 -aI160 -aI93 -aI159 -aI108 -aI160 -aa(lp22074 -g15 -aI177 -aI152 -aI144 -aI160 -aI162 -aI157 -aa(lp22075 -g15 -aI215 -aI128 -aI191 -aI146 -aI204 -aI138 -aa(lp22076 -g15 -aI242 -aI91 -aI225 -aI118 -aI234 -aI105 -aa(lp22077 -g15 -aI262 -aI43 -aI250 -aI77 -aI256 -aI61 -aa(lp22078 -g20 -aI274 -aI6 -aa(lp22079 -g10 -aa(lp22080 -g8 -aI718 -aI0 -aa(lp22081 -g10 -aa(lp22082 -g8 -aI718 -aI0 -aasV} -(lp22083 -(lp22084 -g8 -aI305 -aI29 -aa(lp22085 -g15 -aI292 -aI112 -aI305 -aI61 -aI301 -aI89 -aa(lp22086 -g15 -aI248 -aI168 -aI284 -aI135 -aI269 -aI154 -aa(lp22087 -g15 -aI160 -aI200 -aI226 -aI183 -aI197 -aI194 -aa(lp22088 -g15 -aI20 -aI211 -aI123 -aI207 -aI77 -aI211 -aa(lp22089 -g20 -aI20 -aI64 -aa(lp22090 -g15 -aI67 -aI59 -aI37 -aI63 -aI53 -aI62 -aa(lp22091 -g15 -aI102 -aI45 -aI80 -aI57 -aI92 -aI52 -aa(lp22092 -g15 -aI125 -aI18 -aI112 -aI38 -aI119 -aI29 -aa(lp22093 -g15 -aI133 -aI-27 -aI130 -aI6 -aI133 -aI-8 -aa(lp22094 -g20 -aI133 -aI-222 -aa(lp22095 -g15 -aI171 -aI-319 -aI132 -aI-263 -aI144 -aI-295 -aa(lp22096 -g15 -aI285 -aI-366 -aI197 -aI-343 -aI235 -aI-358 -aa(lp22097 -g20 -aI285 -aI-373 -aa(lp22098 -g15 -aI133 -aI-518 -aI186 -aI-389 -aI136 -aI-437 -aa(lp22099 -g20 -aI133 -aI-713 -aa(lp22100 -g15 -aI125 -aI-758 -aI133 -aI-731 -aI130 -aI-746 -aa(lp22101 -g15 -aI102 -aI-786 -aI119 -aI-770 -aI112 -aI-779 -aa(lp22102 -g15 -aI67 -aI-800 -aI92 -aI-793 -aI80 -aI-797 -aa(lp22103 -g15 -aI20 -aI-804 -aI53 -aI-802 -aI37 -aI-804 -aa(lp22104 -g20 -aI20 -aI-951 -aa(lp22105 -g15 -aI160 -aI-940 -aI77 -aI-951 -aI123 -aI-947 -aa(lp22106 -g15 -aI248 -aI-908 -aI197 -aI-934 -aI226 -aI-923 -aa(lp22107 -g15 -aI292 -aI-852 -aI269 -aI-894 -aI284 -aI-875 -aa(lp22108 -g15 -aI305 -aI-770 -aI301 -aI-829 -aI305 -aI-802 -aa(lp22109 -g20 -aI305 -aI-563 -aa(lp22110 -g15 -aI315 -aI-509 -aI304 -aI-542 -aI308 -aI-524 -aa(lp22111 -g15 -aI347 -aI-473 -aI322 -aI-495 -aI332 -aI-483 -aa(lp22112 -g15 -aI400 -aI-453 -aI361 -aI-464 -aI379 -aI-457 -aa(lp22113 -g15 -aI472 -aI-447 -aI421 -aI-449 -aI445 -aI-447 -aa(lp22114 -g20 -aI472 -aI-291 -aa(lp22115 -g15 -aI347 -aI-265 -aI417 -aI-291 -aI376 -aI-282 -aa(lp22116 -g15 -aI305 -aI-175 -aI319 -aI-247 -aI305 -aI-217 -aa(lp22117 -g10 -aa(lp22118 -g8 -aI485 -aI0 -aa(lp22119 -g10 -aa(lp22120 -g8 -aI485 -aI0 -aassg10874 -(dp22121 -V -(lp22122 -(lp22123 -g8 -aI346 -aI0 -aa(lp22124 -g10 -aa(lp22125 -g8 -aI346 -aI0 -aasV$ -(lp22126 -(lp22127 -g8 -aI641 -aI-289 -aa(lp22128 -g15 -aI625 -aI-207 -aI641 -aI-259 -aI635 -aI-231 -aa(lp22129 -g15 -aI578 -aI-142 -aI614 -aI-182 -aI598 -aI-161 -aa(lp22130 -g15 -aI504 -aI-97 -aI558 -aI-124 -aI533 -aI-109 -aa(lp22131 -g15 -aI406 -aI-71 -aI476 -aI-85 -aI443 -aI-77 -aa(lp22132 -g20 -aI406 -aI77 -aa(lp22133 -g20 -aI317 -aI77 -aa(lp22134 -g20 -aI317 -aI-65 -aa(lp22135 -g15 -aI251 -aI-68 -aI295 -aI-65 -aI273 -aI-66 -aa(lp22136 -g15 -aI186 -aI-77 -aI229 -aI-70 -aI207 -aI-73 -aa(lp22137 -g15 -aI128 -aI-91 -aI166 -aI-81 -aI146 -aI-86 -aa(lp22138 -g15 -aI80 -aI-111 -aI110 -aI-97 -aI93 -aI-104 -aa(lp22139 -g20 -aI80 -aI-223 -aa(lp22140 -g15 -aI129 -aI-202 -aI94 -aI-216 -aI111 -aI-209 -aa(lp22141 -g15 -aI189 -aI-183 -aI148 -aI-195 -aI168 -aI-188 -aa(lp22142 -g15 -aI253 -aI-169 -aI210 -aI-177 -aI231 -aI-172 -aa(lp22143 -g15 -aI317 -aI-163 -aI275 -aI-165 -aI296 -aI-163 -aa(lp22144 -g20 -aI317 -aI-446 -aa(lp22145 -g15 -aI216 -aI-487 -aI278 -aI-459 -aI244 -aI-472 -aa(lp22146 -g15 -aI145 -aI-536 -aI188 -aI-501 -aI164 -aI-517 -aa(lp22147 -g15 -aI104 -aI-599 -aI127 -aI-554 -aI113 -aI-575 -aa(lp22148 -g15 -aI90 -aI-683 -aI95 -aI-623 -aI90 -aI-651 -aa(lp22149 -g15 -aI106 -aI-763 -aI90 -aI-712 -aI95 -aI-739 -aa(lp22150 -g15 -aI152 -aI-826 -aI117 -aI-787 -aI132 -aI-808 -aa(lp22151 -g15 -aI223 -aI-870 -aI171 -aI-844 -aI195 -aI-859 -aa(lp22152 -g15 -aI317 -aI-894 -aI251 -aI-882 -aI282 -aI-890 -aa(lp22153 -g20 -aI317 -aI-1011 -aa(lp22154 -g20 -aI406 -aI-1011 -aa(lp22155 -g20 -aI406 -aI-896 -aa(lp22156 -g15 -aI527 -aI-879 -aI450 -aI-894 -aI490 -aI-888 -aa(lp22157 -g15 -aI625 -aI-845 -aI563 -aI-870 -aI596 -aI-859 -aa(lp22158 -g20 -aI582 -aI-751 -aa(lp22159 -g15 -aI500 -aI-781 -aI558 -aI-762 -aI531 -aI-772 -aa(lp22160 -g15 -aI406 -aI-798 -aI470 -aI-790 -aI439 -aI-795 -aa(lp22161 -g20 -aI406 -aI-523 -aa(lp22162 -g15 -aI508 -aI-481 -aI445 -aI-510 -aI478 -aI-496 -aa(lp22163 -g15 -aI581 -aI-433 -aI537 -aI-467 -aI561 -aI-451 -aa(lp22164 -g15 -aI626 -aI-371 -aI601 -aI-415 -aI616 -aI-394 -aa(lp22165 -g15 -aI641 -aI-289 -aI636 -aI-348 -aI641 -aI-321 -aa(lp22166 -g10 -aa(lp22167 -g8 -aI526 -aI-289 -aa(lp22168 -g15 -aI520 -aI-329 -aI526 -aI-304 -aI524 -aI-317 -aa(lp22169 -g15 -aI499 -aI-361 -aI515 -aI-341 -aI509 -aI-352 -aa(lp22170 -g15 -aI462 -aI-388 -aI490 -aI-371 -aI478 -aI-380 -aa(lp22171 -g15 -aI406 -aI-412 -aI447 -aI-397 -aI429 -aI-405 -aa(lp22172 -g20 -aI406 -aI-170 -aa(lp22173 -g15 -aI497 -aI-211 -aI447 -aI-176 -aI477 -aI-189 -aa(lp22174 -g15 -aI526 -aI-289 -aI516 -aI-232 -aI526 -aI-258 -aa(lp22175 -g10 -aa(lp22176 -g8 -aI205 -aI-682 -aa(lp22177 -g15 -aI210 -aI-640 -aI205 -aI-666 -aI206 -aI-652 -aa(lp22178 -g15 -aI229 -aI-606 -aI214 -aI-628 -aI220 -aI-616 -aa(lp22179 -g15 -aI263 -aI-578 -aI237 -aI-596 -aI249 -aI-587 -aa(lp22180 -g15 -aI317 -aI-555 -aI277 -aI-570 -aI295 -aI-562 -aa(lp22181 -g20 -aI317 -aI-795 -aa(lp22182 -g15 -aI232 -aI-756 -aI278 -aI-788 -aI250 -aI-775 -aa(lp22183 -g15 -aI205 -aI-682 -aI214 -aI-737 -aI205 -aI-712 -aa(lp22184 -g10 -aa(lp22185 -g8 -aI734 -aI0 -aa(lp22186 -g10 -aa(lp22187 -g8 -aI734 -aI0 -aasV( -(lp22188 -(lp22189 -g8 -aI53 -aI-364 -aa(lp22190 -g15 -aI65 -aI-525 -aI53 -aI-419 -aI57 -aI-472 -aa(lp22191 -g15 -aI100 -aI-678 -aI72 -aI-577 -aI84 -aI-629 -aa(lp22192 -g15 -aI161 -aI-822 -aI116 -aI-728 -aI137 -aI-776 -aa(lp22193 -g15 -aI249 -aI-951 -aI186 -aI-867 -aI215 -aI-911 -aa(lp22194 -g20 -aI361 -aI-951 -aa(lp22195 -g15 -aI222 -aI-675 -aI300 -aI-867 -aI254 -aI-775 -aa(lp22196 -g15 -aI175 -aI-366 -aI191 -aI-575 -aI175 -aI-471 -aa(lp22197 -g15 -aI187 -aI-211 -aI175 -aI-314 -aI179 -aI-263 -aa(lp22198 -g15 -aI222 -aI-61 -aI195 -aI-160 -aI207 -aI-110 -aa(lp22199 -g15 -aI280 -aI81 -aI238 -aI-12 -aI257 -aI35 -aa(lp22200 -g15 -aI360 -aI211 -aI303 -aI127 -aI330 -aI170 -aa(lp22201 -g20 -aI249 -aI211 -aa(lp22202 -g15 -aI161 -aI85 -aI215 -aI172 -aI186 -aI130 -aa(lp22203 -g15 -aI100 -aI-54 -aI137 -aI41 -aI116 -aI-5 -aa(lp22204 -g15 -aI65 -aI-205 -aI84 -aI-103 -aI72 -aI-153 -aa(lp22205 -g15 -aI53 -aI-364 -aI57 -aI-258 -aI53 -aI-310 -aa(lp22206 -g10 -aa(lp22207 -g8 -aI401 -aI0 -aa(lp22208 -g10 -aa(lp22209 -g8 -aI401 -aI0 -aasV, -(lp22210 -(lp22211 -g8 -aI235 -aI-154 -aa(lp22212 -g20 -aI245 -aI-139 -aa(lp22213 -g15 -aI223 -aI-64 -aI239 -aI-116 -aI232 -aI-91 -aa(lp22214 -g15 -aI195 -aI15 -aI215 -aI-38 -aI205 -aI-11 -aa(lp22215 -g15 -aI163 -aI95 -aI185 -aI42 -aI174 -aI69 -aa(lp22216 -g15 -aI130 -aI172 -aI152 -aI122 -aI141 -aI148 -aa(lp22217 -g20 -aI41 -aI172 -aa(lp22218 -g15 -aI60 -aI89 -aI47 -aI145 -aI53 -aI118 -aa(lp22219 -g15 -aI78 -aI4 -aI66 -aI60 -aI72 -aI32 -aa(lp22220 -g15 -aI94 -aI-79 -aI84 -aI-24 -aI89 -aI-52 -aa(lp22221 -g15 -aI106 -aI-154 -aI99 -aI-106 -aI103 -aI-131 -aa(lp22222 -g10 -aa(lp22223 -g8 -aI333 -aI0 -aa(lp22224 -g10 -aa(lp22225 -g8 -aI333 -aI0 -aasV0 -(lp22226 -(lp22227 -g8 -aI671 -aI-476 -aa(lp22228 -g15 -aI655 -aI-270 -aI671 -aI-399 -aI666 -aI-331 -aa(lp22229 -g15 -aI601 -aI-116 -aI644 -aI-209 -aI626 -aI-158 -aa(lp22230 -g15 -aI507 -aI-19 -aI577 -aI-73 -aI545 -aI-41 -aa(lp22231 -g15 -aI366 -aI13 -aI468 -aI2 -aI421 -aI13 -aa(lp22232 -g15 -aI232 -aI-19 -aI315 -aI13 -aI270 -aI2 -aa(lp22233 -g15 -aI138 -aI-116 -aI194 -aI-41 -aI163 -aI-73 -aa(lp22234 -g15 -aI82 -aI-270 -aI113 -aI-158 -aI94 -aI-209 -aa(lp22235 -g15 -aI63 -aI-476 -aI69 -aI-331 -aI63 -aI-399 -aa(lp22236 -g15 -aI80 -aI-683 -aI63 -aI-553 -aI69 -aI-622 -aa(lp22237 -g15 -aI133 -aI-837 -aI91 -aI-743 -aI109 -aI-795 -aa(lp22238 -g15 -aI226 -aI-933 -aI157 -aI-878 -aI188 -aI-911 -aa(lp22239 -g15 -aI366 -aI-966 -aI265 -aI-955 -aI311 -aI-966 -aa(lp22240 -g15 -aI501 -aI-933 -aI418 -aI-966 -aI463 -aI-955 -aa(lp22241 -g15 -aI596 -aI-837 -aI539 -aI-911 -aI571 -aI-879 -aa(lp22242 -g15 -aI652 -aI-683 -aI621 -aI-795 -aI640 -aI-744 -aa(lp22243 -g15 -aI671 -aI-476 -aI665 -aI-623 -aI671 -aI-554 -aa(lp22244 -g10 -aa(lp22245 -g8 -aI184 -aI-476 -aa(lp22246 -g15 -aI194 -aI-306 -aI184 -aI-411 -aI187 -aI-354 -aa(lp22247 -g15 -aI225 -aI-184 -aI200 -aI-257 -aI210 -aI-217 -aa(lp22248 -g15 -aI281 -aI-111 -aI239 -aI-152 -aI258 -aI-128 -aa(lp22249 -g15 -aI366 -aI-87 -aI304 -aI-95 -aI333 -aI-87 -aa(lp22250 -g15 -aI451 -aI-111 -aI399 -aI-87 -aI428 -aI-95 -aa(lp22251 -g15 -aI509 -aI-183 -aI475 -aI-127 -aI494 -aI-151 -aa(lp22252 -g15 -aI541 -aI-305 -aI524 -aI-215 -aI535 -aI-256 -aa(lp22253 -g15 -aI552 -aI-476 -aI548 -aI-354 -aI552 -aI-411 -aa(lp22254 -g15 -aI541 -aI-647 -aI552 -aI-541 -aI548 -aI-598 -aa(lp22255 -g15 -aI509 -aI-768 -aI535 -aI-695 -aI524 -aI-736 -aa(lp22256 -g15 -aI451 -aI-840 -aI494 -aI-800 -aI475 -aI-824 -aa(lp22257 -g15 -aI366 -aI-864 -aI428 -aI-856 -aI399 -aI-864 -aa(lp22258 -g15 -aI281 -aI-840 -aI333 -aI-864 -aI304 -aI-856 -aa(lp22259 -g15 -aI225 -aI-768 -aI258 -aI-824 -aI239 -aI-800 -aa(lp22260 -g15 -aI194 -aI-647 -aI210 -aI-736 -aI200 -aI-695 -aa(lp22261 -g15 -aI184 -aI-476 -aI187 -aI-598 -aI184 -aI-541 -aa(lp22262 -g10 -aa(lp22263 -g8 -aI734 -aI0 -aa(lp22264 -g10 -aa(lp22265 -g8 -aI734 -aI0 -aasV4 -(lp22266 -(lp22267 -g8 -aI707 -aI-213 -aa(lp22268 -g20 -aI569 -aI-213 -aa(lp22269 -g20 -aI569 -aI0 -aa(lp22270 -g20 -aI454 -aI0 -aa(lp22271 -g20 -aI454 -aI-213 -aa(lp22272 -g20 -aI14 -aI-213 -aa(lp22273 -g20 -aI14 -aI-316 -aa(lp22274 -g20 -aI446 -aI-956 -aa(lp22275 -g20 -aI569 -aI-956 -aa(lp22276 -g20 -aI569 -aI-321 -aa(lp22277 -g20 -aI707 -aI-321 -aa(lp22278 -g10 -aa(lp22279 -g8 -aI454 -aI-321 -aa(lp22280 -g20 -aI454 -aI-552 -aa(lp22281 -g15 -aI455 -aI-629 -aI454 -aI-577 -aI454 -aI-602 -aa(lp22282 -g15 -aI457 -aI-707 -aI456 -aI-656 -aI456 -aI-682 -aa(lp22283 -g15 -aI460 -aI-778 -aI458 -aI-732 -aI459 -aI-756 -aa(lp22284 -g15 -aI462 -aI-834 -aI461 -aI-800 -aI462 -aI-819 -aa(lp22285 -g20 -aI457 -aI-834 -aa(lp22286 -g15 -aI445 -aI-805 -aI453 -aI-825 -aI450 -aI-815 -aa(lp22287 -g15 -aI430 -aI-773 -aI441 -aI-794 -aI436 -aI-783 -aa(lp22288 -g15 -aI414 -aI-742 -aI425 -aI-762 -aI419 -aI-752 -aa(lp22289 -g15 -aI398 -aI-716 -aI408 -aI-732 -aI403 -aI-723 -aa(lp22290 -g20 -aI130 -aI-321 -aa(lp22291 -g10 -aa(lp22292 -g8 -aI734 -aI0 -aa(lp22293 -g10 -aa(lp22294 -g8 -aI734 -aI0 -aasV8 -(lp22295 -(lp22296 -g8 -aI367 -aI-966 -aa(lp22297 -g15 -aI471 -aI-952 -aI404 -aI-966 -aI438 -aI-961 -aa(lp22298 -g15 -aI556 -aI-909 -aI503 -aI-942 -aI531 -aI-928 -aa(lp22299 -g15 -aI614 -aI-837 -aI580 -aI-889 -aI600 -aI-866 -aa(lp22300 -g15 -aI636 -aI-737 -aI628 -aI-808 -aI636 -aI-775 -aa(lp22301 -g15 -aI623 -aI-658 -aI636 -aI-708 -aI631 -aI-681 -aa(lp22302 -g15 -aI587 -aI-594 -aI614 -aI-634 -aI602 -aI-613 -aa(lp22303 -g15 -aI533 -aI-544 -aI572 -aI-576 -aI554 -aI-559 -aa(lp22304 -g15 -aI465 -aI-503 -aI512 -aI-529 -aI489 -aI-515 -aa(lp22305 -g15 -aI539 -aI-458 -aI490 -aI-489 -aI515 -aI-475 -aa(lp22306 -g15 -aI603 -aI-402 -aI563 -aI-442 -aI584 -aI-423 -aa(lp22307 -g15 -aI649 -aI-333 -aI622 -aI-382 -aI637 -aI-359 -aa(lp22308 -g15 -aI666 -aI-247 -aI660 -aI-307 -aI666 -aI-279 -aa(lp22309 -g15 -aI644 -aI-139 -aI666 -aI-207 -aI659 -aI-171 -aa(lp22310 -g15 -aI583 -aI-56 -aI630 -aI-106 -aI609 -aI-79 -aa(lp22311 -g15 -aI489 -aI-4 -aI557 -aI-34 -aI525 -aI-16 -aa(lp22312 -g15 -aI367 -aI13 -aI452 -aI7 -aI412 -aI13 -aa(lp22313 -g15 -aI240 -aI-4 -aI320 -aI13 -aI277 -aI7 -aa(lp22314 -g15 -aI146 -aI-54 -aI203 -aI-15 -aI172 -aI-32 -aa(lp22315 -g15 -aI88 -aI-134 -aI121 -aI-76 -aI102 -aI-103 -aa(lp22316 -g15 -aI69 -aI-242 -aI75 -aI-166 -aI69 -aI-202 -aa(lp22317 -g15 -aI83 -aI-330 -aI69 -aI-274 -aI73 -aI-304 -aa(lp22318 -g15 -aI123 -aI-400 -aI93 -aI-356 -aI106 -aI-379 -aa(lp22319 -g15 -aI181 -aI-455 -aI139 -aI-421 -aI159 -aI-439 -aa(lp22320 -g15 -aI253 -aI-498 -aI204 -aI-471 -aI228 -aI-486 -aa(lp22321 -g15 -aI193 -aI-542 -aI231 -aI-511 -aI212 -aI-526 -aa(lp22322 -g15 -aI144 -aI-595 -aI174 -aI-558 -aI158 -aI-575 -aa(lp22323 -g15 -aI112 -aI-660 -aI131 -aI-614 -aI120 -aI-636 -aa(lp22324 -g15 -aI100 -aI-738 -aI104 -aI-683 -aI100 -aI-709 -aa(lp22325 -g15 -aI122 -aI-837 -aI100 -aI-776 -aI107 -aI-809 -aa(lp22326 -g15 -aI180 -aI-909 -aI136 -aI-866 -aI156 -aI-889 -aa(lp22327 -g15 -aI266 -aI-952 -aI205 -aI-928 -aI234 -aI-942 -aa(lp22328 -g15 -aI367 -aI-966 -aI298 -aI-961 -aI332 -aI-966 -aa(lp22329 -g10 -aa(lp22330 -g8 -aI185 -aI-241 -aa(lp22331 -g15 -aI195 -aI-177 -aI185 -aI-218 -aI189 -aI-196 -aa(lp22332 -g15 -aI228 -aI-128 -aI202 -aI-158 -aI213 -aI-141 -aa(lp22333 -g15 -aI284 -aI-96 -aI243 -aI-114 -aI261 -aI-103 -aa(lp22334 -g15 -aI365 -aI-84 -aI307 -aI-88 -aI333 -aI-84 -aa(lp22335 -g15 -aI445 -aI-96 -aI395 -aI-84 -aI422 -aI-88 -aa(lp22336 -g15 -aI503 -aI-128 -aI468 -aI-103 -aI488 -aI-114 -aa(lp22337 -g15 -aI539 -aI-179 -aI519 -aI-142 -aI531 -aI-159 -aa(lp22338 -g15 -aI550 -aI-246 -aI546 -aI-199 -aI550 -aI-221 -aa(lp22339 -g15 -aI538 -aI-307 -aI550 -aI-268 -aI546 -aI-289 -aa(lp22340 -g15 -aI501 -aI-358 -aI529 -aI-325 -aI517 -aI-342 -aa(lp22341 -g15 -aI444 -aI-402 -aI485 -aI-373 -aI466 -aI-388 -aa(lp22342 -g15 -aI370 -aI-443 -aI422 -aI-416 -aI397 -aI-430 -aa(lp22343 -g20 -aI350 -aI-452 -aa(lp22344 -g15 -aI227 -aI-363 -aI296 -aI-426 -aI254 -aI-396 -aa(lp22345 -g15 -aI185 -aI-241 -aI199 -aI-329 -aI185 -aI-288 -aa(lp22346 -g10 -aa(lp22347 -g8 -aI366 -aI-867 -aa(lp22348 -g15 -aI256 -aI-832 -aI320 -aI-867 -aI283 -aI-855 -aa(lp22349 -g15 -aI216 -aI-732 -aI229 -aI-809 -aI216 -aI-776 -aa(lp22350 -g15 -aI227 -aI-668 -aI216 -aI-707 -aI219 -aI-686 -aa(lp22351 -g15 -aI259 -aI-621 -aI235 -aI-651 -aI245 -aI-635 -aa(lp22352 -g15 -aI307 -aI-583 -aI272 -aI-607 -aI288 -aI-594 -aa(lp22353 -g15 -aI369 -aI-551 -aI326 -aI-572 -aI347 -aI-562 -aa(lp22354 -g15 -aI428 -aI-582 -aI389 -aI-561 -aI409 -aI-571 -aa(lp22355 -g15 -aI476 -aI-621 -aI446 -aI-594 -aI462 -aI-606 -aa(lp22356 -g15 -aI508 -aI-670 -aI489 -aI-635 -aI500 -aI-651 -aa(lp22357 -g15 -aI520 -aI-732 -aI516 -aI-688 -aI520 -aI-709 -aa(lp22358 -g15 -aI479 -aI-832 -aI520 -aI-776 -aI506 -aI-809 -aa(lp22359 -g15 -aI366 -aI-867 -aI451 -aI-855 -aI414 -aI-867 -aa(lp22360 -g10 -aa(lp22361 -g8 -aI734 -aI0 -aa(lp22362 -g10 -aa(lp22363 -g8 -aI734 -aI0 -aasV< -(lp22364 -(lp22365 -g8 -aI667 -aI-154 -aa(lp22366 -g20 -aI66 -aI-430 -aa(lp22367 -g20 -aI66 -aI-496 -aa(lp22368 -g20 -aI667 -aI-810 -aa(lp22369 -g20 -aI667 -aI-705 -aa(lp22370 -g20 -aI189 -aI-468 -aa(lp22371 -g20 -aI667 -aI-259 -aa(lp22372 -g10 -aa(lp22373 -g8 -aI734 -aI0 -aa(lp22374 -g10 -aa(lp22375 -g8 -aI734 -aI0 -aasV@ -(lp22376 -(lp22377 -g8 -aI1083 -aI-475 -aa(lp22378 -g15 -aI1077 -aI-394 -aI1083 -aI-448 -aI1081 -aI-421 -aa(lp22379 -g15 -aI1059 -aI-316 -aI1073 -aI-367 -aI1067 -aI-341 -aa(lp22380 -g15 -aI1028 -aI-248 -aI1051 -aI-292 -aI1041 -aI-269 -aa(lp22381 -g15 -aI985 -aI-193 -aI1016 -aI-227 -aI1002 -aI-209 -aa(lp22382 -g15 -aI929 -aI-156 -aI969 -aI-177 -aI950 -aI-165 -aa(lp22383 -g15 -aI860 -aI-143 -aI908 -aI-147 -aI885 -aI-143 -aa(lp22384 -g15 -aI806 -aI-153 -aI840 -aI-143 -aI822 -aI-146 -aa(lp22385 -g15 -aI766 -aI-179 -aI791 -aI-159 -aI777 -aI-168 -aa(lp22386 -g15 -aI738 -aI-216 -aI754 -aI-190 -aI745 -aI-202 -aa(lp22387 -g15 -aI723 -aI-260 -aI731 -aI-230 -aI726 -aI-245 -aa(lp22388 -g20 -aI721 -aI-260 -aa(lp22389 -g15 -aI692 -aI-215 -aI713 -aI-244 -aI703 -aI-229 -aa(lp22390 -g15 -aI651 -aI-177 -aI680 -aI-200 -aI666 -aI-188 -aa(lp22391 -g15 -aI599 -aI-152 -aI635 -aI-166 -aI618 -aI-158 -aa(lp22392 -g15 -aI535 -aI-143 -aI579 -aI-146 -aI558 -aI-143 -aa(lp22393 -g15 -aI446 -aI-161 -aI502 -aI-143 -aI472 -aI-149 -aa(lp22394 -g15 -aI381 -aI-212 -aI421 -aI-173 -aI399 -aI-190 -aa(lp22395 -g15 -aI340 -aI-291 -aI363 -aI-234 -aI350 -aI-261 -aa(lp22396 -g15 -aI326 -aI-394 -aI331 -aI-322 -aI326 -aI-356 -aa(lp22397 -g15 -aI346 -aI-514 -aI326 -aI-437 -aI333 -aI-478 -aa(lp22398 -g15 -aI401 -aI-608 -aI358 -aI-550 -aI377 -aI-582 -aa(lp22399 -g15 -aI488 -aI-670 -aI425 -aI-635 -aI454 -aI-656 -aa(lp22400 -g15 -aI604 -aI-692 -aI523 -aI-685 -aI561 -aI-692 -aa(lp22401 -g15 -aI662 -aI-690 -aI623 -aI-692 -aI643 -aI-692 -aa(lp22402 -g15 -aI718 -aI-683 -aI682 -aI-688 -aI700 -aI-686 -aa(lp22403 -g15 -aI767 -aI-673 -aI736 -aI-680 -aI752 -aI-676 -aa(lp22404 -g15 -aI805 -aI-662 -aI782 -aI-669 -aI795 -aI-665 -aa(lp22405 -g20 -aI790 -aI-391 -aa(lp22406 -g15 -aI789 -aI-368 -aI789 -aI-381 -aI789 -aI-374 -aa(lp22407 -g15 -aI789 -aI-354 -aI789 -aI-362 -aI789 -aI-357 -aa(lp22408 -g15 -aI789 -aI-346 -aI789 -aI-350 -aI789 -aI-348 -aa(lp22409 -g15 -aI789 -aI-341 -aI789 -aI-344 -aI789 -aI-343 -aa(lp22410 -g15 -aI795 -aI-285 -aI789 -aI-318 -aI791 -aI-300 -aa(lp22411 -g15 -aI813 -aI-250 -aI800 -aI-270 -aI806 -aI-258 -aa(lp22412 -g15 -aI838 -aI-232 -aI821 -aI-241 -aI829 -aI-235 -aa(lp22413 -g15 -aI867 -aI-227 -aI848 -aI-229 -aI857 -aI-227 -aa(lp22414 -g15 -aI920 -aI-247 -aI887 -aI-227 -aI905 -aI-234 -aa(lp22415 -g15 -aI958 -aI-300 -aI935 -aI-260 -aI948 -aI-278 -aa(lp22416 -g15 -aI981 -aI-380 -aI968 -aI-323 -aI976 -aI-350 -aa(lp22417 -g15 -aI989 -aI-476 -aI986 -aI-410 -aI989 -aI-442 -aa(lp22418 -g15 -aI961 -aI-641 -aI989 -aI-538 -aI980 -aI-593 -aa(lp22419 -g15 -aI884 -aI-762 -aI942 -aI-689 -aI917 -aI-729 -aa(lp22420 -g15 -aI766 -aI-837 -aI851 -aI-795 -aI811 -aI-820 -aa(lp22421 -g15 -aI618 -aI-863 -aI721 -aI-854 -aI671 -aI-863 -aa(lp22422 -g15 -aI424 -aI-827 -aI545 -aI-863 -aI480 -aI-851 -aa(lp22423 -g15 -aI283 -aI-726 -aI368 -aI-803 -aI321 -aI-769 -aa(lp22424 -g15 -aI197 -aI-572 -aI245 -aI-683 -aI216 -aI-632 -aa(lp22425 -g15 -aI167 -aI-378 -aI177 -aI-513 -aI167 -aI-448 -aa(lp22426 -g15 -aI193 -aI-203 -aI167 -aI-312 -aI176 -aI-254 -aa(lp22427 -g15 -aI269 -aI-75 -aI210 -aI-153 -aI236 -aI-110 -aa(lp22428 -g15 -aI392 -aI3 -aI302 -aI-40 -aI343 -aI-14 -aa(lp22429 -g15 -aI562 -aI29 -aI442 -aI20 -aI498 -aI29 -aa(lp22430 -g15 -aI640 -aI25 -aI588 -aI29 -aI615 -aI28 -aa(lp22431 -g15 -aI715 -aI12 -aI666 -aI22 -aI691 -aI18 -aa(lp22432 -g15 -aI784 -aI-5 -aI739 -aI7 -aI762 -aI1 -aa(lp22433 -g15 -aI845 -aI-26 -aI806 -aI-11 -aI826 -aI-18 -aa(lp22434 -g20 -aI845 -aI65 -aa(lp22435 -g15 -aI718 -aI104 -aI807 -aI82 -aI765 -aI95 -aa(lp22436 -g15 -aI563 -aI118 -aI671 -aI114 -aI620 -aI118 -aa(lp22437 -g15 -aI355 -aI85 -aI486 -aI118 -aI416 -aI107 -aa(lp22438 -g15 -aI200 -aI-10 -aI294 -aI63 -aI243 -aI31 -aa(lp22439 -g15 -aI104 -aI-165 -aI158 -aI-53 -aI126 -aI-104 -aa(lp22440 -g15 -aI70 -aI-373 -aI82 -aI-226 -aI70 -aI-296 -aa(lp22441 -g15 -aI109 -aI-602 -aI70 -aI-455 -aI83 -aI-531 -aa(lp22442 -g15 -aI219 -aI-785 -aI134 -aI-672 -aI171 -aI-733 -aa(lp22443 -g15 -aI391 -aI-907 -aI266 -aI-837 -aI324 -aI-877 -aa(lp22444 -g15 -aI618 -aI-951 -aI459 -aI-936 -aI534 -aI-951 -aa(lp22445 -g15 -aI805 -aI-918 -aI686 -aI-951 -aI748 -aI-940 -aa(lp22446 -g15 -aI952 -aI-824 -aI862 -aI-896 -aI911 -aI-865 -aa(lp22447 -g15 -aI1049 -aI-674 -aI994 -aI-783 -aI1026 -aI-733 -aa(lp22448 -g15 -aI1083 -aI-475 -aI1072 -aI-615 -aI1083 -aI-549 -aa(lp22449 -g10 -aa(lp22450 -g8 -aI430 -aI-391 -aa(lp22451 -g15 -aI463 -aI-266 -aI430 -aI-333 -aI441 -aI-291 -aa(lp22452 -g15 -aI552 -aI-227 -aI485 -aI-240 -aI515 -aI-227 -aa(lp22453 -g15 -aI613 -aI-242 -aI575 -aI-227 -aI596 -aI-232 -aa(lp22454 -g15 -aI654 -aI-283 -aI630 -aI-251 -aI644 -aI-265 -aa(lp22455 -g15 -aI679 -aI-348 -aI665 -aI-301 -aI674 -aI-323 -aa(lp22456 -g15 -aI690 -aI-430 -aI685 -aI-373 -aI689 -aI-400 -aa(lp22457 -g20 -aI699 -aI-595 -aa(lp22458 -g15 -aI656 -aI-604 -aI687 -aI-598 -aI673 -aI-601 -aa(lp22459 -g15 -aI604 -aI-608 -aI639 -aI-607 -aI622 -aI-608 -aa(lp22460 -g15 -aI523 -aI-590 -aI572 -aI-608 -aI545 -aI-602 -aa(lp22461 -g15 -aI469 -aI-540 -aI501 -aI-577 -aI483 -aI-560 -aa(lp22462 -g15 -aI440 -aI-470 -aI456 -aI-520 -aI446 -aI-496 -aa(lp22463 -g15 -aI430 -aI-391 -aI434 -aI-444 -aI430 -aI-418 -aa(lp22464 -g10 -aa(lp22465 -g8 -aI1154 -aI0 -aa(lp22466 -g10 -aa(lp22467 -g8 -aI1154 -aI0 -aasVD -(lp22468 -(lp22469 -g8 -aI830 -aI-484 -aa(lp22470 -g15 -aI799 -aI-273 -aI830 -aI-404 -aI820 -aI-333 -aa(lp22471 -g15 -aI708 -aI-121 -aI778 -aI-212 -aI748 -aI-162 -aa(lp22472 -g15 -aI563 -aI-30 -aI669 -aI-81 -aI620 -aI-50 -aa(lp22473 -g15 -aI367 -aI0 -aI505 -aI-9 -aI440 -aI0 -aa(lp22474 -g20 -aI129 -aI0 -aa(lp22475 -g20 -aI129 -aI-951 -aa(lp22476 -g20 -aI394 -aI-951 -aa(lp22477 -g15 -aI574 -aI-921 -aI460 -aI-951 -aI521 -aI-941 -aa(lp22478 -g15 -aI712 -aI-832 -aI628 -aI-901 -aI674 -aI-871 -aa(lp22479 -g15 -aI799 -aI-686 -aI750 -aI-793 -aI779 -aI-744 -aa(lp22480 -g15 -aI830 -aI-484 -aI820 -aI-628 -aI830 -aI-560 -aa(lp22481 -g10 -aa(lp22482 -g8 -aI702 -aI-480 -aa(lp22483 -g15 -aI680 -aI-645 -aI702 -aI-544 -aI695 -aI-598 -aa(lp22484 -g15 -aI618 -aI-759 -aI666 -aI-691 -aI645 -aI-729 -aa(lp22485 -g15 -aI517 -aI-826 -aI591 -aI-789 -aI557 -aI-811 -aa(lp22486 -g15 -aI381 -aI-847 -aI477 -aI-840 -aI432 -aI-847 -aa(lp22487 -g20 -aI250 -aI-847 -aa(lp22488 -g20 -aI250 -aI-103 -aa(lp22489 -g20 -aI356 -aI-103 -aa(lp22490 -g15 -aI615 -aI-198 -aI470 -aI-103 -aI557 -aI-135 -aa(lp22491 -g15 -aI702 -aI-480 -aI673 -aI-262 -aI702 -aI-356 -aa(lp22492 -g10 -aa(lp22493 -g8 -aI912 -aI0 -aa(lp22494 -g10 -aa(lp22495 -g8 -aI912 -aI0 -aasVH -(lp22496 -(lp22497 -g8 -aI805 -aI0 -aa(lp22498 -g20 -aI684 -aI0 -aa(lp22499 -g20 -aI684 -aI-443 -aa(lp22500 -g20 -aI250 -aI-443 -aa(lp22501 -g20 -aI250 -aI0 -aa(lp22502 -g20 -aI129 -aI0 -aa(lp22503 -g20 -aI129 -aI-951 -aa(lp22504 -g20 -aI250 -aI-951 -aa(lp22505 -g20 -aI250 -aI-550 -aa(lp22506 -g20 -aI684 -aI-550 -aa(lp22507 -g20 -aI684 -aI-951 -aa(lp22508 -g20 -aI805 -aI-951 -aa(lp22509 -g10 -aa(lp22510 -g8 -aI934 -aI0 -aa(lp22511 -g10 -aa(lp22512 -g8 -aI934 -aI0 -aasVL -(lp22513 -(lp22514 -g8 -aI129 -aI0 -aa(lp22515 -g20 -aI129 -aI-951 -aa(lp22516 -g20 -aI250 -aI-951 -aa(lp22517 -g20 -aI250 -aI-107 -aa(lp22518 -g20 -aI623 -aI-107 -aa(lp22519 -g20 -aI623 -aI0 -aa(lp22520 -g10 -aa(lp22521 -g8 -aI654 -aI0 -aa(lp22522 -g10 -aa(lp22523 -g8 -aI654 -aI0 -aasVP -(lp22524 -(lp22525 -g8 -aI699 -aI-672 -aa(lp22526 -g15 -aI681 -aI-558 -aI699 -aI-633 -aI693 -aI-595 -aa(lp22527 -g15 -aI623 -aI-462 -aI670 -aI-522 -aI650 -aI-490 -aa(lp22528 -g15 -aI514 -aI-395 -aI595 -aI-434 -aI559 -aI-411 -aa(lp22529 -g15 -aI348 -aI-369 -aI469 -aI-378 -aI414 -aI-369 -aa(lp22530 -g20 -aI250 -aI-369 -aa(lp22531 -g20 -aI250 -aI0 -aa(lp22532 -g20 -aI129 -aI0 -aa(lp22533 -g20 -aI129 -aI-951 -aa(lp22534 -g20 -aI365 -aI-951 -aa(lp22535 -g15 -aI515 -aI-932 -aI423 -aI-951 -aI473 -aI-945 -aa(lp22536 -g15 -aI619 -aI-878 -aI557 -aI-920 -aI592 -aI-902 -aa(lp22537 -g15 -aI680 -aI-791 -aI647 -aI-855 -aI667 -aI-825 -aa(lp22538 -g15 -aI699 -aI-672 -aI693 -aI-756 -aI699 -aI-716 -aa(lp22539 -g10 -aa(lp22540 -g8 -aI250 -aI-472 -aa(lp22541 -g20 -aI334 -aI-472 -aa(lp22542 -g15 -aI440 -aI-483 -aI375 -aI-472 -aI410 -aI-476 -aa(lp22543 -g15 -aI515 -aI-516 -aI470 -aI-490 -aI495 -aI-501 -aa(lp22544 -g15 -aI559 -aI-576 -aI535 -aI-532 -aI549 -aI-552 -aa(lp22545 -g15 -aI574 -aI-666 -aI569 -aI-601 -aI574 -aI-631 -aa(lp22546 -g15 -aI521 -aI-803 -aI574 -aI-727 -aI557 -aI-773 -aa(lp22547 -g15 -aI354 -aI-847 -aI485 -aI-832 -aI430 -aI-847 -aa(lp22548 -g20 -aI250 -aI-847 -aa(lp22549 -g10 -aa(lp22550 -g8 -aI768 -aI0 -aa(lp22551 -g10 -aa(lp22552 -g8 -aI768 -aI0 -aasVT -(lp22553 -(lp22554 -g8 -aI406 -aI0 -aa(lp22555 -g20 -aI285 -aI0 -aa(lp22556 -g20 -aI285 -aI-844 -aa(lp22557 -g20 -aI13 -aI-844 -aa(lp22558 -g20 -aI13 -aI-951 -aa(lp22559 -g20 -aI678 -aI-951 -aa(lp22560 -g20 -aI678 -aI-844 -aa(lp22561 -g20 -aI406 -aI-844 -aa(lp22562 -g10 -aa(lp22563 -g8 -aI692 -aI0 -aa(lp22564 -g10 -aa(lp22565 -g8 -aI692 -aI0 -aasVX -(lp22566 -(lp22567 -g8 -aI729 -aI0 -aa(lp22568 -g20 -aI591 -aI0 -aa(lp22569 -g20 -aI361 -aI-412 -aa(lp22570 -g20 -aI122 -aI0 -aa(lp22571 -g20 -aI0 -aI0 -aa(lp22572 -g20 -aI294 -aI-496 -aa(lp22573 -g20 -aI20 -aI-951 -aa(lp22574 -g20 -aI149 -aI-951 -aa(lp22575 -g20 -aI365 -aI-587 -aa(lp22576 -g20 -aI582 -aI-951 -aa(lp22577 -g20 -aI706 -aI-951 -aa(lp22578 -g20 -aI432 -aI-500 -aa(lp22579 -g10 -aa(lp22580 -g8 -aI729 -aI0 -aa(lp22581 -g10 -aa(lp22582 -g8 -aI729 -aI0 -aasV\u005C -(lp22583 -(lp22584 -g8 -aI130 -aI-951 -aa(lp22585 -g20 -aI485 -aI0 -aa(lp22586 -g20 -aI369 -aI0 -aa(lp22587 -g20 -aI14 -aI-951 -aa(lp22588 -g10 -aa(lp22589 -g8 -aI497 -aI0 -aa(lp22590 -g10 -aa(lp22591 -g8 -aI497 -aI0 -aasV` -(lp22592 -(lp22593 -g8 -aI511 -aI-807 -aa(lp22594 -g20 -aI433 -aI-807 -aa(lp22595 -g15 -aI384 -aI-852 -aI418 -aI-819 -aI401 -aI-834 -aa(lp22596 -g15 -aI332 -aI-908 -aI366 -aI-870 -aI349 -aI-889 -aa(lp22597 -g15 -aI286 -aI-963 -aI315 -aI-927 -aI300 -aI-945 -aa(lp22598 -g15 -aI255 -aI-1007 -aI273 -aI-980 -aI262 -aI-995 -aa(lp22599 -g20 -aI255 -aI-1021 -aa(lp22600 -g20 -aI398 -aI-1021 -aa(lp22601 -g15 -aI422 -aI-972 -aI405 -aI-1006 -aI413 -aI-990 -aa(lp22602 -g15 -aI451 -aI-919 -aI432 -aI-954 -aI441 -aI-937 -aa(lp22603 -g15 -aI482 -aI-868 -aI461 -aI-902 -aI472 -aI-885 -aa(lp22604 -g15 -aI511 -aI-825 -aI492 -aI-852 -aI502 -aI-837 -aa(lp22605 -g10 -aa(lp22606 -g8 -aI769 -aI0 -aa(lp22607 -g10 -aa(lp22608 -g8 -aI769 -aI0 -aasVd -(lp22609 -(lp22610 -g8 -aI554 -aI-95 -aa(lp22611 -g20 -aI549 -aI-95 -aa(lp22612 -g15 -aI515 -aI-53 -aI539 -aI-80 -aI528 -aI-66 -aa(lp22613 -g15 -aI471 -aI-18 -aI503 -aI-40 -aI488 -aI-28 -aa(lp22614 -g15 -aI415 -aI5 -aI454 -aI-8 -aI436 -aI0 -aa(lp22615 -g15 -aI345 -aI13 -aI394 -aI10 -aI371 -aI13 -aa(lp22616 -g15 -aI234 -aI-9 -aI304 -aI13 -aI267 -aI5 -aa(lp22617 -g15 -aI148 -aI-79 -aI200 -aI-25 -aI172 -aI-48 -aa(lp22618 -g15 -aI93 -aI-195 -aI124 -aI-110 -aI106 -aI-149 -aa(lp22619 -g15 -aI73 -aI-355 -aI80 -aI-241 -aI73 -aI-294 -aa(lp22620 -g15 -aI93 -aI-516 -aI73 -aI-416 -aI80 -aI-470 -aa(lp22621 -g15 -aI148 -aI-633 -aI106 -aI-563 -aI124 -aI-601 -aa(lp22622 -g15 -aI234 -aI-703 -aI172 -aI-664 -aI200 -aI-687 -aa(lp22623 -g15 -aI345 -aI-727 -aI267 -aI-719 -aI304 -aI-727 -aa(lp22624 -g15 -aI414 -aI-718 -aI370 -aI-727 -aI393 -aI-724 -aa(lp22625 -g15 -aI471 -aI-696 -aI435 -aI-713 -aI454 -aI-705 -aa(lp22626 -g15 -aI515 -aI-662 -aI487 -aI-686 -aI502 -aI-675 -aa(lp22627 -g15 -aI549 -aI-623 -aI528 -aI-650 -aI539 -aI-637 -aa(lp22628 -g20 -aI557 -aI-623 -aa(lp22629 -g15 -aI553 -aI-665 -aI555 -aI-638 -aI554 -aI-652 -aa(lp22630 -g15 -aI550 -aI-700 -aI552 -aI-676 -aI551 -aI-688 -aa(lp22631 -g15 -aI549 -aI-728 -aI549 -aI-712 -aI549 -aI-721 -aa(lp22632 -g20 -aI549 -aI-1012 -aa(lp22633 -g20 -aI667 -aI-1012 -aa(lp22634 -g20 -aI667 -aI0 -aa(lp22635 -g20 -aI572 -aI0 -aa(lp22636 -g10 -aa(lp22637 -g8 -aI367 -aI-84 -aa(lp22638 -g15 -aI451 -aI-99 -aI400 -aI-84 -aI428 -aI-89 -aa(lp22639 -g15 -aI506 -aI-145 -aI474 -aI-109 -aI492 -aI-124 -aa(lp22640 -g15 -aI538 -aI-221 -aI520 -aI-165 -aI531 -aI-191 -aa(lp22641 -g15 -aI549 -aI-328 -aI544 -aI-252 -aI548 -aI-288 -aa(lp22642 -g20 -aI549 -aI-355 -aa(lp22643 -g15 -aI540 -aI-472 -aI549 -aI-399 -aI546 -aI-438 -aa(lp22644 -g15 -aI510 -aI-558 -aI534 -aI-506 -aI524 -aI-535 -aa(lp22645 -g15 -aI454 -aI-611 -aI496 -aI-581 -aI477 -aI-599 -aa(lp22646 -g15 -aI366 -aI-629 -aI430 -aI-623 -aI401 -aI-629 -aa(lp22647 -g15 -aI237 -aI-558 -aI307 -aI-629 -aI264 -aI-605 -aa(lp22648 -g15 -aI195 -aI-354 -aI209 -aI-510 -aI195 -aI-442 -aa(lp22649 -g15 -aI237 -aI-151 -aI195 -aI-263 -aI209 -aI-196 -aa(lp22650 -g15 -aI367 -aI-84 -aI264 -aI-107 -aI308 -aI-84 -aa(lp22651 -g10 -aa(lp22652 -g8 -aI781 -aI0 -aa(lp22653 -g10 -aa(lp22654 -g8 -aI781 -aI0 -aasVh -(lp22655 -(lp22656 -g8 -aI559 -aI0 -aa(lp22657 -g20 -aI559 -aI-459 -aa(lp22658 -g15 -aI525 -aI-586 -aI559 -aI-516 -aI548 -aI-558 -aa(lp22659 -g15 -aI418 -aI-629 -aI502 -aI-614 -aI467 -aI-629 -aa(lp22660 -g15 -aI330 -aI-612 -aI383 -aI-629 -aI353 -aI-623 -aa(lp22661 -g15 -aI272 -aI-562 -aI306 -aI-600 -aI287 -aI-584 -aa(lp22662 -g15 -aI241 -aI-480 -aI257 -aI-539 -aI247 -aI-512 -aa(lp22663 -g15 -aI231 -aI-369 -aI234 -aI-448 -aI231 -aI-411 -aa(lp22664 -g20 -aI231 -aI0 -aa(lp22665 -g20 -aI113 -aI0 -aa(lp22666 -g20 -aI113 -aI-1012 -aa(lp22667 -g20 -aI231 -aI-1012 -aa(lp22668 -g20 -aI231 -aI-711 -aa(lp22669 -g20 -aI226 -aI-618 -aa(lp22670 -g20 -aI233 -aI-618 -aa(lp22671 -g15 -aI271 -aI-666 -aI243 -aI-636 -aI256 -aI-652 -aa(lp22672 -g15 -aI320 -aI-700 -aI286 -aI-680 -aI303 -aI-691 -aa(lp22673 -g15 -aI377 -aI-720 -aI338 -aI-709 -aI357 -aI-716 -aa(lp22674 -g15 -aI438 -aI-727 -aI397 -aI-725 -aI417 -aI-727 -aa(lp22675 -g15 -aI618 -aI-665 -aI518 -aI-727 -aI578 -aI-706 -aa(lp22676 -g15 -aI678 -aI-466 -aI658 -aI-623 -aI678 -aI-557 -aa(lp22677 -g20 -aI678 -aI0 -aa(lp22678 -g10 -aa(lp22679 -g8 -aI785 -aI0 -aa(lp22680 -g10 -aa(lp22681 -g8 -aI785 -aI0 -aasVl -(lp22682 -(lp22683 -g8 -aI231 -aI0 -aa(lp22684 -g20 -aI113 -aI0 -aa(lp22685 -g20 -aI113 -aI-1012 -aa(lp22686 -g20 -aI231 -aI-1012 -aa(lp22687 -g10 -aa(lp22688 -g8 -aI345 -aI0 -aa(lp22689 -g10 -aa(lp22690 -g8 -aI345 -aI0 -aasVp -(lp22691 -(lp22692 -g8 -aI436 -aI13 -aa(lp22693 -g15 -aI366 -aI5 -aI410 -aI13 -aI387 -aI10 -aa(lp22694 -g15 -aI310 -aI-17 -aI345 -aI0 -aI326 -aI-8 -aa(lp22695 -g15 -aI265 -aI-50 -aI293 -aI-26 -aI278 -aI-37 -aa(lp22696 -g15 -aI231 -aI-90 -aI253 -aI-62 -aI241 -aI-76 -aa(lp22697 -g20 -aI223 -aI-90 -aa(lp22698 -g15 -aI227 -aI-47 -aI225 -aI-75 -aI226 -aI-61 -aa(lp22699 -g15 -aI230 -aI-12 -aI228 -aI-36 -aI229 -aI-24 -aa(lp22700 -g15 -aI231 -aI15 -aI231 -aI0 -aI231 -aI8 -aa(lp22701 -g20 -aI231 -aI320 -aa(lp22702 -g20 -aI113 -aI320 -aa(lp22703 -g20 -aI113 -aI-714 -aa(lp22704 -g20 -aI209 -aI-714 -aa(lp22705 -g20 -aI226 -aI-618 -aa(lp22706 -g20 -aI231 -aI-618 -aa(lp22707 -g15 -aI265 -aI-660 -aI241 -aI-633 -aI253 -aI-647 -aa(lp22708 -g15 -aI309 -aI-695 -aI278 -aI-673 -aI292 -aI-685 -aa(lp22709 -g15 -aI365 -aI-718 -aI326 -aI-704 -aI345 -aI-712 -aa(lp22710 -g15 -aI436 -aI-727 -aI386 -aI-724 -aI410 -aI-727 -aa(lp22711 -g15 -aI547 -aI-703 -aI476 -aI-727 -aI514 -aI-719 -aa(lp22712 -g15 -aI633 -aI-633 -aI580 -aI-688 -aI609 -aI-665 -aa(lp22713 -g15 -aI688 -aI-518 -aI656 -aI-602 -aI675 -aI-564 -aa(lp22714 -g15 -aI707 -aI-358 -aI701 -aI-472 -aI707 -aI-419 -aa(lp22715 -g15 -aI688 -aI-197 -aI707 -aI-297 -aI701 -aI-243 -aa(lp22716 -g15 -aI633 -aI-80 -aI675 -aI-150 -aI656 -aI-112 -aa(lp22717 -g15 -aI547 -aI-10 -aI609 -aI-49 -aI580 -aI-26 -aa(lp22718 -g15 -aI436 -aI13 -aI514 -aI5 -aI476 -aI13 -aa(lp22719 -g10 -aa(lp22720 -g8 -aI413 -aI-629 -aa(lp22721 -g15 -aI329 -aI-614 -aI380 -aI-629 -aI352 -aI-624 -aa(lp22722 -g15 -aI274 -aI-568 -aI306 -aI-604 -aI288 -aI-588 -aa(lp22723 -g15 -aI243 -aI-492 -aI260 -aI-548 -aI249 -aI-522 -aa(lp22724 -g15 -aI231 -aI-384 -aI236 -aI-462 -aI232 -aI-426 -aa(lp22725 -g20 -aI231 -aI-358 -aa(lp22726 -g15 -aI240 -aI-241 -aI231 -aI-314 -aI234 -aI-275 -aa(lp22727 -g15 -aI270 -aI-155 -aI246 -aI-207 -aI256 -aI-178 -aa(lp22728 -g15 -aI326 -aI-102 -aI284 -aI-132 -aI303 -aI-114 -aa(lp22729 -g15 -aI414 -aI-84 -aI350 -aI-90 -aI379 -aI-84 -aa(lp22730 -g15 -aI543 -aI-155 -aI473 -aI-84 -aI516 -aI-108 -aa(lp22731 -g15 -aI585 -aI-359 -aI571 -aI-203 -aI585 -aI-271 -aa(lp22732 -g15 -aI543 -aI-562 -aI585 -aI-449 -aI571 -aI-517 -aa(lp22733 -g15 -aI413 -aI-629 -aI516 -aI-606 -aI472 -aI-629 -aa(lp22734 -g10 -aa(lp22735 -g8 -aI781 -aI0 -aa(lp22736 -g10 -aa(lp22737 -g8 -aI781 -aI0 -aasVt -(lp22738 -(lp22739 -g8 -aI329 -aI-83 -aa(lp22740 -g15 -aI355 -aI-84 -aI337 -aI-83 -aI346 -aI-83 -aa(lp22741 -g15 -aI384 -aI-88 -aI365 -aI-85 -aI374 -aI-86 -aa(lp22742 -g15 -aI409 -aI-92 -aI393 -aI-89 -aI401 -aI-90 -aa(lp22743 -g15 -aI426 -aI-97 -aI416 -aI-94 -aI422 -aI-95 -aa(lp22744 -g20 -aI426 -aI-7 -aa(lp22745 -g15 -aI404 -aI0 -aI420 -aI-4 -aI413 -aI-2 -aa(lp22746 -g15 -aI376 -aI7 -aI396 -aI3 -aI386 -aI5 -aa(lp22747 -g15 -aI343 -aI11 -aI365 -aI9 -aI355 -aI10 -aa(lp22748 -g15 -aI310 -aI13 -aI332 -aI12 -aI321 -aI13 -aa(lp22749 -g15 -aI235 -aI3 -aI283 -aI13 -aI258 -aI10 -aa(lp22750 -g15 -aI176 -aI-32 -aI212 -aI-3 -aI192 -aI-15 -aa(lp22751 -g15 -aI136 -aI-101 -aI159 -aI-49 -aI146 -aI-72 -aa(lp22752 -g15 -aI122 -aI-210 -aI127 -aI-130 -aI122 -aI-166 -aa(lp22753 -g20 -aI122 -aI-625 -aa(lp22754 -g20 -aI21 -aI-625 -aa(lp22755 -g20 -aI21 -aI-677 -aa(lp22756 -g20 -aI122 -aI-728 -aa(lp22757 -g20 -aI173 -aI-878 -aa(lp22758 -g20 -aI241 -aI-878 -aa(lp22759 -g20 -aI241 -aI-714 -aa(lp22760 -g20 -aI421 -aI-714 -aa(lp22761 -g20 -aI421 -aI-625 -aa(lp22762 -g20 -aI241 -aI-625 -aa(lp22763 -g20 -aI241 -aI-210 -aa(lp22764 -g15 -aI262 -aI-115 -aI241 -aI-168 -aI248 -aI-136 -aa(lp22765 -g15 -aI329 -aI-83 -aI275 -aI-94 -aI298 -aI-83 -aa(lp22766 -g10 -aa(lp22767 -g8 -aI451 -aI0 -aa(lp22768 -g10 -aa(lp22769 -g8 -aI451 -aI0 -aasVx -(lp22770 -(lp22771 -g8 -aI265 -aI-366 -aa(lp22772 -g20 -aI35 -aI-714 -aa(lp22773 -g20 -aI170 -aI-714 -aa(lp22774 -g20 -aI333 -aI-447 -aa(lp22775 -g20 -aI496 -aI-714 -aa(lp22776 -g20 -aI630 -aI-714 -aa(lp22777 -g20 -aI399 -aI-366 -aa(lp22778 -g20 -aI642 -aI0 -aa(lp22779 -g20 -aI507 -aI0 -aa(lp22780 -g20 -aI333 -aI-283 -aa(lp22781 -g20 -aI157 -aI0 -aa(lp22782 -g20 -aI22 -aI0 -aa(lp22783 -g10 -aa(lp22784 -g8 -aI666 -aI0 -aa(lp22785 -g10 -aa(lp22786 -g8 -aI666 -aI0 -aasV| -(lp22787 -(lp22788 -g8 -aI318 -aI-1012 -aa(lp22789 -g20 -aI416 -aI-1012 -aa(lp22790 -g20 -aI416 -aI320 -aa(lp22791 -g20 -aI318 -aI320 -aa(lp22792 -g10 -aa(lp22793 -g8 -aI734 -aI0 -aa(lp22794 -g10 -aa(lp22795 -g8 -aI734 -aI0 -aasV# -(lp22796 -(lp22797 -g8 -aI639 -aI-580 -aa(lp22798 -g20 -aI598 -aI-367 -aa(lp22799 -g20 -aI781 -aI-367 -aa(lp22800 -g20 -aI781 -aI-278 -aa(lp22801 -g20 -aI581 -aI-278 -aa(lp22802 -g20 -aI527 -aI0 -aa(lp22803 -g20 -aI432 -aI0 -aa(lp22804 -g20 -aI486 -aI-278 -aa(lp22805 -g20 -aI297 -aI-278 -aa(lp22806 -g20 -aI244 -aI0 -aa(lp22807 -g20 -aI150 -aI0 -aa(lp22808 -g20 -aI201 -aI-278 -aa(lp22809 -g20 -aI33 -aI-278 -aa(lp22810 -g20 -aI33 -aI-367 -aa(lp22811 -g20 -aI218 -aI-367 -aa(lp22812 -g20 -aI261 -aI-580 -aa(lp22813 -g20 -aI82 -aI-580 -aa(lp22814 -g20 -aI82 -aI-670 -aa(lp22815 -g20 -aI277 -aI-670 -aa(lp22816 -g20 -aI330 -aI-951 -aa(lp22817 -g20 -aI426 -aI-951 -aa(lp22818 -g20 -aI373 -aI-670 -aa(lp22819 -g20 -aI563 -aI-670 -aa(lp22820 -g20 -aI618 -aI-951 -aa(lp22821 -g20 -aI712 -aI-951 -aa(lp22822 -g20 -aI657 -aI-670 -aa(lp22823 -g20 -aI828 -aI-670 -aa(lp22824 -g20 -aI828 -aI-580 -aa(lp22825 -g10 -aa(lp22826 -g8 -aI314 -aI-367 -aa(lp22827 -g20 -aI503 -aI-367 -aa(lp22828 -g20 -aI545 -aI-580 -aa(lp22829 -g20 -aI356 -aI-580 -aa(lp22830 -g10 -aa(lp22831 -g8 -aI861 -aI0 -aa(lp22832 -g10 -aa(lp22833 -g8 -aI861 -aI0 -aasV' -(lp22834 -(lp22835 -g8 -aI214 -aI-951 -aa(lp22836 -g20 -aI188 -aI-607 -aa(lp22837 -g20 -aI113 -aI-607 -aa(lp22838 -g20 -aI86 -aI-951 -aa(lp22839 -g10 -aa(lp22840 -g8 -aI301 -aI0 -aa(lp22841 -g10 -aa(lp22842 -g8 -aI301 -aI0 -aasV+ -(lp22843 -(lp22844 -g8 -aI318 -aI-420 -aa(lp22845 -g20 -aI66 -aI-420 -aa(lp22846 -g20 -aI66 -aI-518 -aa(lp22847 -g20 -aI318 -aI-518 -aa(lp22848 -g20 -aI318 -aI-771 -aa(lp22849 -g20 -aI416 -aI-771 -aa(lp22850 -g20 -aI416 -aI-518 -aa(lp22851 -g20 -aI667 -aI-518 -aa(lp22852 -g20 -aI667 -aI-420 -aa(lp22853 -g20 -aI416 -aI-420 -aa(lp22854 -g20 -aI416 -aI-170 -aa(lp22855 -g20 -aI318 -aI-170 -aa(lp22856 -g10 -aa(lp22857 -g8 -aI734 -aI0 -aa(lp22858 -g10 -aa(lp22859 -g8 -aI734 -aI0 -aasV/ -(lp22860 -(lp22861 -g8 -aI483 -aI-951 -aa(lp22862 -g20 -aI129 -aI0 -aa(lp22863 -g20 -aI13 -aI0 -aa(lp22864 -g20 -aI367 -aI-951 -aa(lp22865 -g10 -aa(lp22866 -g8 -aI497 -aI0 -aa(lp22867 -g10 -aa(lp22868 -g8 -aI497 -aI0 -aasV3 -(lp22869 -(lp22870 -g8 -aI625 -aI-728 -aa(lp22871 -g15 -aI610 -aI-642 -aI625 -aI-697 -aI620 -aI-668 -aa(lp22872 -g15 -aI568 -aI-574 -aI600 -aI-616 -aI586 -aI-593 -aa(lp22873 -g15 -aI503 -aI-527 -aI550 -aI-555 -aI529 -aI-539 -aa(lp22874 -g15 -aI419 -aI-500 -aI478 -aI-514 -aI450 -aI-506 -aa(lp22875 -g20 -aI419 -aI-496 -aa(lp22876 -g15 -aI595 -aI-423 -aI496 -aI-487 -aI555 -aI-462 -aa(lp22877 -g15 -aI654 -aI-270 -aI634 -aI-384 -aI654 -aI-333 -aa(lp22878 -g15 -aI633 -aI-155 -aI654 -aI-228 -aI647 -aI-190 -aa(lp22879 -g15 -aI569 -aI-65 -aI619 -aI-121 -aI598 -aI-91 -aa(lp22880 -g15 -aI460 -aI-7 -aI541 -aI-40 -aI504 -aI-21 -aa(lp22881 -g15 -aI305 -aI13 -aI417 -aI6 -aI365 -aI13 -aa(lp22882 -g15 -aI171 -aI2 -aI258 -aI13 -aI213 -aI9 -aa(lp22883 -g15 -aI53 -aI-37 -aI129 -aI-4 -aI90 -aI-18 -aa(lp22884 -g20 -aI53 -aI-148 -aa(lp22885 -g15 -aI176 -aI-102 -aI91 -aI-128 -aI132 -aI-113 -aa(lp22886 -g15 -aI302 -aI-86 -aI220 -aI-91 -aI262 -aI-86 -aa(lp22887 -g15 -aI406 -aI-99 -aI342 -aI-86 -aI377 -aI-90 -aa(lp22888 -g15 -aI478 -aI-136 -aI435 -aI-107 -aI459 -aI-120 -aa(lp22889 -g15 -aI519 -aI-195 -aI497 -aI-152 -aI510 -aI-172 -aa(lp22890 -g15 -aI533 -aI-274 -aI528 -aI-218 -aI533 -aI-245 -aa(lp22891 -g15 -aI515 -aI-350 -aI533 -aI-303 -aI527 -aI-329 -aa(lp22892 -g15 -aI466 -aI-402 -aI504 -aI-371 -aI488 -aI-388 -aa(lp22893 -g15 -aI388 -aI-432 -aI445 -aI-415 -aI419 -aI-425 -aa(lp22894 -g15 -aI285 -aI-442 -aI358 -aI-439 -aI323 -aI-442 -aa(lp22895 -g20 -aI198 -aI-442 -aa(lp22896 -g20 -aI198 -aI-540 -aa(lp22897 -g20 -aI285 -aI-540 -aa(lp22898 -g15 -aI378 -aI-553 -aI320 -aI-540 -aI351 -aI-544 -aa(lp22899 -g15 -aI447 -aI-590 -aI406 -aI-562 -aI429 -aI-574 -aa(lp22900 -g15 -aI489 -aI-647 -aI466 -aI-606 -aI480 -aI-625 -aa(lp22901 -g15 -aI503 -aI-720 -aI499 -aI-670 -aI503 -aI-694 -aa(lp22902 -g15 -aI492 -aI-781 -aI503 -aI-743 -aI500 -aI-763 -aa(lp22903 -g15 -aI458 -aI-826 -aI484 -aI-799 -aI473 -aI-814 -aa(lp22904 -g15 -aI407 -aI-855 -aI444 -aI-839 -aI427 -aI-848 -aa(lp22905 -g15 -aI341 -aI-864 -aI387 -aI-861 -aI365 -aI-864 -aa(lp22906 -g15 -aI218 -aI-842 -aI294 -aI-864 -aI253 -aI-857 -aa(lp22907 -g15 -aI117 -aI-786 -aI183 -aI-828 -aI149 -aI-809 -aa(lp22908 -g20 -aI57 -aI-867 -aa(lp22909 -g15 -aI112 -aI-905 -aI73 -aI-880 -aI92 -aI-893 -aa(lp22910 -g15 -aI178 -aI-936 -aI132 -aI-916 -aI154 -aI-927 -aa(lp22911 -g15 -aI254 -aI-957 -aI202 -aI-944 -aI227 -aI-952 -aa(lp22912 -g15 -aI341 -aI-965 -aI282 -aI-962 -aI310 -aI-965 -aa(lp22913 -g15 -aI464 -aI-947 -aI388 -aI-965 -aI429 -aI-959 -aa(lp22914 -g15 -aI553 -aI-898 -aI499 -aI-935 -aI529 -aI-919 -aa(lp22915 -g15 -aI607 -aI-823 -aI577 -aI-877 -aI595 -aI-852 -aa(lp22916 -g15 -aI625 -aI-728 -aI619 -aI-794 -aI625 -aI-763 -aa(lp22917 -g10 -aa(lp22918 -g8 -aI734 -aI0 -aa(lp22919 -g10 -aa(lp22920 -g8 -aI734 -aI0 -aasV7 -(lp22921 -(lp22922 -g8 -aI182 -aI0 -aa(lp22923 -g20 -aI549 -aI-843 -aa(lp22924 -g20 -aI58 -aI-843 -aa(lp22925 -g20 -aI58 -aI-951 -aa(lp22926 -g20 -aI670 -aI-951 -aa(lp22927 -g20 -aI670 -aI-856 -aa(lp22928 -g20 -aI309 -aI0 -aa(lp22929 -g10 -aa(lp22930 -g8 -aI734 -aI0 -aa(lp22931 -g10 -aa(lp22932 -g8 -aI734 -aI0 -aasV; -(lp22933 -(lp22934 -g8 -aI235 -aI-154 -aa(lp22935 -g20 -aI245 -aI-139 -aa(lp22936 -g15 -aI223 -aI-64 -aI239 -aI-116 -aI232 -aI-91 -aa(lp22937 -g15 -aI195 -aI15 -aI215 -aI-38 -aI205 -aI-11 -aa(lp22938 -g15 -aI163 -aI95 -aI185 -aI42 -aI174 -aI69 -aa(lp22939 -g15 -aI130 -aI172 -aI152 -aI122 -aI141 -aI148 -aa(lp22940 -g20 -aI41 -aI172 -aa(lp22941 -g15 -aI60 -aI89 -aI47 -aI145 -aI53 -aI118 -aa(lp22942 -g15 -aI78 -aI4 -aI66 -aI60 -aI72 -aI32 -aa(lp22943 -g15 -aI94 -aI-79 -aI84 -aI-24 -aI89 -aI-52 -aa(lp22944 -g15 -aI106 -aI-154 -aI99 -aI-106 -aI103 -aI-131 -aa(lp22945 -g10 -aa(lp22946 -g8 -aI95 -aI-642 -aa(lp22947 -g15 -aI102 -aI-684 -aI95 -aI-659 -aI97 -aI-673 -aa(lp22948 -g15 -aI119 -aI-712 -aI106 -aI-696 -aI112 -aI-705 -aa(lp22949 -g15 -aI145 -aI-728 -aI127 -aI-719 -aI135 -aI-725 -aa(lp22950 -g15 -aI178 -aI-732 -aI155 -aI-731 -aI166 -aI-732 -aa(lp22951 -g15 -aI210 -aI-728 -aI189 -aI-732 -aI200 -aI-731 -aa(lp22952 -g15 -aI236 -aI-712 -aI220 -aI-725 -aI229 -aI-719 -aa(lp22953 -g15 -aI254 -aI-684 -aI244 -aI-705 -aI250 -aI-696 -aa(lp22954 -g15 -aI261 -aI-642 -aI258 -aI-673 -aI261 -aI-659 -aa(lp22955 -g15 -aI254 -aI-601 -aI261 -aI-626 -aI258 -aI-612 -aa(lp22956 -g15 -aI236 -aI-573 -aI250 -aI-589 -aI244 -aI-580 -aa(lp22957 -g15 -aI210 -aI-556 -aI229 -aI-565 -aI220 -aI-560 -aa(lp22958 -g15 -aI178 -aI-551 -aI200 -aI-553 -aI189 -aI-551 -aa(lp22959 -g15 -aI145 -aI-556 -aI166 -aI-551 -aI155 -aI-553 -aa(lp22960 -g15 -aI119 -aI-573 -aI135 -aI-560 -aI127 -aI-565 -aa(lp22961 -g15 -aI102 -aI-601 -aI112 -aI-580 -aI106 -aI-589 -aa(lp22962 -g15 -aI95 -aI-642 -aI97 -aI-612 -aI95 -aI-626 -aa(lp22963 -g10 -aa(lp22964 -g8 -aI357 -aI0 -aa(lp22965 -g10 -aa(lp22966 -g8 -aI357 -aI0 -aasV? -(lp22967 -(lp22968 -g8 -aI182 -aI-269 -aa(lp22969 -g20 -aI182 -aI-293 -aa(lp22970 -g15 -aI187 -aI-360 -aI182 -aI-317 -aI184 -aI-340 -aa(lp22971 -g15 -aI205 -aI-416 -aI191 -aI-380 -aI196 -aI-398 -aa(lp22972 -g15 -aI239 -aI-467 -aI213 -aI-433 -aI225 -aI-450 -aa(lp22973 -g15 -aI293 -aI-519 -aI253 -aI-484 -aI271 -aI-501 -aa(lp22974 -g15 -aI347 -aI-568 -aI314 -aI-537 -aI332 -aI-553 -aa(lp22975 -g15 -aI383 -aI-612 -aI361 -aI-582 -aI373 -aI-597 -aa(lp22976 -g15 -aI403 -aI-660 -aI392 -aI-627 -aI399 -aI-643 -aa(lp22977 -g15 -aI410 -aI-720 -aI408 -aI-677 -aI410 -aI-697 -aa(lp22978 -g15 -aI401 -aI-777 -aI410 -aI-741 -aI407 -aI-760 -aa(lp22979 -g15 -aI372 -aI-822 -aI394 -aI-795 -aI385 -aI-809 -aa(lp22980 -g15 -aI326 -aI-850 -aI360 -aI-834 -aI344 -aI-844 -aa(lp22981 -g15 -aI262 -aI-860 -aI308 -aI-857 -aI286 -aI-860 -aa(lp22982 -g15 -aI159 -aI-843 -aI226 -aI-860 -aI192 -aI-855 -aa(lp22983 -g15 -aI65 -aI-804 -aI126 -aI-832 -aI95 -aI-819 -aa(lp22984 -g20 -aI24 -aI-899 -aa(lp22985 -g15 -aI138 -aI-945 -aI59 -aI-917 -aI97 -aI-933 -aa(lp22986 -g15 -aI262 -aI-965 -aI178 -aI-958 -aI220 -aI-965 -aa(lp22987 -g15 -aI371 -aI-948 -aI302 -aI-965 -aI339 -aI-959 -aa(lp22988 -g15 -aI453 -aI-900 -aI403 -aI-937 -aI431 -aI-921 -aa(lp22989 -g15 -aI505 -aI-824 -aI476 -aI-879 -aI493 -aI-854 -aa(lp22990 -g15 -aI524 -aI-722 -aI518 -aI-793 -aI524 -aI-759 -aa(lp22991 -g15 -aI515 -aI-644 -aI524 -aI-693 -aI521 -aI-667 -aa(lp22992 -g15 -aI488 -aI-580 -aI509 -aI-621 -aI500 -aI-600 -aa(lp22993 -g15 -aI445 -aI-524 -aI477 -aI-561 -aI462 -aI-542 -aa(lp22994 -g15 -aI384 -aI-466 -aI427 -aI-506 -aI407 -aI-486 -aa(lp22995 -g15 -aI328 -aI-415 -aI361 -aI-446 -aI343 -aI-429 -aa(lp22996 -g15 -aI294 -aI-372 -aI314 -aI-400 -aI303 -aI-386 -aa(lp22997 -g15 -aI277 -aI-330 -aI286 -aI-359 -aI281 -aI-345 -aa(lp22998 -g15 -aI273 -aI-280 -aI274 -aI-316 -aI273 -aI-299 -aa(lp22999 -g20 -aI273 -aI-269 -aa(lp23000 -g10 -aa(lp23001 -g8 -aI151 -aI-71 -aa(lp23002 -g15 -aI158 -aI-113 -aI151 -aI-88 -aI153 -aI-102 -aa(lp23003 -g15 -aI175 -aI-141 -aI162 -aI-125 -aI168 -aI-134 -aa(lp23004 -g15 -aI201 -aI-157 -aI183 -aI-148 -aI191 -aI-154 -aa(lp23005 -g15 -aI234 -aI-162 -aI211 -aI-160 -aI222 -aI-162 -aa(lp23006 -g15 -aI266 -aI-157 -aI245 -aI-162 -aI256 -aI-160 -aa(lp23007 -g15 -aI292 -aI-141 -aI276 -aI-154 -aI285 -aI-148 -aa(lp23008 -g15 -aI310 -aI-113 -aI300 -aI-134 -aI306 -aI-125 -aa(lp23009 -g15 -aI317 -aI-71 -aI314 -aI-102 -aI317 -aI-88 -aa(lp23010 -g15 -aI310 -aI-30 -aI317 -aI-55 -aI314 -aI-41 -aa(lp23011 -g15 -aI292 -aI-2 -aI306 -aI-18 -aI300 -aI-9 -aa(lp23012 -g15 -aI266 -aI14 -aI285 -aI5 -aI276 -aI10 -aa(lp23013 -g15 -aI234 -aI19 -aI256 -aI17 -aI245 -aI19 -aa(lp23014 -g15 -aI201 -aI14 -aI222 -aI19 -aI211 -aI17 -aa(lp23015 -g15 -aI175 -aI-2 -aI191 -aI10 -aI183 -aI5 -aa(lp23016 -g15 -aI158 -aI-30 -aI168 -aI-9 -aI162 -aI-18 -aa(lp23017 -g15 -aI151 -aI-71 -aI153 -aI-41 -aI151 -aI-55 -aa(lp23018 -g10 -aa(lp23019 -g8 -aI567 -aI0 -aa(lp23020 -g10 -aa(lp23021 -g8 -aI567 -aI0 -aasVC -(lp23022 -(lp23023 -g8 -aI516 -aI-858 -aa(lp23024 -g15 -aI389 -aI-831 -aI469 -aI-858 -aI427 -aI-849 -aa(lp23025 -g15 -aI293 -aI-756 -aI352 -aI-814 -aI319 -aI-789 -aa(lp23026 -g15 -aI231 -aI-635 -aI266 -aI-723 -aI245 -aI-682 -aa(lp23027 -g15 -aI209 -aI-475 -aI216 -aI-588 -aI209 -aI-534 -aa(lp23028 -g15 -aI228 -aI-312 -aI209 -aI-414 -aI216 -aI-359 -aa(lp23029 -g15 -aI286 -aI-192 -aI241 -aI-264 -aI260 -aI-224 -aa(lp23030 -g15 -aI382 -aI-118 -aI312 -aI-159 -aI343 -aI-134 -aa(lp23031 -g15 -aI516 -aI-92 -aI420 -aI-101 -aI465 -aI-92 -aa(lp23032 -g15 -aI626 -aI-104 -aI554 -aI-92 -aI591 -aI-96 -aa(lp23033 -g15 -aI729 -aI-130 -aI661 -aI-111 -aI695 -aI-120 -aa(lp23034 -g20 -aI729 -aI-24 -aa(lp23035 -g15 -aI678 -aI-7 -aI712 -aI-18 -aI695 -aI-12 -aa(lp23036 -g15 -aI625 -aI4 -aI661 -aI-2 -aI643 -aI1 -aa(lp23037 -g15 -aI566 -aI11 -aI606 -aI7 -aI587 -aI9 -aa(lp23038 -g15 -aI496 -aI13 -aI545 -aI12 -aI521 -aI13 -aa(lp23039 -g15 -aI311 -aI-21 -aI424 -aI13 -aI363 -aI1 -aa(lp23040 -g15 -aI181 -aI-121 -aI259 -aI-45 -aI216 -aI-78 -aa(lp23041 -g15 -aI106 -aI-276 -aI147 -aI-164 -aI122 -aI-215 -aa(lp23042 -g15 -aI81 -aI-476 -aI89 -aI-336 -aI81 -aI-403 -aa(lp23043 -g15 -aI109 -aI-674 -aI81 -aI-548 -aI90 -aI-614 -aa(lp23044 -g15 -aI193 -aI-828 -aI128 -aI-734 -aI156 -aI-786 -aa(lp23045 -g15 -aI329 -aI-929 -aI229 -aI-871 -aI275 -aI-905 -aa(lp23046 -g15 -aI516 -aI-965 -aI383 -aI-953 -aI445 -aI-965 -aa(lp23047 -g15 -aI650 -aI-950 -aI563 -aI-965 -aI607 -aI-960 -aa(lp23048 -g15 -aI765 -aI-909 -aI692 -aI-941 -aI731 -aI-927 -aa(lp23049 -g20 -aI714 -aI-807 -aa(lp23050 -g15 -aI625 -aI-843 -aI687 -aI-821 -aI657 -aI-833 -aa(lp23051 -g15 -aI516 -aI-858 -aI593 -aI-853 -aI557 -aI-858 -aa(lp23052 -g10 -aa(lp23053 -g8 -aI804 -aI0 -aa(lp23054 -g10 -aa(lp23055 -g8 -aI804 -aI0 -aasVG -(lp23056 -(lp23057 -g8 -aI509 -aI-502 -aa(lp23058 -g20 -aI824 -aI-502 -aa(lp23059 -g20 -aI824 -aI-35 -aa(lp23060 -g15 -aI751 -aI-14 -aI800 -aI-27 -aI776 -aI-20 -aa(lp23061 -g15 -aI677 -aI0 -aI727 -aI-8 -aI702 -aI-3 -aa(lp23062 -g15 -aI596 -aI10 -aI651 -aI4 -aI624 -aI8 -aa(lp23063 -g15 -aI505 -aI13 -aI568 -aI12 -aI537 -aI13 -aa(lp23064 -g15 -aI324 -aI-20 -aI437 -aI13 -aI376 -aI2 -aa(lp23065 -g15 -aI191 -aI-118 -aI271 -aI-43 -aI227 -aI-76 -aa(lp23066 -g15 -aI109 -aI-272 -aI155 -aI-160 -aI128 -aI-212 -aa(lp23067 -g15 -aI81 -aI-476 -aI90 -aI-333 -aI81 -aI-401 -aa(lp23068 -g15 -aI112 -aI-679 -aI81 -aI-551 -aI91 -aI-618 -aa(lp23069 -g15 -aI202 -aI-833 -aI132 -aI-739 -aI162 -aI-790 -aa(lp23070 -g15 -aI348 -aI-930 -aI241 -aI-875 -aI290 -aI-908 -aa(lp23071 -g15 -aI546 -aI-965 -aI406 -aI-953 -aI472 -aI-965 -aa(lp23072 -g15 -aI685 -aI-950 -aI595 -aI-965 -aI641 -aI-960 -aa(lp23073 -g15 -aI809 -aI-909 -aI729 -aI-941 -aI771 -aI-927 -aa(lp23074 -g20 -aI762 -aI-803 -aa(lp23075 -g15 -aI711 -aI-824 -aI746 -aI-810 -aI729 -aI-817 -aa(lp23076 -g15 -aI656 -aI-841 -aI693 -aI-830 -aI675 -aI-836 -aa(lp23077 -g15 -aI597 -aI-853 -aI637 -aI-846 -aI617 -aI-850 -aa(lp23078 -g15 -aI537 -aI-858 -aI577 -aI-856 -aI557 -aI-858 -aa(lp23079 -g15 -aI396 -aI-831 -aI484 -aI-858 -aI437 -aI-849 -aa(lp23080 -g15 -aI293 -aI-756 -aI355 -aI-814 -aI321 -aI-789 -aa(lp23081 -g15 -aI231 -aI-635 -aI266 -aI-723 -aI245 -aI-682 -aa(lp23082 -g15 -aI209 -aI-475 -aI216 -aI-588 -aI209 -aI-534 -aa(lp23083 -g15 -aI227 -aI-320 -aI209 -aI-419 -aI215 -aI-367 -aa(lp23084 -g15 -aI284 -aI-199 -aI239 -aI-273 -aI258 -aI-233 -aa(lp23085 -g15 -aI385 -aI-120 -aI310 -aI-165 -aI344 -aI-139 -aa(lp23086 -g15 -aI534 -aI-92 -aI426 -aI-101 -aI476 -aI-92 -aa(lp23087 -g15 -aI586 -aI-94 -aI553 -aI-92 -aI571 -aI-93 -aa(lp23088 -g15 -aI630 -aI-98 -aI602 -aI-95 -aI617 -aI-96 -aa(lp23089 -g15 -aI668 -aI-104 -aI644 -aI-100 -aI657 -aI-102 -aa(lp23090 -g15 -aI703 -aI-111 -aI680 -aI-107 -aI692 -aI-109 -aa(lp23091 -g20 -aI703 -aI-395 -aa(lp23092 -g20 -aI509 -aI-395 -aa(lp23093 -g10 -aa(lp23094 -g8 -aI919 -aI0 -aa(lp23095 -g10 -aa(lp23096 -g8 -aI919 -aI0 -aasVK -(lp23097 -(lp23098 -g8 -aI772 -aI0 -aa(lp23099 -g20 -aI634 -aI0 -aa(lp23100 -g20 -aI341 -aI-453 -aa(lp23101 -g20 -aI250 -aI-379 -aa(lp23102 -g20 -aI250 -aI0 -aa(lp23103 -g20 -aI129 -aI0 -aa(lp23104 -g20 -aI129 -aI-951 -aa(lp23105 -g20 -aI250 -aI-951 -aa(lp23106 -g20 -aI250 -aI-475 -aa(lp23107 -g20 -aI329 -aI-584 -aa(lp23108 -g20 -aI623 -aI-951 -aa(lp23109 -g20 -aI759 -aI-951 -aa(lp23110 -g20 -aI421 -aI-536 -aa(lp23111 -g10 -aa(lp23112 -g8 -aI772 -aI0 -aa(lp23113 -g10 -aa(lp23114 -g8 -aI772 -aI0 -aasVO -(lp23115 -(lp23116 -g8 -aI906 -aI-476 -aa(lp23117 -g15 -aI880 -aI-276 -aI906 -aI-403 -aI898 -aI-336 -aa(lp23118 -g15 -aI802 -aI-121 -aI862 -aI-215 -aI836 -aI-164 -aa(lp23119 -g15 -aI672 -aI-21 -aI767 -aI-78 -aI724 -aI-45 -aa(lp23120 -g15 -aI494 -aI13 -aI621 -aI1 -aI562 -aI13 -aa(lp23121 -g15 -aI310 -aI-21 -aI424 -aI13 -aI362 -aI1 -aa(lp23122 -g15 -aI181 -aI-121 -aI259 -aI-45 -aI216 -aI-78 -aa(lp23123 -g15 -aI106 -aI-276 -aI147 -aI-164 -aI122 -aI-216 -aa(lp23124 -g15 -aI81 -aI-478 -aI89 -aI-337 -aI81 -aI-404 -aa(lp23125 -g15 -aI106 -aI-678 -aI81 -aI-551 -aI89 -aI-618 -aa(lp23126 -g15 -aI182 -aI-832 -aI122 -aI-739 -aI148 -aI-790 -aa(lp23127 -g15 -aI311 -aI-931 -aI216 -aI-875 -aI259 -aI-908 -aa(lp23128 -g15 -aI496 -aI-966 -aI363 -aI-954 -aI425 -aI-966 -aa(lp23129 -g15 -aI673 -aI-931 -aI563 -aI-966 -aI622 -aI-954 -aa(lp23130 -g15 -aI802 -aI-832 -aI724 -aI-908 -aI767 -aI-875 -aa(lp23131 -g15 -aI880 -aI-678 -aI836 -aI-789 -aI862 -aI-738 -aa(lp23132 -g15 -aI906 -aI-476 -aI898 -aI-618 -aI906 -aI-550 -aa(lp23133 -g10 -aa(lp23134 -g8 -aI209 -aI-476 -aa(lp23135 -g15 -aI226 -aI-316 -aI209 -aI-417 -aI215 -aI-363 -aa(lp23136 -g15 -aI278 -aI-195 -aI237 -aI-268 -aI255 -aI-228 -aa(lp23137 -g15 -aI366 -aI-119 -aI301 -aI-161 -aI331 -aI-136 -aa(lp23138 -g15 -aI494 -aI-92 -aI402 -aI-101 -aI445 -aI-92 -aa(lp23139 -g15 -aI622 -aI-119 -aI544 -aI-92 -aI586 -aI-101 -aa(lp23140 -g15 -aI711 -aI-195 -aI658 -aI-136 -aI688 -aI-161 -aa(lp23141 -g15 -aI762 -aI-316 -aI734 -aI-228 -aI751 -aI-268 -aa(lp23142 -g15 -aI778 -aI-476 -aI773 -aI-363 -aI778 -aI-417 -aa(lp23143 -g15 -aI762 -aI-637 -aI778 -aI-536 -aI773 -aI-590 -aa(lp23144 -g15 -aI711 -aI-757 -aI751 -aI-684 -aI734 -aI-724 -aa(lp23145 -g15 -aI623 -aI-833 -aI688 -aI-790 -aI659 -aI-815 -aa(lp23146 -g15 -aI496 -aI-859 -aI588 -aI-850 -aI545 -aI-859 -aa(lp23147 -g15 -aI367 -aI-833 -aI446 -aI-859 -aI403 -aI-850 -aa(lp23148 -g15 -aI278 -aI-757 -aI331 -aI-815 -aI302 -aI-790 -aa(lp23149 -g15 -aI226 -aI-637 -aI255 -aI-724 -aI237 -aI-684 -aa(lp23150 -g15 -aI209 -aI-476 -aI215 -aI-590 -aI209 -aI-536 -aa(lp23151 -g10 -aa(lp23152 -g8 -aI989 -aI0 -aa(lp23153 -g10 -aa(lp23154 -g8 -aI989 -aI0 -aasVS -(lp23155 -(lp23156 -g8 -aI630 -aI-254 -aa(lp23157 -g15 -aI608 -aI-141 -aI630 -aI-212 -aI623 -aI-174 -aa(lp23158 -g15 -aI544 -aI-56 -aI593 -aI-107 -aI572 -aI-79 -aa(lp23159 -g15 -aI442 -aI-4 -aI516 -aI-33 -aI482 -aI-16 -aa(lp23160 -g15 -aI307 -aI13 -aI402 -aI7 -aI357 -aI13 -aa(lp23161 -g15 -aI172 -aI2 -aI259 -aI13 -aI214 -aI9 -aa(lp23162 -g15 -aI67 -aI-31 -aI130 -aI-5 -aI95 -aI-16 -aa(lp23163 -g20 -aI67 -aI-147 -aa(lp23164 -g15 -aI118 -aI-126 -aI82 -aI-140 -aI99 -aI-133 -aa(lp23165 -g15 -aI177 -aI-108 -aI137 -aI-120 -aI156 -aI-114 -aa(lp23166 -g15 -aI242 -aI-96 -aI198 -aI-103 -aI220 -aI-99 -aa(lp23167 -g15 -aI307 -aI-91 -aI264 -aI-92 -aI286 -aI-91 -aa(lp23168 -g15 -aI461 -aI-130 -aI377 -aI-91 -aI428 -aI-104 -aa(lp23169 -g15 -aI511 -aI-242 -aI495 -aI-156 -aI511 -aI-193 -aa(lp23170 -g15 -aI502 -aI-303 -aI511 -aI-265 -aI508 -aI-286 -aa(lp23171 -g15 -aI469 -aI-351 -aI495 -aI-320 -aI484 -aI-336 -aa(lp23172 -g15 -aI405 -aI-393 -aI453 -aI-365 -aI432 -aI-380 -aa(lp23173 -g15 -aI305 -aI-438 -aI379 -aI-407 -aI345 -aI-422 -aa(lp23174 -g15 -aI204 -aI-488 -aI266 -aI-453 -aI233 -aI-470 -aa(lp23175 -g15 -aI134 -aI-549 -aI176 -aI-506 -aI152 -aI-526 -aa(lp23176 -g15 -aI93 -aI-625 -aI115 -aI-571 -aI102 -aI-597 -aa(lp23177 -g15 -aI80 -aI-723 -aI84 -aI-654 -aI80 -aI-687 -aa(lp23178 -g15 -aI100 -aI-825 -aI80 -aI-761 -aI87 -aI-795 -aa(lp23179 -g15 -aI159 -aI-901 -aI114 -aI-855 -aI134 -aI-880 -aa(lp23180 -g15 -aI249 -aI-948 -aI184 -aI-922 -aI214 -aI-937 -aa(lp23181 -g15 -aI365 -aI-965 -aI284 -aI-959 -aI323 -aI-965 -aa(lp23182 -g15 -aI504 -aI-950 -aI416 -aI-965 -aI463 -aI-960 -aa(lp23183 -g15 -aI614 -aI-912 -aI545 -aI-940 -aI582 -aI-928 -aa(lp23184 -g20 -aI570 -aI-811 -aa(lp23185 -g15 -aI474 -aI-844 -aI542 -aI-823 -aI510 -aI-834 -aa(lp23186 -g15 -aI363 -aI-858 -aI439 -aI-853 -aI402 -aI-858 -aa(lp23187 -g15 -aI240 -aI-821 -aI310 -aI-858 -aI269 -aI-846 -aa(lp23188 -g15 -aI197 -aI-722 -aI211 -aI-796 -aI197 -aI-763 -aa(lp23189 -g15 -aI207 -aI-658 -aI197 -aI-697 -aI200 -aI-676 -aa(lp23190 -g15 -aI239 -aI-609 -aI213 -aI-640 -aI224 -aI-623 -aa(lp23191 -g15 -aI299 -aI-568 -aI254 -aI-594 -aI274 -aI-581 -aa(lp23192 -g15 -aI391 -aI-527 -aI324 -aI-555 -aI355 -aI-541 -aa(lp23193 -g15 -aI495 -aI-479 -aI431 -aI-511 -aI466 -aI-495 -aa(lp23194 -g15 -aI570 -aI-423 -aI525 -aI-462 -aI550 -aI-444 -aa(lp23195 -g15 -aI615 -aI-351 -aI590 -aI-402 -aI605 -aI-378 -aa(lp23196 -g15 -aI630 -aI-254 -aI625 -aI-323 -aI630 -aI-291 -aa(lp23197 -g10 -aa(lp23198 -g8 -aI692 -aI0 -aa(lp23199 -g10 -aa(lp23200 -g8 -aI692 -aI0 -aasVW -(lp23201 -(lp23202 -g8 -aI526 -aI-951 -aa(lp23203 -g20 -aI654 -aI-951 -aa(lp23204 -g20 -aI804 -aI-394 -aa(lp23205 -g15 -aI823 -aI-321 -aI810 -aI-369 -aI816 -aI-345 -aa(lp23206 -g15 -aI840 -aI-250 -aI829 -aI-296 -aI835 -aI-273 -aa(lp23207 -g15 -aI855 -aI-185 -aI846 -aI-227 -aI851 -aI-206 -aa(lp23208 -g15 -aI865 -aI-130 -aI859 -aI-165 -aI862 -aI-146 -aa(lp23209 -g15 -aI871 -aI-184 -aI866 -aI-146 -aI869 -aI-164 -aa(lp23210 -g15 -aI880 -aI-245 -aI874 -aI-203 -aI877 -aI-224 -aa(lp23211 -g15 -aI892 -aI-311 -aI884 -aI-267 -aI888 -aI-289 -aa(lp23212 -g15 -aI905 -aI-377 -aI896 -aI-334 -aI900 -aI-355 -aa(lp23213 -g20 -aI1035 -aI-951 -aa(lp23214 -g20 -aI1165 -aI-951 -aa(lp23215 -g20 -aI926 -aI0 -aa(lp23216 -g20 -aI804 -aI0 -aa(lp23217 -g20 -aI638 -aI-610 -aa(lp23218 -g15 -aI621 -aI-678 -aI632 -aI-632 -aI626 -aI-655 -aa(lp23219 -g15 -aI605 -aI-744 -aI615 -aI-702 -aI610 -aI-723 -aa(lp23220 -g15 -aI590 -aI-814 -aI600 -aI-768 -aI595 -aI-791 -aa(lp23221 -g15 -aI576 -aI-744 -aI585 -aI-791 -aI580 -aI-768 -aa(lp23222 -g15 -aI561 -aI-677 -aI571 -aI-724 -aI566 -aI-702 -aa(lp23223 -g15 -aI544 -aI-606 -aI556 -aI-653 -aI550 -aI-629 -aa(lp23224 -g20 -aI386 -aI0 -aa(lp23225 -g20 -aI264 -aI0 -aa(lp23226 -g20 -aI13 -aI-951 -aa(lp23227 -g20 -aI141 -aI-951 -aa(lp23228 -g20 -aI286 -aI-372 -aa(lp23229 -g15 -aI300 -aI-310 -aI291 -aI-352 -aI296 -aI-331 -aa(lp23230 -g15 -aI312 -aI-246 -aI305 -aI-288 -aI309 -aI-267 -aa(lp23231 -g15 -aI322 -aI-184 -aI316 -aI-225 -aI319 -aI-204 -aa(lp23232 -g15 -aI330 -aI-130 -aI325 -aI-165 -aI328 -aI-146 -aa(lp23233 -g15 -aI338 -aI-186 -aI332 -aI-146 -aI335 -aI-165 -aa(lp23234 -g15 -aI350 -aI-253 -aI342 -aI-207 -aI345 -aI-230 -aa(lp23235 -g15 -aI364 -aI-324 -aI354 -aI-276 -aI359 -aI-300 -aa(lp23236 -g15 -aI380 -aI-392 -aI369 -aI-348 -aI374 -aI-371 -aa(lp23237 -g10 -aa(lp23238 -g8 -aI1178 -aI0 -aa(lp23239 -g10 -aa(lp23240 -g8 -aI1178 -aI0 -aasV[ -(lp23241 -(lp23242 -g8 -aI370 -aI211 -aa(lp23243 -g20 -aI106 -aI211 -aa(lp23244 -g20 -aI106 -aI-951 -aa(lp23245 -g20 -aI370 -aI-951 -aa(lp23246 -g20 -aI370 -aI-854 -aa(lp23247 -g20 -aI225 -aI-854 -aa(lp23248 -g20 -aI225 -aI113 -aa(lp23249 -g20 -aI370 -aI113 -aa(lp23250 -g10 -aa(lp23251 -g8 -aI404 -aI0 -aa(lp23252 -g10 -aa(lp23253 -g8 -aI404 -aI0 -aasV_ -(lp23254 -(lp23255 -g8 -aI550 -aI211 -aa(lp23256 -g20 -aI-2 -aI211 -aa(lp23257 -g20 -aI-2 -aI120 -aa(lp23258 -g20 -aI550 -aI120 -aa(lp23259 -g10 -aa(lp23260 -g8 -aI548 -aI0 -aa(lp23261 -g10 -aa(lp23262 -g8 -aI548 -aI0 -aasVc -(lp23263 -(lp23264 -g8 -aI386 -aI13 -aa(lp23265 -g15 -aI263 -aI-7 -aI342 -aI13 -aI301 -aI6 -aa(lp23266 -g15 -aI164 -aI-72 -aI225 -aI-20 -aI192 -aI-42 -aa(lp23267 -g15 -aI97 -aI-186 -aI135 -aI-101 -aI113 -aI-139 -aa(lp23268 -g15 -aI73 -aI-353 -aI81 -aI-232 -aI73 -aI-287 -aa(lp23269 -g15 -aI98 -aI-526 -aI73 -aI-421 -aI81 -aI-479 -aa(lp23270 -g15 -aI166 -aI-642 -aI114 -aI-574 -aI137 -aI-612 -aa(lp23271 -g15 -aI267 -aI-707 -aI195 -aI-672 -aI228 -aI-693 -aa(lp23272 -g15 -aI391 -aI-727 -aI306 -aI-720 -aI347 -aI-727 -aa(lp23273 -g15 -aI491 -aI-716 -aI425 -aI-727 -aI458 -aI-723 -aa(lp23274 -g15 -aI572 -aI-689 -aI523 -aI-708 -aI550 -aI-699 -aa(lp23275 -g20 -aI537 -aI-588 -aa(lp23276 -g15 -aI503 -aI-601 -aI527 -aI-593 -aI516 -aI-597 -aa(lp23277 -g15 -aI466 -aI-612 -aI491 -aI-605 -aI479 -aI-609 -aa(lp23278 -g15 -aI427 -aI-620 -aI453 -aI-615 -aI440 -aI-618 -aa(lp23279 -g15 -aI391 -aI-623 -aI415 -aI-622 -aI403 -aI-623 -aa(lp23280 -g15 -aI242 -aI-557 -aI323 -aI-623 -aI274 -aI-601 -aa(lp23281 -g15 -aI195 -aI-354 -aI211 -aI-514 -aI195 -aI-446 -aa(lp23282 -g15 -aI243 -aI-153 -aI195 -aI-262 -aI211 -aI-195 -aa(lp23283 -g15 -aI386 -aI-90 -aI274 -aI-111 -aI322 -aI-90 -aa(lp23284 -g15 -aI482 -aI-102 -aI421 -aI-90 -aI453 -aI-94 -aa(lp23285 -g15 -aI559 -aI-130 -aI510 -aI-110 -aI536 -aI-119 -aa(lp23286 -g20 -aI559 -aI-24 -aa(lp23287 -g15 -aI484 -aI3 -aI536 -aI-12 -aI511 -aI-2 -aa(lp23288 -g15 -aI386 -aI13 -aI458 -aI10 -aI425 -aI13 -aa(lp23289 -g10 -aa(lp23290 -g8 -aI617 -aI0 -aa(lp23291 -g10 -aa(lp23292 -g8 -aI617 -aI0 -aasVg -(lp23293 -(lp23294 -g8 -aI664 -aI-714 -aa(lp23295 -g20 -aI664 -aI-640 -aa(lp23296 -g20 -aI535 -aI-623 -aa(lp23297 -g15 -aI566 -aI-564 -aI547 -aI-608 -aI558 -aI-588 -aa(lp23298 -g15 -aI578 -aI-484 -aI574 -aI-541 -aI578 -aI-514 -aa(lp23299 -g15 -aI563 -aI-393 -aI578 -aI-451 -aI573 -aI-421 -aa(lp23300 -g15 -aI517 -aI-320 -aI553 -aI-365 -aI537 -aI-340 -aa(lp23301 -g15 -aI440 -aI-272 -aI496 -aI-300 -aI471 -aI-284 -aa(lp23302 -g15 -aI334 -aI-255 -aI410 -aI-261 -aI375 -aI-255 -aa(lp23303 -g15 -aI305 -aI-255 -aI325 -aI-255 -aI315 -aI-255 -aa(lp23304 -g15 -aI282 -aI-258 -aI296 -aI-255 -aI288 -aI-256 -aa(lp23305 -g15 -aI260 -aI-243 -aI275 -aI-253 -aI267 -aI-248 -aa(lp23306 -g15 -aI241 -aI-224 -aI253 -aI-237 -aI247 -aI-231 -aa(lp23307 -g15 -aI226 -aI-201 -aI235 -aI-217 -aI230 -aI-210 -aa(lp23308 -g15 -aI221 -aI-172 -aI223 -aI-192 -aI221 -aI-183 -aa(lp23309 -g15 -aI229 -aI-144 -aI221 -aI-161 -aI223 -aI-151 -aa(lp23310 -g15 -aI250 -aI-127 -aI234 -aI-137 -aI241 -aI-131 -aa(lp23311 -g15 -aI281 -aI-119 -aI259 -aI-123 -aI269 -aI-121 -aa(lp23312 -g15 -aI320 -aI-118 -aI294 -aI-118 -aI306 -aI-118 -aa(lp23313 -g20 -aI434 -aI-118 -aa(lp23314 -g15 -aI537 -aI-102 -aI475 -aI-118 -aI509 -aI-112 -aa(lp23315 -g15 -aI605 -aI-61 -aI564 -aI-92 -aI587 -aI-78 -aa(lp23316 -g15 -aI643 -aI0 -aI622 -aI-44 -aI635 -aI-23 -aa(lp23317 -g15 -aI654 -aI75 -aI651 -aI23 -aI654 -aI48 -aa(lp23318 -g15 -aI633 -aI178 -aI654 -aI113 -aI647 -aI147 -aa(lp23319 -g15 -aI569 -aI255 -aI619 -aI208 -aI598 -aI234 -aa(lp23320 -g15 -aI458 -aI303 -aI539 -aI276 -aI503 -aI292 -aa(lp23321 -g15 -aI301 -aI320 -aI414 -aI315 -aI361 -aI320 -aa(lp23322 -g15 -aI179 -aI307 -aI254 -aI320 -aI214 -aI316 -aa(lp23323 -g15 -aI93 -aI267 -aI144 -aI297 -aI116 -aI284 -aa(lp23324 -g15 -aI41 -aI204 -aI70 -aI250 -aI52 -aI229 -aa(lp23325 -g15 -aI24 -aI121 -aI29 -aI180 -aI24 -aI152 -aa(lp23326 -g15 -aI36 -aI52 -aI24 -aI95 -aI28 -aI72 -aa(lp23327 -g15 -aI70 -aI1 -aI45 -aI33 -aI56 -aI16 -aa(lp23328 -g15 -aI120 -aI-33 -aI85 -aI-12 -aI101 -aI-24 -aa(lp23329 -g15 -aI179 -aI-54 -aI139 -aI-42 -aI159 -aI-49 -aa(lp23330 -g15 -aI134 -aI-93 -aI161 -aI-62 -aI146 -aI-75 -aa(lp23331 -g15 -aI117 -aI-154 -aI123 -aI-111 -aI117 -aI-131 -aa(lp23332 -g15 -aI138 -aI-223 -aI117 -aI-180 -aI124 -aI-203 -aa(lp23333 -g15 -aI203 -aI-279 -aI151 -aI-242 -aI173 -aI-261 -aa(lp23334 -g15 -aI152 -aI-311 -aI185 -aI-287 -aI168 -aI-298 -aa(lp23335 -g15 -aI113 -aI-358 -aI137 -aI-325 -aI124 -aI-341 -aa(lp23336 -g15 -aI88 -aI-416 -aI102 -aI-376 -aI94 -aI-395 -aa(lp23337 -g15 -aI80 -aI-480 -aI83 -aI-437 -aI80 -aI-458 -aa(lp23338 -g15 -aI96 -aI-584 -aI80 -aI-519 -aI85 -aI-553 -aa(lp23339 -g15 -aI144 -aI-661 -aI107 -aI-614 -aI123 -aI-640 -aa(lp23340 -g15 -aI223 -aI-710 -aI165 -aI-682 -aI192 -aI-699 -aa(lp23341 -g15 -aI334 -aI-727 -aI255 -aI-721 -aI292 -aI-727 -aa(lp23342 -g15 -aI384 -aI-723 -aI350 -aI-727 -aI367 -aI-726 -aa(lp23343 -g15 -aI427 -aI-714 -aI401 -aI-721 -aI416 -aI-718 -aa(lp23344 -g10 -aa(lp23345 -g8 -aI136 -aI117 -aa(lp23346 -g15 -aI144 -aI162 -aI136 -aI133 -aI138 -aI148 -aa(lp23347 -g15 -aI172 -aI198 -aI150 -aI176 -aI159 -aI188 -aa(lp23348 -g15 -aI222 -aI222 -aI185 -aI208 -aI201 -aI216 -aa(lp23349 -g15 -aI301 -aI230 -aI244 -aI227 -aI270 -aI230 -aa(lp23350 -g15 -aI482 -aI193 -aI382 -aI230 -aI442 -aI218 -aa(lp23351 -g15 -aI542 -aI85 -aI522 -aI168 -aI542 -aI132 -aa(lp23352 -g15 -aI535 -aI36 -aI542 -aI65 -aI540 -aI49 -aa(lp23353 -g15 -aI509 -aI7 -aI529 -aI24 -aI521 -aI14 -aa(lp23354 -g15 -aI462 -aI-7 -aI497 -aI0 -aI481 -aI-4 -aa(lp23355 -g15 -aI390 -aI-11 -aI442 -aI-9 -aI418 -aI-11 -aa(lp23356 -g20 -aI276 -aI-11 -aa(lp23357 -g15 -aI228 -aI-6 -aI260 -aI-11 -aI245 -aI-9 -aa(lp23358 -g15 -aI183 -aI13 -aI212 -aI-2 -aI196 -aI3 -aa(lp23359 -g15 -aI149 -aI52 -aI169 -aI23 -aI158 -aI36 -aa(lp23360 -g15 -aI136 -aI117 -aI140 -aI69 -aI136 -aI91 -aa(lp23361 -g10 -aa(lp23362 -g8 -aI195 -aI-484 -aa(lp23363 -g15 -aI231 -aI-373 -aI195 -aI-434 -aI207 -aI-397 -aa(lp23364 -g15 -aI330 -aI-336 -aI254 -aI-348 -aI287 -aI-336 -aa(lp23365 -g15 -aI429 -aI-372 -aI374 -aI-336 -aI407 -aI-348 -aa(lp23366 -g15 -aI462 -aI-486 -aI451 -aI-397 -aI462 -aI-434 -aa(lp23367 -g15 -aI428 -aI-604 -aI462 -aI-539 -aI451 -aI-579 -aa(lp23368 -g15 -aI329 -aI-642 -aI405 -aI-629 -aI372 -aI-642 -aa(lp23369 -g15 -aI230 -aI-603 -aI286 -aI-642 -aI253 -aI-629 -aa(lp23370 -g15 -aI195 -aI-484 -aI207 -aI-577 -aI195 -aI-537 -aa(lp23371 -g10 -aa(lp23372 -g8 -aI690 -aI0 -aa(lp23373 -g10 -aa(lp23374 -g8 -aI690 -aI0 -aasVk -(lp23375 -(lp23376 -g8 -aI222 -aI-368 -aa(lp23377 -g20 -aI310 -aI-479 -aa(lp23378 -g20 -aI501 -aI-714 -aa(lp23379 -g20 -aI638 -aI-714 -aa(lp23380 -g20 -aI377 -aI-405 -aa(lp23381 -g20 -aI656 -aI0 -aa(lp23382 -g20 -aI520 -aI0 -aa(lp23383 -g20 -aI301 -aI-327 -aa(lp23384 -g20 -aI230 -aI-274 -aa(lp23385 -g20 -aI230 -aI0 -aa(lp23386 -g20 -aI113 -aI0 -aa(lp23387 -g20 -aI113 -aI-1012 -aa(lp23388 -g20 -aI230 -aI-1012 -aa(lp23389 -g20 -aI230 -aI-547 -aa(lp23390 -g20 -aI220 -aI-368 -aa(lp23391 -g10 -aa(lp23392 -g8 -aI661 -aI0 -aa(lp23393 -g10 -aa(lp23394 -g8 -aI661 -aI0 -aasVo -(lp23395 -(lp23396 -g8 -aI695 -aI-358 -aa(lp23397 -g15 -aI674 -aI-199 -aI695 -aI-298 -aI688 -aI-245 -aa(lp23398 -g15 -aI611 -aI-83 -aI659 -aI-153 -aI638 -aI-114 -aa(lp23399 -g15 -aI513 -aI-11 -aI584 -aI-51 -aI551 -aI-27 -aa(lp23400 -g15 -aI382 -aI13 -aI474 -aI5 -aI430 -aI13 -aa(lp23401 -g15 -aI259 -aI-11 -aI338 -aI13 -aI296 -aI5 -aa(lp23402 -g15 -aI161 -aI-83 -aI221 -aI-27 -aI188 -aI-51 -aa(lp23403 -g15 -aI96 -aI-199 -aI133 -aI-114 -aI112 -aI-153 -aa(lp23404 -g15 -aI73 -aI-358 -aI81 -aI-245 -aI73 -aI-298 -aa(lp23405 -g15 -aI95 -aI-515 -aI73 -aI-417 -aI80 -aI-469 -aa(lp23406 -g15 -aI157 -aI-631 -aI109 -aI-561 -aI130 -aI-599 -aa(lp23407 -g15 -aI256 -aI-702 -aI184 -aI-662 -aI217 -aI-686 -aa(lp23408 -g15 -aI386 -aI-727 -aI295 -aI-719 -aI338 -aI-727 -aa(lp23409 -g15 -aI510 -aI-702 -aI431 -aI-727 -aI472 -aI-719 -aa(lp23410 -g15 -aI608 -aI-631 -aI548 -aI-686 -aI580 -aI-662 -aa(lp23411 -g15 -aI672 -aI-515 -aI635 -aI-599 -aI657 -aI-561 -aa(lp23412 -g15 -aI695 -aI-358 -aI688 -aI-469 -aI695 -aI-417 -aa(lp23413 -g10 -aa(lp23414 -g8 -aI195 -aI-358 -aa(lp23415 -g15 -aI240 -aI-153 -aI195 -aI-267 -aI210 -aI-199 -aa(lp23416 -g15 -aI385 -aI-84 -aI270 -aI-107 -aI318 -aI-84 -aa(lp23417 -g15 -aI529 -aI-153 -aI452 -aI-84 -aI500 -aI-107 -aa(lp23418 -g15 -aI573 -aI-358 -aI558 -aI-199 -aI573 -aI-267 -aa(lp23419 -g15 -aI528 -aI-561 -aI573 -aI-448 -aI558 -aI-516 -aa(lp23420 -g15 -aI384 -aI-629 -aI499 -aI-606 -aI450 -aI-629 -aa(lp23421 -g15 -aI239 -aI-561 -aI317 -aI-629 -aI269 -aI-606 -aa(lp23422 -g15 -aI195 -aI-358 -aI210 -aI-516 -aI195 -aI-448 -aa(lp23423 -g10 -aa(lp23424 -g8 -aI769 -aI0 -aa(lp23425 -g10 -aa(lp23426 -g8 -aI769 -aI0 -aasVs -(lp23427 -(lp23428 -g8 -aI541 -aI-195 -aa(lp23429 -g15 -aI522 -aI-104 -aI541 -aI-160 -aI534 -aI-130 -aa(lp23430 -g15 -aI467 -aI-38 -aI509 -aI-78 -aI491 -aI-56 -aa(lp23431 -g15 -aI382 -aI0 -aI444 -aI-21 -aI415 -aI-8 -aa(lp23432 -g15 -aI269 -aI13 -aI348 -aI9 -aI311 -aI13 -aa(lp23433 -g15 -aI147 -aI2 -aI222 -aI13 -aI181 -aI9 -aa(lp23434 -g15 -aI58 -aI-31 -aI113 -aI-5 -aI84 -aI-16 -aa(lp23435 -g20 -aI58 -aI-139 -aa(lp23436 -g15 -aI103 -aI-119 -aI72 -aI-132 -aI87 -aI-125 -aa(lp23437 -g15 -aI155 -aI-101 -aI120 -aI-112 -aI137 -aI-106 -aa(lp23438 -g15 -aI211 -aI-88 -aI173 -aI-95 -aI192 -aI-91 -aa(lp23439 -g15 -aI269 -aI-83 -aI231 -aI-85 -aI250 -aI-83 -aa(lp23440 -g15 -aI341 -aI-90 -aI297 -aI-83 -aI321 -aI-85 -aa(lp23441 -g15 -aI389 -aI-111 -aI361 -aI-95 -aI377 -aI-102 -aa(lp23442 -g15 -aI416 -aI-143 -aI402 -aI-120 -aI411 -aI-130 -aa(lp23443 -g15 -aI425 -aI-186 -aI422 -aI-156 -aI425 -aI-170 -aa(lp23444 -g15 -aI418 -aI-222 -aI425 -aI-199 -aI422 -aI-212 -aa(lp23445 -g15 -aI394 -aI-255 -aI414 -aI-233 -aI406 -aI-244 -aa(lp23446 -g15 -aI347 -aI-287 -aI383 -aI-265 -aI367 -aI-276 -aa(lp23447 -g15 -aI270 -aI-323 -aI327 -aI-298 -aI302 -aI-310 -aa(lp23448 -g15 -aI186 -aI-363 -aI239 -aI-337 -aI211 -aI-350 -aa(lp23449 -g15 -aI123 -aI-407 -aI161 -aI-376 -aI140 -aI-391 -aa(lp23450 -g15 -aI83 -aI-462 -aI105 -aI-423 -aI92 -aI-441 -aa(lp23451 -g15 -aI69 -aI-537 -aI73 -aI-483 -aI69 -aI-508 -aa(lp23452 -g15 -aI86 -aI-619 -aI69 -aI-568 -aI74 -aI-595 -aa(lp23453 -g15 -aI137 -aI-678 -aI98 -aI-642 -aI115 -aI-662 -aa(lp23454 -g15 -aI215 -aI-715 -aI159 -aI-694 -aI185 -aI-706 -aa(lp23455 -g15 -aI317 -aI-727 -aI245 -aI-723 -aI279 -aI-727 -aa(lp23456 -g15 -aI432 -aI-713 -aI359 -aI-727 -aI397 -aI-722 -aa(lp23457 -g15 -aI531 -aI-677 -aI467 -aI-704 -aI500 -aI-692 -aa(lp23458 -g20 -aI490 -aI-582 -aa(lp23459 -g15 -aI403 -aI-615 -aI462 -aI-594 -aI433 -aI-605 -aa(lp23460 -g15 -aI313 -aI-629 -aI374 -aI-624 -aI343 -aI-629 -aa(lp23461 -g15 -aI214 -aI-607 -aI268 -aI-629 -aI236 -aI-621 -aa(lp23462 -g15 -aI182 -aI-545 -aI193 -aI-592 -aI182 -aI-572 -aa(lp23463 -g15 -aI190 -aI-505 -aI182 -aI-529 -aI185 -aI-516 -aa(lp23464 -g15 -aI216 -aI-473 -aI195 -aI-494 -aI203 -aI-483 -aa(lp23465 -g15 -aI264 -aI-443 -aI228 -aI-463 -aI244 -aI-453 -aa(lp23466 -g15 -aI341 -aI-409 -aI285 -aI-433 -aI310 -aI-421 -aa(lp23467 -g15 -aI424 -aI-369 -aI372 -aI-396 -aI400 -aI-383 -aa(lp23468 -g15 -aI487 -aI-326 -aI449 -aI-356 -aI470 -aI-342 -aa(lp23469 -g15 -aI527 -aI-270 -aI504 -aI-309 -aI518 -aI-291 -aa(lp23470 -g15 -aI541 -aI-195 -aI536 -aI-249 -aI541 -aI-224 -aa(lp23471 -g10 -aa(lp23472 -g8 -aI601 -aI0 -aa(lp23473 -g10 -aa(lp23474 -g8 -aI601 -aI0 -aasVw -(lp23475 -(lp23476 -g8 -aI656 -aI0 -aa(lp23477 -g20 -aI546 -aI-400 -aa(lp23478 -g15 -aI540 -aI-426 -aI545 -aI-408 -aI542 -aI-417 -aa(lp23479 -g15 -aI532 -aI-457 -aI537 -aI-436 -aI535 -aI-447 -aa(lp23480 -g15 -aI524 -aI-491 -aI529 -aI-468 -aI527 -aI-479 -aa(lp23481 -g15 -aI516 -aI-524 -aI521 -aI-502 -aI518 -aI-513 -aa(lp23482 -g15 -aI497 -aI-602 -aI510 -aI-549 -aI503 -aI-575 -aa(lp23483 -g20 -aI493 -aI-602 -aa(lp23484 -g15 -aI475 -aI-523 -aI487 -aI-575 -aI481 -aI-548 -aa(lp23485 -g15 -aI460 -aI-456 -aI471 -aI-501 -aI466 -aI-479 -aa(lp23486 -g15 -aI445 -aI-397 -aI455 -aI-433 -aI450 -aI-414 -aa(lp23487 -g20 -aI333 -aI0 -aa(lp23488 -g20 -aI195 -aI0 -aa(lp23489 -g20 -aI13 -aI-714 -aa(lp23490 -g20 -aI137 -aI-714 -aa(lp23491 -g20 -aI222 -aI-334 -aa(lp23492 -g15 -aI235 -aI-270 -aI226 -aI-314 -aI231 -aI-293 -aa(lp23493 -g15 -aI248 -aI-202 -aI240 -aI-247 -aI244 -aI-225 -aa(lp23494 -g15 -aI258 -aI-139 -aI251 -aI-180 -aI255 -aI-159 -aa(lp23495 -g15 -aI265 -aI-91 -aI261 -aI-120 -aI263 -aI-103 -aa(lp23496 -g20 -aI269 -aI-91 -aa(lp23497 -g15 -aI278 -aI-136 -aI271 -aI-102 -aI274 -aI-117 -aa(lp23498 -g15 -aI290 -aI-196 -aI282 -aI-155 -aI286 -aI-175 -aa(lp23499 -g15 -aI304 -aI-258 -aI295 -aI-217 -aI299 -aI-238 -aa(lp23500 -g15 -aI318 -aI-311 -aI309 -aI-279 -aI314 -aI-297 -aa(lp23501 -g20 -aI434 -aI-714 -aa(lp23502 -g20 -aI562 -aI-714 -aa(lp23503 -g20 -aI674 -aI-311 -aa(lp23504 -g15 -aI687 -aI-259 -aI678 -aI-296 -aI682 -aI-279 -aa(lp23505 -g15 -aI702 -aI-198 -aI692 -aI-239 -aI697 -aI-219 -aa(lp23506 -g15 -aI715 -aI-138 -aI707 -aI-177 -aI711 -aI-157 -aa(lp23507 -g15 -aI723 -aI-91 -aI719 -aI-119 -aI722 -aI-103 -aa(lp23508 -g20 -aI727 -aI-91 -aa(lp23509 -g15 -aI734 -aI-136 -aI729 -aI-102 -aI731 -aI-117 -aa(lp23510 -g15 -aI744 -aI-198 -aI736 -aI-155 -aI740 -aI-176 -aa(lp23511 -g15 -aI756 -aI-268 -aI748 -aI-221 -aI752 -aI-244 -aa(lp23512 -g15 -aI770 -aI-334 -aI761 -aI-291 -aI766 -aI-313 -aa(lp23513 -g20 -aI860 -aI-714 -aa(lp23514 -g20 -aI981 -aI-714 -aa(lp23515 -g20 -aI796 -aI0 -aa(lp23516 -g10 -aa(lp23517 -g8 -aI994 -aI0 -aa(lp23518 -g10 -aa(lp23519 -g8 -aI994 -aI0 -aasV{ -(lp23520 -(lp23521 -g8 -aI325 -aI10 -aa(lp23522 -g15 -aI333 -aI61 -aI325 -aI31 -aI328 -aI48 -aa(lp23523 -g15 -aI355 -aI93 -aI338 -aI75 -aI346 -aI85 -aa(lp23524 -g15 -aI391 -aI108 -aI365 -aI100 -aI377 -aI106 -aa(lp23525 -g15 -aI438 -aI113 -aI405 -aI111 -aI421 -aI113 -aa(lp23526 -g20 -aI438 -aI211 -aa(lp23527 -g15 -aI346 -aI199 -aI405 -aI210 -aI374 -aI207 -aa(lp23528 -g15 -aI272 -aI166 -aI317 -aI192 -aI293 -aI181 -aa(lp23529 -g15 -aI223 -aI107 -aI251 -aI150 -aI235 -aI131 -aa(lp23530 -g15 -aI206 -aI20 -aI212 -aI83 -aI206 -aI54 -aa(lp23531 -g20 -aI206 -aI-196 -aa(lp23532 -g15 -aI163 -aI-291 -aI206 -aI-241 -aI192 -aI-273 -aa(lp23533 -g15 -aI39 -aI-319 -aI135 -aI-310 -aI93 -aI-319 -aa(lp23534 -g20 -aI39 -aI-420 -aa(lp23535 -g15 -aI163 -aI-448 -aI93 -aI-420 -aI135 -aI-430 -aa(lp23536 -g15 -aI206 -aI-543 -aI192 -aI-467 -aI206 -aI-499 -aa(lp23537 -g20 -aI206 -aI-760 -aa(lp23538 -g15 -aI223 -aI-847 -aI206 -aI-794 -aI212 -aI-823 -aa(lp23539 -g15 -aI272 -aI-906 -aI235 -aI-871 -aI251 -aI-890 -aa(lp23540 -g15 -aI346 -aI-939 -aI293 -aI-921 -aI317 -aI-932 -aa(lp23541 -g15 -aI438 -aI-951 -aI374 -aI-947 -aI405 -aI-950 -aa(lp23542 -g20 -aI438 -aI-854 -aa(lp23543 -g15 -aI391 -aI-849 -aI421 -aI-853 -aI405 -aI-852 -aa(lp23544 -g15 -aI355 -aI-833 -aI377 -aI-846 -aI365 -aI-841 -aa(lp23545 -g15 -aI333 -aI-802 -aI346 -aI-826 -aI338 -aI-815 -aa(lp23546 -g15 -aI325 -aI-751 -aI328 -aI-789 -aI325 -aI-772 -aa(lp23547 -g20 -aI325 -aI-535 -aa(lp23548 -g15 -aI286 -aI-426 -aI325 -aI-489 -aI312 -aI-453 -aa(lp23549 -g15 -aI173 -aI-373 -aI260 -aI-400 -aI223 -aI-382 -aa(lp23550 -g20 -aI173 -aI-366 -aa(lp23551 -g15 -aI286 -aI-313 -aI223 -aI-357 -aI260 -aI-339 -aa(lp23552 -g15 -aI325 -aI-204 -aI312 -aI-286 -aI325 -aI-250 -aa(lp23553 -g10 -aa(lp23554 -g8 -aI472 -aI0 -aa(lp23555 -g10 -aa(lp23556 -g8 -aI472 -aI0 -aasV" -(lp23557 -(lp23558 -g8 -aI214 -aI-951 -aa(lp23559 -g20 -aI188 -aI-607 -aa(lp23560 -g20 -aI113 -aI-607 -aa(lp23561 -g20 -aI86 -aI-951 -aa(lp23562 -g10 -aa(lp23563 -g8 -aI449 -aI-951 -aa(lp23564 -g20 -aI422 -aI-607 -aa(lp23565 -g20 -aI348 -aI-607 -aa(lp23566 -g20 -aI321 -aI-951 -aa(lp23567 -g10 -aa(lp23568 -g8 -aI535 -aI0 -aa(lp23569 -g10 -aa(lp23570 -g8 -aI535 -aI0 -aasV& -(lp23571 -(lp23572 -g8 -aI274 -aI-758 -aa(lp23573 -g15 -aI279 -aI-714 -aI274 -aI-743 -aI276 -aI-728 -aa(lp23574 -g15 -aI295 -aI-672 -aI283 -aI-700 -aI288 -aI-686 -aa(lp23575 -g15 -aI323 -aI-629 -aI303 -aI-658 -aI312 -aI-643 -aa(lp23576 -g15 -aI363 -aI-583 -aI334 -aI-614 -aI348 -aI-599 -aa(lp23577 -g15 -aI430 -aI-626 -aI389 -aI-598 -aI411 -aI-613 -aa(lp23578 -g15 -aI476 -aI-667 -aI449 -aI-639 -aI464 -aI-653 -aa(lp23579 -g15 -aI503 -aI-711 -aI488 -aI-681 -aI497 -aI-695 -aa(lp23580 -g15 -aI513 -aI-760 -aI509 -aI-726 -aI513 -aI-742 -aa(lp23581 -g15 -aI504 -aI-803 -aI513 -aI-776 -aI510 -aI-790 -aa(lp23582 -g15 -aI481 -aI-838 -aI499 -aI-817 -aI491 -aI-828 -aa(lp23583 -g15 -aI444 -aI-860 -aI471 -aI-847 -aI458 -aI-855 -aa(lp23584 -g15 -aI395 -aI-868 -aI430 -aI-865 -aI414 -aI-868 -aa(lp23585 -g15 -aI307 -aI-839 -aI358 -aI-868 -aI328 -aI-859 -aa(lp23586 -g15 -aI274 -aI-758 -aI285 -aI-820 -aI274 -aI-793 -aa(lp23587 -g10 -aa(lp23588 -g8 -aI362 -aI-91 -aa(lp23589 -g15 -aI432 -aI-98 -aI387 -aI-91 -aI411 -aI-93 -aa(lp23590 -g15 -aI491 -aI-119 -aI453 -aI-103 -aI473 -aI-110 -aa(lp23591 -g15 -aI542 -aI-149 -aI509 -aI-128 -aI526 -aI-138 -aa(lp23592 -g15 -aI586 -aI-187 -aI557 -aI-161 -aI572 -aI-174 -aa(lp23593 -g20 -aI334 -aI-452 -aa(lp23594 -g15 -aI274 -aI-410 -aI312 -aI-438 -aI292 -aI-424 -aa(lp23595 -g15 -aI230 -aI-366 -aI257 -aI-397 -aI242 -aI-382 -aa(lp23596 -g15 -aI203 -aI-315 -aI218 -aI-351 -aI209 -aI-334 -aa(lp23597 -g15 -aI194 -aI-251 -aI197 -aI-297 -aI194 -aI-275 -aa(lp23598 -g15 -aI206 -aI-186 -aI194 -aI-228 -aI198 -aI-206 -aa(lp23599 -g15 -aI238 -aI-135 -aI213 -aI-166 -aI224 -aI-150 -aa(lp23600 -g15 -aI291 -aI-103 -aI253 -aI-121 -aI270 -aI-110 -aa(lp23601 -g15 -aI362 -aI-91 -aI312 -aI-95 -aI336 -aI-91 -aa(lp23602 -g10 -aa(lp23603 -g8 -aI70 -aI-247 -aa(lp23604 -g15 -aI83 -aI-338 -aI70 -aI-281 -aI75 -aI-311 -aa(lp23605 -g15 -aI122 -aI-410 -aI92 -aI-364 -aI105 -aI-388 -aa(lp23606 -g15 -aI183 -aI-470 -aI138 -aI-432 -aI159 -aI-452 -aa(lp23607 -g15 -aI265 -aI-526 -aI207 -aI-489 -aI234 -aI-508 -aa(lp23608 -g15 -aI225 -aI-574 -aI252 -aI-541 -aI238 -aI-558 -aa(lp23609 -g15 -aI191 -aI-628 -aI212 -aI-591 -aI201 -aI-609 -aa(lp23610 -g15 -aI167 -aI-688 -aI181 -aI-647 -aI174 -aI-667 -aa(lp23611 -g15 -aI158 -aI-758 -aI161 -aI-710 -aI158 -aI-733 -aa(lp23612 -g15 -aI175 -aI-845 -aI158 -aI-790 -aI164 -aI-819 -aa(lp23613 -g15 -aI222 -aI-911 -aI185 -aI-871 -aI201 -aI-893 -aa(lp23614 -g15 -aI297 -aI-952 -aI242 -aI-929 -aI267 -aI-943 -aa(lp23615 -g15 -aI399 -aI-966 -aI327 -aI-961 -aI361 -aI-966 -aa(lp23616 -g15 -aI496 -aI-952 -aI435 -aI-966 -aI467 -aI-961 -aa(lp23617 -g15 -aI568 -aI-911 -aI524 -aI-943 -aI548 -aI-929 -aa(lp23618 -g15 -aI613 -aI-845 -aI588 -aI-893 -aI603 -aI-871 -aa(lp23619 -g15 -aI629 -aI-758 -aI624 -aI-819 -aI629 -aI-790 -aa(lp23620 -g15 -aI613 -aI-680 -aI629 -aI-730 -aI624 -aI-704 -aa(lp23621 -g15 -aI569 -aI-615 -aI602 -aI-657 -aI587 -aI-635 -aa(lp23622 -g15 -aI506 -aI-559 -aI551 -aI-594 -aI530 -aI-576 -aa(lp23623 -g15 -aI432 -aI-509 -aI483 -aI-541 -aI458 -aI-525 -aa(lp23624 -g20 -aI661 -aI-267 -aa(lp23625 -g15 -aI693 -aI-306 -aI673 -aI-280 -aI683 -aI-293 -aa(lp23626 -g15 -aI718 -aI-347 -aI702 -aI-319 -aI710 -aI-333 -aa(lp23627 -g15 -aI737 -aI-395 -aI725 -aI-362 -aI732 -aI-378 -aa(lp23628 -g15 -aI753 -aI-451 -aI743 -aI-412 -aI748 -aI-430 -aa(lp23629 -g20 -aI873 -aI-451 -aa(lp23630 -g15 -aI849 -aI-372 -aI866 -aI-422 -aI858 -aI-396 -aa(lp23631 -g15 -aI819 -aI-304 -aI841 -aI-348 -aI830 -aI-325 -aa(lp23632 -g15 -aI780 -aI-244 -aI807 -aI-282 -aI795 -aI-263 -aa(lp23633 -g15 -aI734 -aI-190 -aI766 -aI-226 -aI751 -aI-208 -aa(lp23634 -g20 -aI914 -aI0 -aa(lp23635 -g20 -aI768 -aI0 -aa(lp23636 -g20 -aI658 -aI-111 -aa(lp23637 -g15 -aI595 -aI-59 -aI637 -aI-91 -aI616 -aI-74 -aa(lp23638 -g15 -aI529 -aI-20 -aI574 -aI-43 -aI552 -aI-30 -aa(lp23639 -g15 -aI453 -aI4 -aI505 -aI-9 -aI480 -aI-1 -aa(lp23640 -g15 -aI362 -aI13 -aI426 -aI10 -aI396 -aI13 -aa(lp23641 -g15 -aI239 -aI-3 -aI317 -aI13 -aI276 -aI7 -aa(lp23642 -g15 -aI148 -aI-54 -aI203 -aI-15 -aI173 -aI-32 -aa(lp23643 -g15 -aI90 -aI-136 -aI123 -aI-76 -aI104 -aI-104 -aa(lp23644 -g15 -aI70 -aI-247 -aI77 -aI-168 -aI70 -aI-205 -aa(lp23645 -g10 -aa(lp23646 -g8 -aI936 -aI0 -aa(lp23647 -g10 -aa(lp23648 -g8 -aI936 -aI0 -aasV* -(lp23649 -(lp23650 -g8 -aI432 -aI-1012 -aa(lp23651 -g20 -aI404 -aI-756 -aa(lp23652 -g20 -aI662 -aI-828 -aa(lp23653 -g20 -aI679 -aI-703 -aa(lp23654 -g20 -aI433 -aI-685 -aa(lp23655 -g20 -aI593 -aI-472 -aa(lp23656 -g20 -aI477 -aI-410 -aa(lp23657 -g20 -aI362 -aI-643 -aa(lp23658 -g20 -aI259 -aI-410 -aa(lp23659 -g20 -aI139 -aI-472 -aa(lp23660 -g20 -aI297 -aI-685 -aa(lp23661 -g20 -aI53 -aI-703 -aa(lp23662 -g20 -aI72 -aI-828 -aa(lp23663 -g20 -aI326 -aI-756 -aa(lp23664 -g20 -aI298 -aI-1012 -aa(lp23665 -g10 -aa(lp23666 -g8 -aI734 -aI0 -aa(lp23667 -g10 -aa(lp23668 -g8 -aI734 -aI0 -aasV. -(lp23669 -(lp23670 -g8 -aI95 -aI-71 -aa(lp23671 -g15 -aI102 -aI-113 -aI95 -aI-88 -aI97 -aI-102 -aa(lp23672 -g15 -aI119 -aI-141 -aI106 -aI-125 -aI112 -aI-134 -aa(lp23673 -g15 -aI145 -aI-157 -aI127 -aI-148 -aI135 -aI-154 -aa(lp23674 -g15 -aI178 -aI-162 -aI155 -aI-160 -aI166 -aI-162 -aa(lp23675 -g15 -aI210 -aI-157 -aI189 -aI-162 -aI200 -aI-160 -aa(lp23676 -g15 -aI236 -aI-141 -aI220 -aI-154 -aI229 -aI-148 -aa(lp23677 -g15 -aI254 -aI-113 -aI244 -aI-134 -aI250 -aI-125 -aa(lp23678 -g15 -aI261 -aI-71 -aI258 -aI-102 -aI261 -aI-88 -aa(lp23679 -g15 -aI254 -aI-30 -aI261 -aI-55 -aI258 -aI-41 -aa(lp23680 -g15 -aI236 -aI-2 -aI250 -aI-18 -aI244 -aI-9 -aa(lp23681 -g15 -aI210 -aI14 -aI229 -aI5 -aI220 -aI10 -aa(lp23682 -g15 -aI178 -aI19 -aI200 -aI17 -aI189 -aI19 -aa(lp23683 -g15 -aI145 -aI14 -aI166 -aI19 -aI155 -aI17 -aa(lp23684 -g15 -aI119 -aI-2 -aI135 -aI10 -aI127 -aI5 -aa(lp23685 -g15 -aI102 -aI-30 -aI112 -aI-9 -aI106 -aI-18 -aa(lp23686 -g15 -aI95 -aI-71 -aI97 -aI-41 -aI95 -aI-55 -aa(lp23687 -g10 -aa(lp23688 -g8 -aI357 -aI0 -aa(lp23689 -g10 -aa(lp23690 -g8 -aI357 -aI0 -aasV2 -(lp23691 -(lp23692 -g8 -aI656 -aI0 -aa(lp23693 -g20 -aI62 -aI0 -aa(lp23694 -g20 -aI62 -aI-101 -aa(lp23695 -g20 -aI290 -aI-349 -aa(lp23696 -g15 -aI377 -aI-445 -aI322 -aI-384 -aI351 -aI-416 -aa(lp23697 -g15 -aI443 -aI-530 -aI403 -aI-474 -aI425 -aI-503 -aa(lp23698 -g15 -aI484 -aI-614 -aI461 -aI-558 -aI474 -aI-586 -aa(lp23699 -g15 -aI498 -aI-705 -aI493 -aI-642 -aI498 -aI-672 -aa(lp23700 -g15 -aI487 -aI-773 -aI498 -aI-731 -aI495 -aI-754 -aa(lp23701 -g15 -aI456 -aI-823 -aI480 -aI-793 -aI469 -aI-809 -aa(lp23702 -g15 -aI407 -aI-854 -aI442 -aI-837 -aI426 -aI-847 -aa(lp23703 -g15 -aI345 -aI-864 -aI388 -aI-861 -aI368 -aI-864 -aa(lp23704 -g15 -aI233 -aI-839 -aI303 -aI-864 -aI266 -aI-856 -aa(lp23705 -g15 -aI138 -aI-775 -aI200 -aI-823 -aI168 -aI-801 -aa(lp23706 -g20 -aI72 -aI-853 -aa(lp23707 -g15 -aI128 -aI-897 -aI89 -aI-868 -aI108 -aI-883 -aa(lp23708 -g15 -aI192 -aI-932 -aI148 -aI-910 -aI169 -aI-922 -aa(lp23709 -g15 -aI265 -aI-956 -aI215 -aI-942 -aI240 -aI-950 -aa(lp23710 -g15 -aI346 -aI-965 -aI291 -aI-962 -aI318 -aI-965 -aa(lp23711 -g15 -aI459 -aI-947 -aI388 -aI-965 -aI425 -aI-959 -aa(lp23712 -g15 -aI544 -aI-897 -aI492 -aI-935 -aI521 -aI-918 -aa(lp23713 -g15 -aI599 -aI-816 -aI568 -aI-875 -aI586 -aI-848 -aa(lp23714 -g15 -aI618 -aI-710 -aI612 -aI-785 -aI618 -aI-749 -aa(lp23715 -g15 -aI601 -aI-605 -aI618 -aI-673 -aI612 -aI-638 -aa(lp23716 -g15 -aI553 -aI-506 -aI589 -aI-571 -aI573 -aI-538 -aa(lp23717 -g15 -aI481 -aI-409 -aI533 -aI-474 -aI509 -aI-441 -aa(lp23718 -g15 -aI390 -aI-307 -aI453 -aI-376 -aI423 -aI-342 -aa(lp23719 -g20 -aI207 -aI-112 -aa(lp23720 -g20 -aI207 -aI-107 -aa(lp23721 -g20 -aI656 -aI-107 -aa(lp23722 -g10 -aa(lp23723 -g8 -aI734 -aI0 -aa(lp23724 -g10 -aa(lp23725 -g8 -aI734 -aI0 -aasV6 -(lp23726 -(lp23727 -g8 -aI73 -aI-406 -aa(lp23728 -g15 -aI80 -aI-542 -aI73 -aI-452 -aI75 -aI-497 -aa(lp23729 -g15 -aI104 -aI-672 -aI84 -aI-587 -aI92 -aI-630 -aa(lp23730 -g15 -aI151 -aI-787 -aI115 -aI-713 -aI131 -aI-752 -aa(lp23731 -g15 -aI227 -aI-880 -aI171 -aI-823 -aI197 -aI-854 -aa(lp23732 -g15 -aI338 -aI-942 -aI258 -aI-906 -aI295 -aI-927 -aa(lp23733 -g15 -aI489 -aI-965 -aI381 -aI-957 -aI431 -aI-965 -aa(lp23734 -g15 -aI516 -aI-964 -aI497 -aI-965 -aI506 -aI-964 -aa(lp23735 -g15 -aI547 -aI-962 -aI526 -aI-963 -aI537 -aI-963 -aa(lp23736 -g15 -aI576 -aI-958 -aI557 -aI-961 -aI567 -aI-959 -aa(lp23737 -g15 -aI601 -aI-952 -aI585 -aI-956 -aI594 -aI-954 -aa(lp23738 -g20 -aI601 -aI-851 -aa(lp23739 -g15 -aI550 -aI-863 -aI586 -aI-856 -aI569 -aI-860 -aa(lp23740 -g15 -aI493 -aI-867 -aI531 -aI-866 -aI512 -aI-867 -aa(lp23741 -g15 -aI390 -aI-853 -aI454 -aI-867 -aI420 -aI-862 -aa(lp23742 -g15 -aI313 -aI-814 -aI360 -aI-844 -aI334 -aI-830 -aa(lp23743 -g15 -aI258 -aI-753 -aI291 -aI-797 -aI273 -aI-776 -aa(lp23744 -g15 -aI223 -aI-675 -aI244 -aI-730 -aI232 -aI-704 -aa(lp23745 -g15 -aI203 -aI-584 -aI214 -aI-647 -aI207 -aI-616 -aa(lp23746 -g15 -aI194 -aI-484 -aI198 -aI-552 -aI195 -aI-519 -aa(lp23747 -g20 -aI202 -aI-484 -aa(lp23748 -g15 -aI234 -aI-528 -aI211 -aI-500 -aI221 -aI-514 -aa(lp23749 -g15 -aI277 -aI-563 -aI246 -aI-542 -aI260 -aI-553 -aa(lp23750 -g15 -aI333 -aI-586 -aI293 -aI-573 -aI312 -aI-581 -aa(lp23751 -g15 -aI402 -aI-595 -aI353 -aI-592 -aI376 -aI-595 -aa(lp23752 -g15 -aI514 -aI-576 -aI443 -aI-595 -aI480 -aI-588 -aa(lp23753 -g15 -aI599 -aI-519 -aI547 -aI-563 -aI576 -aI-544 -aa(lp23754 -g15 -aI653 -aI-428 -aI623 -aI-494 -aI641 -aI-464 -aa(lp23755 -g15 -aI673 -aI-306 -aI666 -aI-393 -aI673 -aI-352 -aa(lp23756 -g15 -aI652 -aI-172 -aI673 -aI-256 -aI666 -aI-212 -aa(lp23757 -g15 -aI595 -aI-72 -aI639 -aI-133 -aI620 -aI-99 -aa(lp23758 -g15 -aI503 -aI-8 -aI569 -aI-44 -aI539 -aI-23 -aa(lp23759 -g15 -aI384 -aI13 -aI468 -aI6 -aI428 -aI13 -aa(lp23760 -g15 -aI262 -aI-11 -aI340 -aI13 -aI300 -aI5 -aa(lp23761 -g15 -aI163 -aI-89 -aI224 -aI-28 -aI191 -aI-54 -aa(lp23762 -g15 -aI97 -aI-220 -aI135 -aI-124 -aI113 -aI-167 -aa(lp23763 -g15 -aI73 -aI-406 -aI81 -aI-272 -aI73 -aI-334 -aa(lp23764 -g10 -aa(lp23765 -g8 -aI382 -aI-86 -aa(lp23766 -g15 -aI454 -aI-99 -aI408 -aI-86 -aI432 -aI-90 -aa(lp23767 -g15 -aI509 -aI-139 -aI475 -aI-108 -aI494 -aI-121 -aa(lp23768 -g15 -aI545 -aI-208 -aI525 -aI-157 -aI537 -aI-180 -aa(lp23769 -g15 -aI558 -aI-306 -aI554 -aI-235 -aI558 -aI-268 -aa(lp23770 -g15 -aI547 -aI-387 -aI558 -aI-336 -aI555 -aI-363 -aa(lp23771 -g15 -aI515 -aI-449 -aI540 -aI-411 -aI529 -aI-432 -aa(lp23772 -g15 -aI461 -aI-488 -aI501 -aI-466 -aI483 -aI-479 -aa(lp23773 -g15 -aI386 -aI-502 -aI440 -aI-497 -aI415 -aI-502 -aa(lp23774 -g15 -aI306 -aI-486 -aI357 -aI-502 -aI331 -aI-497 -aa(lp23775 -g15 -aI245 -aI-447 -aI282 -aI-476 -aI262 -aI-463 -aa(lp23776 -g15 -aI206 -aI-391 -aI228 -aI-430 -aI215 -aI-412 -aa(lp23777 -g15 -aI192 -aI-328 -aI196 -aI-370 -aI192 -aI-349 -aa(lp23778 -g15 -aI204 -aI-242 -aI192 -aI-299 -aI196 -aI-270 -aa(lp23779 -g15 -aI239 -aI-164 -aI212 -aI-213 -aI224 -aI-187 -aa(lp23780 -g15 -aI299 -aI-107 -aI255 -aI-141 -aI275 -aI-122 -aa(lp23781 -g15 -aI382 -aI-86 -aI323 -aI-93 -aI351 -aI-86 -aa(lp23782 -g10 -aa(lp23783 -g8 -aI734 -aI0 -aa(lp23784 -g10 -aa(lp23785 -g8 -aI734 -aI0 -aasV: -(lp23786 -(lp23787 -g8 -aI95 -aI-71 -aa(lp23788 -g15 -aI102 -aI-113 -aI95 -aI-88 -aI97 -aI-102 -aa(lp23789 -g15 -aI119 -aI-141 -aI106 -aI-125 -aI112 -aI-134 -aa(lp23790 -g15 -aI145 -aI-157 -aI127 -aI-148 -aI135 -aI-154 -aa(lp23791 -g15 -aI178 -aI-162 -aI155 -aI-160 -aI166 -aI-162 -aa(lp23792 -g15 -aI210 -aI-157 -aI189 -aI-162 -aI200 -aI-160 -aa(lp23793 -g15 -aI236 -aI-141 -aI220 -aI-154 -aI229 -aI-148 -aa(lp23794 -g15 -aI254 -aI-113 -aI244 -aI-134 -aI250 -aI-125 -aa(lp23795 -g15 -aI261 -aI-71 -aI258 -aI-102 -aI261 -aI-88 -aa(lp23796 -g15 -aI254 -aI-30 -aI261 -aI-55 -aI258 -aI-41 -aa(lp23797 -g15 -aI236 -aI-2 -aI250 -aI-18 -aI244 -aI-9 -aa(lp23798 -g15 -aI210 -aI14 -aI229 -aI5 -aI220 -aI10 -aa(lp23799 -g15 -aI178 -aI19 -aI200 -aI17 -aI189 -aI19 -aa(lp23800 -g15 -aI145 -aI14 -aI166 -aI19 -aI155 -aI17 -aa(lp23801 -g15 -aI119 -aI-2 -aI135 -aI10 -aI127 -aI5 -aa(lp23802 -g15 -aI102 -aI-30 -aI112 -aI-9 -aI106 -aI-18 -aa(lp23803 -g15 -aI95 -aI-71 -aI97 -aI-41 -aI95 -aI-55 -aa(lp23804 -g10 -aa(lp23805 -g8 -aI95 -aI-642 -aa(lp23806 -g15 -aI102 -aI-684 -aI95 -aI-659 -aI97 -aI-673 -aa(lp23807 -g15 -aI119 -aI-712 -aI106 -aI-696 -aI112 -aI-705 -aa(lp23808 -g15 -aI145 -aI-728 -aI127 -aI-719 -aI135 -aI-725 -aa(lp23809 -g15 -aI178 -aI-732 -aI155 -aI-731 -aI166 -aI-732 -aa(lp23810 -g15 -aI210 -aI-728 -aI189 -aI-732 -aI200 -aI-731 -aa(lp23811 -g15 -aI236 -aI-712 -aI220 -aI-725 -aI229 -aI-719 -aa(lp23812 -g15 -aI254 -aI-684 -aI244 -aI-705 -aI250 -aI-696 -aa(lp23813 -g15 -aI261 -aI-642 -aI258 -aI-673 -aI261 -aI-659 -aa(lp23814 -g15 -aI254 -aI-601 -aI261 -aI-626 -aI258 -aI-612 -aa(lp23815 -g15 -aI236 -aI-573 -aI250 -aI-589 -aI244 -aI-580 -aa(lp23816 -g15 -aI210 -aI-556 -aI229 -aI-565 -aI220 -aI-560 -aa(lp23817 -g15 -aI178 -aI-551 -aI200 -aI-553 -aI189 -aI-551 -aa(lp23818 -g15 -aI145 -aI-556 -aI166 -aI-551 -aI155 -aI-553 -aa(lp23819 -g15 -aI119 -aI-573 -aI135 -aI-560 -aI127 -aI-565 -aa(lp23820 -g15 -aI102 -aI-601 -aI112 -aI-580 -aI106 -aI-589 -aa(lp23821 -g15 -aI95 -aI-642 -aI97 -aI-612 -aI95 -aI-626 -aa(lp23822 -g10 -aa(lp23823 -g8 -aI357 -aI0 -aa(lp23824 -g10 -aa(lp23825 -g8 -aI357 -aI0 -aasV> -(lp23826 -(lp23827 -g8 -aI66 -aI-259 -aa(lp23828 -g20 -aI545 -aI-468 -aa(lp23829 -g20 -aI66 -aI-705 -aa(lp23830 -g20 -aI66 -aI-810 -aa(lp23831 -g20 -aI667 -aI-496 -aa(lp23832 -g20 -aI667 -aI-430 -aa(lp23833 -g20 -aI66 -aI-154 -aa(lp23834 -g10 -aa(lp23835 -g8 -aI734 -aI0 -aa(lp23836 -g10 -aa(lp23837 -g8 -aI734 -aI0 -aasVB -(lp23838 -(lp23839 -g8 -aI129 -aI-951 -aa(lp23840 -g20 -aI389 -aI-951 -aa(lp23841 -g15 -aI536 -aI-938 -aI444 -aI-951 -aI493 -aI-947 -aa(lp23842 -g15 -aI642 -aI-897 -aI578 -aI-930 -aI613 -aI-916 -aa(lp23843 -g15 -aI706 -aI-823 -aI670 -aI-878 -aI692 -aI-854 -aa(lp23844 -g15 -aI727 -aI-710 -aI720 -aI-792 -aI727 -aI-755 -aa(lp23845 -g15 -aI715 -aI-634 -aI727 -aI-683 -aI723 -aI-658 -aa(lp23846 -g15 -aI678 -aI-573 -aI706 -aI-611 -aI694 -aI-590 -aa(lp23847 -g15 -aI618 -aI-528 -aI662 -aI-555 -aI642 -aI-540 -aa(lp23848 -g15 -aI538 -aI-504 -aI595 -aI-516 -aI568 -aI-508 -aa(lp23849 -g20 -aI538 -aI-498 -aa(lp23850 -g15 -aI622 -aI-475 -aI568 -aI-493 -aI596 -aI-485 -aa(lp23851 -g15 -aI691 -aI-435 -aI648 -aI-466 -aI671 -aI-452 -aa(lp23852 -g15 -aI737 -aI-370 -aI710 -aI-418 -aI726 -aI-396 -aa(lp23853 -g15 -aI754 -aI-275 -aI748 -aI-344 -aI754 -aI-312 -aa(lp23854 -g15 -aI733 -aI-159 -aI754 -aI-232 -aI747 -aI-193 -aa(lp23855 -g15 -aI672 -aI-72 -aI719 -aI-125 -aI698 -aI-96 -aa(lp23856 -g15 -aI574 -aI-18 -aI645 -aI-49 -aI613 -aI-31 -aa(lp23857 -g15 -aI445 -aI0 -aI536 -aI-5 -aI493 -aI0 -aa(lp23858 -g20 -aI129 -aI0 -aa(lp23859 -g10 -aa(lp23860 -g8 -aI250 -aI-547 -aa(lp23861 -g20 -aI409 -aI-547 -aa(lp23862 -g15 -aI501 -aI-557 -aI445 -aI-547 -aI476 -aI-550 -aa(lp23863 -g15 -aI561 -aI-586 -aI526 -aI-564 -aI546 -aI-573 -aa(lp23864 -g15 -aI594 -aI-634 -aI576 -aI-599 -aI587 -aI-615 -aa(lp23865 -g15 -aI604 -aI-702 -aI600 -aI-653 -aI604 -aI-676 -aa(lp23866 -g15 -aI554 -aI-814 -aI604 -aI-754 -aI587 -aI-791 -aa(lp23867 -g15 -aI395 -aI-847 -aI520 -aI-836 -aI467 -aI-847 -aa(lp23868 -g20 -aI250 -aI-847 -aa(lp23869 -g10 -aa(lp23870 -g8 -aI250 -aI-446 -aa(lp23871 -g20 -aI250 -aI-102 -aa(lp23872 -g20 -aI423 -aI-102 -aa(lp23873 -g15 -aI519 -aI-115 -aI462 -aI-102 -aI494 -aI-106 -aa(lp23874 -g15 -aI582 -aI-151 -aI545 -aI-124 -aI566 -aI-136 -aa(lp23875 -g15 -aI616 -aI-208 -aI598 -aI-167 -aI609 -aI-186 -aa(lp23876 -g15 -aI626 -aI-280 -aI623 -aI-230 -aI626 -aI-254 -aa(lp23877 -g15 -aI616 -aI-347 -aI626 -aI-305 -aI623 -aI-327 -aa(lp23878 -g15 -aI581 -aI-400 -aI609 -aI-368 -aI597 -aI-385 -aa(lp23879 -g15 -aI516 -aI-434 -aI564 -aI-414 -aI543 -aI-426 -aa(lp23880 -g15 -aI416 -aI-446 -aI489 -aI-442 -aI455 -aI-446 -aa(lp23881 -g10 -aa(lp23882 -g8 -aI828 -aI0 -aa(lp23883 -g10 -aa(lp23884 -g8 -aI828 -aI0 -aasVF -(lp23885 -(lp23886 -g8 -aI250 -aI0 -aa(lp23887 -g20 -aI129 -aI0 -aa(lp23888 -g20 -aI129 -aI-951 -aa(lp23889 -g20 -aI623 -aI-951 -aa(lp23890 -g20 -aI623 -aI-844 -aa(lp23891 -g20 -aI250 -aI-844 -aa(lp23892 -g20 -aI250 -aI-508 -aa(lp23893 -g20 -aI598 -aI-508 -aa(lp23894 -g20 -aI598 -aI-401 -aa(lp23895 -g20 -aI250 -aI-401 -aa(lp23896 -g10 -aa(lp23897 -g8 -aI654 -aI0 -aa(lp23898 -g10 -aa(lp23899 -g8 -aI654 -aI0 -aasVJ -(lp23900 -(lp23901 -g8 -aI-18 -aI253 -aa(lp23902 -g15 -aI-76 -aI249 -aI-41 -aI253 -aI-60 -aI252 -aa(lp23903 -g15 -aI-119 -aI238 -aI-93 -aI246 -aI-107 -aI242 -aa(lp23904 -g20 -aI-119 -aI133 -aa(lp23905 -g15 -aI-72 -aI143 -aI-105 -aI137 -aI-89 -aI140 -aa(lp23906 -g15 -aI-17 -aI146 -aI-55 -aI145 -aI-37 -aI146 -aa(lp23907 -g15 -aI30 -aI140 -aI-1 -aI146 -aI14 -aI144 -aa(lp23908 -g15 -aI75 -aI118 -aI47 -aI136 -aI61 -aI129 -aa(lp23909 -g15 -aI107 -aI73 -aI88 -aI107 -aI99 -aI92 -aa(lp23910 -g15 -aI119 -aI0 -aI115 -aI54 -aI119 -aI29 -aa(lp23911 -g20 -aI119 -aI-951 -aa(lp23912 -g20 -aI241 -aI-951 -aa(lp23913 -g20 -aI241 -aI-12 -aa(lp23914 -g15 -aI222 -aI105 -aI241 -aI33 -aI235 -aI72 -aa(lp23915 -g15 -aI168 -aI188 -aI209 -aI139 -aI191 -aI167 -aa(lp23916 -g15 -aI86 -aI237 -aI146 -aI210 -aI118 -aI227 -aa(lp23917 -g15 -aI-18 -aI253 -aI55 -aI248 -aI19 -aI253 -aa(lp23918 -g10 -aa(lp23919 -g8 -aI361 -aI0 -aa(lp23920 -g10 -aa(lp23921 -g8 -aI361 -aI0 -aasVN -(lp23922 -(lp23923 -g8 -aI842 -aI0 -aa(lp23924 -g20 -aI702 -aI0 -aa(lp23925 -g20 -aI234 -aI-787 -aa(lp23926 -g20 -aI229 -aI-787 -aa(lp23927 -g15 -aI235 -aI-687 -aI231 -aI-753 -aI233 -aI-720 -aa(lp23928 -g15 -aI239 -aI-599 -aI237 -aI-659 -aI238 -aI-629 -aa(lp23929 -g15 -aI241 -aI-515 -aI240 -aI-568 -aI241 -aI-540 -aa(lp23930 -g20 -aI241 -aI0 -aa(lp23931 -g20 -aI129 -aI0 -aa(lp23932 -g20 -aI129 -aI-951 -aa(lp23933 -g20 -aI268 -aI-951 -aa(lp23934 -g20 -aI734 -aI-167 -aa(lp23935 -g20 -aI738 -aI-167 -aa(lp23936 -g15 -aI734 -aI-265 -aI737 -aI-200 -aI736 -aI-233 -aa(lp23937 -g15 -aI732 -aI-307 -aI733 -aI-279 -aI733 -aI-293 -aa(lp23938 -g15 -aI730 -aI-351 -aI732 -aI-322 -aI731 -aI-336 -aa(lp23939 -g15 -aI729 -aI-393 -aI730 -aI-365 -aI729 -aI-379 -aa(lp23940 -g15 -aI729 -aI-430 -aI729 -aI-406 -aI729 -aI-419 -aa(lp23941 -g20 -aI729 -aI-951 -aa(lp23942 -g20 -aI842 -aI-951 -aa(lp23943 -g10 -aa(lp23944 -g8 -aI972 -aI0 -aa(lp23945 -g10 -aa(lp23946 -g8 -aI972 -aI0 -aasVR -(lp23947 -(lp23948 -g8 -aI250 -aI-392 -aa(lp23949 -g20 -aI250 -aI0 -aa(lp23950 -g20 -aI129 -aI0 -aa(lp23951 -g20 -aI129 -aI-951 -aa(lp23952 -g20 -aI361 -aI-951 -aa(lp23953 -g15 -aI617 -aI-884 -aI476 -aI-951 -aI562 -aI-929 -aa(lp23954 -g15 -aI699 -aI-681 -aI672 -aI-839 -aI699 -aI-771 -aa(lp23955 -g15 -aI683 -aI-582 -aI699 -aI-643 -aI694 -aI-610 -aa(lp23956 -g15 -aI641 -aI-509 -aI673 -aI-554 -aI659 -aI-529 -aa(lp23957 -g15 -aI581 -aI-459 -aI624 -aI-489 -aI603 -aI-472 -aa(lp23958 -g15 -aI511 -aI-425 -aI558 -aI-445 -aI535 -aI-434 -aa(lp23959 -g20 -aI770 -aI0 -aa(lp23960 -g20 -aI628 -aI0 -aa(lp23961 -g20 -aI399 -aI-392 -aa(lp23962 -g10 -aa(lp23963 -g8 -aI250 -aI-495 -aa(lp23964 -g20 -aI357 -aI-495 -aa(lp23965 -g15 -aI457 -aI-507 -aI396 -aI-495 -aI429 -aI-499 -aa(lp23966 -g15 -aI524 -aI-540 -aI484 -aI-514 -aI506 -aI-525 -aa(lp23967 -g15 -aI562 -aI-596 -aI541 -aI-555 -aI554 -aI-574 -aa(lp23968 -g15 -aI574 -aI-675 -aI570 -aI-619 -aI574 -aI-645 -aa(lp23969 -g15 -aI561 -aI-754 -aI574 -aI-706 -aI570 -aI-733 -aa(lp23970 -g15 -aI521 -aI-808 -aI552 -aI-776 -aI539 -aI-794 -aa(lp23971 -g15 -aI452 -aI-838 -aI503 -aI-822 -aI480 -aI-832 -aa(lp23972 -g15 -aI354 -aI-847 -aI425 -aI-844 -aI392 -aI-847 -aa(lp23973 -g20 -aI250 -aI-847 -aa(lp23974 -g10 -aa(lp23975 -g8 -aI786 -aI0 -aa(lp23976 -g10 -aa(lp23977 -g8 -aI786 -aI0 -aasVV -(lp23978 -(lp23979 -g8 -aI628 -aI-951 -aa(lp23980 -g20 -aI757 -aI-951 -aa(lp23981 -g20 -aI438 -aI0 -aa(lp23982 -g20 -aI317 -aI0 -aa(lp23983 -g20 -aI0 -aI-951 -aa(lp23984 -g20 -aI128 -aI-951 -aa(lp23985 -g20 -aI320 -aI-347 -aa(lp23986 -g15 -aI352 -aI-233 -aI332 -aI-308 -aI343 -aI-270 -aa(lp23987 -g15 -aI377 -aI-130 -aI361 -aI-196 -aI370 -aI-162 -aa(lp23988 -g15 -aI402 -aI-233 -aI384 -aI-162 -aI392 -aI-196 -aa(lp23989 -g15 -aI437 -aI-351 -aI412 -aI-270 -aI424 -aI-309 -aa(lp23990 -g10 -aa(lp23991 -g8 -aI757 -aI0 -aa(lp23992 -g10 -aa(lp23993 -g8 -aI757 -aI0 -aasVZ -(lp23994 -(lp23995 -g8 -aI665 -aI0 -aa(lp23996 -g20 -aI53 -aI0 -aa(lp23997 -g20 -aI53 -aI-93 -aa(lp23998 -g20 -aI516 -aI-843 -aa(lp23999 -g20 -aI66 -aI-843 -aa(lp24000 -g20 -aI66 -aI-951 -aa(lp24001 -g20 -aI651 -aI-951 -aa(lp24002 -g20 -aI651 -aI-856 -aa(lp24003 -g20 -aI189 -aI-107 -aa(lp24004 -g20 -aI665 -aI-107 -aa(lp24005 -g10 -aa(lp24006 -g8 -aI718 -aI0 -aa(lp24007 -g10 -aa(lp24008 -g8 -aI718 -aI0 -aasV^ -(lp24009 -(lp24010 -g8 -aI26 -aI-356 -aa(lp24011 -g20 -aI325 -aI-958 -aa(lp24012 -g20 -aI391 -aI-958 -aa(lp24013 -g20 -aI682 -aI-356 -aa(lp24014 -g20 -aI578 -aI-356 -aa(lp24015 -g20 -aI358 -aI-835 -aa(lp24016 -g20 -aI131 -aI-356 -aa(lp24017 -g10 -aa(lp24018 -g8 -aI709 -aI0 -aa(lp24019 -g10 -aa(lp24020 -g8 -aI709 -aI0 -aasVb -(lp24021 -(lp24022 -g8 -aI436 -aI-727 -aa(lp24023 -g15 -aI547 -aI-703 -aI476 -aI-727 -aI514 -aI-719 -aa(lp24024 -g15 -aI633 -aI-633 -aI580 -aI-688 -aI609 -aI-665 -aa(lp24025 -g15 -aI688 -aI-518 -aI656 -aI-602 -aI675 -aI-564 -aa(lp24026 -g15 -aI707 -aI-358 -aI701 -aI-472 -aI707 -aI-419 -aa(lp24027 -g15 -aI688 -aI-197 -aI707 -aI-297 -aI701 -aI-243 -aa(lp24028 -g15 -aI633 -aI-80 -aI675 -aI-150 -aI656 -aI-112 -aa(lp24029 -g15 -aI547 -aI-10 -aI609 -aI-49 -aI580 -aI-26 -aa(lp24030 -g15 -aI436 -aI13 -aI514 -aI5 -aI476 -aI13 -aa(lp24031 -g15 -aI366 -aI5 -aI410 -aI13 -aI387 -aI10 -aa(lp24032 -g15 -aI310 -aI-17 -aI345 -aI0 -aI326 -aI-8 -aa(lp24033 -g15 -aI265 -aI-50 -aI293 -aI-26 -aI278 -aI-37 -aa(lp24034 -g15 -aI231 -aI-90 -aI253 -aI-62 -aI241 -aI-76 -aa(lp24035 -g20 -aI223 -aI-90 -aa(lp24036 -g20 -aI199 -aI0 -aa(lp24037 -g20 -aI113 -aI0 -aa(lp24038 -g20 -aI113 -aI-1012 -aa(lp24039 -g20 -aI231 -aI-1012 -aa(lp24040 -g20 -aI231 -aI-767 -aa(lp24041 -g15 -aI231 -aI-719 -aI231 -aI-752 -aI231 -aI-736 -aa(lp24042 -g15 -aI229 -aI-671 -aI230 -aI-702 -aI230 -aI-686 -aa(lp24043 -g15 -aI226 -aI-620 -aI228 -aI-654 -aI227 -aI-637 -aa(lp24044 -g20 -aI231 -aI-620 -aa(lp24045 -g15 -aI265 -aI-662 -aI241 -aI-635 -aI253 -aI-649 -aa(lp24046 -g15 -aI309 -aI-696 -aI278 -aI-675 -aI292 -aI-687 -aa(lp24047 -g15 -aI365 -aI-719 -aI326 -aI-706 -aI345 -aI-713 -aa(lp24048 -g15 -aI436 -aI-727 -aI386 -aI-724 -aI410 -aI-727 -aa(lp24049 -g10 -aa(lp24050 -g8 -aI413 -aI-629 -aa(lp24051 -g15 -aI326 -aI-612 -aI378 -aI-629 -aI349 -aI-623 -aa(lp24052 -g15 -aI270 -aI-562 -aI303 -aI-601 -aI284 -aI-584 -aa(lp24053 -g15 -aI240 -aI-477 -aI256 -aI-539 -aI246 -aI-511 -aa(lp24054 -g15 -aI231 -aI-358 -aI234 -aI-443 -aI231 -aI-403 -aa(lp24055 -g15 -aI240 -aI-241 -aI231 -aI-314 -aI234 -aI-275 -aa(lp24056 -g15 -aI270 -aI-155 -aI246 -aI-207 -aI256 -aI-178 -aa(lp24057 -g15 -aI326 -aI-102 -aI284 -aI-132 -aI303 -aI-114 -aa(lp24058 -g15 -aI414 -aI-84 -aI350 -aI-90 -aI379 -aI-84 -aa(lp24059 -g15 -aI543 -aI-155 -aI473 -aI-84 -aI516 -aI-108 -aa(lp24060 -g15 -aI585 -aI-359 -aI571 -aI-203 -aI585 -aI-271 -aa(lp24061 -g15 -aI543 -aI-562 -aI585 -aI-449 -aI571 -aI-517 -aa(lp24062 -g15 -aI413 -aI-629 -aI516 -aI-606 -aI472 -aI-629 -aa(lp24063 -g10 -aa(lp24064 -g8 -aI781 -aI0 -aa(lp24065 -g10 -aa(lp24066 -g8 -aI781 -aI0 -aasVf -(lp24067 -(lp24068 -g8 -aI423 -aI-625 -aa(lp24069 -g20 -aI264 -aI-625 -aa(lp24070 -g20 -aI264 -aI0 -aa(lp24071 -g20 -aI145 -aI0 -aa(lp24072 -g20 -aI145 -aI-625 -aa(lp24073 -g20 -aI18 -aI-625 -aa(lp24074 -g20 -aI18 -aI-674 -aa(lp24075 -g20 -aI145 -aI-718 -aa(lp24076 -g20 -aI145 -aI-780 -aa(lp24077 -g15 -aI159 -aI-896 -aI145 -aI-827 -aI150 -aI-865 -aa(lp24078 -g15 -aI202 -aI-969 -aI169 -aI-926 -aI183 -aI-951 -aa(lp24079 -g15 -aI270 -aI-1008 -aI220 -aI-987 -aI243 -aI-1000 -aa(lp24080 -g15 -aI361 -aI-1019 -aI297 -aI-1015 -aI327 -aI-1019 -aa(lp24081 -g15 -aI431 -aI-1012 -aI386 -aI-1019 -aI410 -aI-1017 -aa(lp24082 -g15 -aI489 -aI-995 -aI453 -aI-1007 -aI472 -aI-1001 -aa(lp24083 -g20 -aI458 -aI-903 -aa(lp24084 -g15 -aI415 -aI-916 -aI445 -aI-908 -aI430 -aI-912 -aa(lp24085 -g15 -aI365 -aI-922 -aI399 -aI-920 -aI382 -aI-922 -aa(lp24086 -g15 -aI320 -aI-915 -aI347 -aI-922 -aI332 -aI-920 -aa(lp24087 -g15 -aI289 -aI-894 -aI307 -aI-911 -aI297 -aI-904 -aa(lp24088 -g15 -aI270 -aI-851 -aI280 -aI-883 -aI274 -aI-869 -aa(lp24089 -g15 -aI264 -aI-782 -aI266 -aI-833 -aI264 -aI-810 -aa(lp24090 -g20 -aI264 -aI-714 -aa(lp24091 -g20 -aI423 -aI-714 -aa(lp24092 -g10 -aa(lp24093 -g8 -aI438 -aI0 -aa(lp24094 -g10 -aa(lp24095 -g8 -aI438 -aI0 -aasVj -(lp24096 -(lp24097 -g8 -aI42 -aI320 -aa(lp24098 -g15 -aI-8 -aI316 -aI22 -aI320 -aI4 -aI319 -aa(lp24099 -g15 -aI-44 -aI304 -aI-22 -aI313 -aI-34 -aI309 -aa(lp24100 -g20 -aI-44 -aI208 -aa(lp24101 -g15 -aI-9 -aI218 -aI-32 -aI212 -aI-21 -aI215 -aa(lp24102 -g15 -aI30 -aI221 -aI1 -aI220 -aI15 -aI221 -aa(lp24103 -g15 -aI63 -aI216 -aI42 -aI221 -aI53 -aI220 -aa(lp24104 -g15 -aI89 -aI199 -aI73 -aI213 -aI81 -aI207 -aa(lp24105 -g15 -aI107 -aI165 -aI97 -aI190 -aI102 -aI179 -aa(lp24106 -g15 -aI113 -aI111 -aI111 -aI151 -aI113 -aI133 -aa(lp24107 -g20 -aI113 -aI-714 -aa(lp24108 -g20 -aI231 -aI-714 -aa(lp24109 -g20 -aI231 -aI103 -aa(lp24110 -g15 -aI220 -aI193 -aI231 -aI136 -aI228 -aI166 -aa(lp24111 -g15 -aI186 -aI261 -aI213 -aI220 -aI201 -aI242 -aa(lp24112 -g15 -aI127 -aI305 -aI170 -aI280 -aI150 -aI295 -aa(lp24113 -g15 -aI42 -aI320 -aI103 -aI315 -aI75 -aI320 -aa(lp24114 -g10 -aa(lp24115 -g8 -aI104 -aI-907 -aa(lp24116 -g15 -aI124 -aI-964 -aI104 -aI-933 -aI110 -aI-952 -aa(lp24117 -g15 -aI173 -aI-981 -aI137 -aI-976 -aI153 -aI-981 -aa(lp24118 -g15 -aI200 -aI-977 -aI182 -aI-981 -aI191 -aI-980 -aa(lp24119 -g15 -aI222 -aI-964 -aI208 -aI-974 -aI216 -aI-970 -aa(lp24120 -g15 -aI237 -aI-941 -aI228 -aI-958 -aI233 -aI-950 -aa(lp24121 -g15 -aI242 -aI-907 -aI240 -aI-931 -aI242 -aI-920 -aa(lp24122 -g15 -aI222 -aI-851 -aI242 -aI-882 -aI236 -aI-863 -aa(lp24123 -g15 -aI173 -aI-832 -aI208 -aI-839 -aI192 -aI-832 -aa(lp24124 -g15 -aI124 -aI-851 -aI153 -aI-832 -aI137 -aI-838 -aa(lp24125 -g15 -aI104 -aI-907 -aI110 -aI-863 -aI104 -aI-882 -aa(lp24126 -g10 -aa(lp24127 -g8 -aI345 -aI0 -aa(lp24128 -g10 -aa(lp24129 -g8 -aI345 -aI0 -aasVn -(lp24130 -(lp24131 -g8 -aI559 -aI0 -aa(lp24132 -g20 -aI559 -aI-459 -aa(lp24133 -g15 -aI525 -aI-586 -aI559 -aI-516 -aI548 -aI-558 -aa(lp24134 -g15 -aI418 -aI-629 -aI502 -aI-614 -aI467 -aI-629 -aa(lp24135 -g15 -aI330 -aI-612 -aI383 -aI-629 -aI353 -aI-623 -aa(lp24136 -g15 -aI272 -aI-562 -aI306 -aI-600 -aI287 -aI-584 -aa(lp24137 -g15 -aI241 -aI-480 -aI257 -aI-539 -aI247 -aI-512 -aa(lp24138 -g15 -aI231 -aI-369 -aI234 -aI-448 -aI231 -aI-411 -aa(lp24139 -g20 -aI231 -aI0 -aa(lp24140 -g20 -aI113 -aI0 -aa(lp24141 -g20 -aI113 -aI-714 -aa(lp24142 -g20 -aI209 -aI-714 -aa(lp24143 -g20 -aI226 -aI-618 -aa(lp24144 -g20 -aI233 -aI-618 -aa(lp24145 -g15 -aI271 -aI-666 -aI243 -aI-636 -aI256 -aI-652 -aa(lp24146 -g15 -aI320 -aI-700 -aI286 -aI-680 -aI303 -aI-691 -aa(lp24147 -g15 -aI377 -aI-720 -aI338 -aI-709 -aI357 -aI-716 -aa(lp24148 -g15 -aI438 -aI-727 -aI397 -aI-725 -aI417 -aI-727 -aa(lp24149 -g15 -aI618 -aI-665 -aI518 -aI-727 -aI578 -aI-706 -aa(lp24150 -g15 -aI678 -aI-466 -aI658 -aI-623 -aI678 -aI-557 -aa(lp24151 -g20 -aI678 -aI0 -aa(lp24152 -g10 -aa(lp24153 -g8 -aI785 -aI0 -aa(lp24154 -g10 -aa(lp24155 -g8 -aI785 -aI0 -aasVr -(lp24156 -(lp24157 -g8 -aI422 -aI-727 -aa(lp24158 -g15 -aI464 -aI-725 -aI435 -aI-727 -aI449 -aI-726 -aa(lp24159 -g15 -aI505 -aI-720 -aI480 -aI-724 -aI493 -aI-723 -aa(lp24160 -g20 -aI489 -aI-611 -aa(lp24161 -g15 -aI452 -aI-617 -aI477 -aI-613 -aI464 -aI-615 -aa(lp24162 -g15 -aI416 -aI-619 -aI439 -aI-618 -aI427 -aI-619 -aa(lp24163 -g15 -aI341 -aI-602 -aI388 -aI-619 -aI363 -aI-613 -aa(lp24164 -g15 -aI282 -aI-555 -aI318 -aI-591 -aI299 -aI-575 -aa(lp24165 -g15 -aI245 -aI-480 -aI266 -aI-534 -aI254 -aI-509 -aa(lp24166 -g15 -aI231 -aI-384 -aI236 -aI-452 -aI231 -aI-420 -aa(lp24167 -g20 -aI231 -aI0 -aa(lp24168 -g20 -aI113 -aI0 -aa(lp24169 -g20 -aI113 -aI-714 -aa(lp24170 -g20 -aI209 -aI-714 -aa(lp24171 -g20 -aI223 -aI-583 -aa(lp24172 -g20 -aI229 -aI-583 -aa(lp24173 -g15 -aI263 -aI-637 -aI240 -aI-602 -aI251 -aI-620 -aa(lp24174 -g15 -aI305 -aI-683 -aI276 -aI-654 -aI290 -aI-670 -aa(lp24175 -g15 -aI357 -aI-715 -aI321 -aI-696 -aI338 -aI-707 -aa(lp24176 -g15 -aI422 -aI-727 -aI376 -aI-723 -aI398 -aI-727 -aa(lp24177 -g10 -aa(lp24178 -g8 -aI531 -aI0 -aa(lp24179 -g10 -aa(lp24180 -g8 -aI531 -aI0 -aasVv -(lp24181 -(lp24182 -g8 -aI244 -aI0 -aa(lp24183 -g20 -aI0 -aI-714 -aa(lp24184 -g20 -aI122 -aI-714 -aa(lp24185 -g20 -aI251 -aI-316 -aa(lp24186 -g15 -aI268 -aI-261 -aI256 -aI-302 -aI262 -aI-283 -aa(lp24187 -g15 -aI288 -aI-192 -aI275 -aI-238 -aI281 -aI-215 -aa(lp24188 -g15 -aI306 -aI-125 -aI294 -aI-168 -aI300 -aI-146 -aa(lp24189 -g15 -aI317 -aI-78 -aI311 -aI-105 -aI315 -aI-89 -aa(lp24190 -g20 -aI321 -aI-78 -aa(lp24191 -g15 -aI332 -aI-125 -aI323 -aI-89 -aI327 -aI-105 -aa(lp24192 -g15 -aI350 -aI-192 -aI337 -aI-146 -aI343 -aI-168 -aa(lp24193 -g15 -aI369 -aI-261 -aI356 -aI-215 -aI363 -aI-238 -aa(lp24194 -g15 -aI386 -aI-316 -aI376 -aI-283 -aI381 -aI-302 -aa(lp24195 -g20 -aI516 -aI-714 -aa(lp24196 -g20 -aI638 -aI-714 -aa(lp24197 -g20 -aI394 -aI0 -aa(lp24198 -g10 -aa(lp24199 -g8 -aI638 -aI0 -aa(lp24200 -g10 -aa(lp24201 -g8 -aI638 -aI0 -aasVz -(lp24202 -(lp24203 -g8 -aI534 -aI0 -aa(lp24204 -g20 -aI53 -aI0 -aa(lp24205 -g20 -aI53 -aI-80 -aa(lp24206 -g20 -aI402 -aI-625 -aa(lp24207 -g20 -aI74 -aI-625 -aa(lp24208 -g20 -aI74 -aI-714 -aa(lp24209 -g20 -aI522 -aI-714 -aa(lp24210 -g20 -aI522 -aI-619 -aa(lp24211 -g20 -aI181 -aI-88 -aa(lp24212 -g20 -aI534 -aI-88 -aa(lp24213 -g10 -aa(lp24214 -g8 -aI587 -aI0 -aa(lp24215 -g10 -aa(lp24216 -g8 -aI587 -aI0 -aasV~ -(lp24217 -(lp24218 -g8 -aI345 -aI-423 -aa(lp24219 -g15 -aI303 -aI-440 -aI328 -aI-430 -aI314 -aI-436 -aa(lp24220 -g15 -aI270 -aI-452 -aI291 -aI-445 -aI280 -aI-449 -aa(lp24221 -g15 -aI242 -aI-458 -aI260 -aI-455 -aI251 -aI-457 -aa(lp24222 -g15 -aI214 -aI-459 -aI233 -aI-459 -aI224 -aI-459 -aa(lp24223 -g15 -aI177 -aI-453 -aI202 -aI-459 -aI190 -aI-457 -aa(lp24224 -g15 -aI138 -aI-436 -aI164 -aI-449 -aI151 -aI-443 -aa(lp24225 -g15 -aI100 -aI-411 -aI125 -aI-429 -aI113 -aI-421 -aa(lp24226 -g15 -aI66 -aI-381 -aI88 -aI-402 -aI77 -aI-391 -aa(lp24227 -g20 -aI66 -aI-486 -aa(lp24228 -g15 -aI227 -aI-556 -aI109 -aI-533 -aI163 -aI-556 -aa(lp24229 -g15 -aI263 -aI-555 -aI240 -aI-556 -aI252 -aI-556 -aa(lp24230 -g15 -aI297 -aI-549 -aI273 -aI-554 -aI285 -aI-552 -aa(lp24231 -g15 -aI336 -aI-536 -aI309 -aI-546 -aI322 -aI-542 -aa(lp24232 -g15 -aI389 -aI-515 -aI351 -aI-531 -aI368 -aI-524 -aa(lp24233 -g15 -aI431 -aI-498 -aI405 -aI-508 -aI419 -aI-503 -aa(lp24234 -g15 -aI464 -aI-486 -aI443 -aI-493 -aI454 -aI-489 -aa(lp24235 -g15 -aI492 -aI-480 -aI474 -aI-484 -aI484 -aI-482 -aa(lp24236 -g15 -aI520 -aI-479 -aI501 -aI-479 -aI510 -aI-479 -aa(lp24237 -g15 -aI557 -aI-485 -aI532 -aI-479 -aI544 -aI-481 -aa(lp24238 -g15 -aI596 -aI-502 -aI570 -aI-489 -aI583 -aI-495 -aa(lp24239 -g15 -aI634 -aI-527 -aI609 -aI-509 -aI621 -aI-517 -aa(lp24240 -g15 -aI667 -aI-558 -aI646 -aI-537 -aI657 -aI-547 -aa(lp24241 -g20 -aI667 -aI-452 -aa(lp24242 -g15 -aI506 -aI-382 -aI624 -aI-405 -aI571 -aI-382 -aa(lp24243 -g15 -aI471 -aI-383 -aI493 -aI-382 -aI482 -aI-382 -aa(lp24244 -g15 -aI437 -aI-389 -aI460 -aI-385 -aI449 -aI-387 -aa(lp24245 -g15 -aI397 -aI-402 -aI425 -aI-392 -aI412 -aI-396 -aa(lp24246 -g15 -aI345 -aI-423 -aI382 -aI-407 -aI365 -aI-414 -aa(lp24247 -g10 -aa(lp24248 -g8 -aI734 -aI0 -aa(lp24249 -g10 -aa(lp24250 -g8 -aI734 -aI0 -aasV! -(lp24251 -(lp24252 -g8 -aI218 -aI-269 -aa(lp24253 -g20 -aI139 -aI-269 -aa(lp24254 -g20 -aI106 -aI-951 -aa(lp24255 -g20 -aI251 -aI-951 -aa(lp24256 -g10 -aa(lp24257 -g8 -aI95 -aI-71 -aa(lp24258 -g15 -aI102 -aI-113 -aI95 -aI-88 -aI97 -aI-102 -aa(lp24259 -g15 -aI119 -aI-141 -aI106 -aI-125 -aI112 -aI-134 -aa(lp24260 -g15 -aI145 -aI-157 -aI127 -aI-148 -aI135 -aI-154 -aa(lp24261 -g15 -aI178 -aI-162 -aI155 -aI-160 -aI166 -aI-162 -aa(lp24262 -g15 -aI210 -aI-157 -aI189 -aI-162 -aI200 -aI-160 -aa(lp24263 -g15 -aI236 -aI-141 -aI220 -aI-154 -aI229 -aI-148 -aa(lp24264 -g15 -aI254 -aI-113 -aI244 -aI-134 -aI250 -aI-125 -aa(lp24265 -g15 -aI261 -aI-71 -aI258 -aI-102 -aI261 -aI-88 -aa(lp24266 -g15 -aI254 -aI-30 -aI261 -aI-55 -aI258 -aI-41 -aa(lp24267 -g15 -aI236 -aI-2 -aI250 -aI-18 -aI244 -aI-9 -aa(lp24268 -g15 -aI210 -aI14 -aI229 -aI5 -aI220 -aI10 -aa(lp24269 -g15 -aI178 -aI19 -aI200 -aI17 -aI189 -aI19 -aa(lp24270 -g15 -aI145 -aI14 -aI166 -aI19 -aI155 -aI17 -aa(lp24271 -g15 -aI119 -aI-2 -aI135 -aI10 -aI127 -aI5 -aa(lp24272 -g15 -aI102 -aI-30 -aI112 -aI-9 -aI106 -aI-18 -aa(lp24273 -g15 -aI95 -aI-71 -aI97 -aI-41 -aI95 -aI-55 -aa(lp24274 -g10 -aa(lp24275 -g8 -aI358 -aI0 -aa(lp24276 -g10 -aa(lp24277 -g8 -aI358 -aI0 -aasV% -(lp24278 -(lp24279 -g8 -aI162 -aI-667 -aa(lp24280 -g15 -aI185 -aI-506 -aI162 -aI-595 -aI170 -aI-542 -aa(lp24281 -g15 -aI261 -aI-452 -aI201 -aI-470 -aI226 -aI-452 -aa(lp24282 -g15 -aI362 -aI-667 -aI328 -aI-452 -aI362 -aI-524 -aa(lp24283 -g15 -aI261 -aI-881 -aI362 -aI-809 -aI328 -aI-881 -aa(lp24284 -g15 -aI185 -aI-827 -aI226 -aI-881 -aI201 -aI-863 -aa(lp24285 -g15 -aI162 -aI-667 -aI170 -aI-792 -aI162 -aI-739 -aa(lp24286 -g10 -aa(lp24287 -g8 -aI458 -aI-667 -aa(lp24288 -g15 -aI447 -aI-541 -aI458 -aI-620 -aI455 -aI-578 -aa(lp24289 -g15 -aI411 -aI-446 -aI439 -aI-503 -aI427 -aI-472 -aa(lp24290 -g15 -aI349 -aI-387 -aI395 -aI-421 -aI374 -aI-401 -aa(lp24291 -g15 -aI261 -aI-367 -aI324 -aI-374 -aI295 -aI-367 -aa(lp24292 -g15 -aI177 -aI-387 -aI229 -aI-367 -aI201 -aI-374 -aa(lp24293 -g15 -aI115 -aI-446 -aI152 -aI-401 -aI132 -aI-421 -aa(lp24294 -g15 -aI78 -aI-541 -aI99 -aI-472 -aI87 -aI-503 -aa(lp24295 -g15 -aI66 -aI-667 -aI70 -aI-578 -aI66 -aI-620 -aa(lp24296 -g15 -aI77 -aI-793 -aI66 -aI-714 -aI70 -aI-756 -aa(lp24297 -g15 -aI112 -aI-886 -aI85 -aI-830 -aI97 -aI-861 -aa(lp24298 -g15 -aI173 -aI-944 -aI128 -aI-911 -aI148 -aI-931 -aa(lp24299 -g15 -aI261 -aI-965 -aI198 -aI-958 -aI227 -aI-965 -aa(lp24300 -g15 -aI346 -aI-944 -aI293 -aI-965 -aI322 -aI-958 -aa(lp24301 -g15 -aI408 -aI-886 -aI371 -aI-931 -aI391 -aI-911 -aa(lp24302 -g15 -aI446 -aI-793 -aI425 -aI-861 -aI437 -aI-830 -aa(lp24303 -g15 -aI458 -aI-667 -aI454 -aI-756 -aI458 -aI-714 -aa(lp24304 -g10 -aa(lp24305 -g8 -aI737 -aI-286 -aa(lp24306 -g15 -aI760 -aI-125 -aI737 -aI-214 -aI745 -aI-160 -aa(lp24307 -g15 -aI835 -aI-71 -aI776 -aI-89 -aI801 -aI-71 -aa(lp24308 -g15 -aI937 -aI-286 -aI903 -aI-71 -aI937 -aI-143 -aa(lp24309 -g15 -aI835 -aI-499 -aI937 -aI-428 -aI903 -aI-499 -aa(lp24310 -g15 -aI760 -aI-446 -aI801 -aI-499 -aI776 -aI-481 -aa(lp24311 -g15 -aI737 -aI-286 -aI745 -aI-411 -aI737 -aI-357 -aa(lp24312 -g10 -aa(lp24313 -g8 -aI1033 -aI-286 -aa(lp24314 -g15 -aI1021 -aI-160 -aI1033 -aI-239 -aI1029 -aI-197 -aa(lp24315 -g15 -aI986 -aI-65 -aI1014 -aI-122 -aI1002 -aI-91 -aa(lp24316 -g15 -aI924 -aI-7 -aI970 -aI-40 -aI949 -aI-20 -aa(lp24317 -g15 -aI835 -aI13 -aI899 -aI6 -aI870 -aI13 -aa(lp24318 -g15 -aI751 -aI-7 -aI803 -aI13 -aI775 -aI6 -aa(lp24319 -g15 -aI690 -aI-65 -aI726 -aI-20 -aI706 -aI-40 -aa(lp24320 -g15 -aI653 -aI-160 -aI674 -aI-91 -aI661 -aI-122 -aa(lp24321 -g15 -aI641 -aI-286 -aI645 -aI-197 -aI641 -aI-239 -aa(lp24322 -g15 -aI652 -aI-411 -aI641 -aI-332 -aI645 -aI-374 -aa(lp24323 -g15 -aI687 -aI-505 -aI660 -aI-448 -aI671 -aI-479 -aa(lp24324 -g15 -aI748 -aI-563 -aI703 -aI-530 -aI723 -aI-549 -aa(lp24325 -g15 -aI835 -aI-583 -aI772 -aI-576 -aI802 -aI-583 -aa(lp24326 -g15 -aI921 -aI-563 -aI868 -aI-583 -aI897 -aI-576 -aa(lp24327 -g15 -aI983 -aI-505 -aI946 -aI-549 -aI966 -aI-530 -aa(lp24328 -g15 -aI1020 -aI-411 -aI999 -aI-479 -aI1012 -aI-448 -aa(lp24329 -g15 -aI1033 -aI-286 -aI1028 -aI-374 -aI1033 -aI-332 -aa(lp24330 -g10 -aa(lp24331 -g8 -aI866 -aI-951 -aa(lp24332 -g20 -aI338 -aI0 -aa(lp24333 -g20 -aI235 -aI0 -aa(lp24334 -g20 -aI764 -aI-951 -aa(lp24335 -g10 -aa(lp24336 -g8 -aI1100 -aI0 -aa(lp24337 -g10 -aa(lp24338 -g8 -aI1100 -aI0 -aasV) -(lp24339 -(lp24340 -g8 -aI348 -aI-364 -aa(lp24341 -g15 -aI336 -aI-205 -aI348 -aI-310 -aI344 -aI-258 -aa(lp24342 -g15 -aI300 -aI-54 -aI328 -aI-153 -aI316 -aI-103 -aa(lp24343 -g15 -aI239 -aI85 -aI284 -aI-5 -aI263 -aI41 -aa(lp24344 -g15 -aI151 -aI211 -aI214 -aI130 -aI185 -aI172 -aa(lp24345 -g20 -aI41 -aI211 -aa(lp24346 -g15 -aI120 -aI81 -aI70 -aI170 -aI97 -aI127 -aa(lp24347 -g15 -aI178 -aI-61 -aI143 -aI35 -aI162 -aI-12 -aa(lp24348 -g15 -aI213 -aI-211 -aI194 -aI-110 -aI205 -aI-160 -aa(lp24349 -g15 -aI225 -aI-366 -aI221 -aI-263 -aI225 -aI-314 -aa(lp24350 -g15 -aI178 -aI-675 -aI225 -aI-471 -aI209 -aI-575 -aa(lp24351 -g15 -aI39 -aI-951 -aI147 -aI-775 -aI100 -aI-867 -aa(lp24352 -g20 -aI151 -aI-951 -aa(lp24353 -g15 -aI239 -aI-822 -aI185 -aI-911 -aI214 -aI-867 -aa(lp24354 -g15 -aI300 -aI-678 -aI263 -aI-776 -aI284 -aI-728 -aa(lp24355 -g15 -aI336 -aI-525 -aI316 -aI-629 -aI328 -aI-577 -aa(lp24356 -g15 -aI348 -aI-364 -aI344 -aI-472 -aI348 -aI-419 -aa(lp24357 -g10 -aa(lp24358 -g8 -aI401 -aI0 -aa(lp24359 -g10 -aa(lp24360 -g8 -aI401 -aI0 -aasV- -(lp24361 -(lp24362 -g8 -aI53 -aI-302 -aa(lp24363 -g20 -aI53 -aI-411 -aa(lp24364 -g20 -aI376 -aI-411 -aa(lp24365 -g20 -aI376 -aI-302 -aa(lp24366 -g10 -aa(lp24367 -g8 -aI429 -aI0 -aa(lp24368 -g10 -aa(lp24369 -g8 -aI429 -aI0 -aasV1 -(lp24370 -(lp24371 -g8 -aI462 -aI0 -aa(lp24372 -g20 -aI348 -aI0 -aa(lp24373 -g20 -aI348 -aI-593 -aa(lp24374 -g15 -aI348 -aI-653 -aI348 -aI-612 -aI348 -aI-632 -aa(lp24375 -g15 -aI349 -aI-717 -aI348 -aI-675 -aI349 -aI-696 -aa(lp24376 -g15 -aI351 -aI-777 -aI350 -aI-738 -aI351 -aI-758 -aa(lp24377 -g15 -aI353 -aI-828 -aI352 -aI-797 -aI353 -aI-814 -aa(lp24378 -g15 -aI333 -aI-808 -aI346 -aI-821 -aI339 -aI-814 -aa(lp24379 -g15 -aI316 -aI-792 -aI328 -aI-803 -aI322 -aI-797 -aa(lp24380 -g15 -aI298 -aI-775 -aI310 -aI-787 -aI304 -aI-781 -aa(lp24381 -g15 -aI274 -aI-755 -aI291 -aI-770 -aI283 -aI-763 -aa(lp24382 -g20 -aI178 -aI-676 -aa(lp24383 -g20 -aI115 -aI-756 -aa(lp24384 -g20 -aI365 -aI-951 -aa(lp24385 -g20 -aI462 -aI-951 -aa(lp24386 -g10 -aa(lp24387 -g8 -aI734 -aI0 -aa(lp24388 -g10 -aa(lp24389 -g8 -aI734 -aI0 -aasV5 -(lp24390 -(lp24391 -g8 -aI354 -aI-583 -aa(lp24392 -g15 -aI474 -aI-565 -aI397 -aI-583 -aI437 -aI-577 -aa(lp24393 -g15 -aI571 -aI-512 -aI512 -aI-553 -aI544 -aI-536 -aa(lp24394 -g15 -aI636 -aI-425 -aI599 -aI-489 -aI621 -aI-460 -aa(lp24395 -g15 -aI660 -aI-304 -aI652 -aI-390 -aI660 -aI-350 -aa(lp24396 -g15 -aI638 -aI-171 -aI660 -aI-255 -aI652 -aI-210 -aa(lp24397 -g15 -aI572 -aI-71 -aI623 -aI-131 -aI601 -aI-98 -aa(lp24398 -g15 -aI464 -aI-8 -aI543 -aI-43 -aI507 -aI-22 -aa(lp24399 -g15 -aI317 -aI13 -aI421 -aI6 -aI372 -aI13 -aa(lp24400 -g15 -aI251 -aI10 -aI294 -aI13 -aI273 -aI12 -aa(lp24401 -g15 -aI189 -aI0 -aI230 -aI8 -aI209 -aI4 -aa(lp24402 -g15 -aI133 -aI-15 -aI170 -aI-3 -aI151 -aI-8 -aa(lp24403 -g15 -aI85 -aI-37 -aI115 -aI-21 -aI99 -aI-29 -aa(lp24404 -g20 -aI85 -aI-149 -aa(lp24405 -g15 -aI135 -aI-123 -aI99 -aI-139 -aI116 -aI-131 -aa(lp24406 -g15 -aI196 -aI-103 -aI155 -aI-115 -aI175 -aI-108 -aa(lp24407 -g15 -aI260 -aI-91 -aI217 -aI-98 -aI239 -aI-94 -aa(lp24408 -g15 -aI320 -aI-87 -aI282 -aI-88 -aI302 -aI-87 -aa(lp24409 -g15 -aI412 -aI-99 -aI354 -aI-87 -aI385 -aI-91 -aa(lp24410 -g15 -aI480 -aI-136 -aI439 -aI-107 -aI461 -aI-119 -aa(lp24411 -g15 -aI523 -aI-200 -aI499 -aI-153 -aI513 -aI-175 -aa(lp24412 -g15 -aI538 -aI-291 -aI533 -aI-226 -aI538 -aI-256 -aa(lp24413 -g15 -aI481 -aI-434 -aI538 -aI-353 -aI519 -aI-401 -aa(lp24414 -g15 -aI314 -aI-483 -aI442 -aI-466 -aI387 -aI-483 -aa(lp24415 -g15 -aI276 -aI-481 -aI302 -aI-483 -aI290 -aI-482 -aa(lp24416 -g15 -aI235 -aI-477 -aI262 -aI-480 -aI249 -aI-479 -aa(lp24417 -g15 -aI196 -aI-471 -aI221 -aI-475 -aI208 -aI-473 -aa(lp24418 -g15 -aI164 -aI-466 -aI183 -aI-469 -aI173 -aI-468 -aa(lp24419 -g20 -aI105 -aI-503 -aa(lp24420 -g20 -aI141 -aI-951 -aa(lp24421 -g20 -aI590 -aI-951 -aa(lp24422 -g20 -aI590 -aI-843 -aa(lp24423 -g20 -aI244 -aI-843 -aa(lp24424 -g20 -aI218 -aI-570 -aa(lp24425 -g15 -aI273 -aI-578 -aI232 -aI-573 -aI250 -aI-575 -aa(lp24426 -g15 -aI354 -aI-583 -aI296 -aI-582 -aI323 -aI-583 -aa(lp24427 -g10 -aa(lp24428 -g8 -aI734 -aI0 -aa(lp24429 -g10 -aa(lp24430 -g8 -aI734 -aI0 -aasV9 -(lp24431 -(lp24432 -g8 -aI669 -aI-545 -aa(lp24433 -g15 -aI662 -aI-408 -aI669 -aI-499 -aI666 -aI-454 -aa(lp24434 -g15 -aI638 -aI-278 -aI657 -aI-363 -aI649 -aI-320 -aa(lp24435 -g15 -aI591 -aI-163 -aI626 -aI-237 -aI611 -aI-199 -aa(lp24436 -g15 -aI514 -aI-70 -aI571 -aI-127 -aI545 -aI-96 -aa(lp24437 -g15 -aI404 -aI-8 -aI484 -aI-44 -aI447 -aI-23 -aa(lp24438 -g15 -aI253 -aI13 -aI361 -aI5 -aI310 -aI13 -aa(lp24439 -g15 -aI225 -aI12 -aI245 -aI13 -aI235 -aI13 -aa(lp24440 -g15 -aI195 -aI10 -aI215 -aI12 -aI205 -aI11 -aa(lp24441 -g15 -aI166 -aI6 -aI185 -aI9 -aI176 -aI8 -aa(lp24442 -g15 -aI141 -aI1 -aI157 -aI5 -aI148 -aI3 -aa(lp24443 -g20 -aI141 -aI-99 -aa(lp24444 -g15 -aI192 -aI-87 -aI156 -aI-94 -aI173 -aI-90 -aa(lp24445 -g15 -aI249 -aI-83 -aI211 -aI-84 -aI230 -aI-83 -aa(lp24446 -g15 -aI393 -aI-114 -aI307 -aI-83 -aI356 -aI-93 -aa(lp24447 -g15 -aI483 -aI-197 -aI431 -aI-134 -aI461 -aI-162 -aa(lp24448 -g15 -aI530 -aI-319 -aI505 -aI-232 -aI521 -aI-272 -aa(lp24449 -g15 -aI548 -aI-466 -aI540 -aI-365 -aI546 -aI-414 -aa(lp24450 -g20 -aI539 -aI-466 -aa(lp24451 -g15 -aI508 -aI-422 -aI531 -aI-450 -aI520 -aI-436 -aa(lp24452 -g15 -aI465 -aI-387 -aI496 -aI-409 -aI481 -aI-397 -aa(lp24453 -g15 -aI409 -aI-364 -aI449 -aI-377 -aI430 -aI-369 -aa(lp24454 -g15 -aI339 -aI-355 -aI388 -aI-358 -aI365 -aI-355 -aa(lp24455 -g15 -aI227 -aI-374 -aI298 -aI-355 -aI261 -aI-362 -aa(lp24456 -g15 -aI142 -aI-431 -aI194 -aI-387 -aI166 -aI-406 -aa(lp24457 -g15 -aI88 -aI-522 -aI119 -aI-455 -aI101 -aI-486 -aa(lp24458 -g15 -aI69 -aI-644 -aI75 -aI-557 -aI69 -aI-598 -aa(lp24459 -g15 -aI89 -aI-778 -aI69 -aI-694 -aI75 -aI-738 -aa(lp24460 -g15 -aI147 -aI-879 -aI103 -aI-818 -aI122 -aI-851 -aa(lp24461 -g15 -aI238 -aI-942 -aI172 -aI-906 -aI202 -aI-928 -aa(lp24462 -g15 -aI358 -aI-965 -aI274 -aI-957 -aI314 -aI-965 -aa(lp24463 -g15 -aI481 -aI-939 -aI402 -aI-965 -aI443 -aI-956 -aa(lp24464 -g15 -aI579 -aI-862 -aI518 -aI-922 -aI551 -aI-896 -aa(lp24465 -g15 -aI645 -aI-730 -aI607 -aI-827 -aI629 -aI-783 -aa(lp24466 -g15 -aI669 -aI-545 -aI661 -aI-678 -aI669 -aI-616 -aa(lp24467 -g10 -aa(lp24468 -g8 -aI360 -aI-864 -aa(lp24469 -g15 -aI288 -aI-851 -aI333 -aI-864 -aI310 -aI-860 -aa(lp24470 -g15 -aI233 -aI-811 -aI267 -aI-843 -aI248 -aI-829 -aa(lp24471 -g15 -aI196 -aI-742 -aI217 -aI-793 -aI205 -aI-770 -aa(lp24472 -g15 -aI184 -aI-644 -aI188 -aI-715 -aI184 -aI-682 -aa(lp24473 -g15 -aI194 -aI-563 -aI184 -aI-614 -aI187 -aI-587 -aa(lp24474 -g15 -aI227 -aI-501 -aI202 -aI-538 -aI212 -aI-518 -aa(lp24475 -g15 -aI280 -aI-462 -aI241 -aI-484 -aI259 -aI-471 -aa(lp24476 -g15 -aI356 -aI-448 -aI302 -aI-453 -aI327 -aI-448 -aa(lp24477 -g15 -aI436 -aI-464 -aI385 -aI-448 -aI412 -aI-453 -aa(lp24478 -g15 -aI497 -aI-503 -aI460 -aI-474 -aI480 -aI-487 -aa(lp24479 -g15 -aI536 -aI-559 -aI514 -aI-520 -aI527 -aI-538 -aa(lp24480 -g15 -aI550 -aI-621 -aI546 -aI-580 -aI550 -aI-601 -aa(lp24481 -g15 -aI538 -aI-708 -aI550 -aI-651 -aI546 -aI-679 -aa(lp24482 -g15 -aI502 -aI-786 -aI530 -aI-737 -aI518 -aI-763 -aa(lp24483 -g15 -aI443 -aI-843 -aI487 -aI-810 -aI467 -aI-828 -aa(lp24484 -g15 -aI360 -aI-864 -aI419 -aI-857 -aI391 -aI-864 -aa(lp24485 -g10 -aa(lp24486 -g8 -aI734 -aI0 -aa(lp24487 -g10 -aa(lp24488 -g8 -aI734 -aI0 -aasV= -(lp24489 -(lp24490 -g8 -aI66 -aI-554 -aa(lp24491 -g20 -aI66 -aI-651 -aa(lp24492 -g20 -aI667 -aI-651 -aa(lp24493 -g20 -aI667 -aI-554 -aa(lp24494 -g10 -aa(lp24495 -g8 -aI66 -aI-287 -aa(lp24496 -g20 -aI66 -aI-384 -aa(lp24497 -g20 -aI667 -aI-384 -aa(lp24498 -g20 -aI667 -aI-287 -aa(lp24499 -g10 -aa(lp24500 -g8 -aI734 -aI0 -aa(lp24501 -g10 -aa(lp24502 -g8 -aI734 -aI0 -aasVA -(lp24503 -(lp24504 -g8 -aI686 -aI0 -aa(lp24505 -g20 -aI582 -aI-294 -aa(lp24506 -g20 -aI227 -aI-294 -aa(lp24507 -g20 -aI122 -aI0 -aa(lp24508 -g20 -aI0 -aI0 -aa(lp24509 -g20 -aI349 -aI-955 -aa(lp24510 -g20 -aI460 -aI-955 -aa(lp24511 -g20 -aI810 -aI0 -aa(lp24512 -g10 -aa(lp24513 -g8 -aI544 -aI-401 -aa(lp24514 -g20 -aI447 -aI-677 -aa(lp24515 -g15 -aI438 -aI-706 -aI445 -aI-685 -aI442 -aI-695 -aa(lp24516 -g15 -aI427 -aI-743 -aI434 -aI-717 -aI430 -aI-730 -aa(lp24517 -g15 -aI415 -aI-783 -aI423 -aI-756 -aI419 -aI-769 -aa(lp24518 -g15 -aI404 -aI-825 -aI411 -aI-797 -aI407 -aI-811 -aa(lp24519 -g15 -aI393 -aI-783 -aI401 -aI-811 -aI397 -aI-797 -aa(lp24520 -g15 -aI382 -aI-742 -aI389 -aI-769 -aI386 -aI-755 -aa(lp24521 -g15 -aI370 -aI-705 -aI378 -aI-728 -aI374 -aI-716 -aa(lp24522 -g15 -aI361 -aI-677 -aI367 -aI-694 -aI363 -aI-685 -aa(lp24523 -g20 -aI266 -aI-401 -aa(lp24524 -g10 -aa(lp24525 -g8 -aI810 -aI0 -aa(lp24526 -g10 -aa(lp24527 -g8 -aI810 -aI0 -aasVE -(lp24528 -(lp24529 -g8 -aI623 -aI0 -aa(lp24530 -g20 -aI129 -aI0 -aa(lp24531 -g20 -aI129 -aI-951 -aa(lp24532 -g20 -aI623 -aI-951 -aa(lp24533 -g20 -aI623 -aI-844 -aa(lp24534 -g20 -aI250 -aI-844 -aa(lp24535 -g20 -aI250 -aI-550 -aa(lp24536 -g20 -aI598 -aI-550 -aa(lp24537 -g20 -aI598 -aI-444 -aa(lp24538 -g20 -aI250 -aI-444 -aa(lp24539 -g20 -aI250 -aI-106 -aa(lp24540 -g20 -aI623 -aI-106 -aa(lp24541 -g10 -aa(lp24542 -g8 -aI703 -aI0 -aa(lp24543 -g10 -aa(lp24544 -g8 -aI703 -aI0 -aasVI -(lp24545 -(lp24546 -g8 -aI398 -aI0 -aa(lp24547 -g20 -aI53 -aI0 -aa(lp24548 -g20 -aI53 -aI-65 -aa(lp24549 -g20 -aI165 -aI-92 -aa(lp24550 -g20 -aI165 -aI-858 -aa(lp24551 -g20 -aI53 -aI-884 -aa(lp24552 -g20 -aI53 -aI-951 -aa(lp24553 -g20 -aI398 -aI-951 -aa(lp24554 -g20 -aI398 -aI-884 -aa(lp24555 -g20 -aI286 -aI-858 -aa(lp24556 -g20 -aI286 -aI-92 -aa(lp24557 -g20 -aI398 -aI-65 -aa(lp24558 -g10 -aa(lp24559 -g8 -aI451 -aI0 -aa(lp24560 -g10 -aa(lp24561 -g8 -aI451 -aI0 -aasVM -(lp24562 -(lp24563 -g8 -aI522 -aI0 -aa(lp24564 -g20 -aI234 -aI-832 -aa(lp24565 -g20 -aI229 -aI-832 -aa(lp24566 -g15 -aI235 -aI-737 -aI231 -aI-800 -aI233 -aI-768 -aa(lp24567 -g15 -aI239 -aI-650 -aI237 -aI-709 -aI238 -aI-681 -aa(lp24568 -g15 -aI241 -aI-568 -aI240 -aI-620 -aI241 -aI-593 -aa(lp24569 -g20 -aI241 -aI0 -aa(lp24570 -g20 -aI129 -aI0 -aa(lp24571 -g20 -aI129 -aI-951 -aa(lp24572 -g20 -aI309 -aI-951 -aa(lp24573 -g20 -aI577 -aI-175 -aa(lp24574 -g20 -aI581 -aI-175 -aa(lp24575 -g20 -aI850 -aI-951 -aa(lp24576 -g20 -aI1030 -aI-951 -aa(lp24577 -g20 -aI1030 -aI0 -aa(lp24578 -g20 -aI909 -aI0 -aa(lp24579 -g20 -aI909 -aI-577 -aa(lp24580 -g15 -aI910 -aI-654 -aI909 -aI-599 -aI909 -aI-625 -aa(lp24581 -g15 -aI914 -aI-737 -aI911 -aI-683 -aI912 -aI-711 -aa(lp24582 -g15 -aI918 -aI-831 -aI915 -aI-768 -aI917 -aI-799 -aa(lp24583 -g20 -aI913 -aI-831 -aa(lp24584 -g20 -aI622 -aI0 -aa(lp24585 -g10 -aa(lp24586 -g8 -aI1160 -aI0 -aa(lp24587 -g10 -aa(lp24588 -g8 -aI1160 -aI0 -aasVQ -(lp24589 -(lp24590 -g8 -aI906 -aI-476 -aa(lp24591 -g15 -aI890 -aI-317 -aI906 -aI-419 -aI901 -aI-366 -aa(lp24592 -g15 -aI844 -aI-185 -aI880 -aI-268 -aI864 -aI-224 -aa(lp24593 -g15 -aI766 -aI-83 -aI823 -aI-146 -aI797 -aI-112 -aa(lp24594 -g15 -aI660 -aI-15 -aI736 -aI-54 -aI700 -aI-32 -aa(lp24595 -g15 -aI732 -aI91 -aI678 -aI24 -aI703 -aI60 -aa(lp24596 -g15 -aI835 -aI177 -aI762 -aI122 -aI796 -aI151 -aa(lp24597 -g20 -aI757 -aI269 -aa(lp24598 -g15 -aI633 -aI158 -aI712 -aI238 -aI671 -aI200 -aa(lp24599 -g15 -aI544 -aI10 -aI596 -aI115 -aI566 -aI65 -aa(lp24600 -g15 -aI519 -aI12 -aI536 -aI11 -aI528 -aI12 -aa(lp24601 -g15 -aI494 -aI13 -aI510 -aI13 -aI502 -aI13 -aa(lp24602 -g15 -aI310 -aI-21 -aI424 -aI13 -aI362 -aI1 -aa(lp24603 -g15 -aI181 -aI-121 -aI259 -aI-45 -aI216 -aI-78 -aa(lp24604 -g15 -aI106 -aI-276 -aI147 -aI-164 -aI122 -aI-216 -aa(lp24605 -g15 -aI81 -aI-478 -aI89 -aI-337 -aI81 -aI-404 -aa(lp24606 -g15 -aI106 -aI-678 -aI81 -aI-551 -aI89 -aI-618 -aa(lp24607 -g15 -aI182 -aI-832 -aI122 -aI-739 -aI148 -aI-790 -aa(lp24608 -g15 -aI311 -aI-931 -aI216 -aI-875 -aI259 -aI-908 -aa(lp24609 -g15 -aI496 -aI-966 -aI363 -aI-954 -aI425 -aI-966 -aa(lp24610 -g15 -aI673 -aI-931 -aI563 -aI-966 -aI622 -aI-954 -aa(lp24611 -g15 -aI802 -aI-832 -aI724 -aI-908 -aI767 -aI-875 -aa(lp24612 -g15 -aI880 -aI-678 -aI836 -aI-789 -aI862 -aI-738 -aa(lp24613 -g15 -aI906 -aI-476 -aI898 -aI-618 -aI906 -aI-550 -aa(lp24614 -g10 -aa(lp24615 -g8 -aI209 -aI-476 -aa(lp24616 -g15 -aI226 -aI-316 -aI209 -aI-417 -aI215 -aI-363 -aa(lp24617 -g15 -aI278 -aI-195 -aI237 -aI-268 -aI255 -aI-228 -aa(lp24618 -g15 -aI366 -aI-119 -aI301 -aI-161 -aI331 -aI-136 -aa(lp24619 -g15 -aI494 -aI-92 -aI402 -aI-101 -aI445 -aI-92 -aa(lp24620 -g15 -aI622 -aI-119 -aI544 -aI-92 -aI586 -aI-101 -aa(lp24621 -g15 -aI711 -aI-195 -aI658 -aI-136 -aI688 -aI-161 -aa(lp24622 -g15 -aI762 -aI-316 -aI734 -aI-228 -aI751 -aI-268 -aa(lp24623 -g15 -aI778 -aI-476 -aI773 -aI-363 -aI778 -aI-417 -aa(lp24624 -g15 -aI762 -aI-637 -aI778 -aI-536 -aI773 -aI-590 -aa(lp24625 -g15 -aI711 -aI-757 -aI751 -aI-684 -aI734 -aI-724 -aa(lp24626 -g15 -aI623 -aI-833 -aI688 -aI-790 -aI659 -aI-815 -aa(lp24627 -g15 -aI496 -aI-859 -aI588 -aI-850 -aI545 -aI-859 -aa(lp24628 -g15 -aI367 -aI-833 -aI446 -aI-859 -aI403 -aI-850 -aa(lp24629 -g15 -aI278 -aI-757 -aI331 -aI-815 -aI302 -aI-790 -aa(lp24630 -g15 -aI226 -aI-637 -aI255 -aI-724 -aI237 -aI-684 -aa(lp24631 -g15 -aI209 -aI-476 -aI215 -aI-590 -aI209 -aI-536 -aa(lp24632 -g10 -aa(lp24633 -g8 -aI988 -aI0 -aa(lp24634 -g10 -aa(lp24635 -g8 -aI988 -aI0 -aasVU -(lp24636 -(lp24637 -g8 -aI810 -aI-952 -aa(lp24638 -g20 -aI810 -aI-335 -aa(lp24639 -g15 -aI789 -aI-197 -aI810 -aI-286 -aI803 -aI-239 -aa(lp24640 -g15 -aI724 -aI-86 -aI774 -aI-154 -aI753 -aI-118 -aa(lp24641 -g15 -aI615 -aI-13 -aI695 -aI-55 -aI659 -aI-31 -aa(lp24642 -g15 -aI461 -aI13 -aI571 -aI4 -aI520 -aI13 -aa(lp24643 -g15 -aI314 -aI-11 -aI406 -aI13 -aI356 -aI5 -aa(lp24644 -g15 -aI207 -aI-82 -aI271 -aI-28 -aI236 -aI-52 -aa(lp24645 -g15 -aI141 -aI-193 -aI178 -aI-113 -aI156 -aI-150 -aa(lp24646 -g15 -aI119 -aI-338 -aI127 -aI-237 -aI119 -aI-285 -aa(lp24647 -g20 -aI119 -aI-951 -aa(lp24648 -g20 -aI241 -aI-951 -aa(lp24649 -g20 -aI241 -aI-331 -aa(lp24650 -g15 -aI297 -aI-155 -aI241 -aI-255 -aI260 -aI-196 -aa(lp24651 -g15 -aI468 -aI-92 -aI335 -aI-113 -aI392 -aI-92 -aa(lp24652 -g15 -aI567 -aI-110 -aI506 -aI-92 -aI539 -aI-98 -aa(lp24653 -g15 -aI636 -aI-159 -aI595 -aI-121 -aI618 -aI-138 -aa(lp24654 -g15 -aI675 -aI-235 -aI653 -aI-180 -aI667 -aI-206 -aa(lp24655 -g15 -aI689 -aI-332 -aI684 -aI-265 -aI689 -aI-297 -aa(lp24656 -g20 -aI689 -aI-952 -aa(lp24657 -g10 -aa(lp24658 -g8 -aI930 -aI0 -aa(lp24659 -g10 -aa(lp24660 -g8 -aI930 -aI0 -aasVY -(lp24661 -(lp24662 -g8 -aI350 -aI-470 -aa(lp24663 -g20 -aI572 -aI-951 -aa(lp24664 -g20 -aI702 -aI-951 -aa(lp24665 -g20 -aI412 -aI-369 -aa(lp24666 -g20 -aI412 -aI0 -aa(lp24667 -g20 -aI290 -aI0 -aa(lp24668 -g20 -aI290 -aI-363 -aa(lp24669 -g20 -aI0 -aI-951 -aa(lp24670 -g20 -aI132 -aI-951 -aa(lp24671 -g10 -aa(lp24672 -g8 -aI702 -aI0 -aa(lp24673 -g10 -aa(lp24674 -g8 -aI702 -aI0 -aasV] -(lp24675 -(lp24676 -g8 -aI33 -aI113 -aa(lp24677 -g20 -aI178 -aI113 -aa(lp24678 -g20 -aI178 -aI-854 -aa(lp24679 -g20 -aI33 -aI-854 -aa(lp24680 -g20 -aI33 -aI-951 -aa(lp24681 -g20 -aI297 -aI-951 -aa(lp24682 -g20 -aI297 -aI211 -aa(lp24683 -g20 -aI33 -aI211 -aa(lp24684 -g10 -aa(lp24685 -g8 -aI404 -aI0 -aa(lp24686 -g10 -aa(lp24687 -g8 -aI404 -aI0 -aasVa -(lp24688 -(lp24689 -g8 -aI516 -aI0 -aa(lp24690 -g20 -aI492 -aI-98 -aa(lp24691 -g20 -aI486 -aI-98 -aa(lp24692 -g15 -aI444 -aI-48 -aI472 -aI-78 -aI458 -aI-62 -aa(lp24693 -g15 -aI397 -aI-13 -aI429 -aI-33 -aI414 -aI-22 -aa(lp24694 -g15 -aI340 -aI6 -aI380 -aI-4 -aI361 -aI2 -aa(lp24695 -g15 -aI268 -aI13 -aI319 -aI11 -aI295 -aI13 -aa(lp24696 -g15 -aI185 -aI0 -aI238 -aI13 -aI210 -aI9 -aa(lp24697 -g15 -aI120 -aI-38 -aI160 -aI-7 -aI138 -aI-20 -aa(lp24698 -g15 -aI76 -aI-104 -aI101 -aI-55 -aI87 -aI-77 -aa(lp24699 -g15 -aI61 -aI-199 -aI66 -aI-131 -aI61 -aI-162 -aa(lp24700 -g15 -aI136 -aI-363 -aI61 -aI-270 -aI86 -aI-325 -aa(lp24701 -g15 -aI365 -aI-425 -aI186 -aI-401 -aI262 -aI-422 -aa(lp24702 -g20 -aI485 -aI-430 -aa(lp24703 -g20 -aI485 -aI-475 -aa(lp24704 -g15 -aI475 -aI-548 -aI485 -aI-504 -aI481 -aI-528 -aa(lp24705 -g15 -aI448 -aI-595 -aI469 -aI-567 -aI460 -aI-583 -aa(lp24706 -g15 -aI403 -aI-621 -aI436 -aI-607 -aI421 -aI-616 -aa(lp24707 -g15 -aI343 -aI-629 -aI386 -aI-626 -aI366 -aI-629 -aa(lp24708 -g15 -aI243 -aI-613 -aI307 -aI-629 -aI274 -aI-623 -aa(lp24709 -g15 -aI153 -aI-575 -aI212 -aI-603 -aI182 -aI-590 -aa(lp24710 -g20 -aI111 -aI-664 -aa(lp24711 -g15 -aI219 -aI-709 -aI144 -aI-682 -aI179 -aI-697 -aa(lp24712 -g15 -aI343 -aI-727 -aI258 -aI-721 -aI300 -aI-727 -aa(lp24713 -g15 -aI458 -aI-714 -aI388 -aI-727 -aI426 -aI-722 -aa(lp24714 -g15 -aI538 -aI-671 -aI490 -aI-705 -aI517 -aI-691 -aa(lp24715 -g15 -aI585 -aI-597 -aI559 -aI-652 -aI575 -aI-627 -aa(lp24716 -g15 -aI601 -aI-489 -aI596 -aI-567 -aI601 -aI-531 -aa(lp24717 -g20 -aI601 -aI0 -aa(lp24718 -g10 -aa(lp24719 -g8 -aI298 -aI-82 -aa(lp24720 -g15 -aI372 -aI-94 -aI325 -aI-82 -aI349 -aI-86 -aa(lp24721 -g15 -aI430 -aI-132 -aI394 -aI-102 -aI414 -aI-115 -aa(lp24722 -g15 -aI469 -aI-195 -aI447 -aI-148 -aI460 -aI-169 -aa(lp24723 -g15 -aI483 -aI-284 -aI479 -aI-220 -aI483 -aI-250 -aa(lp24724 -g20 -aI483 -aI-349 -aa(lp24725 -g20 -aI390 -aI-344 -aa(lp24726 -g15 -aI292 -aI-331 -aI351 -aI-342 -aI318 -aI-338 -aa(lp24727 -g15 -aI228 -aI-302 -aI265 -aI-324 -aI244 -aI-314 -aa(lp24728 -g15 -aI194 -aI-257 -aI212 -aI-290 -aI201 -aI-275 -aa(lp24729 -g15 -aI184 -aI-198 -aI187 -aI-240 -aI184 -aI-220 -aa(lp24730 -g15 -aI215 -aI-110 -aI184 -aI-158 -aI194 -aI-128 -aa(lp24731 -g15 -aI298 -aI-82 -aI236 -aI-91 -aI264 -aI-82 -aa(lp24732 -g10 -aa(lp24733 -g8 -aI707 -aI0 -aa(lp24734 -g10 -aa(lp24735 -g8 -aI707 -aI0 -aasVe -(lp24736 -(lp24737 -g8 -aI395 -aI13 -aa(lp24738 -g15 -aI264 -aI-10 -aI348 -aI13 -aI304 -aI5 -aa(lp24739 -g15 -aI163 -aI-80 -aI225 -aI-26 -aI191 -aI-50 -aa(lp24740 -g15 -aI97 -aI-195 -aI134 -aI-111 -aI112 -aI-149 -aa(lp24741 -g15 -aI73 -aI-351 -aI81 -aI-241 -aI73 -aI-293 -aa(lp24742 -g15 -aI95 -aI-509 -aI73 -aI-410 -aI80 -aI-463 -aa(lp24743 -g15 -aI155 -aI-628 -aI109 -aI-556 -aI129 -aI-595 -aa(lp24744 -g15 -aI249 -aI-702 -aI181 -aI-660 -aI212 -aI-685 -aa(lp24745 -g15 -aI369 -aI-727 -aI285 -aI-718 -aI325 -aI-727 -aa(lp24746 -g15 -aI485 -aI-704 -aI412 -aI-727 -aI450 -aI-719 -aa(lp24747 -g15 -aI572 -aI-639 -aI519 -aI-688 -aI548 -aI-667 -aa(lp24748 -g15 -aI627 -aI-538 -aI596 -aI-611 -aI614 -aI-577 -aa(lp24749 -g15 -aI646 -aI-407 -aI640 -aI-499 -aI646 -aI-455 -aa(lp24750 -g20 -aI646 -aI-334 -aa(lp24751 -g20 -aI195 -aI-334 -aa(lp24752 -g15 -aI249 -aI-149 -aI198 -aI-250 -aI215 -aI-188 -aa(lp24753 -g15 -aI397 -aI-90 -aI282 -aI-109 -aI331 -aI-90 -aa(lp24754 -g15 -aI458 -aI-93 -aI419 -aI-90 -aI439 -aI-91 -aa(lp24755 -g15 -aI513 -aI-102 -aI477 -aI-95 -aI495 -aI-98 -aa(lp24756 -g15 -aI564 -aI-118 -aI530 -aI-106 -aI547 -aI-112 -aa(lp24757 -g15 -aI614 -aI-139 -aI580 -aI-124 -aI597 -aI-131 -aa(lp24758 -g20 -aI614 -aI-34 -aa(lp24759 -g15 -aI563 -aI-12 -aI597 -aI-25 -aI580 -aI-18 -aa(lp24760 -g15 -aI512 -aI2 -aI546 -aI-6 -aI529 -aI-1 -aa(lp24761 -g15 -aI457 -aI10 -aI494 -aI6 -aI476 -aI9 -aa(lp24762 -g15 -aI395 -aI13 -aI438 -aI12 -aI417 -aI13 -aa(lp24763 -g10 -aa(lp24764 -g8 -aI366 -aI-629 -aa(lp24765 -g15 -aI249 -aI-578 -aI317 -aI-629 -aI277 -aI-612 -aa(lp24766 -g15 -aI198 -aI-430 -aI220 -aI-544 -aI203 -aI-495 -aa(lp24767 -g20 -aI518 -aI-430 -aa(lp24768 -g15 -aI510 -aI-511 -aI518 -aI-460 -aI515 -aI-487 -aa(lp24769 -g15 -aI482 -aI-574 -aI504 -aI-536 -aI495 -aI-557 -aa(lp24770 -g15 -aI435 -aI-614 -aI470 -aI-591 -aI454 -aI-605 -aa(lp24771 -g15 -aI366 -aI-629 -aI416 -aI-624 -aI393 -aI-629 -aa(lp24772 -g10 -aa(lp24773 -g8 -aI713 -aI0 -aa(lp24774 -g10 -aa(lp24775 -g8 -aI713 -aI0 -aasVi -(lp24776 -(lp24777 -g8 -aI231 -aI0 -aa(lp24778 -g20 -aI113 -aI0 -aa(lp24779 -g20 -aI113 -aI-714 -aa(lp24780 -g20 -aI231 -aI-714 -aa(lp24781 -g10 -aa(lp24782 -g8 -aI104 -aI-907 -aa(lp24783 -g15 -aI124 -aI-964 -aI104 -aI-933 -aI110 -aI-952 -aa(lp24784 -g15 -aI173 -aI-981 -aI137 -aI-976 -aI153 -aI-981 -aa(lp24785 -g15 -aI200 -aI-977 -aI182 -aI-981 -aI191 -aI-980 -aa(lp24786 -g15 -aI222 -aI-964 -aI208 -aI-974 -aI216 -aI-970 -aa(lp24787 -g15 -aI237 -aI-941 -aI228 -aI-958 -aI233 -aI-950 -aa(lp24788 -g15 -aI242 -aI-907 -aI240 -aI-931 -aI242 -aI-920 -aa(lp24789 -g15 -aI222 -aI-851 -aI242 -aI-882 -aI236 -aI-863 -aa(lp24790 -g15 -aI173 -aI-832 -aI208 -aI-839 -aI192 -aI-832 -aa(lp24791 -g15 -aI124 -aI-851 -aI153 -aI-832 -aI137 -aI-838 -aa(lp24792 -g15 -aI104 -aI-907 -aI110 -aI-863 -aI104 -aI-882 -aa(lp24793 -g10 -aa(lp24794 -g8 -aI345 -aI0 -aa(lp24795 -g10 -aa(lp24796 -g8 -aI345 -aI0 -aasVm -(lp24797 -(lp24798 -g8 -aI969 -aI0 -aa(lp24799 -g20 -aI969 -aI-459 -aa(lp24800 -g15 -aI936 -aI-586 -aI969 -aI-516 -aI958 -aI-558 -aa(lp24801 -g15 -aI835 -aI-629 -aI915 -aI-614 -aI881 -aI-629 -aa(lp24802 -g15 -aI755 -aI-613 -aI804 -aI-629 -aI777 -aI-624 -aa(lp24803 -g15 -aI700 -aI-568 -aI733 -aI-603 -aI714 -aI-588 -aa(lp24804 -g15 -aI669 -aI-495 -aI686 -aI-549 -aI676 -aI-524 -aa(lp24805 -g15 -aI660 -aI-394 -aI663 -aI-466 -aI660 -aI-432 -aa(lp24806 -g20 -aI660 -aI0 -aa(lp24807 -g20 -aI541 -aI0 -aa(lp24808 -g20 -aI541 -aI-459 -aa(lp24809 -g15 -aI508 -aI-586 -aI541 -aI-516 -aI530 -aI-558 -aa(lp24810 -g15 -aI408 -aI-629 -aI487 -aI-614 -aI453 -aI-629 -aa(lp24811 -g15 -aI324 -aI-612 -aI374 -aI-629 -aI346 -aI-623 -aa(lp24812 -g15 -aI269 -aI-562 -aI301 -aI-600 -aI283 -aI-584 -aa(lp24813 -g15 -aI240 -aI-480 -aI256 -aI-539 -aI246 -aI-512 -aa(lp24814 -g15 -aI231 -aI-369 -aI234 -aI-448 -aI231 -aI-411 -aa(lp24815 -g20 -aI231 -aI0 -aa(lp24816 -g20 -aI113 -aI0 -aa(lp24817 -g20 -aI113 -aI-714 -aa(lp24818 -g20 -aI209 -aI-714 -aa(lp24819 -g20 -aI226 -aI-618 -aa(lp24820 -g20 -aI233 -aI-618 -aa(lp24821 -g15 -aI270 -aI-666 -aI243 -aI-636 -aI255 -aI-652 -aa(lp24822 -g15 -aI317 -aI-700 -aI284 -aI-680 -aI300 -aI-691 -aa(lp24823 -g15 -aI372 -aI-720 -aI334 -aI-709 -aI352 -aI-716 -aa(lp24824 -g15 -aI430 -aI-727 -aI391 -aI-725 -aI411 -aI-727 -aa(lp24825 -g15 -aI560 -aI-698 -aI483 -aI-727 -aI526 -aI-717 -aa(lp24826 -g15 -aI637 -aI-608 -aI595 -aI-679 -aI620 -aI-649 -aa(lp24827 -g20 -aI642 -aI-608 -aa(lp24828 -g15 -aI683 -aI-661 -aI653 -aI-629 -aI667 -aI-646 -aa(lp24829 -g15 -aI735 -aI-698 -aI699 -aI-676 -aI716 -aI-688 -aa(lp24830 -g15 -aI794 -aI-720 -aI754 -aI-708 -aI774 -aI-715 -aa(lp24831 -g15 -aI858 -aI-727 -aI815 -aI-725 -aI837 -aI-727 -aa(lp24832 -g15 -aI1030 -aI-665 -aI934 -aI-727 -aI991 -aI-706 -aa(lp24833 -g15 -aI1087 -aI-466 -aI1068 -aI-623 -aI1087 -aI-557 -aa(lp24834 -g20 -aI1087 -aI0 -aa(lp24835 -g10 -aa(lp24836 -g8 -aI1194 -aI0 -aa(lp24837 -g10 -aa(lp24838 -g8 -aI1194 -aI0 -aasVq -(lp24839 -(lp24840 -g8 -aI367 -aI-84 -aa(lp24841 -g15 -aI451 -aI-99 -aI400 -aI-84 -aI428 -aI-89 -aa(lp24842 -g15 -aI506 -aI-145 -aI474 -aI-109 -aI492 -aI-124 -aa(lp24843 -g15 -aI538 -aI-221 -aI520 -aI-165 -aI531 -aI-191 -aa(lp24844 -g15 -aI549 -aI-328 -aI544 -aI-252 -aI548 -aI-288 -aa(lp24845 -g20 -aI549 -aI-355 -aa(lp24846 -g15 -aI540 -aI-472 -aI549 -aI-399 -aI546 -aI-438 -aa(lp24847 -g15 -aI510 -aI-558 -aI534 -aI-506 -aI524 -aI-535 -aa(lp24848 -g15 -aI454 -aI-611 -aI496 -aI-581 -aI477 -aI-599 -aa(lp24849 -g15 -aI366 -aI-629 -aI430 -aI-623 -aI401 -aI-629 -aa(lp24850 -g15 -aI237 -aI-558 -aI307 -aI-629 -aI264 -aI-605 -aa(lp24851 -g15 -aI195 -aI-354 -aI209 -aI-510 -aI195 -aI-442 -aa(lp24852 -g15 -aI237 -aI-151 -aI195 -aI-263 -aI209 -aI-196 -aa(lp24853 -g15 -aI367 -aI-84 -aI264 -aI-107 -aI308 -aI-84 -aa(lp24854 -g10 -aa(lp24855 -g8 -aI345 -aI13 -aa(lp24856 -g15 -aI234 -aI-9 -aI304 -aI13 -aI267 -aI5 -aa(lp24857 -g15 -aI148 -aI-79 -aI200 -aI-25 -aI172 -aI-48 -aa(lp24858 -g15 -aI93 -aI-195 -aI124 -aI-110 -aI106 -aI-149 -aa(lp24859 -g15 -aI73 -aI-355 -aI80 -aI-241 -aI73 -aI-294 -aa(lp24860 -g15 -aI93 -aI-516 -aI73 -aI-416 -aI80 -aI-470 -aa(lp24861 -g15 -aI148 -aI-633 -aI106 -aI-563 -aI124 -aI-601 -aa(lp24862 -g15 -aI234 -aI-703 -aI172 -aI-664 -aI200 -aI-687 -aa(lp24863 -g15 -aI345 -aI-727 -aI267 -aI-719 -aI304 -aI-727 -aa(lp24864 -g15 -aI414 -aI-718 -aI370 -aI-727 -aI393 -aI-724 -aa(lp24865 -g15 -aI470 -aI-695 -aI435 -aI-712 -aI454 -aI-704 -aa(lp24866 -g15 -aI514 -aI-660 -aI487 -aI-685 -aI501 -aI-673 -aa(lp24867 -g15 -aI549 -aI-618 -aI527 -aI-647 -aI539 -aI-633 -aa(lp24868 -g20 -aI554 -aI-618 -aa(lp24869 -g20 -aI572 -aI-714 -aa(lp24870 -g20 -aI667 -aI-714 -aa(lp24871 -g20 -aI667 -aI320 -aa(lp24872 -g20 -aI549 -aI320 -aa(lp24873 -g20 -aI549 -aI15 -aa(lp24874 -g15 -aI550 -aI-15 -aI549 -aI7 -aI549 -aI-3 -aa(lp24875 -g15 -aI553 -aI-52 -aI551 -aI-28 -aI552 -aI-40 -aa(lp24876 -g15 -aI557 -aI-95 -aI554 -aI-66 -aI555 -aI-80 -aa(lp24877 -g20 -aI549 -aI-95 -aa(lp24878 -g15 -aI515 -aI-53 -aI539 -aI-80 -aI528 -aI-66 -aa(lp24879 -g15 -aI471 -aI-18 -aI503 -aI-40 -aI488 -aI-28 -aa(lp24880 -g15 -aI415 -aI5 -aI454 -aI-8 -aI436 -aI0 -aa(lp24881 -g15 -aI345 -aI13 -aI394 -aI10 -aI371 -aI13 -aa(lp24882 -g10 -aa(lp24883 -g8 -aI781 -aI0 -aa(lp24884 -g10 -aa(lp24885 -g8 -aI781 -aI0 -aasVu -(lp24886 -(lp24887 -g8 -aI576 -aI0 -aa(lp24888 -g20 -aI558 -aI-95 -aa(lp24889 -g20 -aI552 -aI-95 -aa(lp24890 -g15 -aI513 -aI-46 -aI541 -aI-76 -aI528 -aI-60 -aa(lp24891 -g15 -aI464 -aI-12 -aI498 -aI-33 -aI481 -aI-21 -aa(lp24892 -g15 -aI407 -aI6 -aI446 -aI-3 -aI427 -aI2 -aa(lp24893 -g15 -aI346 -aI13 -aI387 -aI11 -aI367 -aI13 -aa(lp24894 -g15 -aI242 -aI-1 -aI306 -aI13 -aI272 -aI8 -aa(lp24895 -g15 -aI167 -aI-48 -aI212 -aI-11 -aI187 -aI-27 -aa(lp24896 -g15 -aI122 -aI-129 -aI147 -aI-69 -aI132 -aI-96 -aa(lp24897 -g15 -aI106 -aI-247 -aI111 -aI-162 -aI106 -aI-202 -aa(lp24898 -g20 -aI106 -aI-714 -aa(lp24899 -g20 -aI225 -aI-714 -aa(lp24900 -g20 -aI225 -aI-254 -aa(lp24901 -g15 -aI259 -aI-127 -aI225 -aI-197 -aI236 -aI-155 -aa(lp24902 -g15 -aI366 -aI-84 -aI282 -aI-98 -aI318 -aI-84 -aa(lp24903 -g15 -aI455 -aI-101 -aI401 -aI-84 -aI431 -aI-90 -aa(lp24904 -g15 -aI512 -aI-151 -aI478 -aI-113 -aI498 -aI-129 -aa(lp24905 -g15 -aI543 -aI-232 -aI527 -aI-173 -aI537 -aI-200 -aa(lp24906 -g15 -aI553 -aI-343 -aI550 -aI-264 -aI553 -aI-301 -aa(lp24907 -g20 -aI553 -aI-714 -aa(lp24908 -g20 -aI671 -aI-714 -aa(lp24909 -g20 -aI671 -aI0 -aa(lp24910 -g10 -aa(lp24911 -g8 -aI785 -aI0 -aa(lp24912 -g10 -aa(lp24913 -g8 -aI785 -aI0 -aasVy -(lp24914 -(lp24915 -g8 -aI6 -aI-714 -aa(lp24916 -g20 -aI129 -aI-714 -aa(lp24917 -g20 -aI269 -aI-315 -aa(lp24918 -g15 -aI288 -aI-260 -aI275 -aI-297 -aI281 -aI-279 -aa(lp24919 -g15 -aI305 -aI-203 -aI294 -aI-241 -aI300 -aI-222 -aa(lp24920 -g15 -aI319 -aI-147 -aI311 -aI-184 -aI315 -aI-165 -aa(lp24921 -g15 -aI328 -aI-98 -aI323 -aI-130 -aI326 -aI-113 -aa(lp24922 -g20 -aI332 -aI-98 -aa(lp24923 -g15 -aI342 -aI-142 -aI334 -aI-109 -aI337 -aI-124 -aa(lp24924 -g15 -aI358 -aI-202 -aI347 -aI-161 -aI352 -aI-181 -aa(lp24925 -g15 -aI376 -aI-264 -aI364 -aI-223 -aI370 -aI-244 -aa(lp24926 -g15 -aI393 -aI-316 -aI382 -aI-284 -aI388 -aI-302 -aa(lp24927 -g20 -aI522 -aI-714 -aa(lp24928 -g20 -aI645 -aI-714 -aa(lp24929 -g20 -aI362 -aI93 -aa(lp24930 -g15 -aI323 -aI188 -aI350 -aI128 -aI337 -aI160 -aa(lp24931 -g15 -aI274 -aI259 -aI309 -aI216 -aI292 -aI240 -aa(lp24932 -g15 -aI208 -aI304 -aI255 -aI279 -aI233 -aI294 -aa(lp24933 -g15 -aI118 -aI320 -aI183 -aI315 -aI153 -aI320 -aa(lp24934 -g15 -aI59 -aI317 -aI95 -aI320 -aI76 -aI319 -aa(lp24935 -g15 -aI17 -aI309 -aI43 -aI314 -aI29 -aI312 -aa(lp24936 -g20 -aI17 -aI215 -aa(lp24937 -g15 -aI52 -aI220 -aI26 -aI217 -aI38 -aI219 -aa(lp24938 -g15 -aI95 -aI223 -aI65 -aI222 -aI80 -aI223 -aa(lp24939 -g15 -aI149 -aI215 -aI116 -aI223 -aI134 -aI220 -aa(lp24940 -g15 -aI189 -aI193 -aI164 -aI210 -aI178 -aI203 -aa(lp24941 -g15 -aI218 -aI158 -aI200 -aI184 -aI210 -aI172 -aa(lp24942 -g15 -aI240 -aI111 -aI226 -aI144 -aI233 -aI128 -aa(lp24943 -g20 -aI277 -aI6 -aa(lp24944 -g10 -aa(lp24945 -g8 -aI651 -aI0 -aa(lp24946 -g10 -aa(lp24947 -g8 -aI651 -aI0 -aasV} -(lp24948 -(lp24949 -g8 -aI146 -aI-204 -aa(lp24950 -g15 -aI185 -aI-313 -aI146 -aI-250 -aI159 -aI-286 -aa(lp24951 -g15 -aI298 -aI-366 -aI211 -aI-339 -aI248 -aI-357 -aa(lp24952 -g20 -aI298 -aI-373 -aa(lp24953 -g15 -aI185 -aI-426 -aI248 -aI-382 -aI211 -aI-400 -aa(lp24954 -g15 -aI146 -aI-535 -aI159 -aI-453 -aI146 -aI-489 -aa(lp24955 -g20 -aI146 -aI-751 -aa(lp24956 -g15 -aI138 -aI-802 -aI146 -aI-772 -aI143 -aI-789 -aa(lp24957 -g15 -aI116 -aI-833 -aI133 -aI-815 -aI125 -aI-826 -aa(lp24958 -g15 -aI80 -aI-849 -aI106 -aI-841 -aI94 -aI-846 -aa(lp24959 -g15 -aI33 -aI-854 -aI66 -aI-852 -aI50 -aI-853 -aa(lp24960 -g20 -aI33 -aI-951 -aa(lp24961 -g15 -aI125 -aI-939 -aI66 -aI-950 -aI97 -aI-947 -aa(lp24962 -g15 -aI199 -aI-906 -aI154 -aI-932 -aI178 -aI-921 -aa(lp24963 -g15 -aI248 -aI-847 -aI220 -aI-890 -aI236 -aI-871 -aa(lp24964 -g15 -aI265 -aI-760 -aI259 -aI-823 -aI265 -aI-794 -aa(lp24965 -g20 -aI265 -aI-543 -aa(lp24966 -g15 -aI276 -aI-486 -aI265 -aI-521 -aI269 -aI-502 -aa(lp24967 -g15 -aI308 -aI-448 -aI283 -aI-470 -aI294 -aI-458 -aa(lp24968 -g15 -aI360 -aI-427 -aI322 -aI-438 -aI339 -aI-431 -aa(lp24969 -g15 -aI432 -aI-420 -aI381 -aI-422 -aI405 -aI-420 -aa(lp24970 -g20 -aI432 -aI-319 -aa(lp24971 -g15 -aI308 -aI-291 -aI378 -aI-319 -aI336 -aI-310 -aa(lp24972 -g15 -aI265 -aI-196 -aI279 -aI-273 -aI265 -aI-241 -aa(lp24973 -g20 -aI265 -aI20 -aa(lp24974 -g15 -aI248 -aI107 -aI265 -aI54 -aI259 -aI83 -aa(lp24975 -g15 -aI199 -aI166 -aI236 -aI131 -aI220 -aI150 -aa(lp24976 -g15 -aI125 -aI199 -aI178 -aI181 -aI154 -aI192 -aa(lp24977 -g15 -aI33 -aI211 -aI97 -aI207 -aI66 -aI210 -aa(lp24978 -g20 -aI33 -aI113 -aa(lp24979 -g15 -aI80 -aI108 -aI50 -aI113 -aI66 -aI111 -aa(lp24980 -g15 -aI116 -aI93 -aI94 -aI106 -aI106 -aI100 -aa(lp24981 -g15 -aI138 -aI61 -aI125 -aI85 -aI133 -aI75 -aa(lp24982 -g15 -aI146 -aI10 -aI143 -aI48 -aI146 -aI31 -aa(lp24983 -g10 -aa(lp24984 -g8 -aI472 -aI0 -aa(lp24985 -g10 -aa(lp24986 -g8 -aI472 -aI0 -aasssS'Droid Sans Mono' -p24987 -(dp24988 -g10874 -(dp24989 -V -(lp24990 -(lp24991 -g8 -aI800 -aI0 -aa(lp24992 -g10 -aa(lp24993 -g8 -aI800 -aI0 -aasV$ -(lp24994 -(lp24995 -g8 -aI445 -aI-71 -aa(lp24996 -g20 -aI445 -aI77 -aa(lp24997 -g20 -aI356 -aI77 -aa(lp24998 -g20 -aI356 -aI-65 -aa(lp24999 -g15 -aI118 -aI-111 -aI257 -aI-65 -aI177 -aI-81 -aa(lp25000 -g20 -aI118 -aI-223 -aa(lp25001 -g15 -aI356 -aI-163 -aI203 -aI-183 -aI282 -aI-163 -aa(lp25002 -g20 -aI356 -aI-446 -aa(lp25003 -g15 -aI180 -aI-540 -aI272 -aI-473 -aI213 -aI-505 -aa(lp25004 -g15 -aI129 -aI-683 -aI146 -aI-576 -aI129 -aI-623 -aa(lp25005 -g15 -aI189 -aI-825 -aI129 -aI-740 -aI149 -aI-787 -aa(lp25006 -g15 -aI356 -aI-894 -aI229 -aI-862 -aI284 -aI-885 -aa(lp25007 -g20 -aI356 -aI-1011 -aa(lp25008 -g20 -aI445 -aI-1011 -aa(lp25009 -g20 -aI445 -aI-896 -aa(lp25010 -g15 -aI664 -aI-845 -aI526 -aI-892 -aI599 -aI-875 -aa(lp25011 -g20 -aI621 -aI-751 -aa(lp25012 -g15 -aI445 -aI-798 -aI560 -aI-778 -aI501 -aI-794 -aa(lp25013 -g20 -aI445 -aI-523 -aa(lp25014 -g15 -aI627 -aI-426 -aI531 -aI-494 -aI592 -aI-461 -aa(lp25015 -g15 -aI679 -aI-289 -aI662 -aI-392 -aI679 -aI-346 -aa(lp25016 -g15 -aI445 -aI-71 -aI679 -aI-168 -aI601 -aI-95 -aa(lp25017 -g10 -aa(lp25018 -g8 -aI356 -aI-555 -aa(lp25019 -g20 -aI356 -aI-795 -aa(lp25020 -g15 -aI244 -aI-682 -aI281 -aI-783 -aI244 -aI-745 -aa(lp25021 -g15 -aI270 -aI-603 -aI244 -aI-648 -aI252 -aI-622 -aa(lp25022 -g15 -aI356 -aI-555 -aI288 -aI-585 -aI316 -aI-568 -aa(lp25023 -g10 -aa(lp25024 -g8 -aI445 -aI-412 -aa(lp25025 -g20 -aI445 -aI-170 -aa(lp25026 -g15 -aI565 -aI-289 -aI525 -aI-182 -aI565 -aI-222 -aa(lp25027 -g15 -aI445 -aI-412 -aI565 -aI-345 -aI525 -aI-386 -aa(lp25028 -g10 -aa(lp25029 -g8 -aI800 -aI0 -aa(lp25030 -g10 -aa(lp25031 -g8 -aI800 -aI0 -aasV( -(lp25032 -(lp25033 -g8 -aI481 -aI-951 -aa(lp25034 -g20 -aI606 -aI-951 -aa(lp25035 -g15 -aI314 -aI-369 -aI411 -aI-788 -aI314 -aI-594 -aa(lp25036 -g15 -aI605 -aI211 -aI314 -aI-143 -aI411 -aI49 -aa(lp25037 -g20 -aI481 -aI211 -aa(lp25038 -g15 -aI192 -aI-368 -aI288 -aI58 -aI192 -aI-135 -aa(lp25039 -g15 -aI481 -aI-951 -aI192 -aI-599 -aI288 -aI-793 -aa(lp25040 -g10 -aa(lp25041 -g8 -aI800 -aI0 -aa(lp25042 -g10 -aa(lp25043 -g8 -aI800 -aI0 -aasV, -(lp25044 -(lp25045 -g8 -aI501 -aI-170 -aa(lp25046 -g20 -aI511 -aI-154 -aa(lp25047 -g15 -aI385 -aI188 -aI486 -aI-57 -aI444 -aI57 -aa(lp25048 -g20 -aI286 -aI188 -aa(lp25049 -g15 -aI358 -aI-170 -aI319 -aI48 -aI343 -aI-71 -aa(lp25050 -g10 -aa(lp25051 -g8 -aI800 -aI0 -aa(lp25052 -g10 -aa(lp25053 -g8 -aI800 -aI0 -aasV0 -(lp25054 -(lp25055 -g8 -aI398 -aI13 -aa(lp25056 -g15 -aI172 -aI-112 -aI299 -aI13 -aI223 -aI-28 -aa(lp25057 -g15 -aI95 -aI-476 -aI121 -aI-196 -aI95 -aI-317 -aa(lp25058 -g15 -aI398 -aI-966 -aI95 -aI-803 -aI196 -aI-966 -aa(lp25059 -g15 -aI626 -aI-840 -aI499 -aI-966 -aI575 -aI-924 -aa(lp25060 -g15 -aI703 -aI-476 -aI678 -aI-756 -aI703 -aI-635 -aa(lp25061 -g15 -aI398 -aI13 -aI703 -aI-149 -aI601 -aI13 -aa(lp25062 -g10 -aa(lp25063 -g8 -aI398 -aI-87 -aa(lp25064 -g15 -aI539 -aI-178 -aI462 -aI-87 -aI509 -aI-117 -aa(lp25065 -g15 -aI583 -aI-476 -aI569 -aI-239 -aI583 -aI-339 -aa(lp25066 -g15 -aI539 -aI-773 -aI583 -aI-613 -aI569 -aI-712 -aa(lp25067 -g15 -aI398 -aI-864 -aI509 -aI-834 -aI462 -aI-864 -aa(lp25068 -g15 -aI260 -aI-773 -aI335 -aI-864 -aI289 -aI-834 -aa(lp25069 -g15 -aI216 -aI-476 -aI230 -aI-713 -aI216 -aI-614 -aa(lp25070 -g15 -aI260 -aI-178 -aI216 -aI-338 -aI230 -aI-239 -aa(lp25071 -g15 -aI398 -aI-87 -aI289 -aI-117 -aI335 -aI-87 -aa(lp25072 -g10 -aa(lp25073 -g8 -aI800 -aI0 -aa(lp25074 -g10 -aa(lp25075 -g8 -aI800 -aI0 -aasV4 -(lp25076 -(lp25077 -g8 -aI733 -aI-213 -aa(lp25078 -g20 -aI594 -aI-213 -aa(lp25079 -g20 -aI594 -aI0 -aa(lp25080 -g20 -aI479 -aI0 -aa(lp25081 -g20 -aI479 -aI-213 -aa(lp25082 -g20 -aI39 -aI-213 -aa(lp25083 -g20 -aI39 -aI-316 -aa(lp25084 -g20 -aI472 -aI-956 -aa(lp25085 -g20 -aI594 -aI-956 -aa(lp25086 -g20 -aI594 -aI-321 -aa(lp25087 -g20 -aI733 -aI-321 -aa(lp25088 -g10 -aa(lp25089 -g8 -aI479 -aI-321 -aa(lp25090 -g20 -aI479 -aI-552 -aa(lp25091 -g15 -aI488 -aI-834 -aI479 -aI-629 -aI482 -aI-723 -aa(lp25092 -g20 -aI482 -aI-834 -aa(lp25093 -g15 -aI423 -aI-716 -aI466 -aI-789 -aI447 -aI-750 -aa(lp25094 -g20 -aI156 -aI-321 -aa(lp25095 -g10 -aa(lp25096 -g8 -aI800 -aI0 -aa(lp25097 -g10 -aa(lp25098 -g8 -aI800 -aI0 -aasV8 -(lp25099 -(lp25100 -g8 -aI497 -aI-503 -aa(lp25101 -g15 -aI698 -aI-247 -aI631 -aI-434 -aI698 -aI-348 -aa(lp25102 -g15 -aI616 -aI-58 -aI698 -aI-169 -aI671 -aI-105 -aa(lp25103 -g15 -aI399 -aI13 -aI561 -aI-10 -aI489 -aI13 -aa(lp25104 -g15 -aI180 -aI-53 -aI305 -aI13 -aI232 -aI-8 -aa(lp25105 -g15 -aI101 -aI-242 -aI127 -aI-98 -aI101 -aI-161 -aa(lp25106 -g15 -aI285 -aI-498 -aI101 -aI-353 -aI162 -aI-439 -aa(lp25107 -g15 -aI132 -aI-738 -aI183 -aI-561 -aI132 -aI-641 -aa(lp25108 -g15 -aI208 -aI-904 -aI132 -aI-808 -aI157 -aI-863 -aa(lp25109 -g15 -aI399 -aI-966 -aI258 -aI-945 -aI322 -aI-966 -aa(lp25110 -g15 -aI593 -aI-904 -aI479 -aI-966 -aI544 -aI-945 -aa(lp25111 -g15 -aI667 -aI-737 -aI643 -aI-863 -aI667 -aI-807 -aa(lp25112 -g15 -aI497 -aI-503 -aI667 -aI-637 -aI611 -aI-559 -aa(lp25113 -g10 -aa(lp25114 -g8 -aI401 -aI-551 -aa(lp25115 -g15 -aI552 -aI-732 -aI501 -aI-596 -aI552 -aI-656 -aa(lp25116 -g15 -aI511 -aI-832 -aI552 -aI-776 -aI538 -aI-809 -aa(lp25117 -g15 -aI398 -aI-867 -aI483 -aI-855 -aI446 -aI-867 -aa(lp25118 -g15 -aI288 -aI-832 -aI352 -aI-867 -aI315 -aI-855 -aa(lp25119 -g15 -aI248 -aI-732 -aI261 -aI-809 -aI248 -aI-776 -aa(lp25120 -g15 -aI280 -aI-633 -aI248 -aI-693 -aI258 -aI-660 -aa(lp25121 -g15 -aI401 -aI-551 -aI301 -aI-606 -aI342 -aI-578 -aa(lp25122 -g10 -aa(lp25123 -g8 -aI382 -aI-452 -aa(lp25124 -g15 -aI217 -aI-241 -aI272 -aI-400 -aI217 -aI-329 -aa(lp25125 -g15 -aI397 -aI-84 -aI217 -aI-136 -aI277 -aI-84 -aa(lp25126 -g15 -aI534 -aI-127 -aI456 -aI-84 -aI501 -aI-99 -aa(lp25127 -g15 -aI582 -aI-246 -aI566 -aI-155 -aI582 -aI-195 -aa(lp25128 -g15 -aI541 -aI-350 -aI582 -aI-285 -aI569 -aI-319 -aa(lp25129 -g15 -aI402 -aI-443 -aI514 -aI-380 -aI467 -aI-411 -aa(lp25130 -g10 -aa(lp25131 -g8 -aI800 -aI0 -aa(lp25132 -g10 -aa(lp25133 -g8 -aI800 -aI0 -aasV< -(lp25134 -(lp25135 -g8 -aI699 -aI-143 -aa(lp25136 -g20 -aI98 -aI-437 -aa(lp25137 -g20 -aI98 -aI-503 -aa(lp25138 -g20 -aI699 -aI-797 -aa(lp25139 -g20 -aI699 -aI-692 -aa(lp25140 -g20 -aI234 -aI-470 -aa(lp25141 -g20 -aI699 -aI-247 -aa(lp25142 -g10 -aa(lp25143 -g8 -aI800 -aI0 -aa(lp25144 -g10 -aa(lp25145 -g8 -aI800 -aI0 -aasV@ -(lp25146 -(lp25147 -g8 -aI520 -aI-260 -aa(lp25148 -g20 -aI517 -aI-260 -aa(lp25149 -g15 -aI367 -aI-143 -aI485 -aI-182 -aI435 -aI-143 -aa(lp25150 -g15 -aI244 -aI-211 -aI315 -aI-143 -aI274 -aI-166 -aa(lp25151 -g15 -aI198 -aI-394 -aI213 -aI-256 -aI198 -aI-317 -aa(lp25152 -g15 -aI261 -aI-610 -aI198 -aI-483 -aI219 -aI-555 -aa(lp25153 -g15 -aI427 -aI-692 -aI303 -aI-665 -aI359 -aI-692 -aa(lp25154 -g15 -aI594 -aI-662 -aI487 -aI-692 -aI542 -aI-682 -aa(lp25155 -g20 -aI580 -aI-391 -aa(lp25156 -g15 -aI578 -aI-346 -aI579 -aI-374 -aI578 -aI-360 -aa(lp25157 -g20 -aI578 -aI-341 -aa(lp25158 -g15 -aI625 -aI-227 -aI578 -aI-265 -aI594 -aI-227 -aa(lp25159 -g15 -aI690 -aI-476 -aI669 -aI-227 -aI690 -aI-310 -aa(lp25160 -g15 -aI618 -aI-760 -aI690 -aI-597 -aI666 -aI-692 -aa(lp25161 -g15 -aI423 -aI-863 -aI570 -aI-829 -aI505 -aI-863 -aa(lp25162 -g15 -aI194 -aI-738 -aI325 -aI-863 -aI249 -aI-821 -aa(lp25163 -g15 -aI111 -aI-395 -aI139 -aI-655 -aI111 -aI-540 -aa(lp25164 -g15 -aI196 -aI-81 -aI111 -aI-259 -aI140 -aI-155 -aa(lp25165 -g15 -aI436 -aI29 -aI252 -aI-7 -aI332 -aI29 -aa(lp25166 -g15 -aI661 -aI-21 -aI514 -aI29 -aI589 -aI12 -aa(lp25167 -g20 -aI661 -aI65 -aa(lp25168 -g15 -aI432 -aI118 -aI592 -aI101 -aI516 -aI118 -aa(lp25169 -g15 -aI129 -aI-15 -aI302 -aI118 -aI201 -aI74 -aa(lp25170 -g15 -aI20 -aI-391 -aI56 -aI-105 -aI20 -aI-230 -aa(lp25171 -g15 -aI128 -aI-800 -aI20 -aI-563 -aI56 -aI-700 -aa(lp25172 -g15 -aI425 -aI-951 -aI201 -aI-901 -aI300 -aI-951 -aa(lp25173 -g15 -aI683 -aI-823 -aI532 -aI-951 -aI618 -aI-908 -aa(lp25174 -g15 -aI779 -aI-475 -aI747 -aI-738 -aI779 -aI-622 -aa(lp25175 -g15 -aI738 -aI-234 -aI779 -aI-375 -aI766 -aI-294 -aa(lp25176 -g15 -aI622 -aI-143 -aI710 -aI-173 -aI671 -aI-143 -aa(lp25177 -g15 -aI520 -aI-260 -aI566 -aI-143 -aI532 -aI-182 -aa(lp25178 -g10 -aa(lp25179 -g8 -aI489 -aI-595 -aa(lp25180 -g15 -aI422 -aI-608 -aI466 -aI-604 -aI443 -aI-608 -aa(lp25181 -g15 -aI333 -aI-548 -aI383 -aI-608 -aI354 -aI-588 -aa(lp25182 -g15 -aI302 -aI-391 -aI313 -aI-507 -aI302 -aI-455 -aa(lp25183 -g15 -aI385 -aI-227 -aI302 -aI-282 -aI330 -aI-227 -aa(lp25184 -g15 -aI479 -aI-430 -aI442 -aI-227 -aI473 -aI-295 -aa(lp25185 -g10 -aa(lp25186 -g8 -aI800 -aI0 -aa(lp25187 -g10 -aa(lp25188 -g8 -aI800 -aI0 -aasVD -(lp25189 -(lp25190 -g8 -aI87 -aI0 -aa(lp25191 -g20 -aI87 -aI-951 -aa(lp25192 -g20 -aI310 -aI-951 -aa(lp25193 -g15 -aI631 -aI-828 -aI448 -aI-951 -aI555 -aI-910 -aa(lp25194 -g15 -aI746 -aI-484 -aI708 -aI-746 -aI746 -aI-631 -aa(lp25195 -g15 -aI627 -aI-124 -aI746 -aI-327 -aI707 -aI-207 -aa(lp25196 -g15 -aI283 -aI0 -aI548 -aI-41 -aI433 -aI0 -aa(lp25197 -g10 -aa(lp25198 -g8 -aI209 -aI-847 -aa(lp25199 -g20 -aI209 -aI-103 -aa(lp25200 -g20 -aI272 -aI-103 -aa(lp25201 -g15 -aI618 -aI-480 -aI503 -aI-103 -aI618 -aI-229 -aa(lp25202 -g15 -aI297 -aI-847 -aI618 -aI-725 -aI511 -aI-847 -aa(lp25203 -g10 -aa(lp25204 -g8 -aI800 -aI0 -aa(lp25205 -g10 -aa(lp25206 -g8 -aI800 -aI0 -aasVH -(lp25207 -(lp25208 -g8 -aI712 -aI0 -aa(lp25209 -g20 -aI590 -aI0 -aa(lp25210 -g20 -aI590 -aI-443 -aa(lp25211 -g20 -aI209 -aI-443 -aa(lp25212 -g20 -aI209 -aI0 -aa(lp25213 -g20 -aI87 -aI0 -aa(lp25214 -g20 -aI87 -aI-951 -aa(lp25215 -g20 -aI209 -aI-951 -aa(lp25216 -g20 -aI209 -aI-550 -aa(lp25217 -g20 -aI590 -aI-550 -aa(lp25218 -g20 -aI590 -aI-951 -aa(lp25219 -g20 -aI712 -aI-951 -aa(lp25220 -g10 -aa(lp25221 -g8 -aI800 -aI0 -aa(lp25222 -g10 -aa(lp25223 -g8 -aI800 -aI0 -aasVL -(lp25224 -(lp25225 -g8 -aI151 -aI0 -aa(lp25226 -g20 -aI151 -aI-951 -aa(lp25227 -g20 -aI273 -aI-951 -aa(lp25228 -g20 -aI273 -aI-107 -aa(lp25229 -g20 -aI686 -aI-107 -aa(lp25230 -g20 -aI686 -aI0 -aa(lp25231 -g10 -aa(lp25232 -g8 -aI800 -aI0 -aa(lp25233 -g10 -aa(lp25234 -g8 -aI800 -aI0 -aasVP -(lp25235 -(lp25236 -g8 -aI235 -aI-369 -aa(lp25237 -g20 -aI235 -aI0 -aa(lp25238 -g20 -aI114 -aI0 -aa(lp25239 -g20 -aI114 -aI-951 -aa(lp25240 -g20 -aI377 -aI-951 -aa(lp25241 -g15 -aI712 -aI-672 -aI600 -aI-951 -aI712 -aI-858 -aa(lp25242 -g15 -aI622 -aI-450 -aI712 -aI-577 -aI682 -aI-503 -aa(lp25243 -g15 -aI360 -aI-369 -aI561 -aI-396 -aI474 -aI-369 -aa(lp25244 -g10 -aa(lp25245 -g8 -aI235 -aI-472 -aa(lp25246 -g20 -aI346 -aI-472 -aa(lp25247 -g15 -aI530 -aI-519 -aI432 -aI-472 -aI493 -aI-488 -aa(lp25248 -g15 -aI586 -aI-666 -aI568 -aI-550 -aI586 -aI-599 -aa(lp25249 -g15 -aI366 -aI-847 -aI586 -aI-787 -aI513 -aI-847 -aa(lp25250 -g20 -aI235 -aI-847 -aa(lp25251 -g10 -aa(lp25252 -g8 -aI800 -aI0 -aa(lp25253 -g10 -aa(lp25254 -g8 -aI800 -aI0 -aasVT -(lp25255 -(lp25256 -g8 -aI460 -aI0 -aa(lp25257 -g20 -aI338 -aI0 -aa(lp25258 -g20 -aI338 -aI-844 -aa(lp25259 -g20 -aI66 -aI-844 -aa(lp25260 -g20 -aI66 -aI-951 -aa(lp25261 -g20 -aI731 -aI-951 -aa(lp25262 -g20 -aI731 -aI-844 -aa(lp25263 -g20 -aI460 -aI-844 -aa(lp25264 -g10 -aa(lp25265 -g8 -aI800 -aI0 -aa(lp25266 -g10 -aa(lp25267 -g8 -aI800 -aI0 -aasVX -(lp25268 -(lp25269 -g8 -aI764 -aI0 -aa(lp25270 -g20 -aI626 -aI0 -aa(lp25271 -g20 -aI395 -aI-412 -aa(lp25272 -g20 -aI157 -aI0 -aa(lp25273 -g20 -aI34 -aI0 -aa(lp25274 -g20 -aI329 -aI-496 -aa(lp25275 -g20 -aI54 -aI-951 -aa(lp25276 -g20 -aI184 -aI-951 -aa(lp25277 -g20 -aI399 -aI-587 -aa(lp25278 -g20 -aI617 -aI-951 -aa(lp25279 -g20 -aI741 -aI-951 -aa(lp25280 -g20 -aI466 -aI-500 -aa(lp25281 -g10 -aa(lp25282 -g8 -aI800 -aI0 -aa(lp25283 -g10 -aa(lp25284 -g8 -aI800 -aI0 -aasV\u005C -(lp25285 -(lp25286 -g8 -aI253 -aI-951 -aa(lp25287 -g20 -aI661 -aI0 -aa(lp25288 -g20 -aI545 -aI0 -aa(lp25289 -g20 -aI137 -aI-951 -aa(lp25290 -g10 -aa(lp25291 -g8 -aI800 -aI0 -aa(lp25292 -g10 -aa(lp25293 -g8 -aI800 -aI0 -aasV` -(lp25294 -(lp25295 -g8 -aI527 -aI-807 -aa(lp25296 -g20 -aI449 -aI-807 -aa(lp25297 -g15 -aI272 -aI-1007 -aI377 -aI-869 -aI318 -aI-935 -aa(lp25298 -g20 -aI272 -aI-1021 -aa(lp25299 -g20 -aI414 -aI-1021 -aa(lp25300 -g15 -aI527 -aI-825 -aI452 -aI-943 -aI489 -aI-878 -aa(lp25301 -g10 -aa(lp25302 -g8 -aI800 -aI0 -aa(lp25303 -g10 -aa(lp25304 -g8 -aI800 -aI0 -aasVd -(lp25305 -(lp25306 -g8 -aI583 -aI-95 -aa(lp25307 -g20 -aI578 -aI-95 -aa(lp25308 -g15 -aI369 -aI13 -aI529 -aI-22 -aI459 -aI13 -aa(lp25309 -g15 -aI163 -aI-83 -aI281 -aI13 -aI213 -aI-18 -aa(lp25310 -g15 -aI89 -aI-355 -aI114 -aI-148 -aI89 -aI-239 -aa(lp25311 -g15 -aI164 -aI-629 -aI89 -aI-472 -aI114 -aI-564 -aa(lp25312 -g15 -aI369 -aI-727 -aI213 -aI-694 -aI282 -aI-727 -aa(lp25313 -g15 -aI578 -aI-623 -aI458 -aI-727 -aI528 -aI-692 -aa(lp25314 -g20 -aI586 -aI-623 -aa(lp25315 -g15 -aI578 -aI-728 -aI581 -aI-679 -aI578 -aI-714 -aa(lp25316 -g20 -aI578 -aI-1012 -aa(lp25317 -g20 -aI697 -aI-1012 -aa(lp25318 -g20 -aI697 -aI0 -aa(lp25319 -g20 -aI601 -aI0 -aa(lp25320 -g10 -aa(lp25321 -g8 -aI578 -aI-328 -aa(lp25322 -g20 -aI578 -aI-355 -aa(lp25323 -g15 -aI533 -aI-566 -aI578 -aI-454 -aI563 -aI-524 -aa(lp25324 -g15 -aI389 -aI-629 -aI503 -aI-608 -aI455 -aI-629 -aa(lp25325 -g15 -aI212 -aI-354 -aI271 -aI-629 -aI212 -aI-537 -aa(lp25326 -g15 -aI390 -aI-84 -aI212 -aI-174 -aI271 -aI-84 -aa(lp25327 -g15 -aI532 -aI-142 -aI456 -aI-84 -aI504 -aI-104 -aa(lp25328 -g15 -aI578 -aI-328 -aI561 -aI-180 -aI577 -aI-243 -aa(lp25329 -g10 -aa(lp25330 -g8 -aI800 -aI0 -aa(lp25331 -g10 -aa(lp25332 -g8 -aI800 -aI0 -aasVh -(lp25333 -(lp25334 -g8 -aI577 -aI0 -aa(lp25335 -g20 -aI577 -aI-459 -aa(lp25336 -g15 -aI422 -aI-629 -aI577 -aI-572 -aI525 -aI-629 -aa(lp25337 -g15 -aI222 -aI-369 -aI289 -aI-629 -aI222 -aI-542 -aa(lp25338 -g20 -aI222 -aI0 -aa(lp25339 -g20 -aI104 -aI0 -aa(lp25340 -g20 -aI104 -aI-1012 -aa(lp25341 -g20 -aI222 -aI-1012 -aa(lp25342 -g20 -aI222 -aI-711 -aa(lp25343 -g20 -aI217 -aI-618 -aa(lp25344 -g20 -aI223 -aI-618 -aa(lp25345 -g15 -aI442 -aI-727 -aI268 -aI-690 -aI341 -aI-727 -aa(lp25346 -g15 -aI695 -aI-466 -aI611 -aI-727 -aI695 -aI-640 -aa(lp25347 -g20 -aI695 -aI0 -aa(lp25348 -g10 -aa(lp25349 -g8 -aI800 -aI0 -aa(lp25350 -g10 -aa(lp25351 -g8 -aI800 -aI0 -aasVl -(lp25352 -(lp25353 -g8 -aI346 -aI-919 -aa(lp25354 -g20 -aI171 -aI-933 -aa(lp25355 -g20 -aI171 -aI-1012 -aa(lp25356 -g20 -aI465 -aI-1012 -aa(lp25357 -g20 -aI465 -aI-92 -aa(lp25358 -g20 -aI694 -aI-79 -aa(lp25359 -g20 -aI694 -aI0 -aa(lp25360 -g20 -aI122 -aI0 -aa(lp25361 -g20 -aI122 -aI-79 -aa(lp25362 -g20 -aI346 -aI-92 -aa(lp25363 -g10 -aa(lp25364 -g8 -aI800 -aI0 -aa(lp25365 -g10 -aa(lp25366 -g8 -aI800 -aI0 -aasVp -(lp25367 -(lp25368 -g8 -aI221 -aI-90 -aa(lp25369 -g20 -aI213 -aI-90 -aa(lp25370 -g15 -aI221 -aI15 -aI218 -aI-34 -aI221 -aI1 -aa(lp25371 -g20 -aI221 -aI320 -aa(lp25372 -g20 -aI102 -aI320 -aa(lp25373 -g20 -aI102 -aI-714 -aa(lp25374 -g20 -aI198 -aI-714 -aa(lp25375 -g20 -aI216 -aI-618 -aa(lp25376 -g20 -aI221 -aI-618 -aa(lp25377 -g15 -aI430 -aI-727 -aI269 -aI-690 -aI338 -aI-727 -aa(lp25378 -g15 -aI636 -aI-630 -aI518 -aI-727 -aI586 -aI-694 -aa(lp25379 -g15 -aI710 -aI-358 -aI686 -aI-565 -aI710 -aI-474 -aa(lp25380 -g15 -aI636 -aI-84 -aI710 -aI-241 -aI685 -aI-149 -aa(lp25381 -g15 -aI430 -aI13 -aI586 -aI-19 -aI517 -aI13 -aa(lp25382 -g15 -aI221 -aI-90 -aI341 -aI13 -aI271 -aI-21 -aa(lp25383 -g10 -aa(lp25384 -g8 -aI221 -aI-384 -aa(lp25385 -g20 -aI221 -aI-358 -aa(lp25386 -g15 -aI266 -aI-147 -aI221 -aI-259 -aI236 -aI-189 -aa(lp25387 -g15 -aI410 -aI-84 -aI296 -aI-105 -aI344 -aI-84 -aa(lp25388 -g15 -aI587 -aI-359 -aI528 -aI-84 -aI587 -aI-176 -aa(lp25389 -g15 -aI409 -aI-629 -aI587 -aI-539 -aI528 -aI-629 -aa(lp25390 -g15 -aI267 -aI-571 -aI343 -aI-629 -aI296 -aI-610 -aa(lp25391 -g15 -aI221 -aI-384 -aI238 -aI-533 -aI223 -aI-471 -aa(lp25392 -g10 -aa(lp25393 -g8 -aI800 -aI0 -aa(lp25394 -g10 -aa(lp25395 -g8 -aI800 -aI0 -aasVt -(lp25396 -(lp25397 -g8 -aI664 -aI-97 -aa(lp25398 -g20 -aI664 -aI-7 -aa(lp25399 -g15 -aI500 -aI13 -aI607 -aI6 -aI552 -aI13 -aa(lp25400 -g15 -aI264 -aI-210 -aI342 -aI13 -aI264 -aI-61 -aa(lp25401 -g20 -aI264 -aI-625 -aa(lp25402 -g20 -aI90 -aI-625 -aa(lp25403 -g20 -aI90 -aI-686 -aa(lp25404 -g20 -aI264 -aI-718 -aa(lp25405 -g20 -aI314 -aI-905 -aa(lp25406 -g20 -aI382 -aI-905 -aa(lp25407 -g20 -aI382 -aI-714 -aa(lp25408 -g20 -aI667 -aI-714 -aa(lp25409 -g20 -aI667 -aI-625 -aa(lp25410 -g20 -aI382 -aI-625 -aa(lp25411 -g20 -aI382 -aI-210 -aa(lp25412 -g15 -aI507 -aI-83 -aI382 -aI-125 -aI424 -aI-83 -aa(lp25413 -g15 -aI664 -aI-97 -aI548 -aI-83 -aI600 -aI-88 -aa(lp25414 -g10 -aa(lp25415 -g8 -aI800 -aI0 -aa(lp25416 -g10 -aa(lp25417 -g8 -aI800 -aI0 -aasVx -(lp25418 -(lp25419 -g8 -aI332 -aI-366 -aa(lp25420 -g20 -aI76 -aI-714 -aa(lp25421 -g20 -aI210 -aI-714 -aa(lp25422 -g20 -aI399 -aI-447 -aa(lp25423 -g20 -aI589 -aI-714 -aa(lp25424 -g20 -aI723 -aI-714 -aa(lp25425 -g20 -aI466 -aI-366 -aa(lp25426 -g20 -aI735 -aI0 -aa(lp25427 -g20 -aI601 -aI0 -aa(lp25428 -g20 -aI399 -aI-283 -aa(lp25429 -g20 -aI197 -aI0 -aa(lp25430 -g20 -aI62 -aI0 -aa(lp25431 -g10 -aa(lp25432 -g8 -aI800 -aI0 -aa(lp25433 -g10 -aa(lp25434 -g8 -aI800 -aI0 -aasV| -(lp25435 -(lp25436 -g8 -aI350 -aI-1012 -aa(lp25437 -g20 -aI447 -aI-1012 -aa(lp25438 -g20 -aI447 -aI320 -aa(lp25439 -g20 -aI350 -aI320 -aa(lp25440 -g10 -aa(lp25441 -g8 -aI800 -aI0 -aa(lp25442 -g10 -aa(lp25443 -g8 -aI800 -aI0 -aasV# -(lp25444 -(lp25445 -g8 -aI609 -aI-580 -aa(lp25446 -g20 -aI567 -aI-367 -aa(lp25447 -g20 -aI723 -aI-367 -aa(lp25448 -g20 -aI723 -aI-278 -aa(lp25449 -g20 -aI550 -aI-278 -aa(lp25450 -g20 -aI497 -aI0 -aa(lp25451 -g20 -aI401 -aI0 -aa(lp25452 -g20 -aI455 -aI-278 -aa(lp25453 -g20 -aI266 -aI-278 -aa(lp25454 -g20 -aI213 -aI0 -aa(lp25455 -g20 -aI119 -aI0 -aa(lp25456 -g20 -aI170 -aI-278 -aa(lp25457 -g20 -aI29 -aI-278 -aa(lp25458 -g20 -aI29 -aI-367 -aa(lp25459 -g20 -aI188 -aI-367 -aa(lp25460 -g20 -aI230 -aI-580 -aa(lp25461 -g20 -aI78 -aI-580 -aa(lp25462 -g20 -aI78 -aI-670 -aa(lp25463 -g20 -aI246 -aI-670 -aa(lp25464 -g20 -aI300 -aI-951 -aa(lp25465 -g20 -aI395 -aI-951 -aa(lp25466 -g20 -aI342 -aI-670 -aa(lp25467 -g20 -aI533 -aI-670 -aa(lp25468 -g20 -aI587 -aI-951 -aa(lp25469 -g20 -aI681 -aI-951 -aa(lp25470 -g20 -aI626 -aI-670 -aa(lp25471 -g20 -aI770 -aI-670 -aa(lp25472 -g20 -aI770 -aI-580 -aa(lp25473 -g10 -aa(lp25474 -g8 -aI283 -aI-367 -aa(lp25475 -g20 -aI473 -aI-367 -aa(lp25476 -g20 -aI514 -aI-580 -aa(lp25477 -g20 -aI325 -aI-580 -aa(lp25478 -g10 -aa(lp25479 -g8 -aI800 -aI0 -aa(lp25480 -g10 -aa(lp25481 -g8 -aI800 -aI0 -aasV' -(lp25482 -(lp25483 -g8 -aI477 -aI-951 -aa(lp25484 -g20 -aI450 -aI-607 -aa(lp25485 -g20 -aI349 -aI-607 -aa(lp25486 -g20 -aI322 -aI-951 -aa(lp25487 -g10 -aa(lp25488 -g8 -aI800 -aI0 -aa(lp25489 -g10 -aa(lp25490 -g8 -aI800 -aI0 -aasV+ -(lp25491 -(lp25492 -g8 -aI350 -aI-420 -aa(lp25493 -g20 -aI98 -aI-420 -aa(lp25494 -g20 -aI98 -aI-518 -aa(lp25495 -g20 -aI350 -aI-518 -aa(lp25496 -g20 -aI350 -aI-771 -aa(lp25497 -g20 -aI447 -aI-771 -aa(lp25498 -g20 -aI447 -aI-518 -aa(lp25499 -g20 -aI699 -aI-518 -aa(lp25500 -g20 -aI699 -aI-420 -aa(lp25501 -g20 -aI447 -aI-420 -aa(lp25502 -g20 -aI447 -aI-170 -aa(lp25503 -g20 -aI350 -aI-170 -aa(lp25504 -g10 -aa(lp25505 -g8 -aI800 -aI0 -aa(lp25506 -g10 -aa(lp25507 -g8 -aI800 -aI0 -aasV/ -(lp25508 -(lp25509 -g8 -aI661 -aI-951 -aa(lp25510 -g20 -aI253 -aI0 -aa(lp25511 -g20 -aI137 -aI0 -aa(lp25512 -g20 -aI545 -aI-951 -aa(lp25513 -g10 -aa(lp25514 -g8 -aI800 -aI0 -aa(lp25515 -g10 -aa(lp25516 -g8 -aI800 -aI0 -aasV3 -(lp25517 -(lp25518 -g8 -aI451 -aI-500 -aa(lp25519 -g20 -aI451 -aI-496 -aa(lp25520 -g15 -aI686 -aI-270 -aI608 -aI-476 -aI686 -aI-401 -aa(lp25521 -g15 -aI597 -aI-62 -aI686 -aI-182 -aI656 -aI-112 -aa(lp25522 -g15 -aI337 -aI13 -aI537 -aI-11 -aI450 -aI13 -aa(lp25523 -g15 -aI85 -aI-37 -aI232 -aI13 -aI148 -aI-3 -aa(lp25524 -g20 -aI85 -aI-148 -aa(lp25525 -g15 -aI334 -aI-86 -aI165 -aI-106 -aI248 -aI-86 -aa(lp25526 -g15 -aI565 -aI-274 -aI488 -aI-86 -aI565 -aI-148 -aa(lp25527 -g15 -aI317 -aI-442 -aI565 -aI-386 -aI482 -aI-442 -aa(lp25528 -g20 -aI230 -aI-442 -aa(lp25529 -g20 -aI230 -aI-540 -aa(lp25530 -g20 -aI317 -aI-540 -aa(lp25531 -g15 -aI478 -aI-590 -aI386 -aI-540 -aI440 -aI-557 -aa(lp25532 -g15 -aI535 -aI-720 -aI516 -aI-623 -aI535 -aI-666 -aa(lp25533 -g15 -aI491 -aI-826 -aI535 -aI-765 -aI521 -aI-800 -aa(lp25534 -g15 -aI373 -aI-864 -aI462 -aI-851 -aI422 -aI-864 -aa(lp25535 -g15 -aI149 -aI-786 -aI295 -aI-864 -aI221 -aI-838 -aa(lp25536 -g20 -aI89 -aI-867 -aa(lp25537 -g15 -aI373 -aI-965 -aI170 -aI-932 -aI264 -aI-965 -aa(lp25538 -g15 -aI582 -aI-900 -aI462 -aI-965 -aI532 -aI-943 -aa(lp25539 -g15 -aI657 -aI-728 -aI632 -aI-857 -aI657 -aI-800 -aa(lp25540 -g15 -aI604 -aI-578 -aI657 -aI-668 -aI639 -aI-618 -aa(lp25541 -g15 -aI451 -aI-500 -aI568 -aI-537 -aI517 -aI-512 -aa(lp25542 -g10 -aa(lp25543 -g8 -aI800 -aI0 -aa(lp25544 -g10 -aa(lp25545 -g8 -aI800 -aI0 -aasV7 -(lp25546 -(lp25547 -g8 -aI217 -aI0 -aa(lp25548 -g20 -aI583 -aI-843 -aa(lp25549 -g20 -aI93 -aI-843 -aa(lp25550 -g20 -aI93 -aI-951 -aa(lp25551 -g20 -aI705 -aI-951 -aa(lp25552 -g20 -aI705 -aI-856 -aa(lp25553 -g20 -aI343 -aI0 -aa(lp25554 -g10 -aa(lp25555 -g8 -aI800 -aI0 -aa(lp25556 -g10 -aa(lp25557 -g8 -aI800 -aI0 -aasV; -(lp25558 -(lp25559 -g8 -aI404 -aI-732 -aa(lp25560 -g15 -aI486 -aI-642 -aI459 -aI-732 -aI486 -aI-702 -aa(lp25561 -g15 -aI404 -aI-551 -aI486 -aI-581 -aI459 -aI-551 -aa(lp25562 -g15 -aI321 -aI-642 -aI349 -aI-551 -aI321 -aI-581 -aa(lp25563 -g15 -aI404 -aI-732 -aI321 -aI-702 -aI349 -aI-732 -aa(lp25564 -g10 -aa(lp25565 -g8 -aI461 -aI-154 -aa(lp25566 -g20 -aI470 -aI-139 -aa(lp25567 -g15 -aI356 -aI172 -aI448 -aI-54 -aI410 -aI49 -aa(lp25568 -g20 -aI266 -aI172 -aa(lp25569 -g15 -aI332 -aI-154 -aI293 -aI61 -aI315 -aI-47 -aa(lp25570 -g10 -aa(lp25571 -g8 -aI800 -aI0 -aa(lp25572 -g10 -aa(lp25573 -g8 -aI800 -aI0 -aasV? -(lp25574 -(lp25575 -g8 -aI302 -aI-269 -aa(lp25576 -g20 -aI302 -aI-293 -aa(lp25577 -g15 -aI332 -aI-420 -aI302 -aI-345 -aI312 -aI-387 -aa(lp25578 -g15 -aI437 -aI-522 -aI352 -aI-452 -aI387 -aI-486 -aa(lp25579 -g15 -aI549 -aI-623 -aI493 -aI-564 -aI531 -aI-598 -aa(lp25580 -g15 -aI576 -aI-726 -aI567 -aI-648 -aI576 -aI-682 -aa(lp25581 -g15 -aI527 -aI-823 -aI576 -aI-766 -aI560 -aI-798 -aa(lp25582 -g15 -aI393 -aI-860 -aI495 -aI-848 -aI450 -aI-860 -aa(lp25583 -g15 -aI151 -aI-802 -aI317 -aI-860 -aI237 -aI-841 -aa(lp25584 -g20 -aI109 -aI-901 -aa(lp25585 -g15 -aI386 -aI-965 -aI200 -aI-943 -aI292 -aI-965 -aa(lp25586 -g15 -aI607 -aI-901 -aI479 -aI-965 -aI553 -aI-943 -aa(lp25587 -g15 -aI689 -aI-731 -aI662 -aI-859 -aI689 -aI-802 -aa(lp25588 -g15 -aI654 -aI-590 -aI689 -aI-673 -aI677 -aI-626 -aa(lp25589 -g15 -aI526 -aI-466 -aI631 -aI-554 -aI588 -aI-513 -aa(lp25590 -g15 -aI428 -aI-374 -aI475 -aI-428 -aI442 -aI-397 -aa(lp25591 -g15 -aI406 -aI-280 -aI414 -aI-351 -aI406 -aI-319 -aa(lp25592 -g20 -aI406 -aI-269 -aa(lp25593 -g10 -aa(lp25594 -g8 -aI360 -aI-162 -aa(lp25595 -g15 -aI442 -aI-71 -aI415 -aI-162 -aI442 -aI-132 -aa(lp25596 -g15 -aI360 -aI19 -aI442 -aI-11 -aI415 -aI19 -aa(lp25597 -g15 -aI277 -aI-71 -aI304 -aI19 -aI277 -aI-11 -aa(lp25598 -g15 -aI360 -aI-162 -aI277 -aI-132 -aI304 -aI-162 -aa(lp25599 -g10 -aa(lp25600 -g8 -aI800 -aI0 -aa(lp25601 -g10 -aa(lp25602 -g8 -aI800 -aI0 -aasVC -(lp25603 -(lp25604 -g8 -aI731 -aI-130 -aa(lp25605 -g20 -aI731 -aI-24 -aa(lp25606 -g15 -aI498 -aI13 -aI668 -aI0 -aI590 -aI13 -aa(lp25607 -g15 -aI190 -aI-114 -aI364 -aI13 -aI261 -aI-29 -aa(lp25608 -g15 -aI83 -aI-476 -aI119 -aI-199 -aI83 -aI-320 -aa(lp25609 -g15 -aI200 -aI-833 -aI83 -aI-626 -aI122 -aI-745 -aa(lp25610 -g15 -aI518 -aI-965 -aI278 -aI-921 -aI384 -aI-965 -aa(lp25611 -g15 -aI768 -aI-909 -aI614 -aI-965 -aI697 -aI-946 -aa(lp25612 -g20 -aI717 -aI-807 -aa(lp25613 -g15 -aI518 -aI-858 -aI650 -aI-841 -aI584 -aI-858 -aa(lp25614 -g15 -aI295 -aI-755 -aI425 -aI-858 -aI351 -aI-823 -aa(lp25615 -g15 -aI212 -aI-475 -aI240 -aI-686 -aI212 -aI-593 -aa(lp25616 -g15 -aI290 -aI-190 -aI212 -aI-350 -aI238 -aI-255 -aa(lp25617 -g15 -aI518 -aI-92 -aI342 -aI-125 -aI418 -aI-92 -aa(lp25618 -g15 -aI731 -aI-130 -aI575 -aI-92 -aI646 -aI-105 -aa(lp25619 -g10 -aa(lp25620 -g8 -aI800 -aI0 -aa(lp25621 -g10 -aa(lp25622 -g8 -aI800 -aI0 -aasVG -(lp25623 -(lp25624 -g8 -aI437 -aI-502 -aa(lp25625 -g20 -aI712 -aI-502 -aa(lp25626 -g20 -aI712 -aI-35 -aa(lp25627 -g15 -aI438 -aI13 -aI627 -aI-2 -aI536 -aI13 -aa(lp25628 -g15 -aI172 -aI-116 -aI325 -aI13 -aI236 -aI-29 -aa(lp25629 -g15 -aI76 -aI-476 -aI108 -aI-202 -aI76 -aI-323 -aa(lp25630 -g15 -aI181 -aI-835 -aI76 -aI-629 -aI111 -aI-748 -aa(lp25631 -g15 -aI472 -aI-965 -aI251 -aI-921 -aI348 -aI-965 -aa(lp25632 -g15 -aI697 -aI-909 -aI555 -aI-965 -aI630 -aI-946 -aa(lp25633 -g20 -aI650 -aI-803 -aa(lp25634 -g15 -aI468 -aI-858 -aI587 -aI-840 -aI526 -aI-858 -aa(lp25635 -g15 -aI273 -aI-757 -aI384 -aI-858 -aI319 -aI-824 -aa(lp25636 -g15 -aI203 -aI-475 -aI226 -aI-689 -aI203 -aI-595 -aa(lp25637 -g15 -aI460 -aI-92 -aI203 -aI-220 -aI289 -aI-92 -aa(lp25638 -g15 -aI591 -aI-111 -aI502 -aI-92 -aI546 -aI-98 -aa(lp25639 -g20 -aI591 -aI-395 -aa(lp25640 -g20 -aI437 -aI-395 -aa(lp25641 -g10 -aa(lp25642 -g8 -aI800 -aI0 -aa(lp25643 -g10 -aa(lp25644 -g8 -aI800 -aI0 -aasVK -(lp25645 -(lp25646 -g8 -aI779 -aI0 -aa(lp25647 -g20 -aI642 -aI0 -aa(lp25648 -g20 -aI349 -aI-453 -aa(lp25649 -g20 -aI258 -aI-379 -aa(lp25650 -g20 -aI258 -aI0 -aa(lp25651 -g20 -aI137 -aI0 -aa(lp25652 -g20 -aI137 -aI-951 -aa(lp25653 -g20 -aI258 -aI-951 -aa(lp25654 -g20 -aI258 -aI-475 -aa(lp25655 -g20 -aI337 -aI-584 -aa(lp25656 -g20 -aI632 -aI-951 -aa(lp25657 -g20 -aI768 -aI-951 -aa(lp25658 -g20 -aI429 -aI-536 -aa(lp25659 -g10 -aa(lp25660 -g8 -aI800 -aI0 -aa(lp25661 -g10 -aa(lp25662 -g8 -aI800 -aI0 -aasVO -(lp25663 -(lp25664 -g8 -aI401 -aI13 -aa(lp25665 -g15 -aI54 -aI-478 -aI170 -aI13 -aI54 -aI-150 -aa(lp25666 -g15 -aI402 -aI-966 -aI54 -aI-803 -aI170 -aI-966 -aa(lp25667 -g15 -aI657 -aI-839 -aI513 -aI-966 -aI598 -aI-923 -aa(lp25668 -g15 -aI746 -aI-476 -aI717 -aI-754 -aI746 -aI-633 -aa(lp25669 -g15 -aI656 -aI-114 -aI746 -aI-320 -aI716 -aI-199 -aa(lp25670 -g15 -aI401 -aI13 -aI597 -aI-29 -aI511 -aI13 -aa(lp25671 -g10 -aa(lp25672 -g8 -aI401 -aI-92 -aa(lp25673 -g15 -aI566 -aI-187 -aI476 -aI-92 -aI531 -aI-124 -aa(lp25674 -g15 -aI618 -aI-476 -aI601 -aI-249 -aI618 -aI-346 -aa(lp25675 -g15 -aI565 -aI-766 -aI618 -aI-608 -aI600 -aI-704 -aa(lp25676 -g15 -aI402 -aI-859 -aI530 -aI-828 -aI475 -aI-859 -aa(lp25677 -g15 -aI182 -aI-476 -aI256 -aI-859 -aI182 -aI-731 -aa(lp25678 -g15 -aI401 -aI-92 -aI182 -aI-220 -aI255 -aI-92 -aa(lp25679 -g10 -aa(lp25680 -g8 -aI800 -aI0 -aa(lp25681 -g10 -aa(lp25682 -g8 -aI800 -aI0 -aasVS -(lp25683 -(lp25684 -g8 -aI91 -aI-31 -aa(lp25685 -g20 -aI91 -aI-147 -aa(lp25686 -g15 -aI361 -aI-91 -aI183 -aI-110 -aI273 -aI-91 -aa(lp25687 -g15 -aI589 -aI-247 -aI513 -aI-91 -aI589 -aI-143 -aa(lp25688 -g15 -aI543 -aI-351 -aI589 -aI-292 -aI573 -aI-327 -aa(lp25689 -g15 -aI357 -aI-438 -aI512 -aI-376 -aI450 -aI-404 -aa(lp25690 -g15 -aI163 -aI-551 -aI267 -aI-470 -aI202 -aI-507 -aa(lp25691 -g15 -aI104 -aI-723 -aI123 -aI-596 -aI104 -aI-653 -aa(lp25692 -g15 -aI187 -aI-900 -aI104 -aI-799 -aI132 -aI-858 -aa(lp25693 -g15 -aI417 -aI-965 -aI243 -aI-943 -aI320 -aI-965 -aa(lp25694 -g15 -aI688 -aI-914 -aI516 -aI-965 -aI606 -aI-948 -aa(lp25695 -g20 -aI646 -aI-807 -aa(lp25696 -g15 -aI412 -aI-858 -aI562 -aI-841 -aI484 -aI-858 -aa(lp25697 -g15 -aI221 -aI-722 -aI284 -aI-858 -aI221 -aI-812 -aa(lp25698 -g15 -aI263 -aI-615 -aI221 -aI-677 -aI235 -aI-642 -aa(lp25699 -g15 -aI440 -aI-528 -aI292 -aI-588 -aI351 -aI-559 -aa(lp25700 -g15 -aI653 -aI-410 -aI546 -aI-490 -aI618 -aI-451 -aa(lp25701 -g15 -aI707 -aI-254 -aI689 -aI-370 -aI707 -aI-317 -aa(lp25702 -g15 -aI617 -aI-57 -aI707 -aI-170 -aI677 -aI-105 -aa(lp25703 -g15 -aI361 -aI13 -aI557 -aI-10 -aI472 -aI13 -aa(lp25704 -g15 -aI91 -aI-31 -aI246 -aI13 -aI156 -aI-1 -aa(lp25705 -g10 -aa(lp25706 -g8 -aI800 -aI0 -aa(lp25707 -g10 -aa(lp25708 -g8 -aI800 -aI0 -aasVW -(lp25709 -(lp25710 -g8 -aI343 -aI-655 -aa(lp25711 -g20 -aI458 -aI-655 -aa(lp25712 -g20 -aI553 -aI-316 -aa(lp25713 -g15 -aI600 -aI-116 -aI579 -aI-221 -aI595 -aI-154 -aa(lp25714 -g15 -aI642 -aI-519 -aI601 -aI-139 -aI615 -aI-274 -aa(lp25715 -g20 -aI688 -aI-951 -aa(lp25716 -g20 -aI798 -aI-951 -aa(lp25717 -g20 -aI677 -aI0 -aa(lp25718 -g20 -aI553 -aI0 -aa(lp25719 -g20 -aI444 -aI-377 -aa(lp25720 -g15 -aI401 -aI-560 -aI426 -aI-437 -aI412 -aI-498 -aa(lp25721 -g15 -aI358 -aI-375 -aI387 -aI-485 -aI373 -aI-424 -aa(lp25722 -g20 -aI257 -aI0 -aa(lp25723 -g20 -aI133 -aI0 -aa(lp25724 -g20 -aI1 -aI-951 -aa(lp25725 -g20 -aI111 -aI-951 -aa(lp25726 -g20 -aI169 -aI-519 -aa(lp25727 -g15 -aI195 -aI-273 -aI179 -aI-443 -aI187 -aI-361 -aa(lp25728 -g15 -aI206 -aI-116 -aI202 -aI-185 -aI206 -aI-133 -aa(lp25729 -g15 -aI251 -aI-319 -aI216 -aI-182 -aI231 -aI-249 -aa(lp25730 -g10 -aa(lp25731 -g8 -aI800 -aI0 -aa(lp25732 -g10 -aa(lp25733 -g8 -aI800 -aI0 -aasV[ -(lp25734 -(lp25735 -g8 -aI611 -aI211 -aa(lp25736 -g20 -aI268 -aI211 -aa(lp25737 -g20 -aI268 -aI-951 -aa(lp25738 -g20 -aI611 -aI-951 -aa(lp25739 -g20 -aI611 -aI-854 -aa(lp25740 -g20 -aI386 -aI-854 -aa(lp25741 -g20 -aI386 -aI113 -aa(lp25742 -g20 -aI611 -aI113 -aa(lp25743 -g10 -aa(lp25744 -g8 -aI800 -aI0 -aa(lp25745 -g10 -aa(lp25746 -g8 -aI800 -aI0 -aasV_ -(lp25747 -(lp25748 -g8 -aI809 -aI211 -aa(lp25749 -g20 -aI-10 -aI211 -aa(lp25750 -g20 -aI-10 -aI120 -aa(lp25751 -g20 -aI809 -aI120 -aa(lp25752 -g10 -aa(lp25753 -g8 -aI800 -aI0 -aa(lp25754 -g10 -aa(lp25755 -g8 -aI800 -aI0 -aasVc -(lp25756 -(lp25757 -g8 -aI690 -aI-689 -aa(lp25758 -g20 -aI650 -aI-586 -aa(lp25759 -g15 -aI475 -aI-623 -aI585 -aI-610 -aI527 -aI-623 -aa(lp25760 -g15 -aI234 -aI-354 -aI314 -aI-623 -aI234 -aI-533 -aa(lp25761 -g15 -aI469 -aI-90 -aI234 -aI-178 -aI312 -aI-90 -aa(lp25762 -g15 -aI678 -aI-130 -aI537 -aI-90 -aI607 -aI-103 -aa(lp25763 -g20 -aI678 -aI-26 -aa(lp25764 -g15 -aI464 -aI13 -aI620 -aI0 -aI548 -aI13 -aa(lp25765 -g15 -aI204 -aI-81 -aI352 -aI13 -aI266 -aI-18 -aa(lp25766 -g15 -aI111 -aI-353 -aI142 -aI-144 -aI111 -aI-235 -aa(lp25767 -g15 -aI206 -aI-631 -aI111 -aI-475 -aI143 -aI-567 -aa(lp25768 -g15 -aI472 -aI-727 -aI269 -aI-695 -aI357 -aI-727 -aa(lp25769 -g15 -aI690 -aI-689 -aI549 -aI-727 -aI622 -aI-714 -aa(lp25770 -g10 -aa(lp25771 -g8 -aI800 -aI0 -aa(lp25772 -g10 -aa(lp25773 -g8 -aI800 -aI0 -aasVg -(lp25774 -(lp25775 -g8 -aI733 -aI-714 -aa(lp25776 -g20 -aI733 -aI-640 -aa(lp25777 -g20 -aI605 -aI-623 -aa(lp25778 -g15 -aI647 -aI-484 -aI633 -aI-586 -aI647 -aI-540 -aa(lp25779 -g15 -aI578 -aI-317 -aI647 -aI-414 -aI624 -aI-359 -aa(lp25780 -g15 -aI385 -aI-255 -aI532 -aI-276 -aI467 -aI-255 -aa(lp25781 -g15 -aI329 -aI-259 -aI361 -aI-255 -aI342 -aI-256 -aa(lp25782 -g15 -aI264 -aI-172 -aI286 -aI-235 -aI264 -aI-206 -aa(lp25783 -g15 -aI369 -aI-118 -aI264 -aI-136 -aI299 -aI-118 -aa(lp25784 -g20 -aI490 -aI-118 -aa(lp25785 -g15 -aI664 -aI-67 -aI566 -aI-118 -aI624 -aI-101 -aa(lp25786 -g15 -aI723 -aI75 -aI703 -aI-34 -aI723 -aI13 -aa(lp25787 -g15 -aI356 -aI320 -aI723 -aI238 -aI601 -aI320 -aa(lp25788 -g15 -aI140 -aI268 -aI261 -aI320 -aI189 -aI303 -aa(lp25789 -g15 -aI66 -aI121 -aI91 -aI233 -aI66 -aI184 -aa(lp25790 -g15 -aI222 -aI-54 -aI66 -aI29 -aI118 -aI-29 -aa(lp25791 -g15 -aI160 -aI-154 -aI180 -aI-74 -aI160 -aI-108 -aa(lp25792 -g15 -aI246 -aI-279 -aI160 -aI-203 -aI189 -aI-244 -aa(lp25793 -g15 -aI155 -aI-359 -aI208 -aI-295 -aI177 -aI-322 -aa(lp25794 -g15 -aI122 -aI-480 -aI133 -aI-396 -aI122 -aI-436 -aa(lp25795 -g15 -aI191 -aI-663 -aI122 -aI-559 -aI145 -aI-620 -aa(lp25796 -g15 -aI389 -aI-727 -aI237 -aI-706 -aI303 -aI-727 -aa(lp25797 -g15 -aI486 -aI-714 -aI426 -aI-727 -aI459 -aI-723 -aa(lp25798 -g10 -aa(lp25799 -g8 -aI386 -aI-336 -aa(lp25800 -g15 -aI531 -aI-486 -aI483 -aI-336 -aI531 -aI-386 -aa(lp25801 -g15 -aI385 -aI-642 -aI531 -aI-590 -aI483 -aI-642 -aa(lp25802 -g15 -aI238 -aI-484 -aI287 -aI-642 -aI238 -aI-589 -aa(lp25803 -g15 -aI386 -aI-336 -aI238 -aI-386 -aI288 -aI-336 -aa(lp25804 -g10 -aa(lp25805 -g8 -aI450 -aI-11 -aa(lp25806 -g20 -aI328 -aI-11 -aa(lp25807 -g15 -aI178 -aI117 -aI228 -aI-11 -aI178 -aI31 -aa(lp25808 -g15 -aI354 -aI230 -aI178 -aI193 -aI237 -aI230 -aa(lp25809 -g15 -aI611 -aI85 -aI526 -aI230 -aI611 -aI182 -aa(lp25810 -g15 -aI579 -aI8 -aI611 -aI47 -aI601 -aI21 -aa(lp25811 -g15 -aI450 -aI-11 -aI557 -aI-4 -aI514 -aI-11 -aa(lp25812 -g10 -aa(lp25813 -g8 -aI800 -aI0 -aa(lp25814 -g10 -aa(lp25815 -g8 -aI800 -aI0 -aasVk -(lp25816 -(lp25817 -g8 -aI249 -aI-359 -aa(lp25818 -g20 -aI337 -aI-458 -aa(lp25819 -g20 -aI594 -aI-714 -aa(lp25820 -g20 -aI738 -aI-714 -aa(lp25821 -g20 -aI417 -aI-405 -aa(lp25822 -g20 -aI757 -aI0 -aa(lp25823 -g20 -aI618 -aI0 -aa(lp25824 -g20 -aI341 -aI-327 -aa(lp25825 -g20 -aI257 -aI-274 -aa(lp25826 -g20 -aI257 -aI0 -aa(lp25827 -g20 -aI139 -aI0 -aa(lp25828 -g20 -aI139 -aI-1012 -aa(lp25829 -g20 -aI257 -aI-1012 -aa(lp25830 -g20 -aI257 -aI-547 -aa(lp25831 -g20 -aI246 -aI-359 -aa(lp25832 -g10 -aa(lp25833 -g8 -aI800 -aI0 -aa(lp25834 -g10 -aa(lp25835 -g8 -aI800 -aI0 -aasVo -(lp25836 -(lp25837 -g8 -aI397 -aI13 -aa(lp25838 -g15 -aI165 -aI-87 -aI303 -aI13 -aI226 -aI-20 -aa(lp25839 -g15 -aI74 -aI-358 -aI105 -aI-155 -aI74 -aI-245 -aa(lp25840 -g15 -aI163 -aI-628 -aI74 -aI-472 -aI104 -aI-562 -aa(lp25841 -g15 -aI401 -aI-727 -aI221 -aI-694 -aI301 -aI-727 -aa(lp25842 -g15 -aI633 -aI-626 -aI495 -aI-727 -aI573 -aI-693 -aa(lp25843 -g15 -aI723 -aI-358 -aI693 -aI-559 -aI723 -aI-469 -aa(lp25844 -g15 -aI634 -aI-86 -aI723 -aI-243 -aI694 -aI-152 -aa(lp25845 -g15 -aI397 -aI13 -aI575 -aI-19 -aI496 -aI13 -aa(lp25846 -g10 -aa(lp25847 -g8 -aI399 -aI-84 -aa(lp25848 -g15 -aI601 -aI-358 -aI534 -aI-84 -aI601 -aI-175 -aa(lp25849 -g15 -aI398 -aI-629 -aI601 -aI-538 -aI533 -aI-629 -aa(lp25850 -g15 -aI197 -aI-358 -aI264 -aI-629 -aI197 -aI-538 -aa(lp25851 -g15 -aI399 -aI-84 -aI197 -aI-175 -aI264 -aI-84 -aa(lp25852 -g10 -aa(lp25853 -g8 -aI800 -aI0 -aa(lp25854 -g10 -aa(lp25855 -g8 -aI800 -aI0 -aasVs -(lp25856 -(lp25857 -g8 -aI132 -aI-31 -aa(lp25858 -g20 -aI132 -aI-139 -aa(lp25859 -g15 -aI373 -aI-83 -aI215 -aI-102 -aI296 -aI-83 -aa(lp25860 -g15 -aI552 -aI-189 -aI492 -aI-83 -aI552 -aI-118 -aa(lp25861 -g15 -aI520 -aI-253 -aI552 -aI-213 -aI541 -aI-235 -aa(lp25862 -g15 -aI373 -aI-322 -aI498 -aI-271 -aI449 -aI-294 -aa(lp25863 -g15 -aI181 -aI-426 -aI271 -aI-360 -aI208 -aI-394 -aa(lp25864 -g15 -aI142 -aI-537 -aI155 -aI-457 -aI142 -aI-494 -aa(lp25865 -g15 -aI215 -aI-676 -aI142 -aI-596 -aI166 -aI-643 -aa(lp25866 -g15 -aI416 -aI-727 -aI263 -aI-710 -aI330 -aI-727 -aa(lp25867 -g15 -aI656 -aI-679 -aI501 -aI-727 -aI582 -aI-711 -aa(lp25868 -g20 -aI617 -aI-582 -aa(lp25869 -g15 -aI409 -aI-629 -aI538 -aI-613 -aI468 -aI-629 -aa(lp25870 -g15 -aI255 -aI-542 -aI307 -aI-629 -aI255 -aI-600 -aa(lp25871 -g15 -aI288 -aI-479 -aI255 -aI-516 -aI266 -aI-494 -aa(lp25872 -g15 -aI440 -aI-412 -aI310 -aI-463 -aI361 -aI-441 -aa(lp25873 -g15 -aI622 -aI-314 -aI531 -aI-379 -aI592 -aI-346 -aa(lp25874 -g15 -aI667 -aI-195 -aI652 -aI-281 -aI667 -aI-242 -aa(lp25875 -g15 -aI591 -aI-42 -aI667 -aI-130 -aI642 -aI-79 -aa(lp25876 -g15 -aI376 -aI13 -aI541 -aI-5 -aI469 -aI13 -aa(lp25877 -g15 -aI132 -aI-31 -aI268 -aI13 -aI187 -aI-1 -aa(lp25878 -g10 -aa(lp25879 -g8 -aI800 -aI0 -aa(lp25880 -g10 -aa(lp25881 -g8 -aI800 -aI0 -aasVw -(lp25882 -(lp25883 -g8 -aI529 -aI0 -aa(lp25884 -g20 -aI444 -aI-387 -aa(lp25885 -g20 -aI399 -aI-602 -aa(lp25886 -g20 -aI395 -aI-602 -aa(lp25887 -g20 -aI353 -aI-384 -aa(lp25888 -g20 -aI265 -aI0 -aa(lp25889 -g20 -aI142 -aI0 -aa(lp25890 -g20 -aI-2 -aI-714 -aa(lp25891 -g20 -aI102 -aI-714 -aa(lp25892 -g20 -aI166 -aI-360 -aa(lp25893 -g15 -aI203 -aI-105 -aI181 -aI-280 -aI193 -aI-194 -aa(lp25894 -g20 -aI207 -aI-105 -aa(lp25895 -g15 -aI251 -aI-338 -aI221 -aI-185 -aI235 -aI-263 -aa(lp25896 -g20 -aI338 -aI-714 -aa(lp25897 -g20 -aI464 -aI-714 -aa(lp25898 -g20 -aI546 -aI-338 -aa(lp25899 -g15 -aI590 -aI-105 -aI565 -aI-253 -aI580 -aI-175 -aa(lp25900 -g20 -aI594 -aI-105 -aa(lp25901 -g15 -aI633 -aI-360 -aI607 -aI-210 -aI620 -aI-295 -aa(lp25902 -g20 -aI699 -aI-714 -aa(lp25903 -g20 -aI802 -aI-714 -aa(lp25904 -g20 -aI656 -aI0 -aa(lp25905 -g10 -aa(lp25906 -g8 -aI800 -aI0 -aa(lp25907 -g10 -aa(lp25908 -g8 -aI800 -aI0 -aasV{ -(lp25909 -(lp25910 -g8 -aI485 -aI10 -aa(lp25911 -g15 -aI521 -aI88 -aI485 -aI46 -aI497 -aI71 -aa(lp25912 -g15 -aI651 -aI113 -aI545 -aI104 -aI589 -aI112 -aa(lp25913 -g20 -aI651 -aI211 -aa(lp25914 -g15 -aI366 -aI20 -aI461 -aI208 -aI366 -aI145 -aa(lp25915 -g20 -aI366 -aI-196 -aa(lp25916 -g15 -aI146 -aI-319 -aI366 -aI-278 -aI293 -aI-319 -aa(lp25917 -g20 -aI146 -aI-420 -aa(lp25918 -g15 -aI366 -aI-543 -aI293 -aI-420 -aI366 -aI-461 -aa(lp25919 -g20 -aI366 -aI-760 -aa(lp25920 -g15 -aI651 -aI-951 -aI366 -aI-885 -aI461 -aI-948 -aa(lp25921 -g20 -aI651 -aI-854 -aa(lp25922 -g15 -aI521 -aI-828 -aI589 -aI-853 -aI545 -aI-844 -aa(lp25923 -g15 -aI485 -aI-751 -aI497 -aI-812 -aI485 -aI-786 -aa(lp25924 -g20 -aI485 -aI-535 -aa(lp25925 -g15 -aI333 -aI-373 -aI485 -aI-445 -aI434 -aI-391 -aa(lp25926 -g20 -aI333 -aI-366 -aa(lp25927 -g15 -aI485 -aI-204 -aI434 -aI-348 -aI485 -aI-294 -aa(lp25928 -g10 -aa(lp25929 -g8 -aI800 -aI0 -aa(lp25930 -g10 -aa(lp25931 -g8 -aI800 -aI0 -aasV" -(lp25932 -(lp25933 -g8 -aI339 -aI-951 -aa(lp25934 -g20 -aI313 -aI-607 -aa(lp25935 -g20 -aI212 -aI-607 -aa(lp25936 -g20 -aI185 -aI-951 -aa(lp25937 -g10 -aa(lp25938 -g8 -aI614 -aI-951 -aa(lp25939 -g20 -aI587 -aI-607 -aa(lp25940 -g20 -aI486 -aI-607 -aa(lp25941 -g20 -aI460 -aI-951 -aa(lp25942 -g10 -aa(lp25943 -g8 -aI800 -aI0 -aa(lp25944 -g10 -aa(lp25945 -g8 -aI800 -aI0 -aasV& -(lp25946 -(lp25947 -g8 -aI391 -aI-504 -aa(lp25948 -g20 -aI574 -aI-278 -aa(lp25949 -g15 -aI642 -aI-451 -aI605 -aI-330 -aI628 -aI-388 -aa(lp25950 -g20 -aI762 -aI-451 -aa(lp25951 -g15 -aI646 -aI-189 -aI739 -aI-349 -aI700 -aI-262 -aa(lp25952 -g20 -aI798 -aI0 -aa(lp25953 -g20 -aI657 -aI0 -aa(lp25954 -g20 -aI572 -aI-107 -aa(lp25955 -g15 -aI304 -aI13 -aI496 -aI-26 -aI407 -aI13 -aa(lp25956 -g15 -aI110 -aI-56 -aI222 -aI13 -aI157 -aI-9 -aa(lp25957 -g15 -aI39 -aI-247 -aI63 -aI-102 -aI39 -aI-166 -aa(lp25958 -g15 -aI81 -aI-396 -aI39 -aI-304 -aI53 -aI-354 -aa(lp25959 -g15 -aI234 -aI-526 -aI108 -aI-438 -aI159 -aI-481 -aa(lp25960 -g15 -aI128 -aI-758 -aI163 -aI-609 -aI128 -aI-686 -aa(lp25961 -g15 -aI190 -aI-910 -aI128 -aI-822 -aI148 -aI-873 -aa(lp25962 -g15 -aI369 -aI-966 -aI231 -aI-947 -aI291 -aI-966 -aa(lp25963 -g15 -aI538 -aI-910 -aI442 -aI-966 -aI498 -aI-947 -aa(lp25964 -g15 -aI598 -aI-758 -aI578 -aI-873 -aI598 -aI-822 -aa(lp25965 -g15 -aI391 -aI-504 -aI598 -aI-669 -aI529 -aI-585 -aa(lp25966 -g10 -aa(lp25967 -g8 -aI330 -aI-583 -aa(lp25968 -g15 -aI450 -aI-673 -aI388 -aI-617 -aI428 -aI-647 -aa(lp25969 -g15 -aI482 -aI-760 -aI471 -aI-699 -aI482 -aI-728 -aa(lp25970 -g15 -aI450 -aI-838 -aI482 -aI-792 -aI471 -aI-818 -aa(lp25971 -g15 -aI365 -aI-868 -aI428 -aI-858 -aI400 -aI-868 -aa(lp25972 -g15 -aI276 -aI-839 -aI327 -aI-868 -aI297 -aI-859 -aa(lp25973 -g15 -aI244 -aI-758 -aI254 -aI-820 -aI244 -aI-793 -aa(lp25974 -g15 -aI330 -aI-583 -aI244 -aI-706 -aI273 -aI-648 -aa(lp25975 -g10 -aa(lp25976 -g8 -aI506 -aI-186 -aa(lp25977 -g20 -aI296 -aI-447 -aa(lp25978 -g15 -aI164 -aI-251 -aI208 -aI-394 -aI164 -aI-328 -aa(lp25979 -g15 -aI207 -aI-137 -aI164 -aI-205 -aI178 -aI-167 -aa(lp25980 -g15 -aI311 -aI-91 -aI236 -aI-106 -aI271 -aI-91 -aa(lp25981 -g15 -aI506 -aI-186 -aI381 -aI-91 -aI446 -aI-123 -aa(lp25982 -g10 -aa(lp25983 -g8 -aI800 -aI0 -aa(lp25984 -g10 -aa(lp25985 -g8 -aI800 -aI0 -aasV* -(lp25986 -(lp25987 -g8 -aI465 -aI-1012 -aa(lp25988 -g20 -aI437 -aI-756 -aa(lp25989 -g20 -aI695 -aI-828 -aa(lp25990 -g20 -aI713 -aI-703 -aa(lp25991 -g20 -aI466 -aI-685 -aa(lp25992 -g20 -aI626 -aI-472 -aa(lp25993 -g20 -aI510 -aI-410 -aa(lp25994 -g20 -aI395 -aI-643 -aa(lp25995 -g20 -aI293 -aI-410 -aa(lp25996 -g20 -aI173 -aI-472 -aa(lp25997 -g20 -aI330 -aI-685 -aa(lp25998 -g20 -aI86 -aI-703 -aa(lp25999 -g20 -aI105 -aI-828 -aa(lp26000 -g20 -aI360 -aI-756 -aa(lp26001 -g20 -aI332 -aI-1012 -aa(lp26002 -g10 -aa(lp26003 -g8 -aI800 -aI0 -aa(lp26004 -g10 -aa(lp26005 -g8 -aI800 -aI0 -aasV. -(lp26006 -(lp26007 -g8 -aI399 -aI-195 -aa(lp26008 -g15 -aI498 -aI-87 -aI465 -aI-195 -aI498 -aI-159 -aa(lp26009 -g15 -aI399 -aI20 -aI498 -aI-15 -aI465 -aI20 -aa(lp26010 -g15 -aI301 -aI-87 -aI334 -aI20 -aI301 -aI-15 -aa(lp26011 -g15 -aI399 -aI-195 -aI301 -aI-159 -aI334 -aI-195 -aa(lp26012 -g10 -aa(lp26013 -g8 -aI800 -aI0 -aa(lp26014 -g10 -aa(lp26015 -g8 -aI800 -aI0 -aasV2 -(lp26016 -(lp26017 -g8 -aI695 -aI0 -aa(lp26018 -g20 -aI102 -aI0 -aa(lp26019 -g20 -aI102 -aI-101 -aa(lp26020 -g20 -aI330 -aI-349 -aa(lp26021 -g15 -aI498 -aI-555 -aI415 -aI-441 -aI471 -aI-510 -aa(lp26022 -g15 -aI538 -aI-705 -aI524 -aI-601 -aI538 -aI-651 -aa(lp26023 -g15 -aI497 -aI-822 -aI538 -aI-754 -aI524 -aI-793 -aa(lp26024 -g15 -aI385 -aI-864 -aI469 -aI-850 -aI432 -aI-864 -aa(lp26025 -g15 -aI178 -aI-775 -aI315 -aI-864 -aI246 -aI-835 -aa(lp26026 -g20 -aI111 -aI-853 -aa(lp26027 -g15 -aI386 -aI-965 -aI195 -aI-927 -aI286 -aI-965 -aa(lp26028 -g15 -aI585 -aI-896 -aI470 -aI-965 -aI537 -aI-942 -aa(lp26029 -g15 -aI658 -aI-710 -aI634 -aI-850 -aI658 -aI-788 -aa(lp26030 -g15 -aI620 -aI-551 -aI658 -aI-658 -aI646 -aI-605 -aa(lp26031 -g15 -aI430 -aI-307 -aI594 -aI-497 -aI531 -aI-415 -aa(lp26032 -g20 -aI248 -aI-112 -aa(lp26033 -g20 -aI248 -aI-107 -aa(lp26034 -g20 -aI695 -aI-107 -aa(lp26035 -g10 -aa(lp26036 -g8 -aI800 -aI0 -aa(lp26037 -g10 -aa(lp26038 -g8 -aI800 -aI0 -aasV6 -(lp26039 -(lp26040 -g8 -aI628 -aI-952 -aa(lp26041 -g20 -aI628 -aI-851 -aa(lp26042 -g15 -aI520 -aI-867 -aI597 -aI-862 -aI561 -aI-867 -aa(lp26043 -g15 -aI301 -aI-775 -aI422 -aI-867 -aI349 -aI-836 -aa(lp26044 -g15 -aI221 -aI-484 -aI252 -aI-714 -aI225 -aI-617 -aa(lp26045 -g20 -aI229 -aI-484 -aa(lp26046 -g15 -aI429 -aI-595 -aI270 -aI-558 -aI337 -aI-595 -aa(lp26047 -g15 -aI627 -aI-517 -aI513 -aI-595 -aI579 -aI-569 -aa(lp26048 -g15 -aI699 -aI-306 -aI675 -aI-466 -aI699 -aI-395 -aa(lp26049 -g15 -aI621 -aI-72 -aI699 -aI-207 -aI673 -aI-129 -aa(lp26050 -g15 -aI410 -aI13 -aI569 -aI-15 -aI498 -aI13 -aa(lp26051 -g15 -aI184 -aI-96 -aI316 -aI13 -aI240 -aI-23 -aa(lp26052 -g15 -aI100 -aI-406 -aI128 -aI-169 -aI100 -aI-272 -aa(lp26053 -g15 -aI516 -aI-965 -aI100 -aI-778 -aI238 -aI-965 -aa(lp26054 -g15 -aI628 -aI-952 -aI561 -aI-965 -aI598 -aI-960 -aa(lp26055 -g10 -aa(lp26056 -g8 -aI585 -aI-306 -aa(lp26057 -g15 -aI540 -aI-451 -aI585 -aI-369 -aI570 -aI-417 -aa(lp26058 -g15 -aI413 -aI-502 -aI510 -aI-485 -aI468 -aI-502 -aa(lp26059 -g15 -aI274 -aI-449 -aI358 -aI-502 -aI312 -aI-484 -aa(lp26060 -g15 -aI218 -aI-328 -aI237 -aI-414 -aI218 -aI-374 -aa(lp26061 -g15 -aI271 -aI-158 -aI218 -aI-263 -aI236 -aI-206 -aa(lp26062 -g15 -aI409 -aI-86 -aI306 -aI-110 -aI352 -aI-86 -aa(lp26063 -g15 -aI538 -aI-143 -aI464 -aI-86 -aI507 -aI-105 -aa(lp26064 -g15 -aI585 -aI-306 -aI569 -aI-181 -aI585 -aI-235 -aa(lp26065 -g10 -aa(lp26066 -g8 -aI800 -aI0 -aa(lp26067 -g10 -aa(lp26068 -g8 -aI800 -aI0 -aasV: -(lp26069 -(lp26070 -g8 -aI399 -aI-732 -aa(lp26071 -g15 -aI482 -aI-642 -aI454 -aI-732 -aI482 -aI-702 -aa(lp26072 -g15 -aI399 -aI-551 -aI482 -aI-581 -aI454 -aI-551 -aa(lp26073 -g15 -aI317 -aI-642 -aI344 -aI-551 -aI317 -aI-581 -aa(lp26074 -g15 -aI399 -aI-732 -aI317 -aI-702 -aI344 -aI-732 -aa(lp26075 -g10 -aa(lp26076 -g8 -aI399 -aI-162 -aa(lp26077 -g15 -aI482 -aI-71 -aI454 -aI-162 -aI482 -aI-132 -aa(lp26078 -g15 -aI399 -aI19 -aI482 -aI-11 -aI454 -aI19 -aa(lp26079 -g15 -aI317 -aI-71 -aI344 -aI19 -aI317 -aI-11 -aa(lp26080 -g15 -aI399 -aI-162 -aI317 -aI-132 -aI344 -aI-162 -aa(lp26081 -g10 -aa(lp26082 -g8 -aI800 -aI0 -aa(lp26083 -g10 -aa(lp26084 -g8 -aI800 -aI0 -aasV> -(lp26085 -(lp26086 -g8 -aI98 -aI-247 -aa(lp26087 -g20 -aI563 -aI-470 -aa(lp26088 -g20 -aI98 -aI-692 -aa(lp26089 -g20 -aI98 -aI-797 -aa(lp26090 -g20 -aI699 -aI-503 -aa(lp26091 -g20 -aI699 -aI-437 -aa(lp26092 -g20 -aI98 -aI-143 -aa(lp26093 -g10 -aa(lp26094 -g8 -aI800 -aI0 -aa(lp26095 -g10 -aa(lp26096 -g8 -aI800 -aI0 -aasVB -(lp26097 -(lp26098 -g8 -aI87 -aI-951 -aa(lp26099 -g20 -aI374 -aI-951 -aa(lp26100 -g15 -aI633 -aI-894 -aI493 -aI-951 -aI579 -aI-932 -aa(lp26101 -g15 -aI713 -aI-710 -aI686 -aI-856 -aI713 -aI-795 -aa(lp26102 -g15 -aI662 -aI-571 -aI713 -aI-654 -aI696 -aI-608 -aa(lp26103 -g15 -aI524 -aI-504 -aI628 -aI-534 -aI582 -aI-512 -aa(lp26104 -g20 -aI524 -aI-498 -aa(lp26105 -g15 -aI740 -aI-275 -aI668 -aI-474 -aI740 -aI-400 -aa(lp26106 -g15 -aI657 -aI-73 -aI740 -aI-189 -aI712 -aI-122 -aa(lp26107 -g15 -aI430 -aI0 -aI601 -aI-24 -aI526 -aI0 -aa(lp26108 -g20 -aI87 -aI0 -aa(lp26109 -g10 -aa(lp26110 -g8 -aI209 -aI-547 -aa(lp26111 -g20 -aI394 -aI-547 -aa(lp26112 -g15 -aI542 -aI-583 -aI462 -aI-547 -aI511 -aI-559 -aa(lp26113 -g15 -aI589 -aI-702 -aI573 -aI-607 -aI589 -aI-646 -aa(lp26114 -g15 -aI539 -aI-814 -aI589 -aI-754 -aI572 -aI-791 -aa(lp26115 -g15 -aI381 -aI-847 -aI506 -aI-836 -aI453 -aI-847 -aa(lp26116 -g20 -aI209 -aI-847 -aa(lp26117 -g10 -aa(lp26118 -g8 -aI209 -aI-446 -aa(lp26119 -g20 -aI209 -aI-102 -aa(lp26120 -g20 -aI409 -aI-102 -aa(lp26121 -g15 -aI611 -aI-280 -aI544 -aI-102 -aI611 -aI-161 -aa(lp26122 -g15 -aI401 -aI-446 -aI611 -aI-391 -aI541 -aI-446 -aa(lp26123 -g10 -aa(lp26124 -g8 -aI800 -aI0 -aa(lp26125 -g10 -aa(lp26126 -g8 -aI800 -aI0 -aasVF -(lp26127 -(lp26128 -g8 -aI279 -aI0 -aa(lp26129 -g20 -aI158 -aI0 -aa(lp26130 -g20 -aI158 -aI-951 -aa(lp26131 -g20 -aI706 -aI-951 -aa(lp26132 -g20 -aI706 -aI-844 -aa(lp26133 -g20 -aI279 -aI-844 -aa(lp26134 -g20 -aI279 -aI-508 -aa(lp26135 -g20 -aI681 -aI-508 -aa(lp26136 -g20 -aI681 -aI-401 -aa(lp26137 -g20 -aI279 -aI-401 -aa(lp26138 -g10 -aa(lp26139 -g8 -aI800 -aI0 -aa(lp26140 -g10 -aa(lp26141 -g8 -aI800 -aI0 -aasVJ -(lp26142 -(lp26143 -g8 -aI89 -aI-24 -aa(lp26144 -g20 -aI89 -aI-133 -aa(lp26145 -g15 -aI290 -aI-92 -aI159 -aI-106 -aI226 -aI-92 -aa(lp26146 -g15 -aI455 -aI-144 -aI360 -aI-92 -aI415 -aI-109 -aa(lp26147 -g15 -aI516 -aI-291 -aI496 -aI-178 -aI516 -aI-228 -aa(lp26148 -g20 -aI516 -aI-951 -aa(lp26149 -g20 -aI637 -aI-951 -aa(lp26150 -g20 -aI637 -aI-293 -aa(lp26151 -g15 -aI545 -aI-69 -aI637 -aI-199 -aI606 -aI-124 -aa(lp26152 -g15 -aI300 -aI13 -aI484 -aI-14 -aI402 -aI13 -aa(lp26153 -g15 -aI89 -aI-24 -aI205 -aI13 -aI135 -aI0 -aa(lp26154 -g10 -aa(lp26155 -g8 -aI800 -aI0 -aa(lp26156 -g10 -aa(lp26157 -g8 -aI800 -aI0 -aasVN -(lp26158 -(lp26159 -g8 -aI710 -aI0 -aa(lp26160 -g20 -aI570 -aI0 -aa(lp26161 -g20 -aI193 -aI-787 -aa(lp26162 -g20 -aI188 -aI-787 -aa(lp26163 -g15 -aI199 -aI-515 -aI195 -aI-667 -aI199 -aI-576 -aa(lp26164 -g20 -aI199 -aI0 -aa(lp26165 -g20 -aI87 -aI0 -aa(lp26166 -g20 -aI87 -aI-951 -aa(lp26167 -g20 -aI226 -aI-951 -aa(lp26168 -g20 -aI602 -aI-167 -aa(lp26169 -g20 -aI606 -aI-167 -aa(lp26170 -g15 -aI597 -aI-430 -aI600 -aI-299 -aI597 -aI-386 -aa(lp26171 -g20 -aI597 -aI-951 -aa(lp26172 -g20 -aI710 -aI-951 -aa(lp26173 -g10 -aa(lp26174 -g8 -aI800 -aI0 -aa(lp26175 -g10 -aa(lp26176 -g8 -aI800 -aI0 -aasVR -(lp26177 -(lp26178 -g8 -aI242 -aI-392 -aa(lp26179 -g20 -aI242 -aI0 -aa(lp26180 -g20 -aI121 -aI0 -aa(lp26181 -g20 -aI121 -aI-951 -aa(lp26182 -g20 -aI353 -aI-951 -aa(lp26183 -g15 -aI692 -aI-681 -aI579 -aI-951 -aI692 -aI-861 -aa(lp26184 -g15 -aI503 -aI-425 -aI692 -aI-556 -aI629 -aI-471 -aa(lp26185 -g20 -aI762 -aI0 -aa(lp26186 -g20 -aI619 -aI0 -aa(lp26187 -g20 -aI391 -aI-392 -aa(lp26188 -g10 -aa(lp26189 -g8 -aI242 -aI-495 -aa(lp26190 -g20 -aI349 -aI-495 -aa(lp26191 -g15 -aI513 -aI-538 -aI423 -aI-495 -aI478 -aI-509 -aa(lp26192 -g15 -aI566 -aI-675 -aI548 -aI-567 -aI566 -aI-612 -aa(lp26193 -g15 -aI514 -aI-807 -aI566 -aI-736 -aI549 -aI-780 -aa(lp26194 -g15 -aI346 -aI-847 -aI479 -aI-834 -aI423 -aI-847 -aa(lp26195 -g20 -aI242 -aI-847 -aa(lp26196 -g10 -aa(lp26197 -g8 -aI800 -aI0 -aa(lp26198 -g10 -aa(lp26199 -g8 -aI800 -aI0 -aasVV -(lp26200 -(lp26201 -g8 -aI649 -aI-951 -aa(lp26202 -g20 -aI778 -aI-951 -aa(lp26203 -g20 -aI460 -aI0 -aa(lp26204 -g20 -aI338 -aI0 -aa(lp26205 -g20 -aI21 -aI-951 -aa(lp26206 -g20 -aI149 -aI-951 -aa(lp26207 -g20 -aI341 -aI-347 -aa(lp26208 -g15 -aI398 -aI-130 -aI358 -aI-292 -aI378 -aI-220 -aa(lp26209 -g15 -aI458 -aI-351 -aI411 -aI-193 -aI432 -aI-267 -aa(lp26210 -g10 -aa(lp26211 -g8 -aI800 -aI0 -aa(lp26212 -g10 -aa(lp26213 -g8 -aI800 -aI0 -aasVZ -(lp26214 -(lp26215 -g8 -aI731 -aI0 -aa(lp26216 -g20 -aI66 -aI0 -aa(lp26217 -g20 -aI66 -aI-93 -aa(lp26218 -g20 -aI582 -aI-843 -aa(lp26219 -g20 -aI80 -aI-843 -aa(lp26220 -g20 -aI80 -aI-951 -aa(lp26221 -g20 -aI718 -aI-951 -aa(lp26222 -g20 -aI718 -aI-856 -aa(lp26223 -g20 -aI202 -aI-107 -aa(lp26224 -g20 -aI731 -aI-107 -aa(lp26225 -g10 -aa(lp26226 -g8 -aI800 -aI0 -aa(lp26227 -g10 -aa(lp26228 -g8 -aI800 -aI0 -aasV^ -(lp26229 -(lp26230 -g8 -aI72 -aI-356 -aa(lp26231 -g20 -aI348 -aI-958 -aa(lp26232 -g20 -aI414 -aI-958 -aa(lp26233 -g20 -aI727 -aI-356 -aa(lp26234 -g20 -aI622 -aI-356 -aa(lp26235 -g20 -aI382 -aI-835 -aa(lp26236 -g20 -aI175 -aI-356 -aa(lp26237 -g10 -aa(lp26238 -g8 -aI800 -aI0 -aa(lp26239 -g10 -aa(lp26240 -g8 -aI800 -aI0 -aasVb -(lp26241 -(lp26242 -g8 -aI221 -aI-90 -aa(lp26243 -g20 -aI213 -aI-90 -aa(lp26244 -g20 -aI189 -aI0 -aa(lp26245 -g20 -aI102 -aI0 -aa(lp26246 -g20 -aI102 -aI-1012 -aa(lp26247 -g20 -aI221 -aI-1012 -aa(lp26248 -g20 -aI221 -aI-767 -aa(lp26249 -g15 -aI216 -aI-620 -aI221 -aI-732 -aI219 -aI-683 -aa(lp26250 -g20 -aI221 -aI-620 -aa(lp26251 -g15 -aI430 -aI-727 -aI267 -aI-691 -aI337 -aI-727 -aa(lp26252 -g15 -aI636 -aI-630 -aI518 -aI-727 -aI586 -aI-694 -aa(lp26253 -g15 -aI710 -aI-358 -aI686 -aI-565 -aI710 -aI-474 -aa(lp26254 -g15 -aI636 -aI-84 -aI710 -aI-241 -aI685 -aI-149 -aa(lp26255 -g15 -aI430 -aI13 -aI586 -aI-19 -aI517 -aI13 -aa(lp26256 -g15 -aI221 -aI-90 -aI341 -aI13 -aI271 -aI-21 -aa(lp26257 -g10 -aa(lp26258 -g8 -aI221 -aI-358 -aa(lp26259 -g15 -aI266 -aI-147 -aI221 -aI-259 -aI236 -aI-189 -aa(lp26260 -g15 -aI410 -aI-84 -aI296 -aI-105 -aI344 -aI-84 -aa(lp26261 -g15 -aI587 -aI-359 -aI528 -aI-84 -aI587 -aI-176 -aa(lp26262 -g15 -aI409 -aI-629 -aI587 -aI-539 -aI528 -aI-629 -aa(lp26263 -g15 -aI264 -aI-567 -aI342 -aI-629 -aI294 -aI-608 -aa(lp26264 -g15 -aI221 -aI-358 -aI235 -aI-527 -aI221 -aI-457 -aa(lp26265 -g10 -aa(lp26266 -g8 -aI800 -aI0 -aa(lp26267 -g10 -aa(lp26268 -g8 -aI800 -aI0 -aasVf -(lp26269 -(lp26270 -g8 -aI679 -aI-625 -aa(lp26271 -g20 -aI426 -aI-625 -aa(lp26272 -g20 -aI426 -aI0 -aa(lp26273 -g20 -aI307 -aI0 -aa(lp26274 -g20 -aI307 -aI-625 -aa(lp26275 -g20 -aI101 -aI-625 -aa(lp26276 -g20 -aI101 -aI-696 -aa(lp26277 -g20 -aI307 -aI-718 -aa(lp26278 -g20 -aI307 -aI-780 -aa(lp26279 -g15 -aI366 -aI-963 -aI307 -aI-864 -aI327 -aI-925 -aa(lp26280 -g15 -aI561 -aI-1019 -aI405 -aI-1000 -aI470 -aI-1019 -aa(lp26281 -g15 -aI725 -aI-996 -aI617 -aI-1019 -aI671 -aI-1012 -aa(lp26282 -g20 -aI698 -aI-903 -aa(lp26283 -g15 -aI563 -aI-922 -aI653 -aI-915 -aI608 -aI-922 -aa(lp26284 -g15 -aI455 -aI-889 -aI510 -aI-922 -aI474 -aI-911 -aa(lp26285 -g15 -aI426 -aI-782 -aI435 -aI-867 -aI426 -aI-832 -aa(lp26286 -g20 -aI426 -aI-714 -aa(lp26287 -g20 -aI679 -aI-714 -aa(lp26288 -g10 -aa(lp26289 -g8 -aI800 -aI0 -aa(lp26290 -g10 -aa(lp26291 -g8 -aI800 -aI0 -aasVj -(lp26292 -(lp26293 -g8 -aI483 -aI-1008 -aa(lp26294 -g15 -aI553 -aI-934 -aI530 -aI-1008 -aI553 -aI-983 -aa(lp26295 -g15 -aI483 -aI-859 -aI553 -aI-884 -aI530 -aI-859 -aa(lp26296 -g15 -aI414 -aI-934 -aI437 -aI-859 -aI414 -aI-884 -aa(lp26297 -g15 -aI483 -aI-1008 -aI414 -aI-983 -aI437 -aI-1008 -aa(lp26298 -g10 -aa(lp26299 -g8 -aI87 -aI297 -aa(lp26300 -g20 -aI87 -aI197 -aa(lp26301 -g15 -aI276 -aI223 -aI146 -aI214 -aI208 -aI223 -aa(lp26302 -g15 -aI394 -aI186 -aI326 -aI223 -aI366 -aI210 -aa(lp26303 -g15 -aI437 -aI83 -aI423 -aI161 -aI437 -aI126 -aa(lp26304 -g20 -aI437 -aI-620 -aa(lp26305 -g20 -aI164 -aI-634 -aa(lp26306 -g20 -aI164 -aI-714 -aa(lp26307 -g20 -aI555 -aI-714 -aa(lp26308 -g20 -aI555 -aI76 -aa(lp26309 -g15 -aI482 -aI257 -aI555 -aI154 -aI531 -aI214 -aa(lp26310 -g15 -aI274 -aI320 -aI433 -aI299 -aI364 -aI320 -aa(lp26311 -g15 -aI87 -aI297 -aI203 -aI320 -aI141 -aI313 -aa(lp26312 -g10 -aa(lp26313 -g8 -aI800 -aI0 -aa(lp26314 -g10 -aa(lp26315 -g8 -aI800 -aI0 -aasVn -(lp26316 -(lp26317 -g8 -aI577 -aI0 -aa(lp26318 -g20 -aI577 -aI-459 -aa(lp26319 -g15 -aI422 -aI-629 -aI577 -aI-572 -aI525 -aI-629 -aa(lp26320 -g15 -aI222 -aI-369 -aI289 -aI-629 -aI222 -aI-542 -aa(lp26321 -g20 -aI222 -aI0 -aa(lp26322 -g20 -aI104 -aI0 -aa(lp26323 -g20 -aI104 -aI-714 -aa(lp26324 -g20 -aI199 -aI-714 -aa(lp26325 -g20 -aI217 -aI-618 -aa(lp26326 -g20 -aI223 -aI-618 -aa(lp26327 -g15 -aI442 -aI-727 -aI268 -aI-690 -aI341 -aI-727 -aa(lp26328 -g15 -aI695 -aI-466 -aI611 -aI-727 -aI695 -aI-640 -aa(lp26329 -g20 -aI695 -aI0 -aa(lp26330 -g10 -aa(lp26331 -g8 -aI800 -aI0 -aa(lp26332 -g10 -aa(lp26333 -g8 -aI800 -aI0 -aasVr -(lp26334 -(lp26335 -g8 -aI689 -aI-698 -aa(lp26336 -g20 -aI657 -aI-590 -aa(lp26337 -g15 -aI511 -aI-619 -aI604 -aI-609 -aI555 -aI-619 -aa(lp26338 -g15 -aI347 -aI-559 -aI440 -aI-619 -aI386 -aI-599 -aa(lp26339 -g15 -aI290 -aI-384 -aI309 -aI-518 -aI290 -aI-460 -aa(lp26340 -g20 -aI290 -aI0 -aa(lp26341 -g20 -aI171 -aI0 -aa(lp26342 -g20 -aI171 -aI-714 -aa(lp26343 -g20 -aI268 -aI-714 -aa(lp26344 -g20 -aI282 -aI-583 -aa(lp26345 -g20 -aI287 -aI-583 -aa(lp26346 -g15 -aI393 -aI-694 -aI320 -aI-635 -aI356 -aI-672 -aa(lp26347 -g15 -aI533 -aI-727 -aI431 -aI-716 -aI478 -aI-727 -aa(lp26348 -g15 -aI689 -aI-698 -aI584 -aI-727 -aI636 -aI-717 -aa(lp26349 -g10 -aa(lp26350 -g8 -aI800 -aI0 -aa(lp26351 -g10 -aa(lp26352 -g8 -aI800 -aI0 -aasVv -(lp26353 -(lp26354 -g8 -aI324 -aI0 -aa(lp26355 -g20 -aI53 -aI-714 -aa(lp26356 -g20 -aI175 -aI-714 -aa(lp26357 -g20 -aI332 -aI-289 -aa(lp26358 -g15 -aI397 -aI-78 -aI368 -aI-189 -aI390 -aI-119 -aa(lp26359 -g20 -aI401 -aI-78 -aa(lp26360 -g15 -aI466 -aI-289 -aI404 -aI-97 -aI425 -aI-167 -aa(lp26361 -g20 -aI622 -aI-714 -aa(lp26362 -g20 -aI745 -aI-714 -aa(lp26363 -g20 -aI474 -aI0 -aa(lp26364 -g10 -aa(lp26365 -g8 -aI800 -aI0 -aa(lp26366 -g10 -aa(lp26367 -g8 -aI800 -aI0 -aasVz -(lp26368 -(lp26369 -g8 -aI679 -aI0 -aa(lp26370 -g20 -aI118 -aI0 -aa(lp26371 -g20 -aI118 -aI-80 -aa(lp26372 -g20 -aI548 -aI-625 -aa(lp26373 -g20 -aI139 -aI-625 -aa(lp26374 -g20 -aI139 -aI-714 -aa(lp26375 -g20 -aI667 -aI-714 -aa(lp26376 -g20 -aI667 -aI-619 -aa(lp26377 -g20 -aI246 -aI-88 -aa(lp26378 -g20 -aI679 -aI-88 -aa(lp26379 -g10 -aa(lp26380 -g8 -aI800 -aI0 -aa(lp26381 -g10 -aa(lp26382 -g8 -aI800 -aI0 -aasV~ -(lp26383 -(lp26384 -g8 -aI98 -aI-381 -aa(lp26385 -g20 -aI98 -aI-486 -aa(lp26386 -g15 -aI259 -aI-556 -aI141 -aI-533 -aI195 -aI-556 -aa(lp26387 -g15 -aI421 -aI-515 -aI303 -aI-556 -aI356 -aI-543 -aa(lp26388 -g15 -aI552 -aI-479 -aI477 -aI-491 -aI521 -aI-479 -aa(lp26389 -g15 -aI699 -aI-558 -aI598 -aI-479 -aI648 -aI-505 -aa(lp26390 -g20 -aI699 -aI-452 -aa(lp26391 -g15 -aI538 -aI-382 -aI656 -aI-405 -aI603 -aI-382 -aa(lp26392 -g15 -aI377 -aI-423 -aI495 -aI-382 -aI441 -aI-396 -aa(lp26393 -g15 -aI246 -aI-459 -aI320 -aI-447 -aI277 -aI-459 -aa(lp26394 -g15 -aI98 -aI-381 -aI199 -aI-459 -aI150 -aI-433 -aa(lp26395 -g10 -aa(lp26396 -g8 -aI800 -aI0 -aa(lp26397 -g10 -aa(lp26398 -g8 -aI800 -aI0 -aasV! -(lp26399 -(lp26400 -g8 -aI440 -aI-269 -aa(lp26401 -g20 -aI361 -aI-269 -aa(lp26402 -g20 -aI328 -aI-951 -aa(lp26403 -g20 -aI473 -aI-951 -aa(lp26404 -g10 -aa(lp26405 -g8 -aI399 -aI-162 -aa(lp26406 -g15 -aI482 -aI-71 -aI454 -aI-162 -aI482 -aI-132 -aa(lp26407 -g15 -aI399 -aI19 -aI482 -aI-11 -aI454 -aI19 -aa(lp26408 -g15 -aI317 -aI-71 -aI344 -aI19 -aI317 -aI-11 -aa(lp26409 -g15 -aI399 -aI-162 -aI317 -aI-132 -aI344 -aI-162 -aa(lp26410 -g10 -aa(lp26411 -g8 -aI800 -aI0 -aa(lp26412 -g10 -aa(lp26413 -g8 -aI800 -aI0 -aasV% -(lp26414 -(lp26415 -g8 -aI189 -aI-509 -aa(lp26416 -g15 -aI52 -aI-571 -aI132 -aI-509 -aI86 -aI-530 -aa(lp26417 -g15 -aI0 -aI-737 -aI17 -aI-612 -aI0 -aI-667 -aa(lp26418 -g15 -aI51 -aI-903 -aI0 -aI-808 -aI17 -aI-863 -aa(lp26419 -g15 -aI192 -aI-962 -aI85 -aI-942 -aI132 -aI-962 -aa(lp26420 -g15 -aI328 -aI-901 -aI248 -aI-962 -aI293 -aI-942 -aa(lp26421 -g15 -aI381 -aI-737 -aI363 -aI-861 -aI381 -aI-806 -aa(lp26422 -g15 -aI330 -aI-570 -aI381 -aI-666 -aI364 -aI-611 -aa(lp26423 -g15 -aI189 -aI-509 -aI296 -aI-530 -aI249 -aI-509 -aa(lp26424 -g10 -aa(lp26425 -g8 -aI190 -aI-587 -aa(lp26426 -g15 -aI281 -aI-737 -aI251 -aI-587 -aI281 -aI-637 -aa(lp26427 -g15 -aI190 -aI-883 -aI281 -aI-834 -aI251 -aI-883 -aa(lp26428 -g15 -aI98 -aI-737 -aI129 -aI-883 -aI98 -aI-834 -aa(lp26429 -g15 -aI190 -aI-587 -aI98 -aI-637 -aI129 -aI-587 -aa(lp26430 -g10 -aa(lp26431 -g8 -aI688 -aI-951 -aa(lp26432 -g20 -aI213 -aI0 -aa(lp26433 -g20 -aI110 -aI0 -aa(lp26434 -g20 -aI585 -aI-951 -aa(lp26435 -g10 -aa(lp26436 -g8 -aI608 -aI12 -aa(lp26437 -g15 -aI471 -aI-49 -aI551 -aI12 -aI505 -aI-8 -aa(lp26438 -g15 -aI418 -aI-214 -aI436 -aI-90 -aI418 -aI-145 -aa(lp26439 -g15 -aI470 -aI-380 -aI418 -aI-285 -aI435 -aI-340 -aa(lp26440 -g15 -aI610 -aI-439 -aI504 -aI-419 -aI551 -aI-439 -aa(lp26441 -g15 -aI747 -aI-379 -aI666 -aI-439 -aI712 -aI-419 -aa(lp26442 -g15 -aI800 -aI-214 -aI782 -aI-338 -aI800 -aI-283 -aa(lp26443 -g15 -aI749 -aI-48 -aI800 -aI-144 -aI783 -aI-89 -aa(lp26444 -g15 -aI608 -aI12 -aI714 -aI-8 -aI667 -aI12 -aa(lp26445 -g10 -aa(lp26446 -g8 -aI609 -aI-64 -aa(lp26447 -g15 -aI699 -aI-214 -aI669 -aI-64 -aI699 -aI-114 -aa(lp26448 -g15 -aI609 -aI-360 -aI699 -aI-312 -aI669 -aI-360 -aa(lp26449 -g15 -aI517 -aI-214 -aI548 -aI-360 -aI517 -aI-312 -aa(lp26450 -g15 -aI609 -aI-64 -aI517 -aI-114 -aI548 -aI-64 -aa(lp26451 -g10 -aa(lp26452 -g8 -aI800 -aI0 -aa(lp26453 -g10 -aa(lp26454 -g8 -aI800 -aI0 -aasV) -(lp26455 -(lp26456 -g8 -aI318 -aI211 -aa(lp26457 -g20 -aI194 -aI211 -aa(lp26458 -g15 -aI485 -aI-369 -aI388 -aI50 -aI485 -aI-143 -aa(lp26459 -g15 -aI193 -aI-951 -aI485 -aI-594 -aI387 -aI-788 -aa(lp26460 -g20 -aI318 -aI-951 -aa(lp26461 -g15 -aI608 -aI-368 -aI511 -aI-794 -aI608 -aI-600 -aa(lp26462 -g15 -aI318 -aI211 -aI608 -aI-134 -aI511 -aI59 -aa(lp26463 -g10 -aa(lp26464 -g8 -aI800 -aI0 -aa(lp26465 -g10 -aa(lp26466 -g8 -aI800 -aI0 -aasV- -(lp26467 -(lp26468 -g8 -aI185 -aI-302 -aa(lp26469 -g20 -aI185 -aI-411 -aa(lp26470 -g20 -aI614 -aI-411 -aa(lp26471 -g20 -aI614 -aI-302 -aa(lp26472 -g10 -aa(lp26473 -g8 -aI800 -aI0 -aa(lp26474 -g10 -aa(lp26475 -g8 -aI800 -aI0 -aasV1 -(lp26476 -(lp26477 -g8 -aI493 -aI0 -aa(lp26478 -g20 -aI378 -aI0 -aa(lp26479 -g20 -aI378 -aI-593 -aa(lp26480 -g15 -aI384 -aI-828 -aI378 -aI-646 -aI380 -aI-725 -aa(lp26481 -g15 -aI305 -aI-755 -aI367 -aI-810 -aI340 -aI-785 -aa(lp26482 -g20 -aI209 -aI-676 -aa(lp26483 -g20 -aI146 -aI-756 -aa(lp26484 -g20 -aI395 -aI-951 -aa(lp26485 -g20 -aI493 -aI-951 -aa(lp26486 -g10 -aa(lp26487 -g8 -aI800 -aI0 -aa(lp26488 -g10 -aa(lp26489 -g8 -aI800 -aI0 -aasV5 -(lp26490 -(lp26491 -g8 -aI111 -aI-37 -aa(lp26492 -g20 -aI111 -aI-149 -aa(lp26493 -g15 -aI346 -aI-87 -aI174 -aI-108 -aI252 -aI-87 -aa(lp26494 -g15 -aI565 -aI-291 -aI492 -aI-87 -aI565 -aI-155 -aa(lp26495 -g15 -aI341 -aI-483 -aI565 -aI-419 -aI490 -aI-483 -aa(lp26496 -g15 -aI190 -aI-466 -aI302 -aI-483 -aI252 -aI-477 -aa(lp26497 -g20 -aI132 -aI-503 -aa(lp26498 -g20 -aI167 -aI-951 -aa(lp26499 -g20 -aI617 -aI-951 -aa(lp26500 -g20 -aI617 -aI-843 -aa(lp26501 -g20 -aI270 -aI-843 -aa(lp26502 -g20 -aI245 -aI-570 -aa(lp26503 -g15 -aI381 -aI-583 -aI291 -aI-579 -aI337 -aI-583 -aa(lp26504 -g15 -aI602 -aI-508 -aI472 -aI-583 -aI546 -aI-558 -aa(lp26505 -g15 -aI686 -aI-304 -aI658 -aI-459 -aI686 -aI-391 -aa(lp26506 -g15 -aI597 -aI-69 -aI686 -aI-203 -aI656 -aI-124 -aa(lp26507 -g15 -aI343 -aI13 -aI537 -aI-14 -aI452 -aI13 -aa(lp26508 -g15 -aI111 -aI-37 -aI246 -aI13 -aI169 -aI-3 -aa(lp26509 -g10 -aa(lp26510 -g8 -aI800 -aI0 -aa(lp26511 -g10 -aa(lp26512 -g8 -aI800 -aI0 -aasV9 -(lp26513 -(lp26514 -g8 -aI171 -aI1 -aa(lp26515 -g20 -aI171 -aI-99 -aa(lp26516 -g15 -aI279 -aI-83 -aI200 -aI-88 -aI236 -aI-83 -aa(lp26517 -g15 -aI499 -aI-175 -aI377 -aI-83 -aI450 -aI-114 -aa(lp26518 -g15 -aI578 -aI-466 -aI547 -aI-236 -aI574 -aI-333 -aa(lp26519 -g20 -aI570 -aI-466 -aa(lp26520 -g15 -aI370 -aI-355 -aI529 -aI-392 -aI462 -aI-355 -aa(lp26521 -g15 -aI172 -aI-432 -aI286 -aI-355 -aI220 -aI-381 -aa(lp26522 -g15 -aI100 -aI-644 -aI124 -aI-483 -aI100 -aI-554 -aa(lp26523 -g15 -aI178 -aI-879 -aI100 -aI-743 -aI126 -aI-821 -aa(lp26524 -g15 -aI389 -aI-965 -aI231 -aI-936 -aI301 -aI-965 -aa(lp26525 -g15 -aI616 -aI-853 -aI484 -aI-965 -aI560 -aI-927 -aa(lp26526 -g15 -aI699 -aI-545 -aI671 -aI-779 -aI699 -aI-676 -aa(lp26527 -g15 -aI283 -aI13 -aI699 -aI-172 -aI561 -aI13 -aa(lp26528 -g15 -aI171 -aI1 -aI238 -aI13 -aI200 -aI9 -aa(lp26529 -g10 -aa(lp26530 -g8 -aI214 -aI-644 -aa(lp26531 -g15 -aI259 -aI-499 -aI214 -aI-581 -aI229 -aI-533 -aa(lp26532 -g15 -aI386 -aI-448 -aI289 -aI-465 -aI331 -aI-448 -aa(lp26533 -g15 -aI525 -aI-501 -aI441 -aI-448 -aI488 -aI-466 -aa(lp26534 -g15 -aI581 -aI-621 -aI562 -aI-537 -aI581 -aI-577 -aa(lp26535 -g15 -aI529 -aI-792 -aI581 -aI-687 -aI564 -aI-744 -aa(lp26536 -g15 -aI390 -aI-864 -aI494 -aI-840 -aI448 -aI-864 -aa(lp26537 -g15 -aI261 -aI-808 -aI335 -aI-864 -aI291 -aI-845 -aa(lp26538 -g15 -aI214 -aI-644 -aI230 -aI-770 -aI214 -aI-715 -aa(lp26539 -g10 -aa(lp26540 -g8 -aI800 -aI0 -aa(lp26541 -g10 -aa(lp26542 -g8 -aI800 -aI0 -aasV= -(lp26543 -(lp26544 -g8 -aI98 -aI-554 -aa(lp26545 -g20 -aI98 -aI-651 -aa(lp26546 -g20 -aI699 -aI-651 -aa(lp26547 -g20 -aI699 -aI-554 -aa(lp26548 -g10 -aa(lp26549 -g8 -aI98 -aI-287 -aa(lp26550 -g20 -aI98 -aI-384 -aa(lp26551 -g20 -aI699 -aI-384 -aa(lp26552 -g20 -aI699 -aI-287 -aa(lp26553 -g10 -aa(lp26554 -g8 -aI800 -aI0 -aa(lp26555 -g10 -aa(lp26556 -g8 -aI800 -aI0 -aasVA -(lp26557 -(lp26558 -g8 -aI653 -aI0 -aa(lp26559 -g20 -aI559 -aI-294 -aa(lp26560 -g20 -aI240 -aI-294 -aa(lp26561 -g20 -aI145 -aI0 -aa(lp26562 -g20 -aI21 -aI0 -aa(lp26563 -g20 -aI335 -aI-955 -aa(lp26564 -g20 -aI462 -aI-955 -aa(lp26565 -g20 -aI778 -aI0 -aa(lp26566 -g10 -aa(lp26567 -g8 -aI525 -aI-401 -aa(lp26568 -g20 -aI438 -aI-677 -aa(lp26569 -g15 -aI398 -aI-825 -aI421 -aI-731 -aI408 -aI-780 -aa(lp26570 -g15 -aI368 -aI-705 -aI389 -aI-782 -aI379 -aI-742 -aa(lp26571 -g20 -aI274 -aI-401 -aa(lp26572 -g10 -aa(lp26573 -g8 -aI800 -aI0 -aa(lp26574 -g10 -aa(lp26575 -g8 -aI800 -aI0 -aasVE -(lp26576 -(lp26577 -g8 -aI689 -aI0 -aa(lp26578 -g20 -aI141 -aI0 -aa(lp26579 -g20 -aI141 -aI-951 -aa(lp26580 -g20 -aI689 -aI-951 -aa(lp26581 -g20 -aI689 -aI-844 -aa(lp26582 -g20 -aI262 -aI-844 -aa(lp26583 -g20 -aI262 -aI-550 -aa(lp26584 -g20 -aI664 -aI-550 -aa(lp26585 -g20 -aI664 -aI-444 -aa(lp26586 -g20 -aI262 -aI-444 -aa(lp26587 -g20 -aI262 -aI-106 -aa(lp26588 -g20 -aI689 -aI-106 -aa(lp26589 -g10 -aa(lp26590 -g8 -aI800 -aI0 -aa(lp26591 -g10 -aa(lp26592 -g8 -aI800 -aI0 -aasVI -(lp26593 -(lp26594 -g8 -aI651 -aI0 -aa(lp26595 -g20 -aI146 -aI0 -aa(lp26596 -g20 -aI146 -aI-79 -aa(lp26597 -g20 -aI338 -aI-92 -aa(lp26598 -g20 -aI338 -aI-858 -aa(lp26599 -g20 -aI146 -aI-871 -aa(lp26600 -g20 -aI146 -aI-951 -aa(lp26601 -g20 -aI651 -aI-951 -aa(lp26602 -g20 -aI651 -aI-871 -aa(lp26603 -g20 -aI460 -aI-858 -aa(lp26604 -g20 -aI460 -aI-92 -aa(lp26605 -g20 -aI651 -aI-79 -aa(lp26606 -g10 -aa(lp26607 -g8 -aI800 -aI0 -aa(lp26608 -g10 -aa(lp26609 -g8 -aI800 -aI0 -aasVM -(lp26610 -(lp26611 -g8 -aI346 -aI0 -aa(lp26612 -g20 -aI165 -aI-832 -aa(lp26613 -g20 -aI160 -aI-832 -aa(lp26614 -g15 -aI171 -aI-568 -aI167 -aI-717 -aI171 -aI-629 -aa(lp26615 -g20 -aI171 -aI0 -aa(lp26616 -g20 -aI73 -aI0 -aa(lp26617 -g20 -aI73 -aI-951 -aa(lp26618 -g20 -aI234 -aI-951 -aa(lp26619 -g20 -aI395 -aI-175 -aa(lp26620 -g20 -aI399 -aI-175 -aa(lp26621 -g20 -aI562 -aI-951 -aa(lp26622 -g20 -aI726 -aI-951 -aa(lp26623 -g20 -aI726 -aI0 -aa(lp26624 -g20 -aI626 -aI0 -aa(lp26625 -g20 -aI626 -aI-577 -aa(lp26626 -g15 -aI636 -aI-831 -aI626 -aI-621 -aI629 -aI-706 -aa(lp26627 -g20 -aI630 -aI-831 -aa(lp26628 -g20 -aI446 -aI0 -aa(lp26629 -g10 -aa(lp26630 -g8 -aI800 -aI0 -aa(lp26631 -g10 -aa(lp26632 -g8 -aI800 -aI0 -aasVQ -(lp26633 -(lp26634 -g8 -aI561 -aI-24 -aa(lp26635 -g15 -aI742 -aI177 -aI598 -aI53 -aI658 -aI120 -aa(lp26636 -g20 -aI664 -aI269 -aa(lp26637 -g15 -aI450 -aI9 -aI561 -aI195 -aI490 -aI108 -aa(lp26638 -g15 -aI401 -aI13 -aI434 -aI12 -aI418 -aI13 -aa(lp26639 -g15 -aI54 -aI-478 -aI170 -aI13 -aI54 -aI-150 -aa(lp26640 -g15 -aI402 -aI-966 -aI54 -aI-803 -aI170 -aI-966 -aa(lp26641 -g15 -aI657 -aI-839 -aI513 -aI-966 -aI598 -aI-923 -aa(lp26642 -g15 -aI746 -aI-476 -aI717 -aI-754 -aI746 -aI-633 -aa(lp26643 -g15 -aI561 -aI-24 -aI746 -aI-248 -aI684 -aI-97 -aa(lp26644 -g10 -aa(lp26645 -g8 -aI401 -aI-92 -aa(lp26646 -g15 -aI566 -aI-187 -aI476 -aI-92 -aI531 -aI-124 -aa(lp26647 -g15 -aI618 -aI-476 -aI601 -aI-249 -aI618 -aI-346 -aa(lp26648 -g15 -aI565 -aI-766 -aI618 -aI-608 -aI600 -aI-704 -aa(lp26649 -g15 -aI402 -aI-859 -aI530 -aI-828 -aI475 -aI-859 -aa(lp26650 -g15 -aI182 -aI-476 -aI256 -aI-859 -aI182 -aI-731 -aa(lp26651 -g15 -aI401 -aI-92 -aI182 -aI-220 -aI255 -aI-92 -aa(lp26652 -g10 -aa(lp26653 -g8 -aI800 -aI0 -aa(lp26654 -g10 -aa(lp26655 -g8 -aI800 -aI0 -aasVU -(lp26656 -(lp26657 -g8 -aI718 -aI-952 -aa(lp26658 -g20 -aI718 -aI-335 -aa(lp26659 -g15 -aI636 -aI-76 -aI718 -aI-222 -aI691 -aI-136 -aa(lp26660 -g15 -aI395 -aI13 -aI582 -aI-16 -aI501 -aI13 -aa(lp26661 -g15 -aI81 -aI-338 -aI186 -aI13 -aI81 -aI-103 -aa(lp26662 -g20 -aI81 -aI-951 -aa(lp26663 -g20 -aI202 -aI-951 -aa(lp26664 -g20 -aI202 -aI-344 -aa(lp26665 -g15 -aI402 -aI-92 -aI202 -aI-176 -aI269 -aI-92 -aa(lp26666 -g15 -aI597 -aI-345 -aI530 -aI-92 -aI595 -aI-177 -aa(lp26667 -g20 -aI597 -aI-952 -aa(lp26668 -g10 -aa(lp26669 -g8 -aI800 -aI0 -aa(lp26670 -g10 -aa(lp26671 -g8 -aI800 -aI0 -aasVY -(lp26672 -(lp26673 -g8 -aI398 -aI-470 -aa(lp26674 -g20 -aI646 -aI-951 -aa(lp26675 -g20 -aI777 -aI-951 -aa(lp26676 -g20 -aI460 -aI-369 -aa(lp26677 -g20 -aI460 -aI0 -aa(lp26678 -g20 -aI338 -aI0 -aa(lp26679 -g20 -aI338 -aI-363 -aa(lp26680 -g20 -aI21 -aI-951 -aa(lp26681 -g20 -aI153 -aI-951 -aa(lp26682 -g10 -aa(lp26683 -g8 -aI800 -aI0 -aa(lp26684 -g10 -aa(lp26685 -g8 -aI800 -aI0 -aasV] -(lp26686 -(lp26687 -g8 -aI188 -aI113 -aa(lp26688 -g20 -aI413 -aI113 -aa(lp26689 -g20 -aI413 -aI-854 -aa(lp26690 -g20 -aI188 -aI-854 -aa(lp26691 -g20 -aI188 -aI-951 -aa(lp26692 -g20 -aI531 -aI-951 -aa(lp26693 -g20 -aI531 -aI211 -aa(lp26694 -g20 -aI188 -aI211 -aa(lp26695 -g10 -aa(lp26696 -g8 -aI800 -aI0 -aa(lp26697 -g10 -aa(lp26698 -g8 -aI800 -aI0 -aasVa -(lp26699 -(lp26700 -g8 -aI582 -aI0 -aa(lp26701 -g20 -aI558 -aI-98 -aa(lp26702 -g20 -aI553 -aI-98 -aa(lp26703 -g15 -aI450 -aI-10 -aI519 -aI-56 -aI485 -aI-27 -aa(lp26704 -g15 -aI314 -aI13 -aI415 -aI5 -aI370 -aI13 -aa(lp26705 -g15 -aI148 -aI-42 -aI243 -aI13 -aI188 -aI-5 -aa(lp26706 -g15 -aI87 -aI-199 -aI107 -aI-79 -aI87 -aI-132 -aa(lp26707 -g15 -aI419 -aI-425 -aI87 -aI-343 -aI198 -aI-419 -aa(lp26708 -g20 -aI552 -aI-430 -aa(lp26709 -g20 -aI552 -aI-475 -aa(lp26710 -g15 -aI393 -aI-629 -aI552 -aI-577 -aI499 -aI-629 -aa(lp26711 -g15 -aI179 -aI-575 -aI329 -aI-629 -aI258 -aI-611 -aa(lp26712 -g20 -aI138 -aI-664 -aa(lp26713 -g15 -aI388 -aI-727 -aI223 -aI-706 -aI306 -aI-727 -aa(lp26714 -g15 -aI601 -aI-670 -aI486 -aI-727 -aI557 -aI-708 -aa(lp26715 -g15 -aI667 -aI-489 -aI645 -aI-633 -aI667 -aI-572 -aa(lp26716 -g20 -aI667 -aI0 -aa(lp26717 -g10 -aa(lp26718 -g8 -aI550 -aI-349 -aa(lp26719 -g20 -aI445 -aI-344 -aa(lp26720 -g15 -aI264 -aI-304 -aI360 -aI-341 -aI299 -aI-327 -aa(lp26721 -g15 -aI210 -aI-198 -aI228 -aI-281 -aI210 -aI-245 -aa(lp26722 -g15 -aI341 -aI-82 -aI210 -aI-120 -aI254 -aI-82 -aa(lp26723 -g15 -aI493 -aI-135 -aI404 -aI-82 -aI455 -aI-99 -aa(lp26724 -g15 -aI550 -aI-284 -aI531 -aI-170 -aI550 -aI-220 -aa(lp26725 -g10 -aa(lp26726 -g8 -aI800 -aI0 -aa(lp26727 -g10 -aa(lp26728 -g8 -aI800 -aI0 -aasVe -(lp26729 -(lp26730 -g8 -aI713 -aI-334 -aa(lp26731 -g20 -aI209 -aI-334 -aa(lp26732 -g15 -aI433 -aI-90 -aI213 -aI-171 -aI287 -aI-90 -aa(lp26733 -g15 -aI674 -aI-139 -aI518 -aI-90 -aI598 -aI-106 -aa(lp26734 -g20 -aI674 -aI-35 -aa(lp26735 -g15 -aI437 -aI13 -aI602 -aI-2 -aI523 -aI13 -aa(lp26736 -g15 -aI182 -aI-83 -aI331 -aI13 -aI246 -aI-18 -aa(lp26737 -g15 -aI86 -aI-351 -aI118 -aI-148 -aI86 -aI-238 -aa(lp26738 -g15 -aI174 -aI-626 -aI86 -aI-467 -aI115 -aI-558 -aa(lp26739 -g15 -aI410 -aI-727 -aI233 -aI-693 -aI312 -aI-727 -aa(lp26740 -g15 -aI631 -aI-640 -aI502 -aI-727 -aI576 -aI-698 -aa(lp26741 -g15 -aI713 -aI-407 -aI686 -aI-582 -aI713 -aI-504 -aa(lp26742 -g10 -aa(lp26743 -g8 -aI212 -aI-430 -aa(lp26744 -g20 -aI585 -aI-430 -aa(lp26745 -g15 -aI408 -aI-629 -aI585 -aI-562 -aI526 -aI-629 -aa(lp26746 -g15 -aI212 -aI-430 -aI288 -aI-629 -aI223 -aI-562 -aa(lp26747 -g10 -aa(lp26748 -g8 -aI800 -aI0 -aa(lp26749 -g10 -aa(lp26750 -g8 -aI800 -aI0 -aasVi -(lp26751 -(lp26752 -g8 -aI412 -aI-1008 -aa(lp26753 -g15 -aI481 -aI-934 -aI458 -aI-1008 -aI481 -aI-983 -aa(lp26754 -g15 -aI460 -aI-878 -aI481 -aI-909 -aI474 -aI-890 -aa(lp26755 -g15 -aI412 -aI-859 -aI446 -aI-865 -aI430 -aI-859 -aa(lp26756 -g15 -aI342 -aI-934 -aI365 -aI-859 -aI342 -aI-884 -aa(lp26757 -g15 -aI412 -aI-1008 -aI342 -aI-983 -aI365 -aI-1008 -aa(lp26758 -g10 -aa(lp26759 -g8 -aI352 -aI-620 -aa(lp26760 -g20 -aI177 -aI-634 -aa(lp26761 -g20 -aI177 -aI-714 -aa(lp26762 -g20 -aI470 -aI-714 -aa(lp26763 -g20 -aI470 -aI-92 -aa(lp26764 -g20 -aI699 -aI-79 -aa(lp26765 -g20 -aI699 -aI0 -aa(lp26766 -g20 -aI128 -aI0 -aa(lp26767 -g20 -aI128 -aI-79 -aa(lp26768 -g20 -aI352 -aI-92 -aa(lp26769 -g10 -aa(lp26770 -g8 -aI800 -aI0 -aa(lp26771 -g10 -aa(lp26772 -g8 -aI800 -aI0 -aasVm -(lp26773 -(lp26774 -g8 -aI636 -aI0 -aa(lp26775 -g20 -aI636 -aI-459 -aa(lp26776 -g15 -aI618 -aI-591 -aI636 -aI-523 -aI630 -aI-567 -aa(lp26777 -g15 -aI561 -aI-629 -aI607 -aI-616 -aI588 -aI-629 -aa(lp26778 -g15 -aI478 -aI-575 -aI523 -aI-629 -aI495 -aI-611 -aa(lp26779 -g15 -aI453 -aI-394 -aI461 -aI-539 -aI453 -aI-478 -aa(lp26780 -g20 -aI453 -aI0 -aa(lp26781 -g20 -aI348 -aI0 -aa(lp26782 -g20 -aI348 -aI-459 -aa(lp26783 -g15 -aI266 -aI-629 -aI348 -aI-572 -aI321 -aI-629 -aa(lp26784 -g15 -aI188 -aI-577 -aI230 -aI-629 -aI204 -aI-611 -aa(lp26785 -g15 -aI165 -aI-369 -aI173 -aI-542 -aI165 -aI-473 -aa(lp26786 -g20 -aI165 -aI0 -aa(lp26787 -g20 -aI59 -aI0 -aa(lp26788 -g20 -aI59 -aI-714 -aa(lp26789 -g20 -aI142 -aI-714 -aa(lp26790 -g20 -aI160 -aI-618 -aa(lp26791 -g20 -aI166 -aI-618 -aa(lp26792 -g15 -aI297 -aI-727 -aI195 -aI-690 -aI239 -aI-727 -aa(lp26793 -g15 -aI436 -aI-608 -aI368 -aI-727 -aI414 -aI-687 -aa(lp26794 -g20 -aI440 -aI-608 -aa(lp26795 -g15 -aI582 -aI-727 -aI473 -aI-687 -aI520 -aI-727 -aa(lp26796 -g15 -aI703 -aI-667 -aI638 -aI-727 -aI678 -aI-707 -aa(lp26797 -g15 -aI741 -aI-466 -aI728 -aI-627 -aI741 -aI-560 -aa(lp26798 -g20 -aI741 -aI0 -aa(lp26799 -g10 -aa(lp26800 -g8 -aI800 -aI0 -aa(lp26801 -g10 -aa(lp26802 -g8 -aI800 -aI0 -aasVq -(lp26803 -(lp26804 -g8 -aI578 -aI-618 -aa(lp26805 -g20 -aI583 -aI-618 -aa(lp26806 -g20 -aI601 -aI-714 -aa(lp26807 -g20 -aI697 -aI-714 -aa(lp26808 -g20 -aI697 -aI320 -aa(lp26809 -g20 -aI578 -aI320 -aa(lp26810 -g20 -aI578 -aI15 -aa(lp26811 -g15 -aI586 -aI-95 -aI578 -aI-2 -aI581 -aI-39 -aa(lp26812 -g20 -aI578 -aI-95 -aa(lp26813 -g15 -aI369 -aI13 -aI529 -aI-22 -aI459 -aI13 -aa(lp26814 -g15 -aI163 -aI-83 -aI281 -aI13 -aI213 -aI-18 -aa(lp26815 -g15 -aI89 -aI-355 -aI114 -aI-148 -aI89 -aI-239 -aa(lp26816 -g15 -aI164 -aI-629 -aI89 -aI-472 -aI114 -aI-564 -aa(lp26817 -g15 -aI369 -aI-727 -aI213 -aI-694 -aI282 -aI-727 -aa(lp26818 -g15 -aI578 -aI-618 -aI458 -aI-727 -aI528 -aI-690 -aa(lp26819 -g10 -aa(lp26820 -g8 -aI578 -aI-328 -aa(lp26821 -g20 -aI578 -aI-355 -aa(lp26822 -g15 -aI533 -aI-566 -aI578 -aI-454 -aI563 -aI-524 -aa(lp26823 -g15 -aI389 -aI-629 -aI503 -aI-608 -aI455 -aI-629 -aa(lp26824 -g15 -aI212 -aI-354 -aI271 -aI-629 -aI212 -aI-537 -aa(lp26825 -g15 -aI390 -aI-84 -aI212 -aI-174 -aI271 -aI-84 -aa(lp26826 -g15 -aI532 -aI-142 -aI456 -aI-84 -aI504 -aI-104 -aa(lp26827 -g15 -aI578 -aI-328 -aI561 -aI-180 -aI577 -aI-243 -aa(lp26828 -g10 -aa(lp26829 -g8 -aI800 -aI0 -aa(lp26830 -g10 -aa(lp26831 -g8 -aI800 -aI0 -aasVu -(lp26832 -(lp26833 -g8 -aI600 -aI0 -aa(lp26834 -g20 -aI582 -aI-95 -aa(lp26835 -g20 -aI576 -aI-95 -aa(lp26836 -g15 -aI358 -aI13 -aI530 -aI-22 -aI458 -aI13 -aa(lp26837 -g15 -aI104 -aI-247 -aI189 -aI13 -aI104 -aI-73 -aa(lp26838 -g20 -aI104 -aI-714 -aa(lp26839 -g20 -aI222 -aI-714 -aa(lp26840 -g20 -aI222 -aI-254 -aa(lp26841 -g15 -aI376 -aI-84 -aI222 -aI-141 -aI273 -aI-84 -aa(lp26842 -g15 -aI529 -aI-145 -aI446 -aI-84 -aI497 -aI-104 -aa(lp26843 -g15 -aI577 -aI-343 -aI561 -aI-185 -aI577 -aI-251 -aa(lp26844 -g20 -aI577 -aI-714 -aa(lp26845 -g20 -aI695 -aI-714 -aa(lp26846 -g20 -aI695 -aI0 -aa(lp26847 -g10 -aa(lp26848 -g8 -aI800 -aI0 -aa(lp26849 -g10 -aa(lp26850 -g8 -aI800 -aI0 -aasVy -(lp26851 -(lp26852 -g8 -aI53 -aI-714 -aa(lp26853 -g20 -aI175 -aI-714 -aa(lp26854 -g20 -aI346 -aI-288 -aa(lp26855 -g15 -aI404 -aI-99 -aI381 -aI-199 -aI401 -aI-136 -aa(lp26856 -g20 -aI408 -aI-99 -aa(lp26857 -g15 -aI466 -aI-289 -aI418 -aI-148 -aI437 -aI-211 -aa(lp26858 -g20 -aI622 -aI-714 -aa(lp26859 -g20 -aI745 -aI-714 -aa(lp26860 -g20 -aI436 -aI93 -aa(lp26861 -g15 -aI334 -aI263 -aI407 -aI169 -aI373 -aI225 -aa(lp26862 -g15 -aI174 -aI320 -aI296 -aI301 -aI242 -aI320 -aa(lp26863 -g15 -aI65 -aI309 -aI137 -aI320 -aI100 -aI317 -aa(lp26864 -g20 -aI65 -aI215 -aa(lp26865 -g15 -aI153 -aI223 -aI92 -aI220 -aI121 -aI223 -aa(lp26866 -g15 -aI250 -aI196 -aI195 -aI223 -aI227 -aI214 -aa(lp26867 -g15 -aI313 -aI104 -aI274 -aI178 -aI294 -aI148 -aa(lp26868 -g20 -aI350 -aI6 -aa(lp26869 -g10 -aa(lp26870 -g8 -aI800 -aI0 -aa(lp26871 -g10 -aa(lp26872 -g8 -aI800 -aI0 -aasV} -(lp26873 -(lp26874 -g8 -aI314 -aI-204 -aa(lp26875 -g15 -aI466 -aI-366 -aI314 -aI-294 -aI365 -aI-348 -aa(lp26876 -g20 -aI466 -aI-373 -aa(lp26877 -g15 -aI314 -aI-535 -aI365 -aI-391 -aI314 -aI-445 -aa(lp26878 -g20 -aI314 -aI-751 -aa(lp26879 -g15 -aI277 -aI-828 -aI314 -aI-786 -aI302 -aI-812 -aa(lp26880 -g15 -aI147 -aI-854 -aI253 -aI-845 -aI209 -aI-853 -aa(lp26881 -g20 -aI147 -aI-951 -aa(lp26882 -g15 -aI433 -aI-760 -aI338 -aI-948 -aI433 -aI-885 -aa(lp26883 -g20 -aI433 -aI-543 -aa(lp26884 -g15 -aI653 -aI-420 -aI433 -aI-461 -aI506 -aI-420 -aa(lp26885 -g20 -aI653 -aI-319 -aa(lp26886 -g15 -aI433 -aI-196 -aI506 -aI-319 -aI433 -aI-278 -aa(lp26887 -g20 -aI433 -aI20 -aa(lp26888 -g15 -aI147 -aI211 -aI433 -aI145 -aI338 -aI208 -aa(lp26889 -g20 -aI147 -aI113 -aa(lp26890 -g15 -aI277 -aI88 -aI209 -aI113 -aI253 -aI104 -aa(lp26891 -g15 -aI314 -aI10 -aI302 -aI71 -aI314 -aI46 -aa(lp26892 -g10 -aa(lp26893 -g8 -aI800 -aI0 -aa(lp26894 -g10 -aa(lp26895 -g8 -aI800 -aI0 -aasss. \ No newline at end of file diff --git a/nodebox/font/glyph.py b/nodebox/font/glyph.py deleted file mode 100644 index 457d4f6..0000000 --- a/nodebox/font/glyph.py +++ /dev/null @@ -1,108 +0,0 @@ -#=== CHARACTER GLYPH PATHS =========================================================================== -# NodeBox for OpenGL has no direct way of accessing glyph path information. -# This script is to be used in the classic NodeBox for Mac OS X (http://nodebox.net). -# It uses the textpath() command to convert characters to paths, -# and store the paths in a file that can be used by NodeBox for OpenGL as glyph path info. - -# Defines the characters to process. -# By default, only standard ASCII characters are converted. -characters = range(32, 127) - -# Defines which fonts to process. -# By default, only the standard fonts in NodeBox for OpenGL -# are converted (Droid Sans, Droid Sans Mono, Droid Serif, Arial). -fonts = { - "Droid Sans": { - "normal" : "DroidSans", # PostScript-name. - "bold" : "DroidSans-Bold" - }, - "Droid Sans Mono": { - "normal" : "DroidSansMono" - }, - "Droid Serif": { - "normal" : "DroidSerif", - "bold" : "DroidSerif-Bold", - "italic" : "DroidSerif-Italic", - "bold italic" : "DroidSerif-BoldItalic" - }, - "Arial": { - "normal" : "ArialMT", - "bold" : "Arial-BoldMT", - } -} - -# How point size is measured (NodeBox for OpenGL uses 96dpi). -dpi = 96 - -# Measure from the baseline? -baseline = True - -#===================================================================================================== - -glyphs = {} - -commands = { - 0: "moveto", - 1: "lineto", - 2: "curveto", - 3: "close" -} - -from AppKit import NSFont -def descent(fontname, fontsize=10): - return NSFont.fontWithName_size_(fontname, fontsize).descender() - -for fontname in fonts: - glyphs[fontname] = {} - for fontweight in fonts[fontname]: - glyphs[fontname][fontweight] = {} - # Render the font at a large size so we can round the path points. - # This saves disk space and decreases the loading time. - _ctx.font(fonts[fontname][fontweight]) - _ctx.fontsize(1000.0 * dpi / 72) - _ctx.lineheight(1.0) - dy = baseline and descent(fontname, _ctx.fontsize()) or 0 - for i in characters: - ch = unichr(i) - glyphs[fontname][fontweight][ch] = [] - for pt in _ctx.textpath(ch, 0, 0): - if pt.cmd == 0: - pt = [commands[pt.cmd], int(pt.x), int(pt.y-dy)] - elif pt.cmd == 1: - pt = [commands[pt.cmd], int(pt.x), int(pt.y-dy)] - elif pt.cmd == 2: - pt = [commands[pt.cmd], - int(pt.x), int(pt.y-dy), - int(pt.ctrl1.x), int(pt.ctrl1.y-dy), - int(pt.ctrl2.x), int(pt.ctrl2.y-dy)] - elif pt.cmd == 3: - pt = [commands[pt.cmd]] - glyphs[fontname][fontweight][ch].append(pt) - -import cPickle -f = open("glyph.p","w") -cPickle.dump(glyphs, f) -f.close() - -#===================================================================================================== -# For testing purposes: - -def textpath_from_glyphs(string, x=0, y=0, fontname="Droid Sans", fontweight="normal"): - glyphs = cPickle.load(open("glyph.p")) - p = _ctx.BezierPath() - f = _ctx.fontsize() / 1000.0 * 72 / dpi - y += textheight(" ", lineheight()) - textheight(" ", lineheight=1) - from nodebox.graphics import MOVETO, LINETO, CURVETO, CLOSE - for ch in string: - glyph = glyphs[fontname][fontweight][ch] - for pt in glyph: - if pt[0] == "moveto": - p.moveto(x+pt[1]*f, y+pt[2]*f) - elif pt[0] == "lineto": - p.lineto(x+pt[1]*f, y+pt[2]*f) - elif pt[0] == "curveto": - p.curveto(x+pt[3]*f, y+pt[4]*f, x+pt[5]*f, y+pt[6]*f, x+pt[1]*f, y+pt[2]*f) - elif pt[0] == "close": - p.closepath() - x += _ctx.textwidth(ch) - return p diff --git a/nodebox/graphics/__init__.py b/nodebox/graphics/__init__.py deleted file mode 100644 index 392a7dd..0000000 --- a/nodebox/graphics/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -import bezier -import context -import geometry -import physics -import shader - -from noise import noise -from context import * - -physics.line = context.line -physics.ellipse = context.ellipse -physics.Text = context.Text - -#----------------------------------------------------------------------------------------------------- -# Expose the canvas and some common canvas properties on global level. -# Some magic constants from NodeBox are commands here: -# - WIDTH => width() -# - HEIGHT => height() -# - FRAME => frame() - -canvas = Canvas() - -def size(width=None, height=None): - if width is not None: - canvas.width = width - if height is not None: - canvas.height = height - return canvas.size - -def speed(fps=None): - if fps is not None: - canvas.fps = fps - return canvas.fps - -def frame(): - return canvas.frame - -def clear(): - canvas.clear() \ No newline at end of file diff --git a/nodebox/graphics/bezier.py b/nodebox/graphics/bezier.py deleted file mode 100644 index ce8883e..0000000 --- a/nodebox/graphics/bezier.py +++ /dev/null @@ -1,530 +0,0 @@ -#=== BEZIER ========================================================================================== -# Bezier mathematics. -# Authors: Tom De Smedt -# License: BSD (see LICENSE.txt for details). -# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) -# http://cityinabottle.org/nodebox - -# Thanks to Prof. F. De Smedt at the Vrije Universiteit Brussel. - -from context import BezierPath, PathElement, PathError, Point, MOVETO, LINETO, CURVETO, CLOSE -from math import sqrt, pow - -class DynamicPathElement(PathElement): - # Not a "fixed" point in the BezierPath, but calculated with BezierPath.point(). - pass - -#===================================================================================================== - -#--- BEZIER MATH ------------------------------------------------------------------------------------ - -def linepoint(t, x0, y0, x1, y1): - """ Returns coordinates for point at t on the line. - Calculates the coordinates of x and y for a point at t on a straight line. - The t parameter is a number between 0.0 and 1.0, - x0 and y0 define the starting point of the line, - x1 and y1 the ending point of the line. - """ - out_x = x0 + t * (x1-x0) - out_y = y0 + t * (y1-y0) - return (out_x, out_y) - -def linelength(x0, y0, x1, y1): - """ Returns the length of the line. - """ - a = pow(abs(x0 - x1), 2) - b = pow(abs(y0 - y1), 2) - return sqrt(a+b) - -def curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3, handles=False): - """ Returns coordinates for point at t on the spline. - Calculates the coordinates of x and y for a point at t on the cubic bezier spline, - and its control points, based on the de Casteljau interpolation algorithm. - The t parameter is a number between 0.0 and 1.0, - x0 and y0 define the starting point of the spline, - x1 and y1 its control point, - x3 and y3 the ending point of the spline, - x2 and y2 its control point. - If the handles parameter is set, returns not only the point at t, - but the modified control points of p0 and p3 should this point split the path as well. - """ - mint = 1 - t - x01 = x0 * mint + x1 * t - y01 = y0 * mint + y1 * t - x12 = x1 * mint + x2 * t - y12 = y1 * mint + y2 * t - x23 = x2 * mint + x3 * t - y23 = y2 * mint + y3 * t - out_c1x = x01 * mint + x12 * t - out_c1y = y01 * mint + y12 * t - out_c2x = x12 * mint + x23 * t - out_c2y = y12 * mint + y23 * t - out_x = out_c1x * mint + out_c2x * t - out_y = out_c1y * mint + out_c2y * t - if not handles: - return (out_x, out_y, out_c1x, out_c1y, out_c2x, out_c2y) - else: - return (out_x, out_y, out_c1x, out_c1y, out_c2x, out_c2y, x01, y01, x23, y23) - -def curvelength(x0, y0, x1, y1, x2, y2, x3, y3, n=20): - """ Returns the length of the spline. - Integrates the estimated length of the cubic bezier spline defined by x0, y0, ... x3, y3, - by adding the lengths of linear lines between points at t. - The number of points is defined by n - (n=10 would add the lengths of lines between 0.0 and 0.1, between 0.1 and 0.2, and so on). - The default n=20 is fine for most cases, usually resulting in a deviation of less than 0.01. - """ - length = 0 - xi = x0 - yi = y0 - for i in range(n): - t = 1.0 * (i+1) / n - pt_x, pt_y, pt_c1x, pt_c1y, pt_c2x, pt_c2y = \ - curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3) - c = sqrt(pow(abs(xi-pt_x),2) + pow(abs(yi-pt_y),2)) - length += c - xi = pt_x - yi = pt_y - return length - -# Fast C implementations: -try: from nodebox.ext.bezier import linepoint, linelength, curvepoint, curvelength -except: - pass - -#--- BEZIER PATH LENGTH ------------------------------------------------------------------------------ - -def segment_lengths(path, relative=False, n=20): - """ Returns a list with the lengths of each segment in the path. - """ - lengths = [] - first = True - for el in path: - if first == True: - close_x, close_y = el.x, el.y - first = False - elif el.cmd == MOVETO: - close_x, close_y = el.x, el.y - lengths.append(0.0) - elif el.cmd == CLOSE: - lengths.append(linelength(x0, y0, close_x, close_y)) - elif el.cmd == LINETO: - lengths.append(linelength(x0, y0, el.x, el.y)) - elif el.cmd == CURVETO: - x3, y3, x1, y1, x2, y2 = el.x, el.y, el.ctrl1.x, el.ctrl1.y, el.ctrl2.x, el.ctrl2.y - lengths.append(curvelength(x0, y0, x1, y1, x2, y2, x3, y3, n)) - if el.cmd != CLOSE: - x0 = el.x - y0 = el.y - if relative: - length = sum(lengths) - try: - # Relative segment lengths' sum is 1.0. - return map(lambda l: l / length, lengths) - except ZeroDivisionError: - # If the length is zero, just return zero for all segments - return [0.0] * len(lengths) - else: - return lengths - -def length(path, segmented=False, n=20): - """ Returns the length of the path. - Calculates the length of each spline in the path, using n as a number of points to measure. - When segmented is True, returns a list containing the individual length of each spline - as values between 0.0 and 1.0, defining the relative length of each spline - in relation to the total path length. - """ - if not segmented: - return sum(segment_lengths(path, n=n), 0.0) - else: - return segment_lengths(path, relative=True, n=n) - -#--- BEZIER PATH POINT ------------------------------------------------------------------------------- - -def _locate(path, t, segments=None): - """ Locates t on a specific segment in the path. - Returns (index, t, PathElement) - A path is a combination of lines and curves (segments). - The returned index indicates the start of the segment that contains point t. - The returned t is the absolute time on that segment, - in contrast to the relative t on the whole of the path. - The returned point is the last MOVETO, any subsequent CLOSETO after i closes to that point. - When you supply the list of segment lengths yourself, as returned from length(path, segmented=True), - point() works about thirty times faster in a for-loop since it doesn't need to recalculate - the length during each iteration. - """ - if segments == None: - segments = segment_lengths(path, relative=True) - if len(segments) == 0: - raise PathError, "The given path is empty" - for i, el in enumerate(path): - if i == 0 or el.cmd == MOVETO: - closeto = Point(el.x, el.y) - if t <= segments[i] or i == len(segments)-1: - break - else: - t -= segments[i] - try: t /= segments[i] - except ZeroDivisionError: - pass - if i == len(segments)-1 and segments[i] == 0: i -= 1 - return (i, t, closeto) - -def point(path, t, segments=None): - """ Returns coordinates for point at t on the path. - Gets the length of the path, based on the length of each curve and line in the path. - Determines in what segment t falls. Gets the point on that segment. - When you supply the list of segment lengths yourself, as returned from length(path, segmented=True), - point() works about thirty times faster in a for-loop since it doesn't need to recalculate - the length during each iteration. - """ - if len(path) == 0: - raise PathError, "The given path is empty" - i, t, closeto = _locate(path, t, segments=segments) - x0, y0 = path[i].x, path[i].y - p1 = path[i+1] - if p1.cmd == CLOSE: - x, y = linepoint(t, x0, y0, closeto.x, closeto.y) - return DynamicPathElement(LINETO, ((x, y),)) - elif p1.cmd == LINETO: - x1, y1 = p1.x, p1.y - x, y = linepoint(t, x0, y0, x1, y1) - return DynamicPathElement(LINETO, ((x, y),)) - elif p1.cmd == CURVETO: - # Note: the handles need to be interpreted differenty than in a BezierPath. - # In a BezierPath, ctrl1 is how the curve started, and ctrl2 how it arrives in this point. - # Here, ctrl1 is how the curve arrives, and ctrl2 how it continues to the next point. - x3, y3, x1, y1, x2, y2 = p1.x, p1.y, p1.ctrl1.x, p1.ctrl1.y, p1.ctrl2.x, p1.ctrl2.y - x, y, c1x, c1y, c2x, c2y = curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3) - return DynamicPathElement(CURVETO, ((c1x, c1y), (c2x, c2y), (x, y))) - else: - raise PathError, "Unknown cmd '%s' for p1 %s" % (p1.cmd, p1) - -def points(path, amount=100, start=0.0, end=1.0, segments=None): - """ Returns an iterator with a list of calculated points for the path. - To omit the last point on closed paths: end=1-1.0/amount - """ - if len(path) == 0: - raise PathError, "The given path is empty" - n = end - start - d = n - if amount > 1: - # The delta value is divided by amount-1, because we also want the last point (t=1.0) - # If we don't use amount-1, we fall one point short of the end. - # If amount=4, we want the point at t 0.0, 0.33, 0.66 and 1.0. - # If amount=2, we want the point at t 0.0 and 1.0. - d = float(n) / (amount-1) - for i in xrange(amount): - yield point(path, start+d*i, segments) - -#--- BEZIER PATH CONTOURS ---------------------------------------------------------------------------- - -def contours(path): - """ Returns a list of contours in the path, as BezierPath objects. - A contour is a sequence of lines and curves separated from the next contour by a MOVETO. - For example, the glyph "o" has two contours: the inner circle and the outer circle. - """ - contours = [] - current_contour = None - empty = True - for i, el in enumerate(path): - if el.cmd == MOVETO: - if not empty: - contours.append(current_contour) - current_contour = BezierPath() - current_contour.moveto(el.x, el.y) - empty = True - elif el.cmd == LINETO: - empty = False - current_contour.lineto(el.x, el.y) - elif el.cmd == CURVETO: - empty = False - current_contour.curveto(el.ctrl1.x, el.ctrl1.y, el.ctrl2.x, el.ctrl2.y, el.x, el.y) - elif el.cmd == CLOSE: - current_contour.closepath() - if not empty: - contours.append(current_contour) - return contours - -#--- BEZIER PATH FROM POINTS ------------------------------------------------------------------------- - -def findpath(points, curvature=1.0): - """ Constructs a smooth BezierPath from the given list of points. - The curvature parameter offers some control on how separate segments are stitched together: - from straight angles to smooth curves. - Curvature is only useful if the path has more than three points. - """ - - # The list of points consists of Point objects, - # but it shouldn't crash on something straightforward - # as someone supplying a list of (x,y)-tuples. - from types import TupleType - for i, pt in enumerate(points): - if type(pt) == TupleType: - points[i] = Point(pt[0], pt[1]) - - # No points: return nothing. - if len(points) == 0: return None - # One point: return a path with a single MOVETO-point. - if len(points) == 1: - path = BezierPath(None) - path.moveto(points[0].x, points[0].y) - return path - # Two points: path with a single straight line. - if len(points) == 2: - path = BezierPath(None) - path.moveto(points[0].x, points[0].y) - path.lineto(points[1].x, points[1].y) - return path - # Zero curvature means path with straight lines. - curvature = max(0, min(1, curvature)) - if curvature == 0: - path = BezierPath(None) - path.moveto(points[0].x, points[0].y) - for i in range(len(points)): - path.lineto(points[i].x, points[i].y) - return path - - # Construct the path with curves. - curvature = 4 + (1.0-curvature)*40 - - # The first point's ctrl1 and ctrl2 and last point's ctrl2 - # will be the same as that point's location; - # we cannot infer how the path curvature started or will continue. - dx = {0: 0, len(points)-1: 0} - dy = {0: 0, len(points)-1: 0} - bi = {1: -0.25} - ax = {1: (points[2].x-points[0].x-dx[0]) / 4} - ay = {1: (points[2].y-points[0].y-dy[0]) / 4} - for i in range(2, len(points)-1): - bi[i] = -1 / (curvature + bi[i-1]) - ax[i] = -(points[i+1].x-points[i-1].x-ax[i-1]) * bi[i] - ay[i] = -(points[i+1].y-points[i-1].y-ay[i-1]) * bi[i] - - r = range(1, len(points)-1) - r.reverse() - for i in r: - dx[i] = ax[i] + dx[i+1] * bi[i] - dy[i] = ay[i] + dy[i+1] * bi[i] - - path = BezierPath(None) - path.moveto(points[0].x, points[0].y) - for i in range(len(points)-1): - path.curveto(points[i].x + dx[i], - points[i].y + dy[i], - points[i+1].x - dx[i+1], - points[i+1].y - dy[i+1], - points[i+1].x, - points[i+1].y) - - return path - -#--- BEZIER PATH INSERT POINT ------------------------------------------------------------------------ - -def insert_point(path, t): - """ Inserts an extra point at t. - """ - - # Find the points before and after t on the path. - i, t, closeto = _locate(path, t) - x0 = path[i].x - y0 = path[i].y - p1 = path[i+1] - p1cmd, x3, y3, x1, y1, x2, y2 = p1.cmd, p1.x, p1.y, p1.ctrl1.x, p1.ctrl1.y, p1.ctrl2.x, p1.ctrl2.y - - # Construct the new point at t. - if p1cmd == CLOSE: - pt_cmd = LINETO - pt_x, pt_y = linepoint(t, x0, y0, closeto.x, closeto.y) - elif p1cmd == LINETO: - pt_cmd = LINETO - pt_x, pt_y = linepoint(t, x0, y0, x3, y3) - elif p1cmd == CURVETO: - pt_cmd = CURVETO - pt_x, pt_y, pt_c1x, pt_c1y, pt_c2x, pt_c2y, pt_h1x, pt_h1y, pt_h2x, pt_h2y = \ - curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3, True) - else: - raise PathError, "Locate should not return a MOVETO" - - # NodeBox for OpenGL modifies the path in place, - # NodeBox for Mac OS X returned a path copy (see inactive code below). - if pt_cmd == CURVETO: - path[i+1].ctrl1.x = pt_c2x - path[i+1].ctrl1.y = pt_c2y - path[i+1].ctrl2.x = pt_h2x - path[i+1].ctrl2.y = pt_h2y - path.insert(i+1, PathElement(cmd=CURVETO, pts=[(pt_h1x, pt_h1y), (pt_c1x, pt_c1y), (pt_x, pt_y)])) - elif pt_cmd == LINETO: - path.insert(i+1, PathElement(cmd=LINETO, pts=[(pt_x, pt_y)])) - else: - raise PathError, "Didn't expect pt_cmd %s here" % pt_cmd - return path[i+1] - - #new_path = BezierPath(None) - #new_path.moveto(path[0].x, path[0].y) - #for j in range(1, len(path)): - # if j == i+1: - # if pt_cmd == CURVETO: - # new_path.curveto(pt_h1x, pt_h1y, pt_c1x, pt_c1y, pt_x, pt_y) - # new_path.curveto(pt_c2x, pt_c2y, pt_h2x, pt_h2y, path[j].x, path[j].y) - # elif pt_cmd == LINETO: - # new_path.lineto(pt_x, pt_y) - # if path[j].cmd != CLOSE: - # new_path.lineto(path[j].x, path[j].y) - # else: - # new_path.closepath() - # else: - # raise PathError, "Didn't expect pt_cmd %s here" % pt_cmd - # else: - # if path[j].cmd == MOVETO: - # new_path.moveto(path[j].x, path[j].y) - # if path[j].cmd == LINETO: - # new_path.lineto(path[j].x, path[j].y) - # if path[j].cmd == CURVETO: - # new_path.curveto(path[j].ctrl1.x, path[j].ctrl1.y, - # path[j].ctrl2.x, path[j].ctrl2.y, - # path[j].x, path[j].y) - # if path[j].cmd == CLOSE: - # new_path.closepath() - - return new_path - -#===================================================================================================== - -#--- BEZIER ARC -------------------------------------------------------------------------------------- - -# Copyright (c) 2005-2008, Enthought, Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# -# Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# Neither the name of Enthought, Inc. nor the names of its contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -from math import acos, sin, cos, hypot, ceil, sqrt, radians, degrees - -def arc(x1, y1, x2, y2, angle=0, extent=90): - """ Compute a cubic Bezier approximation of an elliptical arc. - (x1, y1) and (x2, y2) are the corners of the enclosing rectangle. - The coordinate system has coordinates that increase to the right and down. - Angles, measured in degrees, start with 0 to the right (the positive X axis) - and increase counter-clockwise. - The arc extends from angle to angle+extent. - I.e. angle=0 and extent=180 yields an openside-down semi-circle. - The resulting coordinates are of the form (x1,y1, x2,y2, x3,y3, x4,y4) - such that the curve goes from (x1, y1) to (x4, y4) - with (x2, y2) and (x3, y3) as their respective Bezier control points. - """ - x1, y1, x2, y2 = min(x1,x2), max(y1,y2), max(x1,x2), min(y1,y2) - extent = min(max(extent, -360), 360) - n = abs(extent) <= 90 and 1 or int(ceil(abs(extent) / 90.0)) - a = float(extent) / n - cx = float(x1 + x2) / 2 - cy = float(y1 + y2) / 2 - rx = float(x2 - x1) / 2 - ry = float(y2 - y1) / 2 - a2 = radians(a) / 2 - kappa = abs(4.0 / 3 * (1 - cos(a2)) / sin(a2)) - points = [] - for i in range(n): - theta0 = radians(angle + (i+0) * a) - theta1 = radians(angle + (i+1) * a) - c0, c1 = cos(theta0), cos(theta1) - s0, s1 = sin(theta0), sin(theta1) - k = a > 0 and -kappa or kappa - points.append(( - cx + rx * c0, - cy - ry * s0, - cx + rx * (c0 + k * s0), - cy - ry * (s0 - k * c0), - cx + rx * (c1 - k * s1), - cy - ry * (s1 + k * c1), - cx + rx * c1, - cy - ry * s1 - )) - return points - -def arcto(x1, y1, rx, ry, phi, large_arc, sweep, x2, y2): - """ An elliptical arc approximated with Bezier curves or a line segment. - Algorithm taken from the SVG 1.1 Implementation Notes: - http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes - """ - - def angle(x1, y1, x2, y2): - a = degrees(acos(min(max((x1*x2 + y1*y2) / hypot(x1,y1) * hypot(x2,y2), -1), 1))) - return x1*y2 > y1*x2 and a or -a - - def abspt(x, y, cphi, sphi, mx, my): - return (x * cp - y * sp + mx, - x * sp + y * cp + my) - - if x1 == x2 and y1 == y2: - return [] - if rx == 0 or ry == 0: # Line segment. - return [(x2,y2)] - rx, ry, phi = abs(rx), abs(ry), phi % 360 - cp = cos(radians(phi)) - sp = sin(radians(phi)) - - # Rotate to the local coordinates. - dx = 0.5 * (x1 - x2) - dy = 0.5 * (y1 - y2) - x = cp * dx + sp * dy - y = -sp * dx + cp * dy - - # If rx, ry and phi are such that there is no solution - # (basically, the ellipse is not big enough to reach from (x1, y1) to (x2, y2)) - # then the ellipse is scaled up uniformly until there is exactly one solution - # (until the ellipse is just big enough). - s = (x/rx)**2 + (y/ry)**2 - if s > 1.0: - s = sqrt(s); rx, ry = rx*s, ry*s - - # Solve for the center in the local coordinates. - a = sqrt(max((rx*ry)**2 - (rx*y)**2 - (ry*x)**2, 0) / ((rx*y)**2 + (ry*x)**2)) - a = large_arc == sweep and -a or a - cx = a * rx * y / ry - cy = -a * ry * x / rx - - # Transform back. - mx = 0.5 * (x1 + x2) - my = 0.5 * (y1 + y2) - - # Compute the start angle and the angular extent of the arc. - # Note that theta is local to the phi-rotated coordinate space. - dx1 = ( x - cx) / rx - dy1 = ( y - cy) / ry - dx2 = (-x - cx) / rx - dy2 = (-y - cy) / ry - theta = angle(1.0, 0.0, dx1, dy1) - delta = angle(dx1, dy1, dx2, dy2) - if not sweep and delta > 0: delta -= 360 - if sweep and delta < 0: delta += 360 - - # Break it apart into Bezier curves. - points = [] - handles = arc(cx-rx, cy-ry, cx+rx, cy+ry, theta, delta) - for x1, y1, x2, y2, x3, y3, x4, y4 in handles: - points.append(( - abspt(x2, y2, cp, sp, mx, my) + \ - abspt(x3, y3, cp, sp, mx, my) + \ - abspt(x4, y4, cp, sp, mx, my) - )) - return points diff --git a/nodebox/graphics/context.py b/nodebox/graphics/context.py deleted file mode 100644 index 54d0f64..0000000 --- a/nodebox/graphics/context.py +++ /dev/null @@ -1,4134 +0,0 @@ -#=== CONTEXT ========================================================================================= -# 2D NodeBox API in OpenGL. -# Authors: Tom De Smedt, Frederik De Bleser -# License: BSD (see LICENSE.txt for details). -# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) -# http://cityinabottle.org/nodebox - -# All graphics are drawn directly to the screen. -# No scenegraph is kept for obvious performance reasons (therefore, no canvas._grobs as in NodeBox). - -# Debugging must be switched on or of before other modules are imported. -import pyglet -pyglet.options['debug_gl'] = False - -from pyglet.gl import * -from pyglet.image import Texture -from math import cos, sin, radians, pi, floor -from time import time -from random import seed, choice, shuffle, random as rnd -from new import instancemethod -from glob import glob -from os import path, remove -from sys import getrefcount -from StringIO import StringIO -from hashlib import md5 -from types import FunctionType -from datetime import datetime -from numbers import Number - -import geometry - -#import bezier -# Do this at the end, when we have defined BezierPath, which is needed in the bezier module. - -#import shader -# Do this when we have defined texture() and image(), which are needed in the shader module. - -# OpenGL version, e.g. "2.0 NVIDIA-1.5.48". -OPENGL = pyglet.gl.gl_info.get_version() - -#===================================================================================================== - -#--- CACHING ----------------------------------------------------------------------------------------- -# OpenGL Display Lists offer a simple way to precompile batches of OpenGL commands. -# The drawback is that the commands, once compiled, can't be modified. - -def precompile(function, *args, **kwargs): - """ Creates an OpenGL Display List from the OpenGL commands in the given function. - A Display List will precompile the commands and (if possible) store them in graphics memory. - Returns an id which can be used with precompiled() to execute the cached commands. - """ - id = glGenLists(1) - glNewList(id, GL_COMPILE) - function(*args, **kwargs) - glEndList() - return id - -def precompiled(id): - """ Executes the Display List program with the given id. - """ - glCallList(id) - -def flush(id): - """ Removes the Display List program with the given id from memory. - """ - if id is not None: - glDeleteLists(id, 1) - -#===================================================================================================== - -#--- COLOR ------------------------------------------------------------------------------------------- - -RGB = "RGB" -HSB = "HSB" -XYZ = "XYZ" -LAB = "LAB" - -_background = None # Current state background color. -_fill = None # Current state fill color. -_stroke = None # Current state stroke color. -_strokewidth = 1 # Current state strokewidth. -_strokestyle = "solid" # Current state strokestyle. -_alpha = 1 # Current state alpha transparency. - -class Color(list): - - def __init__(self, *args, **kwargs): - """ A color with R,G,B,A channels, with channel values ranging between 0.0-1.0. - Either takes four parameters (R,G,B,A), three parameters (R,G,B), - two parameters (grayscale and alpha) or one parameter (grayscale or Color object). - An optional base=1.0 parameter defines the range of the given parameters. - An optional colorspace=RGB defines the color space of the given parameters. - """ - # Values are supplied as a tuple. - if len(args) == 1 and isinstance(args[0], (list, tuple)): - args = args[0] - # R, G, B and A. - if len(args) == 4: - r, g, b, a = args[0], args[1], args[2], args[3] - # R, G and B. - elif len(args) == 3: - r, g, b, a = args[0], args[1], args[2], 1 - # Two values, grayscale and alpha. - elif len(args) == 2: - r, g, b, a = args[0], args[0], args[0], args[1] - # One value, another color object. - elif len(args) == 1 and isinstance(args[0], Color): - r, g, b, a = args[0].r, args[0].g, args[0].b, args[0].a - # One value, None. - elif len(args) == 1 and args[0] is None: - r, g, b, a = 0, 0, 0, 0 - # One value, grayscale. - elif len(args) == 1: - r, g, b, a = args[0], args[0], args[0], 1 - # No value, transparent black. - elif len(args): - r, g, b, a = 0, 0, 0, 0 - # Transform to base 1: - base = float(kwargs.get("base", 1.0)) - if base != 1: - r, g, b, a = [ch/base for ch in r, g, b, a] - # Transform to color space RGB: - colorspace = kwargs.get("colorspace") - if colorspace and colorspace != RGB: - if colorspace == HSB: r, g, b = hsb_to_rgb(r, g, b) - if colorspace == XYZ: r, g, b = xyz_to_rgb(r, g, b) - if colorspace == LAB: r, g, b = lab_to_rgb(r, g, b) - list.__init__(self, [r, g, b, a]) - self._dirty = False - - def __setitem__(self, i, v): - list.__setitem__(self, i, v) - self._dirty = True - - def _get_r(self): return self[0] - def _get_g(self): return self[1] - def _get_b(self): return self[2] - def _get_a(self): return self[3] - - def _set_r(self, v): self[0] = v - def _set_g(self, v): self[1] = v - def _set_b(self, v): self[2] = v - def _set_a(self, v): self[3] = v - - r = red = property(_get_r, _set_r) - g = green = property(_get_g, _set_g) - b = blue = property(_get_b, _set_b) - a = alpha = property(_get_a, _set_a) - - def _get_rgb(self): - return self[0], self[1], self[2] - def _set_rgb(self, (r,g,b)): - self[0] = r - self[1] = g - self[2] = b - - rgb = property(_get_rgb, _set_rgb) - - def _get_rgba(self): - return self[0], self[1], self[2], self[3] - def _set_rgba(self, (r,g,b,a)): - self[0] = r - self[1] = g - self[2] = b - self[3] = a - - rgba = property(_get_rgba, _set_rgba) - - def copy(self): - return Color(self) - - def _apply(self): - glColor4f(self[0], self[1], self[2], self[3] * _alpha) - - def __repr__(self): - return "Color(%.3f, %.3f, %.3f, %.3f)" % \ - (self[0], self[1], self[2], self[3]) - - def __eq__(self, clr): - if not isinstance(clr, Color): return False - return self[0] == clr[0] \ - and self[1] == clr[1] \ - and self[2] == clr[2] \ - and self[3] == clr[3] - - def __ne__(self, clr): - return not self.__eq__(clr) - - def map(self, base=1.0, colorspace=RGB): - """ Returns a list of R,G,B,A values mapped to the given base, - e.g. from 0-255 instead of 0.0-1.0 which is useful for setting image pixels. - Other values than RGBA can be obtained by setting the colorspace (RGB/HSB/XYZ/LAB). - """ - r, g, b, a = self - if colorspace != RGB: - if colorspace == HSB: r, g, b = rgb_to_hsb(r, g, b) - if colorspace == XYZ: r, g, b = rgb_to_xyz(r, g, b) - if colorspace == LAB: r, g, b = rgb_to_lab(r, g, b) - if base != 1: - r, g, b, a = [ch*base for ch in r, g, b, a] - if base != 1 and isinstance(base, int): - r, g, b, a = [int(ch) for ch in r, g, b, a] - return r, g, b, a - - def blend(self, clr, t=0.5, colorspace=RGB): - """ Returns a new color between the two colors. - Parameter t is the amount to interpolate between the two colors - (0.0 equals the first color, 0.5 is half-way in between, etc.) - Blending in CIE-LAB colorspace avoids "muddy" colors in the middle of the blend. - """ - ch = zip(self.map(1, colorspace)[:3], clr.map(1, colorspace)[:3]) - r, g, b = [geometry.lerp(a, b, t) for a, b in ch] - a = geometry.lerp(self.a, len(clr)==4 and clr[3] or 1, t) - return Color(r, g, b, a, colorspace=colorspace) - - def rotate(self, angle): - """ Returns a new color with it's hue rotated on the RYB color wheel. - """ - h, s, b = rgb_to_hsb(*self[:3]) - h, s, b = rotate_ryb(h, s, b, angle) - return Color(h, s, b, self.a, colorspace=HSB) - -color = Color - -def background(*args, **kwargs): - """ Sets the current background color. - """ - global _background - if args: - _background = Color(*args, **kwargs) - xywh = (GLint*4)(); glGetIntegerv(GL_VIEWPORT, xywh); x,y,w,h = xywh - rect(x, y, w, h, fill=_background, stroke=None) - return _background - -def fill(*args, **kwargs): - """ Sets the current fill color for drawing primitives and paths. - """ - global _fill - if args: - _fill = Color(*args, **kwargs) - return _fill - -fill(0) # The default fill is black. - -def stroke(*args, **kwargs): - """ Sets the current stroke color. - """ - global _stroke - if args: - _stroke = Color(*args, **kwargs) - return _stroke - -def nofill(): - """ No current fill color. - """ - global _fill - _fill = None - -def nostroke(): - """ No current stroke color. - """ - global _stroke - _stroke = None - -def strokewidth(width=None): - """ Sets the outline stroke width. - """ - # Note: strokewidth is clamped to integers (e.g. 0.2 => 1), - # but finer lines can be achieved visually with a transparent stroke. - # Thicker strokewidth results in ugly (i.e. no) line caps. - global _strokewidth - if width is not None: - _strokewidth = width - glLineWidth(width) - return _strokewidth - -SOLID = "solid" -DOTTED = "dotted" -DASHED = "dashed" - -def strokestyle(style=None): - """ Sets the outline stroke style (SOLID / DOTTED / DASHED). - """ - global _strokestyle - if style is not None and style != _strokestyle: - _strokestyle = style - glLineDash(style) - return _strokestyle - -def glLineDash(style): - if style == SOLID: - glDisable(GL_LINE_STIPPLE) - elif style == DOTTED: - glEnable(GL_LINE_STIPPLE); glLineStipple(0, 0x0101) - elif style == DASHED: - glEnable(GL_LINE_STIPPLE); glLineStipple(1, 0x000F) - -def outputmode(mode=None): - raise NotImplementedError - -def colormode(mode=None, range=1.0): - raise NotImplementedError - -#--- COLOR SPACE ------------------------------------------------------------------------------------- -# Transformations between RGB, HSB, CIE XYZ and CIE LAB color spaces. -# http://www.easyrgb.com/math.php - -def rgb_to_hsb(r, g, b): - """ Converts the given R,G,B values to H,S,B (between 0.0-1.0). - """ - h, s, v = 0, 0, max(r, g, b) - d = v - min(r, g, b) - if v != 0: - s = d / float(v) - if s != 0: - if r == v: h = 0 + (g-b) / d - elif g == v: h = 2 + (b-r) / d - else : h = 4 + (r-g) / d - h = h / 6.0 % 1 - return h, s, v - -def hsb_to_rgb(h, s, v): - """ Converts the given H,S,B color values to R,G,B (between 0.0-1.0). - """ - if s == 0: - return v, v, v - h = h % 1 * 6.0 - i = floor(h) - f = h - i - x = v * (1-s) - y = v * (1-s * f) - z = v * (1-s * (1-f)) - if i > 4: - return v, x, y - return [(v,z,x), (y,v,x), (x,v,z), (x,y,v), (z,x,v)][int(i)] - -def rgb_to_xyz(r, g, b): - """ Converts the given R,G,B values to CIE X,Y,Z (between 0.0-1.0). - """ - r, g, b = [ch > 0.04045 and ((ch+0.055) / 1.055) ** 2.4 or ch / 12.92 for ch in r, g, b] - r, g, b = [ch * 100.0 for ch in r, g, b] - r, g, b = ( # Observer = 2, Illuminant = D65 - r * 0.4124 + g * 0.3576 + b * 0.1805, - r * 0.2126 + g * 0.7152 + b * 0.0722, - r * 0.0193 + g * 0.1192 + b * 0.9505) - return r/95.047, g/100.0, b/108.883 - -def xyz_to_rgb(x, y, z): - """ Converts the given CIE X,Y,Z color values to R,G,B (between 0.0-1.0). - """ - x, y, z = x*95.047, y*100.0, z*108.883 - x, y, z = [ch / 100.0 for ch in x, y, z] - r = x * 3.2406 + y * -1.5372 + z * -0.4986 - g = x * -0.9689 + y * 1.8758 + z * 0.0415 - b = x * -0.0557 + y * -0.2040 + z * 1.0570 - r, g, b = [ch > 0.0031308 and 1.055 * ch**(1/2.4) - 0.055 or ch * 12.92 for ch in r, g, b] - return r, g, b - -def rgb_to_lab(r, g, b): - """ Converts the given R,G,B values to CIE L,A,B (between 0.0-1.0). - """ - x, y, z = rgb_to_xyz(r, g, b) - x, y, z = [ch > 0.008856 and ch**(1/3.0) or (ch*7.787) + (16/116.0) for ch in x, y, z] - l, a, b = y*116-16, 500*(x-y), 200*(y-z) - l, a, b = l/100.0, (a+86)/(86+98), (b+108)/(108+94) - return l, a, b - -def lab_to_rgb(l, a, b): - """ Converts the given CIE L,A,B color values to R,G,B (between 0.0-1.0). - """ - l, a, b = l*100, a*(86+98)-86, b*(108+94)-108 - y = (l+16)/116.0 - x = y + a/500.0 - z = y - b/200.0 - x, y, z = [ch**3 > 0.008856 and ch**3 or (ch-16/116.0)/7.787 for ch in x, y, z] - return xyz_to_rgb(x, y, z) - -def luminance(r, g, b): - """ Returns an indication (0.0-1.0) of how bright the color appears. - """ - return (r*0.2125 + g*0.7154 + b+0.0721) * 0.5 - -def darker(clr, step=0.2): - """ Returns a copy of the color with a darker brightness. - """ - h, s, b = rgb_to_hsb(clr.r, clr.g, clr.b) - r, g, b = hsb_to_rgb(h, s, max(0, b-step)) - return Color(r, g, b, len(clr)==4 and clr[3] or 1) - -def lighter(clr, step=0.2): - """ Returns a copy of the color with a lighter brightness. - """ - h, s, b = rgb_to_hsb(clr.r, clr.g, clr.b) - r, g, b = hsb_to_rgb(h, s, min(1, b+step)) - return Color(r, g, b, len(clr)==4 and clr[3] or 1) - -darken, lighten = darker, lighter - -#--- COLOR ROTATION ---------------------------------------------------------------------------------- - -# Approximation of the RYB color wheel. -# In HSB, colors hues range from 0 to 360, -# but on the color wheel these values are not evenly distributed. -# The second tuple value contains the actual value on the wheel (angle). -_colorwheel = [ - ( 0, 0), ( 15, 8), ( 30, 17), ( 45, 26), - ( 60, 34), ( 75, 41), ( 90, 48), (105, 54), - (120, 60), (135, 81), (150, 103), (165, 123), - (180, 138), (195, 155), (210, 171), (225, 187), - (240, 204), (255, 219), (270, 234), (285, 251), - (300, 267), (315, 282), (330, 298), (345, 329), (360, 360) -] - -def rotate_ryb(h, s, b, angle=180): - """ Rotates the given H,S,B color (0.0-1.0) on the RYB color wheel. - The RYB colorwheel is not mathematically precise, - but focuses on aesthetically pleasing complementary colors. - """ - h = h*360 % 360 - # Find the location (angle) of the hue on the RYB color wheel. - for i in range(len(_colorwheel)-1): - (x0, y0), (x1, y1) = _colorwheel[i], _colorwheel[i+1] - if y0 <= h <= y1: - a = geometry.lerp(x0, x1, t=(h-y0)/(y1-y0)) - break - # Rotate the angle and retrieve the hue. - a = (a+angle) % 360 - for i in range(len(_colorwheel)-1): - (x0, y0), (x1, y1) = _colorwheel[i], _colorwheel[i+1] - if x0 <= a <= x1: - h = geometry.lerp(y0, y1, t=(a-x0)/(x1-x0)) - break - return h/360.0, s, b - -def complement(clr): - """ Returns the color opposite on the color wheel. - The complementary color contrasts with the given color. - """ - if not isinstance(clr, Color): - clr = Color(clr) - return clr.rotate(180) - -def analog(clr, angle=20, d=0.1): - """ Returns a random adjacent color on the color wheel. - Analogous color schemes can often be found in nature. - """ - h, s, b = rgb_to_hsb(*clr[:3]) - h, s, b = rotate_ryb(h, s, b, angle=random(-angle,angle)) - s *= 1 - random(-d,d) - b *= 1 - random(-d,d) - return Color(h, s, b, len(clr)==4 and clr[3] or 1, colorspace=HSB) - -#--- COLOR MIXIN ------------------------------------------------------------------------------------- -# Drawing commands like rect() have optional parameters fill and stroke to set the color directly. - -def color_mixin(**kwargs): - fill = kwargs.get("fill", _fill) - stroke = kwargs.get("stroke", _stroke) - strokewidth = kwargs.get("strokewidth", _strokewidth) - strokestyle = kwargs.get("strokestyle", _strokestyle) - return (fill, stroke, strokewidth, strokestyle) - -#--- COLOR PLANE ------------------------------------------------------------------------------------- -# Not part of the standard API but too convenient to leave out. - -def colorplane(x, y, width, height, *a): - """ Draws a rectangle that emits a different fill color from each corner. - An optional number of colors can be given: - - four colors define top left, top right, bottom right and bottom left, - - three colors define top left, top right and bottom, - - two colors define top and bottom, - - no colors assumes black top and white bottom gradient. - """ - if len(a) == 2: - # Top and bottom colors. - clr1, clr2, clr3, clr4 = a[0], a[0], a[1], a[1] - elif len(a) == 4: - # Top left, top right, bottom right, bottom left. - clr1, clr2, clr3, clr4 = a[0], a[1], a[2], a[3] - elif len(a) == 3: - # Top left, top right, bottom. - clr1, clr2, clr3, clr4 = a[0], a[1], a[2], a[2] - elif len(a) == 0: - # Black top, white bottom. - clr1 = clr2 = (0,0,0,1) - clr3 = clr4 = (1,1,1,1) - glPushMatrix() - glTranslatef(x, y, 0) - glScalef(width, height, 1) - glBegin(GL_QUADS) - glColor4f(clr1[0], clr1[1], clr1[2], clr1[3] * _alpha); glVertex2f(-0.0, 1.0) - glColor4f(clr2[0], clr2[1], clr2[2], clr2[3] * _alpha); glVertex2f( 1.0, 1.0) - glColor4f(clr3[0], clr3[1], clr3[2], clr3[3] * _alpha); glVertex2f( 1.0, -0.0) - glColor4f(clr4[0], clr4[1], clr4[2], clr4[3] * _alpha); glVertex2f(-0.0, -0.0) - glEnd() - glPopMatrix() - -#===================================================================================================== - -#--- TRANSFORMATIONS --------------------------------------------------------------------------------- -# Unlike NodeBox, all transformations are CORNER-mode and originate from the bottom-left corner. - -# Example: using Transform to get a transformed path. -# t = Transform() -# t.rotate(45) -# p = BezierPath() -# p.rect(10,10,100,70) -# p = t.transform_path(p) -# p.contains(x,y) # now we can check if the mouse is in the transformed shape. -Transform = geometry.AffineTransform - -def push(): - """ Pushes the transformation state. - Subsequent transformations (translate, rotate, scale) remain in effect until pop() is called. - """ - glPushMatrix() - -def pop(): - """ Pops the transformation state. - This reverts the transformation to before the last push(). - """ - glPopMatrix() - -def translate(x, y, z=0): - """ By default, the origin of the layer or canvas is at the bottom left. - This origin point will be moved by (x,y) pixels. - """ - glTranslatef(round(x), round(y), round(z)) - -def rotate(degrees, axis=(0,0,1)): - """ Rotates the transformation state, i.e. all subsequent drawing primitives are rotated. - Rotations work incrementally: - calling rotate(60) and rotate(30) sets the current rotation to 90. - """ - glRotatef(degrees, *axis) - -def scale(x, y=None, z=None): - """ Scales the transformation state. - """ - if y is None: - y = x - if z is None: - z = 1 - glScalef(x, y, z) - -def reset(): - """ Resets the transform state of the layer or canvas. - """ - glLoadIdentity() - -CORNER = "corner" -CENTER = "center" -def transform(mode=None): - if mode == CENTER: - raise NotImplementedError, "no center-mode transform" - return CORNER - -def skew(x, y): - raise NotImplementedError - -#===================================================================================================== - -#--- DRAWING PRIMITIVES ------------------------------------------------------------------------------ -# Drawing primitives: Point, line, rect, ellipse, arrow. star. -# The fill and stroke are two different shapes put on top of each other. - -Point = geometry.Point - -def line(x0, y0, x1, y1, **kwargs): - """ Draws a straight line from x0, y0 to x1, y1 with the current stroke color and strokewidth. - """ - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - if stroke is not None and strokewidth > 0: - glColor4f(stroke[0], stroke[1], stroke[2], stroke[3] * _alpha) - glLineWidth(strokewidth) - if strokestyle != _strokestyle: - glLineDash(strokestyle) - glBegin(GL_LINES) - glVertex2f(x0, y0) - glVertex2f(x1, y1) - glEnd() - -def rect(x, y, width, height, **kwargs): - """ Draws a rectangle with the bottom left corner at x, y. - The current stroke, strokewidth and fill color are applied. - """ - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - if fill is not None: - glColor4f(fill[0], fill[1], fill[2], fill[3] * _alpha) - glRectf(x, y, x+width, y+height) - - if stroke is not None and strokewidth > 0: - glLineWidth(strokewidth) - glLineDash(strokestyle) - glColor4f(stroke[0], stroke[1], stroke[2], stroke[3] * _alpha) - # Note: this performs equally well as when using precompile(). - glBegin(GL_LINE_LOOP) - glVertex2f(x, y) - glVertex2f(x+width, y) - glVertex2f(x+width, y+height) - glVertex2f(x, y+height) - glEnd() - -def triangle(x1, y1, x2, y2, x3, y3, **kwargs): - """ Draws the triangle created by connecting the three given points. - The current stroke, strokewidth and fill color are applied. - """ - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - for i, clr in enumerate((fill, stroke)): - if clr is not None and (i==0 or strokewidth > 0): - if i == 1: - glLineWidth(strokewidth) - if strokestyle != _strokestyle: - glLineDash(strokestyle) - glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) - # Note: this performs equally well as when using precompile(). - glBegin((GL_TRIANGLES, GL_LINE_LOOP)[i]) - glVertex2f(x1, y1) - glVertex2f(x2, y2) - glVertex2f(x3, y3) - glEnd() - -_ellipses = {} -ELLIPSE_SEGMENTS = 50 -def ellipse(x, y, width, height, segments=ELLIPSE_SEGMENTS, **kwargs): - """ Draws an ellipse with the center located at x, y. - The current stroke, strokewidth and fill color are applied. - """ - if not segments in _ellipses: - # For the given amount of line segments, calculate the ellipse once. - # Then reuse the cached ellipse by scaling it to the desired size. - commands = [] - f = 2 * pi / segments - v = [(cos(t)/2, sin(t)/2) for t in [i*f for i in range(segments)+[0]]] - for mode in (GL_TRIANGLE_FAN, GL_LINE_LOOP): - commands.append(precompile(lambda:( - glBegin(mode), - [glVertex2f(x, y) for (x, y) in v], - glEnd() - ))) - - _ellipses[segments] = commands - - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - for i, clr in enumerate((fill, stroke)): - if clr is not None and (i==0 or strokewidth > 0): - if i == 1: - glLineWidth(strokewidth) - if strokestyle != _strokestyle: - glLineDash(strokestyle) - glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) - glPushMatrix() - glTranslatef(x, y, 0) - glScalef(width, height, 1) - glCallList(_ellipses[segments][i]) - glPopMatrix() - -oval = ellipse # Backwards compatibility. - -def arrow(x, y, width, **kwargs): - """ Draws an arrow with its tip located at x, y. - The current stroke, strokewidth and fill color are applied. - """ - head = width * 0.4 - tail = width * 0.2 - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - for i, clr in enumerate((fill, stroke)): - if clr is not None and (i==0 or strokewidth > 0): - if i == 1: - glLineWidth(strokewidth) - glLineDash(strokestyle) - glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) - # Note: this performs equally well as when using precompile(). - glBegin((GL_POLYGON, GL_LINE_LOOP)[i]) - glVertex2f(x, y) - glVertex2f(x-head, y+head) - glVertex2f(x-head, y+tail) - glVertex2f(x-width, y+tail) - glVertex2f(x-width, y-tail) - glVertex2f(x-head, y-tail) - glVertex2f(x-head, y-head) - glVertex2f(x, y) - glEnd() - -def gcd(a, b): - return gcd(b, a % b) if b else a - -_stars = {} #TODO: LRU? -def fast_star(x, y, points=20, outer=100, inner=50, **kwargs): - """ Draws a star with the given points, outer radius and inner radius. - The current stroke, strokewidth and fill color are applied. - """ - scale = gcd(inner, outer) - iscale = inner / scale - oscale = outer / scale - cached = _stars.get((points, iscale, oscale), []) - if not cached: - radii = [oscale, iscale] * int(points+1); radii.pop() # which radius? - f = pi / points - v = [(r*sin(i*f), r*cos(i*f)) for i, r in enumerate(radii)] - cached.append(precompile(lambda:( - glBegin(GL_TRIANGLE_FAN), - glVertex2f(0, 0), - [glVertex2f(vx, vy) for (vx, vy) in v], - glEnd() - ))) - cached.append(precompile(lambda:( - glBegin(GL_LINE_LOOP), - [glVertex2f(vx, vy) for (vx, vy) in v], - glEnd() - ))) - _stars[(points, iscale, oscale)] = cached - - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - for i, clr in enumerate((fill, stroke)): - if clr is not None and (i == 0 or strokewidth > 0): - if i == 1: - glLineWidth(strokewidth) - if strokestyle != _strokestyle: - glLineDash(strokestyle) - glColor4f(clr[0], clr[1], clr[2], clr[3] * _alpha) - glPushMatrix() - glTranslatef(x, y, 0) - glScalef(scale, scale, 1) - glCallList(cached[i]) - glPopMatrix() - -def star(x, y, points=20, outer=100, inner=50, **kwargs): - """ Draws a star with the given points, outer radius and inner radius. - The current stroke, strokewidth and fill color are applied. - This is about 20x slower than fast_star; use it only if you need the path returned. - """ - p = BezierPath(**kwargs) - p.moveto(x, y+outer) - for i in range(0, int(2*points)+1): - r = (outer, inner)[i%2] - a = pi*i/points - p.lineto(x+r*sin(a), y+r*cos(a)) - p.closepath() - - if kwargs.get("draw", True): - p.draw(**kwargs) - return p - -#===================================================================================================== - -#--- BEZIER PATH ------------------------------------------------------------------------------------- -# A BezierPath class with lineto(), curveto() and moveto() commands. -# It has all the path math functionality from NodeBox and a ray casting algorithm for contains(). -# A number of caching mechanisms are used for performance: -# drawn vertices, segment lengths, path bounds, and a hit test area for BezierPath.contains(). -# For optimal performance, the path should be created once (not every frame) and left unmodified. -# When points in the path are added, removed or modified, a _dirty flag is set. -# When dirty, the cache will be cleared and the new path recalculated. -# If the path is being drawn with a fill color, this means doing tessellation -# (i.e. additional math for finding out if parts overlap and punch a hole in the shape). - -MOVETO = "moveto" -LINETO = "lineto" -CURVETO = "curveto" -CLOSE = "close" - -RELATIVE = "relative" # Number of straight lines to represent a curve = 20% of curve length. -RELATIVE_PRECISION = 0.2 - -class PathError(Exception): - pass -class NoCurrentPointForPath(Exception): - pass -class NoCurrentPath(Exception): - pass - -class PathPoint(Point): - - def __init__(self, x=0, y=0): - """ A control handle for PathElement. - """ - self._x = x - self._y = y - self._dirty = False - - def _get_x(self): return self._x - def _set_x(self, v): - self._x = v - self._dirty = True - - def _get_y(self): return self._y - def _set_y(self, v): - self._y = v - self._dirty = True - - x = property(_get_x, _set_x) - y = property(_get_y, _set_y) - - def copy(self, parent=None): - return PathPoint(self._x, self._y) - -class PathElement(object): - - def __init__(self, cmd=None, pts=None): - """ A point in the path, optionally with control handles: - - MOVETO : the list of points contains a single (x,y)-tuple. - - LINETO : the list of points contains a single (x,y)-tuple. - - CURVETO : the list of points contains (vx1,vy1), (vx2,vy2), (x,y) tuples. - - CLOSETO : no points. - """ - if cmd == MOVETO \ - or cmd == LINETO: - pt, h1, h2 = pts[0], pts[0], pts[0] - elif cmd == CURVETO: - pt, h1, h2 = pts[2], pts[0], pts[1] - else: - pt, h1, h2 = (0,0), (0,0), (0,0) - self._cmd = cmd - self._x = pt[0] - self._y = pt[1] - self._ctrl1 = PathPoint(h1[0], h1[1]) - self._ctrl2 = PathPoint(h2[0], h2[1]) - self.__dirty = False - - def _get_dirty(self): - return self.__dirty \ - or self.ctrl1._dirty \ - or self.ctrl2._dirty - - def _set_dirty(self, b): - self.__dirty = b - self.ctrl1._dirty = b - self.ctrl2._dirty = b - - _dirty = property(_get_dirty, _set_dirty) - - @property - def cmd(self): - return self._cmd - - def _get_x(self): return self._x - def _set_x(self, v): - self._x = v - self.__dirty = True - - def _get_y(self): return self._y - def _set_y(self, v): - self._y = v - self.__dirty = True - - x = property(_get_x, _set_x) - y = property(_get_y, _set_y) - - def _get_xy(self): - return (self.x, self.y) - def _set_xy(self, (x,y)): - self.x = x - self.y = y - - xy = property(_get_xy, _set_xy) - - # Handle 1 describes now the curve from the previous point started. - def _get_ctrl1(self): return self._ctrl1 - def _set_ctrl1(self, v): - self._ctrl1 = PathPoint(v.x, v.y) - self.__dirty = True - - # Handle 2 describes how the curve from the previous point arrives in this point. - def _get_ctrl2(self): return self._ctrl2 - def _set_ctrl2(self, v): - self._ctrl2 = PathPoint(v.x, v.y) - self.__dirty = True - - ctrl1 = property(_get_ctrl1, _set_ctrl1) - ctrl2 = property(_get_ctrl2, _set_ctrl2) - - def __eq__(self, pt): - if not isinstance(pt, PathElement): return False - return self.cmd == pt.cmd \ - and self.x == pt.x \ - and self.y == pt.y \ - and self.ctrl1 == pt.ctrl1 \ - and self.ctrl2 == pt.ctrl2 - - def __ne__(self, pt): - return not self.__eq__(pt) - - def __repr__(self): - return "%s(cmd='%s', x=%.1f, y=%.1f, ctrl1=(%.1f, %.1f), ctrl2=(%.1f, %.1f))" % ( - self.__class__.__name__, self.cmd, self.x, self.y, - self.ctrl1.x, self.ctrl1.y, - self.ctrl2.x, self.ctrl2.y) - - def copy(self): - if self.cmd == MOVETO \ - or self.cmd == LINETO: - pts = ((self.x, self.y),) - elif self.cmd == CURVETO: - pts = ((self.ctrl1.x, self.ctrl1.y), (self.ctrl2.x, self.ctrl2.y), (self.x, self.y)) - else: - pts = None - return PathElement(self.cmd, pts) - -class BezierPath(list): - - def __init__(self, path=None, **kwargs): - """ A list of PathElements describing the curves and lines that make up the path. - """ - if isinstance(path, (BezierPath, list, tuple)): - self.extend([pt.copy() for pt in path]) - self._kwargs = kwargs - self._cache = None # Cached vertices for drawing. - self._segments = None # Cached segment lengths. - self._bounds = None # Cached bounding rectangle. - self._polygon = None # Cached polygon hit test area. - self._dirty = False - self._index = {} - - def copy(self): - return BezierPath(self, **self._kwargs) - - def append(self, pt): - self._dirty = True; list.append(self, pt) - def extend(self, points): - self._dirty = True; list.extend(self, points) - def insert(self, i, pt): - self._dirty = True; self._index={}; list.insert(self, i, pt) - def remove(self, pt): - self._dirty = True; self._index={}; list.remove(self, pt) - def pop(self, i): - self._dirty = True; self._index={}; list.pop(self, i) - def __setitem__(self, i, pt): - self._dirty = True; self._index={}; list.__setitem__(self, i, pt) - def __delitem__(self, i): - self._dirty = True; self._index={}; list.__delitem__(self, i) - def sort(self): - self._dirty = True; self._index={}; list.sort(self) - def reverse(self): - self._dirty = True; self._index={}; list.reverse(self) - def index(self, pt): - return self._index.setdefault(pt, list.index(self, pt)) - - def _update(self): - # Called from BezierPath.draw(). - # If points were added or removed, clear the cache. - b = self._dirty - for pt in self: b = b or pt._dirty; pt._dirty = False - if b: - if self._cache is not None: - if self._cache[0]: flush(self._cache[0]) - if self._cache[1]: flush(self._cache[1]) - self._cache = self._segments = self._bounds = self._polygon = None - self._dirty = False - - def moveto(self, x, y): - """ Adds a new point to the path at x, y. - """ - self.append(PathElement(MOVETO, ((x, y),))) - - def lineto(self, x, y): - """ Adds a line from the previous point to x, y. - """ - self.append(PathElement(LINETO, ((x, y),))) - - def curveto(self, x1, y1, x2, y2, x3, y3): - """ Adds a Bezier-curve from the previous point to x3, y3. - The curvature is determined by control handles x1, y1 and x2, y2. - """ - self.append(PathElement(CURVETO, ((x1, y1), (x2, y2), (x3, y3)))) - - def arcto(self, x, y, radius=1, clockwise=True, short=False): - """ Adds a number of Bezier-curves that draw an arc with the given radius to (x,y). - The short parameter selects either the "long way" around or the "shortcut". - """ - x0, y0 = self[-1].x, self[-1].y - phi = geometry.angle(x0,y0,x,y) - for p in bezier.arcto(x0, y0, radius, radius, phi, short, not clockwise, x, y): - f = len(p) == 2 and self.lineto or self.curveto - f(*p) - - def closepath(self): - """ Adds a line from the previous point to the last MOVETO. - """ - self.append(PathElement(CLOSE)) - - def rect(self, x, y, width, height, roundness=0.0): - """ Adds a (rounded) rectangle to the path. - Corner roundness can be given as a relative float or absolute int. - """ - if roundness <= 0: - self.moveto(x, y) - self.lineto(x+width, y) - self.lineto(x+width, y+height) - self.lineto(x, y+height) - self.lineto(x, y) - else: - if isinstance(roundness, int): - r = min(roundness, width/2, height/2) - else: - r = min(width, height) - r = min(roundness, 1) * r * 0.5 - self.moveto(x+r, y) - self.lineto(x+width-r, y) - self.arcto(x+width, y+r, radius=r, clockwise=False) - self.lineto(x+width, y+height-r) - self.arcto(x+width-r, y+height, radius=r, clockwise=False) - self.lineto(x+r, y+height) - self.arcto(x, y+height-r, radius=r, clockwise=False) - self.lineto(x, y+r) - self.arcto(x+r, y, radius=r, clockwise=False) - - def ellipse(self, x, y, width, height): - """ Adds an ellipse to the path. - """ - w, h = width*0.5, height*0.5 - k = 0.5522847498 # kappa: (-1 + sqrt(2)) / 3 * 4 - self.moveto(x, y-h) # http://www.whizkidtech.redprince.net/bezier/circle/ - self.curveto(x+w*k, y-h, x+w, y-h*k, x+w, y, ) - self.curveto(x+w, y+h*k, x+w*k, y+h, x, y+h) - self.curveto(x-w*k, y+h, x-w, y+h*k, x-w, y, ) - self.curveto(x-w, y-h*k, x-w*k, y-h, x, y-h) - self.closepath() - - oval = ellipse - - def arc(self, x, y, width, height, start=0, stop=90): - """ Adds an arc to the path. - The arc follows the ellipse defined by (x, y, width, height), - with start and stop specifying what angle range to draw. - """ - w, h = width*0.5, height*0.5 - for i, p in enumerate(bezier.arc(x-w, y-h, x+w, y+h, start, stop)): - if i == 0: - self.moveto(*p[:2]) - self.curveto(*p[2:]) - - def smooth(self, *args, **kwargs): - """ Smooths the path by making the curve handles colinear. - With mode=EQUIDISTANT, the curve handles will be of equal (average) length. - """ - e = BezierEditor(self) - for i, pt in enumerate(self): - self._index[pt] = i - e.smooth(pt, *args, **kwargs) - - def flatten(self, precision=RELATIVE): - """ Returns a list of contours, in which each contour is a list of (x,y)-tuples. - The precision determines the number of straight lines to use as a substition for a curve. - It can be a fixed number (int) or relative to the curve length (float or RELATIVE). - """ - if precision == RELATIVE: - precision = RELATIVE_PRECISION - contours = [[]] - x0, y0 = None, None - closeto = None - for pt in self: - if (pt.cmd == LINETO or pt.cmd == CURVETO) and x0 == y0 is None: - raise NoCurrentPointForPath - elif pt.cmd == LINETO: - contours[-1].append((x0, y0)) - contours[-1].append((pt.x, pt.y)) - elif pt.cmd == CURVETO: - # Curves are interpolated from a number of straight line segments. - # With relative precision, we use the (rough) curve length to determine the number of lines. - x1, y1, x2, y2, x3, y3 = pt.ctrl1.x, pt.ctrl1.y, pt.ctrl2.x, pt.ctrl2.y, pt.x, pt.y - if isinstance(precision, float): - n = int(max(0, precision) * bezier.curvelength(x0, y0, x1, y1, x2, y2, x3, y3, 3)) - else: - n = int(max(0, precision)) - if n > 0: - xi, yi = x0, y0 - for i in range(n+1): - xj, yj, vx1, vy1, vx2, vy2 = bezier.curvepoint(float(i)/n, x0, y0, x1, y1, x2, y2, x3, y3) - contours[-1].append((xi, yi)) - contours[-1].append((xj, yj)) - xi, yi = xj, yj - elif pt.cmd == MOVETO: - contours.append([]) # Start a new contour. - closeto = pt - elif pt.cmd == CLOSE and closeto is not None: - contours[-1].append((x0, y0)) - contours[-1].append((closeto.x, closeto.y)) - x0, y0 = pt.x, pt.y - return contours - - def draw(self, precision=RELATIVE, **kwargs): - """ Draws the path. - The precision determines the number of straight lines to use as a substition for a curve. - It can be a fixed number (int) or relative to the curve length (float or RELATIVE). - """ - if len(kwargs) > 0: - # Optional parameters in draw() overrule those set during initialization. - kw = dict(self._kwargs) - kw.update(kwargs) - fill, stroke, strokewidth, strokestyle = color_mixin(**kw) - else: - fill, stroke, strokewidth, strokestyle = color_mixin(**self._kwargs) - def _draw_fill(contours): - # Drawing commands for the path fill (as triangles by tessellating the contours). - v = geometry.tesselate(contours) - glBegin(GL_TRIANGLES) - for x, y in v: - glVertex3f(x, y, 0) - glEnd() - def _draw_stroke(contours): - # Drawing commands for the path stroke. - for path in contours: - glBegin(GL_LINE_STRIP) - for x, y in path: - glVertex2f(x, y) - glEnd() - self._update() # Remove the cache if points were modified. - if self._cache is None \ - or self._cache[0] is None and fill \ - or self._cache[1] is None and stroke \ - or self._cache[-1] != precision: - # Calculate and cache the vertices as Display Lists. - # If the path requires a fill color, it will have to be tessellated. - if self._cache is not None: - if self._cache[0]: flush(self._cache[0]) - if self._cache[1]: flush(self._cache[1]) - contours = self.flatten(precision) - self._cache = [None, None, precision] - if fill : self._cache[0] = precompile(_draw_fill, contours) - if stroke : self._cache[1] = precompile(_draw_stroke, contours) - if fill is not None: - glColor4f(fill[0], fill[1], fill[2], fill[3] * _alpha) - glCallList(self._cache[0]) - if stroke is not None and strokewidth > 0: - glColor4f(stroke[0], stroke[1], stroke[2], stroke[3] * _alpha) - glLineWidth(strokewidth) - glLineDash(strokestyle) - glCallList(self._cache[1]) - - def angle(self, t): - """ Returns the directional angle at time t (0.0-1.0) on the path. - """ - # The directed() enumerator is much faster but less precise. - pt0, pt1 = t==0 and (self.point(t), self.point(t+0.001)) or (self.point(t-0.001), self.point(t)) - return geometry.angle(pt0.x, pt0.y, pt1.x, pt1.y) - - def point(self, t): - """ Returns the PathElement at time t (0.0-1.0) on the path. - See the linear interpolation math in bezier.py. - """ - if self._segments is None: - self._segments = bezier.length(self, segmented=True, n=10) - return bezier.point(self, t, segments=self._segments) - - def points(self, amount=2, start=0.0, end=1.0): - """ Returns a list of PathElements along the path. - To omit the last point on closed paths: end=1-1.0/amount - """ - if self._segments is None: - self._segments = bezier.length(self, segmented=True, n=10) - return bezier.points(self, amount, start, end, segments=self._segments) - - def addpoint(self, t): - """ Inserts a new PathElement at time t (0.0-1.0) on the path. - """ - self._segments = None - self._index = {} - return bezier.insert_point(self, t) - - split = addpoint - - @property - def length(self, precision=10): - """ Returns an approximation of the total length of the path. - """ - return bezier.length(self, segmented=False, n=precision) - - @property - def contours(self): - """ Returns a list of contours (i.e. segments separated by a MOVETO) in the path. - Each contour is a BezierPath object. - """ - return bezier.contours(self) - - @property - def bounds(self, precision=100): - """ Returns a (x, y, width, height)-tuple of the approximate path dimensions. - """ - # In _update(), traverse all the points and check if they have changed. - # If so, the bounds must be recalculated. - self._update() - if self._bounds is None: - l = t = float( "inf") - r = b = float("-inf") - for pt in self.points(precision): - if pt.x < l: l = pt.x - if pt.y < t: t = pt.y - if pt.x > r: r = pt.x - if pt.y > b: b = pt.y - self._bounds = (l, t, r-l, b-t) - return self._bounds - - def contains(self, x, y, precision=100): - """ Returns True when point (x,y) falls within the contours of the path. - """ - bx, by, bw, bh = self.bounds - if bx <= x <= bx+bw and \ - by <= y <= by+bh: - if self._polygon is None \ - or self._polygon[1] != precision: - self._polygon = [(pt.x,pt.y) for pt in self.points(precision)], precision - # Ray casting algorithm: - return geometry.point_in_polygon(self._polygon[0], x, y) - return False - - def hash(self, state=None, decimal=1): - """ Returns the path id, based on the position and handles of its PathElements. - Two distinct BezierPath objects that draw the same path therefore have the same id. - """ - f = lambda x: int(x*10**decimal) # Format floats as strings with given decimal precision. - id = [state] - for pt in self: id.extend(( - pt.cmd, f(pt.x), f(pt.y), f(pt.ctrl1.x), f(pt.ctrl1.y), f(pt.ctrl2.x), f(pt.ctrl2.y))) - id = str(id) - id = md5(id).hexdigest() - return id - - def __repr__(self): - return "BezierPath(%s)" % repr(list(self)) - - def __del__(self): - # Note: it is important that __del__() is called since it unloads the cache from GPU. - # BezierPath and PathElement should contain no circular references, e.g. no PathElement.parent. - if hasattr(self, "_cache") and self._cache is not None and flush: - if self._cache[0]: flush(self._cache[0]) - if self._cache[1]: flush(self._cache[1]) - -def drawpath(path, **kwargs): - """ Draws the given BezierPath (or list of PathElements). - The current stroke, strokewidth and fill color are applied. - """ - if not isinstance(path, BezierPath): - path = BezierPath(path) - path.draw(**kwargs) - -_autoclosepath = True -def autoclosepath(close=False): - """ Paths constructed with beginpath() and endpath() are automatically closed. - """ - global _autoclosepath - _autoclosepath = close - -_path = None -def beginpath(x, y): - """ Starts a new path at (x,y). - The commands moveto(), lineto(), curveto() and closepath() - can then be used between beginpath() and endpath() calls. - """ - global _path - _path = BezierPath() - _path.moveto(x, y) - -def moveto(x, y): - """ Moves the current point in the current path to (x,y). - """ - if _path is None: - raise NoCurrentPath - _path.moveto(x, y) - -def lineto(x, y): - """ Draws a line from the current point in the current path to (x,y). - """ - if _path is None: - raise NoCurrentPath - _path.lineto(x, y) - -def curveto(x1, y1, x2, y2, x3, y3): - """ Draws a curve from the current point in the current path to (x3,y3). - The curvature is determined by control handles x1, y1 and x2, y2. - """ - if _path is None: - raise NoCurrentPath - _path.curveto(x1, y1, x2, y2, x3, y3) - -def closepath(): - """ Closes the current path with a straight line to the last MOVETO. - """ - if _path is None: - raise NoCurrentPath - _path.closepath() - -def endpath(draw=True, **kwargs): - """ Draws and returns the current path. - With draw=False, only returns the path so it can be manipulated and drawn with drawpath(). - """ - global _path, _autoclosepath - if _path is None: - raise NoCurrentPath - if _autoclosepath is True: - _path.closepath() - if draw: - _path.draw(**kwargs) - p, _path = _path, None - return p - -def findpath(points, curvature=1.0): - """ Returns a smooth BezierPath from the given list of (x,y)-tuples. - """ - return bezier.findpath(list(points), curvature) - -Path = BezierPath - -#--- BEZIER EDITOR ----------------------------------------------------------------------------------- - -EQUIDISTANT = "equidistant" -IN, OUT, BOTH = "in", "out", "both" # Drag pt1.ctrl2, pt2.ctrl1 or both simultaneously? - -class BezierEditor: - - def __init__(self, path): - self.path = path - - def _nextpoint(self, pt): - i = self.path.index(pt) # BezierPath caches this operation. - return i < len(self.path)-1 and self.path[i+1] or None - - def translate(self, pt, x=0, y=0, h1=(0,0), h2=(0,0)): - """ Translates the point and its control handles by (x,y). - Translates the incoming handle by h1 and the outgoing handle by h2. - """ - pt1, pt2 = pt, self._nextpoint(pt) - pt1.x += x - pt1.y += y - pt1.ctrl2.x += x + h1[0] - pt1.ctrl2.y += y + h1[1] - if pt2 is not None: - pt2.ctrl1.x += x + (pt2.cmd == CURVETO and h2[0] or 0) - pt2.ctrl1.y += y + (pt2.cmd == CURVETO and h2[1] or 0) - - def rotate(self, pt, angle, handle=BOTH): - """ Rotates the point control handles by the given angle. - """ - pt1, pt2 = pt, self._nextpoint(pt) - if handle == BOTH or handle == IN: - pt1.ctrl2.x, pt1.ctrl2.y = geometry.rotate(pt1.ctrl2.x, pt1.ctrl2.y, pt1.x, pt1.y, angle) - if handle == BOTH or handle == OUT and pt2 is not None and pt2.cmd == CURVETO: - pt2.ctrl1.x, pt2.ctrl1.y = geometry.rotate(pt2.ctrl1.x, pt2.ctrl1.y, pt1.x, pt1.y, angle) - - def scale(self, pt, v, handle=BOTH): - """ Scales the point control handles by the given factor. - """ - pt1, pt2 = pt, self._nextpoint(pt) - if handle == BOTH or handle == IN: - pt1.ctrl2.x, pt1.ctrl2.y = bezier.linepoint(v, pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) - if handle == BOTH or handle == OUT and pt2 is not None and pt2.cmd == CURVETO: - pt2.ctrl1.x, pt2.ctrl1.y = bezier.linepoint(v, pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y) - - def smooth(self, pt, mode=None, handle=BOTH): - pt1, pt2, i = pt, self._nextpoint(pt), self.path.index(pt) - if pt2 is None: - return - if pt1.cmd == pt2.cmd == CURVETO: - if mode == EQUIDISTANT: - d1 = d2 = 0.5 * ( - geometry.distance(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) + \ - geometry.distance(pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y)) - else: - d1 = geometry.distance(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) - d2 = geometry.distance(pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y) - if handle == IN: - a = geometry.angle(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) - if handle == OUT: - a = geometry.angle(pt2.ctrl1.x, pt2.ctrl1.y, pt1.x, pt1.y) - if handle == BOTH: - a = geometry.angle(pt2.ctrl1.x, pt2.ctrl1.y, pt1.ctrl2.x, pt1.ctrl2.y) - pt1.ctrl2.x, pt1.ctrl2.y = geometry.coordinates(pt1.x, pt1.y, d1, a) - pt2.ctrl1.x, pt2.ctrl1.y = geometry.coordinates(pt1.x, pt1.y, d2, a-180) - elif pt1.cmd == CURVETO and pt2.cmd == LINETO: - d = mode == EQUIDISTANT and \ - geometry.distance(pt1.x, pt1.y, pt2.x, pt2.y) or \ - geometry.distance(pt1.x, pt1.y, pt1.ctrl2.x, pt1.ctrl2.y) - a = geometry.angle(pt1.x, pt1.y, pt2.x, pt2.y) - pt1.ctrl2.x, pt1.ctrl2.y = geometry.coordinates(pt1.x, pt1.y, d, a-180) - elif pt1.cmd == LINETO and pt2.cmd == CURVETO and i > 0: - d = mode == EQUIDISTANT and \ - geometry.distance(pt1.x, pt1.y, self.path[i-1].x, self.path[i-1].y) or \ - geometry.distance(pt1.x, pt1.y, pt2.ctrl1.x, pt2.ctrl1.y) - a = geometry.angle(self.path[i-1].x, self.path[i-1].y, pt1.x, pt1.y) - pt2.ctrl1.x, pt2.ctrl1.y = geometry.coordinates(pt1.x, pt1.y, d, a) - -#--- POINT ANGLES ------------------------------------------------------------------------------------ - -def directed(points): - """ Returns an iterator that yields (angle, point)-tuples for the given list of points. - The angle represents the direction of the point on the path. - This works with BezierPath, Bezierpath.points, [pt1, pt2, pt2, ...] - For example: - for a, pt in directed(path.points(30)): - push() - translate(pt.x, pt.y) - rotate(a) - arrow(0, 0, 10) - pop() - This is useful if you want to have shapes following a path. - To put text on a path, rotate the angle by +-90 to get the normal (i.e. perpendicular). - """ - p = list(points) - n = len(p) - for i, pt in enumerate(p): - if 0 < i < n-1 and pt.__dict__.get("_cmd") == CURVETO: - # For a point on a curve, the control handle gives the best direction. - # For PathElement (fixed point in BezierPath), ctrl2 tells us how the curve arrives. - # For DynamicPathElement (returnd from BezierPath.point()), ctrl1 tell how the curve arrives. - ctrl = isinstance(pt, bezier.DynamicPathElement) and pt.ctrl1 or pt.ctrl2 - angle = geometry.angle(ctrl.x, ctrl.y, pt.x, pt.y) - elif 0 < i < n-1 and pt.__dict__.get("_cmd") == LINETO and p[i-1].__dict__.get("_cmd") == CURVETO: - # For a point on a line preceded by a curve, look ahead gives better results. - angle = geometry.angle(pt.x, pt.y, p[i+1].x, p[i+1].y) - elif i == 0 and isinstance(points, BezierPath): - # For the first point in a BezierPath, we can calculate a next point very close by. - pt1 = points.point(0.001) - angle = geometry.angle(pt.x, pt.y, pt1.x, pt1.y) - elif i == n-1 and isinstance(points, BezierPath): - # For the last point in a BezierPath, we can calculate a previous point very close by. - pt0 = points.point(0.999) - angle = geometry.angle(pt0.x, pt0.y, pt.x, pt.y) - elif i == n-1 and isinstance(pt, bezier.DynamicPathElement) and pt.ctrl1.x != pt.x or pt.ctrl1.y != pt.y: - # For the last point in BezierPath.points(), use incoming handle (ctrl1) for curves. - angle = geometry.angle(pt.ctrl1.x, pt.ctrl1.y, pt.x, pt.y) - elif 0 < i: - # For any point, look back gives a good result, if enough points are given. - angle = geometry.angle(p[i-1].x, p[i-1].y, pt.x, pt.y) - elif i < n-1: - # For the first point, the best (only) guess is the location of the next point. - angle = geometry.angle(pt.x, pt.y, p[i+1].x, p[i+1].y) - else: - angle = 0 - yield angle, pt - -#--- CLIPPING PATH ----------------------------------------------------------------------------------- - -class ClippingMask: - def draw(self, fill=(0,0,0,1), stroke=None): - pass - -def beginclip(path): - """ Enables the given BezierPath (or ClippingMask) as a clipping mask. - Drawing commands between beginclip() and endclip() are constrained to the shape of the path. - """ - # Enable the stencil buffer to limit the area of rendering (stenciling). - glClear(GL_STENCIL_BUFFER_BIT) - glEnable(GL_STENCIL_TEST) - glStencilFunc(GL_NOTEQUAL, 0, 0) - glStencilOp(GL_INCR, GL_INCR, GL_INCR) - # Shouldn't depth testing be disabled when stencilling? - # In any case, if it is, transparency doesn't work. - #glDisable(GL_DEPTH_TEST) - path.draw(fill=(0,0,0,1), stroke=None) # Disregard color settings; always use a black mask. - #glEnable(GL_DEPTH_TEST) - glStencilFunc(GL_EQUAL, 1, 1) - glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP) - -def endclip(): - glDisable(GL_STENCIL_TEST) - -#--- SUPERSHAPE -------------------------------------------------------------------------------------- - -def supershape(x, y, width, height, m, n1, n2, n3, points=100, percentage=1.0, range=2*pi, **kwargs): - """ Returns a BezierPath constructed using the superformula, - which can be used to describe many complex shapes and curves that are found in nature. - """ - path = BezierPath() - first = True - for i in xrange(points): - if i <= points * percentage: - dx, dy = geometry.superformula(m, n1, n2, n3, i*range/points) - dx, dy = dx*width/2 + x, dy*height/2 + y - if first is True: - path.moveto(dx, dy); first=False - else: - path.lineto(dx, dy) - path.closepath() - if kwargs.get("draw", True): - path.draw(**kwargs) - return path - -#===================================================================================================== - -#--- IMAGE ------------------------------------------------------------------------------------------- -# Textures and quad vertices are cached for performance. -# Textures remain in cache for the duration of the program. -# Quad vertices are cached as Display Lists and destroyed when the Image object is deleted. -# For optimal performance, images should be created once (not every frame) and its quads left unmodified. -# Performance should be comparable to (moving) pyglet.Sprites drawn in a batch. - -pow2 = [2**n for n in range(20)] # [1, 2, 4, 8, 16, 32, 64, ...] - -def ceil2(x): - """ Returns the nearest power of 2 that is higher than x, e.g. 700 => 1024. - """ - for y in pow2: - if y >= x: return y - -class ImageError(Exception): - pass - -_texture_cache = {} # pyglet.Texture referenced by filename. -_texture_cached = {} # pyglet.Texture.id is in keys once the image has been cached. -def texture(img, data=None): - """ Returns a (cached) texture from the given image filename or byte data. - When a Image or Pixels object is given, returns the associated texture. - """ - # Image texture stored in cache, referenced by file path (or a custom id defined with cache()). - if isinstance(img, (basestring, int)) and img in _texture_cache: - return _texture_cache[img] - # Image file path, load it, cache it, return texture. - if isinstance(img, basestring): - try: - cache(img, pyglet.image.load(img).get_texture()) - except IOError: - raise ImageError, "can't load image from %s" % repr(img) - return _texture_cache[img] - # Image texture, return original. - if isinstance(img, pyglet.image.Texture): - return img - # Image object, return image texture. - # (if you use this to create a new image, the new image will do expensive caching as well). - if isinstance(img, Image): - return img.texture - # Pixels object, return pixel texture. - if isinstance(img, Pixels): - return img.texture - # Pyglet image data. - if isinstance(img, pyglet.image.ImageData): - return img.texture - # Image data as byte string, load it, return texture. - if isinstance(data, basestring): - return pyglet.image.load("", file=StringIO(data)).get_texture() - # Don't know how to handle this image. - raise ImageError, "unknown image type: %s" % repr(img.__class__) - -def cache(id, texture): - """ Store the given texture in cache, referenced by id (which can then be passed to image()). - This is useful for procedurally rendered images (which are not stored in cache by default). - """ - if isinstance(texture, (Image, Pixels)): - texture = texture.texture - if not isinstance(texture, pyglet.image.Texture): - raise ValueError, "can only cache texture, not %s" % repr(texture.__class__.__name__) - _texture_cache[id] = texture - _texture_cached[_texture_cache[id].id] = id - -def cached(texture): - """ Returns the cache id if the texture has been cached (None otherwise). - """ - if isinstance(texture, (Image, Pixels)): - texture = texture.texture - if isinstance(texture, pyglet.image.Texture): - return _texture_cached.get(texture.texture.id) - if isinstance(texture, (basestring, int)): - return texture in _texture_cache and texture or None - return None - -def _render(texture, quad=(0,0,0,0,0,0,0,0)): - """ Renders the texture on the canvas inside a quadtriliteral (i.e. rectangle). - The quadriliteral can be distorted by giving corner offset coordinates. - """ - t = texture.tex_coords # power-2 dimensions - w = texture.width # See Pyglet programming guide -> OpenGL imaging. - h = texture.height - dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4 = quad or (0,0,0,0,0,0,0,0) - glEnable(texture.target) - glBindTexture(texture.target, texture.id) - glBegin(GL_QUADS) - glTexCoord3f(t[0], t[1], t[2] ); glVertex3f(dx4, dy4, 0) - glTexCoord3f(t[3], t[4], t[5] ); glVertex3f(dx3+w, dy3, 0) - glTexCoord3f(t[6], t[7], t[8] ); glVertex3f(dx2+w, dy2+h, 0) - glTexCoord3f(t[9], t[10], t[11]); glVertex3f(dx1, dy1+h, 0) - glEnd() - glDisable(texture.target) - -class Quad(list): - - def __init__(self, dx1=0, dy1=0, dx2=0, dy2=0, dx3=0, dy3=0, dx4=0, dy4=0): - """ Describes the four-sided polygon on which an image texture is "mounted". - This is a quadrilateral (four sides) of which the vertices do not necessarily - have a straight angle (i.e. the corners can be distorted). - """ - list.__init__(self, (dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4)) - self._dirty = True # Image objects poll Quad._dirty to check if the image cache is outdated. - - def copy(self): - return Quad(*self) - - def reset(self): - list.__init__(self, (0,0,0,0,0,0,0,0)) - self._dirty = True - - def __setitem__(self, i, v): - list.__setitem__(self, i, v) - self._dirty = True - - def _get_dx1(self): return self[0] - def _get_dy1(self): return self[1] - def _get_dx2(self): return self[2] - def _get_dy2(self): return self[3] - def _get_dx3(self): return self[4] - def _get_dy3(self): return self[5] - def _get_dx4(self): return self[6] - def _get_dy4(self): return self[7] - - def _set_dx1(self, v): self[0] = v - def _set_dy1(self, v): self[1] = v - def _set_dx2(self, v): self[2] = v - def _set_dy2(self, v): self[3] = v - def _set_dx3(self, v): self[4] = v - def _set_dy3(self, v): self[5] = v - def _set_dx4(self, v): self[6] = v - def _set_dy4(self, v): self[7] = v - - dx1 = property(_get_dx1, _set_dx1) - dy1 = property(_get_dy1, _set_dy1) - dx2 = property(_get_dx2, _set_dx2) - dy2 = property(_get_dy2, _set_dy2) - dx3 = property(_get_dx3, _set_dx3) - dy3 = property(_get_dy3, _set_dy3) - dx4 = property(_get_dx4, _set_dx4) - dy4 = property(_get_dy4, _set_dy4) - -class Image(object): - - def __init__(self, path, x=0, y=0, width=None, height=None, alpha=1.0, data=None): - """ A texture that can be drawn at a given position. - The quadrilateral in which the texture is drawn can be distorted (slow, image cache is flushed). - The image can be resized, colorized and its opacity can be set. - """ - self._src = (path, data) - self._texture = texture(path, data=data) - self._cache = None - self.x = x - self.y = y - self.width = width or self._texture.width # Scaled width, Image.texture.width yields original width. - self.height = height or self._texture.height # Scaled height, Image.texture.height yields original height. - self.quad = Quad() - self.color = Color(1.0, 1.0, 1.0, alpha) - - def copy(self, texture=None, width=None, height=None): - img = texture is None \ - and self.__class__(self._src[0], data=self._src[1]) \ - or self.__class__(texture) - img.x = self.x - img.y = self.y - img.width = self.width - img.height = self.height - img.quad = self.quad.copy() - img.color = self.color.copy() - if width is not None: - img.width = width - if height is not None: - img.height = height - return img - - @property - def id(self): - return self._texture.id - - @property - def texture(self): - return self._texture - - def _get_xy(self): - return (self.x, self.y) - def _set_xy(self, (x,y)): - self.x = x - self.y = y - - xy = property(_get_xy, _set_xy) - - def _get_size(self): - return (self.width, self.height) - def _set_size(self, (w,h)): - self.width = w - self.height = h - - size = property(_get_size, _set_size) - - def _get_alpha(self): - return self.color[3] - def _set_alpha(self, v): - self.color[3] = v - - alpha = property(_get_alpha, _set_alpha) - - def distort(self, dx1=0, dy1=0, dx2=0, dy2=0, dx3=0, dy3=0, dx4=0, dy4=0): - """ Adjusts the four-sided polygon on which an image texture is "mounted", - by incrementing the corner coordinates with the given values. - """ - for i, v in enumerate((dx1, dy1, dx2, dy2, dx3, dy3, dx4, dy4)): - if v != 0: - self.quad[i] += v - - def adjust(r=1.0, g=1.0, b=1.0, a=1.0): - """ Adjusts the image color by multiplying R,G,B,A channels with the given values. - """ - self.color[0] *= r - self.color[1] *= g - self.color[2] *= b - self.color[3] *= a - - def draw(self, x=None, y=None, width=None, height=None, alpha=None, color=None, filter=None): - """ Draws the image. - The given parameters (if any) override the image's attributes. - """ - # Calculate and cache the quad vertices as a Display List. - # If the quad has changed, update the cache. - if self._cache is None or self.quad._dirty: - flush(self._cache) - self._cache = precompile(_render, self._texture, self.quad) - self.quad._dirty = False - # Given parameters override Image attributes. - if x is None: - x = self.x - if y is None: - y = self.y - if width is None: - width = self.width - if height is None: - height = self.height - if color and len(color) < 4: - color = color[0], color[1], color[2], 1.0 - if color is None: - color = self.color - if alpha is not None: - color = color[0], color[1], color[2], alpha - if filter: - filter.texture = self._texture # Register the current texture with the filter. - filter.push() - # Round position (x,y) to nearest integer to avoid sub-pixel rendering. - # This ensures there are no visual artefacts on transparent borders (e.g. the "white halo"). - # Halo can also be avoided by overpainting in the source image, but this requires some work: - # http://technology.blurst.com/remove-white-borders-in-transparent-textures/ - x = round(x) - y = round(y) - w = float(width) / self._texture.width - h = float(height) / self._texture.height - # Transform and draw the quads. - glPushMatrix() - glTranslatef(x, y, 0) - glScalef(w, h, 0) - glColor4f(color[0], color[1], color[2], color[3] * _alpha) - glCallList(self._cache) - glPopMatrix() - if filter: - filter.pop() - - def save(self, path): - """ Exports the image as a PNG-file. - """ - self._texture.save(path) - - def __repr__(self): - return "%s(x=%.1f, y=%.1f, width=%.1f, height=%.1f, alpha=%.2f)" % ( - self.__class__.__name__, self.x, self.y, self.width, self.height, self.alpha) - - def __del__(self): - try: - if hasattr(self, "_cache") and self._cache is not None and flush: - flush(self._cache) - except: - pass - -_IMAGE_CACHE = 200 -_image_cache = {} # Image object referenced by Image.texture.id. -_image_queue = [] # Most recent id's are at the front of the list. -def image(img, x=None, y=None, width=None, height=None, - alpha=None, color=None, filter=None, data=None, draw=True): - """ Draws the image at (x,y), scaling it to the given width and height. - The image's transparency can be set with alpha (0.0-1.0). - Applies the given color adjustment, quad distortion and filter (one filter can be specified). - Note: with a filter enabled, alpha and color will not be applied. - This is because the filter overrides the default drawing behavior with its own. - """ - if not isinstance(img, Image): - # If the given image is not an Image object, create one on the fly. - # This object is cached for reuse. - # The cache has a limited size (200), so the oldest Image objects are deleted. - t = texture(img, data=data) - if t.id in _image_cache: - img = _image_cache[t.id] - else: - img = Image(img, data=data) - _image_cache[img.texture.id] = img - _image_queue.insert(0, img.texture.id) - for id in reversed(_image_queue[_IMAGE_CACHE:]): - del _image_cache[id] - del _image_queue[-1] - # Draw the image. - if draw: - img.draw(x, y, width, height, alpha, color, filter) - return img - -def imagesize(img): - """ Returns a (width, height)-tuple with the image dimensions. - """ - t = texture(img) - return (t.width, t.height) - -def crop(img, x=0, y=0, width=None, height=None): - """ Returns the given (x, y, width, height)-region from the image. - Use this to pass cropped image files to image(). - """ - t = texture(img) - if width is None: width = t.width - if height is None: height = t.height - t = t.get_region(x, y, min(t.width-x, width), min(t.height-y, height)) - if isinstance(img, Image): - img = img.copy(texture=t) - return img.copy(texture=t, width=t.width, height=t.height) - if isinstance(img, Pixels): - return Pixels(t) - if isinstance(img, pyglet.image.Texture): - return t - return Image(t) - -#--- PIXELS ------------------------------------------------------------------------------------------ - -class Pixels(list): - - def __init__(self, img): - """ A list of RGBA color values (0-255) for each pixel in the given image. - The Pixels object can be passed to the image() command. - """ - self._img = texture(img).get_image_data() - # A negative pitch means the pixels are stored top-to-bottom row. - self._flipped = self._img.pitch >= 0 - # Data yields a byte array if no conversion (e.g. BGRA => RGBA) was necessary, - # or a byte string otherwise - which needs to be converted to a list of ints. - data = self._img.get_data("RGBA", self._img.width*4 * (-1,1)[self._flipped]) - if isinstance(data, str): - data = map(ord, list(data)) - # Some formats seem to store values from -1 to -256. - data = [(256+v)%256 for v in data] - self.array = data - self._texture = None - - @property - def width(self): - return self._img.width - - @property - def height(self): - return self._img.height - - @property - def size(self): - return (self.width, self.height) - - def __len__(self): - return len(self.array) / 4 - - def __iter__(self): - for i in xrange(len(self)): - yield self[i] - - def __getitem__(self, i): - """ Returns a list of R,G,B,A channel values between 0-255 from pixel i. - Users need to wrap the list in a Color themselves for performance. - - r,g,b,a = Pixels[i] - - clr = color(Pixels[i], base=255) - """ - return self.array[i*4:i*4+4] - - def __setitem__(self, i, v): - """ Sets pixel i to the given R,G,B,A values. - Users need to unpack a Color themselves for performance, - and are resposible for keeping channes values between 0 and 255 - (otherwise an error will occur when Pixels.update() is called), - - Pixels[i] = r,g,b,a - - Pixels[i] = clr.map(base=255) - """ - for j in range(4): - self.array[i*4+j] = v[j] - - def __getslice__(self, i, j): - return [self[i+n] for n in xrange(j-i)] - - def __setslice__(self, i, j, seq): - for n in xrange(j-i): - self[i+n] = seq[n] - - def map(self, function): - """ Applies a function to each pixel. - Function takes a list of R,G,B,A channel values and must return a similar list. - """ - for i in xrange(len(self)): - self[i] = function(self[i]) - - def get(self, i, j): - """ Returns the pixel at row i, column j as a Color object. - """ - if 0 <= i < self.width and 0 <= j < self.height: - return color(self[i+j*self.width], base=255) - - def set(self, i, j, clr): - """ Sets the pixel at row i, column j from a Color object. - """ - if 0 <= i < self.width and 0 <= j < self.height: - self[i+j*self.width] = clr.map(base=255) - - def update(self): - """ Pixels.update() must be called to refresh the image. - """ - data = self.array - data = "".join(map(chr, data)) - self._img.set_data("RGBA", self._img.width*4*(-1,1)[self._flipped], data) - self._texture = self._img.get_texture() - - @property - def texture(self): - if self._texture is None: - self.update() - return self._texture - - def copy(self): - return Pixels(self.texture) - - def __repr__(self): - return "%s(width=%.1f, height=%.1f)" % ( - self.__class__.__name__, self.width, self.height) - -pixels = Pixels - -#--- ANIMATION --------------------------------------------------------------------------------------- -# A sequence of images displayed in a loop. -# Useful for storing pre-rendered effect frames like explosions etc. - -class Animation(list): - - def __init__(self, images=[], duration=None, loop=False, **kwargs): - """ Constructs an animation loop from the given image frames. - The duration specifies the time for the entire animation to run. - Animations are useful to cache effects like explosions, - that have for example been prepared in an offscreen buffer. - """ - list.__init__(self, list(images)) - self.duration = duration # Duration of the entire animation. - self.loop = loop # Loop from last frame to first frame? - self._i = -1 # Frame counter. - self._t = Transition(0, interpolation=kwargs.get("interpolation", LINEAR)) - - def copy(self, **kwargs): - return Animation(self, - duration = kwargs.get("duration", self.duration), - loop = kwargs.get("loop", self.loop), - interpolation = self._t._interpolation) - - def update(self): - if self.duration is not None: - # With a duration, - # skip to a next frame so that the entire animation takes the given time. - if self._i < 0 or self.loop and self._i == len(self)-1: - self._t.set(0, 0) - self._t.update() - self._t.set(len(self)-1, self.duration) - self._t.update() - self._i = int(self._t.current) - else: - # Without a duration, - # Animation.update() simply moves to the next frame. - if self._i < 0 or self.loop and self._i == len(self)-1: - self._i = -1 - self._i = min(self._i+1, len(self)-1) - - @property - def frames(self): - return self - - @property - def frame(self): - # Yields the current frame Image (or None). - try: return self[self._i] - except: - return None - - @property - def done(self): - # Yields True when the animation has stopped (or hasn't started). - return self.loop is False and self._i == len(self)-1 - - def draw(self, *args, **kwargs): - if not self.done: - image(self.frame, *args, **kwargs) - - def __repr__(self): - return "%s(frames=%i, duration=%s)" % ( - self.__class__.__name__, len(self), repr(self.duration)) - -animation = Animation - -#--- OFFSCREEN RENDERING ----------------------------------------------------------------------------- -# Offscreen buffers can be used to render images from paths etc. -# or to apply filters on images before drawing them to the screen. -# There are several ways to draw offscreen: -# - render(img, filter): applies the given filter to the image and returns it. -# - procedural(function, width, height): execute the drawing commands in function inside an image. -# - Create your own subclass of OffscreenBuffer with a draw() method: -# class MyBuffer(OffscreenBuffer): -# def draw(self): pass -# - Define drawing commands between OffscreenBuffer.push() and pop(): -# b = MyBuffer() -# b.push() -# # drawing commands -# b.pop() -# img = Image(b.render()) -# -# The shader.py module already defines several filters that use an offscreen buffer, for example: -# blur(), adjust(), multiply(), twirl(), ... -# -# The less you change about an offscreen buffer, the faster it runs. -# This includes switching it on and off and changing its size. - -from shader import * - -#===================================================================================================== - -#--- FONT -------------------------------------------------------------------------------------------- - -def install_font(ttf): - """ Loads the given TrueType font from file, and returns True on success. - """ - try: - pyglet.font.add_file(ttf) - return True - except: - # This might fail with Carbon on 64-bit Mac systems. - # Fonts can be installed on the system manually if this is the case. - return False - -# Load the platform-independent fonts shipped with NodeBox. -# The default font is Droid (licensed under Apache 2.0). -try: - for f in glob(path.join(path.dirname(__file__), "..", "font", "*")): - install_font(f) - DEFAULT_FONT = "Droid Sans" -except: - DEFAULT_FONT = "Arial" - -# Font weight -NORMAL = "normal" -BOLD = "bold" -ITALIC = "italic" - -# Text alignment -LEFT = "left" -RIGHT = "right" -CENTER = "center" - -_fonts = [] # Custom fonts loaded from file. -_fontname = DEFAULT_FONT # Current state font name. -_fontsize = 12 # Current state font size. -_fontweight = [False, False] # Current state font weight (bold, italic). -_lineheight = 1.0 # Current state text lineheight. -_align = LEFT # Current state text alignment (LEFT/RIGHT/CENTER). - -def font(fontname=None, fontsize=None, fontweight=None, file=None): - """ Sets the current font and/or fontsize. - If a filename is also given, loads the fontname from the given font file. - """ - global _fontname, _fontsize - if file is not None and file not in _fonts: - _fonts.append(file); install_font(file) - if fontname is not None: - _fontname = fontname - if fontsize is not None: - _fontsize = fontsize - if fontweight is not None: - _fontweight_(fontweight) # _fontweight_() is just an alias for fontweight(). - return _fontname - -def fontname(name=None): - """ Sets the current font used when drawing text. - """ - global _fontname - if name is not None: - _fontname = name - return _fontname - -def fontsize(size=None): - """ Sets the current fontsize in points. - """ - global _fontsize - if size is not None: - _fontsize = size - return _fontsize - -def fontweight(*args, **kwargs): - """ Sets the current font weight. - You can supply NORMAL, BOLD and/or ITALIC or set named parameters bold=True and/or italic=True. - """ - global _fontweight - if len(args) == 1 and isinstance(args, (list, tuple)): - args = args[0] - if NORMAL in args: - _fontweight = [False, False] - if BOLD in args or kwargs.get(BOLD): - _fontweight[0] = True - if ITALIC in args or kwargs.get(ITALIC): - _fontweight[1] = True - return _fontweight - -_fontweight_ = fontweight - -def lineheight(size=None): - """ Sets the vertical spacing between lines of text. - The given size is a relative value: lineheight 1.2 for fontsize 10 means 12. - """ - global _lineheight - if size is not None: - _lineheight = size - return _lineheight - -def align(mode=None): - """ Sets the alignment of text paragrapgs (LEFT, RIGHT or CENTER). - """ - global _align - if mode is not None: - _align = mode - return _align - -#--- FONT MIXIN -------------------------------------------------------------------------------------- -# The text() command has optional parameters font, fontsize, fontweight, bold, italic, lineheight and align. - -def font_mixin(**kwargs): - fontname = kwargs.get("fontname", kwargs.get("font", _fontname)) - fontsize = kwargs.get("fontsize", _fontsize) - bold = kwargs.get("bold", BOLD in kwargs.get("fontweight", "") or _fontweight[0]) - italic = kwargs.get("italic", ITALIC in kwargs.get("fontweight", "") or _fontweight[1]) - lineheight = kwargs.get("lineheight", _lineheight) - align = kwargs.get("align", _align) - return (fontname, fontsize, bold, italic, lineheight, align) - -#--- TEXT -------------------------------------------------------------------------------------------- -# Text is cached for performance. -# For optimal performance, texts should be created once (not every frame) and left unmodified. -# Dynamic texts use a cache of recycled Text objects. - -# pyglet.text.Label leaks memory when deleted, because its old batch continues to reference -# loaded font/fontsize/bold/italic glyphs. -# Adding all labels to our own batch remedies this. -_label_batch = pyglet.graphics.Batch() - -def label(str="", width=None, height=None, **kwargs): - """ Returns a drawable pyglet.text.Label object from the given string. - Optional arguments include: font, fontsize, bold, italic, align, lineheight, fill. - If these are omitted the current state is used. - """ - fontname, fontsize, bold, italic, lineheight, align = font_mixin(**kwargs) - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - fill = fill is None and (0,0,0,0) or fill - # We use begin_update() so that the TextLayout doesn't refresh on each update. - # FormattedDocument allows individual styling of characters - see Text.style(). - label = pyglet.text.Label(batch=_label_batch) - label.begin_update() - label.document = pyglet.text.document.FormattedDocument(str or " ") - label.width = width - label.height = height - label.font_name = fontname - label.font_size = fontsize - label.bold = bold - label.italic = italic - label.multiline = True - label.anchor_y = "bottom" - label.set_style("align", align) - label.set_style("line_spacing", lineheight * fontsize) - label.color = [int(ch*255) for ch in fill] - if str == "": - # Empty string "" does not set properties so we used " " first. - label.text = str - label.end_update() - return label - -class Text(object): - - def __init__(self, str, x=0, y=0, width=None, height=None, **kwargs): - """ A formatted string of text that can be drawn at a given position. - Text has the following properties: - text, x, y, width, height, font, fontsize, bold, italic, lineheight, align, fill. - Individual character ranges can be styled with Text.style(). - """ - if width is None: - # Supplying a string with "\n" characters will crash if no width is given. - # On the outside it appears as None but inside we use a very large number. - width = geometry.INFINITE - a, kwargs["align"] = kwargs.get("align", _align), LEFT - else: - a = None - self.__dict__["x"] = x - self.__dict__["y"] = y - self.__dict__["_label"] = label(str, width, height, **kwargs) - self.__dict__["_dirty"] = False - self.__dict__["_align"] = a - self.__dict__["_fill"] = None - - def _get_xy(self): - return (self.x, self.y) - def _set_xy(self, (x,y)): - self.x = x - self.y = y - - xy = property(_get_xy, _set_xy) - - def _get_size(self): - return (self.width, self.height) - def _set_size(self, (w,h)): - self.width = w - self.height = h - - size = property(_get_size, _set_size) - - def __getattr__(self, k): - if k in self.__dict__: - return self.__dict__[k] - elif k in ("text", "height", "bold", "italic"): - return getattr(self._label, k) - elif k == "string": - return self._label.text - elif k == "width": - if self._label.width != geometry.INFINITE: return self._label.width - elif k in ("font", "fontname"): - return self._label.font_name - elif k == "fontsize": - return self._label.font_size - elif k == "fontweight": - return ((None, BOLD)[self._label.bold], (None, ITALIC)[self._label.italic]) - elif k == "lineheight": - return self._label.get_style("line_spacing") / (self.fontsize or 1) - elif k == "align": - if not self._align: self._align = self._label.get_style(k) - return self._align - elif k == "fill": - if not self._fill: self._fill = Color([ch/255.0 for ch in self._label.color]) - return self._fill - else: - raise AttributeError, "'Text' object has no attribute '%s'" % k - - def __setattr__(self, k, v): - if k in self.__dict__: - self.__dict__[k] = v; return - # Setting properties other than x and y requires the label's layout to be updated. - self.__dict__["_dirty"] = True - self._label.begin_update() - if k in ("text", "height", "bold", "italic"): - setattr(self._label, k, v) - elif k == "string": - self._label.text = v - elif k == "width": - self._label.width = v is None and geometry.INFINITE or v - elif k in ("font", "fontname"): - self._label.font_name = v - elif k == "fontsize": - self._label.font_size = v - elif k == "fontweight": - self._label.bold, self._label.italic = BOLD in v, ITALIC in v - elif k == "lineheight": - self._label.set_style("line_spacing", v * (self.fontsize or 1)) - elif k == "align": - self._align = v - self._label.set_style(k, self._label.width == geometry.INFINITE and LEFT or v) - elif k == "fill": - self._fill = v - self._label.color = [int(255*ch) for ch in self._fill or (0,0,0,0)] - else: - raise AttributeError, "'Text' object has no attribute '%s'" % k - - def _update(self): - # Called from Text.draw(), Text.copy() and Text.metrics. - # Ensures that all the color changes have been reflected in Text._label. - # If necessary, recalculates the label's layout (happens in end_update()). - if hasattr(self._fill, "_dirty") and self._fill._dirty: - self.fill = self._fill - self._fill._dirty = False - if self._dirty: - self._label.end_update() - self._dirty = False - - @property - def path(self): - raise NotImplementedError - - @property - def metrics(self): - """ Yields a (width, height)-tuple of the actual text content. - """ - self._update() - return self._label.content_width, self._label.content_height - - def draw(self, x=None, y=None): - """ Draws the text. - """ - # Given parameters override Text attributes. - if x is None: - x = self.x - if y is None: - y = self.y - # Fontsize is rounded, and fontsize 0 will output a default font. - # Therefore, we don't draw text with a fontsize smaller than 0.5. - if self._label.font_size >= 0.5: - glPushMatrix() - glTranslatef(x, y, 0) - self._update() - self._label.draw() - glPopMatrix() - - def copy(self): - self._update() - txt = Text(self.text, self.x, self.y, self.width, self.height, - fontname = self.fontname, - fontsize = self.fontsize, - bold = self.bold, - italic = self.italic, - lineheight = self.lineheight, - align = self.align, - fill = self.fill - ) - # The individual character styling is retrieved from Label.document._style_runs. - # Traverse it and set the styles in the new text. - txt._label.begin_update() - for k in self._label.document._style_runs: - for i, j, v in self._label.document._style_runs[k]: - txt.style(i,j, **{k:v}) - txt._label.end_update() - return txt - - def style(self, i, j, **kwargs): - """ Defines the styling for a range of characters in the text. - Valid arguments can include: font, fontsize, bold, italic, lineheight, align, fill. - For example: text.style(0, 10, bold=True, fill=color(1,0,0)) - """ - attributes = {} - for k,v in kwargs.items(): - if k in ("font", "fontname"): - attributes["font_name"] = v - elif k == "fontsize": - attributes["font_size"] = v - elif k in ("bold", "italic", "align"): - attributes[k] = v - elif k == "fontweight": - attributes.setdefault("bold", BOLD in v) - attributes.setdefault("italic", ITALIC in v) - elif k == "lineheight": - attributes["line_spacing"] = v * self._label.font_size - elif k == "fill": - attributes["color"] = [int(ch*255) for ch in v] - else: - attributes[k] = v - self._dirty = True - self._label.begin_update() - self._label.document.set_style(i, j, attributes) - - def __len__(self): - return len(self.text) - - def __del__(self): - if hasattr(self, "_label") and self._label: - self._label.delete() - -_TEXT_CACHE = 200 -_text_cache = {} -_text_queue = [] -def text(str, x=None, y=None, width=None, height=None, draw=True, **kwargs): - """ Draws the string at the given position, with the current font(). - Lines of text will span the given width before breaking to the next line. - The text will be displayed with the current state font(), fontsize(), fontweight(), etc. - When the given text is a Text object, the state will not be applied. - """ - if isinstance(str, Text) and width is None and height is None and len(kwargs) == 0: - txt = str - else: - # If the given text is not a Text object, create one on the fly. - # Dynamic Text objects are cached by (font, fontsize, bold, italic), - # and those that are no longer referenced by the user are recycled. - # Changing Text properties is still faster than creating a new Text. - # The cache has a limited size (200), so the oldest Text objects are deleted. - fontname, fontsize, bold, italic, lineheight, align = font_mixin(**kwargs) - fill, stroke, strokewidth, strokestyle = color_mixin(**kwargs) - id = (fontname, int(fontsize), bold, italic) - recycled = False - if id in _text_cache: - for txt in _text_cache[id]: - # Reference count 3 => Python, _text_cache[id], txt. - # No other variables are referencing the text, so we can recycle it. - if getrefcount(txt) == 3: - txt.text = str - txt.x = x or 0 - txt.y = y or 0 - txt.width = width - txt.height = height - txt.lineheight = lineheight - txt.align = align - txt.fill = fill - recycled = True - break - if not recycled: - txt = Text(str, x or 0, y or 0, width, height, **kwargs) - _text_cache.setdefault(id, []) - _text_cache[id].append(txt) - _text_queue.insert(0, id) - for id in reversed(_text_queue[_TEXT_CACHE:]): - del _text_cache[id][0] - del _text_queue[-1] - if draw: - txt.draw(x, y) - return txt - -def textwidth(txt, **kwargs): - """ Returns the width of the given text. - """ - if not isinstance(txt, Text) or len(kwargs) > 0: - kwargs["draw"] = False - txt = text(txt, 0, 0, **kwargs) - return txt.metrics[0] - -def textheight(txt, width=None, **kwargs): - """ Returns the height of the given text. - """ - if not isinstance(txt, Text) or len(kwargs) > 0 or width != txt.width: - kwargs["draw"] = False - txt = text(txt, 0, 0, width=width, **kwargs) - return txt.metrics[1] - -def textmetrics(txt, width=None, **kwargs): - """ Returns a (width, height)-tuple for the given text. - """ - if not isinstance(txt, Text) or len(kwargs) > 0 or width != txt.width: - kwargs["draw"] = False - txt = text(txt, 0, 0, width=width, **kwargs) - return txt.metrics - -#--- TEXTPATH ---------------------------------------------------------------------------------------- - -class GlyphPathError(Exception): - pass - -import cPickle -glyphs = {} -try: - # Load cached font glyph path information from nodebox/font/glyph.p. - # By default, it has glyph path info for Droid Sans, Droid Sans Mono, Droid Serif. - glyphs = path.join(path.dirname(__file__), "..", "font", "glyph.p") - glyphs = cPickle.load(open(glyphs)) -except: - pass - -def textpath(string, x=0, y=0, **kwargs): - """ Returns a BezierPath from the given text string. - The fontname, fontsize and fontweight can be given as optional parameters, - width, height, lineheight and align are ignored. - Only works with ASCII characters in the default fonts (Droid Sans, Droid Sans Mono, Droid Serif, Arial). - See nodebox/font/glyph.py on how to activate other fonts. - """ - fontname, fontsize, bold, italic, lineheight, align = font_mixin(**kwargs) - w = bold and italic and "bold italic" or bold and "bold" or italic and "italic" or "normal" - p = BezierPath() - f = fontsize / 1000.0 - for ch in string: - try: glyph = glyphs[fontname][w][ch] - except: - raise GlyphPathError, "no glyph path information for %s %s '%s'" % (w, fontname, ch) - for pt in glyph: - if pt[0] == MOVETO: - p.moveto(x+pt[1]*f, y-pt[2]*f) - elif pt[0] == LINETO: - p.lineto(x+pt[1]*f, y-pt[2]*f) - elif pt[0] == CURVETO: - p.curveto(x+pt[3]*f, y-pt[4]*f, x+pt[5]*f, y-pt[6]*f, x+pt[1]*f, y-pt[2]*f) - elif pt[0] == CLOSE: - p.closepath() - x += textwidth(ch, font=fontname, fontsize=fontsize, bold=bold, italic=italic) - return p - -#===================================================================================================== - -#--- UTILITIES --------------------------------------------------------------------------------------- - -_RANDOM_MAP = [90.0, 9.00, 4.00, 2.33, 1.50, 1.00, 0.66, 0.43, 0.25, 0.11, 0.01] -def _rnd_exp(bias=0.5): - bias = max(0, min(bias, 1)) * 10 - i = int(floor(bias)) # bias*10 => index in the _map curve. - n = _RANDOM_MAP[i] # If bias is 0.3, rnd()**2.33 will average 0.3. - if bias < 10: - n += (_RANDOM_MAP[i+1]-n) * (bias-i) - return n - -def random(v1=1.0, v2=None, bias=None): - """ Returns a number between v1 and v2, including v1 but not v2. - The bias (0.0-1.0) represents preference towards lower or higher numbers. - """ - if v2 is None: - v1, v2 = 0, v1 - if bias is None: - r = rnd() - else: - r = rnd()**_rnd_exp(bias) - x = r * (v2-v1) + v1 - if isinstance(v1, int) and isinstance(v2, int): - x = int(x) - return x - -def grid(cols, rows, colwidth=1, rowheight=1, shuffled=False): - """ Yields (x,y)-tuples for the given number of rows and columns. - The space between each point is determined by colwidth and colheight. - """ - rows = range(int(rows)) - cols = range(int(cols)) - if shuffled: - shuffle(rows) - shuffle(cols) - for y in rows: - for x in cols: - yield (x*colwidth, y*rowheight) - -def files(path="*"): - """ Returns a list of files found at the given path. - """ - return glob(path) - -#===================================================================================================== - -#--- PROTOTYPE ---------------------------------------------------------------------------------------- - -class Prototype(object): - - def __init__(self): - """ A base class that allows on-the-fly extension. - This means that external functions can be bound to it as methods, - and properties set at runtime are copied correctly. - Prototype can handle: - - functions (these become class methods), - - immutable types (str, unicode, int, long, float, bool), - - lists, tuples and dictionaries of immutable types, - - objects with a copy() method. - """ - self._dynamic = {} - - def _deepcopy(self, value): - if isinstance(value, FunctionType): - return instancemethod(value, self) - elif hasattr(value, "copy"): - return value.copy() - elif isinstance(value, (list, tuple)): - return [self._deepcopy(x) for x in value] - elif isinstance(value, dict): - return dict([(k, self._deepcopy(v)) for k,v in value.items()]) - elif isinstance(value, (str, unicode, int, long, float, bool)): - return value - else: - # Biggest problem here is how to find/relink circular references. - raise TypeError, "Prototype can't bind %s." % str(value.__class__) - - def _bind(self, key, value): - """ Adds a new method or property to the prototype. - For methods, the given function is expected to take the object (i.e. self) as first parameter. - For properties, values can be: list, tuple, dict, str, unicode, int, long, float, bool, - or an object with a copy() method. - For example, we can define a Layer's custom draw() method in two ways: - - By subclassing: - class MyLayer(Layer): - def draw(layer): - pass - layer = MyLayer() - layer.draw() - - By function binding: - def my_draw(layer): - pass - layer = Layer() - layer._bind("draw", my_draw) - layer.draw() - """ - self._dynamic[key] = value - object.__setattr__(self, key, self._deepcopy(value)) - - def set_method(self, function, name=None): - """ Creates a dynamic method (with the given name) from the given function. - """ - if not name: - name = function.__name__ - self._bind(name, function) - - def set_property(self, key, value): - """ Adds a property to the prototype. - Using this method ensures that dynamic properties are copied correctly - see inherit(). - """ - self._bind(key, value) - - def inherit(self, prototype): - """ Inherit all the dynamic properties and methods of another prototype. - """ - for k,v in prototype._dynamic.items(): - self._bind(k,v) - -#===================================================================================================== - -#--- EVENT HANDLER ------------------------------------------------------------------------------------ - -class EventHandler: - - def __init__(self): - # Use __dict__ directly so we can do multiple inheritance in combination with Prototype: - self.__dict__["enabled"] = True # Receive events from the canvas? - self.__dict__["focus"] = False # True when this object receives the focus. - self.__dict__["pressed"] = False # True when the mouse is pressed on this object. - self.__dict__["dragged"] = False # True when the mouse is dragged on this object. - self.__dict__["_queue"] = [] - - def on_mouse_enter(self, mouse): - pass - def on_mouse_leave(self, mouse): - pass - def on_mouse_motion(self, mouse): - pass - def on_mouse_press(self, mouse): - pass - def on_mouse_release(self, mouse): - pass - def on_mouse_drag(self, mouse): - pass - def on_mouse_scroll(self, mouse): - pass - - def on_key_press(self, keys): - pass - def on_key_release(self, keys): - pass - - # Instead of calling an event directly it could be queued, - # e.g. layer.queue_event(layer.on_mouse_press, canvas.mouse). - # layer.process_events() can then be called whenever desired, - # e.g. after the canvas has been drawn so that events can contain drawing commands. - def queue_event(self, event, *args): - self._queue.append((event, args)) - def process_events(self): - for event, args in self._queue: - event(*args) - self._queue = [] - - # Note: there is no event propagation. - # Event propagation means that, for example, if a layer is pressed - # all its child (or parent) layers receive an on_mouse_press() event as well. - # If this kind of behavior is desired, it is the responsibility of custom subclasses of Layer. - -#===================================================================================================== - -#--- TRANSITION -------------------------------------------------------------------------------------- -# Transition.update() will tween from the last value to transition.set() new value in the given time. -# Transitions are used as attributes (e.g. position, rotation) for the Layer class. - -TIME = 0 # the current time in this frame changes when the canvas is updated - -LINEAR = "linear" -SMOOTH = "smooth" - -class Transition(object): - - def __init__(self, value, interpolation=SMOOTH): - self._v0 = value # Previous value => Transition.start. - self._vi = value # Current value => Transition.current. - self._v1 = value # Desired value => Transition.stop. - self._t0 = TIME # Start time. - self._t1 = TIME # End time. - self._interpolation = interpolation - - def copy(self): - t = Transition(None) - t._v0 = self._v0 - t._vi = self._vi - t._v1 = self._v1 - t._t0 = self._t0 - t._t1 = self._t1 - t._interpolation = self._interpolation - return t - - def get(self): - """ Returns the transition stop value. - """ - return self._v1 - - def set(self, value, duration=1.0): - """ Sets the transition stop value, which will be reached in the given duration (seconds). - Calling Transition.update() moves the Transition.current value toward Transition.stop. - """ - if duration == 0: - # If no duration is given, Transition.start = Transition.current = Transition.stop. - self._vi = value - self._v1 = value - self._v0 = self._vi - self._t0 = TIME # Now. - self._t1 = TIME + duration - - @property - def start(self): - return self._v0 - @property - def stop(self): - return self._v1 - @property - def current(self): - return self._vi - - @property - def done(self): - return TIME >= self._t1 - - def update(self): - """ Calculates the new current value. Returns True when done. - The transition approaches the desired value according to the interpolation: - - LINEAR: even transition over the given duration time, - - SMOOTH: transition goes slower at the beginning and end. - """ - if TIME >= self._t1 or self._vi is None: - self._vi = self._v1 - return True - else: - # Calculate t: the elapsed time as a number between 0.0 and 1.0. - t = (TIME-self._t0) / (self._t1-self._t0) - if self._interpolation == LINEAR: - self._vi = self._v0 + (self._v1-self._v0) * t - else: - self._vi = self._v0 + (self._v1-self._v0) * geometry.smoothstep(0.0, 1.0, t) - return False - -#--- LAYER ------------------------------------------------------------------------------------------- -# The Layer class is responsible for the following: -# - it has a draw() method to override; all sorts of NodeBox drawing commands can be put here, -# - it has a transformation origin point and rotates/scales its drawn items as a group, -# - it has child layers that transform relative to this layer, -# - when its attributes (position, scale, angle, ...) change, they will tween smoothly over time. - -_UID = 0 -def _uid(): - global _UID; _UID+=1; return _UID - -RELATIVE = "relative" # Origin point is stored as float, e.g. (0.5, 0.5). -ABSOLUTE = "absolute" # Origin point is stored as int, e.g. (100, 100). - -class LayerRenderError(Exception): - pass - -# When Layer.clipped=True, children are clipped to the bounds of the layer. -# The layer clipping masks lazily changes size with the layer. -class LayerClippingMask(ClippingMask): - def __init__(self, layer): - self.layer = layer - def draw(self, fill=(0,0,0,1), stroke=None): - w = not self.layer.width and geometry.INFINITE or self.layer.width - h = not self.layer.height and geometry.INFINITE or self.layer.height - rect(0, 0, w, h, fill=fill, stroke=stroke) - -class Layer(list, Prototype, EventHandler): - - def __init__(self, x=0, y=0, width=None, height=None, origin=(0,0), - scale=1.0, rotation=0, opacity=1.0, duration=0.0, name=None, - parent=None, **kwargs): - """ Creates a new drawing layer that can be appended to the canvas. - The duration defines the time (seconds) it takes to animate transformations or opacity. - When the animation has terminated, layer.done=True. - """ - if origin == CENTER: - origin = (0.5,0.5) - origin_mode = RELATIVE - elif isinstance(origin[0], float) \ - and isinstance(origin[1], float): - origin_mode = RELATIVE - else: - origin_mode = ABSOLUTE - Prototype.__init__(self) # Facilitates extension on the fly. - EventHandler.__init__(self) - self._id = _uid() - self.name = name # Layer name. Layers are accessible as ParentLayer.[name] - self.canvas = None # The canvas this layer is drawn to. - self.parent = parent # The layer this layer is a child of. - self._x = Transition(x) # Layer horizontal position in pixels, from the left. - self._y = Transition(y) # Layer vertical position in pixels, from the bottom. - self._width = Transition(width) # Layer width in pixels. - self._height = Transition(height) # Layer height in pixels. - self._dx = Transition(origin[0]) # Transformation origin point. - self._dy = Transition(origin[1]) # Transformation origin point. - self._origin = origin_mode # Origin point as RELATIVE or ABSOLUTE coordinates? - self._scale = Transition(scale) # Layer width and height scale. - self._rotation = Transition(rotation) # Layer rotation. - self._opacity = Transition(opacity) # Layer opacity. - self.duration = duration # The time it takes to animate transformations. - self.top = True # Draw on top of or beneath parent? - self.flipped = False # Flip the layer horizontally? - self.clipped = False # Clip child layers to bounds? - self.hidden = False # Hide the layer? - self._transform_cache = None # Cache of the local transformation matrix. - self._transform_stack = None # Cache of the cumulative transformation matrix. - self._clipping_mask = LayerClippingMask(self) - - @classmethod - def from_image(self, img, *args, **kwargs): - """ Returns a new layer that renders the given image, and with the same size as the image. - The layer's draw() method and an additional image property are set. - """ - if not isinstance(img, Image): - img = Image(img, data=kwargs.get("data")) - kwargs.setdefault("width", img.width) - kwargs.setdefault("height", img.height) - def draw(layer): - image(layer.image) - layer = self(*args, **kwargs) - layer.set_method(draw) - layer.set_property("image", img) - return layer - - @classmethod - def from_function(self, function, *args, **kwargs): - """ Returns a new layer that renders the drawing commands in the given function. - The layer's draw() method is set. - """ - def draw(layer): - function(layer) - layer = self(*args, **kwargs) - layer.set_method(draw) - return layer - - def copy(self, parent=None, canvas=None): - """ Returns a copy of the layer. - All Layer properties will be copied, except for the new parent and canvas, - which you need to define as optional parameters. - This means that copies are not automatically appended to the parent layer or canvas. - """ - layer = self.__class__() # Create instance of the derived class, not Layer. - layer.duration = 0 # Copy all transitions instantly. - layer.canvas = canvas - layer.parent = parent - layer.name = self.name - layer._x = self._x.copy() - layer._y = self._y.copy() - layer._width = self._width.copy() - layer._height = self._height.copy() - layer._origin = self._origin - layer._dx = self._dx.copy() - layer._dy = self._dy.copy() - layer._scale = self._scale.copy() - layer._rotation = self._rotation.copy() - layer._opacity = self._opacity.copy() - layer.duration = self.duration - layer.top = self.top - layer.flipped = self.flipped - layer.clipped = self.clipped - layer.hidden = self.hidden - layer.enabled = self.enabled - # Use base Layer.extend(), we don't care about what subclass.extend() does. - Layer.extend(layer, [child.copy() for child in self]) - # Inherit all the dynamic properties and methods. - Prototype.inherit(layer, self) - return layer - - def __getattr__(self, key): - """ Returns the given property, or the layer with the given name. - """ - if key in self.__dict__: - return self.__dict__[key] - for layer in self: - if layer.name == key: - return layer - raise AttributeError, "%s instance has no attribute '%s'" % (self.__class__.__name__, key) - - def _set_container(self, key, value): - # If Layer.canvas is set to None, the canvas should no longer contain the layer. - # If Layer.canvas is set to Canvas, this canvas should contain the layer. - # Remove the layer from the old canvas/parent. - # Append the layer to the new container. - if self in (self.__dict__.get(key) or ()): - self.__dict__[key].remove(self) - if isinstance(value, list) and self not in value: - list.append(value, self) - self.__dict__[key] = value - - def _get_canvas(self): - return self.__dict__.get("canvas") - def _get_parent(self): - return self.__dict__.get("parent") - - def _set_canvas(self, canvas): - self._set_container("canvas", canvas) - def _set_parent(self, layer): - self._set_container("parent", layer) - - canvas = property(_get_canvas, _set_canvas) - parent = property(_get_parent, _set_parent) - - @property - def root(self): - return self.parent and self.parent.root or self - - @property - def layers(self): - return self - - def insert(self, index, layer): - list.insert(self, index, layer) - layer.__dict__["parent"] = self - def append(self, layer): - list.append(self, layer) - layer.__dict__["parent"] = self - def extend(self, layers): - for layer in layers: - Layer.append(self, layer) - def remove(self, layer): - list.remove(self, layer) - layer.__dict__["parent"] = None - def pop(self, index): - layer = list.pop(self, index) - layer.__dict__["parent"] = None - return layer - - def _get_x(self): - return self._x.get() - def _get_y(self): - return self._y.get() - def _get_width(self): - return self._width.get() - def _get_height(self): - return self._height.get() - def _get_scale(self): - return self._scale.get() - def _get_rotation(self): - return self._rotation.get() - def _get_opacity(self): - return self._opacity.get() - - def _set_x(self, x): - self._transform_cache = None - self._x.set(x, self.duration) - def _set_y(self, y): - self._transform_cache = None - self._y.set(y, self.duration) - def _set_width(self, width): - self._transform_cache = None - self._width.set(width, self.duration) - def _set_height(self, height): - self._transform_cache = None - self._height.set(height, self.duration) - def _set_scale(self, scale): - self._transform_cache = None - self._scale.set(scale, self.duration) - def _set_rotation(self, rotation): - self._transform_cache = None - self._rotation.set(rotation, self.duration) - def _set_opacity(self, opacity): - self._opacity.set(opacity, self.duration) - - x = property(_get_x, _set_x) - y = property(_get_y, _set_y) - width = property(_get_width, _set_width) - height = property(_get_height, _set_height) - scaling = property(_get_scale, _set_scale) - rotation = property(_get_rotation, _set_rotation) - opacity = property(_get_opacity, _set_opacity) - - def _get_xy(self): - return (self.x, self.y) - def _set_xy(self, (x,y)): - self.x = x - self.y = y - - xy = property(_get_xy, _set_xy) - - def _get_origin(self, relative=False): - """ Returns the point (x,y) from which all layer transformations originate. - When relative=True, x and y are defined percentually (0.0-1.0) in terms of width and height. - In some cases x=0 or y=0 is returned: - - For an infinite layer (width=None or height=None), we can't deduct the absolute origin - from coordinates stored relatively (e.g. what is infinity*0.5?). - - Vice versa, for an infinite layer we can't deduct the relative origin from coordinates - stored absolute (e.g. what is 200/infinity?). - """ - dx = self._dx.current - dy = self._dy.current - w = self._width.current - h = self._height.current - # Origin is stored as absolute coordinates and we want it relative. - if self._origin == ABSOLUTE and relative: - if w is None: w = 0 - if h is None: h = 0 - dx = w!=0 and dx/w or 0 - dy = h!=0 and dy/h or 0 - # Origin is stored as relative coordinates and we want it absolute. - elif self._origin == RELATIVE and not relative: - dx = w is not None and dx*w or 0 - dy = h is not None and dy*h or 0 - return dx, dy - - def _set_origin(self, x, y, relative=False): - """ Sets the transformation origin point in either absolute or relative coordinates. - For example, if a layer is 400x200 pixels, setting the origin point to (200,100) - all transformations (translate, rotate, scale) originate from the center. - """ - self._transform_cache = None - self._dx.set(x, self.duration) - self._dy.set(y, self.duration) - self._origin = relative and RELATIVE or ABSOLUTE - - def origin(self, x=None, y=None, relative=False): - """ Sets or returns the point (x,y) from which all layer transformations originate. - """ - if x is not None: - if x == CENTER: - x, y, relative = 0.5, 0.5, True - if y is not None: - self._set_origin(x, y, relative) - return self._get_origin(relative) - - def _get_relative_origin(self): - return self.origin(relative=True) - def _set_relative_origin(self, xy): - self._set_origin(xy[0], xy[1], relative=True) - - relative_origin = property(_get_relative_origin, _set_relative_origin) - - def _get_absolute_origin(self): - return self.origin(relative=False) - def _set_absolute_origin(self, xy): - self._set_origin(xy[0], xy[1], relative=False) - - absolute_origin = property(_get_absolute_origin, _set_absolute_origin) - - def _get_visible(self): - return not self.hidden - def _set_visible(self, b): - self.hidden = not b - - visible = property(_get_visible, _set_visible) - - def translate(self, x, y): - self.x += x - self.y += y - - def rotate(self, angle): - self.rotation += angle - - def scale(self, f): - self.scaling *= f - - def flip(self): - self.flipped = not self.flipped - - def _update(self): - """ Called each frame from canvas._update() to update the layer transitions. - """ - done = self._x.update() - done &= self._y.update() - done &= self._width.update() - done &= self._height.update() - done &= self._dx.update() - done &= self._dy.update() - done &= self._scale.update() - done &= self._rotation.update() - if not done: # i.e. the layer is being transformed - self._transform_cache = None - self._opacity.update() - self.update() - for layer in self: - layer._update() - - def update(self): - """Override this method to provide custom updating code. - """ - pass - - @property - def done(self): - """ Returns True when all transitions have finished. - """ - return self._x.done \ - and self._y.done \ - and self._width.done \ - and self._height.done \ - and self._dx.done \ - and self._dy.done \ - and self._scale.done \ - and self._rotation.done \ - and self._opacity.done - - def _draw(self): - """ Draws the transformed layer and all of its children. - """ - if self.hidden: - return - glPushMatrix() - # Be careful that the transformations happen in the same order in Layer._transform(). - # translate => flip => rotate => scale => origin. - # Center the contents around the origin point. - dx, dy = self.origin(relative=False) - glTranslatef(round(self._x.current), round(self._y.current), 0) - if self.flipped: - glScalef(-1, 1, 1) - glRotatef(self._rotation.current, 0, 0, 1) - glScalef(self._scale.current, self._scale.current, 1) - # Enable clipping mask if Layer.clipped=True. - if self.clipped: - beginclip(self._clipping_mask) - # Draw child layers below. - for layer in self: - if layer.top is False: - layer._draw() - # Draw layer. - global _alpha - _alpha = self._opacity.current # XXX should also affect child layers? - glPushMatrix() - glTranslatef(-round(dx), -round(dy), 0) # Layers are drawn relative from parent origin. - self.draw() - glPopMatrix() - _alpha = 1 - # Draw child layers on top. - for layer in self: - if layer.top is True: - layer._draw() - if self.clipped: - endclip() - glPopMatrix() - - def draw(self): - """Override this method to provide custom drawing code for this layer. - At this point, the layer is correctly transformed. - """ - pass - - def render(self): - """ Returns the layer as a flattened image. - The layer and all of its children need to have width and height set. - """ - b = self.bounds - if geometry.INFINITE in (b.x, b.y, b.width, b.height): - raise LayerRenderError, "can't render layer of infinite size" - return render(lambda: (translate(-b.x,-b.y), self._draw()), b.width, b.height) - - def layer_at(self, x, y, clipped=False, enabled=False, transformed=True, _covered=False): - """ Returns the topmost layer containing the mouse position, None otherwise. - With clipped=True, no parts of child layers outside the parent's bounds are checked. - With enabled=True, only enabled layers are checked (useful for events). - """ - if self.hidden: - # Don't do costly operations on layers the user can't see. - return None - if enabled and not self.enabled: - # Skip disabled layers during event propagation. - return None - if _covered: - # An ancestor is blocking this layer, so we can't select it. - return None - hit = self.contains(x, y, transformed) - if clipped: - # If (x,y) is not inside the clipped bounds, return None. - # If children protruding beyond the layer's bounds are clipped, - # we only need to look at children on top of the layer. - # Each child is drawn on top of the previous child, - # so we hit test them in reverse order (highest-first). - if not hit: - return None - children = [layer for layer in reversed(self) if layer.top is True] - else: - # Otherwise, traverse all children in on-top-first order to avoid - # selecting a child underneath the layer that is in reality - # covered by a peer on top of the layer, further down the list. - children = sorted(reversed(self), key=lambda layer: not layer.top) - for child in children: - # An ancestor (e.g. grandparent) may be covering the child. - # This happens when it hit tested and is somewhere on top of the child. - # We keep a recursive covered-state to verify visibility. - # The covered-state starts as False, but stays True once it switches. - _covered = _covered or (hit and not child.top) - child = child.layer_at(x, y, clipped, enabled, transformed, _covered) - if child is not None: - # Note: "if child:" won't work because it can be an empty list (no children). - # Should be improved by not having Layer inherit from list. - return child - if hit: - return self - else: - return None - - def _transform(self, local=True): - """ Returns the transformation matrix of the layer: - a calculated state of its translation, rotation and scaling. - If local=False, prepends all transformations of the parent layers, - i.e. you get the absolute transformation state of a nested layer. - """ - if self._transform_cache is None: - # Calculate the local transformation matrix. - # Be careful that the transformations happen in the same order in Layer._draw(). - # translate => flip => rotate => scale => origin. - tf = Transform() - dx, dy = self.origin(relative=False) - tf.translate(round(self._x.current), round(self._y.current)) - if self.flipped: - tf.scale(-1, 1) - tf.rotate(self._rotation.current) - tf.scale(self._scale.current, self._scale.current) - tf.translate(-round(dx), -round(dy)) - self._transform_cache = tf - # Flush the cumulative transformation cache of all children. - def _flush(layer): - layer._transform_stack = None - self.traverse(_flush) - if not local: - # Return the cumulative transformation matrix. - # All of the parent transformation states need to be up to date. - # If not, we need to recalculate the whole chain. - if self._transform_stack is None: - if self.parent is None: - self._transform_stack = self._transform_cache.copy() - else: - # Accumulate all the parent layer transformations. - # In the process, we update the transformation state of any outdated parent. - dx, dy = self.parent.origin(relative=False) - # Layers are drawn relative from parent origin. - tf = self.parent._transform(local=False).copy() - tf.translate(round(dx), round(dy)) - self._transform_stack = self._transform_cache.copy() - self._transform_stack.prepend(tf) - return self._transform_stack - return self._transform_cache - - @property - def transform(self): - return self._transform(local=False) - - def _bounds(self, local=True): - """ Returns the rectangle that encompasses the transformed layer and its children. - If one of the children has width=None or height=None, bounds will be infinite. - """ - w = self._width.current; w = w is None and geometry.INFINITE or w - h = self._height.current; h = h is None and geometry.INFINITE or h - # Find the transformed bounds of the layer: - p = self.transform.map([(0,0), (w,0), (w,h), (0,h)]) - x = min(p[0][0], p[1][0], p[2][0], p[3][0]) - y = min(p[0][1], p[1][1], p[2][1], p[3][1]) - w = max(p[0][0], p[1][0], p[2][0], p[3][0]) - x - h = max(p[0][1], p[1][1], p[2][1], p[3][1]) - y - b = geometry.Bounds(x, y, w, h) - if not local: - for child in self: - b = b.union(child.bounds) - return b - - @property - def bounds(self): - return self._bounds(local=False) - - def contains(self, x, y, transformed=True): - """ Returns True if (x,y) falls within the layer's rectangular area. - Useful for GUI elements: with transformed=False the calculations are much faster; - and it will report correctly as long as the layer (or parent layer) - is not rotated or scaled, and has its origin at (0,0). - """ - w = self._width.current; w = w is None and geometry.INFINITE or w - h = self._height.current; h = h is None and geometry.INFINITE or h - if not transformed: - x0, y0 = self.absolute_position() - return x0 <= x <= x0+w \ - and y0 <= y <= y0+h - # Find the transformed bounds of the layer: - p = self.transform.map([(0,0), (w,0), (w,h), (0,h)]) - return geometry.point_in_polygon(p, x, y) - - hit_test = contains - - def absolute_position(self, root=None): - """ Returns the absolute (x,y) position (i.e. cumulative with parent position). - """ - x = 0 - y = 0 - layer = self - while layer is not None and layer != root: - x += layer.x - y += layer.y - layer = layer.parent - return x, y - - def traverse(self, visit=lambda layer: None): - """ Recurses the layer structure and calls visit() on each child layer. - """ - visit(self) - [layer.traverse(visit) for layer in self] - - def __repr__(self): - return "Layer(%sx=%.2f, y=%.2f, scale=%.2f, rotation=%.2f, opacity=%.2f, duration=%.2f)" % ( - self.name is not None and "name='%s', " % self.name or "", - self.x, - self.y, - self.scaling, - self.rotation, - self.opacity, - self.duration - ) - - def __eq__(self, other): - return isinstance(other, Layer) and self._id == other._id - def __ne__(self, other): - return not self.__eq__(other) - -layer = Layer - -#--- GROUP ------------------------------------------------------------------------------------------- - -class Group(Layer): - - def __init__(self, *args, **kwargs): - """ A layer that serves as a container for other layers. - It has no width or height and doesn't draw anything. - """ - Layer.__init__(self, *args, **kwargs) - self._set_width(0) - self._set_height(0) - - @classmethod - def from_image(*args, **kwargs): - raise NotImplementedError - - @classmethod - def from_function(*args, **kwargs): - raise NotImplementedError - - @property - def width(self): - return 0 - @property - def height(self): - return 0 - - def layer_at(self, x, y, clipped=False, enabled=False, transformed=True, _covered=False): - # Ignores clipped=True for Group (since it has no width or height). - for child in reversed(self): - layer = child.layer_at(x, y, clipped, enabled, transformed, _covered) - if layer: - return layer - -group = Group - -#===================================================================================================== - -#--- MOUSE ------------------------------------------------------------------------------------------- - -# Mouse cursors: -DEFAULT = "default" -HIDDEN = "hidden" -CROSS = pyglet.window.Window.CURSOR_CROSSHAIR -HAND = pyglet.window.Window.CURSOR_HAND -TEXT = pyglet.window.Window.CURSOR_TEXT -WAIT = pyglet.window.Window.CURSOR_WAIT - -# Mouse buttons: -LEFT = "left" -RIGHT = "right" -MIDDLE = "middle" - -class Mouse(Point): - - def __init__(self, canvas, x=0, y=0): - """ Keeps track of the mouse position on the canvas, buttons pressed and the cursor icon. - """ - Point.__init__(self, x, y) - self._canvas = canvas - self._cursor = DEFAULT # Mouse cursor: CROSS, HAND, HIDDEN, TEXT, WAIT. - self._button = None # Mouse button pressed: LEFT, RIGHT, MIDDLE. - self.modifiers = [] # Mouse button modifiers: CTRL, SHIFT, OPTION. - self.pressed = False # True if the mouse button is pressed. - self.dragged = False # True if the mouse is dragged. - self.scroll = Point(0,0) # Scroll offset. - self.dx = 0 # Relative offset from previous horizontal position. - self.dy = 0 # Relative offset from previous vertical position. - - # Backwards compatibility due to an old typo: - @property - def vx(self): - return self.dx - @property - def vy(self): - return self.dy - - @property - def relative_x(self): - try: return float(self.x) / self._canvas.width - except ZeroDivisionError: - return 0 - @property - def relative_y(self): - try: return float(self.y) / self._canvas.height - except ZeroDivisionError: - return 0 - - def _get_cursor(self): - return self._cursor - def _set_cursor(self, mode): - self._cursor = mode != DEFAULT and mode or None - if mode == HIDDEN: - self._canvas._window.set_mouse_visible(False); return - self._canvas._window.set_mouse_cursor( - self._canvas._window.get_system_mouse_cursor( - self._cursor)) - - cursor = property(_get_cursor, _set_cursor) - - def _get_button(self): - return self._button - def _set_button(self, button): - self._button = \ - button == pyglet.window.mouse.LEFT and LEFT or \ - button == pyglet.window.mouse.RIGHT and RIGHT or \ - button == pyglet.window.mouse.MIDDLE and MIDDLE or None - - button = property(_get_button, _set_button) - - def __repr__(self): - return "Mouse(x=%.1f, y=%.1f, pressed=%s, dragged=%s)" % ( - self.x, self.y, repr(self.pressed), repr(self.dragged)) - -#--- KEYBOARD ---------------------------------------------------------------------------------------- - -# Key codes: -BACKSPACE = "backspace" -DELETE = "delete" -TAB = "tab" -ENTER = "enter" -SPACE = "space" -ESCAPE = "escape" -UP = "up" -DOWN = "down" -LEFT = "left" -RIGHT = "right" - -# Key modifiers: -OPTION = \ -ALT = "option" -CTRL = "ctrl" -SHIFT = "shift" -COMMAND = "command" - -MODIFIERS = (OPTION, CTRL, SHIFT, COMMAND) - -class Keys(list): - - def __init__(self, canvas): - """ Keeps track of the keys pressed and any modifiers (e.g. shift or control key). - """ - self._canvas = canvas - self.code = None # Last key pressed - self.char = "" # Last key character representation (i.e., SHIFT + "a" = "A"). - self.modifiers = [] # Modifier keys pressed (OPTION, CTRL, SHIFT, COMMAND). - self.pressed = False - - - def append(self, code): - code = self._decode(code) - if code in MODIFIERS: - self.modifiers.append(code) - list.append(self, code) - self.code = self[-1] - - def remove(self, code): - code = self._decode(code) - if code in MODIFIERS: - self.modifiers.remove(code) - - if code in self: # some window managers catch keys in weird manner - list.remove(self, code) # .. so we may be in situation where no key code exists in our list - - self.code = len(self) > 0 and self[-1] or None - - def _decode(self, code): - if not isinstance(code, Number): - s = code - else: - s = pyglet.window.key.symbol_string(code) # 65288 => "BACKSPACE" - s = s.lower() # "BACKSPACE" => "backspace" - s = s.lstrip("_") # "_1" => "1" - s = s.replace("return", ENTER) # "return" => "enter" - s = s.replace("num_", "") # "num_space" => "space" - s = s.endswith(MODIFIERS) and s.lstrip("lr") or s # "lshift" => "shift" - return s - - def __repr__(self): - return "Keys(char=%s, code=%s, modifiers=%s, pressed=%s)" % ( - repr(self.char), repr(iter(self)), repr(self.modifiers), repr(self.pressed)) - -#===================================================================================================== - -#--- CANVAS ------------------------------------------------------------------------------------------ - -VERY_LIGHT_GREY = 0.95 - -FRAME = 0 - -# Window styles. -WINDOW_DEFAULT = pyglet.window.Window.WINDOW_STYLE_DEFAULT -WINDOW_BORDERLESS = pyglet.window.Window.WINDOW_STYLE_BORDERLESS - -# Configuration settings for the canvas. -# http://www.pyglet.org/doc/programming_guide/opengl_configuration_options.html -# The stencil buffer is enabled (we need it to do clipping masks). -# Multisampling will be enabled (if possible) to do anti-aliasing. -settings = OPTIMAL = dict( -# buffer_size = 32, # Let Pyglet decide automatically. -# red_size = 8, -# green_size = 8, -# blue_size = 8, - depth_size = 24, - stencil_size = 1, - alpha_size = 8, - double_buffer = 1, - sample_buffers = 1, - samples = 4 -) - -def _configure(settings): - """ Returns a pyglet.gl.Config object from the given dictionary of settings. - If the settings are not supported, returns the default settings. - """ - screen = pyglet.window.get_platform().get_default_display().get_default_screen() - c = pyglet.gl.Config(**settings) - try: - c = screen.get_best_config(c) - except pyglet.window.NoSuchConfigException: - # Probably the hardwarde doesn't support multisampling. - # We can still do some anti-aliasing by turning on GL_LINE_SMOOTH. - c = pyglet.gl.Config() - c = screen.get_best_config(c) - return c - -class Canvas(list, Prototype, EventHandler): - - def __init__(self, width=640, height=480, name="NodeBox for OpenGL", resizable=False, border=True, settings=OPTIMAL, vsync=True): - """ The main application window containing the drawing canvas. - It is opened when Canvas.run() is called. - It is a collection of drawable Layer objects, and it has its own draw() method. - This method must be overridden with your own drawing commands, which will be executed each frame. - Event handlers for keyboard and mouse interaction can also be overriden. - Events will be passed to layers that have been appended to the canvas. - """ - window = dict( - caption = name, - visible = False, - width = width, - height = height, - resizable = resizable, - style = border is False and WINDOW_BORDERLESS or WINDOW_DEFAULT, - config = _configure(settings), - vsync = vsync - ) - Prototype.__init__(self) - EventHandler.__init__(self) - self.profiler = Profiler(self) - self._window = pyglet.window.Window(**window) - self._fps = 60 # Frames per second. - self._frame = 0 # The current frame. - self._elapsed = 0 # dt = time elapsed since last frame. - self._active = False # Application is running? - self.paused = False # Pause animation? - self._mouse = Mouse(self) # The mouse cursor location. - self._keys = Keys(self) # The keys pressed on the keyboard. - self._focus = None # The layer being focused by the mouse. - # Mouse and keyboard events: - self._window.on_mouse_enter = self._on_mouse_enter - self._window.on_mouse_leave = self._on_mouse_leave - self._window.on_mouse_motion = self._on_mouse_motion - self._window.on_mouse_press = self._on_mouse_press - self._window.on_mouse_release = self._on_mouse_release - self._window.on_mouse_drag = self._on_mouse_drag - self._window.on_mouse_scroll = self._on_mouse_scroll - self._window.on_key_pressed = False - self._window.on_key_press = self._on_key_press - self._window.on_key_release = self._on_key_release - self._window.on_text = self._on_text - self._window.on_text_motion = self._on_text_motion - self._window.on_move = self._on_move - self._window.on_resize = self._on_resize - self._window.on_close = self.stop - - def _get_name(self): - return self._window.caption - def _set_name(self, str): - self._window.set_caption(str) - - name = property(_get_name, _set_name) - - def _get_vsync(self): - return self._window.vsync - def _set_vsync(self, bool): - self._window.set_vsync(bool) - - vsync = property(_get_vsync, _set_vsync) - - @property - def layers(self): - return self - - def insert(self, index, layer): - list.insert(self, index, layer) - layer.__dict__["canvas"] = self - def append(self, layer): - list.append(self, layer) - layer.__dict__["canvas"] = self - def extend(self, layers): - for layer in layers: - self.append(layer) - def remove(self, layer): - list.remove(self, layer) - layer.__dict__["canvas"] = None - def pop(self, index): - layer = list.pop(index) - layer.__dict__["canvas"] = None - return layer - - def _get_x(self): - return self._window.get_location()[0] - def _set_x(self, v): - self._window.set_location(v, self.y) - def _get_y(self): - return self._window.get_location()[1] - def _set_y(self, v): - self._window.set_location(self.x, v) - def _get_xy(self): - return (self.x, self.y) - def _set_xy(self, (x,y)): - self.x = x - self.y = y - def _get_width(self): - return self._window.width - def _get_height(self): - return self._window.height - def _get_size(self): - return (self.width, self.height) - def _set_width(self, v): - self._window.width = v - def _set_height(self, v): - self._window.height = v - def _set_size(self, (w,h)): - self.width = w - self.height = h - - x = property(_get_x, _set_x) - y = property(_get_y, _set_y) - xy = property(_get_xy, _set_xy) - width = property(_get_width, _set_width) - height = property(_get_height, _set_height) - size = property(_get_size, _set_size) - - def _get_fullscreen(self): - return self._window.fullscreen - def _set_fullscreen(self, mode=True): - self._window.set_fullscreen(mode) - - fullscreen = property(_get_fullscreen, _set_fullscreen) - - @property - def screen(self): - return pyglet.window.get_platform().get_default_display().get_default_screen() - - @property - def frame(self): - """ Yields the current frame number. - """ - return self._frame - - @property - def elapsed(self): - """ Yields the elapsed time since last frame. - """ - return self._elapsed - - dt = elapsed - - @property - def mouse(self): - """ Yields a Point(x, y) with the mouse position on the canvas. - """ - return self._mouse - - @property - def keys(self): - return self._keys - - @property # Backwards compatibility. - def key(self): - return self._keys - - @property - def focus(self): - return self._focus - - #--- Event dispatchers ------------------------------ - # First events are dispatched, then update() and draw() are called. - - def layer_at(self, x, y, **kwargs): - """ Find the topmost layer at the specified coordinates. - This method returns None if no layer was found. - """ - for layer in reversed(self): - layer = layer.layer_at(x, y, **kwargs) - if layer is not None: - return layer - return None - - def _on_mouse_enter(self, x, y): - self._mouse.x = x - self._mouse.y = y - self.on_mouse_enter(self._mouse) - - def _on_mouse_leave(self, x, y): - self._mouse.x = x - self._mouse.y = y - self.on_mouse_leave(self._mouse) - # When the mouse leaves the canvas, no layer has the focus. - if self._focus is not None: - self._focus.on_mouse_leave(self._mouse) - self._focus.focus = False - self._focus.pressed = False - self._focus.dragged = False - self._focus = None - - def _on_mouse_motion(self, x, y, dx, dy): - self._mouse.x = x - self._mouse.y = y - self._mouse.dx = int(dx) - self._mouse.dy = int(dy) - self.on_mouse_motion(self._mouse) - # Get the topmost layer over which the mouse is hovering. - layer = self.layer_at(x, y, enabled=True) - # If the layer differs from the layer which currently has the focus, - # or the mouse is not over any layer, remove the current focus. - if self._focus is not None and (self._focus != layer or not self._focus.contains(x,y)): - self._focus.on_mouse_leave(self._mouse) - self._focus.focus = False - self._focus = None - # Set the focus. - if self.focus != layer and layer is not None: - self._focus = layer - self._focus.focus = True - self._focus.on_mouse_enter(self._mouse) - # Propagate mouse motion to layer with the focus. - if self._focus is not None: - self._focus.on_mouse_motion(self._mouse) - - def _on_mouse_press(self, x, y, button, modifiers): - self._mouse.pressed = True - self._mouse.button = button - self._mouse.modifiers = [a for (a,b) in ( - (CTRL, pyglet.window.key.MOD_CTRL), - (SHIFT, pyglet.window.key.MOD_SHIFT), - (OPTION, pyglet.window.key.MOD_OPTION)) if modifiers & b] - self.on_mouse_press(self._mouse) - # Propagate mouse clicking to the layer with the focus. - if self._focus is not None: - self._focus.pressed = True - self._focus.on_mouse_press(self._mouse) - - def _on_mouse_release(self, x, y, button, modifiers): - if self._focus is not None: - self._focus.on_mouse_release(self._mouse) - self._focus.pressed = False - self._focus.dragged = False - self.on_mouse_release(self._mouse) - self._mouse.button = None - self._mouse.modifiers = [] - self._mouse.pressed = False - self._mouse.dragged = False - if self._focus is not None: - # Get the topmost layer over which the mouse is hovering. - layer = self.layer_at(x, y, enabled=True) - # If the mouse is no longer over the layer with the focus - # (this can happen after dragging), remove the focus. - if self._focus != layer or not self._focus.contains(x,y): - self._focus.on_mouse_leave(self._mouse) - self._focus.focus = False - self._focus = None - # Propagate mouse to the layer with the focus. - if self._focus != layer and layer is not None: - layer.focus = True - layer.on_mouse_enter(self._mouse) - self._focus = layer - - def _on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): - self._mouse.dragged = True - self._mouse.x = x - self._mouse.y = y - self._mouse.dx = int(dx) - self._mouse.dy = int(dy) - self._mouse.modifiers = [a for (a,b) in ( - (CTRL, pyglet.window.key.MOD_CTRL), - (SHIFT, pyglet.window.key.MOD_SHIFT), - (OPTION, pyglet.window.key.MOD_OPTION)) if modifiers & b] - # XXX also needs to log buttons. - self.on_mouse_drag(self._mouse) - # Propagate mouse dragging to the layer with the focus. - if self._focus is not None: - self._focus.dragged = True - self._focus.on_mouse_drag(self._mouse) - - def _on_mouse_scroll(self, x, y, scroll_x, scroll_y): - self._mouse.scroll.x = scroll_x - self._mouse.scroll.y = scroll_y - self.on_mouse_scroll(self._mouse) - # Propagate mouse scrolling to the layer with the focus. - if self._focus is not None: - self._focus.on_mouse_scroll(self._mouse) - - def _on_key_press(self, keycode, modifiers): - self._keys.pressed = True - self._keys.append(keycode) - if self._keys.code == TAB: - self._keys.char = "\t" - # The event is delegated in _update(): - self._window.on_key_pressed = True - - def _on_key_release(self, keycode, modifiers): - for layer in self: - layer.on_key_release(self.key) - self.on_key_release(self.key) - self._keys.char = "" - try: - self._keys.remove(keycode) - except ValueError: - pass - self._keys.pressed = False - - def _on_text(self, text): - self._keys.char = text - # The event is delegated in _update(): - self._window.on_key_pressed = True - - def _on_text_motion(self, keycode): - self._keys.char = "" - # The event is delegated in _update(): - self._window.on_key_pressed = True - - def _on_move(self, x, y): - self.on_move() - - def _on_resize(self, width, height): - pyglet.window.Window.on_resize(self._window, width, height) - self.on_resize() - - # Event methods are meant to be overridden or patched with Prototype.set_method(). - def on_key_press(self, keys): - """ The default behavior of the canvas: - - ESC exits the application, - - CTRL-P pauses the animation, - - CTRL-S saves a screenshot. - """ - if keys.code == ESCAPE: - self.stop() - if keys.code == "p" and CTRL in keys.modifiers: - self.paused = not self.paused - if keys.code == "s" and CTRL in keys.modifiers: - self.save("nodebox-%s.png" % str(datetime.now()).split(".")[0].replace(" ","-").replace(":","-")) - - def on_move(self): - pass - - def on_resize(self): - pass - - #--- Main loop -------------------------------------- - - def setup(self): - pass - - def update(self): - pass - - def draw(self): - self.clear() - - def draw_overlay(self): - """ Override this method to draw once all the layers have been drawn. - """ - pass - - draw_over = draw_overlay - - def _setup(self): - """ Initializes the application window and resets the state. - Clears the canvas and calls Canvas.setup(). - """ - # Start the application (if not already running). - if not self._active: - self._window.switch_to() - # Set the window color, this will be transparent in saved images. - glClearColor(VERY_LIGHT_GREY, VERY_LIGHT_GREY, VERY_LIGHT_GREY, 0) - # Reset the transformation state. - # Most of this is already taken care of in Pyglet. - #glMatrixMode(GL_PROJECTION) - #glLoadIdentity() - #glOrtho(0, self.width, 0, self.height, -1, 1) - #glMatrixMode(GL_MODELVIEW) - glLoadIdentity() - # Enable line anti-aliasing. - glEnable(GL_LINE_SMOOTH) - # Enable alpha transparency. - glEnable(GL_BLEND) - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) - #glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - self._window.dispatch_events() - self._window.set_visible(True) - self._active = True - self.clear() - self.setup() - - def _draw(self, lapse=0): - """ Draws the canvas and its layers. - This method gives the same result each time it gets drawn; only _update() advances state. - """ - if self.paused: - return - self._window.switch_to() - glPushMatrix() - self.draw() - glPopMatrix() - glPushMatrix() - for layer in self: - layer._draw() - glPopMatrix() - glPushMatrix() - self.draw_overlay() - glPopMatrix() - - def _update(self, lapse=0): - """ Updates the canvas and its layers. - This method does not actually draw anything, it only updates the state. - """ - self._elapsed = lapse - if not self.paused: - # Advance the animation by updating all layers. - # This is only done when the canvas is not paused. - # Events will still be propagated during pause. - global TIME; TIME = time() - self._frame += 1 - self.update() - for layer in self: - layer._update() - if self._window.on_key_pressed is True: - # Fire on_key_press() event, - # which combines _on_key_press(), _on_text() and _on_text_motion(). - self._window.on_key_pressed = False - self.on_key_press(self._keys) - for layer in self: - layer.on_key_press(self._keys) - - def stop(self): - # If you override this method, don't forget to call Canvas.stop() to exit the app. - # Any user-defined stop method, added with canvas.set_method() or canvas.run(stop=stop), - # is called first. - try: self._user_defined_stop() - except: - pass - for f in (self._update, self._draw): - pyglet.clock.unschedule(f) - self._window.close() - self._active = False - pyglet.app.exit() - - def clear(self): - """ Clears the previous frame from the canvas. - """ - glClear(GL_COLOR_BUFFER_BIT) - glClear(GL_DEPTH_BUFFER_BIT) - glClear(GL_STENCIL_BUFFER_BIT) - - def run(self, draw=None, setup=None, update=None, stop=None): - """ Opens the application windows and starts drawing the canvas. - Canvas.setup() will be called once during initialization. - Canvas.draw() and Canvas.update() will be called each frame. - Canvas.clear() needs to be called explicitly to clear the previous frame drawing. - Canvas.stop() closes the application window. - If the given setup, draw or update parameter is a function, - it overrides that canvas method. - """ - if isinstance(setup, FunctionType): - self.set_method(setup, name="setup") - if isinstance(draw, FunctionType): - self.set_method(draw, name="draw") - if isinstance(update, FunctionType): - self.set_method(update, name="update") - if isinstance(stop, FunctionType): - self.set_method(stop, name="stop") - self._setup() - self.fps = self._fps # Schedule the _update and _draw events. - pyglet.app.run() - - @property - def active(self): - return self._active - - def _get_fps(self): - return self._fps - def _set_fps(self, v): - # Use pyglet.clock to schedule _update() and _draw() events. - # The clock will then take care of calling them enough times. - # Note: frames per second is related to vsync. - # If the vertical refresh rate is about 30Hz you'll get top speed of around 33fps. - # It's probably a good idea to leave vsync=True if you don't want to fry the GPU. - for f in (self._update, self._draw): - pyglet.clock.unschedule(f) - if v is None: - pyglet.clock.schedule(f) - if v > 0: - pyglet.clock.schedule_interval(f, 1.0/v) - self._fps = v - - fps = property(_get_fps, _set_fps) - - #--- Frame export ----------------------------------- - - def render(self): - """ Returns a screenshot of the current frame as a texture. - This texture can be passed to the image() command. - """ - return pyglet.image.get_buffer_manager().get_color_buffer().get_texture() - - buffer = screenshot = render - - @property - def texture(self): - return pyglet.image.get_buffer_manager().get_color_buffer().get_texture() - - def save(self, path): - """ Exports the current frame as a PNG-file. - """ - pyglet.image.get_buffer_manager().get_color_buffer().save(path) - - #--- Prototype -------------------------------------- - - def __setattr__(self, k, v): - # Canvas is a Prototype, so Canvas.draw() can be overridden - # but it can also be patched with Canvas.set_method(draw). - # Specific methods (setup, draw, mouse and keyboard events) can also be set directly - # (e.g. canvas.on_mouse_press = my_mouse_handler). - # This way we don't have to explain set_method() to beginning users.. - if isinstance(v, FunctionType) and (k in ("setup", "draw", "update", "stop") \ - or k.startswith("on_") and k in ( - "on_mouse_enter", - "on_mouse_leave", - "on_mouse_motion", - "on_mouse_press", - "on_mouse_release", - "on_mouse_drag", - "on_mouse_scroll", - "on_key_press", - "on_key_release", - "on_move", - "on_resize")): - self.set_method(v, name=k) - else: - object.__setattr__(self, k, v) - - def set_method(self, function, name=None): - if name == "stop" \ - or name is None and function.__name__ == "stop": - Prototype.set_method(self, function, name="_user_defined_stop") # Called from Canvas.stop(). - else: - Prototype.set_method(self, function, name) - - def __repr__(self): - return "Canvas(name='%s', size='%s', layers=%s)" % (self.name, self.size, repr(list(self))) - -#--- PROFILER ---------------------------------------------------------------------------------------- - -CUMULATIVE = "cumulative" -SLOWEST = "slowest" - -_profile_canvas = None -_profile_frames = 100 -def profile_run(): - for i in range(_profile_frames): - _profile_canvas._update() - _profile_canvas._draw() - -class Profiler: - - def __init__(self, canvas): - self.canvas = canvas - - @property - def framerate(self): - return pyglet.clock.get_fps() - - def run(self, draw=None, setup=None, update=None, frames=100, sort=CUMULATIVE, top=30): - """ Runs cProfile on the canvas for the given number of frames. - The performance statistics are returned as a string, sorted by SLOWEST or CUMULATIVE. - For example, instead of doing canvas.run(draw): - print canvas.profiler.run(draw, frames=100) - """ - # Register the setup, draw, update functions with the canvas (if given). - if isinstance(setup, FunctionType): - self.canvas.set_method(setup, name="setup") - if isinstance(draw, FunctionType): - self.canvas.set_method(draw, name="draw") - if isinstance(update, FunctionType): - self.canvas.set_method(update, name="update") - # If enabled, turn Psyco off. - psyco_stopped = False - try: - psyco.stop() - psyco_stopped = True - except: - pass - # Set the current canvas and the number of frames to profile. - # The profiler will then repeatedly execute canvas._update() and canvas._draw(). - # Statistics are redirected from stdout to a temporary file. - global _profile_canvas, _profile_frames - _profile_canvas = self.canvas - _profile_frames = frames - import cProfile - import pstats - cProfile.run("profile_run()", "_profile") - p = pstats.Stats("_profile") - p.stream = open("_profile", "w") - p.sort_stats(sort==SLOWEST and "time" or sort).print_stats(top) - p.stream.close() - s = open("_profile").read() - remove("_profile") - # Restart Psyco if we stopped it. - if psyco_stopped: - psyco.profile() - return s - -#--- LIBRARIES --------------------------------------------------------------------------------------- -# Import the library and assign it a _ctx variable containing the current context. -# This mimics the behavior in NodeBox for Mac OS X. - -def ximport(library): - from sys import modules - library = __import__(library) - library._ctx = modules[__name__] - return library - -#----------------------------------------------------------------------------------------------------- -# Linear interpolation math for BezierPath.point() etc. - -import bezier diff --git a/nodebox/graphics/geometry.py b/nodebox/graphics/geometry.py deleted file mode 100644 index 8052407..0000000 --- a/nodebox/graphics/geometry.py +++ /dev/null @@ -1,598 +0,0 @@ -#=== SHADER ========================================================================================== -# 2D geometry functions. -# Authors: Tom De Smedt -# License: BSD (see LICENSE.txt for details). -# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) -# http://cityinabottle.org/nodebox - -from math import sqrt, pow -from math import sin, cos, atan2, degrees, radians, pi - -INFINITE = 1e15 # float("inf") doesn't work on windows. - -#===================================================================================================== - -#--- ROTATION ---------------------------------------------------------------------------------------- - -def angle(x0, y0, x1, y1): - """ Returns the angle between two points. - """ - return degrees(atan2(y1-y0, x1-x0)) - -def distance(x0, y0, x1, y1): - """ Returns the distance between two points. - """ - return sqrt(pow(x1-x0, 2) + pow(y1-y0, 2)) - -def coordinates(x0, y0, distance, angle): - """ Returns the location of a point by rotating around origin (x0,y0). - """ - return (x0 + cos(radians(angle)) * distance, - y0 + sin(radians(angle)) * distance) - -def rotate(x, y, x0, y0, angle): - """ Returns the coordinates of (x,y) rotated around origin (x0,y0). - """ - x, y = x-x0, y-y0 - a, b = cos(radians(angle)), sin(radians(angle)) - return (x*a-y*b+x0, y*a+x*b+y0) - -def reflect(x, y, x0, y0, d=1.0, a=180): - """ Returns the reflection of a point through origin (x0,y0). - """ - return coordinates(x0, y0, d*distance(x0,y0,x,y), a+angle(x0,y0,x,y)) - -# Fast C implementations: -try: from nodebox.ext.geometry import angle, distance, coordinates, rotate -except: - pass - -#--- INTERPOLATION ----------------------------------------------------------------------------------- - -def lerp(a, b, t): - """ Returns the linear interpolation between a and b for time t between 0.0-1.0. - For example: lerp(100, 200, 0.5) => 150. - """ - if t < 0.0: return a - if t > 1.0: return b - return a + (b-a)*t - -def smoothstep(a, b, x): - """ Returns a smooth transition between 0.0 and 1.0 using Hermite interpolation (cubic spline), - where x is a number between a and b. The return value will ease (slow down) as x nears a or b. - For x smaller than a, returns 0.0. For x bigger than b, returns 1.0. - """ - if x < a: return 0.0 - if x >=b: return 1.0 - x = float(x-a) / (b-a) - return x*x * (3-2*x) - -def bounce(x): - """ Returns a bouncing value between 0.0 and 1.0 (e.g. Mac OS X Dock) for a value between 0.0-1.0. - """ - return abs(sin(2*pi * (x+1) * (x+1)) * (1-x)) - -def clamp(v, a, b): - return max(a, min(v, b)) - -# Fast C implementations: -try: from nodebox.ext.geometry import smoothstep -except: - pass - -#--- INTERSECTION ------------------------------------------------------------------------------------ - -def line_line_intersection(x1, y1, x2, y2, x3, y3, x4, y4, infinite=False): - """ Determines the intersection point of two lines, or two finite line segments if infinite=False. - When the lines do not intersect, returns an empty list. - """ - # Based on: P. Bourke, http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/ - ua = (x4-x3)*(y1-y3) - (y4-y3)*(x1-x3) - ub = (x2-x1)*(y1-y3) - (y2-y1)*(x1-x3) - d = (y4-y3)*(x2-x1) - (x4-x3)*(y2-y1) - if d == 0: - if ua == ub == 0: - # The lines are coincident - return [] - else: - # The lines are parallel. - return [] - ua /= float(d) - ub /= float(d) - if not infinite and not (0<=ua<=1 and 0<=ub<=1): - # Intersection point is not within both line segments. - return None, None - return [(x1+ua*(x2-x1), y1+ua*(y2-y1))] - -def circle_line_intersection(cx, cy, radius, x1, y1, x2, y2, infinite=False): - """ Returns a list of points where the circle and the line intersect. - Returns an empty list when the circle and the line do not intersect. - """ - # Based on: http://www.vb-helper.com/howto_net_line_circle_intersections.html - dx = x2-x1 - dy = y2-y1 - A = dx*dx + dy*dy - B = 2 * (dx*(x1-cx) + dy*(y1-cy)) - C = pow(x1-cx, 2) + pow(y1-cy, 2) - radius*radius - det = B*B - 4*A*C - if A <= 0.0000001 or det < 0: - return [] - elif det == 0: - # One point of intersection. - t = -B / (2*A) - return [(x1+t*dx, y1+t*dy)] - else: - # Two points of intersection. - # A point of intersection lies on the line segment if 0 <= t <= 1, - # and on an extension of the segment otherwise. - points = [] - det2 = sqrt(det) - t1 = (-B+det2) / (2*A) - t2 = (-B-det2) / (2*A) - if infinite or 0 <= t1 <= 1: points.append((x1+t1*dx, y1+t1*dy)) - if infinite or 0 <= t2 <= 1: points.append((x1+t2*dx, y1+t2*dy)) - return points - -def intersection(*args, **kwargs): - if len(args) == 8: - return line_line_intersection(*args, **kwargs) - if len(args) == 7: - return circle_line_intersection(*args, **kwargs) - -def point_in_polygon(points, x, y): - """ Ray casting algorithm. - Determines how many times a horizontal ray starting from the point - intersects with the sides of the polygon. - If it is an even number of times, the point is outside, if odd, inside. - The algorithm does not always report correctly when the point is very close to the boundary. - The polygon is passed as a list of (x,y)-tuples. - """ - odd = False - n = len(points) - for i in range(n): - j = i= y) or (y1 < y and y0 >= y): - if x0 + (y-y0) / (y1-y0) * (x1-x0) < x: - odd = not odd - return odd - -#===================================================================================================== - -#--- AFFINE TRANSFORM -------------------------------------------------------------------------------- - -def superformula(m, n1, n2, n3, phi): - """ A generalization of the superellipse first proposed by Johan Gielis. - It can be used to describe many complex shapes and curves that are found in nature. - """ - if n1 == 0: - return (0,0) - a = 1.0 - b = 1.0 - r = pow(pow(abs(cos(m * phi/4) / a), n2) + \ - pow(abs(sin(m * phi/4) / b), n3), 1/n1) - if abs(r) == 0: - return (0,0) - r = 1 / r - return (r*cos(phi), r*sin(phi)) - -# Fast C implementation: -try: from nodebox.ext.geometry import superformula -except: - pass - -#===================================================================================================== - -#--- AFFINE TRANSFORM -------------------------------------------------------------------------------- -# Based on http://www.senocular.com/flash/tutorials/transformmatrix/ - -class AffineTransform: - - def __init__(self, transform=None): - """ A geometric transformation in Euclidean space (i.e. 2D) - that preserves collinearity and ratio of distance between points. - Linear transformations include rotation, translation, scaling, shear. - """ - if isinstance(transform, AffineTransform): - self.matrix = list(transform.matrix) - else: - self.matrix = self.identity - - def copy(self): - return AffineTransform(self) - - def prepend(self, transform): - self.matrix = self._mmult(self.matrix, transform.matrix) - def append(self, transform): - self.matrix = self._mmult(transform.matrix, self.matrix) - - concat = append - - def _mmult(self, a, b): - """ Returns the 3x3 matrix multiplication of A and B. - Note that scale(), translate(), rotate() work with premultiplication, - e.g. the matrix A followed by B = BA and not AB. - """ - # No need to optimize (C version is just as fast). - return [ - a[0]*b[0] + a[1]*b[3], - a[0]*b[1] + a[1]*b[4], - 0, - a[3]*b[0] + a[4]*b[3], - a[3]*b[1] + a[4]*b[4], - 0, - a[6]*b[0] + a[7]*b[3] + b[6], - a[6]*b[1] + a[7]*b[4] + b[7], - 1 - ] - - def invert(self): - """ Multiplying a matrix by its inverse produces the identity matrix. - """ - m = self.matrix - d = m[0]*m[4] - m[1]*m[3] - self.matrix = [ - m[4]/d, -m[1]/d, 0, - -m[3]/d, m[0]/d, 0, - (m[3]*m[7]-m[4]*m[6])/d, - -(m[0]*m[7]-m[1]*m[6])/d, - 1 - ] - - @property - def inverse(self): - m = self.copy(); m.invert(); return m; - - @property - def identity(self): - return [1,0,0, 0,1,0, 0,0,1] - - @property - def rotation(self): - return (degrees(atan2(self.matrix[1], self.matrix[0])) + 360) % 360 # 0.0 => 360.0 - - def scale(self, x, y=None): - if y==None: y = x - self.matrix = self._mmult([x,0,0, 0,y,0, 0,0,1], self.matrix) - - def translate(self, x, y): - self.matrix = self._mmult([1,0,0, 0,1,0, x,y,1], self.matrix) - - def rotate(self, degrees=0, radians=0): - radians = degrees and degrees*pi/180 or radians - c = cos(radians) - s = sin(radians) - self.matrix = self._mmult([c,s,0, -s,c,0, 0,0,1], self.matrix) - - def transform_point(self, x, y): - """ Returns the new coordinates of (x,y) after transformation. - """ - m = self.matrix - return (x*m[0]+y*m[3]+m[6], x*m[1]+y*m[4]+m[7]) - - apply = transform_point - - def transform_path(self, path): - """ Returns a BezierPath object with the transformation applied. - """ - p = path.__class__() # Create a new BezierPath. - for pt in path: - if pt.cmd == "close": - p.closepath() - elif pt.cmd == "moveto": - p.moveto(*self.apply(pt.x, pt.y)) - elif pt.cmd == "lineto": - p.lineto(*self.apply(pt.x, pt.y)) - elif pt.cmd == "curveto": - vx1, vy1 = self.apply(pt.ctrl1.x, pt.ctrl1.y) - vx2, vy2 = self.apply(pt.ctrl2.x, pt.ctrl2.y) - x, y = self.apply(pt.x, pt.y) - p.curveto(vx1, vy1, vx2, vy2, x, y) - return p - - # Compatibility with NodeBox. - transformPoint = transform_point - transformBezierPath = transform_path - - def map(self, points): - return [self.apply(*pt) for pt in points] - -Transform = AffineTransform - -#===================================================================================================== - -#--- POINT ------------------------------------------------------------------------------------------- - -class Point(object): - - def __init__(self, x=0, y=0): - self.x = x - self.y = y - - def _get_xy(self): - return (self.x, self.y) - def _set_xy(self, (x,y)): - self.x = x - self.y = y - - xy = property(_get_xy, _set_xy) - - def __iter__(self): - return iter((self.x, self.y)) - - def __repr__(self): - return "Point(x=%.1f, y=%.1f)" % (self.x, self.y) - - def __eq__(self, pt): - if not isinstance(pt, Point): return False - return self.x == pt.x \ - and self.y == pt.y - - def __ne__(self, pt): - return not self.__eq__(pt) - -#--- BOUNDS ------------------------------------------------------------------------------------------ - -class Bounds: - - def __init__(self, x, y, width, height): - """ Creates a bounding box. - The bounding box is an untransformed rectangle that encompasses a shape or group of shapes. - """ - # context.Layer does not always have a width or height defined (i.e. infinite layer): - if width == None: width = INFINITE - if height == None: height = INFINITE - # Normalize if width or height is negative: - if width < 0: x, width = x+width, -width - if height < 0: y, height = y+height, -height - self.x = x - self.y = y - self.width = width - self.height = height - - def copy(self): - return Bounds(self.x, self.y, self.width, self.height) - - def __iter__(self): - """ You can conveniently unpack bounds: x,y,w,h = Bounds(0,0,100,100) - """ - return iter((self.x, self.y, self.width, self.height)) - - def intersects(self, b): - """ Return True if a part of the two bounds overlaps. - """ - return max(self.x, b.x) < min(self.x+self.width, b.x+b.width) \ - and max(self.y, b.y) < min(self.y+self.height, b.y+b.height) - - def intersection(self, b): - """ Returns bounds that encompass the intersection of the two. - If there is no overlap between the two, None is returned. - """ - if not self.intersects(b): - return None - mx, my = max(self.x, b.x), max(self.y, b.y) - return Bounds(mx, my, - min(self.x+self.width, b.x+b.width) - mx, - min(self.y+self.height, b.y+b.height) - my) - - def union(self, b): - """ Returns bounds that encompass the union of the two. - """ - # Note: this will also work with ghost points. - # Bounds(20, 20, 5, 5).union(Bounds(100, 100, 0, 0)) => Bounds(20, 20, 100, 100). - mx, my = min(self.x, b.x), min(self.y, b.y) - return Bounds(mx, my, - max(self.x+self.width, b.x+b.width) - mx, - max(self.y+self.height, b.y+b.height) - my) - - def contains(self, *a): - """ Returns True if the given point or rectangle falls within the bounds. - """ - if len(a) == 2: a = [Point(a[0], a[1])] - if len(a) == 1: - a = a[0] - if isinstance(a, Point): - return a.x >= self.x and a.x <= self.x+self.width \ - and a.y >= self.y and a.y <= self.y+self.height - if isinstance(a, Bounds): - return a.x >= self.x and a.x+a.width <= self.x+self.width \ - and a.y >= self.y and a.y+a.height <= self.y+self.height - - def __eq__(self, b): - if not isinstance(b, Bounds): - return False - return self.x == b.x \ - and self.y == b.y \ - and self.width == b.width \ - and self.height == b.height - - def __ne__(self, b): - return not self.__eq__(b) - - def __repr__(self): - return "Bounds(%.1f, %.1f, %.1f, %.1f)" % (self.x, self.y, self.width, self.height) - -#===================================================================================================== - -#--- TESSELLATION ------------------------------------------------------------------------------------ -# OpenGL can only display simple convex polygons directly. -# A polygon is simple if the edges intersect only at vertices, there are no duplicate vertices, -# and exactly two edges meet at any vertex. -# Polygons containing holes or polygons with intersecting edges must first be subdivided -# into simple convex polygons before they can be displayed. -# Such subdivision is called tessellation. - -# Algorithm adopted from Squirtle: -# -# Copyright (c) 2008 Martin O'Leary. -# -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without modification, -# are permitted provided that the following conditions are met: -# * Redistributions of source code must retain the above copyright notice, -# this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# * Neither the name(s) of the copyright holders nor the names of its contributors may be used to -# endorse or promote products derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, -# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -from sys import platform -from ctypes import CFUNCTYPE, POINTER, byref, cast, pointer -from ctypes import CFUNCTYPE as _CFUNCTYPE -from pyglet.gl import \ - GLdouble, GLvoid, GLenum, GLfloat, \ - gluNewTess, gluTessProperty, gluTessNormal, gluTessCallback, gluTessVertex, \ - gluTessBeginPolygon, gluTessEndPolygon, \ - gluTessBeginContour, gluTessEndContour, \ - GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO, \ - GLU_TESS_VERTEX, GLU_TESS_BEGIN, GLU_TESS_END, GLU_TESS_ERROR, GLU_TESS_COMBINE, \ - GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_TRIANGLES, GL_LINE_LOOP - -if platform == "win32": - from ctypes import WINFUNCTYPE as CFUNCTYPE - -_tessellator = gluNewTess() - -# Winding rule determines the regions that should be filled and those that should remain unshaded. -# Winding direction is determined by the normal. -gluTessProperty(_tessellator, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO) -gluTessNormal(_tessellator, 0, 0, 1) - -# As tessellation proceeds, callback routines are called in a manner -# similar to OpenGL commands glBegin(), glEdgeFlag*(), glVertex*(), and glEnd(). -# The callback functions must be C functions so we need to cast our Python callbacks to C. -_tessellate_callback_type = { - GLU_TESS_VERTEX : CFUNCTYPE(None, POINTER(GLvoid)), - GLU_TESS_BEGIN : CFUNCTYPE(None, GLenum), - GLU_TESS_END : CFUNCTYPE(None), - GLU_TESS_ERROR : CFUNCTYPE(None, GLenum), - GLU_TESS_COMBINE : CFUNCTYPE(None, - POINTER(GLdouble), - POINTER(POINTER(GLvoid)), - POINTER(GLfloat), - POINTER(POINTER(GLvoid))) -} - -# One path with a 100 points is somewhere around 15KB. -TESSELLATION_CACHE = 100 - -class TessellationError(Exception): - pass - -class Tessellate(list): - """ Tessellation state that stores data from the callback functions - while tessellate() is processing. - """ - def __init__(self): - self.cache = {} # Cache of previously triangulated contours - self.queue = [] # Latest contours appear at the end of the list. - self.reset() - def clear(self): - list.__init__(self, []) # Populated during _tessellate_vertex(). - def reset(self): - self.clear() - self.mode = None # GL_TRIANGLE_FAN | GL_TRIANGLE_STRIP | GL_TRIANGLES. - self.triangles = [] # After tessellation, contains lists of (x,y)-vertices, - self._combined = [] # which can be drawn with glBegin(GL_TRIANGLES) mode. - -_tessellate = Tessellate() - -def _tessellate_callback(type): - # Registers a C version of a Python callback function for gluTessCallback(). - def _C(function): - f = _tessellate_callback_type[type](function) - gluTessCallback(_tessellator, type, cast(f, _CFUNCTYPE(None))) - return f - return _C - -@_tessellate_callback(GLU_TESS_BEGIN) -def _tessellate_begin(mode): - # Called to indicate the start of a triangle. - _tessellate.mode = mode - -@_tessellate_callback(GLU_TESS_VERTEX) -def _tessellate_vertex(vertex): - # Called to define the vertices of triangles created by the tessellation. - _tessellate.append(list(cast(vertex, POINTER(GLdouble))[0:2])) - -@_tessellate_callback(GLU_TESS_END) -def _tessellate_end(): - # Called to indicate the end of a primitive. - # GL_TRIANGLE_FAN defines triangles with a same origin (pt1). - if _tessellate.mode in (GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP): - pt1 = _tessellate.pop(0) - pt2 = _tessellate.pop(0) - while _tessellate: - pt3 = _tessellate.pop(0) - _tessellate.triangles.extend([pt1, pt2, pt3]) - if _tessellate.mode == GL_TRIANGLE_STRIP: - pt1 = pt2 - pt2 = pt3 - elif _tessellate.mode == GL_TRIANGLES: - _tessellate.triangles.extend(_tessellate) - elif _tessellate.mode == GL_LINE_LOOP: - pass - _tessellate.mode = None - _tessellate.clear() - -@_tessellate_callback(GLU_TESS_COMBINE) -def _tessellate_combine(coords, vertex_data, weights, dataOut): - # Called when the tessellation detects an intersection. - x, y, z = coords[0:3] - data = (GLdouble * 3)(x, y, z) - dataOut[0] = cast(pointer(data), POINTER(GLvoid)) - _tessellate._combined.append(data) - -@_tessellate_callback(GLU_TESS_ERROR) -def _tessellate_error(code): - # Called when an error occurs. - e, s, i = gluErrorString(code), "", 0 - while e[i]: - s += chr(e[i]) - i += 1 - raise TessellationError, s - -_cache = {} - -def tessellate(contours): - """ Returns a list of triangulated (x,y)-vertices from the given list of path contours, - where each contour is a list of (x,y)-tuples. - The vertices can be drawn with GL_TRIANGLES to render a complex polygon, for example: - glBegin(GL_TRIANGLES) - for x, y in tessellate(contours): - glVertex3f(x, y, 0) - glEnd() - """ - id = repr(contours) - if id in _tessellate.cache: - return _tessellate.cache[id] - # Push the given contours to C and call gluTessVertex(). - _tessellate.reset() - contours = [[(GLdouble * 3)(x, y, 0) for x, y in points] for points in contours] - gluTessBeginPolygon(_tessellator, None) - for vertices in contours: - gluTessBeginContour(_tessellator) - for v in vertices: - gluTessVertex(_tessellator, v, v) - gluTessEndContour(_tessellator) - gluTessEndPolygon(_tessellator) - # Update the tessellation cache with the results. - if len(_tessellate.cache) > TESSELLATION_CACHE: - del _tessellate.cache[_tessellate.queue.pop(0)] - _tessellate.queue.append(id) - _tessellate.cache[id] = _tessellate.triangles - return _tessellate.triangles - -tesselate = tessellate # Common spelling error. diff --git a/nodebox/graphics/noise.py b/nodebox/graphics/noise.py deleted file mode 100644 index b8f9669..0000000 --- a/nodebox/graphics/noise.py +++ /dev/null @@ -1,72 +0,0 @@ -from random import random -from math import floor - -class PerlinNoise: - - def __init__(self, permutation=None): - """ Initializes a Perlin noise generator with the given permutation pattern, - which is a list of 256 integers between 0-255. - """ - if not permutation: - permutation = [random()*256 for i in range(256)] - self._init([int(x) for x in permutation] * 2) - - def _init(self, p): - self._p = p - def _fade(self, t): - return t * t * t * (t * (t * 6 - 15) + 10) - def _lerp(self, t, a, b): - return a + t * (b - a) - def _grad(self, hash, x, y, z): - u, v, h = x, y, hash & 15 - if h >= 8: u = y - if h >= 4: - v = x - if h != 12 and h != 14: v = z - if (h&1) != 0: u = -u - if (h&2) != 0: v = -v - return u + v - - def generate(self, x, y=0, z=0): - """ Returns a smooth value between -1.0 and 1.0. - The x, y, z parameters determine the coordinates in the noise landscape. - Since the landscape is infinite, the actual value of a coordinate doesn't matter, - only the distance between successive steps. - The smaller the difference between steps, the smoother the noise sequence. - Steps between 0.005 and 0.1 usually work best. - """ - lerp, grad, fade, p = self._lerp, self._grad, self._fade, self._p - # Find unit cuve that contains point (x,y,z). - X = int(floor(x)) & 255 - Y = int(floor(y)) & 255 - Z = int(floor(z)) & 255 - # Find relative (x,y,z) of point in cube. - # Compute fade curves. - x, y, z = x-floor(x), y-floor(y), z-floor(z) - u, v, w = fade(x), fade(y), fade(z) - # Hash coordinates of the cube corners. - A = Y + p[X] - B = Y + p[X+1] - AA, AB, BA, BB = Z+p[A], Z+p[A+1], Z+p[B], Z+p[B+1] - # Add blended results from the cube corners. - return lerp(w, - lerp(v, lerp(u, grad(p[AA ], x , y , z ), - grad(p[BA ], x-1, y , z )), - lerp(u, grad(p[AB ], x , y-1, z ), - grad(p[BB ], x-1, y-1, z ))), - lerp(v, lerp(u, grad(p[AA+1], x , y , z-1), - grad(p[BA+1], x-1, y , z-1)), - lerp(u, grad(p[AB+1], x , y-1, z-1), - grad(p[BB+1], x-1, y-1, z-1)))) - -try: - # Fast C implementations: - from nodebox.ext.noise import init, generate - PerlinNoise._init = init - PerlinNoise.generate = generate -except: - pass - -_generator = PerlinNoise() -def noise(x, y=0, z=0): - return _generator.generate(x, y, z) diff --git a/nodebox/graphics/physics.py b/nodebox/graphics/physics.py deleted file mode 100644 index ec2a2cf..0000000 --- a/nodebox/graphics/physics.py +++ /dev/null @@ -1,1976 +0,0 @@ -#=== PHYSICS ========================================================================================= -# 2D physics functions. -# Authors: Tom De Smedt, Giorgio Olivero -# License: BSD (see LICENSE.txt for details). -# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) -# http://cityinabottle.org/nodebox - -# This module can benefit greatly from loading psyco. - -from math import sqrt, pow -from math import sin, cos, atan2, degrees, radians, pi -from random import random -from heapq import heappush, heappop -from warnings import warn - -# float("inf") doesn't work on windows. -INFINITE = 1e20 - -# This module is standalone, line(), ellipse() and Text.draw() -# must be either implemented or patched: -def line(x1, y1, x2, y2, stroke=(0,0,0,1), strokewidth=1): - pass -def ellipse(x, y, width, height, fill=(0,0,0,1), stroke=None, strokewidth=1): - pass - -class Text: - def __init__(self, string, **kwargs): - self.string = string - self.__dict__.update(kwargs) - def copy(self): - k = self.__dict__.copy() - k.pop("string") - return Text(self.string, **k) - def draw(self): - pass - -#===================================================================================================== - -#--- VECTOR ------------------------------------------------------------------------------------------ -# A Euclidean vector (sometimes called a geometric or spatial vector, or - as here - simply a vector) -# is a geometric object that has both a magnitude (or length) and direction. -# A vector is frequently represented by a line segment with an arrow. - -class Vector(object): - - def __init__(self, x=0, y=0, z=0, length=None, angle=None): - """ A vector represents a direction and a magnitude (or length). - Vectors can be added, subtracted, multiplied, divided, flipped, and 2D rotated. - Vectors are used in physics to represent velocity and acceleration. - """ - self.x = float(x) - self.y = float(y) - self.z = float(z) - if length is not None: - self.length = length - if angle is not None: - self.angle = angle - - def copy(self): - return Vector(self.x, self.y, self.z) - - def __getitem__(self, i): - return (self.x, self.y, self.z)[i] - def __setitem__(self, i, v): - setattr(self, ("x", "y", "z")[i], float(v)) - - def _get_xyz(self): - return (self.x, self.y, self.z) - def _set_xyz(self, (x,y,z)): - self.x = float(x) - self.y = float(y) - self.z = float(z) - xyz = property(_get_xyz, _set_xyz) - - def _get_xy(self): - return (self.x, self.y) - def _set_xy(self, (x,y)): - self.x = float(x) - self.y = float(y) - xy = property(_get_xy, _set_xy) - - def _get_length(self): - return sqrt(self.x**2 + self.y**2 + self.z**2) - def _set_length(self, n): - d = self.length or 1 - self.x *= n/d - self.y *= n/d - self.z *= n/d - length = magnitude = property(_get_length, _set_length) - - def distance(self, v): - """ Returns the distance between two vectors, - e.g. if two vectors would be two sides of a triangle, returns the third side. - """ - dx = v.x - self.x - dy = v.y - self.y - dz = v.z - self.z - return sqrt(dx**2 + dy**2 + dz**2) - - def distance2(self, v): - # Squared distance, avoiding the costly root calculation. - return (v.x-self.x)**2 + (v.y-self.y)**2 + (v.z-self.z)**2 - - def normalize(self): - """ Normalizes the vector to a unit vector with length=1. - """ - d = self.length or 1 - self.x /= d - self.y /= d - self.z /= d - - def _normalized(self): - """ Yields a new vector that is the normalized vector of this vector. - """ - d = self.length - if d == 0: - return self.copy() - return Vector(self.x/d, self.y/d, self.z/d) - normalized = unit = property(_normalized) - - def reverse(self): - """ Reverses the direction of the vector so it points in the opposite direction. - """ - self.x = -self.x - self.y = -self.y - self.z = -self.z - flip = reverse - - def _reversed(self): - """ Yields a new vector pointing in the opposite direction of this vector. - """ - return Vector(-self.x, -self.y, -self.z) - reversed = flipped = inverse = property(_reversed) - - # v.normal, v.angle, v.rotate(), v.rotated() and v.angle_to() are defined in 2D. - # v.in2D.rotate() is here for decorational purposes. - @property - def in2D(self): - return self - - def _orthogonal(self): - """ Yields a new vector whose 2D angle is 90 degrees (perpendicular) to this vector. - In 3D, there would be many perpendicular vectors. - """ - return Vector(self.y, -self.x, self.z) - orthogonal = perpendicular = normal = property(_orthogonal) - - def _get_angle(self): - """ Yields the 2D direction of the vector. - """ - return degrees(atan2(self.y, self.x)) - def _set_angle(self, degrees): - d = self.length - self.x = cos(radians(degrees)) * d - self.y = sin(radians(degrees)) * d - angle = direction = property(_get_angle, _set_angle) - - def rotate(self, degrees): - """ Rotates the direction of the vector in 2D. - """ - self.angle += degrees - - def rotated(self, degrees): - """ Returns a copy of the vector with direction rotated in 2D. - """ - v = self.copy() - v.rotate(degrees) - return v - - def angle_to(self, v): - """ Returns the 2D angle between two vectors. - """ - return degrees(atan2(v.y, v.x) - atan2(self.y, self.x)) - angle_between = angle_to - - # Arithmetic operators. - # + - * / returns new vector objects. - def __add__(self, v): - if isinstance(v, (int, float)): - return Vector(self.x+v, self.y+v, self.z+v) - return Vector(self.x+v.x, self.y+v.y, self.z+v.z) - def __sub__(self, v): - if isinstance(v, (int, float)): - return Vector(self.x-v, self.y-v, self.z-v) - return Vector(self.x-v.x, self.y-v.y, self.z-v.z) - def __mul__(self, v): - if isinstance(v, (int, float)): - return Vector(self.x*v, self.y*v, self.z*v) - return Vector(self.x*v.x, self.y*v.y, self.z*v.z) - def __div__(self, v): - if isinstance(v, (int, float)): - return Vector(self.x/v, self.y/v, self.z/v) - return Vector(self.x/v.x, self.y/v.y, self.z/v.z) - - # += -= *= /= modify the vector coordinates in-place. - def __iadd__(self, v): - if isinstance(v, (int, float)): - self.x+=v; self.y+=v; self.z+=v; return self - self.x+=v.x; self.y+=v.y; self.z+=v.z; return self - def __isub__(self, v): - if isinstance(v, (int, float)): - self.x-=v; self.y-=v; self.z-=v; return self - self.x-=v.x; self.y-=v.y; self.z-=v.z; return self - def __imul__(self, v): - if isinstance(v, (int, float)): - self.x*=v; self.y*=v; self.z*=v; return self - self.x*=v.x; self.y*=v.y; self.z*=v.z; return self - def __idiv__(self, v): - if isinstance(v, (int, float)): - self.x/=v; self.y/=v; self.z/=v; return self - self.x/=v.x; self.y/=v.y; self.z/=v.z; return self - - def dot(self, v): - """ Returns a scalar that is the dot product between the two vectors. - """ - return self.x*v.x + self.y*v.y + self.z*v.z - - def cross(self, v): - """ Returns a new vector that is the cross product between the two vectors. - """ - return Vector(self.y*v.z - self.z*v.y, - self.z*v.x - self.x*v.z, - self.x*v.y - self.y*v.x) - - def __neg__(self): - return Vector(-self.x, -self.y, -self.z) - - def __eq__(self, v): - return isinstance(v, Vector) and self.x == v.x and self.y == v.y and self.z == v.z - def __ne__(self, v): - return not self.__eq__(v) - - def __repr__(self): - return "%s(%.2f, %.2f, %.2f)" % (self.__class__.__name__, self.x, self.y, self.z) - - def draw(self, x, y): - """ Draws the vector in 2D (z-axis is ignored). - Set stroke() and strokewidth() first. - """ - ellipse(x, y, 4, 4) - line(x, y, x+self.x, y+self.y) - -#===================================================================================================== - -#--- FLOCKING ---------------------------------------------------------------------------------------- -# Boids is an artificial life program, developed by Craig Reynolds in 1986, -# which simulates the flocking behavior of birds. -# Boids is an example of emergent behavior, the complexity of Boids arises -# from the interaction of individual agents adhering to a set of simple rules: -# - separation: steer to avoid crowding local flockmates, -# - alignment: steer towards the average heading of local flockmates, -# - cohesion: steer to move toward the average position of local flockmates. -# Unexpected behavior, such as splitting flocks and reuniting after avoiding obstacles, -# can be considered emergent. The boids framework is often used in computer graphics, -# providing realistic-looking representations of flocks of birds and other creatures, -# such as schools of fish or herds of animals. - -_UID = 0 -def _uid(): - global _UID; _UID+=1; return _UID - -class Boid: - - def __init__(self, flock, x=0, y=0, z=0, sight=70, space=30): - """ An agent in a flock with an (x,y,z)-position subject to different forces. - - sight : radius of local flockmates when calculating cohesion and alignment. - - space : radius of personal space when calculating separation. - """ - self._id = _uid() - self.flock = flock - self.x = x - self.y = y - self.z = z - self.velocity = Vector(random()*2-1, random()*2-1, random()*2-1) - self.target = None # A target Vector towards which the boid will steer. - self.sight = sight # The radius of cohesion and alignment, and visible obstacles. - self.space = space # The radius of separation. - self.dodge = False # Avoiding an obstacle? - self.crowd = 0 # Percentage (0.0-1.0) of flockmates within sight. - - def __eq__(self, other): - # Comparing boids by id makes it significantly faster. - return isinstance(other, Boid) and self._id == other._id - def __ne__(self, other): - return not self.__eq__(other) - - def copy(self): - b = Boid(self.flock, self.x, self.y, self.z, self.sight, self.space) - b.velocity = self.velocity.copy() - b.target = self.target - return b - - @property - def heading(self): - """ The boid's heading as an angle in degrees. - """ - return self.velocity.angle - - @property - def depth(self): - """ The boid's relative depth (0.0-1.0) in the flock's container box. - """ - return not self.flock.depth and 1.0 or max(0.0, min(1.0, self.z / self.flock.depth)) - - def near(self, boid, distance=50): - """ Returns True if the given boid is within distance. - """ - # Distance is measured in a box instead of a sphere for performance. - return abs(self.x - boid.x) < distance and \ - abs(self.y - boid.y) < distance and \ - abs(self.z - boid.z) < distance - - def separation(self, distance=25): - """ Returns steering velocity (vx,vy,vz) to avoid crowding local flockmates. - """ - vx = vy = vz = 0.0 - for b in self.flock: - if b != self: - if abs(self.x-b.x) < distance: vx += self.x - b.x - if abs(self.y-b.y) < distance: vy += self.y - b.y - if abs(self.z-b.z) < distance: vz += self.z - b.z - return vx, vy, vz - - def alignment(self, distance=50): - """ Returns steering velocity (vx,vy,vz) towards the average heading of local flockmates. - """ - vx = vy = vz = n = 0.0 - for b in self.flock: - if b != self and b.near(self, distance): - vx += b.velocity.x - vy += b.velocity.y - vz += b.velocity.z; n += 1 - if n: - return (vx/n-self.velocity.x), (vy/n-self.velocity.y), (vz/n-self.velocity.z) - return vx, vy, vz - - def cohesion(self, distance=40): - """ Returns steering velocity (vx,vy,vz) towards the average position of local flockmates. - """ - vx = vy = vz = n = 0.0 - for b in self.flock: - if b != self and b.near(self, distance): - vx += b.x - vy += b.y - vz += b.z; n += 1 - # Calculate percentage of flockmates within sight. - self.crowd = float(n) / (len(self.flock) or 1) - if n: - return (vx/n-self.x), (vy/n-self.y), (vz/n-self.z) - return vx, vy, vz - - def avoidance(self): - """ Returns steering velocity (vx,vy,0) to avoid 2D obstacles. - The boid is not guaranteed to avoid collision. - """ - vx = vy = 0.0 - self.dodge = False - for o in self.flock.obstacles: - dx = o.x - self.x - dy = o.y - self.y - d = sqrt(dx**2 + dy**2) # Distance to obstacle. - s = (self.sight + o.radius) # Visibility range. - if d < s: - self.dodge = True - # Force grows exponentially from 0.0 to 1.0, - # where 1.0 means the boid touches the obstacle circumference. - f = (d-o.radius) / (s-o.radius) - f = (1-f)**2 - if d < o.radius: - f *= 4 - #self.velocity.reverse() - vx -= dx * f - vy -= dy * f - return (vx, vy, 0) - - def limit(self, speed=10.0): - """ Limits the boid's velocity (the boid can momentarily go very fast). - """ - v = self.velocity - m = max(abs(v.x), abs(v.y), abs(v.z)) or 1 - if abs(v.x) > speed: v.x = v.x / m * speed - if abs(v.y) > speed: v.y = v.y / m * speed - if abs(v.z) > speed: v.z = v.z / m * speed - - def update(self, separation=0.2, cohesion=0.2, alignment=0.6, avoidance=0.6, target=0.2, limit=15.0): - """ Updates the boid's velocity based on the cohesion, separation and alignment forces. - - separation: force that keeps boids apart. - - cohesion : force that keeps boids closer together. - - alignment : force that makes boids move in the same direction. - - avoidance : force that steers the boid away from obstacles. - - target : force that steers the boid towards a target vector. - - limit : maximum velocity. - """ - f = 0.1 - m1, m2, m3, m4, m5 = separation*f, cohesion*f, alignment*f, avoidance*f, target*f - vx1, vy1, vz1 = self.separation(self.space) - vx2, vy2, vz2 = self.cohesion(self.sight) - vx3, vy3, vz3 = self.alignment(self.sight) - vx4, vy4, vz4 = self.avoidance() - vx5, vy5, vz5 = self.target and ( - (self.target.x-self.x), - (self.target.y-self.y), - (self.target.z-self.z)) or (0,0,0) - self.velocity.x += m1*vx1 + m2*vx2 + m3*vx3 + m4*vx4 + m5*vx5 - self.velocity.y += m1*vy1 + m2*vy2 + m3*vy3 + m4*vy4 + m5*vy5 - self.velocity.z += m1*vz1 + m2*vz2 + m3*vz3 + m4*vz4 + m5*vz5 - self.velocity.z = self.flock.depth and self.velocity.z or 0 # No z-axis for Flock.depth=0 - self.limit(speed=limit) - self.x += self.velocity.x - self.y += self.velocity.y - self.z += self.velocity.z - - def seek(self, vector): - """ Sets the given Vector as the boid's target. - """ - self.target = vector - - def __repr__(self): - return "Boid(x=%.1f, y=%.1f, z=%.1f)" % (self.x, self.y, self.z) - -class Obstacle: - - def __init__(self, x=0, y=0, z=0, radius=10): - """ An obstacle with an (x, y, z) position and a radius. - Boids will steer around obstacles that the flock is aware of, and that they can see. - """ - self.x = x - self.y = y - self.z = z - self.radius = radius - - def copy(self): - return Obstacle(self.x, self.y, self.z, self.radius) - - def __repr__(self): - return "Obstacle(x=%.1f, y=%.1f, z=%.1f, radius=%.1f)" % (self.x, self.y, self.z, self.radius) - -class Flock(list): - - def __init__(self, amount, x, y, width, height, depth=100.0, obstacles=[]): - """ A flock of the given amount of boids, confined to a box. - Obstacles can be added to Flock.obstacles (boids will steer away from them). - """ - self.x = x - self.y = y - self.width = width - self.height = height - self.depth = depth - self.scattered = False - self.gather = 0.05 - self.obstacles = [] - for i in range(amount): - # Boids will originate from the center of the flocking area. - b = Boid(self, - self.x + 0.5 * (width or 0), - self.y + 0.5 * (height or 0), - 0.5 * (depth or 0)) - self.append(b) - - @property - def boids(self): - return self - - def copy(self): - f = Flock(0, self.x, self.y, self.width, self.height, self.depth) - f.scattered = self.scattered - f.gather = self.gather - f.obstacles = [o.copy() for o in self.obstacles] - for b in self: - f.append(b.copy()) - return f - - def seek(self, target): - """ Sets the target vector of all boids in the flock (None for no target). - """ - for b in self: - b.seek(target) - - def sight(self, distance): - for b in self: - b.sight = distance - - def space(self, distance): - for b in self: - b.space = distance - - def constrain(self, force=1.0, teleport=False): - """ Keep the flock inside the rectangular flocking area. - The given force determines how fast the boids will swivel when near an edge. - Alternatively, with teleport=True boids that cross a 2D edge teleport to the opposite side. - """ - f = 5 - def _teleport(b): - if b.x < self.x: - b.x = self.x + self.width - if b.x > self.x + self.width: - b.x = self.x - if b.y < self.y: - b.y = self.y + self.height - if b.y > self.y + self.height: - b.y = self.y - def _constrain(b): - if b.x < self.x: - b.velocity.x += force * f * random() - if b.x > self.x + self.width: - b.velocity.x -= force * f * random() - if b.y < self.y: - b.velocity.y += force * f * random() - if b.y > self.y + self.height: - b.velocity.y -= force * f * random() - for b in self: - if b.z < 0: - b.velocity.z += force * f * random() - if b.z > self.depth: - b.velocity.z -= force * f * random() - teleport and _teleport(b) \ - or _constrain(b) - - def scatter(self, gather=0.05): - """ Scatters the flock, until Flock.scattered=False. - Flock.gather is the chance (0.0-1.0, or True/False) that the flock will reunite by itself. - """ - self.scattered = True - self.gather = gather - - def update(self, separation=0.2, cohesion=0.2, alignment=0.6, avoidance=0.6, target=0.2, limit=15.0, constrain=1.0, teleport=False): - """ Updates the boid velocities based on the given forces. - Different forces elicit different flocking behavior; fine-tuning them can be delicate. - """ - if self.scattered: - # When scattered, make the boid cohesion negative and diminish alignment. - self.scattered = (random() > self.gather) - cohesion = -0.01 - alignment *= 0.25 - for b in self: - b.update(separation, cohesion, alignment, avoidance, target, limit) - self.constrain(force=constrain, teleport=teleport) - - def by_depth(self): - """ Returns the boids in the flock sorted by depth (z-axis). - """ - return sorted(self, key=lambda boid: boid.z) - - def __repr__(self): - return "Flock(%s)" % repr(list(self)) - -flock = Flock - -#=== SYSTEM ========================================================================================== -# A computer graphics technique to simulate certain fuzzy phenomena, -# which are otherwise very hard to reproduce with conventional rendering techniques: -# fire, explosions, smoke, moving water, sparks, falling leaves, clouds, fog, snow, dust, -# meteor tails, hair, fur, grass, or abstract visual effects like glowing trails, magic spells. - -#--- FORCE ------------------------------------------------------------------------------------------- - -class Force: - - def __init__(self, particle1, particle2, strength=1.0, threshold=100.0): - """ An attractive or repulsive force that causes objects with a mass to accelerate. - A negative strength indicates an attractive force. - """ - self.particle1 = particle1 - self.particle2 = particle2 - self.strength = strength - self.threshold = threshold - - def apply(self): - """ Applies the force between two particles, based on the distance and mass of the particles. - """ - # Distance has a minimum threshold to keep forces from growing too large, - # e.g. distance 100 divides force by 10000, distance 5 only by 25. - # Decreasing the threshold moves particles that are very close to each other away faster. - dx = self.particle2.x - self.particle1.x - dy = self.particle2.y - self.particle1.y - d = sqrt(dx*dx + dy*dy) - d = max(d, self.threshold) - # The force between particles increases according to their weight. - # The force decreases as distance between them increases. - f = 10.0 * -self.strength * self.particle1.mass * self.particle2.mass - f = f / (d*d) - fx = f * dx / d - fy = f * dy / d - self.particle1.force.x += fx - self.particle1.force.y += fy - self.particle2.force.x -= fx - self.particle2.force.y -= fy - - def __repr__(self): - return "Force(strength=%.2f)" % self.strength - -force = Force - -#--- SPRING ------------------------------------------------------------------------------------------ - -class Spring: - - def __init__(self, particle1, particle2, length, strength=1.0): - """ A force that exerts attractive resistance when its length changes. - A spring acts as a flexible (but secure) connection between two particles. - """ - self.particle1 = particle1 - self.particle2 = particle2 - self.strength = strength - self.length = length - self.snapped = False - - def snap(self): - """ Breaks the connection between the two particles. - """ - self.snapped = True - - def apply(self): - """ Applies the force between two particles. - """ - # Distance between two particles. - dx = self.particle2.x - self.particle1.x - dy = self.particle2.y - self.particle1.y - d = sqrt(dx*dx + dy*dy) - if d == 0: - return - # The attractive strength decreases for heavy particles. - # The attractive strength increases when the spring is stretched. - f = 10.0 * self.strength / (self.particle1.mass * self.particle2.mass) - f = f * (d - self.length) - fx = f * dx / d - fy = f * dy / d - self.particle1.force.x += fx - self.particle1.force.y += fy - self.particle2.force.x -= fx - self.particle2.force.y -= fy - - def draw(self, **kwargs): - line(self.particle1.x, self.particle1.y, - self.particle2.x, self.particle2.y, **kwargs) - - def __repr__(self): - return "Spring(strength='%.2f', length='%.2f')" % (self.strength, self.length) - -spring = Spring - -#--- PARTICLE ---------------------------------------------------------------------------------------- - -MASS = "mass" - -class Particle: - - def __init__(self, x, y, velocity=(0.0,0.0), mass=10.0, radius=10.0, life=None, fixed=False): - """ An object with a mass subjected to attractive and repulsive forces. - The object's velocity is an inherent force (e.g. a rocket propeller to escape gravity). - """ - self._id = _uid() - self.x = x + random() - self.y = y + random() - self.mass = mass - self.radius = radius == MASS and mass or radius - self.velocity = isinstance(velocity, tuple) and Vector(*velocity) or velocity - self.force = Vector(0.0, 0.0) # Force accumulator. - self.life = life - self._age = 0.0 - self.dead = False - self.fixed = fixed - - @property - def age(self): - # Yields the particle's age as a number between 0.0 and 1.0. - return self.life and min(1.0, float(self._age) / self.life) or 0.0 - - def draw(self, **kwargs): - r = self.radius * (1 - self.age) - ellipse(self.x, self.y, r*2, r*2, **kwargs) - - def __eq__(self, other): - return isinstance(other, Particle) and self._id == other._id - def __ne__(self, other): - return not self.__eq__(other) - - def __repr__(self): - return "Particle(x=%.1f, y=%.1f, radius=%.1f, mass=%.1f)" % ( - self.x, self.y, self.radius, self.mass) - -particle = Particle - -#--- SYSTEM ------------------------------------------------------------------------------------------ - -class flist(list): - - def __init__(self, system): - # List of forces or springs that keeps System.dynamics in synch. - self.system = system - - def insert(self, i, force): - list.insert(self, i, force) - self.system._dynamics.setdefault(force.particle1._id, []).append(force) - self.system._dynamics.setdefault(force.particle2._id, []).append(force) - def append(self, force): - self.insert(len(self), force) - def extend(self, forces): - for f in forces: self.append(f) - - def pop(self, i): - f = list.pop(self, i) - self.system._dynamics.pop(force.particle1._id) - self.system._dynamics.pop(force.particle2._id) - return f - def remove(self, force): - i = self.index(force); self.pop(i) - -class System(object): - - def __init__(self, gravity=(0,0), drag=0.0): - """ A collection of particles and the forces working on them. - """ - self.particles = [] - self.emitters = [] - self.forces = flist(self) - self.springs = flist(self) - self.gravity = isinstance(gravity, tuple) and Vector(*gravity) or gravity - self.drag = drag - self._dynamics = {} # Particle id linked to list of applied forces. - - def __len__(self): - return len(self.particles) - def __iter__(self): - return iter(self.particles) - def __getitem__(self, i): - return self.particles[i] - - def extend(self, x): - for x in x: self.append(x) - def append(self, x): - if isinstance(x, Particle) and not x in self.particles: - self.particles.append(x) - elif isinstance(x, Force): - self.forces.append(x) - elif isinstance(x, Spring): - self.springs.append(x) - elif isinstance(x, Emitter): - self.emitters.append(x) - self.extend(x.particles) - x.system = self - - def _cross(self, f=lambda particle1, particle2: None, source=None, particles=[]): - # Applies function f to any two given particles in the list, - # or between source and any other particle if source is given. - P = particles or self.particles - for i, p1 in enumerate(P): - if source is None: - [f(p1, p2) for p2 in P[i+1:]] - else: - f(source, p1) - - def force(self, strength=1.0, threshold=100, source=None, particles=[]): - """ The given force is applied between each two particles. - The effect this yields (with a repulsive force) is an explosion. - - source: one vs. all, apply the force to this particle with all others. - - particles: a list of particles to apply the force to (some vs. some or some vs. source). - Be aware that 50 particles wield yield 1250 forces: O(n**2/2); or O(n) with source. - The force is applied to particles present in the system, - those added later on are not subjected to the force. - """ - f = lambda p1, p2: self.forces.append(Force(p1, p2, strength, threshold)) - self._cross(f, source, particles) - - def dynamics(self, particle, type=None): - """ Returns a list of forces working on the particle, optionally filtered by type (e.g. Spring). - """ - F = self._dynamics.get(isinstance(particle, Particle) and particle._id or particle, []) - F = [f for f in F if type is None or isinstance(f, type)] - return F - - def limit(self, particle, m=None): - """ Limits the movement of the particle to m. - When repulsive particles are close to each other, their force can be very high. - This results in large movement steps, and gaps in the animation. - This can be remedied by limiting the total force. - """ - # The right way to do it requires 4x sqrt(): - # if m and particle.force.length > m: - # particle.force.length = m - # if m and particle.velocity.length > m: - # particle.velocity.length = m - if m is not None: - for f in (particle.force, particle.velocity): - if abs(f.x) > m: - f.y *= m / abs(f.x) - f.x *= m / abs(f.x) - if abs(f.y) > m: - f.x *= m / abs(f.y) - f.y *= m / abs(f.y) - - def update(self, limit=30): - """ Updates the location of the particles by applying all the forces. - """ - for e in self.emitters: - # Fire particles from emitters. - e.update() - for p in self.particles: - # Apply gravity. Heavier objects have a stronger attraction. - p.force.x = 0 - p.force.y = 0 - p.force.x += 0.1 * self.gravity.x * p.mass - p.force.y += 0.1 * -self.gravity.y * p.mass - for f in self.forces: - # Apply attractive and repulsive forces between particles. - if not f.particle1.dead and \ - not f.particle2.dead: - f.apply() - for s in self.springs: - # Apply spring forces between particles. - if not s.particle1.dead and \ - not s.particle2.dead and \ - not s.snapped: - s.apply() - for p in self.particles: - if not p.fixed: - # Apply drag. - p.velocity.x *= 1.0 - min(1.0, self.drag) - p.velocity.y *= 1.0 - min(1.0, self.drag) - # Apply velocity. - p.force.x += p.velocity.x - p.force.y += p.velocity.y - # Limit the accumulated force and update the particle's position. - self.limit(p, limit) - p.x += p.force.x - p.y += p.force.y - if p.life: - # Apply lifespan. - p._age += 1 - p.dead = p._age > p.life - - @property - def dead(self): - # Yields True when all particles are dead (and we don't need to update anymore). - for p in self.particles: - if not p.dead: return False - return True - - def draw(self, **kwargs): - """ Draws the system at the current iteration. - """ - for s in self.springs: - if not s.particle1.dead and \ - not s.particle2.dead and \ - not s.snapped: - s.draw(**kwargs) - for p in self.particles: - if not p.dead: - p.draw(**kwargs) - - def __repr__(self): - return "System(particles=%i, forces=%i, springs=%i)" % \ - (len(self.particles), len(self.forces), len(self.springs)) - -system = System - -# Notes: -# While this system is interesting for many effects, it is unstable. -# If for example very strong springs are applied, particles will start "shaking". -# This is because the forces are simply added to the particle's position instead of integrated. -# See also: -# http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/particle/ -# http://local.wasp.uwa.edu.au/~pbourke/miscellaneous/particle/particlelib.c - -#def euler_derive(particle, dt=0.1): -# particle.x += particle.velocity.x * dt -# particle.y += particle.velocity.y * dt -# particle.velocity.x += particle.force.x / particle.mass * dt -# particle.velocity.y += particle.force.y / particle.mass * dt - -# If this is applied, springs will need a velocity dampener: -#fx = f + 0.01 + (self.particle2.velocity.x - self.particle1.velocity.x) * dx / d -#fy = f + 0.01 + (self.particle2.velocity.y - self.particle1.velocity.y) * dy / d - -# In pure Python this is slow, since only 1/10 of the force is applied each System.update(). - -#--- EMITTER ----------------------------------------------------------------------------------------- - -class Emitter(object): - - def __init__(self, x, y, angle=0, strength=1.0, spread=10): - """ A source that shoots particles in a given direction with a given strength. - """ - self.system = None # Set when appended to System. - self.particles = [] - self.x = x - self.y = y - self.velocity = Vector(1, 1, length=strength, angle=angle) - self.spread = spread # Angle-of-view. - self._i = 0 # Current iteration. - - def __len__(self): - return len(self.particles) - def __iter__(self): - return iter(self.particles) - def __getitem__(self, i): - return self.particles[i] - - def extend(self, x, life=100): - for x in x: self.append(x, life) - def append(self, particle, life=100): - particle.life = particle.life or life - particle._age = particle.life - particle.dead = True - self.particles.append(particle) - if self.system is not None: - # Also append the particle to the system the emitter is part of. - self.system.append(particle) - - def _get_angle(self): - return self.velocity.angle - def _set_angle(self, v): - self.velocity.angle = v - - angle = property(_get_angle, _set_angle) - - def _get_strength(self): - return self.velocity.length - def _set_strength(self, v): - self.velocity.length = max(v, 0.01) - - strength = length = magnitude = property(_get_strength, _set_strength) - - def update(self): - """ Update the system and respawn dead particles. - When a particle dies, it can be reused as a new particle fired from the emitter. - This is more efficient than creating a new Particle object. - """ - self._i += 1 # Respawn occurs gradually. - p = self.particles[self._i % len(self.particles)] - if p.dead: - p.x = self.x - p.y = self.y - p.velocity = self.velocity.rotated(self.spread * 0.5 * (random()*2-1)) - p._age = 0 - p.dead = False - -emitter = Emitter - -#=== GRAPH =========================================================================================== -# Graph visualization is a way of representing information as diagrams of abstract graphs and networks. -# Automatic graph drawing has many important applications in software engineering, -# database and web design, networking, and in visual interfaces for many other domains. - -#--- NODE -------------------------------------------------------------------------------------------- - -def deepcopy(o): - # A color can be represented as a tuple or as a nodebox.graphics.Color object, - # in which case it needs to be copied by invoking Color.copy(). - if o is None: - return o - if hasattr(o, "copy"): - return o.copy() - if isinstance(o, (basestring, bool, int, float, long, complex)): - return o - if isinstance(o, (list, tuple, set)): - return o.__class__(deepcopy(v) for v in o) - if isinstance(o, dict): - return dict((deepcopy(k), deepcopy(v)) for k,v in o.iteritems()) - raise Exception, "don't know how to copy %s" % o.__class__.__name__ - -class Node(object): - - def __init__(self, id="", radius=5, **kwargs): - """ A node with a unique id in the graph. - Node.id is drawn as a text label, unless optional parameter text=False. - Optional parameters include: fill, stroke, strokewidth, text, font, fontsize, fontweight. - """ - self.graph = None - self.links = Links() - self.id = id - self._x = 0.0 # Calculated by Graph.layout.update(). - self._y = 0.0 # Calculated by Graph.layout.update(). - self.force = Vector(0.0, 0.0) - self.radius = radius - self.fixed = kwargs.pop("fixed", False) - self.fill = kwargs.pop("fill", None) - self.stroke = kwargs.pop("stroke", (0,0,0,1)) - self.strokewidth = kwargs.pop("strokewidth", 1) - self.text = kwargs.get("text", True) and \ - Text(isinstance(id, unicode) and id or str(id).decode("utf-8", "ignore"), - width = 85, - fill = kwargs.pop("text", (0,0,0,1)), - fontsize = kwargs.pop("fontsize", 11), **kwargs) or None - self._weight = None # Calculated by Graph.eigenvector_centrality(). - self._centrality = None # Calculated by Graph.betweenness_centrality(). - - @property - def _distance(self): - # Graph.distance controls the (x,y) spacing between nodes. - return self.graph and float(self.graph.distance) or 1.0 - - def _get_x(self): - return self._x * self._distance - def _get_y(self): - return self._y * self._distance - def _set_x(self, v): - self._x = v / self._distance - def _set_y(self, v): - self._y = v / self._distance - - x = property(_get_x, _set_x) - y = property(_get_y, _set_y) - - @property - def edges(self): - """ Yields a list of edges from/to the node. - """ - return self.graph is not None \ - and [e for e in self.graph.edges if self.id in (e.node1.id, e.node2.id)] \ - or [] - - @property - def weight(self): - """ Yields eigenvector centrality as a number between 0.0-1.0. - """ - if self.graph and self._weight is None: - self.graph.eigenvector_centrality() - return self._weight - - @property - def centrality(self): - """ Yields betweenness centrality as a number between 0.0-1.0. - """ - if self.graph and self._centrality is None: - self.graph.betweenness_centrality() - return self._centrality - - def flatten(self, depth=1, traversable=lambda node, edge: True, _visited=None): - """ Recursively lists the node and nodes linked to it. - Depth 0 returns a list with the node. - Depth 1 returns a list with the node and all the directly linked nodes. - Depth 2 includes the linked nodes' links, and so on. - """ - _visited = _visited or {} - _visited[self.id] = (self, depth) - if depth >= 1: - for n in self.links: - if n.id not in _visited or _visited[n.id][1] < depth-1: - if traversable(self, self.links.edges[n.id]): - n.flatten(depth-1, traversable, _visited) - return [n for n,d in _visited.values()] # Fast, but not order-preserving. - - def draw(self, weighted=False): - """ Draws the node as a circle with the given radius, fill, stroke and strokewidth. - Draws the node centrality as a shadow effect when weighted=True. - Draws the node text label. - Override this method in a subclass for custom drawing. - """ - # Draw the node weight as a shadow (based on node betweenness centrality). - if weighted is not False and self.centrality > (weighted==True and -1 or weighted): - w = self.centrality * 35 - ellipse( - self.x, - self.y, - self.radius*2 + w, - self.radius*2 + w, fill=(0,0,0,0.2), stroke=None) - # Draw the node. - ellipse( - self.x, - self.y, - self.radius*2, - self.radius*2, fill=self.fill, stroke=self.stroke, strokewidth=self.strokewidth) - # Draw the node text label. - if self.text: - self.text.draw( - self.x + self.radius, - self.y + self.radius) - - def contains(self, x, y): - """ Returns True if the given coordinates (x, y) are inside the node radius. - """ - return abs(self.x - x) < self.radius*2 and \ - abs(self.y - y) < self.radius*2 - - def __repr__(self): - return "%s(id=%s)" % (self.__class__.__name__, repr(self.id)) - - def __eq__(self, node): - return isinstance(node, Node) and self.id == node.id - def __ne__(self, node): - return not self.__eq__(node) - -class Links(list): - - def __init__(self): - """ A list in which each node has an associated edge. - The edge() method returns the edge for a given node id. - """ - self.edges = dict() - - def append(self, node, edge=None): - if node.id not in self.edges: - list.append(self, node) - self.edges[node.id] = edge - - def remove(self, node): - list.remove(self, node) - self.edges.pop(node.id, None) - - def edge(self, node): - return self.edges.get(isinstance(node, Node) and node.id or node) - -#--- EDGE -------------------------------------------------------------------------------------------- - -coordinates = lambda x, y, d, a: (x + d*cos(radians(a)), y + d*sin(radians(a))) - -class Edge(object): - - def __init__(self, node1, node2, weight=0.0, length=1.0, type=None, stroke=(0,0,0,1), strokewidth=1): - """ A connection between two nodes. - Its weight indicates the importance (not the cost) of the connection. - Its type is useful in a semantic network (e.g. "is-a", "is-part-of", ...) - """ - self.node1 = node1 - self.node2 = node2 - self._weight = weight - self.length = length - self.type = type - self.stroke = stroke - self.strokewidth = strokewidth - - def _get_weight(self): - return self._weight - def _set_weight(self, v): - self._weight = v - # Clear cached adjacency map in the graph, since edge weights have changed. - if self.node1.graph is not None: - self.node1.graph._adjacency = None - if self.node2.graph is not None: - self.node2.graph._adjacency = None - - weight = property(_get_weight, _set_weight) - - def draw(self, weighted=False, directed=False): - """ Draws the edge as a line with the given stroke and strokewidth (increased with Edge.weight). - Override this method in a subclass for custom drawing. - """ - w = weighted and self.weight or 0 - line( - self.node1.x, - self.node1.y, - self.node2.x, - self.node2.y, stroke=self.stroke, strokewidth=self.strokewidth+w) - if directed: - self.draw_arrow(stroke=self.stroke, strokewidth=self.strokewidth+w) - - def draw_arrow(self, **kwargs): - """ Draws the direction of the edge as an arrow on the rim of the receiving node. - """ - x0, y0 = self.node1.x, self.node1.y - x1, y1 = self.node2.x, self.node2.y - # Find the edge's angle based on node1 and node2 position. - a = degrees(atan2(y1-y0, x1-x0)) - # The arrow points to node2's rim instead of it's center. - r = self.node2.radius - d = sqrt(pow(x1-x0, 2) + pow(y1-y0, 2)) - x01, y01 = coordinates(x0, y0, d-r-1, a) - # Find the two other arrow corners under the given angle. - r = max(kwargs.get("strokewidth", 1) * 3, 6) - dx1, dy1 = coordinates(x01, y01, -r, a-20) - dx2, dy2 = coordinates(x01, y01, -r, a+20) - line(x01, y01, dx1, dy1, **kwargs) - line(x01, y01, dx2, dy2, **kwargs) - line(dx1, dy1, dx2, dy2, **kwargs) - - def __repr__(self): - return "%s(id1=%s, id2=%s)" % (self.__class__.__name__, repr(self.node1.id), repr(self.node2.id)) - -#--- GRAPH ------------------------------------------------------------------------------------------- - -# Return value of Graph.shortest_paths(). -# Dictionary values can be accessed by Node as well as by node id. -class nodedict(dict): - def __init__(self, graph, *args, **kwargs): - dict.__init__(self, *args, **kwargs) - self.graph = graph - def __contains__(self, node): - return dict.__contains__(self, self.graph.get(node, node)) - def __getitem__(self, node): - return dict.__getitem__(self, isinstance(node, Node) and node or self.graph[node]) - def get(self, node, default=None): - return dict.get(self, self.graph.get(node, node), default) - -def unique(list): - u, b = [], {} - for item in list: - if item not in b: u.append(item); b[item]=True - return u - -# Graph layouts: -SPRING = "spring" - -# Graph node sort order: -WEIGHT, CENTRALITY = "weight", "centrality" - -ALL = "all" - -class Graph(dict): - - def __init__(self, layout=SPRING, distance=10.0): - """ A network of nodes connected by edges that can be drawn with a given layout. - """ - self.nodes = [] # List of Node objects. - self.edges = [] # List of Edge objects. - self.root = None - self._adjacency = None # Cached adjacency() dict. - self.layout = layout==SPRING and GraphSpringLayout(self) or GraphLayout(self) - self.distance = distance - - def __getitem__(self, id): - try: - return dict.__getitem__(self, id) - except KeyError: - raise KeyError, "no node with id '%s' in graph" % id - - def append(self, base, *args, **kwargs): - """ Appends a Node or Edge to the graph: Graph.append(Node, id="rabbit"). - """ - kwargs["base"] = base - if issubclass(base, Node): - return self.add_node(*args, **kwargs) - if issubclass(base, Edge): - return self.add_edge(*args, **kwargs) - - def add_node(self, id, *args, **kwargs): - """ Appends a new Node to the graph. - An optional base parameter can be used to pass a subclass of Node. - """ - n = kwargs.pop("base", Node) - n = isinstance(id, Node) and id or self.get(id) or n(id, *args, **kwargs) - if n.id not in self: - self.nodes.append(n) - self[n.id] = n; n.graph = self - self.root = kwargs.get("root", False) and n or self.root - # Clear adjacency cache. - self._adjacency = None - return n - - def add_edge(self, id1, id2, *args, **kwargs): - """ Appends a new Edge to the graph. - An optional base parameter can be used to pass a subclass of Edge: - Graph.add_edge("cold", "winter", base=IsPropertyOf) - """ - # Create nodes that are not yet part of the graph. - n1 = self.add_node(id1) - n2 = self.add_node(id2) - # Creates an Edge instance. - # If an edge (in the same direction) already exists, yields that edge instead. - e1 = n1.links.edge(n2) - if e1 and e1.node1 == n1 and e1.node2 == n2: - return e1 - e2 = kwargs.pop("base", Edge) - e2 = e2(n1, n2, *args, **kwargs) - self.edges.append(e2) - # Synchronizes Node.links: - # A.links.edge(B) yields edge A->B - # B.links.edge(A) yields edge B->A - n1.links.append(n2, edge=e2) - n2.links.append(n1, edge=e1 or e2) - # Clear adjacency cache. - self._adjacency = None - return e2 - - def remove(self, x): - """ Removes the given Node (and all its edges) or Edge from the graph. - Note: removing Edge a->b does not remove Edge b->a. - """ - if isinstance(x, Node) and x.id in self: - self.pop(x.id) - self.nodes.remove(x); x.graph = None - # Remove all edges involving the given node. - for e in list(self.edges): - if x in (e.node1, e.node2): - if x in e.node1.links: e.node1.links.remove(x) - if x in e.node2.links: e.node2.links.remove(x) - self.edges.remove(e) - if isinstance(x, Edge): - self.edges.remove(x) - # Clear adjacency cache. - self._adjacency = None - - def node(self, id): - """ Returns the node in the graph with the given id. - """ - return self.get(id) - - def edge(self, id1, id2): - """ Returns the edge between the nodes with given id1 and id2. - """ - return id1 in self and id2 in self and self[id1].links.edge(id2) or None - - def paths(self, node1, node2, length=4, path=[]): - """ Returns a list of paths (shorter than or equal to given length) connecting the two nodes. - """ - if not isinstance(node1, Node): - node1 = self[node1] - if not isinstance(node2, Node): - node2 = self[node2] - return [[self[id] for id in p] for p in paths(self, node1.id, node2.id, length, path)] - - def shortest_path(self, node1, node2, heuristic=None, directed=False): - """ Returns a list of nodes connecting the two nodes. - """ - if not isinstance(node1, Node): - node1 = self[node1] - if not isinstance(node2, Node): - node2 = self[node2] - try: - p = dijkstra_shortest_path(self, node1.id, node2.id, heuristic, directed) - p = [self[id] for id in p] - return p - except IndexError: - return None - - def shortest_paths(self, node, heuristic=None, directed=False): - """ Returns a dictionary of nodes, each linked to a list of nodes (shortest path). - """ - if not isinstance(node, Node): - node = self[node] - p = nodedict(self) - for id, path in dijkstra_shortest_paths(self, node.id, heuristic, directed).iteritems(): - p[self[id]] = path and [self[id] for id in path] or None - return p - - def eigenvector_centrality(self, normalized=True, reversed=True, rating={}, iterations=100, tolerance=0.0001): - """ Calculates eigenvector centrality and returns a node => weight dictionary. - Node.weight is updated in the process. - Node.weight is higher for nodes with a lot of (indirect) incoming traffic. - """ - ec = eigenvector_centrality(self, normalized, reversed, rating, iterations, tolerance) - ec = nodedict(self, ((self[id], w) for id, w in ec.iteritems())) - for n, w in ec.iteritems(): - n._weight = w - return ec - - def betweenness_centrality(self, normalized=True, directed=False): - """ Calculates betweenness centrality and returns a node => weight dictionary. - Node.centrality is updated in the process. - Node.centrality is higher for nodes with a lot of passing traffic. - """ - bc = brandes_betweenness_centrality(self, normalized, directed) - bc = nodedict(self, ((self[id], w) for id, w in bc.iteritems())) - for n, w in bc.iteritems(): - n._centrality = w - return bc - - def sorted(self, order=WEIGHT, threshold=0.0): - """ Returns a list of nodes sorted by WEIGHT or CENTRALITY. - Nodes with a lot of traffic will be at the start of the list. - """ - o = lambda node: getattr(node, order) - nodes = ((o(n), n) for n in self.nodes if o(n) >= threshold) - nodes = reversed(sorted(nodes)) - return [n for w, n in nodes] - - def prune(self, depth=0): - """ Removes all nodes with less or equal links than depth. - """ - for n in (n for n in self.nodes if len(n.links) <= depth): - self.remove(n) - - def fringe(self, depth=0): - """ For depth=0, returns the list of leaf nodes (nodes with only one connection). - For depth=1, returns the list of leaf nodes and their connected nodes, and so on. - """ - u = []; [u.extend(n.flatten(depth)) for n in self.nodes if len(n.links) == 1] - return unique(u) - - @property - def density(self): - """ Yields the number of edges vs. the maximum number of possible edges. - For example, <0.35 => sparse, >0.65 => dense, 1.0 => complete. - """ - return 2.0*len(self.edges) / (len(self.nodes) * (len(self.nodes)-1)) - - @property - def is_complete(self): - return self.density == 1.0 - @property - def is_dense(self): - return self.density > 0.65 - @property - def is_sparse(self): - return self.density < 0.35 - - def split(self): - """ Returns the list of unconnected subgraphs. - """ - return partition(self) - - def update(self, iterations=10, **kwargs): - """ Graph.layout.update() is called the given number of iterations. - """ - for i in range(iterations): - self.layout.update(**kwargs) - - def draw(self, weighted=False, directed=False): - """ Draws all nodes and edges. - """ - for e in self.edges: - e.draw(weighted, directed) - for n in reversed(self.nodes): # New nodes (with Node._weight=None) first. - n.draw(weighted) - - def node_at(self, x, y): - """ Returns the node at (x,y) or None. - """ - for n in self.nodes: - if n.contains(x, y): return n - - def _add_node_copy(self, n, **kwargs): - # Magical fairy dust to copy subclasses of Node. - # We assume that the subclass constructor takes an optional "text" parameter - # (Text objects in NodeBox for OpenGL's implementation are expensive). - try: - new = self.add_node(n.id, root=kwargs.get("root",False), text=False) - except TypeError: - new = self.add_node(n.id, root=kwargs.get("root",False)) - new.__class__ = n.__class__ - new.__dict__.update((k, deepcopy(v)) for k,v in n.__dict__.iteritems() - if k not in ("graph", "links", "_x", "_y", "force", "_weight", "_centrality")) - - def _add_edge_copy(self, e, **kwargs): - if kwargs.get("node1", e.node1).id not in self \ - or kwargs.get("node2", e.node2).id not in self: - return - new = self.add_edge( - kwargs.get("node1", self[e.node1.id]), - kwargs.get("node2", self[e.node2.id])) - new.__class__ = e.__class__ - new.__dict__.update((k, deepcopy(v)) for k,v in e.__dict__.iteritems() - if k not in ("node1", "node2")) - - def copy(self, nodes=ALL): - """ Returns a copy of the graph with the given list of nodes (and connecting edges). - The layout will be reset. - """ - g = Graph(layout=None, distance=self.distance) - g.layout = self.layout.copy(graph=g) - for n in (nodes==ALL and self.nodes or (isinstance(n, Node) and n or self[n] for n in nodes)): - g._add_node_copy(n, root=self.root==n) - for e in self.edges: - g._add_edge_copy(e) - return g - -#--- GRAPH LAYOUT ------------------------------------------------------------------------------------ -# Graph drawing or graph layout, as a branch of graph theory, -# applies topology and geometry to derive two-dimensional representations of graphs. - -class GraphLayout: - - def __init__(self, graph): - """ Calculates node positions iteratively when GraphLayout.update() is called. - """ - self.graph = graph - self.iterations = 0 - - def update(self): - self.iterations += 1 - - def reset(self): - self.iterations = 0 - for n in self.graph.nodes: - n._x = 0 - n._y = 0 - n.force = Vector(0,0) - - @property - def bounds(self): - """ Returns a (x, y, width, height)-tuple of the approximate layout dimensions. - """ - x0, y0 = +INFINITE, +INFINITE - x1, y1 = -INFINITE, -INFINITE - for n in self.graph.nodes: - if (n.x < x0): x0 = n.x - if (n.y < y0): y0 = n.y - if (n.x > x1): x1 = n.x - if (n.y > y1): y1 = n.y - return (x0, y0, x1-x0, y1-y0) - - def copy(self, graph): - return GraphLayout(self, graph) - -class GraphSpringLayout(GraphLayout): - - def __init__(self, graph): - """ A force-based layout in which edges are regarded as springs. - The forces are applied to the nodes, pulling them closer or pushing them apart. - """ - # Based on: http://snipplr.com/view/1950/graph-javascript-framework-version-001/ - GraphLayout.__init__(self, graph) - self.k = 4.0 # Force constant. - self.force = 0.01 # Force multiplier. - self.repulsion = 15 # Maximum repulsive force radius. - - def _distance(self, node1, node2): - # Yields a tuple with distances (dx, dy, d, d**2). - # Ensures that the distance is never zero (which deadlocks the animation). - dx = node2._x - node1._x - dy = node2._y - node1._y - d2 = dx*dx + dy*dy - if d2 < 0.01: - dx = random() * 0.1 + 0.1 - dy = random() * 0.1 + 0.1 - d2 = dx*dx + dy*dy - return dx, dy, sqrt(d2), d2 - - def _repulse(self, node1, node2): - # Updates Node.force with the repulsive force. - dx, dy, d, d2 = self._distance(node1, node2) - if d < self.repulsion: - f = self.k**2 / d2 - node2.force.x += f * dx - node2.force.y += f * dy - node1.force.x -= f * dx - node1.force.y -= f * dy - - def _attract(self, node1, node2, weight=0, length=1.0): - # Updates Node.force with the attractive edge force. - dx, dy, d, d2 = self._distance(node1, node2) - d = min(d, self.repulsion) - f = (d2 - self.k**2) / self.k * length - f *= weight * 0.5 + 1 - f /= d - node2.force.x -= f * dx - node2.force.y -= f * dy - node1.force.x += f * dx - node1.force.y += f * dy - - def update(self, weight=10.0, limit=0.5): - """ Updates the position of nodes in the graph. - The weight parameter determines the impact of edge weight. - The limit parameter determines the maximum movement each update(). - """ - GraphLayout.update(self) - # Forces on all nodes due to node-node repulsions. - for i, n1 in enumerate(self.graph.nodes): - for j, n2 in enumerate(self.graph.nodes[i+1:]): - self._repulse(n1, n2) - # Forces on nodes due to edge attractions. - for e in self.graph.edges: - self._attract(e.node1, e.node2, weight*e.weight, 1.0/(e.length or 0.01)) - # Move nodes by given force. - for n in self.graph.nodes: - if not n.fixed: - n._x += max(-limit, min(self.force * n.force.x, limit)) - n._y += max(-limit, min(self.force * n.force.y, limit)) - n.force.x = 0 - n.force.y = 0 - - def copy(self, graph): - g = GraphSpringLayout(graph) - g.k, g.force, g.repulsion = self.k, self.force, self.repulsion - return g - -#--- GRAPH TRAVERSAL --------------------------------------------------------------------------------- - -def depth_first_search(node, visit=lambda node: False, traversable=lambda node, edge: True, _visited=None): - """ Visits all the nodes connected to the given root node, depth-first. - The visit function is called on each node. - Recursion will stop if it returns True, and subsequently dfs() will return True. - The traversable function takes the current node and edge, - and returns True if we are allowed to follow this connection to the next node. - For example, the traversable for directed edges is follows: - lambda node, edge: node == edge.node1 - """ - stop = visit(node) - _visited = _visited or {} - _visited[node.id] = True - for n in node.links: - if stop: return True - if traversable(node, node.links.edge(n)) is False: continue - if not n.id in _visited: - stop = depth_first_search(n, visit, traversable, _visited) - return stop - -dfs = depth_first_search; - -def breadth_first_search(node, visit=lambda node: False, traversable=lambda node, edge: True): - """ Visits all the nodes connected to the given root node, breadth-first. - """ - q = [node] - _visited = {} - while q: - node = q.pop(0) - if not node.id in _visited: - if visit(node): - return True - q.extend((n for n in node.links if traversable(node, node.links.edge(n)) is not False)) - _visited[node.id] = True - return False - -bfs = breadth_first_search; - -def paths(graph, id1, id2, length=4, path=[], _root=True): - """ Returns a list of paths from node with id1 to node with id2. - Only paths shorter than or equal to the given length are included. - Uses a brute-force DFS approach (performance drops exponentially for longer paths). - """ - if len(path) >= length: - return [] - if id1 not in graph: - return [] - if id1 == id2: - return [path + [id1]] - path = path + [id1] - p = [] - s = set(path) # 5% speedup. - for node in graph[id1].links: - if node.id not in s: - p.extend(paths(graph, node.id, id2, length, path, False)) - return _root and sorted(p, key=len) or p - -def edges(path): - """ Returns an iterator of Edge objects for the given list of nodes. - It yields None where two successive nodes are not connected. - """ - # For example, the distance (i.e., edge weight sum) of a path: - # sum(e.weight for e in edges(path)) - return len(path) > 1 and (n.links.edge(path[i+1]) for i,n in enumerate(path[:-1])) or iter(()) - -#--- GRAPH THEORY ------------------------------------------------------------------------------------ - -def adjacency(graph, directed=False, reversed=False, stochastic=False, heuristic=None): - """ Returns a dictionary indexed by node id1's, - in which each value is a dictionary of connected node id2's linking to the edge weight. - If directed=True, edges go from id1 to id2, but not the other way. - If stochastic=True, all the weights for the neighbors of a given node sum to 1. - A heuristic function can be given that takes two node id's and returns - an additional cost for movement between the two nodes. - """ - # Caching a heuristic from a method won't work. - # Bound method objects are transient, - # i.e., id(object.method) returns a new value each time. - if graph._adjacency is not None and \ - graph._adjacency[1:] == (directed, reversed, stochastic, heuristic and id(heuristic)): - return graph._adjacency[0] - map = {} - for n in graph.nodes: - map[n.id] = {} - for e in graph.edges: - id1, id2 = not reversed and (e.node1.id, e.node2.id) or (e.node2.id, e.node1.id) - map[id1][id2] = 1.0 - 0.5 * e.weight - if heuristic: - map[id1][id2] += heuristic(id1, id2) - if not directed: - map[id2][id1] = map[id1][id2] - if stochastic: - for id1 in map: - n = sum(map[id1].values()) - for id2 in map[id1]: - map[id1][id2] /= n - # Cache the adjacency map: this makes dijkstra_shortest_path() 2x faster in repeated use. - graph._adjacency = (map, directed, reversed, stochastic, heuristic and id(heuristic)) - return map - -def dijkstra_shortest_path(graph, id1, id2, heuristic=None, directed=False): - """ Dijkstra algorithm for finding the shortest path between two nodes. - Returns a list of node id's, starting with id1 and ending with id2. - Raises an IndexError between nodes on unconnected graphs. - """ - # Based on: Connelly Barnes, http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/119466 - def flatten(list): - # Flattens a linked list of the form [0,[1,[2,[]]]] - while len(list) > 0: - yield list[0]; list=list[1] - G = adjacency(graph, directed=directed, heuristic=heuristic) - q = [(0, id1, ())] # Heap of (cost, path_head, path_rest). - visited = set() # Visited nodes. - while True: - (cost1, n1, path) = heappop(q) - if n1 not in visited: - visited.add(n1) - if n1 == id2: - return list(flatten(path))[::-1] + [n1] - path = (n1, path) - for (n2, cost2) in G[n1].iteritems(): - if n2 not in visited: - heappush(q, (cost1 + cost2, n2, path)) - -def dijkstra_shortest_paths(graph, id, heuristic=None, directed=False): - """ Dijkstra algorithm for finding the shortest paths from the given node to all other nodes. - Returns a dictionary of node id's, each linking to a list of node id's (i.e., the path). - """ - # Based on: Dijkstra's algorithm for shortest paths modified from Eppstein. - # Based on: NetworkX 1.4.1: Aric Hagberg, Dan Schult and Pieter Swart. - # This is 5x faster than: - # for n in g: dijkstra_shortest_path(g, id, n.id) - W = adjacency(graph, directed=directed, heuristic=heuristic) - Q = [] # Use Q as a heap with (distance, node id)-tuples. - D = {} # Dictionary of final distances. - P = {} # Dictionary of paths. - P[id] = [id] - seen = {id: 0} - heappush(Q, (0, id)) - while Q: - (dist, v) = heappop(Q) - if v in D: continue - D[v] = dist - for w in W[v].iterkeys(): - vw_dist = D[v] + W[v][w] - if w not in D and (w not in seen or vw_dist < seen[w]): - seen[w] = vw_dist - heappush(Q, (vw_dist, w)) - P[w] = P[v] + [w] - for n in graph: - if n not in P: P[n]=None - return P - -def floyd_warshall_all_pairs_distance(graph, heuristic=None, directed=False): - """ Floyd-Warshall's algorithm for finding the path length for all pairs for nodes. - Returns a dictionary of node id's, - each linking to a dictionary of node id's linking to path length. - """ - from collections import defaultdict # Requires Python 2.5+. - g = graph.keys() - d = defaultdict(lambda: defaultdict(lambda: 1e30)) # float('inf') - p = defaultdict(dict) # Predecessors. - for e in graph.edges: - u = e.node1.id - v = e.node2.id - w = 1.0 - 0.5 * e.weight - w = heuristic and heuristic(u, v) + w or w - d[u][v] = min(w, d[u][v]) - d[u][u] = 0 - p[u][v] = u - if not directed: - d[v][u] = min(w, d[v][u]) - p[v][u] = v - for w in g: - dw = d[w] - for u in g: - du, duw = d[u], d[u][w] - for v in g: - # Performance optimization, assumes d[w][v] > 0. - #if du[v] > duw + dw[v]: - if du[v] > duw and du[v] > duw + dw[v]: - d[u][v] = duw + dw[v] - p[u][v] = p[w][v] - class pdict(dict): - def __init__(self, predecessors, *args, **kwargs): - dict.__init__(self, *args, **kwargs) - self.predecessors = predecessors - return pdict(p, ((u, dict((v, w) for v,w in d[u].iteritems() if w < 1e30)) for u in d)) - -def predecessor_path(tree, u, v): - """ Returns the path between node u and node v as a list of node id's. - The given tree is the return value of floyd_warshall_all_pairs_distance().predecessors. - """ - def _traverse(u, v): - w = tree[u][v] - if w == u: - return [] - return _traverse(u,w) + [w] + _traverse(w,v) - return [u] + _traverse(u,v) + [v] - -def brandes_betweenness_centrality(graph, normalized=True, directed=False): - """ Betweenness centrality for nodes in the graph. - Betweenness centrality is a measure of the number of shortests paths that pass through a node. - Nodes in high-density areas will get a good score. - """ - # Ulrik Brandes, A Faster Algorithm for Betweenness Centrality, - # Journal of Mathematical Sociology 25(2):163-177, 2001, - # http://www.inf.uni-konstanz.de/algo/publications/b-fabc-01.pdf - # Based on: Dijkstra's algorithm for shortest paths modified from Eppstein. - # Based on: NetworkX 1.0.1: Aric Hagberg, Dan Schult and Pieter Swart. - # http://python-networkx.sourcearchive.com/documentation/1.0.1/centrality_8py-source.html - W = adjacency(graph, directed=directed) - b = dict.fromkeys(graph, 0.0) - for id in graph: - Q = [] # Use Q as a heap with (distance, node id)-tuples. - D = {} # Dictionary of final distances. - P = {} # Dictionary of paths. - for n in graph: P[n]=[] - seen = {id: 0} - heappush(Q, (0, id, id)) - S = [] - E = dict.fromkeys(graph, 0) # sigma - E[id] = 1.0 - while Q: - (dist, pred, v) = heappop(Q) - if v in D: - continue - D[v] = dist - S.append(v) - E[v] += E[pred] - for w in W[v]: - vw_dist = D[v] + W[v][w] - if w not in D and (w not in seen or vw_dist < seen[w]): - seen[w] = vw_dist - heappush(Q, (vw_dist, v, w)) - P[w] = [v] - E[w] = 0.0 - elif vw_dist == seen[w]: # Handle equal paths. - P[w].append(v) - E[w] += E[v] - d = dict.fromkeys(graph, 0.0) - for w in reversed(S): - for v in P[w]: - d[v] += (1.0 + d[w]) * E[v] / E[w] - if w != id: - b[w] += d[w] - # Normalize between 0.0 and 1.0. - m = normalized and max(b.values()) or 1 - b = dict((id, w/m) for id, w in b.iteritems()) - return b - -def eigenvector_centrality(graph, normalized=True, reversed=True, rating={}, iterations=100, tolerance=0.0001): - """ Eigenvector centrality for nodes in the graph (cfr. Google's PageRank). - Eigenvector centrality is a measure of the importance of a node in a directed network. - It rewards nodes with a high potential of (indirectly) connecting to high-scoring nodes. - Nodes with no incoming connections have a score of zero. - If you want to measure outgoing connections, reversed should be False. - """ - # Based on: NetworkX, Aric Hagberg (hagberg@lanl.gov) - # http://python-networkx.sourcearchive.com/documentation/1.0.1/centrality_8py-source.html - # Note: much faster than betweenness centrality (which grows exponentially). - def normalize(vector): - w = 1.0 / (sum(vector.values()) or 1) - for node in vector: - vector[node] *= w - return vector - G = adjacency(graph, directed=True, reversed=reversed) - v = normalize(dict([(n, random()) for n in graph])) # Node ID => weight vector. - # Eigenvector calculation using the power iteration method: y = Ax. - # It has no guarantee of convergence. - for i in range(iterations): - v0 = v - v = dict.fromkeys(v0.iterkeys(), 0) - for n1 in v: - for n2 in G[n1]: - v[n1] += 0.01 + v0[n2] * G[n1][n2] * rating.get(n1, 1) - normalize(v) - e = sum([abs(v[n]-v0[n]) for n in v]) # Check for convergence. - if e < len(G) * tolerance: - # Normalize between 0.0 and 1.0. - m = normalized and max(v.values()) or 1 - v = dict((id, w/m) for id, w in v.iteritems()) - return v - warn("node weight is 0 because eigenvector_centrality() did not converge.", Warning) - return dict((n, 0) for n in G) - -# a | b => all elements from a and all the elements from b. -# a & b => elements that appear in a as well as in b. -# a - b => elements that appear in a but not in b. -def union(a, b): - return list(set(a) | set(b)) -def intersection(a, b): - return list(set(a) & set(b)) -def difference(a, b): - return list(set(a) - set(b)) - -def partition(graph): - """ Returns a list of unconnected subgraphs. - """ - # Creates clusters of nodes and directly connected nodes. - # Iteratively merges two clusters if they overlap. - g = [] - for n in graph.nodes: - g.append(dict.fromkeys((n.id for n in n.flatten()), True)) - for i in reversed(range(len(g))): - for j in reversed(range(i+1, len(g))): - if g[i] and g[j] and len(intersection(g[i], g[j])) > 0: - g[i] = union(g[i], g[j]) - g[j] = [] - g = [graph.copy(nodes=[graph[id] for id in n]) for n in g if n] - g.sort(lambda a, b: len(b) - len(a)) - return g - -#--- GRAPH THEORY | CLIQUE --------------------------------------------------------------------------- - -def is_clique(graph): - """ A clique is a set of nodes in which each node is connected to all other nodes. - """ - #for n1 in graph.nodes: - # for n2 in graph.nodes: - # if n1 != n2 and graph.edge(n1.id, n2.id) is None: - # return False - return graph.density == 1.0 - -def clique(graph, id): - """ Returns the largest possible clique for the node with given id. - """ - if isinstance(id, Node): - id = id.id - a = [id] - for n in graph.nodes: - try: - # Raises StopIteration if all nodes in the clique are connected to n: - (id for id in a if n.id==id or graph.edge(n.id, id) is None).next() - except StopIteration: - a.append(n.id) - return a - -def cliques(graph, threshold=3): - """ Returns all cliques in the graph with at least the given number of nodes. - """ - a = [] - for n in graph.nodes: - c = clique(graph, n.id) - if len(c) >= threshold: - c.sort() - if c not in a: a.append(c) - return a - -#--- GRAPH MAINTENANCE ------------------------------------------------------------------------------- -# Utility commands for safe linking and unlinking of nodes, -# with respect for the surrounding nodes. - -def unlink(graph, node1, node2=None): - """ Removes the edges between node1 and node2. - If only node1 is given, removes all edges to and from it. - This does not remove node1 from the graph. - """ - if not isinstance(node1, Node): - node1 = graph[node1] - if not isinstance(node2, Node) and node2 is not None: - node2 = graph[node2] - for e in list(graph.edges): - if node1 in (e.node1, e.node2) and node2 in (e.node1, e.node2, None): - graph.edges.remove(e) - try: - node1.links.remove(node2) - node2.links.remove(node1) - except: # 'NoneType' object has no attribute 'links' - pass - -def redirect(graph, node1, node2): - """ Connects all of node1's edges to node2 and unlinks node1. - """ - if not isinstance(node1, Node): - node1 = graph[node1] - if not isinstance(node2, Node): - node2 = graph[node2] - for e in graph.edges: - if node1 in (e.node1, e.node2): - if e.node1 == node1 and e.node2 != node2: - graph._add_edge_copy(e, node1=node2, node2=e.node2) - if e.node2 == node1 and e.node1 != node2: - graph._add_edge_copy(e, node1=e.node1, node2=node2) - unlink(graph, node1) - -def cut(graph, node): - """ Unlinks the given node, but keeps edges intact by connecting the surrounding nodes. - If A, B, C, D are nodes and A->B, B->C, B->D, if we then cut B: A->C, A->D. - """ - if not isinstance(node, Node): - node = graph[node] - for e in graph.edges: - if node in (e.node1, e.node2): - for n in node.links: - if e.node1 == node and e.node2 != n: - graph._add_edge_copy(e, node1=n, node2=e.node2) - if e.node2 == node and e.node1 != n: - graph._add_edge_copy(e, node1=e.node1, node2=n) - unlink(graph, node) - -def insert(graph, node, a, b): - """ Inserts the given node between node a and node b. - If A, B, C are nodes and A->B, if we then insert C: A->C, C->B. - """ - if not isinstance(node, Node): - node = graph[node] - if not isinstance(a, Node): - a = graph[a] - if not isinstance(b, Node): - b = graph[b] - for e in graph.edges: - if e.node1 == a and e.node2 == b: - graph._add_edge_copy(e, node1=a, node2=node) - graph._add_edge_copy(e, node1=node, node2=b) - if e.node1 == b and e.node2 == a: - graph._add_edge_copy(e, node1=b, node2=node) - graph._add_edge_copy(e, node1=node, node2=a) - unlink(graph, a, b) diff --git a/nodebox/graphics/shader.py b/nodebox/graphics/shader.py deleted file mode 100644 index 6f90cd5..0000000 --- a/nodebox/graphics/shader.py +++ /dev/null @@ -1,1515 +0,0 @@ - -# Fragment shaders, filters, Frame Buffer Object (FBO) -# Authors: Tom De Smedt, Frederik De Bleser -# License: BSD (see LICENSE.txt for details). -# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) -# http://cityinabottle.org/nodebox - -from pyglet.gl import * -from pyglet.image import Texture, SolidColorImagePattern -from context import Image, texture -from geometry import lerp, clamp -from math import radians -from ctypes import byref, cast, pointer, POINTER -from ctypes import c_char, c_char_p, c_uint, c_int - -def next(generator, default=None): - try: - return generator.next() - except StopIteration: - return default - -#===================================================================================================== - -pow2 = [2**n for n in range(20)] # [1, 2, 4, 8, 16, 32, 64, ...] - -def ceil2(x): - """ Returns the nearest power of 2 that is higher than x, e.g. 700 => 1024. - """ - for y in pow2: - if y >= x: return y - -def extent2(texture): - """ Returns the extent of the image data (0.0-1.0, 0.0-1.0) inside its texture owner. - Textures have a size power of 2 (512, 1024, ...), but the actual image can be smaller. - For example: a 400x250 image will be loaded in a 512x256 texture. - Its extent is (0.78, 0.98), the remainder of the texture is transparent. - """ - return (texture.tex_coords[3], texture.tex_coords[7]) - -def ratio2(texture1, texture2): - """ Returns the size ratio (0.0-1.0, 0.0-1.0) of two texture owners. - """ - return ( - float(ceil2(texture1.width)) / ceil2(texture2.width), - float(ceil2(texture1.height)) / ceil2(texture2.height) - ) - -#===================================================================================================== - -#--- SHADER ------------------------------------------------------------------------------------------ -# A shader is a pixel effect (motion blur, fog, glow) executed on the GPU. -# The effect has two distinct parts: a vertex shader and a fragment shader. -# The vertex shader retrieves the coordinates of the current pixel. -# The fragment shader manipulates the color of the current pixel. -# http://www.lighthouse3d.com/opengl/glsl/index.php?fragmentp -# Shaders are written in GLSL and expect their variables to be set from glUniform() calls. -# The Shader class compiles the source code and has an easy way to pass variables to GLSL. -# e.g. shader = Shader(fragment=open("colorize.frag").read()) -# shader.set("color", vec4(1, 0.8, 1, 1)) -# shader.push() -# image("box.png", 0, 0) -# shader.pop() - -DEFAULT = "default" -DEFAULT_VERTEX_SHADER = ''' -void main() { - gl_TexCoord[0] = gl_MultiTexCoord0; - gl_Position = ftransform(); -}''' -DEFAULT_FRAGMENT_SHADER = ''' -uniform sampler2D src; -void main() { - gl_FragColor = texture2D(src, gl_TexCoord[0].xy); -}''' - -class vector(tuple): - pass - -def vec2(f1, f2): - return vector((f1, f2)) -def vec3(f1, f2, f3): - return vector((f1, f2, f3)) -def vec4(f1, f2, f3, f4): - return vector((f1, f2, f3, f4)) - -COMPILE = "compile" # Error occurs during glCompileShader(). -BUILD = "build" # Error occurs during glLinkProgram(). -class ShaderError(Exception): - def __init__(self, value, type=COMPILE): - Exception.__init__(self, "%s error: %s" % (type, value)) - self.value = value - self.type = type - -class Shader(object): - - def __init__(self, vertex=DEFAULT, fragment=DEFAULT): - """ A per-pixel shader effect (blur, fog, glow, ...) executed on the GPU. - Shader wraps a compiled GLSL program and facilitates passing parameters to it. - The fragment and vertex parameters contain the GLSL source code to execute. - Raises a ShaderError if the source fails to compile. - Once compiled, you can set uniform variables in the GLSL source with Shader.set(). - """ - if vertex == DEFAULT: - vertex = DEFAULT_VERTEX_SHADER - if fragment == DEFAULT: - fragment = DEFAULT_FRAGMENT_SHADER - self._vertex = vertex # GLSL source for vertex shader. - self._fragment = fragment # GLSL source for fragment shader. - self._compiled = [] - self._program = None - self._active = False - self.variables = {} - self._build() - - def _compile(self, source, type=GL_VERTEX_SHADER): - # Compile the GLSL source code, either as GL_FRAGMENT_SHADER or GL_VERTEX_SHADER. - # If the source fails to compile, retrieve the error message and raise ShaderError. - # Store the compiled shader so we can delete it later on. - shader = glCreateShader(type) - status = c_int(-1) - glShaderSource(shader, 1, cast(pointer(c_char_p(source)), POINTER(POINTER(c_char))), None) - glCompileShader(shader) - glGetShaderiv(shader, GL_COMPILE_STATUS, byref(status)) - if status.value == 0: - raise self._error(shader, type=COMPILE) - self._compiled.append(shader) - return shader - - def _build(self): - # Each Shader has its own OpenGL rendering program and you need to switch between them. - # Compile fragment and vertex shaders and build the program. - program = glCreateProgram() - status = c_int(-1) - if self._vertex: - glAttachShader(program, self._compile(self._vertex, GL_VERTEX_SHADER)) - if self._fragment: - glAttachShader(program, self._compile(self._fragment, GL_FRAGMENT_SHADER)) - glLinkProgram(program) - glGetProgramiv(program, GL_LINK_STATUS, byref(status)) - if status.value == 0: - raise self._error(program, type=BUILD) - self._program = program - - def _error(self, obj, type=COMPILE): - # Get the info for the failed glCompileShader() or glLinkProgram(), - # delete the failed shader or program, - # return a ShaderError with the error message. - f1 = type==COMPILE and glGetShaderiv or glGetProgramiv - f2 = type==COMPILE and glGetShaderInfoLog or glGetProgramInfoLog - f3 = type==COMPILE and glDeleteShader or glDeleteProgram - length = c_int(); f1(obj, GL_INFO_LOG_LENGTH, byref(length)) - msg = "" - if length.value > 0: - msg = create_string_buffer(length.value); f2(obj, length, byref(length), msg) - msg = msg.value - f3(obj) - return ShaderError(msg, type) - - def get(self, name): - """ Returns the value of the variable with the given name. - """ - return self.variables[name] - - def set(self, name, value): - """ Set the value of the variable with the given name in the GLSL source script. - Supported variable types are: vec2(), vec3(), vec4(), single int/float, list of int/float. - Variables will be initialized when Shader.push() is called (i.e. glUseProgram). - """ - self.variables[name] = value - if self._active: - self._set(name, value) - - def _set(self, name, value): - address = glGetUniformLocation(self._program, name) - # A vector with 2, 3 or 4 floats representing vec2, vec3 or vec4. - if isinstance(value, vector): - if len(value) == 2: - glUniform2f(address, value[0], value[1]) - elif len(value) == 3: - glUniform3f(address, value[0], value[1], value[2]) - elif len(value) == 4: - glUniform4f(address, value[0], value[1], value[2], value[3]) - # A list representing an array of ints or floats. - elif isinstance(value, (list, tuple)): - if next((v for v in value if isinstance(v, float))) is not None: - array = c_float * len(value) - glUniform1fv(address, len(value), array(*value)) - else: - array = c_int * len(value) - glUniform1iv(address, len(value), array(*value)) - # Single float value. - elif isinstance(value, float): - glUniform1f(address, value) - # Single int value or named texture. - elif isinstance(value, int): - glUniform1i(address, value) - else: - ShaderError, "don't know how to handle variable %s" % value.__class__ - - def push(self): - """ Installs the program and sets its variables. - When you use the image() command between shader.push() and shader.pop(), - the shader's effect will be applied to the image before drawing it. - To use shader effects in combination with paths, - draw the path in an offscreen buffer, render it, and apply to effect to the render. - """ - self._active = True - glUseProgram(self._program) - for k, v in self.variables.items(): - self._set(k, v) - - def pop(self): - # Note that shaders can't be nested since they all have their own program, - # pop() just removes any active program. - if self._active == True: - glUseProgram(0) - self._active = False - - @property - def active(self): - return self._active - - @property - def source(self): - return (self._vertex, self._fragment) - - def __del__(self): - try: - for shader in self._compiled: - if glDetachShader and self._program: - glDetachShader(self._program, shader) - if glDeleteShader: - glDeleteShader(shader) - if glDeleteProgram: - glDeleteProgram(self._program) - except: - pass - -class ShaderFacade: - def __init__(self, vertex=None, fragment=None): - # Acts like a shader but doesn't do anything. - pass - @property - def variables(self): - return {} - @property - def active(self): - return None - def get(self, name): - return None - def set(self, name, value): - pass - def push(self): - pass - def pop(self): - pass - -SUPPORTED = True # Graphics hardware supports shaders? - -def shader(vertex=DEFAULT_VERTEX_SHADER, fragment=DEFAULT_FRAGMENT_SHADER, silent=True): - """ Returns a compiled Shader from the given GLSL source code. - With silent=True, never raises an error but instead returns a ShaderFacade. - During startup, a number of Shaders are created. - This mechanisms ensures that the module doesn't crash while doing this, - instead the shader simply won't have any visible effect and SUPPORTED will be False. - """ - if not silent: - return Shader(vertex, fragment) - try: - return Shader(vertex, fragment) - except Exception, e: - SUPPORTED = False - return ShaderFacade() - -#===================================================================================================== - -#--- FILTER ------------------------------------------------------------------------------------------ -# Stores a shader's variables and applies them once push() is called. -# The shader is created only once for perfomance while filters can exist multiple times. -# Textures that are drawn between Filter.push() and Filter.pop() have the effect applied to them. - -class Filter(object): - - def __init__(self): - """ Filter combines a Shader with variable settings. - Variables need to be prepared in Filter.push() before passing them to the shader: - e.g. creating a list of kernel values, calculating a scale based on image height, ... - Performance note: create the Shader separately, not during initialization. - """ - # Shader and its variables need to be stored here. - self.shader = None - self.texture = None - - def push(self): - """ Installs the filter so it will be applied to the next image() call. - """ - # Shader needs to set its variables here: - # self.shader.set(variable, value) - self.shader.push() - - def pop(self): - """ Removes the filter. - """ - self.shader.pop() - -#===================================================================================================== - -#--- INVERT ----------------------------------------------------------------------------------------- - -_invert = shader(fragment=''' -uniform sampler2D src; -void main() { - gl_FragColor = texture2D(src, gl_TexCoord[0].xy); - gl_FragColor.rgb = 1.0 - gl_FragColor.rgb; -}''') - -class Invert(Filter): - - def __init__(self, texture): - self.shader = _invert - self.texture = texture - - def push(self): - self.shader.push() - -#--- GRADIENT ---------------------------------------------------------------------------------------- - -LINEAR = "linear" -RADIAL = "radial" - -_gradient = {} -_gradient[LINEAR] = shader(fragment=''' -uniform sampler2D src; -uniform vec4 clr1; -uniform vec4 clr2; -void main() { - vec2 v = gl_TexCoord[0].xy; - gl_FragColor = clr1 * v.y + clr2 * (1.0 - v.y); -}''') -_gradient[RADIAL] = shader(fragment=''' -uniform sampler2D src; -uniform vec4 clr1; -uniform vec4 clr2; -void main() { - vec2 v = gl_TexCoord[0].xy - 0.5; - float d = 4.0 * (v.x * v.x + v.y * v.y); - gl_FragColor = clr1 * (1.0 - d) + clr2 * d; -}''') - -class LinearGradient(Filter): - - def __init__(self, texture, clr1=vec4(0,0,0,1), clr2=vec4(1,1,1,1)): - self.shader = _gradient[LINEAR] - self.texture = texture - self.clr1 = clr1 - self.clr2 = clr2 - - def push(self): - self.shader.set("clr1", self.clr1) - self.shader.set("clr2", self.clr2) - self.shader.push() - -class RadialGradient(Filter): - - def __init__(self, texture, clr1=vec4(0,0,0,1), clr2=vec4(1,1,1,1)): - self.shader = _gradient[RADIAL] - self.texture = texture - self.clr1 = clr1 - self.clr2 = clr2 - - def push(self): - self.shader.set("clr1", self.clr1) - self.shader.set("clr2", self.clr2) - self.shader.push() - -#--- COLORIZE --------------------------------------------------------------------------------------- - -_colorize = shader(fragment=''' -uniform sampler2D src; -uniform vec4 color; -uniform vec4 bias; -void main() { - vec4 p = texture2D(src, gl_TexCoord[0].xy); - gl_FragColor = clamp(p * color + bias, 0.0, 1.0); -}''') - -class Colorize(Filter): - - def __init__(self, texture, color=vec4(1,1,1,1), bias=vec4(0,0,0,0)): - self.shader = _colorize - self.texture = texture - self.color = color - self.bias = bias - - def push(self): - self.shader.set("color", self.color) - self.shader.set("bias", self.bias) - self.shader.push() - -#--- COLORSPACE ------------------------------------------------------------------------------------- -# Helper functions for conversion between RGB and HSB that we can use in other filters. -# Based on "Photoshop math with GLSL shaders" (2009), Romain Dura, -# http://blog.mouaif.org/?p=94 - -glsl_hsb2rgb = ''' -float _hue2rgb(float a, float b, float hue) { - hue = mod(hue, 1.0); - if (6.0 * hue < 1.0) return a + (b - a) * 6.0 * hue; - if (2.0 * hue < 1.0) return b; - if (3.0 * hue < 2.0) return a + (b - a) * 6.0 * (2.0/3.0 - hue); - return a; -} -vec3 hsb2rgb(vec3 hsb) { - if (hsb.y == 0.0) return vec3(hsb.z); - float b = (hsb.z < 0.5)? hsb.z * (1.0 + hsb.y) : (hsb.y + hsb.z) - (hsb.y * hsb.z); - float a = 2.0 * hsb.z - b; - return vec3( - _hue2rgb(a, b, hsb.x + (1.0/3.0)), - _hue2rgb(a, b, hsb.x), - _hue2rgb(a, b, hsb.x - (1.0/3.0)) - ); -}''' - -glsl_rgb2hsb = ''' -vec3 rgb2hsb(vec3 rgb) { - vec3 hsb = vec3(0.0); - float a = min(min(rgb.r, rgb.g), rgb.b); - float b = max(max(rgb.r, rgb.g), rgb.b); - float c = b - a; - if (c != 0.0) { - vec3 d = ((vec3(b) - rgb) / 6.0 + c / 2.0) / c; - if (rgb.r == b) hsb.x = d.b - d.g; - else if (rgb.g == b) hsb.x = d.r - d.b + 1.0/3.0; - else if (rgb.b == b) hsb.x = d.g - d.r + 2.0/3.0; - hsb.x = mod(hsb.x, 1.0); - hsb.y = (hsb.z < 0.5)? c / (a+b) : c / (2.0 - c); - } - hsb.z = (a+b) / 2.0; - return hsb; -}'''; - -#--- ADJUSTMENTS ------------------------------------------------------------------------------------ - -BRIGHTNESS = "brightness" -CONTRAST = "contrast" -SATURATION = "saturation" -HUE = "hue" - -_adjustment = {} -_adjustment[BRIGHTNESS] = shader(fragment=''' -uniform sampler2D src; -uniform float m; -void main() { - vec4 p = texture2D(src, gl_TexCoord[0].xy); - gl_FragColor = vec4(clamp(p.rgb + m, 0.0, 1.0), p.a); -}''') -_adjustment[CONTRAST] = shader(fragment=''' -uniform sampler2D src; -uniform float m; -void main() { - vec4 p = texture2D(src, gl_TexCoord[0].xy); - gl_FragColor = vec4(clamp((p.rgb - 0.5) * m + 0.5, 0.0, 1.0), p.a); -}''') -_adjustment[SATURATION] = shader(fragment=''' -uniform sampler2D src; -uniform float m; -void main() { - vec4 p = texture2D(src, gl_TexCoord[0].xy); - float i = 0.3 * p.r + 0.59 * p.g + 0.11 * p.b; - gl_FragColor = vec4( - i * (1.0 - m) + p.r * m, - i * (1.0 - m) + p.g * m, - i * (1.0 - m) + p.b * m, - p.a - ); -}''') -_adjustment[HUE] = shader(fragment=glsl_hsb2rgb+glsl_rgb2hsb+''' -uniform sampler2D src; -uniform float m; -void main() { - vec4 p = texture2D(src, gl_TexCoord[0].xy); - vec3 hsb = rgb2hsb(p.rgb); - hsb.x = hsb.x + m; - gl_FragColor = vec4(hsb2rgb(hsb).xyz, p.a); -}''') - -class BrightnessAdjustment(Filter): - - def __init__(self, texture, m=1.0): - self.shader = _adjustment[BRIGHTNESS] - self.texture = texture - self.m = m - - def push(self): - self.shader.set("m", float(self.m-1)) - self.shader.push() - -class ContrastAdjustment(Filter): - - def __init__(self, texture, m=1.0): - self.shader = _adjustment[CONTRAST] - self.texture = texture - self.m = m - - def push(self): - self.shader.set("m", float(self.m)) - self.shader.push() - -class SaturationAdjustment(Filter): - - def __init__(self, texture, m=1.0): - self.shader = _adjustment[SATURATION] - self.texture = texture - self.m = m - - def push(self): - self.shader.set("m", float(max(self.m, 0))) - self.shader.push() - -class HueAdjustment(Filter): - - def __init__(self, texture, m=0.0): - self.shader = _adjustment[HUE] - self.texture = texture - self.m = m - - def push(self): - self.shader.set("m", float(self.m)); - self.shader.push() - -#--- BRIGHTPASS -------------------------------------------------------------------------------------- -# Note: the magic numbers 0.2125, 0.7154, 0.0721 represent how (in RGB) -# green contributes the most to luminosity while blue hardly contributes anything. -# Thus, luminance L = R*0.2125 + G*0.7154 + B+0.0721 - -_brightpass = shader(fragment=''' -uniform sampler2D src; -uniform float threshold; -void main() { - vec4 p = texture2D(src, gl_TexCoord[0].xy); - float L = dot(p.rgb, vec3(0.2125, 0.7154, 0.0721)); // luminance - gl_FragColor = (L > threshold)? vec4(p.rgb, p.a) : vec4(0.0, 0.0, 0.0, p.a); -}''') - -class BrightPass(Filter): - - def __init__(self, texture, threshold=0.5): - self.shader = _brightpass - self.texture = texture - self.threshold = threshold - - def push(self): - self.shader.set("threshold", float(self.threshold)); - self.shader.push() - -#--- BLUR -------------------------------------------------------------------------------------------- -# Based on "Gaussian Blur Filter Shader" (2008), -# http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/ -# Blurring occurs in two steps (requiring an FBO): horizontal blur and vertical blur. -# Separating these two steps reduces the problem to linear complexity (i.e. it is faster). - -glsl_blur = ''' -uniform sampler2D src; -uniform int kernel; -uniform float radius; -uniform vec2 extent; -void main() { - vec2 v = gl_TexCoord[0].xy; - vec4 p = vec4(0.0); - float n = float(kernel * kernel); - if (v.x <= extent.x && v.y <= extent.y) { - for (int i=1; i 6 calculations, single pass => 9 calculations. -_blur["gaussian3x3"] = shader(fragment=''' -uniform sampler2D src; -uniform vec2 radius; -void main() { - float dx = radius.x; - float dy = radius.y; - vec2 v = gl_TexCoord[0].xy; - vec4 p = vec4(0.0); - p = 4.0 * texture2D(src, v); - p += 2.0 * texture2D(src, v + vec2(+dx, 0.0)); - p += 2.0 * texture2D(src, v + vec2(-dx, 0.0)); - p += 2.0 * texture2D(src, v + vec2(0.0, +dy)); - p += 2.0 * texture2D(src, v + vec2(0.0, -dy)); - p += 1.0 * texture2D(src, v + vec2(+dx, +dy)); - p += 1.0 * texture2D(src, v + vec2(-dx, +dy)); - p += 1.0 * texture2D(src, v + vec2(-dx, -dy)); - p += 1.0 * texture2D(src, v + vec2(+dx, -dy)); - gl_FragColor = p / 16.0; -}''') - -class Gaussian3x3Blur(Filter): - - def __init__(self, texture, scale=1.0): - self.shader = _blur["gaussian3x3"] - self.texture = texture - self.scale = scale - - def push(self): - x = float(self.scale) / self.texture.width - y = float(self.scale) / self.texture.height - self.shader.set("radius", vec2(x, y)) - self.shader.push() - -#--- COMPOSITING ------------------------------------------------------------------------------------- - -# Compositing function. -# It will be reused in alpha compositing and blending filters below. -# It prepares pixels p1 and p2, which need to be mixed into vec4 p. -glsl_compositing = ''' -uniform sampler2D src1; -uniform sampler2D src2; -uniform vec2 extent; -uniform vec2 offset; -uniform vec2 ratio; -uniform float alpha; -void main() { - vec2 v1 = gl_TexCoord[0].xy; - vec2 v2 = v1 * ratio - offset * extent; - vec4 p1 = texture2D(src1, v1.xy); - vec4 p2 = texture2D(src2, v2.xy); - if (v2.x < 0.0 || - v2.y < 0.0 || - v2.x > extent.x + 0.001 || - v2.y > extent.y + 0.001) { - gl_FragColor = p1; - return; - } - vec4 p = vec4(0.0); - %s - gl_FragColor = p; -}''' - -class Compositing(Filter): - - def __init__(self, shader, texture, blend, alpha=1.0, dx=0, dy=0): - """ A filter that mixes a base image (the destination) with a blend image (the source). - Used to implement alpha compositing and blend modes. - - dx: the horizontal offset (in pixels) of the blend layer. - - dy: the vertical offset (in pixels) of the blend layer. - """ - self.shader = shader - self.texture = texture - self.blend = blend - self.alpha = alpha - self.dx = dx - self.dy = dy - - def push(self): - w = float(self.blend.width) - h = float(self.blend.height) - w2 = float(ceil2(w)) - h2 = float(ceil2(h)) - dx = float(self.dx) / w - dy = float(self.dy) / h - glActiveTexture(GL_TEXTURE0) - glBindTexture(self.texture.target, self.texture.id) - glActiveTexture(GL_TEXTURE1) - glBindTexture(self.blend.target, self.blend.id) - glActiveTexture(GL_TEXTURE0) - self.shader.set("src1", 0) - self.shader.set("src2", 1) - self.shader.set("extent", vec2(w/w2, h/h2)) # Blend extent. - self.shader.set("offset", vec2(dx, dy)) # Blend offset. - self.shader.set("ratio", vec2(*ratio2(self.texture, self.blend))) # Image-blend proportion. - self.shader.set("alpha", self.alpha) - self.shader.push() - -#--- ALPHA TRANSPARENCY ------------------------------------------------------------------------------ - -_alpha = {} -_alpha["transparency"] = shader(fragment=''' -uniform sampler2D src; -uniform float alpha; -void main() { - vec4 p = texture2D(src, gl_TexCoord[0].xy); - gl_FragColor = vec4(p.rgb, p.a * alpha); -}''') -_alpha["mask"] = shader(fragment=glsl_compositing % ''' - p = vec4(p1.rgb, p1.a * (p2.r * p2.a * alpha)); -'''.strip()) - -class AlphaTransparency(Filter): - - def __init__(self, texture, alpha=1.0): - self.shader = _alpha["transparency"] - self.texture = texture - self.alpha = alpha - - def push(self): - self.shader.set("alpha", float(max(0, min(1, self.alpha)))) - self.shader.push() - -class AlphaMask(Compositing): - - def __init__(self, texture, blend, alpha=1.0, dx=0, dy=0): - Compositing.__init__(self, _alpha["mask"], texture, blend, alpha, dx, dy) - self.shader = _alpha["mask"] - -#--- BLEND MODES ------------------------------------------------------------------------------------- -# Based on "Photoshop math with GLSL shaders" (2009), Romain Dura, -# http://blog.mouaif.org/?p=94 - -ADD = "add" # Pixels are added. -SUBTRACT = "subtract" # Pixels are subtracted. -LIGHTEN = "lighten" # Lightest value for each pixel. -DARKEN = "darken" # Darkest value for each pixel. -MULTIPLY = "multiply" # Pixels are multiplied, resulting in a darker image. -SCREEN = "screen" # Pixels are inverted/multiplied/inverted, resulting in a brighter picture. -OVERLAY = "overlay" # Combines multiply and screen: light parts become ligher, dark parts darker. -HARDLIGHT = "hardlight" # Same as overlay, but uses the blend instead of base image for luminance. -HUE = "hue" # Hue from the blend image, brightness and saturation from the base image. - -# If the blend is opaque (alpha=1.0), swap base and blend. -# This way lighten, darken, multiply and screen appear the same as in Photoshop and Core Image. -_blendx = '''if (p2.a == 1.0) { vec4 p3=p1; p1=p2; p2=p3; } - ''' -# Blending operates on RGB values, the A needs to be handled separately. -# Where both images are transparent, their transparency is blended. -# Where the base image is fully transparent, the blend image appears source over. -# There is a subtle transition at transparent edges, which makes the edges less jagged. -glsl_blend = glsl_compositing % ''' - vec3 w = vec3(1.0); // white - %s - p = mix(p1, clamp(p, 0.0, 1.0), p2.a * alpha); - p = (v1.x * ratio.x > 1.0 || v1.y * ratio.y > 1.0)? p1 : p; - p = (p1.a < 0.25)? p * p1.a + p2 * (1.0-p1.a) : p; -'''.strip() -_blend = {} -_blend[ADD] = 'p = vec4(p1.rgb + p2.rgb, 1.0);' -_blend[SUBTRACT] = 'p = vec4(p1.rgb + p2.rgb - 1.0, 1.0);' -_blend[LIGHTEN] = _blendx + 'p = vec4(max(p1.rgb, p2.rgb), 1.0);' -_blend[DARKEN] = _blendx + 'p = vec4(min(p1.rgb, p2.rgb), 1.0);' -_blend[MULTIPLY] = _blendx + 'p = vec4(p1.rgb * p2.rgb, 1.0);' -_blend[SCREEN] = _blendx + 'p = vec4(w - (w - p1.rgb) * (w - p2.rgb), 1.0);' -_blend[OVERLAY] = ''' - float L = dot(p1.rgb, vec3(0.2125, 0.7154, 0.0721)); // luminance - vec4 a = vec4(2.0 * p1.rgb * p2.rgb, 1.0); - vec4 b = vec4(w - 2.0 * (w - p1.rgb) * (w - p2.rgb), 1.0); - p = (L < 0.45)? a : (L > 0.55)? b : vec4(mix(a.rgb, b.rgb, (L - 0.45) * 10.0), 1.0); -''' -_blend[HARDLIGHT] = _blend[OVERLAY].replace("dot(p1", "dot(p2") -_blend[HUE] = ''' - vec3 h1 = rgb2hsb(p1.rgb); - vec3 h2 = rgb2hsb(p2.rgb); - p = vec4(hsb2rgb(vec3(h2.x, h1.yz)).rgb, p1.a); -''' - -for f in _blend.keys(): - src = glsl_blend % _blend[f].strip() - src = f==HUE and glsl_rgb2hsb + glsl_hsb2rgb + src or src # Hue blend requires rgb2hsb() function. - _blend[f] = shader(fragment=src) - -class Blend(Compositing): - - def __init__(self, mode, texture, blend, alpha=1.0, dx=0, dy=0): - Compositing.__init__(self, _blend[mode], texture, blend, alpha, dx, dy) - -#--- DISTORTION -------------------------------------------------------------------------------------- -# Based on "PhotoBooth Demystified" (2007), Libero Spagnolini, -# http://dem.ocracy.org/libero/photobooth/ - -PINCH = "pinch" # Radius grows faster near the center of the effect. -TWIRL = "twirl" # Decreasing offset is added to the angle while moving down the radius. -SPLASH = "splash" # Light-tunnel effect by capping the radius. -BUMP = "bump" # Radius grows slower near the center of the effect. -DENT = "dent" -FISHEYE = "fisheye" -STRETCH = "stretch" -MIRROR = "mirror" - -# Distortion function. -# - vec2 offset: horizontal and vertical offset from the image center (-0.5 to +0.5). -# - vec2 extent: the actual size of the image (0.0-1.0) in the texture. -# Textures have a size power of 2 (512, 1024, ...) but the actual image may be smaller. -# We need to know the extent of the image in the texture to calculate its center. -# - float ratio: the ratio between width and height, so the effect doesn't get stretched. -# - float m: the magnitude of the effect (e.g. radius, ...) -# - float i: the intensity of the effect (e.g. number of rotations, ...) -# - vec2 n: a normalized texture space between -1.0 and 1.0 (instead of 0.0-1.0). -glsl_distortion = ''' -uniform sampler2D src; -uniform vec2 offset; -uniform vec2 extent; -uniform float ratio; -uniform float m; -uniform float i; -void main() { - vec2 v = gl_TexCoord[0].xy; - vec2 d = extent + extent * offset; - vec2 n = 2.0 * v - 1.0 * d; - n.x *= ratio; - %s - n.x /= ratio; - v = n / 2.0 + 0.5 * d; - %s - gl_FragColor = p; -}''' -# Polar coordinates. -# Most of the effects are based on simple angle and radius transformations. -# After the transformations, convert back to cartesian coordinates n. -glsl_polar = ''' - float r = length(n); - float phi = atan(n.y, n.x); - %s - n = vec2(r*cos(phi), r*sin(phi)); -'''.strip() -# For most effects, pixels are not wrapped around the edges. -# The second version wraps, with respect to the extent of the actual image in its power-of-2 texture. -# The third version wraps with a flipped image (transition). -glsl_wrap = ( - '''vec4 p = (v.x < 0.0 || v.y < 0.0 || v.x > 0.999 || v.y > 0.999)? vec4(0.0) : texture2D(src, v);''', - ''' - v.x = (v.x >= extent.x - 0.001)? mod(v.x, extent.x) - 0.002 : max(v.x, 0.001); - v.y = (v.y >= extent.y - 0.001)? mod(v.x, extent.x) - 0.002 : max(v.y, 0.001); - vec4 p = texture2D(src, v);'''.strip(), - ''' - v.x = (v.x >= extent.x - 0.001)? (extent.x - (v.x-extent.x)) - 0.002 : max(v.x, 0.001); - v.y = (v.y >= extent.y - 0.001)? (extent.y - (v.y-extent.y)) - 0.002 : max(v.y, 0.001); - vec4 p = texture2D(src, v);'''.strip()) - -_distortion = {} -_distortion[BUMP] = 'r = r * smoothstep(i, m, r);' -_distortion[DENT] = 'r = 2.0 * r - r * smoothstep(0.0, m, r/i);' -_distortion[PINCH] = 'r = pow(r, m/i) * m;' -_distortion[FISHEYE] = 'r = r * r / sqrt(2.0);' -_distortion[SPLASH] = 'if (r > m) r = m;' -_distortion[TWIRL] = 'phi = phi + (1.0 - smoothstep(-m, m, r)) * i;' -_distortion[MIRROR] = ''' - if (m > 0.0) { n.x += offset.x * extent.x * ratio; n.x = n.x * sign(n.x); } - if (i > 0.0) { n.y += offset.y * extent.y; n.y = n.y * sign(n.y); } -'''.strip() -_distortion[STRETCH] = ''' - vec2 s = sign(n); - n = abs(n); - n = (1.0-i) * n + i * smoothstep(m*0.25, m, n) * n; - n = s * n; -'''.strip() - -for f in (BUMP, DENT, PINCH, FISHEYE, SPLASH, TWIRL): - _distortion[f] = shader(fragment=glsl_distortion % (glsl_polar % _distortion[f], glsl_wrap[0])) -for f in (STRETCH, MIRROR): - _distortion[f] = shader(fragment=glsl_distortion % ( _distortion[f], glsl_wrap[2])) - -class Distortion(Filter): - - def __init__(self, effect, texture, dx=0, dy=0, m=1.0, i=1.0): - """ Distortion filter with dx, dy offset from the center (between -0.5 and 0.5), - magnitude m as the radius of effect, intensity i as the depth of the effect. - """ - self.shader = _distortion[effect] - self.texture = texture - self.dx = dx - self.dy = dy - self.m = m - self.i = i - - # Center offset can also be set in absolute coordinates (e.g. pixels): - def _get_abs_dx(self): - return int(self.dx * self.texture.width) - def _get_abs_dy(self): - return int(self.dy * self.texture.height) - def _set_abs_dx(self, v): - self.dx = float(v) / self.texture.width - def _set_abs_dy(self, v): - self.dy = float(v) / self.texture.height - - abs_dx = property(_get_abs_dx, _set_abs_dx) - abs_dy = property(_get_abs_dy, _set_abs_dy) - - def push(self): - w = float(self.texture.width) - h = float(self.texture.height) - w2 = float(ceil2(w)) - h2 = float(ceil2(h)) - self.shader.set("extent", vec2(w/w2, h/h2)) - self.shader.set("offset", vec2(float(2*self.dx), float(2*self.dy))) - self.shader.set("ratio", w2/h2) - self.shader.set("m", float(self.m)) - self.shader.set("i", float(self.i)) - self.shader.push() - -#===================================================================================================== - -#--- FRAME BUFFER OBJECT ----------------------------------------------------------------------------- -# Based on "Frame Buffer Object 101" (2006), Rob Jones, -# http://www.gamedev.net/reference/articles/article2331.asp - -_UID = 0 -def _uid(): - # Each FBO has a unique ID. - global _UID; _UID+=1; return _UID; - -def _texture(width, height): - # Returns an empty texture of the given width and height. - return Texture.create(width, height) - -def glCurrentViewport(x=None, y=None, width=None, height=None): - """ Returns a (x, y, width, height)-tuple with the current viewport bounds. - If x, y, width and height are given, set the viewport bounds. - """ - # Why? To switch between the size of the onscreen canvas and the offscreen buffer. - # The canvas could be 256x256 while an offscreen buffer could be 1024x1024. - # Without switching the viewport, information from the buffer would be lost. - if x is not None and y is not None and width is not None and height is not None: - glViewport(x, y, width, height) - glMatrixMode(GL_PROJECTION) - glLoadIdentity() - glOrtho(x, width, y, height, -1, 1) - glMatrixMode(GL_MODELVIEW) - xywh = (GLint*4)(); glGetIntegerv(GL_VIEWPORT, xywh) - return tuple(xywh) - -# The FBO stack keeps track of nested FBO's. -# When OffscreenBuffer.pop() is called, we revert to the previous buffer. -# Usually, this is the onscreen canvas, but in a render() function that contains -# filters or nested render() calls, this is the previous FBO. -_FBO_STACK = [] - -class OffscreenBufferError(Exception): - pass - -class OffscreenBuffer(object): - - def __init__(self, width, height): - """ "FBO" is an OpenGL extension to do "Render to Texture", drawing in an offscreen buffer. - It is useful as a place to chain multiple shaders, - since each shader has its own program and we can only install one program at a time. - """ - self.id = c_uint(_uid()) - try: glGenFramebuffersEXT(1, byref(self.id)) - except: - raise OffscreenBufferError, "offscreen buffer not supported." - self.texture = None - self._viewport = (None, None, None, None) # The canvas bounds, set in OffscreenBuffer.push(). - self._active = False - self._init(width, height) - #self._init_depthbuffer() - - def _init(self, width, height): - self.texture = _texture(int(width), int(height)) - - @property - def width(self): - return self.texture.width - - @property - def height(self): - return self.texture.height - - @property - def active(self): - return self._active - - def push(self): - """ Between push() and pop(), all drawing is done offscreen in OffscreenBuffer.texture. - The offscreen buffer has its own transformation state, - so any translate(), rotate() etc. does not affect the onscreen canvas. - """ - _FBO_STACK.append(self) - glBindTexture(self.texture.target, self.texture.id) - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, self.id.value) - glFramebufferTexture2DEXT( - GL_FRAMEBUFFER_EXT, - GL_COLOR_ATTACHMENT0_EXT, - self.texture.target, - self.texture.id, - self.texture.level - ) - # FBO's can fail when not supported by the graphics hardware, - # or when supplied an image of size 0 or unequal width/height. - # Check after glBindFramebufferEXT() and glFramebufferTexture2DEXT(). - if glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT: - msg = self.texture.width == self.texture.height == 0 and "width=0, height=0." or "" - raise OffscreenBufferError, msg - # Separate the offscreen from the onscreen transform state. - # Separate the offscreen from the onscreen canvas size. - self._viewport = glCurrentViewport() - glPushMatrix() - glLoadIdentity() - glCurrentViewport(0, 0, self.texture.width, self.texture.height) - glColor4f(1.0,1.0,1.0,1.0) - # FBO's work with a simple GL_LINE_SMOOTH anti-aliasing. - # The instructions on how to enable framebuffer multisampling are pretty clear: - # (http://www.opengl.org/wiki/GL_EXT_framebuffer_multisample) - # but glRenderbufferStorageMultisampleEXT doesn't appear to work (yet), - # plus there is a performance drop. - glEnable(GL_LINE_SMOOTH) - # Blending transparent images in a transparent FBO is a bit tricky - # because alpha is premultiplied, an image with 50% transparency - # will come out 25% transparency with glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). - # http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=257630 - # http://www.openframeworks.cc/forum/viewtopic.php?f=9&t=2215 - # This blend mode gives better results: - glEnable(GL_BLEND) - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) - self._active = True - - def pop(self): - """ Reverts to the onscreen canvas. - The contents of the offscreen buffer can be retrieved with OffscreenBuffer.texture. - """ - # Switch to onscreen canvas size and transformation state. - # Switch to onscreen canvas. - # Reset to the normal blending mode. - _FBO_STACK.pop(-1) - glCurrentViewport(*self._viewport) - glPopMatrix() - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _FBO_STACK and _FBO_STACK[-1].id or 0) - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) - #glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - self._active = False - - def render(self): - """ Executes the drawing commands in OffscreenBuffer.draw() offscreen and returns image. - This is useful if you have a class that inherits from FBO with a draw() method. - """ - self.push() - self.draw() - self.pop() - return self.texture - - def draw(self): - pass - - def slice(self, x, y, width, height): - """ Returns a portion of the offscreen buffer as an image. - """ - return self.texture.get_region(x, y, width, height) - - def reset(self, width=None, height=None): - """ Resizes the offscreen buffer by attaching a new texture to it. - This will destroy the contents of the previous buffer. - If you do not explicitly reset the buffer, the contents from previous drawing - between OffscreenBuffer.push() and OffscreenBuffer.pop() is retained. - """ - if self._active: - raise OffscreenBufferError, "can't reset offscreen buffer when active" - if width is None: - width = self.width - if height is None: - height = self.height - self._init(width, height) - - def clear(self): - glClear(GL_COLOR_BUFFER_BIT) - glClear(GL_DEPTH_BUFFER_BIT) - glClear(GL_STENCIL_BUFFER_BIT) - - def _init_depthbuffer(self): - self._depthbuffer = c_uint(_uid()) - glGenRenderbuffersEXT(1, byref(self._depthbuffer)) - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, self._depthbuffer) - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, self.width, self.height) - glFramebufferRenderbufferEXT( - GL_FRAMEBUFFER_EXT, - GL_DEPTH_ATTACHMENT_EXT, - GL_RENDERBUFFER_EXT, - self._depthbuffer - ) - - def __del__(self): - try: - if glDeleteFramebuffersEXT: - glDeleteFramebuffersEXT(1, self.id) - if glDeleteRenderbuffersEXT and hasattr(self, "_depthbuffer"): - glDeleteRenderbuffersEXT(1, self._depthbuffer) - except: - pass - -FBO = OffscreenBuffer - -#===================================================================================================== - -#--- OFFSCREEN RENDERING ----------------------------------------------------------------------------- -# Uses an offscreen buffer to render filters and drawing commands to images. - -try: - _buffer = OffscreenBuffer(640, 480) -except OffscreenBufferError: - _buffer = None - -def filter(img, filter=None, clear=True): - """ Returns a new Image object with the given filter applied to it. - - img : an image that can be passed to the image() command. - - filter: an instance of the Filter class, with parameters set. - - clear : if True, clears the contents of the offscreen buffer and resizes it to the image. - """ - # For file paths, textures and Pixel objects, create an Image first. - if not isinstance(img, Image): - img = Image(img) - # Reuse main _buffer when possible, otherwise create one on the fly - # (this will be necessary when filter() or render() is nested inside render()). - if not _buffer or _buffer.active: - buffer = OffscreenBuffer(img.texture.width, img.texture.height) - elif clear: - buffer = _buffer - buffer.reset(img.texture.width, img.texture.height) - else: - buffer = _buffer - buffer.push() - if filter != None: - filter.texture = img.texture # Register the current texture with the filter. - filter.push() - # This blend mode gives better results for transparent images: - glBlendFuncSeparate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) - # Note: Image.alpha and Image.color attributes won't work here, - # because the shader overrides the default drawing behavior. - # Instead, add the transparent() and colorize() filters to the chain. - img.draw(0, 0, img.texture.width, img.texture.height) - if filter != None: - filter.pop() - buffer.pop() - return img.copy(texture=buffer.texture) - -class RenderedImage(Image): - - def draw(self, *args, **kwargs): - # Textures rendered in the FBO look slightly washed out. - # The render() command yields a RenderedImage object, - # which draw() method uses a blending trick to correct the colors: - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) - Image.draw(self, *args, **kwargs) - glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) - - def save(self, path): - # XXX Colors will appear washed out in the exported image. - Image.save(self, path) - -def render(function, width, height, clear=True, **kwargs): - """ Returns an Image object from a function containing drawing commands (i.e. a procedural image). - This is useful when, for example, you need to render filters on paths. - - function: a function containing drawing commands. - - width : width of the offscreen canvas. - - height : height of the offscreen canvas. - - clear : when False, retains the contents of the offscreen canvas, without resizing it. - """ - # Reuse main _buffer when possible, otherwise create one on the fly - # (this will be necessary when render() is nested inside another render()). - if not _buffer or _buffer.active: - buffer = OffscreenBuffer(width, height) - elif clear: - buffer = _buffer - buffer.reset(width, height) - else: - buffer = _buffer - buffer.push() - function(**kwargs) - buffer.pop() - return RenderedImage(buffer.texture) - -#--- OFFSCREEN FILTERS ------------------------------------------------------------------------------- -# Images are rendered offscreen with the filter applied, and the new image returned. - -def invert(img): - """ Returns an image with inverted colors (e.g. white becomes black). - """ - return filter(img, Invert(img.texture)) - -def solid(width, height, fill=(0,0,0,0)): - """ Generates an image filled with a solid color. - """ - clr = tuple([int(v*255) for v in fill]) - return Image(SolidColorImagePattern(clr).create_image(width, height).get_texture()) - -def gradient(width, height, clr1=(0,0,0,1), clr2=(1,1,1,1), type=LINEAR): - """ Generates a gradient image and returns it. - - width : the width of the image. - - height: the height of the image. - - clr1 : a Color (or a tuple) that defines the bottom (or inner) color. - - clr2 : a Color (or a tuple) that defines the top (or outer) color. - - type : either LINEAR or RADIAL. - """ - f = type==LINEAR and LinearGradient or RadialGradient - img = Image(_texture(ceil2(width), ceil2(height))) - img = filter(img, f(img.texture, vec4(*clr1), vec4(*clr2))) - # Reuse main _buffer when possible, otherwise create one on the fly - # (this will be necessary when filter() or render() is nested inside render()). - if not _buffer or _buffer.active: - buffer = OffscreenBuffer(img.texture.width, img.texture.height) - else: - buffer = _buffer - # If the given dimensions are not power of 2, - # scale down the gradient to the given dimensions. - if width != img.width or height != img.height: - buffer.reset(width, height) - buffer.push() - img.width = width - img.height = height - img.draw() - buffer.pop() - return img.copy(texture=buffer.texture) - return img - -def colorize(img, color=(1,1,1,1), bias=(0,0,0,0)): - """ Applies a colorize filter to the image and returns the colorized image. - - color: a Color (or a tuple) of RGBA-values to multiply with each image pixel. - - bias : a Color (or a tuple) of RGBA-values to add to each image pixel. - """ - return filter(img, Colorize(img.texture, vec4(*color), vec4(*bias))) - -def adjust(img, brightness=1.0, contrast=1.0, saturation=1.0, hue=0.0): - """ Applies color adjustment filters to the image and returns the adjusted image. - - brightness: the overall lightness or darkness (0.0 is a black image). - - contrast : the difference in brightness between regions. - - saturation: the intensity of the colors (0.0 is a grayscale image). - - hue : the shift in hue (1.0 is 360 degrees on the color wheel). - """ - if brightness != 1: img = filter(img, BrightnessAdjustment(img.texture, brightness)) - if contrast != 1: img = filter(img, ContrastAdjustment(img.texture, contrast)) - if saturation != 1: img = filter(img, SaturationAdjustment(img.texture, saturation)) - if hue != 0: img = filter(img, HueAdjustment(img.texture, hue)) - return img - -def desaturate(img): - """ Returns a grayscale version of the image. - """ - return filter(img, SaturationAdjustment(img.texture, 0.0)) - -grayscale = desaturate - -def brightpass(img, threshold=0.3): - """ Applies a bright pass filter, where pixels whose luminance falls below the threshold are black. - """ - return filter(img, BrightPass(img.texture, threshold)) - -def blur(img, kernel=5, scale=1.0, amount=1, cumulative=False): - """ Applies a blur filter to the image and returns the blurred image. - - kernel: the size of the convolution matrix (e.g. 9 = 9x9 convolution kernel). - - scale : the radius of the effect, a higher scale will create a rougher but faster blur. - - amount: the number of the times to apply the blur filter; - because blurred layers are pasted on top of each other cumulatively - this produces a nicer effect than repeatedly using blur() in a for-loop - (which blurs the blurred). - """ - for i in range(amount): - clear = i==0 or not cumulative - img = filter(img, HorizontalBlur(img.texture, kernel, scale), clear=clear) - img = filter(img, VerticalBlur(img.texture, kernel, scale), clear=clear) - return img - -def transparent(img, alpha=1.0): - """ Returns a transparent version of the image. - - alpha: the percentage of the original opacity of the image (0.0-1.0). - """ - return filter(img, AlphaTransparency(img.texture, alpha)) - -def _q(img): - # For images functioning as masks or blend layers, - # apply any quad distortian and then use the texture of the distored image. - if img.quad != (0,0,0,0,0,0,0,0): - return filter(img) - return img - -def mask(img1, img2, alpha=1.0, dx=0, dy=0): - """ Applies the second image as an alpha mask to the first image. - The second image must be a grayscale image, where the black areas - make the first image transparent (e.g. punch holes in it). - - dx: horizontal offset (in pixels) of the alpha mask. - - dy: vertical offset (in pixels) of the alpha mask. - """ - return filter(img1, AlphaMask(img1.texture, _q(img2).texture, alpha, dx, dy)) - -def blend(img1, img2, mode=OVERLAY, alpha=1.0, dx=0, dy=0): - """ Applies the second image as a blend layer with the first image. - - dx: horizontal offset (in pixels) of the blend layer. - - dy: vertical offset (in pixels) of the blend layer. - """ - return filter(img1, Blend(mode, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def add(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(ADD, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def subtract(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(SUBTRACT, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def lighten(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(LIGHTEN, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def darken(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(DARKEN, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def multiply(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(MULTIPLY, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def screen(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(SCREEN, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def overlay(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(OVERLAY, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def hardlight(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(HARDLIGHT, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def hue(img1, img2, alpha=1.0, dx=0, dy=0): - return filter(img1, Blend(HUE, img1.texture, _q(img2).texture, alpha, dx, dy)) - -def glow(img, intensity=0.5, amount=1): - """ Returns the image blended with a blurred version, yielding a glowing effect. - - intensity: the opacity of the blur (0.0-1.0). - - amount : the number of times to blur. - """ - b = blur(img, kernel=9, scale=1.0, amount=max(1, amount)) - return add(img, b, alpha=intensity) - -def bloom(img, intensity=0.5, amount=1, threshold=0.3): - """ Returns the image blended with a blurred brightpass version, yielding a "magic glow" effect. - - intensity: the opacity of the blur (0.0-1.0). - - amount : the number of times to blur. - - threshold: the luminance threshold of pixels that light up. - """ - b = brightpass(img, threshold) - b = blur(img, kernel=9, scale=1.0, amount=max(1, amount)) - return add(img, b, alpha=intensity) - -def distortion_mixin(type, dx, dy, **kwargs): - # Each distortion filter has specific parameters to tweak the effect (usually radius and zoom). - # Returns the magnitude m and intensity i from the keyword arguments, - # which are the parameters expected by the Distortion Filter class. - if type == BUMP: - m = kwargs.get("radius", 0.5) - i = lerp(-m*20, m*0.25, max(0, kwargs.get("zoom", 0.5))**0.1) - elif type == DENT: - m = max(0, 2 * kwargs.get("radius", 0.5)) - i = max(0, 1 * kwargs.get("zoom", 0.5)) - elif type == PINCH: - m = 1.0 - i = max(0.2, 2 * kwargs.get("zoom", 0.75)) - elif type == TWIRL: - m = kwargs.get("radius", 1.0) - i = radians(kwargs.get("angle", 180.0)) - elif type == SPLASH: - m = kwargs.get("radius", 0.5) - i = 0 - elif type == MIRROR: - m = int(kwargs.get("horizontal", True)) - i = int(kwargs.get("vertical", True)) - dx = clamp(dx, -0.5, 1.5) - dy = clamp(dy, -0.5, 1.5) - elif type == STRETCH: - m = max(0, kwargs.get("radius", 0.5)) - i = max(0, min(1, 0.5 * kwargs.get("zoom", 1.0))) - else: - m = 0.5 - i = 0.5 - return dx, dy, m, i - -#def bump(img, dx=0.5, dy=0.5, radius=0.5, zoom=0.5) -def bump(img, dx=0.5, dy=0.5, **kwargs): - """ Returns the image with a bump distortion applied to it. - - dx: horizontal origin of the effect, between 0.0 and 1.0. - - dy: vertical origin of the effect, between 0.0 and 1.0. - - radius: the radius of the affected area, proportional to the image size. - - zoom: the amount to zoom in. - """ - dx, dy, m, i = distortion_mixin(BUMP, dx, dy, **kwargs) - return filter(img, filter=Distortion(BUMP, img.texture, dx-0.5, dy-0.5, m, i)) - -#def dent(img, dx=0.5, dy=0.5, radius=0.5, zoom=0.5) -def dent(img, dx=0.5, dy=0.5, **kwargs): - """ Returns the image with a dent distortion applied to it. - - dx: horizontal origin of the effect, between 0.0 and 1.0. - - dy: vertical origin of the effect, between 0.0 and 1.0. - - radius: the radius of the affected area, proportional to the image size. - - zoom: the amount to zoom in. - """ - dx, dy, m, i = distortion_mixin(DENT, dx, dy, **kwargs) - return filter(img, filter=Distortion(DENT, img.texture, dx-0.5, dy-0.5, m, i)) - -#def pinch(img, dx=0.5, dy=0.5, zoom=0.75) -def pinch(img, dx=0.5, dy=0.5, **kwargs): - """ Returns the image with a pinch distortion applied to it. - - dx: horizontal origin of the effect, between 0.0 and 1.0. - - dy: vertical origin of the effect, between 0.0 and 1.0. - - zoom: the amount of bulge (0.1-0.5) or pinch (0.5-1.0): - """ - dx, dy, m, i = distortion_mixin(PINCH, dx, dy, **kwargs) - return filter(img, filter=Distortion(PINCH, img.texture, dx-0.5, dy-0.5, m, i)) - -#def twirl(img, dx=0.5, dy=0.5, radius=1.0, angle=180.0) -def twirl(img, dx=0.5, dy=0.5, **kwargs): - """ Returns the image with a twirl distortion applied to it. - - dx: horizontal origin of the effect, between 0.0 and 1.0. - - dy: vertical origin of the effect, between 0.0 and 1.0. - - radius: the radius of the effect, proportional to the image size. - - angle: the amount of rotation in degrees. - """ - dx, dy, m, i = distortion_mixin(TWIRL, dx, dy, **kwargs) - return filter(img, filter=Distortion(TWIRL, img.texture, dx-0.5, dy-0.5, m, i)) - -#def splash(img, dx=0.5, dy=0.5, radius=0.5) -def splash(img, dx=0.5, dy=0.5, **kwargs): - """ Returns the image with a light-tunnel distortion applied to it. - - dx: horizontal origin of the effect, between 0.0 and 1.0. - - dy: vertical origin of the effect, between 0.0 and 1.0. - - radius: the radius of the unaffected area, proportional to the image size. - """ - dx, dy, m, i = distortion_mixin(SPLASH, dx, dy, **kwargs) - return filter(img, filter=Distortion(SPLASH, img.texture, dx-0.5, dy-0.5, m, i)) - -#def stretch(img, dx=0.5, dy=0.5, radius=0.5, zoom=1.0) -def stretch(img, dx=0.5, dy=0.5, **kwargs): - """ Returns the image with a zoom box distortion applied to it. - - dx: horizontal origin of the effect, between 0.0 and 1.0. - - dy: vertical origin of the effect, between 0.0 and 1.0. - - radius: the radius of the affected area, proportional to the image size. - - zoom: the amount to zoom in (0.0-2.0, where 1.0 means 1x zoomed in, or 200%). - """ - dx, dy, m, i = distortion_mixin(STRETCH, dx, dy, **kwargs) - return filter(img, filter=Distortion(STRETCH, img.texture, dx-0.5, dy-0.5, m, i)) - -#def mirror(img, dx=0.5, dy=0.5, horizontal=True, vertical=True) -def mirror(img, dx=0.5, dy=0.5, **kwargs): - """ Returns the image mirrored along horizontal axis dx and vertical axis dy. - - dx: horizontal origin of the effect, between 0.0 and 1.0. - - dy: vertical origin of the effect, between 0.0 and 1.0. - - horizontal: when True, mirrors the image horizontally. - - vertical : when True, mirrors the image vertically. - """ - dx, dy, m, i = distortion_mixin(MIRROR, dx, dy, **kwargs) - return filter(img, filter=Distortion(MIRROR, img.texture, dx-0.5, dy-0.5, m, i)) - -def dropshadow(img, alpha=0.5, amount=2, kernel=5): - """ Returns a blurred and grayscale version of the image. - If filters are not supported, returns a grayscale version without blur (using Image.color). - """ - if not SUPPORTED: - t = texture(img) - else: - t = blur(img, kernel=kernel, amount=amount).texture - img = isinstance(img, Image) and img.copy(t) or Image(t) - img.color.rgba = (0,0,0, alpha) - return img - -#--- ONSCREEN FILTERS -------------------------------------------------------------------------------- -# These can be used directly as filter parameter for the image() command. -# This may be faster because no offscreen buffer is used to render the effect. - -def inverted(): - return Invert(None) - -def colorized(color=(1,1,1,1), bias=(0,0,0,0)): - return Colorize(None, vec4(*color), vec4(*bias)) - -def adjusted(mode, v): - if mode == BRIGHTNESS: - return BrightnessAdjustment(None, v) - if mode == CONTRAST: - return ContrastAdjustment(None, v) - if mode == SATURATION: - return SaturationAdjustment(None, v) - if mode == HUE: - return HueAdjustment(None, v) - -def desaturated(): - return SaturationAdjustment(None, 0.0) - -def blurred(scale=1.0): - return Gaussian3x3Blur(None, scale) - -def masked(img, alpha=1.0, dx=0, dy=0): - return AlphaMask(None, _q(img).texture, alpha, dx, dy) - -def blended(mode, img, alpha=1.0, dx=0, dy=0): - return Blend(mode, None, _q(img).texture, alpha, dx, dy) - -def distorted(type, dx=0.5, dy=0.5, **kwargs): - dx, dy, m, i = distortion_mixin(type, dx, dy, **kwargs) - return Distortion(type, None, dx-0.5, dy-0.5, m, i) \ No newline at end of file diff --git a/nodebox/gui/__init__.py b/nodebox/gui/__init__.py deleted file mode 100644 index ad9aade..0000000 --- a/nodebox/gui/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from controls import * \ No newline at end of file diff --git a/nodebox/gui/controls.py b/nodebox/gui/controls.py deleted file mode 100644 index bee3aed..0000000 --- a/nodebox/gui/controls.py +++ /dev/null @@ -1,1222 +0,0 @@ -#=== CONTROLS ======================================================================================== -# Native GUI controls. -# Authors: Tom De Smedt -# License: BSD (see LICENSE.txt for details). -# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) -# http://cityinabottle.org/nodebox - -import os -from glob import glob -from time import time - -from pyglet.text.layout import IncrementalTextLayout -from pyglet.text.caret import Caret - -from nodebox.graphics.geometry import angle, distance, clamp, Bounds, INFINITE -from nodebox.graphics import \ - Layer, Color, Image, image, crop, rect, \ - Text, font, NORMAL, BOLD, CENTER, DEFAULT_FONT, install_font, \ - translate, rotate, \ - line, DASHED, DOTTED, \ - DEFAULT, HAND, TEXT, \ - LEFT, RIGHT, UP, DOWN, TAB, ENTER, BACKSPACE, CTRL, SHIFT, ALT - -def _popdefault(dict, key, default=None): - """ Pops the given key from the dictionary and returns its value (or default). - """ - if key in dict: - return dict.pop(key) - return default - -def _find(match=lambda item: False, list=[]): - """ Returns the first item in the list for which match(item)=True, or None. - """ - for item in list: - if match(item): return item - -#===================================================================================================== - -#--- Theme ------------------------------------------------------------------------------------------- - -class Theme(dict): - - def __init__(self, path, **kwargs): - """ A theme defines the source images for controls and font settings for labels. - A theme is loaded from a given folder path (containing PNG images and TTF font files). - The default theme is in nodebox/graphics/gui/theme/ - Copy this folder and modify it to create a custom theme. - """ - images = glob(os.path.join(path, "*.png")) - images = [(os.path.basename(os.path.splitext(f)[0]), f) for f in images] - fonts = glob(os.path.join(path, "*.ttf")) - fonts = [(os.path.basename(os.path.splitext(f)[0]), install_font(f)) for f in fonts] - fonts = [f[0] for f in fonts if f[1]] # Filename is assumed to be fontname. - dict.__init__(self, images) - self["fonts"] = fonts - self["fontname"] = kwargs.get("fontname", fonts and fonts[-1] or DEFAULT_FONT) - self["fontsize"] = kwargs.get("fontsize", 10) - self["fontweight"] = kwargs.get("fontweight", NORMAL) - self["text"] = kwargs.get("text", Color(1.0)) - -theme = Theme(os.path.join(os.path.dirname(os.path.abspath(__file__)), "theme")) - -#===================================================================================================== - -#--- Control ----------------------------------------------------------------------------------------- - -class Control(Layer): - - def __init__(self, x=0, y=0, id=None, color=(1,1,1,1), **kwargs): - """ Base class for GUI controls. - The Control class inherits from Layer so it must be appended to the canvas (or a container) - to receive events and get drawn. - An id can be given to uniquely identify the control. - If the control is part of a Panel, it can be retrieved with Panel.control_id. - """ - Layer.__init__(self, x=x, y=y, **kwargs) - self.id = id - self.src = {} # Collection of source images. - self.color = color # Color for source images. - self.enabled = True # Enable event listener. - self.duration = 0 # Disable tweening. - self._controls = {} # Lazy index of (id, control) children, see nested(). - self._press = None - - # Control width and height can't be modified after creation. - # Internally, use Layer._set_width() and Layer._set_height(). - @property - def width(self): - return self._get_width() - @property - def height(self): - return self._get_height() - - def on_mouse_enter(self, mouse): - mouse.cursor = HAND - def on_mouse_leave(self, mouse): - mouse.cursor = DEFAULT - - def on_mouse_press(self, mouse): - # Fire Control.on_mouse_doubleclick() when mouse is pressed twice in same location. - # Subclasses need to call this method in their overridden on_mouse_press(). - if self._press and \ - abs(self._press[0] - mouse.x) < 2 and \ - abs(self._press[1] - mouse.y) < 2 and \ - self._press[2] == mouse.button and \ - self._press[3] == mouse.modifiers and \ - self._press[4] - time() > -0.4: - self._press = None - self.on_mouse_doubleclick(mouse) - self._press = (mouse.x, mouse.y, mouse.button, mouse.modifiers, time()) - - def on_mouse_doubleclick(self, mouse): - pass - - def on_key_press(self, keys): - for control in self: - control.on_key_press(keys) - def on_key_release(self, keys): - for control in self: - control.on_key_release(keys) - - def on_action(self): - """ Override this method with a custom action. - """ - pass - - def reset(self): - pass - - def _draw(self): - Layer._draw(self) - - # Control._pack() is called internally to layout child controls. - # This should not happen in Control.update(), which is called every frame. - def _pack(self): - pass - - # With transformed=True, expensive matrix transformations are done. - # Turn off, controls are not meant to be rotated or scaled. - def layer_at(self, x, y, clipped=False, enabled=False, transformed=True, _covered=False): - return Layer.layer_at(self, x, y, clipped, enabled, False, _covered) - - def origin(self, x=None, y=None, relative=False): - return Layer.origin(self, x, y, relative) - def rotate(self, angle): - pass - def scale(self, f): - pass - - def __getattr__(self, k): - # Yields the property with the given name, or - # yields the child control with the given id. - if k in self.__dict__: - return self.__dict__[k] - ctrl = nested(self, k) - if ctrl is not None: - return ctrl - raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, k) - - def __repr__(self): - return "%s(id=%s%s)" % ( - self.__class__.__name__, - repr(self.id), - hasattr(self, "value") and ", value="+repr(self.value) or "" - ) - -def nested(control, id): - """ Returns the child Control with the given id, or None. - Also searches all child Layout containers. - """ - # First check the Control._controls cache (=> 10x faster). - # Also check if the control's id changed after it was cached (however unlikely). - # If so, the cached entry is no longer valid. - if id in control._controls: - ctrl = control._controls[id] - if ctrl.id == id: - return ctrl - del control._controls[id] - # Nothing in the cache. - # Traverse all child Control and Layout objects. - m = None - for ctrl in control: - if ctrl.__dict__.get("id") == id: - m = ctrl; break - if isinstance(ctrl, Layout): - m = nested(ctrl, id) - if m is not None: - break - # If a control was found, cache it. - if m is not None: - control._controls[id] = m - return m - -#===================================================================================================== - -#--- Label ------------------------------------------------------------------------------------------- - -class Label(Control): - - def __init__(self, caption, x=0, y=0, width=None, height=None, id=None, **kwargs): - """ A label displaying the given caption, centered in the label's (width, height)-box. - The label does not receive any events. - Optional parameters can include fill, font, fontsize, fontweight. - """ - txt = Text(caption, **{ - "fill" : _popdefault(kwargs, "fill", theme["text"]), - "font" : _popdefault(kwargs, "font", theme["fontname"]), - "fontsize" : _popdefault(kwargs, "fontsize", theme["fontsize"]), - "fontweight" : _popdefault(kwargs, "fontweight", theme["fontweight"]), - "lineheight" : 1, - "align" : CENTER - }) - kwargs.setdefault("width", txt.metrics[0]) - kwargs.setdefault("height", txt.metrics[1]) - Control.__init__(self, x=x, y=y, id=id, **kwargs) - self.enabled = False # Pass on events to the layers underneath. - self._text = txt - self._pack() - - def _get_caption(self): - return self._text.text - def _set_caption(self, string): - self._text.text = string - self._pack() - - caption = property(_get_caption, _set_caption) - - @property - def font(self): - return self._text.font - @property - def fontsize(self): - return self._text.fontsize - @property - def fontweight(self): - return self._text.fontweight - - def _pack(self): - # Center the text inside the label. - self._text.x = 0.5 * (self.width - self._text.metrics[0]) - self._text.y = 0.5 * (self.height - self._text.metrics[1]) - - def draw(self): - self._text.draw() - -#===================================================================================================== - -#--- BUTTON ------------------------------------------------------------------------------------------ - -class Button(Control): - - def __init__(self, caption="", action=None, x=0, y=0, width=125, id=None, **kwargs): - """ A clickable button that will fire Button.on_action() when clicked. - The action handler can be defined in a subclass, or given as a function. - """ - Control.__init__(self, x=x, y=y, width=width, id=id, **kwargs) - img, w = Image(theme["button"]), 20 - self.src = { - "face" : crop(img, w, 0, 1, img.height), - "cap1" : crop(img, 0, 0, w, img.height), - "cap2" : crop(img, img.width-w, 0, w, img.height), - } - if action: - # Override the Button.on_action() method from the given function. - self.set_method(action, name="on_action") - _popdefault(kwargs, "width") - _popdefault(kwargs, "height") - self.append(Label(caption, **kwargs)) - self._pack() - - def _get_caption(self): - return self[0].caption - def _set_caption(self, string): - self[0].caption = string - self._pack() - - caption = property(_get_caption, _set_caption) - - def _pack(self): - # Button size can not be smaller than its caption. - w = max(self.width, self[0].width + self[0].fontsize * 2) - self._set_width(w) - self._set_height(self.src["face"].height) - - def update(self): - # Center the text inside the button. - # This happens each frame because the position changes when the button is pressed. - self[0].x = 0.5 * (self.width - self[0].width) - self[0].y = 0.5 * (self.height - self[0].height) - self.pressed - - def draw(self): - clr = self.pressed and [v*0.75 for v in self.color] or self.color - im1, im2, im3 = self.src["cap1"], self.src["cap2"], self.src["face"] - image(im1, 0, 0, height=self.height, color=clr) - image(im2, x=self.width-im2.width, height=self.height, color=clr) - image(im3, x=im1.width, width=self.width-im1.width-im2.width, height=self.height, color=clr) - - def on_mouse_release(self, mouse): - Control.on_mouse_release(self, mouse) - if self.contains(mouse.x, mouse.y, transformed=False): - # Only fire event if mouse is actually released on the button. - self.on_action() - -#--- ACTION ------------------------------------------------------------------------------------------ - -class Action(Control): - - def __init__(self, action=None, x=0, y=0, id=None, **kwargs): - """ A clickable button that will fire Action.on_action() when clicked. - Actions display an icon instead of a text caption. - Actions are meant to be used for interface management: - e.g. closing or minimizing a panel, navigating to the next page, ... - """ - Control.__init__(self, x=x, y=y, id=id, **kwargs) - self.src = {"face": Image(theme["action"])} - self._pack() - if action: - # Override the Button.on_action() method from the given function. - self.set_method(action, name="on_action") - - def _pack(self): - self._set_width(self.src["face"].width) - self._set_height(self.src["face"].height) - - def draw(self): - clr = self.pressed and [v*0.75 for v in self.color] or self.color - image(self.src["face"], 0, 0, color=clr) - - def on_mouse_release(self, mouse): - Control.on_mouse_release(self, mouse) - if self.contains(mouse.x, mouse.y, transformed=False): - # Only fire event if mouse is actually released on the button. - self.on_action() - -class Close(Action): - - def __init__(self, action=None, x=0, y=0, id=None, **kwargs): - """ An action that hides the parent control (e.g. a Panel) when pressed. - """ - Action.__init__(self, action, x=x, y=y, id=id, **kwargs) - self.src["face"] = Image(theme["action-close"]) - - def on_action(self): - self.parent.hidden = True - -#===================================================================================================== - -#--- SLIDER ------------------------------------------------------------------------------------------ - -class Handle(Control): - - def __init__(self, parent): - # The slider handle can protrude from the slider bar, - # so it is a separate layer that fires its own events. - Control.__init__(self, - width = parent.src["handle"].width, - height = parent.src["handle"].height) - self.parent = parent - - def on_mouse_press(self, mouse): - self.parent.on_mouse_press(mouse) - def on_mouse_drag(self, mouse): - self.parent.on_mouse_drag(mouse) - def on_mouse_release(self, mouse): - self.parent.on_mouse_release(mouse) - - def draw(self): - clr = self.parent.pressed | self.pressed and [v*0.75 for v in self.color] or self.color - image(self.parent.src["handle"], 0, 0, color=clr) - -class Slider(Control): - - def __init__(self, default=0.5, min=0.0, max=1.0, steps=100, x=0, y=0, width=125, id=None, **kwargs): - """ A draggable slider that will fire Slider.on_action() when dragged. - The slider's value can be retrieved with Slider.value. - """ - Control.__init__(self, x=x, y=y, width=width, id=id, **kwargs) - self.min = min # Slider minimum value. - self.max = max # Slider maximum value. - self.default = default # Slider default value. - self.value = default # Slider current value. - self.steps = steps # Number of steps from min to max. - img, w = Image(theme["slider"]), 5 - self.src = { - "face1" : crop(img, w, 0, 1, img.height), - "face2" : crop(img, img.width-w, 0, 1, img.height), - "cap1" : crop(img, 0, 0, w, img.height), - "cap2" : crop(img, img.width-w, 0, w, img.height), - "handle" : Image(theme["slider-handle"]) - } - # The handle is a separate layer. - self.append(Handle(self)) - self._pack() - - def _get_value(self): - return self.min + self._t * (self.max-self.min) - def _set_value(self, value): - self._t = clamp(float(value-self.min) / (self.max-self.min or -1), 0.0, 1.0) - - value = property(_get_value, _set_value) - - @property - def relative(self): - """ Yields the slider position as a relative number (0.0-1.0). - """ - return self._t - - def _pack(self): - w = max(self.width, self.src["cap1"].width + self.src["cap2"].width) - self._set_width(w) - self._set_height(self.src["face1"].height) - - def reset(self): - Control.reset(self) - self.value = self.default - - def update(self): - # Update the handle's position, before Slider.draw() occurs (=smoother). - self[0].x = self._t * self.width - 0.5 * self[0].width - self[0].y = 0.5 * (self.height - self[0].height) - - def draw(self): - t = self._t * self.width - im1, im2, im3, im4 = self.src["cap1"], self.src["cap2"], self.src["face1"], self.src["face2"] - clr = self.color - image(im1, x=0, y=0, color=clr) - image(im2, x=self.width-im2.width, y=0, color=clr) - image(im3, x=im1.width, y=0, width=t-im1.width, color=clr) - image(im4, x=t, y=0, width=self.width-t-im2.width+1, color=clr) - - def on_mouse_press(self, mouse): - x0, y0 = self.absolute_position() # Can be nested in other layers. - step = 1.0 / max(self.steps, 1) - # Calculate relative value from the slider handle position. - # The inner width is a bit smaller to accomodate for the slider handle. - # Clamp the relative value to the nearest step. - self._t = (mouse.x-x0-self.height*0.5) / float(self.width-self.height) - self._t = self._t - self._t % step + step - self._t = clamp(self._t, 0.0, 1.0) - self.on_action() - - def on_mouse_drag(self, mouse): - self.on_mouse_press(mouse) - -#===================================================================================================== - -#--- KNOB -------------------------------------------------------------------------------------------- - -class Knob(Control): - - def __init__(self, default=0, limit=True, x=0, y=0, id=None, **kwargs): - """ A twistable knob that will fire Knob.on_action() when dragged. - The knob's angle can be retrieved with Knob.value (in degrees, 0-360). - With CTRL pressed, twists by a very small amount. - """ - Control.__init__(self, x=x, y=y, id=id, **kwargs) - self.default = default # Knob default angle. - self.value = default # Knob current angle. - self._limit = limit # Constrain between 0-360 or scroll endlessly? - self.src = { - "face" : Image(theme["knob"]), - "socket" : Image(theme["knob-socket"]), - } - self._pack() - - @property - def relative(self): - """ Yields the knob's angle as a relative number (0.0-1.0). - """ - return self.value % 360 / 360.0 - - def _pack(self): - self._set_width(self.src["socket"].width) - self._set_height(self.src["socket"].height) - - def reset(self): - Control.reset(self) - self.value = self.default - - def draw(self): - clr1 = self.color - clr2 = self.pressed and [v*0.85 for v in self.color] or self.color - translate(self.width/2, self.height/2) - image(self.src["socket"], -self.width/2, -self.height/2, color=clr1) - rotate(360-self.value) - image(self.src["face"], -self.width/2, -self.height/2, color=clr2) - - def on_mouse_press(self, mouse): - self.value += mouse.dy * (CTRL in mouse.modifiers and 1 or 5) - if self._limit: - self.value %= 360 - self.on_action() - - def on_mouse_drag(self, mouse): - self.on_mouse_press(mouse) - -#===================================================================================================== - -#--- FLAG -------------------------------------------------------------------------------------------- - -class Flag(Control): - - def __init__(self, default=False, x=0, y=0, id=None, **kwargs): - """ A checkbox control that fires Flag.on_action() when checked. - The checkbox value can be retrieved with Flag.value. - """ - Control.__init__(self, x=x, y=y, id=id, **kwargs) - self.default = bool(default) # Flag default value. - self.value = bool(default) # Flag current value. - self.src = { - "face" : Image(theme["flag"]), - "checked" : Image(theme["flag-checked"]), - } - self._pack() - - def _pack(self): - self._set_width(self.src["face"].width) - self._set_height(self.src["face"].height) - - def reset(self): - self.value = self.default - - def draw(self): - clr = self.color - image(self.value and self.src["checked"] or self.src["face"], color=clr) - - def on_mouse_release(self, mouse): - Control.on_mouse_release(self, mouse) - if self.contains(mouse.x, mouse.y, transformed=False): - # Only change status if mouse is actually released on the button. - self.value = not self.value - self.on_action() - -Checkbox = CheckBox = Flag - -#===================================================================================================== - -#--- Editable ---------------------------------------------------------------------------------------- - -EDITING = None -editing = lambda: EDITING - -class Editable(Control): - - def __init__(self, value="", x=0, y=0, width=125, height=20, padding=(0,0), wrap=False, id=None, **kwargs): - """ An editable text box. - When clicked, it has the focus and can receive keyboard events. - With wrap=True, several lines of text will wrap around the width. - Optional parameters can include fill, font, fontsize, fontweight. - """ - txt = Text(value or " ", **{ - "fill" : _popdefault(kwargs, "fill", Color(0,0.9)), - "font" : _popdefault(kwargs, "font", theme["fontname"]), - "fontsize" : _popdefault(kwargs, "fontsize", theme["fontsize"]), - "fontweight" : _popdefault(kwargs, "fontweight", theme["fontweight"]), - "lineheight" : _popdefault(kwargs, "lineheight", wrap and 1.25 or 1.0), - "align" : LEFT - }) - kwargs["width"] = width - kwargs["height"] = height - Control.__init__(self, x=x, y=y, id=id, **kwargs) - self.reserved = kwargs.get("reserved", [ENTER, TAB]) - self._padding = padding - self._i = 0 # Index of character on which the mouse is pressed. - self._empty = value == "" and True or False - self._editor = IncrementalTextLayout(txt._label.document, width, height, multiline=wrap) - self._editor.content_valign = wrap and "top" or "center" - self._editor.selection_background_color = (170, 200, 230, 255) - self._editor.selection_color = txt._label.color - self._editor.caret = Caret(self._editor) - self._editor.caret.visible = False - self._editing = False # When True, cursor is blinking and text can be edited. - Editable._pack(self) # On init, call Editable._pack(), not the derived Field._pack(). - - def _pack(self): - self._editor.x = self._padding[0] - self._editor.y = self._padding[1] - self._editor.width = max(0, self.width - self._padding[0] * 2) - self._editor.height = max(0, self.height - self._padding[1] * 2) - - def _get_value(self): - # IncrementalTextLayout in Pyglet 1.1.4 has a bug with empty strings. - # We keep track of empty strings with Editable._empty to avoid this. - return not self._empty and self._editor.document.text or u"" - def _set_value(self, string): - self._editor.begin_update() - self._editor.document.text = string or " " - self._editor.end_update() - self._empty = string == "" and True or False - - value = property(_get_value, _set_value) - - def _get_editing(self): - return self._editing - def _set_editing(self, b): - self._editing = b - self._editor.caret.visible = b - global EDITING - if b is False and EDITING == self: - EDITING = None - if b is True: - EDITING = self - # Cursor is blinking and text can be edited. - # Visit all layers on the canvas. - # Remove the caret from all other Editable controls. - for layer in (self.root.canvas and self.root.canvas.layers or []): - layer.traverse(visit=lambda layer: \ - isinstance(layer, Editable) and layer != self and \ - setattr(layer, "editing", False)) - - editing = property(_get_editing, _set_editing) - - @property - def selection(self): - # Yields a (start, stop)-tuple with the indices of the current selected text. - return (self._editor.selection_start, - self._editor.selection_end) - - @property - def selected(self): - # Yields True when text is currently selected. - return self.selection[0] != self.selection[1] - - @property - def cursor(self): - # Yields the index at the text cursor (caret). - return self._editor.caret.position - - def index(self, x, y): - """ Returns the index of the character in the text at position x, y. - """ - x0, y0 = self.absolute_position() - i = self._editor.get_position_from_point(x-x0, y-y0) - if self._editor.get_point_from_position(0)[0] > x-x0: # Pyglet bug? - i = 0 - if self._empty: - i = 0 - return i - - def on_mouse_enter(self, mouse): - mouse.cursor = TEXT - - def on_mouse_press(self, mouse): - i = self._i = self.index(mouse.x, mouse.y) - self._editor.set_selection(0, 0) - self.editing = True - self._editor.caret.position = i - Control.on_mouse_press(self, mouse) - - def on_mouse_release(self, mouse): - if not self.dragged: - self._editor.caret.position = self.index(mouse.x, mouse.y) - Control.on_mouse_release(self, mouse) - - def on_mouse_drag(self, mouse): - i = self.index(mouse.x, mouse.y) - self._editor.selection_start = max(min(self._i, i), 0) - self._editor.selection_end = min(max(self._i, i), len(self.value)) - self._editor.caret.visible = False - Control.on_mouse_drag(self, mouse) - - def on_mouse_doubleclick(self, mouse): - # Select the word at the mouse position. - # Words are delimited by non-alphanumeric characters. - i = self.index(mouse.x, mouse.y) - delimiter = lambda ch: not (ch.isalpha() or ch.isdigit()) - if i < len(self.value) and delimiter(self.value[i]): - self._editor.set_selection(i, i+1) - if i == len(self.value) and self.value != "" and delimiter(self.value[i-1]): - self._editor.set_selection(i-1, i) - a = _find(lambda (i,ch): delimiter(ch), enumerate(reversed(self.value[:i]))) - b = _find(lambda (i,ch): delimiter(ch), enumerate(self.value[i:])) - a = a and i-a[0] or 0 - b = b and i+b[0] or len(self.value) - self._editor.set_selection(a, b) - - def on_key_press(self, keys): - if self._editing: - self._editor.caret.visible = True - i = self._editor.caret.position - if keys.code == LEFT: - # The left arrow moves the text cursor to the left. - self._editor.caret.position = max(i-1, 0) - elif keys.code == RIGHT: - # The right arrow moves the text cursor to the right. - self._editor.caret.position = min(i+1, len(self.value)) - elif keys.code in (UP, DOWN): - # The up arrows moves the text cursor to the previous line. - # The down arrows moves the text cursor to the next line. - y = keys.code == UP and -1 or +1 - n = self._editor.get_line_count() - i = self._editor.get_position_on_line( - min(max(self._editor.get_line_from_position(i)+y, 0), n-1), - self._editor.get_point_from_position(i)[0]) - self._editor.caret.position = i - elif keys.code == TAB and TAB in self.reserved: - # The tab key navigates away from the control. - self._editor.caret.position = 0 - self.editing = False - elif keys.code == ENTER and ENTER in self.reserved: - # The enter key executes on_action() and navigates away from the control. - self._editor.caret.position = 0 - self.editing = False - self.on_action() - elif keys.code == BACKSPACE and self.selected: - # The backspace key removes the current text selection. - self.value = self.value[:self.selection[0]] + self.value[self.selection[1]:] - self._editor.caret.position = max(self.selection[0], 0) - elif keys.code == BACKSPACE and i > 0: - # The backspace key removes the character at the text cursor. - self.value = self.value[:i-1] + self.value[i:] - self._editor.caret.position = max(i-1, 0) - elif keys.char: - if self.selected: - # Typing replaces any text currently selected. - self.value = self.value[:self.selection[0]] + self.value[self.selection[1]:] - self._editor.caret.position = i = max(self.selection[0], 0) - ch = keys.char - ch = ch.replace("\r", "\n\r") - self.value = self.value[:i] + ch + self.value[i:] - self._editor.caret.position = min(i+1, len(self.value)) - self._editor.set_selection(0, 0) - - def draw(self): - self._editor.draw() - -#--- Field ------------------------------------------------------------------------------------------- - -class Field(Editable): - - def __init__(self, value="", hint="", action=None, x=0, y=0, width=125, padding=5, id=None, **kwargs): - """ A single-line text input field. - The string value can be retrieved with Field.value. - """ - Editable.__init__(self, value, x=x, y=y, width=width, padding=[padding]*2, id=id, **kwargs) - img, w = Image(theme["field"]), 10 - self.src = { - "cap1" : crop(img, 0, img.height-w, w, w), - "cap2" : crop(img, img.width-w, img.height-w, w, w), - "cap3" : crop(img, 0, 0, w, w), - "cap4" : crop(img, img.width-w, 0, w, w), - "top" : crop(img, w+1, img.height-w, 1, w), - "bottom" : crop(img, w+1, 0, 1, w), - "left" : crop(img, 0, w+1, w, 1), - "right" : crop(img, img.width-w, w+1, w, 1), - "face" : crop(img, w+1, w+1, 1, 1) - } - if action: - # Override the Button.on_action() method from the given function. - self.set_method(action, name="on_action") - self.default = value - self.append(Label(hint, fill=Color(0, 0.4))) - self._pack() - - def _get_hint(self): - return self[0].caption - def _set_hint(self, string): - self[0].caption = string - - hint = property(_get_hint, _set_hint) - - def reset(self): - self.value = self.default - - def _pack(self): - Editable._pack(self) - w = max(self.width, self.src["cap1"].width + self.src["cap2"].width) - h = max(self.height, self.src["cap1"].width + self.src["cap3"].width) - h = max(h, int(self._editor.document.get_style("line_spacing") * 1.5 + self._padding[1] * 2)) - self._set_width(w) - self._set_height(h) - # Position the hint text (if no other text is in the field). - # The hint will not span multiple line if it is wider than the field - # (it was designed to be a short word or phrase). - self[0].x = self._padding[0] - self[0].y = self.height - self._padding[1] - self[0]._text.metrics[1] * 1.25 - self[0]._pack() - - def on_action(self): - pass - - def update(self): - self[0].hidden = self.editing or self.value != "" - - def draw(self): - im1, im2, im3 = self.src["cap1"], self.src["cap2"], self.src["top"] - im4, im5, im6 = self.src["cap3"], self.src["cap4"], self.src["bottom"] - im7, im8, im9 = self.src["left"], self.src["right"], self.src["face"] - clr = self.color - image(im1, 0, self.height-im1.height, color=clr) - image(im2, self.width-im2.width, self.height-im2.height, color=clr) - image(im3, im1.width, self.height-im3.height, width=self.width-im1.width-im2.width, color=clr) - image(im4, 0, 0, color=clr) - image(im5, self.width-im5.width, 0, color=clr) - image(im6, im4.width, 0, width=self.width-im4.width-im5.width, color=clr) - image(im7, 0, im4.height, height=self.height-im1.height-im4.height, color=clr) - image(im8, self.width-im8.width, im4.height, height=self.height-im2.height-im5.height, color=clr) - image(im9, im4.width, im6.height, width=self.width-im7.width-im8.width, height=self.height-im3.height-im6.height, color=clr) - Editable.draw(self) - -#===================================================================================================== - -#--- Rulers ------------------------------------------------------------------------------------------ - -class Rulers(Control): - - def __init__(self, step=10, interval=5, crosshair=False, color=(0,0,0,1)): - """ A horizontal and vertical ruler displaying the width/height of the parent at intervals. - A measurement line is drawn at each step(e.g. at 10 20 30...) - A label with the value is drawn at each interval (e.g. 50 | | | | 100 | | | | 150). - """ - Control.__init__(self, x=0, y=0) - self.enabled = False - self.step = step - self.interval = interval - self.crosshair = crosshair - self.color = color - self._dirty = False - self._markers = {} - self._pack() - - def _get_step(self): - return self._step - def _set_step(self, v): - self._step = round(v) - self._dirty = True - - step = property(_get_step, _set_step) - - def _get_interval(self): - return self._interval - def _set_interval(self, v): - self._interval = round(v) - self._dirty = True - - interval = property(_get_interval, _set_interval) - - def _pack(self): - # Cache Text objects for the measurement markers. - # This happens whenever the canvas resizes, or the step or interval changes. - # This will raise an error if the parent's width or height is None (infinite). - p = self.parent or self.canvas - if p and (self._dirty or self.width != p.width or self.height != p.height): - self._dirty = False - self._set_width(p.width) - self._set_height(p.height) - for i in range(int(round(max(self.width, self.height) / self._step))): - if i % self._interval == 0: - self._markers.setdefault(i*self._step, - Text(str(int(round(i*self._step))), - fontname = theme["fontname"], - fontsize = theme["fontsize"] * 0.6, - fill = self.color)) - - def update(self): - self._pack() - - def draw(self): - length = 5 - # Draw the horizontal ruler. - for i in range(1, int(round(self.height / self._step))): - v, mark = i*self._step, i%self.interval==0 - line(0, v, mark and length*3 or length, v, - stroke = self.color, - strokewidth = 0.5) - if mark: - self._markers[v].draw(length*3-self._markers[v].metrics[0], v+2) - # Draw the vertical ruler. - for i in range(1, int(round(self.width / self._step))): - v, mark = i*self._step, i%self.interval==0 - line(v, 0, v, mark and length*3 or length, - stroke = self.color, - strokewidth = 0.5) - if mark: - self._markers[v].draw(v+2, length*3-self._markers[v].fontsize) - # Draw the crosshair. - if self.crosshair: - line(0, self.canvas.mouse.y, self.width, self.canvas.mouse.y, - stroke = self.color, - strokewidth = 0.5, - strokestyle = DOTTED) - line(self.canvas.mouse.x, 0, self.canvas.mouse.x, self.height, - stroke = self.color, - strokewidth = 0.5, - strokestyle = DOTTED) - -#===================================================================================================== - -#--- PANEL ------------------------------------------------------------------------------------------- - -class Panel(Control): - - def __init__(self, caption="", fixed=False, modal=True, x=0, y=0, width=175, height=250, **kwargs): - """ A panel containing other controls that can be dragged when Panel.fixed=False. - Controls or (Layout groups) can be added with Panel.append(). - """ - Control.__init__(self, x=x, y=y, width=max(width,60), height=max(height,60), **kwargs) - img, w = Image(theme["panel"]), 30 - self.src = { - "cap1" : crop(img, 0, img.height-w, w, w), - "cap2" : crop(img, img.width-w, img.height-w, w, w), - "cap3" : crop(img, 0, 0, w, w), - "cap4" : crop(img, img.width-w, 0, w, w), - "top" : crop(img, w+1, img.height-w, 1, w), - "bottom" : crop(img, w+1, 0, 1, w), - "left" : crop(img, 0, w+1, w, 1), - "right" : crop(img, img.width-w, w+1, w, 1), - "face" : crop(img, w+1, w+1, 1, 1) - } - _popdefault(kwargs, "width") - _popdefault(kwargs, "height") - self.append(Label(caption)) - self.append(Close()) - #self.extend(kwargs.pop("controls", []), **kwargs) - self.fixed = fixed # Draggable? - self.modal = modal # Closeable? - self._pack() - - def _get_caption(self): - return self._caption.text - def _set_caption(self, str): - self._caption.text = str - self._pack() - - caption = property(_get_caption, _set_caption) - - @property - def controls(self): - return iter(self[2:]) # self[0] is the Label, - # self[1] is the Close action. - - def insert(self, i, control): - """ Inserts the control, or inserts all controls in the given Layout. - """ - if isinstance(control, Layout): - # If the control is actually a Layout (e.g. ordered group of controls), apply it. - control.apply() - Layer.insert(self, i, control) - - def append(self, control): - self.insert(len(self), control) - def extend(self, controls): - for control in controls: - self.append(control) - - def _pack(self): - # Center the caption in the label's header. - # Position the close button in the top right corner. - self[0].x = 0.5 * (self.width - self[0].width) - self[0].y = self.height - self.src["top"].height + 0.5 * (self.src["top"].height - self[0].height) - self[1].x = self.width - self[1].width - 4 - self[1].y = self.height - self[1].height - 2 - - def pack(self, padding=20): - """ Resizes the panel to the most compact size, - based on the position and size of the controls in the panel. - """ - def _visit(control): - if control not in (self, self[0], self[1]): - self._b = self._b and self._b.union(control.bounds) or control.bounds - self._b = None - self.traverse(_visit) - for control in self.controls: - control.x += padding + self.x - self._b.x - control.y += padding + self.y - self._b.y - self._set_width( padding + self._b.width + padding) - self._set_height(padding + self._b.height + padding + self.src["top"].height) - self._pack() - - def update(self): - self[1].hidden = self.modal - self[1].color = self.color - - def draw(self): - im1, im2, im3 = self.src["cap1"], self.src["cap2"], self.src["top"] - im4, im5, im6 = self.src["cap3"], self.src["cap4"], self.src["bottom"] - im7, im8, im9 = self.src["left"], self.src["right"], self.src["face"] - clr = self.color - image(im1, 0, self.height-im1.height, color=clr) - image(im2, self.width-im2.width, self.height-im2.height, color=clr) - image(im3, im1.width, self.height-im3.height, width=self.width-im1.width-im2.width, color=clr) - image(im4, 0, 0, color=clr) - image(im5, self.width-im5.width, 0, color=clr) - image(im6, im4.width, 0, width=self.width-im4.width-im5.width, color=clr) - image(im7, 0, im4.height, height=self.height-im1.height-im4.height, color=clr) - image(im8, self.width-im8.width, im4.height, height=self.height-im2.height-im5.height, color=clr) - image(im9, im4.width, im6.height, width=self.width-im7.width-im8.width, height=self.height-im3.height-im6.height, color=clr) - - def on_mouse_enter(self, mouse): - mouse.cursor = DEFAULT - - def on_mouse_press(self, mouse): - self._dragged = not self.fixed and mouse.y > self.y+self.height-self.src["top"].height - - def on_mouse_drag(self, mouse): - if self._dragged and not self.fixed: - self.x += mouse.dx - self.y += mouse.dy - self.dragged = self._dragged - - def open(self): - self.hidden = False - def close(self): - self.hidden = True - -class Dock(Panel): - - def __init__(self, caption="", anchor=LEFT, fixed=True, modal=True, **kwargs): - """ A panel attached to the edge of the canvas (LEFT or RIGHT), extending the full height. - With fixed=False, it can be snapped from the edge and dragged as a normal panel. - """ - kwargs.setdefault("x", anchor==RIGHT and INFINITE or 0) - kwargs.setdefault("y", 0) - Panel.__init__(self, caption=caption, fixed=fixed, modal=modal, **kwargs) - self.anchor = anchor - self.snap = 1 - - def update(self): - Panel.update(self) - if self.canvas is not None: - if self.anchor == LEFT and self.x < self.snap: - if self.dragged and self.x == 0: - # Stop drag once snapped to the edge. - self._dragged = False - self.x = 0 - self.y = self.canvas.height - self.height - if self.anchor == RIGHT and self.x > self.canvas.width-self.width - self.snap: - if self.dragged and self.x == self.canvas.width-self.width: - self._dragged = False - self.x = self.canvas.width - self.width - self.y = self.canvas.height - self.height - - def draw(self): - im1, im2 = self.src["top"], self.src["face"] - if self.canvas is not None and \ - (self.anchor == LEFT and self.x == 0) or \ - (self.anchor == RIGHT and self.x == self.canvas.width-self.width): - clr = self.color - image(im1, 0, self.height-im1.height, width=self.width, color=clr) - image(im2, 0, -self.canvas.height+self.height, width=self.width, height=self.canvas.height-im1.height, color=clr) - else: - Panel.draw(self) - -#===================================================================================================== - -#--- Layout ------------------------------------------------------------------------------------------ - -class Layout(Layer): - - SPACING = 10 # Spacing between controls in a Layout. - - def __init__(self, controls=[], x=0, y=0, **kwargs): - """ A group of controls with a specific layout. - Controls can be added with Layout.append(). - The layout will be applied when Layout.apply() is called. - This happens automatically if a layout is appended to a Panel. - """ - kwargs["width"] = 0 - kwargs["height"] = 0 - Layer.__init__(self, x=x, y=y, **kwargs) - self._controls = {} # Lazy cache of (id, control)-children, see nested(). - self.spacing = kwargs.get("spacing", Layout.SPACING) - self.extend(controls) - - def insert(self, i, control): - """ Inserts the control, or inserts all controls in the given Layout. - """ - if isinstance(control, Layout): - # If the control is actually a Layout (e.g. ordered group of controls), apply it. - control.apply() - Layer.insert(self, i, control) - - def append(self, control): - self.insert(len(self), control) - def extend(self, controls): - for control in controls: - self.append(control) - - def on_key_press(self, keys): - for control in self: - control.on_key_press(keys) - def on_key_release(self, keys): - for control in self: - control.on_key_release(keys) - - def __getattr__(self, k): - # Yields the property with the given name, or - # yields the child control with the given id. - if k in self.__dict__: - return self.__dict__[k] - ctrl = nested(self, k) - if ctrl is not None: - return ctrl - raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, k) - - def apply(self): - """ Adjusts the position and size of the controls to match the layout. - """ - self.width = max(control.width for control in self) - self.height = max(control.height for control in self) - - def __repr__(self): - return "Layout(type=%s)" % repr(self.__class__.__name__.lower()) - - # Debug mode: - #def draw(self): - # rect(0, 0, self.width, self.height, fill=None, stroke=(0,0.5,1,1)) - -#--- Layout: Labeled ---------------------------------------------------------------------------------- - -class Labeled(Layout): - - def __init__(self, controls=[], x=0, y=0, **kwargs): - """ A layout where each control has an associated text label. - """ - Layout.__init__(self, controls=[], x=x, y=y, **kwargs) - self.controls = [] - self.captions = [] - self.extend(controls) - - def insert(self, i, control, caption=""): - """ Inserts a new control to the layout, with an associated caption. - Each control will be drawn in a new row. - """ - self.controls.insert(i, control) - self.captions.insert(i, Label(caption.upper(), - fontsize = theme["fontsize"] * 0.8, - fill = theme["text"].rgb+(theme["text"].a * 0.8,))) - Layout.insert(self, i, self.controls[i]) - Layout.insert(self, i, self.captions[i]) - - def append(self, control, caption=""): - self.insert(len(self)/2, control, caption) - def extend(self, controls): - for control in controls: - caption, control = isinstance(control, tuple) and control or ("", control) - self.append(control, caption) - - def remove(self, control): - self.pop(self.controls.index(control)) - def pop(self, i): - self.captions.pop(i); return self.controls.pop(i) - -#--- Layout: Rows ------------------------------------------------------------------------------------ - -class Rows(Labeled): - - def __init__(self, controls=[], x=0, y=0, width=125, **kwargs): - """ A layout where each control appears on a new line. - Each control has an associated text caption, displayed to the left of the control. - The given width defines the desired width for each control. - """ - Labeled.__init__(self, controls, x=x, y=y, **kwargs) - self._maxwidth = width - - def apply(self): - """ Adjusts the position and width of all the controls in the layout: - - each control is placed next to its caption, with spacing in between, - - each caption is aligned to the right, and centered vertically, - - the width of all Label, Button, Slider, Field controls is evened out. - """ - mw = self._maxwidth - for control in self.controls: - if isinstance(control, Layout): - # Child containers in the layout can be wider than the desired width. - # adjusting mw at the start will make controls wider to line out with the total width, - # adjusting it at the end would just ensure that the layout is wide enough. - mw = max(mw, control.width) - w1 = max(caption.width for caption in self.captions) - w2 = max(control.width for control in self.controls) - w2 = min(w2, mw) - dx = 0 - dy = 0 - for caption, control in reversed(zip(self.captions, self.controls)): - if isinstance(control, Layout) and control.height > caption.height * 2: - caption.y = dy + control.height - caption.height # valign top. - if isinstance(control, (Label, Button, Slider, Field)): - control._set_width(mw) - control._pack() - caption.x = dx + w1 - caption.width # halign right. - control.x = dx + w1 + (w1>0 and self.spacing) - caption.y = dy + 0.5 * (control.height - caption.height) # valign center. - control.y = dy - dy += max(caption.height, control.height) + self.spacing - self.width = w1 + max(w2, mw) + (w1>0 and self.spacing) - self.height = dy - self.spacing - -TOP, BOTTOM, CENTER = "top", "bottom", "center" - -class Row(Labeled): - - def __init__(self, controls=[], x=0, y=0, width=125, align=CENTER, **kwargs): - """ A layout where each control appears in a new column. - Each control has an associated text caption, displayed on top of the control. - The given width defines the desired width for each control. - """ - Labeled.__init__(self, controls, x=x, y=y, **kwargs) - self._maxwidth = width - self._align = align - - def apply(self): - """ Adjusts the position and width of all the controls in the layout: - - each control is placed centrally below its caption, with spacing in between, - - the width of all Label, Button, Slider, Field controls is evened out. - """ - mw = self._maxwidth - da = {TOP: 1.0, BOTTOM: 0.0, CENTER: 0.5}.get(self._align, 0.5) - h1 = max(control.height for control in self.controls) - h2 = max(caption.height for caption in self.captions) - dx = 0 - dy = 0 - for caption, control in zip(self.captions, self.controls): - if isinstance(control, (Label, Button, Slider, Field)): - control._set_width(mw) - control._pack() - caption.x = dx + 0.5 * max(control.width - caption.width, 0) # halign center - control.x = dx + 0.5 * max(caption.width - control.width, 0) # halign center - caption.y = dy + h1 + (h2>0 and self.spacing) - control.y = dy + da * (h1 - control.height) # valign center - dx += max(caption.width, control.width) + self.spacing - self.width = dx - self.spacing - self.height = h1 + h2 + (h2>0 and self.spacing) diff --git a/nodebox/gui/theme/Droid Sans-Bold.ttf b/nodebox/gui/theme/Droid Sans-Bold.ttf deleted file mode 100644 index 7ac04b6f0d8a7e8407ec37445a29ad72d6c43fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191032 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 diff --git a/nodebox/gui/theme/Droid Sans.ttf b/nodebox/gui/theme/Droid Sans.ttf deleted file mode 100644 index 767c63ad000e3eea20f3cb7a43ba9f4154ed7a5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190044 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%0D=-PBu&{ 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 ZFaX~&`WcM@!{h(}002ovPDHLkV1iTf>!bhx diff --git a/nodebox/gui/theme/flag.png b/nodebox/gui/theme/flag.png deleted file mode 100644 index 958fd823f9b56125147e25b807ba060f8b1a6f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 504 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 dZP#A{3;+c8)W2b~eEkx@aAjG5`Ls`8xT+@3Rc zI-}EFod)Z9;Bf2Xb_E*p@Sa=MHR*UfPM$#ODjN=m&!uVlhSY1a|BTcXsXPIIzEMft zllrr1nlGg8OsCU**{`J5&Kj=pQ=no-igi*z_ zSS(aLhf?oOCX+i(Iw#UjJ{pZ;*{D?tkJD?r4Rwn1OX`JFN-y@JjMsE=Sl4R+0M3iL!)`ELGpCd*g(H(**Vam7 z5o~Z2 z1^_lqIrf~+Wpj%5{_1m zXaHaf;>m+&;^%NkHvrIe%2_^#QzY&On_&Xd0e}vr6M{|Z-!G9O8vxis!byG9IdK30 zU<#sKit$YRkT8vy94 zrHXw*O9cSCX{q>W0|0cLa-Jw0+A09pmTYLL0AP15Rj?8d00O|Kgg*sL!U2HYNQkch z0CpxE7K{O)3s^J;fStl^aR4CU0KoqbgaZHw2LKQb0KnStJ{$lb;Q#=_0RZSsI17Hb z2>@MSE?JxBYo|9F93kGFo)FUl*$~_3a57UtJF87902Gb-F$0KSvn>NM-4QWnu(D< zmT|#a4gjnp8(X_khuoBLYHn#$PCgoqR64m-DK*fECYo1BIsmYSY?NEpE$LmV$5KZs zo*vI(ppzWm>Ykf7jx3x!atX)F zrVheMoLuz8)LnF8rN=Hv4NW+OB^`tV&`;r1E{sf_a8x#jwm)^UX(`+V5<8hhsVA)M z?3r)|PB^^Y0-%4?PB=3Y%fuuzu?oqiO5AU$ipW|?G@*6|3+pzelTAv>0q9-2i33S! zt7dM0*+x0HB0WbcEP)=-3zN17vCjA0kVZ>`s9oI0OS71kotQ{IS2U_zMYXQ|Q6* z)4TiJ{qBAz6h%Q?bX~t=$0O4RrbcC+Go3M=c%J9*Sb>8KdS=IqX`1~`r$d^imG&SA zXti3=bUIzI-w}g9k6;D8S(bIHC<^U%J31T=B`As_Ns>fKlF)cOj+yBlu+Z!EaJ`S= zaM-WaYP8*M>Gb+#c0nLnmT9xukZs$j{Cd-BwXDHl@YHU%DNWO|+J3)3Q`nFYi5rcE z=KKDagh8mPN^u;Q0oMe6#DW26AQP(bzJ3!_Z8n?uGyqZ*MYLY8{{%58ek*`;2Hs;J z$aqaKAQS;3;&H<;JoW(iC*_r@*crfy>$(f>z?tXynV$L(3r4KgXyiCfjQ7H0L(nhp z88-M3Q*DoPv2xvRw_mT<%YOJIvn-?Ka(TIO|5@^H0R{ld*7$-~UB3(f0000U~^s-Qg2g$6PV z13aHk$~Q$(zBs=7AQ(XqfUfJp0m02AEDXjNpgO>^ENGf0oagzMfE-=d1&}4x|vGL_LHgv;kQsu#qqBRF)+W3yu)JQ6cZxTtc!eJoXAzkZs#S z1L?YMX%#4f8?j(?56QBOj=pEKs}tt!9 or visit -# http://www.stetson.edu/~ProctoLogic/ -# -# Changelog: -# 15 Nov. 2001: -# Removed dependency on Python 2.0 features. -# - dwh -# 13 Feb. 2002: -# Added a generic callback handler. -# - dwh - -import socket -import struct -import math -import sys -import string -import pprint - - -def hexDump(bytes): - """Useful utility; prints the string in hexadecimal""" - for i in range(len(bytes)): - sys.stdout.write("%2x " % (ord(bytes[i]))) - if (i+1) % 8 == 0: - print repr(bytes[i-7:i+1]) - - if(len(bytes) % 8 != 0): - print string.rjust("", 11), repr(bytes[i-len(bytes)%8:i+1]) - - -class OSCMessage: - """Builds typetagged OSC messages.""" - def __init__(self): - self.address = "" - self.typetags = "," - self.message = "" - - def setAddress(self, address): - self.address = address - - def setMessage(self, message): - self.message = message - - def setTypetags(self, typetags): - self.typetags = typetags - - def clear(self): - self.address = "" - self.clearData() - - def clearData(self): - self.typetags = "," - self.message = "" - - def append(self, argument, typehint = None): - """Appends data to the message, - updating the typetags based on - the argument's type. - If the argument is a blob (counted string) - pass in 'b' as typehint.""" - - if typehint == 'b': - binary = OSCBlob(argument) - else: - binary = OSCArgument(argument) - - self.typetags = self.typetags + binary[0] - self.rawAppend(binary[1]) - - def rawAppend(self, data): - """Appends raw data to the message. Use append().""" - self.message = self.message + data - - def getBinary(self): - """Returns the binary message (so far) with typetags.""" - address = OSCArgument(self.address)[1] - typetags = OSCArgument(self.typetags)[1] - return address + typetags + self.message - - def __repr__(self): - return self.getBinary() - -def readString(data): - length = string.find(data,"\0") - nextData = int(math.ceil((length+1) / 4.0) * 4) - return (data[0:length], data[nextData:]) - - -def readBlob(data): - length = struct.unpack(">i", data[0:4])[0] - nextData = int(math.ceil((length) / 4.0) * 4) + 4 - return (data[4:length+4], data[nextData:]) - - -def readInt(data): - if(len(data)<4): - print "Error: too few bytes for int", data, len(data) - rest = data - integer = 0 - else: - integer = struct.unpack(">i", data[0:4])[0] - rest = data[4:] - - return (integer, rest) - - - -def readLong(data): - """Tries to interpret the next 8 bytes of the data - as a 64-bit signed integer.""" - high, low = struct.unpack(">ll", data[0:8]) - big = (long(high) << 32) + low - rest = data[8:] - return (big, rest) - - - -def readFloat(data): - if(len(data)<4): - print "Error: too few bytes for float", data, len(data) - rest = data - float = 0 - else: - float = struct.unpack(">f", data[0:4])[0] - rest = data[4:] - - return (float, rest) - - -def OSCBlob(next): - """Convert a string into an OSC Blob, - returning a (typetag, data) tuple.""" - - if type(next) == type(""): - length = len(next) - padded = math.ceil((len(next)) / 4.0) * 4 - binary = struct.pack(">i%ds" % (padded), length, next) - tag = 'b' - else: - tag = '' - binary = '' - - return (tag, binary) - - -def OSCArgument(next): - """Convert some Python types to their - OSC binary representations, returning a - (typetag, data) tuple.""" - - if type(next) == type(""): - OSCstringLength = math.ceil((len(next)+1) / 4.0) * 4 - binary = struct.pack(">%ds" % (OSCstringLength), next) - tag = "s" - elif type(next) == type(42.5): - binary = struct.pack(">f", next) - tag = "f" - elif type(next) == type(13): - binary = struct.pack(">i", next) - tag = "i" - else: - binary = "" - tag = "" - - return (tag, binary) - - -def parseArgs(args): - """Given a list of strings, produces a list - where those strings have been parsed (where - possible) as floats or integers.""" - parsed = [] - for arg in args: - print arg - arg = arg.strip() - interpretation = None - try: - interpretation = float(arg) - if string.find(arg, ".") == -1: - interpretation = int(interpretation) - except: - # Oh - it was a string. - interpretation = arg - pass - parsed.append(interpretation) - return parsed - - - -def decodeOSC(data): - """Converts a typetagged OSC message to a Python list.""" - table = {"i":readInt, "f":readFloat, "s":readString, "b":readBlob} - decoded = [] - address, rest = readString(data) - typetags = "" - - if address == "#bundle": - time, rest = readLong(rest) -# decoded.append(address) -# decoded.append(time) - while len(rest)>0: - length, rest = readInt(rest) - decoded.append(decodeOSC(rest[:length])) - rest = rest[length:] - - elif len(rest) > 0: - typetags, rest = readString(rest) - decoded.append(address) - decoded.append(typetags) - if typetags[0] == ",": - for tag in typetags[1:]: - value, rest = table[tag](rest) - decoded.append(value) - else: - print "Oops, typetag lacks the magic ," - - return decoded - - -class CallbackManager: - """This utility class maps OSC addresses to callables. - - The CallbackManager calls its callbacks with a list - of decoded OSC arguments, including the address and - the typetags as the first two arguments.""" - - def __init__(self): - self.callbacks = {} - self.add(self.unbundler, "#bundle") - - def handle(self, data, source = None): - """Given OSC data, tries to call the callback with the - right address.""" - decoded = decodeOSC(data) - self.dispatch(decoded, source) - - def dispatch(self, message, source = None): - """Sends decoded OSC data to an appropriate calback""" - try: - if type(message[0]) == str : - # got a single message - address = message[0] - self.callbacks[address](message, source) - - elif type(message[0]) == list : - # smells like nested messages - for msg in message : - self.dispatch(msg, source) - - except KeyError, e: - # address not found - print 'address %s not found ' % address - pprint.pprint(message) - except IndexError, e: - print 'got malformed OSC message' - pass - except None, e: - print "Exception in", address, "callback :", e - - return - - def add(self, callback, name): - """Adds a callback to our set of callbacks, - or removes the callback with name if callback - is None.""" - if callback == None: - del self.callbacks[name] - else: - self.callbacks[name] = callback - - def unbundler(self, messages): - """Dispatch the messages in a decoded bundle.""" - # first two elements are #bundle and the time tag, rest are messages. - for message in messages[2:]: - self.dispatch(message) - - -if __name__ == "__main__": - hexDump("Welcome to the OSC testing program.") - print - message = OSCMessage() - message.setAddress("/foo/play") - message.append(44) - message.append(11) - message.append(4.5) - message.append("the white cliffs of dover") - hexDump(message.getBinary()) - - print "Making and unmaking a message.." - - strings = OSCMessage() - strings.append("Mary had a little lamb") - strings.append("its fleece was white as snow") - strings.append("and everywhere that Mary went,") - strings.append("the lamb was sure to go.") - strings.append(14.5) - strings.append(14.5) - strings.append(-400) - - raw = strings.getBinary() - - hexDump(raw) - - print "Retrieving arguments..." - data = raw - for i in range(6): - text, data = readString(data) - print text - - number, data = readFloat(data) - print number - - number, data = readFloat(data) - print number - - number, data = readInt(data) - print number - - hexDump(raw) - print decodeOSC(raw) - print decodeOSC(message.getBinary()) - - print "Testing Blob types." - - blob = OSCMessage() - blob.append("","b") - blob.append("b","b") - blob.append("bl","b") - blob.append("blo","b") - blob.append("blob","b") - blob.append("blobs","b") - blob.append(42) - - hexDump(blob.getBinary()) - - print decodeOSC(blob.getBinary()) - - def printingCallback(*stuff): - sys.stdout.write("Got: ") - for i in stuff: - sys.stdout.write(str(i) + " ") - sys.stdout.write("\n") - - print "Testing the callback manager." - - c = CallbackManager() - c.add(printingCallback, "/print") - - c.handle(message.getBinary()) - message.setAddress("/print") - c.handle(message.getBinary()) - - print1 = OSCMessage() - print1.setAddress("/print") - print1.append("Hey man, that's cool.") - print1.append(42) - print1.append(3.1415926) - - c.handle(print1.getBinary()) - - bundle = OSCMessage() - bundle.setAddress("") - bundle.append("#bundle") - bundle.append(0) - bundle.append(0) - bundle.append(print1.getBinary(), 'b') - bundle.append(print1.getBinary(), 'b') - - bundlebinary = bundle.message - - print "sending a bundle to the callback manager" - c.handle(bundlebinary) - - - -""" simpleOSC 0.2 - ixi software - July, 2006 - www.ixi-software.net - - simple API for the Open SoundControl for Python (by Daniel Holth, Clinton - McChesney --> pyKit.tar.gz file at http://wiretap.stetson.edu) - Documentation at http://wiretap.stetson.edu/docs/pyKit/ - - The main aim of this implementation is to provide with a simple way to deal - with the OSC implementation that makes life easier to those who don't have - understanding of sockets or programming. This would not be on your screen without the help - of Daniel Holth. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Thanks for the support to Buchsenhausen, Innsbruck, Austria. -""" - -import socket - -# globals -addressManager = 0 -outSocket = 0 - - -def init():#ipAddr, port): - """ inits manager and outsocket - """ - createSender() - createCallBackManager() - -def createSender(): - """create and return outbound socket""" - global outSocket - outSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - -def createCallBackManager(): - global addressManager - addressManager = CallbackManager() - -def createListener(ipAddr, port): - """create and return an inbound socket - """ - l = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - l.bind((ipAddr, port)) - l.setblocking(0) # if not waits for msgs to arrive blocking other events - return l - -def bind(func, oscaddress): - """ bind certains oscaddresses with certain functions in address manager - """ - addressManager.add(func, oscaddress) - -################################# - -def createBinaryMsg(oscAddress, dataArray): - """create and return general type binary OSC msg""" - m = OSCMessage() - m.setAddress(oscAddress) - - for x in dataArray: ## append each item of the array to the message - m.append(x) - - return m.getBinary() # get the actual OSC to send - -def sendOSC(stufftosend, ipAddr, port): # outSocket, - """ send OSC msg or bundle as binary""" - outSocket.sendto(stufftosend, (ipAddr, port)) - -####################################################### user interface below: - -############################### send message - -def sendMsg(oscAddress, dataArray, ipAddr, port):#, outSocket): - """create and send normal OSC msgs""" - msg = createBinaryMsg(oscAddress, dataArray) - sendOSC(msg, ipAddr, port) # outSocket, - -############################### bundle stuff + send bundle - -def createBundle(): - """create bundled type of OSC messages""" - b = OSCMessage() - b.setAddress("") - b.append("#bundle") - b.append(0) - b.append(0) - return b - -def appendToBundle(bundle, oscAddress, dataArray): - """create OSC mesage and append it to a given bundle""" - OSCmsg = createBinaryMsg(oscAddress, dataArray) - bundle.append(OSCmsg, 'b') - -def sendBundle(bundle, ipAddr, port):#, outSocket): - """convert bundle to a binary and send it""" - sendOSC(bundle.message, ipAddr, port) # outSocket - -################################ receive osc from The Other. - -def getOSC(inSocket):#, addressManager): - """try to get incoming OSC and send it to callback manager (for osc addresses)""" - try: - while 1: - data = inSocket.recv(1024) - addressManager.handle(data) - except: - return "nodata" # not data arrived -################################ - diff --git a/nodebox/sound/process.py b/nodebox/sound/process.py deleted file mode 100644 index a67d441..0000000 --- a/nodebox/sound/process.py +++ /dev/null @@ -1,291 +0,0 @@ -#=== SOUND =========================================================================================== -# Convenience classes and functions for audio manipulation. -# Authors: Frederik De Bleser, Lieven Menschaert, Tom De Smedt. -# License: BSD (see LICENSE.txt for details). -# Copyright (c) 2008-2012 City In A Bottle (cityinabottle.org) -# http://cityinabottle.org/nodebox - -import osc -import sys -import os -import subprocess -import StringIO -import signal -import time -import socket as _socket - -def _find(match=lambda item: False, list=[]): - """ Returns the first item in the list for which match(item)=True, or None. - """ - for item in list: - if match(item): return item - -#===================================================================================================== - -#--- PROCESS ----------------------------------------------------------------------------------------- - -# True when running on Windows. -WINDOWS = sys.platform.startswith('win') - -if not WINDOWS: - import select - import fcntl - def read_non_blocking(stream, bytes=1024, timeout=0): - # Reads a number of bytes from the given stream, - # without deadlocking when no more data is available (returns None instead). - fcntl.fcntl(stream, fcntl.F_SETFL, fcntl.fcntl(stream, fcntl.F_GETFL) | os.O_NONBLOCK) - if not select.select([stream], [], [], 0)[0]: - return None - return stream.read(bytes) - -if WINDOWS: - import ctypes; from ctypes.wintypes import DWORD - import msvcrt - def read_non_blocking(stream, bytes=1024): - # Reads a number of bytes from the given stream, - # without deadlocking when no more data is available (returns None instead). - p = msvcrt.get_osfhandle(stream.fileno()) - s = ctypes.create_string_buffer(1) - b = ctypes.windll.kernel32.PeekNamedPipe(p, s, 1, None, None, None) - if s.value: - c_read = DWORD() - s = ctypes.create_string_buffer(bytes+1) - b = ctypes.windll.kernel32.ReadFile(p, s, bytes+1, ctypes.byref(c_read), None) - s[c_read.value] = '\0' - return s.value.decode() - -class Process(object): - - def __init__(self, program, options={}, start=True): - """ Runs the given program (i.e. executable file path) as a background process - with the given command-line options. - """ - self.program = program - self.options = options - self._process = None - if start: - self.start() - - @property - def started(self): - return self._process is not None - - @property - def id(self): - return self._process \ - and self._process.pid or None - - pid = id - - @property - def output(self, bytes=1024): - # Yields a number of bytes of output, or None if the process is idle. - if self._process is not None: - return read_non_blocking(self._process.stdout, bytes) - - def start(self): - """ Starts the program with the given command-line options. - The output can be read from Process.output. - """ - o = [self.program]; [o.extend((k,v)) for k,v in self.options.items()] - o = [str(x) for x in o if x is not None] - self._process = subprocess.Popen(o, - stdout = subprocess.PIPE, - stderr = subprocess.STDOUT - ) - - def stop(self): - """ Attempts to stop the process. - Returns True when the process is stopped, False otherwise. - """ - if not self._process: - # The process has not been started. - return True - if hasattr(self._process, 'kill'): - # Popen.kill() works in Python 2.6+ on all platforms. - self._process.kill() - self._process = None - return True - if self._process.pid is not None and not WINDOWS: - # os.kill() works in Python 2.4+ on Unix and Mac OS X. - os.kill(self._process.pid, signal.SIGTERM) - time.sleep(0.1) - self._process = None - return True - if self._process.pid is not None and WINDOWS: - # Use ctypes on Windows platforms. - import ctypes - p = ctypes.windll.kernel32.OpenProcess(1, False, self._process.pid) - ctypes.windll.kernel32.TerminateProcess(p, -1) - ctypes.windll.kernel32.CloseHandle(p) - time.sleep(0.1) - self._process = None - return True - return False - -#===================================================================================================== - -#--- SOCKET ------------------------------------------------------------------------------------------ - -class Socket(_socket.socket): - - def __init__(self, host, port): - """ Creates a socket connection to the given host (IP address) and port. - Socket.close() will close the connection when Socket.connections is 0 - """ - _socket.socket.__init__(self, _socket.AF_INET, _socket.SOCK_DGRAM) - self.bind((host, port)) - self.setblocking(0) - self.connections = 0 - - def close(self): - if self.connections <= 0: - _socket.socket.close(self) - -_sockets = {} -def socket(host, port): - """ Returns the socket connection to the given host and port, creating it when none exists. - """ - return _sockets.setdefault("%s:%s" % (host, port), Socket(host, port)) - -#--- PUREDATA ---------------------------------------------------------------------------------------- - -# Pd application default paths: -# /usr/local/bin/pd -# /Applications/Pd-extended.app/Contents/Resources/bin/pd -# C:\Program Files\pd\bin\pd.exe -PD_UNIX1 = "pdextended" -PD_UNIX2 = "pd" -PD_MACOSX = "Pd-extended.app/Contents/Resources/bin/pd" -PD_WINDOWS = "pd\\bin\\pd.exe" -DEFAULT = "default" - -# Default server. -LOCALHOST = "127.0.0.1" - -# Default ports. -# PD.get() receives on port 44000, the Pd patch broadcasts on port 44000. -# PD.send() broadcasts on port 44001, the Pd patch receives on port 44001. -IN = 44000 -OUT = 44001 - -class PDError(Exception): - pass - -class PD(object): - - def __init__(self, patch=None, buffer=128, options={}, start=False, path=DEFAULT): - """ Creates a network connection with PureData. - When a patch (.pd file) is given and start=True, loads PD with the patch in the background. - Otherwise, communication can be established with whatever patch is active in a running PD. - The PD.send() method sends data to the patch running at a given host and port. - The path defines the location of the PD executable. - A number of default locations are searched as well: - - the current folder, - - /usr/bin/pdextended (Unix, preferred), - - /usr/local/bin/pd (Unix), - - /Applications/Pd-extended.app/Contents/Resources/bin/pd (Mac OS X), - - C:\Program Files\pd\bin\pd.exe (Windows). - Command-line options can be given as a dictionary, e.g. - PD(options={'-alsa': None}) - """ - path = path != DEFAULT and path or "" - path = _find(lambda x: os.path.exists(x), [ - path, - os.path.join(path, PD_UNIX1), - os.path.join(path, PD_UNIX2), - os.path.join(path, PD_MACOSX), - os.path.join(path, PD_WINDOWS), - "usr/bin/" + PD_UNIX1, - "usr/local/bin/" + PD_UNIX1, - "usr/bin/" + PD_UNIX2, - "usr/local/bin/" + PD_UNIX2, - "/Applications/" + PD_MACOSX, - "C:\\Program Files\\" + PD_WINDOWS - ]) - self._path = path # PD executable location. - self._process = None # PD executable running in background. - self._callback = {} # [PDCallback, data] items indexed by path + host + port. - self._options = dict(options) # For PD-Extended 0.41- on Mac OS X, only works with -nogui. - self._options.setdefault("-nogui", None) - self._options.setdefault("-audiobuf", buffer) - self._options.setdefault("-open", patch) - if start: - self.start() - osc.init() - - @property - def patch(self): - return self._options.get("-open") - @property - def buffer(self): - return self._options.get("-audiobuf") - - def start(self): - """ Starts PD as a background process and loads PD.patch. - If PD is already running another patch, restarts the application. - """ - if self.patch is None \ - or not os.path.exists(self.patch): - raise PDError, "no PD patch file at '%s'" % self.patch - if not self._path: - raise PDError, "no PD application found" - if not os.path.exists(self._path): - raise PDError, "no PD application at '%s'" % self._path - if not self._process: - self._process = Process(program=self._path, options=self._options) - - def stop(self): - for callback in self._callback.values(): - callback.stop() - return self._process \ - and self._process.stop() - - def send(self, data, path, host=LOCALHOST, port=OUT): - """ Sends the given list of data over OSC to PD. - The path specifies the address where PD receives the data e.g. "/creature/perch". - """ - osc.sendMsg(path, data, host, port) - - def get(self, path, host=LOCALHOST, port=IN): - """ Returns the data sent from the given path in PD. - """ - id = "%s%s%s" % (path, host, port) - if not id in self._callback: - self._callback[id] = PDCallback(path, host, port) - return self._callback[id].data - - def __del__(self): - try: self.stop() - except: - pass - - @property - def output(self): - return self._process.output - -class PDCallback: - - def __init__(self, path, host=LOCALHOST, port=44001): - """ Creates a listener for data broadcast from Pd. - PDCallback.__call__() is called from PD.get(). - """ - osc.bind(self, path) - self._path = path - self._data = [] - self._socket = socket(host, port) - self._socket.connections += 1 - - def __call__(self, *data): - # First two arguments in the list are the path and typetags string. - self._data = data[0][2:] if data != "nodata" else [] - - @property - def data(self): - osc.getOSC(self._socket) - return self._data - - def stop(self): - self._socket.connections -= 1 - self._socket.close() - self._socket = None From dec4d464114273c7ceeee9493b0612c580827761 Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 15:58:56 +0200 Subject: [PATCH 05/12] Removed sys.path insertion --- examples/03-image/04-quad.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/examples/03-image/04-quad.py b/examples/03-image/04-quad.py index 13a8609..09566b0 100644 --- a/examples/03-image/04-quad.py +++ b/examples/03-image/04-quad.py @@ -1,7 +1,4 @@ -# Add the upper directory (where the nodebox module is) to the search path. -import os, sys; sys.path.insert(0, os.path.join("..","..")) - -from nodebox.graphics import * +from nodeboxgl.graphics import * img = Image("creature.png") From fc610faafd2ecbe02bddd5fe454860d25c2eaf37 Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 16:00:24 +0200 Subject: [PATCH 06/12] Renamed 'extensions' to 'Nodebox for OpenGL c-extensions' --- nodeboxgl/ext/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nodeboxgl/ext/setup.py b/nodeboxgl/ext/setup.py index 0375647..c597338 100644 --- a/nodeboxgl/ext/setup.py +++ b/nodeboxgl/ext/setup.py @@ -5,7 +5,7 @@ noise = Extension("nglnoise", sources=["noise.c"]) setup( - name = "extensions", + name = "Nodebox for OpenGL c-extensions", version = "1.0", author = "Tom De Smedt, Frederik De Bleser", description = "Fast C Bezier, geometry and noise math.", From 697f48c9533dfdd9e40a7dc87c41c3ddf5cea84c Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 16:02:51 +0200 Subject: [PATCH 07/12] Made font dir a module for inclusion on install. --- nodeboxgl/font/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 nodeboxgl/font/__init__.py diff --git a/nodeboxgl/font/__init__.py b/nodeboxgl/font/__init__.py new file mode 100644 index 0000000..792d600 --- /dev/null +++ b/nodeboxgl/font/__init__.py @@ -0,0 +1 @@ +# From 01b93136dea63b631f3d7db5af64c7d94177b10b Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 31 May 2017 16:03:50 +0200 Subject: [PATCH 08/12] Added examples/12 movie export to gitignore. --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index d6b5e33..fa84b0e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,7 @@ Thumbs.db # Temporary editor files *.swp .idea + + +# Temporary example files +examples/12-experimental/test.mp4 From f5517ecc14cd515fba9163e3f3e43705b18cd3ce Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 14 Jun 2017 11:27:44 +0200 Subject: [PATCH 09/12] More renaming needed after learning about the sensitive relations between file- and modulenames. --- nodeboxgl/ext/{bezier.c => nglbezier.c} | 0 nodeboxgl/ext/{geometry.c => nglgeometry.c} | 25 ++++++++++----------- nodeboxgl/ext/{noise.c => nglnoise.c} | 0 nodeboxgl/ext/setup.py | 6 ++--- 4 files changed, 15 insertions(+), 16 deletions(-) rename nodeboxgl/ext/{bezier.c => nglbezier.c} (100%) rename nodeboxgl/ext/{geometry.c => nglgeometry.c} (87%) rename nodeboxgl/ext/{noise.c => nglnoise.c} (100%) diff --git a/nodeboxgl/ext/bezier.c b/nodeboxgl/ext/nglbezier.c similarity index 100% rename from nodeboxgl/ext/bezier.c rename to nodeboxgl/ext/nglbezier.c diff --git a/nodeboxgl/ext/geometry.c b/nodeboxgl/ext/nglgeometry.c similarity index 87% rename from nodeboxgl/ext/geometry.c rename to nodeboxgl/ext/nglgeometry.c index 97154fb..03e72f2 100644 --- a/nodeboxgl/ext/geometry.c +++ b/nodeboxgl/ext/nglgeometry.c @@ -167,25 +167,24 @@ mmult(PyObject *self, PyObject *args) { // ------------------------------------------------------------------------------ static PyMethodDef geometry_methods[]={ - { "fast_inverse_sqrt", fast_inverse_sqrt, METH_VARARGS }, - { "angle", angle, METH_VARARGS }, - { "distance", distance, METH_VARARGS }, - { "coordinates", coordinates, METH_VARARGS }, - { "rotate", rotate, METH_VARARGS }, - { "smoothstep", smoothstep, METH_VARARGS }, - { "superformula", superformula, METH_VARARGS }, - { "mmult", mmult, METH_VARARGS }, - { NULL, NULL } + { "fast_inverse_sqrt", fast_inverse_sqrt, METH_VARARGS, "Fast inverse square root." }, + { "angle", angle, METH_VARARGS, "angle(x1,y1,x2,y2)." }, + { "distance", distance, METH_VARARGS, "distance(x1,y1,x2,y2)." }, + { "coordinates", coordinates, METH_VARARGS, "coordinates(x0, y0, d, a, x1, y1)." }, + { "rotate", rotate, METH_VARARGS, "rotate( x, y, x0, y0, a, x1, y1)." }, + { "smoothstep", smoothstep, METH_VARARGS, "smoothstep(a, b, x, t)." }, + { "superformula", superformula, METH_VARARGS, "superformula(m, n1, n2, n3, phi)." }, + { "mmult", mmult, METH_VARARGS, "mmult(a0, a1, a2, a3, a4, a5, a6, a7, a8, b0, b1, b2, b3, b4, b5, b6, b7, b8)." }, + { NULL, NULL, 0, NULL } }; -PyMODINIT_FUNC initgeometry(void){ - PyObject *m; - m = Py_InitModule("geometry", geometry_methods); +PyMODINIT_FUNC initnglgeometry(void){ + Py_InitModule("nglgeometry", geometry_methods); } int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); Py_Initialize(); - initgeometry(); + initnglgeometry(); return 0; } \ No newline at end of file diff --git a/nodeboxgl/ext/noise.c b/nodeboxgl/ext/nglnoise.c similarity index 100% rename from nodeboxgl/ext/noise.c rename to nodeboxgl/ext/nglnoise.c diff --git a/nodeboxgl/ext/setup.py b/nodeboxgl/ext/setup.py index c597338..4e55de8 100644 --- a/nodeboxgl/ext/setup.py +++ b/nodeboxgl/ext/setup.py @@ -1,8 +1,8 @@ from distutils.core import setup, Extension -bezier = Extension("nglbezier", sources=["bezier.c"]) -geometry = Extension("nglgeometry", sources=["geometry.c"]) -noise = Extension("nglnoise", sources=["noise.c"]) +bezier = Extension("nglbezier", sources=["nglbezier.c"]) +geometry = Extension("nglgeometry", sources=["nglgeometry.c"]) +noise = Extension("nglnoise", sources=["nglnoise.c"]) setup( name = "Nodebox for OpenGL c-extensions", From 1eb046d8bd6e270f09c3a2f3b76d11ab73225afc Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 14 Jun 2017 12:25:14 +0200 Subject: [PATCH 10/12] Finished extension renaming. --- nodeboxgl/ext/nglbezier.c | 18 +++++++++--------- nodeboxgl/ext/nglnoise.c | 12 ++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/nodeboxgl/ext/nglbezier.c b/nodeboxgl/ext/nglbezier.c index 48f6e4b..ce22a8b 100644 --- a/nodeboxgl/ext/nglbezier.c +++ b/nodeboxgl/ext/nglbezier.c @@ -143,18 +143,18 @@ curvelength(PyObject *self, PyObject *args) { static PyObject *BezierMathError; static PyMethodDef bezier_methods[] = { - { "linepoint", linepoint, METH_VARARGS }, - { "linelength", linelength, METH_VARARGS }, - { "curvepoint", curvepoint, METH_VARARGS }, - { "curvelength", curvelength, METH_VARARGS }, - { NULL, NULL } + { "linepoint", linepoint, METH_VARARGS, "linepoint(t, x0, y0, x1, y1)." }, + { "linelength", linelength, METH_VARARGS, "linelength(x0, y0, x1, y1)." }, + { "curvepoint", curvepoint, METH_VARARGS, "curvepoint(t, x0, y0, x1, y1, x2, y2, x3, y3, handles)." }, + { "curvelength", curvelength, METH_VARARGS, "curvelength(x0, y0, x1, y1, x2, y2, x3, y3, n)" }, + { NULL, NULL, 0, NULL } }; PyMODINIT_FUNC -initbezier(void) { +initnglbezier(void) { PyObject *m; - m = Py_InitModule("bezier", bezier_methods); - BezierMathError = PyErr_NewException("bezier.error", NULL, NULL); + m = Py_InitModule("nglbezier", bezier_methods); + BezierMathError = PyErr_NewException("nglbezier.error", NULL, NULL); Py_INCREF(BezierMathError); PyModule_AddObject(m, "error", BezierMathError); } @@ -162,6 +162,6 @@ initbezier(void) { int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); Py_Initialize(); - initbezier(); + initnglbezier(); return 0; } \ No newline at end of file diff --git a/nodeboxgl/ext/nglnoise.c b/nodeboxgl/ext/nglnoise.c index e5a4423..18939b8 100644 --- a/nodeboxgl/ext/nglnoise.c +++ b/nodeboxgl/ext/nglnoise.c @@ -69,20 +69,20 @@ init(PyObject *self, PyObject *args) { } static PyMethodDef methods[]={ - { "generate", generate, METH_VARARGS }, - { "init", init, METH_VARARGS }, - { NULL, NULL } + { "generate", generate, METH_VARARGS, "generate(x, y, z)." }, + { "init", init, METH_VARARGS, "init(a)." }, + { NULL, NULL, 0, NULL } }; -PyMODINIT_FUNC initnoise(void) { +PyMODINIT_FUNC initnglnoise(void) { PyObject *m; - m = Py_InitModule("noise", methods); + m = Py_InitModule("nglnoise", methods); } int main(int argc, char *argv[]) { Py_SetProgramName(argv[0]); Py_Initialize(); - initnoise(); + initnglnoise(); return 0; } From a634cffcd74278baab6aede97c664632c857399e Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 14 Jun 2017 12:26:17 +0200 Subject: [PATCH 11/12] Integrated extensions into main setup. --- setup.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/setup.py b/setup.py index 3704790..dc036ce 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,7 @@ import os from setuptools import setup from setuptools import find_packages +from setuptools.extension import Extension # Utility function to read the README file. # From http://packages.python.org/an_example_pypi_project/setuptools.html. @@ -20,6 +21,10 @@ def read(fname): package_data = {"nodeboxgl.gui": ["theme/*"], "nodeboxgl.font":["glyph.p"]}, install_requires = ["pyglet",], py_modules = ["nodeboxgl", "nodeboxgl.graphics", "nodeboxgl.gui", "nodeboxgl.sound", "nodeboxgl.font"], + ext_modules = [ + Extension("nglbezier", sources=["nodeboxgl/ext/nglbezier.c"]), + Extension("nglgeometry", sources=["nodeboxgl/ext/nglgeometry.c"]), + Extension("nglnoise", sources=["nodeboxgl/ext/nglnoise.c"]) ], classifiers = [ "Development Status :: 4 - Beta", "Environment :: MacOS X", From acf0608184568dc9bb3e5ef3e7b507877b4f6b08 Mon Sep 17 00:00:00 2001 From: Karsten Wolf Date: Wed, 14 Jun 2017 12:27:10 +0200 Subject: [PATCH 12/12] Silenced extension import debug prints. --- nodeboxgl/graphics/bezier.py | 5 ++++- nodeboxgl/graphics/geometry.py | 18 ++++++++++++++---- nodeboxgl/graphics/noise.py | 5 ++++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/nodeboxgl/graphics/bezier.py b/nodeboxgl/graphics/bezier.py index 172f388..622fb88 100644 --- a/nodeboxgl/graphics/bezier.py +++ b/nodeboxgl/graphics/bezier.py @@ -90,7 +90,10 @@ def curvelength(x0, y0, x1, y1, x2, y2, x3, y3, n=20): # Fast C implementations: try: from nglbezier import linepoint, linelength, curvepoint, curvelength -except: + #print "FAST BEZIER" +except Exception, err: + #print err + #print "SLOW BEZIER" pass #--- BEZIER PATH LENGTH ------------------------------------------------------------------------------ diff --git a/nodeboxgl/graphics/geometry.py b/nodeboxgl/graphics/geometry.py index 5c21d1c..8ed754f 100644 --- a/nodeboxgl/graphics/geometry.py +++ b/nodeboxgl/graphics/geometry.py @@ -45,7 +45,10 @@ def reflect(x, y, x0, y0, d=1.0, a=180): # Fast C implementations: try: from nglgeometry import angle, distance, coordinates, rotate -except: + #print "FAST GEOMETRY" +except Exception, err: + #print err + #print "SLOW GEOMETRY" pass #--- INTERPOLATION ----------------------------------------------------------------------------------- @@ -79,7 +82,10 @@ def clamp(v, a, b): # Fast C implementations: try: from nglgeometry import smoothstep -except: + # print "FAST GEOMETRY" +except Exception, err: + # print err + # print "SLOW GEOMETRY" pass #--- INTERSECTION ------------------------------------------------------------------------------------ @@ -180,8 +186,12 @@ def superformula(m, n1, n2, n3, phi): return (r*cos(phi), r*sin(phi)) # Fast C implementation: -try: from nglgeometry import superformula -except: +try: + from nglgeometry import superformula + # print "FAST GEOMETRY" +except Exception, err: + # print err + # print "SLOW GEOMETRY" pass #===================================================================================================== diff --git a/nodeboxgl/graphics/noise.py b/nodeboxgl/graphics/noise.py index ba56393..1b94c00 100644 --- a/nodeboxgl/graphics/noise.py +++ b/nodeboxgl/graphics/noise.py @@ -64,7 +64,10 @@ def generate(self, x, y=0, z=0): from nglnoise import init, generate PerlinNoise._init = init PerlinNoise.generate = generate -except: + # print "FAST NOISE" +except Exception, err: + # print err + # print "SLOW NOISE" pass _generator = PerlinNoise()

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